diff --git a/.circleci/main.yml b/.circleci/main.yml index b6bd73a86..8139b97d7 100644 --- a/.circleci/main.yml +++ b/.circleci/main.yml @@ -56,7 +56,7 @@ executors: environment: <<: *default_environment NO_SANDBOX: true - IPFS_REUSEPORT: false + LIBP2P_TCP_REUSEPORT: false LIBP2P_ALLOW_WEAK_RSA_KEYS: 1 E2E_IPFSD_TYPE: go dockerizer: @@ -105,7 +105,22 @@ jobs: when: always command: bash <(curl -s https://codecov.io/bash) -cF unittests -X search -f coverage/unit_tests.coverprofile - run: - command: go test -v ./... + command: | + # we want to test the examples against the current version of go-ipfs + # however, that version might be in a fork so we need to replace the dependency + + # backup the go.mod and go.sum files to restore them after we run the tests + cp go.mod go.mod.bak + cp go.sum go.sum.bak + + # make sure the examples run against the current version of go-ipfs + go mod edit -replace github.com/ipfs/go-ipfs=./../../.. + go mod tidy + go test -v ./... + + # restore the go.mod and go.sum files to their original state + mv go.mod.bak go.mod + mv go.sum.bak go.sum working_directory: ~/ipfs/go-ipfs/docs/examples/go-ipfs-as-a-library - run: @@ -201,7 +216,8 @@ jobs: - bin/ipfs - *store_gomod interop: - executor: node + docker: + - image: cimg/go:1.16-node parallelism: 4 steps: - *make_out_dirs @@ -211,21 +227,33 @@ jobs: name: Installing dependencies command: | npm init -y - npm install ipfs@^0.52.2 - npm install ipfs-interop@^4.0.0 + npm install ipfs@^0.59.1 + npm install ipfs/interop#master npm install mocha-circleci-reporter@0.0.3 working_directory: ~/ipfs/go-ipfs/interop - run: name: Running tests command: | + WORKDIR=$(pwd) + cd /tmp + git clone https://github.com/ipfs/js-ipfs.git + cd js-ipfs + git checkout 1dcac76f56972fc3519526e93567e39d685033dd + npm install + npm run build + npm run link + cd $WORKDIR mkdir -p /tmp/test-results/interop/ export MOCHA_FILE="$(mktemp /tmp/test-results/interop/unit.XXXXXX.xml)" npx ipfs-interop -- -t node -f $(sed -n -e "s|^require('\(.*\)')$|test/\1|p" node_modules/ipfs-interop/test/node.js | circleci tests split) -- --reporter mocha-circleci-reporter working_directory: ~/ipfs/go-ipfs/interop environment: - IPFS_REUSEPORT: false + LIBP2P_TCP_REUSEPORT: false LIBP2P_ALLOW_WEAK_RSA_KEYS: 1 IPFS_GO_EXEC: /tmp/circleci-workspace/bin/ipfs + IPFS_JS_EXEC: /tmp/js-ipfs/packages/ipfs/src/cli.js + IPFS_JS_MODULE: /tmp/js-ipfs/packages/ipfs/dist/cjs/src/index.js + IPFS_JS_HTTP_MODULE: /tmp/js-ipfs/packages/ipfs-http-client/dist/cjs/src/index.js - store_test_results: path: /tmp/test-results go-ipfs-api: diff --git a/.github/workflows/sync-release-assets.yml b/.github/workflows/sync-release-assets.yml new file mode 100644 index 000000000..40351bb39 --- /dev/null +++ b/.github/workflows/sync-release-assets.yml @@ -0,0 +1,124 @@ +name: Sync github release assets with dist.ipfs.io + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' + +concurrency: + group: release-assets-dist-sync + cancel-in-progress: true + +jobs: + sync-github-and-dist-ipfs-io: + runs-on: "ubuntu-latest" + steps: + - name: Setup go + uses: actions/setup-go@v2 + with: + go-version: '1.16' + - uses: actions/cache@v2 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - name: Build go-ipfs binary + run: go install github.com/ipfs/go-ipfs/cmd/ipfs@latest + - name: Initialize go-ipfs and start daemon + run: | + sudo sysctl -w net.core.rmem_max=2500000 + ipfs init --profile flatfs,server + ipfs daemon --enable-gc=false & + while (! ipfs id --api "/ip4/127.0.0.1/tcp/5001"); do sleep 1; done + - name: Wait for go-ipfs to be ready + shell: pwsh + run: | + for ($i = 0; $i -lt 10; $i++) { + $addrs = ipfs id | jq .Addresses; + if ($addrs -eq "null") { + sleep 1 + } else { + echo "Successfully started the daemon" + exit 0 + } + } + - uses: actions/setup-node@v2 + with: + node-version: 14 + - name: Sync the latest 5 github releases + uses: actions/github-script@v4 + with: + script: | + const fs = require('fs').promises + const max_synced = 5 + + // fetch github releases + resp = await github.repos.listReleases({ + owner: context.repo.owner, + repo: context.repo.repo, + page: 1, + per_page: max_synced + }) + const release_assets = []; + num_synced = 0; + for (const release of resp.data) { + console.log("checking release tagged", release.tag_name) + if (num_synced > max_synced) { + console.log("done: synced", max_synced, "latest releases") + break; + } + num_synced += 1 + + const github_assets = []; + github_map = {}; + for (const asset of release.assets) { + github_assets.push(asset.name); + github_map[asset.name] = true; + } + + // fetch asset info from dist.ipfs.io + p = '/ipns/dist.ipfs.io/go-ipfs/' + release.tag_name + let stdout = '' + const options = {} + options.listeners = { + stdout: (data) => { + stdout += data.toString(); + } + } + await exec.exec('ipfs', ['ls', p], options) + + const dist_assets = [] + missing_files = [] + for (const raw_line of stdout.split("\n")) { + line = raw_line.trim(); + if (line.length != 0) { + file = line.split(/(\s+)/).filter( function(e) { return e.trim().length > 0; } )[2] + dist_assets.push(file) + if (!github_map[file]) { + missing_files.push(file) + } + } + } + + // if dist.ipfs.io has files not found in github, copy them over + for (const file of missing_files) { + console.log("fetching", file, "from dist.ipfs.io") + await exec.exec('ipfs', ['get', p + '/' + file]) + const data = await fs.readFile(file, "binary") + console.log("uploading", file, "to github release", release.tag_name) + resp = await github.repos.uploadReleaseAsset({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: release.id, + name: file, + data: data, + }) + } + // summary of assets on both sides + release_assets.push({ tag: release.tag_name, github_assets: github_assets, dist_assets: dist_assets }) + } + console.log(release_assets) + return release_assets diff --git a/.github/workflows/testground-on-push.yml b/.github/workflows/testground-on-push.yml new file mode 100644 index 000000000..ee18c340b --- /dev/null +++ b/.github/workflows/testground-on-push.yml @@ -0,0 +1,33 @@ +--- +name: Testground PR Checker + +on: [push] + +jobs: + testground: + runs-on: ubuntu-latest + name: ${{ matrix.composition_file }} + strategy: + matrix: + include: + - backend_addr: ci.testground.ipfs.team + backend_proto: https + plan_directory: testplans/bitswap + composition_file: testplans/bitswap/_compositions/small-k8s.toml + - backend_addr: ci.testground.ipfs.team + backend_proto: https + plan_directory: testplans/bitswap + composition_file: testplans/bitswap/_compositions/medium-k8s.toml + - backend_addr: ci.testground.ipfs.team + backend_proto: https + plan_directory: testplans/bitswap + composition_file: testplans/bitswap/_compositions/large-k8s.toml + steps: + - uses: actions/checkout@v2 + - name: testground run + uses: coryschwartz/testground-github-action@v1.1 + with: + backend_addr: ${{ matrix.backend_addr }} + backend_proto: ${{ matrix.backend_proto }} + plan_directory: ${{ matrix.plan_directory }} + composition_file: ${{ matrix.composition_file }} diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index d3c113928..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "assets/dir-index-html"] - path = assets/dir-index-html - url = https://github.com/ipfs/dir-index-html.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 07e8b6bcf..121198c81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,812 @@ # go-ipfs changelog +## v0.11.0 2021-12-08 + +We're happy to announce go-ipfs 0.11.0. This release comes with improvements to the UnixFS Sharding and PubSub experiments as well as support for Circuit-Relay v2 which sets the network up for decentralized hole punching support. + +As usual, this release includes important fixes, some of which may be critical for security. Unless the fix addresses a bug being exploited in the wild, the fix will _not_ be called out in the release notes. Please make sure to update ASAP. See our [release process](https://github.com/ipfs/go-ipfs/tree/master/docs/releases.md#security-fix-policy) for details. + +### 🛠 BREAKING CHANGES + +- UnixFS sharding is now automatic and enabled by default + - HAMT-based sharding is applied to large directories (i.e. those that would serialize into [block](https://docs.ipfs.io/concepts/glossary/#block) larger than ~256KiB)s. This means importing data via commands like `ipfs add -r ` may result in different [CID](https://docs.ipfs.io/concepts/glossary/#cid)s due to the different [DAG](https://docs.ipfs.io/concepts/glossary/#dag) representations. + - Support for `Experimental.ShardingEnabled` is removed. +- go-ipfs can no longer act as a [Circuit Relay](https://docs.ipfs.io/concepts/glossary/#circuit-relay) v1 + - Node will refuse to start if `Swarm.EnableRelayHop` is set to `true` + - If you depend on v1 relay service provider, see "Removal of v1 relay service" section for available migration options. +- HTTP RPC wire format for experimental commands at `/api/v0/pubsub` changed. + - If you use [js-ipfs-http-client](https://www.npmjs.com/package/ipfs-http-client) or [go-ipfs-http-client](https://github.com/ipfs/go-ipfs-http-client), just update to their latest version. + - If you use something else, see "Multibase in PubSub" section below for migration details. + +Keep reading to learn more details. + +### 🔦 Highlights + +#### 🗃 Automatic UnixFS sharding + +Truly big directories can have so many items, that the root block with all of their names is too big to be exchanged with other peers. This was partially solved by [HAMT-sharding](https://docs.ipfs.io/concepts/glossary/#hamt-sharding), which was introduced a while ago as opt-in. The main downside of the implementation was that it was a global flag that sharded all imported directories (big and small). + +This release solves that inconvenience by making UnixFS sharding smarter and applies it only to larger directories (i.e. directories that would be at least ~256KiB). This is now the default behavior in `ipfs add` and `ipfs files` commands, where UnixFS sharding works out-of-the-box. + +#### 🔁 Circuit Relay v2 + +This release adds support for the [circuit relay v2](https://github.com/libp2p/specs/blob/master/relay/circuit-v2.md) protocol based on the reference implementation from [go-libp2p 0.16](https://github.com/libp2p/go-libp2p/releases/tag/v0.16.0). + +This is the cornerstone for maximizing p2p connections between IPFS peers. Every publicly dialable peer can now act as a limited relay v2, which can be used for [hole punching](https://docs.ipfs.io/concepts/glossary/#hole-punching) and other decentralized signaling protocols. + +##### Limited relay v2 configuration options + +go-ipfs can now be configured to act as a [`RelayClient`](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#swarmrelayclient) that uses other peers for autorelay functionality when behind a NAT, or provide a limited [`RelayService`](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#swarmrelayservice) to other peers on the network. + +Starting with go-ipfs v0.11 every publicly dialable go-ipfs (based on AutoNAT determination) will start a limited `RelayService`. `RelayClient` remains disabled by default for now, as we want the network to update and get enough v2 service providers first. + +Note: the limited Circuit Relay v2 provided with this release only allows low-bandwidth protocols (identify, ping, holepunch) over transient connections. If you want to relay things like bitswap sessions, you need to set up a v1 relay by some other means. See details below. + +##### Removal of unlimited v1 relay service provider + +Switching to v2 of the relay spec means removal or deprecation of configuration keys that were specific to v1. + +- Relay transport and client support circuit-relay v2: + - `Swarm.EnableAutoRelay` was replaced by `Swarm.RelayClient.Enable`. + - `Swarm.DisableRelay` is deprecated, relay transport can be now disabled globally (both client and service) by setting `Swarm.Transports.Network.Relay` to `false` +- Relay v1 service provider was replaced by v2: + - `Swarm.EnableRelayHop` no longer starts an unlimited v1 relay. If you have it set to `true` the node will refuse to start and display an error message. + - Existing users who choose to continue running a v1 relay should migrate their setups to relay v1 based on js-ipfs running in node, or the standalone [libp2p-relay-daemon](https://dist.ipfs.io/#libp2p-relay-daemon) [configured](https://github.com/libp2p/go-libp2p-relay-daemon/#configuration) with `RelayV1.Enabled` set to `true`. Be mindful that v1 relays are unlimited, and one may want to set up some ACL based either on PeerIDs or Subnets. + +#### 🕳 Decentralized Hole Punching (DCUtR protocol client) + +We are working towards enabling hole punching for NAT traversal when port forwarding is not possible. + +[go-libp2p 0.16](https://github.com/libp2p/go-libp2p/releases/tag/v0.16.0) provides an implementation of the [DCUtR (decentralized hole punching)](https://github.com/libp2p/specs/blob/master/relay/DCUtR.md) protocol. It is hidden behind the `Swarm.EnableHolePunching` configuration flag. + +When enabled, go-ipfs will coordinate with the counterparty using a [relayed v2 connection](https://github.com/libp2p/specs/blob/master/relay/circuit-v2.md), to [upgrade to a direct connection](https://github.com/libp2p/specs/blob/master/relay/DCUtR.md) through a NAT/firewall whenever possible. + +This feature is disabled by default in this release, but we hope to enable it by default as soon the network updates to go-ipfs v0.11 and gains a healthy set of limited v2 relays. + +#### 💬 Multibase in PubSub HTTP RPC API + +This release fixed some edge cases that were reported by users of the PubSub experiment, getting it closer to becoming a stable feature of go-ipfs. Some PubSub users will notice that the plaintext limitation is lifted: one can now use line breaks in messages published to non-ascii topic names, or even publish arbitrary bytes to arbitrary topics. It required a change to the wire format used when pubsub commands are executed over the HTTP RPC API at `/api/v0/pubsub/*`, and also modified the behavior of the `ipfs pubsub pub` command, which now is publishing only a single pubsub message with data read from a file or stdin. + +##### PubSub client migration tips + +If you use the HTTP RPC API with the [go-ipfs-http-client](https://github.com/ipfs/go-ipfs-http-client) library, make sure to update to the latest version. The next version of [js-ipfs-http-client](https://www.npmjs.com/package/ipfs-http-client) will use the new wire format as well, so you don't need to do anything. + +If you use `/api/v0/pubsub/*` directly or maintain your own client library, you must adjust your HTTP client code. Byte fields and URL args are now encoded in `base64url` [Multibase](https://docs.ipfs.io/concepts/glossary/#multibase). Encode/decode bytes using the `ipfs multibase --help` commands, or use the multiformats libraries ([js-multiformats](https://github.com/multiformats/js-multiformats#readme), [go-multibase](https://github.com/multiformats/go-multibase)). + +Low level changes: +- `topic` passed as URL `arg` in requests to `/api/v0/pubsub/*` must be encoded in URL-safe multibase (`base64url`) +- `data`, `from`, `seqno` and `topicIDs` returned in JSON responses are now encoded in multibase +- Peer IDs returned in `from` now use the same default text representation from go-libp2p and peerid encoder/decoder from libp2p. This means the same text representation as in as in `swarm peers`, which makes it possible to compare them without decoding multibase. +- `/api/v0/pubsub/pub` no longer accepts `data` to be passed as URL, it has to be sent as `multipart/form-data`. This removes size limitations based on URL length, and enables regular HTTP clients to publish data to PubSub topics. For example, to publish `some-file` to topic named `test-topic` using vanilla `curl`, one would execute: `curl -X POST -v -F "stdin=@some-file" 'http://127.0.0.1:5001/api/v0/pubsub/pub?arg=$(echo -n test-topic | ipfs multibase encode -b base64url)'` +- `ipfs pubsub pub` on the command line no longer accepts variadic `data` arguments. Instead, it expects a single file input or stream of bytes from stdin. This ensures arbitrary stream of bytes can be published, removing limitation around messages that include `\n` or `\r\n`. + +#### ⚙ New configuration flags + +- [`Addresses.AppendAnnounce`](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#addressesappendannounce) is an array of multiaddrs, similar to `Addresses.Announce`, except it does not override inferred swarm addresses, but appends custom ones to the list. +- Pubsub experiments can now be enabled via config, removing the need for CLI flag to be passed every time daemon starts: + - [`Pubsub.Enabled`](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#pubsubenabled) enables the pubsub system. + - [`Ipns.UsePubsub`](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#ipnsusepubsub) enables IPFS over pubsub experiment for publishing IPNS records in real time. + +#### 🔐 Support for DAG-JOSE IPLD codec + +JOSE is a [standard](https://datatracker.ietf.org/wg/jose/documents/) for signing and encrypting JSON objects. [DAG-JOSE](https://ipld.io/specs/codecs/dag-jose/spec/) is an IPLD codec based on JOSE and represented in CBOR. Upon encountering the `dag-jose` multicodec indicator, implementations can expect that the block contains dag-cbor encoded data which matches the IPLD schema from the [DAG-JOSE spec](https://ipld.io/specs/codecs/dag-jose/spec/). + +This work was [contributed](https://github.com/ipfs/go-ipfs/pull/8569) by [Ceramic](https://ceramic.network/) and acts as a template for future IPFS improvements driven by the real world needs of the IPFS community. + +### Changelog + +- github.com/ipfs/go-ipfs: + - docs: update changelog for v0.11.0 + - Release v0.11.0-rc2 + - fix(corehttp): adjust peer counting metrics (#8577) ([ipfs/go-ipfs#8577](https://github.com/ipfs/go-ipfs/pull/8577)) + - Release v0.11.0-rc1 + - feat: Swarm.EnableHolePunching flag (#8562) ([ipfs/go-ipfs#8562](https://github.com/ipfs/go-ipfs/pull/8562)) + - feat: enabling pubsub and ipns-pubsub via config flags (#8510) ([ipfs/go-ipfs#8510](https://github.com/ipfs/go-ipfs/pull/8510)) + - Integrate go-dag-jose plugin (#8569) ([ipfs/go-ipfs#8569](https://github.com/ipfs/go-ipfs/pull/8569)) + - feat: Addresses.AppendAnnounce (#8177) ([ipfs/go-ipfs#8177](https://github.com/ipfs/go-ipfs/pull/8177)) + - fix: multibase in pubsub http rpc (#8183) ([ipfs/go-ipfs#8183](https://github.com/ipfs/go-ipfs/pull/8183)) + - refactor: remove dir-index-html submodule ([ipfs/go-ipfs#8555](https://github.com/ipfs/go-ipfs/pull/8555)) + - feat: hard deprecation of IPFS_REUSEPORT + - feat: go-libp2p 0.16, UnixFS autosharding and go-datastore with contexts (#8563) ([ipfs/go-ipfs#8563](https://github.com/ipfs/go-ipfs/pull/8563)) + - chore: fix link in README.md (#8551) ([ipfs/go-ipfs#8551](https://github.com/ipfs/go-ipfs/pull/8551)) + - Updating release template based off some 0.10 learnings (#8491) ([ipfs/go-ipfs#8491](https://github.com/ipfs/go-ipfs/pull/8491)) + - fix: multiple subdomain gateways on same domain (#8556) ([ipfs/go-ipfs#8556](https://github.com/ipfs/go-ipfs/pull/8556)) + - Fix typos (#8548) ([ipfs/go-ipfs#8548](https://github.com/ipfs/go-ipfs/pull/8548)) + - Add support for multiple files to `ipfs files rm`. + - add a docker-compose file (#8387) ([ipfs/go-ipfs#8387](https://github.com/ipfs/go-ipfs/pull/8387)) + - fix(sharness): use -Q option instead of pipe to tail cmd + - Add Homebrew installation method. ([ipfs/go-ipfs#8545](https://github.com/ipfs/go-ipfs/pull/8545)) + - docs: fix ipfs files cp examples (#8533) ([ipfs/go-ipfs#8533](https://github.com/ipfs/go-ipfs/pull/8533)) + - fix(unixfs): check for errors before dereferencing the link ([ipfs/go-ipfs#8508](https://github.com/ipfs/go-ipfs/pull/8508)) + - chore: replace go-merkledag walk with go-ipld-prime traversal for dag export (#8506) ([ipfs/go-ipfs#8506](https://github.com/ipfs/go-ipfs/pull/8506)) + - test: add sharness test for reading ADLs with FUSE + - fix: allow the levelds compression level to be unspecified + - ([ipfs/go-ipfs#8457](https://github.com/ipfs/go-ipfs/pull/8457)) + - ([ipfs/go-ipfs#8482](https://github.com/ipfs/go-ipfs/pull/8482)) + - Added the missing heathcheck for the container (#8429) ([ipfs/go-ipfs#8429](https://github.com/ipfs/go-ipfs/pull/8429)) + - chore: update dir-index-html to v1.2.2 + - Update RELEASE_ISSUE_TEMPLATE.md + - Update RELEASE_ISSUE_TEMPLATE.md + - add more logging to flaky TestPeersTotal + - Update RELEASE_ISSUE_TEMPLATE.md + - Update RELEASE_ISSUE_TEMPLATE.md + - Updating chocolatey to reference go-ipfs + - chore: update changelog for v0.10.0 + - add testground plans to bitswap on CI + - ci: move Docker image build to Actions (#8467) ([ipfs/go-ipfs#8467](https://github.com/ipfs/go-ipfs/pull/8467)) + - fix(cli): object add-link: do not allow blocks over BS limit (#8414) ([ipfs/go-ipfs#8414](https://github.com/ipfs/go-ipfs/pull/8414)) + - fuse: load unixfs adls as their dagpb substrates + - enable the legacy mDNS implementation + - change ipfs dag get flag name from format to output-codec ([ipfs/go-ipfs#8440](https://github.com/ipfs/go-ipfs/pull/8440)) + - change names of ipfs dag put flags to make changes clearer ([ipfs/go-ipfs#8439](https://github.com/ipfs/go-ipfs/pull/8439)) + - test: check behavior of loading UnixFS sharded directories with missing shards + - ([ipfs/go-ipfs#8432](https://github.com/ipfs/go-ipfs/pull/8432)) + - feat: dag import --stats (#8237) ([ipfs/go-ipfs#8237](https://github.com/ipfs/go-ipfs/pull/8237)) + - feat: ipfs-webui v2.13.0 (#8430) ([ipfs/go-ipfs#8430](https://github.com/ipfs/go-ipfs/pull/8430)) + - feat(cli): add daemon option --agent-version-suffix (#8419) ([ipfs/go-ipfs#8419](https://github.com/ipfs/go-ipfs/pull/8419)) + - feat: multibase transcode command (#8403) ([ipfs/go-ipfs#8403](https://github.com/ipfs/go-ipfs/pull/8403)) + - fix: take the lock while listing peers + - feature: 'ipfs swarm peering' command (#8147) ([ipfs/go-ipfs#8147](https://github.com/ipfs/go-ipfs/pull/8147)) + - chore: update IPFS Desktop testing steps (#8393) ([ipfs/go-ipfs#8393](https://github.com/ipfs/go-ipfs/pull/8393)) + - add more buttons; remove some sections covered in the docs; general cleanup ([ipfs/go-ipfs#8274](https://github.com/ipfs/go-ipfs/pull/8274)) + - Cosmetic fixups in examples (#8325) ([ipfs/go-ipfs#8325](https://github.com/ipfs/go-ipfs/pull/8325)) + - perf: use performance-enhancing FUSE mount options + - ci: publish Docker images for bifrost-* branches + - chore: add comments to peerlog plugin about being unsupported + - test: add unit tests for peerlog config parsing + - ci: preload peerlog plugin, disable by default + - fix(mkreleaselog): specify the parent commit when diffing + - update version to v0.11.0-dev +- github.com/ipfs/go-bitswap (v0.4.0 -> v0.5.1): + - Version 0.5.1 + - Change incorrect function name in README (#541) ([ipfs/go-bitswap#541](https://github.com/ipfs/go-bitswap/pull/541)) + - Version 0.5.0 (#540) ([ipfs/go-bitswap#540](https://github.com/ipfs/go-bitswap/pull/540)) + - feat: plumb through contexts (#539) ([ipfs/go-bitswap#539](https://github.com/ipfs/go-bitswap/pull/539)) + - sync: update CI config files (#538) ([ipfs/go-bitswap#538](https://github.com/ipfs/go-bitswap/pull/538)) + - fix: optimize handling for peers with lots of tasks ([ipfs/go-bitswap#537](https://github.com/ipfs/go-bitswap/pull/537)) + - Enable custom task prioritization logic ([ipfs/go-bitswap#535](https://github.com/ipfs/go-bitswap/pull/535)) + - feat: cache the materialized wantlist ([ipfs/go-bitswap#530](https://github.com/ipfs/go-bitswap/pull/530)) + - fix: reduce receive contention ([ipfs/go-bitswap#536](https://github.com/ipfs/go-bitswap/pull/536)) + - Fix ProviderQueryManager test timings ([ipfs/go-bitswap#534](https://github.com/ipfs/go-bitswap/pull/534)) + - fix: rename wiretap to tracer ([ipfs/go-bitswap#531](https://github.com/ipfs/go-bitswap/pull/531)) + - fix: fix race on "responsive" check ([ipfs/go-bitswap#528](https://github.com/ipfs/go-bitswap/pull/528)) + - fix: reduce log verbosity +- github.com/ipfs/go-blockservice (v0.1.7 -> v0.2.1): + - Version 0.2.1 + - Version 0.2.0 (#87) ([ipfs/go-blockservice#87](https://github.com/ipfs/go-blockservice/pull/87)) + - feat: add context to interfaces (#86) ([ipfs/go-blockservice#86](https://github.com/ipfs/go-blockservice/pull/86)) + - sync: update CI config files (#85) ([ipfs/go-blockservice#85](https://github.com/ipfs/go-blockservice/pull/85)) + - chore: update log ([ipfs/go-blockservice#84](https://github.com/ipfs/go-blockservice/pull/84)) +- github.com/ipfs/go-cid (v0.0.7 -> v0.1.0): + - amend the CidFromReader slice extension math + - implement CidFromReader + - chore: fixups from running go vet, go fmt and staticcheck ([ipfs/go-cid#122](https://github.com/ipfs/go-cid/pull/122)) + - s/characters/bytes + - Fix inaccurate comment for uvarint + - coverage: more tests for cid + - coverage: more tests for varint + - coverage: more tests for builder + - fix: make tests run with Go 1.15 + - Add the dagjose multiformat +- github.com/ipfs/go-datastore (v0.4.6 -> v0.5.1): + - Release v0.5.1 + - chore: add lots of interface assertions + - fix: make NullDatastore satisfy the Batching interface again + - Update version.json (#183) ([ipfs/go-datastore#183](https://github.com/ipfs/go-datastore/pull/183)) + - feat: add context to interfaces (#181) ([ipfs/go-datastore#181](https://github.com/ipfs/go-datastore/pull/181)) + - sync: update CI config files ([ipfs/go-datastore#182](https://github.com/ipfs/go-datastore/pull/182)) +- github.com/ipfs/go-ds-badger (v0.2.7 -> v0.3.0): + - feat: plumb through contexts (#119) ([ipfs/go-ds-badger#119](https://github.com/ipfs/go-ds-badger/pull/119)) +- github.com/ipfs/go-ds-flatfs (v0.4.5 -> v0.5.1): + - Update version.json + - fix: add context to DiskUsage() + - Version 0.5.0 (#99) ([ipfs/go-ds-flatfs#99](https://github.com/ipfs/go-ds-flatfs/pull/99)) + - feat: add contexts on datastore methods (#98) ([ipfs/go-ds-flatfs#98](https://github.com/ipfs/go-ds-flatfs/pull/98)) + - sync: update CI config files (#97) ([ipfs/go-ds-flatfs#97](https://github.com/ipfs/go-ds-flatfs/pull/97)) + - sync: update CI config files ([ipfs/go-ds-flatfs#96](https://github.com/ipfs/go-ds-flatfs/pull/96)) + - fix staticcheck ([ipfs/go-ds-flatfs#92](https://github.com/ipfs/go-ds-flatfs/pull/92)) + - fix typo in readme.go ([ipfs/go-ds-flatfs#89](https://github.com/ipfs/go-ds-flatfs/pull/89)) +- github.com/ipfs/go-ds-leveldb (v0.4.2 -> v0.5.0): + - Version 0.5.0 (#58) ([ipfs/go-ds-leveldb#58](https://github.com/ipfs/go-ds-leveldb/pull/58)) + - feat: plumb through contexts (#57) ([ipfs/go-ds-leveldb#57](https://github.com/ipfs/go-ds-leveldb/pull/57)) + - sync: update CI config files (#56) ([ipfs/go-ds-leveldb#56](https://github.com/ipfs/go-ds-leveldb/pull/56)) + - fix closing of datastore in tests ([ipfs/go-ds-leveldb#52](https://github.com/ipfs/go-ds-leveldb/pull/52)) + - fix staticcheck ([ipfs/go-ds-leveldb#49](https://github.com/ipfs/go-ds-leveldb/pull/49)) + - fix typo in function documentation ([ipfs/go-ds-leveldb#46](https://github.com/ipfs/go-ds-leveldb/pull/46)) +- github.com/ipfs/go-ds-measure (v0.1.0 -> v0.2.0): + - Version 0.2.0 (#39) ([ipfs/go-ds-measure#39](https://github.com/ipfs/go-ds-measure/pull/39)) + - feat: add contexts on datastore methods (#38) ([ipfs/go-ds-measure#38](https://github.com/ipfs/go-ds-measure/pull/38)) + - sync: update CI config files (#37) ([ipfs/go-ds-measure#37](https://github.com/ipfs/go-ds-measure/pull/37)) +- github.com/ipfs/go-fetcher (v1.5.0 -> v1.6.1): + - Version 1.6.1 + - Version 1.6.0 (#29) ([ipfs/go-fetcher#29](https://github.com/ipfs/go-fetcher/pull/29)) + - feat: plumb through context changes (#28) ([ipfs/go-fetcher#28](https://github.com/ipfs/go-fetcher/pull/28)) + - sync: update CI config files (#27) ([ipfs/go-fetcher#27](https://github.com/ipfs/go-fetcher/pull/27)) + - add a fetcher constructor for the case where we already have a session ([ipfs/go-fetcher#26](https://github.com/ipfs/go-fetcher/pull/26)) +- github.com/ipfs/go-filestore (v0.0.3 -> v0.1.0): + - feat: plumb through context changes (#56) ([ipfs/go-filestore#56](https://github.com/ipfs/go-filestore/pull/56)) +- github.com/ipfs/go-graphsync (v0.8.0 -> v0.11.0): + - docs(CHANGELOG): update for v0.11.0 release + - Merge branch 'release/v0.10.6' + - update to context datastores (#275) ([ipfs/go-graphsync#275](https://github.com/ipfs/go-graphsync/pull/275)) + - feat!(requestmanager): remove request allocation backpressure (#272) ([ipfs/go-graphsync#272](https://github.com/ipfs/go-graphsync/pull/272)) + - message/pb: stop using gogo/protobuf (#277) ([ipfs/go-graphsync#277](https://github.com/ipfs/go-graphsync/pull/277)) + - mark all test helper funcs via t.Helper (#276) ([ipfs/go-graphsync#276](https://github.com/ipfs/go-graphsync/pull/276)) + - chore(queryexecutor): remove unused RunTraversal + - chore(responsemanager): remove unused workSignal + - chore(queryexecutor): fix tests for runtraversal refactor + clean up + - feat(queryexecutor): merge RunTraversal into QueryExecutor + - feat(responsemanager): QueryExecutor to separate module - use TaskQueue, add tests + - Merge branch 'release/v0.10.5' + - fix(responseassembler): dont hold block data reference in passed on subscribed block link (#268) ([ipfs/go-graphsync#268](https://github.com/ipfs/go-graphsync/pull/268)) + - sync: update CI config files (#266) ([ipfs/go-graphsync#266](https://github.com/ipfs/go-graphsync/pull/266)) + - Check IPLD context cancellation error type instead of string comparison + - Use `context.CancelFunc` instead of `func()` (#257) ([ipfs/go-graphsync#257](https://github.com/ipfs/go-graphsync/pull/257)) + - fix: bail properly when budget exceeded + - feat(requestmanager): report inProgressRequestCount on OutgoingRequests event + - fix(requestmanager): remove failing racy test select block + - feat(requestmanager): add OutgoingRequeustProcessingListener + - Merge branch 'release/v0.10.4' + - fix(allocator): prevent buffer overflow (#248) ([ipfs/go-graphsync#248](https://github.com/ipfs/go-graphsync/pull/248)) + - Merge branch 'release/v0.10.3' + - Configure message parameters (#247) ([ipfs/go-graphsync#247](https://github.com/ipfs/go-graphsync/pull/247)) + - Stats! (#246) ([ipfs/go-graphsync#246](https://github.com/ipfs/go-graphsync/pull/246)) + - Limit simultaneous incoming requests on a per peer basis (#245) ([ipfs/go-graphsync#245](https://github.com/ipfs/go-graphsync/pull/245)) + - sync: update CI config files (#191) ([ipfs/go-graphsync#191](https://github.com/ipfs/go-graphsync/pull/191)) + - Merge branch 'release/v0.10.2' + - test(responsemanager): fix flakiness TestCancellationViaCommand (#243) ([ipfs/go-graphsync#243](https://github.com/ipfs/go-graphsync/pull/243)) + - Fix deadlock on notifications (#242) ([ipfs/go-graphsync#242](https://github.com/ipfs/go-graphsync/pull/242)) + - Merge branch 'release/v0.10.1' + - Free memory on request finish (#240) ([ipfs/go-graphsync#240](https://github.com/ipfs/go-graphsync/pull/240)) + - release: v1.10.0 ([ipfs/go-graphsync#238](https://github.com/ipfs/go-graphsync/pull/238)) + - Add support for IPLD prime's budgets feature in selectors (#235) ([ipfs/go-graphsync#235](https://github.com/ipfs/go-graphsync/pull/235)) + - feat(graphsync): add an index for blocks in the on new block hook (#234) ([ipfs/go-graphsync#234](https://github.com/ipfs/go-graphsync/pull/234)) + - Do not send first blocks extension (#230) ([ipfs/go-graphsync#230](https://github.com/ipfs/go-graphsync/pull/230)) + - Protect Libp2p Connections (#229) ([ipfs/go-graphsync#229](https://github.com/ipfs/go-graphsync/pull/229)) + - test(responsemanager): remove check (#228) ([ipfs/go-graphsync#228](https://github.com/ipfs/go-graphsync/pull/228)) + - feat(graphsync): give missing blocks a named error (#227) ([ipfs/go-graphsync#227](https://github.com/ipfs/go-graphsync/pull/227)) + - Add request limits (#224) ([ipfs/go-graphsync#224](https://github.com/ipfs/go-graphsync/pull/224)) + - Tech Debt Cleanup and Docs Update (#219) ([ipfs/go-graphsync#219](https://github.com/ipfs/go-graphsync/pull/219)) + - Release/v0.9.3 ([ipfs/go-graphsync#218](https://github.com/ipfs/go-graphsync/pull/218)) + - 0.9.2 release ([ipfs/go-graphsync#217](https://github.com/ipfs/go-graphsync/pull/217)) + - fix(requestmanager): remove main thread block on allocation (#216) ([ipfs/go-graphsync#216](https://github.com/ipfs/go-graphsync/pull/216)) + - feat(allocator): add debug logging (#213) ([ipfs/go-graphsync#213](https://github.com/ipfs/go-graphsync/pull/213)) + - fix: spurious warn log (#210) ([ipfs/go-graphsync#210](https://github.com/ipfs/go-graphsync/pull/210)) + - docs(CHANGELOG): update for v0.9.1 release (#212) ([ipfs/go-graphsync#212](https://github.com/ipfs/go-graphsync/pull/212)) + - fix(message): fix dropping of response extensions (#211) ([ipfs/go-graphsync#211](https://github.com/ipfs/go-graphsync/pull/211)) + - docs(CHANGELOG): update change log ([ipfs/go-graphsync#208](https://github.com/ipfs/go-graphsync/pull/208)) + - docs(README): add notice about branch rename + - fix(graphsync): make sure linkcontext is passed (#207) ([ipfs/go-graphsync#207](https://github.com/ipfs/go-graphsync/pull/207)) + - Merge final v0.6.x commit history, and 0.8.0 changelog (#205) ([ipfs/go-graphsync#205](https://github.com/ipfs/go-graphsync/pull/205)) + - Fix broken link to IPLD selector documentation (#189) ([ipfs/go-graphsync#189](https://github.com/ipfs/go-graphsync/pull/189)) + - fix: check errors before defering a close (#200) ([ipfs/go-graphsync#200](https://github.com/ipfs/go-graphsync/pull/200)) + - chore: fix checks (#197) ([ipfs/go-graphsync#197](https://github.com/ipfs/go-graphsync/pull/197)) + - Merge the v0.6.x commit history (#190) ([ipfs/go-graphsync#190](https://github.com/ipfs/go-graphsync/pull/190)) + - Ready for universal CI (#187) ([ipfs/go-graphsync#187](https://github.com/ipfs/go-graphsync/pull/187)) + - fix(requestmanager): pass through linksystem (#166) ([ipfs/go-graphsync#166](https://github.com/ipfs/go-graphsync/pull/166)) + - fix missing word in section title (#179) ([ipfs/go-graphsync#179](https://github.com/ipfs/go-graphsync/pull/179)) +- github.com/ipfs/go-ipfs-blockstore (v0.1.6 -> v0.2.1): + - fix: revert back to go-ipfs-ds-help@v0.1.1 (#92) ([ipfs/go-ipfs-blockstore#92](https://github.com/ipfs/go-ipfs-blockstore/pull/92)) + - feat: add context to interfaces & plumb through datastore contexts (#89) ([ipfs/go-ipfs-blockstore#89](https://github.com/ipfs/go-ipfs-blockstore/pull/89)) +- github.com/ipfs/go-ipfs-config (v0.16.0 -> v0.18.0): + - Release v0.18.0 (#159) ([ipfs/go-ipfs-config#159](https://github.com/ipfs/go-ipfs-config/pull/159)) + - feat: add Addresses.AppendAnnounce (#135) ([ipfs/go-ipfs-config#135](https://github.com/ipfs/go-ipfs-config/pull/135)) + - feat: omitempty Swarm.EnableRelayHop for circuit v1 migration (#157) ([ipfs/go-ipfs-config#157](https://github.com/ipfs/go-ipfs-config/pull/157)) + - chore: omitempty Experimental.ShardingEnabled (#158) ([ipfs/go-ipfs-config#158](https://github.com/ipfs/go-ipfs-config/pull/158)) + - chore: update comment to match struct + - Release v0.17.0 (#156) ([ipfs/go-ipfs-config#156](https://github.com/ipfs/go-ipfs-config/pull/156)) + - feat: add a flag to enable the hole punching service (#155) ([ipfs/go-ipfs-config#155](https://github.com/ipfs/go-ipfs-config/pull/155)) + - improve AutoRelay configuration, add config option for static relays ([ipfs/go-ipfs-config#154](https://github.com/ipfs/go-ipfs-config/pull/154)) + - feat: Swarm.RelayService (circuit v2) (#146) ([ipfs/go-ipfs-config#146](https://github.com/ipfs/go-ipfs-config/pull/146)) + - fix: String method on the OptionalString (#153) ([ipfs/go-ipfs-config#153](https://github.com/ipfs/go-ipfs-config/pull/153)) + - sync: update CI config files (#152) ([ipfs/go-ipfs-config#152](https://github.com/ipfs/go-ipfs-config/pull/152)) + - feat: OptionalString type and UnixFSShardingSizeThreshold (#149) ([ipfs/go-ipfs-config#149](https://github.com/ipfs/go-ipfs-config/pull/149)) + - feat: pubsub and ipns pubsub flags (#145) ([ipfs/go-ipfs-config#145](https://github.com/ipfs/go-ipfs-config/pull/145)) + - feat: add an OptionalDuration type (#148) ([ipfs/go-ipfs-config#148](https://github.com/ipfs/go-ipfs-config/pull/148)) +- github.com/ipfs/go-ipfs-exchange-interface (v0.0.1 -> v0.1.0): + - Update version.json (#20) ([ipfs/go-ipfs-exchange-interface#20](https://github.com/ipfs/go-ipfs-exchange-interface/pull/20)) + - sync: update CI config files (#19) ([ipfs/go-ipfs-exchange-interface#19](https://github.com/ipfs/go-ipfs-exchange-interface/pull/19)) + - feat: add context to interface (#18) ([ipfs/go-ipfs-exchange-interface#18](https://github.com/ipfs/go-ipfs-exchange-interface/pull/18)) + - doc: add a lead maintainer +- github.com/ipfs/go-ipfs-exchange-offline (v0.0.1 -> v0.1.1): + - Version 0.1.1 + - Version 0.1.0 (#43) ([ipfs/go-ipfs-exchange-offline#43](https://github.com/ipfs/go-ipfs-exchange-offline/pull/43)) + - feat: plumb through contexts (#42) ([ipfs/go-ipfs-exchange-offline#42](https://github.com/ipfs/go-ipfs-exchange-offline/pull/42)) + - sync: update CI config files (#41) ([ipfs/go-ipfs-exchange-offline#41](https://github.com/ipfs/go-ipfs-exchange-offline/pull/41)) + - fix staticcheck ([ipfs/go-ipfs-exchange-offline#35](https://github.com/ipfs/go-ipfs-exchange-offline/pull/35)) + - chore(gx): remove gx +- github.com/ipfs/go-ipfs-files (v0.0.8 -> v0.0.9): + - sync: update CI config files ([ipfs/go-ipfs-files#40](https://github.com/ipfs/go-ipfs-files/pull/40)) + - fix: manually parse the content disposition to preserve directories ([ipfs/go-ipfs-files#42](https://github.com/ipfs/go-ipfs-files/pull/42)) + - fix: round timestamps down by truncating them to seconds ([ipfs/go-ipfs-files#41](https://github.com/ipfs/go-ipfs-files/pull/41)) + - sync: update CI config files ([ipfs/go-ipfs-files#34](https://github.com/ipfs/go-ipfs-files/pull/34)) + - Fix test failure on Windows caused by nil `sys` in mock `FileInfo` ([ipfs/go-ipfs-files#39](https://github.com/ipfs/go-ipfs-files/pull/39)) + - fix staticcheck ([ipfs/go-ipfs-files#35](https://github.com/ipfs/go-ipfs-files/pull/35)) + - fix linters ([ipfs/go-ipfs-files#33](https://github.com/ipfs/go-ipfs-files/pull/33)) +- github.com/ipfs/go-ipfs-pinner (v0.1.2 -> v0.2.1): + - feat: plumb through context changes (#18) ([ipfs/go-ipfs-pinner#18](https://github.com/ipfs/go-ipfs-pinner/pull/18)) +- github.com/ipfs/go-ipfs-provider (v0.6.1 -> v0.7.1): + - Fix go vet and staticcheck ([ipfs/go-ipfs-provider#40](https://github.com/ipfs/go-ipfs-provider/pull/40)) + - feat: plumb through datastore contexts (#39) ([ipfs/go-ipfs-provider#39](https://github.com/ipfs/go-ipfs-provider/pull/39)) +- github.com/ipfs/go-ipfs-routing (v0.1.0 -> v0.2.1): + - Version 0.2.1 + - Bump version to 0.2.0 (#29) ([ipfs/go-ipfs-routing#29](https://github.com/ipfs/go-ipfs-routing/pull/29)) + - feat: plumb through context changes (#28) ([ipfs/go-ipfs-routing#28](https://github.com/ipfs/go-ipfs-routing/pull/28)) + - sync: update CI config files (#27) ([ipfs/go-ipfs-routing#27](https://github.com/ipfs/go-ipfs-routing/pull/27)) + - fix staticcheck ([ipfs/go-ipfs-routing#24](https://github.com/ipfs/go-ipfs-routing/pull/24)) +- github.com/ipfs/go-merkledag (v0.4.0 -> v0.5.1): + - Version 0.5.1 + - Version 0.5.0 (#79) ([ipfs/go-merkledag#79](https://github.com/ipfs/go-merkledag/pull/79)) + - feat: plumb through contexts (#78) ([ipfs/go-merkledag#78](https://github.com/ipfs/go-merkledag/pull/78)) + - sync: update CI config files (#77) ([ipfs/go-merkledag#77](https://github.com/ipfs/go-merkledag/pull/77)) + - expose session construction to other callers + - fix RawNode incomplete stats +- github.com/ipfs/go-mfs (v0.1.2 -> v0.2.1): + - Version 0.2.1 + - Version 0.2.0 (#96) ([ipfs/go-mfs#96](https://github.com/ipfs/go-mfs/pull/96)) + - support threshold based automatic sharding and unsharding of directories (#88) ([ipfs/go-mfs#88](https://github.com/ipfs/go-mfs/pull/88)) + - sync: update CI config files (#94) ([ipfs/go-mfs#94](https://github.com/ipfs/go-mfs/pull/94)) + - Fix lint errors ([ipfs/go-mfs#90](https://github.com/ipfs/go-mfs/pull/90)) + - remove Makefile ([ipfs/go-mfs#89](https://github.com/ipfs/go-mfs/pull/89)) +- github.com/ipfs/go-namesys (v0.3.1 -> v0.4.0): + - Release v0.4.0 + - feat: plumb through datastore contexts + - sync: update CI config files (#23) ([ipfs/go-namesys#23](https://github.com/ipfs/go-namesys/pull/23)) +- github.com/ipfs/go-path (v0.1.2 -> v0.2.1): + - Version 0.2.1 + - Version 0.2.0 (#48) ([ipfs/go-path#48](https://github.com/ipfs/go-path/pull/48)) + - feat: plumb through context changes (#47) ([ipfs/go-path#47](https://github.com/ipfs/go-path/pull/47)) + - sync: update CI config files (#46) ([ipfs/go-path#46](https://github.com/ipfs/go-path/pull/46)) + - Revert "feat: plumb through context changes" + - feat: plumb through context changes +- github.com/ipfs/go-peertaskqueue (v0.4.0 -> v0.7.0): + - feat: optimize checking if a new task is "better" ([ipfs/go-peertaskqueue#19](https://github.com/ipfs/go-peertaskqueue/pull/19)) + - Adds customizable prioritization logic for peertracker and peertaskqueue ([ipfs/go-peertaskqueue#17](https://github.com/ipfs/go-peertaskqueue/pull/17)) + - When priority is equal, use FIFO ([ipfs/go-peertaskqueue#16](https://github.com/ipfs/go-peertaskqueue/pull/16)) +- github.com/ipfs/go-unixfs (v0.2.5 -> v0.3.1): + - Version 0.3.1 + - Version 0.3.0 (#114) ([ipfs/go-unixfs#114](https://github.com/ipfs/go-unixfs/pull/114)) + - feat: plumb through datastore context changes + - Size-based unsharding (#94) ([ipfs/go-unixfs#94](https://github.com/ipfs/go-unixfs/pull/94)) + - sync: update CI config files (#112) ([ipfs/go-unixfs#112](https://github.com/ipfs/go-unixfs/pull/112)) + - chore(deps): move bitfield to ipfs org ([ipfs/go-unixfs#98](https://github.com/ipfs/go-unixfs/pull/98)) + - fix staticcheck ([ipfs/go-unixfs#95](https://github.com/ipfs/go-unixfs/pull/95)) + - fix(directory): initialize size when computing it ([ipfs/go-unixfs#93](https://github.com/ipfs/go-unixfs/pull/93)) + - fix: always return upgradeable instead of basic dir (#92) ([ipfs/go-unixfs#92](https://github.com/ipfs/go-unixfs/pull/92)) + - feat: switch to HAMT based on size (#91) ([ipfs/go-unixfs#91](https://github.com/ipfs/go-unixfs/pull/91)) + - go fmt + - fix: add pointer receiver + - add test + - feat: add UpgradeableDirectory +- github.com/ipfs/interface-go-ipfs-core (v0.5.1 -> v0.5.2): + - fix: check errors by string ([ipfs/interface-go-ipfs-core#76](https://github.com/ipfs/interface-go-ipfs-core/pull/76)) +- github.com/ipfs/tar-utils (v0.0.1 -> v0.0.2): + - Release v0.0.2 (#8) ([ipfs/tar-utils#8](https://github.com/ipfs/tar-utils/pull/8)) + - sync: update CI config files ([ipfs/tar-utils#7](https://github.com/ipfs/tar-utils/pull/7)) + - sync: update CI config files (#6) ([ipfs/tar-utils#6](https://github.com/ipfs/tar-utils/pull/6)) + - allow .. in file and directory names ([ipfs/tar-utils#5](https://github.com/ipfs/tar-utils/pull/5)) +- github.com/ipld/go-car (v0.3.1 -> v0.3.2): + - Expose selector traversal options for SelectiveCar ([ipld/go-car#251](https://github.com/ipld/go-car/pull/251)) + - Implement API to allow replacing root CIDs in a CARv1 or CARv2 + - blockstore: OpenReadWrite should not modify if it refuses to resume + - clarify the relation between StoreIdentityCIDs and SetFullyIndexed + - Implement options to handle `IDENTITY` CIDs gracefully + - Combine API options for simplicity and logical coherence + - Add test script for car verify (#236) ([ipld/go-car#236](https://github.com/ipld/go-car/pull/236)) + - cmd/car: add first testscript tests + - integrate `car/` cli into `cmd/car` (#233) ([ipld/go-car#233](https://github.com/ipld/go-car/pull/233)) + - Add `car get-dag` command (#232) ([ipld/go-car#232](https://github.com/ipld/go-car/pull/232)) + - Separate CLI to separate module (#231) ([ipld/go-car#231](https://github.com/ipld/go-car/pull/231)) + - add `get block` to car cli (#230) ([ipld/go-car#230](https://github.com/ipld/go-car/pull/230)) + - use file size when loading from v1 car (#229) ([ipld/go-car#229](https://github.com/ipld/go-car/pull/229)) + - add interface describing iteration (#228) ([ipld/go-car#228](https://github.com/ipld/go-car/pull/228)) + - Add `list` and `filter` commands (#227) ([ipld/go-car#227](https://github.com/ipld/go-car/pull/227)) + - Add `car split` command (#226) ([ipld/go-car#226](https://github.com/ipld/go-car/pull/226)) + - Make `MultihashIndexSorted` the default index codec for CARv2 + - Add carve utility for updating the index of a car{v1,v2} file (#219) ([ipld/go-car#219](https://github.com/ipld/go-car/pull/219)) + - Ignore records with `IDENTITY` CID in `IndexSorted` + - Fix index GetAll infinite loop if function always returns `true` + - Expose the ability to iterate over records in `MultihasIndexSorted` + - avoid another alloc per read byte + - avoid allocating on every byte read + - Implement new index type that also includes mutltihash code + - Return `nil` as Index reader when reading indexless CARv2 + - Assert `OpenReader` from file does not panic after closure + - Document performance caveats of `ExtractV1File` and address comments + - Implement utility to extract CARv1 from a CARv2 + - v2/blockstore: add ReadWrite.Discard + - update LICENSE files to point to the new gateway + - re-add root LICENSE file + - v2: stop using a symlink for LICENSE.md + - Update the readme with link to examples + - update package godocs and root level README for v2 + - blockstore: stop embedding ReadOnly in ReadWrite + - Implement version agnostic streaming CAR block iterator + - blockstore: use errors when API contracts are broken + - add the first read-only benchmarks + - Implement reader block iterator over CARv1 or CARv2 + - Propagate async `blockstore.AllKeysChan` errors via context + - Add zero-length sections as EOF option to internal CARv1 reader + - Improve error handing in tests + - Allow `ReadOption`s to be set when getting or generating index + - Use `ioutil.TempFile` to simplify file creation in index example + - Avoid writing to files in testdata + - blockstore: implement UseWholeCIDs + - Merge wip-v2 into master (#178) ([ipld/go-car#178](https://github.com/ipld/go-car/pull/178)) +- github.com/ipld/go-ipld-prime (v0.12.2 -> v0.14.2): + - dagcbor: coerce undef to null. ([ipld/go-ipld-prime#308](https://github.com/ipld/go-ipld-prime/pull/308)) + - fluent: add toInterface (#304) ([ipld/go-ipld-prime#304](https://github.com/ipld/go-ipld-prime/pull/304)) + - traversal: s/Walk/WalkLocal/ + - traversal: add a primitive walk function. + - Remove dependency to `go-wish` + - mark v0.14.0 + - ([ipld/go-ipld-prime#279](https://github.com/ipld/go-ipld-prime/pull/279)) + - Port `traversal` package tests to quicktest + - Port `codec` package tests to quicktest + - changelog: backfill. + - Gracefully handle `TypedNode` with `nil` type of kind `Map` + - Gracefully print typed nodes with `nil` type + - Implement handling of `Link` and `[]byte` in `printer` (#294) ([ipld/go-ipld-prime#294](https://github.com/ipld/go-ipld-prime/pull/294)) + - changelog: backfill for the v0.12.x series. + - readme: introduce a migration guide. + - Port `fluent` package tests to quicktest + - Port `datamodel` package tests to quicktest + - Port `adl` package tests to quicktest + - Port `node` package tests to quicktest + - node/bindnode: support links in ProduceGoTypes + - bump CI to Go 1.16 and 1.17 + - node/bindnode: support links in schema-type verification + - node/bindnode: export ProduceGoTypes + - all: fix "an" typos after the ipld->datamodel refactor + - node/bindnode: fix test code after two PR merges + - add LoadSchema APIs to the root package + - storage: add 'Has' feature. ([ipld/go-ipld-prime#276](https://github.com/ipld/go-ipld-prime/pull/276)) + - node/bindnode: start verifying schema compatibility + - linking: add LoadRaw and LoadPlusRaw functions to LinkSystem. ([ipld/go-ipld-prime#267](https://github.com/ipld/go-ipld-prime/pull/267)) + - node/bindnode: add support for lists behind kinded unions + - node/bindnode: also run TestPrototype with just schemas + - node/bindnode: polish a few TODO panics away + - node/bindnode: add support for all scalars behind kinded unions + - node/bindnode: get closer to passing the Links schema tests + - start using Rod's schema tests from ipld/ipld + - fully support parsing, encoding, and decoding the schema-schema + - node/bindnode: add native support for cid.Cid + - A more Featureful Approach to Storage APIs ([ipld/go-ipld-prime#265](https://github.com/ipld/go-ipld-prime/pull/265)) + - Add a cidlink.Memory storage option (#266) ([ipld/go-ipld-prime#266](https://github.com/ipld/go-ipld-prime/pull/266)) + - Improve docs for AssignNode; and datamodel.Copy function. ([ipld/go-ipld-prime#264](https://github.com/ipld/go-ipld-prime/pull/264)) + - schemadsl: assign the struct representation. + - schema,tests,gen/go: more tests, gen union fixes. ([ipld/go-ipld-prime#257](https://github.com/ipld/go-ipld-prime/pull/257)) + - fix: deal with LinkRevisit->LinkVisitOnlyOnce change + - traversal: the link-visit-only-once behavior should require opt-in, rather than defaulting to on. + - chore: add LinkRevisit:false traversal test + - traversal: track seen links, and revisit only if configured to do so. + - fix: use datamodel.Node selectors + - Revert encode round-trip to leave unencoded node test intact + - Add more walk tests, including tests for use of SkipMe + - Round-trip test nodes through custom codec to ensure stability + - Don't abort block processing when encountering SkipMe + - traversal: implement monotonically decrementing budgets. ([ipld/go-ipld-prime#260](https://github.com/ipld/go-ipld-prime/pull/260)) + - Use datamodel.Node for "Common" selector variants + - schema/dmt: first pass at a parser ([ipld/go-ipld-prime#253](https://github.com/ipld/go-ipld-prime/pull/253)) + - drop codectools. + - drop jst codec. It lives in https://github.com/warpfork/go-jst/ now. + - drop dagjson2. + - fix(traversal): properly wrap errors + - printer: empty maps and lists and structs should stay on one line. + - schema: turn TypeName into an alias + - schema/dmt: sync with schema-schema changes, finish Compile + - schema: add ways to set and access the ImplicitValue for a struct field. + - schema: accessor for TypeEnum.Representation. + - schema: finish minimum viable support for describing enum types. +- github.com/libp2p/go-conn-security-multistream (v0.2.1 -> v0.3.0): + - use the new SecureTransport and SecureMuxer interfaces (#36) ([libp2p/go-conn-security-multistream#36](https://github.com/libp2p/go-conn-security-multistream/pull/36)) + - fix go vet and staticcheck ([libp2p/go-conn-security-multistream#33](https://github.com/libp2p/go-conn-security-multistream/pull/33)) +- github.com/libp2p/go-libp2p (v0.15.0 -> v0.16.0): + - release v0.16.0 ([libp2p/go-libp2p#1246](https://github.com/libp2p/go-libp2p/pull/1246)) + - allow the ping protocol on transient connections ([libp2p/go-libp2p#1244](https://github.com/libp2p/go-libp2p/pull/1244)) + - make the Type field required in the HolePunch protobuf ([libp2p/go-libp2p#1241](https://github.com/libp2p/go-libp2p/pull/1241)) + - reject hole punching attempts when we don't have any public addresses ([libp2p/go-libp2p#1214](https://github.com/libp2p/go-libp2p/pull/1214)) + - refactor the AutoRelay code ([libp2p/go-libp2p#1240](https://github.com/libp2p/go-libp2p/pull/1240)) + - remove dead API link in README ([libp2p/go-libp2p#1233](https://github.com/libp2p/go-libp2p/pull/1233)) + - pass static relays to EnableAutoRelay, deprecate libp2p.StaticRelays and libp2p.DefaultStaticRelays ([libp2p/go-libp2p#1239](https://github.com/libp2p/go-libp2p/pull/1239)) + - feat: plumb through peerstore context changes (#1237) ([libp2p/go-libp2p#1237](https://github.com/libp2p/go-libp2p/pull/1237)) + - emit the EvtPeerConnectednessChanged event ([libp2p/go-libp2p#1230](https://github.com/libp2p/go-libp2p/pull/1230)) + - update go-libp2p-swarm to v0.7.0 ([libp2p/go-libp2p#1226](https://github.com/libp2p/go-libp2p/pull/1226)) + - sync: update CI config files (#1225) ([libp2p/go-libp2p#1225](https://github.com/libp2p/go-libp2p/pull/1225)) + - simplify circuitv2 package structure ([libp2p/go-libp2p#1224](https://github.com/libp2p/go-libp2p/pull/1224)) + - use a random string for the mDNS peer-name ([libp2p/go-libp2p#1222](https://github.com/libp2p/go-libp2p/pull/1222)) + - remove {Un}RegisterNotifee functions from mDNS service ([libp2p/go-libp2p#1220](https://github.com/libp2p/go-libp2p/pull/1220)) + - fix structured logging in holepunch coordination ([libp2p/go-libp2p#1213](https://github.com/libp2p/go-libp2p/pull/1213)) + - fix flaky TestStBackpressureStreamWrite test ([libp2p/go-libp2p#1212](https://github.com/libp2p/go-libp2p/pull/1212)) + - properly close hosts in mDNS tests ([libp2p/go-libp2p#1216](https://github.com/libp2p/go-libp2p/pull/1216)) + - close the ObserverAddrManager when the ID service is closed ([libp2p/go-libp2p#1218](https://github.com/libp2p/go-libp2p/pull/1218)) + - make it possible to pass options to a transport constructor ([libp2p/go-libp2p#1205](https://github.com/libp2p/go-libp2p/pull/1205)) + - remove goprocess from the NATManager ([libp2p/go-libp2p#1193](https://github.com/libp2p/go-libp2p/pull/1193)) + - add an option to start the relay v2 ([libp2p/go-libp2p#1197](https://github.com/libp2p/go-libp2p/pull/1197)) + - fix flaky TestFastDisconnect identify test ([libp2p/go-libp2p#1200](https://github.com/libp2p/go-libp2p/pull/1200)) + - chore: update go-tcp-transport to v0.3.0 ([libp2p/go-libp2p#1203](https://github.com/libp2p/go-libp2p/pull/1203)) + - fix: skip variadic params in constructors ([libp2p/go-libp2p#1204](https://github.com/libp2p/go-libp2p/pull/1204)) + - fix flaky BasicHost tests ([libp2p/go-libp2p#1202](https://github.com/libp2p/go-libp2p/pull/1202)) + - remove dependency on github.com/ipfs/go-detect-race ([libp2p/go-libp2p#1201](https://github.com/libp2p/go-libp2p/pull/1201)) + - fix flaky TestEndToEndSimConnect holepunching test ([libp2p/go-libp2p#1191](https://github.com/libp2p/go-libp2p/pull/1191)) + - autorelay support for circuitv2 relays (#1198) ([libp2p/go-libp2p#1198](https://github.com/libp2p/go-libp2p/pull/1198)) + - reject circuitv2 reservations with nonsensical expiration times ([libp2p/go-libp2p#1199](https://github.com/libp2p/go-libp2p/pull/1199)) + - Tag relay hops in relay implementations ([libp2p/go-libp2p#1188](https://github.com/libp2p/go-libp2p/pull/1188)) + - Add standalone implementation of v1 Relay (#1186) ([libp2p/go-libp2p#1186](https://github.com/libp2p/go-libp2p/pull/1186)) + - remove the context from the libp2p and the Host constructor ([libp2p/go-libp2p#1190](https://github.com/libp2p/go-libp2p/pull/1190)) + - don't use a context to shut down the circuitv2 ([libp2p/go-libp2p#1185](https://github.com/libp2p/go-libp2p/pull/1185)) + - fix: remove v1 go-log dep ([libp2p/go-libp2p#1189](https://github.com/libp2p/go-libp2p/pull/1189)) + - don't use the context to shut down the relay ([libp2p/go-libp2p#1184](https://github.com/libp2p/go-libp2p/pull/1184)) + - Use circuitv2 code (#1183) ([libp2p/go-libp2p#1183](https://github.com/libp2p/go-libp2p/pull/1183)) + - clean up badges in README ([libp2p/go-libp2p#1179](https://github.com/libp2p/go-libp2p/pull/1179)) + - remove recommendation about Go module proxy from README ([libp2p/go-libp2p#1180](https://github.com/libp2p/go-libp2p/pull/1180)) + - merge branch 'hole-punching' + - don't use a context for closing the ObservedAddrManager ([libp2p/go-libp2p#1175](https://github.com/libp2p/go-libp2p/pull/1175)) + - move the circuit v2 code here ([libp2p/go-libp2p#1174](https://github.com/libp2p/go-libp2p/pull/1174)) + - make QUIC a default transport ([libp2p/go-libp2p#1128](https://github.com/libp2p/go-libp2p/pull/1128)) + - stop using jbenet/go-cienv ([libp2p/go-libp2p#1176](https://github.com/libp2p/go-libp2p/pull/1176)) + - fix flaky TestObsAddrSet test ([libp2p/go-libp2p#1172](https://github.com/libp2p/go-libp2p/pull/1172)) + - clean up messy defer logic in IDService.sendIdentifyResp ([libp2p/go-libp2p#1169](https://github.com/libp2p/go-libp2p/pull/1169)) + - remove secio from README, add noise ([libp2p/go-libp2p#1165](https://github.com/libp2p/go-libp2p/pull/1165)) +- github.com/libp2p/go-libp2p-asn-util (v0.0.0-20200825225859-85005c6cf052 -> v0.1.0): + - Update from upstream and make regeneration easier (#17) ([libp2p/go-libp2p-asn-util#17](https://github.com/libp2p/go-libp2p-asn-util/pull/17)) + - add license file so it can be found by go-licenses ([libp2p/go-libp2p-asn-util#10](https://github.com/libp2p/go-libp2p-asn-util/pull/10)) + - refactor: rename ASN table files ([libp2p/go-libp2p-asn-util#9](https://github.com/libp2p/go-libp2p-asn-util/pull/9)) + - Library for IP -> ASN mapping ([libp2p/go-libp2p-asn-util#1](https://github.com/libp2p/go-libp2p-asn-util/pull/1)) +- github.com/libp2p/go-libp2p-autonat (v0.4.2 -> v0.6.0): + - Version 0.6.0 (#112) ([libp2p/go-libp2p-autonat#112](https://github.com/libp2p/go-libp2p-autonat/pull/112)) + - feat: plumb through contexts from peerstore (#111) ([libp2p/go-libp2p-autonat#111](https://github.com/libp2p/go-libp2p-autonat/pull/111)) + - sync: update CI config files (#110) ([libp2p/go-libp2p-autonat#110](https://github.com/libp2p/go-libp2p-autonat/pull/110)) + - remove context from constructor, implement a proper Close method ([libp2p/go-libp2p-autonat#109](https://github.com/libp2p/go-libp2p-autonat/pull/109)) + - fix stream deadlines ([libp2p/go-libp2p-autonat#107](https://github.com/libp2p/go-libp2p-autonat/pull/107)) + - disable failing integration test ([libp2p/go-libp2p-autonat#108](https://github.com/libp2p/go-libp2p-autonat/pull/108)) + - fix staticcheck ([libp2p/go-libp2p-autonat#103](https://github.com/libp2p/go-libp2p-autonat/pull/103)) +- github.com/libp2p/go-libp2p-core (v0.9.0 -> v0.11.0): + - release v0.11.0 (#217) ([libp2p/go-libp2p-core#217](https://github.com/libp2p/go-libp2p-core/pull/217)) + - remove the ConnHandler (#214) ([libp2p/go-libp2p-core#214](https://github.com/libp2p/go-libp2p-core/pull/214)) + - sync: update CI config files (#216) ([libp2p/go-libp2p-core#216](https://github.com/libp2p/go-libp2p-core/pull/216)) + - remove the Process from the Network interface (#212) ([libp2p/go-libp2p-core#212](https://github.com/libp2p/go-libp2p-core/pull/212)) + - pass the peer ID to SecureInbound in the SecureTransport and SecureMuxer (#211) ([libp2p/go-libp2p-core#211](https://github.com/libp2p/go-libp2p-core/pull/211)) + - save the role (client, server) in the simultaneous connect context (#210) ([libp2p/go-libp2p-core#210](https://github.com/libp2p/go-libp2p-core/pull/210)) + - sync: update CI config files (#209) ([libp2p/go-libp2p-core#209](https://github.com/libp2p/go-libp2p-core/pull/209)) +- github.com/libp2p/go-libp2p-discovery (v0.5.1 -> v0.6.0): + - feat: plumb peerstore contexts changes through (#75) ([libp2p/go-libp2p-discovery#75](https://github.com/libp2p/go-libp2p-discovery/pull/75)) + - remove deprecated types ([libp2p/go-libp2p-discovery#73](https://github.com/libp2p/go-libp2p-discovery/pull/73)) +- github.com/libp2p/go-libp2p-kad-dht (v0.13.1 -> v0.15.0): + - Bump version to 0.15.0 (#755) ([libp2p/go-libp2p-kad-dht#755](https://github.com/libp2p/go-libp2p-kad-dht/pull/755)) + - sync: update CI config files (#754) ([libp2p/go-libp2p-kad-dht#754](https://github.com/libp2p/go-libp2p-kad-dht/pull/754)) + - feat: plumb through datastore contexts (#753) ([libp2p/go-libp2p-kad-dht#753](https://github.com/libp2p/go-libp2p-kad-dht/pull/753)) + - custom ProviderManager that brokers AddrInfos (#751) ([libp2p/go-libp2p-kad-dht#751](https://github.com/libp2p/go-libp2p-kad-dht/pull/751)) + - feat: make compatible with go-libp2p 0.15 ([libp2p/go-libp2p-kad-dht#747](https://github.com/libp2p/go-libp2p-kad-dht/pull/747)) + - sync: update CI config files ([libp2p/go-libp2p-kad-dht#743](https://github.com/libp2p/go-libp2p-kad-dht/pull/743)) + - Disallow GetPublicKey when DisableValues is passed ([libp2p/go-libp2p-kad-dht#604](https://github.com/libp2p/go-libp2p-kad-dht/pull/604)) +- github.com/libp2p/go-libp2p-nat (v0.0.6 -> v0.1.0): + - remove Codecov config file ([libp2p/go-libp2p-nat#39](https://github.com/libp2p/go-libp2p-nat/pull/39)) + - stop using goprocess for shutdown ([libp2p/go-libp2p-nat#38](https://github.com/libp2p/go-libp2p-nat/pull/38)) + - chore: update go-log ([libp2p/go-libp2p-nat#37](https://github.com/libp2p/go-libp2p-nat/pull/37)) + - remove unused field permanent from mapping ([libp2p/go-libp2p-nat#33](https://github.com/libp2p/go-libp2p-nat/pull/33)) +- github.com/libp2p/go-libp2p-noise (v0.2.2 -> v0.3.0): + - add the peer ID to SecureInbound ([libp2p/go-libp2p-noise#104](https://github.com/libp2p/go-libp2p-noise/pull/104)) + - update go-libp2p-core, remove integration test ([libp2p/go-libp2p-noise#102](https://github.com/libp2p/go-libp2p-noise/pull/102)) +- github.com/libp2p/go-libp2p-peerstore (v0.2.8 -> v0.4.0): + - Update version.json (#178) ([libp2p/go-libp2p-peerstore#178](https://github.com/libp2p/go-libp2p-peerstore/pull/178)) + - limit the number of protocols we store per peer ([libp2p/go-libp2p-peerstore#172](https://github.com/libp2p/go-libp2p-peerstore/pull/172)) + - sync: update CI config files (#177) ([libp2p/go-libp2p-peerstore#177](https://github.com/libp2p/go-libp2p-peerstore/pull/177)) + - feat: plumb through datastore contexts (#176) ([libp2p/go-libp2p-peerstore#176](https://github.com/libp2p/go-libp2p-peerstore/pull/176)) + - remove leftover peerstore implementation in the root package ([libp2p/go-libp2p-peerstore#173](https://github.com/libp2p/go-libp2p-peerstore/pull/173)) + - fix: replace deprecated call ([libp2p/go-libp2p-peerstore#168](https://github.com/libp2p/go-libp2p-peerstore/pull/168)) + - feat: remove queue ([libp2p/go-libp2p-peerstore#166](https://github.com/libp2p/go-libp2p-peerstore/pull/166)) + - remove deprecated types ([libp2p/go-libp2p-peerstore#165](https://github.com/libp2p/go-libp2p-peerstore/pull/165)) +- github.com/libp2p/go-libp2p-pubsub (v0.5.4 -> v0.6.0): + - feat: plumb through context changes (#459) ([libp2p/go-libp2p-pubsub#459](https://github.com/libp2p/go-libp2p-pubsub/pull/459)) + - support MinTopicSize without a discovery mechanism + - clear peerPromises map when fullfilling a promise + - README: remove obsolete notice, fix example code for tracing. + - remove peer filter check from subscriptions (#453) ([libp2p/go-libp2p-pubsub#453](https://github.com/libp2p/go-libp2p-pubsub/pull/453)) + - Create peer filter option +- github.com/libp2p/go-libp2p-pubsub-router (v0.4.0 -> v0.5.0): + - Version 0.5.0 + - feat: plumb through datastore contexts + - sync: update CI config files (#86) ([libp2p/go-libp2p-pubsub-router#86](https://github.com/libp2p/go-libp2p-pubsub-router/pull/86)) + - Remove arbitrary sleeps from tests ([libp2p/go-libp2p-pubsub-router#87](https://github.com/libp2p/go-libp2p-pubsub-router/pull/87)) + - cleanup: fix staticcheck failures ([libp2p/go-libp2p-pubsub-router#84](https://github.com/libp2p/go-libp2p-pubsub-router/pull/84)) + - Add WithDatastore option. ([libp2p/go-libp2p-pubsub-router#82](https://github.com/libp2p/go-libp2p-pubsub-router/pull/82)) +- github.com/libp2p/go-libp2p-quic-transport (v0.12.0 -> v0.15.0): + - release v0.15.0 (#241) ([libp2p/go-libp2p-quic-transport#241](https://github.com/libp2p/go-libp2p-quic-transport/pull/241)) + - reuse the same router until we change listeners ([libp2p/go-libp2p-quic-transport#240](https://github.com/libp2p/go-libp2p-quic-transport/pull/240)) + - release v0.14.0 ([libp2p/go-libp2p-quic-transport#237](https://github.com/libp2p/go-libp2p-quic-transport/pull/237)) + - fix error assertions in the tracer ([libp2p/go-libp2p-quic-transport#234](https://github.com/libp2p/go-libp2p-quic-transport/pull/234)) + - sync: update CI config files (#235) ([libp2p/go-libp2p-quic-transport#235](https://github.com/libp2p/go-libp2p-quic-transport/pull/235)) + - read the client option from the simultaneous connect context ([libp2p/go-libp2p-quic-transport#230](https://github.com/libp2p/go-libp2p-quic-transport/pull/230)) +- github.com/libp2p/go-libp2p-swarm (v0.5.3 -> v0.8.0): + - Version 0.8.0 (#292) ([libp2p/go-libp2p-swarm#292](https://github.com/libp2p/go-libp2p-swarm/pull/292)) + - feat: plumb contexts through from peerstore (#290) ([libp2p/go-libp2p-swarm#290](https://github.com/libp2p/go-libp2p-swarm/pull/290)) + - release v0.7.0 ([libp2p/go-libp2p-swarm#289](https://github.com/libp2p/go-libp2p-swarm/pull/289)) + - update go-tcp-transport to v0.4.0 ([libp2p/go-libp2p-swarm#287](https://github.com/libp2p/go-libp2p-swarm/pull/287)) + - remove the ConnHandler ([libp2p/go-libp2p-swarm#286](https://github.com/libp2p/go-libp2p-swarm/pull/286)) + - sync: update CI config files (#288) ([libp2p/go-libp2p-swarm#288](https://github.com/libp2p/go-libp2p-swarm/pull/288)) + - remove a lot of incorrect statements from the README ([libp2p/go-libp2p-swarm#284](https://github.com/libp2p/go-libp2p-swarm/pull/284)) + - unexport the DialSync ([libp2p/go-libp2p-swarm#281](https://github.com/libp2p/go-libp2p-swarm/pull/281)) + - add an error return value to the constructor ([libp2p/go-libp2p-swarm#280](https://github.com/libp2p/go-libp2p-swarm/pull/280)) + - use functional options to configure the swarm ([libp2p/go-libp2p-swarm#279](https://github.com/libp2p/go-libp2p-swarm/pull/279)) + - stop using goprocess to control teardown ([libp2p/go-libp2p-swarm#278](https://github.com/libp2p/go-libp2p-swarm/pull/278)) + - read and use the direction from the simultaneous connect context ([libp2p/go-libp2p-swarm#277](https://github.com/libp2p/go-libp2p-swarm/pull/277)) + - simplify the DialSync code ([libp2p/go-libp2p-swarm#272](https://github.com/libp2p/go-libp2p-swarm/pull/272)) + - remove redundant self-dialing check, simplify starting of dialWorkerLoop ([libp2p/go-libp2p-swarm#273](https://github.com/libp2p/go-libp2p-swarm/pull/273)) + - add a test case for the testing package ([libp2p/go-libp2p-swarm#276](https://github.com/libp2p/go-libp2p-swarm/pull/276)) + - simplify limiter by removing the injected isFdConsumingFnc ([libp2p/go-libp2p-swarm#274](https://github.com/libp2p/go-libp2p-swarm/pull/274)) + - update badges ([libp2p/go-libp2p-swarm#271](https://github.com/libp2p/go-libp2p-swarm/pull/271)) + - remove unused context in Swarm.dialWorkerLoop ([libp2p/go-libp2p-swarm#268](https://github.com/libp2p/go-libp2p-swarm/pull/268)) + - remove Codecov config ([libp2p/go-libp2p-swarm#270](https://github.com/libp2p/go-libp2p-swarm/pull/270)) + - fix race condition in TestFailFirst ([libp2p/go-libp2p-swarm#269](https://github.com/libp2p/go-libp2p-swarm/pull/269)) +- github.com/libp2p/go-libp2p-testing (v0.4.2 -> v0.5.0): + - chore: update go-libp2p-core to v0.10.0 ([libp2p/go-libp2p-testing#38](https://github.com/libp2p/go-libp2p-testing/pull/38)) + - sync: update CI config files (#37) ([libp2p/go-libp2p-testing#37](https://github.com/libp2p/go-libp2p-testing/pull/37)) +- github.com/libp2p/go-libp2p-tls (v0.2.0 -> v0.3.1): + - release v0.3.1 ([libp2p/go-libp2p-tls#101](https://github.com/libp2p/go-libp2p-tls/pull/101)) + - set a random certificate subject ([libp2p/go-libp2p-tls#100](https://github.com/libp2p/go-libp2p-tls/pull/100)) + - sync: update CI config files (#96) ([libp2p/go-libp2p-tls#96](https://github.com/libp2p/go-libp2p-tls/pull/96)) + - add the peer ID to SecureInbound ([libp2p/go-libp2p-tls#94](https://github.com/libp2p/go-libp2p-tls/pull/94)) + - sync: update CI config files ([libp2p/go-libp2p-tls#91](https://github.com/libp2p/go-libp2p-tls/pull/91)) +- github.com/libp2p/go-libp2p-transport-upgrader (v0.4.6 -> v0.5.0): + - increase timeout in TestConnectionsClosedIfNotAccepted on CI ([libp2p/go-libp2p-transport-upgrader#85](https://github.com/libp2p/go-libp2p-transport-upgrader/pull/85)) + - add the peer ID to SecureInbound ([libp2p/go-libp2p-transport-upgrader#83](https://github.com/libp2p/go-libp2p-transport-upgrader/pull/83)) +- github.com/libp2p/go-msgio (v0.0.6 -> v0.1.0): + - sync: update CI config files (#27) ([libp2p/go-msgio#27](https://github.com/libp2p/go-msgio/pull/27)) + - remove .gxignore file ([libp2p/go-msgio#24](https://github.com/libp2p/go-msgio/pull/24)) + - remove Codecov config ([libp2p/go-msgio#26](https://github.com/libp2p/go-msgio/pull/26)) + - remove "Chan" type ([libp2p/go-msgio#23](https://github.com/libp2p/go-msgio/pull/23)) +- github.com/libp2p/go-nat (v0.0.5 -> v0.1.0): + - pass a context to DiscoverGateway ([libp2p/go-nat#23](https://github.com/libp2p/go-nat/pull/23)) +- github.com/libp2p/go-reuseport (v0.0.2 -> v0.1.0): + - stop using github.com/pkg/errors ([libp2p/go-reuseport#85](https://github.com/libp2p/go-reuseport/pull/85)) + - sync: update CI config files (#84) ([libp2p/go-reuseport#84](https://github.com/libp2p/go-reuseport/pull/84)) +- github.com/libp2p/go-reuseport-transport (v0.0.5 -> v0.1.0): + - remove Codecov config file ([libp2p/go-reuseport-transport#36](https://github.com/libp2p/go-reuseport-transport/pull/36)) + - chore: update go-log to v2 ([libp2p/go-reuseport-transport#35](https://github.com/libp2p/go-reuseport-transport/pull/35)) + - sync: update CI config files ([libp2p/go-reuseport-transport#31](https://github.com/libp2p/go-reuseport-transport/pull/31)) +- github.com/libp2p/go-tcp-transport (v0.2.8 -> v0.4.0): + - release v0.4.0 ([libp2p/go-tcp-transport#108](https://github.com/libp2p/go-tcp-transport/pull/108)) + - sync: update CI config files (#107) ([libp2p/go-tcp-transport#107](https://github.com/libp2p/go-tcp-transport/pull/107)) + - remove the deprecated IPFS_REUSEPORT command line flag ([libp2p/go-tcp-transport#104](https://github.com/libp2p/go-tcp-transport/pull/104)) + - add options to the constructor ([libp2p/go-tcp-transport#99](https://github.com/libp2p/go-tcp-transport/pull/99)) + - remove the context from the libp2p constructor in README ([libp2p/go-tcp-transport#101](https://github.com/libp2p/go-tcp-transport/pull/101)) + - don't use libp2p.ChainOption in README ([libp2p/go-tcp-transport#102](https://github.com/libp2p/go-tcp-transport/pull/102)) + - remove incorrect statement about dns addresses in README ([libp2p/go-tcp-transport#100](https://github.com/libp2p/go-tcp-transport/pull/100)) + - use the assigned role when upgrading a sim open connection ([libp2p/go-tcp-transport#95](https://github.com/libp2p/go-tcp-transport/pull/95)) + - chore: update go-log to v2 ([libp2p/go-tcp-transport#97](https://github.com/libp2p/go-tcp-transport/pull/97)) + - simplify dial timeout context ([libp2p/go-tcp-transport#94](https://github.com/libp2p/go-tcp-transport/pull/94)) +- github.com/libp2p/go-yamux/v2 (v2.2.0 -> v2.3.0): + - limit the number of concurrent incoming streams ([libp2p/go-yamux#66](https://github.com/libp2p/go-yamux/pull/66)) + - drastically reduce allocations in ring buffer implementation (#64) ([libp2p/go-yamux#64](https://github.com/libp2p/go-yamux/pull/64)) + - sync: update CI config files (#63) ([libp2p/go-yamux#63](https://github.com/libp2p/go-yamux/pull/63)) + - remove call to asyncNotify in Stream.Read +- github.com/libp2p/zeroconf/v2 (v2.0.0 -> v2.1.1): + - fix flaky TTL test ([libp2p/zeroconf#18](https://github.com/libp2p/zeroconf/pull/18)) + - implement a clean shutdown of the probe method ([libp2p/zeroconf#16](https://github.com/libp2p/zeroconf/pull/16)) + - remove dependency on the backoff library ([libp2p/zeroconf#17](https://github.com/libp2p/zeroconf/pull/17)) + - Don't stop browsing after ~15min ([libp2p/zeroconf#13](https://github.com/libp2p/zeroconf/pull/13)) + - fix delays when sending initial probe packets ([libp2p/zeroconf#14](https://github.com/libp2p/zeroconf/pull/14)) + - improve starting of mDNS service in tests, stop using pkg/errors ([libp2p/zeroconf#15](https://github.com/libp2p/zeroconf/pull/15)) + - update import path to include v2 in README ([libp2p/zeroconf#11](https://github.com/libp2p/zeroconf/pull/11)) +- github.com/lucas-clemente/quic-go (v0.23.0 -> v0.24.0): + - don't unlock the receive stream mutex for copying from STREAM frames ([lucas-clemente/quic-go#3290](https://github.com/lucas-clemente/quic-go/pull/3290)) + - List projects using quic-go ([lucas-clemente/quic-go#3266](https://github.com/lucas-clemente/quic-go/pull/3266)) + - disable Path MTU Discovery on Windows ([lucas-clemente/quic-go#3276](https://github.com/lucas-clemente/quic-go/pull/3276)) + - enter the regular run loop if no undecryptable packet was processed ([lucas-clemente/quic-go#3268](https://github.com/lucas-clemente/quic-go/pull/3268)) + - Allow use of custom port value in Alt-Svc header. ([lucas-clemente/quic-go#3272](https://github.com/lucas-clemente/quic-go/pull/3272)) + - disable the goconst linter ([lucas-clemente/quic-go#3286](https://github.com/lucas-clemente/quic-go/pull/3286)) + - use x/net/ipv{4,6} to construct oob info when writing packets (#3278) ([lucas-clemente/quic-go#3278](https://github.com/lucas-clemente/quic-go/pull/3278)) + - run gofmt to add the new go:build tags ([lucas-clemente/quic-go#3277](https://github.com/lucas-clemente/quic-go/pull/3277)) + - fix log string in client example ([lucas-clemente/quic-go#3264](https://github.com/lucas-clemente/quic-go/pull/3264)) +- github.com/multiformats/go-multiaddr (v0.4.0 -> v0.4.1): + - add the plaintextv2 protocol ([multiformats/go-multiaddr#165](https://github.com/multiformats/go-multiaddr/pull/165)) +- github.com/multiformats/go-multihash (v0.0.15 -> v0.1.0): + - bump version to v0.1.0 ([multiformats/go-multihash#151](https://github.com/multiformats/go-multihash/pull/151)) + - add version.json per tooling convention. + - murmur3 support (#150) ([multiformats/go-multihash#150](https://github.com/multiformats/go-multihash/pull/150)) + - Add variations of sha2 ([multiformats/go-multihash#149](https://github.com/multiformats/go-multihash/pull/149)) + - don't use pointers for Multihash.String + - Add blake3 hash and sharness tests ([multiformats/go-multihash#147](https://github.com/multiformats/go-multihash/pull/147)) + - remove Makefile ([multiformats/go-multihash#142](https://github.com/multiformats/go-multihash/pull/142)) + - fix staticcheck ([multiformats/go-multihash#141](https://github.com/multiformats/go-multihash/pull/141)) + - New SumStream function reads from io.Reader ([multiformats/go-multihash#138](https://github.com/multiformats/go-multihash/pull/138)) +- github.com/warpfork/go-testmark (v0.3.0 -> v0.9.0): + - testexec: will now always set up tmpdirs. + - testexec: fix typo in error message. + - testexec: subtest ("then-*") feature ([warpfork/go-testmark#7](https://github.com/warpfork/go-testmark/pull/7)) + - testexec: quote error from child; attribution better via more t.Helper. + - Improve documentation of format. + - Rename Hunk.BlockTag -> InfoString. + - testexec: will now create tmpdirs and files for you if you have an 'fs' entry tree. + - testexec: getting exit codes correctly. ([warpfork/go-testmark#6](https://github.com/warpfork/go-testmark/pull/6)) + - fix parsing CRLF files, part 3 ([warpfork/go-testmark#5](https://github.com/warpfork/go-testmark/pull/5)) + - fix parsing CRLF files, part 2 ([warpfork/go-testmark#4](https://github.com/warpfork/go-testmark/pull/4)) + - testexec: support both simple sequence and script mode. + - Proper tests for read function. + - avoid creeping extra linebreaks at the end of a patched document. + - refrain from making double linebreaks when patching with content that ends in a linebreak. + - Merge branch 'testexec' + - add support for parsing CRLF line endings ([warpfork/go-testmark#3](https://github.com/warpfork/go-testmark/pull/3)) + - link to patch example code + - More readme; and, parsing recommendations document. + - Further improve readme. + +### ❤️ Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| Will | 13 | +73226/-130481 | 43 | +| Masih H. Derkani | 99 | +10549/-5799 | 489 | +| hannahhoward | 43 | +5515/-3293 | 233 | +| Daniel Martí | 60 | +5312/-2883 | 208 | +| Marten Seemann | 175 | +4839/-3254 | 396 | +| Eric Myhre | 73 | +3924/-3328 | 175 | +| Jessica Schilling | 52 | +2709/-2386 | 75 | +| Rod Vagg | 30 | +2719/-1703 | 79 | +| vyzo | 10 | +3516/-177 | 87 | +| Gus Eggert | 64 | +1677/-1416 | 147 | +| Adin Schmahmann | 23 | +1708/-381 | 95 | +| Lucas Molas | 14 | +1557/-365 | 48 | +| Will Scott | 7 | +1846/-15 | 34 | +| Steven Allen | 32 | +537/-897 | 56 | +| Cory Schwartz | 3 | +614/-109 | 12 | +| rht | 3 | +576/-4 | 7 | +| Simon Zhu | 9 | +352/-51 | 16 | +| Petar Maymounkov | 7 | +173/-167 | 23 | +| RubenKelevra | 1 | +107/-188 | 1 | +| jwh | 2 | +212/-80 | 7 | +| longfeiW | 1 | +4/-249 | 10 | +| guseggert | 5 | +230/-21 | 11 | +| Kevin Neaton | 8 | +137/-80 | 13 | +| Takashi Matsuda | 1 | +199/-0 | 5 | +| Andrey Kostakov | 1 | +107/-49 | 2 | +| Jesse Bouwman | 1 | +151/-0 | 7 | +| web3-bot | 39 | +136/-3 | 52 | +| Marcin Rataj | 16 | +62/-57 | 25 | +| Marco Munizaga | 1 | +118/-0 | 2 | +| Aaron Riekenberg | 4 | +64/-52 | 6 | +| Ian Davis | 4 | +81/-32 | 7 | +| Jorropo | 2 | +79/-19 | 6 | +| Mohsin Zaidi | 1 | +89/-1 | 20 | +| Andey Robins | 1 | +70/-3 | 3 | +| gammazero | 3 | +40/-25 | 4 | +| Steve Loeppky | 2 | +26/-27 | 3 | +| Dimitris Apostolou | 1 | +25/-25 | 15 | +| Sudarshan Reddy | 1 | +9/-40 | 1 | +| Richard Littauer | 2 | +42/-1 | 3 | +| pymq | 1 | +32/-8 | 2 | +| Dirk McCormick | 2 | +23/-1 | 2 | +| Nicholas Bollweg | 1 | +21/-0 | 1 | +| anorth | 1 | +14/-6 | 2 | +| Jack Loughran | 1 | +16/-0 | 2 | +| whyrusleeping | 2 | +11/-2 | 2 | +| bt90 | 1 | +13/-0 | 1 | +| Yi Cao | 1 | +10/-0 | 1 | +| Max | 1 | +7/-3 | 1 | +| Juan Batiz-Benet | 2 | +8/-2 | 2 | +| Keenan Nemetz | 1 | +8/-0 | 1 | +| muXxer | 1 | +3/-3 | 1 | +| galargh | 2 | +3/-3 | 3 | +| Didrik Nordström | 1 | +2/-4 | 1 | +| Ben Lubar | 1 | +3/-3 | 1 | +| arjunraghurama | 1 | +5/-0 | 1 | +| Whyrusleeping | 1 | +3/-2 | 1 | +| TUSF | 1 | +3/-2 | 3 | +| mathew-cf | 1 | +3/-1 | 2 | +| Stephen Whitmore | 1 | +2/-2 | 1 | +| Song Zhu | 1 | +2/-2 | 1 | +| Michael Muré | 1 | +4/-0 | 1 | +| Alex Good | 1 | +4/-0 | 2 | +| aarshkshah1992 | 1 | +2/-1 | 1 | +| susarlanikhilesh | 1 | +1/-1 | 1 | +| falstack | 1 | +1/-1 | 1 | +| Michael Vorburger ⛑️ | 1 | +1/-1 | 1 | +| Ismail Khoffi | 1 | +1/-1 | 1 | +| George Xie | 1 | +1/-1 | 1 | +| Bryan Stenson | 1 | +1/-1 | 1 | +| Lars Gierth | 1 | +1/-0 | 1 | + ## v0.10.0 2021-09-30 We're happy to announce go-ipfs 0.10.0. This release brings some big changes to the IPLD internals of go-ipfs that make working with non-UnixFS DAGs easier than ever. There are also a variety of new commands and configuration options available. diff --git a/Dockerfile b/Dockerfile index 9322e891b..1d86efc87 100644 --- a/Dockerfile +++ b/Dockerfile @@ -106,5 +106,10 @@ ENV IPFS_LOGGING "" # 2. The API and Gateway are accessible from outside the container. ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/start_ipfs"] +# Heathcheck for the container +# QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn is the CID of empty folder +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD ipfs dag stat /ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn || exit 1 + # Execute the daemon subcommand by default -CMD ["daemon", "--migrate=true"] +CMD ["daemon", "--migrate=true", "--agent-version-suffix=docker"] diff --git a/README.md b/README.md index 753a911a0..cc609152b 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ For more info see: https://docs.ipfs.io/introduction/overview/ Before opening an issue, consider using one of the following locations to ensure you are opening your thread in the right place: - go-ipfs _implementation_ bugs in [this repo](https://github.com/ipfs/go-ipfs/issues). - - Documentation issues in [ipfs/docs issues](https://github.com/ipfs/docs/issues). + - Documentation issues in [ipfs/docs issues](https://github.com/ipfs/ipfs-docs/issues). - IPFS _design_ in [ipfs/specs issues](https://github.com/ipfs/specs/issues). - Exploration of new ideas in [ipfs/notes issues](https://github.com/ipfs/notes/issues). - Ask questions and meet the rest of the community at the [IPFS Forum](https://discuss.ipfs.io). @@ -50,6 +50,7 @@ Before opening an issue, consider using one of the following locations to ensure - [macOS package managers](#macos-package-managers) - [MacPorts](#MacPorts) - [Nix](#nix-macos) + - [Homebrew](#Homebrew) - [Windows package managers](#windows-package-managers) - [Chocolatey](#chocolatey) - [Scoop](#scoop) @@ -169,6 +170,7 @@ $ sudo snap install ipfs - [MacPorts](#macports) - [Nix](#nix-macos) +- [Homebrew](#Homebrew) #### MacPorts @@ -188,6 +190,14 @@ $ nix-env -i ipfs You can also install the Package by using its attribute name, which is also `ipfs`. +#### Homebrew + +A Homebrew formula [ipfs](https://formulae.brew.sh/formula/ipfs) is maintained too. + +``` +$ brew install --formula ipfs +``` + ### Windows package managers - [Chocolatey](#chocolatey) diff --git a/Rules.mk b/Rules.mk index 5af58d866..3d6f621cc 100644 --- a/Rules.mk +++ b/Rules.mk @@ -22,7 +22,7 @@ include mk/golang.mk ifeq ($(TEST_NO_FUSE),1) GOTAGS += nofuse endif -export IPFS_REUSEPORT=false +export LIBP2P_TCP_REUSEPORT=false # -------------------- # # sub-files # diff --git a/assets/README.md b/assets/README.md index df8fca5eb..3bfea9b8f 100644 --- a/assets/README.md +++ b/assets/README.md @@ -3,7 +3,7 @@ This directory contains the go-ipfs assets: * Getting started documentation (`init-doc`). -* Directory listing HTML template (`dir-index-html` git submodule). +* Directory listing HTML template (`dir-index-html`). These assets are compiled into `bindata.go` with `go generate`. @@ -16,37 +16,4 @@ assets directory: ``` go generate . -``` - -## Updating dir-index-html - -Upstream: https://github.com/ipfs/dir-index-html - -dir-index-html is a git submodule. To update, run the following commands from -this directory. - -```bash -> git -C dir-index-html pull -> git -C dir-index-html checkout vX.Y.Z # target version -``` - -Then, you'll need to commit the updated submodule _before_ regenerating -`bindata.go`. Otherwise, `go generate` will checkout the checked-in version of -dir-index-html. - -```bash -> git add dir-index-html -> git commit -m 'chore: update dir-index-html to vX.Y.Z' -``` - -Finally, re-generate the directory index HTML template, tidy, and amend the previous -commit. - -```bash -> go generate . -> git add bindata.go -> git add bindata_version_hash.go -> go mod tidy -> git commit --amend --no-edit - -``` +``` \ No newline at end of file diff --git a/assets/assets.go b/assets/assets.go index e8893c635..d8bf49a00 100644 --- a/assets/assets.go +++ b/assets/assets.go @@ -1,4 +1,4 @@ -//go:generate git submodule update --init ./dir-index-html +//go:generate npm run build --prefix ./dir-index-html/ //go:generate go run github.com/go-bindata/go-bindata/v3/go-bindata -mode=0644 -modtime=1403768328 -pkg=assets init-doc dir-index-html/dir-index.html dir-index-html/knownIcons.txt //go:generate gofmt -s -w bindata.go //go:generate sh -c "sed -i \"s/.*BindataVersionHash.*/BindataVersionHash=\\\"$(git hash-object bindata.go)\\\"/\" bindata_version_hash.go" diff --git a/assets/assets_test.go b/assets/assets_test.go index 2122afc00..8300af884 100644 --- a/assets/assets_test.go +++ b/assets/assets_test.go @@ -45,7 +45,7 @@ func testOneFile(f string, t *testing.T) { } if !bytes.Equal(vcsData, embdData) { - t.Errorf("asset %s: vcs and embedded data isnt equal", f) + t.Errorf("asset %s: vcs and embedded data isn't equal", f) return } diff --git a/assets/bindata.go b/assets/bindata.go index e80a04d5c..512eb789c 100644 --- a/assets/bindata.go +++ b/assets/bindata.go @@ -226,7 +226,7 @@ func initDocSecurityNotes() (*asset, error) { return a, nil } -var _dirIndexHtmlDirIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\xbc\xc7\x0e\xc4\x5a\x92\xa6\xb7\xef\xa7\x28\x01\x5a\x48\x43\xcd\x90\x49\xcf\x9e\x9e\x01\xe8\xbd\xf7\xdc\x08\xf4\xde\x7b\x36\xfa\xdd\x85\xaa\xee\xe9\x2a\x40\xcb\xb9\x8b\xbb\x4a\x9e\x4c\xe4\x2e\xe2\x8b\xff\x8f\x08\x9e\x7f\xf9\x3f\x38\x93\xf5\x62\x8b\xff\x4b\x73\x8c\xc3\xff\xfc\xa7\x7f\xfd\xd7\xbf\xfc\x9f\xdb\x3c\x1f\x7f\xf9\xe7\xff\xf1\x97\xff\xf6\x97\x7f\xfb\xb7\x7f\xfa\x97\x7f\xff\xfe\x5f\x9a\x32\x2d\xfe\xe7\x3f\xfd\xcb\x7e\xbc\x43\xf9\x3f\xff\x09\xfc\x2f\x7f\x71\xe7\x73\xcb\xcb\xbf\xfc\xd7\xbf\x54\xed\x50\xb6\xf9\x3c\xed\xff\x6d\xde\xea\xbf\xfc\x17\xf0\xbf\xb5\x4b\xb5\xff\xd7\xff\x37\x1b\xd2\xa9\xff\xcb\xbf\x66\x69\xde\xd7\xdb\x7c\x4e\xc5\x7f\x6d\xc7\xb4\x2e\xff\xf9\xdc\x86\xff\xab\x48\x8f\xf4\x9f\xff\x76\x04\x97\xa9\xfe\xef\x59\xba\x97\x38\xfa\xff\xb4\x01\x63\x3a\x37\xa4\x8a\xf5\x4c\xd3\x34\x6d\xb8\x7e\xc3\xfb\x35\x4d\xd3\xcc\x5f\x8f\xb4\xcd\xd2\xf1\x5f\x3f\x2b\x12\xa4\x9a\xbf\x3e\x88\x91\x23\x84\x92\xe3\x65\x70\x02\x15\xb0\xf0\x26\x36\xc3\x24\x22\xd5\x26\x2e\xa3\x64\xa1\x30\x25\x81\x32\xc4\xa1\x83\xe5\xf9\x30\x58\x7f\xfd\x43\xc8\x28\x0e\x2f\xf8\xa5\xb1\xf2\x7e\xf7\xd3\x1e\x9e\xb6\xa7\xe2\xa7\x07\x34\x3a\xbc\x32\x1f\x3e\xb8\x2f\xab\xbc\xe8\xf3\x8f\xb8\x67\x2c\x72\x68\xd5\xad\x80\x8d\x07\xd6\x44\x30\xb0\xd3\x99\xad\x4f\xc4\xdc\x35\x68\xa3\x8d\x6d\x81\x5a\xa3\x6a\xd8\x94\x9c\xcc\x7e\x9d\x62\x15\x62\xba\xf8\x9e\x9f\x4e\x74\x5f\x71\x05\xa7\x83\x71\x75\x3c\x25\x40\x45\x51\x69\x4b\x04\x07\x76\x50\x2a\x75\x4e\x27\x2a\x69\x77\x29\x23\x6b\x18\x3f\x32\x6e\x71\xf3\x5e\xbc\x50\xd5\xe4\xd3\xf1\x98\x28\xca\xe6\x26\xf3\x59\x34\x31\x56\xfc\x7b\x4a\x77\x45\x4c\x87\xdd\xa3\x5d\x3e\xbd\xb7\xf9\xc8\x43\xf5\x98\xac\x11\xa7\x5a\x50\x67\x78\x1e\x65\xbd\x57\x34\x4a\xb4\xc2\xae\x3c\x18\x3a\x0b\x3d\xf2\xda\x48\xf9\xc7\x65\x2d\x69\x06\xdf\xa2\xb9\x7e\x0a\x85\x65\xe6\x54\x63\x5b\x6b\xd2\xda\xfd\xf8\xdc\x4a\xa6\xbb\x22\xea\x8c\x93\xb7\x38\x70\x5e\xbe\x9d\xce\xad\xc3\x3b\x8f\x91\x5e\x99\x58\xd6\x60\x13\xec\x95\xcf\x0e\xdc\xe3\xc7\x84\xba\x7e\x86\x43\x2b\x06\xfb\x7b\xbc\xf8\x91\xed\x06\xd4\x47\xc7\x1f\x46\xc1\xe6\x91\x35\x34\xc3\xdf\xb4\x32\xb0\x17\xf6\x3f\x10\x39\x6a\x25\x80\xee\x34\xb8\x7a\x41\xe6\xcb\x24\x93\x56\x94\x1f\x5e\xf5\xa3\x47\x3e\x32\x1f\xbc\x9e\xf8\x40\x39\x43\xe6\x1b\x7b\x47\x61\x1c\x2b\x16\x13\x86\xdb\x83\xd4\x1c\x16\xb7\x0e\x14\x1e\x7e\x83\x94\x2e\x41\xa8\x7f\x40\x24\xfd\x18\xc7\x84\x82\x3d\xd3\x85\x84\x47\x58\xce\x4d\xd4\xbb\x4c\xaa\x58\x0e\x6a\x80\x4b\xf0\x8b\x68\x28\x91\x0b\xcc\x3b\xb1\x6e\xd0\x9a\x1f\xf5\x04\x2b\xba\xbe\x69\x2d\xe3\xe8\xa8\x22\xb8\xc2\xee\xff\x16\x28\xae\x1f\x98\x8e\x8a\xb1\xb1\x2c\xff\x8f\xff\xfb\xbf\xff\x43\x00\x6e\xe5\x52\xa6\xc7\x3f\x4f\xf3\x7f\x3c\xfd\xe3\x6f\x7b\xfb\x95\xff\x9c\xcf\xd3\x91\xb6\xd3\xbf\xfd\x47\x08\x2f\x69\x5d\xfe\xb9\x22\x78\x6c\xfe\x23\x82\x97\xdd\xff\x8e\x0b\xfa\xd1\xb1\x55\x15\x8d\xf9\x82\x91\x97\x90\x50\x10\xfc\x82\x99\x5d\x07\x1a\xfe\xec\xd5\xaf\x6f\x9d\xe7\xb7\x90\xa1\xb5\x0b\x15\x15\xae\xe2\xb9\xd1\xe4\xa5\x5d\xf0\xd6\x80\xf5\xf8\x87\x6e\x5b\x57\x86\x6d\x5e\x55\x54\xde\x0d\x04\x81\x09\x67\x08\xf5\x78\xd7\xf9\xaa\x17\xce\x09\x2d\x06\x7b\xed\xa8\xe0\x82\x04\x30\x0c\xfb\x2e\x9d\x32\x52\xf9\x37\x6f\x29\xb6\x5f\xd9\x4b\x99\x53\xe6\xf3\xcc\x53\x73\x83\xac\xb6\x61\x17\xd9\xa5\xf6\xfe\x28\x30\xfa\x11\x3b\x7f\xe4\x56\x0c\x6f\x87\xe4\x52\x38\x28\x9d\x90\x73\x45\x91\xf6\x01\xb9\xff\xe9\x24\xf1\xb9\xcd\x2e\xc3\x14\xb7\x48\x6c\x7c\xa0\x3c\xce\xcc\x0f\x2a\x27\x9f\x37\x65\xdc\x43\x04\x04\x2a\x76\x8d\xe9\x56\x77\xcd\x43\x12\x8c\x23\xa4\x4a\x35\x10\x49\x23\xad\x24\x06\x59\xe7\xdd\x44\x8d\xc7\x23\xfd\xde\x20\x53\x97\xb9\x64\x88\xa2\xd2\x5d\x95\xdd\xc8\xd5\x58\xc9\x02\x47\x47\xca\xd2\x9d\x67\xdd\x12\x45\x27\x0b\x81\x8c\x5a\xd0\x32\xe4\x47\xad\xd8\xd0\x33\x09\x25\x56\x9a\x26\x04\x9b\x37\xbf\xc0\x41\xdf\xb8\xec\xc4\x92\xa1\xc9\x16\x6b\x7d\x4f\x9f\xf0\xa0\xa0\xfc\x2e\xcb\xed\x04\x06\x10\xc5\xd1\x5e\xe6\x6b\x42\xff\x16\x06\x25\xcb\x9e\x9e\x6e\x0a\x44\xc5\xe4\x41\x34\x08\x35\x40\x71\xf6\x6e\xbe\x8b\xd0\xdc\x90\xb0\x6b\xb0\xaa\xee\xa0\xe5\x78\x21\xf3\x70\xb3\xcf\xe3\xd9\x58\x4c\x9f\x0b\x24\xd8\xa3\xc0\xd3\x05\x77\x3d\x52\x1e\xa8\x07\xaa\x68\x52\xff\xe1\xe1\x23\x4a\x5a\x81\x98\xe2\xb6\x4d\x0f\x05\xb9\xb0\x9d\x74\xc0\xdf\x6b\xb2\x86\x66\x9e\x77\xd7\xf3\x5a\xeb\x65\x23\x4b\x15\x8a\xb4\xc8\xa9\x48\xbb\x3b\xd7\xcf\x82\x2d\x2a\xf6\x2d\x85\x7a\x2e\x85\x4a\x6c\x8e\x7e\xf7\x33\xbb\xcb\x9e\x8f\xf3\x3d\x0e\x6c\x92\x74\x8d\x17\x7b\xf6\x7d\x70\xdb\x47\x48\xb4\xbb\x7b\x9f\x2e\xe0\xfd\x51\x32\x17\xb4\xdd\x26\x39\x6a\x90\xdc\xa4\xef\xb3\xcd\xcf\x4d\x85\xe6\xb1\x37\x1a\x8f\x6b\x5b\xb7\xa5\xb9\x63\xfd\xa1\x9e\x58\x9a\xbe\x54\x81\x99\xa3\x28\x95\x2a\x7a\x73\xd9\x84\xe3\xa1\xfa\x0d\x95\x5a\x90\xd5\xf1\xf2\x05\xd5\x44\x75\xdf\x90\x7b\x38\x45\x81\xc6\xe4\x0e\xce\x0f\x4e\x05\x54\x08\x04\xa6\x55\x17\x4f\x0e\x79\x2c\xbc\x97\xb6\x6d\x06\xc9\x12\x83\x1c\xa8\x83\xc0\x64\xa1\x81\x14\xdd\x2f\x02\x75\x9f\x9b\xdd\xb7\x56\xa7\x9e\xfa\x14\x3a\xe2\xba\xae\xe3\x85\x95\x7a\x55\xf4\x76\x49\xc6\x0c\x53\x9f\x3b\x06\x6d\x3d\x99\x65\xcb\xe5\x8a\x30\x84\x96\xf9\xca\x3e\xd2\x5f\xeb\xb3\xe3\xec\xb5\xcc\x58\xf0\x5b\x0b\x3b\x75\x51\xa8\x42\x73\x2a\xf3\x9a\x81\x69\x05\xbe\x37\x58\x20\x9f\x67\xe8\xb8\xdf\xa7\x66\xd5\xee\x38\x9c\xfa\x75\x51\xd0\xd9\xf4\x01\x5b\x74\x5a\x31\x10\x4c\x5f\x77\x50\x20\xfb\xd1\x74\x36\x6a\x1d\xbb\x55\x4c\xeb\xd4\x7f\x28\x21\xd2\x34\xff\x73\xf1\x61\xfa\x4f\x3e\x40\x7e\xff\xb3\x78\x88\x8f\xab\x63\x3b\x83\xe1\xa2\xfd\xbe\x09\x78\x6b\x66\xf2\x9d\x9f\x35\x47\x61\x62\xe8\xa7\x5b\x52\xc7\xee\x48\x7e\xcd\x75\xee\x81\xe8\xaa\x28\x06\x66\x5c\x52\x33\xcf\x4d\x6e\x4e\xd6\x8d\xc6\xbc\x28\xf7\x6c\x03\xcc\x9a\xc8\xa8\x23\x92\x10\x53\x82\x14\x63\x09\x5f\x9d\xd9\x78\x79\xd7\x2a\xca\x95\x7c\xd6\x65\xea\x24\x28\x89\xf0\x8a\xc0\x18\xb7\x21\xbd\xb6\x10\xf1\xaf\xcd\x16\xf9\xe9\x76\x54\x6d\x6c\x26\xa9\xae\x00\xdf\x09\x15\x0b\x32\x28\xeb\xca\xb9\xc2\x92\x21\x17\xdf\xdd\xfa\xa5\xd8\x6f\x6c\x2b\x93\x7b\xb3\xeb\xe3\xc9\xf1\x63\xb3\x8d\x9e\x3d\x4e\xf6\x1a\x7d\x16\xa3\xa4\x4d\xd0\xd8\x6d\xcf\xad\x02\x92\x5f\x54\x9e\xec\xaa\x10\x66\x07\xec\x2a\xd2\xd9\xb9\x41\x8f\x35\xf9\xf4\xa2\x4d\xfc\xc6\xb8\xec\x72\x9a\x41\xa9\x6b\x19\xcb\xf3\x53\xf2\x7c\x80\x80\xc2\xef\x70\x55\xa6\xaf\x4a\x62\xad\x1a\x31\x80\x93\xbe\xd0\xab\xa6\x18\xf3\xc9\xd9\xb1\xe2\xbf\xd3\x02\xeb\x72\x5a\xc6\x72\x6d\x78\xbd\x3e\x8b\xf2\x07\x29\xf7\x08\x70\xa7\x2f\xbf\x7e\xe1\x0d\xeb\x09\x67\xef\xac\x57\x11\x58\x38\xe5\x36\x32\x25\xff\x48\xbb\xd7\x86\x46\x8b\x00\x83\xbe\x7c\xce\xcd\xf5\x2d\xf9\x3d\xac\x4c\x7b\xe3\x97\x95\x57\x35\xb2\xc3\xd9\xb7\x16\x66\x08\x8d\x52\xdf\x7d\x57\x3a\x5e\xa9\xb9\x4d\x61\xce\x81\xb2\x4e\x74\x7d\xf7\x35\x4b\x27\x38\xe0\x17\x1a\x4b\x1d\x77\x67\x27\xe4\x52\x7c\xed\x2c\xf4\x09\x23\xc5\xc8\x8a\x33\xc8\x80\x16\x0a\xcf\xf3\x96\xc9\x96\x1c\x9a\xc7\x81\x44\x44\x7b\xf5\xc3\x04\x40\x90\x47\x96\x20\x30\xd9\xa0\x15\x46\x71\xfb\x60\x0e\x67\xc8\x8e\xa9\x78\xad\x5b\x07\x4d\x92\xcf\x49\x45\xa6\x2f\x6e\x15\xc9\x84\x47\xd4\x9c\xc4\xaf\x18\xc4\x19\xe1\x07\x7d\x28\x56\x3c\x76\xff\x91\x28\x3b\xee\x55\x99\xe5\x84\x53\x7b\x54\x7a\xfe\xc4\xe4\x2e\xbc\x95\x71\x76\x58\xc8\xb4\x21\xca\x5a\xab\xe0\x59\x9d\x95\xd2\xa2\x03\xe9\x94\x8b\x12\x43\x58\xcb\x82\x95\xaf\xc9\xc9\x5d\xd4\x5f\x9c\x99\x00\x1a\x16\xfb\xfc\xf1\x26\xcd\xa5\xa4\x6e\x5f\x68\xa7\x6b\x19\x13\xc2\x50\x0f\xd8\xf1\x46\x06\x6d\xd4\x64\xc6\x27\x72\xb5\x50\x73\xfd\x49\x4c\xaf\x0e\x41\x4c\xdb\xcc\xe6\x0f\x5f\xcb\x40\x91\xed\xb6\x15\x1a\x8f\x76\xd3\xef\xb5\x21\x2b\x3d\xd5\xa6\x5a\x63\xa5\x01\x95\x81\xfe\x08\x9c\x8a\xcb\x16\xdf\xcb\x65\x62\x62\x3b\x6e\x7f\x75\x33\x30\xa1\x8a\xf1\x9c\x99\xe8\xbb\x3b\xdb\x01\x09\xbb\x98\x5c\xdc\xf5\xa2\x4e\x1b\x1c\xdc\x13\xe5\xe3\xef\x55\xd3\xb3\x05\x00\x53\x6f\x7d\x32\x24\x19\x0e\x84\x10\x82\x33\x7e\x78\x04\x58\xe7\xd1\x4a\xd7\xe2\x45\x34\xcd\xf3\xd3\x42\xa6\xdd\x4a\x29\x98\x08\x2a\xb6\x70\xb6\xb1\x91\xa9\xcb\xc0\x52\x18\xaa\x70\x15\x57\x0f\x91\x90\x64\x10\xe5\x46\x94\xe1\x16\xf6\x4d\xd0\x07\xef\xfe\xa6\xe9\x71\x4e\x87\xfc\x19\x0c\xfa\xf7\xb7\xec\xe4\x07\xc1\xeb\xdd\xd3\x1e\x59\xf6\x7f\x8b\x19\xed\x9f\x0b\x19\x3d\xf6\x77\x49\x01\xfd\x2e\x7e\xe0\x7d\xcb\xb3\xbe\x64\x65\x68\x3b\x75\x05\xbb\x55\x62\x7f\x1c\xd4\xb8\x99\x3d\x01\xfd\x69\x88\x97\x9d\xa0\x0d\x02\xf4\xb5\x47\x08\xb3\x80\xb5\xb5\x9f\xa1\xb6\xad\xef\x6a\x13\x9e\xff\xe8\x07\x7d\x09\xbf\x23\x16\xe7\xe8\x36\x6e\xe2\xbe\x88\xef\x8e\xeb\x43\x8d\x10\xed\x46\x08\x0a\x23\xb0\x05\xfb\x08\xc2\x84\x7e\x73\x13\x02\x20\x17\x34\xe4\xd7\x11\x69\xac\x36\xd5\x20\x16\x22\x95\xec\xe2\xad\x19\x6f\x51\x55\x75\x50\x6d\x3f\x2a\x96\xae\x9d\x4f\x81\xe4\x04\xa7\x67\x2a\xe6\x0c\x73\x0f\x5b\x05\x8a\xf7\xbb\x92\xef\xbd\xc1\x5a\x1d\x46\xbd\x23\xe4\xb7\x16\x74\xe0\xb9\x8c\x3c\x9d\x16\x14\x3c\xb0\x82\x9e\xc7\x48\x62\x5e\xd8\xf7\x19\xd3\x84\x75\x7a\x00\x19\x0a\xcc\xad\x0c\xb7\x7c\xed\x9c\xa5\x07\x0a\x75\xa8\x44\xc4\x6b\xf1\xcd\x87\x43\xee\x84\x56\xc2\xf3\x48\xd6\xd8\x8f\xc7\x75\x71\x6b\xcc\xd4\x6b\x09\x89\x6d\x33\xd3\x30\x2a\x84\xc0\x73\x18\x96\xed\x75\x10\xa9\xac\x7b\x95\x5f\xdb\x90\x71\xc5\x00\x75\x90\xcb\x26\x76\xb9\x71\x73\x2f\x11\xbc\x45\x7a\x10\x1a\xfe\x61\x0c\xb6\x0f\x67\x10\x83\x61\xa8\xd7\x04\x40\x7b\x0c\x38\xe4\xda\xae\x2e\xde\x3c\x49\x1f\x07\x98\xba\xc0\x9f\xde\x47\xb6\x7d\x7f\x50\xea\x7d\x50\xb1\x92\x30\x08\x99\x2f\x4c\x31\xdb\x74\xa2\x14\xda\xc5\x8a\xcc\x5b\xcd\x16\x83\x47\x45\x4f\x41\x4b\xfc\xe2\x51\x8d\xe4\x20\x97\x86\x37\xbd\xd5\x10\xc5\xa5\x22\x36\xb0\xbb\x2f\x18\xd0\x92\xf7\x09\x3d\x77\x05\x4b\x8e\x68\x7a\x32\x6b\x4a\x6b\xa7\x5b\x97\x1f\x11\x30\x3f\xe7\xe0\x5c\x3f\x34\xed\xcb\x4f\x19\x4d\xf0\x3f\x85\xd1\x15\x98\xbb\x47\xab\x2e\x7e\xca\x3d\x42\xe1\xec\xd6\x4a\xd5\x71\xd7\xe6\xa9\xcf\x71\xd3\xf2\xcb\xf7\xb4\x69\x63\x8d\x0f\x82\x49\x51\x63\xe7\x7c\x73\x83\x6f\xe8\xd3\x9d\x68\x21\xb4\xbb\xa7\x7f\xd2\x6c\xdc\xdc\xb6\x73\x0b\x97\xf2\x9c\x0b\xdb\xf1\xb1\xef\xe7\xb9\xd9\xcf\xa9\x3a\x16\xe6\x90\x4c\xf1\xcf\xeb\x6b\x3a\x8f\xe8\xe6\x69\xcc\x5b\xdb\xb9\x5d\x9a\x0d\xe4\x44\x4d\x4c\xf1\xb8\x2a\x60\x25\x5c\xa6\xa6\xaa\x93\x0b\xa4\x96\x6b\xd7\xa7\x3d\x41\xe9\xc1\x26\x28\x2f\xf1\x30\xf5\xdb\x85\xa2\xdb\x46\xe8\x8f\x01\x85\x6d\x50\x6b\xd2\x86\x09\x19\xee\xd2\x2b\x98\x93\x4d\xa8\x6f\x0e\x5d\x83\x76\xa1\xf9\x57\x1f\xa6\x54\xa0\xb7\x2f\xed\x40\x0e\xe2\x5a\x3d\x1a\x14\x5a\xb0\x5f\x15\xde\xc8\x6a\xd2\x75\x27\x59\xd0\xc1\xfe\xe9\xa9\xab\x61\x87\x0f\xfe\xfa\x95\xee\x75\xb6\x81\x8f\x58\x06\x08\xa0\x6f\x08\x28\xef\xac\x6c\x43\x33\x3e\xc1\x7e\x5d\xb2\x91\x9e\x32\x31\x94\xa5\x44\xcb\x87\x04\x28\xcd\xd0\x96\x69\x07\xca\x04\xdb\x38\x24\xfe\xb1\xa9\x5f\x55\x7f\xae\xe4\x9f\xff\x53\x2f\xf4\x3e\x75\xac\xfc\x8f\xf7\xa3\x64\x4c\x16\x1e\x49\x3d\x46\xcb\x14\xc1\xf2\x0e\xc1\x77\x0e\x97\x3d\x9a\x8d\xf0\xd9\x57\x55\x05\x05\xa4\xe8\x09\x99\x6b\x9c\xae\xc1\x39\xaa\x66\xbf\x23\xe6\x9a\x4a\x77\x96\x89\x55\x0f\xf7\x65\x4b\x4a\xc3\x63\x59\x09\xc3\x87\xd3\x44\xc5\x3e\xec\x4e\xa8\xe7\xd1\x17\xfd\x4e\xb8\xb3\xbc\x3f\x6a\xd9\x36\x04\x4e\x5a\x13\x24\x58\x23\xe5\x1e\xc4\xd4\x0e\xbc\x32\x3b\x66\x15\x6b\x30\x55\x1d\x56\x96\xa7\x85\x04\xd4\xaf\x52\x25\xa2\x3a\x8b\x29\x10\x30\x72\xe2\x7f\x78\x39\x00\xe0\xeb\xc3\x23\x23\xb8\x61\xa2\x2e\xa1\xa2\x06\x39\x64\xd6\x3e\x33\x43\xb0\x8a\x1a\xdc\xe8\xe3\x33\x81\xe9\x0f\x10\x16\x27\x25\xfb\x91\x50\xb6\x26\x0d\x2e\xd3\xef\x91\xca\x38\x3d\xeb\x80\x2b\xbe\x25\x5b\xa8\xdf\x2a\x0e\xb4\x2a\x7a\x0f\x59\xb0\x3f\x0a\x0c\x97\xa7\xe9\xa6\xfd\xe9\x40\xc7\xb9\x7b\x12\x6b\x44\x85\xa5\x8a\x9f\x89\x57\x53\x19\xd2\xe7\xfc\x1d\x5c\xec\xba\x5a\x49\x99\x1e\xee\x9e\x11\x03\xe7\xf9\x43\x20\x09\x75\x9e\xfd\xcd\xdd\xd5\xb0\xff\x6a\xe8\x49\xe4\x18\xa4\x0b\x50\x9c\xde\x03\x8c\x82\x2a\x7b\xe3\xcd\xe5\x1c\x9e\xb4\xf8\x47\x62\x70\x90\x64\x70\xfb\x4c\x1f\xf9\x76\x18\x41\x3f\xa0\x56\xa6\x5b\xfd\x01\x34\xf6\xdd\xc9\xae\x12\x15\xde\x6f\x7b\x38\x5c\x12\x93\x83\x5d\xbb\xa2\x66\xee\x08\x56\xfb\x9e\x17\x96\x6e\x63\x1c\x17\x5c\x70\x1e\x91\x8c\xc0\xd8\xc0\x85\xf5\xc1\x27\x68\x05\x0e\x5b\x85\x61\x93\x2e\x81\x0b\xe5\x74\x7a\x4e\x49\x84\x5b\xa0\x1d\xc2\x67\x99\x2e\x45\x2a\xa3\x7a\x62\x38\xe6\x67\xf6\x70\xd8\x8e\x2a\x47\xc4\x5b\x8a\x1d\x17\x16\x65\x2f\x45\x96\x79\x5c\x48\xac\x63\x91\xf9\xd6\x1b\x87\x17\x12\xad\xa7\x78\xa2\x65\x98\x75\x33\x37\xb3\x1a\x7e\x11\xe8\x94\x87\x3f\x93\x4b\x7d\x7a\x08\xc3\x9b\x9b\x5d\x8c\x6b\x4a\x71\xcd\xc2\x25\xe0\x41\x88\x1d\x57\x36\xa6\xd6\x9e\x7f\x65\x83\xc9\xcb\x0c\x3e\x69\xce\x31\x6c\x32\x73\x43\x3a\x08\x3e\x59\x50\xe7\x91\xb5\xdb\x11\x80\x86\xd3\x45\x5f\x35\x1e\x76\x69\x70\xde\x64\x26\xf8\xdd\xe5\x59\x18\x51\xb1\x8b\xde\xa3\x06\x94\x28\xf8\x4b\xfa\xd3\xb9\x9e\x92\x71\xb1\x89\x7f\xe0\x77\x81\xd5\xb5\x79\xac\x39\xc0\xbc\xd8\x05\x49\xf6\x28\xe8\xe5\x1d\x74\x6a\x4f\x6c\x55\x75\xed\xef\x2d\x1d\x6f\x2f\x9d\x00\xb6\x67\xfa\x93\xe3\x98\xec\xc6\x12\xe3\x0c\xaa\x92\xa1\xc2\x9e\x7d\xb9\xa3\x0d\xf1\x2d\x2c\x2a\xd0\x09\x2b\xb9\xa9\x05\xa4\x5b\x66\x31\xe2\xad\xc8\x6e\xf0\x80\x5e\x4f\x59\x9d\xa3\xf0\x29\x7f\xab\x14\xd6\xd7\x17\x57\x91\xeb\x2c\xfc\xf6\xb8\xc4\x7e\x4c\x1e\xb4\xd2\xa7\x49\xe5\xca\x3a\x6b\x93\xfc\xe2\xe8\x77\x08\xb7\x51\x25\xcc\xe3\x52\x26\x62\x84\x3d\x9d\x4b\xab\x83\x43\x78\x0f\x4e\x20\x92\xcf\x2a\x3d\x07\x60\x4c\x5c\x36\x68\xc6\x6c\x52\x5e\xc3\x36\x5e\x48\x0e\x89\xbb\xd0\x40\xf8\x89\x80\x15\xaa\xea\x34\x73\xb9\x61\xc5\x49\x63\xa6\xc2\x7f\xb3\x1e\x8c\xe2\xf8\x18\xbf\xf5\x4a\x5d\xd7\xff\xe3\x7f\xcf\x7b\x5c\x7f\x32\x21\x31\xfe\xfe\x2e\x24\xc8\xe3\x84\x20\xda\xb7\xa2\x24\x37\xa0\xe9\xf3\x96\x15\x56\x6d\x64\xa1\xef\x5e\xa6\xa7\x50\x5a\xd9\xb9\x2c\x1f\x26\x03\x68\x1b\xa0\x99\x84\xa4\xe1\x1d\xa0\xe5\xbe\x18\x61\x1c\xb7\x7d\x45\x16\x42\x95\xe9\xa5\xfa\xa7\x2e\x8e\xd4\x62\xf3\xa8\x88\x7d\xa6\x20\x99\x28\x75\x00\xaa\xff\x78\x7b\xf3\x2e\xf7\x15\x2d\xeb\x2c\xcb\x32\x07\x80\x1f\x5f\xdb\xcc\x23\x2d\x00\x48\x8d\xd9\x7b\x6e\xad\x93\x14\x4f\xa7\xa4\xad\xca\x70\x48\x08\x9c\x3f\x60\xa1\x52\x12\xc3\xc7\xf4\x01\x6a\xce\x24\xcb\xcc\x03\x42\x0f\x86\xf8\xaf\xa5\x8c\xa4\x05\xf3\x6d\x4d\x8b\x6b\x82\x75\x9b\xa1\xc5\x6a\x61\xcd\x65\x35\xb6\x13\xa6\x10\xe2\x7a\x2c\x79\x89\x71\x73\xea\xf2\xfc\x41\xbc\x3b\xef\x29\x9d\x69\x5d\x1f\x9a\xf2\x4a\x6a\xb7\x48\x18\x93\x08\xd1\x0b\xea\x5e\x59\xff\x6e\xf9\xc0\x00\xbf\xd4\xae\xa4\x03\xba\xaa\x8c\x29\xb1\xd3\x7e\x4f\x2b\xa8\x97\x01\x4b\xa6\xdf\xef\xcd\x34\x14\x6c\xc1\xa1\x97\x59\xf3\xc6\xa6\xd6\x76\x44\xdb\x6d\xe6\x76\x95\x71\x66\x46\x91\x10\x3e\x33\x72\x42\x1a\xe7\xd0\x12\x8f\xa8\xbd\x77\xea\xf1\xba\x67\x23\xaa\xa6\xcd\x67\xa1\xa7\xa7\x91\x12\xee\x66\x7f\x60\x2a\xff\xf8\xa0\x55\xe6\xe1\x04\xed\x46\x75\x74\x29\xf9\xf9\x11\x24\x6e\x3f\xdf\x95\xf9\x09\x13\xac\x50\x7a\x01\xf0\xf6\xe6\xbe\xdf\x6c\x73\x85\x2f\x26\x95\x12\xc6\x40\x9b\x31\xa6\x94\xbb\xda\x50\x7a\x02\x8f\xb2\xe5\x19\x14\x4b\x12\xee\xe6\x5a\xbd\x99\xf9\xc7\x83\x0c\x60\x8f\x39\xf6\xf4\xfb\x7e\x19\x34\x79\x88\x2c\x14\x8c\xf8\xa8\x98\x01\xc7\x6f\x8a\x86\x71\xdd\xca\xbf\x8f\xc0\xf3\x45\x52\x97\x25\x95\xb2\x83\x55\x26\x38\xf0\x8c\xf1\x6b\x83\x97\x7b\x64\xad\xad\xff\x00\xaf\xa7\xea\x9b\x76\x42\x9b\x0a\x9f\x65\xc9\xa2\xa4\x31\xa6\xe5\x06\xde\x14\xa5\x31\x29\x69\x71\x0d\x1d\x64\x87\x0c\x5f\x36\xd7\xf0\xdd\x4b\x5a\x3a\xec\xc2\x9a\x1e\x97\xa7\x9f\x30\xa0\x5f\xbd\x74\x54\xf1\xb0\x67\xef\x91\x77\x46\x8d\xd3\xae\x8e\x81\x74\x8d\x6a\xfb\x30\xb2\x34\xe1\x9c\xbf\xd8\x4c\x17\x44\x23\xa5\xd8\xc0\x39\xa9\xc8\x5c\xb0\xc0\xd8\xd2\x0b\x98\xa9\x60\x3e\x92\x10\x58\x46\x8b\x7b\xc3\x7b\xe5\x8e\xb1\xcb\x71\x92\xf9\xdd\x8d\xb1\x21\xde\xd4\x1f\xe0\xcf\x61\xee\xcd\x9a\xde\xf1\x12\xfd\xca\x36\xcc\xb0\x8c\xfb\x80\x46\xd0\x00\x89\xdf\x6c\xeb\xc8\xaf\x4c\x99\xb9\x48\xf8\x36\x85\x56\x43\xdf\x01\x9e\x35\x9d\xca\xfd\xb0\xbb\xa2\x26\xb1\x5a\x8a\x7f\x9c\x2e\x36\x09\x2c\x75\xaf\xb8\x4f\x8b\x60\xad\x86\x34\xc5\x70\x35\x4a\x17\xe2\x60\xae\xfe\x8e\x71\xe6\x98\xfb\xe7\xda\xb0\x63\xd2\x31\xb5\x4a\xed\x5c\x5d\xc3\xe3\xe6\xd8\xb3\xab\xea\xba\x4e\x31\x52\xb4\x0e\x4f\x35\x68\x84\x15\xe0\xf2\xd5\xc4\x30\xe9\x68\x7b\xed\xdb\x4d\x73\x25\x15\xd6\x20\x6b\x2b\xb5\x40\xff\xb1\x9c\xc8\xc6\xe5\x4f\xc6\x89\xe4\xef\x3d\x0a\xe0\xb7\xf9\x03\x1f\x83\x3f\xe4\xa2\xe2\x00\xba\x56\xf8\x3e\x0e\x19\x63\x8b\x45\xa3\x52\x5e\x64\x12\x9f\xbb\xa0\xa2\xc2\x71\x52\xc6\x27\x60\xde\x20\xdf\x06\x9d\xf3\xe4\x20\xbe\x0e\x38\x3a\xd9\x76\x55\x40\x69\xe7\x97\xe2\xac\xa9\x86\xd8\x1a\x5d\x51\x99\xc3\x84\x75\x06\x65\x91\x22\x59\x9d\x0b\x78\x49\x82\x6f\x89\x81\x05\x31\xb5\x7a\xd2\xd4\xfc\x33\xa9\x54\x95\x79\xdb\x88\x2d\x19\x23\xea\x09\xd7\xd7\xec\xbb\x02\xc1\xdb\x78\x7e\xea\xe1\xfc\x0c\x27\x92\x52\x5a\x56\x18\x29\x91\xd3\x94\x1f\xc2\xfc\xde\x67\xd4\x41\xbb\xc8\x8f\xc8\x77\xd9\xfa\x08\x50\xeb\x45\xd9\x2b\x46\xf2\xfe\x45\xcb\xdf\x83\x71\x83\xc6\xa6\x62\x96\x7d\x5d\xc4\xe5\xf3\xb9\x8b\x98\x69\x97\x98\x64\x39\x2e\x6b\x5b\x2a\x6a\x2d\x3b\xaf\x83\x91\x84\x86\x57\xe3\xa2\xd3\x5c\x9e\x88\x72\x4b\xa2\xe8\xb4\xbe\xd6\xec\xfa\xac\x26\x2e\x2a\x43\xe2\xc1\xcb\x0c\x35\xd6\xbe\xa6\x88\x34\x04\x50\x9c\xc5\x2c\x8c\x47\xec\x55\x75\x55\xbf\x10\xd4\x6a\xdc\xac\x95\xb3\xba\x49\x16\x62\x1d\x91\x8f\xc2\xf4\xf3\xef\xb6\x7d\x05\xbb\xa3\xc9\x6c\xef\x02\xb5\x4b\x95\x6f\xbe\x74\x0e\xb4\xb1\xfa\x79\x95\x46\x84\xf3\xeb\x2d\xa3\x12\xce\xe9\x93\xe6\x6c\x43\x64\x46\xe6\xd2\x52\xf1\xf4\x04\x27\xe5\xaa\x06\xf9\x0d\x8c\x17\xb6\xd4\x72\x8e\x5d\xa6\x42\x0c\xaa\xd8\xe7\x80\x5c\xa6\xbd\xe8\xa4\x52\xec\xbd\xa9\x6d\x05\x7b\x71\x39\xd7\xd1\x7b\x77\xd4\x98\x27\xf7\x73\xab\x6a\xe9\xdc\xeb\x86\x03\xe7\x53\x92\xad\x06\xad\xbf\xf9\x2a\x12\x51\x26\xa9\x0e\x5c\xe9\xdf\x6d\x82\xc5\xfe\xb8\xf7\x09\x31\x2d\xa3\xec\xc6\x7e\xc1\xda\x4d\x2b\xb4\xc2\xca\xd8\xf9\xc0\x75\x14\x67\xab\x51\x1e\xf9\x87\x59\xb3\xe9\xc8\xbf\x9c\x73\xa1\x89\xa4\x1f\x31\x24\x68\xe0\xbb\xf8\x98\x51\x13\x38\x19\xf2\x9d\x3f\x14\x2d\x2b\x0b\xbd\x2b\x2d\x26\x65\x3d\x5b\xaf\x9b\x07\xc5\xce\xe1\x0d\xfb\xef\xd1\x03\xdf\x86\x1d\xdd\x6e\xb4\x4a\x30\x7f\x78\x4c\xaf\xec\xd6\x3e\xd6\x34\xe2\xed\xaa\x6e\x4e\x06\x87\x30\xc2\x57\x02\x9a\xfb\x86\xbb\x49\x35\x05\xe5\x1b\xd1\x70\x2f\x83\x20\xba\x37\xb9\xa3\xaf\xd2\x5a\xb0\xa3\xa7\x3c\x38\x66\xf7\xd4\x00\xbd\x5b\x8d\x18\x0c\x48\x75\xca\x03\x7c\xc8\x26\x03\xc5\x29\xf5\xab\x7b\xb3\xa5\xc6\xa7\xa1\xd3\x01\x2a\xfb\x79\xeb\x7f\x6d\x0e\xf6\xa2\xc6\x98\x8e\xfe\xbc\xb0\xfa\x5b\x5d\x2a\xf8\x25\x76\x66\x78\x8d\xdc\xc1\xbc\xd8\x00\xf0\xb1\xbf\xe6\xe4\xa6\x2d\xb9\xfd\xfc\x47\x37\x64\x86\x01\x34\xc7\xf3\x7c\x6d\x43\xfd\x62\x87\xd4\xdf\xe1\x83\xa7\xa9\x3d\xf2\x36\x66\xc6\x47\x46\x91\xbb\x4d\xb4\xeb\x2e\x67\x26\x52\x55\xa6\x3a\x6f\xd0\xfc\x26\xf0\x73\x6f\x98\x3a\xa8\x99\xfd\x65\x28\xa1\x57\xb7\x1f\xd3\xb4\xbf\x6b\x6d\xb8\xa1\xb6\xaf\xfc\x91\x86\xe4\x4f\xd6\xbd\xcc\x9f\xbf\xcf\xe7\xfa\xdf\xf6\xb7\xee\xe5\x98\x4c\x7d\x3d\x2b\x6c\x2a\x1a\x6c\xd9\x9c\x8a\x97\x0e\x8d\x92\xb8\x7e\xc2\xe0\x78\x0a\x49\x77\xb4\x5b\xa0\x3d\x01\x82\x0e\x50\x40\x73\xbc\x90\x66\xc4\xec\x06\xcb\x84\x1f\x68\x72\x08\x09\x39\xd4\x2c\xf6\xe2\xba\x84\x49\xe8\x9b\x49\xe9\xfb\x72\x5e\x41\x40\xc6\xfa\xd4\x83\xd3\x04\x97\xd8\x03\x85\x8e\x23\xe8\x97\x05\xde\x78\xe8\x7e\x58\x97\xb5\x20\x65\x3c\x95\x85\x53\x48\xb8\x20\xdc\xa6\xb0\x93\x1e\x62\x05\x4c\x5a\x44\x0a\xc8\xfc\x0f\x1b\xce\xca\x21\xe7\x5f\xc2\xbb\xc7\x6d\x35\x7d\x28\xed\x61\xb6\x25\x40\x69\xf0\xd6\xb3\x9f\x67\xc6\x0b\xf8\x08\x79\xcc\x05\xdb\xe8\xd0\x5a\x73\x15\x9d\xdf\x55\x9e\xc3\x71\xb8\x6b\x08\xfb\xb7\x04\x88\xdd\xca\x42\xcd\xbc\x2d\xae\x06\x4f\x9d\x4f\x52\x80\xf0\xea\x77\x37\x78\xc3\x63\x2a\xba\x97\x52\x89\x2d\x7d\x9c\x2d\x77\xf5\x5d\xcc\x23\xf5\x69\x5f\x15\x59\x39\x81\xf5\xd9\x64\xd2\xfb\xcd\x28\xde\xc0\xc2\xd1\xb6\xda\x8e\xae\x3d\x4d\x8b\xa2\x30\x57\x33\xa8\x2f\x30\x4d\x6d\x2d\x23\xc2\x60\x4b\xcd\x48\x86\xef\x3f\xb6\x4a\x4b\x3b\xb9\x48\x15\xe2\xf1\xa7\xa0\x97\x87\x4e\xc9\xea\x06\xb6\xf0\x18\xea\x37\x0b\xb9\xd3\xe9\x0a\x9e\x08\xc7\xea\xbb\x2c\xb7\x1a\x07\x85\x68\x12\x9e\xd0\x7c\xcc\x2a\xca\xe5\x14\x94\x1a\xeb\x1f\x95\xef\xd4\xfc\x76\xe6\x0f\xc6\xb3\xaa\xc3\xab\x8c\x8f\x16\x08\x43\xfc\x48\x4b\xfa\xf0\x5c\x66\x45\x0f\xfc\xd9\x3b\xb9\x2e\xf6\x21\x9a\xc5\xdb\x1c\x22\x4f\x3b\x21\x67\x0b\xab\xad\xb8\x25\xa7\x51\xe4\x89\x06\x99\x96\xaa\x37\x25\x3b\xb4\x62\xdd\xdd\x31\x2b\xe2\x10\xd0\x33\x67\x93\x10\x04\x54\x8e\xe0\x79\x71\x94\x77\x43\x1e\x19\x70\x0d\x00\x3b\x82\x2f\x98\xf6\x7d\xc3\x55\xfe\x5a\xde\x31\x53\x92\x11\xa5\x1f\x9f\x6d\x2e\x5d\xae\x5b\xf7\xf0\x6b\x9b\x4b\xf6\x41\x82\xb1\xcb\x49\xfa\x92\x1a\x3b\x71\x2b\xf4\x42\x5d\x57\x95\xc1\x24\xd1\x16\xd9\x4c\x07\xbd\x43\xa7\x58\xc5\xc4\x91\x45\x6d\x8f\x89\xea\x75\x05\x3d\x97\x65\x15\x52\x4d\xf3\x34\x69\xce\x62\x81\x42\xed\xaf\x83\xfe\xd0\x69\x40\xbe\xfc\xc9\x2a\x6d\xa5\xfc\x3d\x9f\x76\xca\xe2\x21\xde\x07\xc7\x04\x0e\xeb\x75\x89\x22\xc0\x96\x39\xa1\x48\x87\x60\x1f\x1a\xd2\x18\x68\xd3\x4e\x4d\x55\xa0\xef\xea\x92\xae\xdb\x03\x05\x9d\x2c\x41\x1f\xd4\xcd\x89\x19\xef\xbc\x23\x43\x0e\xa2\x59\x5e\xac\x1b\xb9\xcf\x7c\x28\x4b\x53\xfe\x68\x4a\xc4\xf4\x14\x28\x09\x03\x18\x5f\x11\x42\x49\x0e\x9c\x2c\x4b\x30\xa3\x08\x04\x79\x45\xfa\xae\xf5\x4c\xfb\xc1\x60\xf5\x01\xe9\x97\x4d\xb4\x15\xc3\xc6\x76\x10\x49\xb5\x7e\x94\xa2\x6f\x71\x02\x28\x28\x58\xc2\x8b\x29\x74\x6d\xde\x3a\x57\x34\xd4\x0b\x26\x7e\xd2\x3c\x45\x3d\x3c\xe3\x2e\x19\xe0\x3d\xe8\x75\xcc\xa6\x83\x8f\x48\xa3\xba\xf6\x96\xa6\x6b\x25\x64\xd7\x3f\x04\x07\x9c\x2b\xeb\x23\xf4\xf8\xfe\x5e\x39\x6e\x3f\x06\xc1\xe9\x81\x75\xfb\xbb\xea\x42\xce\x41\xcf\x13\x85\x5e\x7d\x00\x77\x20\xba\xbb\x32\xf4\x1a\xdb\x46\x13\xdc\x36\xdc\xc9\xed\xe3\xb7\xcf\xb9\x28\xdd\x2d\x74\x18\xab\xcb\x4c\x3c\x57\xa0\x56\xd2\xe3\x18\x5e\xb0\x32\x03\xcb\xcc\x95\xad\x07\x96\x65\x1f\x15\xf2\xae\x2b\x79\xe5\x00\x65\xe5\x27\xab\x17\x16\x40\xeb\x11\xb4\xfc\x51\x60\x65\x9e\x6c\x15\xeb\xd5\x79\xb0\x24\xb5\x79\xa2\x3a\x54\xba\x5e\x29\xd6\x3a\xd5\xbd\x1d\xd6\xe5\xfd\xba\xa2\x80\x1f\x36\x0a\xd9\x43\xda\x2e\xce\x26\x8a\xfe\x29\x94\x3b\x30\xec\x1d\x21\x95\xc2\x69\x22\x6a\x45\xc4\xdb\xe7\x77\x3f\xda\xa3\x72\x2c\x7c\x13\xa6\x44\xfd\x2b\x2e\x63\x70\xef\xee\x2e\x87\x32\xfb\x88\x83\x8e\xb4\x79\x68\xa0\x05\x14\x9e\x92\xaa\xf8\x4d\x85\x43\x4e\x10\xf9\x5a\xed\x9e\xca\xe8\xca\x3a\x82\x06\xce\xcb\xc1\xa6\x34\x4e\x81\xa2\x40\x49\xe4\xf7\x21\x57\xa3\xfb\x9d\xd3\x2f\x34\xb8\x62\x60\x37\x1c\xe0\x66\xa5\xde\x98\xaf\x90\x21\x8f\xda\x62\x13\x7f\x6b\xf8\xdb\x3f\x7d\x48\x55\x1d\xe1\x2e\xcc\x64\xbe\xec\x7c\x93\xf3\x1b\x7f\xcc\x0f\xf7\x51\xe3\xfb\xe0\x0a\xc9\x05\xf3\x81\xc4\xf5\x07\x0b\x54\xfe\x1d\x0b\xff\x4c\xf9\xbe\xc6\x73\x2a\x2d\xae\xac\x1e\x0f\xf4\x29\x45\x20\x0b\x8b\x64\xe3\xcb\x0b\x53\xe3\x69\xf4\xbf\xd3\x33\x48\x98\x9a\x41\xdc\x95\xf8\xa9\x21\x21\x49\x48\x79\xdc\xe8\x46\x6d\x0a\x1f\x5f\x79\x7f\xda\xeb\x0d\x07\x83\xf4\x24\xc3\xd4\x4c\xc9\x97\xb6\xd7\x86\xce\xde\xff\xc1\x6a\x37\xdf\xf7\x3f\x57\x0e\xf6\xff\xe0\x8a\xfb\xe3\xf2\x07\xde\x06\x4f\x8c\x9b\x59\x6d\x00\x1d\x5a\x55\x55\xff\x0a\x47\xf9\xe9\xe2\xe9\xb0\x8f\xfc\x44\xb4\xeb\x6f\x4b\x27\x91\x76\xfc\xf0\x7c\x16\x58\xd8\xda\xe7\x8e\x4f\x75\x35\x39\xd8\x55\x48\xbd\x42\x1c\xbb\xcc\x85\x58\x11\x61\x5e\xe0\x2a\x5b\xc4\x34\x19\x57\x8c\x5c\x9f\x38\x3f\xe3\x4d\x08\xf2\x43\x3e\x47\xc0\x2f\x07\x8f\xaf\xe8\xfb\xac\x4d\xf7\xd9\xb7\xc2\xc9\x8c\xa1\x3e\x13\x08\xaa\xc5\x31\x27\xac\xe9\xcd\xa2\xb2\xac\x08\x84\x07\x09\x1c\xaa\x56\x6b\x8b\xef\x88\xb0\xd1\x80\x3b\x4d\x14\xa1\x4d\xd5\x78\x43\xe6\xc9\xa1\x0d\x97\xe2\xbb\x2d\x42\xba\x56\x65\x3d\xbb\xf1\x3a\x0b\xc1\x47\x33\x21\x26\xc3\xfe\x27\x24\xbb\xc9\x1c\xea\xb2\x14\x64\xcc\x72\xc6\x49\x10\x6c\x52\x5e\x05\x52\x57\x43\xe5\xf9\x42\xee\x37\x16\x54\x5a\x5a\x9b\xb5\xb2\x43\x6d\x9d\xcb\x2c\xf5\x4d\x57\x25\x5a\x04\x79\x80\x17\xcd\x51\x2e\xa8\x25\x61\xe3\xfe\x0e\x62\xac\x6d\x5f\xf9\x66\xfc\x96\x7b\x24\x26\xc4\xad\x04\xb2\xaf\x45\x57\x04\x5a\x9b\x19\x0b\x5f\x7a\xf3\xed\xad\xd3\x58\xcd\xc2\xe2\xa5\xed\xeb\x00\x4f\xff\x16\xe5\x93\x35\x7e\xea\x1c\xf7\x54\xf6\xee\x24\x74\x65\xdd\x7d\xd6\x75\xca\x16\xe7\x16\xe4\x8d\xd6\xbc\x10\x07\x29\x01\x37\xcd\x4a\x3f\x3b\x14\xd9\x89\x04\xf0\x38\x44\x17\xba\xe7\x43\xc8\xed\x3e\xff\x4b\xa7\x70\x60\x53\x50\xab\x73\x07\x1a\x8c\x6a\xbe\x3c\xbe\xc5\x87\x5c\xee\xbf\x72\x9f\x74\xd0\x21\x9d\xc1\x80\x64\x43\x5c\x90\x06\xe5\xa4\x99\xdb\x79\x2c\x76\x2e\xfb\x6d\xd5\xd6\x71\xf5\xaf\xed\x1d\xda\x74\xe1\x70\x5e\xe7\x24\x3c\xd1\x9f\x4a\x38\xf7\x37\x98\x26\x1d\x70\xba\xae\x4b\x8d\x2c\x5e\xc2\xe0\x3c\x8a\xb0\xa9\x71\x08\x95\x0b\x24\xc7\x35\x8b\xb8\x5c\x83\x66\xbf\xc1\x53\x3a\xa3\xe2\x8d\x7d\x4b\x3f\x93\xd6\xe9\x1b\x27\xa1\xd1\x3a\x43\x80\x1c\x84\x69\xfe\x59\x68\xc4\xb5\xb5\xd3\x98\xed\x6d\xd3\xaf\xa2\x12\x5e\xb6\x1b\x2e\x68\xa5\x34\x51\xb7\xb4\x4c\x37\xf1\x07\xbf\x4e\xcd\xc8\xd5\x1e\xd0\xe4\x2d\x97\x87\x25\xe2\x02\xbd\x36\x85\xb1\xb1\xd8\x09\x55\x80\xe7\xbf\x52\xfd\xea\x1e\xc7\x79\x33\x7f\x80\xd5\x61\xef\xfc\x15\xa2\xbc\x25\x62\x66\x92\x6f\xd7\x0d\x8d\x43\x3b\xa6\x9b\x17\xf5\x56\xb5\x44\x56\x6e\x0c\xf6\x2c\x1e\x1d\xcd\xd6\xcb\xf6\xda\xd1\x6e\x19\x87\x04\x4e\x97\x13\xad\x8c\xb2\xcc\xaa\xa4\x7f\xa2\xd1\x1b\x0c\x64\x16\xc3\x4e\x68\xc6\x4b\xc7\xea\xe2\xaf\xbf\xe2\xf8\xb5\xe7\xc5\x10\x95\xc3\x2d\x54\xbf\x51\xdc\xef\x31\x85\xbb\x5f\xe6\x7e\x8f\xce\x7d\x8c\xd2\x24\x14\x26\x28\x9f\x03\x92\xda\xc0\x0c\x07\xe9\xfa\xa6\x7b\x9f\x37\x52\x3b\x75\x9e\xfd\xfe\x43\xeb\x6f\x91\x1e\x7f\xae\xdc\xaf\x82\xff\x55\x7f\x75\x1f\xfa\x59\xfc\x8f\xf7\xad\x12\x34\x52\xe8\x5c\x8e\x71\xa0\xdd\x1a\xd1\xe7\x36\xa9\x59\x1a\x69\x6c\xd2\x92\xe8\x2e\x5b\xef\xdd\xa5\x58\x04\x60\x2d\x32\xfc\x85\x20\xc0\xb8\x4e\xf9\xc6\xbe\x75\xcb\xa8\x4d\x07\x3d\x5d\xfb\x7c\x2d\x67\x81\x5c\xff\x84\x24\x83\x97\x01\xcb\x90\xef\x82\x73\x89\xe9\xf6\xd4\xf3\xcc\x14\x28\x29\x92\x32\xab\x2a\x17\x4b\x15\xd7\x1a\xaf\xbc\x84\x0b\x30\x95\x39\x91\x2c\xc9\xac\xb6\x0f\xdc\x07\x12\x57\x97\xb0\x6a\x9e\x49\x2b\x89\x21\xd2\x7e\xe0\x6c\x80\xba\x9b\xac\xf3\x64\x46\x3e\xd8\x43\x34\x8d\x0f\x95\xd1\xf0\x82\xbc\x0d\xf4\x6e\xc1\x96\xfe\x5a\xc7\xf6\xa3\xf7\x5c\x5b\xde\x1a\x5b\xb2\x43\x96\xf8\xad\x59\xcb\x0f\x05\xd2\x7b\xcc\x51\x6c\x92\x49\x81\xbf\x6e\x23\x6d\xed\x93\x91\x56\x2f\x77\x1f\xbd\x53\x9a\x31\x82\x40\x73\x5f\x7e\xcf\x46\x12\xa4\xf0\x84\xfc\x77\xeb\xed\xf4\xd0\x1f\x4f\xa3\x8f\x20\x2f\x93\xd9\x95\x85\xe4\xa9\x4b\x9c\x3d\x21\xea\xc3\xac\x85\x76\xe4\x19\x3e\xa3\xaf\xee\x75\xa3\xb3\xb5\x20\xc3\xa3\x50\x52\x76\x2d\x25\x1d\xc4\xa4\xe8\xdb\x08\x02\xa0\x5e\xa2\xe2\xcd\xb2\xa3\x9d\x16\x0b\x96\xd5\xd4\x71\x38\x00\xe3\x37\xf3\xd3\x56\xf0\xa9\x33\x97\x65\x22\xb5\x0c\x15\x11\x34\xbd\xa2\x7f\xc9\x3c\xf4\x0a\x0f\x61\x29\x67\x0c\x5d\xb1\x87\x23\x56\x1b\xc2\x19\x7d\x3c\x23\xab\x0c\x6c\x6d\x08\x6b\x89\x74\x02\x16\xbb\xa4\x94\x0e\xa8\x5e\x56\xca\xce\x46\x09\xbd\x1b\x31\x03\x8c\xc5\x07\xb7\x92\xb3\x89\x26\x0f\x83\x20\x7a\xae\xc8\x94\x9e\x8f\xb5\xe7\xc5\xe6\xd5\x48\xe5\x33\x0d\x9f\x7f\x89\x9c\xbf\x80\xc6\x62\x35\x0e\x73\x31\xfc\xed\x52\xc9\x42\x15\x8d\x7e\x53\x21\x6f\x92\xd9\x5d\x35\x1c\x65\xb4\xed\xb8\xd5\x7e\xbe\x54\xf4\xb0\xf0\xfa\xb5\xa0\x84\x31\x38\x88\x93\x21\x44\xef\x62\x1f\x42\xea\xab\x58\x8c\x96\x71\x26\x54\xd5\x88\x12\x81\xac\xaf\x93\xbf\x16\xca\x38\x3c\x54\x4b\xbc\xa3\x56\xd3\x52\x10\x5e\xcf\x05\xe8\x70\x8d\x5d\xa0\xf1\x1a\x4f\x87\x35\x04\x82\x23\x61\x7c\x8d\x20\x83\xa3\x07\xcc\x75\x2a\x09\x9f\xda\x76\x6c\x35\x6d\xb6\x73\x9b\x52\x11\x98\x52\x90\x05\xb3\x0a\xce\xce\xf5\xe3\x13\xd9\xe4\x1c\x3d\xd7\x27\xbc\x08\x3c\xa7\xe9\x9b\xbd\xb3\xcb\xc9\x10\xb7\x8e\x1f\xfb\x8f\xad\xc1\xc5\x58\xff\xb9\xf2\x70\xa2\xfe\x71\xc4\xbd\xfd\x7b\x1e\x52\x43\xdf\xa3\xc4\x1b\x7a\xee\xc1\x8e\x87\xd1\x08\x6e\xf8\xcc\x3b\xcc\x47\x41\xe3\xee\x4e\x9e\xee\xe7\x13\x07\x10\x16\x90\x76\x85\x72\x35\x07\xd2\x17\xab\x62\x7c\xf0\x9b\x05\x99\x68\x7d\x66\x1d\x59\xa3\xe0\xae\x65\x59\xe1\x31\x74\xdd\x8f\xff\x5e\xe4\xb2\xcc\x45\x10\x56\xe0\xe4\x8c\xca\x01\x91\x69\xba\xce\x32\x2a\x63\xbf\xde\x98\x50\xfa\x81\x14\x68\xf0\x44\x8f\x31\xaa\x33\x9d\x4e\x5e\x09\xf0\x5a\x4c\xa3\xb2\x52\x5c\x29\x50\x87\x0d\xc0\xed\x7e\xea\xfb\x13\x89\xa1\xd4\x80\xe9\x6f\xe4\x83\xdd\x52\x5c\x19\xab\x5c\x1f\x31\x2d\xbe\x83\xa9\x9f\x2c\x0f\x06\x4a\x39\xd1\x07\xa9\xeb\xc7\xdb\x9d\x5c\x26\x2e\xa8\x61\x31\x88\xdc\x96\xd8\x70\x8f\xac\x83\x2d\x48\x13\x55\x12\xd6\x81\x08\x1d\x18\x9f\x8a\x50\xe2\xa7\x90\x22\xea\x64\x7d\x59\x5b\x32\x6a\x07\x46\xda\xf1\x7d\x51\xbf\xb1\xa2\x57\x56\xe6\xa1\x9d\x5e\xeb\x73\x64\x04\xd9\x13\xed\x6f\xf1\xe3\xe6\x14\x20\xb5\x72\x52\xe2\x4e\xb9\x37\x8a\xa2\x79\x58\x82\x6d\x6f\x40\xe8\xa8\x5d\x8d\xdb\x30\x19\xb8\xfd\x64\xfe\xf9\x12\xeb\xf6\x74\xd5\xe6\xd6\x17\xe3\xdd\x29\xb8\x63\xe6\x58\x1b\x0b\xa6\x5f\xb7\x02\x55\x9f\x9b\x10\x54\xd3\xeb\xec\x13\x0c\xc4\x7b\x6a\x5f\x85\xd9\xc9\x7a\x9d\x17\x97\x2b\x36\xf3\x2e\x9d\x9e\xe5\x93\x7b\x6e\x1e\x01\x09\xcd\x86\xc2\x08\xc5\xb6\xab\x25\x6a\x23\x15\x1b\x4e\x00\xe0\x1d\x42\x25\x54\xd4\x5d\x3c\x23\x3b\xcb\x47\xd1\x9b\xc5\x07\xc3\x05\xae\xa4\x2d\x70\xb9\x23\xf2\xb2\xcb\x9a\x0b\xa3\x39\x0a\x0f\x3d\x53\xe3\xdc\xe7\x74\xb5\xf3\xb1\x5c\x02\x3e\x1b\x24\x1a\x8e\x72\xdf\x71\x1b\xd6\xdf\x01\x34\xb1\x9e\xde\x43\x79\x42\x01\x72\x67\xbd\x07\xf4\x7e\xbb\x99\x39\x21\x8b\x0a\xfd\xe1\xa4\x03\xda\x69\xff\x63\xe8\xe1\x41\x9a\x95\x76\x2d\x91\x51\x9c\x68\x89\xcc\x0b\x23\x8b\xfe\x43\x4a\xba\xb6\x67\x73\x44\x9b\xb7\xc3\x08\xa3\x4e\x46\x48\x97\xae\x85\x19\x55\xdc\x2e\xfc\xa2\x06\x39\xba\xa6\x72\xa7\x6f\xda\x9c\x71\xb9\x54\x55\x8a\x72\xfe\x65\xc5\x33\x3a\x30\x77\x84\x1c\xe7\x3f\x03\xf6\x93\x12\xc0\x96\xbc\x77\xe7\x90\xa8\xb0\x4d\x0a\x13\xab\x0b\xc2\xd3\x52\xcc\xe9\x82\xd9\x62\x84\x6d\x5a\x72\xb8\x4d\x84\xc0\x49\x3b\x8c\x08\x05\x5b\x7f\x51\xf8\x06\xee\x53\xa7\x5d\x6b\x46\xda\xcb\x88\x70\xf3\x9d\x9b\xa3\x06\xd4\x30\x1e\x84\xec\x1a\x7d\xdf\xcd\xb8\xd4\x18\x6f\x37\xab\x00\x5c\x47\xce\xae\xf2\x18\x91\xc8\x3c\x3c\x1f\x3f\x28\xf9\x55\x1f\xe4\x97\x28\xcd\x04\x37\x62\xe8\xdd\x14\xfe\xd0\x4d\x9e\x1a\xb2\xf3\xe2\xf7\x9e\xbd\x1a\xe1\x4d\x61\x31\x75\x74\x8c\x8c\x4a\xa2\x2c\xdb\xaf\xc4\x61\xa3\x6f\xc6\xdc\x11\x99\x1c\xba\xec\x38\xf5\xb0\x71\xc2\x4f\x96\xad\xad\x9f\x00\x31\x8f\xf3\x5a\x0e\xf9\xf9\xce\x12\x00\x5a\x19\x04\x41\x41\x54\xd6\x69\x8e\x77\xbb\x35\x9b\xa4\x4c\x82\xfe\xe0\xc9\x56\x31\xff\xc9\xfa\x52\xcb\xf2\x77\x7e\x10\x94\x25\xf0\x7f\xf3\xd1\x08\x75\x25\x27\x41\xd4\x04\x37\xf7\xb9\x05\xa1\x0c\xe3\xfa\x63\xcb\xab\xac\xcb\x3e\x3b\xc1\xb7\x10\xa4\xd0\xb1\x09\x1b\x83\xa7\xbe\xfa\x16\x01\xac\xd2\xa4\xe2\x3d\x2f\xae\x0d\x15\xfa\x21\xf0\x7b\xc6\x39\x4c\xdd\x26\xbc\x2d\x0b\xa8\x2c\xe5\x35\x00\x1f\x70\x42\x96\x09\x66\x73\xc3\xa4\xff\xc6\x84\x02\x48\x8a\x40\xae\xaa\x24\x0d\xde\x57\xe8\xad\x72\x8d\xe6\xb3\x44\x28\x90\xab\x52\x6e\x39\xc7\xe5\xfa\xfb\x97\x87\xc1\x81\x18\xe4\xd6\x88\xb8\x5b\xb8\x26\x2c\x5e\x13\x59\x54\xe7\x59\xae\xc9\x7d\x1a\xc9\xda\x23\xca\x53\x13\xad\x91\xcb\x15\x93\xd5\x11\x87\x27\x2c\x79\x62\x6b\x55\x7d\x11\x59\xce\x71\xf9\x72\x0f\x4b\x10\xe7\x5b\xab\x4d\x3e\x9f\xf3\x55\x07\xbe\xdd\xfd\x24\x34\x66\xe0\xf9\x32\x4e\x8e\x02\x0e\xcf\xf3\xa1\x4f\x0f\x98\x51\x04\x01\x96\xa4\xe5\xb8\x21\x05\x04\xff\x71\x1a\xf8\xf2\x98\x34\xd1\x9c\x1a\x0f\x41\x51\xe3\x3a\x47\x8f\x21\x91\x9f\x1f\x16\x8a\xe7\x0d\x58\x7b\xc8\xc5\x22\x7d\x65\x1a\xc9\xb3\x82\x7f\xa0\x2a\x01\xd2\x52\x01\xca\x54\x4e\x30\x5a\xfa\xb4\x13\x07\x6b\x05\x96\xcc\x44\x4d\x90\x8e\x76\x3a\xcd\xc0\xb8\x70\xbe\x84\x99\x58\xb9\x47\xd5\x54\x37\xcb\x2f\x2a\x34\xf9\x1d\x9b\x85\xa7\xb8\x6b\x79\xeb\x9a\xbc\x66\x35\xfd\x0a\xc6\x75\x11\x23\x03\x2e\xed\x5a\xe5\xe4\x5a\x5c\x01\x8b\x64\x64\x12\xa4\xb4\x35\x6f\xf5\x1a\xfd\xea\x7b\xcb\x2b\x84\xb1\xad\xf6\xa7\xff\x5a\xe2\x7e\x9b\x59\x4f\x56\xb3\xb9\xec\x1d\x4f\xa0\xf9\x8a\xea\x82\x56\x68\xd6\x99\xcf\x81\xaf\x31\xc9\xbc\x37\x73\x9b\xd5\x1e\xfa\xcc\x18\x66\xb8\x23\x58\x3c\x01\x62\x7d\xbc\xd7\x7a\x5b\x89\x52\x80\x31\xf8\x59\x84\x06\xdd\xdd\x19\x46\xb5\xa3\xd0\xb0\xfb\x63\x9c\xc5\x3c\x8d\x4b\x37\xb5\x59\x39\x08\xcd\xcb\x8f\x6d\xba\x0d\x13\xc1\x3e\x7a\x6c\x74\xf5\xd9\xfd\x78\x59\x3b\x98\xcd\xab\xf8\xfc\x6a\x59\x2c\xbb\x83\xdb\x1e\xe7\x86\xc2\x6f\x1a\x6a\x73\xac\x60\x30\x62\xaa\xcb\x39\xf5\x64\x8b\x2d\x32\x04\xfd\x38\xd9\x8b\x0d\xcd\x34\xe5\x32\x70\xf7\x10\x28\x6c\x16\x20\x00\xc3\x0d\x1f\xbc\x53\xd0\x23\x06\xb7\xd0\x08\x08\xab\xca\xc5\x0b\x3a\x98\xd9\xf2\x74\x42\x47\x4b\x55\x09\xea\x07\x16\x3c\x9e\x3a\x51\xdb\x72\xf1\x07\xe8\xa5\xaf\xba\xc1\xd1\xa4\xbb\x74\x0b\xe1\x46\x11\x91\xe6\x25\x3f\x39\x2f\xef\xf2\x8c\x01\xcb\x39\x1c\x5e\x2f\xbe\xac\xfb\xf2\x02\x0b\x99\xd5\x62\xf0\xa7\x74\x44\x5f\x17\x9d\x4f\xea\xc2\x4b\x1f\x1f\x9b\x38\x5a\x53\xf8\x29\x8c\x81\x0b\xad\x57\xe0\xee\x4b\x39\xa7\x90\x49\x4b\x44\xe8\xba\xbe\x9a\x1c\x44\x92\x72\x0b\xcc\x0b\x66\xfa\xb4\x49\x74\x6f\xe9\x88\x15\x73\x6f\x02\xc9\xd6\xe4\x18\x9d\x9c\x86\x4e\xa5\x1e\x7d\xb5\x70\x37\x77\xf2\x01\x4d\x45\xa4\x54\x81\xbd\x27\x92\xe0\x9c\x67\x75\x81\x2d\xc7\x54\x4f\x94\x9b\x49\xc4\x38\xa2\x5d\x39\xc9\x6f\x7c\xf9\xae\xb8\x92\xea\x78\x59\x75\x69\x8b\x5e\x7f\x65\x0c\x23\x43\x1c\x6f\xad\x96\xda\xb7\x7f\x38\x63\x8e\xe7\xcf\x05\x99\xa9\xf8\xff\x8b\x14\xcf\xfa\x94\x1e\x7a\x81\xb0\xd1\xdd\x23\x84\xd7\x22\x08\x1f\x3f\xe0\x6d\x5f\x80\x64\x00\xe5\x35\xbb\x65\x89\xe1\x43\x0d\xea\x83\x3c\xa0\x11\xa9\x7b\x2b\x12\xd5\xaf\xb5\xf5\x1c\x9a\x2d\x73\xd3\xfa\xc7\xaa\x8b\x07\xd5\x84\xb3\xc4\xdd\x9a\x8c\x55\x35\x94\x98\xc1\xab\x85\x2e\x0d\x5f\x75\x5d\xd1\x65\x59\x55\x95\x9b\x68\xea\xf3\xd3\x4c\x55\x48\x70\xa0\x85\xb7\x00\x4c\x64\x96\x40\xc5\x40\x27\x68\x64\xc1\x72\x11\x0d\x49\x19\xfe\xaf\xfb\x79\xac\x4e\x4a\x04\xf0\xc4\xd4\xad\xdc\x96\x94\xe8\x99\xd9\x39\x69\xa1\xd1\x17\x0f\xc2\xb5\x37\x2b\x5e\xeb\x59\x0f\x49\xf5\x80\x39\x04\x05\xa8\x79\x00\xe4\x59\xb2\xb5\x98\xa0\xfb\xbd\x76\x8f\x42\x0f\xab\x3f\x8c\x9b\x50\x09\xc2\xce\xf4\x83\x71\x66\x57\x4a\x1e\xe1\x66\x3c\x14\xb9\xcb\x77\xa7\xa4\x19\x32\x54\x27\x1b\xbc\x36\x0f\x76\x4d\xd2\x0e\xc4\xd7\xbe\x3a\xfd\x2c\x79\x90\xc3\xa5\xf7\x0f\x34\xb7\x8c\xa7\xf7\x4c\xff\x07\x1f\xdb\x4e\x2e\x14\xe6\xb4\x74\xb4\xac\xe9\x77\xac\xf3\x49\xae\xb8\xab\xda\x8a\x32\x26\xee\x2a\xde\xfb\x5c\x08\xbb\xac\xf4\xbf\x3e\x7f\xb5\xf8\x22\xe4\x32\xad\x72\xed\x41\x25\xdf\xe8\x05\x01\xed\x04\x8f\x7f\xf4\x04\x62\x28\x6e\xab\x38\x54\xf2\xf9\x73\x8f\x9b\x70\x47\x45\x8b\x57\x6a\xec\x1e\x5e\xf0\x60\x62\x47\x36\x4b\xae\x59\xf8\x7b\x70\x11\xf4\xc9\xdf\xb4\x2b\xec\x0d\xf1\x6f\xd3\x83\xf5\x41\x31\x79\xc6\x39\x45\x43\x0a\x17\x8a\xb6\x9d\x20\xe2\x2a\xbb\x15\x02\xd0\xc7\x44\xc6\x6d\x6d\x6c\xc1\xa7\x9a\xe1\x53\xec\x43\xaa\x56\x6e\x58\xbc\xc6\x65\x9d\x63\x6e\xb3\x98\x25\xab\x8f\x27\xc9\x0a\xde\xc6\x80\x0e\x81\xe0\x51\xdb\x5d\x36\x0a\x65\x79\x53\xe5\xb5\xaa\x5a\x81\x97\x62\x56\x80\x63\x15\x62\x0b\x99\xd9\xb6\x99\x20\xb3\x1c\xd8\xc4\x45\xd4\x1c\x76\x8d\x76\x15\xfd\x60\x93\xca\x5e\x47\xc8\xb0\x30\x39\x08\xa7\x74\x2c\xe8\xde\x7f\xb2\xf7\x94\xe3\x83\x23\xee\xb0\xac\x33\x28\xa6\x3f\x3a\xd0\xfb\x5e\xc6\x8d\xdb\xd2\xa9\x87\xbf\xa5\x61\x7e\x39\x91\x1e\x7b\x82\x56\x5d\x6a\xa3\x5d\x48\x50\xcd\xe2\xac\xb3\xb8\xa4\x25\xeb\x24\x4c\x8b\xd7\x01\x3d\x26\x56\xa4\x91\xd5\xd5\x13\x6c\x69\x64\x91\x28\x37\x8d\x1c\xac\x9e\xa2\xd2\xb9\xad\x07\xcb\x1b\x2c\x8b\xef\x6d\xae\xcb\x1b\x19\xba\x28\xe6\x3c\x70\x56\x09\x11\xb6\xb4\x49\x4f\x0c\x5f\x97\x84\x6b\x66\x02\xb0\x26\xaf\x8e\xaa\xaa\x05\xeb\x4c\x8a\x47\x8d\xbf\x2c\x57\xb6\x99\x05\x53\x7c\x1c\xde\xe3\xef\x87\x88\x38\x44\x7d\x2a\x13\x5d\xb3\xa9\x17\xf1\x04\x7f\xf5\x48\x44\x35\xac\x07\xba\x06\xa2\xfc\x89\x9c\x56\xfd\x34\x3d\x5c\x47\xa3\x31\x90\x17\xd8\xc2\x4b\x1e\x79\x16\x79\xa8\x85\xc7\xe7\x59\xa8\x25\x2b\x67\x47\xf7\x09\x0e\xf8\x52\xdd\x19\x3f\xb9\xe2\xee\x51\x42\x48\xd3\xe8\x58\x48\x17\x0c\x52\xb1\x82\xfe\xb1\x0d\x86\xfb\x4f\x66\x6c\x66\xe1\x1f\x98\x71\x58\x3c\xcc\xfb\x56\x65\xd6\x10\x84\x37\x1c\xba\xd9\x0d\x19\xd6\x19\xeb\xde\xbd\x5a\x67\x02\x3c\xdf\x67\x97\xb2\xad\xbd\x47\xcf\x12\x01\x1c\xae\x8f\xd9\x11\xf1\xbb\xc4\x6a\xa3\x4c\x67\x3c\x6e\x68\x33\x19\x0f\xa2\xfc\x38\xbc\xbc\x37\xf2\x1a\x0c\xc0\x68\xe3\x1d\x09\x7e\x42\xc0\x66\xa8\x7f\x9c\xc9\x99\x12\x14\x86\x11\xc4\x36\x20\x02\xcb\xf3\x18\x33\x10\xd4\x65\x15\x98\x26\xc5\xad\x69\x11\xb9\xf4\xa3\xfd\xb0\x25\xb1\xf7\x18\xaf\x21\xdd\x7f\x99\x42\xf1\xd8\xf6\x32\xd3\x21\x21\xcc\x72\x5a\x60\x44\xb5\xc4\x7c\xf5\xc3\x79\xb6\x3c\x69\x50\x2e\x57\x2e\xa9\xb6\xb0\xb9\xc3\xb2\x6b\x0a\x06\x1c\x9b\xea\xa7\xdc\xb9\xa1\x05\x63\xfe\x32\xe0\x13\x60\x73\x33\xfb\xe1\x71\x43\xa8\xea\xd7\x20\xbb\x0c\x6b\xa7\xdf\x8e\xd6\xe1\x38\x6f\xba\xce\x45\x07\xe9\xdc\x30\xc7\xad\xec\xb9\x5e\x0b\x8c\x12\x4c\x85\x27\x44\xfb\x15\xc5\xee\x89\xa5\xcc\x21\x96\x7f\xca\x80\x92\xda\xc8\xe6\x58\x2f\xab\x33\x46\x0f\x38\xc1\x50\xb5\x2f\xc6\xcf\x76\x4e\x00\x66\x4c\xfa\x20\x24\x80\xa8\xb6\x36\xcd\x75\x70\x4a\xd0\xeb\xb9\x97\x9a\x7c\x75\xfa\x85\xa9\x7a\xea\x32\x27\xba\x87\x41\xbb\x01\x48\x4b\x06\x72\xa0\xc6\x6e\xf6\x42\xbe\x57\x08\x3e\x99\x4c\x27\x49\xc7\x8c\x64\xd7\x81\xa9\xf0\x06\x76\x9a\x51\x8b\xfa\x7b\x91\xde\xb7\x0f\x09\x6e\x85\x7b\xa9\x3b\xbf\x37\xce\x39\xd7\xd9\x5b\x7d\x2d\x86\x0b\xa7\xbe\xa8\x40\xa6\x48\x27\x8f\xec\xb6\x0a\x9c\x30\xe1\x5b\xa3\x5a\x0e\x1a\x88\x53\x73\x99\x1e\x1d\x23\xa1\x96\x77\x6d\x95\xdb\xf4\xbe\x3a\x55\xe3\xe7\xa0\xb8\xfe\x74\xd5\xc8\x98\x86\x9a\x64\x5a\xe7\x3a\x7e\x59\xe6\xfc\xd9\x29\x89\xd5\xfb\xa3\x12\x3d\xf6\xb6\xc0\xd9\x64\x7a\x5f\x35\x7a\x70\x15\x90\x85\x8b\x59\x5c\x3d\x7a\xd2\xa9\xc2\xef\x4d\xd3\x59\xdd\xd6\x82\x4b\x19\xee\x7e\x53\x32\xfc\x8d\x10\xc8\x5a\xac\x83\xf4\xc2\x4b\xb0\xf9\x34\x86\xb6\xe3\x2b\x6b\xee\x28\x82\xaf\x1e\xde\x64\xb1\xa5\x43\xfc\xb4\x7b\x2e\x63\x81\x82\xd9\xf8\x0d\x26\x56\x48\x16\xd6\xdb\x9c\x83\xbd\xb0\x63\x86\xdd\x83\x74\xcd\x4d\x7d\x5a\x6b\xe5\x79\x1a\xad\xfa\xd8\x03\x46\x19\xda\x8a\xb9\xf4\x5b\xe9\x17\x25\xc1\x69\x5b\xcb\x2e\xab\xeb\x0d\xdb\x63\xd5\x56\xde\x3e\x99\x34\xd3\x86\xaf\x3b\x48\xd4\xe9\x43\x52\x03\xeb\x6b\xb7\x27\x01\xa6\x1d\x8b\xe5\xce\x62\x69\x50\x9b\x3a\x35\x4c\x44\x94\xcd\x6c\xba\x9a\x2c\x5b\xd5\x24\x9a\x46\x24\xea\x7a\x68\x10\x8f\x5f\x05\x43\x11\x73\x59\xa7\x23\xe3\xd6\x60\x12\xcb\xd5\xee\x8f\xe0\x1a\xa9\xe6\xec\x5c\xf6\x81\x28\x63\x9e\x89\xf3\xa6\xdf\xf3\xf3\x4f\x3b\x57\xa8\xf6\x22\x06\xcc\xc6\xca\xdf\xa7\x89\x5b\x4b\xc1\x3c\xa7\x08\xd3\x4c\xd7\xd2\x91\x57\x1b\x7e\x67\x59\x10\xf9\xeb\xfa\xa3\x10\x00\xfa\x28\x62\x42\x7c\xe5\xf8\x01\x05\xf6\x9b\x88\x54\xba\x79\x91\xa6\xa5\x48\x99\xe9\x33\x31\x86\xef\x8f\x1c\xb7\x17\xcf\x9f\x6d\xfd\xf7\x1f\x77\xff\x8f\xbf\x6a\x8e\xd8\xaa\x0c\x7d\x3c\x8a\x59\x82\x7b\xce\x18\x95\x2c\x0d\x84\x3c\x65\x02\x61\xa1\x77\x87\xb7\x17\xe1\x8e\xa1\xec\x44\xa4\xce\x9e\xbc\xee\x37\x06\x05\x40\x1b\xf9\xc9\x22\xab\xdd\x3e\xe3\xf6\xe2\x3c\xd4\x87\x42\x20\xdb\x40\xa6\xbe\xf0\x91\x09\xca\x88\x94\xe3\x1b\x79\x67\x27\xe6\x29\x80\x72\xfd\xbd\x97\x45\xa5\x4d\x13\x62\x99\x05\x41\x9c\x2e\x4e\x6c\xf7\xef\x62\x09\xaa\xec\x89\x2a\xe1\xbf\xe5\x44\xe8\xd8\x5f\x5d\xea\x50\x6d\x31\xb1\xb4\x25\x45\x82\xc8\x82\x4e\x81\x1d\x15\x90\x3c\x28\x53\x63\x91\x15\x3c\x95\x2c\xdf\xb1\xac\x97\xdf\xec\x2a\xa4\x59\xdf\xdd\x4c\x53\x79\xc3\x19\x2f\x1f\x0e\x73\x63\xf2\x3a\x47\xe0\x08\x5d\xfb\x85\xa2\x6b\x29\x92\x8c\xef\x34\xaa\x3a\xa1\x4e\x87\x01\x67\x3d\x5a\x5c\x3e\x48\xcb\x8e\xd5\x72\xca\xcd\xcf\xde\x05\xf7\xd5\x1f\xdb\x44\xc5\x2b\x92\xa4\xdb\x54\xf0\x28\x74\x5f\x39\xef\xc9\x0b\x97\xec\x7d\xea\xe8\x47\xc8\x89\xcb\xeb\xe0\xe0\x66\x6a\x34\x15\x09\x32\x28\x18\xc9\x16\xd8\x1e\x28\xb2\x20\x7f\xf4\xe2\x2e\x2f\xaa\xf6\x5c\x9e\x45\x31\x6c\x97\x19\xf3\x84\x55\x6d\x9f\x15\xe1\x5b\xd3\xdd\xa2\xae\x8e\x2d\x39\x66\x88\xd7\x6f\x42\x83\x28\xba\xd3\x4d\x54\x13\x83\x60\xb7\x02\xb3\x2b\x8d\xf3\x40\x42\x5d\x18\x9d\x44\x73\xaa\x12\x7c\xa1\x13\x16\xf8\x2e\x7a\x7c\x1f\xab\xc1\xd9\x55\x75\xd5\x53\x82\xaf\x2b\x45\x41\xe8\x1c\x36\xd5\xa1\x3d\xe0\x85\x1f\x19\xcf\xae\xa6\xba\x58\xa6\x73\x99\x7d\x82\xf1\x0f\x47\x6c\x5b\xaf\x24\xaa\xa8\x75\xd6\x51\x05\xd4\x93\x9b\x70\x6f\xb9\xe2\xb9\x1e\x19\x47\xc9\x37\xf3\x96\x15\x4d\x0e\x9f\x51\x07\x0a\x73\x7f\x35\x75\x7b\x6d\x3a\x55\x96\x4e\xf9\x81\xf4\xb3\x89\x26\xe2\xae\x45\x72\x10\xbd\x9a\x28\xdb\xa7\x84\x4c\x8d\x2d\xad\xc4\x1b\x67\x4c\x5e\x01\x5e\x42\xbe\xf9\x96\x3f\xef\xad\x8e\x8b\xc5\x06\xa0\x4e\x18\xd2\x95\x14\xef\x5e\xdc\x07\x5d\x51\xa5\xf4\x7c\x35\x7d\x9a\x68\x76\x30\xa2\x21\x9c\x09\x40\x5a\x61\x1e\x14\xe4\xb9\xac\x26\xcd\x70\xa9\x56\x44\x70\x51\x88\x6e\x37\x2c\x74\xf7\x23\xa0\x4b\x5a\xb6\xe6\xf7\xb0\x00\xb9\x4e\xc2\xe4\xcd\x8d\x17\xc6\xa7\x37\xe8\x95\x96\xcf\x9d\x23\xd5\xb4\x60\x2c\xc5\x4d\xa6\x99\x8a\x06\xfa\xf2\xe8\xb7\xca\xb1\x0e\x3b\x72\x76\xe2\x2d\xa4\xb6\x12\x87\x31\xa0\xe8\xe9\x92\x08\x21\xbd\x27\x2e\xbc\x46\x48\x24\x74\x4b\x82\x19\xde\xcd\xca\x25\x80\xbb\xf4\x8c\x79\xb0\x5c\xac\x70\x4d\xc2\xa3\xb5\x93\xab\x46\x16\xbf\x13\xbd\x66\xac\x9e\x45\xcb\xbd\x04\x96\x90\xf1\x53\x0d\xa5\xaa\x22\x66\xf1\xa7\xfe\x16\xf4\x96\xcb\x5a\x1b\x72\xde\x1a\x8b\x03\xe0\xba\x28\xfb\xf2\xfd\x11\x06\xf6\x9d\x9c\xfb\x0e\xe8\x3b\xc4\x9b\x6e\x2d\x6b\x28\x39\x30\xf8\xe7\xc6\x6c\xc8\x2a\x57\x56\x42\xfe\x04\x53\x3e\xf7\x10\x52\xbd\xed\x88\xcc\xb7\x87\x14\xf5\x37\xd2\x99\x17\x5c\x0d\x14\xcc\x91\x0c\x53\xd3\x4a\xf9\xae\x4c\x43\x41\xbc\xf1\x07\x37\x5b\xcb\xe5\x4f\x36\xf0\x1c\x87\xbf\xaf\xf7\xfd\xaf\xf7\x89\x2a\x5d\x60\xf9\x80\xde\x8a\xd9\x5d\x79\x1a\x52\x03\x18\xc5\x7d\xa5\xf0\x15\x1d\xd6\x66\x58\x51\x41\x4a\xe8\xa2\x13\x39\x0f\x65\xf5\x8c\x0f\xe5\xa8\x7b\xde\xb6\xdd\xe6\x9f\x4c\x58\x68\xc1\x83\xbc\x78\x81\xd8\x84\x5c\x64\xba\x7d\xf5\x4a\xbf\x98\xe9\x1a\x61\x61\x4e\xa9\x33\x42\xb4\x9b\xc8\x29\x92\x22\xa8\x87\x20\x1a\x43\x87\x6e\xa7\x22\xce\xca\xda\x57\x22\x81\x5d\x3b\xbe\x61\x5b\xa1\x7b\xee\xb1\xd3\xc1\x4f\x52\x24\x94\xc9\xe6\x45\xea\x31\xd9\x7e\x58\x76\x02\x1f\xd9\xcb\x1a\xd3\xb3\xa5\xc3\x2a\x2d\x9e\x9d\x95\xaa\x77\x2d\x64\x34\x77\xcb\xda\x0e\xde\xb6\x47\x91\x1e\xde\x65\x63\xda\x6b\x6a\x1a\xdf\x86\x79\x7c\xf6\x23\x32\xa2\x49\x33\x66\xeb\x8f\x89\x7e\x88\xf0\xce\xcf\x29\x11\x0f\x3d\x64\xd7\xb2\xaa\x8e\xfa\xab\x3c\xc8\x0a\x33\xe7\xe6\x47\x8e\x7f\xdb\xf7\x67\x07\x35\x18\xfc\x44\x13\x82\x0f\xf3\x77\xa8\x1a\x1f\xc3\x96\xfc\x22\x2a\x4f\x0f\xa3\xe2\x70\x5a\x94\x41\x5e\x99\x68\xc0\x44\xd5\xa8\x2e\x0d\x9a\x82\x49\x32\x73\xc6\x93\xfb\x45\x2b\xc0\x0d\xf9\x6e\x6b\x3d\xc8\x51\xd2\xdc\xfc\xc2\x4d\xf6\xbb\xc1\xca\x97\x3d\x16\xed\xcf\x45\xb4\x70\x4e\x99\xe6\x52\xcb\x28\xd4\x6d\x96\xa3\x7f\x1c\xb5\x1c\xa4\x95\x46\xbc\xe3\x77\xb7\xd9\xf1\x89\x2d\x34\x89\xbd\x50\x1a\xfc\xf2\x4e\xbb\xc6\x0e\xdb\x5b\x07\xf8\x61\xe4\x5c\x7b\xe2\x2a\xd9\x1a\xff\x63\xb4\xda\x1f\x59\x3c\x12\x39\x8c\x1e\xda\x85\x91\x05\xb5\xcf\x9a\x74\x52\x25\x31\xd6\x18\x6e\xb5\xd1\x84\xe7\x20\x93\xce\x2a\x6d\x98\x49\x53\x7e\x6e\xf1\x6a\x82\xfa\xf5\xa4\x81\x46\x9e\x7e\x1e\x3b\x09\xac\xcb\x9a\xa9\x39\xdf\xd1\x2f\xbc\x4a\xb9\x8c\x49\x16\x03\x00\x0f\xa9\xf7\xe9\xa5\x2f\x3c\x1a\xb4\xee\x84\xb6\x9e\xe9\xb8\x0b\xff\xed\x62\x1a\x04\x12\x7d\x55\xa4\x4e\xab\x75\xaa\xbd\x40\xfc\x73\x0e\x58\xac\xf5\x54\xe6\xe1\x5f\x1a\xc8\xdd\xe4\x8e\x10\x27\x5a\xd5\xd8\x7c\x6f\x51\x42\x3e\xcd\xc3\x5c\x07\x2c\xc4\xb9\xa9\xac\x75\xf5\x49\x7f\x52\xa5\x22\x6b\xa6\xab\xfb\x53\x7f\x05\x8d\x3c\x13\x62\x2c\x33\xc8\xe3\xaa\x71\xd1\xcc\xf4\xaf\xdc\x22\x31\x50\xa3\xe5\x12\x9e\xe4\x2e\x98\x79\x9a\x38\x9c\xb4\x6c\x22\xe6\x6f\x1d\x35\xd1\xe7\xd6\xad\x27\x27\x9d\x98\x27\x89\x1a\x15\xe4\xfc\x03\xfa\xab\x1a\x27\x1a\x8a\x3f\x59\x91\x5f\x82\x00\x47\xc8\x64\xd7\xdd\xeb\x7b\xd6\x7b\x77\xd5\xea\x14\x11\xb9\x5a\xad\x6c\x71\x44\x1c\x91\x9e\x35\x71\x3f\x5c\x73\xbd\xec\xba\xa7\xcc\x75\x6b\x7c\xf6\x59\x50\x8f\x78\x5e\x70\xdf\x68\xb7\x58\xa3\xc2\x23\xc7\x4c\x69\xfd\xbe\x49\x8e\xa4\xf5\x37\xa5\x84\x59\xe9\x8a\x63\xe6\x2a\x99\xe2\x26\xa1\x77\x21\x31\x55\x5f\x52\x6c\x05\xd1\x7d\x1e\x4a\x33\x34\xdb\x20\x86\xb8\x37\x88\x98\x17\x7f\xa4\xe6\x28\x9f\x3f\xd9\x15\x06\xf3\x7f\x2e\x44\x40\x3d\x79\xfc\x6d\x28\xfa\x6c\x40\xf2\x5d\x8e\x62\xe2\xf0\xe0\xd3\x76\xaa\xca\x36\x24\x04\x8a\xd0\x31\x4c\x31\xcb\xfd\xc6\x71\xd2\x19\x29\x2d\x6a\x4c\xd2\x11\x01\x12\xdb\x85\x28\x44\xda\xa0\x3d\x4a\x9e\x93\xb2\x8e\x33\x37\xb2\xd2\x56\x75\xdb\x32\x32\xeb\xd9\x27\x4c\x8d\x52\x35\xe5\x84\x2e\xe5\x80\x3e\xf0\xac\x5a\x3c\xc9\x87\x51\xd8\x57\x01\x39\x81\x10\x13\x87\x67\xb3\x19\x7f\x8f\xa2\xb1\xb8\xd1\xdc\x65\x47\x94\x20\x8c\x4a\xbd\x49\x10\xd4\x4e\x88\xf8\xa8\x77\x39\x7f\x57\x6a\x02\xff\x00\xb0\x00\xca\x11\x70\xb2\xb4\x4e\x85\xf2\x82\xc9\x95\x5f\x92\xfb\x53\x6b\x24\xc9\xfb\x95\xb5\xa4\xdf\x54\xb9\x64\xe3\xe6\x72\xf1\x36\x4c\x89\x2b\xab\x27\x22\x56\xf5\x7a\x5e\xa9\x6d\xb7\xd0\x5c\x99\x5a\xbc\x14\xf8\xb4\x98\x5d\x0f\x91\x06\xbd\xa2\xb2\xab\x5c\x9e\x27\x31\xa1\x71\x32\x7d\x87\xd2\xe2\x56\xe5\x16\x32\x0d\xe0\x18\xe4\xd4\xa2\xfe\x3b\x04\xbc\x43\xea\x31\x6e\x49\x1d\x74\xba\x8b\xaf\x42\xcd\xf3\x55\xde\x18\xee\xfe\x31\xcd\xfc\x6d\x22\x5b\xb9\xe1\x68\xc7\xbf\x4f\x3b\xe2\xa0\xf4\xe2\x04\x17\xa5\x12\xff\x5c\x4a\x84\x74\x37\xc1\x46\x64\xd4\x55\xa6\xe3\x17\xdc\x60\xce\x4d\xe3\xa3\x15\x1d\x74\xb2\xc6\x5a\xd9\x48\x05\xbf\x57\x5e\x55\x58\xa8\xe3\x03\x48\xc6\x3d\xc9\x2f\x74\x90\x48\x23\xc3\xce\x25\xe2\x08\xa0\x09\xf4\x4e\x76\xec\x94\x5c\x4b\xae\x26\x7d\x2f\xb6\x7c\x2c\xf7\xf2\xc7\xed\xd1\xc9\x25\x20\x2a\xf2\x38\x0c\x49\x9a\x85\x03\xe4\x58\xa7\xad\x0e\xf0\x98\x8f\x42\xaa\xa4\xfd\xb0\x59\x0a\x50\xda\xfa\x55\x62\x31\xbc\x52\x22\xf7\x72\xd2\x6f\x32\x21\xbe\xcd\xa4\x52\x6c\x12\xbd\x00\xdd\xd6\xf8\xf2\x03\x24\x9b\x8e\x21\x08\xa1\x73\x81\xa4\x83\x43\x14\x2b\x2d\x14\xa9\xc8\x33\x51\x5d\x4b\xb0\x5c\x83\x42\xba\x7d\x66\x0f\xfd\x82\xd1\x92\x68\xce\x6d\xf5\x19\x69\x3e\x89\x06\x9f\xba\xe4\x42\xa1\xcb\x8c\x9a\x94\x10\x9a\xe8\xd5\x29\x82\xfa\x99\xcf\xad\xc2\x3b\xc1\x77\xa8\x1d\x31\xa9\xcd\xce\xb8\x10\xf2\x9b\xdd\x88\x25\x99\x44\xe1\x1c\xd5\x1c\x6e\x91\x0f\xa0\x40\x09\x44\x1d\x7a\xd1\x6e\xa6\x2d\xf3\xb7\x2f\x51\xf6\xe0\xbb\x21\x95\xdc\xef\x74\xe4\x58\xf4\xd9\x27\x70\x9d\x81\x3b\x7e\x15\x4b\x6e\xd5\x95\x73\xd3\x3e\x2a\x40\x61\xa6\x5a\x3d\xd3\x3b\x4e\x07\x5a\x62\x29\x0a\x11\x16\x0d\xdf\xfb\xaf\x47\x8a\xca\xc2\x54\x83\xcb\xe4\x81\xca\x79\xd7\xc2\x31\x37\x2c\x7e\xf6\x6a\x7b\x3f\xb3\x4e\x93\xd5\x37\x9b\x43\xb0\x7d\xcf\x57\xa7\xc0\x0b\x42\x63\xa9\x5f\xec\x17\x6b\x81\xba\x34\xc4\xbe\xaa\x71\x4f\xa3\xf4\xcf\xcd\xf9\xca\xc3\xf1\x6b\xc4\x7a\x16\x01\xe6\xaa\xc1\xa3\x0f\xa3\x04\x1b\xcb\x96\xfe\xe2\x51\x3b\x44\x74\x8c\x5e\xe6\x77\xde\x9a\x81\xa2\x19\x59\x9d\x84\xda\x28\x3c\xb3\x81\x8d\x5e\x11\xf1\xd0\xad\xa8\xd2\x61\x94\x63\x14\x6e\x8d\x53\xc6\xad\xf5\xbf\x32\x35\xfb\xf8\xba\xf2\xe8\xaf\x1e\x46\x0e\x0c\x09\xcf\xff\x5a\x13\xfa\x3f\x92\x27\xd5\x70\xfd\xb9\x78\x32\x1e\x7f\xf7\x30\xc3\xdf\xae\x3c\xf0\xad\x6c\xdf\xb5\xd8\x67\xa3\x62\x49\x59\xaa\x0e\x67\xd7\xab\xe9\x57\x68\xeb\xd6\x11\x63\x40\xed\xae\xf3\xf4\x36\x10\xa5\x51\x54\xb7\xc0\xfa\x01\x6b\x3d\xae\x6e\x79\x4f\x27\xc8\xe9\xe4\x4e\x6c\x15\x39\xa9\x5d\x59\x14\xe4\x39\x72\x39\xe8\x40\x12\xa4\x98\x0a\x02\xfa\x16\xd9\x4b\xbf\x33\x19\x95\xcf\xfa\xdb\x70\x77\x4c\x75\xde\xb6\xd9\x07\xe9\x1e\x9c\x72\x03\x24\x45\xd4\x50\x7f\xca\x63\x71\x6b\xf5\xb1\x90\x11\x46\x61\x6e\x46\x11\xd7\x7e\xe1\x1e\x8c\x9d\xb7\xb8\x8a\x1d\x27\x26\x32\xc5\x91\x1e\x10\x1c\x77\x22\x06\x30\x2b\x6a\xec\x28\x76\xfa\xd4\x91\xa6\x04\xb1\xbb\xe4\x58\xf2\xd2\x8a\xd5\xd2\x6a\x59\x5e\xb2\x14\x9e\xda\xf3\xc1\xe0\xb1\x06\x41\x6e\x1d\xf6\xd8\xad\x91\xf6\x3b\x4c\x62\xcc\x3f\x03\xe1\x14\x04\x60\x5e\x56\xab\x59\x46\x42\x1b\x53\xe0\x05\x22\xe7\x96\xcf\x62\x9d\xd7\x5c\xd2\x52\x13\x23\x37\x87\x2d\x0d\x91\xb2\x29\x44\xa2\xd4\xb1\x59\x8b\xaf\x43\x19\xd6\x77\x27\xa0\x83\x75\xbb\xb3\x88\xca\xa4\x27\x6b\x4c\x75\x69\x15\x30\xfb\x16\xce\xdc\xe0\x1e\x27\x03\x98\x39\x1c\xe3\xd3\x8f\x95\xe3\x57\xab\xec\x62\x10\xfd\x5c\xb1\xcb\x30\x94\xd1\xa1\xd1\x26\x7b\xf4\xd9\xb9\x59\xd6\xd3\x33\x7a\xa6\x35\x36\x39\xc2\x1a\x6f\x37\xb7\x90\x5f\x01\xb9\x2e\x58\xd2\x67\xf3\x1b\xb6\x79\x10\x16\x99\xb1\x0d\xfb\x86\x97\x55\x29\xd6\x9d\x1e\xe4\xbc\x64\x7e\xb4\xc2\xca\x7d\xcf\x83\x42\xb2\xf7\x11\x67\x07\x4e\x74\xe3\x72\x2c\xb5\x3c\x34\x31\x7c\x9e\x5a\x91\xeb\x5e\xca\x24\xde\x61\x6f\x47\x34\x8f\xa6\x39\xdd\x64\x8f\xa5\x2b\x8b\x59\x48\x77\x39\xeb\x4d\x4e\x65\xb0\x40\x7e\xb7\xda\x7e\x59\x31\xbc\x96\x16\x48\x84\xad\xd5\x80\xa2\x32\xf1\x37\xcf\xdb\xf3\x75\x1f\x32\x3b\x9f\x3f\x7b\x73\xca\xdf\x94\xfa\x9a\x64\x64\x87\x18\xcd\x63\xdd\x26\x78\x38\x9d\xd1\x71\x10\x18\x0f\x9b\x40\x6a\x8a\xb8\x33\xc0\xb9\x1e\x3d\x73\x6d\xd9\x61\xef\xed\xbd\x6e\x36\xec\x3f\x93\xe7\xe6\xac\x11\x06\x3d\x8f\x9e\x4d\xba\x01\x3a\x93\x0d\xbe\x33\xa2\x3a\x23\x5e\x9c\x99\x0a\xad\xe9\xc9\xdc\xe9\x25\x29\xe3\x88\x1a\xad\xf9\xa6\x55\x84\x67\x2f\x9a\x8d\x5b\xd3\x74\x64\x52\x4e\x55\xcb\x4d\x14\x5d\xf5\xb6\x64\xaa\x77\x28\x3e\x61\x53\x83\xc6\xce\x8c\x27\x68\x6c\x27\x65\xa1\xd9\xb7\xc7\xee\x6b\xa5\x49\xe6\x14\x84\xf0\x87\xc5\x1e\xe7\x83\x2f\x00\x61\xcc\x4e\x18\xb2\x35\x17\x87\xf5\x7c\xf6\x79\x2a\x3c\xea\x8a\x01\x78\xa1\x95\xa2\x4c\x1c\xbc\x92\x11\x0c\x63\x6b\x9b\x35\x60\x1a\x35\x7f\x37\x51\xf7\x36\x91\x17\x9a\x6f\xd2\x6a\xd1\x04\xf8\x29\xb8\x17\xd2\x17\xe0\x44\x8e\x1e\x4e\x96\x2c\x59\xa8\xa1\x36\xc5\xa8\xb0\x57\x65\x62\x37\xc4\x14\x04\x07\x04\xd2\x76\x4c\xef\x15\x56\x03\xee\x55\x2e\xa5\xfd\x87\xf6\x49\xeb\xf6\x4f\xd6\xe7\x18\x83\x7f\xf0\x24\xff\xae\x39\xc0\x63\x5b\x06\x7a\x1d\x34\x68\x48\xdb\x1b\x85\x1e\xda\x65\x5e\x5e\x91\x13\x41\x0c\x26\xf7\xea\x7e\x1d\x50\x87\x8f\x11\x29\x2b\x11\x6c\xd9\x76\x0b\x44\xf3\x83\x72\xd7\x68\x74\x47\x9a\x3b\xfe\xa4\xd9\x80\x51\x47\x09\x77\x15\xfb\x55\xca\xc8\x79\xbe\xef\xa2\x8a\x37\xb1\x5a\xf6\x30\xb0\x41\x2f\x49\x12\x43\xbe\xa9\xa2\x30\xe4\xc9\x73\xb4\xf9\x0e\xee\x4b\x7e\x00\x8b\x57\xb6\x2e\xd1\x55\x81\x82\x3a\x23\x88\xc0\x82\x37\xe0\x84\x9a\x74\x49\xcf\xa2\xe1\xcd\x2d\x58\x9a\x23\x40\x63\x90\xa6\x3a\xa9\xd6\xe0\xe9\x38\x1f\x2f\x7c\x05\x4b\x52\xcc\x87\x11\xe5\xb9\xce\xab\x88\x76\x27\x4f\x0a\x67\x3b\xe7\x16\x1b\xbd\x96\xd6\x05\x8e\x9a\x8e\x1d\x6e\xa1\xdf\x31\x13\xaf\xef\x75\x53\x5f\xd1\xf8\x13\xa8\x61\x94\x85\x9a\xe2\x21\x92\xeb\x90\xb0\xb3\x04\x63\x28\xc8\x15\x6c\x61\x33\xec\xb3\x26\x27\x70\xd6\xeb\x14\xce\x21\xb5\xdf\x06\x56\x36\x0b\x6c\xcc\x47\x2d\xcf\x78\x26\xda\xa1\x78\xa4\x2e\x09\x5c\x36\x16\x50\x29\x74\x62\x2e\xf0\xab\x2b\x9a\xe1\xdb\x81\x5e\x0b\xbf\x1e\x29\x52\xe2\x6e\xdf\xee\x39\x8f\x54\xa2\xd9\xb2\x56\x80\x99\x75\xac\x67\xe3\x51\xf0\xa8\x6e\x7b\xa7\x1f\xd0\xf4\xf4\x41\x34\x25\xf3\x90\x45\x93\xb9\x37\xcd\x8e\x1e\xed\xdf\x5e\x5d\x0c\x09\xc8\x06\xaa\x92\x6a\x93\xfc\x13\x39\xd2\x6b\xfb\xa4\xb5\x5c\x87\x14\x9f\x36\x23\xf3\x46\xa2\xb0\x31\xf1\x9e\xfa\x0e\xa5\x5b\x22\x80\x5a\xd0\xf7\x7b\xcd\xe7\x5e\x76\xb2\x4e\x37\x61\x89\x63\xa7\xe4\x17\x5c\xf4\xb6\x74\xfc\x38\xa9\x49\x4e\x02\x79\xa2\x28\xb1\xb8\x6b\xbb\xde\x26\x24\x5d\xdf\xfc\x9a\xc6\xb8\x9e\xe1\x8e\xed\x20\x88\x22\x34\x22\xcf\x7e\xac\xf3\x56\xb4\x10\x19\x27\x75\x01\x4e\x60\x38\x49\x28\xeb\x27\xa7\x18\x67\xac\xd3\x29\xf7\xe6\xbe\x20\x36\xac\x59\x1f\x27\x7d\x08\x01\x47\x93\x88\x88\xd1\xa4\xb7\x09\xdc\x0d\x08\x98\xad\xd3\x0f\xad\x2a\xca\xf3\xc1\xcf\x14\x22\x8e\xa5\x88\xd9\x08\x6c\xec\xdb\xcd\x47\x52\x1e\x12\xca\x89\x5f\xea\xba\x25\x47\x23\x0d\x9a\x0c\xa8\x03\x29\x26\x9f\x84\xde\x22\x7f\x02\x3a\x81\x23\x45\x61\x99\x51\xac\xc9\xcd\xe0\x23\x54\x0b\xd5\x81\xd0\x3d\x7e\x7d\x80\x1a\x87\xb7\xb0\x8b\xc3\x2a\x3f\x91\x7c\xf0\x39\x77\xfc\x68\x47\xe7\x0f\xb5\x08\xea\x24\x03\xaa\x9b\x86\x44\x98\x85\x9b\x48\x87\x12\x2f\x31\x9c\xdc\xad\xa0\xec\xb7\x8c\x51\x4b\x9c\xf1\xd4\xc9\x80\x56\xa5\xd3\x88\x55\x8e\xbd\xab\x24\x23\x3f\x6a\xbe\xa9\x44\x0b\x9e\x72\x6d\x01\xde\x0d\x08\x83\xc3\xaf\x92\x81\x55\x0f\x78\xbd\x3e\x7a\x4a\x0c\x8f\xfb\x26\x5a\x73\xe1\xda\x83\x8a\x90\x6a\xa7\xfe\xe4\x51\x29\xf4\xb8\x77\x2a\x14\x14\x40\x92\xd9\xff\xda\x89\x50\x48\x9a\xee\xc6\xba\xb7\xaa\xce\x07\xda\xfd\x0f\x65\x43\xf3\xe7\x22\x43\xe6\xfc\x7d\x45\xb3\xff\x69\x37\x44\xdb\x53\x05\xdd\xb3\x0a\x1d\x47\xb0\x2e\x50\x73\xaf\x01\x3b\x00\x3e\xc3\x3b\x1e\x85\x0a\xc4\x43\x90\x6c\x85\xfa\xdf\x8f\xa0\x38\xef\x87\x0a\x64\x98\xc5\xd2\xe1\xf4\x4c\xec\x68\xc6\xca\x1d\x45\x6a\x25\x9a\x99\x9d\xda\xfe\x33\xc4\x21\xca\x43\x4e\x49\xc4\xac\x7c\x81\x87\xb0\x7d\xde\xae\xe5\xd5\x83\x08\x4b\xc3\x42\xb5\x91\x34\x4c\x42\x71\x05\x80\xe1\x15\x86\xaf\x3d\x5c\xb2\xf0\x2e\x26\x07\x9d\x15\x12\xd2\x8c\xf6\x83\xf3\x4f\xf4\x3b\xde\x68\xae\x0e\xcd\x0f\x99\x47\xc3\xad\x23\xa3\xd1\xf2\x07\x55\xa3\x26\x36\xce\x4d\xe1\xe3\xa9\xee\x67\xaa\xae\xc7\x16\x5d\xb1\x1d\xad\x56\xfc\x7f\xec\xbd\x79\xef\xe2\xc8\xb2\x20\xfa\x55\xd0\x48\x57\xf5\x46\x0c\x78\xdf\xde\x53\xff\xe1\x1d\xe3\x05\x2f\x78\xe3\x9f\x2b\x6f\xd8\xc6\x1b\xe0\xdd\x9f\xfe\xc9\xe6\x57\x55\x7d\x4e\x77\xcf\x39\x57\xb7\x47\xea\x91\xba\xc4\x2f\xcb\x64\x46\x46\x46\xc6\x96\x11\x81\x31\x6f\x42\xce\x9c\x74\xe1\x87\xd1\xc5\x8b\x37\x4b\xc1\x3c\x5e\xa0\x72\x4c\x85\xe7\x0e\x23\xce\x0e\x36\x08\x32\x2c\xdf\x4d\xc3\x74\xf6\x26\xad\x16\xcb\x94\x96\xbe\x04\x99\x01\x37\xc3\xb1\x0b\xbd\x9f\xae\xf9\x30\x1a\xcc\x11\xf3\xc8\x97\x9a\xb7\xeb\x34\x8d\x30\x18\x0e\xcb\xd2\x0f\x91\xbc\x54\x23\xa4\xa6\x22\x49\xab\x60\x6f\x31\x36\x67\xd5\xec\xbd\x00\x24\x91\x3d\x8d\x77\x84\x63\x39\x80\xb0\xb3\x8b\xc2\xbc\x85\x82\xeb\x93\x27\x90\x71\xb6\x65\xb1\x03\x94\xfb\x0d\xfa\x96\xee\x2f\x71\xac\x6c\x4b\x3b\x3f\xee\x7e\xc8\x44\x86\x9c\xdd\x46\x30\x60\x54\x1a\x65\x50\x52\x19\x99\x8c\xe9\x80\xe8\xa2\x91\xe0\xa9\x52\x29\xcd\xc0\xef\x5e\x0a\xb8\x65\xd1\xa3\xd7\xb1\xd2\x5c\x6e\x09\x8c\xd7\x72\x12\xf7\xa0\x6e\xc9\x4d\x8c\x45\x27\xcc\xc9\x60\x33\xa7\x33\x5f\x8e\x48\xae\x74\x20\x5b\xb7\xe6\x5e\x50\xc5\x39\x75\x4a\x35\x85\x00\x1d\x67\x58\x9c\x7b\x79\x86\x4c\x3e\xb4\x1b\xe7\xd1\x3e\x0d\xdd\x61\xc8\x41\xd0\x51\xf5\x7c\x21\xc8\x67\x67\x04\xdf\xe7\x79\x51\xd2\x16\x71\xd4\x62\xba\x3c\xc4\x2e\x9f\x00\x07\xf4\x5c\x36\xbb\x81\x91\x04\xe7\x40\xbc\x0c\x5e\x7c\xbf\xc6\xa0\x71\xa7\x20\x46\xd5\xdf\xd9\xac\x2d\xa9\x7c\xbf\x54\x53\xe0\xce\xcf\x57\xc0\x79\xa7\xed\x11\x84\x1d\xab\x90\xde\xe5\x2e\xa0\xc4\x9f\xfb\x80\xb1\xec\xaf\xf6\x95\xa2\x24\xfb\xf5\x57\xf4\x06\x10\xa4\xed\x93\x0c\x78\xf2\x1d\x9a\x6f\x31\x6f\x39\x26\xe3\x3d\x4c\xcb\x14\x5e\xaa\xe1\x30\x34\x26\x45\x98\x84\x70\xf5\xc8\x03\xe9\xb3\x56\xea\x59\x44\x94\xd4\x4b\xcb\x09\xb5\x39\x4e\xb9\x59\xa0\xe9\x16\x9c\x92\x9b\x93\xd5\xb7\x05\xd5\xe3\xa2\x67\x25\x55\x58\x29\xa9\x7b\x0b\x3d\x62\x0f\x87\xf5\xad\xa4\xe0\x2a\x05\xd3\xa6\x41\x42\xe4\x7e\xbf\x00\x75\x14\x0f\xf3\xfd\x71\x4a\xee\xf8\x0b\xe6\xca\xa1\x25\x0d\xb8\xe8\x96\x37\x84\xef\x2d\x05\x07\x1f\x59\x76\xc3\xa9\xf0\x42\x7a\x24\x5b\x2a\x2c\x31\x52\x5e\x2c\x9f\x1d\x91\xbc\xf7\x2a\xf8\x86\xdc\xf7\x59\x44\x53\xef\x91\xbe\x6c\x88\x03\x55\x31\x82\x0b\xe6\x3a\x77\xe5\x9e\x08\x28\xaf\x72\xa3\x12\x92\x18\x20\xbb\xc9\x7c\x16\x45\x2f\x2c\x38\x9f\x81\x04\x09\xaf\x3d\xe1\xa6\x10\xeb\x34\xc4\x5b\x53\x4a\x33\xb3\x33\xb4\x51\x6b\xaf\xe1\x9a\x39\x6b\x4e\xe2\xec\x56\x76\xb2\x37\xec\x90\x57\xa4\x80\x70\x49\xf6\x41\x0b\xa5\xba\xc4\x4b\x12\x15\xec\x28\x68\x20\x4e\x5f\xe9\x9a\x34\x2a\x4e\x55\x55\xb1\x54\xfb\xd1\xed\xa3\x67\xc3\x9e\xb4\x04\x7d\x30\x05\xad\x26\xf5\xc3\x1f\x4c\xfd\x3a\xe7\x18\x72\x1e\xfa\xd1\x23\xe9\x67\x59\x26\x74\xc2\x44\xa6\xf0\x3e\xe1\x6f\x4f\x9a\x94\xbc\xa2\x24\xe0\x99\x23\x06\x0d\x99\x99\x1c\xf8\x53\xfc\x28\x34\x52\x1a\x83\x92\x55\xa5\xd1\x6d\xa9\xf2\xa1\x16\x19\x38\x2e\xc5\x9e\x52\x89\x11\x22\x28\x16\x51\x6e\x9a\x37\x0d\x09\x9c\xed\x23\xe4\xd4\x53\xd0\x29\x91\x2b\x0e\xc0\x97\xd3\x45\xa9\x47\x12\xc9\x4b\x06\x02\x1c\x90\x4d\x5e\x36\x62\x90\x90\xc2\x02\x17\x14\x0a\x61\xa6\x9b\x60\x0d\x3e\x3b\x3a\xfc\xce\x4d\x32\xb9\xda\x53\x95\x83\xd7\x85\x19\xdf\xf2\x4d\x6d\x5f\x6a\xb3\x90\x6a\xcb\x65\x00\xe7\xf6\x6e\x66\x33\xb2\x6d\x2a\xf2\x64\x48\xc9\x45\x75\x9b\x67\xe7\xeb\xb5\x05\x45\x7b\x49\xbb\x31\xc5\x28\x59\x4d\x75\xb1\xda\x8a\xb9\x59\x04\xb3\x47\xdc\xcb\x72\x1b\xde\xb2\xb8\x14\x2a\x9d\x8b\x2f\x6d\x26\xd2\xbd\x52\x99\x85\x79\x4f\x0a\xa6\xa6\xb5\x19\x86\x70\x44\xbf\x79\x6f\x2b\x7c\x1b\xf8\x10\x65\x10\xe5\x2d\xe4\x5d\xe7\x4e\xb3\x82\x50\xc6\x52\x9c\x18\x39\x89\xbd\xc7\xbd\xdf\xcf\x08\x4d\x8b\x36\x42\x48\x1a\x73\xee\x9a\x3f\xf5\x01\x5d\x59\x57\x95\x7f\x2d\xa3\xab\x7e\xf5\xdc\xda\xe2\x2b\x7c\xad\x7c\x1c\xc4\x82\x7d\x96\xdd\xae\x8c\x26\x9b\x1c\xfd\xd4\xde\xae\x64\xd2\x68\xcd\x33\xf6\x2d\xae\xd8\x54\xd1\x72\x54\x95\xb1\xfb\x5e\xd0\xe2\x1e\x09\x85\x01\x3a\x43\xbc\x77\xe1\x58\x13\x3a\x9f\x2d\xf5\x3a\x3e\x5f\xb6\x8e\x6b\x39\xfb\x4c\x20\xf0\xf6\x58\x90\xec\x81\xa9\x15\x92\x5b\x73\x58\x22\xc4\xa3\xbe\xef\x23\x0c\x79\x54\x5c\xa8\x3d\x73\x2a\x09\xf7\xb8\xd0\x45\x79\x9b\x04\x14\x48\x85\xae\xb6\x68\x21\x1e\x8f\x8b\xe5\xc9\x45\x26\x75\xc0\x1b\x42\xf7\x18\x84\xbd\x98\x57\xc5\xd1\xe4\xe9\xf9\x92\x83\x34\xc3\x10\x2f\x68\x9e\x61\xf9\x94\xc2\x64\x5f\xd4\xdc\x53\xa0\x33\x3d\x08\x61\x6e\x04\xaf\xf2\x60\xca\x44\x59\x69\x17\x6e\x49\x74\x26\xbd\x95\x32\xd5\xd8\xae\xf5\xac\x1c\x2d\x7e\x4a\x36\x79\xdd\x3f\x02\xb5\x9d\xd5\x80\x43\x55\x2e\xba\x39\xc1\x5e\xcb\xce\xaa\x06\x82\x23\x58\xe3\x0e\x5c\x6b\xc8\x6c\xa4\xf1\xc9\xbd\x05\xe9\x5e\x59\x7c\xfd\xda\x54\x12\xdd\x5d\xc1\xeb\xc9\xe9\x74\x31\xa8\xab\x10\x60\xc2\xc7\xa8\x08\xc5\x50\xc3\x52\xd7\xf9\xa2\xff\x2c\xe5\x99\x5b\xda\x53\x46\xa4\x71\x35\xd3\xee\x3d\xc3\x16\xe7\x05\x8a\x7d\x96\xa2\x26\x7d\x12\xec\xac\xba\x0f\x2f\xe4\x01\x21\x68\xe0\x35\x64\x18\xef\xa5\x6b\xad\x0a\x97\x4b\x33\xd8\xd8\x23\x14\xcd\xe6\x36\x6a\x93\x50\x43\xd1\xd4\xd3\x52\xc4\xb9\x40\x7b\xe3\x1e\x34\x10\xa1\xfd\x9e\xd1\xa6\xcb\x79\x9e\x5e\x41\x52\x3f\x25\x64\x21\xc9\x54\xbd\xeb\x35\x75\x1a\x28\xf2\x64\xdc\x2c\xdc\x0c\x16\x17\x2f\x1e\xfc\x34\x08\x39\x79\x15\x63\xce\x9a\x01\x17\xe4\xab\x3b\xaa\x58\xb8\x49\xb6\x03\x04\x31\xd5\x7d\xb1\xc6\x42\x8f\x2a\x02\x3d\x37\x14\x9f\x83\xe2\x2d\xad\x8a\x91\x34\xd8\x4b\xd0\x90\x17\x2f\x0a\x16\x00\x1b\xac\x5b\xad\xc7\xf5\x13\xa1\x9f\x2f\x86\x51\x0a\xf7\xcc\x83\x6c\x4e\xd0\xd6\x12\x4a\x19\xab\x28\x06\xc4\x83\xf9\xa5\x60\xb8\x8c\xd2\x9e\x76\x9a\xdb\xc9\xa3\x21\x1b\xad\x3f\x8f\x73\x0d\xfa\x3a\xcd\x74\x35\x06\xd9\xbe\x20\xe4\x83\x88\xcc\x8c\xc8\x6a\xb7\xa2\xe7\xba\x08\x50\xdd\xfd\xcd\x90\x90\xcb\xdb\x7f\x32\x01\x6d\xb2\x72\x7f\x2f\x10\x06\xf3\xa4\xdc\x9d\xb3\x5c\xc1\x2e\xdc\x93\xdc\x0b\x77\xe1\x74\xda\xcb\xb9\x6c\xbd\x5c\xd9\x56\xc8\x3b\x0b\x68\x4b\x2d\x96\x3a\x53\x2d\x7b\x18\x8d\x6f\x0f\xb9\xe6\x40\xf6\xcc\x45\x6a\x33\xbb\xa0\xf5\xf2\x7a\xb5\x3b\x31\xc2\x48\xbc\x33\x89\xe6\x20\xfe\xad\xd9\x5a\x70\x9f\x64\x46\x4b\x86\xe0\x39\xf6\x38\xa6\x3d\x79\x03\x15\x5e\x9e\x44\xef\x4d\x35\xc6\x9d\x91\xd1\x91\x48\xb7\x78\x33\xc4\x53\x45\x12\xa4\x17\x0e\xed\xed\x97\xe8\x06\x42\x1c\xbd\x9d\x0e\x28\x2b\xba\x77\x1f\x74\x0e\x07\xb9\x2a\x8c\xd5\xc5\xef\xa5\x33\xa0\xe1\x2a\x4c\x0e\xa3\xa4\xd2\x6a\xa3\x71\x73\x8a\xbe\x23\x9b\xfa\x33\x9d\x42\x1e\xfd\xc5\x3e\x66\xcb\xcc\x5f\xf9\x04\xe1\xc7\x77\x7b\xe3\x77\x40\x84\x8a\xf6\xcc\x61\x7a\x32\x04\x39\x28\x8b\xf3\xbb\xc9\x24\x36\xf7\x0b\x4f\x0f\x52\xef\x3d\x11\x24\x77\x47\x65\x94\x14\x39\x66\xa9\x8c\x44\x57\xd4\xcc\xbe\x70\xda\x64\x60\x51\xce\x17\x67\xe7\xc5\x75\x67\xb1\x52\xdd\x37\x4b\x5f\xcd\x30\x86\x93\xa8\xb1\xb0\x1e\x09\x9a\xa1\x4a\x96\x76\xe8\xa9\xed\x96\x64\x3d\x97\xcb\x4c\x42\x3d\x85\x88\xe0\x37\xe6\x2b\x24\xa4\x48\xbc\xc2\xa7\x99\x42\x23\x3d\xd0\xc7\x53\x75\xaa\xf5\xea\x2e\xba\x80\xdb\x0f\x7b\xe5\x39\x8e\x71\x9d\x98\x3e\x33\x11\x7a\xe2\xca\xe0\x78\xf1\xfd\x2c\xf2\xa6\x39\x2a\x44\x07\xba\xc7\x61\x1d\xf6\x6a\xeb\x45\x45\xf9\xd2\xcd\xb3\x31\x09\xaa\xbc\xa0\xe6\xc4\xb1\x9d\x73\x41\x5b\x64\x2a\xcd\x87\xdb\x30\xa0\xe0\x3f\x4a\x43\xe7\x79\x26\x4f\xd8\x6c\x94\x59\x53\x54\x27\xac\x57\xba\x40\x6e\x21\x1d\x4b\x72\x52\x92\x4b\x31\x00\xfc\xc2\x53\x3d\xbf\x2b\xaf\x3c\x57\xb6\xf5\x08\x54\xaa\x97\x31\xe7\xe8\x35\x59\x32\x3e\x94\xd1\x33\x40\x75\xfe\xc9\x36\x8d\x3d\x4b\xaf\x16\x53\xf1\x4c\x84\x1a\x98\xb5\xc7\x17\x0d\x52\x50\x24\x44\xbe\x72\x07\xda\xc7\x12\x79\x04\xc6\xe7\x86\xd4\x3c\x24\x8a\x20\x28\xf6\xea\x9b\xe8\x63\xbc\x32\xf7\xfd\x9b\x10\xe9\x31\x03\xe9\x89\xcd\x15\xfc\xac\x5e\x01\x10\x1d\x0c\x82\xea\xc9\x40\x82\x2f\x00\x71\x5e\x52\x9c\x6a\x70\xb1\x21\x93\x71\x8e\xec\x20\xeb\x98\x27\xcd\x65\x27\x59\xa9\x65\x20\x71\xc2\x42\x8d\x3b\xf3\xe2\x4a\x03\x09\x6a\x06\xdc\xea\x59\x1d\xd1\xd4\xa9\x1b\xeb\x3d\x95\xdd\x44\xf0\xed\xe3\xdc\x22\x8c\xe7\x72\x4f\xc4\x59\x0b\xde\xda\xce\x9e\xc9\x77\xdc\x8f\xba\x05\x8c\x31\x90\x64\x55\x8e\x14\xe3\x0b\x5d\xae\xa7\xdc\xb5\x53\xef\xb9\xe7\x7b\x85\x14\x06\x6d\x10\x4a\xcc\xac\xd1\x89\xb6\x48\x3c\x9f\x25\xb8\xf0\x91\x1a\x54\x07\x94\x64\xe6\xf7\xc5\xa8\x82\x3a\x8a\x73\x52\x02\xe5\xe8\x81\xd8\x58\xde\xd3\x30\x35\xd1\x49\x29\xb3\xf6\xe9\xcd\x4b\xc1\xbc\x94\x5d\x90\x8a\x30\x8f\x4a\x63\x21\x04\x46\x6a\xb1\x78\xe9\x4b\x20\x95\x6b\x60\x4c\x4a\x1d\xd6\x6b\x0e\x56\x8b\x58\x9b\x9e\x63\xd9\x67\x41\x91\x74\x9b\xeb\xe5\x36\x30\x92\x25\x68\x3c\x33\xd5\x6d\xbf\x70\x88\xe8\xa1\xc3\x9d\x6b\xdb\x65\x79\xd1\x3d\xf8\x28\xce\x06\x97\xc4\xac\x18\x32\x38\xed\xa6\x18\xfa\xf4\x43\xbd\xd9\x6b\xa2\xa3\xc7\xd7\x94\xe6\xe9\x97\xf1\x22\x40\x7d\xee\x24\xe5\xcf\xfd\x2e\x7e\xde\x36\x7f\x2d\x7b\x7d\xfc\xfc\x58\xbc\x68\xbb\xb7\x0d\xf2\xf6\xf4\x06\x0a\xec\x15\x9e\x97\x58\xf7\x9f\x62\xf1\x6c\xed\x73\x43\xc3\x2f\xa8\x51\x1e\xd7\x38\x17\x73\x89\xc5\xa2\xde\x3b\x95\xd3\x40\x31\xfc\xe5\x6d\x75\xd7\x81\xa9\x8d\xc1\x7c\x5b\xb4\xd4\x26\x0f\xf6\x5d\xbe\x9e\xad\x6d\xbe\xe0\x8c\x3d\x6b\xc6\xfe\xaa\x29\x15\xd6\x47\xc0\x84\xa8\xd5\x72\xce\x10\xb4\xe2\xb4\x7a\x18\x6a\x6d\xb9\xf0\xa8\x28\x5e\xc6\x89\xdc\x77\x94\x67\x14\xf7\x1a\x74\x78\xd0\xc7\x00\xe2\xb6\x2f\x4e\xd5\x3e\x1e\x2e\x59\x17\x23\x3a\x15\x01\xd3\xa8\xdd\x32\xa2\x76\x03\xd5\xef\x34\xbb\xf2\x00\x21\xea\x80\xa1\xd4\x08\x80\x3c\x63\x81\x69\xa6\xf3\x52\x91\xd3\xf2\x34\xb9\x87\xc8\xc3\x81\x73\x42\x9d\xeb\x2b\xae\x1b\xdb\x4f\x01\xaf\xe0\xb3\x6a\xde\xb3\x13\xc2\x65\x34\xd6\xa9\x4b\x2c\x34\xe5\x90\x62\xea\x84\x08\x13\x65\x55\x27\xf0\x2c\xa5\x04\x75\x6b\x90\x07\x2a\xd2\x9c\x2a\x35\xc5\xf9\x2a\x77\x8f\xf0\x4e\xcb\x9e\x8d\xfa\x00\xac\x0d\xd6\x7d\x3e\x11\xd8\x55\xb8\x4c\x01\xc5\x56\x6f\xd0\xab\x4b\x7d\x55\xea\xe4\x62\xe0\xa3\xa6\x72\x6d\x23\x78\x38\xcd\x97\x2f\xa3\xd4\x1c\x48\x6e\x2f\xbd\x36\x5a\x00\x2d\x0a\x0f\xde\x96\xb8\xac\xaa\xb1\x3d\xc0\xa9\x2a\x84\x03\x54\x9e\x32\xcd\x48\x2f\x82\x2c\xb5\xa3\x7e\x7e\xe3\xea\xa3\x9c\x04\x1d\x69\x1d\x10\x4d\x03\x9d\x30\x17\x55\x4f\xf0\x69\x70\x55\x28\xd5\x6c\x46\x85\x6d\xd9\x2f\x99\xa0\x47\x8c\x34\x13\x9f\x59\x0a\x53\x67\x24\xe5\x4a\x45\xc9\x4b\x57\x8b\x39\x24\x2d\x06\x49\xe2\xcc\x8c\xa3\x66\x31\x81\x2b\xd6\x01\x1d\xf4\x24\x78\x3d\x3b\x5d\x31\xae\x1c\x48\x6e\x41\x5a\xa9\xa0\x5b\x10\x11\x82\x92\x9b\x18\xd5\xb0\x3a\x8a\x31\x19\x35\xd3\xea\xa8\xbf\x10\xf1\x6c\xc3\x64\x44\x75\xf5\x9d\x64\x01\x03\xbc\x75\x26\x2a\x4a\x55\x62\x58\x0f\x92\xd6\x15\xf3\x44\x10\x30\xe3\x46\x69\x2e\x5c\xb8\xfb\x9d\x1d\x80\x8e\x3c\x51\xdd\x05\x1c\x10\xf3\xe1\x10\xce\xab\x48\x12\x4f\x29\x17\xee\x3e\xf8\x8f\x07\x49\xf6\x5e\x56\xa2\xe7\x51\x6a\xdf\xfe\x54\x29\x3e\xa0\x42\xa9\x1f\x95\xd2\x20\xf2\xd4\xe3\x76\xd7\xf4\xb7\xc5\x72\x08\x60\xa4\xca\x9c\xb8\x57\x9a\x73\xf0\xd1\xa5\xe8\xf7\x2c\x45\x6c\xc1\x80\x3d\x44\xbf\x80\x86\xd5\xfb\xaa\xec\xef\x8d\x40\xc0\x83\x94\x25\x81\xc2\xbd\xd1\x91\x55\xa4\xcb\xeb\xed\xd7\xb6\x42\x43\xa8\x6e\x35\xaf\xa7\x75\xe6\x69\x3b\x2f\x6f\x6f\x8e\x20\xac\x01\x51\xe4\x7d\x24\x81\x7b\x26\x21\x23\x3a\x0c\x2b\xfa\xf2\x6e\x42\x30\x48\x3b\x0e\xa5\x20\xc5\xbf\x17\xcd\x6b\xa8\xe7\x9b\xd2\xba\x66\x41\x03\x69\x31\xd2\x8c\x82\x5a\x88\x42\x90\x9e\x3f\xff\x99\xe7\xf1\x23\x18\x82\xbf\x98\x81\x7f\x7f\x78\xcd\x93\xb4\xc1\x4f\x66\x5c\x6b\xf9\x85\x9f\x93\xa7\x31\x67\x46\x13\x9a\x8c\x55\x3a\x52\x63\xb2\x0c\xaf\x5f\xe9\x87\xd1\x5a\x7c\x9d\xf0\x7b\xba\x26\x05\x75\x35\x74\x45\x6b\x8c\xb8\x97\x68\x1e\x79\x35\x4f\x59\x3b\xd3\x92\xf4\x7c\xd2\xf0\xe3\x7d\x31\x29\x24\x08\x70\x40\x23\xe7\x5b\x6f\x4f\xf3\x54\xbc\xbd\x37\x72\xbf\x57\x4b\xb4\x84\x57\xc3\x64\xd2\x13\x4b\x22\xf5\x03\x89\x02\x98\x8c\x39\x04\xaf\x27\xfc\x3e\xd4\xcb\x5b\xd3\xde\xf1\x13\x6d\xf2\x70\xb6\xab\x64\xa6\xee\x3a\x93\x2c\x7c\xea\x3a\x42\xef\x2b\xf1\x3c\x94\xba\x18\xa8\x3e\x7a\x2f\xa1\xc0\xb4\xf6\xd4\xf3\xa5\x63\x7c\x49\x17\x55\x54\x17\xb5\x39\xf6\x97\xbd\x36\x77\x58\x0f\xf0\x57\xff\x3e\x3f\x28\xf7\xfd\xbc\xd5\xd5\x73\xaa\x61\xe0\x52\x40\xd6\x58\x03\xe2\xd0\xd5\x27\xac\x40\xaf\x4a\x9f\xa0\x85\x76\x9f\x1a\xa1\x79\xbe\x4d\x63\x80\xae\xcb\x25\x24\x23\x5a\xea\x91\xfd\x8d\x23\x1a\x0e\x38\x55\x84\xd7\x4f\xcb\xcb\xb4\x35\xae\x8b\x8b\x5e\xc9\xaf\x95\x8b\x75\xc2\x14\x25\x8c\x57\xd6\x5e\x6a\x5c\xe9\x8b\x69\xa9\x1d\xdc\x88\xc9\x62\x9f\xcf\xe7\xb7\x4c\xc5\x82\x1b\xf3\x27\x42\x2a\xd0\x98\x81\x29\x25\xe7\xad\xc4\xe6\xcf\x5e\x4c\x00\x31\x7d\x45\x94\x3d\x94\x0f\x25\x7b\x7a\x93\x1a\xbf\xf4\x9d\x77\x65\x86\xf0\xac\xeb\x56\x7c\x01\xe8\x13\x36\xce\x2d\x9b\x8d\x2a\x00\x9d\x16\x56\x2c\x2b\x7a\xb9\xbc\xe5\xa9\x87\x13\xb6\x8f\xf1\x1b\x7c\x2e\x12\x58\x1d\xaf\xd9\xd3\xf6\x14\x5c\xab\xe1\x1b\xed\x08\xd7\x52\x1b\x09\x30\x94\xc1\xdc\xac\x45\xfa\x45\xbd\xc6\x53\x77\xa9\xae\xe6\xb3\x9d\x20\xad\x3d\xcd\xb2\xe9\xd4\x9a\x5e\x37\x6a\x23\x53\x45\x04\x33\x8f\x90\x43\x87\x02\x3b\x8b\x0e\xa6\x15\x4c\xc3\xeb\x2a\x2a\x08\x35\xdb\x25\x67\xc1\xbd\x58\x68\xdd\x9d\xf8\xfb\x33\x33\x66\x39\x10\xae\xae\xa0\x8c\x04\x88\xd2\x67\x18\xbf\x09\x13\x70\xe3\xf9\x1c\xf1\x67\x1f\xbc\x40\x5c\xf5\x46\x79\xf9\x6a\x9f\x68\x32\xb3\x6b\x0b\x6f\x73\x09\xe4\xf8\x93\xe2\x37\xe9\x3e\x84\x49\x93\x35\x7b\xcd\x33\x81\xdc\xb0\x9f\xba\xcd\x1b\x7b\xcd\xc9\x3a\x5c\x69\xe2\xfa\x31\xed\x45\xcf\x4f\x39\x4b\x30\xeb\x17\x45\xf0\x31\xfc\xf4\xac\xd2\xcb\x6c\x2b\x11\xb3\xc9\x8f\xb0\x56\x2e\x35\x4f\xc5\x38\x51\x31\xe1\xab\x3a\xde\x6f\x8e\x4e\x4b\xf9\xbe\xe9\x44\xcd\x9d\xa1\x3b\x7f\xb3\xe5\xa4\x41\x5f\x11\x3a\xb7\xd2\x5e\x20\x9d\xa2\x55\xa4\xf3\xdd\x8f\x38\xca\xf0\x53\x06\xe0\x34\x5d\x7d\x76\x2e\x53\xb6\x35\x23\x59\x24\x3e\x55\x9c\x7a\x65\x1a\x40\x77\x63\x50\x61\x70\xe7\x76\x8f\xf9\xf0\x7c\xfd\x3c\x2f\x97\xc6\x4e\xd2\x52\x0e\x54\xdc\xfd\xa9\xf7\xae\x3c\x9e\x49\xfa\xbf\xbe\x5f\xfe\xc5\x6e\xbd\xff\x79\x9b\x5b\x6b\x93\x65\xbf\x3d\xc5\xae\x45\xe3\x4a\x7d\x16\xee\x64\x36\x4f\xf1\xac\x69\x61\x3e\x66\x05\xd4\x49\x5d\x28\x76\xde\xe9\x0d\x66\xd1\x58\x0d\xe9\x25\x76\xcb\x18\x67\x7a\x34\x6a\xbc\xbe\xea\x4c\x9e\x47\x6e\x72\x4f\x0a\xe9\xa5\x64\xa1\x42\x6a\xbc\x8e\x45\x1e\xfa\x3d\x8e\x00\x52\xb7\xa5\xe7\x52\x30\x2a\x31\xde\xf7\x77\x20\x6b\xbb\x16\x46\xfd\x68\xe9\x93\xb7\x68\x47\x60\xd5\x30\xa5\x7f\xa5\x7d\x7a\x9f\x93\x6d\x18\x7b\x1d\xbd\x3c\xa4\xab\xd9\xbd\x10\xaa\x78\x13\x48\x0b\x88\x6f\x8a\xbb\xda\xbe\x7e\x49\x82\x6a\x1c\xfc\xfa\x14\xbf\x63\x13\xb4\x6a\x2e\x09\x7b\x36\x6c\xc7\xb3\xf8\x7a\x7a\x7b\xfb\x4e\xc1\xa7\x57\x45\x64\x8b\x40\x8b\x00\x7a\x4d\xb5\x37\xd4\xb3\x23\x7f\x06\xbb\x77\xc4\xb0\xa4\x0d\xca\x21\x04\xe8\x46\x71\xea\xa8\xf3\x64\x29\xb5\x82\x5f\x99\xbd\x0f\x2f\xb4\xa4\x5e\xce\x8c\xa8\x78\x55\xd7\x86\x3c\xed\x33\xed\x44\x9e\xea\x17\x2b\xca\x8e\x15\xd1\x1e\xd9\x9f\xee\x18\xff\x7c\x55\xa2\x37\x40\xa4\x73\xc1\x1d\x8e\x4f\x40\xdd\x6b\x65\x9a\xd1\xc8\x3d\x4d\xa7\x79\x10\x56\xbe\xa0\x69\xe7\x2b\x67\xc0\xa6\x2d\x44\xe4\xfe\x46\x89\xe0\x45\x37\x51\x5d\xf6\xc7\x41\x0e\xde\x39\xa8\xd2\x69\xee\x03\x17\x43\x64\xe9\xe0\x91\xa9\x9a\x89\xd6\xdc\x4d\x0d\xa4\xfa\x2d\x33\x62\x49\x80\x96\xae\x5a\x51\x54\x40\x9a\x21\x22\x1e\xc0\xd2\xae\xc2\x23\x40\x4c\xbb\x0e\x96\x99\xa6\x23\x9d\xa7\x8b\xab\x15\xed\x5b\x87\xa8\x56\x48\xd5\xd7\x8b\x4e\x42\x5b\xf4\x4f\xaa\x84\x77\xc9\x0b\xa4\xa9\xe6\xea\xd0\xd9\xab\x87\xdb\x7b\xe8\xfb\x8f\x56\x21\x4a\xf6\x86\xe0\x24\x92\xd2\x04\x78\x45\xae\x32\x01\x30\x28\xa3\x35\x17\x10\x06\xc5\x91\xa1\xae\xcf\xf1\x4e\x2f\xa4\x92\xaa\x9d\x5b\x03\x5a\xe1\x90\xfc\x29\x6d\x18\x12\x8a\x88\xda\x1f\xd9\x99\xb9\x95\xbc\x53\x9c\xa2\x97\x7a\x95\x85\xba\xa8\x92\xec\x7c\xbd\xe8\x03\x7f\x67\x6b\x39\x07\xef\xf4\x4c\x73\x67\xf9\xee\xb1\x40\x46\x22\xd7\xe0\x76\x3d\x3f\x82\x00\x2b\x69\x4d\x79\x5e\x84\x17\xed\x75\x25\x4f\x37\x6f\x7a\xbc\x50\x3d\xd6\xce\x57\xcc\x9e\x94\xbb\x0d\x26\x48\x03\x09\x6a\x0f\x4d\x68\x4f\x5c\x38\xff\x05\xc2\x8c\x4c\xab\xb4\x63\xbd\x2d\x4d\x79\xcb\x90\x9a\x29\xfa\x83\xac\x34\x01\x1c\x84\x6a\xcf\x42\xb7\x61\x94\x99\xd1\xf3\x78\x94\x16\x6b\xc8\xa5\x69\x2b\x58\x78\x6b\xb4\x5d\x84\x59\x6c\x4b\x4d\xce\x70\x03\xd1\x2f\xb4\xd5\xfb\xf7\x60\xf8\x96\xa9\x8c\x65\x66\x9a\x78\x65\x05\xfe\x9c\x83\x6e\xf9\xa4\xcf\x6f\xc1\x9c\x90\xa6\xcf\x30\xa0\x54\x3b\xac\x1c\x48\x46\x19\xbd\x27\xa8\xa2\xa5\xf5\xf4\x15\x88\x48\xe0\x5e\xc6\x46\x1d\x2f\x1f\x40\x04\xdf\xf4\x1a\x36\xa5\xbd\x7f\x25\xef\xdc\xf0\x6a\xe6\x24\x75\x94\xf9\x2e\x62\x05\x23\x07\x86\x71\xb9\x0f\x02\xfc\x54\xa2\x7d\x7e\xa7\x69\x26\x37\x4e\x88\xce\x47\x50\x0e\xfc\xa9\xae\xe2\x2f\x96\x9e\xcf\xe7\xa7\x23\x64\xa0\xcb\x43\xea\xa5\xd2\x86\xd0\xc2\xb2\x0f\x3c\x86\x86\x1e\xfd\xf9\xc7\x8d\x40\x72\x62\x32\x1f\xee\xca\x98\x65\xf2\x9b\x1b\x3f\xc3\x07\x98\x13\x44\x0f\x48\x39\xf3\xbc\x71\x60\xee\x2c\x8e\xa6\xf2\xd0\x68\xc0\x4e\x13\xd8\x19\x1e\x55\xce\x35\x29\x30\xdb\x47\x9e\x6f\x7f\x29\x0b\xe9\x41\xee\x25\x6e\x42\x2f\x75\xd6\x45\x22\x54\xc6\x22\x9f\x26\x22\xd4\x86\xb5\x8a\x27\x1c\x98\xfb\xae\x39\xf8\x95\x8d\xaf\xef\x43\xd7\x01\x7d\x8b\xcc\xa5\x53\x8a\x27\x22\x34\xc6\x62\x4b\x49\x85\x50\x84\xf0\xb9\x94\x84\x4c\xb3\x59\x86\x0b\x91\x73\x29\x71\x76\xaf\xce\xd0\x43\xe5\xf8\x49\xe2\x7c\x58\x79\xf0\xa0\x76\xf5\x61\xd5\x1a\x53\xf5\x41\x4f\x6a\x4e\x8e\xeb\x9f\x96\x83\x93\xc6\x35\x90\xf6\x68\x66\x6d\xa6\x53\x89\xfd\xfa\x7b\xa0\xa9\x7e\x3a\x17\xb7\xc7\xd3\x32\x79\xff\x07\x3d\x51\x65\x56\xba\x75\x6e\xe2\x93\x39\x5e\x72\x72\x88\x91\x18\x51\xea\x68\x51\x2a\x6a\xbe\xcd\xe4\x74\xb9\x16\x98\xb2\xd0\xb3\xb2\x48\xb3\xe2\x9d\x8b\x5b\x0e\x2d\x89\x8b\x81\xbe\x97\x76\x61\xad\x3e\x7e\x85\x97\xbf\x79\xda\x23\xaa\xca\x31\x16\xcb\x21\xcc\x99\xf9\x26\xfa\xb8\xef\x9e\x87\xd8\x33\x28\x29\x97\x7e\xf2\x40\x84\xc6\x5f\xaf\x19\xd6\x6a\xff\xc5\x93\xde\x87\xa9\x4e\x41\xb2\x2c\x62\xc9\x49\x79\xd0\x83\x94\x33\x68\xe8\x4e\x7d\xb4\x3c\xd1\xd0\x63\xb4\xeb\x15\xcc\x83\x93\x09\x46\x5c\x33\x28\x30\xb6\x28\xd5\x87\x57\xca\x26\x4f\x0a\xf5\x3d\x7a\x50\x2d\x74\x54\x60\xa8\x53\xe6\x9f\x6b\x46\x88\x69\xdd\x5c\x9f\x92\xaa\x0c\x8c\x4f\x34\xae\xcc\x54\x1f\xcd\x3f\xe4\xff\x08\x61\x70\x48\x44\x61\x54\x16\xbe\x57\x59\x6a\x71\x4e\xe5\x78\xb3\x28\xeb\xe6\x69\x43\xec\x9d\x1f\xab\x2e\xdd\x72\x35\x97\x4e\x59\x17\x71\x4f\x2e\xaa\x9c\x2c\x16\xa9\xd9\x11\xa9\x21\xe4\xc0\xdc\xf8\xd0\x9f\xda\x62\x36\xc4\x22\xb5\x04\x22\x35\x4a\xbc\x76\xd5\x72\xba\x71\xe0\xb2\xbf\x89\x14\x12\xcd\xc5\x67\x3e\x0f\x69\x97\xa2\xec\x23\xc4\xcc\xc2\x4a\x2b\x2d\xdb\xa0\xa4\x55\x57\x58\xec\x19\xb8\x06\x6e\xda\x06\x76\xe1\x7c\xcc\x00\x35\x51\xbd\xf2\xa8\x7a\x15\x04\xf5\x5a\x72\xe6\xa3\xe4\x34\xd0\x61\x8c\xab\x8f\x18\xd7\x02\x54\xaf\xfc\xaf\xf0\x99\x83\x8f\x38\xdd\xcd\xc5\xc0\x5f\xe1\x2b\xfe\x11\x9f\xf9\x2f\xf1\xe9\x39\x4d\xae\xf2\xb9\xda\x20\x6e\x8a\xce\x1c\x78\xb7\xf2\xc6\xdf\xe6\x10\x06\xd3\x2f\x1e\xe2\x81\x8b\x2d\xb1\x28\xf4\x3e\xec\x9c\x4d\x0e\xcc\x57\x78\xa5\x2a\x9f\x37\xee\x29\x98\x5c\x81\x6a\x8f\x92\x33\x6c\x7f\x52\xaf\xe9\xa4\xda\xf6\x74\xb1\x35\xf1\x62\xab\x88\x69\x0b\x8c\xf6\x88\x99\xcb\xd5\x98\x54\x4b\xfa\x81\xef\x26\x52\x8f\xd8\x85\xca\xb0\x36\x7f\x85\xcf\xfc\x47\x7c\xc5\xbf\xc4\x37\xac\xb4\x2b\xc8\xef\xe8\xe2\xaa\xa3\x2c\xb5\xe9\xa3\x5d\x98\xe2\x07\xee\x63\x6f\x9b\xfd\x5d\xd1\x54\xe7\x28\x34\x12\x85\x47\x00\x3b\xa0\x24\x3a\xfd\x6a\xe7\x51\x2e\x01\x7a\x73\x25\x17\x83\xa4\x69\xfa\x1c\x5b\xb6\xc9\x38\xa7\x47\x10\x0b\x5a\x78\x9d\x34\x93\xd7\x31\xb8\x23\x2c\x30\x2c\xba\x50\x16\xe8\xe1\x6a\x3b\xc1\x88\x83\xfe\xab\xe0\x27\xfb\xca\xe1\x0d\x47\xa0\x2f\x16\x98\x39\x60\x7c\x02\x69\x46\x92\x98\xc7\xf3\x12\x68\xd2\xb3\x6f\xd8\xb9\xfa\x94\x18\x51\x2d\x7c\x13\x6f\x60\x24\x08\xf3\x3d\x81\x24\x70\x1f\x81\xe8\x00\x29\xe6\x45\xed\xea\x9b\x7e\xd5\xef\xf7\x41\xd7\x4e\xaa\x38\x2b\x1c\x43\xb4\xe1\x19\x8e\x72\xdb\x2a\x73\xc4\x46\xb0\xb6\x2a\x64\xaa\x23\x26\x6a\x20\x6a\x38\xe6\x80\x94\x94\xed\xc2\x1e\xdd\x57\xa2\x23\x83\xbc\xc0\x88\x36\x9d\xc5\x25\x1d\x2f\x13\x68\xb2\x78\x65\xa5\x52\xb3\x77\xe5\x7e\xd0\x31\x5c\x4d\xec\x65\x86\xeb\x33\x5f\x90\xba\xdb\x8a\x67\xc7\xb9\xf6\x99\x1b\x3e\xd3\xea\x34\xa2\x84\xc0\x10\x31\x45\xba\x29\x5a\x39\xae\x8c\xc1\x0d\xd4\x4e\x97\x14\x71\x02\x44\xaf\x84\xe7\xde\x80\xf5\xd8\x7e\xf5\x81\x60\xab\x14\x30\x8c\xfb\x0b\x1e\xe9\x48\x38\x8d\x15\x8a\x7b\x63\x06\xd1\x8a\x89\x00\x83\x02\x25\xfb\x4c\x7c\x44\x11\x55\x34\x56\x64\xb7\x57\xeb\x85\x44\x8d\xc3\x19\xad\x77\x46\xc6\xa5\xc1\x4e\x7c\x8b\x44\x65\x7a\xd3\xd4\xab\x13\x4f\xd0\x15\xe4\x9f\x44\x54\xe3\x00\x60\x98\xc6\xa8\x66\x0b\x8d\xf7\xb7\x93\xc2\x61\x91\x24\xf0\x82\x25\x4b\xf6\x5e\x24\x15\x79\xdf\x85\xa0\xdc\x8a\x37\x39\xba\x9e\x1b\x7e\xd6\x41\x92\x0e\x9f\x91\x32\xe3\x6d\xa8\xcb\xb1\xf1\xce\xd3\x98\x16\x03\x6e\x74\xa7\x96\x3b\x41\xbd\x18\x96\x39\xeb\x4b\x69\xa4\x92\xae\xa0\xa7\xa4\xfa\xc2\xf4\xc7\x12\xcf\x3d\xfa\xf0\x43\x96\x47\x51\x3e\x79\x7a\xea\xa9\x1f\xbd\x64\x4f\x93\x13\x22\xcb\xfe\xe4\xb7\x8f\x21\xb4\x97\xaa\xd4\xc5\x27\x53\xf9\x71\x2a\x41\x8d\xff\xb0\xd4\x50\x41\xe9\x06\xf2\x3d\xb5\x88\x54\x98\x8b\xe1\xa9\x0e\xe9\xa0\xd2\x0d\xfa\x95\x42\xe2\xc5\x54\x6e\xf1\x1c\x55\xfe\x35\x3e\xbf\x04\xb9\x80\x39\xdd\x44\xee\xd5\x28\xa1\x0b\xc3\xbd\x53\xca\xa4\xb9\xd7\xa4\xd3\xa1\xce\xe4\x77\xd8\xbd\x5a\x0c\x46\xa2\x00\x02\x5c\xc5\x24\xe5\x2f\x79\xb7\xe7\xcc\x68\x30\xd0\xcb\xed\x9c\x43\x4a\x3a\x4a\x86\xec\xb0\x29\x9c\xe3\x75\x08\x49\xc4\x09\x61\xde\x88\xe1\xbe\xae\xd4\x93\xa1\x75\xaa\xe7\x7c\x6c\x7a\xc4\x96\x8a\x98\xaf\x29\x69\xec\xe2\xee\xd4\xfc\xc5\x25\xed\x42\x99\x0b\xde\xbc\x6a\xde\xa3\x50\x89\x0c\x91\x46\x5c\xd3\x86\xd3\x88\x9f\x1f\x7d\x46\x67\xce\x3b\x0c\xc0\xbd\x91\xd0\x4a\xb3\x44\x12\x55\x1b\x26\xe8\x0c\xda\x74\x8e\x80\x5b\x35\xb1\x9a\x38\x48\x8c\x11\x3d\x39\x11\xef\x63\x1a\x86\x8b\xd9\x85\xa9\x13\x4b\xc0\x63\x4f\xce\x22\x46\x50\xb7\x26\xb7\xfc\xde\x04\xca\x19\xde\xcf\x14\x4b\xa3\x5a\x94\xb8\x4a\xd5\x10\x10\x71\x85\x72\xcc\x56\x5e\x67\xad\x0b\x9e\x0a\xc9\x72\x34\xdb\x16\x93\x2e\xdc\xcc\x49\x19\xff\xe4\x6f\xd5\x14\xc9\xfc\xd7\x8a\x27\xca\xdb\xcf\x74\x03\xfa\x7e\x97\xab\x4a\xf4\x00\x4c\x77\x67\xdb\xb5\xf1\x57\x9e\x5b\xbe\xdf\x60\x7c\x55\xe9\x1c\xcb\x51\xf4\x09\xc5\xdb\x89\x8c\xf8\xfa\x11\x00\x7b\x96\xa1\x48\x6a\xd9\xfb\x7b\x55\xd6\x53\x35\xe7\x5a\xdf\xa0\xd9\x28\x0c\x5c\x86\x69\x52\x9f\xa3\xe0\x0e\xbe\xf5\x31\x71\x2b\x8d\x5b\x1b\x2e\xf2\x0d\x09\x4b\x64\x79\x20\x35\x22\x8d\xa9\xd4\x3d\xfc\x84\xbb\x20\x6a\xe9\x56\x09\x18\x3e\xec\x2e\x23\x13\x12\xb8\x5f\xe0\xee\xb4\x4c\x88\xf7\xb2\xf9\x02\x03\xfb\x7b\xb7\xd7\xe2\x3a\x8b\xab\x08\xb1\xca\xbb\xa6\x17\xce\xed\x4a\xb2\x33\x0e\x82\x5c\x23\x49\xd6\xe0\xdc\x65\xbf\x2b\x87\xbb\x07\x3d\x71\xdc\xab\x1a\xc9\x6f\xd5\x5b\xfc\x38\x1b\xee\xc0\x0b\x61\xd8\xb2\x80\x85\xa5\xb0\x91\x59\x85\x6c\xcb\xc4\x7b\xc2\x2f\xcb\xb0\xbc\x94\x67\xdb\x0c\x74\x16\xd0\x13\x8d\x70\x36\x63\xd4\xf0\xd5\x16\xda\x92\x90\xc7\xeb\xbd\x42\x6f\x14\xd7\x5c\x30\xc5\x25\x7a\xdd\xcb\x29\x77\x7a\xde\x6b\xe2\x26\x0b\x20\x35\xcc\xfa\xe4\xc1\xb9\x1b\x69\x66\x21\x8b\xb7\x05\xac\x0c\x57\x6e\xb4\x96\xa4\x1d\x06\x9f\xa0\xd9\xf4\xe1\xa7\x5f\x47\xb0\xa2\x34\xf7\xde\xbb\x4e\x6a\x4a\x97\x55\xe9\x49\xf7\x3a\x65\x27\x6d\xe2\x17\x75\xcf\xe9\x03\xae\x19\x01\xcc\xcc\xa9\x92\xde\x66\x0f\x3f\x5f\x49\xa4\x4e\x4f\x57\x0d\x13\x69\x05\x74\xad\xc6\x36\x0a\xcb\xa8\xbd\x62\x66\x32\xa0\x00\xc5\x24\xbd\xd2\x41\x19\xab\x30\xd8\x5e\xe5\x21\xe9\xf6\xf3\x9c\x49\x37\xfa\xc9\xb3\x41\xa5\x80\x0f\xdb\x4a\x90\x46\x60\xb3\x09\xb9\x36\x4f\x15\xbd\x26\xbc\xa1\xc3\x69\x84\x33\xa9\x28\x8d\x21\x2a\x8b\x9a\x67\x66\x6c\xa1\x8a\x53\x9a\xc2\xc5\x39\x99\x43\x33\xbf\xa9\x28\xc6\x91\x2e\x0e\xbd\x78\xba\xa8\xad\xea\x79\xb2\x3a\x26\x9b\xc7\x1e\xac\x05\xa7\x7f\x5a\xec\x95\x8e\x54\x94\x67\xc7\x57\xf0\x1c\xf6\x9a\x81\x2b\x16\x75\x16\x69\xa5\x51\x25\xa9\xd1\x7d\xee\x71\xcb\x79\x05\x9a\x4e\x5d\x38\x5f\x10\x8a\x36\x6c\x2e\xa0\x09\x13\xa2\x4f\x30\xc2\x59\x89\x45\xa3\xd9\x80\x99\x22\xe0\xd0\xd9\xd4\x54\xba\xaf\x93\xed\x48\xd1\xe8\x35\x60\xa9\xfc\x54\x3c\x6c\xb7\x7a\x77\xe2\x10\xce\x2c\x44\x32\x4a\x82\x88\x3a\x58\x21\xae\x8b\x4a\x58\xc6\x33\x7c\xad\x4b\x56\xe7\x2d\x73\x2f\x48\x53\x88\xf2\x85\xca\x9f\x09\xca\x08\x80\xe9\x14\xca\x13\x1b\xab\xc4\x94\xb0\xe3\x62\xdf\x2e\x8f\x94\x1f\xeb\x7e\xe9\x88\x97\xb2\xe0\x57\x24\x9a\xad\xca\xd0\x51\xa4\x5f\x1e\x89\x94\x5f\xcf\x2a\x9e\x37\xb8\x0b\x51\x0c\xa0\x29\xac\xac\x3a\x22\xbb\x14\x6c\xa3\x98\x00\x58\xbe\xef\x17\x09\xbe\x6b\x33\x90\xf5\x32\x0b\x09\xd7\x56\x06\xde\xa1\xa8\x25\xaa\xc9\x92\xf1\xe9\x79\x62\xe6\x7b\xbf\x1f\x68\x5a\xa5\x15\x00\x7c\x0c\xb4\x73\x33\xca\x3f\xf7\x63\x84\x32\xf9\xab\x3d\x4f\xf4\xef\xc4\xe2\xef\xc4\xe2\xff\x86\xc4\xe2\x71\xe3\xd7\x3f\xed\x7a\xfe\x99\x08\xd8\xd2\x78\xe1\x1d\xde\x7c\x18\x98\x7a\xbd\xf1\x6a\xe1\x30\x26\x6f\xff\x7b\x89\xc5\x0f\x7c\xda\xbf\xc4\xf7\xdf\x4c\x2c\x44\xad\x30\x45\xad\x30\x20\x95\xff\x99\x08\x18\x0f\x1a\x35\x6d\x53\xd4\xb8\x62\xd2\x0a\x63\x36\x6d\x81\x37\xff\xbd\xc4\xe2\x27\x3e\xfb\x5f\xe2\xfb\x3f\x93\x58\x94\xd0\x48\x11\xd2\x9a\x58\x64\xdf\x13\x8b\xec\xac\x29\xe1\x74\x36\x05\xf5\x0e\x8c\x3a\x2d\xa9\xd2\xa4\x16\xb6\x44\x74\x16\xe8\xf8\xaf\x52\xe4\x14\x31\x7b\xc4\x72\xf1\x9a\x6f\x30\x1a\x9d\x05\x8d\x82\xb1\x38\xd9\x7b\xd1\x45\x3b\x05\x27\xf3\x81\x16\xc4\x55\xe3\x70\x4b\x6c\x20\xc7\x1d\xab\x27\x5c\x58\x4a\x56\xbe\x54\x2e\x34\x48\x22\x5d\x74\x3f\xf2\x89\x02\x15\xd3\xe6\x8c\x87\x55\x3c\x62\x14\xb9\x0c\xf5\xa0\x02\x14\xf6\xb4\x1d\xdf\xa9\x82\x7d\x3b\x44\xcd\x30\x91\xb3\x5a\x0b\xb7\x13\xad\x9e\xf5\x33\x73\xbe\x73\xcb\x0b\x1b\x9e\x1e\xbe\x07\x06\x0e\x7b\x35\xc0\x42\x70\x17\x95\x89\x1b\x20\x86\xf1\x0e\x7f\x08\xea\x19\xc9\x7d\x0c\x7a\x30\x0b\xaa\xee\x15\x1d\x1f\x27\x7e\x44\x41\x71\x86\x91\x97\xbf\x30\xc8\xe9\x42\xdc\x9f\xd5\xf3\xc6\x5e\xaa\x3b\x7f\x0f\x08\x2f\x44\xb5\xe9\xf2\x66\xd1\x72\x08\xf5\x6b\x93\xc0\xb3\xcc\x23\x32\xa4\xc7\xfa\xa8\x5d\xba\x53\x3c\x11\x14\x6f\xdd\x5f\xe8\x4b\x2e\xf2\x07\x83\x01\x5e\x9a\x0c\xd2\x7c\x9a\x78\x16\x46\x6d\xab\x4a\x46\xee\xc5\xc1\x34\x33\xf5\x61\xa0\x98\xc5\xdd\xc5\x17\xf5\xf5\x70\xc5\x32\x23\x00\x66\x9e\xe9\x6e\xf2\xeb\x8b\x5e\x2b\xa0\x01\xef\x53\x51\xac\x64\x33\x18\xc9\xc5\x66\xce\xc1\x35\xb7\x30\xe3\x72\x81\x84\x73\xdd\x4b\xb4\x4a\x66\x51\x1e\x48\xee\x29\xcd\x49\x2d\xb2\xb4\x6e\x5f\x36\x0e\xe7\x93\x67\xc6\xcb\xe0\xe6\x71\xa6\x4d\xe8\x14\x5e\x2d\x4d\x50\xed\xa7\x43\x72\x53\xf4\x48\xc1\xda\xf2\x99\x77\xc7\x4c\xb1\x12\xbe\x24\x28\xcf\x12\xd6\xce\x28\xcf\xd3\xc4\xfe\x4d\x8f\x6c\xcc\x17\x21\x65\xcc\x8c\x25\x04\x15\x75\xe5\xee\x8d\x7e\x83\x14\x3b\x85\x98\x13\x4c\x4a\xf9\xc8\xd3\xe6\xd5\xa1\x8d\xcb\x12\x09\xb2\x19\x9c\x6e\x4f\xa5\x09\xa8\x60\xf0\x71\x05\x12\xef\x2d\x18\x21\x70\x87\xea\x36\xee\xc2\xa5\xdb\x3a\xa4\x42\x37\xef\x11\x64\x5b\xa8\xf6\xee\x9d\xef\xf2\xc8\xeb\x26\xbe\x46\xf7\xb4\xf8\x4f\x78\x59\xca\x34\xe9\xfa\xa6\x74\x84\xa1\xcb\x39\x25\x34\x4d\x59\xb8\xd2\x2e\x3b\x4d\xb0\x08\xc8\xa5\xda\x79\x42\xe6\xea\xaf\xcb\xd2\xba\xa7\xf3\xc8\x4c\xc4\x7b\x92\x07\xd8\x24\xaa\x51\x58\x90\x72\xa4\x00\x8c\x53\x58\x40\x45\xed\x16\x36\x47\x07\x4c\x11\x1b\x23\xbd\x73\x2d\x10\xf1\xf0\x6e\x99\x4b\xe3\x81\x74\x18\x26\x0f\x80\x13\x64\x53\x95\x25\x04\xbc\x5f\x1d\x91\x45\x60\x97\x86\x2b\xec\x44\x45\x86\x31\x64\x7e\x0e\x0e\x3c\x40\xb8\x71\x1a\x2d\x35\x4e\x9b\x34\x65\xe8\xcc\x9b\x69\x97\xe8\x09\x78\xc3\x73\x7e\x4d\x49\xb8\x18\xe0\xb5\x6c\x5f\x78\x59\x4e\x4a\x96\x50\x21\x87\x46\x82\xfa\xa6\xbc\xf8\xa1\x9c\x9e\xca\xb0\xb7\x14\x91\xf1\x4f\xb4\x9f\x3b\x3d\x54\x68\x97\x27\x1d\x98\x57\x37\x64\x93\x47\x9a\x8f\xe0\x22\x66\x82\x68\xc9\x50\x30\xee\x17\x2f\x1c\xee\x32\xc0\x30\x29\xad\x8f\x34\x47\xb7\x98\xf8\x14\xff\xdc\x5b\xe0\xcb\x26\xfd\xa3\x9b\x13\xfe\xc7\xaf\xa2\x8a\x76\x48\xf7\x53\x55\xfe\xaf\xff\x40\xd8\x76\x48\x77\x53\x55\xd6\xed\x2f\xdf\xb2\xae\x7b\xfe\xbf\x00\x30\x8e\xe3\x71\x44\x8e\xcd\x3b\x05\x60\x10\x04\x57\xe0\x6f\xbb\x21\x4f\x46\xa6\x99\x7e\xf9\x06\xee\xc0\x1d\x86\x21\x3b\x18\xc1\x8e\xc8\xb7\xff\x40\xf8\xff\x40\xd8\x38\xb9\xb7\x9f\x2b\xe0\xe7\xe5\x33\xe8\xb2\xdd\x3d\x2f\xcb\x5f\xbe\xfd\x07\x8c\xdc\xb7\x7f\xdf\x76\xf1\x2f\xdf\x54\x18\xa1\x76\x38\x92\x41\xc4\x91\x1c\x20\x10\x3b\xc1\x08\xe5\xe0\xc8\x52\x21\xd8\x11\xdf\x81\x19\x82\x1f\x91\x88\x38\x52\x3b\x70\x07\xa1\x47\xec\x48\xed\x20\xea\x88\xef\xe0\x23\xde\x52\x47\x78\x87\x1e\xa1\x1d\x04\x1f\xa1\x1d\x71\x84\x02\x18\x3d\xa2\xd8\xee\xd3\xae\x94\x41\x3b\xfc\x08\xef\x20\x70\x85\x03\x8f\x04\xf6\xd5\x7e\x86\xa0\x23\xf9\x99\x89\x62\x47\x9c\xfa\x6a\xb7\xa1\xc3\xd7\x10\xb5\x83\xf1\x23\x46\x7e\xb5\x9f\xa1\x2f\x84\xe4\x0e\x01\x8f\x18\xf5\xd5\x7e\xcd\xfa\x90\x81\x44\x07\xec\xb8\xa1\x3f\x40\xd0\x11\xdb\xc1\x47\xe2\x00\x51\x47\x64\xbd\xc8\xd6\x2b\xc8\x81\x70\x32\x3b\x40\xc4\x11\xfb\x6c\x74\xc5\x89\x41\x01\x42\x1e\x11\x62\xf7\x69\xc1\x0f\x4e\xe8\xb8\x12\x83\xec\x20\xfc\x7b\xf3\x19\xc0\x8f\xe4\x01\x39\x12\x3b\x08\x39\x22\xe8\x57\xfb\x19\x41\x8e\xd8\x01\x3b\x92\x3b\x98\x5a\x77\xfa\x69\xbf\x90\x1d\x88\x95\x6f\xd8\x11\x27\xbf\xda\xad\xff\xb0\xf6\x13\x3b\x08\x5e\x5f\x9f\x1e\xe4\x88\x1f\xb0\x23\xb6\x83\x88\x23\xf4\xbd\xfd\x8c\xe0\x47\xea\x80\x1c\xd1\x1d\x0a\xad\x1c\xf9\xb4\x5f\x58\xc0\x23\x75\x80\x8e\x70\x76\x80\xc8\x23\xe6\x40\x10\x9a\xad\x17\x4b\x05\x41\xd4\x91\x3a\x60\xd0\x00\x61\x47\x24\x3b\xa0\xd4\x11\x76\x20\x90\xcc\x50\xfc\x88\xac\x7d\x68\x76\x58\x2f\x7f\xf0\x84\x74\x70\x24\xc3\x89\xa5\x82\x57\xb6\x10\xf0\x91\x8a\x8e\xe4\x0e\x3f\x52\x3b\x64\xe5\x01\x74\xa4\x76\xc4\x11\xdd\x41\x58\x0b\x81\x2b\x25\x2b\xed\xe4\x11\x5f\x2f\x02\x04\x3e\xe2\xd0\xee\xd3\x7e\x6d\x1a\xfc\xe2\x20\x0c\x1e\x31\xf8\xab\xfd\xce\x43\xfc\x80\xac\xbb\xfc\xb9\xf3\x2f\xee\xc1\xab\x8a\x81\xe4\x57\x0b\xfe\x90\x3c\xba\x8a\x00\xfa\xde\x7e\xf6\x7d\x24\x0e\xe8\xaa\x93\xf0\x91\x24\xbe\xda\xcf\x00\x7c\xc4\x0f\xe8\x8a\x1e\x5f\x35\xe4\xd3\x7e\x46\xb0\x23\xb4\xb2\x78\x87\x60\xeb\xeb\xd3\x47\x1e\xe1\x03\x7c\x44\xcb\x03\x84\x1c\xd1\x03\x7c\xc4\x02\x92\x3a\x12\xf8\xee\xd3\x7e\xe9\x17\xba\x4d\x24\x76\x08\x72\xc4\xa0\xaf\xf6\x6b\x08\x3c\xa2\x1f\xb1\xc3\x47\xf8\x7b\xfb\x9d\x6c\xe4\x40\xae\xfa\xba\x5a\xca\xd6\x7c\xfa\xe1\xe3\xa6\xb1\xc4\x0e\xc6\xd7\xd7\x97\x4d\x40\x47\xe4\x00\xc3\x47\x74\xb7\x9a\x1d\xf6\xd5\x7e\x8d\xc1\x9b\x5a\xe0\x3b\x1c\x3b\x92\xd4\x57\xfb\x35\x84\xad\xca\x7e\x24\x23\xe2\xb8\x72\x72\xd5\xc7\xd5\x82\xc8\x23\xbc\x5b\xb7\x82\xa0\x47\x14\xdf\x7d\xda\x1f\xeb\x50\x3b\x7c\x35\x0e\xf2\x08\x43\x5f\xed\x77\x8b\xa5\x76\xab\xb5\xa0\x9b\x69\xc2\xdf\xe9\xdd\x21\xab\x58\xa0\xf2\x00\xe1\xeb\x36\x8f\x78\x74\x80\xb6\x3d\xaf\x0a\x49\xac\x0c\x80\x0f\xc4\xba\x25\xe4\x08\xb5\x07\x72\x13\x0b\xb2\x02\x43\xeb\x45\x80\x22\x47\x6a\xb7\x35\x3f\xd4\x15\xdb\x41\xab\x99\x52\x47\x94\xf8\x6a\xbf\xeb\x38\xb9\x43\x8e\x1b\x8d\x38\xf2\xd5\x7e\xb7\x0b\x62\x87\x1e\xf1\xd5\x0f\xad\xda\x81\xfe\xd0\x8e\xc3\x8a\x09\x3b\xa2\x11\xf8\x19\x3f\xc2\xbb\x15\x07\xb1\xaa\x1f\xd2\xae\x3b\xda\x8c\x14\xde\x61\x47\xa4\x5c\xbd\xd8\x0e\x3e\x92\xd1\x6a\xdd\x3b\xf8\x43\xc3\x3a\x84\x6f\x9e\x6b\x9d\x83\xb5\xc4\x77\xe7\xb4\x5e\xc0\xd0\x11\x0d\x10\x68\xf3\x0e\xd0\x77\xef\xb0\x4a\x10\x5d\x61\x90\xd5\x9a\x61\xe2\xab\xfd\x6e\xe9\xe8\x8e\x5a\xf7\xb1\x79\x2e\xe4\x57\xfe\x0b\x5a\x67\xe1\x47\x7c\x87\x6d\xaf\xaf\x4e\x62\x73\x4f\x68\xb4\xa9\xdf\xaa\xbc\xab\x0e\x92\x07\x04\x3a\xe2\x07\xf2\x88\xb5\xab\x27\xa3\x56\x05\x44\x0f\x9b\x1a\xac\xb6\x99\x41\xe4\xf2\x0d\xf8\x3d\xef\x8e\xe2\x54\x12\xc0\x1f\xef\x8e\x80\x9b\xe7\x42\x4b\x12\xdd\xa1\xe4\x11\xdb\x91\xe8\x61\xfd\xdf\xc1\x89\xf2\xf0\x75\x7d\xf8\x1a\x1b\x28\xe2\x0f\x30\xe2\x41\x14\xc4\xd0\x07\x23\x04\x62\xab\x0d\x80\x47\xa8\x3c\xac\xd6\x8e\x1d\xe1\x00\x22\x8f\x10\xb5\xfb\xb4\x1f\x75\x59\x6d\x19\x29\x71\x70\xf5\x1b\x1b\x04\x7a\xc4\xb0\xdd\xa7\xfd\xd2\xc1\x75\xd3\xe0\x06\x72\xf8\x23\x24\x07\xe4\x88\x28\x10\x8c\x6c\xcb\xfd\x16\xc7\x87\x71\xe0\x52\x7d\x36\x00\x7f\x27\x08\x5f\x41\x09\x64\xf7\x69\x3f\xa0\xab\x8f\x82\xb0\x72\x15\x29\x18\x40\xd8\x11\x23\x76\x9f\xf6\xb3\x14\xbc\x0a\xfc\x88\xff\x9a\x9c\x7f\x46\xb1\x23\x8f\xf8\x01\xc2\x1c\x82\x3a\x52\x01\x0c\xee\x60\xf0\x87\x22\xac\xd6\x87\x2f\xd5\x01\xc2\xc0\x23\x79\x44\x7f\x8b\xff\xf0\x85\x7f\x20\xc0\x75\x18\x3d\x22\x9b\x02\x23\xe4\x4f\xd4\x2b\x75\xbf\xe2\xd7\xef\x51\xb8\xae\x32\x1c\x7e\x1f\xc5\xe1\x43\x9d\x82\x90\xab\x87\x26\x8f\x7f\x24\xca\x5f\x2b\x07\xb4\xce\xdf\xc1\x54\x49\xac\x27\x26\x8a\x1c\xd1\x81\xc4\x8f\x44\x79\xf8\xf1\x7e\xbb\x3a\xac\x57\x0e\x01\xaf\xb2\xf8\x9a\x51\x6d\x26\x8c\x94\xbf\x52\x9d\x7f\xd6\xb0\xe1\x40\xfd\x54\xb1\x7f\x93\x18\x6a\x07\x21\xeb\x11\x76\x84\x69\x08\x3b\xe2\x2b\x4f\xd6\xf6\xc3\x00\x8a\xdc\x41\xeb\x19\x3c\xac\xe3\xc1\x6f\xc7\x21\x6c\x75\x44\xd8\x91\xc8\xfe\x78\x7c\x6b\x86\xdf\x1d\x3f\xfc\x18\x5f\x2a\x70\x87\xa3\x47\x2c\xfb\xb1\x10\xb6\xfb\xb4\x5f\xde\x66\x75\x2d\x64\xb9\xb1\x62\xf5\xb1\xeb\xc5\x7a\x82\xfc\x01\xe8\x81\x5c\x2a\x72\x3d\xd9\x56\x46\x64\x87\x55\x3b\xff\x69\x6d\xf0\xf0\x1b\xda\x20\x64\xf7\x69\x3f\x4a\x06\xef\x88\x23\x5e\x7e\x2d\x84\x38\x10\x4a\xae\xda\xb6\xbd\xa5\x56\xf0\xf5\x40\x3e\x7e\x3f\x13\x37\xe0\xdf\xdd\x24\xf8\x93\x09\xd9\x11\x77\x70\xe2\x08\x2b\x10\xb9\x1e\x4a\x18\xb5\x54\x07\x9c\x3a\x92\x07\x14\x5c\xe5\x0c\x82\x6b\xd8\xb5\xe1\x26\x36\x52\x88\xef\xa4\x7c\x76\x7f\x84\xb2\xdf\x65\xce\xee\xb3\xe3\xf2\xf0\x9d\xd6\x45\x45\x57\x9f\x8c\x91\x47\xea\xd3\xb9\x23\xd7\xc0\x03\x3f\x22\xd9\xef\x71\xe2\xa7\x14\xbf\xc4\x8c\x6f\xa7\x00\xfe\xf3\x14\x58\xcf\x19\x62\x59\x1d\x1b\xb5\x83\x50\x72\x65\xe8\x8a\x0e\xfe\x2e\x0f\xe4\x9f\xf9\xb1\x5b\x67\xe0\xc3\xef\x6a\x15\xb8\xfb\x8e\xe7\x0f\x34\x14\x24\x91\x10\x43\xbf\x6d\x1d\x87\xe6\x19\x44\x79\x37\xff\xf2\x0d\x3c\x42\xd8\x3f\x98\xd0\x7a\xba\xac\x0a\xbf\x3a\xc5\xef\xfa\xbf\xbe\xfb\x2f\x62\x05\xbf\x63\xa5\xc8\x2d\xda\x41\x8e\xe4\x77\x33\xda\xfd\x16\xe7\x9a\x0b\xac\x57\x20\xfd\x3f\xfe\x3b\x59\x4a\x95\xc7\xff\x90\xa4\xfc\x57\xa7\x17\x7f\xf4\x9c\x90\xdf\xc9\x71\xfe\xbf\x28\x0b\xde\x6d\xd2\xfd\xd2\x77\x77\xf2\x7b\xc2\x93\xc7\xbf\x7c\x53\x82\x39\x79\xff\x27\xfc\xed\xbf\x9c\xfd\x10\x6b\x3e\x00\x7e\xa5\x3e\x6d\x37\x97\xc9\x17\x77\xca\xbc\x4e\x82\xb7\xf8\x0e\xe2\x3c\xa9\xbb\x6d\x11\xcb\x11\x25\xee\x3f\xa1\xff\xfc\xb6\x4b\xbf\xba\xed\x3a\xef\xda\x5f\xbe\xf5\x6d\xf2\xb6\x9e\x41\x94\x5c\x6a\xbb\x4d\xbe\xed\x26\xe8\x97\x6f\x6b\x5a\xf0\x6d\x37\x43\xbf\x7c\x83\x40\xe8\xdb\x6e\x82\x7f\x74\xad\x57\x47\x70\x95\xd5\x77\x34\xd7\x77\x50\xb7\xf7\xe6\x5d\xfd\xf2\xad\x0a\xba\x77\x3e\xfd\x3f\x9f\xb0\xe9\x00\x6d\x31\x30\xfc\x3f\x7f\xd0\xd7\x3c\x77\xcd\xfd\xbe\x72\xe0\x1b\xf8\x6d\xb7\xbe\x3f\x44\x4d\xd9\xbc\x37\xb5\x48\xe0\x28\x4e\xd0\xef\xe2\xfd\x07\xe0\x23\x44\xfc\x16\x1c\x8c\x82\x04\xfe\x7d\x70\x04\x42\x7e\x03\x1f\x87\x11\x18\xc7\xbf\x0f\x8f\xa2\xbf\xc5\x1f\xc3\x21\x14\xff\x01\x39\x18\x81\xfd\x06\x3e\x22\xa8\x38\x22\x7e\x1f\x1e\xa7\xc8\xdf\xc0\x87\x01\x89\x86\xd4\xef\xc3\x93\x10\xf5\x1b\xf8\x20\xc4\xc9\xe0\x0f\xe0\x29\x04\xfd\x0d\x3c\x15\xa1\x18\x45\xfe\x2e\x3c\xf4\x5b\x60\x04\x0e\xc8\xe4\x87\x69\xfd\xa3\xf6\xfc\xca\x86\x57\xf3\x44\xb7\x1c\xa5\x5c\x83\x3e\xfc\x48\x38\x14\x75\x5a\x93\xaa\x0c\xc5\x96\x6f\x5f\x36\xbe\xaa\xff\x7f\xc0\xc8\x77\x85\xfb\x9f\xff\xe0\x06\xfe\x1d\x14\xbf\xf2\x0a\x2b\xa9\xef\xa6\x48\x36\x32\x49\x12\x46\x48\xe4\x7b\xd7\x61\xcc\xe3\x2e\xfb\xe5\x1b\xfc\x1b\xfc\xc4\x11\xdb\x51\xd0\x11\x72\x88\x35\x29\xc4\x8f\x50\xb9\xa6\x3c\xd0\x9a\x70\xad\xe9\xe5\x7a\xb1\xf6\x3a\x14\x94\x1d\x90\x23\xe9\x10\xd8\x9a\xfd\x6c\x6e\x13\x5f\x7b\xa8\xf2\x80\xae\x6e\x18\x77\x28\xe8\x44\xac\x89\x24\xbc\xce\x05\x3f\xf8\x50\x87\x04\xcb\x35\x67\x22\x8f\x64\x86\x1d\x51\x05\x5d\x63\x69\x82\x2a\x3f\x51\x73\xb6\x26\x71\xe5\x9a\xc3\x1e\xa8\x23\xb2\x65\xac\xc8\x11\x19\xf0\xec\x80\x2e\xd5\x1a\x27\xef\x40\x05\xa5\x76\x04\x74\x44\x32\xf4\x88\x2a\xd8\x16\x36\xe0\x25\xfa\x09\x72\x89\x0c\x5d\x43\x0b\xe2\x93\x08\x92\xd9\x9a\x41\xfc\xe0\xec\xa7\x7a\xf1\xed\x5f\x19\x39\xfc\xef\x19\xf9\x9a\x23\x7d\x8c\x1c\x03\x8f\x20\x8c\x7c\xec\xfc\xab\x17\xfe\xd9\xfb\xdf\x32\xf4\x8f\xaf\xf8\x67\x7d\xc3\x11\x94\x82\xfe\x4d\xe5\x24\x40\x08\xc1\xc3\xff\xad\x72\xfe\x21\x27\x90\x7f\x93\x13\xd0\x11\x83\xa0\x2f\x5e\x40\x47\x02\xc2\x3f\xbc\xc0\xb1\x23\xbc\xf5\xc3\x3f\xfb\xff\xfa\xdc\xf8\x61\x07\xf8\x7a\x3c\x63\xd8\x11\x5b\xf3\x55\xe2\x70\x84\x57\x6d\x3c\x1c\x91\xad\x0a\x70\x44\x0e\xc4\x11\x39\x7c\xd2\x56\x64\x8d\xcf\x0f\xd0\x96\xab\x1f\x09\x0b\xa6\xd6\x54\x7b\x35\x1a\x78\x1d\xc3\xd1\x68\x9d\xb9\x65\xb9\xc8\xe1\x93\x96\xad\x19\xe0\x61\x8b\xca\x91\xc3\x56\x10\xc2\x0e\xd0\x61\x0d\x5f\xb6\x44\x9d\x38\x6c\xf8\xd6\x55\x57\xb8\x35\x55\x39\x92\x87\x23\xb5\x83\xbf\x4a\x22\x2b\x21\xd0\x71\x2b\xa6\x1c\xa1\x2d\x55\x27\x8e\xf8\x6e\xcd\xdc\x89\x23\xf4\x29\x2e\xe1\x87\x23\xba\x83\xd7\xfc\x16\xdb\xe1\x6b\x3e\xfd\xa9\xb6\xad\xd9\xe1\x66\x1b\xeb\x05\xbe\x21\x3a\xc2\x6b\xe6\x7e\xf8\x54\xc7\x90\x1d\x58\x1d\xa8\x35\xae\xc1\x8e\x48\x74\xc4\xb6\xee\x6d\xbf\x3b\x68\x03\xda\xd8\x40\x7c\xb6\xbf\xa2\x85\x8e\xf0\x01\xdf\xba\xd7\x44\x73\xb5\x42\x62\x07\xaf\xef\x77\xe8\xee\x88\xae\x49\xf0\x3a\x15\xde\xa1\x1b\x05\xc4\xb6\x25\xec\x53\x91\x80\x8f\x44\x05\x6f\xb5\xb7\x0c\x3a\x42\xd1\x4a\xca\xca\x25\xe8\x83\x6d\x2b\x4a\x61\x2b\x43\xb6\x9a\xde\xa7\x98\x76\xa4\x96\x0a\xd9\xe8\xc8\xa0\x23\xe6\x20\xe4\x1a\x68\x23\x11\xb8\x5b\x59\x87\x7e\xed\x62\x0d\xc3\xd1\x1d\xb8\x51\xbf\xce\x05\x3f\x5c\xda\x84\xf7\x6b\xfc\xdb\xdc\x61\x03\xdf\xea\x7d\x6b\x5c\x49\x45\xbf\x01\xdb\xaa\x15\x1b\xc3\xb7\xfa\xc0\x87\x93\x2b\x21\x87\x75\x87\xd1\x91\x38\xae\xf9\xd5\x46\xdd\xca\xae\x35\x5a\x24\xa2\x0f\xed\x1f\x29\xe1\x9b\x10\x3e\x53\x36\x0f\x7a\x84\x56\x8a\xf1\xc3\x86\x08\xfd\x90\x7c\xc4\x8e\x9f\x29\x1f\x76\xc3\xdb\x0b\x5f\x35\xe5\x83\x86\x5a\xf7\xb2\xea\xcc\x3a\x4a\x1d\xd1\x15\xd7\x4a\x33\xb9\x11\x0c\x6d\x5b\x5c\xe9\x43\x76\xe0\x61\xf5\xb6\xab\x6a\xae\x64\x6d\xf4\x1e\x56\x22\xd7\xdd\x7e\x57\x84\x23\xb4\x54\x30\xb9\x2a\x1f\x1a\xad\xdb\x45\x3e\x62\xde\x58\x45\x1d\x57\x79\xe2\x9f\x1d\xfd\x21\x29\xc8\x47\x58\x2b\xe2\x6d\x5b\x9f\xc2\xc8\x87\xe5\x5f\x62\xf8\x0e\x42\xae\xd3\xb6\xce\x95\x1d\xd9\xe1\x48\x7d\xd6\xfc\x90\x8d\x1c\x36\x05\x86\xb6\xb2\x21\xb5\xd5\xa2\xb6\x0a\xd7\x56\x31\x5b\x07\xb7\xc3\x60\xc5\xb3\x9e\x3f\x6b\x60\x4e\xac\x18\xb1\x1d\xf4\xd1\x7c\x74\x2b\x18\xe0\x5b\x19\x87\x3c\x22\x2a\xf2\x55\xe5\xc4\xa3\x23\x76\xdc\x6a\x34\x9b\x36\x6e\x2c\xfe\x62\xd4\x87\xbc\x95\xd9\x9b\x34\xa8\x95\x38\xf8\x23\xac\x95\x49\xab\x64\x8f\x9f\x3c\x88\x8a\x8e\xd4\x06\x0c\x7f\xe6\x6c\x9b\xf8\xc9\xcf\xcd\x2b\x6c\xc4\x62\x5f\xfc\x85\x3e\x76\xb9\x54\x07\xec\x88\xac\x34\x6c\x47\xdf\xea\x1f\x56\x73\x5c\x8d\x73\x55\xc9\x8f\x98\xb1\x1f\xc8\x0e\x9b\x5c\xe0\x1f\xd8\x36\xb9\x1d\xa9\xad\xf7\xc3\xe0\xf5\x50\x86\x4f\x10\x11\x6d\x03\x1f\x39\xfc\x84\x47\xb7\x75\xe1\x0f\x1a\x64\x95\xde\x86\x79\xf7\xdd\x47\x6c\x56\x83\xee\xa0\x68\xcd\xcd\x57\x01\x6d\x75\x3a\xe8\x88\x7e\xa5\x64\xbb\x15\x76\x25\x1e\x3e\x6e\x15\x35\xf8\x80\xae\xd4\x61\xeb\x69\x7e\x84\xb6\x9a\xdc\xca\x1a\xf8\x63\xeb\x1f\x6f\xb7\xb2\x76\xb3\x93\xd5\x5b\x20\x4b\xb5\x4e\x20\x7f\x18\x32\xf6\x91\x36\xbc\x95\x53\xa1\xd5\xd2\xb0\xe8\xb3\xfb\x9f\xbc\xd8\x98\xb4\xb9\x88\x68\x2b\x3e\x6e\x94\xa3\x1f\x63\xdb\x56\xdc\xb0\xac\xa2\x3d\x6c\x88\x3e\xda\x84\xae\x2c\x5d\xed\x60\x65\xfe\xe7\x3f\x6c\x53\xa3\x2f\x75\xf8\x58\xde\xba\x0c\xb6\x2d\x83\x6e\x21\x04\xf9\x41\xb7\x52\xb0\xca\x98\xda\x6d\x6e\xf2\xb8\x55\x51\xb7\xf9\xf0\x0e\xfd\xae\xb4\x5b\x5d\x78\x33\x1b\xf2\x53\x38\xf9\xe4\xe2\xab\x57\x43\x0e\x9b\xdb\xc6\x3e\x46\x48\x1d\xc9\xed\xf3\x0c\x6c\x73\xfc\xf8\x4a\xe2\xaf\xe8\x3c\xfc\xd8\x2f\xf1\xa5\xe2\xab\xdf\xfc\xec\x09\x3d\x52\xd5\x96\xdc\x22\x9b\x27\x83\xa2\x75\xdd\x8f\xd7\x81\xbe\x9b\xc9\x4f\xe7\xb4\xee\x09\x1d\x56\x47\xb7\xee\xe6\x83\x6e\x75\x29\xe0\xb0\xf1\xf5\xb0\x2d\xfd\x61\xf6\xba\x6b\x78\xa9\x88\xcd\x17\xa0\x19\xf4\xa9\x79\x60\x1f\x37\x79\x84\x3e\xca\xb8\x29\x24\xb6\x79\xbd\x03\xb4\xe2\xfd\x15\x09\xe8\x77\xb5\xde\xfe\xfb\x8d\xcb\x59\x65\xb7\xe2\xf9\x72\x0f\x1f\xf5\x22\xd6\x4d\x7f\xed\x8c\xfa\xee\x30\xb0\x0d\x15\x79\xf8\x8e\x71\x63\x2d\xfe\xd1\xeb\x8f\xcb\x40\x77\xeb\xe2\xd8\xc7\x83\xe2\x1f\x9b\x40\xfe\xb7\xd3\xc9\xcf\x74\x74\x51\x21\x6c\x87\x11\xd1\xaf\x85\x4f\x6c\xc6\xb0\x8a\x6f\xa3\x79\x53\xd2\x8d\xed\xc8\xe6\x59\xb6\x03\x24\xfa\xc8\x04\x3d\x92\x1f\x0e\x7e\x3e\x9b\xda\xdc\xdb\xee\xf3\x81\x0d\x71\xf8\xd2\x5e\xf2\x33\xe3\x43\xea\x7a\xc0\x46\xd0\x77\x58\xf2\x0b\x96\xfa\xe1\xca\xd0\x5f\xb9\xb2\x9f\x7e\x7e\x93\x19\x11\x7d\x77\xf4\xc8\x0f\xb7\x43\x6e\x12\xdb\x6d\x64\xe3\x9f\x13\x0e\x59\xdf\xaf\x6a\xff\x9d\xd7\x2a\x84\xef\x70\x70\x75\x86\x5f\xd6\x00\x1f\x36\x0f\xb3\xae\xbb\xaa\xed\xe7\xd4\xdf\xfd\x38\x15\xa1\x4f\x88\x10\x6d\x12\x3e\x42\x5f\x6e\x0b\x59\xf7\xf1\xd3\x7d\xad\xbb\xfb\x3a\x9f\x36\x2f\xbe\xae\xff\xd9\xca\x91\xfc\xee\xf5\xd6\xa3\x89\xfc\x07\xe7\xb1\x9d\x28\xdf\xfb\x56\x5b\xdc\x34\xe5\xeb\x68\xd9\x74\x8e\xfa\xa2\x10\xda\x6d\xd8\x56\x15\x54\x21\x6a\x87\xc3\x1f\xf5\x5b\x97\xdb\x8e\x24\xfc\x23\xce\x8f\x90\xa1\xaf\x13\xe7\xe3\xa3\xbf\xb6\xb1\x1a\xd3\x6a\x11\xc8\x77\x47\x87\x1c\xbe\x0e\xa1\xef\x07\xf6\x26\xc3\x2f\xa7\xfc\xc5\xee\xdf\x4d\x9d\x90\x9f\xa9\xd3\x1f\x06\xb8\xe8\xbf\x17\xe0\xae\x19\x17\x4e\x7d\x02\x5c\x02\x3d\xc2\xe0\x57\x80\x8b\x91\x47\x62\xeb\x87\x7f\xf9\x46\x12\x47\x02\xfc\xef\x06\xb8\xbf\xcd\xeb\xef\x54\x72\xbf\xe3\x7f\x90\xa8\x13\xbf\x4d\x8c\xef\x64\x12\xdf\xb1\x3f\x48\xbc\xa1\xdf\x46\xcf\x77\x24\xc1\xef\xbf\x1f\x3d\x1f\x71\x08\xfe\x6d\xe1\x20\x8a\xc3\x24\xfc\xa3\x44\xfd\xb7\xe0\x48\x14\xfd\x51\x9d\x81\xc0\x7e\xa7\x6e\x40\x84\x64\xfc\x07\x75\x00\xf2\x77\xea\x18\x51\x10\x40\xd1\x1f\xd5\x01\x88\xdf\xc6\xff\x61\x44\x92\xe1\x1f\x90\x4f\xc1\xbf\x85\x0f\x12\x3c\x0a\xfe\x08\x1e\xff\x9d\x64\xe4\x8e\xc6\xd4\xef\xc3\xff\x99\x75\x83\xec\x00\x13\x0e\xf4\xfb\x7a\x8f\xfe\xcb\x92\xc1\x3f\xcc\xfe\xaf\x56\x0b\xbe\x77\xac\xd4\x3e\x9a\xbc\xfe\xe5\x5b\x98\x0c\x49\xf9\x4f\x85\xc5\xff\x5e\x55\xb1\xf9\xbb\x2c\xf8\x77\x59\xf0\xef\xb2\xe0\x5f\xab\x2c\xb8\x66\x58\x7f\x5a\x59\x10\xdf\xf2\xbd\x35\xea\xa3\x8e\x64\x04\x1e\xe0\xdd\x56\xec\x23\x8e\xd4\xe1\x93\x07\x43\xdf\x63\xac\x2d\xe9\x5a\xe3\x1d\xf2\x13\x78\xad\xd1\xfb\x1a\xd6\x7f\x95\x05\x3e\x79\x21\xbc\x86\x1f\xe4\x0e\xdd\x62\xc4\xdd\x1a\x4b\xad\xd9\x17\xb5\x23\xb6\x8f\xe9\x89\xcf\x0d\x43\xdb\xcd\x07\xc4\x0e\xfd\xdc\xcf\xb3\x23\xb6\x18\x0c\xd9\xc2\x8c\x1d\xb6\xc5\xf7\xf8\xee\x93\x23\x6c\xc0\x07\xf4\x33\xf9\xf0\x85\xa4\x5d\x93\x95\x35\x24\x21\x3e\x79\x52\xb4\x85\xa7\xeb\x1f\xfc\x75\xcb\xc2\x07\x18\x5d\x2a\x74\x8b\x58\x22\x70\x2b\x84\x60\xbb\x35\x88\xc2\x77\xdb\x9d\x45\xbb\xef\x39\xeb\x1a\x34\x6f\x6d\xbb\x85\xcc\xf8\x56\x1f\x21\xa2\x2d\x8d\xdb\x42\x57\x78\xdb\x3a\xbe\xdd\xd3\x02\x7e\x02\x5b\xec\xf0\x49\x6e\xd6\xec\x03\xda\xc2\x22\xf8\x13\xf9\x6e\xfd\x44\x7b\x40\x76\x47\xfc\xb0\x61\x8d\xbe\xd2\xfc\x2d\x8c\xdf\x6d\x40\xbb\x2d\x31\x80\x37\xa1\x81\x5b\x89\xf4\xb0\x95\x48\xbf\xaa\xa8\xc4\xdf\x55\xd4\xbf\xab\xa8\x7f\x57\x51\xff\xae\xa2\xfe\x5d\x45\xfd\xbb\x8a\xfa\x77\x15\xf5\xef\x2a\xea\xdf\x55\xd4\xbf\xab\xa8\x7f\x57\x51\xff\xae\xa2\xfe\x5d\x45\xfd\xbb\x8a\xfa\x77\x15\xf5\xff\xc2\x2a\xea\x13\xf9\x6b\x7d\x2b\xbd\x9e\x7e\xfe\xc0\x12\x49\x7d\x9e\x46\xfd\x0e\x08\xcf\x9d\x9e\x56\x2b\xf8\x52\xe8\x18\x77\xca\xe4\x05\xe6\x54\xf8\x8c\x29\xe9\xe7\x0c\x1d\xdf\x1a\xc2\xb5\x37\x54\xd5\x45\x9d\x0c\x81\xd1\x66\xa5\x13\x3f\x62\xbc\x0f\x8e\x20\xda\x50\x92\x12\x99\xbc\x58\x8d\x4e\x1a\x78\x61\xe8\xc5\x75\x0c\x87\x9e\x36\xe9\x41\x26\xce\xd1\x92\x84\xdd\xf2\x5e\x90\x21\xa1\x28\x02\x05\x5d\xd3\x3c\x15\x6e\x8d\x45\x49\xd8\xa3\xd1\x09\xb7\x54\x9f\x48\xc0\x87\x49\x9f\xde\x54\x84\xb8\x53\xeb\x0c\x51\x52\x55\xe1\xdc\x52\xf3\x15\xdf\xf7\xa7\x33\xd9\x04\x7a\x72\x9f\x9f\xb1\xce\x71\x98\x5f\x65\xd8\x08\xe3\xa3\x5a\xf0\x59\x43\x9e\x3b\xae\xeb\xf9\xcb\x4d\x60\xdf\x83\x06\xa0\xfd\xf9\xa6\x89\x27\xf0\x8a\x51\x1c\x46\x7a\x00\x0b\x13\x81\xa0\xd1\x0a\xe2\x75\x59\xd5\x8e\x23\x26\xb2\xb3\x86\xee\xfb\xa5\xdf\x5f\x94\xce\x68\x6d\x7d\xd2\x8d\x09\xbf\xa9\x74\x63\x3c\x18\x7a\x24\x2e\xfb\x90\x77\x58\x55\x35\xd2\xd7\x9c\xb6\x7b\x45\x68\xa1\x6c\x1f\x8b\x31\x19\xd6\x01\x68\x54\xde\x85\xba\x28\xf8\xd9\x4f\x47\x7a\xb8\x08\x37\x59\x6e\x66\xc4\x41\x51\x36\xd5\xee\x03\xe1\x4f\x64\xa3\x9c\xf6\xa5\xcd\xa7\xc3\x22\x90\x7e\x9c\x2d\xfb\x1a\x85\xda\x9a\x16\x4d\x11\x4b\x6d\x7e\x64\xcb\x25\x3b\xc5\x43\xd7\x09\xd3\x5d\x9b\x7d\x19\xe4\xeb\x73\xb3\xc8\x32\x96\x88\xd1\x1d\x7a\x9d\x1a\x48\xbc\x4c\xdd\x63\x94\xf6\xcf\xfb\x50\xa1\x29\xe0\x42\xaf\xee\x9c\x26\x6f\x9f\x87\x2d\xef\x6c\x49\x0a\xb5\x77\xc1\x47\x01\x56\xac\x95\xd1\x13\xe7\xa5\x86\x9c\x86\x9a\x37\xdd\x5e\x08\x36\x18\x32\x9b\xcb\x46\x61\xd9\x5e\x1c\x41\xfb\x34\x8a\x32\x48\x38\x89\x7a\x25\xf7\x52\xca\xb0\x71\x84\xe3\xaf\xb3\x71\x52\x45\x6a\x0f\x69\xd2\xd3\x9e\xcb\x69\x3a\x75\xbd\x8b\xa7\x7c\x7e\x95\xfa\xbd\x86\xce\x8f\xd8\x4d\xbb\x19\x9c\xaf\x55\xac\x3d\x84\x25\x1a\xe5\x87\x0f\xaa\x36\xa1\x2a\xdd\x5e\x7a\x34\x56\x10\x43\xb8\xd0\x48\x13\x12\x02\x34\xc8\xdd\x08\xc1\xf7\xea\x36\x7e\xd2\x0f\x5b\xe5\x2e\x0f\x09\x5b\xf4\xf4\xde\x30\xad\xd9\xc4\x59\x26\x66\xb7\xd3\x9d\x61\x6c\xa0\x16\x69\xd1\xec\x26\x57\xba\xa4\x58\x79\x85\xb5\xee\x2d\x61\xb1\x02\x5a\x0c\x26\x9f\x17\xa5\x89\xcb\xe6\xe5\x05\x17\x3e\xe8\x74\x71\xe9\xe4\x17\x96\x8a\x88\x85\x71\xda\xa3\xa7\x65\x4c\x7b\xc8\xe7\xbb\xee\xcb\x12\xd8\x14\x4c\x61\xc5\x49\xc5\xe6\x56\x6a\x01\xef\xc2\xd0\x14\x2b\xd1\xbb\x89\x79\xa0\x8a\xc5\x8e\x77\xa1\xe3\xc1\xe2\xfd\x7a\x79\xc4\xcd\x51\xeb\x9e\xf2\x4a\xd5\x9b\xe1\x92\x50\x79\x30\x5e\x68\x24\xa7\x35\x63\xf6\xf1\xc1\x9d\x58\x1c\xb2\x7d\x14\x5a\xae\xb3\x16\xf9\x19\x0e\x18\xac\xe6\x19\xc3\x92\x63\xb1\x89\x50\xf5\xc9\x79\x41\x8c\x3d\xf7\xaa\x48\xd3\x66\x2b\xe0\x5d\x18\x26\x68\x2e\x73\xd0\x9b\xb8\x54\x58\x2e\x30\x71\xe5\x42\x56\xcb\xdd\x4b\x25\xef\x19\xbc\xf5\x28\x70\x4f\xd3\x06\x77\xa2\x5d\x22\x76\x41\xbf\x5e\xd2\x3f\xf7\xd1\x36\xd5\x13\xfd\x8b\xf9\x0e\xe6\xc7\xa3\x6d\x0a\x8a\x7a\x83\x10\x6d\x4f\x04\xf5\x6c\xdf\xd7\x77\xff\x70\xba\x30\x4a\x82\xb0\xbe\xb5\x28\xe7\x9b\x27\xab\x51\x33\x9c\x4b\x5f\x04\xf1\xae\xf7\xf4\xbd\xa1\x81\xbd\x74\x47\x99\xa6\xd8\xb3\x20\x7b\x9f\x1c\x93\x63\xb2\xbd\x04\x6b\xaf\xdb\xf2\x7e\x5a\x10\xe7\x0c\x61\x67\x23\xd6\x59\x8f\x2a\xd2\xb2\xca\xf6\x5c\x26\x51\x5b\x53\xf1\x95\x40\xea\x0b\x89\x39\x00\x43\x9d\xc0\x13\x41\x5e\x94\xb8\x03\x14\xae\x34\xa0\x5e\xf5\xe7\x50\xa2\x53\x89\xaa\x29\xea\xe2\x4e\x4d\x42\x22\x75\x91\x2f\x54\xc6\x71\x41\x82\x20\xe0\x79\x98\x14\x94\xbc\x60\x90\x37\x55\x40\x52\x6b\x9d\xac\x87\xce\x48\x67\x20\x1f\xe1\x85\xff\xf4\x82\x8e\xd2\xeb\x12\x16\x19\x16\x84\x4f\xef\x87\x8a\xf9\x44\x86\xea\xe4\x9e\x10\x3a\x49\x70\xce\x28\x75\x79\x4f\x76\x5d\x12\x7d\x24\xc5\xf7\x6c\xd8\x33\x12\x37\xec\xef\x4c\xf4\x20\x9e\x40\xe7\xa9\xfa\xbb\x85\x4d\xcf\xb9\x8e\xe8\xc5\x83\xed\x5a\xb8\xbe\x3d\x36\x0c\x7d\xa2\x7b\xaa\x2d\x0d\x21\x02\x67\x71\xf4\xc5\x40\xd3\x33\x2f\xda\x67\xa5\x05\x75\x3d\xa3\xd8\x82\xb7\x5a\xfd\x5d\x4d\x13\xbf\xc0\xe5\x3b\x40\xde\xf5\x93\xee\x10\x11\x0f\xe2\x34\x36\x32\xe6\x59\x25\x4a\x21\x34\xb1\x56\xb5\x8f\xe7\x45\x6f\x3c\xe6\x6d\x5c\xb9\xa8\x12\x04\xcd\x22\x72\x44\x35\xb9\x65\xd1\xd9\x11\x18\x86\x80\xcc\x0b\x7b\xcf\x5e\x8c\xa9\x82\x50\x86\xc9\x86\x73\x74\x52\xc4\xa7\xa8\x5f\x2f\xf4\x79\x9a\x12\x25\x7c\x9b\x29\x5d\xf8\xfd\x83\x89\x4f\xa8\x88\x35\xee\xd9\xf5\x6c\x17\xa2\x7c\x05\xf5\x5e\x7d\x4d\xab\x42\x56\xbf\x20\xe6\xe5\xfa\x69\xe0\x43\x2a\x7d\xa2\x2d\xe3\x92\xdb\x14\xbe\xc8\x4b\x61\x13\x78\x35\x26\x59\x70\x19\x26\x3c\xa3\x7a\x75\x20\x64\x41\x43\xcc\xe6\xa9\xa0\xcd\x95\x96\xd0\x93\x99\xa1\xa3\x55\x22\x14\x35\x95\xc1\x1e\x04\xfd\xd0\x44\xe6\xb7\xb4\xa8\x94\xb5\x58\xaf\xf4\x7c\xae\x1b\x39\x2a\x4a\xf1\x7d\x02\x49\x36\x3a\x3f\x6a\xa6\x53\x14\xb6\xb5\x78\x51\x7c\x5a\xee\x79\x38\x75\x9c\xac\x35\x42\xfe\x7c\xb6\x67\xb0\x2f\xa5\x96\xe3\x6c\x96\xa5\xaf\x6a\xc9\x18\x85\xd6\x07\x19\x3f\xe7\xb7\x6b\xa4\xb4\x95\xc0\xc8\x81\x31\x05\x97\x02\x43\xae\xe5\x29\x91\x0b\x95\x00\xe9\x07\xdd\x34\x6c\x9a\x31\x97\x82\x6a\xe5\x4e\x1a\x5e\x9d\xfe\xb2\x50\x81\x09\xcc\xfa\x6c\x99\x1e\xd9\x3d\x60\xee\x92\x21\xa5\xc0\x60\xc6\x08\xdf\x34\x41\xc6\x14\xb3\xc1\x47\xb4\x95\x3b\x38\x4d\xe9\x65\x1e\xf3\x98\x56\x35\x80\xea\x25\xdd\xba\xa5\x25\xa3\x70\x17\x4c\x10\x90\xca\xe4\x90\xf1\xc4\x53\x2f\xc7\x1c\x9a\xd3\xdb\x7e\xde\xeb\xbd\xcd\x1b\x32\x08\x10\x56\xd6\x8d\x61\x73\x3a\xe3\x8f\xf8\x44\x9a\xb7\xc9\x62\x31\x22\xb3\x1c\xfe\x1a\x12\x09\x06\xc0\x3d\x28\x4c\x2f\xfd\x74\x6e\xc6\x3d\x99\xdf\xd0\xd2\xf7\x61\x43\xec\x91\x3c\xce\xa4\xe9\x42\xf8\xc4\x93\xa4\xe9\x91\x56\x58\xf1\x26\xf3\x3a\x23\xb2\x7f\xba\xaf\xf8\x8b\x3d\x75\xf7\x67\x9c\xd1\xfe\xf8\x21\xc7\x3e\x34\xe3\xf2\x55\xd5\x36\x13\x36\x01\x68\x27\xb6\xc1\xe5\xb6\xc8\xb2\xd0\xfe\x5c\xbd\xb3\xa9\xf1\x3a\x20\x65\x06\xef\x9c\x13\xa8\x74\x47\x69\x07\xf4\x91\x56\x93\x05\xd0\xb7\x03\x89\x7d\x35\xd2\xfd\x91\x3a\x56\xc6\xe7\xa2\x80\x76\xdc\x25\xbe\x00\xf7\x4b\x72\x09\x2c\xb9\xcb\x13\x4c\xbc\xf5\xc4\x73\x59\x90\x04\x88\x88\xa5\x93\x45\x29\x90\xd0\xa1\xa6\x9e\x7b\x40\x47\x32\x34\x41\x03\x5c\x1f\x70\xbe\x31\x18\x2e\x9f\x09\x1d\x7b\x47\x90\x0e\x79\x1d\xee\xe9\xa4\x8a\x25\x0f\xaf\xc1\xed\xf3\x3e\x76\xc3\x3e\xa9\x92\xab\x18\x3f\x07\x2d\xce\xb5\x84\xf2\x07\x43\x49\x50\x26\x47\xf5\xea\xfa\x34\xab\xf9\x45\x56\x04\xf4\x7e\x12\x28\x33\xc9\x02\xdc\x8d\xd2\x69\xa0\x9b\xfd\x1d\x28\xa1\x2b\xec\x3f\xc1\x25\x4a\x4e\xf9\x72\xbf\xdc\x02\x60\x32\xeb\x3b\x63\x66\x22\xca\x1a\x2f\xda\xcf\x1b\xc6\x4d\x3c\x6e\xa6\x49\x2e\xc7\x93\x1c\x8a\x12\x8f\x85\x3c\x66\x7c\x5f\xbd\x93\x7e\x82\x07\x17\x8f\x22\x86\x61\x54\x09\x67\x5a\xcb\xe6\x8d\x25\x28\x44\x05\x9f\x18\xb0\x1b\x1e\x33\x33\x99\xda\x14\xb3\x5d\x04\x7b\x77\xd2\xa4\xae\x73\xe0\x5e\xb9\x4b\x0a\x5f\x1f\x77\x27\x1e\xf1\xec\x25\x35\x3c\xc5\xc0\xe2\x54\xf0\x9c\x5b\x2a\x27\xa2\x45\x93\xae\x4b\xe0\xc2\x7a\x82\x0d\x67\x26\xcb\xdb\x18\x59\x49\xa2\x91\x46\x3c\xbd\x41\xa0\x92\xd5\x8a\xc7\x90\x57\x03\x23\x2e\xba\x1f\x31\x6b\x6f\x60\x4d\xd6\x84\x94\x87\x74\xe9\x29\xbd\x90\xb6\x62\xd0\x2c\x4b\xa4\xea\x44\x55\xb2\xa1\x23\x20\xef\xe2\x15\x7f\x7a\xfa\x39\x39\x45\x67\x3e\x5e\xd4\x3e\x7a\xdc\x0b\x39\x7a\x5f\xef\xd5\xab\xca\x05\x9f\x99\x58\x01\x90\xe2\x7d\x1a\xcc\xf2\x79\x6c\x8c\xc7\x29\x7e\xd3\xd8\x80\x9e\x64\x82\x7d\xa1\xa8\xfc\xb8\x69\xee\x33\x48\x83\xd7\x93\x30\x68\xb6\x68\xc1\x13\xb5\xd4\x2e\x82\x63\x79\x00\xa3\xdc\xd2\xf0\x5c\xb3\x5c\xce\xe1\x89\x4c\x9c\x4e\xb4\x32\xef\x74\x1d\xb5\x77\x10\xd5\xad\x48\xbc\x70\x65\x69\xf9\x3e\xa0\x4b\x4d\xaf\xa8\x8c\xe0\x2c\xcb\x79\x28\x33\xab\x16\xcf\x27\x27\xed\x45\x0b\xb6\x3a\xc3\xa5\x21\xb3\x94\x1b\xd0\xc3\xf0\x1a\xf6\xf6\xb8\x71\x2a\xaa\x82\x0b\x8a\x49\xa0\x5c\xd5\x79\xb9\xb3\xbc\x6f\x01\xe6\xdd\x65\xfe\x7d\x70\x17\xc8\x4e\xf7\x8b\xcd\x45\x0f\x55\x57\x2b\x30\x43\x9e\x13\xff\x10\xaa\x00\x61\x43\xa9\x67\xfb\x98\x68\xd4\x08\x54\x14\xe8\x96\x56\x7c\xf9\x14\xcf\x9d\x8b\x30\x7b\x08\x3b\x49\xa2\x26\x5d\xdf\xaa\x2f\x95\x97\x13\x91\x83\x36\x0a\x69\x6f\xa9\x36\xf9\xb9\xf4\xc3\x1e\x35\xb1\x97\x11\x1a\x4c\x40\x67\x14\x76\x77\xe4\x1b\x5b\x3f\x0d\xb6\x0e\x29\xee\xed\xde\xe6\xb7\xc9\x9b\x16\xae\x71\x89\x3d\xee\xe7\x53\xe0\x65\xc4\xbb\x43\x59\x94\x21\xe7\x3d\x35\x14\x63\x4d\x14\xa3\xac\x99\x4f\xae\x09\xa8\x20\x17\x64\xc6\xaf\x85\xbd\x19\x99\xfc\xcb\x80\x13\xa8\x42\x4c\x92\x61\x52\x7a\xa6\x8a\x85\x9a\x5b\x96\xc7\xff\xe4\x47\xe8\x35\xf1\x5f\xec\x47\x60\x73\xec\x67\x8e\x52\x7c\x7e\x81\x03\xa8\xc2\x1e\x11\xee\x3c\x24\x9b\xa6\xfd\x74\xfd\x2c\xa1\x15\x8d\xb1\x4d\xdb\x99\x89\x68\xa6\xec\xe2\x82\xcb\x2e\xb0\x57\xc2\x0e\x94\xf4\x56\xe8\x73\x34\x55\x98\xd0\x7e\x09\x81\xdd\x7b\xfc\xd5\x96\x59\x3f\x00\x1f\x16\x36\xdf\xe0\xdb\x05\xc3\x88\x10\x53\xab\xab\xf7\x4c\x2b\x4e\xaf\xef\x97\x88\x78\x2c\xb5\x2a\x4a\x9a\xaf\xe7\x60\x9c\x60\xf6\x50\x3d\x2f\xe6\xf4\x7c\xf0\x40\x11\x6a\x2f\x17\x04\x31\xce\xe9\xc9\xab\x3b\x42\x27\x02\x23\x6f\xf7\x42\x48\xb5\xf4\x5c\x75\xf3\x64\xe9\xe6\xe3\x2c\x3d\x40\xe3\xea\x02\x26\x97\xfb\xa2\x27\x86\x04\x57\x22\x30\x90\x78\x6f\xa7\x8d\xc1\xd4\x62\x27\xaa\xca\x5f\x2c\xd8\x34\x6c\xfc\xc4\xa9\x14\x33\x80\x0c\xbf\x28\x1a\xd8\xcd\xd8\x5c\x4b\xc5\xb8\xa8\xa3\x3d\x66\xb0\x30\xaa\x71\x14\x72\x39\x7b\x33\xbc\xb2\x78\x09\xec\x93\x6f\xf4\x2b\x30\xe6\x19\xe4\x3f\x14\xa9\xa6\xb5\x88\xdb\x03\x76\x40\x85\x3d\x32\x9e\x4b\x71\x78\x33\x37\xb6\x4a\x3a\x78\x6f\xe1\x2a\x8f\xa5\x68\x23\x96\x37\x8a\x06\x24\x02\xf4\x58\x2e\xcb\xb8\x64\xd2\xb5\xab\x50\xb5\xe3\x99\x19\xa3\xba\xf7\x0a\x81\xc4\x1d\x4b\xbb\x4d\x4e\x0f\xf6\x85\x62\x89\x35\x13\xbd\xca\x5a\x43\x4f\x0d\x6b\x48\x81\xd4\x4b\x03\xa1\xd8\x4d\xa3\x5e\x52\x83\x78\x11\x98\x42\xd3\x21\x46\x31\x54\xca\x32\x27\x4b\x4e\x5f\x49\x65\xbe\x29\xb4\x52\xe5\x8a\x83\x51\xf6\xae\x92\x75\x48\x5c\x4f\xbe\x68\x68\xca\x93\x2e\xec\x22\x0a\x71\xfc\x3c\x8b\x8c\x20\xf0\xae\xe9\x28\x18\x91\x0a\xfc\x09\x7b\x3d\x48\x65\x1a\xa3\x00\x7e\x59\x08\x7f\x0b\xfa\xb4\x5a\xe8\x11\x46\x63\x13\xf0\x8c\x74\xec\x5a\xd6\x62\x1e\xba\x14\xbb\xa1\xdd\xf0\xb0\x7d\x56\x98\xda\x21\xe9\x08\x88\x72\xf7\xd4\xca\x14\x90\x96\xae\x52\x73\xb8\x0c\x0f\xa9\xde\x2e\xed\x25\xbe\x18\xf1\x3d\x31\xa0\x08\xb8\x66\x72\x73\x4d\xb9\x9a\xa2\x11\xd9\xe6\x39\x00\x83\x63\x14\x9b\xa2\xec\xd6\x0e\xcd\x9b\xc3\x99\x3b\x70\xc3\xc1\x77\xee\x20\x06\x75\x03\xc0\x30\x14\x6d\xa8\x6f\x9e\xbe\x58\xdc\x79\xd3\x32\x10\x27\x6c\xd5\xb1\x04\x5f\xe5\xab\x91\x68\xb3\xb2\x1a\xdd\xf7\xdc\x19\x8c\x9b\x37\x41\x29\x77\x46\xe5\xf9\x98\x7c\x88\x2d\xd0\x1b\x88\x5f\x12\xfa\x59\xd0\x84\xb0\xe7\xbd\xdc\x81\xdf\x39\x7b\x27\xc9\x7b\x33\x78\x19\x13\x36\xc0\xf0\xd2\x91\x0e\x84\x81\x9b\x5f\x9d\x85\xd7\xb5\x58\x7c\x08\x07\xc5\x86\xea\x79\x35\x14\x64\x32\x33\x01\xed\x1d\x7b\x9d\xd0\xdb\x4e\x55\x57\xb3\xe5\x88\xe9\x05\x1d\x50\x45\xa5\xe9\x87\x99\x56\x97\xbd\x75\x3e\xe7\x7f\xba\x4d\xff\xc5\x9e\x86\x97\x74\x3f\x7f\xbe\xf5\x01\x49\x27\x9e\xb7\x81\x9c\xe8\x89\x1b\x8c\x24\x64\x27\xa6\x75\x22\x1a\xfa\x88\x64\x37\xae\x28\x32\x23\xb7\xfa\x51\x35\x4c\x3e\x0c\xd0\xde\x4e\x9f\x4e\xc9\xbe\x07\xde\xc8\xfa\x77\xc1\x36\xee\x2b\x32\x0c\xb0\xb9\xd2\x81\x2f\x6b\xaf\xf3\x9c\x8a\xfc\x98\x9e\x58\x8b\xc1\xe5\xba\x26\x12\x2f\x8a\x3d\x40\xac\xe2\x93\xa3\xbb\xbe\xa0\x23\xe9\x48\x90\x10\x81\x00\x43\x35\xf8\x85\x61\xb4\xf4\xa8\x0d\x51\xf1\xa2\x70\xbb\x9e\x25\x3e\x23\x80\x18\xed\x88\xde\x8e\x01\x72\xde\x93\x98\xbe\x0f\x3d\xcb\x43\xd3\x77\x91\x49\x78\x7d\xf6\x75\x97\x50\xde\xde\x93\x91\x61\x7f\xca\xad\xc6\xca\xb2\x1e\x65\xfa\x17\xa4\xe9\xcd\x9d\x4b\x5e\xf1\xfb\x86\xdc\xd0\xa8\x24\x38\xf4\x8c\xd8\x1d\x8d\x39\xb3\x43\x97\xd5\xb9\x79\xf7\x14\x7d\x87\x6f\xf4\x13\x2a\x23\xd6\x40\xea\x57\x9a\xf7\x72\x15\xfa\x48\x09\x30\xa7\xbd\x5a\x9f\x54\x4a\x74\x14\x1d\x74\x47\x44\xd6\x68\x04\x61\x8d\xc6\x30\x6a\x85\x44\x50\xe1\x41\xa0\xba\x2d\x16\xb4\xc6\x4b\x05\x6b\x59\x6d\x40\xa6\xc6\x2b\xf5\xaf\x52\xc4\x80\xba\xd3\x7a\x0c\x02\x91\xa2\x54\x9b\x39\xeb\xb8\x6c\xf1\x34\x05\xba\xdd\x3f\xb0\x54\x2e\x69\xb4\x83\x29\x31\xcd\xd0\x18\xec\x40\x54\x90\x3b\x4a\x37\x5e\x02\x6a\x0b\x69\x5f\x59\x3c\x4d\xd2\xcf\x24\xe0\xcb\xbc\x74\x43\xdf\x74\x66\xa0\x6c\xeb\x16\xd0\x20\x83\x29\xa6\x8e\xd7\x04\xf4\x31\xe9\x53\x94\x46\x0c\xc4\xde\x9c\xcb\x7b\x50\xbb\x44\xc6\x24\x83\xeb\xce\x67\x49\xcc\xf6\x7b\x3d\xf2\xa8\xdc\x1f\xdd\x87\x27\x23\xc4\x7e\xd0\x41\x37\xf6\x0b\xf0\xd4\x51\xd4\xa3\xf3\xc8\xf3\x3c\xba\x42\x61\xb0\xd9\x88\x76\xd1\x3e\xba\x45\x43\x29\x10\x6f\x75\x49\xf6\x7d\x18\x4e\x1a\x0a\xde\xd5\xa0\x34\x55\x4e\x07\xf0\x6e\x0c\x72\x3b\x91\x89\xb1\xbc\x81\x57\x0e\x0c\xb0\x4c\xb9\xba\x53\xb3\x1a\xaf\x2c\x3f\xdf\xaf\x93\x7c\x6e\xcb\x6b\x3b\xc3\x20\xd5\xc2\x63\xad\x0a\xcc\xd5\xd7\x6e\x8f\x08\x68\x94\x8e\x4a\xf5\x41\xb9\x4c\xfb\x6c\x72\xce\x92\x6c\xc1\xbe\x8b\x3d\xd9\xd0\x9a\xcf\x57\x51\x95\x09\x02\xbb\x90\xce\xcc\x8c\xdc\x39\x86\x95\x2b\x57\x02\x1e\x96\x93\x03\x62\x11\x9a\x33\x52\xc3\x39\xc4\xa0\x4e\xba\x72\xbc\x3d\xf2\x22\xad\xb1\x13\x0c\xbc\x3d\x9e\x17\x84\x3f\xf3\xe9\xf6\x4d\xdc\xfd\xc5\xec\xee\xf9\xc3\xee\x8a\x05\x92\x24\x88\x37\x26\x60\x4f\xb0\x01\x7e\x2e\x5e\xb3\x9f\x9f\xc9\x48\xe6\x9f\xb4\x11\x32\x86\xc0\x55\x60\xeb\x5c\x5a\x81\xb1\xa8\xb1\xc3\xe4\xcb\x35\xe5\x45\xac\x1b\x27\xa7\xbc\xed\x3d\xbe\x96\xb5\x5c\x4a\x33\x5f\x9e\x26\xac\x1e\xf9\xa7\x24\x79\x41\x6e\xd1\xa9\x2c\x56\x6a\x0e\xc6\x30\xd2\x93\x7b\xe4\x4a\x5c\x82\xdb\x99\x57\x15\x91\xaa\x2a\xbd\xd6\x80\x11\x1a\x18\xbb\x79\x2a\xba\xa6\x65\xa6\xeb\x9d\x2e\x33\x97\x82\xf5\x44\xc2\xd7\xfc\xdc\xdd\xf4\x52\x77\x1a\xed\x79\xef\x22\x38\xba\x36\x5d\x74\xea\xa6\x09\xc4\x8b\xd8\x7b\x5a\x06\xc0\x0c\x8b\xcc\x5b\xb7\x45\xe2\x2a\x7a\xc1\xe7\xbd\xd6\x3c\x2e\x8f\x27\xa7\xde\xf2\x97\xa9\x4b\xa9\xd6\x08\xb3\xab\x92\xdc\x5b\xb6\x1d\x22\x98\x2e\xfb\x34\x7a\xa2\x29\x41\x2f\xd5\xab\xa7\x63\x47\x7b\x5d\x52\x05\x5e\x60\x09\xcd\x63\x88\x01\xc7\x34\x99\xd3\xcb\xdc\x01\x6f\x45\xc1\xc2\x5e\x19\x69\x89\x4b\x69\x2a\xf6\xf7\xca\x9e\x2b\x7a\xce\xb8\xb0\xef\x42\x4d\x99\xd6\x4c\xcb\x48\xbd\xbc\x68\x71\x94\xda\x4e\x4d\x49\xba\x10\xdb\xfe\xa6\x6a\xb6\x6a\xaa\x85\xf2\xe2\xf7\x86\x58\x36\x69\x39\x94\x34\xd1\x4b\x17\x5a\x1e\x6e\xc1\xc3\x04\x5f\xe7\xc2\x7e\x00\xde\x29\x01\x99\xab\x14\x95\x8e\x2c\x97\xef\xbb\xdc\x3e\xa8\x17\x4d\xa6\x34\x3e\xbe\xac\xf3\xa2\x07\x5e\xf9\x26\x8a\x19\x00\xba\x58\xe1\xed\x7b\x30\xb6\xcc\x83\x9f\x6c\x41\x74\xdc\xf0\x4a\xd0\x93\x15\xa0\xf0\x09\x56\xd4\xfb\x85\xab\x86\x18\x19\xe5\x90\x30\x69\x55\xf1\x47\x95\xac\xbb\x96\x9c\xce\xc0\x93\x4f\x08\x00\xd1\x2b\x1d\x4e\xc4\x01\xe1\xf6\x54\xdf\x86\x08\xe6\x82\xa1\xa4\x35\x34\x61\x56\x0f\xcf\x3a\xb5\x27\xf0\x8e\xdd\x80\xca\xb6\x6e\xa0\xf4\x86\xcf\x55\xcb\x74\x1c\x09\xb6\x24\xf0\x16\xe7\xc5\x6d\x15\xe1\xca\x61\xb3\x6d\xb0\xe1\xdd\x66\x4e\x25\x15\x23\xa4\x32\x14\x31\x77\xf5\xa4\xfe\xe4\x30\x0d\x58\xec\xc3\xb0\x03\xf1\xd7\x65\x3f\xd3\xba\xe8\x8d\x09\x10\xd1\xe8\x78\xa1\x74\x0d\x45\x1f\x32\x27\x12\xa0\xd8\xf4\xa9\xb4\xe4\x70\x67\x80\x60\xd5\x12\x00\x52\x3e\xc7\x9a\x61\xd2\xc7\x0d\x21\xe4\x22\x86\xac\x2c\xeb\x30\x6f\x61\x24\xa1\x04\xfa\xbb\xd0\xd5\xf9\x15\x28\x85\x94\xe6\x69\x1b\x00\x52\xbc\x18\x62\x91\x51\xff\xd4\x27\xb5\x35\xdd\x5f\xec\xe7\x97\xa3\xf3\x4f\xbb\x6b\xdb\x81\x86\x78\x7b\x7a\xef\x6f\x8f\x22\x0e\xdf\x77\x41\x76\x38\x08\xe6\xdf\xbe\x65\xf2\x8a\x0f\xdf\x8b\xd3\x9e\x51\x5b\x25\x32\x02\x6b\x6c\xdf\xd6\x72\xcb\x51\x82\x7f\x9c\x79\xa3\xe0\x33\xbf\x10\xca\xcc\xb7\x9c\x4e\x78\xc6\xaf\xcb\xeb\x59\x10\x10\x51\x22\x0f\xf9\x56\xe5\xec\x1e\xab\x6e\xe5\x32\x00\x2d\x41\x61\xe3\xc2\xf6\x51\x64\xd4\xd1\x82\xf8\x89\xc9\x3c\x50\xf9\xb4\x80\x80\xf9\xbe\xdc\x12\x58\x6b\x6f\xba\x0e\x83\x0d\x8c\x61\x8b\x81\xf0\xf4\xb4\xf0\x34\xbb\xc7\xfb\xe5\x3a\x42\x88\x88\x5e\x05\x83\x0e\x0a\x1a\x60\xdd\x4e\xf2\x43\x1f\x94\x99\xcb\x7b\x22\xa4\x61\xe4\x8c\x57\x79\x72\xa0\x06\xf1\x27\xf9\x7a\x19\x66\xda\x1e\xee\x06\x7b\x7f\x55\x34\x92\xa0\x79\x31\x5b\xc0\x62\xd2\xf2\x70\x69\x3a\x22\x69\xac\x13\x9f\xde\xa4\xd3\x9b\xbd\x1b\xf4\x9d\x79\x31\x81\x6c\x18\x9c\x6c\x45\x06\xcd\x4f\x31\x99\x54\x0c\xad\xa5\x7b\xd8\x86\xd9\x41\x53\x8b\x22\xb5\x5e\x4c\xf5\x66\x27\x81\x21\xab\xfe\x91\x34\x67\xc6\x1d\xf9\x17\x6d\x46\x6d\x2b\x5f\xe9\x33\x2f\xbe\xab\x40\x7c\x3f\x5e\x32\xb4\x0c\x5a\x51\x9f\x50\xa6\x9b\x27\xb9\x84\x1d\xfb\x69\x4e\xd5\x03\x73\xf7\x13\x81\xbc\x28\x9a\x0f\x6e\x6f\x13\xd0\x38\x88\x3f\x97\xbd\xf4\xb4\x90\x9c\x3a\x1b\x39\xbd\x0f\xf6\x99\xf5\x22\x4f\xe3\xf9\x71\x6d\x95\xb7\x19\xb8\x79\xa7\x5f\xd9\x4b\x99\xf1\xb7\x1a\xd3\x08\xac\x55\xa1\x57\x9e\x56\xa5\xb6\x8f\x19\xa4\xdf\xef\x8d\xa0\xc1\x5c\xf4\xda\x85\xbc\xe7\x49\x6d\xde\x2e\xa2\x82\xea\x34\x08\xe6\xdd\xb5\xed\x71\xaf\x36\xdc\x06\xbc\x3e\xd4\x2b\x7d\x7e\xdd\x55\x6e\x02\xde\x33\x73\x8e\x02\x67\xb1\x34\xeb\x84\xde\x5d\xd0\xd8\xbf\x0b\xe9\x8e\xbd\xdb\x87\x99\xe7\x31\x31\xcf\x1a\xd1\x37\x9e\x85\xdc\x6a\x30\x49\x79\x50\xcb\x2f\x26\xad\x51\xa1\x01\x42\x04\x07\x29\xef\x9c\x60\x95\x52\x87\x79\xee\x8d\x98\x77\x82\x05\xf2\x6e\x71\xe0\xf0\xee\xd1\x40\x9e\x2a\x5c\x60\xe6\xd3\xbd\x4e\x85\xcc\x62\x9b\xe6\x04\x4f\x8e\xce\xba\x4c\x39\xca\x11\x4d\x8f\x8c\x07\xb5\x3d\x8d\x77\xc9\x7e\x53\xcc\x3f\x33\x66\xec\xfe\x62\x31\xe3\xfd\xf6\xeb\x9f\xfc\x7f\xf3\x10\x6f\xeb\x16\xb9\x54\x41\x78\x8e\x39\x99\x81\xd3\x92\x1f\x7d\x8a\x9f\xce\x7e\xce\xd8\xbc\xf1\x74\x60\xec\x95\x76\x8c\x77\x4f\xc3\x27\xdf\x79\x7d\xff\x90\xef\x7b\xfa\xce\xcb\x66\x1c\x5f\xe2\x8b\x78\x62\xcb\xd0\x77\xd8\x61\x96\xdd\x20\x7f\x5c\xe1\x2a\x7b\x3c\xb3\x82\xb0\x62\xe2\xff\x67\xef\xbf\x75\x35\x46\x9a\x2d\x41\xf4\x81\x68\x50\x2b\x93\x5a\x6b\x4d\x8f\x5a\xab\x8f\x9a\x4f\x7f\x51\x7f\x9d\x7b\xaa\x1a\x98\xc1\xe9\xc1\xd4\x00\x65\xb4\x41\x63\x6f\xf0\x5b\x4c\x64\x66\x44\xac\x08\xae\x48\x1a\x15\x49\xa4\x96\xb9\x42\xc2\xde\xb1\x49\x94\x5b\x57\x5d\x51\x14\x40\xd0\xad\x6c\x59\x8c\x40\xd7\xe8\xe7\x87\x33\xaf\x99\xf2\xd5\x8e\x7b\xbd\xd9\x37\xf8\x33\xa0\xe5\x7a\xa3\xdd\x15\xcb\x58\x15\x56\x5e\x79\xdd\xd9\x1b\xc3\x0f\xd2\xbc\x61\xba\xb2\x3c\x53\xab\xd8\x53\x59\xa1\x6d\x18\xf5\xf3\x79\xf3\xcd\xa7\x23\x98\x3d\xdc\x9e\x1a\x70\xfc\x99\x10\x29\xe3\xa6\x01\xd6\x30\x2a\x2e\x46\xb3\xc6\xbc\x77\xb6\x9d\xd2\x69\xa8\xd3\x11\x7a\x70\x36\x31\x29\x32\x79\x66\xdb\xbb\xba\xd5\x8a\x2c\x6b\x9c\x77\x6c\xee\x1e\x87\xa2\xed\x9c\x69\xc3\xd3\x2c\xfb\xf4\xdd\xe0\x75\xee\x86\xc1\x0c\x33\x34\x9c\xc3\x7e\x61\x0d\x01\x6c\x24\xb0\x31\x29\xb1\x13\xf4\x34\xb2\x1c\x6c\x03\x1c\xe4\xec\x29\x14\xca\x5b\x7e\x2f\x97\x8e\x96\x42\x27\x82\x74\xf2\xcf\x5d\x9e\x1c\xd7\x1d\x1e\x1a\xb7\xe8\xd5\x71\x29\xd6\xff\x8a\x0d\xb3\x55\x82\xd7\xe5\x92\x20\x8f\xfe\x38\x19\x26\xee\x72\x1c\x2b\x39\x3b\x14\x6a\x07\x8f\x95\xa2\x1b\x40\x08\x44\x3a\xbe\xb2\x92\x0f\x2d\x2a\xee\xf9\x75\xbb\xd1\xd1\x10\xf6\x42\x71\x67\x38\x62\x3d\xb0\xe4\xd8\x10\x8f\x28\xdf\xe2\x23\x6c\x81\x11\x42\xd9\x1c\x98\xac\x1e\x69\x13\xf5\x94\x68\x87\x7d\x6c\x64\x7d\x13\xe3\x3d\x50\xb0\x77\x11\x85\xc2\x13\x83\xd3\x71\x3f\x01\x2d\x29\x73\xd6\xdb\x94\x67\x2c\x6f\x6a\x76\x7c\x0c\x69\x2f\xd5\x4b\x3b\x73\xdc\xfb\xe7\x12\xf2\x60\x0f\xee\x6e\x31\xf1\x56\xa4\x37\xdb\xac\x73\x38\x83\xdc\xb7\xe7\x03\xf6\x4c\xf9\x04\x42\x8f\xd9\x1f\xc6\x82\xd0\x70\x7e\x9f\x74\xcc\x90\x57\xf1\xa2\x13\x02\x34\x7e\x16\xb8\x30\x76\xb4\xbf\x81\x66\xe3\x6c\xcf\xcb\xce\xea\xbd\x0a\x9d\x27\x7b\xbd\xdf\x1d\x7a\xbc\x0e\x94\xd7\x9c\x2f\xd1\x5c\x71\x38\xa2\x7c\xc0\x0d\x4d\x73\x37\x07\x7b\x8a\x15\x3a\xd4\x5e\xf0\xc2\x57\x57\x59\xa1\x39\xd6\xe4\x85\x0c\x00\xa4\x97\x67\x4d\xfa\x3f\xa7\x8e\xde\x35\x3f\x72\x61\xe0\x64\x26\xf3\x0f\xc7\xb2\x7f\x19\x87\x2c\xc5\xbf\xec\x90\xa2\x7f\x10\xc2\x24\xf5\xaa\x42\x5d\x38\x91\xc2\xd6\x86\xd6\x73\x93\x25\xcf\x0a\xe5\xda\x71\x02\xec\x2e\x42\xea\x96\xe5\x15\x34\xb9\x52\x3d\xa0\xbb\x93\x55\xd5\xae\xeb\x2b\x62\xba\xf5\x39\x27\x66\x3c\x77\xb2\x42\x72\xe3\xb5\xca\x79\xdf\x41\xe8\x71\xe1\x31\x42\x3b\x8c\x66\xf5\x08\x78\xdf\x57\xac\x6f\x9a\x4c\xaf\x48\x62\x95\x89\x53\x28\xb8\x03\xb6\x05\xd8\x9e\xa0\x28\x95\x9a\x96\xbf\xc3\x09\x15\x98\xe6\x9a\x69\x00\xed\x16\xa5\xf3\x75\x1c\xe3\x8d\x42\x1a\x72\x6f\xf4\x27\x2c\x5e\xcd\x4c\x57\xe5\xa1\x82\x1e\x3f\xf1\xcf\xeb\x0b\x5a\x5a\x2e\x2a\xed\x5a\xce\xe5\x28\x1e\x20\xad\x19\x53\x8b\xaf\xba\xa4\xca\x97\x3c\x41\xe1\xb0\xe2\xd0\xd4\x83\x85\x79\xdf\x8e\x3b\xb8\xe3\x38\x61\x50\x26\x58\x10\x47\x0e\x11\x26\xa8\xbb\x8f\xa8\xee\xe6\x78\x50\xbe\xbe\xb3\xa0\x7e\xec\x0f\x9e\xc3\xfd\xa3\x1e\x25\x45\x0a\x1c\x83\x05\xa6\xba\xcf\xc0\xc5\xbe\x10\xf7\xa1\x0d\xa3\x5f\x8d\x52\x7d\xac\xf8\x8d\xfd\x7b\x28\x6e\x65\xa8\xee\x7a\x73\x60\xe7\x70\x4c\x16\xa5\xf0\xaf\x50\x60\x4c\xfc\x1d\x4e\xf5\xec\x5e\x4e\x78\xee\xbb\xa7\x98\x98\xd7\x80\x48\x54\xf2\xcd\xf8\x05\xdd\xa8\x92\xc9\x4c\x78\xc7\xf9\x3a\x3e\x83\x3a\x17\xba\x12\xc3\x9b\x4b\x95\x49\x8b\xbc\xbd\x59\xdc\xe3\xcd\xe6\x8c\xbe\xc5\x2f\x57\x71\x9b\x03\xce\xf4\xc4\x1d\x6f\x21\x55\x71\x0b\x29\xf0\xad\xb1\xcc\x82\xbc\x46\x40\x99\x72\x64\x13\x48\x34\xc5\xa3\x4d\xb5\x90\xd7\x90\x43\x70\x4b\x17\xcc\x65\x97\x07\x49\x58\xd2\x0b\x3f\xf3\x11\x94\x68\xde\x07\x0f\x33\xa0\xc0\x88\xec\xb2\x0a\x8a\xcd\xf1\xf3\x21\x23\x50\xcd\x9a\xf7\x26\x28\xef\x1d\x90\x44\xe4\xef\x79\x16\xc0\xd4\x80\x16\x65\xc9\xd8\x35\x2d\x2c\xf8\xdd\xef\xe4\x1c\x86\x32\x94\x3e\x1b\x40\x13\xb0\xb3\x56\xf6\xea\xfb\x4c\x69\x19\x49\x4d\x0e\xdf\x3f\x60\x45\x91\x72\x6c\x0f\x39\x0c\x04\x7b\x6d\xa3\x24\xc0\x4c\x29\x5c\xdb\xe0\x7e\x0e\x33\x9b\x13\x73\x55\x87\x4e\xdc\x8f\x10\xe1\x3f\xc6\xa8\xd6\x91\x66\x46\x3f\x40\xbb\x28\x3f\x61\x98\x21\x38\xab\xea\x51\x45\x8c\xfc\x87\x6b\x22\xeb\xbf\xad\xce\x39\xb5\x7f\xd5\x39\xa1\xff\xd4\x39\x13\xdb\xb7\x51\x7c\x4b\x9e\x2c\x22\xfc\x91\xcf\x56\x53\x8b\xa4\xbc\x59\x10\x71\x10\xa9\x1f\xe3\xb2\xc4\x2f\x5f\xe2\x73\xaf\x21\x11\x6c\xdf\x0d\x09\xb0\xe1\x27\x6e\x67\xb3\x79\x6c\x75\x32\xaf\x8e\x79\x82\xcb\xee\x87\x9c\x41\x9d\x4b\xab\x5a\xaa\x92\xd3\x75\x02\x06\x74\x6c\xa9\x34\xc8\xe8\x43\xd1\x14\xd9\x7f\xfc\x3c\x4f\x88\xe8\x79\x5b\x8b\xcd\x3b\x14\x06\xf0\x9b\x8b\x5f\x4f\x90\x58\x94\xa1\x67\xd4\x45\x79\xbd\x8b\x4e\x0e\xf4\x3f\xa9\xa7\xe2\x2b\x9f\x20\x79\xbc\x92\xd0\x7d\x5a\x75\xfd\xad\x93\x3f\x4a\xd3\x39\x01\x96\x31\xe1\xa7\x69\xa7\x66\x7e\xf4\x03\x3a\x52\x48\xf5\x52\x00\x40\x2d\x11\xa6\x5e\xa0\x0c\xde\x25\x83\xe1\x44\x83\x0c\x97\x4c\xd3\xe2\x2b\x9b\xdd\xc9\x7c\x48\x79\xd7\x63\x6e\x52\x49\x44\x7d\x86\x86\x4b\x0b\xc8\x19\xb5\x33\x30\xed\x2a\xed\xaf\xd3\xb8\xdc\x31\xae\x02\xd6\x2b\x81\xfe\x72\x74\x2d\x7f\x27\x69\xd8\xb6\x30\x82\x78\x97\x13\x91\x25\x40\xaa\x6a\xba\x9d\x2c\x37\x44\x4f\x11\x93\xd1\xdf\x20\xd2\x48\x58\x3e\xe4\x09\x66\x47\x58\xd2\x23\x3d\x81\xed\x03\x83\x8b\xbe\x5c\x66\x82\x61\x77\x8c\xba\x7f\x07\xbc\x6b\x50\x89\xed\xa7\x3a\x25\xd8\x00\x01\x0a\xcf\x4b\x6e\xbd\x4d\x2d\x74\xe2\x4d\xd5\x3b\x05\x50\x4b\x54\x95\x70\x4a\xd6\xba\x0e\x27\xd4\x8d\x33\x2b\x67\x2b\x0c\xcd\x61\x99\x02\x50\x4a\x4f\xf2\x08\x7c\x0f\xf3\x6d\x27\xbc\x45\x0a\xc0\x49\x5c\x06\xab\xcc\x6d\xbe\xa1\x2a\xc9\x2b\x08\x1e\x9e\xc5\xb1\xb3\x77\xc8\x90\x8c\x92\xd0\x65\xb8\x74\xc8\xa1\x36\x03\xd9\x64\xb3\x15\x77\x1e\x76\x53\xeb\x8c\x6e\x9f\xe1\x09\x3c\x7c\x68\xdf\x88\xe0\xbc\xa2\xd0\xcb\x7c\xd3\xe6\x6b\x62\x4e\xf0\xab\x85\xe1\x9c\xf4\xbe\x55\xfd\xaa\x75\xc6\x04\x22\x76\x26\x5d\xf2\xec\xc1\x1e\xac\x38\x62\x7c\xc3\xe3\x8b\xde\x11\x06\x26\xdb\xac\x93\x00\x3a\xf0\x57\x14\x8c\x7e\x88\x3a\x8e\xea\x0a\xfa\x83\xcc\x0d\x4e\x79\x0c\x34\xe2\x54\xcd\xa2\x44\xac\x7e\x80\x1d\x77\x6a\x41\xec\xa8\x22\x34\x09\x0a\x9c\x76\x92\xca\x3e\x53\x30\xb2\x01\xf0\xbe\x40\x35\xb3\x01\x73\xde\x9b\x71\xe7\x78\x01\xd2\xcf\x7d\xa9\x33\x79\x85\xb1\x38\xb1\xb8\x6e\xf5\x70\x1d\x56\xf3\x98\x41\x5e\x62\xf0\xe0\x84\xb2\x5c\x94\x51\x22\x9a\xbf\x8f\xcb\xde\x88\x19\xa6\x44\xbd\xa2\x8a\x1b\xea\x9c\xf6\xee\x04\x30\xf9\xdc\x5b\xac\x07\xcb\x93\x4d\x15\xa9\x5f\xba\x85\xae\x1b\x87\xa0\xdc\x7e\xd1\x11\x78\x53\x74\x4f\xd1\x08\xb9\x93\x89\x5d\x24\x61\x05\x9b\xc4\x78\xbf\xc9\xb0\x86\xf9\xf0\x64\x91\x32\xac\x9d\xc6\xb1\xd2\x87\xa8\x08\xc1\xa8\xfb\x4b\x76\x95\xb7\xce\xde\x65\x99\x6c\xdb\xba\xc1\x5f\xdd\x05\xdc\xb6\x12\x02\xcb\x8b\x26\x0b\x54\xcf\x0e\xba\x66\x9c\x84\xc1\x3e\x2a\x8f\xe9\xd9\xdf\x73\xea\x1f\x8d\xbb\x6b\xfb\x2f\xcb\x21\x5b\xf3\xaf\x1c\x72\x3c\x7e\x02\x24\x04\x0f\x08\xa6\x39\x9f\xc5\xe6\xef\x4a\xbf\x52\x19\xf2\xc4\x8a\xa5\xe6\x49\x9c\x91\xd3\x10\x45\x49\x08\xe1\xac\x1f\xa9\x64\x29\xe6\xc2\x30\xa6\x74\x29\xc6\xc6\x30\xd5\xb2\x59\x17\x10\x9a\x05\xb2\xb9\x31\xd0\x7c\x3f\x76\xbc\x69\xf0\x93\xc3\x1a\xa6\x33\xf7\xd4\x9f\x03\x57\xa8\x8c\xbc\xaa\x27\xa8\xa6\xc2\xef\xa8\x3d\xd9\x40\x4d\xd1\xeb\x9b\x16\xe5\x84\xf0\x45\x19\x5d\x33\xa9\x7f\xc3\x23\xca\x13\xa7\xfc\x32\x72\x9e\xe8\x73\x6c\xa8\x57\x4f\x21\xfa\x8d\x2d\x13\xc7\xf9\xa6\x3f\x60\xdb\x40\x3a\x7b\x87\x80\x2c\x02\xeb\x5f\xd9\x52\xf9\x17\x22\xa0\x77\x39\xec\xcc\xe9\x9d\xb0\x15\xe2\xa3\x6b\x9e\xb7\x94\xe3\x2f\xa0\xc7\xaa\x93\xec\xae\x8d\x2a\x9b\x1d\x9a\x4a\x48\x2d\xc2\x6b\x39\xa4\xe4\x98\xd4\x3c\x6b\x82\xe1\x73\x60\x2c\x1d\xdc\x0e\xec\x07\x63\x39\xb1\x68\xe2\xba\xbc\x37\xcc\x6e\x61\xfe\x28\x71\x2e\xed\x30\xf3\x26\x3d\xa7\x33\x4a\x2e\x1e\x46\xe2\x0d\x95\x17\x74\xd8\xa8\x29\x02\xe0\x7d\xc0\x78\xd7\x35\xa4\x28\xe5\xb9\xdc\x46\x0d\x1c\xd3\x47\x06\xad\x55\xb5\xc8\x7a\xde\xa3\x04\xfd\xc0\x84\xd9\x80\x06\xf2\x27\x79\x5d\x02\x19\xb9\x58\xdc\x8e\x3b\xca\xe5\x69\x71\x81\xa1\x8c\x99\x78\xd5\x6f\xa2\x57\x39\xad\x73\x9d\x34\x94\xfa\xed\x76\x61\x5d\x9b\x6a\xa1\x68\x1c\x09\xd7\xad\xab\xfb\xa4\x3d\xb2\x1b\x0a\x77\x0d\x1a\x5a\x34\x82\x6f\x60\xd4\xd4\xa4\x8c\x4b\x64\x52\xbf\x1b\xd8\x6d\x88\x27\x6c\xd9\x99\x92\xf3\x93\xcc\x86\x73\x3b\x23\x0d\x19\x98\x54\x9c\x10\xb3\x94\xcc\x57\xa8\xfc\x94\x41\x46\x35\xc4\x12\x42\xfc\x61\x85\x70\xdb\xc2\xfa\x39\xba\x0a\x9c\x14\x78\x46\x31\x0f\xf2\x84\x63\xca\xce\x69\xad\x51\x00\xfd\xc9\x2f\xb4\x10\x5d\xea\xe9\x1f\x82\x71\x80\x1c\xf0\x9f\x1d\xdc\x74\x5a\xab\xec\xb1\x6b\x11\xce\x60\xb9\x8d\x46\xda\x06\xd9\xbe\x03\x66\x96\x90\x94\xf1\xe4\x29\xdb\x72\x6b\xe5\xcf\xcd\x9b\x62\x15\xab\xad\x0c\xd6\x71\xbd\x9c\x08\x13\xdb\x89\xe9\x9e\x14\xdc\xef\x1d\x63\x97\x88\x33\xc0\x6d\xda\x05\x3c\xde\x04\xb4\xe4\x1d\xee\xb7\x49\x4c\x12\x95\x55\xbf\xa5\x8d\x46\x48\x01\x4f\x01\x4a\x48\x87\x4d\xcb\x8a\x26\xec\xa6\xea\x85\xee\x3e\x5e\x76\xec\xcd\xc1\x78\x33\x17\x4d\xc3\xd9\xaa\x26\x42\x11\x67\x9b\x54\x79\xce\x38\xde\x3b\x65\xb8\x7e\x68\x32\x8f\xf4\x58\x31\x8c\xc3\xa8\x6d\x27\x65\x07\x4f\x33\xd6\x3f\xac\x79\x58\xe7\x7f\x99\xe6\x61\x3a\xfe\xd2\x3c\xd0\x87\xf5\x47\xbe\x1a\xc7\xf6\x0a\x71\x4c\x10\x4d\x6a\xce\x41\xd8\xc3\x32\xa6\xe9\x8b\xc0\xa0\xb5\x12\x55\x2b\x3c\x91\x6d\x3a\xd8\xd8\x42\x4f\x0b\xd0\xa8\xd4\x04\xdf\xa3\x90\xac\x43\xe8\xfd\x38\x47\xa8\x70\x90\xa3\xfd\xa2\xc7\x94\x60\x7e\xa0\x53\xc4\xea\xe1\xef\x99\xe1\x09\x5a\x94\xd4\x9f\x95\x37\xa5\xc0\xaa\x02\x10\x18\xfe\x70\x79\x9f\xa0\x3c\x69\x10\xba\xd6\xa5\xf5\x89\x14\x35\x62\x13\xc9\xc3\x15\x86\x9a\x0b\xad\xf5\xe9\xe8\xaa\xb1\x64\x5b\x7f\xc7\x09\xdc\xe8\x46\xe1\x31\x59\xd3\xce\xb3\x57\x3c\xb8\x4e\xa9\x91\xee\x8f\x49\xd7\x73\x81\xab\xe6\x0d\x31\x9c\x24\x5d\xc4\x61\x7b\xd7\x7b\x09\xbc\x26\x2c\x51\x8a\x27\x94\x25\xcb\x56\xae\xad\x67\x71\x63\x2c\x74\xa0\x59\x33\x8f\x18\xa7\xda\x3b\x92\x0c\x4e\x78\x62\x3b\x01\x5b\x6e\xc6\x6e\x86\x5a\x50\x1c\xcf\x76\x8a\xdb\xb6\xa1\x41\xe7\x71\x52\x86\x5b\xc2\x14\x32\x65\xa0\x66\xe3\x41\x87\xe3\xec\x62\x51\x97\x9a\x2c\xe4\xd7\xf8\x23\xa2\x37\x73\xc1\x90\x38\x6d\xcd\x7e\x49\x16\xe3\x7d\x72\x0c\x36\xcc\x08\xba\xd5\x18\x55\xc4\xb0\xf9\x40\x3b\xc2\x5a\x4b\x91\x79\x06\x71\x76\x31\xf3\xc1\x32\x9f\xb8\xca\x29\x3d\x89\x2b\x90\xa1\x19\x55\x37\x23\xee\x69\xca\x36\x55\xb3\x86\x57\x68\x3e\x6d\xe8\x4d\x19\x84\xf7\x70\xbd\xa1\xdc\x7c\x4f\x74\x0e\x49\xd1\xbd\xbc\x29\x28\x3d\xec\x0c\xe0\x28\xa0\xd7\xae\xcf\xe1\x53\x5e\x4b\x45\x71\x7a\xa0\x13\x17\xaa\x9c\x92\x45\xb4\x89\xcd\xd7\x3b\x5e\x0c\x94\x5f\x4a\xd8\x1b\x78\x60\x2f\x56\x21\x5b\x39\x05\xe7\xcb\x75\x57\x5b\x45\x2d\xfa\xac\x77\xd2\xac\x29\x7a\x05\xc0\x17\xbd\xc2\xc2\xa1\x72\xe6\xb7\x4b\x9b\x52\x91\x91\x98\x60\x55\xb2\xf4\x36\x47\xaf\x7f\x4d\xd3\xdf\x10\xe3\xdc\x36\x00\x4a\x55\xc3\x29\xf2\xba\x9a\x8b\xc8\x34\x82\x61\xc1\x6e\xaa\x2d\x24\xeb\x34\x6e\x87\xbe\x26\x84\x17\xf3\x5d\x32\x10\xeb\x18\x4c\x23\xa2\x1c\xb1\xce\xf9\x69\x36\x34\x62\xd0\x8c\xe8\xc3\x65\xe7\x71\x2d\x31\xe4\x80\x28\x5d\x0b\x62\x3c\x33\xcb\xd2\x4b\x91\x3e\x2b\x66\xcc\x3b\x5c\x94\x15\x02\xa3\x2c\x05\x57\xe4\x73\x33\xc5\x88\xf5\x43\x96\x41\x4a\xe0\xf5\x41\xa9\xab\xf7\xa0\x43\x42\x4f\x84\xde\xc5\xfc\xb8\x83\x1c\x29\xb8\x1b\x4e\x42\xfa\x69\x73\x22\x04\x14\x1d\xaa\xa3\xa7\xba\x93\x0b\xf1\xd9\x03\xd4\x0a\xbd\x9f\xc9\xe3\x2d\x98\x3c\x46\xca\x4d\x18\xa8\xc8\x8e\x33\x4f\x27\x6d\x17\x67\xf9\x6b\xed\x56\xa5\x6c\x12\xe9\x7f\x7c\xa5\x24\x0b\x21\xf0\xd2\x0a\xa4\x76\x8e\x0c\x9a\xb6\xc9\x54\x0b\x4c\xc3\xd3\x29\x38\xc8\xc3\x20\x4c\xab\x68\x7e\x27\xf6\x65\x47\xf1\x86\xec\xc3\xd0\xa9\xe1\x53\xed\xdb\x01\xc5\x5f\xd3\xae\x9a\x41\xcd\x6e\x18\x22\xfa\x85\x6c\x74\xa5\x2b\x97\x57\x33\x8c\xc1\x64\x59\x31\x8f\x63\x21\xb2\x53\xf2\xcf\xc6\xf4\xf5\x5f\x96\x4b\x0f\xed\xdf\x3f\x0f\xf8\x9f\x98\x6e\xfb\x06\xf9\x7a\xe9\x3a\x7d\x3e\xcd\x9b\xd9\x14\x31\x87\x58\x7b\x1d\xd7\x35\x3f\x80\x79\x44\xfa\xd3\x8e\x0b\x6c\xaf\x1a\x64\x86\x0e\x10\x85\x8e\x58\x2e\x4c\x39\x22\xd9\x96\xba\xbb\x63\x03\x6d\x09\xb6\xcd\x0f\x54\x65\x9a\x5c\xd4\x20\x8d\x0f\x3d\xa0\xc1\xac\xe0\x09\xd3\x95\xbb\x00\x08\x1c\xa7\xf1\x6f\x7c\xc6\x5e\x50\xbf\xd2\xc5\xcf\x1a\x9f\xf5\x69\xbf\xd2\x87\x68\xbc\xeb\x28\xe9\x88\xce\xfb\x56\x24\xfb\x06\x2f\x65\x7a\x76\x0b\xf0\xde\xa8\x24\xce\x7c\x4f\x5d\x8f\x1c\x7a\x86\xf1\x21\x95\x74\xd1\x02\xe1\x83\x3f\x15\xe1\x83\x80\xa0\x41\x94\xbc\xc4\xe4\xc7\x3f\x55\xa3\xd2\x01\x34\x72\x00\xb3\x28\x4a\x28\x35\x34\xa7\x03\x97\x62\xe5\x36\x46\x69\xbc\x33\x93\x0f\xb4\x47\x5d\x38\xab\xbf\x59\xe0\x1b\x52\x93\x06\xa0\x03\x99\x02\xeb\x02\x03\x74\x49\x76\x9f\x7e\x9e\xf7\x1c\xb1\x51\x67\x68\x4c\x56\x23\x05\x68\x7d\x8d\x6a\x75\xa0\x02\x9d\xab\x3a\x37\x76\x43\x7e\x41\xb1\xee\x1b\x49\x2e\x93\x26\xe8\x8f\x75\xc1\x70\xe4\x80\x58\xe0\x91\xec\xe5\xdb\xf4\x8d\x47\x08\x05\x5a\x93\x41\xfd\xc7\x74\xf6\x76\x94\x74\x66\x16\x30\xec\xe3\x14\x1d\x6e\x96\x38\xbd\x3b\xc3\xbc\x58\xb8\x23\xbe\x9c\x83\xb4\x93\xd9\x1f\x53\xf1\xa3\xbb\x31\x8d\xc4\xae\xf4\x50\xed\x44\xc1\xa2\x99\x5f\x2f\x33\xdd\xf5\x63\x7a\xf3\x63\x7f\x58\x8d\x5d\xb7\xd2\x94\x12\x8f\x25\x01\xc3\xed\x29\x27\x50\xcc\x91\x48\x91\x8f\xf7\xdc\x2e\x39\x37\x7e\x0b\x89\xfa\xd9\xe0\xda\xe3\xee\x9d\xf8\x0c\x9c\x43\x64\xe5\x4c\x75\x4a\xd9\xd0\xde\x94\x99\x81\x88\x63\x72\x47\x83\xd1\x18\xeb\x48\x98\x0e\x63\xa1\xa8\xa4\x19\xd0\xbd\x3b\x51\x3d\x0e\x2d\x7c\x6e\x52\x38\x85\x51\x3e\xee\x1d\x3f\x38\xef\xf6\xdc\x75\xd6\xa0\xb8\xb7\x15\xc3\x91\x09\x91\x1f\xf8\x72\x62\x3e\x58\x27\x05\x20\x87\xd0\x00\x7b\xc5\x98\xbe\x9e\x20\x47\x7e\x49\x23\xf6\x55\xe3\x25\x04\x1a\xbd\xde\x2e\xbf\xf1\xbd\x26\x72\x00\x41\x5d\x75\x42\x39\x63\x9d\x6a\xce\xfa\xcc\x8f\x1d\xba\x58\xeb\x32\x66\xf2\xbf\xe2\x72\xd5\x20\xa4\x05\xea\x67\x35\x1b\x7b\x6f\x63\x42\x31\xde\x0e\x32\x59\x99\xbb\x7a\x4e\x71\x5f\xe5\xf7\x21\x37\x6e\xf5\x41\x88\x25\x0b\x93\x87\x4e\xbe\x15\x97\x8b\x2e\x9b\x2c\xfa\x8f\xb8\x5c\xd0\xee\x3c\x61\xc4\xd9\x54\xcd\x58\x1e\x02\x5d\x64\x1e\xac\x74\xab\x1d\xa4\xde\xb5\x03\x80\x3c\xc1\x01\x24\xdd\x53\x84\xe0\x52\x27\x80\xe8\xf3\xac\x45\x80\xd5\x43\xb2\x65\x06\xb0\x06\xcc\xea\x12\xf3\x12\x35\x3c\x19\xf2\xba\xe2\x92\x03\x15\xd9\x39\xbc\xc5\x9f\x35\xe0\xad\x19\x46\x11\x32\xa5\x84\x27\xe0\x3a\xcb\x7f\xf2\x1d\xec\xba\x97\xff\x2e\x9b\xdf\xfe\xae\x85\x84\x0d\x01\x12\x92\x3a\x3f\x4a\x4d\x8b\xa4\x63\x51\x0e\x37\x6a\x54\x99\x59\x39\x56\x40\x14\x28\x39\x97\xce\xcb\xb2\x8a\x57\x2b\x4b\x6d\x31\x38\x31\x51\xbf\xf6\xbb\xa7\x70\x6f\xa3\x16\x06\xaa\xe2\x55\x89\x01\x84\x06\x4a\x7c\xdf\x75\x8d\x06\x42\x34\x4d\x5c\x16\x8e\xcd\xfd\x71\x50\x75\x8f\xac\x49\x1b\x38\x51\x8d\x8e\x17\xaa\x8b\x7c\x34\x9d\x71\x7c\x87\x49\x14\x3c\x25\x03\x82\xfc\x70\xbc\xd3\xfa\x53\xbf\x83\xa7\x91\x4e\xb3\xf0\xe5\xbc\x1c\xc9\xb1\xe5\xc2\xe1\x4d\x94\x82\xae\x91\xb7\x7f\x04\x5e\x97\x7a\x8f\x59\x19\x06\x77\xf4\x2e\x1e\xc0\x7b\x34\x26\xb9\x90\xf7\x22\x59\xbf\xad\xb9\xae\x55\x67\x33\x91\xba\xa2\x1e\x36\x03\xe6\x96\xfc\xd0\x74\x0d\x74\xaa\xf1\x2b\x00\xbf\x2c\x00\xe2\xd7\x73\x4e\x7f\x53\xc4\xf8\xa3\xdb\x67\x92\xf4\x61\xf1\xc8\x1f\x90\x3c\x57\x38\xff\x3e\xe9\x1b\x9b\xd8\xe6\xad\x2f\x48\x6d\x1f\x9b\x50\xfe\x00\xb5\x51\x39\x65\x7a\x09\xfa\x38\x11\xe4\x34\x05\x6f\xab\x91\x9c\xb4\xc3\xfc\xb4\x90\x14\xbc\xd5\x73\x40\xb4\x00\xc0\xf7\x2c\x4f\x2b\xf4\xa3\x30\x18\xa8\x54\x20\xc1\xfe\xad\x18\x20\x1f\x73\x2d\xe1\xfb\xd0\x05\x55\xc1\x4b\xb7\x23\x20\x46\xcf\xdc\x9d\x14\x8d\x62\x68\xf2\x1f\x70\x28\x2f\xb7\x0c\x6a\x6b\x6b\x89\x17\x93\x52\xf9\x21\x0a\x04\xb7\x96\x5a\xce\x09\xfd\x53\x41\x32\xb8\x6d\xc9\x17\xba\xad\x3f\xf2\x49\x3d\x6e\xcc\x48\x1e\x92\xf2\x40\x2c\xca\xd0\x16\x0f\x16\x2b\xb9\xed\x52\xb1\x56\x24\xee\xc0\x03\xa6\x7e\xa3\xd8\x14\xfc\x4d\x2c\xc0\x5b\x76\x51\xe8\xde\x16\x3b\x73\xab\x0e\x2d\x16\x63\x4c\xa6\xd0\xea\xa9\xd2\x78\xd5\xf2\xdc\x92\x17\x15\x82\xbb\xcc\xa0\x41\xf3\x0b\x3b\xcc\xbe\x52\x9a\x8e\xc9\x18\xb3\x85\xd9\x4a\x28\xad\x8a\x18\x17\xf7\x5c\x8e\x0c\x62\x1d\x52\x81\x19\xcc\x33\x8d\x08\xb9\x62\x8c\x72\x8e\x91\xa7\x64\xb4\x13\x66\x65\x97\x78\x8b\xfa\xb4\x1b\xab\x76\x97\xd6\xb4\x78\x56\xa2\x03\xdd\x64\x37\xa1\x96\x23\x9f\x6d\x1b\xb9\xe1\xb7\x62\x26\x98\x88\x20\x72\xa6\xcb\x1e\x9f\x3a\x03\x1b\x91\x88\x45\x17\x6c\x22\x0a\x57\xc7\x2a\x81\xeb\xc8\x64\x46\x1a\x26\x74\xf2\xdd\x1e\x44\x30\x92\xa6\x45\x26\x8d\x53\xb9\x61\xfc\xcd\x6d\x95\xbf\xc0\x9f\x79\xa4\x67\x44\xb6\xc1\x26\x29\x37\x69\x98\x9b\x17\x78\x88\x32\x99\xbb\x26\xac\x5e\x29\xdc\x07\x3e\x4a\x6d\xed\x94\xcc\xe0\xb0\xc2\x72\xe6\xa8\x69\xfe\x78\xb5\x66\x94\x8a\x3d\xdd\x5f\xf1\x4b\xf0\x47\x72\x10\x57\x54\x99\x7e\x84\x20\x85\xb2\xb9\x62\x50\x03\x8e\xa5\x37\x38\x70\xd9\x79\x40\xa9\x58\x50\x85\x73\xc0\xe0\x63\x92\xee\x94\xa9\x09\x62\x87\x43\xab\x45\x86\x6a\xbb\x97\x60\x4e\x56\xf1\x91\x65\xac\xd3\x94\xee\x19\x4c\x54\xfe\x42\x47\xb3\xd1\xce\x71\x41\x5c\xe2\x35\xe3\x4c\x26\x01\x6d\x81\xfa\x41\x0d\x79\x6b\xe1\xdd\xc8\xea\xef\x90\xf5\xb3\xe3\x1a\x48\x64\x06\xe8\x14\x4b\x7d\x2b\x56\x29\xc1\x1d\x21\xce\x7d\x0e\xec\xc9\x49\xc9\xc2\xbe\x80\x29\xfe\x39\xeb\xe0\x60\x55\xf0\x2a\x9a\x66\x07\xd0\xae\x0f\x3f\x10\xf2\x12\x86\xdd\x55\xd9\x0e\x8e\x13\xb4\x92\xfb\x1f\xce\x49\xfe\x6d\x5f\x23\x0e\xff\x72\x3d\xc3\x71\x09\xd3\x1f\x74\xc3\xfe\xfc\x40\x9c\x1a\x55\x43\x82\x2d\x76\x44\x09\x5d\x19\xc2\x62\xf5\x9f\xf3\x64\x93\x5a\x64\xc9\x7d\x9e\x28\xbf\x42\x23\xdd\xc5\xfa\x15\x1e\xee\xc9\xaf\xcd\x81\xaa\x4a\x92\xf9\xa1\x97\x3d\x87\x2b\xef\xea\x86\x3c\x82\xca\xca\x4d\x3c\x75\x75\x95\x1b\xad\xc0\xc5\x9f\x96\x4e\x15\x50\x55\x7f\x50\x0e\x98\x68\x11\x00\xe1\x66\xa4\xc8\x91\xf0\x7e\xe5\x11\x46\x40\xf0\xb2\x11\xf0\xb3\x9c\x4c\xc4\x4e\x9e\x94\x22\x93\xa0\x2b\x50\x5f\x9a\xda\x9c\xc8\x21\xd8\x6d\x56\xcc\xe2\xe4\x96\x8d\x4a\x83\xac\x71\x75\x04\x95\x59\x65\xd5\x3f\xdf\xe1\xd3\x68\xaa\x14\x68\xca\x82\x72\xdd\x00\x03\xb3\xf9\x61\x17\x8a\xf0\x3d\x5c\xdf\x9e\xe3\x1e\x74\xe9\xed\xf5\x94\x16\x46\x06\xfd\x94\x8b\xb6\xf8\x6c\x4b\x7e\x76\xf8\x9c\xf6\xac\xc3\xdc\x09\x67\x42\xae\x9e\x64\x7d\x29\x69\xa0\x2c\x58\xbe\x55\x61\xe2\x7e\xc5\x7b\x81\x54\x81\x7a\x76\xb2\xde\x02\x77\x80\xe5\x74\x62\x96\x89\x0a\x25\xe6\xbf\x93\x02\xb4\x4e\x01\xa7\xdb\x22\x00\x22\x70\x3a\x3a\xbf\xcf\xf2\x78\x0f\x9a\xb1\x17\xaa\xdf\x8c\x58\xa5\x5a\x1d\x5d\x3f\xa9\x5e\xd9\x66\x2b\x3d\x44\xea\xb8\xae\xb8\xc9\x58\xd8\xa7\x99\xe4\x5d\x50\x42\x14\x4e\xa1\xea\xeb\x2f\x83\xd2\xe6\x54\xa2\xaa\xd9\xf8\xee\x26\xc7\x84\x65\xd3\x90\x78\x3a\x69\xa0\x79\x87\xd7\x3f\x0d\xcf\x85\x57\xc4\xe4\x8e\x0e\x75\x63\x5f\x12\x85\x54\x09\x61\xc7\xed\xbe\x92\xfb\xd9\x1a\xf1\x33\xdf\xe4\x2c\x53\x25\x56\x18\xbe\xfc\x59\x47\x87\xd1\x94\x86\x9f\x58\xb9\x1a\x78\xbf\x51\x80\x4d\xd3\x36\x4d\xbf\x4c\x66\x6d\x26\xa1\x79\xb7\x53\xdf\x61\x6e\x11\x67\x24\xc1\x0a\xa5\xd2\xd5\x75\xe8\x17\x4e\x1f\xa2\x39\xf0\x14\x11\x55\x1f\xc5\x53\x82\x9d\xeb\x99\xe5\x69\x23\x53\xd5\x59\x45\xdd\xd1\xa4\x8a\x7b\x10\xa2\x96\x24\x1d\x2c\x2d\x21\x70\x79\x1c\x05\x30\x1f\x8c\x29\xc1\x21\x2c\x09\x4a\x0c\x92\x83\x0d\x51\x3d\xef\x8d\x88\x2e\xb4\x27\xbd\x8b\x05\x30\x35\x12\x87\x0b\x80\x36\xd6\xd0\x16\x3e\x96\xad\x34\x4d\x68\x17\xac\xfc\xd5\x8e\xed\xe0\x1d\x62\x88\xf9\xbb\xc8\x4a\xde\x43\x7c\xf6\xf7\xae\xd8\x1c\x23\xf2\x13\xf7\xbb\xaa\x11\x39\x3f\xa7\x0a\x93\x56\x13\xe1\xaf\x78\x62\x18\x53\x57\xcc\xb8\xc5\x61\xe3\x77\x98\xd1\x71\xb1\x74\xd1\x00\xad\xc3\xb0\x47\xd4\x6b\x3a\xd2\xcb\xa0\x8f\x4a\x0d\x5b\x24\x7c\x2c\x08\xc4\x54\xf0\x06\xe1\x8d\x99\xca\x48\x46\x34\x74\x97\xce\x72\x38\x96\x36\x73\x97\x66\xbc\xec\x29\xd8\xcf\xf4\xb6\x99\x04\x0f\xf8\x6a\x06\x49\xb5\xef\x34\xae\x6b\xaf\xe2\xfa\x01\xe9\x82\xe8\xa3\x81\xd9\xf3\x1d\x93\xaa\x88\xaa\xa6\x04\x89\xe1\xc6\xa0\x03\xb7\xa5\xb3\x0a\xf4\x1f\x76\x03\xdb\xbf\x2c\xeb\x98\xff\xe6\x06\xa8\xe3\x84\x20\x26\xb0\x03\x7c\x5f\x31\xd8\x1c\x3e\xf7\x59\x6b\x2f\xdd\x3a\x28\x54\x14\x67\x13\x04\x35\x48\x93\x58\xe0\xae\xfc\xe6\xa2\x27\xd9\x4f\x96\x07\x18\x36\x10\x7f\xfc\x8f\x9b\x23\xd6\x11\xd4\x52\x89\xba\x86\xf5\x7e\xc4\xba\xb9\x2a\x5c\xe5\xed\xf3\x13\x68\x83\xcc\xd2\xc9\xfb\x39\xd8\x82\x43\x78\x2d\x1b\x73\x6c\xdb\x76\x54\x4a\x5d\xa6\x28\xc9\xef\xa1\x68\x49\x5b\x4d\xbe\x7c\xa6\x78\x08\xd0\x4c\x58\xb8\xdd\x07\x3e\x2a\x82\xbd\x09\x81\x81\x9e\x5b\xd5\xe2\x70\xfc\x2b\xab\x7e\x3d\xe0\xc7\x64\x94\xcf\x2a\x00\x15\x6b\x7d\xc6\xd4\xe4\x1c\x33\x25\x35\x2a\xc6\xa4\x87\x22\x26\x88\xfc\xa1\xf5\xc2\x87\x6e\xd1\xbc\x07\x50\xb8\x72\xe1\x41\x0a\xe3\xb6\x00\x0f\x52\x12\x64\xaf\x53\xd8\x91\xfb\x54\x42\xa5\xbe\x03\x8c\xd2\xdf\x7e\x28\x74\x8c\x29\x24\x89\x73\x73\xf2\x28\xa4\xaf\xda\x28\x8e\x56\x2f\x31\x85\x35\xf4\x69\xa7\x50\x21\xa7\x58\x12\x4d\x02\x3d\x9f\x67\x1d\x40\x37\xc3\x72\x9e\xa7\x4c\xc6\x1e\x09\xcd\xe6\x9d\xcb\xc6\x80\x28\x0d\xee\x77\x2a\xfa\x91\xfe\x92\x97\xb3\x90\x25\x3f\xd7\xf6\x15\x45\x4e\x46\x49\xa7\x15\xa2\x4a\xa2\xab\xf1\xf4\x7e\xfc\x27\x21\x20\xd7\xa6\xe8\x7a\xe7\x72\xe9\x20\x04\xc9\x6a\xea\x92\x9c\x3d\xe9\x89\x88\xe1\xb4\x9d\x48\xe9\x27\xaf\x81\x52\x0d\xf1\x9a\xcf\x6a\x8a\xf9\xc1\x4a\xee\xe7\x82\xf1\x05\x30\x63\xf2\x11\xa9\x33\xb5\xa0\x38\x9a\xd2\xb0\x3b\x2b\x8e\xcc\x43\xe8\x89\xf5\x11\x06\x53\x5c\x0b\xcf\x1d\x4c\x28\x49\xb6\x36\x32\x9d\x72\x82\x22\x8e\x8b\x28\x2a\xf2\x0c\x11\xd1\xa8\x60\x31\x96\x91\x19\xd6\x48\xe6\x9d\x66\xdf\xee\xc1\x53\xe2\x52\x1d\x3d\xbe\x27\x76\xed\xf3\xc7\xd3\x8f\x70\x8d\x06\xf9\x82\xf7\x83\xd3\x55\x0e\xc6\x70\x5e\xc0\x23\x9d\x80\xc5\xfc\xca\x94\x79\xd0\x45\x34\x4f\x06\x7b\x67\xd2\x91\x39\xa4\xcd\x93\xf5\x77\x5e\x42\xba\xf4\x1d\xe8\x50\x31\xaa\x1d\x14\xb0\x89\x7b\x61\x25\x98\x3e\xc4\x2c\x08\xab\x85\x84\xf3\xdd\x63\x5a\xb9\xac\xa7\x31\x49\x5b\xa1\x59\x22\x17\x69\x34\x93\x23\x2c\xd4\xfd\x6b\xbf\x6b\xa1\xd1\xba\x23\x65\xd4\xc6\x5d\x11\xdd\xd3\x80\x71\x65\xd9\xee\x58\x72\xe6\xb6\x52\x54\xb6\xbb\xa9\xbb\x54\x7b\x2f\x65\x12\xd5\x04\x8b\x1d\x49\xcf\xf7\x9e\xb5\x5c\xee\xb6\xa1\xc8\xcf\x4b\x36\x70\x7c\x8f\x1b\x63\x48\x72\x81\x43\x44\x70\x3b\xe6\xf8\x12\x7c\x18\x82\xdf\x6f\x97\x01\xd4\x11\x11\x2d\xa1\x48\xe6\xe7\x1f\xce\xe9\x10\x33\x53\x63\x0f\x21\x72\x21\xcc\x43\x10\x0c\x5c\x49\xf5\xdb\x59\x03\xb9\x18\xec\x85\xdd\x09\xe1\x49\xd0\xcd\x0a\xd0\x4f\x95\x1b\x2b\x41\xc2\xf8\x15\x12\x63\xd7\x74\x7b\x98\xd0\xd4\xa9\x2d\xa9\xbf\xe7\xf2\x5e\x3f\xea\xe7\x54\x36\xdd\x85\x6a\xf1\xf3\xb4\x46\x05\xfc\x9f\x58\xbc\x49\x95\xc7\xbe\x0d\xba\x62\xc3\x88\xce\x92\x4f\x8a\xc5\x3e\xf9\xfe\x4f\x66\x2c\xbf\xec\xf7\x2f\xf3\x17\xeb\xdf\x69\xc3\x7f\x75\x6f\x11\x94\xd5\xbc\x63\x1a\x77\x50\x9b\x32\x9c\x13\xc0\xba\xa0\x69\x9c\x51\x64\x07\xd9\xfb\xee\xec\xec\xf1\xb3\x3b\xc7\x85\x09\x20\x66\x90\x98\x0d\x77\xbf\x2e\xc8\x4c\xee\x86\xc5\xe6\x59\x7b\x4e\x75\x34\x8d\x09\x08\x08\x98\xa8\x49\x9d\x7f\x93\x37\x8e\x58\xcc\xf9\x05\x05\xd0\x38\xfd\x7d\x68\x45\x51\x92\x55\x14\x54\xb6\xd1\xd5\xc5\xb5\x96\x3c\x82\xe3\x65\x2c\x67\x7e\x45\x31\xf8\x61\x00\x7b\xfb\x63\x7e\xdd\x64\x1e\x97\x0d\x95\x93\x2d\xa1\x0b\x70\x23\x45\x80\x45\x51\x9c\x6b\x1c\x58\xec\x8f\x2e\x01\xfe\x92\xa7\xa8\xf0\xf8\x42\xfb\x51\x96\x61\xba\xb6\x07\xf6\x04\x9a\xe8\xc5\xa7\xb1\x10\x73\x34\x9a\xc1\x73\xaa\x34\x4b\x30\x54\x11\xe7\xc8\x87\x13\xf3\x83\xa1\x4b\x37\xee\xc5\x25\xd1\xa4\xce\x77\x99\xd1\x96\x82\x10\xce\xb4\x80\xb6\xd0\xf0\x36\x1d\x12\x63\x28\xde\x61\x94\xf4\xd9\x98\x93\x69\x59\x5b\x31\xc4\x64\x75\x42\x26\x64\x31\xce\xf6\xd2\x5e\xf8\x2e\xf8\xae\x64\xfc\xc8\x79\xc7\x04\x54\x07\x61\xf2\x13\xa3\xa8\x69\xfe\x94\x9c\x61\x18\x74\x01\x43\x0d\xb1\x6f\x5e\x5d\xc8\x1f\x2e\xbe\x64\xea\x9e\x57\x87\xd9\xa2\x47\x00\x9b\x12\x97\x61\xc2\x53\x6a\x43\xb0\x41\x71\x5a\x3c\xc5\x2e\x9f\xa7\x8f\x6e\xf4\x76\x45\x13\x6a\x83\x6f\x38\xd1\x1d\x8c\xa2\x08\x59\x4b\x85\x8b\x8a\x3d\xe0\x24\xcb\x93\x12\xe4\x75\xef\xfd\xf6\x3c\x95\x73\xfc\x2b\xef\xd6\x50\x55\x95\x8b\x7a\xc1\x23\x0c\xae\x35\x05\x04\x5b\x3b\x89\xa8\x1a\x72\xdd\x46\x71\x48\x55\xf5\x10\xfc\x72\x18\x0d\x6d\xc3\xdf\x7f\x85\xef\x78\xdf\x93\x82\xc0\x0c\x49\x21\x43\x08\x52\xee\x49\x65\x23\xd1\xd7\x02\xe3\x75\x83\xcc\x62\x93\x5b\xd4\x40\x42\x9e\x5b\x96\xc0\x94\xb5\xbc\x4f\xc1\x57\xf0\xf8\xa9\x3b\xaa\xac\x6b\xec\xfd\x46\xd1\x1c\x24\xc4\xdc\xe5\xd5\xa4\xaf\xb0\x29\x8c\x12\x49\x1a\xa8\x42\x27\x90\x7a\xa3\x22\xa5\x09\xc1\x6c\x7a\x0a\x50\x39\x28\xed\x23\x90\x5a\xe1\xf8\x1a\xec\x04\x3d\x50\xdc\x8c\xf0\xfe\xec\x14\x50\xde\xf2\x73\x97\x37\x6b\x81\x49\x7f\x91\x6e\xcf\x23\xf6\xae\x04\x4f\x15\x66\x96\xde\x00\xd8\x35\xe8\x20\xa7\x25\xc7\x8a\x06\x86\x6d\x28\xb9\x77\x7f\x48\x49\x27\x2d\xd4\xfa\x23\x3b\xba\x7b\x3d\x03\x3c\x76\x35\x10\x7b\x05\x1c\xfd\x4b\x37\x81\x0b\xd4\x73\x20\xfd\xef\x07\x7f\x59\xcb\x25\x23\x4b\xc8\x2a\xe3\x0a\xf6\x5d\xe7\xb9\xc1\x7e\x3a\xfb\xed\x79\xa0\x85\x0a\xb4\xb1\x8d\x33\x14\x80\xf7\x34\x51\x90\x64\x0a\xb3\x59\xab\x76\x6b\xb1\x4a\xe4\x8d\x34\x66\x19\x1f\x82\xc9\x25\x67\xa2\xf9\x3b\xf8\x5d\xf3\xeb\xd0\xfb\xa9\xd5\xa6\x34\x60\xee\x9a\x77\x5f\x8c\xa2\xc2\xe8\x95\x8d\xee\xd9\x9b\xb7\x27\xe5\x71\x58\xc8\xca\xf7\xdc\xb2\x71\xac\x68\x4b\x91\xb8\x31\x4f\x3b\x1f\xdb\x61\x71\x53\xb4\xd3\x50\xd2\x80\x0e\x70\x3e\xc3\x18\xdb\xfd\x02\xe9\x37\x9e\x6c\xf3\x8f\x56\x37\x7f\xf9\xbf\xcb\x6d\x74\xff\xff\x42\xc7\x26\xfc\x27\xdb\x18\x85\x00\x9c\xb2\x06\xaf\x91\x57\x6d\x63\xfd\x7e\x94\x03\x1a\xba\x6d\x0f\x85\xf8\xec\x6d\x80\xa1\x11\xbc\x38\x61\xbb\xa8\xd0\xe8\x88\xc3\x23\x39\x55\x4e\x24\xb5\xc3\x4f\x20\xf3\x17\x3a\xca\xea\x86\x5a\x15\xfb\x83\x51\x58\xb4\x48\x01\x74\x1a\x2e\x8b\xaa\xe2\x43\x31\xe5\x53\x6d\x55\x24\x8a\xd6\x16\x9c\xe4\xbc\x12\x79\x14\x00\x36\x70\xf9\x16\x61\x4c\x46\xe0\xf3\x5a\xe8\x55\xee\x67\xa8\x6d\xd7\x2c\x90\x72\x8a\xa0\x10\x49\xa1\xbf\xf1\x5d\xc8\x3c\x64\xbb\xc2\x93\xde\xba\xdf\xc3\x7b\xf9\x96\x29\xcc\x15\xbb\x02\x0b\x40\x9c\x76\x5b\xae\x17\x57\x53\x4b\x58\xf6\xc9\x36\x96\xd9\xb4\x0f\x73\x06\xcb\x18\x18\x33\x67\x9e\xce\x39\x24\x74\xa9\xe6\x3e\x1f\xbb\xc3\xbd\x07\xa5\xb9\x15\x30\xa0\x38\xb0\xa1\xac\x6d\x6d\xb8\xd7\xdb\x88\x94\x45\x1e\xfb\xbe\x0a\xcd\x69\x54\xd1\x8f\x38\x79\xdf\x50\x1b\x5d\x0a\xc4\x5b\x31\x9f\x2f\x8b\x6e\x8e\xf1\x27\x79\xbd\x25\x02\xd6\x1a\x0f\xc9\xd5\x45\xef\x42\x4d\x9c\x87\xb9\x44\xbe\x59\xd8\x4a\x11\xd7\x84\x5e\x58\xcd\x61\xfc\xcf\xae\x6f\xec\x9c\x7b\x38\x36\x09\xf5\x62\x33\xe7\xe8\xb9\xf6\x0b\x62\x0d\x43\xf7\x30\xc0\x6e\x53\x54\x19\x0c\xf5\x2f\x90\x25\xd1\xaa\x74\x6e\x7f\xaa\x95\x96\xe9\xb9\x50\x27\x82\xd2\x66\x7a\x58\x09\x45\x4f\x6b\xb9\x92\x29\x18\x85\xfe\xcd\x3d\xdb\x31\xfd\xc1\x26\xc2\x89\x4a\x42\xd5\xc2\xbb\xa6\x42\x49\xec\x12\xd4\x1e\x2a\x67\xff\x29\xed\x77\x27\x14\x2f\xb0\x72\xba\x75\xba\xab\x0d\x5d\xe1\xf0\xf5\xc5\xb0\x4f\xd6\x39\x7e\x81\x25\x20\x47\xe0\x2b\x67\xc5\x77\xd1\x17\xd3\x78\xa9\x8d\x7c\x8c\x77\x87\x55\x6b\xd2\xd5\x9d\x13\x35\xd3\xa2\xa7\xb7\x1d\x11\xb2\x23\x41\xa4\xde\x14\x56\xa3\x59\x50\xd0\x8c\x8c\x66\xf9\x07\x28\x00\x10\x5d\xdf\x4c\x17\x44\x01\xe9\x30\x02\xfd\x04\x1a\xda\xe7\xd7\x32\xed\xdd\xbe\xa6\xa1\x6c\x84\x02\xef\xa5\xa5\xbc\xd0\x3f\x2e\x05\xb1\x50\x31\x34\xe6\x84\x62\xa9\x5f\x03\xb2\x44\x3c\xaa\x1d\xa0\x95\x13\x74\x59\xf8\x7e\xbd\x36\x73\x8e\x95\xa8\x0b\x0f\xf0\xcf\x09\xbb\x6f\x77\x07\x13\xae\x67\x06\xbf\xd0\xa6\x78\x20\xc5\xc6\xeb\x57\x82\x2d\x8e\xb8\x82\xce\x5a\xfb\xa0\xf1\x9b\x14\x5c\x1c\xa2\x2a\x3f\x00\x73\x8d\x8e\x05\xea\x11\x67\x72\x06\xab\x4f\xe9\x76\xbd\xdb\xad\x8f\xd3\xcf\x00\x01\x52\x0f\x80\xa2\x20\x47\xf7\xd7\xc7\x2d\x05\x8e\xa1\xee\x6a\xf8\x72\xe9\x51\xdc\x8c\xd6\xde\x59\x4f\x79\x50\x20\xe3\x24\xcc\x77\x51\x5b\x3e\x9d\xc4\xd5\x08\xff\xac\x39\x1f\xff\x32\x81\x52\x85\xff\x65\xcf\x10\x6c\xff\xa7\x70\x39\xa7\x53\x89\x8b\xde\xd5\xe8\x89\x78\xde\xd1\x41\x0b\x8d\xfc\x0a\xd9\xf2\x10\x54\xc5\xab\xd5\x25\x5f\xb7\x0a\xb6\xbe\x2d\x5f\xb0\x09\x3a\x4d\x8a\x98\x1c\xd6\xa0\x43\xc0\x38\x9a\xa8\x49\x6d\x1f\x6a\x9b\xfb\xbb\xf2\xd9\x1d\xe7\xf6\x40\x08\x44\x94\xeb\x17\x78\x29\x8a\x24\x6d\xdb\xa0\x3e\x12\x5e\x39\x4e\x6b\x31\xf0\x8f\xd5\xfa\xa9\x75\x2c\x7c\x08\x11\xf6\x35\x32\xcd\xbb\x89\xff\x6c\x4d\x8b\xf2\x70\x7d\x48\xa0\xd2\xf0\xf8\x44\x86\xd7\x38\x4c\xbf\xc4\x4b\xca\x28\xdb\x4e\xa5\x59\xcb\x22\xb3\x43\x54\xe8\xac\x7f\xe1\xe0\x65\x36\xcf\x56\x5c\xc3\x25\xd2\x69\x31\xab\xd6\x94\x0d\x83\x25\xeb\x18\x0c\xa2\x4b\xd0\x44\x23\x4f\x34\x81\xe2\x6b\x67\x66\xda\xdb\x9d\x26\x75\xc8\x1f\xc2\x20\x3c\x1c\x88\x26\x0d\x11\xae\x73\x45\x0a\xfa\x0d\x06\x64\x9e\x35\x06\x8a\xc3\xc2\xeb\xa4\x98\xa9\xe0\x01\xcf\x2b\x1b\xee\x00\xcc\x15\xb9\x78\x9b\xed\xf7\x66\x41\x46\x0b\x3f\x0d\xc5\xdc\x5e\x36\x93\xb1\x09\x35\x4e\xc6\xa1\x9b\x14\x58\x76\x69\x72\x3f\x03\x99\xd0\xc0\xbd\x86\x2d\x67\xa8\x29\x10\xc6\xe0\x7b\x7b\xcf\x45\xfb\x43\x9e\xb7\xa2\xb3\xfd\xae\x3c\x62\x06\x4c\x3f\x97\x28\x96\xe3\xea\xe0\xd0\xfb\xba\x46\xa2\x25\x9c\xc3\x95\x91\x89\x8f\x68\x8d\xe0\x50\x05\x54\x78\x87\xa4\x5e\x45\xec\x0a\x3a\x1d\x75\x4c\x8f\x14\x8d\xca\x63\x1c\x97\x95\x23\xf4\x07\xcb\x1b\x0d\xb3\x40\xb8\xb0\x8e\xdb\x77\x18\x20\x3c\xe2\x7e\x7d\x84\xfc\x91\xfd\x44\x26\x37\x6e\xc9\x34\xc2\x14\xaa\x16\xd1\x12\xe6\x2d\x72\xfb\xb5\x2f\x38\xc6\x39\x4b\x53\xce\x34\x21\x0b\x17\x9b\x78\x94\xdd\x7b\x88\xf8\x0c\x27\x2c\x6a\xbc\xdd\xbe\x66\xed\x39\xca\x1e\x2e\x72\x16\x53\xfa\x30\xe6\x6a\xb3\x94\x1a\xb4\xaf\x3d\xcb\x11\x9f\xf1\x6b\xad\xc2\x55\x2a\x32\xfa\xa7\xaa\x98\xa1\x59\xb8\x21\x1c\x17\xe6\x7b\x31\x4b\x86\x60\xfe\xa3\x3a\x47\x37\x3e\x20\x1b\x27\x37\x8d\xf2\x6b\x59\xf0\x8d\xde\xdc\xf1\xb9\xab\x9b\x6b\xaa\x38\xaf\xd0\xed\x17\x5a\x78\x3a\x04\x3c\x48\xf7\xaa\xe4\xea\x76\x66\x4d\x04\x67\x75\x34\xe2\x07\x30\x9f\x3f\x49\x45\x9f\x93\xcb\x43\xfc\xef\x77\xa8\x16\x10\xdf\x8a\xc1\xb0\xd1\x4a\xcf\x1e\x20\x36\xd9\xf2\x4f\x52\xf0\x3d\xdb\xff\x65\xea\xf7\x57\x5d\x43\xb1\x85\x22\x01\x36\xac\xc9\xbc\x72\x0f\x6f\xff\xbc\x1f\xc7\xf2\xf8\x4f\xc5\x31\xc3\xdf\x60\x25\xb3\x6d\x82\x1c\x63\xc9\xb1\x5d\x1a\x95\x6b\xde\x43\x1d\x49\x9e\xa0\xd2\xb1\x6b\xca\x43\x5d\xf8\x85\xa6\x21\xc0\xb7\x83\x84\x4b\x16\xb4\x44\x31\x85\x7e\x35\xe0\x41\x82\xae\xbf\xe4\x1b\x07\xa5\xa7\x00\x85\x7f\x30\x6b\x6e\x8f\x42\x82\xc7\x52\x12\x9a\x4a\x82\xf7\x7c\x36\x88\x8a\x87\xba\x24\x72\xaf\x64\x0a\x88\x3f\xfe\xce\xa3\x10\x4a\x3c\xaa\x53\xe4\x86\xa8\x24\xf8\x2e\xa5\x9d\x56\x06\x71\xc8\x11\x75\x54\xc4\xd6\x0c\x38\x96\xcf\x51\x75\x54\xf8\xe0\x34\x5e\xb8\x37\x78\xe1\x51\xf8\x04\xd1\x7b\x01\x32\xfd\x04\x31\xbc\xbb\x31\x7a\xe6\x31\x3a\xea\xfe\xe3\x32\x3b\xe8\x31\xf9\x05\x36\xfb\xe5\x35\x5f\xa6\x51\xb8\xff\xba\x7a\xac\xb1\x65\x75\x48\xfb\xd5\x73\x85\xe4\xbf\xc7\x53\x4c\xee\x64\x7b\xea\x52\xca\xee\x6d\x75\xd4\x55\xa2\x25\xaa\xcf\xc5\xa7\x4f\xf4\x9b\xbe\xd4\x63\xf9\x03\xae\x7f\xcc\xab\x7f\xca\xab\xc7\xea\x90\x76\xf0\x57\x45\x38\x94\xc4\xcd\x91\xcf\x46\xff\x37\x5c\x21\x8d\xcd\x3f\x02\xd9\x5d\x4a\xe3\x95\x77\xec\x9b\x4a\x09\x91\x44\xea\x55\xc6\x0e\xad\x74\xca\x5f\x73\x20\xc1\xf7\xdf\x9f\x99\xcf\xc6\xf9\x5f\x73\x72\x26\x08\x7d\xe8\x68\xdb\x16\x1c\xf5\xe8\x3d\x73\x29\x1d\x8b\xe5\xd1\x73\x16\xdf\x8a\xe5\x31\x6b\xfa\x3e\xd4\x65\xb2\x0b\x15\xfc\x72\xe9\x08\xfe\xe9\xd3\x9f\x73\xa5\xff\x67\x3d\x69\x2c\x89\x99\xcb\xf0\xb0\x5b\x47\xe0\x43\x7f\xff\x7a\x66\x81\xba\x5e\x1a\x25\xb4\x32\xb5\x50\x29\x33\x84\xfe\xd2\x67\xf1\xfe\xf7\xfa\xf7\x39\x02\x5d\x95\x24\xde\xfa\x27\x9c\x06\x47\x7f\xa1\x3c\xde\xa9\x47\x7b\x69\x6c\x5e\x65\xac\xf6\x7f\xec\xa5\xb4\x33\x3a\x45\x6e\x8f\x82\x5f\xf9\x62\x0a\xdb\x52\xa2\xdf\x50\xa2\xaf\x9c\x87\x3a\xe7\xcf\xf1\x37\x81\xd4\x5e\xa5\x44\x7f\x99\x44\xdf\x8a\x60\xfa\x66\xc7\x2c\x21\x32\x9e\xa9\x44\xa3\xc5\x3b\xfc\xf9\x7b\x01\x36\xad\x61\x3c\x0b\xd4\x6d\xf3\xc9\x1c\xbd\xc0\xa1\x95\x3f\xf6\x0a\x87\xaf\x59\xe4\x10\x06\x6f\xf2\x86\xcf\xb2\x06\xa4\x4a\x86\x2f\xe0\x86\x2f\x8a\x86\xdf\xa0\x26\x64\x8a\x96\xaf\xbc\x86\xef\x20\xce\xd7\xb2\xe6\xe0\xfc\x0d\xcf\xbd\x12\x34\x3c\xd2\x08\x87\xfe\x86\x37\xfc\xaf\x78\xe6\xff\x88\x67\x77\x0c\xf5\xc7\xfa\xf8\x01\x44\xb8\x52\xf8\x66\x71\x3a\xa6\x42\xfa\xe6\x08\xd4\xfc\xd7\x1c\x12\x59\x84\x7f\xa5\x24\x9e\x09\x12\xaa\x2e\x0f\x75\x7f\xdc\xaf\x4f\xe3\x9a\xf2\xcb\x6d\x40\xc6\x63\x08\xc2\x67\x05\xc9\x63\xf8\xc3\x63\x04\xc1\x63\xf1\x05\xea\x40\x01\x6e\xf4\xca\x63\xf2\x29\x6f\x09\x02\xe2\x72\xca\x7f\xe3\xa5\x12\xdd\x97\x11\x3c\xe6\xb3\xfb\x37\x3c\xf7\x7f\xc1\x73\xfe\x67\xbc\xeb\x8f\xb1\xeb\xe8\xff\xc5\x5e\xfc\x63\x8f\x72\xf4\x7f\xf6\x63\x30\xb8\xd2\x9f\xf7\xfd\x69\x6f\xff\xb1\x3f\x1f\x6b\x6c\x9e\xc6\x0a\x49\xec\x33\x24\x84\x14\x29\x3c\xff\xb0\xf3\xa2\x53\x40\x7b\x21\x91\x38\x28\x18\x86\x51\x0b\x2f\x70\xd9\x50\xee\xb3\x56\x54\x4b\xff\x31\x59\x91\x87\xf3\x77\x28\xc0\xe3\xb8\xca\xe3\x38\x22\xa9\x51\xa0\x3c\xf9\x05\x0d\x9f\x2e\x66\xb2\xb9\x2a\x04\x63\x83\xe1\xc6\xf2\x75\xb3\x60\xeb\xf8\x32\x78\x8b\xad\xe1\x0a\x6a\x2d\xb2\xce\xc3\xf6\xad\xe1\x2a\xa2\xe0\x78\x1c\x33\x3a\x8f\x96\x48\x4d\xd3\x05\x68\x85\xca\xf9\x5c\xc7\x48\x2e\x1e\xb0\x10\xd0\x03\x3d\xd1\x53\x3e\x7e\xf8\x8a\x7d\xe3\x27\x9a\xc2\x93\x4c\xeb\x59\x81\xfd\xe4\x7b\xe9\x8d\xdb\x29\x33\xc2\x06\x73\xf3\x3e\x54\x90\x16\x89\xdc\x97\x5d\x9e\x65\x65\x66\x83\x6d\x1e\x56\x0a\x1d\xbb\x41\x16\xd7\x57\x5a\x05\xfe\x9a\xb8\xce\x33\xbb\x2f\xba\x8c\x3a\xec\xe0\xc0\x21\xf6\x23\xba\x61\x85\xd2\x5e\x47\xd4\x58\xfe\x56\x1f\x81\x08\x2b\x23\xc8\x60\x63\x9a\x30\x25\xe2\xa8\xdb\x81\x56\xf1\xd4\xa4\x75\x94\xba\xb1\x6a\x3e\x86\xec\x60\x6a\x37\x70\xa1\x78\xea\x0a\xda\xd0\xd1\x40\x3e\xfb\xe9\xdc\xa2\x51\x3c\x59\xc9\x2d\xe6\x0e\xba\xae\x62\x05\xf7\xc1\x08\xd3\x1b\xf1\xdd\x54\x1f\xf5\xb6\xdb\x11\x2e\xa8\x99\x6f\xae\x36\x16\x4f\xe1\xe9\x30\xd1\xa4\xb7\x8a\xb8\x2f\xa5\x85\x05\x35\xa4\x16\x24\x97\xbe\x36\x06\xee\x0c\x50\x12\x61\xf3\x88\x97\xb6\xba\xe1\xf4\x34\x11\x31\x9d\xc1\xb4\x88\x1b\x8b\x89\xa6\x90\xd4\x58\xa8\xc5\x43\x47\x09\xcb\xbd\x85\xc2\xcd\xab\x99\x2f\x7d\x10\xad\x3c\x9e\x40\x1c\x96\xb6\x08\x0f\xdd\x44\x1b\x15\x24\x74\x3a\x29\x07\x28\x51\xed\xa4\xbf\x58\x84\x94\x5d\xbe\x12\x60\xaa\xd8\x12\xa2\xda\x8c\x69\x97\xd0\x30\x1c\x51\xd5\x22\x91\xb4\xcd\xd4\x00\x86\xb1\x75\xdf\xa5\x91\xda\x7c\x7b\x2c\x25\x66\x0c\xeb\x10\x6e\x89\xd9\xf8\x2d\x2c\x9a\x3c\x1c\x06\x01\xc0\x83\x5d\x60\xa2\xec\xaa\xa1\xec\x43\x0e\x28\xdd\x2e\x0d\xd9\xb2\xbc\x25\x94\x00\xed\x97\xee\xe3\x6f\xbf\xb9\xab\x1e\xd6\xcb\xb0\x56\xe3\xa1\xcc\x35\x6a\x3a\x10\x67\xc8\x5e\x8b\xa6\x19\x08\x84\x8e\x9f\x83\x11\x0a\x3c\x86\x45\x0c\x04\xae\xd0\xce\xbb\x8d\x62\xaf\xbe\xc2\x0c\x0f\x3f\x5d\xce\x1a\xe7\x7c\xac\x5f\x40\x4d\xea\xdb\xa1\x7e\x01\x5b\x18\x30\xd2\x01\x44\xcc\xe4\x43\x39\x20\x65\xcb\x1f\xcc\xff\x7e\x8c\x7e\x50\xc7\xf8\x83\xb8\xdf\x90\xab\x86\xec\x2f\x2b\xed\x0d\xf8\xae\x67\x70\x43\xe9\x00\xe3\xaa\xe5\xec\xb5\x1a\x37\x26\xe8\x71\xce\x26\x41\x1f\x78\x27\xe9\x89\x3f\x72\x47\x36\xf4\x62\x42\x36\x8f\xc9\xb0\xa5\x89\xb2\x28\xc9\x66\xdb\xb6\x24\x3e\xb5\xbe\x31\xd4\xcd\x98\xe5\xe6\xee\xa0\x30\x18\x91\x8c\xbc\x9b\x07\x7e\xce\xa6\x88\x9a\x83\xf6\x8d\x6d\x9d\x26\xce\xd9\x5a\xac\xf6\x42\xaf\x65\xfe\x6b\x28\xbe\x67\x2c\x76\x17\x1b\x41\x57\xa7\x5d\xda\xc9\x2a\x1a\x86\x02\xcf\x4f\xf0\x61\x1b\x46\x1e\x22\x8e\x08\x6c\x86\xf7\xad\x7f\x94\x4c\x14\xff\x87\x4c\xfc\x1f\x32\xf1\x7f\xc8\xc4\xff\x63\x32\xe1\x0e\x06\xe6\xf4\xc9\x6b\xf2\xe1\x1f\xc1\x1f\xfb\x33\xf8\x8f\xac\x2b\xa4\x9c\xc9\x9b\x82\x01\x09\x7f\x04\x56\xc8\x08\x94\xff\x2d\x32\xf1\x17\x5e\xfa\x3f\xe2\xfd\xbf\x23\x13\xab\xe4\x7c\x2d\x67\xf6\x0a\x64\x40\x7f\x04\xff\xe6\xcf\xe0\x1f\x88\x82\x3b\xfc\xf1\x3f\xe7\x73\x7c\xe1\xb1\x7c\xe7\x71\xba\xff\x1d\x32\xf1\x17\x9e\x29\xfc\x8f\x78\xff\xdf\x90\x89\xa1\x86\xdf\xca\xf8\x83\x4c\xe4\x7f\x91\x09\xf3\xbf\xc8\x04\x74\xe8\x81\xbe\xb2\x34\x7c\x2e\x65\x18\xd9\xd3\xf2\x0b\x94\x67\x81\x42\xaf\x33\x3d\xe1\x31\x92\x44\x16\x50\x74\x84\x82\x12\xec\x66\x80\x03\x2c\xaf\x4f\x9a\xde\x95\x78\xd6\xe5\x34\x55\x09\x06\x45\x88\x3a\x28\xd2\xc6\x3e\x83\xce\x11\x41\x00\x1c\x81\xe9\x51\x45\x88\x46\xaf\xba\xea\x3b\xe3\x6b\x26\x7f\xf3\x3c\xff\xc6\x5f\x20\x06\xe1\xb4\xa3\xc6\x55\x22\x79\xaf\xbc\xd5\xe7\x86\x3a\xcb\x40\x9f\xc4\x7c\x0b\xd1\xb7\xfd\x04\x1f\x15\x40\x0a\x01\x4a\xfe\x44\x0b\xb8\x49\x75\x34\xf2\x43\x02\x2a\x5b\xc5\x27\x2b\x4b\xa7\xa2\x03\xe7\xdd\x1e\x09\xcb\x64\x8f\x1b\xa6\x22\xde\x29\xe8\x23\xdd\xa0\x7d\x25\x93\xde\xef\xf6\x38\x04\x4d\x51\x73\x57\xf7\xfa\xe4\x55\x5e\x4a\x7e\xdb\x45\x08\x2d\xfb\xef\xbc\xf8\x86\xb8\x64\x35\x12\x99\xf5\x27\x82\xcc\xef\xa9\xc0\xa5\x9b\x77\x02\x48\x7e\xef\xb2\x71\x5d\xc0\x5e\xa6\x65\x01\xa4\xf8\x8b\x8d\x7e\x8e\x0a\x28\x7a\x15\xc6\x72\x6c\xc8\xc4\xcc\x99\x52\xb6\xcd\xfb\xec\x07\xd9\xef\x71\xdc\x93\x2d\x1d\x11\xaa\xd1\x28\x9e\x7f\xdd\xab\x78\xb4\xd8\xb9\x58\xa2\x51\xbc\x64\xed\xee\x46\x06\x7a\x21\xec\xc8\x84\xa9\x23\x6c\x16\xb6\x01\xb2\xd5\x9b\x5f\x6a\xb3\xea\x99\x98\xb4\xb3\x0a\xd9\xed\xb6\x95\x9d\x45\x24\xd0\x00\x97\xb2\x0e\x61\x67\xb8\x5a\x17\x3b\x9a\xa6\x4c\x5b\xce\x06\x0e\xd8\xc5\xf8\x35\xb7\x9c\xe5\x4a\x18\x72\x0f\xd2\x97\x3f\x4d\xbc\x27\x82\xf4\x53\x64\x1d\xc7\xd2\x76\xa4\x06\x29\x34\x5c\x6e\x2b\x25\x30\xf2\x2c\xdd\xb4\x90\x56\x66\xa2\xe9\x78\xee\x45\x0d\x33\x89\x05\xae\xd1\x14\xa4\x51\xb8\x67\x71\x18\x61\x77\x94\x63\x35\x39\x39\xd2\xe6\xc6\x58\x20\x38\xfb\xf9\x09\xd8\x8b\xca\x97\x9f\x87\xd7\xaa\x67\xdc\xc2\xe2\x44\x8b\xca\x94\x74\x06\x79\xf8\x87\x66\x1d\xb9\x05\x1c\x8b\x49\x9b\x05\x50\x3b\xb8\x27\x05\x96\x12\x26\x23\x29\x7f\xb6\x22\x23\x89\x9b\x42\x2f\xa2\xa5\xc0\x1e\x7e\xac\x3c\x23\x17\x3c\xad\x86\xf4\x40\xbc\x9f\xb9\xe8\xfc\xd5\x77\x2d\x09\x6a\xf9\xe6\xd2\x50\x2e\xe0\x2d\x74\x0d\xff\x5e\x8f\xfe\x35\xd8\xdb\x09\xde\xb5\xf4\x69\x5b\x97\x18\x6d\x31\x95\xae\x22\x65\xd5\x64\x9e\xae\xd8\x96\x45\x5c\x77\xd3\x25\x59\xe6\x0a\x3f\xdf\x75\x05\xa1\x9c\x29\xa3\x52\x73\x2f\x4c\x71\x83\x9c\xf5\xd2\x14\x9e\x4d\xd4\x33\xe7\x16\x6a\xb1\x66\x38\x67\x86\x01\x99\x8d\x34\x4f\xcb\x51\xc3\xc7\xbc\x66\x3f\xce\x96\xbe\x42\x3e\x03\x72\x07\xe3\x2d\x57\x20\x16\xc2\x1d\xf7\xf5\x33\x06\xda\xb7\xec\xfa\x07\xd4\x9d\xae\x72\xba\x98\xfc\x50\x3f\xf5\x34\xb3\x50\x48\x20\x53\xef\xc8\x99\x6c\x03\xf0\x87\xcd\x6d\x30\xfa\x38\x09\xbc\x06\xd5\x82\x61\x8c\xdb\xc8\x76\x22\x0a\xb4\xf2\x9f\x6d\x4b\xda\xb7\xf1\xdf\xc5\x25\xda\xff\x3e\x9e\x8d\x1a\x8a\xe3\x3f\x6d\xf9\xcf\x0f\x48\xdf\xd8\x18\x96\x0c\x36\x59\xd7\xca\xbc\x61\xf5\x59\x01\x41\xed\x36\x45\xf0\x62\x1b\x91\x17\x2f\xcf\x8b\xb1\x83\x52\x12\x3d\x58\x7c\x14\xd7\x65\xe3\x74\x14\x1d\x5a\x0a\x4b\x5e\x30\x95\x56\x52\x9f\x81\xdf\x6f\x64\x9a\xab\x74\x36\x28\xf4\x77\x9a\xe9\x68\x4d\xe6\xc2\xb7\xdf\xf8\x7d\x68\x09\xd2\xdf\x85\x7a\xcb\xfd\x50\x5c\x0b\x6e\x63\xa2\x21\xb1\x81\x16\x82\xba\xe7\x32\x04\x6c\x7d\x08\xfe\x4a\x02\x3c\x89\xcc\x84\xa9\x9c\x74\x0d\xd1\x07\xe8\x6c\xd9\x6d\x50\x78\x00\x28\xab\xc0\xf5\xbc\xc9\x1e\x25\xec\x51\x13\x0c\xe6\x2b\x0e\x4d\x45\x33\x49\xcc\x26\x43\xee\x43\xa8\x04\xee\x42\xea\x8e\xc1\xf8\xad\x51\xb4\x12\x6d\xa8\x14\x9d\x30\x20\x06\x63\xdd\x79\x10\xf5\xcb\xfe\x40\x41\x27\x2e\xd1\xa6\xae\x92\xf1\xe0\xbc\xf9\x59\xfc\x86\x67\x8a\xbd\x64\x14\xc2\x44\x6c\x03\x8e\xaf\xa6\x1b\x32\x6c\x1b\x2b\x98\xd1\xf1\xa5\xc7\xfa\x27\xc1\xc5\x29\x8e\x6c\x16\xad\x9d\xf6\x64\x8a\xed\xe9\x09\xc1\x65\x1c\x8d\x36\x8d\xd3\xbf\x9d\x93\xba\x43\xe5\x78\x9f\xee\x2e\x97\x94\xd9\x45\x17\xe9\x07\x5e\x67\x5e\x24\xb0\x4b\x4b\x68\xec\x65\xb5\x5d\x66\x36\x19\x04\x24\xf4\x7a\x67\xe2\x73\x9d\xe4\xaf\x5e\x29\x11\x5f\x23\xfe\x00\x36\xd3\x58\x11\xa5\xeb\x65\xe9\x2e\xcb\x88\xbb\x4c\x00\x45\x41\x6e\x61\x2c\x1b\x9f\xc3\xd2\xa7\xbd\x72\x71\x60\x75\x68\x9a\xce\x21\x92\xeb\x47\x86\x04\x04\xd0\x1f\x99\x0d\x0c\xd2\xd4\x32\x5d\xb8\x22\xd5\x5a\xb8\x88\x87\x15\x36\x3a\x8c\x48\x9f\xa7\x06\x6c\xe2\xfe\x8e\xc3\xb7\x3b\xcf\xaf\xc8\x9c\x09\xc2\xda\x32\x1a\x5c\x0a\x35\xbe\x7a\xa5\x7f\x0e\x5a\x33\xe2\x77\xd2\x76\x4b\x00\x91\x51\xf7\x23\x01\xae\x12\x5b\xe6\x48\x9f\x6b\xd3\x43\x39\xa3\xdb\x47\x2f\x7e\x0d\x6f\x1b\xa4\xac\xdd\x58\x95\x64\xca\x26\xcd\xe4\xbc\x2e\x05\x1f\x21\x57\x48\x1b\xf6\xa8\x3e\xd2\x1c\x05\x56\xd7\x5e\x36\x99\xa1\x41\x72\x48\xe5\xc5\xc4\xfb\x01\x14\x04\x6c\x12\x17\x55\xe9\x02\xa6\x2e\xcd\x32\xa4\xa0\xfd\xc5\x0f\xb0\xbb\xbf\x18\x21\xda\x18\x07\xc2\xec\xf1\x2b\xe7\x83\x93\x64\xb3\xb3\x98\x2f\x4a\x1b\x41\x73\x70\xe7\xc0\x47\x65\xd3\x97\x3e\xcf\x62\xcf\xf1\x0b\xf7\x45\xac\xdb\xc7\xbc\x74\x1b\x20\x25\x61\xac\x66\x08\xa3\x40\x00\xc6\x27\x06\xbf\x1c\xe2\x57\xd1\x5c\x07\xff\x9b\xd2\xa9\x16\x8f\xaf\xba\x5b\x39\x29\xea\x3b\x48\x18\x23\x9d\xc2\x2c\x75\x46\x5d\x94\xff\xc9\x44\xe0\x68\xb2\x7f\x97\xed\xfe\xdf\x1c\xff\x8e\xe0\x1a\x82\x28\xba\x2b\x75\x6b\x8e\x20\xab\x21\x11\x6a\xe1\x09\x8e\x9f\x07\xca\x3d\x2f\xdf\xb3\xb2\xc5\x55\xad\x95\x60\x43\x9a\xbd\x34\x85\x0f\xde\xa3\xe9\xc3\xe4\xa0\x68\xb9\x30\x71\xad\x18\x24\x9a\x14\x1e\x3a\xe4\x22\x8d\x7e\x98\xdc\x88\xa6\x70\x8a\x02\x9f\xc7\x8c\xcb\x3c\x55\x9f\x55\x81\x16\x40\x93\xe8\x75\xa5\xc2\xfe\x62\x6a\x32\x6f\xa5\x6d\x9c\x84\x3b\x78\x4e\xe2\x20\xb4\x2a\x0c\x2c\x60\xa7\xc5\x6f\x1f\x7f\x87\xdd\x3a\x23\x82\x86\x69\x41\x81\xc7\x8f\x56\xe0\xd7\x90\x1b\x48\x60\x28\xf9\xc7\x1a\x10\x36\x86\x22\xd3\x2e\x09\x4a\xd5\x9e\xc7\x3b\xa1\x89\xae\xb5\x16\x52\x12\xa9\x15\x4f\x2a\x8f\xc4\x05\x3f\xf9\xb8\x05\x68\xa5\x17\xe8\x8a\x84\x62\xda\xff\x08\xa0\x71\x9a\x7b\x9f\xdb\x4f\xf2\xcf\x8d\x30\xdb\x9d\x18\x92\x74\x8b\xfb\x5b\x87\x24\xb1\x15\x46\x34\x20\x20\xab\x9e\xef\x68\x87\x25\xe9\xf8\x05\x9a\xe9\xee\xda\xb0\x56\x8a\xc2\xae\x9a\xe2\x1e\x0a\xac\x92\x45\x4c\xb6\xb1\xdb\x16\xa0\x61\xb5\xf1\x8d\xf3\x03\x97\x4a\x12\xf2\xc5\x4c\xd6\x7f\xa2\xb2\xb0\xc6\x35\x37\xf0\xbb\x2a\x9a\xb5\x4d\x36\x0a\x49\x11\x6a\x29\x42\xd1\x4d\xcb\xf5\x8d\x8f\xfb\xe2\x6e\xc3\x88\x37\x2f\x30\x8a\xc5\x0f\x5c\x31\x29\x46\xd9\x39\xfa\x6e\x96\xd1\x6d\xa4\xa5\x3a\x36\xd4\xfa\x09\xc1\x01\x67\x6c\xab\x6d\x68\xdc\xcd\x8f\x96\x6c\x22\xfd\x3a\xf9\xe6\x2a\xdb\x6e\xbc\x00\x24\xbd\x2f\x46\xe6\x5a\x13\x44\xb1\xa7\x1f\xbc\x60\x0a\xf8\x5d\x1e\xe7\xe6\x30\xfe\x84\x43\x22\x1c\xce\x76\xee\x4a\x95\x70\x53\x72\x9c\xe6\x5d\x48\xd5\x3b\x7f\x29\xf4\x58\xf6\x27\x7d\x31\x3c\xf3\x76\xad\x2e\xe4\xbf\x88\x49\x5b\x6b\x09\x57\xf4\x23\xba\x8d\x0d\x3a\x16\x66\xb0\x59\xa8\x6f\x4e\xd8\xf3\x41\x07\x0d\xcc\x6f\x04\x7c\xc6\x7b\xfe\x01\x16\x5f\xf8\x56\xb8\xa4\x26\xfa\xe0\x28\x99\x30\x32\x86\x85\xba\xe9\x7b\x20\x33\x00\x23\x2d\x48\x04\x60\x5c\x84\x37\xbb\x79\x76\x41\xce\x8e\xf0\xa5\xda\x27\x18\x93\x79\x7e\xd7\x43\x91\x4d\xc2\x49\xdc\x13\x0b\x5a\xa8\x5e\x5c\x24\xee\x12\x5a\xb5\xf0\x65\x82\x2a\x66\xf1\x84\x55\x62\x01\x47\x2d\x90\x84\xfa\x31\xe9\x4b\xba\x7c\x2b\x74\x27\x38\xd3\x25\xd2\x31\x21\xb6\xa4\x88\x81\x5d\xf2\x02\x52\xa1\x5b\x86\x37\xd6\x42\x23\xed\x36\xb4\x95\xa6\x35\xc5\x10\xdb\x49\xda\x1a\x0e\x21\x9c\xdf\x20\x3c\x47\x48\x0e\x36\xdc\x5a\xc3\xb6\x5f\x28\x40\x42\x56\x0d\xb1\xee\x80\x84\xe5\x12\x66\xbb\x34\xed\xf5\x4c\xb8\xd0\xb2\x80\x6d\x40\xad\x99\x02\x74\x8d\x78\x76\x9f\xde\xd2\xf6\x55\xd7\xe7\x6e\x55\x87\x3d\x73\x04\x8d\xe0\xb8\x1a\x99\xb4\x1d\x6d\x69\x33\x39\x6b\x51\xfa\x3c\xa3\x67\x47\x23\xea\xdc\xcd\x9c\x29\xbf\x88\x72\x8c\x96\xc7\x31\xe4\x0a\xf2\x07\x8c\x30\x7a\x22\xf7\x0d\xbb\x30\xc5\x60\x58\x6b\xeb\x50\xa1\x27\x73\xe6\xcf\x77\x81\xff\x9c\x86\xf0\x68\xbe\x7f\x99\xef\xf8\x7b\xeb\xd2\x7f\xda\x91\x13\x3b\x37\x3e\xcf\xaf\xcb\x43\x99\xc5\x63\x18\xd6\x2e\x8b\xc3\x68\x39\x11\xd1\x0d\x84\x19\xdc\x17\x42\x3d\x1b\x1d\x5c\x64\x90\xa9\x01\x16\xa6\x29\xaa\xab\x31\xa8\x2f\x44\xc1\x75\x02\xd7\x64\x3d\xa7\xe4\xa3\x51\x77\x4c\x64\xdc\xcf\x8a\x9a\xab\x74\x4f\xaf\x82\x14\x17\xeb\xc7\xef\x9f\x41\xe2\xdf\x5c\x5b\x53\x38\x4d\x47\x90\xbc\xd7\xef\x05\x00\x94\x78\x6b\xab\xf2\xe0\x6d\xfb\xf8\xe3\x92\x11\x9b\x24\x98\xd5\x1e\x23\x94\xff\xe5\xc8\x2e\x57\x0f\x78\x16\x85\x1c\x31\x65\x9e\xc6\x28\x34\x58\x08\xc0\xa2\x7b\x67\xa2\x5f\xeb\xcf\xf2\xe9\x10\x04\x40\xe3\x1d\x86\xa0\xfd\x27\x7e\x56\x38\xf6\x6c\xa9\x59\xa9\x29\x67\xdf\x15\xfa\x64\x85\xdf\x22\xe0\xa5\x6c\x4f\x77\xa9\x0a\xa0\x2a\x0c\x4f\x79\x84\x0c\x2e\xe5\x63\xfa\x2d\x8e\x1d\xde\x61\xf5\xe6\x07\xd7\x5c\x7c\x7e\xb0\xd2\xae\x7e\xf0\xad\xd6\xa8\x0f\xb4\x61\xa5\x70\x47\xcc\xf3\x73\x05\x4d\xe1\x64\x61\x5f\x92\x24\x36\xe2\x6b\x2c\xa2\x69\x3b\xf5\x66\x4a\x48\xf8\xe5\x06\x09\x2c\x20\x66\x60\xdc\x46\x37\xd2\x75\x36\x78\x63\x95\xcc\x4f\x48\x2a\xa8\x94\x56\x42\xbe\xaf\x49\x5e\x73\x99\x83\xa3\x9a\x36\x66\x91\x1b\x64\xc7\x7a\x13\xc1\xfe\x3c\xf5\x76\x10\x96\xc0\xfd\x09\x37\x53\x09\x15\xf7\xb6\x9b\x88\x3b\x37\x4c\x75\xc6\xf2\x55\x5e\x6e\x43\x3b\x94\x6d\x41\x38\xab\x71\x11\xa5\x60\xd6\xe3\xee\xaf\xa2\x59\x88\x8e\x24\xbb\xa6\x17\xa6\x90\xdf\xf2\x84\x7a\x1c\x15\x0e\x6f\x37\xd0\xdb\x8e\x55\x08\x40\xa2\xd3\x1a\x2d\x72\xff\xeb\xce\x4f\xe1\x87\x49\xf6\xcc\x4d\xe0\x7c\xb1\x71\xbc\x42\x28\x92\xb3\x40\x4c\x86\xf2\x8b\x32\xb9\x63\x1e\x90\x06\x0d\xf4\x93\xd0\x04\x4e\x12\x89\x7e\xca\x59\x76\x0c\x4f\x2d\xc4\xc2\xb8\x88\xeb\x72\x93\x63\xf4\xdd\x8e\x72\xca\x0b\x77\xde\x6a\xbf\x1e\x17\xb7\xa2\x1f\x57\x2f\xd3\xb4\x18\xeb\x02\x6a\x78\x53\x6b\x76\xea\x1d\xc4\xad\xd8\xcb\xc5\x34\x43\x43\xa2\xd3\xce\x1e\x9b\x1c\xb3\x08\x0e\x80\x03\xc8\x49\x36\xd1\xdd\x51\x2b\x29\x8b\x3a\x97\x4f\x7d\x3d\x15\x7b\x11\x2e\xb4\xa6\xbf\xd3\xdd\x95\x7b\xfa\x6d\x07\x9f\xad\x9b\xb6\xca\x2a\x86\xa0\xcd\x99\x93\x34\x44\xc6\xd2\x80\x2b\xb9\x7f\xd0\x98\xdd\x6c\x66\x53\x8b\x0d\x05\x36\x4b\x55\x92\xf0\xa8\x96\x3f\x31\xd4\x55\x72\xa0\x0a\xea\x09\xe6\x66\x0d\x97\x72\xe4\x3d\x29\x17\x93\x9e\x4a\xb0\xd7\x58\x2d\x09\xa2\x47\xb9\x46\x5f\x45\xb4\x3f\x06\xad\x6f\x39\xf5\x19\x27\x3c\x02\x4c\x0d\xfc\x4a\xe4\x7f\x65\xc3\x97\xa3\x42\xdd\xcc\x87\x3b\x2f\xa2\x3d\xfb\xed\x56\x0a\xe9\x58\x7c\x5a\x58\x3f\x28\x95\xd1\x0d\x69\x15\x9e\x55\xc8\x6f\x83\x89\xe3\x1c\x50\xd1\xb4\x1f\x46\xc1\x6e\x13\x58\x87\xa5\x28\x92\x45\xc0\x12\x35\xc0\x85\x32\x38\x0c\xcc\xd9\x0f\x84\xb8\x10\xc2\xbe\x15\x83\xd1\x7a\xd4\x06\x91\x24\xd0\x9a\xe4\x1f\xe5\x1b\x5d\xfd\x2f\x93\x10\x4c\xee\xdf\xcf\x72\xfe\x53\x49\xb8\x25\x9f\x1c\xed\xc7\xf8\x4b\x54\xb3\x88\x02\x61\x7c\x03\x75\xcf\x4c\xa9\xa5\x59\xa8\x81\xf5\x05\xba\x68\xe1\x25\x29\x21\xff\x85\x0f\xdb\xc6\xa7\xec\xb5\x13\x82\x27\x12\xab\xba\xce\xca\x24\x2c\x2f\x44\x6b\x26\xd8\x42\x3b\xec\x65\xb8\xe6\x6f\xff\x5d\x95\x85\x19\x75\xca\x73\x7e\x94\x67\x67\x55\x17\x24\x4a\xd8\xca\xd7\x59\x0c\x49\x5a\xb6\x8c\xbc\x2a\x57\x78\x52\xd9\x20\xe7\xb0\x3b\x8c\xb6\xd4\xe2\x72\x82\x64\xf8\x3b\x18\xcf\x5d\xaf\xd0\x7c\xe7\x1e\x46\x6b\x22\xb6\xda\xbe\xa1\x64\x66\x34\x7c\xc5\x29\x5f\x50\xb7\x80\x0b\x3d\x93\xc0\xf6\x07\x46\xe6\xfc\x1c\x28\x34\x00\x5a\xcb\x57\xd2\x08\xa0\xcd\xaf\x13\x03\x9f\xee\x95\xf3\xb9\x48\x98\xbb\x76\x61\x3a\x6d\x72\x09\xe4\x17\x8b\xd6\x77\xaf\xa9\xfc\x92\x56\xe3\xe5\xa9\x5f\x43\x42\x7e\x97\xc3\x97\xec\x78\x2b\x69\x76\x3a\xf8\x59\xb7\x30\x72\xdc\xdd\x12\x60\x02\x30\x27\x01\x6c\x2a\x2e\x67\x2a\xfc\x0e\xb0\x07\x42\x4d\xf1\xf7\x50\xa1\x79\xa6\x24\x4d\xf4\xf4\x06\xf2\x0d\x73\x2f\xd3\xbd\x71\x63\x37\x32\x93\x08\x89\x02\x76\x73\xca\xcc\x8c\x43\x6f\x61\x2f\xf0\x83\xd4\xc6\x8c\x91\x65\x27\x62\x3b\xf1\x90\x0d\x2c\x9c\x97\x29\x9c\xec\x10\x7b\x06\x62\x6d\x99\x30\x93\x6e\x2d\x0a\xe6\x56\xa4\xe0\x45\xb8\x50\x15\x53\x65\x1e\xb4\xf1\x55\x99\xed\x41\x7d\x0c\x54\x0c\x69\x52\x87\x2a\x52\x22\xef\xc3\xb5\x46\xc1\xd7\xb2\xcd\xd1\x97\x8f\x3d\x9c\xf7\xb8\xa4\xa5\x7e\xbe\xc2\x53\x3b\x74\x57\x4f\x15\xf2\x90\x74\x18\x25\x85\x6b\xc3\x50\xd5\xe2\x13\xd4\x02\x46\x1a\xb0\xb9\x0c\xb9\x3a\xb0\xaf\xe0\x8c\xc4\xa1\x03\xcb\xc9\x28\x80\x11\xdc\xb9\xd8\xce\x49\x9e\xa9\x5a\x01\x7a\x5b\x03\x3d\x98\x8c\x55\xbc\x2b\xf1\x0c\x4e\xd4\x81\xc5\xb0\x0c\x0d\x4a\x3b\xb7\x66\x8a\x7c\xff\x28\xd1\x6a\x1d\x0a\x41\x2d\xdc\xad\x23\x82\x38\x02\x89\xe1\x5b\xf3\x45\x5d\xd3\xe5\xfb\xc2\xc4\x60\x59\x7f\x4a\x87\x52\x89\x3e\xf1\x77\xcb\xd1\x6b\x4b\x65\x35\xac\x06\x76\x04\x3c\x97\xec\x68\x17\x53\xd2\x7c\xd8\x38\xc4\x2a\x94\xd3\xa7\x8c\x7c\x21\xad\x85\x0d\xbc\x0d\x6d\x44\x7f\x9c\x6a\x29\x9f\x1f\x12\x0c\xbf\x23\x2e\x7e\x8e\x09\xcf\x9b\x43\xd2\xaf\x10\xdf\xfe\x44\xe0\xe3\xc2\x66\xb8\x51\x18\xb8\xe0\xe0\xe9\x9d\x74\x30\x43\xc8\x63\xf8\x12\x59\x60\x43\x39\x0b\xba\x99\x12\x00\x1c\xf4\x27\x87\xc0\x40\x5c\xe4\xca\x2e\x69\x06\xde\xbe\x2a\x58\xb4\xb5\x1b\x1f\xfa\x29\xf4\xe8\x6b\x1a\xe0\x04\xbf\x2a\xac\x4f\x67\x1b\x0c\x3a\xe7\x4c\xf8\xdd\x7f\x91\x16\x3f\xe5\x61\x37\x97\x57\xdc\x01\x33\xe1\x54\x9c\xe2\x48\x04\x13\xce\x6b\x1f\x5d\xed\x06\x5f\x87\x53\x94\x94\x0b\x1d\xfc\x1d\xb2\xbd\x5f\x37\xc3\x61\x27\x47\x6f\xed\xbc\xa7\xd7\x3f\xdc\x94\x70\x3c\xff\xb2\xae\x84\x4a\xfd\xef\x42\x42\xf0\x3b\x2c\x09\x16\x1c\xbb\xde\xdf\xb8\x7b\x3f\xb6\x39\x15\xd5\x7b\xb9\x36\x65\x59\x41\xe4\xb4\x55\x93\xf5\x85\xa8\x9a\x55\xf8\x99\x33\xc5\xc9\x8d\x4c\x35\x43\xaa\x74\xbe\xa7\xc4\x7a\xab\x32\x11\xd7\x0c\x8b\xd1\xb8\x86\xd7\xb9\xac\xa7\x21\xf4\x87\xbd\x34\xa0\xc0\x25\x28\x73\x3f\x31\x47\x0d\xdf\x9e\xe7\x7e\xf8\xc6\xd5\xf1\xde\x39\x01\x6a\x9b\x84\x6a\x49\x44\x1a\xe7\x64\x5f\xee\x23\xc6\xba\x2c\xe9\xe0\xfc\xd5\xd7\xef\xd7\x57\x3b\x41\x12\x48\x95\xa3\xc7\xe7\x10\xf4\x29\xaa\xb7\xbd\x6f\x96\xcd\x01\x06\x2b\x4c\xcf\xb3\xb6\x1d\x76\x8c\x01\x6e\x49\xd3\x6e\x7d\x19\x1b\xe9\x05\x60\xd1\x8b\xa2\x84\xad\x57\x74\xe5\xf0\x4a\x29\x75\xc9\x04\x32\xcb\x87\xa7\x8d\x99\x82\x15\x7b\x45\xf8\x3d\x53\x7b\x99\xc8\xb2\x45\xb1\x40\x42\xb4\xbd\xd7\x77\xe6\xd3\xfa\x3a\xbf\x1e\x14\xe3\x81\xc4\x0b\x27\xf3\x04\xa3\x32\xe2\x80\x7a\xde\xc1\x66\x40\xb9\x2f\x41\x02\xd4\xdd\xe2\xed\x85\xf5\x40\x3a\x52\x66\x2a\x8c\x41\xfc\x4a\x4f\x23\x2d\xb0\xd4\x2c\xd4\x9f\x1e\x21\x7b\x0a\x46\x05\x59\xd2\xb8\x38\x63\x54\xe1\x39\x41\x8c\xb5\xca\x8e\x11\x78\x88\xfa\x75\x0e\x8f\xfc\x3a\xeb\x57\x3d\xaf\xbb\x24\x05\xca\x5d\x3b\x93\xeb\x12\xc3\xf4\x69\x93\x91\x57\x93\x4a\x08\x1a\x19\x5c\xc9\x5e\xcb\xa3\xa9\x05\x4a\xf8\x2e\x3b\x1a\x5d\x96\x21\x2a\xfb\xf6\xe6\xb6\xf1\xd4\x36\x24\x05\xbc\xf6\xbc\x46\x66\x79\xf5\x02\x60\xd2\xfe\xa2\xb1\xd6\xf6\xbb\x5d\x3b\xce\xa5\x89\x4c\x08\xe8\x05\x07\x1c\x01\x6d\x90\xe5\x0a\x23\x7e\x42\xbc\x02\x41\x72\xd6\x99\xa8\xeb\x17\xae\xf9\xe0\xd1\x3f\xa0\x5c\xec\x1f\x2c\x58\x51\x9a\x39\xd0\x2b\x2e\x4f\x83\xd8\x85\x2b\x2c\xbb\xc0\x28\xd8\x79\xa5\xad\xba\x7e\xa2\x61\x03\x85\x17\xbb\xf9\x06\x40\x18\xea\x1a\xd9\x5c\x7d\xc0\x61\x46\x9a\xa1\x10\x92\x09\x35\x50\x0a\x61\xb2\xe8\x02\xe6\x62\x72\x20\xf4\x3e\x24\x4c\x56\x75\x6a\x79\xf9\x97\xa0\x4c\xe1\x62\xd6\x8a\x30\x12\x83\xaf\x60\x84\xc2\x3f\xba\x82\x2e\xb3\xf1\x7e\x2d\x6d\xdd\xdc\x6f\xad\xb8\x61\xbb\xd2\x73\xf3\xdf\x7c\x5e\xdd\xed\x01\x7f\x08\xd7\x5f\xd7\xcd\xf0\x8c\xca\x81\xe4\xf8\x31\x9f\x33\xdd\xff\x64\x20\xbe\xb3\xeb\xdf\x65\x6b\xab\xf8\x77\xf2\xfe\x1f\x29\x9f\x1d\x1f\xab\x96\xc7\xd0\xbd\x05\x8e\x16\x3a\x86\x58\x2a\xb1\xc3\x9a\x9c\xc3\xee\x10\xa1\xd9\x00\x4b\x59\xbc\xd4\x02\x46\x8d\xe5\x20\xa6\xec\x92\x80\x63\xc3\xd3\x16\x06\xfb\x1b\x56\x32\xb1\x9c\x86\x75\x2f\x4f\x93\x48\xb4\xbe\xf6\xdf\x41\x59\xc7\x92\xed\x03\xf4\x4c\x25\x90\x93\xdf\xfa\x7c\xd7\x44\x09\x28\x58\xb8\xbd\x3d\xcc\xdd\x7b\x8e\x11\x64\x8a\x2f\xa2\x2e\xfc\x20\x30\xcd\x69\x8d\x6b\xac\xd2\x2b\xaa\x53\x06\xbb\x85\x23\x66\xd1\x89\xfc\x64\x15\xb5\xc6\xa7\x3b\x16\x92\x45\x6a\xb6\xde\xd6\x3e\x1f\x06\xdb\x1d\x34\x5d\xa3\x1a\x2f\x16\xb5\x13\x31\x0a\xb1\xdc\x3f\x49\x8d\xc6\x33\xfb\xba\x26\xe4\xb0\x20\xa2\x65\x32\x99\x1f\xc6\x18\x3c\x8b\xab\x32\xc5\xbb\x69\x6d\x69\x65\xed\x41\x02\xbc\x8a\xd1\x33\x80\x14\x97\x3f\xdf\xef\x1c\x17\x7b\x0e\x0c\xfa\xad\x62\xbf\xa6\x9e\x0c\x9e\x97\xa2\xed\x9a\xab\x98\x4b\x3d\xda\xe4\xc9\x69\xb9\xf0\x96\x36\x79\x0a\x37\xe8\x97\x22\xf8\xf5\x58\xf0\x5f\x30\x9c\x2a\x66\xbf\x68\xc2\xab\xeb\x4b\x38\x92\x6a\x67\xef\xc6\x02\x66\x5f\x03\x18\x1a\xeb\x08\x02\x1d\x50\x71\x5b\xe9\x50\xff\xcc\x78\x67\x83\x2d\x3d\x1b\x9e\x21\xb8\x5c\x2f\x99\x8e\xb9\xb3\x6a\x80\xd3\x80\xd6\x27\x9b\x72\x5b\xc2\x23\x29\x69\x97\x9e\xde\x5a\x69\xb1\xfc\x34\x35\x0b\x53\xa5\x65\x1b\x89\xf1\x3e\x0d\x81\x6f\xf0\xce\x7f\x33\x37\x50\xd5\x19\x03\x82\xc1\xf4\x59\x96\x9e\xb6\x5c\xde\x41\x29\x87\x62\x32\x9e\xa7\x64\x4b\x9c\xe5\xde\x77\xd2\x37\xf8\x6f\xb3\xee\xa2\x70\x07\x00\x0d\x1e\x48\x11\xae\xf9\x98\x76\x53\xc2\xd2\x29\xc8\x5e\x1d\xbc\x99\x5b\x93\x03\xb3\x4e\x6b\x5f\x33\xa1\xd4\xcd\x6e\x9a\x5b\x6a\x6a\x53\xc1\xd5\x60\x5e\xf9\xc5\xb5\x81\x31\xfc\x61\xf7\x04\xf5\x98\x8d\x6a\x36\x48\xc1\x08\x8d\xec\xce\xab\xde\xf8\x54\xb7\x25\xc8\x3c\x16\x92\x4e\x89\x05\x26\xf4\x23\x1c\xf2\x04\xa6\xfd\xb6\xbb\xde\x7e\x6c\x11\x3f\x58\x68\xb5\xc9\x84\xb9\xbb\xd9\xc8\xf9\xae\x8a\xd6\x9b\xfa\xbb\x03\x1b\x26\xd0\x16\x4b\xbb\x04\xe3\x20\x76\x86\x0f\xf8\x8e\xb8\x1a\x77\x6c\xf5\xd2\x1a\x37\x02\x10\xdf\xd2\x00\x9b\xf8\x2a\xaa\x87\x66\x72\xd5\x76\x36\x89\x74\xae\x9c\xcb\xe6\x1c\x6f\xad\x90\xc6\xaa\x05\x16\x2e\x36\x5a\xbe\xac\x65\x46\xd4\xf9\x96\x6c\xc3\xca\x81\xdf\x6e\x8e\xc6\x0d\xe8\x24\xa4\xa0\xbe\x04\x12\xe0\xb2\xdd\xa2\x5a\x64\x98\xfd\x98\x5b\x60\xe6\xa3\x4f\xec\x2e\x08\x22\x5a\x6e\xb1\x1c\x71\xc9\x81\xee\x69\xaa\x35\x51\xf2\x89\x1e\xaa\x96\x98\x03\xad\x14\xa6\x0c\x0d\x7d\x06\xce\xe0\x02\x72\x44\x73\x2b\x8f\x4b\xfb\x54\xed\x58\x3a\x0f\xe9\x5e\xf9\x90\xa5\xfe\xc1\xac\x76\x5d\x25\x29\xd1\xa5\xcb\x51\xd0\x98\x55\x90\xfc\x59\x07\x50\x44\xe1\xfc\xf3\x34\xfe\x67\xa8\xef\xd0\xd5\xb7\xc9\xae\x5c\x23\x80\x01\x33\x8e\x42\x7c\xd6\x13\x7f\x52\xe9\x58\xd7\xd7\xff\x8f\xb9\x2f\xef\x6e\xd5\x48\xfb\xfc\x3f\x9f\x82\xe3\x4c\x4f\xba\x47\x61\x29\x76\x7c\xef\xcd\x34\x12\xda\xd1\xbe\x6b\xce\x9c\x3e\xec\x20\xb1\x09\x10\x08\xf9\xf5\x77\x7f\x4f\x15\x92\x2d\xdb\xf2\x4d\xd2\xc9\xdb\x27\x4e\xae\x05\xb5\x3c\xfb\xf3\xab\xa2\x6c\xfc\xe4\x81\xb8\x9e\x4d\x24\x0a\xfd\xcd\x23\x2a\x6e\x09\x06\x25\x46\xec\xf8\x4f\x3e\x14\x28\x82\xcf\x70\xe5\xe1\x06\x58\xd2\xdc\xa9\x9d\x02\xff\x8b\xe1\x6a\x49\x6a\x65\xdf\x8e\x99\x2d\xfe\xfc\x37\xa6\x91\xe6\x0e\xaa\x18\xab\x6a\xa5\x95\xfc\x8b\xfe\x09\x3b\x05\x7e\x98\x7e\xfb\xc9\xcd\xb2\xf8\x91\x24\x8b\xa2\x20\x0a\x86\x88\x12\x87\xa4\x29\x8a\x82\x64\x7e\xc2\x72\xcf\x2a\xea\xd1\xe9\xdb\x4f\x14\x46\x61\x02\x8d\x01\x8a\x7a\x29\xf7\x5a\xfa\xd6\xaf\x95\xa5\x05\xbf\xad\x2c\x2d\xc3\x13\x74\x55\x94\x16\x50\xa0\xaa\x48\x7b\x69\x82\x57\x04\x45\x71\x7f\x7a\x39\x5a\x8b\x36\x4c\x8b\xbd\x5f\x0f\xf5\x4e\x79\x56\x8b\x32\xb4\xcf\xca\xbf\x32\x80\xf9\x58\xfe\x55\x37\x28\xd3\xbc\x3f\x9e\x65\xef\x94\x8b\xa5\x75\x60\x7e\x22\x0e\x27\x7c\x2c\xcf\x6a\x08\x92\x69\x7c\x52\x5e\x96\x97\x3e\x56\xd3\xd5\x35\x91\xd5\x3f\x2b\x2f\x0b\x3e\x96\xbb\xd5\x74\x5e\xd4\x3e\x19\x2f\x31\xec\xc7\x0a\xb0\x06\xcb\x49\xe2\xff\x78\xb9\xd8\xa5\x24\x75\x08\x7a\x09\x5c\x96\xbb\x5f\x33\x16\xfc\x6a\xcd\xd8\x8f\x24\x7e\x6f\xe1\xd8\xf7\xf4\x25\x02\x60\x12\x20\x80\xca\x12\x02\x26\xd0\x04\xe7\x32\x84\xe4\xd3\x84\x88\x01\x1a\xd5\x53\x67\x71\x78\xe1\xb2\x04\xe7\x33\x04\x83\x01\x06\xa3\x09\x09\x07\x8c\xcb\x10\xa2\x8f\xb3\x04\x8f\x01\x91\xe0\x5d\x9c\x55\x81\x80\x09\x02\x41\xfb\x38\x43\x08\x18\x60\x08\xa9\x23\x11\xe0\x1c\xd0\x34\x01\x30\x6a\x89\x68\x73\x84\xe0\xa3\x8a\xe3\x34\x21\x5c\x69\x0b\xb0\x35\xaf\x88\x30\x04\xb7\x14\x78\x82\xbd\xd0\x60\x09\x01\xb6\x09\xe8\x16\x87\xb7\xf9\xb5\x8d\x47\xe5\xc4\x05\x8c\xf2\x71\x1e\xf6\xc1\xe9\x2c\x01\x7c\x16\x4a\xce\x10\x22\xc6\x56\x05\xe3\x45\x97\x55\x79\x1a\xa9\xe8\xe2\x2c\xf1\x5a\xad\xf7\x6f\x34\x63\xdb\xf6\xaf\xd6\xa6\xa6\x7f\x1b\x08\x00\xf1\x0a\x02\x1c\x45\x50\x34\x53\xe1\xc0\xa5\x95\x7e\x6d\xfd\x43\x40\x50\x61\xc9\xfb\x78\xe4\x19\x56\xba\x5f\x3a\xfa\x63\xf0\x0a\x14\x60\x78\xfd\xbb\xc1\xfb\xa9\x25\x98\xdf\x68\x09\x40\x70\x00\x5c\x6c\x01\x08\x01\x5c\xaa\x74\xf3\x1c\x41\xa3\x76\xfa\xb5\xfd\xaf\x6f\x8d\x97\x3c\xe1\x59\x82\xc1\x38\x8e\xe0\x8c\x6b\x65\x7e\x54\x6f\x9e\xc1\x39\x02\xc0\x0f\x81\x60\x50\x25\x77\x94\x23\x30\xf4\x44\x94\x3d\xc2\x8c\x96\x08\x1e\xe3\x19\x82\xc7\x68\xd8\xc7\xb3\x06\x9c\x49\xd0\xd5\x0c\x1e\x17\x09\x0e\xa7\x51\xad\xfc\xaa\x24\xbb\x08\x93\x00\x07\x38\x07\xb9\xf0\xe8\x03\xd1\x83\x5c\xe1\x38\x20\x10\x55\x8d\x79\x8c\xae\x6a\xe3\x57\x79\x74\xa9\x12\x0f\xaa\x82\xf4\x04\x8f\xc1\x1c\x10\x08\x50\xa5\x22\x2a\xeb\x4f\x53\x38\x20\x38\x8c\xaf\x8a\xb9\xc3\x1c\x64\x71\x54\xbb\x5d\x42\x17\x3c\x22\x44\xd0\x18\x4f\x48\xa8\x4e\x3d\x45\x30\x18\x15\xe0\x12\x21\x61\x80\x23\x18\x83\xe0\xaa\xf2\xf5\x50\x5f\x0c\x55\x9b\xa7\x91\x19\x84\x4a\x7d\x48\x16\x10\x34\xce\xa3\x66\x00\x08\x09\xe2\x84\x80\xd1\xa8\x40\x3c\x8b\x11\x2c\x26\x10\x22\x9c\x4a\x63\x2c\x92\x40\x40\x2a\x71\x50\x12\x1e\xa7\x09\x21\xa0\x21\x1e\x00\x17\x10\xc0\x80\xa2\xb0\xa8\xde\x3c\x5d\x55\x9d\xc7\x51\xcd\x7e\x1e\x07\x30\xc1\xf1\x97\x4a\xf5\x0c\x92\xc3\x05\x04\xb7\x64\xc4\xaa\x32\x3d\x85\xa1\x0a\xfb\x17\x2d\x08\xe1\x1c\xb0\x18\x85\xa4\x87\x73\xa9\xca\x4a\xc8\x79\xb7\xf4\xd1\xdc\x1c\x0d\x87\xc2\x73\x04\xe3\x12\x92\xf1\x61\x18\x0e\x90\x64\xd0\x27\xa8\xa0\x3f\xb2\x24\x14\x04\x87\x1a\x1a\x84\x40\xd0\xd0\x3b\x50\x3a\x68\xae\x4b\xdd\x7d\x74\x53\x79\x89\x47\x4e\xa8\xa6\x30\xe8\x0e\x40\x89\xf9\xaa\x12\x3f\x5b\x89\x4c\x70\x44\x35\xe5\x52\xea\x1f\xfd\xcf\xc3\x48\xa9\xc8\x48\x50\x17\x18\x33\xb0\x57\x22\x58\x48\x0b\xca\x2c\x22\x81\x51\x49\x7f\x24\x1f\x83\x51\x97\x9a\xff\x00\x46\x56\x25\x2f\x0e\x85\x84\xda\x5e\x03\x01\xa1\xb4\x08\x83\x8f\x35\xa0\xba\x4c\xe5\x66\x64\x2a\x89\x80\xfe\xe4\x2b\x8d\x3e\x15\x85\xa9\x9c\x05\x09\x23\xb5\x38\x8c\x86\xb2\x20\x93\x5f\xdc\x70\x1d\x22\xc2\x69\xa8\x11\x9a\xc3\xc5\x09\xa9\xe2\x59\x89\xcd\xe0\x28\x80\x01\x42\x77\x68\x6c\xd1\xc0\x61\x9c\x13\x00\x47\x63\x68\x9c\x43\x76\x85\x5a\xc1\x85\x84\x82\x31\x05\x6f\x40\x15\xf9\xb0\x85\x21\x78\x02\x60\x1c\x8c\xb5\x01\x03\x07\xb1\x80\xe0\x0d\x82\x23\x68\xc4\x82\xbe\x9a\xf8\x62\xa8\x4a\x3c\x68\x6c\xe4\x0d\x09\x0a\x47\x57\xce\x82\x46\x82\x9e\x85\x6e\xcb\x01\x0c\x07\x09\x0d\xa6\xab\x39\x48\x89\x57\x7b\x22\x54\x40\xc2\x72\x17\xfb\x82\x2a\x2f\xcf\x01\xce\x11\x0c\x94\x01\x5a\x06\x5a\x95\x87\xe9\x08\x93\x13\x86\x64\xe5\x66\xee\x85\x18\x8e\xfc\x42\xbf\x50\x43\x7e\x23\x24\xd4\x5a\x19\x58\x80\x06\xee\x00\xc1\x40\x1d\x95\x1f\x5e\xc7\xb3\x88\x2f\x5d\x91\x61\xa0\xf7\x10\x65\xec\x8a\x11\x28\x6b\x58\x0c\x18\x04\xc0\x58\xe8\x20\x4c\x42\xde\x65\x21\x52\x08\x98\x88\xc1\xb1\x50\x78\xb8\x48\x03\x89\xa0\x71\x16\x4a\xc7\xe1\x0c\x21\x11\x00\x17\xa1\x84\x02\xcc\x54\x94\xeb\x15\xda\x41\xd3\xa2\x3c\x81\x68\xc1\x9c\x03\x38\x41\x7c\x49\x64\xae\xf2\x36\x8d\x51\x50\x42\x98\x69\x9c\x51\x69\xff\x6a\x0b\x64\x24\x04\x11\x06\x1c\x88\x21\xc9\xd9\x2a\xd9\x10\x47\x44\x05\xba\x16\x47\x84\xaa\x68\x62\xa1\x49\x61\x1e\x40\xe3\x57\x1f\x1c\x0a\xa3\x4b\x38\x54\x99\x07\xd9\x70\x88\x0d\x4b\xb0\x18\x82\x4f\x48\x0e\x4a\x00\x7d\x2c\x61\x08\x26\x09\xa8\x2f\xc2\x23\x88\x57\xd7\xa0\x15\x70\x16\x05\x22\x54\x5c\xac\xa0\x98\x41\xb8\x45\x13\x0c\x8e\x60\x9b\xab\x92\x50\x22\x44\x08\xf2\x30\x0b\x61\x08\x42\x11\x6f\xe4\xc4\x5f\xf4\x15\x2e\x21\x0e\x71\xb3\xd2\x89\x25\xa4\x80\x65\x11\x00\xd3\x95\xcd\x98\x2b\xea\x80\x6b\x9a\xbc\x82\x13\xd4\x89\xcd\x21\xd0\x41\x6d\x2a\x72\x10\x52\xa8\x1c\xd9\x15\x47\xac\x2b\x63\x43\xad\xe9\x73\x20\x20\x2c\x60\x5d\x48\x03\xb6\x55\x30\x49\x80\x2a\x18\x51\x40\x72\x08\xf5\x70\x00\xe9\xde\x88\xc0\x5e\xc3\x1a\x7d\x7c\x80\x1c\xe8\x3b\x48\xe7\x02\x0f\x55\x78\x09\x50\xe9\x8b\x66\xd2\x15\x30\x38\x44\x4a\xc4\xaf\x14\x91\x69\xf9\x2a\xae\x2b\xc8\x60\x31\xc8\x9c\xab\x10\x94\xaf\x72\x82\xf9\xee\x74\xb1\x9a\xce\x9e\x07\x80\xc3\x38\xc1\xb8\x75\xbe\x80\x92\x01\xba\x0f\xc9\x8c\x82\x14\x99\x9d\x41\xc8\x82\x16\x10\xa3\xf2\x09\x0b\x09\xa1\x00\x91\x90\x29\x20\xbc\x21\x5c\x40\x9c\xaa\xe8\x15\xab\x19\x95\xa8\x70\x81\x35\xc0\x75\xac\x78\x19\x2b\xbd\x40\x19\x7b\x03\x65\xaf\x38\x8f\x7c\x26\x18\x57\xa0\x67\x5e\x60\x47\x44\x1e\xc3\x90\xd8\x7c\xb5\xc2\x31\xf0\x1e\x86\xfd\xd5\xd6\x03\xc0\x63\x3c\x05\xc1\xf0\x92\x0d\x34\x8e\x10\x06\xf2\x85\x61\x5b\xad\xfa\xd8\xcb\xaa\x08\xaa\x2d\x82\x81\x3c\x4c\x80\x0b\x6c\x31\x50\x8f\x57\xf8\x82\xda\x5d\xd6\x27\x84\xe2\x90\x7f\xa5\x0a\x21\x5e\x51\x0f\x2e\x4d\xe2\x1b\xf0\x40\x2b\xca\xb5\x0d\xe6\x22\x8a\x94\xcb\xd2\x82\x62\x4e\xba\x48\x08\x30\x44\x0d\x86\xe0\x00\x48\x18\x4f\x57\xe1\x07\xd9\xa1\x25\x89\xaf\xdc\x59\x39\x19\x5c\x56\x9c\x0a\xa3\x2f\x6a\xc0\x64\x82\x19\xc1\x5c\x81\x8e\xc1\x2f\x8b\xd0\x75\xc1\x46\x3e\xbc\x80\xf2\xc5\xdc\x77\x1f\xad\x98\xd7\x47\xab\x4f\x37\xb8\xec\x6f\xdb\xe0\xc2\x27\x32\x5e\xaa\x36\xb8\x02\x4b\xd0\xd4\x65\x83\xcb\x89\x84\x80\xda\xe9\x6f\x3f\x89\x02\x21\x50\x7f\x74\x83\xfb\xf1\xb9\xdf\x96\x2c\xdb\xe6\x3f\x79\x90\x17\x3e\x3e\x38\xdb\xa2\x65\xda\xdc\x27\x0f\xe6\xe0\xe3\xee\xd9\x66\x2c\xde\xbe\xbf\x7b\x26\x78\x40\x7f\x3c\x58\x30\x4c\xdd\xd2\x3f\x7b\x90\xff\x38\x9c\x31\x8c\xcf\xce\x21\x04\xee\xce\xb9\x82\xa0\x8b\xe6\x27\xe7\x04\xe2\x9d\x73\x0e\x43\xd3\x80\xf1\xd9\x39\x81\xf0\x71\xff\xaf\x1b\xa2\xa8\x7f\x22\xbe\x44\x7f\x1c\xaf\x59\xbc\xa1\x7d\x36\x9e\xbf\xf3\x30\x62\xb3\xa6\x74\x7f\xfc\x9f\x79\xae\xe0\xe2\xb4\xb0\x04\xf7\xe3\x9e\xfd\xd5\x23\x85\x37\xb3\x7f\xef\x69\xc2\xb5\x01\x4a\xbb\x8b\xbc\xf0\xdb\x4f\xba\x95\x5b\xfe\x8b\x16\x69\xee\xfc\x8d\x69\x3e\xfc\x91\x63\xc3\x93\xff\x17\x7b\x1f\x29\x78\x53\x1e\x3e\x69\x35\x9b\x13\x32\xd0\x82\x2d\xb3\xa1\x6b\xd4\xb9\xdb\xa0\x07\x41\x77\xde\xdc\x2f\x36\x4e\x73\xda\x9a\x34\x93\x13\xd7\x14\xfb\x73\x0f\xe8\xa4\x2b\x48\x32\xc9\xce\x56\x4c\xd8\x18\x5a\x1b\xc7\xa9\x6f\xb6\xcb\xe6\x60\x41\x96\xcc\x90\xd9\x0a\x03\x61\x34\x57\xc8\x36\xef\xef\xe9\xe4\x58\xd0\xd4\x79\x6a\x2e\xc8\xf5\x52\x02\xcb\x65\x9b\x0a\x66\x93\x3e\xc9\x84\x40\x23\x77\xfb\x92\x37\xf9\x75\xca\xb4\xc5\xd5\x7a\x56\x1b\x17\xdc\x90\x57\xd7\x3b\x55\x6d\x1f\x43\x8d\x14\xc4\x68\xdb\xb7\x92\x76\xba\xe9\x67\x89\xd2\x04\xfc\xb1\xd7\x56\x81\x2a\x39\xcd\xd1\xc8\xd8\x98\xb4\xa9\x02\x7b\x58\x24\xba\x4a\x92\xda\x7a\x28\xf4\x80\x65\x8f\x07\xc1\x7e\x71\x68\xb6\xe4\x3d\x25\x53\xcb\xed\x50\x6f\x35\xb5\x49\xa3\x9e\x1a\xdd\xfd\x7a\x27\x09\x5c\xc9\x0c\xd5\x83\x74\x2a\x2d\x71\x5c\xdf\xcb\xa1\xd7\x19\xb5\x62\xb7\xb6\xa3\xad\x06\x9b\xa4\x66\x54\x67\xd5\xb4\x75\xd4\xdb\x3e\xd9\x39\x88\xd3\x2c\xdf\xac\xe2\xd3\x7c\xe2\x71\x74\x04\x76\xf9\xca\x6b\x6f\xb4\xe9\x56\xa5\x48\xed\xa8\x38\xa3\x7d\x83\xdc\x8a\xf5\x8d\x4a\x8f\x0f\x27\xcf\x8c\x41\x6b\xbb\x77\x23\xe5\x14\x5b\xda\x5a\x26\x17\xbb\xe3\x8e\x64\x3b\xd1\xe8\xd4\xef\xef\xbc\x91\x67\xed\x85\xe9\x62\xe6\x4e\x87\x93\x95\x36\xdc\xb4\x26\xc7\x81\x66\x27\x9b\xc6\xc9\x2b\xd8\xe8\xbc\xed\xdb\x07\x7d\xd3\xa3\x9a\xf9\xd4\xf4\x81\x32\x29\xcb\x79\x2a\xae\x1b\xc3\xb9\xcc\x2f\x9a\xea\xa0\xc8\x95\x52\x8d\xb7\xab\xee\x76\x38\xf4\x87\xaa\x3f\x19\xf5\x69\x75\xd0\x9b\xf6\x6a\x9c\xbc\x3f\x6e\xc1\x4c\x68\xb4\x5a\xe7\xde\x79\xcf\xf1\xed\x70\xb1\x9b\xac\xfc\xcd\xfe\xd0\x88\xea\xab\x96\x1e\x85\xcd\xe5\xc6\x50\x55\x99\x35\x87\x61\x9d\xa7\xd9\xf6\x24\x55\xea\xab\xae\x63\x6f\x7b\x4d\xe7\xb4\x8f\x1a\xee\x79\xd6\x5a\xe5\x21\xbb\x8c\x27\x56\xa0\x04\xf4\xb2\x58\x4f\xd2\x75\xaf\x68\x01\x97\x37\x6a\xce\xc9\x9f\x70\x3b\x67\xe6\x35\x17\xcd\x8c\x2a\xcc\xae\x25\x64\x83\xe6\xac\x16\x36\xdb\xb4\xd6\x50\xbd\xde\x60\xd4\xed\xae\xba\x89\x64\x51\x4a\xb3\xa9\xca\x83\x45\x52\x4c\x8f\x86\xbb\x94\xcb\x79\xdf\x0b\x16\xc5\x48\xe0\x7a\x01\xbf\x6c\x31\xf5\x5c\xf0\x82\x91\xb6\xab\x9d\x4c\x61\xd1\xea\x2f\x67\x64\x7d\xdc\x6b\x01\x9d\x6c\xb2\x99\x33\x4f\x9a\xac\xd4\xe3\xa9\x11\xb7\x37\xac\x68\x78\x88\x0a\xef\x78\xdc\xf4\x35\xd1\x71\x3b\x6b\x99\x15\x17\xd2\x60\x4e\xcb\x13\xa7\x9c\xe6\xf3\xb9\xdb\x64\x28\x7d\xe2\x69\xb3\xb6\xc6\x96\xea\xa0\x37\x6c\x45\x35\xe5\x40\xd2\x46\x27\x63\x1b\x1b\xbf\x28\x5b\x36\x3d\xe3\xeb\x9d\xa2\x48\x06\x05\xa9\xe5\x8a\x3e\xe5\x1a\x60\x2f\xb8\x60\x33\x61\xfb\x1d\x46\x0e\xec\x9a\x6c\x6c\xcb\xa6\xbe\x1d\xe7\x52\xa3\x9b\x9d\x27\x0a\xf0\xa5\xa6\x9e\x6d\x46\xbb\x5c\x60\x73\xd2\x64\x46\xd2\x74\x30\x9e\x2b\x49\xda\x2c\xda\xdd\xd5\x50\x3c\xd0\xe5\x5e\x58\x0f\x37\xd3\x54\xea\x25\xd3\x9c\x59\xb2\x72\x5d\x56\x66\xed\x29\x6f\x4d\x28\x72\x38\xf9\x33\x7f\x64\x79\xf2\xd3\xd3\x5f\x0c\x24\xfc\xdb\xbf\x5a\x78\x68\x35\x9b\x8b\xf1\x72\x6d\x8e\x37\xe4\xd1\x5a\x6d\xbb\x91\xb7\xd9\x7a\xb3\x4d\x7f\xe3\xf6\x0c\xbe\xa9\x9b\xc7\xce\xc8\x75\xbc\x5d\xc4\x64\x64\xd1\x01\x67\xbe\x4e\xf5\x64\x77\x54\x0e\xba\xaa\x7b\x8a\xd8\x7d\xaf\xbd\x07\xf2\x6c\x2e\x9f\x8a\x55\x8b\x1a\xc4\x31\x67\x76\x0c\x29\x6f\x2d\xce\x9b\xc2\x33\xb5\xe8\x10\x1c\x6a\xa2\xc4\x49\xa7\xb3\x7e\x6e\x67\x43\xe3\xc4\x4b\xe3\xf9\x8c\xe6\x9b\xf3\x60\x92\xcd\xa4\x84\xed\x94\xe4\x29\x17\x06\x2b\x61\xb7\xac\x65\x2e\x57\x9e\x97\x86\xb6\x19\xaf\xc9\x5a\xad\x9b\x49\x47\x76\x28\xe7\xb5\xc6\x72\xca\x67\xf5\xc5\x62\x7e\x18\xf4\x52\xc5\x98\x9e\x77\xdb\xd1\x76\x20\xae\xa4\xad\xda\x3f\xd5\xc8\xb5\xa2\xb3\x16\x47\xee\x3b\x5c\x37\xa4\xfc\xb8\xbb\x59\xb5\x17\x5a\x83\xda\xcc\xb7\x61\xbd\x21\x37\xfb\xd1\x72\xca\xa8\x0c\x1f\x29\x91\x30\xd4\x53\xc7\xdf\x16\xfa\x41\xe1\xbd\x49\x7f\xb4\x6e\x0d\x8c\xfe\x62\x69\xd7\xf7\x75\x39\x9a\xb8\xbe\xc2\x9d\x4e\x03\x25\x26\x3b\xc9\x2c\x67\x0e\xa0\xe7\x6c\x56\xcc\x99\x3a\x51\xfd\xf5\x79\xdf\xd8\xf4\xb4\xe9\xd6\xdf\x25\x47\x9a\xd1\x3a\xab\xf9\x59\xf5\xb4\x40\x2e\xcb\x2c\xa7\x46\xd2\x62\x63\xda\xdc\x58\x4e\x0e\x7e\x1c\xd7\xed\xc1\xc2\x3e\xb2\x91\xac\x36\x93\xc3\xb6\xde\x37\x16\xa7\x41\x6b\xda\xe8\x34\x63\x4a\x71\x56\x9c\x1a\xb1\x43\x69\xd8\x1d\x02\xb3\x45\xad\xd7\xe9\xb2\x35\x5a\x94\xe3\xde\xfc\x1c\xd5\x56\x75\x79\xa8\x78\xe6\x2e\x16\x33\xa7\xd3\x6e\x33\x06\xa5\x84\x3d\xf6\xd8\x9d\xda\xac\x31\x6a\xd4\xb5\x15\xd7\xdf\x6d\xc4\xd3\x7e\xab\x0a\xf4\x29\xee\x49\x13\xa3\x75\xe6\xf4\xe5\xa1\xb3\xe8\xb5\x3b\x5b\x95\xde\x64\xc3\xa0\xef\x51\xfc\xa6\x51\x7a\xcb\x96\xce\xa6\x64\xde\xec\x0f\xe6\xb2\x0d\x62\xd6\x32\x47\x6d\x3e\x18\x78\xe0\x3c\xe5\x8b\x66\x6c\x2e\x8a\x75\x2d\x57\x95\x6c\xdf\x38\x77\xa2\xbe\x10\x67\xc6\x80\xd7\x4a\x35\x68\x6b\xbb\x3c\xb3\x4e\xec\xd8\xf7\xca\xa8\xbb\x6f\x4d\x77\xc1\xa2\x29\xcf\x2c\xbf\x4e\x27\xeb\xc9\x74\x66\xef\x16\x8d\xb9\x34\xf6\x57\x71\xb0\xa2\x81\x37\x6f\x9f\x1b\x72\xd9\xdc\x2f\xbc\xd3\x78\x7a\x58\xbb\x16\xbd\x64\xcf\x7d\xe3\xac\x9b\x41\xa9\x3b\xfb\xb8\x47\x19\xed\xd1\x51\xe6\x37\xf4\x60\xde\x48\xfb\x91\xc7\x75\xd2\x61\x5f\x18\x32\x83\x61\xed\x58\x6c\xb4\x95\x7e\xda\xd8\x91\xaa\xee\xcf\xe6\xc9\xb0\x0a\xde\x4f\x36\x2b\x6d\xeb\x06\xe2\xb8\xd3\x69\x33\x67\xdb\x8e\xc1\xa2\xe8\xcd\x3a\x67\x29\xcf\xf7\x0b\x71\x1c\x99\xba\x31\xd9\x6c\x36\x33\xce\x3f\x6d\xf6\xa7\xf9\xbe\x6d\x2e\x95\x89\xb9\x04\xbd\x14\x1c\xc6\xce\x46\xe1\x7b\xdd\x63\xb7\x29\x38\xe9\x7a\x69\xd9\x5d\xb7\x7b\x1c\x50\xdc\x5e\x30\x8b\x81\x6e\x0d\x02\x57\x14\x34\x20\x1e\xed\xee\x40\x5b\x6e\xca\x38\x49\x7a\xaa\xb3\xb3\xe8\x61\x52\x03\xd9\x79\xb3\x96\x87\xa1\x12\x26\xcc\x79\xea\x76\x76\x8c\xb0\xcc\x4b\xba\x88\xd7\x9d\x6c\x28\x9b\x1c\x59\x4c\x36\xb2\xc2\xaf\x06\xc7\x39\xdd\x28\xa2\xe5\x9f\x0a\x10\xc1\x5f\xec\x45\x24\xcf\xbf\xa9\xb1\x5b\xfd\x79\xa2\x93\x5b\x73\x98\x15\x9d\x81\x36\x95\x36\x0f\x65\x77\x56\x86\x8b\x56\x2f\x9d\x8d\x66\xee\xb0\x68\x68\x81\xb7\xd9\x36\x15\x46\x75\xba\x7b\xe3\x78\x8a\x86\xa4\xd7\xd8\x5a\xe3\xad\xb7\x69\x2b\xb4\xd6\x56\x6a\x1e\xd5\xe2\xfa\x83\x86\x7b\xf2\x97\x9a\xb6\x97\xfb\x74\xb9\x37\xe4\xac\xb6\x3a\x9b\xea\x51\x38\xef\x4f\x11\xb3\xda\xaa\x6c\x7c\x14\x83\xb5\x1d\x58\xd6\x86\x11\x45\xee\xe8\xf0\x42\x12\x8d\x5b\x2e\x17\xe6\x06\x4f\x07\x92\xbb\x8b\xa6\x35\x4e\x1d\xc4\xc2\x20\xd9\x6f\x6c\x46\xa0\x0e\xcb\xcc\x88\x6a\xcb\xac\xb1\x68\xc5\xfa\xae\xb6\x6b\x4f\x6b\x3d\x7d\x15\x0a\xfc\xa8\x9c\x88\xd6\xb8\x48\xb7\xf2\x7c\xa2\x8b\x53\xd2\xd5\xc2\xad\xd3\x1d\x3a\x3b\xa9\x7b\xb0\x8e\xf5\x56\xa3\x00\xfd\x4c\x1a\x0d\xea\xe1\x70\xd5\x48\x69\x76\x5d\xec\xdb\xe4\xa4\xbf\x59\x34\xbd\xf6\x6e\x29\x8f\x27\x91\x4d\x26\x07\x4a\x10\x99\x78\xe6\x36\xe7\xcc\x42\x9d\x44\xe2\xe9\x4c\x79\x33\xae\xa5\xc9\xc3\x20\xe9\x4c\x3a\xb4\x12\x1d\x36\x35\x65\xa6\xce\xce\xfc\xf4\x6c\x19\x2b\x3f\x54\xa4\x32\x58\xb0\x82\xba\xd9\x99\xec\x88\xab\xaf\x0f\xca\xbc\xcd\xb6\x06\xcc\x30\x9e\x37\xf7\xb1\xd9\xe3\x92\x82\x92\xa3\x42\x9d\x0e\x74\x77\x61\xc7\x9c\xe8\xcc\x47\x9a\x42\x2e\x3a\xc1\x70\x32\xee\xf2\x9b\x20\xef\xaf\xa6\x6b\x70\x6e\xce\x3a\x8b\x1e\x19\xd5\x53\x3a\x0c\xc6\x5a\x6d\xe0\x14\xd4\xb6\x3b\x60\xb2\x6d\xd9\x8e\x7a\x45\xe9\x9c\x27\xc3\x3a\xbd\x1b\x96\xbd\xee\x76\x2d\x78\x75\xca\x8f\xc7\xd1\x40\xa0\x16\xed\x60\xbc\x16\xcf\x8d\x45\x2d\x69\x8b\x43\x65\x79\xea\x14\xa6\xd7\xe0\x82\x7e\x3a\x5e\xb4\x16\x43\xd2\xc9\x33\x55\xb5\x19\x29\x6d\x9d\x97\x07\x6d\xc8\x6c\x92\x06\x3f\xdf\xd5\xb5\xe3\xc1\x5d\xbb\x43\x19\xcc\x27\xd1\xc1\x8f\x96\x82\xa2\xd5\xe2\xdd\xf6\x00\x5a\xe9\x7a\xd1\xd0\x82\x16\x2d\xed\x78\x35\xdf\xb8\x36\xe3\x75\x67\x70\x33\xd9\xca\x25\x65\x6b\xe5\xd1\xd1\x9d\x9e\xcf\x63\x7b\xd4\xae\x31\x6e\x2c\x4b\x0b\x69\x51\x7a\xd1\xc8\x9f\xf7\x84\xb8\x65\xcd\x1b\x93\x19\x3f\x6d\x9f\xbb\x96\x5e\xda\xb5\xe8\xcc\xc5\xb3\xf3\x2a\x0b\x66\x2b\xd0\x1c\x49\xb1\x9b\x4f\x28\x2a\xf5\xeb\xd3\x8c\x14\x0f\x53\x46\x89\x56\xe6\x5a\xf7\x8c\xf3\xc2\x9b\x9f\x4d\x8e\x56\x6a\x99\xa9\x06\xe5\xbc\x0e\xd8\xe0\x04\x92\x81\xdc\x5f\x1a\xd3\xb8\x29\xcf\x77\x49\x7a\x6c\xfa\x96\x45\x76\xd6\xed\x20\x6c\x4d\xcb\xfa\xa8\xad\x30\x54\x83\x0c\x9b\xca\x6e\xe8\xa4\x42\x43\x89\xd3\x4d\x10\x76\xda\xcc\x66\x6c\x39\xf5\x46\xde\x49\xa5\x68\x63\x07\x62\xd8\x96\xcc\x9e\xc6\xad\xd9\xbe\x28\xcb\x93\xf3\x64\xcd\xf6\x67\x43\xa6\x30\xfe\xd4\x97\x0a\xcb\xbf\x5a\x2e\x9b\xa7\xd7\x1a\xa3\xfe\xa5\x2e\x8a\x3e\x10\x02\x6e\x43\x6d\xe3\xec\x48\x03\xb9\x58\x15\xee\x26\xb6\x67\x4a\xcb\xad\xed\xf3\x7c\x6a\x8a\x43\xaa\x63\xb3\x5d\xf2\xb4\x32\x6d\x72\x02\x38\xb1\x45\x4d\xa2\x49\xad\xb1\x4c\x5b\x7d\x4d\x9d\x4d\xe2\x8c\x34\xe3\x20\x3f\x67\xf3\xd1\xf9\xbc\x2f\x79\xc3\xca\x46\xf1\xca\xd8\x6e\x73\x7d\xc4\x0c\x46\x1c\x07\xd8\xd9\xe9\xdc\x5c\x30\x09\x27\x90\x4c\x3b\x5e\xf9\xfe\x80\xcc\xc6\x6c\xaa\x32\x73\x2d\x99\x8e\xd6\xc7\x59\x44\xce\x56\xbd\x7c\x2d\x80\xc5\x51\xa4\x1a\xb6\xeb\x27\xe4\x9c\x5d\x98\xab\x96\xbc\xb4\xcd\x30\x48\xe7\x8b\x2c\x37\xc7\x0c\x37\x5a\x94\x93\xfe\x32\xec\x39\x6b\xa5\x3e\x37\x76\x92\x67\xc8\xe9\xdc\x52\xb5\x93\xb0\x23\x29\x8e\x3e\x0c\x44\xb0\xd8\x15\x2b\x30\xe9\xad\x9b\xee\xa0\x45\x1d\x36\xe1\x50\xa2\x6c\x33\xcc\xcd\xc8\xd9\x04\x79\x6f\xbc\xa0\xc8\x65\x5d\x8e\x15\xd6\x35\x94\x64\x35\x35\x4a\x6f\x6f\xd7\x81\x90\x26\x67\x67\x25\xe8\xd2\xd4\x05\x79\x33\x3f\x29\x7e\x97\xcd\x96\x65\xa6\xd5\x67\xcd\x66\x16\xac\x5c\xea\x94\x2e\x06\x45\x5c\x84\xab\xdd\x41\xf6\x8d\x53\xe4\x78\x1d\x13\x14\xde\xa4\x6c\x1c\x45\xc1\xeb\x92\xb5\xb4\x97\xd9\x7c\x6d\xb8\x4e\x9d\xd8\x14\x5a\xab\xc6\xa0\xce\x51\xfd\x7c\xbf\x19\xb4\x07\xba\x6a\x6e\x1d\xd5\xb7\x77\xb5\xbe\xd4\x67\x6b\xad\xb0\x35\xa1\x4f\xc2\x2a\xcc\xba\x29\x47\xc9\x7a\xe0\xb5\x0b\xb5\xab\x66\xb5\x7d\xad\x99\x9f\xf3\xd9\xb0\xdb\x39\x9b\x9e\x63\xf6\x48\x39\x58\x4f\xa6\xae\xd7\xc9\xb9\xf1\x68\x56\x6c\x82\x76\xcd\x38\x8c\x97\x11\xd5\x39\x28\xa7\x9d\x78\x9c\xf7\xe9\x3c\x04\x1d\x5b\xab\xf5\x02\xb3\xbb\xcf\xb3\x2d\xc9\xda\xa3\xf1\x7a\xc1\xac\xc6\x4a\xdc\xb2\x86\xab\x65\xb9\xe8\x27\x65\xc3\xeb\xb6\x07\x43\xf6\x9c\x76\x24\xd1\x29\x03\xa6\xd1\x35\x46\xf3\x62\x5e\x5b\x77\xcc\x75\x62\x4e\x26\x1d\x79\x1b\x65\x4d\x71\x5f\x1f\xc7\xb3\xc3\x78\xd8\xc9\xea\xa3\x84\x15\x3b\x8b\x40\x1d\x19\xeb\x69\x6f\x2e\x99\xab\xe1\xa0\xbd\xe9\xb5\xf4\x52\x02\x71\x67\x24\xe7\x5a\xb9\x9f\x69\xdd\xb9\x53\xd3\x0b\xcb\x36\xdd\x24\xb3\x94\xe9\x7c\x30\x2b\xca\xa4\xd5\x70\xba\xa2\xd8\xa4\x38\xbe\x53\xd6\x58\xd9\xa5\x8d\xf5\x64\xab\x32\x53\xb8\xa1\x56\x17\x96\x60\x1f\xd6\xab\xd6\x90\xff\x33\xd7\xcb\xb3\xf7\x17\xab\x27\x18\x48\x2f\xfb\xe9\x3d\x95\xe5\x14\x25\x2f\x5c\xa3\x36\xd8\xf0\xe6\x28\x70\xac\x56\xcf\x01\xad\x68\xb9\x8c\x17\x2b\xbf\xd5\xa0\x52\xba\xdb\x6a\x81\xdd\xa9\xae\xbb\xfd\x1d\x5b\x9f\x9d\x36\x66\x6a\x8c\x37\x46\x33\x98\x04\x5d\xe5\x40\x39\x69\x73\xda\x5d\x7a\x25\x3b\x8f\x15\x61\xd9\x3a\xb7\x40\x27\xe2\x76\x16\xad\xb1\x99\x3b\x3a\x0c\x5d\x3f\xe6\x06\x67\xf6\x7c\x34\xcf\xe7\x98\x2a\xe2\xe9\xbc\x21\xda\xe3\x64\x4f\x91\xf3\x06\x5f\xb3\x95\x6c\xe3\x19\x6a\x47\x12\xe6\xa0\x6f\xd0\xf9\x44\x31\xd2\x5a\xd2\x61\xac\x85\x7c\x5a\x9e\xc3\x90\xb2\x43\xa0\x4c\x07\x62\xb3\xe6\x8d\xcc\x9c\x33\x32\x66\x1d\x6c\xdb\x7c\xb9\xf4\x87\x3b\x3e\x8d\xfc\x85\xee\x2c\xe7\x19\x75\xe0\x5a\xed\x6c\xcd\xe7\xeb\x43\x83\x5f\xee\xfd\x79\xb3\xd6\x97\x47\xe4\x68\xa4\x74\x66\xdd\xc9\x78\x3a\x89\xd3\x75\xa3\xb6\xdf\x37\xcf\x74\x53\x95\xa9\x32\xcd\x72\x91\xcd\xd4\x73\x79\x34\x52\x7d\x55\x2f\xbd\x54\x6e\xdb\xb5\x89\x3c\xa3\x1b\x0d\x65\x3a\x55\x07\xbd\x41\x70\x6a\xd4\x3c\xb1\xc1\xee\x4c\xb5\x11\x90\xe7\x81\x30\x1a\xf5\x5b\xed\x38\x33\x46\x3c\x59\x9f\xc7\x3d\xaa\xb4\x26\x75\x6a\x53\x0b\xec\xfe\xe4\xb8\xdd\xb6\xa9\xdd\xc4\xb1\xa6\xfa\x4a\x5c\x9b\x51\x10\xe9\xa9\xa4\x0e\xc5\xd4\x30\x6a\x8b\x71\x67\x58\xb2\x4a\x71\x10\xbb\xfe\x2e\xca\xba\xdd\x49\x33\xe0\x24\x72\x1a\xcd\xca\x01\x68\xf4\xf7\xeb\xfe\x76\x58\x0f\x84\x7d\x77\xe9\x94\x03\xbe\x70\xe4\x70\xe6\x4c\xfb\x52\x7e\x98\xd8\x9d\xb1\x37\x68\x29\x9d\x43\xd9\x5a\xa6\xea\x54\x6a\x04\x54\xc4\x6e\xce\x91\x2c\xcf\x92\xd9\xae\x61\xf9\x13\x7b\x3a\xd6\xc1\xd2\x60\x0f\x21\xd5\xdc\x70\x2a\xbd\x92\xda\x4d\xad\xae\x1a\xa7\x89\xd3\xea\xc4\x6d\x7d\x3f\xe8\x2a\x3d\x5e\xb2\x6a\xc5\xae\x27\x2e\xd7\x87\xa9\xd3\xf7\x4c\x2a\x11\xec\x6c\x62\x9e\xf6\xd3\x54\x9a\x1d\x64\x7a\xef\xc8\x01\x60\x67\xb3\xee\xc4\x95\x8e\xee\x51\x6d\x8f\x07\x61\xbf\x97\x92\x5c\xff\x70\x54\xc1\x89\x1a\x52\xd3\x46\xea\x9d\x3d\x27\x52\x34\xf5\x50\x37\x3b\xd1\xc0\x2b\xf3\xc4\xaf\xa7\x9d\xe5\x09\x14\xb1\xab\xb0\xf5\x86\x55\x44\x87\x53\xbb\xdf\x57\x0a\xd9\xc9\x46\xa5\xd8\x3b\xda\x9b\xe3\xbe\xc6\x39\x91\xdf\x6e\x6b\xed\x6d\x61\x80\xb4\xdb\x8e\x94\x33\x23\x8f\xc6\xdb\xd9\x52\xd5\x3a\xce\xb2\x28\xcd\xa8\xa7\x0c\x40\x87\x55\xf4\xc9\x48\x39\x3a\x6e\x9d\xd9\xc4\x23\x85\x65\x3b\x76\xd4\x71\xc2\x23\x6b\x09\xb3\x88\x3a\xca\x1e\x95\x66\x1d\xb5\xc7\xc8\x47\x53\xac\x4b\x7a\xdc\x39\xf2\xf9\x38\x9a\x1d\xa5\x79\xa6\xf8\x7c\xb6\x38\x46\x2d\xaf\xbb\x19\x39\x47\xaa\x06\x38\x71\xd0\x0f\x46\xa7\x28\xc8\x4a\x85\x99\x78\x24\x33\x98\x4f\x05\x4f\xec\x53\x4d\xa5\x0d\xda\x9d\x11\xa7\x34\x99\x35\xab\xe4\x43\xcd\xdd\xfa\xbd\x51\xd1\xdc\x8f\xe4\x79\x6e\x8e\x0d\x9a\x24\xdd\x13\x13\xac\x7b\x9c\xdf\xea\x69\x2d\xb1\x2f\xea\xb3\xcc\xa4\x36\x6d\x3b\x1c\xf5\xf4\x41\xdb\x3a\xd1\xe0\xc4\x1b\xa8\x5e\xd1\xc8\xef\x8e\x95\xde\x39\x11\x0c\xf5\xcf\xc1\x09\x3d\x32\x4b\xec\x09\x1d\x5f\x3e\xfe\xc8\xb0\x8c\xc0\xd8\x5f\xec\x28\xcc\x70\x5b\x0b\x3c\xbf\x7c\x7c\xe8\x58\x7e\x6e\x65\x9e\xa1\x61\x43\xeb\x68\x3d\xfc\x8c\xbd\x34\xfc\x8c\xc9\x89\xa7\xf9\x3f\x63\xa9\x16\xa6\x78\x6a\x25\xde\x65\x2a\x62\x00\xd8\xf8\xf4\xc5\xf7\x42\x0b\x77\x2d\xcf\x71\xb3\x47\x40\xb0\xcc\x97\x40\x4b\x1c\x2f\x7c\xa4\xbe\x14\x51\x62\xe2\x7a\x62\x69\xfb\x47\xf4\x1d\xd7\x7c\xff\x0b\x5e\x58\xfa\xde\xcb\xf0\xcc\x3a\x55\x54\x70\xcd\xdc\x1d\xd3\xec\x11\x50\xd4\xdf\xbe\xe0\x41\xfa\x59\xcf\x75\x9e\x16\xe3\xae\xe7\xb8\x3e\x64\x58\x9d\xc9\x3e\x66\x89\x16\xa6\xb1\x96\x58\x61\xf6\xac\xbd\x68\x0a\x80\x60\xe9\xcc\x17\x44\xce\xb4\x8c\x28\xd1\x32\x2f\x0a\x1f\xc3\x28\xb4\x9e\xb5\x47\x37\xca\xad\xe4\x65\x2c\x45\xe9\x94\x25\x7d\x18\x7b\x0c\x4d\x2b\x81\x0a\x3e\x6b\x8f\x9a\x91\x79\xb9\xf5\xb3\xf6\x98\x7b\xa9\x97\x59\xe6\xbb\xb9\xcf\x69\x96\x44\xa1\x83\x3d\x21\xf3\x14\x95\x3d\x04\x8a\x7a\xce\x34\xdd\xb7\xb0\x27\x3d\x4a\x4c\x2b\x81\x02\xfb\x5a\x9c\x42\xe7\x54\x17\x5f\x2e\x1d\x69\xac\x19\x5e\xe8\x3c\x52\x5f\x02\xed\x54\x9d\xda\x56\x8a\xbf\x5e\x56\xa4\x1e\x7d\x2d\xcd\x70\xc3\xf5\x7c\xf3\x85\xaa\x1e\x65\x59\x14\xe0\xbe\x65\x67\x78\xa2\x99\xde\x31\x7d\x64\xe2\xd3\x97\xb7\xbd\x09\xb2\xd8\x6b\xf7\x73\x96\x3c\xda\x5e\xf2\x42\x2c\x7b\xa5\x97\x45\xf1\x23\x05\xfb\xc3\xcc\xc5\x23\x1b\xcf\xca\xd8\xfa\xbb\x95\x5b\xe1\x3f\xde\x2c\x35\x17\x03\xd8\x82\x2d\xda\xda\xf3\xbb\xf9\x20\x3e\x61\x69\xe4\x7b\x26\xf6\xa3\x29\x99\xba\x45\x7f\x89\x35\xd3\x84\x2a\x12\x3c\x67\x05\x5f\x72\x2b\x81\x11\xe6\xe3\x9a\xef\x39\xe1\x63\x16\xc5\xcf\x3f\xc6\x9a\x03\x63\x49\x33\xa1\x6b\x50\x3b\xee\x65\x56\x90\x3e\x1a\x56\x98\x59\xc9\x4d\x84\x3f\xfe\x48\xe9\x8c\xc6\x31\x6f\x75\x7c\x64\x5f\x99\xf2\x92\xc1\x1a\xe6\x97\xab\x8c\xb6\xfd\xc5\xf4\xd2\xd8\xd7\xca\x47\xdb\xb7\x4e\xb7\x51\x4c\x00\xda\x0a\xbe\xdc\xfa\x8d\xa3\xa8\x2f\x30\xf4\x3c\xbb\xc4\x61\x16\x59\x61\xf6\x08\x1d\x64\xe1\xba\x95\x15\x96\x15\xbe\xe8\x42\x61\xc0\x0a\xde\x0a\xfe\x1a\x81\x95\x08\xef\x7a\x2f\x81\xf4\x32\x48\xd2\x4c\xd6\xd4\xdf\x0f\x7a\x1b\x9e\xb6\x6d\xbf\x19\x80\xfb\x91\x13\x61\x4f\x97\xac\xa3\x09\x1a\x1a\xf4\x92\x77\x84\x60\x05\xd8\xeb\x37\xea\x12\x40\x02\x01\xb8\x77\x92\xe2\x81\x15\x1e\xef\xda\xf9\x8d\xa5\xae\x74\xa1\xd7\x30\xea\x0e\x05\xd3\xcb\xb1\xa7\x6b\xd6\x63\x04\x7f\x97\x8d\xe9\xe5\x6f\x22\xf7\x65\x3c\xfc\xef\x93\x39\x69\x0e\xf3\xc9\xf3\xfd\xab\x29\xbf\xbc\xe0\x8c\xf8\xa2\x30\x0a\x36\x02\xd0\xf7\xb5\x4b\x73\xe7\x6a\xcb\x8a\x10\x34\x25\x01\xbb\x90\xc6\x78\xa8\x25\x49\x54\x60\x4f\x57\x8d\x11\x3a\xfc\x78\xf1\xf9\x35\x9e\xef\xc4\xf2\x25\xec\x2e\xd9\x04\x71\xf0\xa2\x10\x0a\x87\xcb\xfc\x97\x50\xfe\x98\x33\x96\x69\x53\x36\xfb\x2e\x7a\x3f\x65\x93\x45\xf1\x67\xc9\x0d\xbb\xde\x67\xf6\x6b\xa6\xc1\x08\x80\x12\x11\x30\x83\x71\xcf\x88\xc2\x9f\x5f\x2f\x7f\xf9\x3f\xd8\xd3\x05\x5d\xaa\xe0\x20\xc2\x08\xfd\x78\x08\xa1\x35\xf6\x54\xb8\x5e\x66\x21\x60\xb2\x1e\xc3\xa8\x48\xb4\xf8\xb2\xe5\x74\xb5\xd4\x7d\x89\x4d\xc1\x16\x59\x09\xbc\x59\x50\x82\x28\x8c\xd0\xb4\xe7\x7f\x06\x96\xe9\x69\x58\x14\xfa\x25\x96\x1a\x89\x65\x85\x98\x16\x9a\xd8\xdf\x5f\x31\x8e\xa3\xa8\xf8\xf4\x0f\xec\xe9\x3b\x3e\xf1\x42\x04\xc1\x37\x23\x0a\xcf\xb4\xde\xf9\xec\xca\x2a\x4e\x3c\xe8\xb8\xb7\x50\x72\xd7\xbb\x97\xde\x9f\x5f\x75\xfa\xf9\xcd\x4a\x49\x51\xd4\x1d\x4f\x7e\xe6\xb0\xdb\xd1\xf7\xe2\x06\xf6\x6b\x77\x57\x0f\xea\x7b\xcb\xce\xff\x73\x13\xcb\xfe\xff\x8f\x9a\x9d\x55\x70\x50\x61\xd1\x03\xf6\xf7\x07\x4c\xcb\xb2\xe4\xef\xb0\xfb\x1f\xd8\xc3\x3f\x1e\x9e\xb3\x04\x7b\x42\x4a\x57\x6b\xad\x17\xa6\x9e\x69\x3d\x6a\x79\xe4\x99\xbf\x15\xc9\x6f\xd7\xd1\xcf\xd1\x1c\x6a\xf2\xfc\x4f\xb8\x52\xe7\x9e\x55\xc4\x51\x92\x5d\xc3\xc8\xb4\x72\xcf\xb8\xfc\xc8\xf1\x99\x30\x71\x08\x1f\xaf\xc6\x87\x77\xcf\x04\xfc\x8e\xc3\x58\xc2\x9e\xd0\xa5\xed\x47\xc5\x63\x15\x5b\xe8\x3e\x75\x13\x2f\xdc\xe3\xe0\xd2\x5d\xdd\x3e\x82\x67\x22\xf0\x71\xed\x98\x45\x57\xe4\x40\xf9\xf0\x08\x5b\x9e\x09\xb4\x2e\xe2\x89\x95\xc6\x51\x98\x22\x6c\xbd\xf2\xd4\xfd\xc8\xd8\xdf\x2c\xa1\x5f\x20\x14\x40\x96\xf8\x09\xcd\x7d\xd9\x56\xbc\xb4\xa7\x46\x12\xf9\x3e\x4c\x9e\x2c\x3a\x1a\xee\xf3\x0f\x5f\x49\xf4\x06\xc2\x2f\x3f\x7c\x0d\xac\x4c\xc3\xae\x2f\x3b\x3c\x1c\x33\x1b\x17\x1f\x30\xf2\xda\x11\x6a\x81\xf5\xed\xc1\xb4\x52\x23\xf1\x62\xe8\xc6\x07\xec\xe2\xae\x6f\x0f\x32\x66\x7a\x89\x65\x64\x51\x52\x62\x91\x8d\xd9\x9e\x6f\xa5\x98\x1b\xa5\x30\x10\xa2\x10\xcb\x5c\x0b\x33\xbd\x34\x4b\x3c\xfd\x98\x59\xe6\xcf\x98\x69\x41\x20\x4e\x34\xdf\x3b\x5b\x26\x56\x58\x3a\x76\x4c\xbd\xd0\xc1\xba\xe3\xd6\xec\xe1\xca\x30\x4e\xa2\xd8\x4a\xb2\xf2\xdb\x43\xe4\x3c\x66\x5e\xe6\x5b\x37\x1c\x5b\x88\x45\x14\x7e\x67\xca\x7d\x51\x9f\x9e\x30\x62\xac\x65\x2e\xf6\xfc\xfc\x09\xa7\x32\xbe\x65\x54\x58\x3a\x0c\xe8\xfb\x63\xd1\xc3\xe7\xcd\x60\x37\xcb\xe2\xf4\x91\x24\x1d\x2d\xb3\x0a\xad\x44\x99\x47\x78\x11\x09\x3f\xc9\x49\x30\x53\xac\x8d\x6c\x49\x81\xa3\xf1\x43\x73\x1e\x9d\xe5\xed\xb1\x6c\xab\xcc\x04\xac\x77\xa9\x9a\xe5\x6b\x5a\x5c\xb7\x4e\xbd\x8e\x18\x8d\x77\x87\x87\xb7\x76\xcf\x0a\x2f\xcb\xac\xe4\x83\x1d\xee\xa9\xf3\x76\xc6\x7f\xd0\x63\x6f\x19\x1b\x5a\x62\xde\x70\x4c\x8f\x41\xa0\x25\xe5\xbf\x7c\x2d\x71\xac\x7f\x55\x96\xbb\x3f\xf1\x3f\x6f\x55\x23\xb1\xb4\x2c\x4a\x6e\x78\xfe\x13\x12\xff\x64\x34\x8a\x87\xef\x0f\xfd\xcf\xa9\x70\xc5\xa8\xdb\x90\x45\xbf\x12\x71\x0b\x56\x3f\x63\x5e\xe8\x65\x9e\xe6\xe3\xa9\xa1\xf9\xd6\x37\x40\x50\x90\x8c\xef\x85\x7b\x2c\xb1\xfc\x6f\x0f\xa9\x1b\x25\x99\x71\xcc\x30\xb8\x6e\x3e\x60\x10\x75\xbf\xdd\xbe\x0a\x75\x42\x0b\xea\xf5\x88\xa5\x3a\x4c\x69\xca\x4d\x74\xa4\xd2\x94\xbb\x72\x3d\x82\x97\x2d\x47\x96\xe5\x06\x2a\xce\x82\x7e\xa6\xda\x95\xaf\xfd\xd7\xaf\x89\xfc\x47\xbe\xfc\x48\x94\x48\x8e\xdf\x4e\x48\xf1\x0f\xd1\x91\xe5\xc6\x62\xa7\x1c\x01\xa2\xc7\x07\xee\x7c\x5c\x3b\x27\xcb\x31\x19\xc6\xbe\x42\x72\x35\x6d\xda\xff\x1d\xf4\x3b\x43\xaf\x3b\xe3\x57\xbb\x33\x43\x1e\xf5\xd6\x86\x14\x78\xb0\x22\x6b\x79\x0c\x14\xf2\x98\x4c\xb7\xa4\x98\x2b\x5b\x9b\x6c\xe7\x41\xa7\xa2\x0f\xea\xc3\x6e\xf0\x1d\xfa\x3d\x6d\x3c\xb6\x6b\xfb\xb0\xb9\x23\xf3\x64\xa9\x5f\xe8\xd5\xb2\x65\x4e\x26\xbc\x39\x21\x85\x03\xb5\xb2\x49\xb5\xa0\xd7\x64\x29\x0e\xfd\x8a\x7e\x2d\x8b\xf7\x42\x45\xbf\xb8\x4b\x8f\x4e\x96\xeb\x0f\xf4\xd0\x3d\x5f\x0b\x17\xe3\x1a\x9f\xb5\xc2\x1b\x7a\xb7\xf4\xdb\xfc\x3a\xaf\x59\xc1\x62\x4c\xde\xd8\x0f\xe9\x7b\x97\xde\x7d\xfd\xdf\xc9\x5b\xdd\xbf\x97\x17\xf9\xe3\x3e\xbd\x5f\xd1\xff\xe6\xfe\x7d\x7c\x54\xfa\xdf\xa5\x97\xeb\x53\x8d\xe4\x50\x3f\xd2\xef\xbe\xfe\xc8\xbe\xbf\x5d\x7f\xee\x30\x9f\x8c\x6b\x5e\xb8\xd7\xc9\x28\xe6\xda\x24\xdf\x37\xa7\xf9\xbf\xa7\x7f\x7a\xf0\x67\x95\x3e\xa4\x7a\x5a\xe9\x24\x35\xf0\x63\x52\x52\x7a\x9a\x4d\xf6\xe1\xfc\xa8\x97\x35\x49\xa1\xc6\xac\xc7\xbf\xaa\xbf\x94\xb5\x12\x32\xe8\x35\x6b\xa4\xd0\x4e\x17\x39\x39\x2d\x83\x84\xa4\x8c\xf8\x40\x4a\x9d\xbe\xf6\xe1\xbe\x76\x4a\x5a\x6a\x25\xdf\x77\xf4\x47\xfa\xdd\x9d\xff\xab\xf4\x91\x7d\xee\xc6\x6b\xbf\x6f\x4d\xf3\x1a\x93\xfa\xfa\xef\xa1\x07\xd2\xd6\xba\x92\xe7\x3d\xbd\x9b\x2f\xd8\xbf\x40\xf4\xc9\xe1\x29\xb0\xef\xd3\x13\x99\xf6\x96\x7c\xf5\xdf\xec\x73\x72\x77\xe9\x03\x1e\xd1\x47\xfe\x2a\xc5\x65\x40\xa2\x7b\x48\x4f\x1b\xff\x0e\x52\x9f\xd2\x47\xf4\x32\xe3\x37\x8d\x27\x43\x51\x96\xc7\x8e\x2d\xcb\x4a\xa1\x14\xb2\x5c\xc8\x03\x08\xca\x75\x59\x6e\x20\x28\x76\xe4\xe6\x77\xef\xd1\xf8\xb1\x3c\x96\x65\x85\xed\x14\x17\x7a\xf2\xb7\x6f\xd5\xae\x10\x6d\x45\x7e\xb9\xd9\x80\x7c\x25\xab\xa6\x1f\xbe\x92\xf0\x71\xe2\x97\x1f\xbe\xc2\xe7\x8d\x5f\x7e\xc0\xb0\xaf\xf0\x11\xda\x33\xbf\x3d\xdc\x3c\xb5\x3c\xc0\x8e\xfb\x5d\xe8\xf1\xff\x01\x33\x7c\x2d\x4d\xbf\x3d\xa0\xc7\x17\xd4\xf2\xcb\xff\x0e\xf5\x34\xfe\xf2\x95\x34\xbd\xfc\x3b\xb3\xe1\x73\xd4\x85\xfa\x65\xc4\x85\xd2\xdb\x07\xac\x87\x5f\xbe\x6a\x97\x95\xee\xba\x3c\x5f\x96\xe5\x07\x2c\x83\x9b\x94\xec\xdb\xc3\xbf\x74\x5f\x0b\xf7\x0f\xd5\x22\x19\x46\x51\x6c\x85\x56\x82\x85\x51\x62\xd9\x56\x92\x40\x25\x64\x3d\x3a\x66\x68\x1b\xf4\x95\xd4\x7e\xb9\x11\xed\xdf\x63\xfd\xa3\x17\xa6\x99\xe6\xfb\xbf\x47\x84\x6e\x35\xe5\xf7\x08\x51\x3d\x82\xfe\x89\x16\xf8\x93\xf8\xfe\x01\xf5\xef\x4a\x70\xbd\xc6\xb0\x0f\x1c\x1d\x2f\x73\x8f\x3a\x61\x44\x41\xb5\x0b\x33\xbd\x04\xf7\x42\xd3\x3a\xe1\x6e\x16\xf8\xa4\x97\xa6\x47\x2b\x25\x7f\x8f\x20\x2f\xbc\x30\xec\x6b\x9a\x3b\x97\xd7\xc2\x1f\x3e\x7f\x2d\xfc\xe1\xe5\xb5\xf0\x07\x0a\xa3\x30\x20\x12\x2c\x46\x83\x87\x5f\xbe\x1a\x5e\x62\xf8\x16\x66\x9c\xbe\x3d\x08\x04\xf7\x80\x19\xe5\xb7\x07\x96\x10\x1f\xb0\xe4\xdb\x03\x78\x20\xdf\x0c\x00\x80\x00\x77\x46\x5c\x7e\xc5\xf6\x61\x80\xde\x6f\x15\x09\xd6\xc0\x29\xf4\x9e\x09\x87\x7e\x2d\x9e\x46\xef\xd0\x70\xe8\x9d\x37\xf4\x02\x19\x85\x33\x18\xb8\xbc\x2e\xc5\x75\xe0\xa4\xf3\x1b\x32\x22\xc1\x61\x12\x21\x74\x38\x44\x07\xa3\x08\x11\xa7\xd0\xaf\xf9\x0b\xe8\x13\x32\xa1\x30\x1a\xbd\xae\x20\x62\x2c\xfa\x47\x63\x1c\x41\x2f\xa5\xf7\x94\x00\x43\xb0\x88\x94\x44\x48\xb9\x40\x48\x06\x4d\xb0\x38\x45\xb0\x70\x06\x92\x87\x45\xaf\x56\xd1\x0d\xc0\x12\x00\x03\x97\x97\x81\x24\x0c\x40\xbe\xd7\xc9\xe7\xf7\x56\xe0\x08\xa1\xb2\x02\xa0\x09\xe9\xbe\xa1\xb8\xab\xa1\x00\x47\xb0\x9f\x0d\x61\x2e\x43\xa8\x4f\x86\xd0\xbf\xca\x87\x79\xa1\xf1\x19\x1b\xe6\x45\x90\x37\x5c\x60\x48\xdc\x04\x2c\xa9\xbd\x44\xf2\x0d\xe0\x5d\x2f\x5f\x2f\xae\x10\x78\xd9\xff\xbf\xc7\xd5\xb7\x27\x3c\x2f\xa8\x7a\x39\xbd\x78\x39\xae\x78\xf8\x24\x6d\xaa\x63\xff\xdb\xd8\xee\xc2\x24\xc1\x22\xfb\xa6\xe9\xe9\x09\x4b\xb4\xd0\xb1\x30\xa2\x9e\x58\x9a\x69\x24\xc7\x40\x4f\x31\xfc\xf9\xf9\x66\x0c\xf9\xf4\x84\x79\xf6\xeb\x62\x71\xcd\xc7\xa7\x27\xec\x7f\x25\x51\x94\x11\xed\xea\xd9\x68\x31\x55\xb1\xe7\xe7\x97\x65\xe5\xbf\xb0\x63\xe2\x37\x53\x43\x8b\x2d\xf4\x8c\x0b\x3b\x86\x5a\x60\xa1\xf5\x46\x83\xb7\x96\x9f\x5a\x97\x19\x97\x0e\xd8\x18\x9a\xd8\x1b\xf6\x4f\x4f\xf8\x75\xe4\x5b\xc1\xaf\x02\xbd\x6d\x7d\x37\xff\x2b\xf9\xde\x0e\x17\x6d\x3a\x5a\xfa\x66\xf2\x2d\xec\xbd\x9c\xbb\xbd\x81\x06\xc8\xf2\xc3\x2c\xf2\x8d\xd1\xdf\xf3\x7f\xd3\x7d\x61\x3c\xf3\xce\x37\xba\xdc\xb2\x7d\x73\xc8\xf9\xf6\xcc\xe9\x72\xc6\xf4\xf0\xd1\xbf\xd5\xca\x0a\x65\xbb\x10\x7e\xaf\xf1\x7b\x19\x6e\x04\x7c\xbf\x1e\x5f\xe4\x78\x7f\x6a\x75\x0d\x4c\xd4\xfe\x42\x36\x4b\x6e\x84\xc9\xcc\x97\xc9\xd7\x43\xdc\xb7\xb0\xfa\xde\xba\x17\x50\xfe\xb8\x31\xa8\xe4\xca\xcc\x37\xc4\xdf\x90\x7a\x8d\x3f\xa2\xae\x19\x7b\x15\x3e\x0b\xdf\x04\x1b\x8c\x35\x82\xb8\x49\xc2\x7b\xf4\xbe\xdf\xf2\x95\x7c\x55\xee\x35\x43\x54\x2f\xcd\xbc\xd0\xb9\xf1\xdd\xbf\x6d\x82\xa7\x27\xd8\xdd\x4a\xa2\xa0\x79\xca\xaa\xe8\x87\x62\xff\x21\x63\xfc\xb6\xb4\xfb\x9c\xec\xbd\x28\x7c\x1f\xff\xf7\x12\x07\x09\xf1\x21\x71\x2a\xb1\xaa\x29\x15\x4a\x28\xc3\x19\x72\xd5\xf3\xf3\xcb\x4a\x6e\x78\xe6\xcb\x81\xca\x8f\x2f\xe9\xf5\xd6\x97\x9f\x2d\xe3\xd7\xd5\x1b\xbb\xae\xe8\x0f\xaf\x88\xf2\x09\x34\x55\xdb\x85\xfb\x7c\xfe\xaf\xed\xf9\x16\x3a\x98\x79\x31\xd8\x3b\x4b\xbe\xa4\xce\xad\x4d\x2a\x54\x98\xb9\x51\x92\xdd\xb1\xcb\xad\xbd\xef\x83\xd3\x6f\xf2\xc1\x9b\xe4\xfe\x34\x4a\xdf\xe4\xf5\x4d\xaa\xbe\x5f\x78\xbe\x92\xd5\xe6\xfe\x2b\x09\xb7\x4b\xbf\xfc\xf0\xdf\x01\x00\x00\xff\xff\x3d\x80\xde\xff\x59\x6f\x01\x00") +var _dirIndexHtmlDirIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\xfc\xd7\x12\xf4\xb8\x76\x26\x0a\xde\xeb\x29\xfe\xd9\x31\x17\x33\x87\x2d\x91\x49\x4f\x1d\xed\x8e\xa1\xf7\x49\x6f\x6f\x3a\xe8\xbd\xf7\x54\xe8\xdd\x27\xea\x2f\xa9\x77\xb5\xb4\xa5\xee\x3e\xaa\xe8\x28\x5e\x24\x88\x04\xf0\x01\x0b\x58\x58\x06\x0b\x99\xff\xf0\xff\xe2\x0c\xd6\x8d\x4c\xfe\x47\xbd\x0f\xfd\x7f\xfd\x9b\x7f\xfc\xc7\x1f\xff\xef\x75\x9a\xf6\x1f\x7f\xff\xe7\x1f\x7f\xf7\xe3\x9f\xfe\xe9\x6f\xfe\xe1\x97\xef\x7f\xf4\xc9\x58\xfd\xf9\x4f\xc5\xf8\xa7\xff\xfa\x37\xff\x50\x17\x49\xfe\x5f\xff\xe6\x1f\x86\x62\x4f\x7e\x64\x75\xb2\x6e\xc5\xfe\xe7\x3f\x1d\x7b\xf9\xb7\xe4\x9f\x7e\x80\xff\x52\x30\x26\x43\xf1\xe7\x3f\xe5\xc5\x96\xad\xcd\xbc\x37\xd3\xf8\xa7\x1f\xd9\x34\xee\xc5\xb8\xff\xf9\x4f\xf4\x8f\xbc\x59\x8b\x6c\x9f\xd6\xe7\xc7\x54\xfe\x28\x9b\xbe\xd8\x7e\xd4\xd3\xb6\x17\xf9\x8f\x69\xfc\xb1\xd7\xc5\x8f\xbc\xd9\xf6\xb5\x49\x8f\xbd\xc8\xff\xcb\x8f\xbc\xc8\x8a\x71\x5f\x93\xbe\x79\x8b\xfc\xc7\x55\xa4\x3f\x8e\xad\x19\xab\x1f\xb2\x29\x38\x7f\xfa\x97\x0e\xe7\x75\x9a\x8b\x75\x7f\xfe\xfc\xa7\xa9\xfa\xfb\xbd\xd9\xfb\xe2\x37\x3d\x0a\x3f\xbb\x98\xc6\xff\xa0\xc9\x5f\x1f\xea\x3f\xfe\xe3\x8f\xbf\x33\x93\xbd\xfe\xf1\x4f\xff\xf4\xef\xf4\xf4\xcc\xbf\xed\xe8\x2a\xd2\xad\xd9\x8b\xbf\x5e\xb7\x19\x92\xea\xb7\x95\xeb\x7d\x9f\xb7\xbf\x07\xc1\x2a\xd9\x8b\x2b\x79\xfe\xae\x99\xcb\xed\xef\x9a\x09\xfc\x25\x05\xad\xc1\xe1\x8a\x88\x2e\xa8\xa1\x4a\xf0\x6f\xee\x4e\x2f\x1d\x1f\x8f\xa8\x21\xd6\x27\x6c\x37\x6d\x3f\x43\x98\x0c\x85\x5b\x91\xc8\xc9\x6c\x97\x3f\xfd\x8f\xf3\xbe\x5f\xcd\xbe\x17\xeb\xbf\x99\x87\xbf\x46\xce\xff\xd8\xe2\xff\xe0\x8a\xfd\x8f\x1d\x67\xc9\x9a\xff\xa6\xc7\xed\x18\x86\x64\x7d\xfe\x5b\x9f\xac\x55\xf1\xdf\x7e\x9d\xb9\xbf\xde\xf0\xff\xfc\xac\x66\x6b\x91\xec\xd3\xfa\x9b\x3e\xff\x7f\xbf\x80\xff\x3b\xb5\x7f\xf2\xc3\x7f\x5c\xf5\xff\x1c\x09\x67\x53\x5c\xf3\xb4\xee\xbf\x65\xd9\x26\xdf\xeb\x3f\xe7\xc5\xd9\x64\xc5\xdf\xfe\xcc\xfc\x97\x1f\xcd\xd8\xec\x4d\xd2\xff\xed\x96\x25\x7d\xf1\xe7\xcf\xdf\x41\xbf\xc0\xf4\xcd\xd8\xfd\x58\x8b\xfe\xcf\x7f\xda\xea\x69\xdd\xb3\x63\xff\xd1\x64\xbf\xb0\x49\xbd\x16\xe5\x9f\xff\x94\x27\x7b\xf2\xeb\x62\x80\xf7\xdf\xfe\x52\xf0\x7f\xa7\xc9\x56\xe0\xe8\x7f\xa1\x69\x9a\xa1\x69\x9e\xe6\x19\x9a\xfe\x25\x95\x69\x66\xfa\xe5\x55\xa8\x68\x9a\x66\x7f\xf9\xa0\xad\x5f\x3e\x64\xfa\x5f\xca\xff\xe5\xb1\xe8\xff\xcc\xd3\x4f\x24\x05\x62\x78\x6c\x81\xe4\x7f\x0a\x87\xa6\x59\xaf\xe5\x8e\xcf\x4f\x3c\x7c\xa8\x5d\x13\x78\x57\xdf\x04\xc7\xb9\xe7\x40\x0c\x48\x6c\xf5\x7f\x03\x5f\xfa\x36\xb2\x83\x07\xed\x8b\x80\x47\x2a\x44\x20\x81\x7f\x02\x10\x38\xe7\x0f\x07\x1e\xab\x1d\x83\xe4\xc9\xc5\x25\x28\x9e\x83\xf4\x2b\xfe\x87\xf9\xca\xc3\x7f\x80\xaf\x24\xa6\x59\x02\xdd\xc8\xb7\xe0\xb9\xfa\xe9\x3f\xe3\x01\xbb\x7f\x82\x2b\x9e\x5b\x20\xb1\x40\x41\x09\x6a\x17\x1c\x82\x0f\xf9\xed\x7f\xc5\x07\xf6\xb9\x23\x7e\xc5\xbf\xfe\x2a\x1e\xbc\xfa\xe1\xbf\xc1\xfb\x99\xc7\x81\xd1\x33\x01\x7c\x17\xc6\xdf\xe0\xfd\x16\x5f\xc4\xc3\x13\x28\x06\xcf\x04\x7f\x33\x7f\x3f\xe9\xfd\xab\x78\x7f\x9d\xfe\x7f\x35\xde\x5f\xf3\xff\x7a\xbc\x3f\xd7\xe3\xaf\xe3\xfd\x4f\xe8\xff\x4d\xfe\x5f\xf3\xc7\xaf\xf4\xff\x55\xbc\x33\xb5\x13\x10\xfb\x59\xfe\x93\xbe\xbf\x4e\xff\xcf\xf9\xfd\x5f\xa7\x1f\x5b\x5c\xcb\x04\x9a\xb1\x4b\xc1\x69\xc6\x44\x10\x57\x73\xfb\xfc\x7f\x46\xff\xb6\xf4\xce\xaf\xf4\x80\xda\x1d\xa4\x20\xa4\xf7\x33\x48\x71\x4a\x52\x82\xea\x2f\xed\x27\x65\xe7\x41\x02\x40\x42\xf3\x7f\x4a\x3f\xb5\x0b\x2b\x38\x28\x3c\x00\x12\xe2\xe6\x9d\xa0\xfd\x0c\x2b\x08\x65\xf3\x02\x52\x92\x9a\xfc\x9b\x3c\x70\xaf\x82\xf6\xeb\xf8\xfe\x03\xfa\x7f\xd2\xf7\x57\xdb\xff\x4f\xf1\x7f\xce\xcf\x5f\xe5\x57\x55\x2d\xec\x13\x40\xb6\x3e\xfd\xdf\xc1\xfb\x6c\x42\xf8\xeb\x78\xfe\x35\xde\x6f\x9e\x5f\xca\xbd\x9f\xf8\xe0\xf7\x1e\xca\xbf\x8e\x47\x22\x62\x0c\xfe\x65\xfd\x9c\x7f\x1f\xee\xaf\xe2\x7f\xf0\x9f\xf8\x3f\xd7\xeb\x21\xfd\x01\xfc\x99\xff\x05\x2f\x31\xff\x37\xa0\xfe\x5d\xfc\x9f\x78\x7b\xf6\xbf\x54\x1f\x1c\x49\x9a\x36\xab\x92\xa6\xb9\x8b\xbb\x68\xfa\xa2\xf5\x5f\x84\x32\x43\xd3\xec\x4f\x51\x5c\xd1\xfc\x7f\x98\xff\x59\xdf\xa4\x4d\x9a\xe6\x50\xe9\xfa\x67\x3c\xfa\xcf\x7f\xfe\xd5\x2a\xfc\x69\x8a\xfc\xd7\xdf\x18\x20\xff\x00\xfe\xfa\xd5\xdf\xfc\xc3\xb6\x3f\xbf\xa4\xe0\xff\xf5\xc3\x99\x8e\x35\x2b\x7e\xfc\xed\x4f\x0b\xe3\x17\x1d\xb2\xfd\xdd\xb4\x56\x3f\xfe\x2f\xf0\xa7\x0a\xfc\xdb\xff\x96\xf6\xc9\xd8\xfd\xf8\xc7\x34\xc9\xba\x6a\x9d\x8e\x31\xff\xdb\x9f\x0a\xe7\xef\x8f\xb5\xff\xff\xfc\x46\xff\xcc\x63\xf5\x2f\xca\xa7\xf1\x19\xc3\xbe\x20\x55\xac\xa6\x5f\x68\xfc\x3a\x5e\xcd\x7b\xd5\xaf\x2a\xe9\x17\x0d\xc3\xd2\xd1\x2f\x69\x49\x82\x54\xfd\xcb\x8b\x18\xda\x42\x20\xd9\x6e\x0a\xc7\x50\x0e\x0b\x4f\x6c\x31\x4c\x2c\x52\x4d\xec\x30\x4a\x1a\x08\x63\xec\x2b\x7d\x14\xd8\x58\x96\xf5\xfd\xcf\x15\x0a\x18\xc5\xe6\x05\xaf\xf8\x2e\xbc\xd7\x7e\xb4\x9b\xa7\xad\x31\xff\xe8\x3e\x8d\xf6\x8f\xcc\x07\x37\xee\xc9\x2a\x2f\x7a\xfc\x2d\x6e\x29\x8b\xec\x5a\x79\x29\x60\xed\x82\x15\xe1\xf7\xec\x78\xa4\xcb\x1d\x32\x57\x05\x5a\x68\x6d\x99\xa0\x56\xab\x1a\x36\xc6\x07\xb3\x9d\x87\x58\x06\x98\x2e\x3e\xc7\xab\x13\xed\x9b\x9f\xfe\x61\x63\x5c\x15\x8d\x31\x50\x52\x54\xd2\x10\xfe\x8e\xed\x94\x4a\x1d\xe3\x81\x4a\xda\x55\xc8\xc8\x12\x44\xb7\x8c\x9b\xdc\xb4\xe5\x0f\x54\xd6\xd9\xb8\xdf\x06\x8a\xb2\x99\xc1\xbc\x26\x4d\x0c\x25\xff\x1c\xd2\x55\x12\xe3\x6e\x75\x68\x9b\x8d\xcf\x65\xdc\x72\x5f\xde\x06\xfb\x8d\x12\xcd\xaf\x52\x3c\x0b\xd3\xce\xcd\x6b\x25\x5c\x60\x47\xee\xbf\x3a\x0b\xdd\xf2\x52\x4b\xd9\xcb\xa5\x0d\x69\xf8\xef\xac\x39\x5e\x02\x05\x45\x6a\x97\x43\x53\x69\xd2\xd2\x7e\xf8\xcc\x8c\xc7\xab\x24\xaa\x94\x93\xd7\xc8\xb7\x1f\xbe\x19\x8f\xb5\xc5\x5b\x97\x91\x1e\x99\x98\x17\x7f\x15\xac\x85\x4f\x77\xdc\xe5\x87\x98\x3a\x3f\x5f\x9b\x56\xbe\xec\xe7\x76\xa3\x5b\xb6\x6a\x50\x1f\x6c\xaf\x1f\x04\x8b\x47\x96\xc0\x08\x3e\xe3\xc2\xc0\x6e\xd0\x7d\x40\x64\xaf\x14\x1f\xba\x12\xff\xec\x04\x99\x2f\xe2\x54\x5a\x50\xbe\x7f\xd4\x97\x1e\xf8\xd0\xb8\xf1\x6a\xe4\x7d\xe5\x08\x98\x77\xe8\x6c\x85\xb1\xcd\x48\x8c\x19\x6e\xf3\x13\xa3\x9f\x9d\xca\x57\x78\xf8\xf1\x13\xba\x00\xa1\xee\x06\x91\xe4\x65\x6c\x03\xf2\xb7\x54\x17\x62\x1e\x61\x39\x27\x56\xaf\x22\x2e\x23\xd9\xaf\x00\x2e\xc6\x4f\xa2\xa6\x44\xce\x37\xae\xd8\xbc\x40\x73\xba\xd5\x03\x2c\xe9\xea\xa2\xb5\x94\xa3\xc3\x92\xe0\x72\xab\xfb\xc9\x28\x8e\xe7\x1b\xb6\x8a\xb1\x91\x2c\xff\xf9\xff\xfb\x7f\xff\x86\x01\xd7\x62\x2e\x92\xfd\xef\xc7\xe9\x9f\xdf\x7e\x5b\xb6\x35\x6f\xf1\xf7\xbf\x18\x5a\x49\x33\xfe\xd3\x3f\xb3\xf0\x9c\x54\xc5\x1f\x8b\x83\x87\xfa\x9f\x39\x78\xde\xbc\x77\x3f\xa1\x0f\x1d\x99\x65\x5e\x1b\x0f\x18\xba\x31\x09\xf9\xfe\xc7\x9f\xd8\xa5\xa7\xe1\xd7\x5a\xbc\xea\xd2\x79\x7e\x0d\x18\x5a\x3b\x51\x51\xe1\x4a\x9e\x1b\x0c\x5e\xda\x04\x77\xf1\x59\x97\xbf\xe9\xa6\x71\x64\xd8\xe2\x55\x45\xe5\x1d\x5f\x10\x98\x60\x82\x50\x97\x77\xec\xb7\x7c\xe0\x8c\xd0\x22\xb0\xd3\xf6\x12\xce\x49\x00\xc3\xb0\xf7\xd4\xa9\x6f\x22\x7f\xa6\x35\xc1\xb6\x33\x7d\x28\x63\x4c\x3d\x9e\xb9\x2b\xae\x97\xd5\x26\x68\x43\xab\xd0\x9e\x0f\x05\x86\x1f\x62\xe3\xf7\xcc\x8c\xe0\x75\x97\x1c\x0a\x07\xa5\x03\xb2\xcf\x30\xd4\x5e\x20\xf3\x5e\x9d\x24\x5e\xa7\xde\x64\x98\xe2\x66\x89\x8d\x76\x94\xc7\x99\xe9\x46\xe5\xf8\x75\xc7\x94\xbb\x09\x9f\x40\xc5\xb6\x36\x9c\xf2\xaa\x78\x48\x82\x71\x84\x54\xa9\x1a\x22\x69\xa4\x91\x44\x3f\x6d\xdd\x8b\xa8\xf0\x68\xa0\x9f\x0b\x64\xaa\x22\x93\xbe\xa2\xa8\xb4\x67\x69\xd5\x72\x39\x94\xb2\xc0\xd1\xa1\x32\xb7\xc7\x51\x35\x44\xde\xca\x82\x2f\xa3\x26\x34\xf7\xd9\x5e\x29\x16\x74\x8f\x42\x81\x15\x86\x01\xc1\xc6\xc5\xcf\xb0\xdf\xd5\x0e\x3b\xb2\x64\x60\xb0\xf9\x52\x5d\xe3\x2b\xdc\x28\x28\x3f\xf3\x7c\xd9\xfe\x17\x08\xa3\x70\x2b\xb2\x25\xa6\x3f\x33\x83\x92\x45\x47\x8f\x17\x05\xa2\x62\x7c\x23\x1a\x84\x7e\x41\x71\x72\x2f\xbe\x0d\xd1\xec\x2b\x61\x67\x6f\x96\xed\x4e\xcb\xd1\x4c\x66\xc1\x6a\x1d\xfb\xbd\xb2\x98\x3e\xe5\x88\xbf\x85\xbe\xab\x0b\xce\xb2\x27\x3c\x50\xf5\x54\x5e\x27\xde\xcd\xc3\x7b\x18\x37\x02\x31\x46\x4d\x93\xec\x0a\x72\x62\x1b\x69\x83\x9f\xc7\x60\xbf\x9a\x71\x5c\x6d\xc7\x6b\x8d\x9b\x0e\x2c\x95\x2b\xd2\x2c\x27\x22\xed\x6c\x5c\x37\x09\x96\xa8\x58\x97\x14\xe8\x99\x14\x28\x91\x31\x78\xed\xc7\x68\x4f\x6b\xda\x8f\x67\xdf\xb1\x51\xd2\x35\x5e\xec\xd8\xe7\xc6\x2d\x0f\x21\xd1\xf6\xea\x3c\x3a\x87\xb7\x5b\x49\x1d\xd0\x72\xea\x78\xaf\x40\x72\x95\xde\xd7\x32\x5e\x27\x11\xea\xdb\x5a\x69\x3c\xaa\x2c\xdd\x92\xa6\x96\xf5\xfa\x6a\x64\x69\xfa\x54\x05\x66\x0a\xc3\x44\x2a\xe9\xd5\x61\x63\x8e\x87\xaa\x27\x50\x2a\x41\x56\x87\xd3\x13\x54\x03\xd5\xbd\xaf\xdc\xc1\x09\x0a\xd4\x06\xb7\x73\x9e\x7f\x28\xa0\x42\x20\x30\xad\x3a\x78\xbc\xcb\x43\xee\x3e\xb4\x65\x31\x48\x1a\x7f\xc9\x9e\xda\x09\x4c\x16\x6a\x48\xd1\xbd\xdc\x57\xb7\xa9\xde\x3c\x73\xb1\xab\xb1\x4b\xa0\x3d\xaa\xaa\x2a\x9a\x59\xa9\x53\x45\x77\x93\x64\xec\x6b\xe8\x53\xcb\xa0\x8d\x2b\xb3\x6c\x31\x9f\x21\x86\xd0\x32\x5f\x5a\x7b\xf2\x69\x3c\x76\x98\xdc\x86\x19\x72\x7e\x6d\x60\xbb\xca\x73\x55\xa8\x0f\x65\x5a\x52\x30\x29\xc1\xe7\x02\x73\xe4\x75\xbf\x3a\xee\x75\x89\x51\x36\x1b\x0e\x27\x5e\x95\xe7\x74\x3a\xbe\xc0\x1a\x1e\x66\x04\xf8\xe3\xdb\xee\x14\xc8\xbe\x34\x9d\x0e\x5a\xcb\xae\x25\xd3\xd8\xd5\xef\x2a\x21\x92\x24\xfb\x63\xc9\x87\xf1\xbf\xcb\x07\xc8\xeb\x3e\x26\x0f\xf1\x51\xb9\xaf\x87\xdf\x9f\xb4\xd7\xd5\x3e\x6f\x4e\x4c\xb6\xf1\x93\x66\x2b\x4c\x04\x7d\x74\x53\x6a\xd9\x0d\xc9\xce\xa9\xca\x5c\x10\x5d\x14\xe5\x8b\x7d\x4f\xa9\x9e\xa6\x3a\x33\x46\xf3\x42\x23\x5e\x94\x3b\xb6\x06\x26\x4d\x64\xd4\x01\x89\x89\x31\x46\xf2\xa1\x80\xcf\xd6\xa8\xdd\xac\x6d\x14\xe5\x8c\x5f\xf3\x34\x74\x12\x94\x44\x78\x41\x60\x8c\x5b\x91\x4e\x9b\x89\xe8\xd3\xa4\xb3\x7c\xb7\x1b\xaa\xd6\x16\x13\x97\xa7\x8f\x6f\x84\x8a\xf9\x29\x94\xb6\xc5\x54\x62\x71\x9f\x89\xcf\x66\x7e\x12\xec\x33\x34\xa5\xc1\x3d\xe9\xf9\xf2\xe4\xf0\xb2\xe9\x4a\x4f\x2e\x27\xbb\xb5\x3e\x89\x61\xdc\xc4\x68\xe4\x34\xc7\x5a\x02\xf1\x27\x2c\x0e\x76\x51\x08\xa3\x05\x36\x15\x69\xad\xec\x4b\x0f\x15\x79\x77\xa2\x45\x7c\x86\xa8\x68\x33\x9a\x41\xa9\x73\x1e\x8a\xe3\x55\xb2\xac\x87\x80\xdc\x6b\x71\x55\xa6\xcf\x52\x62\xcd\x0a\xf9\x02\x07\x7d\xa2\x67\x45\x31\xc6\x9d\xb1\x43\xc9\xbf\x87\x09\x56\xc5\x38\x0f\xc5\x52\xf3\x7a\x75\xe4\xc5\x07\x52\xae\x01\xe0\x0e\x4f\x7e\xbc\xdc\xed\x97\x03\x4e\x9f\x49\x2f\x43\x30\xb7\x8b\x75\x60\x0a\xfe\x96\x36\xb7\x09\xbe\x0d\x02\xf4\xfa\xfc\xda\x17\xd7\x35\xe4\x7b\xb3\x32\xed\x0e\x6f\x5a\x9c\xe5\xc0\xf6\x47\xd7\x98\xd8\x57\xa8\x95\xea\xea\xda\xc2\x76\x0b\xcd\xa9\x73\x63\xf2\x95\x65\xa4\xab\xab\xab\x58\x3a\xc6\x01\x2f\xd7\x58\x6a\xbf\x5a\x2b\x26\xe7\xfc\x6d\x26\xa1\x8b\x19\x29\x42\x16\x9c\x41\x7a\x34\x57\x78\x9e\x37\x0d\xb6\xe0\xd0\x2c\xf2\x25\x22\xdc\xca\x0f\x26\x00\x82\x3c\xb0\x04\x81\xc9\x5f\x5a\x61\x14\xa7\xf3\xa7\x60\x82\xac\x88\x8a\x96\xaa\xb1\xd1\x38\x7e\xed\x44\x64\xba\xfc\x52\x91\x54\xb8\x45\xcd\x8e\xbd\x92\x41\xec\x01\xbe\xd1\x9b\x62\xc5\x7d\xf3\x6e\x89\xb2\xa2\x4e\x95\x59\x4e\x38\xb4\x5b\xa5\xa7\x57\x8c\xaf\xdc\x5d\x18\x7b\x83\x85\x54\xeb\xc3\xb4\x31\x73\x9e\xd5\x59\x29\xc9\x5b\x90\x4e\xb8\x30\xfe\x0a\x4b\x91\xb3\xf2\x39\xda\x99\x83\x7a\xb3\x3d\x11\x40\xcd\x62\xaf\x37\x5c\xa4\x31\x17\xd4\xe5\x09\xcd\x78\xce\x43\x4c\x7c\xd5\x1d\xb6\xdd\x81\x41\x6b\x35\x9e\xf0\x91\x5c\x4c\xd4\x58\x3e\x12\xd3\xa9\xbd\x1f\xd1\x16\xb3\x7a\xfd\xdb\x30\x50\x68\x39\x4d\x89\x46\x83\x55\x77\x5b\xf5\x95\x95\x8e\x6a\x12\xad\x36\x13\x9f\x4a\x41\x6f\x00\x0e\xc5\x61\xf3\xf7\xe1\x52\x31\xb6\x6c\xa7\x3b\xdb\x09\x18\x51\xe5\x7b\x1f\xa9\xe8\x39\x1b\xdb\x02\x31\x3b\x1b\x5c\xd4\x76\xa2\x4e\x7f\x39\xb8\x23\x8a\xdb\xdb\xca\xba\x63\x73\x00\xa6\x9e\xea\x60\x48\x32\xe8\x09\x21\x00\x27\x7c\x77\x09\xb0\xca\xc2\x85\xae\xc4\x93\xa8\xeb\xfb\xa3\x05\x4c\xb3\x16\x92\x3f\x12\x54\x64\xe2\x6c\x6d\x21\x63\x9b\x82\x85\xd0\x97\xc1\x22\x2e\x2e\x22\x21\x71\x2f\xca\xb5\x28\xc3\x0d\xec\x19\xa0\x07\x5e\xdd\x45\xd3\xc3\x94\xf4\xd9\xdd\x7f\xe9\xcf\xcf\xdd\xc9\xf7\x82\xdb\x39\x87\x35\xb0\xec\x7f\x4a\x66\x34\x7f\x2c\x91\xd1\x61\x7f\x31\x29\xa0\xcf\xc9\xf7\xbc\x67\xba\xe6\x1b\x2f\x0c\x6d\x25\x8e\x60\x35\x4a\xe4\x0d\xbd\x1a\xd5\x93\x2b\xa0\x1f\x0d\x71\xd3\x03\xb4\x40\x80\x3e\xb7\x10\x61\x66\xb0\x32\xb7\x23\xd0\xd6\xe5\x59\x2c\xc2\xf5\x6e\x7d\xa7\x4f\xe1\xb3\x47\xe2\x14\x5e\xdf\x8b\xb8\x4e\xe2\xbd\xa2\x6a\x57\x43\x44\xbb\x10\x82\xc2\x08\x6c\xc6\x5e\x82\x30\xa0\xcf\x54\x07\x00\xc8\xf9\x35\xf9\xb6\x44\x12\xa9\x75\xd9\x8b\xb9\x48\xc5\x9b\x78\x69\xdf\x27\x2f\xcb\xca\x2f\xd7\x0f\x15\x49\xe7\xc6\x27\x40\x7c\x80\xe3\x3d\xe6\x53\x8a\x39\xbb\xa5\x02\xf9\xf3\x9e\xf1\xfb\x5c\x60\xa5\xf6\x83\xde\x12\xf2\x53\x09\x3a\x70\x9f\xdf\x2c\x19\x67\x14\xdc\xb1\x9c\x9e\x86\x50\x62\x1e\xd8\xf3\x18\xc3\x80\x75\xba\x07\x19\x0a\xcc\xcc\x14\x37\x3d\xed\x98\xa4\x1b\x0a\x74\xa8\x40\xc4\x73\xf6\x8c\x9b\x43\xae\x98\x56\x82\x63\x8f\x97\xc8\x8b\x86\x65\x76\x2a\xcc\xd0\x2b\x09\x89\x2c\x23\xd5\x30\x2a\x80\xc0\xa3\xef\xe7\xf5\xb1\x11\xa9\xa8\x3a\x95\x5f\x9a\x80\x71\x44\x1f\xb5\x91\xd3\x22\x36\xb9\x76\x32\x37\x16\xdc\x59\xba\x11\x1a\xfe\x60\x0c\xb6\xf5\x87\x1f\x81\x41\xa0\x57\x04\x40\xbb\x0c\xd8\x67\xda\xa6\xce\xee\x34\x4a\x2f\x07\x18\xba\xc0\x1f\xee\x4b\x36\x5d\xb7\x53\xea\xb5\x53\x91\x12\x33\x08\x99\xcd\x4c\x3e\x59\x74\xac\xe4\xda\xc9\x8a\xcc\x53\x4e\x26\x83\x87\x79\x47\x41\x73\xf4\xe0\x61\x85\x64\x20\x97\x04\x17\xbd\x56\x10\xc5\x25\x22\xd6\xb3\x9b\x27\x7c\xa1\x39\xeb\x62\x7a\x6a\x73\x96\x1c\xd0\xe4\x60\x96\x84\xd6\x0e\xa7\x2a\x5e\xc2\x67\x3e\xf6\xce\x39\x5e\x60\x58\xa7\x97\x30\x9a\xe0\xbd\x0a\xa3\x2b\x30\x77\x0d\x66\x95\x7f\x94\x6b\x80\x82\xc9\xa9\x94\xb2\xe5\xce\xd5\x55\xef\xfd\xa2\xe5\x87\xef\x68\xc3\xc2\x6a\x0f\x04\xe3\xbc\xc2\x8e\xe9\xe2\x7a\xef\xab\x8f\x57\xac\x05\xd0\xe6\x1c\xde\x41\xb3\x51\x7d\x59\xf6\x25\x9c\xca\x7d\xcc\x6c\xcb\x47\x9e\x97\x65\x46\x37\x25\xea\x90\x1b\x7d\x3c\x46\x1f\xb7\xab\xe8\x2c\xa4\xeb\xbb\x36\x2e\x6d\xe3\x36\x69\xfa\x22\x07\x6a\x60\x8a\xcb\x95\x3e\x2b\xe1\x32\x35\x96\xad\x9c\x23\x95\x5c\x39\x1e\xed\x0a\x4a\x07\xd6\x7e\x71\x8a\xbb\xa1\x5f\x0e\x14\x5e\x16\x42\xbf\x0c\x28\xac\xbd\x5a\x91\x16\x4c\xc8\x70\x9b\x9c\xfe\x14\xaf\x42\x75\x71\xe8\xe2\x37\x33\xcd\x3f\x7a\x3f\x26\x02\xbd\xbe\x49\x0b\x72\x10\xd7\xe8\x61\xaf\xd0\x82\xf5\xa8\xf0\x4a\x96\xa3\xae\xdb\xf1\x8c\xf6\xd6\x47\x4f\x1c\x0d\xdb\x3d\xf0\xd3\x2d\x74\xa7\xb3\x35\xbc\x47\x32\x40\x00\x5d\x4d\x40\x59\x6b\xa6\x2b\x9a\xf2\x31\xf6\x69\xe3\x95\x74\x95\x91\xa1\x4c\x25\x9c\x5f\xc4\x47\x69\x86\x36\x0d\xcb\x57\x46\xd8\xc2\x21\xf1\xf7\xdd\xfa\x65\xf9\xc7\xda\xfc\xd3\x7f\xb7\x17\x3a\x8f\xda\x17\xfe\xc3\x7b\x61\x3c\xc4\x33\x8f\x24\x2e\xa3\xa5\x8a\x60\xba\xbb\xe0\xd9\xbb\xc3\xee\xf5\x4a\x78\xec\xa3\xaa\x82\x02\x52\xf4\x88\x4c\x15\x4e\x57\xe0\x14\x96\x93\xd7\x12\x53\x45\x25\x1b\xcb\x44\xaa\x8b\x7b\xb2\x29\x25\xc1\x3e\x2f\xc4\xd7\x83\x93\x58\xc5\x5e\xec\x8a\xa9\xfb\xd6\x67\xfd\x8a\xb9\xa3\xb8\x5e\x6a\x5e\x57\x04\x8e\x1b\x03\x24\xd8\x6f\xc2\xdd\x88\xa1\xed\x78\x69\xb4\xcc\x22\x56\x60\xa2\xda\xac\x2c\x8f\x33\x09\xa8\x6f\xa9\x4a\x44\x79\xe4\xa3\x2f\x60\xe4\xc8\x7f\xf0\xa2\x07\xc0\xc7\x83\x07\x46\x70\x82\x58\x9d\x03\x45\xf5\x33\xc8\xa8\x3c\x66\x82\x60\x15\xfd\x72\x83\x87\x4f\x04\xa6\xdf\x40\x90\x1f\x94\xec\x85\x42\xd1\x18\x34\x38\x8f\x9f\x5b\x2a\xa2\xe4\xa8\x7c\x2e\x7f\xe7\x74\xa6\x3e\x8b\xd8\xd3\xaa\xe8\xde\x64\xce\x7e\x28\x30\x98\xef\xba\x1d\xb7\xbb\x05\x6d\xfb\xea\x48\xac\x16\x15\x96\xca\x3f\x06\x5e\x8e\x45\x40\x1f\xd3\xbb\x73\x91\xe3\x68\x05\x65\xb8\xb8\x73\x84\x0c\x9c\x65\x37\x81\xc4\xd4\x71\x74\x17\x77\x95\xfd\xf6\xa9\xa0\x3b\x96\x23\x90\xce\x41\x71\x7c\x76\x30\xf4\xcb\xf4\x89\x56\x87\xb3\x79\xd2\xe4\x6f\x89\xc1\x41\x92\xc1\xad\x23\xb9\xe5\xcb\x66\x04\x7d\x87\x1a\x99\x6e\xf4\x1b\xd0\xd8\x67\x23\xdb\x52\x54\x78\xaf\xe9\xe0\x60\x8e\x0d\x0e\x76\xac\x92\x9a\xb8\xdd\x5f\xac\x6b\x9a\x59\xba\x89\x70\x5c\x70\xc0\x69\x40\x52\x02\x63\x7d\x07\xd6\x7b\x8f\xa0\x15\x38\x68\x14\x86\x8d\xdb\x18\xce\x95\xc3\xee\x38\x25\x16\x2e\x81\xb6\x09\x8f\x65\xda\x04\x29\xbf\xe5\x1d\xc1\x11\x3f\xb1\xbb\xcd\xb6\x54\x31\x20\xee\x9c\x6f\xb8\x30\x2b\x5b\x21\xb2\xcc\xed\x40\x62\x15\x89\xcc\xbb\x5c\x38\x3c\x93\x68\x35\x46\x23\x2d\xc3\xac\x93\x3a\xa9\x59\xf3\xb3\x40\x27\x3c\xfc\x1a\x5c\xe2\xd1\x7d\x10\x5c\xdc\xe4\x60\x5c\x5d\x88\x4b\x1a\xcc\x3e\x0f\x42\xec\xb0\xb0\x11\xb5\x74\xfc\x23\x7f\x99\xac\x48\xe1\x83\xe6\xec\xaf\x45\xa6\x4e\x40\xfb\xfe\x2b\x0b\xea\x34\xb0\x56\x33\x00\x50\x7f\x38\xe8\xa3\x46\xfd\x26\xf5\xf6\x13\x4f\x04\xbf\x39\x3c\x0b\x23\x2a\x76\xd2\x5b\x58\x83\x12\x05\xbf\x71\x77\xd8\xe7\x5d\x30\x0e\x36\xf2\x37\xfc\xcc\xb0\xba\xd4\xb7\x39\xf9\x98\x1b\x39\x20\xc9\xee\x39\x3d\x3f\xbd\x4e\x6d\xb1\xa5\xaa\x8e\xf5\x3e\x85\xed\x6e\x85\xed\xc3\xd6\x44\xbf\x72\x14\x91\xed\x50\x60\xdc\x97\x2a\x65\x28\xb7\x26\x4f\x6e\xe9\xaf\xf8\xe4\x26\xe5\xeb\x84\x19\x5f\xd4\x0c\xd2\x0d\x33\x7f\xa3\x35\x4f\x2f\x70\x87\x1e\x57\x59\xec\x3d\xf7\x28\x6f\x2d\x15\xd6\xd3\x67\x47\x91\xab\x34\x78\xb7\xa8\xc0\x3e\x4c\xe6\x37\xd2\xab\x49\xc5\xc2\xda\x4b\x1d\x7f\xa2\xf0\xb3\x0b\xd7\xb7\x8c\x99\xdb\xa1\x0c\xe4\x1b\x74\x74\x26\x2d\x36\x0e\xe1\x1d\x38\x82\x48\x36\xa9\xf4\xe4\x83\x11\x71\x5a\xa0\x11\xb1\x71\x71\xf6\xeb\x70\x22\x19\x24\x6e\x42\x0d\xe1\x07\x02\x96\xa8\xaa\xd3\xcc\xe9\x04\x25\x27\x0d\xa9\x0a\xff\x74\x3d\x18\xc5\xf6\x30\x7e\xed\x94\xaa\xaa\xfe\xfc\x9f\xf3\x3d\xce\x3f\x98\x21\x31\x7c\xfe\x62\x48\x90\xfb\x01\x41\xb4\x67\x86\x71\xf6\x85\xc6\xd7\x9d\x17\x58\xb5\x90\x99\xbe\x3a\x99\x1e\x03\x69\x61\xa7\xa2\xb8\x99\x14\xa0\x2d\x80\x66\x62\x92\x86\x37\x80\x96\xbb\x7c\x80\x71\xdc\xf2\x14\x59\x08\x54\xa6\x93\xaa\x8f\x3a\xdb\x52\x83\x4d\x83\x22\x76\xa9\x82\xa4\xa2\xd4\x02\xa8\xfe\xe1\xad\xd5\x3d\x9d\x47\x34\xcd\xa3\x28\x8a\x0c\x00\x3e\x7c\x65\x31\xb7\x34\x03\x20\x35\xa4\xcf\xb1\x36\x76\x9c\xdf\xad\x92\x34\x2a\xc3\x21\x01\x70\x7c\x80\x99\x4a\x48\x0c\x1f\x92\x1b\xa8\x38\x83\x2c\x52\x17\x08\x5c\x18\xe2\xdf\x86\xfa\xc6\x0d\x98\xad\x4b\x92\x9f\x23\xac\x5b\x0c\x2d\x96\x33\x6b\xcc\xcb\x77\x3d\x60\x0a\x21\xce\xdb\x94\xe7\x08\x37\xc6\x36\xcb\x6e\xc4\xbd\xb2\x8e\xd2\x99\xc6\xf1\xa0\x31\x2b\xa5\x66\x0d\x85\x21\x0e\x11\x3d\xa7\xae\x85\xf5\xae\x86\xf7\xbf\xe0\x9b\x58\xa5\xb4\x43\x67\x99\x32\x05\x76\x58\xcf\x61\xfa\xd5\xdc\x63\xf1\xf8\xf9\x3c\xa9\x86\x82\x0d\xd8\x77\x32\x6b\x5c\xd8\xd8\x58\xb6\x68\x39\xf5\xd4\x2c\x32\xce\x4c\x28\x12\xc0\x47\x4a\x8e\x48\x6d\xef\x5a\xec\x12\x95\xfb\x8c\x1d\x5e\x75\x6c\x48\x55\xb4\x71\xcf\xf4\x78\xd7\x52\xcc\x5d\xec\x07\x4c\xe4\x0f\xef\x37\xca\xd4\x1f\xa0\x55\xab\xb6\x2e\xc5\x1f\x2f\x84\xc4\xf5\xe3\x39\x32\x3f\x62\x82\x19\x48\x0f\x00\x5e\xee\xd4\x75\xab\x65\x2c\xf0\xc9\x24\x52\xcc\x7c\xd1\x7a\x88\x28\xe5\x2a\x57\x94\x1e\xc1\xbd\x68\x78\x06\xc5\xe2\x98\xbb\xb8\x46\xaf\x27\xfe\x76\xa1\x2f\xb0\x45\x1c\x7b\x78\x5d\x37\xf7\x9a\xdc\x87\x26\x0a\x86\x7c\x98\x4f\x80\xed\xd5\x79\xcd\x38\x4e\xe9\x5d\xbb\xef\x7a\x22\xa9\xcb\x92\x4a\x59\xfe\x22\x13\x1c\x78\x44\xf8\xb9\xc2\xf3\x35\xb0\xe6\xda\xbd\x80\xdb\x51\xd5\x45\xdb\x81\x45\x05\xf7\x3c\xa7\x61\x5c\x7f\xc7\xf9\x02\x9e\x04\xa5\x31\x29\x6e\x70\x0d\xed\x65\x9b\x0c\x1e\x36\xd3\xf0\xcd\x8d\x1b\x3a\x68\x83\x8a\x1e\xe6\xbb\x1b\x31\xa0\x5b\xdc\x64\x50\xf1\xa0\x63\xaf\x81\xb7\x07\x8d\xd3\xce\x96\x81\x74\x8d\x6a\xba\x20\x34\x35\xe1\x98\xde\xc8\x48\x66\x44\x23\xa5\xe8\x8b\x73\x52\x9e\x3a\x60\x8e\xb1\x85\xeb\x33\x63\xce\xbc\x24\x21\xb0\x8c\x16\x75\x5f\xf7\x91\x5b\xc6\x2a\x86\x51\xe6\x37\x27\xc2\xfa\x68\x55\x3f\x80\x37\x05\x99\x3b\x69\x7a\xcb\x4b\xf4\x23\x5b\x30\xc3\x32\xce\x0d\x7e\xfd\x1a\x88\xbd\x7a\x5d\x06\x7e\x61\x8a\xd4\x41\x82\xa7\xce\xb5\x0a\x7a\x77\xf0\xa8\xe8\x44\xee\xfa\xcd\x11\x35\x89\xd5\x12\xfc\xe5\x74\xb1\x8e\x61\xa9\x7d\xc4\x6d\x9c\x05\x73\xf9\x4a\x63\x04\x97\x83\x74\x22\x36\xe6\xe8\xcf\x10\xa5\xb6\xb1\xbd\x8e\x05\xdb\x06\x1d\x51\x8b\xd4\x4c\xe5\xd9\xdf\x4e\x86\xdd\x9b\xaa\x2e\xcb\x18\x21\x79\x63\xf3\x54\x8d\x86\x58\x0e\xce\x6f\x45\xf4\xa3\x8e\x36\xe7\xb6\x5e\x34\x57\x50\x41\x05\xb2\x96\x52\x09\xf4\xef\x2b\x27\xd2\x61\xfe\x83\xc9\x89\xf8\x2f\x67\x14\xc0\x67\xf5\x7a\x3e\x02\x3f\xc8\x49\x45\x3e\x74\x2e\xf0\xb5\xef\x32\xc6\xe6\xb3\x46\x25\xbc\xc8\xc4\x1e\x77\x42\x79\x89\xe3\xa4\x8c\x8f\xc0\xb4\x42\x9e\x05\xda\xc7\xc1\x41\x7c\xe5\x73\x74\xbc\x6e\xaa\x80\xd2\xf6\x27\xc1\x59\x43\x0d\xb0\x25\x3c\xc3\x22\x83\x09\xf3\xf0\x8b\x3c\x41\xd2\x2a\x13\xf0\x82\x04\x9f\x02\x03\x73\x62\x6c\xf4\xb8\xae\xf8\x7b\x54\xa9\x32\x75\xd7\x01\x9b\x53\x46\xd4\x63\xae\xab\xd8\x67\x01\xfc\xa7\x76\xbd\xc4\xc5\xf9\x09\x8e\x25\xa5\x30\xcd\x20\x54\x42\xbb\x2e\x5e\x84\xf9\x3c\xf7\xa0\x83\x56\x9e\xed\xa1\xe7\xb0\xd5\xee\xa3\xe6\x83\xb2\x67\x84\x64\xdd\x83\x16\x9f\x1b\xe3\x7a\x8d\x4d\xc4\x34\x7d\xdb\x90\xcb\xa6\x63\x13\x31\xc3\x2a\x30\xc9\xb4\x1d\xd6\x32\x55\xd4\x9c\x37\x5e\x07\x43\x09\x0d\xce\xda\x41\xc7\xa9\x38\x10\xe5\x92\x44\xd1\x6e\x3c\xad\xde\xf4\x49\x8d\x1d\x54\x86\xc4\x9d\x97\x19\x6a\xa8\x3c\x4d\x11\x69\x08\xa0\x38\x93\x99\x19\x97\xd8\xca\xf2\x2c\x3f\x01\xa8\x55\xb8\x51\x29\x47\x79\x91\x2c\xc4\xda\x22\x1f\x06\xc9\xeb\x5d\x4d\xf3\x08\x56\x4b\x93\xe9\xd6\xfa\x6a\x9b\x28\xef\x74\xea\x1c\x68\x61\xd5\xfd\x28\xb5\x08\x67\xe7\x53\x84\x05\x9c\xd1\x07\xcd\x59\x5f\x91\x19\x98\x53\x4b\xc4\xc3\x15\xec\x84\x2b\x6b\xe4\xd3\x33\x6e\xd0\x50\xf3\x31\xb4\xa9\x0a\x31\xa8\x62\x1d\x3d\x72\x1a\xd6\xac\x93\x4a\xbe\x75\x86\xb6\xe6\xec\xc9\x65\x5c\x4b\x6f\xed\x5e\x61\xae\xdc\x4d\x8d\xaa\x25\x53\xa7\x7f\x6d\x38\x1b\xe3\x74\xf9\xd2\xfa\x93\x2d\x22\x11\xa6\x92\x6a\xc3\xa5\xfe\x5e\x06\x98\x6f\xb7\x73\x1d\x10\xd3\x30\xca\xf6\xdd\x4e\x58\xbb\x68\x85\x56\x58\x19\x3b\x6e\xb8\x0a\xa3\x74\xf9\x16\x7b\xf6\x62\xe6\x64\xd8\xf2\x27\xe3\x1c\x68\x24\xe9\x5b\x0c\x08\x1a\x78\x4f\x3e\x62\xd4\x18\x8e\xfb\x6c\xe3\x77\x45\x4b\x8b\x5c\x6f\x0b\x93\x49\x58\xd7\xd2\xab\xfa\x46\xb1\xa3\x7f\x82\xee\xbd\x75\xdf\xb3\x60\x5b\xb7\x6a\xad\x14\x8c\x0f\x1e\xd1\x0b\xbb\x36\xb7\x39\x0e\x78\xb3\xa8\xab\x9d\xc2\x01\x8c\xf0\xa5\x80\x66\xde\xd7\x59\xa5\x8a\x82\xb2\x95\xa8\xb9\x87\x41\x10\xdd\x1d\x9d\xc1\x53\x69\xcd\xdf\xd0\x43\xee\x6d\xa3\xbd\x2b\x80\xde\xcc\x5a\xf4\x7b\xa4\x3c\xe4\x1e\xde\x65\x83\x81\xa2\x84\xfa\x54\x9d\xd1\x50\xc3\x5d\xd3\x49\x0f\x15\xdd\xb4\x76\x9f\x26\x03\x3b\x51\x63\x0c\x5b\xbf\x1f\x58\xfd\x2c\x0e\xe5\x7f\x62\x2b\xfd\xba\xb5\xdc\xc2\xbc\x58\x03\xf0\xbe\x3d\xc6\xe8\x24\x0d\xb9\x7e\xbc\x5b\xff\xca\x0c\x03\x68\xb6\xeb\x7a\xda\x8a\x7a\xf9\x06\xa9\x9f\xdd\x03\x0f\x43\xbb\xe5\x75\x48\xbf\x2f\x19\x86\xce\x3a\xd2\x8e\x33\x1f\xa9\x48\x95\xa9\x6a\x3f\x7e\xfd\x19\xc1\xd7\xb9\x60\x6a\xa7\x26\xf6\x93\xa2\x84\x5e\x5e\x5e\x44\xd3\xde\xa6\x35\xc1\x8a\x5a\x9e\xf2\x7b\x3a\x24\x7f\xb0\xd3\xcb\xec\xfe\x4b\x7c\xae\xfb\xac\x3f\x4f\x2f\x87\x78\xec\xaa\x49\x61\x13\xf1\xcb\x16\xf5\xa1\xb8\x49\x5f\x2b\xb1\xe3\xc5\x0c\x8e\x27\x90\x74\x85\x9b\x09\x5a\x23\x20\xe8\x00\x05\xd4\xfb\x03\x69\xdf\x88\x5d\x61\x99\xf0\x7c\x4d\x0e\x20\x21\x83\xea\xd9\x9a\x1d\x87\x30\x08\x7d\x35\x28\x7d\x9b\x8f\xd3\xf7\xc9\x48\x1f\x3b\x70\x1c\xe1\x02\xbb\xa1\xc0\xb6\x05\xfd\x34\xc1\x0b\x0f\x9c\x17\x6b\xd3\x06\xa4\xbe\x77\x69\xe2\x14\x12\xcc\x08\xb7\x2a\xec\xa8\x07\x58\x0e\x93\x26\x91\x00\x32\xff\xc1\xfa\xa3\xb4\xc9\xe9\x13\xf3\xce\x7e\x99\x75\x17\x48\x5b\x90\xae\x31\x50\x7c\x79\xf3\xde\x8e\x23\xe5\x05\x7c\x80\x5c\xe6\x84\x2d\xb4\x6f\xcc\xa9\x0c\x8f\xf7\x2c\x8e\x7e\xdf\x9d\x25\x80\xbd\x4b\x02\xc4\x76\x61\xa1\x7a\x5a\x67\x47\x83\xc7\xd6\x23\x29\x40\x78\xf4\xab\xed\xdd\xfe\x36\x14\xdd\x4d\xa8\xd8\x92\x5e\xce\x92\xdb\xea\xca\xa7\x81\x7a\xb5\xb7\x0c\xcd\x8c\xc0\xba\x74\x34\xe8\xed\x62\x14\xb7\x67\xe1\x70\x5d\x2c\x5b\xd7\xee\xba\x41\x51\x98\xab\x18\xd4\x13\x98\xba\x32\xe7\x01\x61\xb0\xb9\x62\xa4\xaf\xe7\xdd\x96\x4a\x4b\x1b\x39\x4b\x25\xe2\xf2\x87\xa0\x17\xbb\x4e\xc9\xea\x0a\x36\xf0\x10\xe8\x17\x0b\x39\xe3\xe1\x08\xae\x08\x47\xea\x33\xcf\x97\x1a\xf9\xb9\x68\x10\xae\x50\xbf\xcc\x22\xca\xc5\xe8\x17\x1a\xeb\xed\xa5\x67\x57\xfc\x7a\x64\x37\xc6\xb3\xaa\xcd\xab\x8c\x87\xe6\x08\x43\x7c\x48\x53\x7a\xf1\x4c\x66\x45\x17\xfc\x58\x1b\xb9\xcc\xd6\x2e\x1a\xf9\x53\xef\x22\x4f\xdb\x01\x67\x09\x8b\xa5\x38\x05\xa7\x51\xe4\x81\xfa\xa9\x96\xa8\x17\x25\xdb\xb4\x62\x5e\xed\x3e\x29\x62\xef\xd3\x13\x67\x91\x10\x04\x94\xb6\xe0\xba\x51\x98\xb5\x7d\x16\x7e\xe1\x0a\x00\x36\x04\x9f\x31\xed\x7d\xfb\xb3\xf8\x34\xbc\x6d\x24\x24\x23\x4a\x1f\x3e\x5d\x1d\xba\x58\xd6\xf6\xe6\x97\x26\x93\xac\x9d\x04\x23\x87\x93\xf4\x39\xf9\x6e\xc4\xa5\xd0\x33\x75\x9e\x65\x0a\x93\x44\x93\xa7\x13\xed\x77\x36\x9d\x60\x25\x13\x85\x26\xb5\xde\x06\xaa\x57\x25\x74\x9f\xa6\x99\x4b\x15\xcd\xd3\xa4\x31\x89\x39\x0a\x35\x9f\x16\xfa\x5d\xa3\x01\xd9\xfc\x07\xd3\xb4\xa5\xf2\x97\xfd\xb4\x51\x26\x0f\xf1\x1e\x38\xc4\x70\x50\x2d\x73\x18\x02\x96\xcc\x09\x79\xd2\xfb\x5b\x5f\x93\xdf\x9e\x36\xac\xc4\x50\x05\xfa\x2a\x4f\xe9\xbc\x5c\x50\xd0\xc9\x02\xf4\x40\xdd\x18\x99\xe1\xca\x5a\x32\xe0\x20\x9a\xe5\xc5\xaa\x96\xbb\xd4\x83\xd2\x24\xe1\xf7\xba\x40\x0c\x57\x81\xe2\xc0\x87\xf1\x05\x21\x94\x78\xc7\xc9\xa2\x00\x53\x8a\x40\x90\x47\xa4\xaf\x4a\x4f\xb5\x0f\x0c\x96\x2f\x90\xbc\xe9\x48\x9b\x11\xfc\x5d\x77\x22\x2e\x97\x97\x52\xf4\x35\x8a\x01\x05\x05\x0b\x78\x36\x84\xb6\xc9\x1a\xfb\x0c\xfb\x6a\xc6\xc4\x57\x9a\xc6\xb0\x83\x27\xdc\x21\x7d\xbc\x03\xdd\x96\x59\x75\xf0\x16\x69\x54\xd7\x9e\xc2\x70\xcc\x98\x6c\xbb\x9b\xe0\x80\x63\x61\x3d\x84\x1e\x9e\xcf\x23\x47\xcd\xcb\x20\x38\xdd\xb3\x4e\x77\x95\x6d\xc0\xd9\xe8\x71\xa0\xd0\xa3\xf7\xe0\x06\x84\x57\x5b\x04\x6e\x6d\x59\x68\x8c\x5b\x5f\x67\x74\xba\xe8\xe9\x32\x2e\x4c\x36\x13\xed\x87\xf2\x34\x62\xd7\x11\xa8\x85\x74\x39\x86\x17\xcc\xf4\x8b\xa5\xc6\xc2\x56\x3d\xcb\xb2\xb7\x0a\xb9\xe7\x19\x3f\xb2\x8f\xb2\xf2\x9d\x56\x33\x0b\xa0\xd5\x00\x9a\xde\x20\xb0\x32\x4f\x36\x8a\xf9\xe8\x3c\x58\x90\xda\x34\x52\x2d\x2a\x9d\x8f\x14\x69\xad\xea\x5c\x36\xeb\xf0\x5e\x55\x52\xc0\x07\x1b\x84\xf4\x26\x2d\x07\x67\x63\x45\x7f\x15\xca\xe9\x19\xf6\x0a\x91\x52\xe1\x34\x11\x35\x43\xe2\xe9\xb2\xab\x1b\xac\x41\xd9\x67\xbe\x0e\x12\xa2\xfa\xe4\xe7\xb7\x77\xae\xf6\x2a\xfa\x22\x7d\x89\x9d\x0e\xb5\xa9\xaf\xa1\x19\x14\xee\x82\x2a\xf9\x55\x85\x03\x4e\x10\xf9\x4a\x6d\xef\xf2\xdb\x16\x55\x08\xf5\x9c\x9b\x81\x75\xf1\x3d\x04\x8a\x02\x25\x91\xdf\xfa\x4c\x0d\xaf\x67\x4a\xde\xe0\xcb\xe5\x3d\xbb\xe2\x00\x37\x29\xd5\xca\xbc\xb9\x0c\xb9\xd4\x1a\x19\xf8\x53\xc1\xef\xf6\xea\x7d\xa2\xea\x08\x77\x62\x06\xf3\xa6\xc7\x13\x1f\xef\xf0\x61\x3e\xb8\x87\x7e\xdf\x17\x2e\x91\x4c\x30\x6e\x48\x5c\x3e\xb0\x40\x65\xef\x3e\xf3\xf7\x98\x6d\x4b\x34\x25\xd2\xec\xc8\xea\x7e\x43\xaf\x92\xfb\xb2\x30\x4b\x16\x3e\x3f\x30\x35\x1c\xdf\xee\x73\xb8\x5f\x12\xa6\x26\x10\x77\x24\x7e\xac\x49\x48\x12\x12\x1e\xff\xb6\x83\x36\x06\xb7\xa7\x3c\x1f\xed\x71\xfb\x9d\x41\x3a\x92\x61\x2a\xa6\xe0\x0b\xcb\x6d\x02\x7b\xeb\x7e\x67\x6b\x37\xdb\xb6\x3f\xd6\x1e\xec\x7e\xe3\x15\x77\xfb\xe9\xf5\xbc\x05\x1e\x18\x37\xb1\x5a\x0f\xda\xb4\xaa\xaa\xde\x19\x0c\xf2\xdd\x46\xe3\x6e\xed\xd9\x81\x68\xe7\xcf\x4b\x27\xa1\xb6\x7f\xf0\x6c\x12\x58\xd8\xdc\xa6\x96\x4f\x74\x35\xde\xd9\x45\x48\xdc\x5c\x1c\xda\xd4\x81\x58\x11\x61\x1e\xe0\x2c\x1a\xc4\x30\x18\x47\x0c\x1d\x8f\x38\xde\xef\x13\x13\xe4\x8b\xbc\xb6\x80\x9f\x36\x1e\x9d\xe1\xfb\x9a\xab\xee\xb1\x4f\x89\x93\x29\x43\xbd\x06\xe0\x97\xb3\x6d\x8c\x58\xdd\x19\x79\x69\x9a\x21\x08\xf7\x12\xd8\x97\x8d\xd6\xe4\xef\x1e\x62\xc3\x17\x6e\x35\x51\x84\x56\x55\xe3\xbf\x32\x4f\xf6\x4d\x30\xe7\xef\x65\x12\xd2\xb9\x28\xcb\xd1\x0e\xe7\x91\x0b\x1e\x9a\x0a\x11\x19\x74\x1f\x21\xde\x0c\x66\x57\xe7\x39\x27\x23\x96\xfb\x1e\x04\xc1\xc6\xc5\x99\x23\x55\xd9\x97\xae\x27\x64\x5e\x6d\x42\x85\xa9\x35\x69\x23\xdb\xd4\xda\x3a\xcc\x5c\x5d\x74\x59\xa0\xb9\x9f\xf9\x78\x5e\xef\xc5\x8c\x9a\x12\x36\x6c\x4f\x2f\x46\xda\xfa\x16\x4f\xca\xaf\x99\x4b\x62\x42\xd4\x48\x20\xfb\x98\x74\x49\xa0\x95\x91\xb2\xf0\xa9\xd7\xef\xd6\xd8\xb5\x59\xcf\x2c\x5e\x58\x9e\x0e\xf0\xf4\x67\x56\x5e\x59\xe3\xc7\xd6\x76\x0e\x65\x6b\x0f\x42\x57\x96\xcd\x63\x1d\xbb\x68\x70\x6e\x46\x9e\x70\xc9\x72\xb1\x97\x62\x70\xd5\xcc\xe4\xb5\x02\x91\x1d\x49\x00\x8f\x02\x74\xa6\x3b\x3e\x80\x9c\xf6\xf5\xde\x64\x0c\x7a\x36\x01\xb5\x2a\xb3\xa1\xfe\x5b\x4e\xa7\xcb\x37\x78\x9f\xc9\xdd\x5b\x6c\xa3\x0e\xda\xa4\xdd\x7f\x21\xf9\x2b\xce\x48\x8d\x72\xd2\xc4\x6d\x3c\x16\xd9\xa7\xf5\x34\x6a\x63\x3b\xfa\xdb\x74\x36\x6d\x38\x70\x30\x2d\x53\x1c\x1c\xe8\x47\x25\xec\xeb\xed\x0d\x83\xf6\x39\x5d\xd7\xa5\x5a\x16\x4f\xa1\xb7\x6f\x45\x58\xd5\x28\x80\x8a\x19\x92\xa3\x8a\x45\x1c\xae\x46\xd3\x4f\xef\x2a\xed\xb7\xe4\xbf\xdb\x9a\xbc\x06\xad\xd3\x17\x4e\x42\x83\x79\x04\x00\xd9\x0b\xe3\xf4\x31\xd1\x90\x6b\x2a\xbb\x36\x9a\xcb\xa2\x1f\x45\x25\xdc\x74\xfb\x3a\xa0\x99\xd0\x44\xd5\xd0\x32\x5d\x47\x2f\xfc\xd8\x15\x23\x97\x9b\x4f\x93\x97\x5c\xec\xa6\x88\x0b\xf4\x52\xe7\xdf\x95\xc5\x0e\xa8\x04\x5c\xef\x91\xaa\x47\x77\x39\xce\x9d\xf8\x1d\x2c\x77\x6b\xe3\xcf\x00\xe5\x4d\x11\x33\xe2\x6c\x3d\x2f\x68\xe8\x9b\x21\x59\xdd\xb0\x33\xcb\x39\x34\xb3\x6f\x6f\x4d\xe2\xde\xd2\x6c\x35\xaf\x8f\x15\x6e\xe6\x77\x97\xc0\xf1\xb4\xc3\x85\x51\xe6\x49\x95\xf4\x57\xfc\x76\x5f\x06\x32\xf2\x7e\x23\xb4\xef\x43\x47\xea\xec\x2d\x9f\x7c\xff\x34\xc7\xc9\x10\xa5\xcd\xcd\x54\xb7\x52\xdc\xe7\x36\x84\xab\x9b\xa7\x6e\x0b\x8f\x6d\x08\x93\x38\x10\x46\x28\x9b\x7c\x92\x5a\xc1\x14\x07\xe9\xea\xa2\x3b\x8f\xff\x26\x56\x62\xdf\xdb\xf5\xbb\xea\xdf\x3c\xd9\xff\x58\x7b\xbf\xf4\xff\x45\xff\xea\x1e\xf4\x31\xf9\x0f\xef\x99\x05\xf8\x4d\xa0\x63\xde\x87\x9e\x76\x2a\x44\x9f\x9a\xb8\x62\x69\xa4\xb6\x48\x53\xa2\xdb\x74\xb9\x36\x87\x62\x11\x80\x35\xc9\xe0\x13\x80\x00\xe3\xd8\xc5\x13\x79\xe6\x25\xa3\x16\xed\x77\x74\xe5\xf1\x95\x9c\xfa\x72\xf5\x11\xe2\x14\x9e\x7b\x2c\x45\xde\x13\xce\x24\xa6\xdd\x12\xd7\x35\x12\xa0\xa0\x48\xca\x28\xcb\x4c\x2c\x54\x5c\xab\xdd\xe2\x14\x4e\xc0\x50\xa6\x58\x32\x25\xa3\x5c\x5f\x70\xeb\x49\x5c\x9d\x83\xb2\xbe\x47\xad\x20\xfa\x50\xfb\x80\xd3\x17\xd4\x9d\x78\x99\x46\x23\xf4\xc0\x0e\xa2\x69\xbc\x2f\xbf\x35\x2f\xc8\x6b\x4f\x6f\x26\x6c\xea\x8f\xb9\xaf\x1f\x7a\xcb\xb4\xf9\xa9\xb0\x39\xdd\x65\x89\x5f\xeb\xa5\x78\x51\x20\xb9\x86\x0c\xc5\x46\x99\x14\xf8\xf3\xfa\x26\x8d\x75\x30\xd2\xe2\x66\xce\xad\xb7\x4a\x3d\x84\x10\x68\x6c\xf3\xe7\x5e\x49\x82\x14\xee\x80\x7f\x2f\xbd\x19\x6f\xfa\xe5\x69\xf4\x16\xe4\x79\x34\xda\x22\x97\x5c\x75\x8e\xd2\x3b\x40\x3d\x98\x35\xd1\x96\x3c\x82\x7b\xf0\xd4\xad\xaa\x75\xb6\x12\x64\x78\x10\x0a\xca\xaa\xa4\xb8\x85\x98\x04\x7d\x6a\x41\x00\xd4\x53\x54\xdc\x49\xb6\xb5\xc3\x64\xc1\xa2\x1c\x5b\x0e\x07\x60\xfc\x62\x3e\xda\x02\xde\x55\xea\xb0\x4c\xa8\x16\x81\x22\x82\x86\x9b\x77\x0f\x99\x05\x6e\xee\x22\x2c\x65\x0f\x81\x23\x76\x70\xc8\x6a\x7d\x30\xa1\xb7\xfb\x4d\xcb\x2f\xb6\xd4\x84\x39\x87\x3a\x01\x8b\x6d\x5c\x48\x3b\x54\xcd\x0b\x65\xa5\x83\x84\x5e\xb5\x98\x02\xdf\xd9\x03\xd7\x82\xb3\x88\x3a\x0b\x7c\x3f\xbc\xcf\xd0\x90\xee\x97\xb5\xa6\xd9\xe2\xd5\x50\xe5\x53\x0d\x9f\x3e\xb1\x9c\x3d\x80\xc6\x62\x15\x0e\x73\x11\xfc\x6e\x52\xc1\x42\x25\x8d\xbe\x63\x2e\xaf\x92\xd1\x9e\x15\x1c\xa6\xb4\x65\x3b\xe5\x76\x3c\x54\x78\xb3\xf0\xf2\x36\xa0\x84\x31\x38\x88\x93\x01\x44\x6f\x62\x17\x40\xea\xa3\x98\x8c\x96\x72\x06\x54\x56\x88\x12\x82\xac\xa7\x93\x9f\x06\x4a\x39\x3c\x50\x0b\xbc\xa5\x16\xc3\x54\x10\x5e\xcf\x04\x68\x77\xbe\x9b\x40\xe3\x15\x9e\xf4\x4b\x00\xf8\x7b\xcc\x78\x1a\x41\xfa\x7b\x07\x18\xcb\x58\x10\x1e\xb5\x6e\xd8\x62\x58\x6c\xeb\xd4\x85\x22\x30\x85\x20\x0b\x46\xe9\x1f\xad\xe3\x45\x07\xb2\xca\x19\x7a\x2c\x77\x70\x12\x78\x46\xd3\x17\x7b\xa5\xa7\x9d\x22\x4e\x15\xdd\xd6\xef\xab\x83\xf3\xa1\xfa\x63\xed\xc3\x91\xfa\x6d\x88\x7b\xfd\x75\x1f\x52\x7d\xd7\xa1\xc4\x13\xb8\xce\xce\x0e\xfb\xb7\x16\x9c\xe0\x9e\x36\x98\x0f\xfd\xda\xd9\xec\x2c\xd9\x8e\x3b\xf2\x21\xcc\x27\xad\x12\xe5\x2a\x0e\xa4\x4f\x56\xc5\x78\xff\x33\x09\x32\xd1\x78\xcc\x32\xb0\xdf\x9c\x3b\xe7\x79\x81\x87\xc0\x71\x5e\xfe\x7d\x90\xd3\x34\x66\x41\x58\x80\x83\xfb\x96\x36\x88\x8c\xe3\x79\x14\x61\x11\x79\xd5\xca\x04\xd2\x07\xa4\xc0\x2f\x4f\x74\x18\xa3\xda\xe3\x61\x67\xa5\x00\x2f\xf9\x38\x28\x0b\xc5\x15\x02\xb5\x5b\x00\xdc\x6c\x87\xbe\xdd\xa1\x18\x48\x35\x98\x7c\x06\xde\xdf\x4c\xc5\x91\xb1\xd2\xf1\x10\xc3\xe4\x5b\x98\xfa\xc8\x72\xff\x45\x29\x3b\x7c\x21\x75\x79\x79\xab\x95\x8b\xd8\x01\x35\x2c\x02\x91\xcb\x14\x6b\xee\x96\x75\xb0\x01\x69\xa2\x8c\x83\xca\x17\xa1\x1d\xe3\x13\x11\x8a\xbd\x04\x52\x44\x9d\xac\x4e\x73\x8d\x07\x6d\xc7\x48\x2b\xba\x4e\xea\x33\x94\xf4\xc2\xca\x3c\xb4\xd1\x4b\x75\x0c\x8c\x20\xbb\xa2\xf5\xce\x5e\x54\x1f\x02\xa4\x96\x76\x42\x5c\x09\xf7\x84\x61\x38\xf5\xb3\xbf\x6e\x35\x08\xed\x95\xa3\x71\x2b\x26\x03\x97\x17\x4f\x1f\x4f\x62\x9d\x8e\x2e\x9b\xcc\x7c\x23\xbc\x3d\x04\x67\x48\x6d\x73\x65\xc1\xe4\x6d\x17\xa0\xec\x32\x03\x82\x2a\x7a\x99\x3c\x82\x81\x78\x57\xed\xca\x20\x3d\x58\xb7\x75\xa3\x62\xc1\x26\xde\xa1\x93\xa3\xb8\x33\xd7\xc9\x42\x20\xa6\xd9\x40\x18\xa0\xc8\x72\xb4\x58\xad\xa5\x7c\xc5\x09\x00\xbc\x02\xa8\x80\xf2\xaa\x8d\x26\x64\x63\xf9\x30\x7c\xd2\x68\x67\x38\xdf\x91\xb4\x19\x2e\x36\x44\x9e\x37\x59\x73\x60\x34\x43\xe1\xbe\x63\x2a\x9c\x7b\xed\xb6\xb2\x5f\x96\x8b\xc1\x7b\x85\xc4\xaf\xad\x5c\x57\xd4\x04\xd5\xbb\x03\x75\xa4\x27\x57\x5f\x1c\x90\x8f\x5c\x69\xe7\x02\x9d\xd7\xac\x46\x46\xc8\xa2\x42\xbf\x38\x69\x83\x56\xd2\x7d\x18\xba\xbf\x91\x7a\xa1\x1d\x53\x64\x14\x3b\x9c\x43\xe3\xc4\xc8\xbc\x7b\x91\x82\xae\xac\xc9\x18\xd0\xfa\x69\x31\xe2\x5b\xc5\x03\xa4\x4b\xe7\xcc\x0c\x2a\x6e\xe5\x5e\x5e\x81\x1c\x5d\x51\x99\xdd\xd5\x4d\xc6\x38\x5c\xa2\x2a\x79\x31\x7d\xd2\xfc\x1e\x6c\x98\xdb\x03\x8e\xf3\xee\x1e\xfb\x48\x31\x60\x49\xee\xb3\x71\x48\x98\x5b\x06\x85\x89\xe5\x09\xe1\x49\x21\x66\x74\xce\xac\x11\xc2\xd6\x0d\xd9\x5f\x06\x42\xe0\xa4\x15\x84\x84\x82\x2d\x9f\x30\x78\x7c\xe7\xae\x92\xb6\x31\x42\xed\x61\x44\xb8\x7e\x8f\xd5\x56\x7d\xaa\x1f\x76\x42\x76\xbe\x5d\xd7\x4e\xb8\x54\x7f\x9f\x76\x52\x01\xb8\x0a\xed\x4d\xe5\x31\x22\x96\x79\x78\xda\x3f\x50\xfc\x29\x5f\xc8\x2b\x50\x9a\xf1\x2f\xe4\xab\xb7\x63\xf0\x41\x57\x79\xac\xc9\xd6\x8d\x9e\x6b\x72\x2b\x84\x37\x84\xd9\xd0\xd1\x21\xfc\x96\x12\x65\x5a\x5e\x29\xf6\x2b\x7d\x31\xc6\x86\xc8\x64\xdf\xa6\xfb\xa1\x07\xb5\x1d\xbc\xb2\x6c\xae\xdd\x08\x88\x59\x94\x55\x72\xc0\x4f\x57\x1a\x03\xd0\xc2\x20\x08\x0a\xa2\xb2\x4e\x73\xbc\xd3\x2e\xe9\x28\xa5\x12\xf4\x3b\x47\xb6\xf2\xe9\x0f\x76\x2e\x35\xcf\x7f\x91\x1f\x04\x65\x0a\xfc\x4f\x3f\x1a\xa1\xce\xf8\x20\x88\x8a\xe0\xa6\x2e\x33\x21\x94\x61\x1c\x6f\x68\x78\x95\x75\xd8\x7b\x23\xf8\x06\x82\x14\x3a\x32\xe0\x6f\xef\xaa\x8f\xbe\x86\x00\xab\xd4\x89\x78\x4d\xb3\x63\x41\xb9\xbe\x0b\xfc\x96\x72\x36\x53\x35\x31\x6f\xc9\x02\x2a\x4b\x59\x05\xc0\x3b\x1c\x93\x45\x8c\x59\x5c\x3f\xea\x9f\x21\xa6\x00\x92\x22\x90\xb3\x2c\xc8\x2f\xef\x29\xf4\x5a\x3a\xdf\xfa\x35\x45\xc8\x97\xcb\x42\x6e\x38\xdb\xe1\xba\xeb\x93\x05\xfe\x8e\x7c\xc9\xb5\x16\x71\x27\x77\x0c\x58\x3c\x47\x32\x2f\x8f\xa3\x58\xe2\xeb\xf8\xc6\x4b\x87\x28\x77\x45\x34\xdf\x4c\x2e\x99\xb4\x0a\x39\x3c\x66\xc9\x03\x5b\xca\xf2\x0d\xc9\x62\x8a\x8a\x87\xbb\x59\x82\x38\x9e\x4a\xad\xb3\xe9\x98\xce\xca\xf7\xac\xf6\x23\xa1\x11\x03\x4f\xe7\xf7\xe0\x28\x60\x77\x5d\x0f\x7a\x75\x9f\x19\x44\x10\x60\x49\x5a\x8e\x6a\x52\x40\xf0\x0f\xa7\x81\x0f\x8f\x49\x23\xcd\xa9\x51\xef\xe7\x15\xae\x73\xf4\x10\x10\xd9\xf1\x62\x81\x78\x5c\x80\xb9\x05\x5c\x24\xd2\x67\xaa\x91\x3c\x2b\x78\x3b\xaa\x12\x20\x2d\xe5\xa0\x4c\x65\x04\xa3\x25\x77\x33\x72\xb0\x96\x63\xf1\x44\x54\x04\x69\x6b\x87\x5d\xf7\x8c\x03\x67\x73\x90\x8a\xa5\xb3\x97\x75\x79\xb1\xfc\xac\x42\xa3\xd7\xb2\x69\x70\x88\x9b\x96\x35\x8e\xc1\x6b\x66\xdd\x2d\x60\x54\xe5\x11\xd2\xe3\xd2\xa6\x95\x76\xa6\x45\x25\x30\x4b\xdf\x54\x82\x94\xa6\xe2\xcd\x4e\xa3\x1f\x7d\x6b\x78\x85\xf8\xae\x8b\xf5\xea\x9f\x86\xb8\x9e\x7a\xd2\xe3\xc5\xa8\x4f\x6b\xc3\x63\x68\x3a\xc3\x2a\xa7\x15\x9a\xb5\xa7\xa3\xe7\x2b\x4c\x32\xae\xd5\x58\x27\xb5\x83\x5e\x23\x82\x19\x6e\xf7\x67\x57\x80\x58\x0f\xef\xb4\xce\x52\xc2\x04\x60\xbe\xfc\x24\x42\xbd\xee\x6c\x0c\xa3\x5a\x61\xf0\xb5\xba\x7d\x98\xc4\x2c\x89\x0a\x27\xb1\x58\xd9\x0f\x8c\xd3\x8b\x2c\xba\x09\x62\xc1\xda\x3b\x6c\x70\xf4\xc9\x79\x79\x59\xdb\x99\xd5\x2d\xf9\xec\x6c\x58\x2c\xbd\xfc\xcb\x1a\xa6\x9a\xc2\x2f\x1a\x6a\x32\x2c\x67\x30\x62\xac\x8a\x29\x71\x65\x93\xcd\x53\x04\x7d\x39\xd9\x8d\xbe\x9a\x61\xc8\x85\xef\x6c\x01\x90\x5b\x2c\x40\x00\x5f\x27\xb8\xf1\x56\x41\xf7\x08\x5c\x83\xaf\x4f\x98\x65\x26\x9e\xd0\xce\x4c\xa6\xab\x13\x3a\x5a\xa8\x8a\x5f\xdd\xb0\xe0\xf2\xd4\x81\x5a\xa6\x83\xdf\x40\x27\xbd\xe5\x05\x0e\x06\xdd\x26\x6b\x00\xd7\x8a\x88\xd4\x0f\xf9\xca\x59\x71\x15\x47\x04\x98\xf6\x6e\xf3\x7a\xfe\xa6\xed\x9b\xe5\x58\xc0\x2c\x26\x83\xdf\x85\x2d\x7a\xba\x68\xbf\x52\x1b\x9c\xfa\x70\x5b\xc4\xde\x18\xc2\x47\x61\xbe\xb8\xd0\xb8\x39\xee\x3c\x94\x7d\x08\xa9\x34\x87\x84\xae\xeb\x8b\xc1\x41\x24\x29\x37\xc0\x34\x63\x86\x47\x1b\x44\xfb\x14\xb6\x58\x32\xd7\x2a\x90\x6c\x45\x0e\xe1\xc1\x69\xe8\x58\xe8\xe1\x5b\x09\x57\x7d\xc5\x2f\x50\x97\x44\x42\xe5\xd8\x73\x20\x31\xce\xb9\x66\xeb\x5b\x72\x44\x75\x44\xb1\x1a\x44\x84\x23\xda\x99\x91\xfc\xca\x17\xcf\x82\x2b\x89\x8e\x17\x65\x9b\x34\xe8\xf9\x8b\x8c\x61\x64\x88\xe3\xcd\xc5\x54\xbb\xe6\x77\x97\x31\xfb\xfd\xc7\x12\x32\x63\xfe\x6f\x8d\x14\xd7\x7c\x95\x0e\x7a\x80\xa0\xd6\x9d\x3d\x80\x97\xdc\x0f\x6e\xcf\xe7\x2d\x4f\x80\x64\x00\xe5\x35\xab\x61\x89\xfe\x45\xbf\xd4\x0b\xb9\x40\x2d\x52\xd7\x9a\xc7\xaa\x57\x69\xcb\xd1\xd7\x6b\xea\x24\xd5\x87\x55\x67\x17\xaa\x08\x7b\x8e\xda\x25\x1e\xca\xb2\x2f\xb0\x2f\xaf\xe6\xba\xd4\xbf\xe5\x79\x86\xa7\x69\x96\x65\x66\xa0\x89\xc7\x8f\x13\x55\x22\xfe\x8e\xe6\xee\x0c\x30\xa1\x51\x00\x25\x03\x1d\xe0\x37\xf5\xe7\x93\xa8\x49\xea\xeb\x7d\xda\x8f\xcb\xea\xa4\x44\x00\x77\x44\x5d\xca\x65\x4a\xb1\x9e\x1a\xad\x9d\xe4\x1a\x7d\xf2\x20\x5c\xb9\x93\xe2\x36\xae\x79\x93\x54\x07\x18\xbd\x9f\x83\x9a\x0b\x40\xae\x29\x9b\xb3\x01\x3a\xef\x63\x75\x28\x74\xb3\xfa\xcd\x38\x31\x15\x23\xec\x44\xdf\x18\x67\xb4\x85\xe4\x12\x4e\xca\x43\xa1\x33\xbf\x57\x42\x1a\x01\x43\xb5\xf2\x97\xd7\xa6\xde\xaa\x48\xda\x86\xf8\xca\x53\xc7\x8f\x29\xf7\x72\x30\x77\xde\x8e\x66\xe6\xf7\xee\x5c\xc3\xfb\xc0\xfb\xba\x91\x33\x85\xd9\x0d\x1d\xce\x4b\xf2\xee\xcb\x74\x90\x0b\xee\xa8\x96\xa2\x0c\xb1\xb3\x88\xd7\x36\xe5\xc2\x26\x2b\xdd\xa7\xcb\x1e\x2d\x3a\x09\xb9\x48\xca\x4c\xbb\x51\xc9\xfb\x76\x82\x80\xb6\x82\xcb\xdf\x7a\x0c\x31\x14\xb7\x96\x1c\x2a\x79\xfc\xb1\x45\x75\xb0\xa1\xa2\xc9\x2b\x15\x76\xf5\x0f\xb8\x33\x91\x2d\x1b\x05\x57\xcf\xfc\xd5\x3b\x08\x7a\x67\x4f\xd2\xe6\xd6\x8a\x78\x97\xe1\xc2\x7a\xaf\x18\x3c\x63\x1f\xe2\x57\x0a\x66\x8a\xb6\x6c\x3f\xe4\x4a\xab\x11\x7c\xd0\xc3\x44\xc6\x69\x2c\x6c\xc6\xc7\x8a\xe1\x13\xec\x45\xca\x46\xae\x59\xbc\xc2\x65\x9d\x63\x2e\x23\x9f\x24\xb3\x8b\x46\xc9\xf4\x9f\xfa\x0b\xed\x02\xc1\xa3\x96\x33\xaf\x14\xca\xf2\x86\xca\x6b\x65\xb9\x00\x0f\xc5\x2c\x00\xc7\x2a\xc4\x1a\x30\x93\x65\x31\x7e\x6a\xda\xb0\x81\x8b\xa8\xd1\x6f\x1a\xed\x28\xfa\xce\xc6\xa5\xb5\x0c\xd0\xd7\xc4\x64\x3f\x18\x93\x21\xa7\x3b\xef\x4e\x9f\x43\x8e\x76\x8e\xb8\x82\xa2\x4a\xa1\x88\x7e\x69\x5f\xef\x3a\x19\xff\x5e\xa6\x4e\xdd\xfc\x25\xf5\xd3\xc3\x89\xf4\xd0\x11\xb4\xea\x50\x2b\xed\x40\x82\x6a\xe4\x47\x95\x46\x05\x2d\x99\x07\x61\x98\xbc\x0e\xe8\x11\xb1\x20\xb5\xac\x2e\xae\x60\x49\x03\x8b\x84\x99\xf1\xcd\xc0\xf2\xce\x4b\x9d\x5b\x3b\xb0\xb8\xc0\x22\x7f\x9f\xfa\x3c\xdd\x81\xa1\xf3\x7c\xca\x7c\x7b\x91\x10\x61\x4d\xea\xe4\xc0\xf0\x65\x8e\xb9\x7a\x22\x00\x73\x74\xab\xb0\x2c\x1b\xb0\x4a\xa5\x68\xd0\xf8\xd3\x74\x64\x8b\x99\x31\xc5\xc3\xe1\x2d\x7a\x3f\x88\x88\x43\xd4\xab\x32\xe1\x39\x19\x7a\x1e\x8d\xf0\x5b\x0d\x44\x58\xc1\xba\xaf\x6b\x20\xca\x1f\xc8\x61\x56\x77\xdd\xc1\x55\x38\x7c\x7b\xf2\x04\x1b\x78\xce\x42\xd7\x24\x77\x35\x77\xf9\x2c\x0d\xb4\x78\xe1\xac\xf0\x3a\xc0\x1e\x9f\xcb\x2b\xe5\x47\x47\xdc\x5c\x4a\x08\x68\x1a\x1d\x72\xe9\x84\x41\x2a\x52\xd0\xdf\xf7\x80\xe1\xfa\x83\x39\x36\x93\xf0\x1b\x99\xb1\x9b\x3c\xcc\x7b\x66\x69\x54\x10\x84\xd7\x1c\xba\x5a\x35\x19\x54\x29\xeb\x5c\x9d\x5a\xa5\x02\x3c\x5d\x47\x9b\xb0\x8d\xb5\x85\xf7\x1c\x02\x1c\xae\x0f\xe9\x1e\xf2\x9b\xc4\x6a\x83\x4c\xa7\x3c\xfe\xd5\x26\x32\xea\x45\xf9\xb6\x79\x79\xab\xe5\xc5\xef\x81\xc1\xc2\x5b\x12\x7c\x05\x9f\x4d\x51\x6f\x3f\xe2\x23\x21\x28\x0c\x23\x88\xb5\x47\x04\x96\xe7\x31\xa6\x27\xa8\xd3\xcc\x31\x4d\x8a\x1a\xc3\x24\x32\xe9\x43\x7b\x41\x43\x62\xcf\x3e\x9c\x7d\xb2\x7d\x52\x85\xe2\xb1\xf5\x61\xc6\x5d\x42\x98\xf9\x30\xc1\x90\x6a\x88\xe9\xec\xfa\xe3\x68\x78\xf2\x4b\x39\x5c\x31\x27\xda\xcc\x66\x36\xcb\x2e\x09\xe8\x73\x6c\xa2\x1f\x72\xeb\x04\x26\x8c\x79\x73\x8f\x8f\x80\xc5\x4d\xec\x8b\x47\x35\xa1\xaa\x6f\x8d\x6c\x32\xac\x1d\x5e\x33\x98\xbb\x6d\x3f\xc9\x32\xe5\x2d\xa4\x73\xfd\x14\x35\xb2\xeb\xb8\x0d\x30\x48\x30\x15\x1c\x10\xed\x95\x14\xbb\xc5\xa6\x32\x05\x58\xf6\x2a\x3d\x4a\x6a\x03\x9b\x61\x9d\xac\x4e\x18\xdd\xe3\x04\x43\x55\x9e\x18\xdd\xeb\x31\x02\xd8\x77\xd4\x7b\x21\x06\x44\xb5\xb1\x68\xae\x85\x13\x82\x5e\x8e\xad\xd0\xe4\xb3\xd5\x4f\x4c\xd5\x13\x87\x39\xd0\x2d\xf0\x9b\x15\x40\x1a\xd2\x97\x7d\x35\x72\xd2\x07\xf2\xdc\x5c\xf0\xc8\x78\x3c\x48\x3a\x62\x24\xab\xf2\x0d\x85\xff\x62\x87\x11\x36\xa8\xb7\xe5\xc9\x75\x79\x90\xe0\x94\xb8\x9b\x38\xd3\x73\xe1\x9c\x7d\x1e\x9d\xd9\x55\x62\x30\x73\xea\x83\x0a\x64\x82\xb4\xf2\xc0\xae\x8b\xc0\x09\x23\xbe\xd6\xaa\x69\xa3\xbe\x38\xd6\xa7\xe1\xd2\x11\x12\x68\x59\xdb\x94\x99\x45\x6f\x8b\x5d\xd6\x5e\x06\x8a\xcb\x47\x57\xbf\x29\x53\x53\xa3\x4c\xeb\x5c\xcb\xcf\xf3\x94\xdd\x1b\x25\xb1\x7a\xb7\x97\xa2\xcb\x5e\x26\x38\x19\x4c\xe7\xa9\xdf\x0e\x5c\x04\x64\xe6\x22\x16\x57\xf7\x8e\xb4\xcb\xe0\x7d\x92\x64\x52\xd7\x25\xe7\x12\x86\xbb\x9e\x84\x0c\x3e\x03\x04\xb2\x26\x6b\x23\x9d\xf0\x10\x6c\x36\x0e\x81\x65\x7b\xca\x92\xd9\x8a\xe0\xa9\xbb\x3b\x9a\x6c\x61\x13\x1f\xed\x9a\x8a\x48\xa0\x60\x36\x7a\xfc\x91\x15\xe2\x99\x75\x57\x7b\x67\x4f\x6c\x9f\x60\x67\x27\x1d\x63\x55\xef\xc6\x5c\x78\x9e\x46\xcb\x2e\x72\x81\x41\x86\xd6\x7c\x2a\xbc\x46\xfa\x84\xb1\x7f\x58\xe6\xbc\xc9\xea\x72\xc1\xd6\x50\x36\xa5\xbb\x8d\x06\xcd\x34\xc1\xe3\xf4\x12\x75\x78\x90\x54\xc3\xfa\xd2\x6e\xb1\x8f\x69\xfb\x6c\x3a\x93\x58\x7c\xa9\x55\x1d\x6b\x26\x24\x8a\x7a\x32\x1c\x4d\x96\xcd\x72\x14\x8d\x6f\x28\xea\x7a\xf0\x25\x6e\xaf\xf4\xfb\x3c\xe2\xd2\x56\x47\x86\xb5\xc6\x24\x96\xab\x9c\x0f\xc1\xd5\x52\xc5\x59\x99\xec\x01\x61\xca\xdc\x23\xe7\x8e\x9f\xfb\xe3\x1d\x56\xa6\x50\xcd\x49\xf4\x98\x85\x15\x9f\x57\x13\xd7\x86\x82\x79\x4e\x11\xc6\x89\xae\xa4\x3d\x2b\x57\xfc\x4a\x53\x3f\xf4\x96\xe5\x43\x21\x00\xf4\x52\xc4\x88\x78\xca\xfe\x01\x72\xec\x33\x12\x89\x74\xf1\x22\x4d\x4b\xa1\x32\xd1\x47\xfc\xed\xdf\xdf\x33\xdc\x9e\xdf\x7f\xb4\xeb\xbf\xbf\xbd\xfb\xbf\xff\x62\x73\x44\x66\xf9\xd5\x87\x3d\x9f\x24\xb8\xe3\xbe\x83\x92\x26\xbe\x90\x25\x8c\x2f\xcc\xf4\x66\xf3\xd6\x2c\x5c\x11\x94\x1e\x88\xd4\x5a\xa3\xdb\x7e\x06\x3f\x07\xe8\x6f\x76\xb0\xc8\x62\x35\xf7\xb0\x3e\x38\x0f\x75\x81\xe0\xcb\x16\x90\xaa\x0f\xbc\xa7\x82\x32\x20\xc5\xf0\x84\xee\xd1\x8a\x59\x02\xa0\x5c\x77\x6d\x45\x5e\x6a\xe3\x88\x98\x46\x4e\x10\x87\x83\x13\xeb\xf5\x39\x59\x82\x2a\x3a\xa2\x8c\xf9\x77\x3e\x10\x3a\xf2\x16\x87\xda\x55\x4b\x8c\x4d\x6d\x4e\x10\x3f\x34\xa1\x43\x60\x07\x05\x24\x77\xca\xd0\x58\x64\x01\x0f\x25\xcd\x36\x2c\xed\xe4\x27\x3d\x73\x69\xd2\x37\x27\xd5\x54\xfe\x6b\x0f\xa7\x07\x07\xd9\x77\x74\x5b\x5b\xe0\x08\x5d\xfb\x04\xa2\x63\x2a\x92\x8c\x6f\x34\xaa\xda\x81\x4e\x07\x3e\x67\xde\x5a\x54\xdc\x48\xc3\x0e\xe5\x7c\xc8\xf5\xc7\xda\x04\xe7\xd1\x6f\xcb\x40\xc5\x33\x94\xa4\xcb\x50\xf0\x30\x70\x1e\x39\xeb\xc8\x13\x97\xac\x6d\x6c\xe9\x5b\xc8\x88\xd3\x6d\x61\xff\x62\x2a\x34\x11\x09\xd2\xcf\x19\xc9\x12\xd8\x0e\xc8\x53\x3f\xbb\xf5\xfc\x2a\x4e\xaa\x72\x1d\x9e\x45\x31\x6c\x93\x19\xe3\x80\x55\x6d\x9b\x14\xe1\x5d\x92\xcd\xa4\xce\x96\x2d\x38\xa6\x8f\x96\x77\x44\xfd\x30\xbc\x92\x55\x54\xe3\x2f\xc1\xae\x39\x66\x95\x1a\xe7\x82\x84\x3a\x33\x3a\x89\x66\x54\x29\x78\x42\x2b\xcc\xf0\x95\x77\xf8\x36\x94\xbd\xbd\xa9\xea\xa2\x27\x04\x5f\x95\x8a\x82\xd0\x19\x6c\xa8\x7d\xb3\xc3\x33\x3f\x30\xae\x55\x8e\x55\x3e\x8f\xc7\x3c\x79\x04\xe3\xed\xb6\xd8\x34\x6e\x41\x94\x61\x63\x2f\x83\x0a\xa8\x07\x37\xe2\xee\x7c\x46\x53\x35\x30\xb6\x92\xad\xc6\x25\x2b\x9a\x1c\xdc\x83\x0e\xe4\xc6\xf6\x68\xea\xfa\x58\x74\xa2\xcc\xad\xf2\x01\xe9\x7b\x15\x0d\xc4\x59\xf2\x78\x27\x3a\x35\x56\xd6\x57\x09\x98\x0a\x9b\x1b\x89\xff\x1e\x11\x79\xfa\x78\x01\x79\xc6\x53\x7c\xdc\xa7\xdc\x4f\x16\xeb\x81\x2a\x66\x48\x47\x52\xdc\x6b\x76\x6e\x74\x41\x95\xc2\xf5\xd4\xe4\xae\xc3\xc9\xc6\x88\x9a\xb0\x47\x00\x69\x84\xa9\x57\x90\xfb\x34\xeb\x24\xc5\xa5\x4a\x11\xc1\x59\x21\xda\xed\x6b\xa2\x9b\x17\x02\x6d\xdc\xb0\x15\xbf\x05\x39\xc8\xb5\x12\x26\xaf\x4e\x34\x33\x1e\xbd\x42\x8f\x34\xbf\xce\x14\xaa\x86\x09\x63\x09\x6e\x30\xf5\x98\xd7\xd0\x9b\x85\x9f\x45\x8e\x74\xd8\x96\xd3\x03\x6f\x20\xb5\x91\x38\x8c\x01\x45\x57\x97\x44\x08\xe9\x5c\x71\xe6\x35\x42\x22\xa1\x4b\x12\x8c\xe0\xaa\x17\x2e\x06\x9c\xb9\x63\x8c\x9d\xe5\x22\x85\xab\x63\x1e\xad\xec\x4c\xfd\xa6\xd1\x33\xd2\x4b\xca\xea\x69\x38\x5f\xb3\x6f\x0a\x29\x3f\x56\x50\xa2\x2a\x62\x1a\xbd\xea\x67\x46\x2f\xb9\xa8\xb4\x3e\xe3\xcd\x21\xdf\x01\xae\x0d\xd3\x37\xdb\x6e\xa1\x67\x9f\xd1\xbe\x2e\x9f\xbe\x02\xbc\x6e\x97\xa2\x82\xe2\x1d\x83\x3f\x4e\xc4\x06\xac\x72\xa6\x05\xe4\x8d\x30\xe5\x71\x37\x21\x55\xeb\x86\xc8\x7c\xb3\x4b\x61\x77\x21\xad\x71\xc2\x65\x4f\xc1\x1c\xc9\x30\x15\xad\x14\xcf\xc2\xd4\x14\xc4\x7f\x7f\xe7\xc3\xd6\x62\xfe\x83\x05\x3c\x87\xfe\x2f\xd7\xfb\xfe\xe5\xf7\x44\xa5\x2e\xb0\xbc\x4f\xaf\xf9\xe4\x2c\x3c\x0d\xa9\x3e\x8c\xe2\x9e\x92\x7b\x8a\x0e\x6b\x13\xac\xa8\x20\x25\xb4\xe1\x81\x1c\xbb\xb2\xb8\xdf\x17\xe5\xa8\x6b\x5a\xd7\xcd\xe2\xef\x54\x98\x69\xc1\x85\xdc\x68\x86\xd8\x98\x9c\x65\xba\x79\xf4\x52\x3f\x99\xf1\x1c\x60\x61\x4a\xa8\x23\x44\xb4\x8b\xc8\x28\x92\x22\xa8\x9b\x20\xea\xaf\x0e\x5d\x76\x49\x1c\xa5\xb9\x2d\x44\x0c\x3b\x56\x74\xc1\x96\x42\x77\xdc\x6d\x25\xbd\x17\x27\x48\x20\x93\xf5\x83\x54\x43\xbc\x7e\xb0\xf4\x00\x5e\xb2\x93\x35\xa6\x63\x0b\x9b\x55\x1a\x3c\x3d\x4a\x55\x6f\x1b\xe8\x5b\x5f\x0d\x6b\xd9\x78\xd3\xec\x79\xb2\xbb\xa7\x85\x69\x8f\xa1\x69\x7c\x13\x64\xd1\xd1\x0d\xc8\x80\xc6\xf5\x90\x2e\x1f\x26\xfc\x20\xc2\x33\xdd\x87\x44\xdc\x74\x9f\x9e\xf3\xa2\xda\xea\xa7\x74\x21\x33\x48\xed\x8b\x1f\x38\xfe\x69\x9e\x8f\xe5\x57\xa0\xff\x11\x0d\x08\xde\x8d\xcf\xae\x6a\x7c\x04\x9b\xf2\x83\xa8\x3c\xdd\x0f\x8a\xcd\x69\x61\x0a\xb9\x45\xac\x01\x23\x55\xa1\xba\xd4\x6b\x0a\x26\xc9\xcc\x11\x8d\xce\x1b\x2e\x00\xd7\x67\x9b\xa5\x75\x20\x47\x49\x53\xfd\x09\x56\xd9\x6b\x7b\x33\x9b\xb7\x48\xb4\x5e\x07\xd1\x82\x29\x61\xea\x53\x2d\xc2\x40\xb7\x58\x8e\xfe\x70\xd4\xbc\x93\x66\x12\xf2\xb6\xd7\x5e\x46\xcb\xc7\x96\x50\xc7\xd6\x4c\x69\xf0\xc3\xdb\xcd\x12\xd9\x6c\x67\xee\xe0\x8b\x91\x53\xe5\x8a\x8b\x64\x69\xfc\x87\xd1\x2a\x6f\x60\xf1\x50\xe4\x30\xba\x6f\x66\x46\x16\xd4\x2e\xad\x93\x51\x95\xc4\x48\x63\xb8\xc5\x42\x63\x9e\x83\x0c\x3a\x2d\xb5\x7e\x22\x0d\xf9\xbe\xc4\xb3\xf6\xab\xc7\x95\x7a\x1a\xb9\xbb\x69\x68\x25\xb0\x2a\x2a\xa6\xe2\x3c\x5b\x3f\xf1\x32\xe1\x52\x26\x9e\xbf\x00\xb8\x4b\x9d\x47\xcf\x5d\xee\xd2\xa0\x79\xc5\xb4\x79\x8f\xfb\x95\x7b\x4f\x1b\xd1\x20\x10\xeb\x8b\x22\xb5\x5a\xa5\x53\xcd\x09\xe2\xaf\xbd\xc3\x62\xa5\x27\x32\x0f\x7f\x12\x5f\x6e\x47\x67\x80\x38\xd1\x2c\x87\xfa\x7d\xf2\x02\xf2\x68\x1e\xe6\x5a\x60\x26\x8e\x55\x65\xcd\xb3\x8b\xbb\x83\x2a\x14\x59\x33\x1c\xdd\x1b\xbb\xd3\xaf\xe5\x89\x10\x23\x99\x41\x6e\x47\x8d\xf2\x7a\xa2\x3f\xc5\x1a\x8a\xbe\x1a\xce\xa7\x70\xc7\x57\xce\x4c\xe3\xc8\xe1\xa4\x69\x11\x11\x7f\xe9\xa8\x81\xde\x97\x6e\xde\x19\x69\x47\x3c\x49\x54\xa8\x20\x67\x2f\xd0\x9d\xe5\x30\xd2\x50\xf4\xca\x8a\xfc\x10\x04\x38\x40\x06\xbb\x6c\x6e\xd7\xb1\xee\xb3\xa9\x66\xab\x88\xc8\xd9\x68\x45\x83\x23\xe2\x80\x74\xac\x81\x7b\xc1\x92\xe9\x45\xdb\xde\x45\xa6\x9b\xc3\xbd\x4d\x82\xba\x47\xd3\x8c\x7b\xdf\x66\x8d\x34\x2a\xd8\x33\xcc\x90\x96\xf7\x1d\xe5\x50\x5a\x3e\x63\x42\x18\xa5\xae\xd8\x46\xa6\x92\x09\x6e\x10\x7a\x1b\x10\x63\xf9\xc6\xf9\x9a\x13\xed\xeb\xa2\x34\x43\xb3\x35\xf2\x15\xb7\x1a\x11\xb3\xfc\xf7\xb4\x39\x8a\xfb\x0f\xf6\x17\x06\xd3\x7f\xbf\x10\x01\x75\xe4\xfe\x33\x28\x7a\xaf\x40\xfc\x9e\xb6\x62\xe0\x70\xef\xd1\x56\xa2\xca\x16\x24\xf8\x8a\xd0\x32\x4c\x3e\xc9\xdd\xca\x71\xd2\x11\x2a\x0d\xfa\x1d\xa5\x3d\x04\x24\xb6\x0d\x50\x88\xb4\x40\x6b\x90\x5c\x3b\x61\x6d\x7b\xaa\x65\xa5\x29\xab\xa6\x61\x64\xd6\xb5\x0e\x98\x1a\xa4\x72\xcc\x08\x5d\xca\x00\xbd\xe7\x59\x35\xbf\xe3\x17\xa3\xb0\xb7\x04\x32\x02\x21\x46\x0e\x4f\x27\x23\x7a\x6f\x45\x63\xf1\x6f\x7d\x15\x2d\x51\x80\x30\x2a\x75\x06\x41\x50\x1b\x21\xe2\x83\xde\x66\xfc\x55\xaa\x31\xfc\x01\xc0\x1c\x28\x06\xc0\x4e\x93\x2a\x11\x8a\x13\x26\x17\x7e\x8e\xaf\x57\xad\x90\x38\xeb\x16\xd6\x94\x3e\x63\xe9\x90\xb5\x93\xc9\xf9\x53\x33\x05\xae\x2c\xae\x88\x98\xe5\xe3\xba\x85\xb6\x5e\x42\x7d\xa6\x6a\xfe\x50\xe0\xdd\x60\x56\xd5\x87\x1a\xf4\x88\xca\xa6\x72\x59\x16\x47\x84\xc6\xc9\xf4\x15\x48\xb3\x53\x16\x6b\xc0\xd4\x80\xfd\x25\xc7\x06\xf5\x9e\xde\xe7\x6d\x52\x8f\x70\x53\x6a\xa1\xc3\x99\x3d\x15\xaa\xef\xb7\x74\x87\x60\xf3\xf6\x71\xe2\x2f\x03\x59\x8b\x15\x47\x5b\xfe\xb9\x9b\x01\x07\xa5\x07\x27\xb8\x30\x91\xf8\xfb\x54\x42\xa4\xbd\x08\x36\x24\xc3\xb6\x34\x6c\x2f\xe7\x7a\x63\xaa\x6b\x0f\x2d\x69\xbf\x95\x35\xd6\x4c\x07\xca\xff\x3c\xf2\xa2\xc2\x42\x15\xed\x40\x3c\x6c\x71\x76\xa2\xbd\x44\x7e\x53\xec\x98\x43\x8e\x00\x6a\x5f\x6f\x65\xdb\x4a\xc8\xa5\xe0\x2a\xd2\x73\x23\xd3\xc3\x32\x37\xbb\x9d\x0e\x1d\x1d\x02\xa2\x42\x97\xc3\x90\xb8\x9e\x39\x40\x8e\x74\xda\x6c\x01\x97\x79\x29\xa4\x8c\x9b\x17\x9b\x24\x1f\xa5\xcd\x4f\x29\xe6\xfd\x23\xc5\x72\x27\xc7\xdd\x2a\x13\xe2\x53\x8f\x2a\xc5\xc6\xe1\x03\xd0\x4d\x85\xcf\x1f\x40\xb2\xe8\x08\x82\x10\x3a\x13\x48\xda\xdf\x45\xb1\xd4\x02\x91\x0a\x5d\x03\xd5\xb5\x18\xcb\x34\x28\xa0\x9b\x7b\x72\xd1\xd7\x1f\x4c\x89\xe6\x9c\x46\x9f\x90\xfa\x95\x68\xf0\xae\x0a\x2e\x10\xda\xf4\x5b\x91\x12\x42\x13\x9d\x3a\x86\x50\x37\xf1\x99\x99\xbb\x07\xf8\xf4\x95\x2d\xc6\x95\xd1\x7e\x4f\x84\x7c\x27\x27\x64\x49\x26\x56\x38\x5b\x35\xfa\x4b\xe4\x7d\xc8\x57\x7c\x51\x87\x1e\xb4\x9d\x68\xd3\xf8\x6c\x73\x98\xde\xf8\xf6\x95\x0a\xee\x73\xd8\x72\x24\x7a\xec\xed\x3b\x76\xcf\xed\x9f\x92\x25\xd7\xf2\xcc\xb8\x71\x1b\x14\x20\x37\x12\xad\x9a\xe8\x0d\xa7\x7d\x2d\x36\x15\x85\x08\xf2\x9a\xef\xbc\xc7\x25\x45\x65\x66\xca\xde\x61\x32\x5f\xe5\xdc\x73\xe6\x98\x0b\x16\x5f\x6b\xb1\xdc\x8f\x51\x25\xf1\xe2\x19\xf5\x2e\x58\x9e\xeb\xa9\xa3\xef\xfa\xc1\x77\xae\x1e\xec\x13\x69\xbe\x3a\xd7\xc4\xb6\xa8\x51\x47\xa3\xf4\xc7\xc9\xf8\xd2\xc5\xf1\x73\xc0\x3a\x16\x01\xa6\xb2\xc6\xc3\x17\xa3\x04\x0b\x4b\xe7\xee\xe4\x51\x2b\x40\x74\x8c\x9e\xa7\x67\x5a\xeb\x9e\xa2\x19\x59\x1d\x85\xea\x9b\xbb\x46\x0d\x7f\x3b\x45\xc4\x03\xa7\xa4\x0a\x9b\x51\xf6\x41\xb8\x34\x4e\x19\xd6\xc6\x7b\x8b\xc4\xe8\xa2\xf3\xcc\xc2\x5f\x7c\x18\xd9\xff\x4a\x78\xf6\x8b\x4e\xe8\x7e\x4f\x79\x52\xf6\xe7\x1f\x4b\x9e\x0c\xfb\x5f\x7c\x98\xfe\xe7\x5f\x1e\x78\x66\xba\x6d\x5a\xe4\xb1\x61\x3e\x27\x2c\x55\x05\x93\xe3\x56\xf4\x23\x34\x55\x63\x8b\x11\xa0\xb6\xe7\x71\xb8\x2b\x88\xd2\x28\xaa\x9b\x60\x75\x83\x95\x1e\x95\x97\xbc\x25\x23\x64\xb7\x72\x2b\x36\x8a\x1c\x57\x8e\x2c\x0a\xf2\x14\x3a\x1c\xb4\x23\x31\x92\x8f\x39\x01\xbd\xb3\xec\x26\xef\x11\x0f\xca\x6b\xfe\x0c\xee\x0e\x89\xce\x5b\x16\x7b\x23\xed\x8d\x53\x8e\x8f\x24\x88\x1a\xe8\x77\xb1\xcf\x4e\xa5\xde\x26\x32\xc0\x28\xcc\x4d\x28\xe2\x58\x0f\xdc\x81\x91\xfd\xe4\x67\xbe\xe1\xc4\x48\x26\x38\xd2\x01\x82\xed\x8c\x44\x0f\xa6\x79\x85\xed\xf9\x46\x1f\x3a\x52\x17\x20\x76\x15\x1c\x4b\x9e\x5a\xbe\x98\x5a\x25\xcb\x73\x9a\xc0\x63\x73\xdc\x18\x3c\x54\x20\xc8\x2d\xfd\x16\x39\x15\xd2\xbc\xbb\x41\x0c\xd9\xfb\x45\x38\x05\x01\x98\x87\xd5\x2a\x96\x91\xd0\xda\x10\x78\x81\xc8\xb8\xf9\x35\x59\xfb\x31\xe6\xa4\xd0\xc4\xd0\xc9\x60\x53\x43\xa4\x74\x0c\x90\x30\xb1\x2d\xd6\xe4\xab\x40\x86\xf5\xcd\xf6\x69\x7f\x59\xaf\x34\xa4\x52\xe9\x4e\x6b\x43\x9d\x1b\x05\x4c\xdf\x99\x33\x56\xb8\xc3\x49\x1f\x66\x76\xfb\xfb\xea\xfb\xc2\xf1\x8b\x59\xb4\x11\x88\xbe\x8e\xd8\xa6\x18\xca\xe8\xd0\x60\x91\x1d\x7a\x6f\xdc\x24\xeb\xc9\x11\xde\xe3\x12\x19\x1c\x61\x0e\x97\x93\x99\xc8\x27\x87\x1c\x07\x2c\xe8\xa3\xfe\xf4\xeb\xd4\x0b\xb3\xcc\x58\x5f\xeb\x82\xe7\x45\xc9\x97\x8d\xee\xe5\xac\x60\x3e\xb4\xc2\xca\x5d\xc7\x83\x42\xbc\x75\x21\x67\xf9\x76\x78\xe1\x72\x24\x35\x3c\x34\x32\x7c\x96\x98\xa1\xe3\x9c\xca\x28\x5e\x41\x67\x85\x34\x8f\x26\x19\x5d\xa7\xb7\xa9\x2b\xb3\x91\x4b\x57\x31\xe9\x75\x46\xa5\xb0\x40\xbe\x97\xda\xbc\x69\xde\x3f\xa6\xe6\x4b\x84\xa5\x55\x80\xa2\x32\xd1\x3b\x4d\xeb\xfd\xb6\x2f\x32\xd9\xaf\x37\xb9\x53\xc2\x5f\x94\xfa\x18\x64\x68\x05\x18\xcd\x63\xed\x2a\xb8\x38\x9d\xd2\x91\xef\x7f\x6f\x36\x86\xd4\x04\x71\x26\x80\x73\x5c\x7a\xe2\x9a\xa2\xc5\x9e\xcb\x7d\x9c\xb4\xdf\x3e\x06\xcf\x4d\x69\x2d\xf4\x7a\x16\xde\xab\x74\x01\x74\x2a\x7f\xf9\xf6\x1b\x56\x29\xf1\xe0\xcc\x98\x6b\x75\x47\x66\x76\x27\x49\x29\x47\x54\x68\xc5\xd7\x8d\x22\xdc\x5b\x5e\xaf\xdc\x92\x24\x03\x93\x70\xaa\x5a\xac\xa2\xe8\xa8\x97\x29\x53\x9d\x4d\xf1\x31\x9b\x7c\x69\xec\x48\x79\x82\xc6\x36\x52\x16\xea\x6d\xbd\xad\xae\x52\xea\x78\x4a\x40\x08\xbf\x59\xec\xb6\x5f\xf8\x04\x10\xc6\x68\x85\x3e\x5d\x32\xb1\x5f\x8e\x7b\x9b\xc6\xdc\xa5\xce\x08\x80\x67\x5a\xc9\x8b\xd8\xc6\x4b\x19\xc1\x30\xb6\xb2\xd8\x2f\x4c\xa3\xc6\xe7\x22\xaa\xce\x22\xb2\x5c\xf3\x0c\x5a\xcd\x6b\x1f\x3f\x04\xe7\x44\xba\x1c\x1c\xc9\xc1\xc5\xc9\x82\x25\x73\x35\xd0\xc6\x08\x15\xb6\xb2\x88\xad\x9a\x18\x7d\x7f\x87\x40\xda\x8a\xe8\xad\xc4\x2a\xc0\x39\x8b\xb9\xb0\x7e\xd7\x73\xd2\xaa\xf9\x83\x9d\x73\x0c\xfe\x6f\x7c\x92\x5f\x6d\x0e\x70\x5f\xe7\x9e\x5e\x7a\x0d\xea\x93\xe6\x42\xa1\x9b\x76\x98\x87\x57\xe4\x58\x10\xfd\xd1\x39\xdb\x4f\x0b\x54\xc1\xfd\x0d\x95\x85\xf0\xd7\x74\xbd\x04\xa2\xfe\x40\x99\xf3\xad\x75\x5b\x9a\x5a\xfe\xa0\x59\x9f\x51\x07\x09\x77\x14\xeb\x51\x8a\xd0\xbe\xdf\xf7\xa4\xf2\x27\x36\x1b\x76\xff\x62\xbd\x5e\x90\x24\x86\xbc\x63\x49\x61\xc8\x9d\x65\x68\xfd\xee\xdc\x1b\x7f\x00\x16\x2f\x2d\x5d\xa2\xcb\x1c\x05\x75\x46\x10\x81\x19\xaf\xc1\x11\x35\xe8\x82\x9e\xc4\xaf\x3b\x35\x60\x61\x0c\x00\x8d\x41\x9a\x6a\x27\x5a\x8d\x27\xc3\xb4\x3f\xf0\xe9\xcf\x71\x3e\xed\xdf\x30\xcb\x74\x5e\x45\xb4\x2b\xbe\x13\x38\xdd\x38\x27\x5f\xe9\xa5\x30\x4f\x70\xd0\x74\x6c\x77\x72\xfd\x8a\x98\xff\x3f\x7b\x6f\xde\xbb\x38\xb2\x2c\x88\x7e\x15\x34\xd2\x55\xbd\x11\x03\xde\xb7\xf7\xd4\x7f\x78\xc7\x78\xc1\x2b\xb6\xf9\xe7\xca\x1b\xb6\xf1\x06\x78\xf7\xa7\x7f\xb2\xf9\x55\x55\x9f\xd3\xdd\x73\xce\xd5\xed\x91\x7a\xa4\x2e\xf1\xcb\x32\x99\x91\x91\x91\xb1\x65\x44\x60\x8c\xff\x9a\x87\x91\x5a\xe2\xcc\xa9\x01\x05\xa3\x74\xf4\x22\x76\x22\xf9\x2a\x6f\x6c\x73\x82\x31\x14\xe0\x62\x36\x36\x18\x76\x7a\xdd\xfa\x7d\x9f\xbe\x6a\xb7\x71\xa9\x76\xd4\xb0\x24\x7b\xc2\x5a\xd3\xa5\x52\x83\x87\xa2\xe1\x8a\x5d\x60\x91\xfb\xc1\xc0\xae\x54\x00\xf6\x98\xb5\x87\xd2\x3b\xcd\xf0\x79\x49\xbf\x62\x27\xad\x28\xf2\xc4\x8d\x8e\x51\x70\x36\x79\xf6\x1a\x5d\x7f\xed\x99\x46\xc5\x0a\xd6\xaf\x04\x9b\x7a\xbc\xe7\x1a\xda\x67\x05\xdd\x11\x59\xc2\x4c\x64\x9c\x85\xd6\x48\xb3\x95\x4d\x3b\xa3\x9d\xc6\xe5\x0d\x60\xaf\xf2\x39\x50\x6a\x09\x12\x39\xd2\xce\x8b\x5b\xae\x5b\x26\x29\x4e\x79\x48\x46\xd9\x89\xc2\xaa\x9b\x3d\xa5\xa3\x7b\x1a\x4f\xc4\x3e\x15\xd4\x76\x7c\x45\x4d\x21\x99\xe1\x43\xbd\xc0\x27\x8e\xad\x6f\xd0\x75\xa0\xdf\xcf\x07\x5f\xd5\xf2\x2d\x22\xf7\xd1\xed\x7c\xf6\xc5\x56\x69\xd5\xfc\x46\xd2\xe9\xc8\xbf\x02\x1f\x57\x43\xdc\x34\x4c\x04\x39\x0b\x99\xc8\xb3\x0b\x6b\xce\x77\x5a\xf0\xb4\x9e\x1a\xf6\xe6\x55\x33\x6f\xae\xa4\xf6\xdc\x59\xeb\x7d\x95\x0e\xb8\x39\x72\x04\x31\x63\x2f\x69\xd7\xd3\x9d\x70\xe5\x68\x12\x11\x31\x9a\xb4\xdf\x02\x37\xee\x05\xcc\x50\xe9\x89\x96\xcf\xe7\x69\x81\xa7\xda\x45\x4c\xfd\x2c\x86\xd5\xfe\xcd\xce\x8f\xa6\xbb\x25\xdd\x09\xe5\xc4\x25\xb0\xac\x84\xa3\x91\x0c\xbd\x95\xa8\x09\x9e\x2f\xfc\xcd\xb5\x9f\xd2\x22\xa0\x35\x50\x51\x14\x16\x6a\xf1\xeb\x36\x32\x78\x05\xa6\xc2\xbd\x43\xe8\x02\x1f\x96\xbd\xec\xbb\xa3\xd0\x8a\xe5\x4b\x9a\x3c\xa9\xe3\x23\xae\x83\x68\x53\xe5\x3b\x39\xbe\xa6\xb7\x70\x7f\x1f\x69\x50\x84\x59\x38\xf3\x54\xf0\x66\xdf\x34\x33\xb2\xee\x60\x08\x3d\x2b\x2f\x27\x7a\xbf\x7e\x48\x7b\xe5\x1e\xd4\x15\x76\x37\x8d\x56\x26\x19\x69\x92\xa3\xb7\x4c\xe4\x40\x2f\xa5\xfa\xde\x1e\xf7\x42\x69\xf2\xaf\x93\x86\xdd\x27\x60\x98\x1d\xb4\x3f\x31\x3c\xee\x5c\xd0\x94\x73\x5f\x05\x70\x16\x02\xa5\x57\xa7\xc8\x4b\x84\x02\xb7\xfb\x33\x05\x5e\xc1\xd3\xa5\x80\xf2\x9a\x38\x93\x34\xfd\xa8\xd2\x42\xbf\x3f\x9c\x7d\xde\xfe\xa9\xbe\x21\xfb\x6b\x79\x86\xd0\xfc\x79\x8b\x66\x01\x29\x23\x48\x1b\xf5\x1d\x1c\x1b\x19\xec\xba\xeb\xeb\x09\x66\xe3\xeb\xca\x96\x7b\x87\xe1\x4d\x9b\x42\x05\x62\x22\x48\xf6\x8e\x3a\x0b\x44\x50\x9c\x0d\xa1\x02\xe9\x86\xfe\xa9\x33\x0b\xc6\x37\x15\xed\xc5\x75\x71\xa0\xdf\x94\x4b\xd8\x2b\x2d\xa4\x89\xa5\x17\xb9\xdc\xf9\x26\x86\xc9\xbc\x9f\x08\xc3\xe1\x8d\x54\x7a\xd9\x20\xa1\x2b\x98\x2b\x67\x27\x05\x3b\xa1\xf8\x79\x0f\xc3\x2f\x18\x1e\x5a\xf7\x19\xba\x63\x5c\x9b\x68\x73\x26\x41\x45\xcb\x17\x38\x5a\x44\xe7\xc1\x6b\xd9\xf0\x40\xa3\x4e\xe2\x51\xf7\xfd\x20\xbd\x4a\x77\x4a\x59\xa1\x6a\xd6\x8f\x2e\xc2\xc2\x53\x0f\xe8\x22\x5b\x36\x1b\x3f\xe2\x77\x97\x2b\xf1\x9b\x90\xb3\x6b\xba\xf0\xc3\xe8\xe2\xc5\x9b\xa5\x60\x1e\x2f\x50\x39\xa6\xc2\x73\x87\x11\xe7\x2b\x36\x08\x32\x2c\xdf\x4d\xc3\xbc\xee\x4d\x5a\x2d\x96\x29\x2d\x7d\x09\x32\x03\x6e\x86\x63\x17\x7a\x3f\x5d\xf3\x61\x34\xd8\x55\xcc\x23\x5f\x6a\xde\xee\xb5\x69\x84\xc1\xb8\xb2\x2c\xfd\x10\xc9\x4b\x35\x42\x6a\x2a\x92\xb4\x0a\xf6\x16\xe3\x70\x56\xcd\xde\x0b\x40\x12\xd9\xd3\x78\x47\x38\x96\x03\x08\x27\xbb\x28\xcc\x5b\x28\xb8\x3e\x79\x02\x19\xe7\x58\x16\x3b\x40\xb9\xdf\xa0\x6f\xe9\xfe\x12\xc7\xca\xb1\xb4\xf3\xe3\xee\x87\x4c\x64\xc8\xd9\x6d\x04\x03\x46\xa5\x51\x06\x25\x95\x91\xc9\x98\x0e\x88\x2e\x1a\x09\x9e\x2a\x95\xd2\x0c\xfc\xee\xa5\x80\x5b\x16\x3d\x6a\x8f\x95\xe6\x72\x4b\x60\xbc\x96\x93\xb8\x07\x75\x4b\x6e\x62\x2c\x3a\x61\xd7\x0c\x36\x73\x3a\xf3\xe5\x88\xe4\xca\x2b\xe4\xe8\xd6\xdc\x0b\xaa\x38\xa7\xd7\x52\x4d\x21\x40\xc7\x19\x16\xe7\x5e\x9e\x21\x93\x0f\xed\xc6\x79\xb4\x4f\x43\x77\x18\xba\x22\xe8\xa8\x7a\xbe\x10\xe4\xf3\x75\x04\xdf\xe7\x79\x51\xd2\x16\xb9\xaa\xc5\x74\x79\x88\x5d\x3e\x01\x57\xd0\x73\xd9\xec\x06\x46\x12\x9c\x03\xf1\x32\x78\xf1\xdd\x8e\x41\xe3\x4e\x41\x8c\xaa\xbf\xb3\x59\x5b\x52\xf9\x7e\xa9\xa6\xc0\x9d\x9f\xaf\x80\xf3\x4e\xdb\x23\x08\x3b\x56\x21\xbd\xcb\x5d\x40\x89\x3f\xf7\x01\x63\xd9\x5f\xed\x2b\x45\x49\xf6\xeb\xaf\xe8\x0d\x20\x48\x3b\x27\x19\xf0\xe4\x3b\x34\xdf\x62\xde\xba\x9a\x8c\xf7\x30\x2d\x53\x78\xa9\xc6\x95\xa1\x31\x29\xc2\x24\x84\xab\x47\x1e\x48\x9f\xb5\x52\xcf\x22\xa2\xa4\x5e\x5a\x4e\xa8\xc3\x71\xca\xcd\x02\x4d\xb7\xe0\x94\xdc\x9c\xac\xbe\x2d\xa8\x1e\x17\x3d\x2b\xa9\xc2\x4a\x49\xdd\x5b\xe8\x11\x7b\x38\xac\x6f\x25\x05\x57\x29\x98\x36\x0d\x12\x22\xf7\xfb\x05\xa8\xa3\x78\x98\xef\x8f\x53\x72\xc7\x5f\x30\x57\x0e\x2d\x69\xc0\x45\xb7\xbc\x21\x7c\x6f\x29\x38\xf8\xc8\xb2\x1b\x4e\x85\x17\xd2\x23\xd9\x52\x61\x89\x91\xf2\x62\xf9\x7c\x15\xc9\x7b\xaf\x82\x6f\xc8\x7d\x9f\x45\x34\xf5\x1e\xe9\xcb\x81\x38\x50\x15\x23\xb8\x60\xec\xb9\x2b\xf7\x44\x40\x79\x95\x1b\x95\x90\xc4\x00\xd9\x4d\xe6\xb3\x28\x7a\x61\xc1\xf9\x0c\x24\x48\x68\xf7\x84\x9b\x42\xec\xb5\x21\xde\x9a\x52\x9a\x99\x93\xa1\x8d\x5a\x7b\x0d\xd7\xcc\x59\x73\x12\x67\xb7\x72\x92\xbd\xe1\x84\xbc\x22\x05\x84\x4b\xb2\x0f\x5a\x28\xd5\x25\x5e\x92\xa8\x60\x47\x41\x03\x71\xda\xa6\x6b\xd2\xa8\x38\x55\x55\xc5\x52\xed\x47\xb7\x8f\x9e\x0d\x7b\xd2\x12\xf4\xc1\x14\xb4\x9a\xd4\x0f\x7f\x30\x75\x7b\xce\x31\xe4\x3c\xf4\xa3\x47\xd2\xcf\xb2\x4c\xe8\x84\x89\x4c\xe1\x7d\xc2\xdf\x9e\x34\x29\x79\x45\x49\xc0\x33\x47\x0c\x1a\x32\x33\x39\xf0\xa7\xf8\x51\x68\xa4\x34\x06\x25\xab\x4a\xa3\xdb\x52\xe5\x43\x2d\x32\x70\x5c\x8a\x3d\xa5\x12\x23\x44\x50\x2c\xa2\xdc\x34\x6f\x1a\x12\x38\xdb\x47\xc8\xa9\xa7\xa0\x53\x22\x57\x1c\x80\x2f\xa7\x8b\x52\x8f\x24\x92\x97\x0c\x04\x5c\x41\x36\x79\x39\x88\x41\x42\x0a\x0b\x5c\x50\x28\x84\x99\x6e\x82\x35\xf8\x7c\xd5\xe1\x77\x6e\x92\x89\xed\x4c\x55\x0e\xda\x0b\x33\xbe\xe5\x9b\xda\xbe\xd4\x66\x21\xd5\x96\xcb\x00\xce\xed\xdd\xcc\x61\x64\xc7\x54\xe4\xc9\x90\x92\x8b\xea\x36\xcf\xce\xd7\x6b\x0b\x8a\xf6\x92\x76\x63\x8a\x51\xb2\x9a\xea\x62\xb5\x15\x73\xb3\x08\x66\x8f\xb8\x97\xe5\x36\xbc\x65\x71\x29\x54\x3a\x17\x5f\xda\x4c\xa4\x7b\xa5\x32\x0b\xf3\x9e\x14\x4c\x4d\x6b\x33\x0c\xe1\x88\x7e\xf3\xde\x56\xf8\x36\xf0\x21\xca\x20\xca\x5b\xc8\xbb\xce\x9d\x66\x05\xa1\x8c\xa5\x38\x31\x72\x12\x7b\x8f\x7b\xbf\x9f\x11\x9a\x16\x1d\x84\x90\x34\xe6\xdc\x35\x7f\xea\x03\xba\xb6\x1f\x51\xf8\x4b\x19\x5d\xf5\xab\xe7\xd6\x16\x5f\xe1\x6b\xe5\xe3\x20\x16\xec\xb3\xec\x66\x33\x9a\x6c\x72\xf4\x53\x7b\xbb\x92\x49\xa3\x35\xcf\x38\xb7\xb8\x62\x53\x45\xcb\x51\x55\xc6\xee\x7b\x41\x8b\x7b\x24\x14\x06\xe8\x0c\xf1\xde\x85\x63\x4d\xe8\x7c\xb6\x54\x7b\x7c\xbe\x1c\x1d\xd7\x72\xf6\x99\x40\xe0\xed\xb1\x20\xd9\x03\x53\x2b\x24\xb7\xe6\xb0\x44\x88\x47\x7d\xdf\x47\x18\xf2\xa8\xb8\x50\x7b\xe6\x54\x12\xee\x71\xa1\x8b\xf2\x36\x09\x28\x90\x0a\x5d\x6d\xd1\x42\x3c\x1e\x17\xcb\x93\x8b\x4c\xea\x80\x37\x84\xee\x31\x08\x7b\x31\xaf\x8a\xa3\xc9\xd3\xf3\x25\x07\x69\x86\x21\x5e\xd0\x3c\xc3\xf2\x29\x85\xc9\xbe\xa8\xb9\xa7\x40\x67\x7a\x10\xc2\xdc\x08\xda\xf2\x60\xca\x44\x59\x69\x17\x6e\x49\x74\x26\xbd\x95\x32\xd5\x38\xae\xf5\xac\xae\x5a\xfc\x94\x1c\xd2\xde\x3f\x02\xb5\x9d\xd5\x80\x43\x55\x2e\xba\x5d\x83\xbd\x96\x9d\x55\x0d\x04\x47\xb0\xc6\xaf\x70\xad\x21\xb3\x91\xc6\x27\xf7\x16\xa4\x7b\x65\xf1\x75\xbb\xa9\x24\xba\xb3\x41\xfb\x74\xed\x74\x31\xa8\xab\x10\x60\xc2\xc7\xa8\x08\xc5\x50\xc3\x52\xd7\xf9\xa2\xff\x2c\xe5\x99\x5b\xda\x53\x46\xa4\x71\x35\xd3\xee\x3d\xc3\x96\xeb\x0b\x14\xfb\x2c\x45\x4d\xfa\x24\x38\x59\x75\x1f\x5e\xc8\x03\x42\xd0\xc0\x6b\xc8\x30\xde\x4b\x76\xad\x0a\x97\x4b\x33\x38\xd8\x23\x14\xcd\xe6\x36\x6a\x93\x50\x43\xd1\xd4\xd3\x52\xc4\xb9\x40\x7b\xe3\x1e\x34\x10\xa1\xfd\x9e\xd1\xa6\xcb\x79\x9e\x5e\x41\x52\x3f\x25\x64\x21\xc9\x54\xbd\xeb\x35\x75\x1a\x28\xf2\x64\xdc\x2c\xdc\x0c\x16\x17\x2f\x1e\xfc\x34\x08\x39\x69\x8b\x31\x67\xcd\x80\x0b\xf2\xd5\x1d\x55\x2c\xdc\x24\xdb\x01\x82\x98\xea\xbe\x58\x63\xa1\x47\x15\x81\x9e\x1b\x8a\xcf\x41\xf1\x96\x56\xc5\x48\x1a\xec\x25\x68\xc8\x8b\x17\x05\x0b\x80\x0d\xd6\xad\xd6\xe3\xfa\x89\xd0\xcf\x17\xc3\x28\x85\x7b\xe6\x41\x36\x27\x68\x6b\x09\xa5\x8c\x55\x14\x03\xe2\xc1\xfc\x52\x30\x5c\x46\x69\x4f\x27\xcd\x9d\xe4\xd1\x90\x8d\xd6\x9f\xc7\xb9\x06\x7d\x9d\x66\xba\x1a\x83\x1c\x5f\x10\xf2\x41\x44\x66\x46\x64\xb5\x5b\xd1\x73\x5d\x04\xa8\xee\xfe\x66\x48\xc8\xe5\xed\x3f\x99\x80\x36\x59\xb9\xbf\x17\x08\x83\x79\x52\xee\xce\x59\xae\x60\x17\xee\x49\xee\x85\xbb\x70\x3a\xed\xe5\x5c\xb6\x5e\xae\xec\x28\xe4\x9d\x05\xb4\xa5\x16\x4b\x9d\xa9\x96\x3d\x8c\xc6\xb7\x87\x5c\x73\x20\x7b\xe6\x22\xb5\x99\x5d\xd0\x7a\x79\xbd\xda\x9d\x18\x61\x24\xde\x99\x44\x73\x10\xff\xd6\x1c\x2d\xb8\x4f\x32\xa3\x25\x43\xf0\x1c\x7b\x1c\xd3\x9e\xbc\x81\x0a\x2f\x4f\xa2\xf7\xa6\x1a\xe3\xd7\x91\xd1\x91\x48\xb7\x78\x33\xc4\x53\x45\x12\xa4\x17\x0e\xed\x9d\x97\xe8\x06\x42\x1c\xbd\xaf\x1d\x50\x56\x74\xef\x3e\xe8\x1c\x0e\x72\x55\x18\xab\x8b\xdf\x4b\x67\x40\xc3\x55\x98\x1c\x46\x49\xa5\xd5\x46\xe3\xe6\x14\x7d\x47\x0e\xf5\x67\x3a\x85\x3c\xfa\x8b\x7d\xcc\x96\x99\xbf\xf2\x09\xc2\x8f\xef\xf6\xc6\xef\x80\x08\x15\xed\x99\xc3\xf4\x64\x08\x72\x50\x16\xe7\x77\x93\x49\x6c\xee\x17\x9e\x1e\xa4\xde\x7b\x22\x48\xee\x8e\xca\x28\x29\x72\xcc\x52\x19\x89\xae\xa8\x99\x73\xe1\xb4\xc9\xc0\xa2\x9c\x2f\xce\xd7\x17\xd7\x9d\xc5\x4a\x75\xdf\x2c\x6d\x9b\x61\x0c\x27\x51\x63\x61\x3d\x12\x34\x43\x95\x2c\xed\xd0\x53\xdb\x2d\xc9\x7a\x2e\x97\x99\x84\x7a\x0a\x11\xc1\x6f\xcc\x57\x48\x48\x91\x78\x85\x4f\x33\x85\x46\x7a\xa0\x8f\xa7\xea\x54\xeb\xd5\x5d\x74\x01\xb7\x1f\xf6\xca\x73\x1c\xe3\x3a\x31\x7d\x66\x22\xf4\xc4\x95\xc1\xf1\xe2\xfb\x59\xe4\x4d\x73\x54\x88\x57\xe8\x1e\x87\x75\xd8\xab\xad\x17\x15\xe5\x4b\x37\xcf\xc6\x24\xa8\xf2\x82\x9a\x13\xc7\x76\xd7\x0b\xda\x22\x53\x69\x3e\xdc\x86\x01\x05\xff\x51\x1a\x3a\xcf\x33\x79\xc2\x66\xa3\xcc\x9a\xa2\x3a\x61\xbd\xd2\x05\x72\x0b\xe9\x58\x92\x93\x92\x5c\x8a\x01\xe0\x17\x9e\xea\xf9\x5d\x69\xf3\x5c\xd9\xd6\x23\x50\xa9\x5e\xc6\x9c\xa3\xd7\x64\xc9\xf8\x50\x46\xcf\x00\xd5\xf9\x27\xdb\x34\xce\x2c\xbd\x5a\x4c\xc5\x33\x11\x6a\x60\xd6\x19\x5f\x34\x48\x41\x91\x10\xf9\xca\x1d\x68\x1f\x4b\xe4\x11\x18\x9f\x1b\x52\xf3\x90\x28\x82\xa0\x58\xdb\x37\xd1\xc7\x68\x33\xf7\xfd\x9b\x10\xe9\x31\x03\xe9\x89\xcd\x15\xfc\xac\xda\x00\x88\x0e\x06\x41\xf5\x64\x20\xc1\x17\x80\x38\x2f\x29\x4e\x35\xb8\xd8\x90\xc9\x38\x47\x4e\x90\x75\xcc\x93\xe6\xb2\x93\xac\xd4\x32\x90\x5c\xc3\x42\x8d\x3b\xf3\xe2\x4a\x03\x09\x6a\x06\xdc\xea\x59\x1d\xd1\xd4\xa9\x1b\xeb\x3d\x95\xdd\x44\xf0\xed\xe3\xdc\x22\x8c\xe7\x72\x4f\xc4\x59\x0b\xde\xda\xce\x99\xc9\x77\xdc\x8f\xba\x05\x8c\x31\x90\x64\x55\x8e\x14\xe3\x0b\x5d\xec\x53\xee\x3a\xa9\xf7\xdc\xf3\xbd\x42\x0a\x83\x36\x08\x25\x66\xd6\xe8\x44\x5b\x24\x9e\xcf\x12\x5c\xf8\x48\x0d\xaa\x03\x4a\x32\xf3\xfb\x62\x54\x41\x1d\xc5\x39\x29\x81\x72\xf4\x40\x1c\x2c\xef\x69\x98\x9a\xe8\xa4\x94\x59\xe7\xf4\xe6\xa5\x60\x5e\xca\x2e\x48\x45\x98\x47\xa5\xb1\x10\x02\x23\xb5\x58\xbc\xf4\x25\x90\xca\x35\x30\x26\xa5\x0e\xeb\xb5\x2b\x56\x8b\x58\x9b\x9e\x63\xd9\x67\x41\x91\x74\x1b\xfb\x72\x1b\x18\xc9\x12\x34\x9e\x99\xea\xb6\x5f\x38\x44\xf4\xd0\xe1\xce\xb5\xed\xb2\xbc\xe8\x1e\x7c\x14\x67\x83\x4b\x62\x56\x0c\x19\x9c\x76\x53\x0c\x7d\xfa\xa1\xde\xec\x35\xf1\xaa\xc7\x76\x4a\xf3\xf4\xcb\x78\x11\xa0\x3e\x77\x92\xf2\xe7\x7e\x17\x3f\x6f\x9b\xbf\x96\xbd\x3e\x7e\x7e\x2c\x5e\xb4\xdd\xdb\x01\x79\x67\x7a\x03\x05\xf6\x0a\xcf\x4b\xac\xfb\x4f\xb1\x78\xb6\xce\xb9\xa1\xe1\x17\xd4\x28\x0f\x3b\xce\xc5\x5c\x62\xb1\xa8\xf7\x4e\xe5\x34\x50\x0c\x7f\x79\x5b\x9d\x3d\x30\xb5\x31\x98\x6f\x8b\x96\xda\xe4\xc1\xbe\xcb\xd7\xb3\x75\xcc\x17\x9c\xb1\x67\xcd\xd8\xdb\x9a\x52\x61\x7d\x04\x4c\x88\x5a\x2d\xe7\x0c\x41\x2b\x4e\xab\x87\xa1\xd6\x96\x0b\x8f\x8a\xe2\x65\x9c\xc8\x7d\x47\x79\x46\x71\xaf\xc1\x2b\x0f\xfa\x18\x40\xdc\xf6\xc5\xa9\xda\xc7\xc3\x25\xeb\x62\x44\xa7\x22\x60\x1a\xb5\x5b\x46\xd4\x6e\xa0\xfa\x9d\xe6\x54\x1e\x20\x44\x1d\x30\x94\x1a\x01\x90\x67\x2c\x30\xcd\x74\x5e\x2a\x72\x5a\x9e\x26\xf7\x10\x79\x38\xb8\x9e\xd0\xab\xfd\x8a\xeb\xc6\xf1\x53\xc0\x2b\xf8\xac\x9a\xf7\xec\x84\x70\x19\x8d\x75\xea\x12\x0b\x4d\x39\xa4\x98\x3a\x21\xc2\x44\x59\xd5\x09\x3c\x4b\x29\x41\xdd\x1a\xe4\x81\x8a\x34\xa7\x4a\x4d\x71\xb6\xe5\xee\x11\xde\x69\xd9\x73\x50\x1f\x80\xb5\xc1\xba\xcf\x27\x02\xb3\x85\xcb\x14\x50\x6c\xf5\x06\xbd\xba\xd4\x57\xa5\x4e\x2e\x06\x3e\x6a\x2a\xd7\x36\x82\x87\xd3\x7c\xf9\x32\x4a\xed\x0a\xc9\xed\xa5\xd7\x46\x0b\xa0\x45\xe1\xc1\x3b\x12\x97\x55\x35\xb6\x07\x38\x55\x85\x70\x80\xca\x53\xa6\x19\xe9\x45\x90\xa5\x76\xd4\xcf\x6f\x5c\x7d\x94\x93\xa0\x23\xed\x15\x44\xd3\x40\x27\xcc\x45\xd5\x13\x7c\x1a\x5c\x15\x4a\x35\x87\x51\x61\x47\xf6\x4b\x26\xe8\x11\x23\xcd\xc4\x67\x96\xc2\xd4\x19\x49\xb9\x52\x51\xf2\xd2\xd5\x62\x0e\x49\x8b\x41\x92\x38\x33\xe3\xa8\x59\x4c\xe0\x8a\xbd\x82\x57\xf4\x24\x78\x3d\x3b\xd9\x18\x57\x0e\x24\xb7\x20\xad\x54\xd0\x2d\x88\x08\x41\xc9\x4d\x8c\x6a\x58\x1d\xc5\x98\x8c\x9a\x69\x75\xd4\x5f\x88\x78\x76\x60\x32\xa2\xba\xfa\x4e\xb2\x80\x01\xde\x3a\x13\x15\xa5\x2a\x31\xac\x07\x49\xeb\x8a\x79\x22\x08\x98\x71\xa3\x34\x17\x2e\xdc\xfd\xce\x0e\x40\x47\x9e\xa8\xee\x02\x0e\x88\xf9\xb8\x12\xd7\x57\x91\x24\x9e\x52\x2e\xdc\x7d\xf0\x1f\x0f\x92\xec\xbd\xac\x44\xcf\xa3\xd4\xbe\xfd\xa9\x52\x7c\x40\x85\x52\x3f\x2a\xa5\x41\xe4\xa9\xc7\xed\xae\xe9\x6f\x8b\xe5\x10\xc0\x48\x95\x39\x71\x6d\x9a\xbb\xe2\xa3\x4b\xd1\xef\x59\x8a\xd8\x82\x01\x7b\x88\x7e\x01\x0d\xab\xf7\x55\xd9\xdf\x1b\x81\x80\x07\x29\x4b\x02\x85\x7b\xa3\x23\xab\x48\x97\xd7\xdb\xaf\x1d\x85\x86\x50\xdd\x6a\x5e\x4f\xeb\xcc\xd3\x4e\x5e\xde\xde\x1c\x41\x58\x03\xa2\xc8\xfb\x48\x02\xf7\x4c\x42\x46\x74\x18\x56\xf4\xe5\xdd\x84\x60\x90\x76\x1c\x4a\x41\x8a\x7f\x2f\x9a\xd7\x50\xcf\x37\xa5\x75\xcd\x82\x06\xd2\x62\xa4\x19\x05\xb5\x10\x85\x20\x3d\x7f\xfe\x33\xcf\xe3\x47\x30\x04\x7f\x31\x03\xff\xfe\xf0\x9a\x27\xe9\x80\x9f\xcc\xb8\xd6\xf2\x0b\x3f\x27\x4f\x63\xce\x8c\x26\x34\x19\xab\xbc\x4a\x8d\xc9\x32\xbc\x6e\xd3\x0f\xa3\xb5\xf8\x3a\xe1\xf7\x74\x4d\x0a\xea\x6a\xe8\x8a\xd6\x18\x71\x2f\xd1\x3c\xf2\x6a\x9e\xb2\x76\xa6\x25\xe9\xf9\xa4\xe1\xc7\xfb\x62\x52\x48\x10\xe0\x80\x46\xce\xb7\xde\x99\xe6\xa9\x78\x7b\x6f\xe4\x7e\xaf\x96\x68\x09\x6d\xc3\x64\xd2\x13\x4b\x22\xf5\x03\x89\x02\x98\x8c\x39\x04\xaf\x27\xfc\x3e\xd4\xcb\x5b\xd3\xde\xf1\x13\x6d\xf2\x70\x76\xaa\x64\xa6\xee\x3a\x93\x2c\x7c\xea\x5e\x85\xde\x57\xe2\x79\x28\x75\x31\x50\x7d\xf4\x5e\x42\x81\x69\xed\xa9\xe7\x4b\xc7\xf8\x92\x2e\xaa\xa8\x2e\x6a\x73\xec\x2f\x7b\x6d\xee\xb0\x1e\xe0\x6d\xff\x3e\x3f\x28\xf7\xfd\xbc\xd5\xd5\x73\xaa\x61\xe0\x52\x40\xd6\x58\x03\xe2\xd0\xd5\x27\xac\x40\x6d\xa5\x4f\xd0\x42\xbb\x4f\x8d\xd0\x3c\xdf\xa6\x31\x40\xf6\x72\x09\xc9\x88\x96\x7a\x64\x7f\xe3\x88\x86\x03\x4e\x15\xe1\xf5\xd3\xf2\x32\x1d\x8d\xeb\xe2\xa2\x57\x72\xbb\x72\xb1\x4e\x98\xa2\x84\xf1\xca\xda\x4b\x0d\x9b\xbe\x98\x96\xda\xc1\x8d\x98\x2c\xce\xf9\x7c\x7e\xcb\x54\x2c\xb8\x31\x7f\x22\xa4\x02\x8d\x19\x98\x52\x72\xde\x4a\x1c\xfe\xec\xc5\x04\x10\xd3\x36\xa2\xec\xa1\x7c\x28\xd9\xd3\x9b\xd4\xf8\xa5\xef\x3c\x9b\x19\xc2\xb3\xae\x5b\xf1\x05\xa0\x4f\xd8\x38\xb7\x6c\x36\xaa\x00\x74\x5a\x58\xb1\xac\xe8\xe5\xf2\x96\xa7\x1e\x4e\xd8\x3e\xc6\x6f\xf0\xb9\x48\x60\x75\xb4\xb3\xa7\xe3\x29\xb8\x56\xc3\x37\xfa\x2a\xd8\xa5\x36\x12\x60\x28\x83\xb9\x59\x8b\xf4\x8b\x7a\x8d\xa7\xee\x52\xd9\xe6\xb3\x9d\x20\xad\x3d\xcd\xb2\x79\xad\x35\xbd\x6e\xd4\x46\xa6\x8a\x08\x66\x1e\x21\x87\x0e\x05\x76\x16\xaf\x98\x56\x30\x0d\xaf\xab\xa8\x20\xd4\x6c\x97\x9c\x05\xf7\x62\xa1\x75\x77\xe2\xef\xcf\xcc\x98\xe5\x40\xb0\x5d\x41\x19\x09\x10\xa5\xcf\x30\x7e\x13\x26\xe0\xc6\xf3\x39\xe2\xcf\x3e\x78\x81\xb8\xea\x8d\xf2\xb2\xed\x9c\x68\x32\x73\x6a\x0b\x6f\x73\x09\xe4\xf8\x93\xe2\x37\xe9\x3e\x84\x49\x93\x35\x7b\xcd\x33\x81\xdc\x70\x9e\xba\xc3\x1b\x7b\xed\x9a\x75\xb8\xd2\xc4\xf5\x63\xda\x8b\x9e\x9f\x72\x96\x60\xd6\x2f\x8a\xe0\x63\xf8\xe9\x59\xa5\x97\x39\x56\x22\x66\x93\x1f\x61\xad\x5c\x6a\x9e\x8a\x71\xa2\x62\xc2\xb6\x3a\xde\x6f\x57\x9d\x96\xf2\x7d\xd3\x89\x9a\x3b\x43\x77\xfe\xe6\xc8\x49\x83\xbe\x22\x74\x6e\xa5\xbd\x40\x5e\x8b\x56\x91\xce\x77\x3f\xe2\x28\xc3\x4f\x19\x80\xd3\x74\xf5\xd9\xb9\x4c\xd9\xd6\x8c\x64\x91\xf8\x54\x71\xaa\xcd\x34\x80\xee\xc6\xa0\xc2\xe0\xd7\xdb\x3d\xe6\xc3\xb3\xfd\x79\x5e\x2e\x8d\x9d\xa4\xa5\x1c\xa8\xb8\xfb\x53\xef\x5d\x79\x3c\x93\xf4\x7f\x7d\xbf\xfc\x8b\xdd\x7a\xff\xf3\x36\xb7\xd6\x21\xcb\x7e\x7b\x8a\x5d\x8b\xc6\x95\xfa\x2c\xdc\xc9\x6c\x9e\xe2\x59\xd3\xc2\x7c\xcc\x0a\xa8\x93\xba\x50\xec\xbc\xd3\x1b\xcc\xa2\xb1\x1a\xd2\x4b\xec\x96\x31\xce\xf4\x68\xd4\x78\x7d\xd5\x99\x3c\x8f\xdc\xe4\x9e\x14\xd2\x4b\xc9\x42\x85\xd4\x78\x1d\x8b\x3c\xf4\x7b\x1c\x01\xa4\xee\x48\xcf\xa5\x60\x54\x62\xbc\xef\xef\x40\xd6\x76\x2d\x8c\xfa\xd1\xd2\x27\x6f\xd1\x89\xc0\xaa\x61\x4a\xdf\xa6\x7d\x7a\x9f\x93\x6d\x18\x7b\x1d\xbd\x3c\x24\xdb\xec\x5e\x08\x55\xbc\x09\xa4\x05\xc4\x37\xc5\xd9\x8e\xaf\x5f\x92\xa0\x1a\x07\xbf\x3e\xc5\xef\xd8\x04\xad\x9a\x4b\xc2\x9e\x0d\xdb\xf1\x2c\xbe\x9e\xde\xde\xb9\x53\xf0\xe9\x55\x11\xd9\x22\xd0\x22\x80\xda\xa9\xf6\x86\x7a\x76\xe4\xcf\x60\xf7\x8e\x18\x96\x74\x40\x39\x84\x00\xdd\x28\x4e\x1d\x75\x9e\x2c\xa5\x56\x70\x9b\xd9\xfb\xf0\x42\x4b\xea\xe5\xcc\x88\x8a\x57\x75\x6d\xc8\xd3\x3e\xd3\x4e\xe4\xa9\x7e\xb1\xa2\x7c\xb5\x22\xda\x23\xfb\xd3\x1d\xe3\x9f\xaf\x4a\xf4\x06\x88\xbc\x5e\xf0\x2b\xc7\x27\xa0\xee\xb5\x32\xcd\x68\xe4\x9e\xa6\xd3\x3c\x08\x2b\x5f\xd0\xb4\xb3\xcd\x19\xb0\xe9\x08\x11\xb9\xbf\x51\x22\x78\xd1\x4d\x54\x97\xfd\x71\x90\x83\x77\x0e\xaa\x74\x9a\xfb\xc0\xc5\x10\x59\x3a\x78\x64\xaa\x66\xa2\x35\x77\x53\x03\xa9\x7e\xcb\x8c\x58\x12\xa0\xa5\xab\x56\x14\x15\x90\x66\x88\x88\x07\xb0\xb4\xab\xf0\x08\x10\xd3\xee\x15\xcb\x4c\xf3\x2a\x9d\xa7\x8b\xab\x15\xed\x5b\x87\xa8\x56\x48\xd5\xd7\x8b\x4e\x42\x47\xf4\x4f\xaa\x84\x77\xc9\x0b\xa4\xa9\xc6\xbe\xd2\xd9\xab\x87\xdb\x7b\xe8\xfb\x8f\x56\x21\x4a\xf6\x86\xe0\x24\x92\xd2\x04\x68\x23\xb6\x4c\x00\x0c\xca\x68\xcd\x05\x84\x41\x71\x64\x28\xfb\x39\xde\xe9\x85\x54\x52\xb5\x73\x6b\x40\x2b\xae\x24\x7f\x4a\x1b\x86\x84\x22\xa2\xf6\x47\x76\x66\x6e\x25\x7f\x2d\x4e\xd1\x4b\xb5\x65\xa1\x2e\xaa\x24\x3b\xdb\x17\x7d\xe0\xef\x6c\x2d\xe7\xe0\x9d\x9e\x69\xee\x2c\xdf\x3d\x16\xc8\x48\xc4\x0e\x6e\xf6\xf9\x11\x04\x58\x49\x6b\xca\xf3\x22\xbc\x68\xaf\x2b\x79\xba\x79\xd3\xe3\x85\xea\xb1\x76\xb6\x31\x67\x52\xee\x0e\x98\x20\x0d\x24\xa8\x3d\x34\xa1\x3d\x71\xe1\xfc\x17\x08\x33\x32\xad\xd2\x57\xeb\x6d\x69\xca\x5b\x86\xd4\x4c\xd1\x1f\x64\xa5\x09\xe0\x20\x54\x7b\x16\xba\x0d\xa3\xcc\x8c\x9e\xc7\xa3\xb4\x58\x43\x2e\x4d\x5b\xc1\xc2\x5b\xa3\xe3\x22\xcc\xe2\x58\x6a\x72\x86\x1b\x88\x7e\xa1\xad\xde\xbf\x07\xc3\xb7\x4c\x65\x2c\x33\xd3\xc4\x2b\x2b\xf0\xe7\x1c\x74\xcb\x27\x7d\x7e\x0b\xe6\x84\x34\x7d\x86\x01\xa5\xda\x61\xe5\x40\x32\xca\xe8\x3d\x41\x15\x2d\xad\xa7\xaf\x40\x44\x02\xf7\x32\x36\xea\x78\xf9\x00\x22\xf8\xa6\xd7\xb0\x29\xed\x7d\x9b\xbc\x73\xc3\xab\x99\x93\xf4\xaa\xcc\x77\x11\x2b\x18\x39\x30\x8c\xcb\x7d\x10\xe0\xa7\x12\xed\xf3\x3b\x4d\x33\xb9\x71\x42\x74\x3e\x82\x72\xe0\x4f\x75\x15\x7f\xb1\xf4\x7c\x3e\x3f\xaf\x42\x06\xba\x3c\xa4\x5e\x2a\x6d\x08\x2d\x2c\xfb\xc0\x63\x68\xe8\xd1\x9f\x7f\xdc\x08\x24\x27\x26\xf3\xe1\xae\x8c\x59\x26\xbf\xb9\xf1\x33\x7c\x80\x39\x41\xf4\x80\x94\x33\xcf\x1b\x07\xe6\xd7\xe5\xaa\xa9\x3c\x34\x1a\xf0\xb5\x09\x9c\x0c\x8f\xaa\xab\x9d\x14\x98\xe3\x23\xcf\xb7\xbf\x94\x85\xf4\x20\xf7\x12\x37\xa1\x97\x3a\xeb\x22\x11\x2a\x63\x91\x4f\x13\x11\x6a\xc3\x5a\xc5\x13\x0e\xcc\x7d\xd7\x1c\xfc\xca\xc1\xd7\xf7\xa1\x7b\x05\x7d\x8b\xcc\xa5\x53\x8a\x27\x22\x34\xc6\x62\x4b\x49\x85\x50\x84\xf0\xb9\x94\x84\x4c\x73\x58\x86\x0b\x91\x73\x29\x71\x4e\xaf\xce\xd0\x43\xe5\xf8\x49\xe2\x7c\x58\x79\xf0\xa0\x66\xfb\xb0\x6a\x8d\xa9\xfa\xa0\x27\x35\x27\xc7\xf5\x4f\xcb\xc1\x49\xe3\x1a\x48\x7b\x34\xb3\x36\xd3\xa9\xc4\x7e\xfd\x3d\xd0\x54\x3f\x9d\x8b\xdb\xe3\x69\x99\xbc\xff\x83\x9e\xa8\x32\x2b\xdd\x3a\x37\xf1\xc9\x1c\x2f\x39\x39\xc4\x48\x8c\x28\x75\xb4\x28\x15\x35\xdf\x66\x72\xba\xd8\x05\xa6\x2c\xf4\xac\x2c\xd2\xac\x78\xe7\xe2\x96\x43\x4b\xe2\x62\xa0\xef\xa5\x5d\x58\xab\x8f\x5f\xe1\xe5\x6f\x9e\xf6\x88\xaa\x72\x8c\xc5\x72\x08\x73\x66\xbe\x89\x3e\xee\xbb\xe7\x21\xf6\x0c\x4a\xca\xa5\x9f\x3c\x10\xa1\xf1\xd7\x6b\x86\xb5\xda\x7f\xf1\xa4\xf7\x61\xaa\x53\x90\x2c\x8b\x58\x72\x52\x1e\xf4\x20\xe5\x0c\x1a\xba\x53\x1f\x2d\x4f\x34\xf4\x18\xcd\xb6\xc1\x3c\x38\x99\x60\xc4\x35\x83\x02\x63\x8b\x52\x7d\x78\xa5\x6c\xf2\xa4\x50\xdf\xa3\x07\xd5\x42\x47\x05\x86\x3a\x65\xfe\xb9\x66\x84\x98\xd6\xcd\xf5\x29\xa9\xca\xc0\xf8\x44\xe3\xca\x4c\xf5\xd1\xfc\x43\xfe\x8f\x10\x06\x87\x44\x14\x46\x65\xe1\x7b\x95\xa5\x96\xeb\xa9\x1c\x6f\x16\x65\xdd\x3c\x6d\x88\xbd\xf3\x63\xd5\xa5\x5b\xae\xe6\xd2\x29\xeb\x22\xee\xc9\x45\xd5\x35\x8b\x45\x6a\xbe\x8a\xd4\x10\x72\x60\x6e\x7c\xe8\x4f\x1d\x31\x1b\x62\x91\x5a\x02\x91\x1a\x25\x5e\xb3\xb5\x9c\x6e\xae\x70\xd9\xdf\x44\x0a\x89\xe6\xe2\x33\x9f\x87\xb4\x4b\x51\xf6\x11\x62\x66\x61\xa5\x95\x96\x63\x50\xd2\xaa\x2b\x2c\xf6\x0c\x5c\x03\x37\x1d\x03\xbb\x70\x3e\x66\x80\x9a\xa8\xda\x3c\xaa\xda\x82\xa0\xda\x25\x67\x3e\x4a\x4e\x03\xaf\x8c\x61\xfb\x88\x61\x17\xa0\x6a\xf3\xbf\xc2\x67\x0e\x3e\x72\xed\x6e\x2e\x06\xfe\x0a\x5f\xf1\x8f\xf8\xcc\x7f\x89\x4f\xcf\x69\x72\x95\x8f\xed\x80\xb8\x29\x5e\xe7\xc0\xbb\x95\x37\xfe\x36\x87\x30\x98\x7e\xf1\x10\x0f\x5c\x6c\x89\x45\xa1\xf7\xe1\xeb\xd9\xe4\xc0\x7c\x85\x57\xaa\xf2\x79\xe3\x9e\x82\xc9\x15\xa8\xf6\x28\x39\xc3\xf1\x27\xd5\x4e\x27\xd5\x71\xa6\x8b\xa3\x89\x17\x47\x45\x4c\x47\x60\xb4\x47\xcc\x5c\x6c\x63\x52\x2d\xe9\x07\xbe\x9b\x48\x3d\x62\x17\x2a\xc3\xda\xfc\x15\x3e\xf3\x1f\xf1\x15\xff\x12\xdf\xb0\xd2\xae\x20\xbf\xa3\x8b\xab\x8e\xb2\xd4\xa6\x8f\x4e\x61\x8a\x1f\xb8\x8f\xbd\x6d\xf6\x67\xa3\xa9\xce\x51\x68\x24\x0a\x8f\x00\xbe\x82\x92\x78\xed\x57\x3b\x8f\x72\x09\xd0\x1b\x9b\x5c\x0c\x92\xa6\xe9\x73\x6c\x39\x26\x73\x3d\x3d\x82\x58\xd0\x42\x7b\xd2\x4c\x5e\xc7\xe0\x8e\xb0\xc0\xb0\xe8\x42\x59\xa0\x07\xdb\xb9\x06\x23\x0e\xfa\xaf\x82\x9f\x1c\x9b\xc3\x1b\x8e\x40\x5f\x2c\x30\x73\xc0\xf8\x04\xd2\x8c\x24\x31\x8f\xe7\x25\xd0\xa4\x67\xdf\x70\x72\xf5\x29\x31\xa2\x5a\xf8\x26\xde\xc0\x48\x10\xe6\x7b\x02\x49\xe0\x3e\x02\xd1\x01\x52\xcc\x8b\xda\xd5\x37\xdd\xd6\xef\xf7\x41\xd7\x4e\xaa\x38\x2b\x1c\x43\xb4\xe1\x19\x8e\x72\xc7\x2a\x73\xc4\x41\xb0\xb6\x2a\x64\xaa\x23\x26\x6a\x20\x6a\x38\xe6\x80\x94\x94\x9d\xc2\x19\xdd\x57\xa2\x23\x83\xbc\xc0\x88\x36\x9d\xc5\x25\x1d\x2f\x13\x68\xb2\x78\x65\xa5\x52\xb3\x77\xe5\x7e\xd0\x31\x5c\x4d\x9c\x65\x86\xeb\x33\x5f\x90\xba\xdb\x8a\xe7\xeb\xd5\xee\x33\x37\x7c\xa6\xd5\x69\x44\x09\x81\x21\x62\x8a\x74\x53\xb4\xba\xba\x32\x06\x37\x50\x3b\x5d\x52\xe4\x1a\x20\x7a\x25\x3c\xf7\x06\xac\xc7\xce\xab\x0f\x04\x47\xa5\x80\x61\xdc\x5f\xf0\x48\x47\xc2\x69\xac\x50\xdc\x1b\x33\x88\x56\x4c\x04\x18\x14\x28\xd9\x67\xe2\x23\x8a\xa8\xa2\xb1\x22\xa7\xb5\xad\x17\x12\x35\x57\xce\x68\xbd\x33\x32\x2e\x0d\x76\xe2\x5b\x24\x2a\xd3\x9b\xa6\xda\xd7\x78\x82\x6c\x90\x7f\x12\x51\x8d\x03\x80\x61\x1a\xa3\x9a\x2d\x34\xde\xdf\x4e\x0a\x87\x45\x92\xc0\x0b\x96\x2c\x39\x7b\x91\x54\xe4\x7d\x17\x82\x72\x2b\xde\xe4\xc8\x3e\x37\xfc\xac\x83\x24\x1d\x3e\x23\x65\xc6\xdb\x50\x97\x63\xe3\x9d\xa7\x31\x2d\x06\xdc\xe8\x4e\x2d\x77\x82\x7a\x31\x2c\x73\xd6\x97\xd2\x48\x25\x5d\x41\x4f\x49\xf5\x85\xe9\x8f\x25\x9e\x7b\xf4\xe1\x87\x2c\x8f\xa2\x7c\xf2\xf4\xd4\x53\x3f\x7a\xc9\x9e\x26\x27\x44\x96\xfd\xc9\x6f\x1f\x43\xe8\x2c\x55\xa9\x8b\x4f\xa6\xf2\xe3\x54\x82\x1a\xff\x61\xa9\xa1\x82\xd2\x0d\xe4\x7b\x6a\x11\xa9\x30\x17\xc3\x53\x1d\xd2\x41\xa5\x1b\xf4\x2b\x85\xc4\x8b\xa9\xdc\xe2\x39\xaa\x7c\x3b\x3e\xbf\x04\xb9\x80\x39\xdd\x44\xee\xd5\x28\xa1\x0b\xc3\xbd\x53\xca\xa4\xb9\xd7\xa4\xd3\xa1\xce\xe4\x77\xd8\xb5\x2d\x06\x23\x51\x00\x01\x6c\x31\x49\xf9\x4b\xde\xed\x39\x33\x1a\x0c\xf4\x72\x3b\xe7\x90\x92\x8e\x92\x21\x5f\xd9\x14\xce\xf1\x3a\x84\x24\xe2\x84\x30\x6f\xc4\x70\x5f\x36\xf5\x64\x68\x9d\xea\x39\x1f\x9b\x1e\xb1\xa5\x22\xe6\x6b\x4a\x1a\xa7\xb8\x5f\x6b\xfe\xe2\x92\x4e\xa1\xcc\x05\x6f\xda\x9a\xf7\x28\x54\x22\x43\xa4\x11\xd7\xb4\xe1\x34\xe2\xe7\x47\x9f\xd1\xd9\xf5\x1d\x06\xe0\xde\x48\x68\xa5\x59\x22\x89\xaa\x0d\x13\xbc\x0e\xda\x74\x8e\x80\x5b\x35\xb1\x9a\x38\x48\x8c\x11\x3d\x39\x11\xef\x63\x1a\x86\x8b\xd9\x85\xa9\x13\x4b\xc0\x63\x4f\xce\x22\x46\x50\xb7\x26\xb7\xfc\xde\x04\xca\x19\xde\xcf\x14\x4b\xa3\x5a\x94\xb8\x4a\xd5\x10\x10\x61\x43\x39\xe6\x28\xaf\xb3\xd6\x05\x4f\x85\x64\x39\x9a\x6d\x8b\x49\x17\x6e\xe6\xa4\x8c\x7f\xf2\xb7\x6a\x8a\x64\xfe\x6b\xc5\x13\xe5\xed\x67\xba\x01\x7d\xbf\xcb\x55\x25\x7a\x00\xa6\xbb\xb3\xe3\x3a\xf8\x2b\xcf\x2d\xdf\x6f\x30\xbe\xaa\x74\x8e\xe5\x28\xfa\x84\xe2\xed\x44\x46\x7c\xfd\x08\x80\x3d\xcb\x50\x24\xb5\xec\xfd\xbd\x2a\xeb\xa9\x9a\x73\xad\x6f\xd0\x6c\x14\x06\x2e\xc3\x34\xa9\xcf\x51\x70\x07\xdf\xfa\x98\xb8\x95\xc6\xad\x0d\x17\xf9\x86\x84\x25\xb2\x3c\x90\x1a\x91\xc6\x54\xea\x1e\x7e\xc2\x5d\x10\xb5\x74\xab\x04\x0c\x1f\x4e\x97\x91\x09\x09\xdc\x2f\x70\x77\x5a\x26\xc4\x7b\x39\x7c\x81\x81\xfd\xbd\xdb\x6b\x71\x9d\xc5\x55\x84\x58\xe5\x5d\xd3\x8b\xeb\xcd\x26\xd9\x19\x07\x41\xae\x91\x24\x6b\xb8\xde\x65\xbf\x2b\x87\xbb\x07\x3d\x71\xdc\xab\x1a\xc9\x6f\xd5\x5b\xfc\x38\x1b\xee\xc0\x0b\x61\xd8\xb2\x80\x85\xa5\xb0\x91\x59\x85\xec\xc8\xc4\x7b\xc2\x2f\xcb\xb0\xbc\x94\x67\xdb\x0c\x74\x16\xd0\x13\x8d\x70\x0e\x63\xd4\xb0\xed\x08\x6d\x49\xc8\xa3\x7d\xaf\xd0\x1b\xc5\x35\x17\x4c\x71\x89\x5e\xf7\x72\xca\x9d\x9e\xf7\x9a\xb8\xc9\x02\x48\x0d\xb3\x3e\x79\x70\xee\x46\x9a\x59\xc8\xe2\x6d\x01\x2b\xc3\x95\x1b\xad\x25\xe9\x2b\x83\x4f\xd0\x6c\xfa\xf0\xd3\xaf\x23\x58\x51\x9a\x7b\xef\xd9\x93\x9a\xd2\x65\x55\x7a\xd2\xbd\x4e\xd9\x49\x9b\xf8\x45\xdd\x73\xfa\x80\x6b\x46\x00\x33\x73\xaa\xa4\xb7\xd9\xc3\xcf\x36\x89\xd4\xe9\xc9\xd6\x30\x91\x56\x40\xd7\x6a\x1c\xa3\xb0\x8c\xda\x2b\x66\x26\x03\x0a\x50\x4c\x52\x9b\x0e\xca\x58\x85\xc1\xd6\x96\x87\xa4\xdb\xcf\x73\x26\xdd\xe8\x27\xcf\x06\x95\x02\x3e\x1c\x2b\x41\x1a\x81\xcd\x26\xc4\x6e\x9e\x2a\x6a\x27\xbc\xa1\xc3\x69\x84\x33\xa9\x28\x8d\x21\x2a\x8b\x9a\x67\x66\x6c\xa1\x8a\x53\x9a\xc2\xc5\x39\x99\x43\x33\xbf\xa9\x28\xc6\x91\x2e\x0e\xbd\x78\xba\xa8\xad\xea\x79\xb2\x3a\x26\x9b\xc7\x1e\xac\x85\x6b\xff\xb4\x58\x9b\x8e\x54\x94\x67\xc7\x57\xf0\x1c\xf6\x9a\x81\x2b\x16\x75\x16\x69\xa5\x51\x25\xa9\xd1\x7d\xee\x71\xcb\x79\x05\x9a\x4e\x5d\x38\x5f\x10\x8a\x36\x1c\x2e\xa0\x09\x13\xa2\x4f\x30\xc2\x59\x89\x45\xa3\xd9\x80\x99\x22\x70\xa5\xb3\xa9\xa9\x74\x5f\x27\xdb\x91\xa2\x51\x3b\x60\xa9\xfc\x54\x3c\x1c\xb7\x7a\x77\xe2\x10\xce\x2c\x44\x32\x4a\x82\x88\x3a\x58\x21\xae\x8b\x4a\x58\xc6\x33\x7c\xad\x4b\x56\xe7\x2d\x73\x2f\x48\x53\x88\xf2\x85\xca\x9f\x09\xca\x08\x80\xe9\x14\xca\x13\x1b\xab\xc4\x94\xb0\xe3\xe2\xdc\x2e\x8f\x94\x1f\xeb\x7e\xe9\x88\x97\xb2\xe0\x36\x12\xcd\x56\x65\xe8\x28\xd2\x2f\x8f\x44\xca\xed\xb3\x8a\xe7\x0d\xee\x42\x14\x03\x68\x0a\x2b\xab\x57\x91\x5d\x0a\xb6\x51\x4c\x00\x2c\xdf\xf7\x8b\x04\xdf\xb5\x19\xc8\x7a\x99\x85\x04\xbb\x95\x81\x77\x28\x6a\x89\x6a\xb2\x64\x7c\x7a\x9e\x98\xf9\xde\xef\x07\x9a\x56\x69\x05\x00\x1f\x03\x7d\xbd\x19\xe5\x9f\xfb\x31\x42\x99\xfc\xd5\x9e\x27\xfa\x77\x62\xf1\x77\x62\xf1\x7f\x43\x62\xf1\xb8\xf1\xeb\x9f\x66\x9f\x7f\x26\x02\x8e\x34\x5e\xf8\x2b\x6f\x3e\x0c\x4c\xb5\x6f\xbc\x5a\x5c\x19\x93\x77\xfe\xbd\xc4\xe2\x07\x3e\xed\x5f\xe2\xfb\x6f\x26\x16\xa2\x56\x98\xa2\x56\x18\x90\xca\xff\x4c\x04\x8c\x07\x8d\x9a\x8e\x29\x6a\x5c\x31\x69\x85\x31\x9b\x8e\xc0\x9b\xff\x5e\x62\xf1\x13\x9f\xf3\x2f\xf1\xfd\x9f\x49\x2c\x4a\x68\xa4\x08\x69\x4d\x2c\xb2\xef\x89\x45\x76\xd6\x94\x70\x3a\x9b\x82\x7a\x07\x46\x9d\x96\x54\x69\x52\x0b\x47\x22\x3a\x0b\xbc\xfa\xaf\x52\xe4\x14\x31\x7b\xc4\x72\xf1\x9a\x6f\x30\x1a\x9d\x05\x8d\x82\xb1\x38\xd9\x7b\xd1\x45\x3b\x05\x27\xf3\x81\x16\x84\xad\x71\xb8\x25\x36\xd0\xd5\x1d\xab\x27\x5c\x58\x4a\x56\xbe\x54\x2e\x34\x48\x22\x5d\x74\x3f\xf2\x89\x02\x15\xd3\xe6\x8c\x87\x55\x3c\x62\x14\xb9\x0c\xf5\xa0\x02\x14\xf6\x74\xae\xfe\xb5\x0a\xf6\xed\x10\x35\xc3\x44\xce\x6a\x2d\xdc\x4e\xb4\x7a\xd6\xcf\xcc\xf9\xce\x2d\x2f\x6c\x78\x7a\xf8\x1e\x18\x38\xec\xd5\x00\x0b\xc1\x5d\x54\x26\x6e\x80\x18\xc6\x3b\xfc\x21\xa8\x67\x24\xf7\x31\xe8\xc1\x2c\xa8\xba\x57\x74\x7c\x9c\xf8\x11\x05\xc5\x19\x46\x5e\xfe\xc2\x20\xa7\x0b\x71\x7f\x56\xcf\x1b\x7b\xa9\xee\xfc\x3d\x20\xbc\x10\xd5\xa6\xcb\x9b\x45\xcb\x21\xd4\xed\x26\x81\x67\x99\x47\x64\x48\x8f\xf5\x51\xbb\x74\xa7\x78\x22\x28\xde\xba\xbf\xd0\x97\x5c\xe4\x0f\x06\x03\xbc\x34\x19\xa4\xf9\x34\xf1\x2c\x8c\x3a\x56\x95\x8c\xdc\x8b\x83\x69\x66\xea\xc3\x40\x31\x8b\xbb\x8b\x2f\xea\xeb\xe1\x8a\x65\x46\x00\xcc\x3c\xd3\xdd\xe4\xd7\x17\xbd\x56\x40\x03\xde\xa7\xa2\x58\xc9\x66\x30\x92\x8b\xc3\x9c\x03\x3b\xb7\x30\xe3\x72\x81\x84\x73\xdd\x4b\xb4\x4a\x66\x51\x1e\x48\xee\x29\xcd\x49\x2d\xb2\xb4\x6e\x5f\x36\x57\xce\x27\xcf\x8c\x97\xc1\xcd\xe3\x4c\x9b\xd0\x29\xb4\x2d\x4d\x50\x9d\xe7\x95\xe4\xa6\xe8\x91\x82\xb5\xe5\x33\xef\x8e\x99\x62\x25\x7c\x49\x50\x9e\x25\xac\x93\x51\x9e\xa7\x89\xfd\x9b\x1e\xd9\x98\x2f\x42\xca\x98\x19\x4b\x08\x2a\xca\xe6\xee\x8d\x7e\x83\x14\x27\x85\x98\x13\x4c\x4a\xf9\xc8\xd3\xa6\x7d\xa5\x8d\xcb\x12\x09\xb2\x19\x9c\x6e\x4f\xa5\x09\xa8\x60\xf0\x71\x05\x12\xef\x2d\x18\x21\x70\x87\xea\x0e\xee\xc2\xa5\xdb\x5e\x49\x85\x6e\xde\x23\xc8\xb6\x50\xed\xdd\x3b\xdf\xe5\x91\xd7\x4d\x7c\x8d\xee\x69\xf1\x9f\xf0\xb2\x94\x69\xd2\xf5\x4d\x79\x15\x86\x2e\xe7\x94\xd0\x34\x65\xc1\xa6\x5d\x76\x9a\x60\x11\x90\x4b\xb5\xf3\x84\xcc\xd5\x5f\x97\xa5\x75\x4f\xe7\x91\x99\x88\xf7\x24\x0f\xb0\x49\x54\xa3\xb0\x20\xe5\x48\x01\x18\xa7\xb0\x80\x8a\x3a\x2d\x6c\x8e\x57\x30\x45\x1c\x8c\xf4\xce\xb5\x40\xc4\xc3\xbb\x65\x2e\x8d\x07\xd2\x61\x98\x3c\x00\x4e\x90\x4d\x55\x96\x10\xf0\x6e\x5f\x45\x16\x81\x5d\x1a\xae\xb0\x13\x15\x19\xc6\x90\xf9\x39\x38\xf0\x00\xe1\xc6\x69\xb4\xd4\x38\x6d\xd2\x94\xa1\x33\x6f\xa6\x5d\xa2\x27\xe0\x0d\xcf\xf9\x35\x25\xe1\x62\x80\x76\xd9\xbe\xf0\xb2\x9c\x94\x2c\xa1\x42\x0e\x8d\x04\xf5\x4d\x79\xf1\x43\x39\x3d\x95\x61\x6f\x29\x22\xe3\x9f\x68\x3f\xbf\xf6\x50\xa1\x5d\x9e\x74\x60\xda\x6e\xc8\x26\x8f\x34\x1f\xc1\x45\xcc\x04\xd1\x92\xa1\x60\xdc\x2f\x5e\x38\xdc\x65\x80\x61\x52\x5a\x1f\x69\x8e\x6e\x31\xf1\x29\xfe\xb9\xb7\xc0\x97\x4d\xfa\x47\x37\x27\xfc\x8f\x5f\x45\x15\xed\x90\xee\xa7\xaa\xfc\x5f\xff\x81\xb0\xed\x90\xee\xa6\xaa\xac\xdb\x5f\xbe\x65\x5d\xf7\xfc\x7f\x01\x60\x1c\xc7\xe3\x88\x1c\x9b\x77\x0a\xc0\x20\x08\xae\xc0\xdf\x76\x43\x9e\x8c\x4c\x33\xfd\xf2\x0d\xdc\x81\x3b\x0c\x43\x76\x30\x82\x1d\x91\x6f\xff\x81\xf0\xff\x81\xb0\x71\x72\x6f\x3f\x57\xc0\xcf\xcb\x67\xd0\x65\xbb\x7b\x5e\x96\xbf\x7c\xfb\x0f\x18\xb9\x6f\xff\xbe\xed\xe2\x5f\xbe\xa9\x30\x42\xed\x70\x24\x83\x88\x23\x39\x40\x20\x76\x82\x11\xea\x8a\x23\x4b\x85\x60\x47\x7c\x07\x66\x08\x7e\x44\x22\xe2\x48\xed\xc0\x1d\x84\x1e\xb1\x23\xb5\x83\xa8\x23\xbe\x83\x8f\x78\x4b\x1d\xe1\x1d\x7a\x84\x76\x10\x7c\x84\x76\xc4\x11\x0a\x60\xf4\x88\x62\xbb\x4f\xbb\x52\x06\xed\xf0\x23\xbc\x83\xc0\x15\x0e\x3c\x12\xd8\x57\xfb\x19\x82\x8e\xe4\x67\x26\x8a\x1d\x71\xea\xab\xdd\x86\x0e\x5f\x43\xd4\x0e\xc6\x8f\x18\xf9\xd5\x7e\x86\xbe\x10\x92\x3b\x04\x3c\x62\xd4\x57\xfb\x35\xeb\x43\x06\x12\x1d\xb0\xe3\x86\xfe\x00\x41\x47\x6c\x07\x1f\x89\x03\x44\x1d\x91\xf5\x22\x5b\xaf\xa0\x2b\x84\x93\xd9\x01\x22\x8e\xd8\x67\xa3\x2b\x4e\x0c\x0a\x10\xf2\x88\x10\xbb\x4f\x0b\x7e\x70\x42\xc7\x95\x18\x64\x07\xe1\xdf\x9b\xcf\x00\x7e\x24\x0f\xc8\x91\xd8\x41\xc8\x11\x41\xbf\xda\xcf\x08\x72\xc4\x0e\xd8\x91\xdc\xc1\xd4\xba\xd3\x4f\xfb\x85\xec\x40\xac\x7c\xc3\x8e\x38\xf9\xd5\x6e\xfd\x87\xb5\x9f\xd8\x41\xf0\xfa\xfa\xf4\x20\x47\xfc\x80\x1d\xb1\x1d\x44\x1c\xa1\xef\xed\x67\x04\x3f\x52\x07\xe4\x88\xee\x50\x68\xe5\xc8\xa7\xfd\xc2\x02\x1e\xa9\x03\x74\x84\xb3\x03\x44\x1e\xb1\x2b\x04\xa1\xd9\x7a\xb1\x54\x10\x44\x1d\xa9\x03\x06\x0d\x10\x76\x44\xb2\x03\x4a\x1d\xe1\x2b\x04\x92\x19\x8a\x1f\x91\xb5\x0f\xcd\x0e\xeb\xe5\x0f\x9e\x90\x57\x1c\xc9\x70\x62\xa9\xe0\x95\x2d\x04\x7c\xa4\xa2\x23\xb9\xc3\x8f\xd4\x0e\x59\x79\x00\x1d\xa9\x1d\x71\x44\x77\x10\xd6\x42\xe0\x4a\xc9\x4a\x3b\x79\xc4\xd7\x8b\x00\x81\x8f\x38\xb4\xfb\xb4\x5f\x9b\x06\xbf\x38\x08\x83\x47\x0c\xfe\x6a\xbf\xf3\x10\x3f\x20\xeb\x2e\x7f\xee\xfc\x8b\x7b\xf0\xaa\x62\x20\xf9\xd5\x82\x3f\x24\x8f\xae\x22\x80\xbe\xb7\x9f\x7d\x1f\x89\x03\xba\xea\x24\x7c\x24\x89\xaf\xf6\x33\x00\x1f\xf1\x03\xba\xa2\xc7\x57\x0d\xf9\xb4\x9f\x11\xec\x08\xad\x2c\xde\x21\xd8\xfa\xfa\xf4\x91\x47\xf8\x00\x1f\xd1\xf2\x00\x21\x47\xf4\x00\x1f\xb1\x80\xa4\x8e\x04\xbe\xfb\xb4\x5f\xfa\x85\x6e\x13\x89\x1d\x82\x1c\x31\xe8\xab\xfd\x1a\x02\x8f\xe8\x47\xec\xf0\x11\xfe\xde\x7e\x27\x1b\x39\x90\xab\xbe\xae\x96\xb2\x35\x9f\x7e\xf8\xb8\x69\x2c\xb1\x83\xf1\xf5\xf5\x65\x13\xd0\x11\x39\xc0\xf0\x11\xdd\xad\x66\x87\x7d\xb5\x5f\x63\xf0\xa6\x16\xf8\x0e\xc7\x8e\x24\xf5\xd5\x7e\x0d\x61\xab\xb2\x1f\xc9\x88\x38\xae\x9c\x5c\xf5\x71\xb5\x20\xf2\x08\xef\xd6\xad\x20\xe8\x11\xc5\x77\x9f\xf6\xc7\x3a\xd4\x0e\x5f\x8d\x83\x3c\xc2\xd0\x57\xfb\xdd\x62\xa9\xdd\x6a\x2d\xe8\x66\x9a\xf0\x77\x7a\x77\xc8\x2a\x16\xa8\x3c\x40\xf8\xba\xcd\x23\x1e\x1d\xa0\x6d\xcf\xab\x42\x12\x2b\x03\xe0\x03\xb1\x6e\x09\x39\x42\xed\x81\xdc\xc4\x82\xac\xc0\xd0\x7a\x11\xa0\xc8\x91\xda\x6d\xcd\x0f\x75\xc5\x76\xd0\x6a\xa6\xd4\x11\x25\xbe\xda\xef\x3a\x4e\xee\x90\xe3\x46\x23\x8e\x7c\xb5\xdf\xed\x82\xd8\xa1\x47\x7c\xf5\x43\xab\x76\xa0\x3f\xb4\xe3\xb0\x62\xc2\x8e\x68\x04\x7e\xc6\x8f\xf0\x6e\xc5\x41\xac\xea\x87\xb4\xeb\x8e\x36\x23\x85\x77\xd8\x11\x29\x57\x2f\xb6\x83\x8f\x64\xb4\x5a\xf7\x0e\xfe\xd0\xb0\x0e\xe1\x9b\xe7\x5a\xe7\x60\x2d\xf1\xdd\x39\xad\x17\x30\x74\x44\x03\x04\xda\xbc\x03\xf4\xdd\x3b\xac\x12\x44\x57\x18\x64\xb5\x66\x98\xf8\x6a\xbf\x5b\x3a\xba\xa3\xd6\x7d\x6c\x9e\x0b\xf9\x95\xff\x82\xd6\x59\xf8\x11\xdf\x61\xdb\xeb\xab\x93\xd8\xdc\x13\x1a\x6d\xea\xb7\x2a\xef\xaa\x83\xe4\x01\x81\x8e\xf8\x81\x3c\x62\xed\xea\xc9\xa8\x55\x01\xd1\xc3\xa6\x06\xab\x6d\x66\x10\xb9\x7c\x03\x7e\xcf\xbb\xa3\x38\x95\x04\xf0\xc7\xbb\x23\xe0\xe6\xb9\xd0\x92\x44\x77\x28\x79\xc4\x76\x24\x7a\x58\xff\xbf\xe2\x44\x79\xf8\xba\x3e\x7c\x8d\x0d\x14\xf1\x07\x18\xf1\x20\x0a\x62\xe8\x83\x11\x02\xb1\xd5\x06\xc0\x23\x54\x1e\x56\x6b\xc7\x8e\x70\x00\x91\x47\x88\xda\x7d\xda\x8f\xba\xac\xb6\x8c\x94\x38\xb8\xfa\x8d\x0d\x02\x3d\x62\xd8\xee\xd3\x7e\xe9\xe0\xba\x69\x70\x03\x39\xfc\x11\x92\x03\x72\x44\x14\x08\x46\xb6\xe5\x7e\x8b\xe3\xc3\x38\x70\xa9\x3e\x1b\x80\xbf\x13\x84\xaf\xa0\x04\xb2\xfb\xb4\x1f\xd0\xd5\x47\x41\x58\xb9\x8a\x14\x0c\x20\xec\x88\x11\xbb\x4f\xfb\x59\x0a\x5e\x05\x7e\xc4\x7f\x4d\xce\x3f\xa3\xd8\x91\x47\xfc\x00\x61\x57\x82\x3a\x52\x01\x0c\xee\x60\xf0\x87\x22\xac\xd6\x87\x2f\xd5\x01\xc2\xc0\x23\x79\x44\x7f\x8b\xff\xf0\x85\x7f\x20\xc0\x75\x18\x3d\x22\x9b\x02\x23\xe4\x4f\xd4\x2b\x75\xbf\xe2\xd7\xef\x51\xb8\xae\x32\x1c\x7e\x1f\xc5\xe1\x43\x9d\x82\x90\xab\x87\x26\x8f\x7f\x24\xca\x5f\x2b\x07\xb4\xce\xdf\xc1\x54\x49\xac\x27\x26\x8a\x1c\xd1\x81\xc4\x8f\x44\x79\xf8\xf1\x7e\xbb\x3a\xac\x57\x57\x02\x5e\x65\xf1\x35\xa3\xda\x4c\x18\x29\x7f\xa5\x3a\xff\xac\x61\xc3\x81\xfa\xa9\x62\xff\x26\x31\xd4\x0e\x42\xd6\x23\xec\x08\xd3\x10\x76\xc4\x57\x9e\xac\xed\x87\x01\x14\xb9\x83\xd6\x33\x78\x58\xc7\x83\xdf\x8e\x43\xd8\xea\x88\xb0\x23\x91\xfd\xf1\xf8\xd6\x0c\xbf\x3b\x7e\xf8\x31\xbe\x54\xe0\x0e\x47\x8f\x58\xf6\x63\x21\x6c\xf7\x69\xbf\xbc\xcd\xea\x5a\xc8\x72\x63\xc5\xea\x63\xd7\x8b\xf5\x04\xf9\x03\xd0\x03\xb9\x54\xe4\x7a\xb2\xad\x8c\xc8\x0e\xab\x76\xfe\xd3\xda\xe0\xe1\x37\xb4\x41\xc8\xee\xd3\x7e\x94\x0c\xde\x11\x47\xbc\xfc\x5a\x08\xb9\x42\x28\xb9\x6a\xdb\xf6\x96\x5a\xc1\xd7\x03\xf9\xf8\xfd\x4c\xdc\x80\x7f\x77\x93\xe0\x4f\x26\x64\x47\xfc\x8a\x13\x47\x58\x81\xc8\xf5\x50\xc2\xa8\xa5\x3a\xe0\xd4\x91\x3c\xa0\xe0\x2a\x67\x10\x5c\xc3\xae\x0d\x37\xb1\x91\x42\x7c\x27\xe5\xb3\xfb\x23\x94\xfd\x2e\x73\x76\x9f\x1d\x97\x87\xef\xb4\x2e\x2a\xba\xfa\x64\x8c\x3c\x52\x9f\xce\x1d\xb9\x06\x1e\xf8\x11\xc9\x7e\x8f\x13\x3f\xa5\xf8\x25\x66\x7c\x3b\x05\xf0\x9f\xa7\xc0\x7a\xce\x10\xcb\xea\xd8\xa8\x1d\x84\x92\x2b\x43\x57\x74\xf0\x77\x79\x20\xff\xcc\x8f\xdd\x3a\x03\x1f\x7e\x57\xab\xc0\xdd\x77\x3c\x7f\xa0\xa1\x20\x89\x84\x18\xfa\x6d\xeb\x38\x34\xcf\x20\xca\xbb\xf9\x97\x6f\xe0\x11\xc2\xfe\xc1\x84\xd6\xd3\x65\x55\xf8\xd5\x29\x7e\xd7\xff\xf5\xdd\x7f\x11\x2b\xf8\x1d\x2b\x45\x6e\xd1\x0e\x72\x24\xbf\x9b\xd1\xee\xb7\x38\xd7\x5c\x60\xbd\x02\xe9\xff\xf1\xdf\xc9\x52\xaa\x3c\xfe\x87\x24\xe5\xbf\x3a\xbd\xf8\xa3\xe7\x84\xfc\x4e\x8e\xf3\xff\x45\x59\xf0\x6e\x93\xee\x97\xbe\xbb\x93\xdf\x13\x9e\x3c\xfe\xe5\x9b\x12\xcc\xc9\xfb\x3f\xe1\x6f\xff\xe5\xec\x87\x58\xf3\x01\xf0\x2b\xf5\x69\xbb\xb9\x4c\xbe\xb8\x53\xe6\x75\x12\xbc\xc5\x77\x10\xe7\x49\xdd\x6d\x8b\x58\x57\x51\xe2\xfe\x13\xfa\xcf\x6f\xbb\xf4\xab\xdb\xa9\xf3\xae\xfd\xe5\x5b\xdf\x26\x6f\xeb\x19\x44\xc9\xa5\x76\xda\xe4\xdb\x6e\x82\x7e\xf9\xb6\xa6\x05\xdf\x76\x33\xf4\xcb\x37\x08\x84\xbe\xed\x26\xf8\x47\xd7\x7a\x75\x04\x57\x59\x7d\x47\x63\xbf\x83\xba\xbd\x37\xef\xea\x97\x6f\x55\xd0\xbd\xf3\xe9\xff\xf9\x84\x4d\x07\x68\x8b\x81\xe1\xff\xf9\x83\xbe\xe6\xb9\x6b\xee\xf7\x95\x03\xdf\xc0\x6f\xbb\xf5\xfd\x21\x6a\xca\xe6\xbd\xa9\x45\x02\x47\x71\x82\x7e\x17\xef\x3f\x00\x1f\x21\xe2\xb7\xe0\x60\x14\x24\xf0\xef\x83\x23\x10\xf2\x1b\xf8\x38\x8c\xc0\x38\xfe\x7d\x78\x14\xfd\x2d\xfe\x18\x0e\xa1\xf8\x0f\xc8\xc1\x08\xec\x37\xf0\x11\x41\xc5\x11\xf1\xfb\xf0\x38\x45\xfe\x06\x3e\x0c\x48\x34\xa4\x7e\x1f\x9e\x84\xa8\xdf\xc0\x07\x21\x4e\x06\x7f\x00\x4f\x21\xe8\x6f\xe0\xa9\x08\xc5\x28\xf2\x77\xe1\xa1\xdf\x02\x23\x70\x40\x26\x3f\x4c\xeb\x1f\xb5\xe7\x57\x36\xbc\x9a\x27\xba\xe5\x28\xe5\x1a\xf4\xe1\x47\xe2\x4a\x51\xa7\x35\xa9\xca\x50\x6c\xf9\xf6\x65\xe3\xab\xfa\xff\x07\x8c\x7c\x57\xb8\xff\xf9\x0f\x6e\xe0\xdf\x41\xf1\x2b\xaf\xb0\x92\xfa\x6e\x8a\x64\x23\x93\x24\x61\x84\x44\xbe\x77\x1d\xc6\x3c\xee\xb2\x5f\xbe\xc1\xbf\xc1\x4f\x1c\xb1\x1d\x05\x1d\xa1\x2b\xb1\x26\x85\xf8\x11\x2a\xd7\x94\x07\x5a\x13\xae\x35\xbd\x5c\x2f\xd6\xde\x2b\x05\x65\x07\xe4\x48\x5e\x09\x6c\xcd\x7e\x36\xb7\x89\xaf\x3d\x54\x79\x40\x57\x37\x8c\x5f\x29\xe8\x44\xac\x89\x24\xbc\xce\x05\x3f\xf8\xd0\x2b\x09\x96\x6b\xce\x44\x1e\xc9\x0c\x3b\xa2\x0a\xba\xc6\xd2\x04\x55\x7e\xa2\xe6\x6c\x4d\xe2\xca\x35\x87\x3d\x50\x47\x64\xcb\x58\x91\x23\x32\xe0\xd9\x01\x5d\xaa\x35\x4e\xde\x81\x0a\x4a\xed\x08\xe8\x88\x64\xe8\x11\x55\xb0\x2d\x6c\xc0\x4b\xf4\x13\xe4\x12\x19\xba\x86\x16\xc4\x27\x11\x24\xb3\x35\x83\xf8\xc1\xd9\x4f\xf5\xe2\xdb\xbf\x32\x72\xf8\xdf\x33\xf2\x35\x47\xfa\x18\x39\x06\x1e\x41\x18\xf9\xd8\xf9\x57\x2f\xfc\xb3\xf7\xbf\x65\xe8\x1f\x5f\xf1\xcf\xfa\x86\x23\x28\x05\xfd\x9b\xca\x49\x80\x10\x82\x87\xff\x5b\xe5\xfc\x43\x4e\x20\xff\x26\x27\xa0\x23\x06\x41\x5f\xbc\x80\x8e\x04\x84\x7f\x78\x81\x63\x47\x78\xeb\x87\x7f\xf6\xff\xf5\xb9\xf1\xc3\x0e\xf0\xf5\x78\xc6\xb0\x23\xb6\xe6\xab\xc4\xe1\x08\xaf\xda\x78\x38\x22\x5b\x15\xe0\x88\x1c\x88\x23\x72\xf8\xa4\xad\xc8\x1a\x9f\x1f\xa0\x2d\x57\x3f\x12\x16\x4c\xad\xa9\xf6\x6a\x34\xf0\x3a\x86\xa3\xd1\x3a\x73\xcb\x72\x91\xc3\x27\x2d\x5b\x33\xc0\xc3\x16\x95\x23\x87\xad\x20\x84\x1d\xa0\xc3\x1a\xbe\x6c\x89\x3a\x71\xd8\xf0\xad\xab\xae\x70\x6b\xaa\x72\x24\x0f\x47\x6a\x07\x7f\x95\x44\x56\x42\xa0\xe3\x56\x4c\x39\x42\x5b\xaa\x4e\x1c\xf1\xdd\x9a\xb9\x13\x47\xe8\x53\x5c\xc2\x0f\x47\x74\x07\xaf\xf9\x2d\xb6\xc3\xd7\x7c\xfa\x53\x6d\x5b\xb3\xc3\xcd\x36\xd6\x0b\x7c\x43\x74\x84\xd7\xcc\xfd\xf0\xa9\x8e\x21\x3b\xb0\x3a\x50\x6b\x5c\x83\x1d\x91\xe8\x88\x6d\xdd\xdb\x7e\x77\xd0\x06\xb4\xb1\x81\xf8\x6c\x7f\x45\x0b\x1d\xe1\x03\xbe\x75\xaf\x89\xe6\x6a\x85\xc4\x0e\x5e\xdf\xef\xd0\xdd\x11\x5d\x93\xe0\x75\x2a\xbc\x43\x37\x0a\x88\x6d\x4b\xd8\xa7\x22\x01\x1f\x89\x0a\xde\x6a\x6f\x19\x74\x84\xa2\x95\x94\x95\x4b\xd0\x07\xdb\x56\x94\xc2\x56\x86\x6c\x35\xbd\x4f\x31\xed\x48\x2d\x15\xb2\xd1\x91\x41\x47\xec\x8a\x90\x6b\xa0\x8d\x44\xe0\x6e\x65\x1d\xfa\xb5\x8b\x35\x0c\x47\x77\xe0\x46\xfd\x3a\x17\xfc\x70\x69\x13\xde\xaf\xf1\x6f\x73\x87\x0d\x7c\xab\xf7\xad\x71\x25\x15\xfd\x06\x6c\xab\x56\x6c\x0c\xdf\xea\x03\x1f\x4e\xae\x84\x1c\xd6\x1d\x46\x47\xe2\xb8\xe6\x57\x1b\x75\x2b\xbb\xd6\x68\x91\x88\x3e\xb4\x7f\xa4\x84\x6f\x42\xf8\x4c\xd9\x3c\xe8\x11\x5a\x29\xc6\x0f\x1b\x22\xf4\x43\xf2\x11\x3b\x7e\xa6\x7c\xd8\x0d\x6f\x2f\x7c\xd5\x94\x0f\x1a\x6a\xdd\xcb\xaa\x33\xeb\x28\x75\x44\x57\x5c\x2b\xcd\xe4\x46\x30\xb4\x6d\x71\xa5\x0f\xd9\x81\x87\xd5\xdb\xae\xaa\xb9\x92\xb5\xd1\x7b\x58\x89\x5c\x77\xfb\x5d\x11\x8e\xd0\x52\xc1\xe4\xaa\x7c\x68\xb4\x6e\x17\xf9\x88\x79\x63\x15\x75\x5c\xe5\x89\x7f\x76\xf4\x87\xa4\x20\x1f\x61\xad\x88\xb7\x6d\x7d\x0a\x23\x1f\x96\x7f\x89\xe1\x3b\x08\xb9\x4e\xdb\x3a\x57\x76\x64\x87\x23\xf5\x59\xf3\x43\x36\x72\xd8\x14\x18\xda\xca\x86\xd4\x56\x8b\xda\x2a\x5c\x5b\xc5\x6c\x1d\xdc\x0e\x83\x15\xcf\x7a\xfe\xac\x81\x39\xb1\x62\xc4\x76\xd0\x47\xf3\xd1\xad\x60\x80\x6f\x65\x1c\xf2\x88\xa8\xc8\x57\x95\x13\x8f\x8e\xd8\x71\xab\xd1\x6c\xda\xb8\xb1\xf8\x8b\x51\x1f\xf2\x56\x66\x6f\xd2\xa0\x56\xe2\xe0\x8f\xb0\x56\x26\xad\x92\x3d\x7e\xf2\x20\x2a\x3a\x52\x1b\x30\xfc\x99\xb3\x6d\xe2\x27\x3f\x37\xaf\xb0\x11\x8b\x7d\xf1\x17\xfa\xd8\xe5\x52\x1d\xb0\x23\xb2\xd2\xb0\x1d\x7d\xab\x7f\x58\xcd\x71\x35\xce\x55\x25\x3f\x62\xc6\x7e\x20\x3b\x6c\x72\x81\x7f\x60\xdb\xe4\x76\xa4\xb6\xde\x0f\x83\xd7\x43\x19\x3e\x41\x44\xb4\x0d\x7c\xe4\xf0\x13\x1e\xdd\xd6\x85\x3f\x68\x90\x55\x7a\x1b\xe6\xdd\x77\x1f\xb1\x59\x0d\xba\x83\xa2\x35\x37\x5f\x05\xb4\xd5\xe9\xa0\x23\xfa\x95\x92\xed\x56\xd8\x95\x78\xf8\xb8\x55\xd4\xe0\x03\xba\x52\x87\xad\xa7\xf9\x11\xda\x6a\x72\x2b\x6b\xe0\x8f\xad\x7f\xbc\xdd\xca\xda\xcd\x4e\x56\x6f\x81\x2c\xd5\x3a\x81\xfc\x61\xc8\xd8\x47\xda\xf0\x56\x4e\x85\x56\x4b\xc3\xa2\xcf\xee\x7f\xf2\x62\x63\xd2\xe6\x22\xa2\xad\xf8\xb8\x51\x8e\x7e\x8c\x6d\x5b\x71\xc3\xb2\x8a\xf6\xb0\x21\xfa\x68\x13\xba\xb2\x74\xb5\x83\x95\xf9\x9f\xff\xb0\x4d\x8d\xbe\xd4\xe1\x63\x79\xeb\x32\xd8\xb6\x0c\xba\x85\x10\xe4\x07\xdd\x4a\xc1\x2a\x63\x6a\xb7\xb9\xc9\xe3\x56\x45\xdd\xe6\xc3\x3b\xf4\xbb\xd2\x6e\x75\xe1\xcd\x6c\xc8\x4f\xe1\xe4\x93\x8b\xaf\x5e\x0d\x39\x6c\x6e\x1b\xfb\x18\x21\x75\x24\xb7\xcf\x33\xb0\xcd\xf1\xe3\x2b\x89\xbf\xa2\xf3\xf0\x63\xbf\xc4\x97\x8a\xaf\x7e\xf3\xb3\x27\xf4\x48\x55\x5b\x72\x8b\x6c\x9e\x0c\x8a\xd6\x75\x3f\x5e\x07\xfa\x6e\x26\x3f\x9d\xd3\xba\x27\x74\x58\x1d\xdd\xba\x9b\x0f\xba\xd5\xa5\x80\xc3\xc6\xd7\xc3\xb6\xf4\x87\xd9\xeb\xae\xe1\xa5\x22\x36\x5f\x80\x66\xd0\xa7\xe6\x81\x7d\xdc\xe4\x11\xfa\x28\xe3\xa6\x90\xd8\xe6\xf5\x0e\xd0\x8a\xf7\x57\x24\xa0\xdf\xd5\x7a\xfb\xef\x37\x2e\x67\x95\xdd\x8a\xe7\xcb\x3d\x7c\xd4\x8b\x58\x37\xfd\xb5\x33\xea\xbb\xc3\xc0\x36\x54\xe4\xe1\x3b\xc6\x8d\xb5\xf8\x47\xaf\x3f\x2e\x03\xdd\xad\x8b\x63\x1f\x0f\x8a\x7f\x6c\x02\xf9\xdf\x4e\x27\x3f\xd3\xd1\x45\x85\xb0\x1d\x46\x44\xbf\x16\x3e\xb1\x19\xc3\x2a\xbe\x8d\xe6\x4d\x49\x37\xb6\x23\x9b\x67\xd9\x0e\x90\xe8\x23\x13\xf4\x48\x7e\x38\xf8\xf9\x6c\x6a\x73\x6f\xbb\xcf\x07\x36\xc4\xe1\x4b\x7b\xc9\xcf\x8c\x0f\xa9\xeb\x01\x1b\x41\xdf\x61\xc9\x2f\x58\xea\x87\x2b\x43\x7f\xe5\xca\x7e\xfa\xf9\x4d\x66\x44\xf4\xdd\xd1\x23\x3f\xdc\x0e\xb9\x49\x6c\xb7\x91\x8d\x7f\x4e\x38\x64\x7d\xbf\xaa\xfd\x77\x5e\xab\x10\xbe\xc3\xc1\xd5\x19\x7e\x59\x03\x7c\xd8\x3c\xcc\xba\xee\xaa\xb6\x9f\x53\x7f\xf7\xe3\x54\x84\x3e\x21\x42\xb4\x49\xf8\x08\x7d\xb9\x2d\x64\xdd\xc7\x4f\xf7\xb5\xee\xee\xeb\x7c\xda\xbc\xf8\xba\xfe\x67\x2b\x47\xf2\xbb\xd7\x5b\x8f\x26\xf2\x1f\x9c\xc7\x76\xa2\x7c\xef\x5b\x6d\x71\xd3\x94\xaf\xa3\x65\xd3\x39\xea\x8b\x42\x68\xb7\x61\x5b\x55\x50\x85\xa8\x1d\x0e\x7f\xd4\x6f\x5d\x6e\x3b\x92\xf0\x8f\x38\x3f\x42\x86\xbe\x4e\x9c\x8f\x8f\xfe\xda\xc6\x6a\x4c\xab\x45\x20\xdf\x1d\x1d\x72\xf8\x3a\x84\xbe\x1f\xd8\x9b\x0c\xbf\x9c\xf2\x17\xbb\x7f\x37\x75\x42\x7e\xa6\x4e\x7f\x18\xe0\xa2\xff\x5e\x80\xbb\x66\x5c\x38\xf5\x09\x70\x09\xf4\x08\x83\x5f\x01\x2e\x46\x1e\x89\xad\x1f\xfe\xe5\x1b\x49\x1c\x09\xf0\xbf\x1b\xe0\xfe\x36\xaf\xbf\x53\xc9\xfd\x8e\xff\x41\xa2\x4e\xfc\x36\x31\xbe\x93\x49\x7c\xc7\xfe\x20\xf1\x86\x7e\x1b\x3d\xdf\x91\x04\xbf\xff\x7e\xf4\x7c\xc4\x21\xf8\xb7\x85\x83\x28\x0e\x93\xf0\x8f\x12\xf5\xdf\x82\x23\x51\xf4\x47\x75\x06\x02\xfb\x9d\xba\x01\x11\x92\xf1\x1f\xd4\x01\xc8\xdf\xa9\x63\x44\x41\x00\x45\x7f\x54\x07\x20\x7e\x1b\xff\x87\x11\x49\x86\x7f\x40\x3e\x05\xff\x16\x3e\x48\xf0\x28\xf8\x23\x78\xfc\x77\x92\x91\x3b\x1a\x53\xbf\x0f\xff\x67\xd6\x0d\xb2\x03\x4c\x5c\xa1\xdf\xd7\x7b\xf4\x5f\x96\x0c\xfe\x61\xf6\x7f\xb5\x5a\xf0\xbd\x63\xa5\xf6\xd1\xe4\xf5\x2f\xdf\xc2\x64\x48\xca\x7f\x2a\x2c\xfe\xf7\xaa\x8a\xcd\xdf\x65\xc1\xbf\xcb\x82\x7f\x97\x05\xff\x5a\x65\xc1\x35\xc3\xfa\xd3\xca\x82\xf8\x96\xef\xad\x51\x1f\x75\x24\x23\xf0\x00\xef\xb6\x62\x1f\x71\xa4\x0e\x9f\x3c\x18\xfa\x1e\x63\x6d\x49\xd7\x1a\xef\x90\x9f\xc0\x6b\x8d\xde\xd7\xb0\xfe\xab\x2c\xf0\xc9\x0b\xe1\x35\xfc\x20\x77\xe8\x16\x23\xee\xd6\x58\x6a\xcd\xbe\xa8\x1d\xb1\x7d\x4c\x4f\x7c\x6e\x18\xda\x6e\x3e\x20\x76\xe8\xe7\x7e\x9e\x1d\xb1\xc5\x60\xc8\x16\x66\xec\xb0\x2d\xbe\xc7\x77\x9f\x1c\x61\x03\x3e\xa0\x9f\xc9\x87\x2f\x24\xed\x9a\xac\xac\x21\x09\xf1\xc9\x93\xa2\x2d\x3c\x5d\xff\xe0\xaf\x5b\x16\x3e\xc0\xe8\x52\xa1\x5b\xc4\x12\x81\x5b\x21\x04\xdb\xad\x41\x14\xbe\xdb\xee\x2c\xda\x7d\xcf\x59\xd7\xa0\x79\x6b\xdb\x2d\x64\xc6\xb7\xfa\x08\x11\x6d\x69\xdc\x16\xba\xc2\xdb\xd6\xf1\xed\x9e\x16\xf0\x13\xd8\x62\x87\x4f\x72\xb3\x66\x1f\xd0\x16\x16\xc1\x9f\xc8\x77\xeb\x27\xda\x03\xb2\x3b\xe2\x87\x0d\x6b\xf4\x95\xe6\x6f\x61\xfc\x6e\x03\xda\x6d\x89\x01\xbc\x09\x0d\xdc\x4a\xa4\x87\xad\x44\xfa\x55\x45\x25\xfe\xae\xa2\xfe\x5d\x45\xfd\xbb\x8a\xfa\x77\x15\xf5\xef\x2a\xea\xdf\x55\xd4\xbf\xab\xa8\x7f\x57\x51\xff\xae\xa2\xfe\x5d\x45\xfd\xbb\x8a\xfa\x77\x15\xf5\xef\x2a\xea\xdf\x55\xd4\xbf\xab\xa8\xff\x17\x56\x51\x9f\xc8\x5f\xeb\x5b\xe9\xf5\xf4\xf3\x07\x96\x48\xea\xf3\x34\xea\x77\x40\x78\xee\xf4\xb4\x5a\xc1\x97\xc2\xab\x71\xa7\x4c\x5e\x60\x4e\x85\xcf\x98\x92\x7e\xce\xd0\xf1\xad\x21\x5c\x7b\x43\x55\x5d\xd4\xc9\x10\x18\x1d\x56\x3a\xf1\x23\xc6\xfb\xe0\x08\xa2\x0d\x25\x29\x91\xc9\x8b\xd5\x78\x4d\x03\x2f\x0c\xbd\xb8\x8e\xe1\xd0\xd3\x26\x3d\xc8\xc4\x39\x5a\x92\xb0\x5b\xde\x0b\x32\x24\x14\x45\xa0\xa0\x6b\x9a\xa7\xc2\xad\xb1\x28\x09\x7b\x34\x3a\xe1\x96\xea\x13\x09\xf8\x30\xe9\xd3\x9b\x8a\x10\x77\x6a\xaf\x43\x94\x54\x55\x38\xb7\xd4\x6c\xe3\xfb\xfe\x74\x26\x9b\x40\x4f\xee\xf3\x33\xd6\x39\x0e\xf3\xab\x0c\x1b\x61\x7c\x54\x0b\x3e\x6b\xc8\x73\xc7\x75\x3d\x7f\xb9\x09\xec\x7b\xd0\x00\xb4\x3f\xdf\x34\xf1\x04\xda\x18\xc5\x61\xa4\x07\xb0\x30\x11\x08\x1a\xad\x20\x5e\x97\x55\xed\x38\x62\x22\x3b\x6b\xe8\xbe\x5f\xfa\xfd\x45\xe9\x8c\xd6\xd1\x27\xdd\x98\xf0\x9b\x4a\x37\xc6\x83\xa1\x47\xe2\xb2\x0f\xf9\x2b\xab\xaa\x46\xfa\x9a\xd3\x76\xaf\x08\x2d\x94\xed\x63\x31\x26\xc3\x3a\x00\x8d\xca\xbb\x50\x17\x05\x3f\xfb\xe9\x48\x0f\x17\xe1\x26\xcb\xcd\x8c\x5c\x51\x94\x4d\xb5\xfb\x40\xf8\x13\xd9\x28\xa7\x7d\xe9\xf0\xe9\xb0\x08\xa4\x1f\x67\xcb\xbe\x46\xa1\xb6\xa6\x45\x53\xc4\x52\x87\x1f\xd9\x72\xc9\x4e\xf1\xd0\x75\xc2\x74\xd7\x66\x5f\x06\xf9\xfa\xdc\x2c\xb2\x8c\x25\x62\x74\x87\x5e\xa7\x06\x12\x2f\x53\xf7\x18\xa5\xfd\xf3\x3e\x54\x68\x0a\xb8\xd0\xab\x3b\xa7\xc9\xdb\xe7\x61\xcb\x3b\x5b\x92\x42\xed\x5d\xf0\x51\x80\x15\x6b\x65\xf4\xc4\x79\xa9\x21\xa7\xa1\xe6\x4d\xb7\x17\x82\x0d\x86\xcc\xe6\xb2\x51\x58\x8e\x17\x47\xd0\x3e\x8d\xa2\x0c\x12\x4e\xa2\x5e\xc9\xbd\x94\x32\x6c\x1c\xe1\xf8\xeb\x6c\x9c\x54\x91\xda\x43\x9a\xf4\x74\xe6\x72\x9a\x4e\x5d\xef\xe2\x29\x9f\xdb\x52\xbf\xd7\xd0\xf9\x11\xbb\x69\x37\x83\xb3\x5d\xc5\xda\x43\x58\xa2\x51\x7e\xf8\xa0\xea\x10\xaa\xd2\xed\xa5\x47\x63\x05\x31\x84\x0b\x8d\x34\x21\x21\x40\x83\xdc\x8d\x10\x7c\xaf\x6e\xe3\x27\xfd\x70\x54\xee\xf2\x90\xb0\x45\x4f\xef\x0d\xd3\x9a\x4d\x9c\x65\x62\x76\x3b\xdd\x19\xc6\x01\x6a\x91\x16\xcd\x6e\x72\xa5\x4b\x8a\x95\x36\xac\x75\x6f\x09\x8b\x15\xd0\x62\x30\xf9\xbc\x28\x4d\x5c\x36\x2f\x2f\xb8\xf0\x41\xa7\x8b\x4b\x27\xbf\xb0\x54\x44\x2c\x8c\xd3\x1e\x3d\x2d\x63\xda\x43\x3e\xdf\x75\x5f\x96\xc0\xa6\x60\x0a\x2b\x4e\x2a\x36\xb7\x52\x0b\x78\x17\x86\xa6\x58\x89\xde\x4d\xcc\x03\x55\x2c\x76\xbc\x0b\x1d\x0f\x16\xef\xd7\xcb\x23\x6e\x57\xb5\xee\x29\xaf\x54\xbd\x19\x2e\x09\x95\x07\xe3\x85\x46\x72\x5a\x33\x66\x1f\x1f\xdc\x89\xc5\x21\xc7\x47\xa1\xc5\x9e\xb5\xc8\xcf\x70\xc0\x60\x35\xcf\x18\x96\x1c\x8b\x4d\x84\xaa\x4f\xd7\x17\xc4\x38\x73\xaf\x8a\x34\x6d\xb6\x02\xde\x85\x61\x82\xe6\x32\x07\xbd\x89\x4b\x85\xe5\x02\x13\x57\x2e\x64\xb5\xdc\xbd\x54\xf2\x9e\xc1\x5b\x8f\x02\xf7\x34\x6d\x70\x27\xda\x25\x62\x17\xf4\xeb\x25\xfd\x73\x1f\x6d\x53\x3d\xd1\xbf\x98\xef\x60\x7e\x3c\xda\xa6\xa0\xa8\x37\x08\xd1\xce\x44\x50\xcf\xf6\x6d\xbf\xfb\xc7\xb5\x0b\xa3\x24\x08\xeb\x5b\x8b\x72\xbe\x79\xb2\x1a\x35\xc3\xb9\xf4\x45\x10\xef\x7a\x4f\xdf\x1b\x1a\xd8\x4b\x77\x94\x69\x8a\x3d\x0b\xb2\xf7\xe9\x6a\x72\x4c\xb6\x97\x60\xed\x75\x5b\xde\x4f\x0b\xe2\xae\x43\xd8\x39\x88\x75\xd6\xa3\x8a\xb4\xac\xb2\x3d\x97\x49\xd4\xd6\x54\x6c\x13\x48\x7d\x21\xb1\x2b\xc0\x50\x27\xf0\x44\x90\x17\x25\xee\x00\x85\x2b\x0d\xa8\x57\xfd\x39\x94\xe8\x54\xa2\x6a\x8a\xba\xb8\x53\x93\x90\x48\x5d\xe4\x0b\x95\x71\x5c\x90\x20\x08\x78\x1e\x26\x05\x25\x2f\x18\xe4\x4d\x15\x90\xd4\x5a\x27\xeb\xe1\x75\xa4\x33\x90\x8f\xf0\xc2\x7f\x7a\x41\x47\xe9\x75\x09\x8b\x0c\x0b\xc2\xa7\xf7\x43\xc5\x7c\x22\x43\x75\x72\x4f\x08\x9d\x24\x5c\xcf\x28\x75\x79\x4f\x4e\x5d\x12\x7d\x24\xc5\xf7\x6c\xd8\x33\x12\x37\xec\xef\x4c\xf4\x20\x9e\x40\xe7\xa9\xfa\xbb\x85\x4d\xef\x6a\x8f\xe8\xc5\x83\x9d\x5a\xb0\xdf\x1e\x1b\x86\x3e\xd1\x3d\xd5\x96\x86\x10\x81\xb3\x38\xfa\x62\xa0\xe9\x99\x17\x9d\xb3\xd2\x82\xba\x9e\x51\x6c\xc1\x5b\xad\xfe\xae\xa6\x89\x5f\xe0\xf2\x1d\x20\xef\xfa\x49\x77\x88\x88\x07\x71\x1a\x1b\x19\xf3\xac\x12\xa5\x10\x9a\x58\xab\xda\xc7\xf3\xa2\x37\x1e\xf3\x36\x6c\x2e\xaa\x04\x41\xb3\x88\x1c\x51\x4d\x6e\x59\x74\x76\x04\x86\x21\x20\xf3\xc2\xd9\xb3\x17\x63\xaa\x20\x94\x61\xb2\xe1\x1c\x9d\x14\xf1\x29\xea\xf6\x85\x3e\x4f\x53\xa2\x84\x6f\x33\xa5\x0b\xbf\x7f\x30\xf1\x09\x15\xb1\xc6\x3d\xbb\x9e\xe3\x42\x94\xaf\xa0\xde\xab\xaf\x69\x55\xc8\xea\x17\xc4\xbc\x5c\x3f\x0d\x7c\x48\xa5\x4f\xb4\x65\x5c\x72\x87\xc2\x17\x79\x29\x1c\x02\xaf\xc6\x24\x0b\x2e\xc3\x84\x67\x54\xaf\x0e\x84\x2c\x68\x88\xd9\x3c\x15\xb4\xb1\x69\x09\x3d\x99\x19\x3a\x5a\x25\x42\x51\x53\x19\xec\x41\xd0\x0f\x4d\x64\x7e\x4b\x8b\x4a\x59\x8b\xf5\x4a\xcf\xe7\xba\x91\xa3\xa2\x14\xdf\x27\x90\x64\xa3\xf3\xa3\x66\x3a\x45\x61\x5b\x8b\x17\xc5\xa7\xe5\x9e\x87\x53\xc7\xc9\x5a\x23\xe4\xcf\x67\x7b\x06\xfb\x52\x6a\x39\xce\x61\x59\xda\x56\x4b\xc6\x28\xb4\x3e\xc8\xf8\x39\xbf\xd9\x91\xd2\x56\x02\x23\x07\xc6\x14\x5c\x0a\x0c\xb1\xcb\x53\x22\x17\x2a\x01\xd2\x0f\xba\x69\xd8\x34\x63\x2e\x05\xd5\xca\x9d\x34\xbc\x3a\xfd\x65\xa1\x02\x13\x98\xf5\xd9\x32\x3d\xb2\x7b\xc0\xdc\x25\x43\x4a\x81\xc1\x8c\x11\xbe\x69\x82\x8c\x29\x66\x83\x8f\x68\x2b\x77\x70\x9a\xd2\xcb\x3c\xe6\x31\xad\x6a\x00\xd5\x4b\xba\x75\x4b\x4b\x46\xe1\x2e\x98\x20\x20\x95\xc9\x21\xe3\x89\xa7\x5e\x57\x73\x68\x4e\x6f\xe7\x79\xaf\xf7\x0e\x6f\xc8\x20\x40\x58\x59\x37\x86\xcd\xe9\x8c\x3f\xe2\x13\x69\xde\x26\x8b\xc5\x88\xcc\xba\xf2\x76\x48\x24\x18\x00\xf7\xa0\x30\xbd\xf4\xd3\xb9\x19\xf7\x64\x7e\x43\x4b\xdf\x87\x0d\xb1\x47\xf2\x38\x93\xa6\x0b\xe1\x13\x4f\x92\xa6\x47\x5a\x61\xc5\x9b\xcc\xeb\x8c\xc8\xfe\xe9\xbe\xe2\x2f\xf6\xd4\xdd\x9f\x71\x46\xfb\xe3\x87\x1c\xfb\xd0\x8c\xcb\x57\x55\x3b\x4c\xd8\x04\xa0\x93\x38\x06\x97\x3b\x22\xcb\x42\xfb\x73\xf5\xce\xa6\xc6\xeb\x80\x94\x19\xbc\x73\x4e\xa0\xd2\x1d\xa5\xaf\xa0\x8f\xb4\x9a\x2c\x80\xbe\x13\x48\xec\xab\x91\xee\x8f\xf4\x6a\x65\x7c\x2e\x0a\x68\xc7\x5d\xe2\x0b\x70\xbf\x24\x97\xc0\x92\xbb\x3c\xc1\xc4\x5b\x4f\x3c\x97\x05\x49\x80\x88\x58\x3a\x59\x94\x02\x09\x1d\x6a\xea\xb9\x07\x74\x24\x43\x13\x34\xc0\xf5\x01\xe7\x1b\x83\xe1\xf2\x99\xd0\xb1\x77\x04\xe9\x90\xd7\xe1\x9e\x4e\xaa\x58\xf2\xf0\x1a\xdc\x39\xef\x63\x37\xec\x93\x2a\xb1\xc5\xf8\x39\x68\x71\xae\x25\x94\x3f\x18\x4a\x82\x32\x39\xaa\x57\xf6\xd3\xac\xe6\x17\x59\x11\xd0\xfb\x49\xa0\xcc\x24\x0b\x70\x37\x4a\xa7\x81\x6e\xf6\x77\xa0\x84\x6c\xd8\x7f\x82\x4b\x94\x9c\xf2\xe5\x7e\xb9\x05\xc0\x64\xd6\x77\xc6\xcc\x44\x94\x35\x5e\xb4\x9f\x37\x8c\x9b\x78\xdc\x4c\x93\x5c\x8e\x27\x39\x14\x25\x1e\x0b\x79\xcc\xf8\xb6\xbd\x93\x7e\x82\x07\x17\x8f\x22\x86\x61\x54\x09\x67\x5a\xcb\xe1\x8d\x25\x28\x44\x05\x9f\x18\xb0\x1b\x1e\x33\x33\x99\xda\x14\xb3\x5d\x04\x7b\x77\xd2\xa4\xec\x39\x70\x6d\xee\x92\xc2\xf6\xe3\x7e\x8d\x47\x3c\x7b\x49\x0d\x4f\x31\xb0\x38\x15\x3c\xe7\x96\xca\x89\x68\xd1\xa4\xeb\x12\xb8\xb0\x9e\x60\xc3\x99\xc9\xf2\x36\x46\x56\x92\x68\xa4\x11\x4f\x6f\x10\xa8\x64\xb5\xe2\x31\xe4\xd5\xc0\x88\x8b\xee\x47\xcc\xda\x1b\x58\x93\x35\x21\xe5\x21\x5d\x7a\x4a\x2f\xa4\xa3\x18\x34\xcb\x12\xa9\x3a\x51\x95\x6c\xe8\x08\xc8\xbb\x78\xc5\x9f\x9e\x7e\x4e\x4e\xd1\x99\x8f\x17\xb5\x8f\x1e\xf7\x42\x8e\xde\xf6\xbd\x7a\x55\xb9\xe0\x33\x13\x2b\x00\x52\xbc\x4f\x83\x59\x3e\x8f\x8d\xf1\x38\xc5\x6f\x1a\x1b\xd0\x93\x4c\xb0\x2f\x14\x95\x1f\x37\xcd\x7d\x06\x69\xf0\x7a\x12\x06\xcd\x16\x2d\x78\xa2\x96\xda\x45\x70\x2c\x0f\x60\x94\x5b\x1a\x9e\x6b\x96\xcb\x39\x3c\x91\xc9\xb5\x13\xad\xcc\x3b\xd9\xa3\xf6\x0e\xa2\xba\x15\x89\x17\xae\x2c\x2d\xdf\x07\x74\xa9\xe9\x15\x95\x11\x9c\x65\x5d\x1f\xca\xcc\xaa\xc5\xf3\xc9\x49\x7b\xd1\x82\xad\xce\x70\x69\xc8\x2c\xe5\x06\xf4\x30\xbc\x86\xbd\x3d\x6e\x9c\x8a\xaa\xe0\x82\x62\x12\x28\x57\xbd\xbe\xdc\x59\xde\xb7\x00\xf3\xee\x32\xff\x3e\xb8\x0b\xe4\xa4\xfb\xc5\xe1\xa2\x87\xaa\xab\x15\x98\x21\xcf\x89\x7f\x08\x55\x80\xb0\xa1\xd4\xb3\x7d\x4c\x34\x6a\x04\x2a\x0a\x74\x4b\x2b\xbe\x7c\x8a\xe7\xce\x45\x98\x3d\x84\x9d\x24\x51\x93\xec\xb7\xea\x4b\xe5\xe5\x44\xe4\xa0\x83\x42\xda\x5b\xaa\x4d\x7e\x2e\xfd\xb0\x47\x4d\xec\x65\x84\x06\x13\xd0\x19\x85\xdd\xaf\xf2\x8d\xad\x9f\x06\x5b\x87\x14\xf7\x76\x6f\xf3\xdb\xe4\x4d\x0b\xd7\xb8\xc4\x19\xf7\xf3\x29\xf0\x32\xe2\xdd\xa1\x2c\xca\x90\xf3\x9e\x1a\x8a\xb1\x26\x8a\x51\xd6\xcc\x27\xd7\x04\x54\x90\x0b\x32\xe3\xd7\xc2\xde\x8c\x4c\xfe\x65\xc0\x09\x54\x21\x26\xc9\x30\x29\x3d\x53\xc5\x42\xcd\x2d\xcb\xe3\x7f\xf2\x23\xf4\x9a\xf8\x2f\xf6\x23\xb0\x39\xf6\x33\x47\x29\x3e\xbf\xc0\x01\x54\x61\x8f\x08\x77\x1e\x92\x4d\xd3\x79\xba\x7e\x96\xd0\x8a\xc6\x38\xa6\x73\x9d\x89\x68\xa6\x9c\xe2\x82\xcb\x2e\xb0\x57\xc2\x0e\x94\xf4\x56\xe8\x73\x34\x55\x98\xd0\x79\x09\x81\xd3\x7b\xbc\xed\xc8\xac\x1f\x80\x0f\x0b\x9b\x6f\xf0\xed\x82\x61\x44\x88\xa9\x95\xed\x3d\xd3\x8a\xd3\xeb\xfb\x25\x22\x1e\x4b\xad\x8a\x92\xe6\xeb\x39\x18\x27\x98\x33\x54\xcf\x8b\x39\x3d\x1f\x3c\x50\x84\xda\xcb\x05\x41\x8c\xbb\xf6\xa4\xed\x8e\xd0\x89\xc0\xc8\xdb\xbd\x10\x52\x2d\x3d\x57\xdd\x3c\x59\xba\xf9\x38\x4b\x0f\xd0\xb0\x5d\xc0\xe4\x72\x5f\xf4\xc4\x90\xe0\x4a\x04\x06\x12\xef\x7d\x6d\x63\x30\xb5\xd8\x89\xaa\xf2\x17\x0b\x36\x0d\x1b\x3f\x71\x2a\xc5\x0c\x20\xc3\x2f\x8a\x06\x76\x33\x36\xd7\x52\x31\x2e\xea\xe8\x8c\x19\x2c\x8c\x6a\x1c\x85\x5c\xce\xde\x0c\xaf\x2c\x5e\x02\xfb\xe4\x1b\xdd\x06\xc6\x3c\x83\xfc\x87\x22\xd5\xb4\x16\x71\x7b\xc0\x09\xa8\xb0\x47\xc6\x73\x29\x0e\x6f\xe6\xc6\x56\x49\x07\xef\x2d\x5c\xe5\xb1\x14\x6d\xc4\xf2\x46\xd1\x80\x44\x80\x1e\xcb\x65\x19\x97\x4c\xba\x66\x0b\x55\x3b\x9e\x99\x31\xaa\x7b\xaf\x10\x48\xfc\x6a\x69\xb7\xe9\xda\x83\x7d\xa1\x58\x62\xcd\x44\xaf\xb2\xd6\xd0\x53\xc3\x1a\x52\x20\xf5\xd2\x40\x28\x4e\xd3\xa8\x97\xd4\x20\x5e\x04\xa6\xd0\x74\x88\x51\x0c\x95\xb2\xcc\xc9\x92\xd3\x57\x52\x99\x6f\x0a\xad\x54\xb9\xe2\x60\x94\xbd\xab\x64\x1d\x12\xf6\xc9\x17\x0d\x4d\x79\xd2\x85\x53\x44\x21\x8e\x9f\x67\x91\x11\x04\xde\x35\xaf\x0a\x46\xa4\x02\x7f\xc2\x5e\x0f\x52\x99\xc6\x28\x80\x5f\x16\xc2\xdf\x82\x3e\xad\x16\x7a\x84\xd1\xd8\x04\x3c\x23\x1d\xbb\x96\xb5\x98\x87\x2e\xc5\x6e\xe8\x34\x3c\xec\x9c\x15\xa6\xbe\x92\x74\x04\x44\xb9\x7b\x6a\x65\x0a\x48\x4b\x57\xa9\x39\x5c\x86\x87\x54\x6f\x97\xf6\x12\x5f\x8c\xf8\x9e\x18\x50\x04\xd8\x99\xdc\xd8\x29\x57\x53\x34\x22\x3b\x3c\x07\x60\x70\x8c\x62\x53\x94\xdd\xda\xa1\x79\x73\x38\x73\x07\x6e\x38\xf8\xce\xaf\x88\x41\xdd\x00\x30\x0c\x45\x07\xea\x9b\xa7\x2f\x16\x77\xde\xb4\x0c\xe4\x1a\xb6\xea\x58\x82\xaf\xf2\xd5\x48\xb4\x59\x59\x8d\xee\x7b\xee\x0c\xc6\xcd\x9b\xa0\x94\x3b\xa3\xf2\x7c\x4c\x3e\xc4\x16\xe8\x0d\xc4\x2f\x09\xfd\x2c\x68\x42\xd8\xf3\x5e\x7e\x85\xdf\x39\x7b\x27\xc9\x7b\x33\x78\x19\x13\x36\xc0\xf0\xd2\x91\x0e\x84\x81\x9b\x5f\x9d\x85\x97\x5d\x2c\x3e\x84\x83\x62\x43\xf5\xbc\x1a\x0a\x32\x99\x99\x80\xf6\x8e\xbd\x4e\xe8\x9d\x6b\x55\x57\xb3\x75\x15\xd3\x0b\x3a\xa0\x8a\x4a\xd3\x0f\x33\xad\x2e\x7b\xeb\x7c\xce\xff\x74\x9b\xfe\x8b\x3d\x0d\x2f\xe9\x7e\xfe\x7c\xeb\x03\x92\x4e\x3c\xef\x00\x39\xd1\x13\x37\x18\x49\xc8\x4e\x4c\xeb\x44\x34\xf4\x11\xc9\x6e\x5c\x51\x64\x46\x6e\xf5\xa3\x6a\x98\x7c\x18\xa0\xbd\x93\x3e\xaf\x25\xfb\x1e\x78\x23\xeb\xdf\x05\xdb\xb8\xaf\xc8\x30\xc0\xc6\xa6\x03\x5f\xd6\x5e\xe7\x39\x15\xf9\x31\x3d\xb1\x16\x83\xcb\x75\x4d\x24\x5e\x14\x7b\x80\x58\xc5\xa7\xab\xee\xfa\x82\x8e\xa4\x23\x41\x42\x04\x02\x0c\xd5\xe0\x17\x86\xd1\xd2\xa3\x36\x44\xc5\x8b\xc2\x9d\x7a\x96\xf8\x8c\x00\x62\xb4\x23\x7a\x27\x06\xc8\x79\x4f\x62\xfa\x3e\xf4\x2c\x0f\x4d\xdf\x45\x26\xe1\xf5\xd9\xd7\x5d\x42\x79\x7b\x4f\x46\x86\xfd\x29\xb7\x1a\x2b\xcb\x7a\x94\xe9\x5f\x90\xa6\x37\x77\x2e\x79\xc5\xef\x1b\x72\x43\xa3\x92\xe0\xd0\x33\xe2\x74\x34\x76\x9d\xaf\x74\x59\x9d\x9b\x77\x4f\xd1\x77\xf8\x46\x3f\xa1\x32\x62\x0d\xa4\x7e\xa5\x79\x2f\x57\xa1\x8f\x94\x00\x73\xda\xab\xf5\x49\xa5\xc4\xab\xa2\x83\xee\x88\xc8\x1a\x8d\x20\xac\xd1\x18\x46\xad\x90\x08\x2a\x3c\x08\x54\x77\xc4\x82\xd6\x78\xa9\x60\x2d\xab\x0d\xc8\xd4\x78\xa5\xbe\x2d\x45\x0c\xa8\x5f\x5b\x8f\x41\x20\x52\x94\x6a\x33\x67\xaf\x2e\x5b\x3c\x4d\x81\x6e\xf7\x0f\x2c\x95\x4b\x1a\xed\x60\x4a\x4c\x33\x34\x06\x3b\x10\x15\xe4\x8e\xd2\x8d\x97\x80\x3a\x42\xda\x57\x16\x4f\x93\xf4\x33\x09\xf8\x32\x2f\xdd\xd0\x37\xaf\x33\x50\xb6\x75\x0b\x68\x90\xc1\x14\x53\xc7\x6b\x02\xfa\x98\xf4\x29\x4a\x23\x06\x62\x6f\xd7\xcb\x7b\x50\xbb\x44\xc6\x24\x83\xeb\xce\x67\x49\xcc\xf6\x7b\x3d\xf2\xa8\xdc\x1f\xdd\x87\x27\x23\xc4\x7e\xd0\x41\x37\xf6\x0b\xf0\xd4\x51\xd4\xa3\xf3\xc8\xf3\x3c\xba\x42\x61\xb0\xd9\x88\x76\xd1\x3e\xba\x45\x43\x29\x10\x6f\x75\x49\xf6\x7d\x18\x4e\x1a\x0a\xde\xd5\xa0\x34\x55\x4e\x07\xf0\x6e\x0c\x72\x27\x91\x89\xb1\xbc\x81\x36\x07\x06\x58\xa6\xd8\xee\xd4\xac\xc6\x2b\xcb\xcf\xf7\xeb\x24\x9f\xdb\xd2\x6e\x67\x18\xa4\x5a\x78\xac\x55\x81\xb1\x7d\xed\xf6\x88\x80\x46\xe9\xa8\x54\x1f\x94\xcb\xb4\xcf\xa6\xeb\x59\x92\x2d\xd8\x77\xb1\x27\x1b\x5a\xf3\xd9\x16\x55\x99\x20\xb0\x0b\x79\x9d\x99\x91\x3b\xc7\xb0\x62\x73\x25\xe0\x61\x39\x39\x20\x16\xa1\x5d\x47\x6a\x38\x87\x18\xd4\x49\x36\xc7\x3b\x23\x2f\xd2\x1a\x3b\xc1\xc0\xdb\xe3\x79\x41\xf8\x33\x9f\x6e\xdf\xc4\xdd\x5f\xcc\xee\x9e\x3f\xec\xae\x58\x20\x49\x82\x78\x63\x02\xf6\x04\x1b\xe0\xe7\xe2\x35\xfb\xf9\x99\x8c\x64\xfe\x49\x1b\x21\x63\x08\x5c\x05\xb6\xd7\x4b\x2b\x30\x16\x35\x76\x98\x7c\xb1\x53\x5e\xc4\xba\x71\xba\x96\xb7\xbd\xc7\xd7\xb2\x96\x4b\x69\xe6\xcb\xd3\x84\xd5\x23\xff\x94\x24\x2f\xc8\x2d\x3a\x95\xc5\x4a\xcd\xc1\x18\x46\x7a\x72\x8f\xd8\xc4\x25\xb8\x9d\x79\x55\x11\xa9\xaa\xd2\x6b\x0d\x18\xa1\x81\x71\x9a\xa7\xa2\x6b\x5a\x66\xba\xde\xe9\x32\x73\x29\x58\x4f\x24\x6c\xe7\xe7\xee\xa6\x97\xfa\xb5\xd1\x9e\xf7\x2e\x82\x23\xbb\xe9\xa2\x53\x37\x4d\x20\x5e\xc4\xde\xd3\x32\x00\x66\x58\x64\xde\xba\x2d\x12\x57\xd1\x0b\x3e\xef\xb5\xe6\x71\x79\x3c\x39\xf5\x96\xbf\x4c\x5d\x4a\xb5\x46\x98\x5d\x95\xe4\xde\xb2\x73\x25\x82\xe9\xb2\x4f\xa3\x27\x9a\x12\xf4\x52\xbd\x7a\x3a\xbe\x6a\xaf\x4b\xaa\xc0\x0b\x2c\xa1\x79\x0c\x31\xe0\x98\x26\x73\x7a\x99\x3b\xe0\xad\x28\x58\xd8\x2b\x23\x2d\x71\x29\x4d\xc5\xfe\x5e\xd9\x73\x45\xcf\x19\x17\xf6\x5d\xa8\x29\xd3\x9a\x69\x19\xa9\x97\x17\x2d\x8e\x52\xdb\xa9\x29\x49\x17\x62\xdb\xdf\x54\xcd\x51\x4d\xb5\x50\x5e\xfc\xde\x10\xcb\x26\x2d\x87\x92\x26\x7a\xe9\x42\xcb\xc3\x2d\x78\x98\xe0\xeb\x5c\x38\x0f\xc0\x3b\x25\x20\x63\x4b\x51\x79\x95\xe5\xf2\x7d\x97\xdb\x07\xf5\xa2\xc9\x94\xc6\xc7\x97\x75\x5e\xf4\xc0\x2b\xdf\x44\x31\x03\x40\x17\x2b\xbc\x73\x0f\xc6\x96\x79\xf0\x93\x23\x88\x57\x37\xb4\x09\x7a\xb2\x02\x14\x3e\xc1\x8a\x7a\xbf\x70\xd5\x10\x23\xa3\x1c\x12\x26\xad\x2a\xfe\xa8\x92\x75\xd7\x92\xd3\x19\x78\xf2\x09\x01\x20\x7a\xa5\xc3\x89\x38\x20\xdc\x9e\xea\xdb\x10\xc1\x5c\x30\x94\xb4\x86\x26\xcc\xea\xe1\x59\xa7\xf6\x04\xde\xb1\x1b\x50\x39\xd6\x0d\x94\xde\xf0\xb9\x6a\x99\x8e\x23\xc1\x96\x04\xde\xe2\xbc\xb8\xad\x22\xd8\x1c\x36\x3b\x06\x1b\xde\x1d\xe6\x54\x52\x31\x42\x2a\x43\x11\x73\xb6\x27\xf5\xa7\x2b\xd3\x80\xc5\x3e\x0c\x3b\x10\x7f\x5d\xf6\x33\xad\x8b\xff\x3f\x7b\xff\xad\x6b\x31\xd2\xac\x09\xa2\x0f\x44\x83\x5a\x99\xd4\x5a\x6b\x7a\xd4\x5a\x2d\x6a\x3e\xfd\x45\xd5\x7f\xee\xa9\x6a\x60\x06\xa7\x07\x53\x03\x94\xd1\x06\x8d\xbd\x91\xeb\x63\x22\x33\xc4\x17\xc1\x88\xcc\xf8\xae\xc0\x82\xc1\x6e\x8b\xb6\x4d\x0c\xeb\x35\x5e\x22\x21\x69\x39\x1b\xe5\xeb\x90\xc3\x81\xa0\x69\x27\x41\x74\x5c\xef\x99\x65\x9b\x3e\x45\x49\x6d\x28\x61\xaf\x6d\x0f\x3c\xfe\x58\x45\x1c\xc1\xb3\x16\x8f\xb9\xf3\xc1\x51\x6c\x18\x81\x09\x40\xb0\x21\x86\xab\x94\x58\xe3\x1f\x3d\xa9\x6d\x39\xfe\x65\xd7\x2f\x17\xea\x5f\x7a\xb7\xef\x17\x03\x0b\xc1\xf3\x03\xd2\x7e\x28\xf3\x5f\x2d\x6a\x21\x0f\x23\xc2\x2f\xf1\x5c\x41\x4f\x90\x7a\x90\x01\xd6\xd8\xf5\xc2\xc9\xbc\x7b\xff\x79\x5f\xda\x61\xa4\xd0\xab\x82\x33\x08\x6d\x32\x88\x63\x9b\x78\xe1\x21\xae\xe5\x66\x6d\xeb\x40\xc2\xe4\x88\xf6\x5a\x3a\x75\x1c\x80\x4f\xe9\xf8\x5d\xe0\x4e\xd2\xf8\xfd\x71\x67\x51\x38\x73\xf1\xa1\x49\xe5\xb2\x3d\xa6\xc9\x1f\x04\xba\x3f\x2b\xad\x10\x73\x4f\x6d\x1b\x81\x16\x04\xc7\x3f\x07\x15\x98\xe7\x13\x18\x0e\x20\xce\xcf\xbf\x61\x54\xc2\x7c\xd1\x61\xb2\x81\x01\xb9\xe8\x50\x92\x3c\x81\x34\xd6\xfa\x3d\xa4\x72\xdd\xbc\xb3\x8d\x72\x08\x2f\x68\xf2\x68\xbe\x75\xbd\x4c\x70\xd5\x0e\x57\x6f\x13\x83\x56\x58\x37\xbc\x1e\xf8\xb9\x8c\x76\x59\xcb\x41\x56\x8b\x27\x0b\x4d\xaa\xc8\x3f\xae\x76\x98\x9a\xdd\xd8\x4c\x73\x1c\x5e\xf3\x0a\x87\x11\x9e\x92\xaa\x26\x96\x31\x1b\x00\x09\x10\xee\x32\x8d\x61\x68\xbc\x8d\x9d\x7e\xdc\x23\xb2\xd4\x74\xf6\xd5\xa2\xb2\xd1\x2d\x6c\x8c\x5b\xec\xbb\xe6\x33\xaa\x20\xfd\xa6\x4c\xfa\xf5\x9b\x06\x7f\x97\x39\xcc\x32\xc6\x1e\xef\xa3\x8d\x48\x18\xac\xee\x33\xf5\x78\x04\x3c\x24\xba\xd1\x8c\x90\xa5\x3f\x17\x34\x79\x58\x50\xc7\x53\x59\x3d\xb4\xa3\x55\xa7\x63\x80\x0c\x68\xbd\x8d\x92\x6f\xb5\xf7\x77\xfd\xe7\x66\x51\x77\xd8\x3e\x67\x8d\xad\x90\xce\xb8\x49\xe2\xbb\x01\x6f\x5d\x33\x8d\x26\x50\xb2\xe8\x09\x00\x4e\xb6\xe0\x11\xe6\x1f\xb9\x10\xc7\xca\xde\xed\x9f\xa4\x63\x36\x03\x41\xdd\xe1\xef\x27\x11\xcf\x4e\xb4\x40\x7e\x6f\xf8\x8c\xba\xd5\x06\xff\x80\xbf\x97\x55\x8b\x2c\xfc\x3c\xd3\x93\xb1\x3a\x82\x1c\xe0\x37\x28\x35\xfe\xdb\x7b\xb7\xeb\x4a\xf2\x7d\x4d\xf2\x5c\x62\x0f\x4d\x67\xa8\x6a\x04\xc8\xec\x2c\x97\x31\xe9\xdc\x81\x60\x92\x87\xf5\x5f\x47\x72\xfa\x68\x23\x02\xff\x43\xdd\x9a\xe4\xc0\xee\xf8\x42\x24\xaf\x63\x06\xec\x1a\x9d\xcf\xdc\xee\xa9\xe7\x46\x6c\x3d\x6e\x59\x64\xe4\x09\x6d\x2e\x62\xc7\x5b\x2b\x18\xe6\x66\x63\x78\x3f\x19\xe2\xa8\x80\x3f\x05\xf3\x9f\xe4\x8c\xc7\xbf\x8c\x33\xd6\xe9\xdf\xaf\xfc\xff\x09\xb0\x10\xd8\x1e\xf5\x4d\x59\xae\x96\xbc\xc6\x22\xcd\x28\xdc\x09\x2d\x3c\x6a\xd2\xb1\x81\xe0\xac\x21\x82\x6f\xcd\xc1\xc6\x75\x93\xaf\xc2\x11\x9f\x67\xaf\xd5\x00\x53\x0b\x9a\x5b\x96\x56\x69\x49\x32\x37\xe6\x49\xc8\x5d\xaf\x16\x65\x5d\xef\x23\x53\xdb\xaf\xed\x40\x7a\x25\x69\x54\x24\x91\x5a\xe6\x0a\x09\x7b\xc7\x26\x51\x6e\x5d\x75\x45\x51\x00\x41\xb7\xb2\x65\x31\x02\x5d\xa3\x9f\x1f\xce\xbc\x66\xca\x57\x3b\xee\xf5\x66\xdf\xe0\xcf\x80\x96\xeb\x8d\x76\x57\x2c\x63\x55\x58\x79\xe5\x75\x67\x6f\x0c\x3f\x48\xf3\x86\xe9\xca\xf2\x4c\xad\x62\x4f\x65\x85\xb6\x61\xd4\xcf\xe7\xcd\x37\x9f\x8e\x60\xf6\x70\x7b\x6a\xc0\xf1\x67\x42\xa4\x8c\x9b\x06\x58\xc3\xa8\xb8\x18\xcd\x1a\xf3\xde\xd9\x76\x4a\xa7\xa1\x4e\x47\xe8\xc1\xd9\xc4\xa4\xc8\xe4\x99\x6d\xef\xea\x56\x2b\xb2\xac\x71\xde\xb1\xb9\x7b\x1c\x8a\xb6\x73\xa6\x0d\x4f\xb3\xec\xd3\x77\x83\xd7\xb9\x1b\x06\x33\xcc\xd0\x70\x0e\xfb\x85\x35\x04\xb0\x91\xc0\xc6\xa4\xc4\x4e\xd0\xd3\xc8\x72\xb0\x0d\x70\x90\xb3\xa7\x50\x28\x6f\xf9\xbd\x5c\x3a\x5a\x0a\x9d\x08\xd2\xc9\x3f\x77\x79\x72\x5c\x77\x78\x68\xdc\xa2\x57\xc7\xa5\x58\xff\x2b\x36\xcc\x56\x09\x5e\x97\x4b\x82\x3c\xfa\xe3\x64\x98\xb8\xcb\x71\xac\xe4\xec\x50\xa8\x1d\x3c\x56\x8a\x6e\x00\x21\x10\xe9\xf8\xca\x4a\x3e\xb4\xa8\xb8\xe7\xd7\xed\x46\x47\x43\xd8\x0b\xc5\x9d\xe1\x88\xf5\xc0\x92\x63\x43\x3c\xa2\x7c\x8b\x8f\xb0\x05\x46\x08\x65\x73\x60\xb2\x7a\xa4\x4d\xd4\x53\xa2\x1d\xf6\xb1\x91\xf5\x4d\x8c\xf7\x40\xc1\xde\x45\x14\x0a\x4f\x0c\x4e\xc7\xfd\x04\xb4\xa4\xcc\x59\x6f\x53\x9e\xb1\xbc\xa9\xd9\xf1\x31\xa4\xbd\x54\x2f\xed\xcc\x71\xef\x9f\x4b\xc8\x83\x3d\xb8\xbb\xc5\xc4\x5b\x91\xde\x6c\xb3\xce\xe1\x0c\x72\xdf\x9e\x0f\xd8\x33\xe5\x13\x08\x3d\x66\x7f\x28\x0b\x42\xc3\xf9\x7d\xd2\x31\x43\x5e\xc5\x8b\x4e\x08\xd0\xf8\x59\xe0\xc2\xd8\xd1\xfe\x06\x9a\x8d\xb3\x3d\x2f\x3b\xab\xf7\x2a\x74\x9e\xec\xf5\x7e\x77\xe8\xf1\x3a\x50\x5e\x73\xbe\x44\x73\xc5\xe1\x88\xf2\x01\x37\x34\xcd\xdd\x1c\xec\x29\x56\xe8\x50\x7b\xc1\x0b\x5f\x5d\x65\x85\xe6\x58\x93\x17\x32\x00\x90\x5e\x9e\x35\xe9\x3f\x4f\x1d\xbd\x6b\x7e\xe4\xc2\xc0\xc9\x4c\xe6\x1f\xf6\x65\xff\x32\x0e\x59\x8a\x7f\xe9\x21\x45\xff\x20\x84\x49\xea\x55\x85\xba\x70\x22\x85\xad\x0d\xad\xe7\x26\x4b\x9e\x15\xca\xb5\xe3\x04\xd8\x5d\x84\xd4\x2d\xcb\x2b\x68\x72\xa5\x7a\x40\x77\x27\xab\xaa\x5d\xd7\x57\xc4\x74\xeb\x73\x4e\xcc\x78\xee\x64\x85\xe4\xc6\x6b\x95\xf3\xbe\x83\xd0\xe3\xc2\x63\x84\x76\x18\xcd\xea\x11\xf0\xbe\xaf\x58\xdf\x34\x99\x5e\x91\xc4\x2a\x13\xa7\x50\x70\x07\x6c\x0b\xb0\x3d\x41\x51\x2a\x35\x2d\x7f\x87\x13\x2a\x30\xcd\x35\xd3\x00\xda\x2d\x4a\xe7\xeb\x38\xc6\x1b\x85\x34\xe4\xde\xe8\x4f\x58\xbc\x9a\x99\xae\xca\x43\x05\x3d\x7e\xe2\x9f\xd7\x17\xb4\xb4\x5c\x54\xda\xb5\x9c\xcb\x51\x3c\x40\x5a\x33\xa6\x16\x5f\x75\x49\x95\x2f\x79\x82\xc2\x61\xc5\xa1\xa9\x07\x0b\xf3\xbe\x1d\x77\x70\xc7\x71\xc2\xa0\x4c\xb0\x20\x8e\x1c\x22\x4c\x50\x77\x1f\x51\xdd\xcd\xf1\xa0\x7c\x7d\x67\x41\xfd\xd8\x1f\x3c\x87\xfb\x47\x3d\x4a\x8a\x14\x38\x06\x0b\x4c\x75\x9f\x81\x8b\x7d\x21\xee\x43\x1b\x46\xbf\x1a\xa5\xfa\x58\xf1\x1b\xfb\xf7\x50\xdc\xca\x50\xdd\xf5\xe6\xc0\xce\xe1\x98\x2c\x4a\xe1\x5f\xa1\xc0\x98\xf8\x3b\x9c\xea\xd9\xbd\x9c\xf0\xdc\x77\x4f\x31\x31\xaf\x01\x91\xa8\xe4\x9b\xf1\x0b\xba\x51\x25\x93\x99\xf0\x8e\xf3\x75\x7c\x06\x75\x2e\x74\x25\x86\x37\x97\x2a\x93\x16\x79\x7b\xb3\xb8\xc7\x9b\xcd\x19\x7d\x8b\x5f\xae\xe2\x36\x07\x9c\xe9\x89\x3b\xde\x42\xaa\xe2\x16\x52\xe0\x5b\x63\x99\x05\x79\x8d\x80\x32\xe5\xc8\x26\x90\x68\x8a\x47\x9b\x6a\x21\xaf\x21\x87\xe0\x96\x2e\x98\xcb\x2e\x0f\x92\xb0\xa4\x17\x7e\xe6\x23\x28\xd1\xbc\x0f\x1e\x66\x40\x81\x11\xd9\x65\x15\x14\x9b\xe3\xe7\x43\x46\xa0\x9a\x35\xef\x4d\x50\xde\x3b\x20\x89\xc8\xdf\xf3\x2c\x80\xa9\x01\x2d\xca\x92\xb1\x6b\x5a\x58\xf0\xbb\xdf\xc9\x39\x0c\x65\x28\x7d\x36\x80\x26\x60\x67\xad\xec\xd5\xf7\x99\xd2\x32\x92\x9a\x1c\xbe\x7f\xc0\x8a\x22\xe5\xd8\x1e\x72\x18\x08\xf6\xda\x46\x49\x80\x99\x52\xb8\xb6\xc1\xfd\x1c\x66\x36\x27\xe6\xaa\x0e\x9d\xb8\x1f\x21\xc2\x7f\x8c\x51\xad\x23\xcd\x8c\x7e\x80\x76\x51\x7e\xc2\x30\x43\x70\x56\xd5\xa3\x8a\x18\xf9\x0f\xe7\x44\xd6\x7f\x5b\x9e\x73\x6a\xff\xca\x73\x42\x7f\xe6\x39\x13\xdb\xb7\x51\x7c\x4b\x9e\x2c\x22\xfc\x91\xcf\x56\x53\x8b\xa4\xbc\x59\x10\x71\x10\xa9\x1f\xe3\xb2\xc4\x2f\x5f\xe2\x73\xaf\x21\x11\x6c\xdf\x0d\x09\xb0\xe1\x27\x6e\x67\xb3\x79\x6c\x75\x32\xaf\x8e\x79\x82\xcb\xee\x87\x9c\x41\x9d\x4b\xab\x5a\xaa\x92\xd3\x75\x02\x06\x74\x6c\xa9\x34\xc8\xe8\x43\xd1\x14\xd9\x7f\xfc\x3c\x4f\x88\xe8\x79\x5b\x8b\xcd\x3b\x14\x06\xf0\x9b\x8b\x5f\x4f\x90\x58\x94\xa1\x67\xd4\x45\x79\xbd\x8b\x4e\x0e\xf4\x3f\xa9\xa7\xe2\x2b\x9f\x20\x79\xbc\x92\xd0\x7d\x5a\x75\xfd\xad\x93\x3f\x4a\xd3\x39\x01\x96\x31\xe1\xa7\x69\xa7\x66\x7e\xf4\x03\x3a\x52\x48\xf5\x52\x00\x40\x2d\x11\xa6\x5e\xa0\x0c\xde\x25\x83\xe1\x44\x83\x0c\x97\x4c\xd3\xe2\x2b\x9b\xdd\xc9\x7c\x48\x79\xd7\x63\x6e\x52\x49\x44\x7d\x86\x86\x4b\x0b\xc8\x19\xb5\x33\x30\xed\x2a\xed\xaf\xd3\xb8\xdc\x31\xae\x02\xd6\x2b\x81\xfe\x72\x74\x2d\x7f\x27\x69\xd8\xb6\x30\x82\x78\x97\x13\x91\x25\x40\xaa\x6a\xba\x9d\x2c\x37\x44\x4f\x11\x93\xd1\xdf\x20\xd2\x48\x58\x3e\xe4\x09\x66\x47\x58\xd2\x23\x3d\x81\xed\x03\x83\x8b\xbe\x5c\x66\x82\x61\x77\x8c\xba\x7f\x07\xbc\x6b\x50\x89\xed\xa7\x3a\x25\xd8\x00\x01\x0a\xcf\x4b\x6e\xbd\x4d\x2d\x74\xe2\x4d\xd5\x3b\x05\x50\x4b\x54\x95\x70\x4a\xd6\xba\x0e\x27\xd4\x8d\x33\x2b\x67\x2b\x0c\xcd\x61\x99\x02\x50\x4a\x4f\xf2\x08\x7c\x0f\xf3\x6d\x27\xbc\x45\x0a\xc0\x49\x5c\x06\xab\xcc\x6d\xbe\xa1\x2a\xc9\x2b\x08\x1e\x9e\xc5\xb1\xb3\x77\xc8\x90\x8c\x92\xd0\x65\xb8\x74\xc8\xa1\x36\x03\xd9\x64\xb3\x15\x77\x1e\x76\x53\xeb\x8c\x6e\x9f\xe1\x09\x3c\x7c\x68\xdf\x88\xe0\xbc\xa2\xd0\xcb\x7c\xd3\xe6\x6b\x62\x4e\xf0\xab\x85\xe1\x9c\xf4\xbe\x55\xfd\xaa\x75\xc6\x04\x22\x76\x26\x5d\xf2\xec\xc1\x1e\xac\x38\x62\x7c\xc3\xe3\x8b\xde\x11\x06\x26\xdb\xac\x93\x00\x3a\xf0\x57\x14\x8c\x7e\x88\x3a\x8e\xea\x0a\xfa\x83\xcc\x0d\x4e\x79\x0c\x34\xe2\x54\xcd\xa2\x44\xac\x7e\x80\x1d\x77\x6a\x41\xec\xa8\x22\x34\x09\x0a\x9c\x76\x92\xca\x3e\x53\x30\xb2\x01\xf0\xbe\x40\x35\xb3\x01\x73\xde\x9b\x71\xe7\x78\x01\xd2\xcf\x7d\xa9\x33\x79\x85\xb1\x38\xb1\xb8\x6e\xf5\x70\x1d\x56\xf3\x98\x41\x5e\x62\xf0\xe0\x84\xb2\x5c\x94\x51\x22\x9a\xbf\x8f\xcb\xde\x88\x19\xa6\x44\xbd\xa2\x8a\x1b\xea\x9c\xf6\xee\x04\x30\xf9\xdc\x5b\xac\x07\xcb\x93\x4d\x15\xa9\x5f\xba\x85\xae\x1b\x87\xa0\xdc\x7e\xd1\x11\x78\x53\x74\x4f\xd1\x08\xb9\x93\x89\x5d\x24\x61\x05\x9b\xc4\x78\xbf\xc9\xb0\x86\xf9\xf0\x64\x91\x32\xac\x9d\xc6\xb1\xd2\x87\xa8\x08\xc1\xa8\xfb\x4b\x76\x95\xb7\xce\xde\x65\x99\x6c\xdb\xba\xc1\x5f\xdd\x05\xdc\xb6\x12\x02\xcb\x8b\x26\x0b\x54\xcf\x0e\xba\x66\x9c\x84\xc1\x3e\x2a\x8f\xe9\xd9\xdf\x73\xea\x1f\xf5\xbb\x6b\xfb\x2f\x8b\x21\x5b\xf3\xaf\x18\x72\x3c\x7e\x02\x24\x04\x0f\x08\xa6\x39\x9f\xc5\xe6\xef\x4a\xbf\x52\x19\xf2\xc4\x8a\xa5\xe6\x49\x9c\x91\xd3\x10\x45\x49\x08\xe1\xac\x1f\xa9\x64\x29\xe6\xc2\x30\xa6\x74\x29\xc6\xc6\x30\xd5\xb2\x59\x17\x10\x9a\x05\xb2\xb9\x31\xd0\x7c\x3f\x76\xbc\x69\xf0\x93\xc3\x1a\xa6\x33\xf7\xd4\x9f\x03\x57\xa8\x8c\xbc\xaa\x27\xa8\xa6\xc2\xef\xa8\x3d\xd9\x40\x4d\xd1\xeb\x9b\x16\xe5\x84\xf0\x45\x19\x5d\x33\xa9\x7f\xc3\x23\xca\x13\xa7\xfc\x32\x72\x9e\xe8\x73\x6c\xa8\x57\x4f\x21\xfa\x8d\x2d\x13\xc7\xf9\xa6\x3f\x60\xdb\x40\x3a\x7b\x87\x80\x2c\x02\xeb\x5f\xd9\x52\xf9\x17\x22\xa0\x77\x39\xec\xcc\xe9\x9d\xb0\x15\xe2\xa3\x6b\x9e\xb7\x94\xe3\x2f\xa0\xc7\xaa\x93\xec\xae\x8d\x2a\x9b\x1d\x9a\x4a\x48\x2d\xc2\x6b\x39\xa4\xe4\x98\xd4\x3c\x6b\x82\xe1\x73\x60\x2c\x1d\xdc\x0e\xec\x07\x63\x39\xb1\x68\xe2\xba\xbc\x37\xcc\x6e\x61\xfe\x28\x71\x2e\xed\x30\xf3\x26\x3d\xa7\x33\x4a\x2e\x1e\x46\xe2\x0d\x95\x17\x74\xd8\xa8\x29\x02\xe0\x7d\xc0\x78\xd7\x35\xa4\x28\xe5\xb9\xdc\x46\x0d\x1c\xd3\x47\x06\xad\x55\xb5\xc8\x7a\xde\xa3\x04\xfd\xc0\x84\xd9\x80\x06\xf2\x27\x79\x5d\x02\x19\xb9\x58\xdc\x8e\x3b\xca\xe5\x69\x71\x81\xa1\x8c\x99\x78\xd5\x6f\xa2\x57\x39\xad\x73\x9d\x34\x94\xfa\xed\x76\x61\x5d\x9b\x6a\xa1\x68\x1c\x09\xd7\xad\xab\xfb\xa4\x3d\xb2\x1b\x0a\x77\x0d\x1a\x5a\x34\x82\x6f\x60\xd4\xd4\xa4\x8c\x4b\x64\x52\xbf\x1b\xd8\x6d\x88\x27\x6c\xd9\x99\x92\xf3\x93\xcc\x86\x73\x3b\x23\x0d\x19\x98\x54\x9c\x10\xb3\x94\xcc\x57\xa8\xfc\x94\x41\x46\x35\xc4\x12\x42\xfc\x61\x85\x70\xdb\xc2\xfa\x39\xba\x0a\x9c\x14\x78\x46\x31\x0f\xf2\x84\x63\xca\xce\x69\xad\x51\x00\xfd\xc9\x2f\xb4\x10\x5d\xea\xe9\x1f\x82\x71\x80\x1c\xf0\x9f\x1d\xdc\x74\x5a\xab\xec\xb1\x6b\x11\xce\x60\xb9\x8d\x46\xda\x06\xd9\xbe\x03\x66\x96\x90\x94\xf1\xe4\x29\xdb\x72\x6b\xe5\xcf\xcd\x9b\x62\x15\xab\xad\x0c\xd6\x71\xbd\x9c\x08\x13\xdb\x89\xe9\x9e\x14\xdc\xef\x1d\x63\x97\x88\x33\xc0\x6d\xda\x05\x3c\xde\x04\xb4\xe4\x1d\xee\xb7\x49\x4c\x12\x95\x55\xbf\xa5\x8d\x46\x48\x01\x4f\x01\x4a\x48\x87\x4d\xcb\x8a\x26\xec\xa6\xea\x85\xee\x3e\x5e\x76\xec\xcd\xc1\x78\x33\x17\x4d\xc3\xd9\xaa\x26\x42\x11\x67\x9b\x54\x79\xce\x38\xde\x3b\x65\xb8\x7e\x68\x32\x8f\xf4\x58\x31\x8c\xc3\xa8\x6d\x27\x65\x07\x4f\x33\xd6\x3f\x5c\xf3\xb0\xce\xff\xb2\x9a\x87\xe9\xf8\xab\xe6\x81\x3e\xac\x3f\xe2\xd5\x38\xb6\x57\x88\x63\x82\x68\x52\x73\x0e\xc2\x1e\x96\x31\x4d\x5f\x04\x06\xad\x95\xa8\x5a\xe1\x89\x6c\xd3\xc1\xc6\x16\x7a\x5a\x80\x46\xa5\x26\xf8\x1e\x85\x64\x1d\x42\xef\xc7\x39\x42\x85\x83\x1c\xed\x17\x3d\xa6\x04\xf3\x03\x9d\x22\x56\x0f\x7f\xcf\x0c\x4f\xd0\xa2\xa4\xfe\xac\xbc\x29\x05\x56\x15\x80\xc0\xf0\x87\xcb\xfb\x04\xe5\x49\x83\xd0\xb5\x2e\xad\x4f\xa4\xa8\x11\x9b\x48\x1e\xae\x30\xd4\x5c\x68\xad\x4f\x47\x57\x8d\x25\xdb\xfa\x3b\x4e\xe0\x46\x37\x0a\x8f\xc9\x9a\x76\x9e\xbd\xe2\xc1\x75\x4a\x8d\x74\x7f\x4c\xba\x9e\x0b\x5c\x35\x6f\x88\xe1\x24\xe9\x22\x0e\xdb\xbb\xde\x4b\xe0\x35\x61\x89\x52\x3c\xa1\x2c\x59\xb6\x72\x6d\x3d\x8b\x1b\x63\xa1\x03\xcd\x9a\x79\xc4\x38\xd5\xde\x91\x64\x70\xc2\x13\xdb\x09\xd8\x72\x33\x76\x33\xd4\x82\xe2\x78\xb6\x53\xdc\xb6\x0d\x0d\x3a\x8f\x93\x32\xdc\x12\xa6\x90\x29\x03\x35\x1b\x0f\x3a\x1c\x67\x17\x8b\xba\xd4\x64\x21\xbf\xc6\x1f\x11\xbd\x99\x0b\x86\xc4\x69\x6b\xf6\x4b\xb2\x18\xef\x93\x63\xb0\x61\x46\xd0\xad\xc6\xa8\x22\x86\xcd\x07\xda\x11\xd6\x5a\x8a\xcc\x33\x88\xb3\x8b\x99\x0f\x96\xf9\xc4\x55\x4e\xe9\x49\x5c\x81\x0c\xcd\xa8\xba\x19\x71\x4f\x53\xb6\xa9\x9a\x35\xbc\x42\xf3\x69\x43\x6f\xca\x20\xbc\x87\xeb\x0d\xe5\xe6\x7b\xa2\x73\x48\x8a\xee\xe5\x4d\x41\xe9\x61\x67\x00\x47\x01\xbd\x76\x7d\x0e\x9f\xf2\x5a\x2a\x8a\xd3\x03\x9d\xb8\x50\xe5\x94\x2c\xa2\x4d\x6c\xbe\xde\xf1\x62\xa0\xfc\x52\xc2\xde\xc0\x03\x7b\xb1\x0a\xd9\xca\x29\x38\x5f\xae\xbb\xda\x2a\x6a\xd1\x67\xbd\x93\x66\x4d\xd1\x2b\x00\xbe\xe8\x15\x16\x0e\x95\x33\xbf\x5d\xda\x94\x8a\x8c\xc4\x04\xab\x92\xa5\xb7\x39\x7a\xfd\x6b\x9a\xfe\x86\x18\xe7\xb6\x01\x50\xaa\x1a\x4e\x91\xd7\xd5\x5c\x44\xa6\x11\x0c\x0b\x76\x53\x6d\x21\x59\xa7\x71\x3b\xf4\x35\x21\xbc\x98\xef\x92\x81\x58\xc7\x60\x1a\x11\xe5\x88\x75\xce\x4f\xb3\xa1\x11\x83\x66\x44\x1f\x2e\x3b\x8f\x6b\x89\x21\x07\x44\xe9\x5a\x10\xe3\x99\x59\x96\x5e\x8a\xf4\x59\x31\x63\xde\xe1\xa2\xac\x10\x18\x65\x29\xb8\x22\x9f\x9b\x29\x46\xac\x1f\xb2\x0c\x52\x02\xaf\x0f\x4a\x5d\xbd\x07\x1d\x12\x7a\x22\xf4\x2e\xe6\xc7\x1d\xe4\x48\xc1\xdd\x70\x12\xd2\x4f\x9b\x13\x21\xa0\xe8\x50\x1d\x3d\xd5\x9d\x5c\x88\xcf\x1e\xa0\x56\xe8\xfd\x4c\x1e\x6f\xc1\xe4\x31\x52\x6e\xc2\x40\x45\x76\x9c\x79\x3a\x69\xbb\x38\xcb\x5f\x6b\xb7\x2a\x65\x93\x48\xff\xe3\x2b\x25\x59\x08\x81\x97\x56\x20\xb5\x73\x64\xd0\xb4\x4d\xa6\x5a\x60\x1a\x9e\x4e\xc1\x41\x1e\x06\x61\x5a\x45\xf3\x3b\xb1\x2f\x3b\x8a\x37\x64\x1f\x86\x4e\x0d\x9f\x6a\xdf\x0e\x28\xfe\x9a\x76\xd5\x0c\x6a\x76\xc3\x10\xd1\x2f\x64\xa3\x2b\x5d\xb9\xbc\x9a\x61\x0c\x26\xcb\x8a\x79\x1c\x0b\x91\x9d\x92\x7f\xd6\xa7\xaf\xff\xb2\x58\x7a\x68\xff\x7e\x3d\xe0\x9f\x3e\xdd\xf6\x0d\xf2\xf5\xd2\x75\xfa\x7c\x9a\x37\xb3\x29\x62\x0e\xb1\xf6\x3a\xae\x6b\x7e\x00\xf3\x88\xf4\xa7\x1d\x17\xd8\x5e\x35\xc8\x0c\x1d\x20\x0a\x1d\xb1\x5c\x98\x72\x44\xb2\x2d\x75\x77\xc7\x06\xda\x12\x6c\x9b\x1f\xa8\xca\x34\xb9\xa8\x41\x1a\x1f\x7a\x40\x83\x59\xc1\x13\xa6\x2b\x77\x01\x10\x38\x4e\xe3\xdf\xf8\x8c\xbd\xa0\x7e\xa5\x8b\x9f\x35\x3e\xeb\xd3\x7e\xa5\x0f\xd1\x78\xd7\x51\xd2\x11\x9d\xf7\xad\x48\xf6\x0d\x5e\xca\xf4\xec\x16\xe0\xbd\x51\x49\x9c\xf9\x9e\xba\x1e\x39\xf4\x0c\xe3\x43\x2a\xe9\xa2\x05\xc2\x07\x7f\x2a\xc2\x07\x01\x41\x83\x28\x79\x89\xc9\x8f\x7f\xaa\x46\xa5\x03\x68\xe4\x00\x66\x51\x94\x50\x6a\x68\x4e\x07\x2e\xc5\xca\x6d\x8c\xd2\x78\x67\x26\x1f\x68\x8f\xba\x70\x56\x7f\xb3\xc0\x37\xa4\x26\x0d\x40\x07\x32\x05\xd6\x05\x06\xe8\x92\xec\x3e\xfd\x3c\xef\x39\x62\xa3\xce\xd0\x98\xac\x46\x0a\xd0\xfa\x1a\xd5\xea\x40\x05\x3a\x57\x75\x6e\xec\x86\xfc\x82\x62\xdd\x37\x92\x5c\x26\x4d\xd0\x1f\xeb\x82\xe1\xc8\x01\xb1\xc0\x23\xd9\xcb\xb7\xe9\x1b\x8f\x10\x0a\xb4\x26\x83\xfa\x8f\xe9\xec\xed\x28\xe9\xcc\x2c\x60\xd8\xc7\x29\x3a\xdc\x2c\x71\x7a\x77\x86\x79\xb1\x70\x47\x7c\x39\x07\x69\x27\xb3\x3f\xa6\xe2\x47\x77\x63\x1a\x89\x5d\xe9\xa1\xda\x89\x82\x45\x33\xbf\x5e\x66\xba\xeb\xc7\xf4\xe6\xc7\xfe\xb0\x1a\xbb\x6e\xa5\x29\x25\x1e\x4b\x02\x86\xdb\x53\x4e\xa0\x98\x23\x91\x22\x1f\xef\xb9\x5d\x72\x6e\xfc\x16\x12\xf5\xb3\xc1\xb5\xc7\xdd\x3b\xf1\x19\x38\x87\xc8\xca\x99\xea\x94\xb2\xa1\xbd\x29\x33\x03\x11\xc7\xe4\x8e\x06\xa3\x31\xd6\x91\x30\x1d\xc6\x42\x51\x49\x33\xa0\x7b\x77\xa2\x7a\x1c\x5a\xf8\xdc\xa4\x70\x0a\xa3\x7c\xdc\x3b\x7e\x70\xde\xed\xb9\xeb\xac\x41\x71\x6f\x2b\x86\x23\x13\x22\x3f\xf0\xe5\xc4\x7c\xb0\x4e\x0a\x40\x0e\xa1\x01\xf6\x8a\x31\x7d\x3d\x41\x8e\xfc\x92\x46\xec\xab\xc6\x4b\x08\x34\x7a\xbd\x5d\x7e\xe3\x7b\x4d\xe4\x00\x82\xba\xea\x84\x72\xc6\x3a\xd5\x9c\xf5\x99\x1f\x3b\x74\xb1\xd6\x65\xcc\xe4\x7f\xc5\xe5\xaa\x41\x48\x0b\xd4\xcf\x6a\x36\xf6\xde\xc6\x84\x62\xbc\x1d\x64\xb2\x32\x77\xf5\x9c\xe2\xbe\xca\xef\x43\x6e\xdc\xea\x83\x10\x4b\x16\x26\x0f\x9d\x7c\x2b\x2e\x17\x5d\x36\x59\xf4\x1f\x71\xb9\xa0\xdd\x79\xc2\x88\xb3\xa9\x9a\xb1\x3c\x04\xba\xc8\x3c\x58\xe9\x56\x3b\x48\xbd\x6b\x07\x00\x79\x82\x03\x48\xba\xa7\x08\xc1\xa5\x4e\x00\xd1\xe7\x59\x8b\x00\xab\x87\x64\xcb\x0c\x60\x0d\x98\xd5\x25\xe6\x25\x6a\x78\x32\xe4\x75\xc5\x25\x07\x2a\xb2\x73\x78\x8b\x3f\x6b\xc0\x5b\x33\x8c\x22\x64\x4a\x09\x4f\xc0\x75\x96\xff\xe4\x37\xd8\x75\x2f\xff\x5d\x3a\xbf\xfd\xbd\x16\x12\x36\x04\x48\x48\xea\xfc\x28\x35\x2d\x92\x8e\x45\x39\xdc\xa8\x51\x65\x66\xe5\x58\x01\x51\xa0\xe4\x5c\x3a\x2f\xcb\x2a\x5e\xad\x2c\xb5\xc5\xe0\xc4\x44\xfd\xda\xef\x9e\xc2\xbd\x8d\x5a\x18\xa8\x8a\x57\x25\x06\x10\x1a\x28\xf1\x7d\xd7\x35\x1a\x08\xd1\x34\x71\x59\x38\x36\xf7\xc7\x41\xd5\x3d\xb2\x26\x6d\xe0\x44\x35\x3a\x5e\xa8\x2e\xf2\xd1\x74\xc6\xf1\x1d\x26\x51\xf0\x94\x0c\x08\xf2\xc3\xf1\x4e\xeb\x4f\xfd\x0e\x9e\x46\x3a\xcd\xc2\x97\xf3\x72\x24\xc7\x96\x0b\x87\x37\x51\x0a\xba\x46\xde\xfe\x11\x78\x5d\xea\x3d\x66\x65\x18\xdc\xd1\xbb\x78\x00\xef\xd1\x98\xe4\x42\xde\x8b\x64\xfd\xb6\xe6\xba\x56\x9d\xcd\x44\xea\x8a\x7a\xd8\x0c\x98\x5b\xf2\x43\xd3\x35\xd0\xa9\xc6\xaf\x00\xfc\xb2\x00\x88\x5f\xcf\x39\xfd\x4d\x11\xe3\x8f\x6e\x9f\x49\xd2\x87\xc5\x23\x7f\x40\xf2\x5c\xe1\xfc\xfb\xa4\x6f\x6c\x62\x9b\xb7\xbe\x20\xb5\x7d\x6c\x42\xf9\x03\xd4\x46\xe5\x94\xe9\x25\xe8\xe3\x44\x90\xd3\x14\xbc\xad\x46\x72\xd2\x0e\xf3\xd3\x42\x52\xf0\x56\xcf\x01\xd1\x02\x00\xdf\xb3\x3c\xad\xd0\x8f\xc2\x60\xa0\x52\x81\x04\xfb\xb7\x62\x80\x7c\xcc\xb5\x84\xef\x43\x17\x54\x05\x2f\xdd\x8e\x80\x18\x3d\x73\x77\x52\x34\x8a\xa1\xc9\x7f\xc0\xa1\xbc\xdc\x32\xa8\xad\xad\x25\x5e\x4c\x4a\xe5\x87\x28\x10\xdc\x5a\x6a\x39\x27\xf4\x4f\x05\xc9\xe0\xb6\x25\x5f\xe8\xb6\xfe\xc8\x27\xf5\xb8\x31\x23\x79\x48\xca\x03\xb1\x28\x43\x5b\x3c\x58\xac\xe4\xb6\x4b\xc5\x5a\x91\xb8\x03\x0f\x98\xfa\x8d\x62\x53\xf0\x37\xb1\x00\x6f\xd9\x45\xa1\x7b\x5b\xec\xcc\xad\x3a\xb4\x58\x8c\x31\x99\x42\xab\xa7\x4a\xe3\x55\xcb\x73\x4b\x5e\x54\x08\xee\x32\x83\x06\xcd\x2f\xec\x30\xfb\x4a\x69\x3a\x26\x63\xcc\x16\x66\x2b\xa1\xb4\x2a\x62\x5c\xdc\x73\x39\x32\x88\x75\x48\x05\x66\x30\xcf\x34\x22\xe4\x8a\x31\xca\x39\x46\x9e\x92\xd1\x4e\x98\x95\x5d\xe2\x2d\xea\xd3\x6e\xac\xda\x5d\x5a\xd3\xe2\x59\x89\x0e\x74\x93\xdd\x84\x5a\x8e\x7c\xb6\x6d\xe4\x86\xdf\x8a\x99\x60\x22\x82\xc8\x99\x2e\x7b\x7c\xea\x0c\x6c\x44\x22\x16\x5d\xb0\x89\x28\x5c\x1d\xab\x04\xae\x23\x93\x19\x69\x98\xd0\xc9\x77\x7b\x10\xc1\x48\x9a\x16\x99\x34\x4e\xe5\x86\xf1\x37\xb7\x55\xfe\x02\x7f\xe6\x91\x9e\x11\xd9\x06\x9b\xa4\xdc\xa4\x61\x6e\x5e\xe0\x21\xca\x64\xee\x9a\xb0\x7a\xa5\x70\x1f\xf8\x28\xb5\xb5\x53\x32\x83\xc3\x0a\xcb\x99\xa3\xa6\xf9\xe3\xd5\x9a\x51\x2a\xf6\x74\x7f\xc5\x2f\xc1\x1f\xc9\x41\x5c\x51\x65\xfa\x11\x82\x14\xca\xe6\x8a\x41\x0d\x38\x96\xde\xe0\xc0\x65\xe7\x01\xa5\x62\x41\x15\xce\x01\x83\x8f\x49\xba\x53\xa6\x26\x88\x1d\x0e\xad\x16\x19\xaa\xed\x5e\x82\x39\x59\xc5\x47\x96\xb1\x4e\x53\xba\x67\x30\x51\xf9\x0b\x1d\xcd\x46\x3b\xc7\x05\x71\x89\xd7\x8c\x33\x99\x04\xb4\x05\xea\x07\x35\xe4\xad\x85\x77\x23\xab\xbf\x43\xd6\xcf\x8e\x6b\x20\x91\x19\xa0\x53\x2c\xf5\xad\x58\xa5\x04\x77\x84\x38\xf7\x39\xb0\x27\x27\x25\x0b\xfb\x02\xa6\xf8\xe7\xac\x83\x83\x55\xc1\xab\x68\x9a\x1d\x40\xbb\x3e\xfc\x40\xc8\x4b\x18\x76\x57\x65\x3b\x38\x4e\xd0\x4a\xee\x7f\x38\x26\xf9\xb7\xdd\x46\x1c\xfe\x65\x7a\x86\xe3\x12\xa6\x3f\xe8\x86\xfd\xf9\x81\x38\x35\xaa\x86\x04\x5b\xec\x88\x12\xba\x32\x84\xc5\xea\x3f\xe7\xc9\x26\xb5\xc8\x92\xfb\x3c\x51\x7e\x85\x46\xba\x8b\xf5\x2b\x3c\xdc\x93\x5f\x9b\x03\x55\x95\x24\xf3\x43\x2f\x7b\x0e\x57\xde\xd5\x0d\x79\x04\x95\x95\x9b\x78\xea\xea\x2a\x37\x5a\x81\x8b\x3f\x2d\x9d\x2a\xa0\xaa\xfe\xa0\x1c\x30\xd1\x22\x00\xc2\xcd\x48\x91\x23\xe1\xfd\xca\x23\x8c\x80\xe0\x65\x23\xe0\x67\x39\x99\x88\x9d\x3c\x29\x45\x26\x41\x57\xa0\xbe\x34\xb5\x39\x91\x43\xb0\xdb\xac\x98\xc5\xc9\x2d\x1b\x95\x06\x59\xe3\xea\x08\x2a\xb3\xca\xaa\x7f\xbe\xc3\xa7\xd1\x54\x29\xd0\x94\x05\xe5\xba\x01\x06\x66\xf3\xc3\x2e\x14\xe1\x7b\xb8\xbe\x3d\xc7\x3d\xe8\xd2\xdb\xeb\x29\x2d\x8c\x0c\xfa\x29\x17\x6d\xf1\xd9\x96\xfc\xec\xf0\x39\xed\x59\x87\xb9\x13\xce\x84\x5c\x3d\xc9\xfa\x52\xd2\x40\x59\xb0\x7c\xab\xc2\xc4\xfd\x8a\xf7\x02\xa9\x02\xf5\xec\x64\xbd\x05\xee\x00\xcb\xe9\xc4\x2c\x13\x15\x4a\xcc\x7f\x27\x05\x68\x9d\x02\x4e\xb7\x45\x00\x44\xe0\x74\x74\x7e\x9f\xe5\xf1\x1e\x34\x63\x2f\x54\xbf\x19\xb1\x4a\xb5\x3a\xba\x7e\x52\xbd\xb2\xcd\x56\x7a\x88\xd4\x71\x5d\x71\x93\xb1\xb0\x4f\x33\xc9\xbb\xa0\x84\x28\x9c\x42\xd5\xd7\x5f\x06\xa5\xcd\xa9\x44\x55\xb3\xf1\xdd\x4d\x8e\x09\xcb\xa6\x21\xf1\x74\xd2\x40\xf3\x0e\xaf\x7f\x1a\x9e\x0b\xaf\x88\xc9\x1d\x1d\xea\xc6\xbe\x24\x0a\xa9\x12\xc2\x8e\xdb\x7d\x25\xf7\xb3\x35\xe2\x67\xbe\xc9\x59\xa6\x4a\xac\x30\x7c\xf9\xb3\x8e\x0e\xa3\x29\x0d\x3f\xb1\x72\x35\xf0\x7e\xa3\x00\x9b\xa6\x6d\x9a\x7e\x99\xcc\xda\x4c\x42\xf3\x6e\xa7\xbe\xc3\xdc\x22\xce\x48\x82\x15\x4a\xa5\xab\xeb\xd0\x2f\x9c\x3e\x44\x73\xe0\x29\x22\xaa\x3e\x8a\xa7\x04\x3b\xd7\x33\xcb\xd3\x46\xa6\xaa\xb3\x8a\xba\xa3\x49\x15\xf7\x20\x44\x2d\x49\x3a\x58\x5a\x42\xe0\xf2\x38\x0a\x60\x3e\x18\x53\x82\x43\x58\x12\x94\x18\x24\x07\x1b\xa2\x7a\xde\x1b\x11\x5d\x68\x4f\x7a\x17\x0b\x60\x6a\x24\x0e\x17\x00\x6d\xac\xa1\x2d\x7c\x2c\x5b\x69\x9a\xd0\x2e\x58\xf9\xab\x1d\xdb\xc1\x3b\xc4\x10\xf3\x77\x91\x95\xbc\x87\xf8\xec\xef\x5d\xb1\x39\x46\xe4\x27\xee\x77\x55\x23\x72\x7e\x4e\x15\x26\xad\x26\xc2\x5f\xf1\xc4\x30\xa6\xae\x98\x71\x8b\xc3\xc6\xef\x30\xa3\xe3\x62\xe9\xa2\x01\x5a\x87\x61\x8f\xa8\xd7\x74\xa4\x97\x41\x1f\x95\x1a\xb6\x48\xf8\x58\x10\x88\xa9\xe0\x0d\xc2\x1b\x33\x95\x91\x8c\x68\xe8\x2e\x9d\xe5\x70\x2c\x6d\xe6\x2e\xcd\x78\xd9\x53\xb0\x9f\xe9\x6d\x33\x09\x1e\xf0\xd5\x0c\x92\x6a\xdf\x69\x5c\xd7\x5e\xc5\xf5\x03\xd2\x05\xd1\x47\x03\xb3\xe7\x3b\x26\x55\x11\x55\x4d\x09\x12\xc3\x8d\x41\x07\x6e\x4b\x67\x15\xe8\x3f\x6c\x06\xb6\x7f\x59\xd4\x31\xff\xcd\x0c\x50\xc7\x09\x41\x4c\x60\x07\xf8\xbe\x62\xb0\x39\x7c\xee\xb3\xd6\x5e\xba\x75\x50\xa8\x28\xce\x26\x08\x6a\x90\x26\xb1\xc0\x5d\xf9\xcd\x45\x4f\xb2\x9f\x2c\x0f\x30\x6c\x20\xfe\xf8\x1f\x37\x47\xac\x23\xa8\xa5\x12\x75\x0d\xeb\xfd\x88\x75\x73\x55\xb8\xca\xdb\xe7\x27\xd0\x06\x99\xa5\x93\xf7\x73\xb0\x05\x87\xf0\x5a\x36\xe6\xd8\xb6\xed\xa8\x94\xba\x4c\x51\x92\xdf\x43\xd1\x92\xb6\x9a\x7c\xf9\x4c\xf1\x10\xa0\x99\xb0\x70\xbb\x0f\x7c\x54\x04\x7b\x13\x02\x03\x3d\xb7\xaa\xc5\xe1\xf8\x57\x56\xfd\x7a\xc0\x8f\xc9\x28\x9f\x55\x00\x2a\xd6\xfa\x8c\xa9\xc9\x39\x66\x4a\x6a\x54\x8c\x49\x0f\x45\x4c\x10\xf9\x43\xeb\x85\x0f\xdd\xa2\x79\x0f\xa0\x70\xe5\xc2\x83\x14\xc6\x6d\x01\x1e\xa4\x24\xc8\x5e\xa7\xb0\x23\xf7\xa9\x84\x4a\x7d\x07\x18\xa5\xbf\xfd\x50\xe8\x18\x53\x48\x12\xe7\xe6\xe4\x51\x48\x5f\xb5\x51\x1c\xad\x5e\x62\x0a\x6b\xe8\xd3\x4e\xa1\x42\x4e\xb1\x24\x9a\x04\x7a\x3e\xcf\x3a\x80\x6e\x86\xe5\x3c\x4f\x99\x8c\x3d\x12\x9a\xcd\x3b\x97\x8d\x01\x51\x1a\xdc\xef\x54\xf4\x23\xfd\x25\x2f\x67\x21\x4b\x7e\xae\xed\x2b\x8a\x9c\x8c\x92\x4e\x2b\x44\x95\x44\x57\xe3\xe9\xfd\xf8\x4f\x42\x40\xae\x4d\xd1\xf5\xce\xe5\xd2\x41\x08\x92\xd5\xd4\x25\x39\x7b\xd2\x13\x11\xc3\x69\x3b\x91\xd2\x4f\x5e\x03\xa5\x1a\xe2\x35\x9f\xd5\x14\xf3\x83\x95\xdc\xcf\x05\xe3\x0b\x60\xc6\xe4\x23\x52\x67\x6a\x41\x71\x34\xa5\x61\x77\x56\x1c\x99\x87\xd0\x13\xeb\x23\x0c\xa6\xb8\x16\x9e\x3b\x98\x50\x92\x6c\x6d\x64\x3a\xe5\x04\x45\x1c\x17\x51\x54\xe4\x19\x22\xa2\x51\xc1\x62\x2c\x23\x33\xac\x91\xcc\x3b\xcd\xbe\xdd\x83\xa7\xc4\xa5\x3a\x7a\x7c\x4f\xec\xda\xe7\x8f\xa7\x1f\xe1\x1a\x0d\xf2\x05\xef\x07\xa7\xab\x1c\x8c\xe1\xbc\x80\x47\x3a\x01\x8b\xf9\x95\x29\xf3\xa0\x8b\x68\x9e\x0c\xf6\xce\xa4\x23\x73\x48\x9b\x27\xeb\xef\xbc\x84\x74\xe9\x3b\xd0\xa1\x62\x54\x3b\x28\x60\x13\xf7\xc2\x4a\x30\x7d\x88\x59\x10\x56\x0b\x09\xe7\xbb\xc7\xb4\x72\x59\x4f\x63\x92\xb6\x42\xb3\x44\x2e\xd2\x68\x26\x47\x58\xa8\xfb\xd7\x7e\xd7\x42\xa3\x75\x47\xca\xa8\x8d\xbb\x22\xba\xa7\x01\xe3\xca\xb2\xdd\xb1\xe4\xcc\x6d\xa5\xa8\x6c\x77\x53\x77\xa9\xf6\x5e\xca\x24\xaa\x09\x16\x3b\x92\x9e\xef\x3d\x6b\xb9\xdc\x6d\x43\x91\x9f\x97\x6c\xe0\xf8\x1e\x37\xc6\x90\xe4\x02\x87\x88\xe0\x76\xcc\xf1\x25\xf8\x30\x04\xbf\xdf\x2e\x03\xa8\x23\x22\x5a\x42\x91\xcc\xcf\x3f\x9c\xd3\x21\x66\xa6\xc6\x1e\x42\xe4\x42\x98\x87\x20\x18\xb8\x92\xea\xb7\xb3\x06\x72\x31\xd8\x0b\xbb\x13\xc2\x93\xa0\x9b\x15\xa0\x9f\x2a\x37\x56\x82\x84\xf1\x2b\x24\xc6\xae\xe9\xf6\x30\xa1\xa9\x53\x5b\x52\x7f\xcf\xe5\xbd\x7e\xd4\xcf\xa9\x6c\xba\x0b\xd5\xe2\xe7\x69\x8d\x0a\xf8\x3f\xb1\x78\x93\x2a\x8f\x7d\x1b\x74\xc5\x86\x11\x9d\x25\x9f\x14\x8b\x7d\xf2\xfd\x9f\x8c\x58\x7e\xd9\xef\x5f\x66\x2f\xd6\xbf\xd3\x86\xff\xea\xde\x22\x28\xab\x79\xc7\x34\xee\xa0\x36\x65\x38\x27\x80\x75\x41\xd3\x38\xa3\xc8\x0e\xb2\xf7\xdd\xd9\xd9\xe3\x67\x77\x8e\x0b\x13\x40\xcc\x20\x31\x1b\xee\x7e\x5d\x90\x99\xdc\x0d\x8b\xcd\xb3\xf6\x9c\xea\x68\x1a\x13\x10\x10\x30\x51\x93\x3a\xff\x26\x6f\x1c\xb1\x98\xf3\x0b\x0a\xa0\x71\xfa\xfb\xd0\x8a\xa2\x24\xab\x28\xa8\x6c\xa3\xab\x8b\x6b\x2d\x79\x04\xc7\xcb\x58\xce\xfc\x8a\x62\xf0\xc3\x00\xf6\xf6\xc7\xfc\xba\xc9\x3c\x2e\x1b\x2a\x27\x5b\x42\x17\xe0\x46\x8a\x00\x8b\xa2\x38\xd7\x38\xb0\xd8\x1f\x5d\x02\xfc\x25\x4f\x51\xe1\xf1\x85\xf6\xa3\x2c\xc3\x74\x6d\x0f\xec\x09\x34\xd1\x8b\x4f\x63\x21\xe6\x68\x34\x83\xe7\x54\x69\x96\x60\xa8\x22\xce\x91\x0f\x27\xe6\x07\x43\x97\x6e\xdc\x8b\x4b\xa2\x49\x9d\xef\x32\xa3\x2d\x05\x21\x9c\x69\x01\x6d\xa1\xe1\x6d\x3a\x24\xc6\x50\xbc\xc3\x28\xe9\xb3\x31\x27\xd3\xb2\xb6\x62\x88\xc9\xea\x84\x4c\xc8\x62\x9c\xed\xa5\xbd\xf0\x5d\xf0\x5d\xc9\xf8\x91\xf3\x8e\x09\xa8\x0e\xc2\xe4\x27\x46\x51\xd3\xfc\x29\x39\xc3\x30\xe8\x02\x86\x1a\x62\xdf\xbc\xba\x90\x3f\x5c\x7c\xc9\xd4\x3d\xaf\x0e\xb3\x45\x8f\x00\x36\x25\x2e\xc3\x84\xa7\xd4\x86\x60\x83\xe2\xb4\x78\x8a\x5d\x3e\x4f\x1f\xdd\xe8\xed\x8a\x26\xd4\x06\xdf\x70\xa2\x3b\x18\x45\x11\xb2\x96\x0a\x17\x15\x7b\xc0\x49\x96\x27\x25\xc8\xeb\xde\xfb\xed\x79\x2a\xe7\xf8\x57\xde\xad\xa1\xaa\x2a\x17\xf5\x82\x47\x18\x5c\x6b\x0a\x08\xb6\x76\x12\x51\x35\xe4\xba\x8d\xe2\x90\xaa\xea\x21\xf8\xe5\x30\x1a\xda\x86\xbf\xff\x0a\xdf\xf1\xbe\x27\x05\x81\x19\x92\x42\x86\x10\xa4\xdc\x93\xca\x46\xa2\xaf\x05\xc6\xeb\x06\x99\xc5\x26\xb7\xa8\x81\x84\x3c\xb7\x2c\x81\x29\x6b\x79\x9f\x82\xaf\xe0\xf1\x53\x77\x54\x59\xd7\xd8\xfb\x8d\xa2\x39\x48\x88\xb9\xcb\xab\x49\x5f\x61\x53\x18\x25\x92\x34\x50\x85\x4e\x20\xf5\x46\x45\x4a\x13\x82\xd9\xf4\x14\xa0\x72\x50\xda\x47\x20\xb5\xc2\xf1\x35\xd8\x09\x7a\xa0\xb8\x19\xe1\xfd\xd9\x29\xa0\xbc\xe5\xe7\x2e\x6f\xd6\x02\x93\xfe\x22\xdd\x9e\x47\xec\x5d\x09\x9e\x2a\xcc\x2c\xbd\x01\xb0\x6b\xd0\x41\x4e\x4b\x8e\x15\x0d\x0c\xdb\x50\x72\xef\xfe\x90\x92\x4e\x5a\xa8\xf5\x47\x76\x74\xf7\x7a\x06\x78\xec\x6a\x20\xf6\x0a\x38\xfa\x97\x6e\x02\x17\xa8\xe7\x40\xfa\xdf\x0f\xfe\xb2\x96\x4b\x46\x96\x90\x55\xc6\x15\xec\xbb\xce\x73\x83\xfd\x74\xf6\xdb\xf3\x40\x0b\x15\x68\x63\x1b\x67\x28\x00\xef\x69\xa2\x20\xc9\x14\x66\xb3\x56\xed\xd6\x62\x95\xc8\x1b\x69\xcc\x32\x3e\x04\x93\x4b\xce\x44\xf3\x77\xf0\xbb\xe6\xd7\xa1\xf7\x53\xab\x4d\x69\xc0\xdc\x35\xef\xbe\x18\x45\x85\xd1\x2b\x1b\xdd\xb3\x37\x6f\x4f\xca\xe3\xb0\x90\x95\xef\xb9\x65\xe3\x58\xd1\x96\x22\x71\x63\x9e\x76\x3e\xb6\xc3\xe2\xa6\x68\xa7\xa1\xa4\x01\x1d\xe0\x7c\x86\x31\xb6\xfb\x05\xd2\x6f\x3c\xd9\xe6\x1f\xcd\x6e\xfe\xf2\x7f\x97\xd9\xe8\xfe\xff\x89\x8e\x4d\xf8\x33\xda\x18\x85\x00\x9c\xb2\x06\xaf\x91\x57\x6d\x63\xfd\x7e\x94\x03\x1a\xba\x6d\x0f\x85\xf8\xec\x6d\x80\xa1\x11\xbc\x38\x61\xbb\xa8\xd0\xe8\x88\xc3\x23\x39\x55\x4e\x24\xb5\xc3\x4f\x20\xf3\x17\x3a\xca\xea\x86\x5a\x15\xfb\x83\x51\x58\xb4\x48\x01\x74\x1a\x2e\x8b\xaa\xe2\x43\x31\xe5\x53\x6d\x55\x24\x8a\xd6\x16\x9c\xe4\xbc\x12\x79\x14\x00\x36\x70\xf9\x16\x61\x4c\x46\xe0\xf3\x5a\xe8\x55\xee\x67\xa8\x6d\xd7\x2c\x90\x72\x8a\xa0\x10\x49\xa1\xbf\xf1\x5d\xc8\x3c\x64\xbb\xc2\x93\xde\xba\xdf\xc3\x7b\xf9\x96\x29\xcc\x15\xbb\x02\x0b\x40\x9c\x76\x5b\xae\x17\x57\x53\x4b\x58\xf6\xc9\x36\x96\xd9\xb4\x0f\x73\x06\xcb\x18\x18\x33\x67\x9e\xce\x39\x24\x74\xa9\xe6\x3e\x1f\xbb\xc3\xbd\x07\xa5\xb9\x15\x30\xa0\x38\xb0\xa1\xac\x6d\x6d\xb8\xd7\xdb\x88\x94\x45\x1e\xfb\xbe\x0a\xcd\x69\x54\xd1\x8f\x38\x79\xdf\x50\x1b\x5d\x0a\xc4\x5b\x31\x9f\x2f\x8b\x6e\x8e\xf1\x27\x79\xbd\x25\x02\xd6\x1a\x0f\xc9\xd5\x45\xef\x42\x4d\x9c\x87\xb9\x44\xbe\x59\xd8\x4a\x11\xd7\x84\x5e\x58\xcd\x61\xfc\xcf\xae\x6f\xec\x9c\x7b\x38\x36\x09\xf5\x62\x33\xe7\xe8\xb9\xf6\x0b\x62\x0d\x43\xf7\x30\xc0\x6e\x53\x54\x19\x0c\xf5\x2f\x90\x25\xd1\xaa\x74\x6e\x7f\xaa\x95\x96\xe9\xb9\x50\x27\x82\xd2\x66\x7a\x58\x09\x45\x4f\x6b\xb9\x92\x29\x18\x85\xfe\xcd\x3d\xdb\x31\xfd\xc1\x26\xc2\x89\x4a\x42\xd5\xc2\xbb\xa6\x42\x49\xec\x12\xd4\x1e\x2a\x67\xff\x29\xed\x77\x27\x14\x2f\xb0\x72\xba\x75\xba\xab\x0d\x5d\xe1\xf0\xf5\xc5\xb0\x4f\xd6\x39\x7e\x81\x25\x20\x47\xe0\x2b\x67\xc5\x77\xd1\x17\xd3\x78\xa9\x8d\x7c\x8c\x77\x87\x55\x6b\xd2\xd5\x9d\x13\x35\xd3\xa2\xa7\xb7\x1d\x11\xb2\x23\x41\xa4\xde\x14\x56\xa3\x59\x50\xd0\x8c\x8c\x66\xf9\x07\x28\x00\x10\x5d\xdf\x4c\x17\x44\x01\xe9\x30\x02\xfd\x04\x1a\xda\xe7\xd7\x32\xed\xdd\xbe\xa6\xa1\x6c\x84\x02\xef\xa5\xa5\xbc\xd0\x3f\x2e\x05\xb1\x50\x31\x34\xe6\x84\x62\xa9\x5f\x03\xb2\x44\x3c\xaa\x1d\xa0\x95\x13\x74\x59\xf8\x7e\xbd\x36\x73\x8e\x95\xa8\x0b\x0f\xf0\xcf\x09\xbb\x6f\x77\x07\x13\xae\x67\x06\xbf\xd0\xa6\x78\x20\xc5\xc6\xeb\x57\x82\x2d\x8e\xb8\x82\xce\x5a\xfb\xa0\xf1\x9b\x14\x5c\x1c\xa2\x2a\x3f\x00\x73\x8d\x8e\x05\xea\x11\x67\x72\x06\xab\x4f\xe9\x76\xbd\xdb\xad\x8f\xd3\xcf\x00\x01\x52\x0f\x80\xa2\x20\x47\xf7\xd7\xc7\x2d\x05\x8e\xa1\xee\x6a\xf8\x72\xe9\x51\xdc\x8c\xd6\xde\x59\x4f\x79\x50\x20\xe3\x24\xcc\x77\x51\x5b\x3e\x9d\xc4\xd5\x08\xff\xac\x3a\x1f\xff\xb2\x02\xa5\x0a\xff\x4b\x9f\x21\xd8\xfe\x33\x71\x39\xa7\x53\x89\x8b\xde\xd5\xe8\x89\x78\xde\xd1\x41\x0b\x8d\xfc\x0a\xd9\xf2\x10\x54\xc5\xab\xd5\x25\x5f\xb7\x0a\xb6\xbe\x2d\x5f\xb0\x09\x3a\x4d\x8a\x98\x1c\xd6\xa0\x43\xc0\x38\x9a\xa8\x49\x6d\x1f\x6a\x9b\xfb\xbb\xf2\xd9\x1d\xe7\xf6\x40\x08\x44\x94\xeb\x17\x78\x29\x8a\x24\x6d\xdb\xa0\x3e\x12\x5e\x39\x4e\x6b\x31\xf0\x8f\xdd\xfa\xa9\x75\x2c\x7c\x08\x11\xf6\x35\x32\xcd\xbb\x89\xff\x6c\x4d\x8b\xf2\x70\x7d\x48\xa0\xd2\xf0\xf8\x44\x86\xd7\x38\x4c\xbf\xc4\x4b\xca\x28\xdb\x4e\xa5\x59\xcb\x22\xb3\x43\x54\xe8\xac\x7f\xe1\xe0\x65\x36\xcf\x56\x5c\xc3\x25\xd2\x69\x31\xab\xd6\x94\x0d\x83\x25\xeb\x18\x0c\xa2\x4b\xd0\x44\x23\x4f\x34\x81\xe2\x6b\x67\x66\xda\xdb\x9d\x26\x75\xc8\x1f\xc2\x20\x3c\x1c\x88\x26\x0d\x11\xae\x73\x45\x0a\xfa\x0d\x06\x64\x9e\x35\x06\x8a\xc3\xc2\xeb\xa4\x98\xa9\xe0\x01\xcf\x2b\x1b\xee\x00\xcc\x15\xb9\x78\x9b\xed\xf7\x66\x41\x46\x0b\x3f\x0d\xc5\xdc\x5e\x36\x93\xb1\x09\x35\x4e\xc6\xa1\x9b\x14\x58\x76\x69\x72\x3f\x03\x99\xd0\xc0\xbd\x86\x2d\x67\xa8\x29\x10\xc6\xe0\x7b\x7b\xcf\x45\xfb\x43\x9e\xb7\xa2\xb3\xfd\xae\x3c\x62\x06\x4c\x3f\x97\x28\x96\xe3\xea\xe0\xd0\xfb\xba\x46\xa2\x25\x9c\xc3\x95\x91\x89\x8f\x68\x8d\xe0\x50\x05\x54\x78\x87\xa4\x5e\x45\xec\x0a\x3a\x1d\x75\x4c\x8f\x14\x8d\xca\x63\x1c\x97\x95\x23\xf4\x07\xcb\x1b\x0d\xb3\x40\xb8\xb0\x8e\xdb\x77\x18\x20\x3c\xe2\x7e\x7d\x84\xfc\x91\xfd\x44\x26\x37\x6e\xc9\x34\xc2\x14\xaa\x16\xd1\x12\xe6\x2d\x72\xfb\xb5\x2f\x38\xc6\x39\x4b\x53\xce\x34\x21\x0b\x17\x9b\x78\x94\xdd\x7b\x88\xf8\x0c\x27\x2c\x6a\xbc\xdd\xbe\x66\xed\x39\xca\x1e\x2e\x72\x16\x53\xfa\x30\xe6\x6a\xb3\x94\x1a\xb4\xaf\x3d\xcb\x11\x9f\xf1\x6b\xad\xc2\x55\x2a\x32\xfa\xa7\xaa\x98\xa1\x59\xb8\x21\x1c\x17\xe6\x7b\x31\x4b\x86\x60\xfe\xa3\x3a\x47\x37\x3e\x20\x1b\x27\x37\x8d\xf2\x6b\x59\xf0\x8d\xde\xdc\xf1\xb9\xab\x9b\x6b\xaa\x38\xaf\xd0\xed\x17\x5a\x78\x3a\x04\x3c\x48\xf7\xaa\xe4\xea\x76\x66\x4d\x04\x67\x75\x34\xe2\x07\x30\x9f\x3f\x49\x45\x9f\x93\xcb\x43\xfc\xef\x77\xa8\x16\x10\xdf\x8a\xc1\xb0\xd1\x4a\xcf\x1e\x20\x36\xd9\xf2\x4f\x52\xf0\x3d\xdb\xff\x65\xd5\xef\xaf\xba\x86\x62\x0b\x45\x02\x6c\x58\x93\x79\xe5\x1e\xde\xfe\x67\x3c\x8e\xe5\xf1\x7f\x2a\x8e\x19\xfe\x06\x2b\x99\x6d\x13\xe4\x18\x4b\x8e\xed\xd2\xa8\x5c\xf3\x1e\xea\x48\xf2\x04\x95\x8e\x5d\x53\x1e\xea\xc2\x2f\x34\x0d\x01\xbe\x1d\x24\x5c\xb2\xa0\x25\x8a\x29\xf4\xab\x01\x0f\x12\x74\xfd\x25\xdf\x38\x28\x3d\x05\x28\xfc\x83\x59\x73\x7b\x14\x12\x3c\x96\x92\xd0\x54\x12\xbc\xe7\xb3\x41\x54\x3c\xd4\x25\x91\x7b\x25\x53\x40\xfc\xf1\x77\x1e\x85\x50\xe2\x51\x9d\x22\x37\x44\x25\xc1\x77\x29\xed\xb4\x32\x88\x43\x8e\xa8\xa3\x22\xb6\x66\xc0\xb1\x7c\x8e\xaa\xa3\xc2\x07\xa7\xf1\xc2\xbd\xc1\x0b\x8f\xc2\x27\x88\xde\x0b\x90\xe9\x27\x88\xe1\xdd\x8d\xd1\x33\x8f\xd1\x51\xf7\x1f\x8f\xd9\x41\x8f\xc9\x2f\xb0\xd9\x2f\xaf\xf9\x32\x8d\xc2\xfd\xd7\xd3\x63\x8d\x2d\xab\x43\xda\xaf\x9e\x2b\x24\xff\x3d\x9f\x62\x72\x27\xdb\x53\x97\x52\x76\x6f\xab\xa3\xae\x12\x2d\x51\x7d\x2e\x3e\x7d\xa2\xdf\xf4\xa5\x1e\xcb\x1f\x70\xfd\x63\x5e\xfd\x53\x5e\x3d\x56\x87\xb4\x83\xbf\x2a\xc2\xa1\x24\x6e\x8e\x7c\x36\xfa\xbf\xe1\x0a\x69\x6c\xfe\xe1\xc8\xee\x52\x1a\xaf\xbc\x63\xdf\x54\x4a\x88\x24\x52\xaf\x32\x76\x68\xa5\x53\xfe\x5a\x03\x09\xbe\xff\xfe\xce\x7c\x36\xce\xff\x5a\x93\x33\x41\xe8\x43\x47\xdb\xb6\xe0\xa8\x47\xef\x99\x4b\xe9\x58\x2c\x8f\x9e\xb3\xf8\x56\x2c\x8f\x59\xd3\xf7\xa1\x2e\x93\x5d\xa8\xe0\x97\x4b\x47\xf0\x4f\x9f\xfe\xb3\x56\xfa\x9f\xfb\x49\x63\x49\xcc\x5c\x86\x87\xdd\x3a\x02\x1f\xfa\xfb\xd7\x3b\x0b\xd4\xf5\xd2\x28\xa1\x95\xa9\x85\x4a\x99\x21\xf4\x97\x3e\x8b\xf7\xbf\xf7\xbf\xcf\x11\xe8\xaa\x24\xf1\xd6\x3f\xe1\x34\x38\xfa\x0b\xe5\xf1\x4e\x3d\xda\x4b\x63\xf3\x2a\x63\xb5\xff\x43\x96\xd2\xce\xe8\x14\xb9\x3d\x0a\x7e\xe5\x8b\x29\x6c\x4b\x89\x7e\x43\x89\xbe\x72\x1e\xea\x9c\xff\xcc\xbf\x09\xa4\xf6\x2a\x25\xfa\xcb\x24\xfa\x56\x04\xd3\x37\x3b\x66\x09\x91\xf1\x4c\x25\x1a\x2d\xde\xe1\x3f\xbf\x17\x60\xd3\x1a\xc6\xb3\x40\xdd\x36\x9f\xcc\xd1\x0b\x1c\x5a\xf9\x43\x56\x38\x7c\xcd\x22\x87\x30\x78\x93\x37\x7c\x96\x35\x20\x55\x32\x7c\x01\x37\x7c\x51\x34\xfc\x06\x35\x21\x53\xb4\x7c\xe5\x35\x7c\x07\x71\xbe\x96\x35\x07\xe7\x6f\x78\xee\x95\xa0\xe1\x91\x46\x38\xf4\x37\xbc\xe1\x7f\xc5\x33\xff\x47\x3c\xbb\x63\xa8\x3f\xf6\xc7\x0f\x20\xc2\x95\xc2\x37\x8b\xd3\x31\x15\xd2\x37\x47\xa0\xe6\xbf\xd6\x90\xc8\x22\xfc\x2b\x25\xf1\x4c\x90\x50\x75\x79\xa8\xfb\x63\xbc\x3e\x8d\x6b\xca\x2f\xb7\x01\x19\x8f\x21\x08\x9f\x15\x24\x8f\xe1\x0f\x8f\x11\x04\x8f\xc5\x17\xa8\x03\x05\xb8\xd1\x2b\x8f\xc9\xa7\xbc\x25\x08\x88\xcb\x29\xff\x8d\x97\x4a\x74\x5f\x46\xf0\x98\xcf\xee\xdf\xf0\xdc\xff\x05\xcf\xf9\x9f\xf1\xae\x3f\xe6\xae\xa3\xff\x17\xb2\xf8\x87\x8c\x72\xf4\x9f\xf2\x18\x0c\xae\xf4\x9f\x71\xff\xd1\xb7\x3f\xf5\xcf\xc7\x1a\x9b\xa7\xb1\x42\x12\xfb\x0c\x09\x21\x45\x0a\xcf\x3f\xf4\xbc\xe8\x14\xd0\x5e\x48\x24\x0e\x0a\x86\x61\xd4\xc2\x0b\x5c\x36\x94\xfb\xac\x15\xd5\xd2\x7f\x4c\x56\xe4\xe1\xfc\x1d\x0a\xf0\x38\xae\xf2\x38\x8e\x48\x6a\x14\x28\x4f\x7e\x41\xc3\xa7\x8b\x99\x6c\xae\x0a\xc1\xd8\x60\xb8\xb1\x7c\xdd\x2c\xd8\x3a\xbe\x0c\xde\x62\x6b\xb8\x82\x5a\x8b\xac\xf3\xb0\x7d\x6b\xb8\x8a\x28\x38\x1e\xc7\x8c\xce\xa3\x25\x52\xd3\x74\x01\x5a\xa1\x72\x3e\xd7\x31\x92\x8b\x07\x2c\x04\xf4\x40\x4f\xf4\x94\x8f\x1f\xbe\x62\xdf\xf8\x89\xa6\xf0\x24\xd3\x7a\x56\x60\x3f\xf9\x5e\x7a\xe3\x76\xca\x8c\xb0\xc1\xdc\xbc\x0f\x15\xa4\x45\x22\xf7\x65\x97\x67\x59\x99\xd9\x60\x9b\x87\x95\x42\xc7\x6e\x90\xc5\xf5\x95\x56\x81\xbf\x26\xae\xf3\xcc\xee\x8b\x2e\xa3\x0e\x3b\x38\x70\x88\xfd\x88\x6e\x58\xa1\xb4\xd7\x11\x35\x96\xbf\xd5\x47\x20\xc2\xca\x08\x32\xd8\x98\x26\x4c\x89\x38\xea\x76\xa0\x55\x3c\x35\x69\x1d\xa5\x6e\xac\x9a\x8f\x21\x3b\x98\xda\x0d\x5c\x28\x9e\xba\x82\x36\x74\x34\x90\xcf\x7e\x3a\xb7\x68\x14\x4f\x56\x72\x8b\xb9\x83\xae\xab\x58\xc1\x7d\x30\xc2\xf4\x46\x7c\x37\xd5\x47\xbd\xed\x76\x84\x0b\x6a\xe6\x9b\xab\x8d\xc5\x53\x78\x3a\x4c\x34\xe9\xad\x22\xee\x4b\x69\x61\x41\x0d\xa9\x05\xc9\xa5\xaf\x8d\x81\x3b\x03\x94\x44\xd8\x3c\xe2\xa5\xad\x6e\x38\x3d\x4d\x44\x4c\x67\x30\x2d\xe2\xc6\x62\xa2\x29\x24\x35\x16\x6a\xf1\xd0\x51\xc2\x72\x6f\xa1\x70\xf3\x6a\xe6\x4b\x1f\x44\x2b\x8f\x27\x10\x87\xa5\x2d\xc2\x43\x37\xd1\x46\x05\x09\x9d\x4e\xca\x01\x4a\x54\x3b\xe9\x2f\x16\x21\x65\x97\xaf\x04\x98\x2a\xb6\x84\xa8\x36\x63\xda\x25\x34\x0c\x47\x54\xb5\x48\x24\x6d\x33\x35\x80\x61\x6c\xdd\x77\x69\xa4\x36\xdf\x1e\x4b\x89\x19\xc3\x3a\x84\x5b\x62\x36\x7e\x0b\x8b\x26\x0f\x87\x41\x00\xf0\x60\x17\x98\x28\xbb\x6a\x28\xfb\x90\x03\x4a\xb7\x4b\x43\xb6\x2c\x6f\x09\x25\x40\xfb\xa5\xfb\xf8\xdb\x6f\xee\xaa\x87\xf5\x32\xac\xd5\x78\x28\x73\x8d\x9a\x0e\xc4\x19\xb2\xd7\xa2\x69\x06\x02\xa1\xe3\xe7\x60\x84\x02\x8f\x61\x11\x03\x81\x2b\xb4\xf3\x6e\xa3\xd8\xab\xaf\x30\xc3\xc3\x4f\x97\xb3\xc6\x39\x1f\xeb\x17\x50\x93\xfa\x76\xa8\x5f\xc0\x16\x06\x8c\x74\x00\x11\x33\xf9\x50\x0e\x48\xd9\xf2\x07\xf3\xbf\x1f\xa3\x1f\xd4\x31\xfe\x20\xee\x37\xe4\xaa\x21\xfb\xcb\x4a\x7b\x03\xbe\xeb\x19\xdc\x50\x3a\xc0\xb8\x6a\x39\x7b\xad\xc6\x8d\x09\x7a\x9c\xb3\x49\xd0\x07\xde\x49\x7a\xe2\x8f\xdc\x91\x0d\xbd\x98\x90\xcd\x63\x32\x6c\x69\xa2\x2c\x4a\xb2\xd9\xb6\x2d\x89\x4f\xad\x6f\x0c\x75\x33\x66\xb9\xb9\x3b\x28\x0c\x46\x24\x23\xef\xe6\x81\x9f\xb3\x29\xa2\xe6\xa0\x7d\x63\x5b\xa7\x89\x73\xb6\x16\xab\xbd\xd0\x6b\x99\xff\x1a\x8a\xef\x19\x8b\xdd\xc5\x46\xd0\xd5\x69\x97\x76\xb2\x8a\x86\xa1\xc0\xf3\x13\x7c\xd8\x86\x91\x87\x88\x23\x02\x9b\xe1\x7d\xeb\x1f\x25\x13\xc5\xff\x21\x13\xff\x87\x4c\xfc\x1f\x32\xf1\xff\x98\x4c\xb8\x83\x81\x39\x7d\xf2\x9a\x7c\xf8\x87\xf3\xc7\xfe\xe3\xfc\x47\xd6\x15\x52\xce\xe4\x4d\xc1\x80\x84\x3f\x1c\x2b\x64\x04\xca\xff\x16\x99\xf8\x0b\x2f\xfd\x1f\xf1\xfe\xdf\x91\x89\x55\x72\xbe\x96\x33\x7b\x05\x32\xa0\x3f\x9c\x7f\xf3\x1f\xe7\x1f\x88\x82\x3b\xfc\xf1\x3f\xe7\x73\x7c\xe1\xb1\x7c\xe7\x71\xba\xff\x1d\x32\xf1\x17\x9e\x29\xfc\x8f\x78\xff\xdf\x90\x89\xa1\x86\xdf\xca\xf8\x83\x4c\xe4\x7f\x91\x09\xf3\xbf\xc8\x04\x74\xe8\x81\xbe\xb2\x34\x7c\x2e\x65\x18\xd9\xd3\xf2\x0b\x94\x67\x81\x42\xaf\x33\x3d\xe1\x31\x92\x44\x16\x50\x74\x84\x82\x12\xec\x66\x80\x03\x2c\xaf\x4f\x9a\xde\x95\x78\xd6\xe5\x34\x55\x09\x06\x45\x88\x3a\x28\xd2\xc6\x3e\x83\xce\x11\x41\x00\x1c\x81\xe9\x51\x45\x88\x46\xaf\xba\xea\x3b\xe3\x6b\x26\x7f\xf3\x3c\xff\xc6\x5f\x20\x06\xe1\xb4\xa3\xc6\x55\x22\x79\xaf\xbc\xd5\xe7\x86\x3a\xcb\x40\x9f\xc4\x7c\x0b\xd1\xb7\xfd\x04\x1f\x15\x40\x0a\x01\x4a\xfe\x44\x0b\xb8\x49\x75\x34\xf2\x43\x02\x2a\x5b\xc5\x27\x2b\x4b\xa7\xa2\x03\xe7\xdd\x1e\x09\xcb\x64\x8f\x1b\xa6\x22\xde\x29\xe8\x23\xdd\xa0\x7d\x25\x93\xde\xef\xf6\x38\x04\x4d\x51\x73\x57\xf7\xfa\xe4\x55\x5e\x4a\x7e\xdb\x45\x08\x2d\xfb\xef\xbc\xf8\x86\xb8\x64\x35\x12\x99\xf5\x27\x82\xcc\xef\xa9\xc0\xa5\x9b\x77\x02\x48\x7e\xef\xb2\x71\x5d\xc0\x5e\xa6\x65\x01\xa4\xf8\x8b\x8d\x7e\x8e\x0a\x28\x7a\x15\xc6\x72\x6c\xc8\xc4\xcc\x99\x52\xb6\xcd\xfb\xec\x07\xd9\xef\x71\xdc\x93\x2d\x1d\x11\xaa\xd1\x28\x9e\x7f\xdd\xab\x78\xb4\xd8\xb9\x58\xa2\x51\xbc\x64\xed\xee\x46\x06\x7a\x21\xec\xc8\x84\xa9\x23\x6c\x16\xb6\x01\xb2\xd5\x9b\x5f\x6a\xb3\xea\x99\x98\xb4\xb3\x0a\xd9\xed\xb6\x95\x9d\x45\x24\xd0\x00\x97\xb2\x0e\x61\x67\xb8\x5a\x17\x3b\x9a\xa6\x4c\x5b\xce\x06\x0e\xd8\xc5\xf8\x35\xb7\x9c\xe5\x4a\x18\x72\x0f\xd2\x97\x3f\x4d\xbc\x27\x82\xf4\x53\x64\x1d\xc7\xd2\x76\xa4\x06\x29\x34\x5c\x6e\x2b\x25\x30\xf2\x2c\xdd\xb4\x90\x56\x66\xa2\xe9\x78\xee\x45\x0d\x33\x89\x05\xae\xd1\x14\xa4\x51\xb8\x67\x71\x18\x61\x77\x94\x63\x35\x39\x39\xd2\xe6\xc6\x58\x20\x38\xfb\xf9\x09\xd8\x8b\xca\x97\x9f\x87\xd7\xaa\x67\xdc\xc2\xe2\x44\x8b\xca\x94\x74\x06\x79\xf8\x87\x66\x1d\xb9\x05\x1c\x8b\x49\x9b\x05\x50\x3b\xb8\x27\x05\x96\x12\x26\x23\x29\x7f\xb6\x22\x23\x89\x9b\x42\x2f\xa2\xa5\xc0\x1e\x7e\xac\x3c\x23\x17\x3c\xad\x86\xf4\x40\xbc\x9f\xb9\xe8\xfc\xd5\x77\x2d\x09\x6a\xf9\xe6\xd2\x50\x2e\xe0\x2d\x74\x0d\xff\x5e\x8f\xfe\x35\xd8\xdb\x09\xde\xb5\xf4\x69\x5b\x97\x18\x6d\x31\x95\xae\x22\x65\xd5\x64\x9e\xae\xd8\x96\x45\x5c\x77\xd3\x25\x59\xe6\x0a\x3f\xdf\x75\x05\xa1\x9c\x29\xa3\x52\x73\x2f\x4c\x71\x83\x9c\xf5\xd2\x14\x9e\x4d\xd4\x33\xe7\x16\x6a\xb1\x66\x38\x67\x86\x01\x99\x8d\x34\x4f\xcb\x51\xc3\xc7\xbc\x66\x3f\xce\x96\xbe\x42\x3e\x03\x72\x07\xe3\x2d\x57\x20\x16\xc2\x1d\xf7\xf5\x33\x06\xda\xb7\xec\xfa\x07\xd4\x9d\xae\x72\xba\x98\xfc\x50\x3f\xf5\x34\xb3\x50\x48\x20\x53\xef\xc8\x99\x6c\x03\xf0\x87\xcd\x6d\x30\xfa\x38\x09\xbc\x06\xd5\x82\x61\x8c\xdb\xc8\x76\x22\x0a\xb4\xf2\x9f\x6d\x4b\xda\xb7\xf1\xdf\xc5\x25\xda\xff\x3e\x9e\x8d\x1a\x8a\xe3\xcf\xb6\xfc\xe7\x07\xa4\x6f\x6c\x0c\x4b\x06\x9b\xac\x6b\x65\xde\xb0\xfa\xac\x80\xa0\x76\x9b\x22\x78\xb1\x8d\xc8\x8b\x97\xe7\xc5\xd8\x41\x29\x89\x1e\x2c\x3e\x8a\xeb\xb2\x71\x3a\x8a\x0e\x2d\x85\x25\x2f\x98\x4a\x2b\xa9\xcf\xc0\xef\x37\x32\xcd\x55\x3a\x1b\x14\xfa\x3b\xcd\x74\xb4\x26\x73\xe1\xdb\x6f\xfc\x3e\xb4\x04\xe9\xef\x42\xbd\xe5\x7e\x28\xae\x05\xb7\x31\xd1\x90\xd8\x40\x0b\x41\xdd\x73\x19\x02\xb6\x3e\x04\x7f\x25\x01\x9e\x44\x66\xc2\x54\x4e\xba\x86\xe8\x03\x74\xb6\xec\x36\x28\x3c\x00\x94\x55\xe0\x7a\xde\x64\x8f\x12\xf6\xa8\x09\x06\xf3\x15\x87\xa6\xa2\x99\x24\x66\x93\x21\xf7\x21\x54\x02\x77\x21\x75\xc7\x60\xfc\xd6\x28\x5a\x89\x36\x54\x8a\x4e\x18\x10\x83\xb1\xee\x3c\x88\xfa\x65\x7f\xa0\xa0\x13\x97\x68\x53\x57\xc9\x78\x70\xde\xfc\x2c\x7e\xc3\x33\xc5\x5e\x32\x0a\x61\x22\xb6\x01\xc7\x57\xd3\x0d\x19\xb6\x8d\x15\xcc\xe8\xf8\xd2\x63\xfd\x93\xe0\xe2\x14\x47\x36\x8b\xd6\x4e\x7b\x32\xc5\xf6\xf4\x84\xe0\x32\x8e\x46\x9b\xc6\xe9\xdf\xce\x49\xdd\xa1\x72\xbc\x4f\x77\x97\x4b\xca\xec\xa2\x8b\xf4\x03\xaf\x33\x2f\x12\xd8\xa5\x25\x34\xf6\xb2\xda\x2e\x33\x9b\x0c\x02\x12\x7a\xbd\x33\xf1\xb9\x4e\xf2\x57\xaf\x94\x88\xaf\x11\x7f\x00\x9b\x69\xac\x88\xd2\xf5\xb2\x74\x97\x65\xc4\x5d\x26\x80\xa2\x20\xb7\x30\x96\x8d\xcf\x61\xe9\xd3\x5e\xb9\x38\xb0\x3a\x34\x4d\xe7\x10\xc9\xf5\x23\x43\x02\x02\xe8\x8f\xcc\x06\x06\x69\x6a\x99\x2e\x5c\x91\x6a\x2d\x5c\xc4\xc3\x0a\x1b\x1d\x46\xa4\xcf\x53\x03\x36\x71\x7f\xc7\xe1\xdb\x9d\xe7\x57\x64\xce\x04\x61\x6d\x19\x0d\x2e\x85\x1a\x5f\xbd\xd2\x3f\x07\xad\x19\xf1\x3b\x69\xbb\x25\x80\xc8\xa8\xfb\x91\x00\x57\x89\x2d\x73\xa4\xcf\xb5\xe9\xa1\x9c\xd1\xed\xa3\x17\xbf\x86\xb7\x0d\x52\xd6\x6e\xac\x4a\x32\x65\x93\x66\x72\x5e\x97\x82\x8f\x90\x2b\xa4\x0d\x7b\x54\x1f\x69\x8e\x02\xab\x6b\x2f\x9b\xcc\xd0\x20\x39\xa4\xf2\x62\xe2\xfd\x00\x0a\x02\x36\x89\x8b\xaa\x74\x01\x53\x97\x66\x19\x52\xd0\xfe\xe2\x07\xd8\xdd\x5f\x8c\x10\x6d\x8c\x03\x61\xf6\xf8\x95\xf3\xc1\x49\xb2\xd9\x59\xcc\x17\xa5\x8d\xa0\x39\xb8\x73\xe0\xa3\xb2\xe9\x4b\x9f\x67\xb1\xe7\xf8\x85\xfb\x22\xd6\xed\x63\x5e\xba\x0d\x90\x92\x30\x56\x33\x84\x51\x20\x00\xe3\x13\x83\x5f\x0e\xf1\xab\x68\xae\x83\xff\x4d\xe9\x54\x8b\xc7\x57\xdd\xad\x9c\x14\xf5\x1d\x24\x8c\x91\x4e\x61\x96\x3a\xa3\x2e\xca\xff\x64\x20\x70\x34\xd9\xbf\x4b\x77\xff\x6f\x8e\x7f\x47\x70\x0d\x41\x14\xdd\x95\xba\x35\x47\x90\xd5\x90\x08\xb5\xf0\x04\xc7\xcf\x03\xe5\x9e\x97\xef\x59\xd9\xe2\xaa\xd6\x4a\xb0\x21\xcd\x5e\x9a\xc2\x07\xef\xd1\xf4\x61\x72\x50\xb4\x5c\x98\xb8\x56\x0c\x12\x4d\x0a\x0f\x1d\x72\x91\x46\x3f\x4c\x6e\x44\x53\x38\x45\x81\xcf\x63\xc6\x65\x9e\xaa\xcf\xaa\x40\x0b\xa0\x49\xf4\xba\x52\x61\x7f\x31\x35\x99\xb7\xd2\x36\x4e\xc2\x1d\x3c\x27\x71\x10\x5a\x15\x06\x16\xb0\xd3\xe2\xb7\x8f\xbf\xc3\x6e\x9d\x11\x41\xc3\xb4\xa0\xc0\xe3\x47\x2b\xf0\x6b\xc8\x0d\x24\x30\x94\xfc\x63\x0d\x08\x1b\x43\x91\x69\x97\x04\xa5\x6a\xcf\xe3\x9d\xd0\x44\xd7\x5a\x0b\x29\x89\xd4\x8a\x27\x95\x47\xe2\x82\x9f\x7c\xdc\x02\xb4\xd2\x0b\x74\x45\x42\x31\xed\x7f\x04\xd0\x38\xcd\xbd\xcf\xed\x27\xf9\xe7\x46\x98\xed\x4e\x0c\x49\xba\xc5\xfd\xad\x43\x92\xd8\x0a\x23\x1a\x10\x90\x55\xcf\x77\xb4\xc3\x92\x74\xfc\x02\xcd\x74\x77\x6d\x58\x2b\x45\x61\x57\x4d\x71\x0f\x05\x56\xc9\x22\x26\xdb\xd8\x6d\x0b\xd0\xb0\xda\xf8\xc6\xf9\x81\x4b\x25\x09\xf9\x62\x26\xeb\x3f\x51\x59\x58\xe3\x9a\x1b\xf8\x5d\x15\xcd\xda\x26\x1b\x85\xa4\x08\xb5\x14\xa1\xe8\xa6\xe5\xfa\xc6\xc7\x7d\x71\xb7\x61\xc4\x9b\x17\x18\xc5\xe2\x07\xae\x98\x14\xa3\xec\x1c\x7d\x37\xcb\xe8\x36\xd2\x52\x1d\x1b\x6a\xfd\x84\xe0\x80\x33\xb6\xd5\x36\x34\xee\xe6\x47\x4b\x36\x91\x7e\x9d\x7c\x73\x95\x6d\x37\x5e\x00\x92\xde\x17\x23\x73\xad\x09\xa2\xd8\xd3\x0f\x5e\x30\x05\xfc\x2e\x8f\x73\x73\x18\x7f\xc2\x21\x11\x0e\x67\x3b\x77\xa5\x4a\xb8\x29\x39\x4e\xf3\x2e\xa4\xea\x9d\xbf\x14\x7a\x2c\xfb\x93\xbe\x18\x9e\x79\xbb\x56\x17\xf2\x5f\xc4\xa4\xad\xb5\x84\x2b\xfa\x11\xdd\xc6\x06\x1d\x0b\x33\xd8\x2c\xd4\x37\x27\xec\xf9\xa0\x83\x06\xe6\x37\x02\x3e\xe3\x3d\xff\x00\x8b\x2f\x7c\x2b\x5c\x52\x13\x7d\x70\x94\x4c\x18\x19\xc3\x42\xdd\xf4\x3d\x90\x19\x80\x91\x16\x24\x02\x30\x2e\xc2\x9b\xdd\x3c\xbb\x20\x67\x47\xf8\x52\xed\x13\x8c\xc9\x3c\xbf\xeb\xa1\xc8\x26\xe1\x24\xee\x89\x05\x2d\x54\x2f\x2e\x12\x77\x09\xad\x5a\xf8\x32\x41\x15\xb3\x78\xc2\x2a\xb1\x80\xa3\x16\x48\x42\xfd\x98\xf4\x25\x5d\xbe\x15\xba\x13\x9c\xe9\x12\xe9\x98\x10\x5b\x52\xc4\xc0\x2e\x79\x01\xa9\xd0\x2d\xc3\x1b\x6b\xa1\x91\x76\x1b\xda\x4a\xd3\x9a\x62\x88\xed\x24\x6d\x0d\x87\x10\xce\x6f\x10\x9e\x23\x24\x07\x1b\x6e\xad\x61\xdb\x2f\x14\x20\x21\xab\x86\x58\x77\x40\xc2\x72\x09\xb3\x5d\x9a\xf6\x7a\x26\x5c\x68\x59\xc0\x36\xa0\xd6\x4c\x01\xba\x46\x3c\xbb\x4f\x6f\x69\xfb\xaa\xeb\x73\xb7\xaa\xc3\x9e\x39\x82\x46\x70\x5c\x8d\x4c\xda\x8e\xb6\xb4\x99\x9c\xb5\x28\x7d\x9e\xd1\xb3\xa3\x11\x75\xee\x66\xce\x94\x5f\x44\x39\x46\xcb\xe3\x18\x72\x05\xf9\x03\x46\x18\x3d\x91\xfb\x86\x5d\x98\x62\x30\xac\xb5\x75\xa8\xd0\x93\x39\xf3\x9f\x6f\x81\xff\x5c\x0d\xe1\xd1\x7c\xff\x32\xdb\xf1\xf7\xd6\xa5\x3f\xdb\x91\x13\x3b\x37\x3e\xcf\xaf\xcb\x43\x99\xc5\x63\x18\xd6\x2e\x8b\xc3\x68\x39\x11\xd1\x0d\x84\x19\xdc\x17\x42\x3d\x1b\x1d\x5c\x64\x90\xa9\x01\x16\xa6\x29\xaa\xab\x31\xa8\x2f\x44\xc1\x75\x02\xd7\x64\x3d\xa7\xe4\xa3\x51\x77\x4c\x64\xdc\xcf\x8a\x9a\xab\x74\x4f\xaf\x82\x14\x17\xeb\xc7\xef\x9f\x41\xe2\xdf\x5c\x5b\x53\x38\x4d\x47\x90\xbc\xd7\xef\x05\x00\x94\x78\x6b\xab\xf2\xe0\x6d\xfb\xf8\xe3\x92\x11\x9b\x24\x98\xd5\x1e\x23\x94\xff\xe5\xc8\x2e\x57\x0f\x78\x16\x85\x1c\x31\x65\x9e\xc6\x28\x34\x58\x08\xc0\xa2\x7b\x67\xa2\x5f\xeb\xcf\xf2\xe9\x10\x04\x40\xe3\x1d\x86\xa0\xfd\x27\x7e\x56\x38\xf6\x6c\xa9\x59\xa9\x29\x67\xdf\x15\xfa\x64\x85\xdf\x22\xe0\xa5\x6c\x4f\x77\xa9\x0a\xa0\x2a\x0c\x4f\x79\x84\x0c\x2e\xe5\x63\xfa\x2d\x8e\x1d\xde\x61\xf5\xe6\x07\xd7\x5c\x7c\x7e\xb0\xd2\xae\x7e\xf0\xad\xd6\xa8\x0f\xb4\x61\xa5\x70\x47\xcc\xf3\x73\x05\x4d\xe1\x64\x61\x5f\x92\x24\x36\xe2\x6b\x2c\xa2\x69\x3b\xf5\x66\x4a\x48\xf8\xe5\x06\x09\x2c\x20\x66\x60\xdc\x46\x37\xd2\x75\x36\x78\x63\x95\xcc\x4f\x48\x2a\xa8\x94\x56\x42\xbe\xaf\x49\x5e\x73\x99\x83\xa3\x9a\x36\x66\x91\x1b\x64\xc7\x7a\x13\xc1\xfe\x3c\xf5\x76\x10\x96\xc0\xfd\x09\x37\x53\x09\x15\xf7\xb6\x9b\x88\x3b\x37\x4c\x75\xc6\xf2\x55\x5e\x6e\x43\x3b\x94\x6d\x41\x38\xab\x71\x11\xa5\x60\xd6\xe3\xee\xaf\xa2\x59\x88\x8e\x24\xbb\xa6\x17\xa6\x90\xdf\xf2\x84\x7a\x1c\x15\x0e\x6f\x37\xd0\xdb\x8e\x55\x08\x40\xa2\xd3\x1a\x2d\x72\xff\xeb\xce\x4f\xe1\x87\x49\xf6\xcc\x4d\xe0\x7c\xb1\x71\xbc\x42\x28\x92\xb3\x40\x4c\x86\xf2\x8b\x32\xb9\x63\x1e\x90\x06\x0d\xf4\x93\xd0\x04\x4e\x12\x89\x7e\xca\x59\x76\x0c\x4f\x2d\xc4\xc2\xb8\x88\xeb\x72\x93\x63\xf4\xdd\x8e\x72\xca\x0b\x77\xde\x6a\xbf\x1e\x17\xb7\xa2\x1f\x57\x2f\xd3\xb4\x18\xeb\x02\x6a\x78\x53\x6b\x76\xea\x1d\xc4\xad\xd8\xcb\xc5\x34\x43\x43\xa2\xd3\xce\x1e\x9b\x1c\xb3\x08\x0e\x80\x03\xc8\x49\x36\xd1\xdd\x51\x2b\x29\x8b\x3a\x97\x4f\x7d\x3d\x15\x7b\x11\x2e\xb4\xa6\xbf\xd3\xdd\x95\x7b\xfa\x6d\x07\x9f\xad\x9b\xb6\xca\x2a\x86\xa0\xcd\x99\x93\x34\x44\xc6\xd2\x80\x2b\xb9\x7f\xd0\x98\xdd\x6c\x66\x53\x8b\x0d\x05\x36\x4b\x55\x92\xf0\xa8\x96\x3f\x31\xd4\x55\x72\xa0\x0a\xea\x09\xe6\x66\x0d\x97\x72\xe4\x3d\x29\x17\x93\x9e\x4a\xb0\xd7\x58\x2d\x09\xa2\x47\xb9\x46\x5f\x45\xb4\x3f\x06\xad\x6f\x39\xf5\x19\x27\x3c\x02\x4c\x0d\xfc\x4a\xe4\x7f\x65\xc3\x97\xa3\x42\xdd\xcc\x87\x3b\x2f\xa2\x3d\xfb\xed\x56\x0a\xe9\x58\x7c\x5a\x58\x3f\x28\x95\xd1\x0d\x69\x15\x9e\x55\xc8\x6f\x83\x89\xe3\x1c\x50\xd1\xb4\x1f\x46\xc1\x6e\x13\x58\x87\xa5\x28\x92\x45\xc0\x12\x35\xc0\x85\x32\x38\x0c\xcc\xd9\x0f\x84\xb8\x10\xc2\xbe\x15\x83\xd1\x7a\xd4\x06\x91\x24\xd0\x9a\xe4\x1f\xe5\x1b\x5d\xfd\x2f\x2b\x21\x98\xdc\xbf\x9f\xe5\xfc\x9f\x4a\xc2\x2d\xf9\xe4\x68\x3f\xc6\x5f\xa2\x9a\x45\x14\x08\xe3\x1b\xa8\x7b\x66\x4a\x2d\xcd\x42\x0d\xac\x2f\xd0\x45\x0b\x2f\x49\x09\xf9\x2f\x7c\xd8\x36\x3e\x65\xaf\x9d\x10\x3c\x91\x58\xd5\x75\x56\x26\x61\x79\x21\x5a\x33\xc1\x16\xda\x61\x2f\xc3\x35\x7f\xfb\xef\xaa\x2c\xcc\xa8\x53\x9e\xf3\xa3\x3c\x3b\xab\xba\x20\x51\xc2\x56\xbe\xce\x62\x48\xd2\xb2\x65\xe4\x55\xb9\xc2\x93\xca\x06\x39\x87\xdd\x61\xb4\xa5\x16\x97\x13\x24\xc3\xdf\xc1\x78\xee\x7a\x85\xe6\x3b\xf7\x30\x5a\x13\xb1\xd5\xf6\x0d\x25\x33\xa3\xe1\x2b\x4e\xf9\x82\xba\x05\x5c\xe8\x99\x04\xb6\x3f\x30\x32\xe7\xe7\x40\xa1\x01\xd0\x5a\xbe\x92\x46\x00\x6d\x7e\x9d\x18\xf8\x74\xaf\x9c\xcf\x45\xc2\xdc\xb5\x0b\xd3\x69\x93\x4b\x20\xbf\x58\xb4\xbe\x7b\x4d\xe5\x97\xb4\x1a\x2f\x4f\xfd\x1a\x12\xf2\xbb\x1c\xbe\x64\xc7\x5b\x49\xb3\xd3\xc1\xcf\xba\x85\x91\xe3\xee\x96\x00\x13\x80\x39\x09\x60\x53\x71\x39\x53\xe1\x77\x80\x3d\x10\x6a\x8a\xbf\x87\x0a\xcd\x33\x25\x69\xa2\xa7\x37\x90\x6f\x98\x7b\x99\xee\x8d\x1b\xbb\x91\x99\x44\x48\x14\xb0\x9b\x53\x66\x66\x1c\x7a\x0b\x7b\x81\x1f\xa4\x36\x66\x8c\x2c\x3b\x11\xdb\x89\x87\x6c\x60\xe1\xbc\x4c\xe1\x64\x87\xd8\x33\x10\x6b\xcb\x84\x99\x74\x6b\x51\x30\xb7\x22\x05\x2f\xc2\x85\xaa\x98\x2a\xf3\xa0\x8d\xaf\xca\x6c\x0f\xea\x63\xa0\x62\x48\x93\x3a\x54\x91\x12\x79\x1f\xae\x35\x0a\xbe\x96\x6d\x8e\xbe\x7c\xec\xe1\xbc\xc7\x25\x2d\xf5\xf3\x15\x9e\xda\xa1\xbb\x7a\xaa\x90\x87\xa4\xc3\x28\x29\x5c\x1b\x86\xaa\x16\x9f\xa0\x16\x30\xd2\x80\xcd\x65\xc8\xd5\x81\x7d\x05\x67\x24\x0e\x1d\x58\x4e\x46\x01\x8c\xe0\xce\xc5\x76\x4e\xf2\x4c\xd5\x0a\xd0\xdb\x1a\xe8\xc1\x64\xac\xe2\x5d\x89\x67\x70\xa2\x0e\x2c\x86\x65\x68\x50\xda\xb9\x35\x53\xe4\xfb\x47\x89\x56\xeb\x50\x08\x6a\xe1\x6e\x1d\x11\xc4\x11\x48\x0c\xdf\x9a\x2f\xea\x9a\x2e\xdf\x17\x26\x06\xcb\xfa\x53\x3a\x94\x4a\xf4\x89\xbf\x5b\x8e\x5e\x5b\x2a\xab\x61\x35\xb0\x23\xe0\xb9\x64\x47\xbb\x98\x92\xe6\xc3\xc6\x21\x56\xa1\x9c\x3e\x65\xe4\x0b\x69\x2d\x6c\xe0\x6d\x68\x23\xfa\xe3\x54\x4b\xf9\xfc\x90\x60\xf8\x1d\x71\xf1\x73\x4c\x78\xde\x1c\x92\x7e\x85\xf8\xf6\x27\x02\x1f\x17\x36\xc3\x8d\xc2\xc0\x05\x07\x4f\xef\xa4\x83\x19\x42\x1e\xc3\x97\xc8\x02\x1b\xca\x59\xd0\xcd\x94\x00\xe0\xa0\x3f\x39\x04\x06\xe2\x22\x57\x76\x49\x33\xf0\xf6\x55\xc1\xa2\xad\xdd\xf8\xd0\x4f\xa1\x47\x5f\xd3\x00\x27\xf8\x55\x61\x7d\x3a\xdb\x60\xd0\x39\x67\xc2\xef\xfe\x8b\xb4\xf8\x29\x0f\xbb\xb9\xbc\xe2\x0e\x98\x09\xa7\xe2\x14\x47\x22\x98\x70\x5e\xfb\xe8\x6a\x37\xf8\x3a\x9c\xa2\xa4\x5c\xe8\xe0\xef\x90\xed\xfd\xba\x19\x0e\x3b\x39\x7a\x6b\xe7\x3d\xbd\xfe\xe1\xa6\x84\xe3\xf9\x97\x75\x25\x54\xea\x7f\x27\x12\x82\xdf\x61\x49\xb0\xe0\xd8\xf5\xfe\xc6\xdd\xfb\xb1\xcd\xa9\xa8\xde\xcb\xb5\x29\xcb\x0a\x22\xa7\xad\x9a\xac\x2f\x44\xd5\xac\xc2\xcf\x9c\x29\x4e\x6e\x64\xaa\x19\x52\xa5\xf3\x3d\x25\xd6\x5b\x95\x89\xb8\x66\x58\x8c\xc6\x35\xbc\xce\x65\x3d\x0d\xa1\x3f\xec\xa5\x01\x05\x2e\x41\x99\xfb\x89\x39\x6a\xf8\xf6\x3c\xf7\xc3\x37\xae\x8e\xf7\xce\x09\x50\xdb\x24\x54\x4b\x22\xd2\x38\x27\xfb\x72\x1f\x31\xd6\x65\x49\x07\xe7\xaf\xbe\x7e\xbf\xbe\xda\x09\x92\x40\xaa\x1c\x3d\x3e\x87\xa0\x4f\x51\xbd\xed\x7d\xb3\x6c\x0e\x30\x58\x61\x7a\x9e\xb5\xed\xb0\x63\x0c\x70\x4b\x9a\x76\xeb\xcb\xd8\x48\x2f\x00\x8b\x5e\x14\x25\x6c\xbd\xa2\x2b\x87\x57\x4a\xa9\x4b\x26\x90\x59\x3e\x3c\x6d\xcc\x14\xac\xd8\x2b\xc2\xef\x99\xda\xcb\x44\x96\x2d\x8a\x05\x12\xa2\xed\xbd\xbe\x33\x9f\xd6\xd7\xf9\xf5\xa0\x18\x0f\x24\x5e\x38\x99\x27\x18\x95\x11\x07\xd4\xf3\x0e\x36\x03\xca\x7d\x09\x12\xa0\xee\x16\x6f\x2f\xac\x07\xd2\x91\x32\x53\x61\x0c\xe2\x57\x7a\x1a\x69\x81\xa5\x66\xa1\xfe\xf4\x08\xd9\x53\x30\x2a\xc8\x92\xc6\xc5\x19\xa3\x0a\xcf\x09\x62\xac\x55\x76\x8c\xc0\x43\xd4\xaf\x73\x78\xe4\xd7\x59\xbf\xea\x79\xdd\x25\x29\x50\xee\xda\x99\x5c\x97\x18\xa6\x4f\x9b\x8c\xbc\x9a\x54\x42\xd0\xc8\xe0\x4a\xf6\x5a\x1e\x4d\x2d\x50\xc2\x77\xd9\xd1\xe8\xb2\x0c\x51\xd9\xb7\x37\xb7\x8d\xa7\xb6\x21\x29\xe0\xb5\xe7\x35\x32\xcb\xab\x17\x00\x93\xf6\x17\x8d\xb5\xb6\xdf\xed\xda\x71\x2e\x4d\x64\x42\x40\x2f\x38\xe0\x08\x68\x83\x2c\x57\x18\xf1\x13\xe2\x15\x08\x92\xb3\xce\x44\x5d\xbf\x70\xcd\x07\x8f\xfe\x01\xe5\x62\xff\x60\xc1\x8a\xd2\xcc\x81\x5e\x71\x79\x1a\xc4\x2e\x5c\x61\xd9\x05\x46\xc1\xce\x2b\x6d\xd5\xf5\x13\x0d\x1b\x28\xbc\xd8\xcd\x37\x00\xc2\x50\xd7\xc8\xe6\xea\x03\x0e\x33\xd2\x0c\x85\x90\x4c\xa8\x81\x52\x08\x93\x45\x17\x30\x17\x93\x03\xa1\xf7\x21\x61\xb2\xaa\x53\xcb\xcb\xbf\x04\x65\x0a\x17\xb3\x56\x84\x91\x18\x7c\x05\x23\x14\xfe\xd1\x15\x74\x99\x8d\xf7\x6b\x69\xeb\xe6\x7e\x6b\xc5\x0d\xdb\x95\x9e\x9b\xff\xe6\xf3\xea\x6e\x0f\xf8\x43\xb8\xfe\xba\x6e\x86\x67\x54\x0e\x24\xc7\x8f\xf9\x9c\xe9\xfe\x27\x1d\xf1\x9d\x5d\xff\x2e\x5d\x5b\xc5\xbf\x93\xf7\x3f\x4b\xf9\xec\xf8\x58\xb5\x3c\x86\xee\x2d\x70\xb4\xd0\x31\xc4\x52\x89\x1d\xd6\xe4\x1c\x76\x87\x08\xcd\x06\x58\xca\xe2\xa5\x16\x30\x6a\x2c\x07\x31\x65\x97\x04\x1c\x1b\xfe\x7f\xcc\x7d\x79\x93\xab\x46\xb6\xe7\xff\xfd\x29\x88\xf2\xf4\xb8\x7b\x64\x01\xc9\x4e\xdd\x7b\x3d\x0f\x09\xb4\x82\xf6\x0d\x4d\x4c\xbc\x60\x07\x89\x4d\x80\x58\x54\x53\xdf\x7d\x22\x41\x52\xed\xb6\xfb\xb5\x5f\x84\xc3\xbe\x25\x29\x97\x93\x67\xf9\x9d\x5f\x26\x14\xaa\x53\xba\x86\xd2\x49\x8e\x31\xab\x4e\xe7\x4e\x67\x91\x2f\xc7\x7d\x96\xb4\xf3\x34\xc9\xb8\x69\x16\x69\xe9\x11\x2f\x03\xb3\xa5\xb3\x97\xb8\xbc\xe4\x01\x27\x91\x98\xb1\x38\xcc\x8e\xa1\x57\x9d\xfd\x2d\x3e\xe9\x55\xc4\x28\x12\x8f\x92\xe0\x9c\xa7\x7e\xbc\x1b\xf1\x31\x29\x73\x4a\xe7\xb4\xf1\xa9\x29\xaf\x0e\x4a\xcd\xe2\xe2\xdd\x79\xe1\x1b\xfd\x29\x3b\x9e\xc9\xae\xbd\x12\x37\xeb\x53\xb1\x76\x3c\x67\xa4\x54\xd4\xd6\x0d\x18\x5f\xda\x0d\x0e\xa5\x6a\x93\xbb\xb0\x53\x2d\x26\xf8\xbc\x83\x11\x63\x6d\xc0\xea\x99\xe2\xaf\xcb\x68\x31\x12\x8c\xea\x34\x76\xcd\xa9\xe6\x66\x6c\x4b\x1c\x51\x7c\xd8\x22\x8c\x7c\x15\x16\x55\xb8\x33\x52\xbd\x75\x94\x8b\x11\x95\x38\x76\xa0\x88\x62\x7f\x7b\xca\x43\x6b\xd7\xdd\x2f\xf9\x89\xc8\x06\x51\x4e\xbb\xfc\x44\xe4\x68\x85\xaf\x38\x46\x8c\xb3\x88\x4e\xd6\xc7\xf3\x88\x9a\x55\xa4\x2a\x8e\xe2\x8a\x99\xf7\x47\x33\xad\x3a\x75\x5a\x93\x83\xdd\xa2\xc8\x9d\x4c\x10\x78\x86\x1b\xc5\x74\x7f\xb4\x93\xc9\x2e\xed\xac\x4f\xfb\xb3\x23\x0a\x4c\x57\x97\x4d\xc1\x13\x0a\xcd\x3a\x82\xfd\x9a\x97\x83\x19\xb7\x70\x99\x25\xcb\xf5\xd3\x7e\x79\x98\xc6\x7c\xcf\xbc\x8c\x47\xda\x66\x3f\x74\x3b\x4e\x5f\x58\x5e\xc6\x04\x28\xb0\x42\x4f\xc2\xee\x91\xb3\xce\xbb\x96\xa4\x08\x07\x4d\xdb\x9f\x67\x03\xb3\x58\x9b\x83\x4d\x4f\xf5\xcf\xe7\xfe\xac\xdf\x9d\x2e\x8a\x42\x3d\x38\x74\x72\x9a\x16\x86\xb1\x38\xb6\xc8\x75\x89\x0f\xa5\x3c\xcc\x82\x74\xd2\xa7\xf6\xc1\x5a\xab\x64\xac\x10\x8a\xf1\x60\x3d\xb1\xf7\xf6\x6a\x3c\xc1\xf7\x0b\xad\xe0\xbb\x91\xcd\x9d\x46\x58\xac\x08\xd5\xa0\xa2\xc7\x47\x41\x59\x1d\xd3\xa5\x34\xca\x42\xc5\x0a\x15\x56\x52\x36\x8a\x56\xe8\xd6\x41\xb9\x8c\x16\x2e\xc3\xea\x3b\x49\xf5\x86\x3b\x49\xd8\xac\xb6\x34\xbe\x94\x04\xf7\x72\x2a\xec\x53\xd2\x31\x76\x25\xb5\x99\xba\x6a\x40\x2d\xd2\x89\x33\xd0\xd3\x51\x6f\x5a\xed\x57\xe9\x1c\x28\x93\x96\x6b\x44\x6e\xb4\xf6\x8f\x3d\x4f\x59\xb5\x56\xf3\x5e\xac\x14\xbb\xe9\xa1\x1f\xef\x1c\xa9\xb5\x2b\xfa\x47\x30\xa1\xe3\xde\x28\x1b\x4f\xba\xd6\xe9\xec\xa8\xfd\x73\xdc\x5d\x74\xf4\xae\x38\x8d\xf1\x71\x67\x64\x50\x9b\x68\x46\x9a\x55\x67\x3a\xd9\x72\xe7\xca\xec\x38\x9d\xc1\x7a\xe5\x9e\xe6\xe3\xee\x91\x0c\xa4\x3d\x26\x47\xeb\x7e\x6b\xd1\xf1\xa2\xd1\x94\xdd\x68\x89\x50\x48\x42\x98\x1d\xd4\x99\xb7\x5e\x6f\xf9\x81\x4b\xe9\xc4\x82\x3d\xf2\x07\x9e\x73\x27\x24\x5b\x6e\x4b\xce\xee\x0b\x19\x69\x0d\x05\x73\xa3\xc8\x61\xeb\xbc\xce\x5b\x3a\x31\x5e\x58\xcb\xee\xfe\xb0\x1f\x79\x1d\x5e\xdf\xf0\x87\xe1\x85\x88\xec\x04\x74\xc6\x79\x6e\xb2\x7d\xde\x5c\x74\x39\xdc\xd7\x2c\x7c\x70\x99\x66\x2d\x63\xbb\x09\x93\xe5\x58\x4c\x94\x51\x75\xf4\xec\x62\xd2\x89\xbb\x8e\x84\xad\x05\xdf\x97\x76\x67\x3b\x10\xcf\xdc\xde\xb7\xed\x3c\x0f\xb8\xdd\x72\xce\xe3\xf5\xdf\x3c\xc2\xe3\x1e\x6b\xe0\x5c\x44\xcd\xfe\xe4\x9b\x02\x45\xf0\x15\xaf\x3c\xbc\x22\x96\x34\x77\x5a\x65\xe0\x7f\x33\x5c\x2d\x49\xad\xec\xc7\x39\xb3\xb9\x5f\xfe\x4e\x76\xd3\xdc\xa9\x2b\xc6\xca\x5a\x65\x25\xff\x49\xfc\x8c\x94\x81\x1f\xa6\x3f\x7e\x76\xb3\x2c\x7e\xc4\xb0\xa2\x28\xd0\x82\x44\xa3\xc4\xc1\x08\x1c\xc7\xa1\x98\x9f\x91\xdc\xb3\x8a\x4e\x54\xfe\xf8\x19\x47\x70\x84\x25\x10\x80\xe3\xf7\x72\xaf\x95\x6f\xfd\x5e\x59\x5a\xf0\xc7\xca\xd2\x92\x0c\x4a\x34\x45\x69\x01\x0e\x9a\x8a\xb4\xd7\x26\xf8\x0e\xc5\x71\xfa\x4f\x2f\x47\x6b\x11\x86\x69\x51\x9f\xd7\x43\xfd\xa4\x3c\xab\x85\x1b\xda\x57\xe5\x5f\x49\x40\x7e\x2c\xff\xaa\x1b\xb8\x69\x7e\x3e\x9e\xa2\x3e\x29\x17\x4b\xe8\xc0\xfc\x42\x1d\x9a\xfd\x58\x9e\xd5\x60\x79\xd3\xf8\xa2\xbc\x2c\xc3\x7f\xac\xa6\xab\x6b\x1c\xa5\x7f\x55\x5e\x16\x7c\x2c\x77\xab\xe9\x0c\xa7\x7d\x31\x9e\x27\xa9\x8f\x15\x60\x0d\x8a\xe6\xb9\xff\xf6\x72\xb1\x1b\x9e\x1f\xa0\xc4\x06\xb8\x14\xfd\x79\xcd\x58\xf0\xbb\x35\x63\x3f\x8a\xf8\x57\x0b\xc7\xbe\x97\xcf\xa3\x00\xe1\x01\x0a\x64\x0a\x65\x11\x96\x40\x69\x97\x44\x79\x9f\x40\x39\x04\x10\x75\x3d\x75\xaa\x0d\xdf\xb8\x14\x4a\xfb\x24\x4a\x22\x80\x44\x08\x94\x6f\x03\xd2\x25\x51\xce\x6f\x53\x28\x83\x00\x0e\x65\xdc\x36\x25\x03\x16\x61\x59\x94\xf0\xdb\x24\xca\x22\x80\x44\xf9\x01\x8f\x82\x4b\x40\x10\x28\x40\xf0\x4d\x2d\x9b\x46\x59\xbf\xae\x38\x4e\xa0\xec\x4d\x36\x0b\x5b\xf3\x46\x08\x89\xd2\x1b\x96\x41\xa9\xab\x0c\x0a\x65\x61\x1b\x5b\x7f\x6c\xc3\x8f\xf9\xad\x8d\xa9\xcb\x89\xb3\x08\xee\xb7\x19\xd8\x07\xa7\x53\x28\xf0\x29\xa8\x39\x89\x72\x08\xd5\x14\x8c\xe7\x5c\x4a\x66\x88\xda\x44\xb7\x4d\xa1\x2f\xd5\x7a\xff\x4e\x90\xb6\x6d\xff\x6e\x6d\x6a\xe2\x8f\x91\x00\xe0\x6e\x24\x40\xe3\x28\x4e\x90\x0d\x0f\x5c\x5b\x89\x97\xd6\x7f\x8b\x08\x1a\x2e\x79\x8f\x47\x86\xa4\xf8\xcf\x4b\x47\x7f\x04\x2f\x8b\x03\x92\xd1\x7f\x13\xbc\x5f\x7a\x82\xfc\x83\x9e\x00\x28\x0d\xc0\xd5\x17\x00\x65\xc1\xb5\x4a\x37\x43\xa3\x44\xdd\x4e\xbc\xb4\xff\xf5\xbd\x71\xcf\x13\x86\x42\x49\x84\xa6\x51\xda\xb8\x55\xe6\xaf\xeb\xcd\x93\x6d\x1a\x05\xf0\x85\x45\xc9\xba\x92\x7b\x9d\x23\x10\x7a\x5c\x9d\x3d\xec\x92\xe0\x51\x06\x61\x48\x94\x41\x08\xd8\xc7\x50\x06\x9c\x89\x12\xcd\x0c\xa6\xcd\xa1\x74\x9b\xa8\x6b\xe5\x37\x25\xd9\x39\x98\x04\x6d\xd0\xa6\xe1\x2a\x4c\xfd\x52\xcb\x83\xab\xc2\x71\x80\x45\x9b\x1a\xf3\x08\xd1\xd4\xc6\x6f\xf2\xe8\x5a\x25\x1e\x34\x05\xe9\x51\x06\x81\x39\xc0\xa2\xa0\x49\xc5\xba\xac\x3f\x81\xb7\x01\x4a\x23\x4c\x53\xcc\x1d\xe6\x20\xd5\xae\x6b\xb7\xf3\xf5\x1b\xa6\x16\x84\x12\x08\x83\xf2\x75\x9d\x7a\x1c\x25\x11\x3c\x68\xf3\x28\x8f\x00\x1a\x25\x0d\x94\x6e\xca\xd7\x43\x7b\x91\xba\xda\x3c\x51\xbb\x81\x6d\xcc\x87\x62\x01\x4a\xb4\x99\xba\x19\x00\x94\x87\x3c\xc1\x22\x44\x5d\x20\x9e\x42\x50\x0a\x61\x51\x0e\x4e\x25\x10\xaa\xd6\x80\xad\x4d\xa2\xa1\x26\x4c\x9b\x40\xd9\x80\x80\x7c\x00\x5c\x80\x02\x03\xaa\x42\xd5\xf5\xe6\x89\xa6\xea\x7c\xbb\xae\xd9\xcf\xb4\x01\x4c\xf0\xf6\xbd\x52\x3d\x59\xeb\xe1\x02\x94\xde\x90\x5c\x53\x99\x1e\x47\xea\x0a\xfb\x57\x2b\x50\xf6\x12\x50\x08\x5e\x6b\x0f\xe7\xe2\x8d\x97\xea\xe0\xbd\x96\x5f\xcf\xcd\xeb\xe1\x50\x79\x1a\x25\x5d\x94\x37\x3e\x0c\x6b\x83\x5a\x33\x18\x93\xba\xa0\x7f\xed\x49\xa8\x48\x1b\x5a\x68\xa0\x2c\x4a\xc0\xe8\x40\xed\xa0\xbb\xae\x75\xf7\xeb\x0f\x4d\x94\x98\x3a\x08\xcd\x14\xb2\xfe\x04\xa0\xc6\x4c\x53\x89\x9f\x6a\x54\x46\x69\xb4\x99\x72\x2d\xf5\x5f\xff\xcf\x40\xa4\x34\x62\x78\x68\x0b\xc4\x0c\xec\xe5\x51\x0a\xca\x82\x3a\x73\xb5\xc2\x75\x49\xff\x5a\x3f\x12\xc1\xaf\x35\xff\x01\x44\x56\xa3\x6f\x1b\x2a\x09\xad\xbd\x01\xa1\x66\x69\x0e\x82\x8f\x32\xa0\xb9\x64\x13\xe6\xda\x55\x3c\x0a\xe3\xc9\x34\x16\x7d\xa9\x0a\xd9\x04\x0b\x0a\xae\xcd\xa2\x11\x02\xea\x52\xbb\xfc\x1a\x86\xdb\x10\x0e\x4e\xab\x1b\xa1\x3b\xdc\x36\xca\x37\x6b\x36\x6a\x93\xed\x1a\xc0\xa0\x66\x77\xe8\x6c\xce\x68\x43\x9c\xa3\xa0\x5d\x8f\x21\xda\x74\xed\x57\x68\x15\xdc\x48\x70\x88\x29\xf8\x01\x34\xc8\x87\x2d\x24\xca\xa0\x00\xa1\x21\xd6\x14\x12\x0e\xa2\x00\xca\x18\x28\x8d\x12\xf5\x12\xc4\xcd\xc5\x57\x47\x35\xea\x41\x67\xd7\xd1\xe0\xa1\x72\x44\x13\x2c\xe8\x24\x18\x59\x18\xb6\x1c\x40\x38\xf0\xf5\x60\xa2\x99\x53\x1b\xf1\xe2\xcf\x9a\x15\x6a\x65\xe9\xab\x7f\x41\x93\x97\x97\xa0\x4d\xa3\x24\xd4\x01\x7a\x06\x7a\x95\x81\xe9\x08\x93\x13\x42\xb2\x09\x33\x7d\x17\xd6\xae\xe3\x42\xdc\xa5\xd5\x71\x43\xf9\xba\xb5\x71\x30\x0b\x1d\x3c\x00\xac\x51\x77\x34\x71\x78\x19\x4f\xd5\xeb\x12\x8d\x18\x12\x46\xaf\x96\x8c\xdc\x38\xa2\xce\x1a\x0a\x01\x06\x0a\x10\x0a\x06\x08\xe1\xeb\xe8\x52\x90\x29\x58\x84\x43\xe0\x58\xa8\x3c\xdc\xa4\x01\x8f\x12\x6d\x0a\x6a\x47\xb7\x49\x94\x47\x41\x9b\x83\x1a\xb2\x30\x53\xeb\x5c\x6f\xd8\x0e\xba\xb6\xce\x13\xc8\x16\xe4\x25\x80\x13\xb8\x7b\x22\xd3\x4d\xb4\x09\x04\x87\x1a\xc2\x4c\xa3\x8d\xc6\xfa\x17\x5f\xd4\x4e\xaa\x29\xc2\x80\x03\x91\x5a\x73\xaa\x49\xb6\x7a\xc5\x5a\x0a\x0c\x6d\xbb\x16\xd4\xa0\x89\x82\x2e\x85\x79\x00\x9d\xdf\xbc\xd0\x35\x8c\xae\x70\x68\x32\x0f\x2e\x43\xd7\xcb\x50\x28\x85\xd4\xf4\x09\xc5\x41\x0d\x60\x8c\x79\xa4\xa6\x49\x14\xda\x5b\xf3\x11\xe4\xab\x1b\x68\xd9\x36\x55\x03\x11\x1a\xce\x35\x54\x4c\xd6\xbc\x45\xa0\x64\xbb\xa6\x6d\xba\x49\x42\x1e\xe5\x20\xc9\xc3\x2c\x84\x10\x84\x2a\xbe\xd2\xb3\x7d\xb7\x97\xbd\x42\x1c\xf2\x66\x63\x13\x85\xf2\x01\x45\xd5\x04\x4c\x34\x3e\x23\x6f\xac\x03\x6e\x69\xf2\x42\x4e\xd0\x26\x2a\x87\x44\x07\xad\x69\xc4\x41\x4a\xc1\xf3\xda\xaf\xed\x7a\xe9\xc6\xd9\xd0\x6a\xe2\x12\xb0\x35\x17\x50\x2e\x94\x01\xdb\x1a\x9a\x44\x41\x03\xc6\x1a\x90\x74\xcd\x7a\x6d\x00\xe5\xbe\x52\x81\xba\xc1\xba\x7e\xf9\x40\x39\x30\x76\x50\xce\x95\x1e\x1a\x78\xb1\xd0\xe8\xab\x65\xfc\x8d\x30\xe8\x5a\x14\xd7\xbe\x49\xac\x5d\xcb\x34\xb8\x6e\x28\x83\x42\xe0\xe2\x74\xc3\xa0\x4c\x93\x13\xe4\x6f\x4e\xe7\x9a\xe9\xd4\x45\x01\x34\x42\xb3\xc6\xeb\xe0\xb3\x75\x32\xc0\xf0\xd5\x3a\xd7\x20\xad\xdd\x4e\xd6\xcc\x52\x6f\x20\x46\x13\x13\x0a\x0a\xaa\x01\xc2\xd7\xae\x80\xf4\x56\xf3\x42\xbd\x52\x83\x5e\xae\x99\xd1\xa8\x0a\x37\x58\x03\xdc\xc6\x72\xd7\xb1\xfc\x9d\xca\xa8\x57\x54\xf6\xc2\xf3\x75\xcc\x58\xe3\x46\xf4\xe4\x9d\x76\xb8\x3a\x62\x48\xad\x36\xd3\xec\x70\x24\xfc\x0c\x61\x7f\xf3\xb5\x02\x18\x84\xc1\x21\x19\x5e\xb3\x81\x68\xd7\x0c\x03\xd7\x85\xb0\x6d\x76\x7d\xe4\xbe\x2b\x82\xe6\x88\x60\xd4\x11\x46\xc1\x95\xb6\x48\x68\xc7\x0b\x7d\x41\xeb\xae\xfb\x53\xcd\xe2\x70\xfd\xc6\x14\x94\xbb\xb1\x1e\xdc\x9a\xb8\x37\xe4\x51\xef\x28\xb7\x36\x98\x8b\x35\x52\xae\x5b\x4b\x8d\x39\xfe\xaa\x21\x40\x6a\x69\x10\x82\x0a\xe0\x11\x86\x68\xe0\x07\x97\xab\xb7\x24\xa6\x09\x67\x13\x64\x70\xdd\x71\x1a\x8e\xbe\x9a\x01\x93\x09\x66\x04\x79\x23\x3a\xb2\x7d\xdd\x84\x6e\x1b\x76\x1d\xc3\x2b\x29\x5f\xdd\xfd\xe9\xa5\x15\xf9\x72\x69\xf5\xe5\x01\x97\xfa\x63\x07\x5c\x78\x45\xc6\xf0\xcd\x01\x97\xa5\x50\x02\xbf\x1e\x70\x69\x0e\x65\xeb\x76\xe2\xc7\xcf\x1c\x8b\xb2\xf8\xbf\x7b\xc0\xfd\x78\xdd\x6f\xf3\x96\x6d\x33\x5f\x5c\xc8\xb3\x1f\x2f\x9c\x6d\xce\x32\x6d\xfa\x8b\x0b\x73\xf0\xf1\xf4\x6c\x93\x16\x63\x7f\x7e\x7a\x46\x19\x40\x7c\xbc\xb1\x60\x98\xba\xa5\x7f\x75\x21\xff\x71\x38\x69\x18\x5f\xdd\x87\x60\xe9\x4f\xee\x2b\xb0\x3a\x67\x7e\x71\x9f\x80\xfb\xe4\x3e\x87\xa1\x69\xc0\xf8\xea\x3e\x01\xfb\xf1\xfc\xaf\x1b\x1c\xa7\x7f\xa1\x3e\x4f\x7c\x1c\xaf\x59\x8c\xa1\x7d\x35\x9e\xf9\xe4\x62\xc4\xa6\x4c\xfe\xf3\xf1\x7f\xe6\x7d\x05\xb7\x4d\xb0\x1b\xf0\x39\xee\xa9\xdf\xbd\xa5\xf0\x66\xf6\xbf\x7a\x37\xe1\xd6\x00\xb5\x3d\x44\x5e\xf8\xe3\x67\xdd\xca\x2d\xff\x6e\x45\x9a\x3b\x7f\x27\xa5\x87\x7f\xe7\xb6\x61\xe9\xff\xc5\xbe\x8f\x14\xbc\x29\x0f\x9f\xf4\x24\x69\x8e\x05\x5a\xb0\x27\x55\xa2\x85\x5f\x86\x5d\x42\x09\x86\x2b\xe9\xb8\x56\x1d\x69\xd1\x9b\x4b\x49\x49\x4b\xdc\x78\xe5\x01\x1d\x73\x59\x5e\xc0\xa8\xe5\x96\x0c\xbb\x13\x4b\x75\x9c\x8e\xba\xdf\x48\xca\x1a\xab\xc8\x09\xb9\x67\x15\x76\xba\x12\xb1\x3e\xe3\x1f\x89\xe4\x5c\x10\xf8\x65\x61\xae\xb1\xdd\x86\x07\x9b\x4d\x1f\x0f\x96\xf3\x31\x46\x86\x40\xc3\x0e\xc7\x8a\x31\x99\x5d\x4a\xf6\xb9\xed\x6e\xd9\x9a\x15\xf4\x84\x91\x77\x07\x59\xee\x9f\x43\x0d\x63\xb9\x68\x3f\xb6\x92\x7e\xaa\x8e\xb3\x44\x94\x00\x73\x1e\xf5\x65\x20\xf3\x8e\x34\x9d\x1a\xaa\x49\x98\x32\xb0\x27\x45\xa2\xcb\x18\xa6\xed\x26\xec\x08\x58\xf6\x4c\x09\x8e\xeb\x93\xd4\x13\x8e\xb8\x80\x6f\xf6\x13\xbd\x27\x69\xf3\x6e\x27\x35\x86\xc7\xdd\x81\x67\xe9\x8a\x9c\xc8\x27\xbe\xac\x2c\x6e\xd6\x39\x0a\xa1\x37\x98\xf6\x62\xb7\x75\x20\xac\x2e\x95\xa4\x66\xd4\xa1\xe4\xb4\x77\xd6\xfb\x3e\x36\x38\x71\x8b\x2c\x57\xb7\x71\xb9\x9a\x7b\x34\x11\x81\x43\xbe\xf5\xfa\xaa\xb6\xd8\xcb\x38\xa6\x9d\x45\x67\x7a\xec\x62\x7b\xae\xa3\xca\xc4\xec\x54\x7a\x66\x0c\x7a\xfb\xa3\x1b\x89\x65\x6c\x69\x3b\x01\x5b\x1f\xce\x07\x8c\x1a\x44\xd3\x72\x3c\x3e\x78\x53\xcf\x3a\xb2\x8b\xf5\xd2\x5d\x4c\xe6\x5b\x6d\xa2\xf6\xe6\x67\x45\xb3\x13\xb5\x5b\x7a\x05\x15\x5d\xf6\x63\xfb\xa4\xab\x23\x5c\xca\x17\xa6\x0f\xc4\x79\x55\xad\x52\x6e\xd7\x9d\xac\x04\x66\x2d\xc9\x4a\x91\x8b\x95\x1c\xef\xb7\xc3\xfd\x64\xe2\x4f\x64\x7f\x3e\x1d\x13\xb2\x32\x5a\x8c\x5a\xb4\x70\x3c\xef\xc1\x92\xed\xf6\x7a\x97\xd1\xe5\x48\x33\xfd\x70\x7d\x98\x6f\x7d\xf5\x78\xea\x46\x9d\x6d\x4f\x8f\x42\x69\xa3\x1a\xb2\x2c\x50\xe6\x24\xec\x30\x04\xd5\x9f\xa7\x62\x67\x3b\x74\xec\xfd\x48\x72\xca\x63\xd4\x75\x2f\xcb\xde\x36\x0f\xa9\x4d\x3c\xb7\x02\x31\x20\x36\xc5\x6e\x9e\xee\x46\x45\x0f\xb8\x8c\xd1\x72\x4a\x7f\x4e\x1f\x9c\xa5\x27\xad\xa5\x0c\x2f\xcc\xa1\xc5\x66\x8a\xb4\x6c\x85\x52\x9f\xd0\xba\xb2\x37\x52\xa6\xc3\xe1\x76\x98\xf0\x16\x2e\x4a\x92\x2c\x28\xeb\xa4\x58\x9c\x0d\x77\x23\x54\xab\xb1\x17\xac\x8b\x29\x4b\x8f\x02\x66\xd3\x23\x3b\x39\xeb\x05\x53\xed\xd0\x2a\x4d\x76\xdd\x1b\x6f\x96\x58\x67\x36\xea\x01\x1d\x93\xa8\xcc\x59\x25\x12\xc5\x8f\x18\x7c\x4a\x1f\x0d\x2b\x9a\x9c\xa2\xc2\x3b\x9f\xd5\xb1\xc6\x39\xee\x60\x27\x50\xdc\x9a\x57\x56\x84\x30\x77\xaa\x45\xbe\x5a\xb9\x12\x89\xeb\x73\x4f\x5b\xf6\x35\xaa\x92\x95\xd1\xa4\x17\xb5\xc4\x13\x46\x18\x83\x8c\xea\xaa\x7e\x51\xf5\x6c\x62\xc9\x74\x06\x45\x91\x28\x05\xa6\xe5\xa2\xbe\xa0\xbb\xe0\xc8\xba\x40\x9d\x53\xe3\x01\x29\x04\x76\x4b\x30\xf6\x95\xa4\xef\x67\x39\xdf\x1d\x66\x97\xb9\x08\x7c\x5e\xd2\x33\x75\x7a\xc8\x59\x2a\xc7\x4c\x72\xca\x2f\x94\xd9\x4a\x4c\x52\xa9\xe8\x0f\xb7\x13\xee\x44\x54\x47\x76\x37\x51\x17\x29\x3f\x4a\x16\x39\xb9\xa1\x84\x8e\x20\x2e\xfb\x0b\xc6\x9a\xe3\xd8\x64\xfe\x67\xfe\xca\xb2\xf4\xd3\xf2\x2f\x46\x12\xfe\xeb\xbf\x5a\x78\xea\x49\xd2\x7a\xb6\xd9\x99\x33\x15\x3b\x5b\xdb\xfd\x30\xf2\xd4\xbd\xb7\x54\xc7\xaa\x3b\x32\x18\x49\x37\xcf\x83\xa9\xeb\x78\x87\x88\xcc\xb0\x62\x00\x2e\x4c\x07\x1f\x09\xee\xb4\x52\x86\xb2\x5b\x46\xd4\x71\xd4\x3f\x02\x61\xb9\x12\xca\x62\xdb\xc3\x95\x38\xa6\xcd\x81\xc1\xe7\xbd\xf5\x45\x2d\x3c\x53\x8b\x4e\xc1\xa9\xc5\xf1\x34\x5f\x5e\xf4\x4b\x3f\x9b\x18\x25\xc3\xcf\x56\x4b\x82\x91\x56\xc1\x3c\x5b\xf2\x09\x35\xa8\xb0\x32\x67\x95\x2d\x7b\xd8\xb4\x32\x97\xae\x2e\x1b\x43\x53\x67\x3b\xac\xd5\x1a\x66\xfc\x99\x9a\x08\x79\xab\xbb\x59\x30\x59\x67\xbd\x5e\x9d\x94\x51\x2a\x1a\x8b\xcb\x61\x3f\xdd\x2b\xdc\x96\xdf\xcb\xe3\xb2\x85\xed\x44\x9d\xb2\x68\xec\x38\xa0\x87\x21\xee\xc7\x43\x75\xdb\x5f\x6b\x5d\x5c\x5d\xed\xc3\x4e\x57\x90\xc6\xd1\x66\x41\xca\x24\x13\x89\x11\x3b\xd1\x53\xc7\xdf\x17\xfa\x49\x64\xbc\xf9\x78\xba\xeb\x29\xc6\x78\xbd\xb1\x3b\xc7\x8e\x10\xcd\x5d\x5f\xa4\xcb\x52\x11\x63\x6c\x90\x2c\x73\xf2\x04\x46\x8e\xba\x25\x2f\x78\x89\x8f\x77\x97\x63\x57\x1d\x69\x8b\xbd\x7f\x48\xce\x04\xa9\x0d\xb6\xab\x8b\xec\x69\x81\x50\x55\x59\x8e\x4f\xf9\xb5\x6a\xda\xf4\x4c\x48\x4e\x7e\x1c\x77\x6c\x65\x6d\x9f\xa9\x48\x90\xa5\xe4\xb4\xef\x8c\x8d\x75\xa9\xf4\x16\xdd\x81\x14\xe3\xa2\xb3\xa5\xe5\x88\x9a\xf0\x93\xe1\x04\x98\x3d\x7c\xb7\x4b\x37\xbd\xe9\xba\x9a\x8d\x56\x97\xa8\xb5\xed\x08\x13\xd1\x33\x0f\x31\x97\x39\x83\x7e\x9f\x34\x70\x31\x1c\x51\xe7\xe1\xc2\xa6\x8c\x69\xb7\xa3\x6d\xe9\xf1\x41\xe5\xca\xe3\x5e\x66\x89\x32\x1e\xf1\x73\xa3\x77\xa1\xf5\xcd\x69\xb0\x1e\xf5\x07\x7b\x99\x50\xb3\x49\x30\xf6\x70\x46\xed\x56\xde\xa6\xa7\x53\x29\x96\x4b\x63\x65\x25\xd8\x20\xa6\x2c\x73\xda\x67\x02\xc5\x03\x97\x05\x53\x48\xb1\xb9\x2e\x76\xad\x5c\x16\xb3\x63\xf7\x32\x88\xc6\x6c\x9c\x19\x0a\xa3\x55\x72\xd0\xd7\x0e\x79\x66\x95\xd4\xcc\xf7\xaa\x68\x78\xec\x2d\x0e\xc1\x5a\x12\x96\x96\xdf\x21\x92\xdd\x7c\xb1\xb4\x0f\xeb\xee\x8a\x9f\xf9\xdb\x38\xd8\x12\xc0\x5b\xf5\x2f\x5d\xa1\x92\x8e\x6b\xaf\x9c\x2d\x4e\x3b\xd7\x22\x36\xd4\x65\x6c\x5c\x74\x33\xa8\x74\xe7\x18\x8f\x70\xa3\x3f\x3d\x0b\x8c\x4a\x28\xab\x6e\x3a\x8e\x3c\x7a\x90\x4e\xc6\xec\x84\x54\x26\xad\x73\xa1\x6a\x5b\xbd\x54\xed\x48\x96\x8f\x17\xb3\x34\xac\x82\xf1\x13\x75\xab\xed\xdd\x80\x9b\x0d\x06\x7d\xf2\x62\xdb\x31\x58\x17\xa3\xe5\xe0\xc2\xe7\xf9\x71\xcd\xcd\x22\x53\x37\xe6\xaa\xaa\x2e\x69\xbf\x54\x8f\xe5\xea\xd8\x37\x37\xe2\xdc\xdc\x80\x51\x0a\x4e\x33\x47\x15\x99\xd1\xf0\x3c\x94\x58\x27\xdd\x6d\x2c\x7b\xe8\x0e\xcf\x0a\x4e\x1f\x59\xb3\x50\x74\x4b\x09\x5c\x8e\xd5\x00\x77\xb6\x87\x8a\xb6\x51\xab\x38\x49\x46\xb2\x73\xb0\x88\x49\xd2\x02\xd9\x45\xdd\x09\x93\x50\x0c\x13\xf2\xb2\x70\x07\x07\x92\xdd\xe4\x15\x51\xc4\xbb\x41\x36\x11\x4c\x1a\x2b\xe6\xaa\x20\x32\x5b\xe5\xbc\x22\xba\x45\xb4\xf9\x53\x09\x22\xf8\x8b\x7d\x11\xc9\xf3\x5f\xd5\xd8\x6d\xfe\x3c\x51\xe9\xb6\x1c\x72\x4b\x64\xa0\x8f\xa7\xd2\xa9\x1a\x2e\xab\x70\xdd\x1b\xa5\xcb\xe9\xd2\x9d\x14\x5d\x2d\xf0\xd4\xbd\x24\x92\xb2\x33\x3c\x1a\xe7\x32\x9a\x60\x5e\x77\x6f\xcd\xf6\x9e\xda\x17\x09\xad\x2f\xb6\x3c\xbc\x47\x8f\x95\xae\x5b\xfa\x1b\x4d\x3b\x0a\x63\xa2\x3a\x1a\x42\xd6\xda\x5e\x4c\xf9\xcc\x5e\x8e\x65\x44\x6e\xf7\x32\x15\x9f\xb9\x60\x67\x07\x96\xa5\x92\x1c\x47\x9f\x1d\x86\x4d\xa2\x59\xcf\xa5\xc3\xdc\x60\x88\x80\x77\x0f\xd1\xa2\x45\xcb\x4a\xcc\x2a\xc9\x51\xb5\x49\x16\x3f\x6d\x32\x23\x6a\x6d\xb2\xee\xba\x17\xeb\x87\xd6\xa1\xbf\x68\x8d\xf4\x6d\xc8\x32\xd3\x6a\xce\x59\xb3\x22\xdd\x0b\xab\xb9\xce\x2d\x30\x57\x0b\xf7\xce\x70\xe2\x1c\xf8\xe1\xc9\x3a\x77\x7a\xdd\x02\x8c\x33\x7e\xaa\x74\xc2\xc9\xb6\x9b\x12\xd4\xae\x38\xf6\xb1\xf9\x58\x5d\x4b\x5e\xff\xb0\x11\x66\xf3\xc8\xc6\x92\x13\xce\x72\x64\xbc\x74\xa5\x15\xb9\x96\xe7\x11\x57\x5e\x70\x6f\x49\xf7\x34\x61\x12\x24\x83\xf9\x80\x10\xa3\x93\xda\x12\x97\xf2\xf2\xc2\x2c\x2e\x96\xb1\xf5\x43\x91\xaf\x82\x35\xc5\xca\xea\xc1\xa4\xa6\x74\x67\x77\x12\x57\x7d\xaa\xa7\x90\x93\x78\x25\x1d\x63\x73\x44\x27\x05\x2e\x44\x85\xbc\x50\x74\x77\x6d\xc7\x34\xe7\xac\xa6\x9a\x88\xad\x07\xc1\x64\x3e\x1b\x32\x6a\x90\x8f\xb7\x8b\x1d\xb8\x48\xcb\xc1\x7a\x84\x45\x9d\x94\x08\x83\x99\xd6\x52\x9c\x02\xdf\x0f\x15\x32\xdb\x57\xfd\x68\x54\x54\xce\x65\x3e\xe9\x10\x87\x49\x35\x1a\xee\x77\xac\xd7\xc1\xfd\x78\x16\x29\x2c\xbe\xee\x07\xb3\x1d\x77\xe9\xae\x5b\x49\x9f\x9b\x88\x9b\x72\x50\x98\x5e\x97\x0e\xc6\xe9\x6c\xdd\x5b\x4f\x30\x27\xcf\x64\xd9\x26\xf9\xb4\x77\xd9\x9c\xb4\x09\xa9\x26\x5d\x66\x75\xe8\x68\xe7\x93\xbb\x73\x27\x02\x58\xcd\xa3\x93\x1f\x6d\x58\x51\x6b\xc5\x87\xfd\x09\xf4\xd2\xdd\xba\xab\x05\x3d\x82\x3f\x30\x72\xae\xba\x36\xe9\x0d\x97\xf0\x30\xd9\xcb\x79\x71\x6f\xe5\xd1\xd9\x5d\x5c\x2e\x33\x7b\xda\x6f\x91\x6e\x2c\xf0\x6b\x7e\x5d\x79\xd1\xd4\x5f\x8d\xd8\xb8\x67\xad\xba\xf3\x25\xb3\xe8\x5f\x86\x96\x5e\xd9\xad\xe8\x42\xc7\xcb\xcb\x36\x0b\x96\x5b\x20\x4d\xf9\xd8\xcd\xe7\x38\x9e\xfa\x9d\x45\x86\x71\xa7\x05\x29\x46\x5b\x73\xa7\x7b\xc6\x65\xed\xad\x2e\x26\x4d\x88\xad\xcc\x94\x83\x6a\xd5\x01\x54\x50\x82\x44\x11\xc6\x1b\x63\x11\x4b\xc2\xea\x90\xa4\x67\xc9\xb7\x2c\x6c\xb0\xeb\x07\x61\x6f\x51\x75\xa6\x7d\x91\xc4\xbb\x58\x28\x89\x87\x89\x93\xb2\x5d\x31\x4e\xd5\x20\x1c\xf4\x49\x75\x66\x39\x9d\x6e\x3e\x48\xf9\x48\xb5\x03\x2e\xec\xf3\xe6\x48\xa3\x77\xd4\x98\x13\x84\xf9\x65\xbe\xa3\xc6\xcb\x09\x59\x18\x7f\xea\x97\x0a\xab\xbf\x5a\x2e\x9b\xe5\x4b\x8d\x51\xff\x5a\x17\x45\x57\xd8\x80\x56\xf1\x7d\x9c\x9d\x09\x20\x14\xdb\xc2\x55\x63\x7b\x29\xf6\xdc\xd6\x31\xcf\x17\x26\x37\xc1\x07\x36\x35\xc4\xca\xad\x69\x63\x73\x40\x73\x3d\x7c\x1e\xcd\x5b\xdd\x4d\xda\x1b\x6b\xf2\x72\x1e\x67\x98\x19\x07\xf9\x25\x5b\x4d\x2f\x97\x63\xc5\x18\x56\x36\x8d\xb7\xc6\x7e\x9f\xeb\x53\x52\x99\xd2\x34\xa0\x96\xe5\x45\x5a\x93\x09\xcd\x62\x64\x3f\xde\xfa\xbe\x82\x65\x33\x2a\x95\xc9\x95\x96\x2c\xa6\xbb\xf3\x32\xc2\x96\xdb\x51\xbe\x63\xc1\xfa\xcc\xe1\x5d\xdb\xf5\x13\x6c\x45\xad\xcd\x6d\x4f\xd8\xd8\x66\x18\xa4\xab\x75\x96\x9b\x33\x92\x9e\xae\xab\xf9\x78\x13\x8e\x9c\x9d\xd8\x59\x19\x07\xde\x33\x84\x74\x65\xc9\x5a\xc9\x1e\x30\x9c\x26\x4e\x0a\x07\xd6\x87\x62\x0b\xe6\xa3\x9d\xe4\x2a\x3d\xfc\xa4\x86\x13\x1e\xb7\xcd\x30\x37\x23\x47\x0d\xf2\xd1\x6c\x8d\x63\x9b\x8e\x10\x8b\x94\x6b\x88\xc9\x76\x61\x54\xde\xd1\xee\x00\x36\x4d\x2e\xce\x96\xd5\xf9\x85\x0b\x72\x29\x2f\x45\x7f\x48\x65\x9b\x2a\xd3\x3a\x4b\x49\xca\x82\xad\x8b\x97\xe9\x5a\x29\xe2\x22\xdc\x1e\x4e\x82\x6f\x94\x91\xe3\x0d\x4c\x50\x78\xf3\xaa\x7b\xe6\x58\x6f\x88\xb5\xd2\x51\x66\x33\xad\xc9\x2e\x75\x62\x93\xed\x6d\xbb\x4a\x87\xc6\xc7\xf9\x51\x55\xfa\x8a\x2e\x9b\x7b\x47\xf6\xed\x43\x6b\xcc\x8f\xa9\x56\x2f\xec\xcd\x89\x92\xdd\x86\xd9\x30\xa5\x71\x41\x0f\xbc\x7e\x21\x0f\xe5\xac\x75\x6c\x49\xf9\x25\x5f\x4e\x86\x83\x8b\xe9\x39\xe6\x08\x13\x82\xdd\x7c\xe1\x7a\x83\x9c\x9e\x4d\x97\x85\x1a\xf4\x5b\xc6\x69\xb6\x89\xf0\xc1\x49\x2c\x0f\xdc\x79\x35\x26\xf2\x10\x0c\x6c\xad\x35\x0a\xcc\xe1\x31\xcf\xf6\x18\x65\x4f\x67\xbb\x35\xb9\x9d\x89\x71\xcf\x9a\x6c\x37\xd5\x7a\x9c\x54\x5d\x6f\xd8\x57\x26\xd4\x25\x1d\xf0\x9c\x53\x05\x64\x77\x68\x4c\x57\xc5\xaa\xb5\x1b\x98\xbb\xc4\x9c\xcf\x07\xc2\x3e\xca\x24\xee\xd8\x99\xc5\xcb\xd3\x6c\x32\xc8\x3a\xd3\x84\xe2\x06\xeb\x40\x9e\x1a\xbb\xc5\x68\xc5\x9b\xdb\x89\xd2\x57\x47\x3d\xbd\xe2\x41\x3c\x98\x0a\xb9\x56\x1d\x97\xda\x70\xe5\xb4\xf4\xc2\xb2\x4d\x37\xc9\x2c\x71\xb1\x52\x96\x45\x95\xf4\xba\xce\x90\xe3\x24\x9c\x66\x06\x55\x8b\x12\x5c\xc2\xd8\xcd\xf7\x32\xb9\x80\x07\x6a\x79\x6d\xb1\xf6\x69\xb7\xed\x4d\x98\x3f\x73\xbf\xbc\x78\x7f\xb1\x7a\x82\x01\x7f\x3f\x4f\x1f\xf1\x2c\xc7\x71\x61\xed\x1a\x2d\x45\x65\xcc\x69\xe0\x58\xbd\x91\x03\x7a\xd1\x66\x13\xaf\xb7\x7e\xaf\x8b\xa7\xc4\xb0\xd7\x03\x87\xb2\xa3\xbb\xe3\x03\xd5\x59\x96\xaa\x99\x1a\x33\xd5\x90\x82\x79\x30\x14\x4f\xb8\x93\x4a\x8b\xe1\xc6\xab\xa8\x55\x2c\xb2\x9b\xde\xa5\x07\x06\x11\x7d\xb0\x08\x8d\xca\xdc\xe9\x69\xe2\xfa\x31\xad\x5c\xa8\xcb\xd9\xbc\x5c\x62\xbc\x88\x17\xab\x2e\x67\xcf\x92\x23\x8e\xad\xba\x4c\xcb\x16\x33\xd5\x33\xe4\x01\xcf\xae\xc0\xd8\x20\xf2\xb9\x68\xa4\xad\x64\x40\x5a\x6b\xa1\xdc\x5c\xc2\x10\xb7\x43\x20\x2e\x14\x4e\x6a\x79\x53\x33\xa7\x8d\x8c\xdc\x05\xfb\x3e\x53\x6d\xfc\xc9\x81\x49\x23\x7f\xad\x3b\x9b\x55\x86\x9f\xe8\x5e\x3f\xdb\x31\xf9\xee\xd4\x65\x36\x47\x7f\x25\xb5\xc6\xc2\x14\x9b\x4e\xc5\xc1\x72\x38\x9f\x2d\xe6\x71\xba\xeb\xb6\x8e\x47\xe9\x42\x48\xb2\x80\x57\x69\x96\x73\x54\x26\x5f\xaa\xb3\x91\xea\xdb\x4e\xe5\xa5\x42\xdf\x6e\xcd\x85\x25\xd1\xed\x8a\x8b\x85\xac\x8c\x94\xa0\xec\xb6\x3c\xae\x4b\x1d\x4c\xb9\x1b\x60\x17\x85\x9d\x4e\xc7\xbd\x7e\x9c\x19\x53\x06\xeb\xac\xe2\x11\x5e\x59\xf3\x0e\xae\xb6\x02\x7b\x3c\x3f\xef\xf7\x7d\xfc\x30\x77\xac\x85\xbe\xe5\x76\x66\x14\x44\x7a\xca\xcb\x13\x2e\x35\x8c\xd6\x7a\x36\x98\x54\x94\x58\x9c\xb8\xa1\x7f\x88\xb2\xe1\x70\x2e\x05\x34\x8f\x2d\xa2\x65\xa5\x80\xee\xf8\xb8\x1b\xef\x27\x9d\x80\x3d\x0e\x37\x4e\xa5\x30\x85\x23\x84\x4b\x67\x31\xe6\xf3\xd3\xdc\x1e\xcc\x3c\xa5\x27\x0e\x4e\x55\x6f\x93\xca\x0b\xbe\x1b\xe0\x11\xa5\x5e\x22\x41\x58\x26\xcb\x43\xd7\xf2\xe7\xf6\x62\xa6\x83\x8d\x41\x9d\x42\x5c\x52\x69\x99\xd8\xf2\x7d\x49\xeb\xc8\x46\x39\x77\x7a\x83\xb8\xaf\x1f\x95\xa1\x38\x62\x78\xab\x55\x1c\x46\xdc\x66\x77\x5a\x38\x63\xcf\xc4\x13\xd6\xce\xe6\x66\x79\x5c\xa4\xfc\xf2\x24\x10\x47\x47\x08\x00\xb5\x5c\x0e\xe7\x2e\x7f\x76\xcf\x72\x7f\xa6\x84\xe3\x51\x8a\xd1\xe3\xd3\x59\x06\x25\x3e\xc1\x17\xdd\xd4\xbb\x78\x4e\x24\x6a\xf2\xa9\x63\x0e\x22\xc5\xab\xf2\xc4\xef\xa4\x83\x4d\x09\x8a\xd8\x15\xa9\x4e\xd7\x2a\xa2\x53\xd9\x1f\x8f\xc5\x42\x70\xb2\x69\xc5\x8d\xce\xb6\x7a\x3e\xb6\x68\x27\xf2\xfb\x7d\xad\xbf\x2f\x0c\x90\x0e\xfb\x91\x78\x21\x85\xe9\x6c\xbf\xdc\xc8\xda\xc0\xd9\x14\x95\x19\x8d\x44\x05\x0c\x28\x51\x9f\x4f\xc5\xb3\xe3\x76\x48\x35\x9e\x8a\x14\x35\xb0\xa3\x81\x13\x9e\x29\x8b\x5d\x46\xf8\x59\xf0\xf0\x34\x1b\xc8\x23\x52\x38\x9b\x5c\x87\xd7\xe3\xc1\x99\xc9\x67\xd1\xf2\xcc\xaf\x32\xd1\x67\xb2\xf5\x39\xea\x79\x43\x75\xea\x9c\xf1\x16\xa0\x39\x65\x1c\x4c\xcb\x28\xc8\x2a\x91\x9c\x7b\x18\xa9\xac\x16\xac\xc7\x8d\x71\x49\xec\x83\xfe\x60\x4a\x8b\x12\xb9\xa3\xc4\x7c\xa2\xb9\x7b\x7f\x34\x2d\xa4\xe3\x54\x58\xe5\xe6\xcc\x20\x30\xcc\x2d\xc9\x60\x37\xa2\xfd\xde\x48\xeb\x71\x63\x4e\x5f\x66\x26\xae\xf6\xed\x70\x3a\xd2\x95\xbe\x55\x12\xa0\x64\x8c\xba\x5e\xd1\xd4\x1f\xce\xc4\xd1\x25\x61\x0d\xf9\xcf\xe1\x09\x3d\x32\x2b\xe4\xa9\xbe\x7d\xf9\xf8\x13\x49\x91\x2c\x69\x7f\xb3\xa3\x30\x6b\xdb\x5a\xe0\xf9\xd5\xe3\xc3\xc0\xf2\x73\x2b\xf3\x0c\x0d\x99\x58\x67\xeb\xe1\x17\xe4\xde\xf0\x0b\x22\x24\x9e\xe6\xff\x82\xa4\x5a\x98\xb6\x53\x2b\xf1\xae\x53\xeb\x05\x00\x15\x97\xdf\x7c\x2f\xb4\xda\xae\xe5\x39\x6e\xf6\x08\x50\x8a\xfc\x16\x68\x89\xe3\x85\x8f\xf8\xb7\x22\x4a\xcc\xb6\x9e\x58\xda\xf1\xb1\xfe\xd9\xd6\x7c\xff\x5b\xbb\xb0\xf4\xa3\x97\xb5\x33\xab\x6c\xa4\xb4\x35\xf3\x70\x4e\xb3\x47\x80\xe3\x7f\xff\xd6\x0e\xd2\xaf\x7a\x6e\xf3\xb4\xb8\xed\x7a\x8e\xeb\xc3\x05\x9b\x7b\xb2\x8f\x59\xa2\x85\x69\xac\x25\x56\x98\x3d\x6b\x77\x4b\x01\x60\x2d\x9d\xfc\x56\x8b\x33\x2d\x23\x4a\xb4\xcc\x8b\xc2\xc7\x30\x0a\xad\x67\xed\xd1\x8d\x72\x2b\xb9\x8f\xc5\x71\x1d\xb7\xf8\x0f\x63\xcf\xa1\x69\x25\xd0\xc0\x67\xed\x51\x33\x32\x2f\xb7\x7e\xd1\x1e\x73\x2f\xf5\x32\xcb\x7c\x37\xf7\x39\xcd\x92\x28\x74\x90\xa7\xda\x3d\x45\xe3\x0f\x16\xc7\x9f\x33\x4d\xf7\x2d\xe4\x49\x8f\x12\xd3\x4a\xa0\xc2\xbe\x16\xa7\x30\x38\xcd\x9b\x6f\xd7\x8e\x34\xd6\x0c\x2f\x74\x1e\xf1\x6f\x81\x56\x36\x77\x6d\x1b\xc3\x5f\xde\x36\xa2\x1e\x7d\x2d\xcd\xda\x86\xeb\xf9\xe6\x5d\xaa\x1e\x65\x59\x14\xb4\x7d\xcb\xce\xda\x89\x66\x7a\xe7\xf4\x91\x8c\xcb\x6f\x6f\x7b\x93\xda\x63\x2f\xdd\xcf\x59\xf2\x68\x7b\xc9\x5d\x58\xf6\x22\x2f\x8b\xe2\x47\x1c\xf6\x87\x99\xdb\x8e\xec\x76\x56\xc5\xd6\x3f\xac\xdc\x0a\xff\xf9\x66\xab\xb9\x3a\xc0\x66\x6d\xce\xd6\x9e\xdf\xcd\x07\x71\x89\xa4\x91\xef\x99\xc8\x4f\x26\x6f\xea\x16\xf1\x2d\xd6\x4c\x13\x9a\x88\x32\xb4\x15\x7c\xcb\xad\x04\x22\xcc\x6f\x6b\xbe\xe7\x84\x8f\x59\x14\x3f\xff\x14\x6b\x0e\xc4\x92\x66\xc2\xd0\xd4\xed\x6d\x2f\xb3\x82\xf4\xd1\xb0\xc2\xcc\x4a\x5e\x21\xfc\xf1\x27\x5c\x27\x35\x9a\x7c\x6b\xe3\x23\xf5\xb2\x28\xc3\x1b\x94\x61\x7e\xbb\xe9\x68\xdb\xdf\x4c\x2f\x8d\x7d\xad\x7a\xb4\x7d\xab\x7c\x8d\x62\x14\x10\x56\xf0\xed\x75\xdc\x68\x1c\xff\x06\xa1\xe7\xd9\x55\x1b\x66\x91\x15\x66\x8f\x30\x40\x56\x5b\xb7\xb2\xc2\xb2\xc2\xbb\x2d\x38\x02\xac\xe0\xad\xe2\x2f\x08\x6c\x54\x78\xd7\x7b\x05\xd2\x7d\x10\xaf\x99\x94\xa9\xbf\x1f\xf4\x16\x9e\xb6\x6d\xbf\x19\xd0\xf6\x23\x27\x42\x9e\xae\x59\x47\xa0\x04\x74\xe8\x35\xef\x50\xd6\x0a\x90\x97\x1f\xf8\x15\x40\x2c\x0a\xe8\x77\x9a\xb6\x03\x2b\x3c\x7f\xea\xe7\x37\x9e\xba\xc9\x85\x51\x43\xf0\x4f\x24\x98\x5e\x8e\x3c\xdd\xb2\x1e\x41\x99\x4f\x97\x31\xbd\xfc\x0d\x72\xef\xe3\xe1\x7f\x5f\xcc\x49\x73\x98\x4f\x9e\xef\xdf\x5c\xf9\xed\xce\x33\xdc\xdd\xe0\x1a\x6c\x28\x20\x3e\xb7\x2e\xcd\x9d\x9b\x2f\x1b\x41\xd0\x95\x28\xec\xaa\x2d\x6e\x87\x5a\x92\x44\x05\xf2\x74\xb3\xb8\x66\x87\x9f\xae\x31\xbf\xe1\xf9\x13\x2c\x5f\x61\x77\xcd\x26\xc8\x83\x57\x83\x6a\x38\x5c\xe7\xdf\xa1\xfc\x31\x67\x2c\xd3\xc6\x6d\xea\x1d\x7a\xbf\x5c\x26\x8b\xe2\xaf\x92\x1b\x76\xbd\xcf\xec\x97\x4c\x83\x08\x80\x1a\xa1\x30\x83\xdb\x9e\x11\x85\xbf\xbc\xbc\xfd\xf5\x7f\x21\x4f\x57\x76\x69\xc0\x81\x86\x51\xfd\xeb\xa1\x9a\xad\x91\xa7\xc2\xf5\x32\xab\x26\x26\xeb\x31\x8c\x8a\x44\x8b\xaf\x47\x4e\x57\x4b\xdd\x3b\x36\x59\x9b\xa3\x78\xf0\x66\x43\x09\xa2\x30\xaa\xa7\x3d\xff\x47\x60\x99\x9e\x86\x44\xa1\x5f\x21\xa9\x91\x58\x56\x88\x68\xa1\x89\xfc\xe3\x85\xe3\x68\x1c\x8f\xcb\x7f\x22\x4f\xbf\x11\x13\x2f\xac\x29\xf8\xd5\x88\xc2\x33\xad\x77\x31\xbb\x2d\x15\x27\x1e\x0c\xdc\x5b\x2a\xf9\x34\xba\xd7\xde\x5f\x5e\x6c\xfa\xe5\xcd\x4e\x89\xe3\xf8\x27\x91\xfc\x2a\x60\xaf\x47\x7f\x86\x1b\xd8\xaf\x7d\xba\x7b\xe0\xbf\xb5\xed\xfc\x1f\x37\xb1\xec\xff\xfb\xa8\xd9\x59\x43\x07\x0d\x17\x3d\x20\xff\x78\x40\xb4\x2c\x4b\xfe\x01\xbb\xff\x89\x3c\xfc\xf3\xe1\x39\x4b\x90\xa7\xda\xe8\x66\xaf\xf5\xc2\xd4\x33\xad\x47\x2d\x8f\x3c\xf3\x8f\x32\xf9\xeb\x7d\xf4\x6b\x36\x87\x96\x3c\xff\x07\xdc\xa9\x73\xcf\x2a\xe2\x28\xc9\x6e\x30\x32\xad\xdc\x33\xae\xbf\x72\x7c\x46\xcd\x36\xa4\x8f\x17\xe7\xc3\x4f\xcf\x28\xfc\xd9\x86\x58\x42\x9e\xea\xb7\xb6\x1f\x15\x8f\x0d\xb6\xea\xcf\xa9\x9b\x78\xe1\xb1\x0d\xae\xdd\xcd\xc7\x47\xf0\x8c\x06\x7e\x5b\x3b\x67\xd1\x8d\x39\xea\x7c\x78\x84\x2d\xcf\x68\xbd\x2f\xb6\x13\x2b\x8d\xa3\x30\xad\xb9\xf5\xb6\xa6\xee\x47\xc6\xf1\xd5\x16\xfa\x0d\x52\x01\x5c\xb2\x5d\xd6\x73\xef\xc7\x8a\x7b\x7b\x6a\x24\x91\xef\xc3\xe4\xc9\xa2\xb3\xe1\x3e\xff\xed\x3b\x56\x7f\x03\xe1\xd7\xbf\x7d\xc7\x20\x08\x7e\xfd\xdb\x77\x88\x92\x5f\xff\x86\x20\xdf\x21\xf1\x79\xe6\x8f\x87\x57\x58\x7b\x80\x1d\x9f\x77\xd5\xa4\xfd\x80\x18\xbe\x96\xa6\x3f\x1e\x6a\xd0\xd5\x2d\xbf\xfe\xcf\x50\x4f\xe3\x6f\xdf\x31\xd3\xcb\x7f\x63\x36\x44\xff\x55\xfa\x75\xc4\x55\xd2\xdb\xb4\x78\xf8\xf5\xbb\x86\x40\x54\xfc\x78\x70\xb3\x2c\x4e\x1f\x31\x0c\x2e\x85\x7a\xd1\x03\x92\x69\x89\x63\x65\x3f\x1e\xfe\x53\xf7\xb5\xf0\xf8\x80\x24\x96\xff\xe3\x21\x8c\xa2\xd8\x0a\xad\x04\x09\xa3\xc4\xb2\xad\x24\x81\x46\x08\x7a\x74\xce\x90\xe1\xac\xb7\xfc\x8e\x69\xbf\xbe\x52\xed\xbf\xb6\xf4\x4f\x5e\x98\x66\x9a\xef\xff\x2b\x2a\x0c\x9b\x29\xff\x8a\x12\x0d\x71\xfc\x89\x1e\xf8\x93\xd6\xfd\x37\xcc\xff\x54\x83\xdb\x7b\x04\xf9\xb0\xa2\xe3\x65\xee\x59\x47\x8d\x28\xa8\x17\xc7\x4c\x2f\x69\x7b\xa1\x69\x95\x6d\x37\x0b\x7c\xcc\x4b\xd3\xb3\x95\x62\xff\x8a\x22\xf7\xb5\x10\xe4\x3b\xdc\x90\x9b\x2f\xf3\x3c\x7c\xfd\x65\x9e\x87\xfb\x97\x79\x1e\xe0\xde\x0e\x38\x94\x42\x08\xf0\xf0\xeb\x77\xc3\x4b\x0c\xdf\x42\x8c\xf2\xc7\x03\x8b\xd2\x0f\x88\x51\xfd\x78\xa0\x50\xee\x01\x49\x7e\x3c\x80\x07\xec\xcd\x00\x00\x50\xf0\xc9\x88\xeb\x83\x11\x0f\x4a\xfd\xad\x04\x0e\xa5\x8c\x36\x5e\x3f\x1d\x48\xd7\x0f\x33\x11\xf5\x93\x8f\x74\xfd\xa4\x72\xfd\xd8\x2f\xde\x26\x11\x70\x7d\xc8\x95\x1e\xc0\x49\x97\x37\x62\x38\x94\x46\x78\x94\x1d\xd0\xb5\x1c\x04\x47\xb9\x36\x5e\x3f\x9c\xc5\xd6\xaf\x70\x11\x1c\x21\xea\x87\xcc\x38\x84\xaa\xff\x11\x08\x8d\x12\x1b\xfe\xbd\x24\x40\xa2\x54\x2d\x8a\x47\xf9\x9c\x45\x79\x83\x40\xa9\x36\x8e\x52\x70\x46\xad\x0f\x55\x3f\x10\x4b\x74\x01\x85\x02\x04\x5c\x1f\xe1\xe4\x11\x00\xd7\xbd\x4d\xbe\xbc\xf7\x02\x8d\xb2\x8d\x17\x00\x81\xf2\x9f\x3b\x8a\xbe\x39\x0a\xd0\x28\xf5\xd5\x10\xf2\x3a\x04\xff\x62\x08\xf1\xbb\xeb\x90\x77\x19\x5f\x2d\x43\xde\x15\x79\xb3\x0a\x84\xc4\x2b\xc0\x62\xda\x1d\xc9\xaf\x08\xef\xf6\xf6\xe5\xcd\x8d\x02\xaf\x5b\xde\x7b\x5e\x7d\xbb\x2f\xdf\x59\xf5\xba\xe7\xdc\x37\x99\x87\x2f\xd2\xa6\xb9\x58\x7b\x8d\xed\x21\x4c\x12\x24\xb2\x5f\x35\x3d\x3d\x21\x89\x16\x3a\x16\x82\x76\x12\x4b\x33\x8d\xe4\x1c\xe8\x29\xd2\x7e\x7e\x7e\x35\x06\x7b\x7a\x42\x3c\x1b\x41\x67\x10\x07\xcf\xcf\xf7\x7c\x7c\x7a\x42\xfe\x47\x12\x45\x19\xda\xd7\x32\xab\xd0\xaa\xf5\x42\x46\x9e\x9f\x9f\x9e\xae\x23\xff\x1f\x72\x4e\x7c\x29\x35\xb4\xd8\x42\x9e\x9f\x1f\x7e\x85\x1d\x13\x2d\x80\x1f\xa0\x87\x9e\x9e\x10\xcb\x4f\xad\xeb\x8c\x6b\x07\x6c\x0c\x4d\xe4\xcd\xf2\x4f\x4f\xed\xdb\xc8\xb7\x8a\xdf\x14\x7a\xdb\xfa\x6e\x3e\xdc\xda\xde\xfa\xe1\x6a\xcd\x00\x1e\xf0\x5e\x0f\x7c\x45\x7b\xf7\xd3\xd2\x03\x52\x9f\x17\x7c\x2d\xb3\x20\x75\xbc\x61\x0a\xa8\xc1\x07\x21\xd8\x9b\x18\xbc\x57\xe7\x4d\xf7\x55\x8f\xa5\x77\x79\x65\xda\x6b\x2d\xde\x9c\x54\xdf\x1e\x1c\xae\x07\x85\x87\x8f\xe1\x6e\x36\x5a\xa8\xdb\x55\xf0\x7b\x07\xbc\xd7\xe1\x95\x82\xef\xb7\xe7\xab\x1e\xef\x8f\x1e\x37\x9c\xd6\xed\x77\xb1\x59\xf2\x4a\x99\xcc\xbc\x4f\xbe\x9d\xc4\xdf\xb2\xec\x7b\x67\x5f\x39\xfa\xe3\x39\xa1\xd1\x2b\x33\xdf\x08\x7f\x23\xea\x05\x8e\x68\x47\x33\x8e\xb2\x17\x1e\x5f\x63\x0f\x42\x0f\x45\x5f\xe5\xe4\x67\xf2\x7e\xbb\xe5\x3b\xf6\x62\xdc\x4b\xc2\xc8\x5e\x9a\x79\xa1\xf3\x2a\x76\xff\x65\x17\x3c\x3d\xc1\xee\x5e\x12\x05\x52\x99\x35\xc9\x00\xd5\xfe\xb7\x9c\xf1\xc7\xb2\xf0\x6b\xb1\x9f\xa1\xf0\x3d\xfe\x3f\xcb\xa3\x5a\x89\xdf\xcb\xa3\x46\xcb\x46\x42\xc3\x21\xe2\x64\x59\x47\xee\xf9\xf9\xbe\xcf\x1b\x9e\x89\x5e\x4f\x17\xd8\x4f\xf7\x6c\x7b\x1b\xda\xaf\x36\xf9\xdb\xde\x8e\xdc\xf6\xfb\x87\x17\xbe\xf9\x82\xb8\x9a\xc3\xc4\xe7\xeb\xfc\x6f\xdb\xf3\xad\x50\x0b\xac\x1f\x77\xff\xbd\x73\xec\x3d\x93\x5e\xbb\xa8\x21\x89\xa5\x1b\x25\xd9\x27\x6e\x7a\xed\xfe\xcf\xa9\xeb\x0f\x85\xe4\x4d\xae\x7f\x09\xda\x37\x69\xfe\x2a\x73\xdf\x6f\x4b\xdf\xb1\xe6\xe8\xff\x1d\x83\x87\xa9\x5f\xff\xf6\xff\x03\x00\x00\xff\xff\x15\x51\x66\x61\x81\x6f\x01\x00") func dirIndexHtmlDirIndexHtmlBytes() ([]byte, error) { return bindataRead( @@ -241,7 +241,7 @@ func dirIndexHtmlDirIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "dir-index-html/dir-index.html", size: 94041, mode: os.FileMode(420), modTime: time.Unix(1403768328, 0)} + info := bindataFileInfo{name: "dir-index-html/dir-index.html", size: 94081, mode: os.FileMode(420), modTime: time.Unix(1403768328, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/assets/bindata_version_hash.go b/assets/bindata_version_hash.go index 07286e7fa..ac8bd502f 100644 --- a/assets/bindata_version_hash.go +++ b/assets/bindata_version_hash.go @@ -2,5 +2,5 @@ package assets const ( - BindataVersionHash = "605b5945438e1fe2eaf8a6571cca7ecda12d5599" + BindataVersionHash = "512eb789cd905714e03f29d4e04de7549e8c9c3e" ) diff --git a/assets/dir-index-html b/assets/dir-index-html deleted file mode 160000 index 5c6147fd0..000000000 --- a/assets/dir-index-html +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5c6147fd02e88b0a235ac655f58741436a2f2b80 diff --git a/assets/dir-index-html/README.md b/assets/dir-index-html/README.md new file mode 100644 index 000000000..ad5fa68b2 --- /dev/null +++ b/assets/dir-index-html/README.md @@ -0,0 +1,26 @@ +# dir-index-html + +> Directory listing HTML for `go-ipfs` gateways + +![](https://user-images.githubusercontent.com/157609/88379209-ce6f0600-cda2-11ea-9620-20b9237bb441.png) + +## Updating + +When making updates to the directory listing page template, please note the following: + +1. Make your changes to the (human-friendly) source documents in the `src` directory and run `npm run build` +3. Before testing or releasing, go to the top-level `./assets` directory and make sure to run the `go generate .` script to update the bindata version + +## Testing + +1. Make sure you have [Go](https://golang.org/dl/) installed +2. Start the test server, which lives in its own directory: + +```bash +> cd test +> go run . +``` +This will listen on [`localhost:3000`](http://localhost:3000/) and reload the template every time you refresh the page. + +If you get a "no such file or directory" error upon trying `go run .`, make sure you ran `npm run build` to generate the minified artifact that the test is looking for. + diff --git a/assets/dir-index-html/dir-index.html b/assets/dir-index-html/dir-index.html new file mode 100644 index 000000000..ec00da798 --- /dev/null +++ b/assets/dir-index-html/dir-index.html @@ -0,0 +1,97 @@ + +{{ $root := . }} + + + + + + + + + + + + + + + + + +{{ .Path }} + + + + +
+
+
+ + Index of + {{ range .Breadcrumbs -}} + /{{ if .Path }}{{ .Name }}{{ else }}{{ .Name }}{{ end }} + {{- else }} + {{ .Path }} + {{ end }} + + {{ if .Hash }} +
+ {{ .Hash }} +
+ {{ end }} +
+ {{ if .Size }} +
+  {{ .Size }} +
+ {{ end }} +
+
+ + + + + + + + {{ range .Listing }} + + + + + + + {{ end }} +
+
 
+
+ .. +
+
 
+
+ {{ .Name }} + + {{ if .Hash }} + + {{ .ShortHash }} + + {{ end }} + {{ .Size }}
+
+
+ + diff --git a/assets/dir-index-html/index.go b/assets/dir-index-html/index.go new file mode 100644 index 000000000..98933e3f6 --- /dev/null +++ b/assets/dir-index-html/index.go @@ -0,0 +1 @@ +package dirindexhtml diff --git a/assets/dir-index-html/knownIcons.txt b/assets/dir-index-html/knownIcons.txt new file mode 100644 index 000000000..c110530ea --- /dev/null +++ b/assets/dir-index-html/knownIcons.txt @@ -0,0 +1,65 @@ +.aac +.aiff +.ai +.avi +.bmp +.c +.cpp +.css +.dat +.dmg +.doc +.dotx +.dwg +.dxf +.eps +.exe +.flv +.gif +.h +.hpp +.html +.ics +.iso +.java +.jpg +.jpeg +.js +.key +.less +.mid +.mkv +.mov +.mp3 +.mp4 +.mpg +.odf +.ods +.odt +.otp +.ots +.ott +.pdf +.php +.png +.ppt +.psd +.py +.qt +.rar +.rb +.rtf +.sass +.scss +.sql +.tga +.tgz +.tiff +.txt +.wav +.wmv +.xls +.xlsx +.xml +.yml +.zip diff --git a/assets/dir-index-html/package.json b/assets/dir-index-html/package.json new file mode 100644 index 000000000..4b2427574 --- /dev/null +++ b/assets/dir-index-html/package.json @@ -0,0 +1,17 @@ +{ + "name": "dir-index-html", + "description": "Directory listing HTML for go-ipfs gateways", + "version": "1.3.0", + "private": true, + "homepage": "https://github.com/ipfs/go-ipfs", + "license": "MIT", + "scripts": { + "start": "cd test && go run .", + "build": "npm run build:clean && npm run build:remove-style-links && npm run build:minify-wrap-css && npm run build:combine-html-css && npm run build:remove-unused", + "build:clean": "rm dir-index.html", + "build:remove-style-links": "sed '/ ./base-html.html", + "build:minify-wrap-css": "(echo \"\") > ./minified-wrapped-style.html", + "build:combine-html-css": "sed '/<\\/title>/ r ./minified-wrapped-style.html' ./base-html.html > ./dir-index.html", + "build:remove-unused": "rm ./base-html.html && rm ./minified-wrapped-style.html" + } +} diff --git a/assets/dir-index-html/src/dir-index.html b/assets/dir-index-html/src/dir-index.html new file mode 100644 index 000000000..f3dfd6328 --- /dev/null +++ b/assets/dir-index-html/src/dir-index.html @@ -0,0 +1,96 @@ + +{{ $root := . }} + + + + + + + + + + + + + + + + + + + +{{ .Path }} + + + +
+
+
+ + Index of + {{ range .Breadcrumbs -}} + /{{ if .Path }}{{ .Name }}{{ else }}{{ .Name }}{{ end }} + {{- else }} + {{ .Path }} + {{ end }} + + {{ if .Hash }} +
+ {{ .Hash }} +
+ {{ end }} +
+ {{ if .Size }} +
+  {{ .Size }} +
+ {{ end }} +
+
+ + + + + + + + {{ range .Listing }} + + + + + + + {{ end }} +
+
 
+
+ .. +
+
 
+
+ {{ .Name }} + + {{ if .Hash }} + + {{ .ShortHash }} + + {{ end }} + {{ .Size }}
+
+
+ + diff --git a/assets/dir-index-html/src/icons.css b/assets/dir-index-html/src/icons.css new file mode 100644 index 000000000..dcdbd3cd9 --- /dev/null +++ b/assets/dir-index-html/src/icons.css @@ -0,0 +1,403 @@ +/* Source - fileicons.org */ + +.ipfs-_blank { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWBJREFUeNqEUj1LxEAQnd1MVA4lyIEWx6UIKEGUExGsbC3tLfwJ/hT/g7VlCnubqxXBwg/Q4hQP/LhKL5nZuBsvuGfW5MGyuzM7jzdvVuR5DgYnZ+f99ai7Vt5t9K9unu4HLweI3qWYxI6PDosdy0fhcntxO44CcOBzPA7mfEyuHwf7ntQk4jcnywOxIlfxOCNYaLVgb6cXbkTdhJXq2SIlNMC0xIqhHczDbi8OVzpLSUa0WebRfmigLHqj1EcPZnwf7gbDIrYVRyEinurj6jTBHyI7pqVrFQqEbt6TEmZ9v1NRAJNC1xTYxIQh/MmRUlmFQE3qWOW1nqB2TWk1/3tgJV0waVvkFIEeZbHq4ElyKzAmEXOx6gnEVJuWBzmkRJBRPYGZBDsVaOlpSgVJE2yVaAe/0kx/3azBRO0VsbMFZE3CDSZKweZfYIVg+DZ6v7h9GDVOwZPw/PoxKu/fAgwALbDAXf7DdQkAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-_page { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmhJREFUeNpsUztv01AYPfdhOy/XTZ80VV1VoCqlA2zQqUgwMEErWBALv4GJDfEDmOEHsFTqVCTExAiiSI2QEKJKESVFFBWo04TESRzfy2c7LY/kLtf2d8+555zvM9NaI1ora5svby9OnbUEBxgDlIKiWjXQeLy19/X17sEtcPY2rtHS96/Hu0RvXXLz+cUzM87zShsI29DpHCYt4E6Box4IZzTnbDx7V74GjhOSfwgE0H2638K9h08A3iHGVbjTw7g6YmAyw/BgecHNGGJjvfQhIfmfIFDAXJpjuugi7djIFVI4P0plctgJQ0xnFe5eOO02OwEp2VkhSCnC8WOCdqgwnzFx4/IyppwRVN+XYXsecqZA1pB48ekAnw9/4GZx3L04N/GoTwEjX4cNH5vlPfjtAIYp8cWrQutxrC5Mod3VsXVTMFSqtaE+gl9dhaUxE2tXZiF7nYiiatJ3v5s8R/1yOCNLOuwjkELiTbmC9dJHpIaGASsDkoFQGJQwHWMcHWJYOmUj1OjvQotuytt5nHMLEGkCyx6QU384jwkUAd2sxJbS/QShZtg/8rHzzQOzSaFhxQrA6YgQMQHojCUlgnCAAvKFBoXXaHfArSCZDE0gyWJgFIKmvUFKO4MUNIk2a4+hODtDUVuJ/J732AKS6ZtImdTyAQQB3bZN8l9t75IFh0JMUdVKsohsUPqRgnka0tYgggYpCHkKGTsHI5NOMojB4iTICCepvX53AIEfQta1iUCmoTiBmdEri2RgddKFhuJoqb/af/yw/d3zTNM6UkaOfis62aUgddAbnz+rXuPY+Vnzjt9/CzAAbmLjCrfBiRgAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-aac { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnhJREFUeNp0Uk1PE0EYftruVlvAUkhVEPoBcsEoLRJBY01MPHjCs3cvogcT/4qJJN5NvHhoohcOnPw4YEGIkCh+oLGBKm3Z7nZ3dme2vjOhTcjiJJvZzPvOM8/HG2q325Dr3kLp7Y1ibpIxjs4KhQBZfvV6s7K5Vb0bjeof5ZlcGysP1a51mifODybvzE8mzCbrAoTDIThMoGXZiZ4YSiurf+Z1XeuCqJ7Oj+sK3jQcNAmg8xkGQ71mYejcAB49vpmeuzJccl0+dUj6KIAvfHCPg3N+uAv4vg9BOxcCmfEzuP/genpmeqhEMgude10Jwm+DuUIyUdTlqu2byoMfX/dRermBeExHsTiWNi3+lMpzRwDki8zxCIATmzbevfmClukiP5NFhJgwkjeRTeLShdOoVJqnAgwkgCAZ6+UdLC9twjQZ8pdzioFkZBHY3q6B3l4dJEEEPOCeD4cYVH7Xsf15F+FImC775INAJBJSkVoWo0QY9YqgiR4ZZzRaGBkdwK3bFxGLRZUfB3Rm2x4x9CGtsUxH9QYkKICDFuLxKAozGZwdTqBRs2FbLlXbiPdECMCHadj/AaDXZNFqedCIvnRcS4UpRo7+hC5zUmw8Ope9wUFinvpmZ7NKt2RTmB4hKZo6n8qP4Oq1HBkKlVYAQBrUlziB0XQSif4YmQhksgNIJk9iaLhPaV9b/Um+uJSCdzyDbGZQRSkvjo+n4JNxubGUSsCj+ZCpODYjkGMAND2k7exUsfhkCd+29yguB88Wl7FW/o6tT7/gcXqAgGv7hhx1LWBireHVn79YP6ChQ3njb/eFlfWqGqT3H3ZlGIhGI2i2UO/U/wkwAAmoalcxlNA1AAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-ai { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk5JREFUeNpsU01vElEUPTPzZqBAQaSFQiJYUmlKYhoTF41L3Tbu/Q/+AvsX3Bp/gPsuWLrqyqQ7TUxMtAvF1tYGoXwNw7wv7zwYgtKX3Lw379575p5z77O01ohW+/DVh8zj7aYKhflGdG9ZsGwLNydffgVfr19YHvsEa+Zu/nxndob5StQK+dyzvZzyw/gKlmMj7IygFM+xvNcanp4/t5dAomXHBy2UUBOO2MAl/B9/cPb6PULuoHx0WM0e3GvpUOxD3wZAJWutZqYUYmqpSg5OMgH3YQObL59W0/ullpryR3HegkKEqiWBSGV4R3vQ7sIhScTZFTpHx3A215B5sluVY/WWMg7+ATB/lcLsKpTonHzD+OMFEuTz8ikkt9Kwt9YJZB38cpBdoQAZJdLvCGByfoPB6Xdk90pYy6Xg3c/DaWwArg09DaG5lCsUFN0pckZAojdC8m4auBqaALuSgez7VB1RtDSUWOQvUaBLFUzJBMJ2DwmPgd1Jwm0WoSgJfjDvrTKxtwAIyEkAOQ5hU//Zdg5uowDlUNMnwZLW0sSuUuACYhwQRwFvJxupCjEYUUccOkoaKmdOlZnY1TkgAcXAhxhOwLsDsHoN3u4O5JTDfVCH6I9nfjId3gIgSUATFJk/hVevGtOMwS0XwQ3AzB/FrlKg8Q27I2javVoZrFgwD4qVipAEyMlnaFArzaj/D0DiMXlJAFQyK2r8fnMMRZp4lQ1MaSL5tU/1kqAkMCh2tYI+7+kh70cjPbr4bEZ51jZr8TJnB9PJXpz3V4ABAPOQVJn2Q60GAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-aiff { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAohJREFUeNpkU9tqE1EUXZmZpE3aTBLbJFPTtFURtSCthr7UCyKKFJ/9An3og6Ag/oXfoUj7og9asCBYKT6UIPHaWtpq7NU2aZK5z5wZ9xxMpMwZDuewz9prr32ZiO/7CNaDx3OLt6fOjBqGg/aKRCIInp8+KzfKH7fudnVF58nE16el+/yU2mBFSWZKpWJKVc0OgUBo02K4NDmU6o75Mx+Wdu9IUXFeiOA/pn1xHeYaugVDdzpbp91qGlAKGTx8dC19/Wpxhjnsxj/RRwk85hGJC9d1O6fneWAuoztDYSSLe9OT6SuXB2ccx73Z9uukwDwfls1g0xZIY/Ad/Gnyt/XVfbyYrSDRE8PExHB6/8B6QuaxIwRBFMt0iIAiMx+LCys8jfGJEUik2WpZOD2SQf9oDtVqQwopCAiY66FS/om3b75CVS2MlU7AJ2WiJBCZjZ2dJuRkDJZFwFAR7UCBja3fNfxY2YEoCtRCj9em3Tpds6FpJseGCBxS0GgYGBzqw62p84gnYnAI2CSbSbPhEpFAaE2zODaUAlWWwDoS5DheGqbWpVE/0CmqCY9qkEyINBceb2uADRNQ8bSWAVVzIFKomCQim+0luS4yKYlsHlRyZo7EsSEC23K5vAsXh/H92zZkuRvxeBS5nEx2yp2KqhxPoV5TYS/8CtdApylM9sZQKKSQzyeRTseRV2QoAzIYY8jme5DN9fI0dQoUIjANGydP9VM7PZw9p/AiBpNYrdbw/t0yTJqRtdU9UrfJCUMpSJIgbWzsYe51BcViHzLHeqCRqhZ1YX1tFwNfZBxS9O3NWkAcHqR606k/n/3coKAoV/Y7vQ/OYCZevlrmv3c0GsFh06u3/f4KMABvSWfDHmbK2gAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-avi { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAm1JREFUeNpsU8tu00AUPXZcN0nzTpq2KQ3pAwkIAnWHqCoeexBb+AQ+ABZ8A2s+AIkdm266QUJIFWKBkHg1KpRHi5omJGkbJ3bGHj+4M1EQrTvSyGPPueeec++1EgQBxHp+/9mbyuriRZdxjJaiKBD3W+u1+p9a856max+gDO8ebT+WT20Ezi9NZi/crqadvn2MQBAGfpCOpqNru2937vxPIpY6Onjccx3Twck9MBiSU0ncfHirXFmZX3Md9wqCUwiEVN/zaQfHt0vfbBe5uQyuPVgpl5Zn11ybL4/i/lkICOw5niQRGQShoiqI6Bo43W2ub8n3hRtLZT7gTynk6gkCX9gAOxpAnxhHZDwC1/aI1EViJolu/QhKRMHZ1UX0Gr1USIEn5FPWHy+/wTokkrQOq2vBaHZBN4hmY9Jwfr4An/teiEB45ZZDwDiMhoExT0N+sYDCuUkkplLIlXP4/XEXdo+RUhdhBSSfUwtVTUG8MIHK9QVqI7D/uY6vr2pwmCPrkz+Tk9gwARWQ9WxppbXZhNnpw+ya4A5HZi6L4lIR8WyCcL6sTZiAWjWgAmpxkn5+kqTamK6WkCwmERmLDLvjB0ML9ikWXPLFuozYOap3L8HYN6DHdbS/d5CeTVBndBz87FCBLYkNTyIjBQemnIEsSY5lYrK1+UoWcToLMjEHAyIQ2BCBSx/NVh+ZUhrqmEqBebS3WyhdLg0zt/ugAaIklsSGLHCLa6zDMGhZ2HjyGsnpFPqNHnY2fmHv3R5SMymYbROszSQ2ROAY9qHiofvlxSc5xsKKqqnY3diRE9h4X5d/pzg7lnM4ivsrwADe9Wg/CQJgFAAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-bmp { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmZJREFUeNp0U+1rUlEY/13v9YV0vq2wttI5CdpL9aEGBZUDv0df668I6n+or0UQ/RuuD0EgVDAZrsKF4AR1a6COKW5qXvXec27PuVeda3bgcF6e8/ye5/d7niMZhgExnK9fbTrm5pbBGMZDkgCyq+VyhTUaT6Eo2ZHJePPWXJXRhez3B1yxmM/QdctXUSCgtV4Py4CvY3cky4e1x5DlLCaGbbzjXDcousG5OQe5HPRSCQPK4PpsEM/XH4WvhS4noeu3JwHGGRiULhsMoKZS4I0GtEIB9mgULJGA0+9DPBpBT7sffvf1W/Lg6OgJufw8C0CRGEXWazUwiiyFQjA8bsjVKjaJzovMD/Q5gxyJhG2cvyeXe2cAuADQNGBmBvLaGuTFRaDfh31lBTWi9pumjbK0B4JQul3vOQpM8JdskOLrdCvDcDjAsjtg5TIkoiKLaokMNR2cnZbqNAMycqG7XbHKR2fMzwO/dsxSwu0BiBJsNsv2LwAJAJCI5ux2gXYbqNetcz5PoORI1cDS0n8AxGW7A+zvEYBKZ2ZlcsEtJLbedMjePBaCTQMghx45ulyWkzxMVUQ2RMQhLfFO16YAqCrixPnm6iqKrRb2W23EfF4cUNSrHg90cr7hDyB33MTnSmUKALVs4uIlROjxg+AsPhGVl3fuIl2tIOB0Ya91gkOi9mxhAal0ekork1ic/kGLBORMxy2K1qS9V1ZQbNThIj2EGh+2tsyOnSai8r1UxMNIBB+LRTTULr4Uds0K1tU/uOLxIrmbNz8XXSrnASSpubG9fbKRyVh1n/zSw29t9oC1b47MfwUYAAUsLiWr4QUJAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-c { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcxJREFUeNqEUk1rE0EYfmZnkgoJCaGNCehuJTalhJZSUZB66a0HwXsP/Qn+FM+9+hty0LNYCr2I7UVLIW0Fc0hpQpSS7O7MrO9MspuvVV8YMnk/nn2e5x0WRRFMvP/w6WSz5jbi/9NxfP693Wp3DrJCnMW5d28P7a+IE15lufR8o1ZEStwPhkWHsWbrZ+eNEPxsuubEF6m0TBv2Q4liPofXuzveulttSqW2UwH+GjqC0horpSL2njU89+FyMwjlTlxOJMTa9ZQHzDQIjgwdom9zLzfXPc75kbnOAswBJTlC2XrqQRMLxhi442DgB4UFBhgPpm3B5pgBHNUUxQKAHs8pHf3TEuFMetM9IKr/i2mWMwC0SnuSFTG2YKyppwKYVdGO7TFhzBqGIenVeLCUtfURgErucx5ECKREKBU4d3B718PHz6cICGT/1Qs8qpQtGOdyhtGEARWDQFqQJSeDL98u4VbLaKw9IRAJPwjtoJGlVAoDQ800+fRFTTYXcjlcXN2g++s36p5Lzzlve1iEROa8BGH1EbrSAeqrjxEqicHQt8/YSDHMpaNs7wJAp9vvfb287idboAVkRAa5fBYXP9rxO4Mgf0xvPPdHgAEA8OoGd40i1j0AAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-cpp { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfJJREFUeNqEUs9PE0EU/mZ2WgqpXX+QIDFdalVslh8NlAOQaOKFAwfvHvwT/FM8e/U/MOnBmwcj8WD0ACEGghIkbU0baaEthe3OTJ0ZWV26q37JZt68ee/b9733yGAwgMbL12/fz+azbnAPY2Nrt7Zfqz9JMrYZ+J4/e2pOFjiciRvXlgp5GzHonXk2o6S8V6k/TjBrM/xGA4MLyeOSPZ8jkx7D+uqCU3Amy1yIYizB36AlCSkwfjWDR4uu40yMl/s+XwjeWThQQ4Z6QNSnSkYykcDXasP4lmfvOZTSF9q8TDBEFPbN5bOqCglCCCxK0TvvZyIV4CIxbgpC+4gm/PUmFCIE8iJPyME/e8Lon9j4HvyHYLjKSwRCSEUgf9+15mFbx8QS6CZJMzJ9SlBCwX3fJDLG4PX7ykcwkmQmJtpEhWa7g1dvNlSwjwelebz7tAXLolh0p/Fxe9fErK2WDFGEgKjxfNjegX0lDTc/heNuF99/HGEslcKXwyoazWNDdlCr6+DoJgrBzdI0T9rYO6yg2zszMlaKM3Dv5OBzbuyZuzm1B16U4Nzz2f3cFOx0Gq12F9cztpExncsqYoaHpSIKtx0zJdVIFpHQ6py29muNk1uTN829o/6SHEnh80HFaE6NjmLnWxUJy1LyTltB3k8BBgBeEeQTiWRskAAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-css { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk1JREFUeNpsUktvUlEQ/u5DoCLl/RAKKKUvWmIxjYntQtcu3LvwJ/hTXLt16coFC2PsojEaMKZtCqFaTdGmjbS0CG3By+vei3OOBSGXSU7uzNyZ78z3zRF6vR6YvXzzPrMUCyf68bB9zO+VfpROn5hkOdfPPX/2lH/lfiLidztX5mN2jLGG0rKLENIE8liWpdzwP7HvqJqujmvudFU4bFY8Wk1FZsOBtKppd8YCDNu77CZevd3gflfTUFcUhP0ePLibiIR9rjSBpgwAfe4dVcV6dhtep4PH5msylGYLrzeybErcT85FYiH/CyPAf74gObC2vMhzsiRhPhpC6eQUM+EA1pJzILEnjRSuJsju7MJqsUCSRei6Dp3yXqcdGlHZ/rLPazQWGCn8+6YW4pAkEW0SjzUzanWlCa/LgcR0lNfovTEi6lcIkzesnM/R8RlN0INGp3h4DHoDsE5YRvQyiKiRSMzikRAOS2WoqoZWu41K7RwzlOOAVDMMMHhIGvFlRxJFrKYW0ep0IYgC3SDh4b1lTJjNfENsrazOAMAw680mPuW+8lFno1P4XDigRhOiwQAyJK7TbsNS/PaA7giAIAhYz2yRgBIfsVA8wIetPG6FAqhdNrC5u0f+TUyHgyMTDDToEt/ftQsEvW4EPG5OZcrvw0mlimarTXkPfpXPcNlQoGtjACgpryQXsPNtH/nvRXqBJpoKHMzGNkNB0Odls7LNyAYKpUq1dt1iuvB7fRDp9kr9D1xOFwkpoksXusmXaZWFn0coV89r/b6/AgwAkUENaQaRxswAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-dat { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfVJREFUeNqMU01PE1EUPe/Na0uptmlASg3MoiZgCA3hQ8PHAjbqwsS9C3+CP8W1W/+BSReyYUPwI4QAVkAgUEgIbVIg1FZb2pl5b3zv2cHBjsaTTOa+e989OffcGeK6LhTevFv+OJoZHPHOfrz/sl86KpWfhxnLe7lXL1/oN/MSZqonOXU/k0AA6lfNhEFIrlAsP2PMyPtr1AscLpyg5pbtIHErhqez4+awmc45nI8FEvwNaiQuBHqTcSxMjJhmX0/Osp1xr878FxWEzwMinxAzEA4xFIpnOjedHTKpYbxW4U2CP4j8uWxmUKsghMCgFI2mFe9QgHZj0Ba4yhFF+KvGJToIRLuPC/efnjD6+26wB1Lq/xgbSCBXKeWJG/OTdky8cWTdT3C9RmWSGk2XCLlWo4xTNbfN5qh7PpXM72GjZeHt0gpq9QbmH4whGb+NpU/reDQ7hcWVVXxvXOHxzCQopQEKXKEbL6o1ZIcy+LC5g62DY2zsHeC0fA4zndIrHOjvg2XbAQRSfsuy9XxC2qzi/H5B6/68W0AsGkW0KyJPBLbDO0fg3JX/CUM81i0bD6WKe6j9qOPJ3EMcF0tSNsFA6g6alqW+VtZBUL78Vtk+Oqne7U9rs5qOQCjSheJFBeFIFOfVujSUYu3rIc4uqxWv76cAAwCwbvRb3SgYxQAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-dmg { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAn9JREFUeNpsU01rE1EUPe9lkk47yWTStCmtNhFSWxos2EXVhSsRcasuxYV05V8Qf4DgD/AvCK5EV1oFI7iUBqmCNdDvppq2mWSSzEzy3vPOpFFq+uDNfR/3nnvueXeYUgrBWH1/9/NE7k5BKRnuRcfF2qdnmJq9DeF9tQ+2isuMsxXGWHh/a1mEVsPJSI5fSU3OPEj291IIlN49RXz0KqzEQjIeZS/L5Y/3wPGhDxIM/i/A7fZWgVG0t5EaG0ZUa0JGM8gvPrZmLt58QYwv91mfAqCIE0sAqgumBFITGQzpUYhuF0KfRa7waDyXXXolpVrsh/0tgSLDr5I+wUZo1UHCSkAficPzY6juFSmbRPrC/azjq+fkcO00gAqoU7B0ETKkfWbuCTjTYeq5oESAauexcTScX+ZACWFm0YQSLZKhHdr67+/wW0e0dgjYo3sCEXXybYtBDVSHLp2es3IpsILS24c42lkBg6DzRjgRzCDZ/xr0GNRJwwYiWgzt+hYMawleu0V3wbkT+kUirOc7IGJAz68R/Qak1BAlx3hqASPGBJRXpXOv58dkz3eAgQoOm4hyj57NgZm0MHvpBmK6QdUdg/DAg9cRkhicBSDaKJdeo1bdxmR2DtWDDUxl51HZ+QHTysD3XdQO95Gfv06aeGcAdBrY3Chi8lwO3768QWX7J5q1XWyVSxgajiOXLyBG2hzurRKV9lmt7ISNkkjo6HhNyjoK+2gXRsKE57ZIE2ot10Z1fz0Ue4ABVw3NMjnW14rInh8jTYywoTg3EOFpOM4mXNfH9PQUfGlrAwBOs3I8ljbtuMWhRWzIIPrkn+GcYcgIWEowbZ+0qB334/4IMADESjqbnHbH0gAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-doc { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAppJREFUeNpsU79PFEEU/mZ39vZu77g7DokcP04BBSUmiEKCSCxs7Ei00JAYO2NlTKyMrX+CJhaGwopSQ0dMtFEsbDRBgiZEQIF4IHcg+2t2Z8eZ5QDlnM1mZ9+8973vfe8NEUJArfSNhzPG0VIfeIiDRSDkw1cWVt3N8rhG6SdSO2Gvn8dfuueqZwuNZqk3Jxg7iNcIfBbgXD6ZC8u5qffzX8eoYeyDxC77uygKhcouovgVUQj1H4YB2ovNuD9+tTTU0zMVBmG/+C8AIYh8F361DL/yE5HnADKYlVdg6MDAmW7cuz5WGuw+PsWDYGAvbL8ECFUt4K7/AHd/I9c7BLaxinD2Ld5Zo7g78RLuRhlBS2cpWbGfStfhfwCEpK0nUjCbWuGsLciSOELPhkq/YgdY3l6HsLfRcLYf+pHNbH0JigEPkLAyMsiEJ7NrqQzM1i7wyhoMZqOhvQs6Z0ovXgdAJACRoulEg5HOwrOroKk0zOY2BDtVpTF0CU6kLkQJXa+BNEoG0lMSsBBKQXWNQktmoGcaYeSaQCIVWOvUYQAiWZFQtk5mSMoSzEILtBrTfEcviC5bwVwQmoh96wA0ic5dB57ngeoaTIPCdb34zDITYNLOOIeVSsW+dQC+7+NSWx6jJ4tY/rWNV7PfcGv0tBoPTM7M4eKJVgx2FTE9u4QPS6x+kHzfw/mOAjarW2hJG3hy8zIceweuY+PRtREMdzbjzcd5WBqPB6xeRGUMGRzHjWvMmxQ7tiOF1JBN6FiTd6Sy9RuFbHpX7MMMqOD088Ii+op5OUAO7jyeRGfBwrF8Cg8mXuDL4neMXzgFwhwZz+hf7a9d5yu3Z6DTPjVQIY9k7erO7Y63Lvc8ErEeyq6JaM6efjai4v4IMABI0DEPqPKkigAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-dotx { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAndJREFUeNpsU01rE1EUPTPzJk0y+WhMStW2qdVWxUVEQUF0I+4ELQiC7lz4N9z0T+hG9wrdZKUgLqulhrbSag1CKpT0g7RpYjqZmffle5NEKdMHlzfvvXvPPffcO4aUEno9f3Vt4dTp+BXOe+fB0u/NbVpv7h89NU1j1TCM8H7+xY9wJwPHZMbOjRadLAvE/2gToJTiTPx89k+OlVd/LT+0TPIPpO/SzyQk40xCMxBSZ9Z3CoAx5DOjeHT7SbE0XSpzwa8OWB9jINELolQg8AR0EgUKn1PIlIWpkUt4cPNxkTOU12trs8p95RiAXpqaztqou8q6SKQJJmZSqGwsodFsIJk1kcyLYv7IeafcLx4HUNkFF4jFTExMZ0B9DrfD4HUEusYhWs4GPEJg5wly/tBYRIOeDhpEwlS34xcyajdQr3UwOT2MlJOEBRuGNHWp9AQRVXDfQiFV/U5GBSiQ5p6ngBEa5z3fiIhC6g6IMDBwOdoHPkYnHPVyhN0tF7E4QSpr94CEOKELffq+y9Bq+DCJ7rWBoQQBVbPR2O6G4OlsLASJMtCZfQqm0NP5IVWnamdAkUxbyuIYtD7wWegb0YAzAVMkkI6NwPM9xEwHloyDGAmk7AKS9rAS0FKOdugbYeAHPu7OPEM+MY7q3hIKqTFQHmC3XcONc/fxdfMDrk/ew/edzyhvvTmBAddocVRqH3Frahau56qpZDho7+PnTgXffi/gbHYmLEvPSIQBp5JU62sYz13G609zKBXvoOMdYn2zgm7Xg2MVML/4Eu3uPgxhk2gXmNl8v/i2pcXTP8tKdTEcbWLZqDQXwu/l6pfwbEnSGsT9FWAA4mdHv2/9YJ4AAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-dwg { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAoFJREFUeNpsU0tPE2EUPfOg006hD4rQh8WgbCSwkKgbF2owujaCiQsXxpX+D6MmbtXEsHCLmIAbE6NLo8YlGIxREIshIqVl+mQ6j8/zFVCb4UtuZua795577rl3FCEE5Bl79vPd5LHYiOP7cH1AUWi85ytmvlas1bJ9E5ryBntH3BpuP/X9i7ovkluuiE8N9SDepaLpCcRCCqa/VDCaMuIjSWP25Upl6n+QDoCz6Yh7KKzh3sI2LuUimPtRRyaqodj0MDloYiITSTi+mH29Wu0AUf9CsZPJoW5czJl48LmCc5kIKo5Al67B9gUGYxrun+5NnMlFZ+GKiQADj2a7AquseLIvjMv5KMaSBu4sWVir+3i8VIVKYSby0UTdFU8Znu8AYBHQgVOJEN5uOXi4UsdawwU0FSf6TaSoyw6DRvukPkgGWpDKy4F8a3jImCrqFDFn6rhKPR4VGnhvOTAY3WLcjifcQAsqRfhUc/Gq1MKNbBh9nIAMDjEppocxs9HCMktfGTCwP/oOBkUKNk/qF3pDYC6Ktk8RfWzyaaoKrqdDaBDwya8W1m0/CPCR3kFy7CcnmWQRUJqcRJFUKtTnPCeR71LwoeYF92CYyVnCFZpCTrRtCv5to2St8SOrKxiPqEEA4fkYT+mI0rdoeUiH1XZVuQPpsIKqw2QmfifTsnOABiWySlH9uU0Hh2MqjsZV5LtpPSoGeN9rKnhBX7ehoOSLIIPfnGONXGMMWN7xUfVldYDbjM3mrh5HCDgS17DhHgDQcIU+XbBxnDTn1x1UuQcJ9iv7l5Q5e1zLGri92EDJFnoAgHtcfr6wbbVXUqq193+0z97n3UJt1+d51n7aHwEGAAHXJoAuZNlzAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-dxf { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAo5JREFUeNpsU0trE1EYPfNMmtdoH2kDNmJbaVFcaBVFpAsREQpFwY0bu3HjQnTj1mVd+ANcuC3qQixmry6E0kWFVIQ+bKy2tbFJm3emyXTujGca+4DkwsedfLnn3POd77uS67rw1vC79ek7fZEzpu3AYUqS9tKQGZPLpa3VXP0uFCmJ/8t9OLC3q/uJbcs5bkIybvdHoMsSbLKENRmvU2WcNnTjRFD7ML1WGSPJHI6sA4KRWMAWVDPxLYex3iCmfpuIh1QsFSyMxQO4GvXHHwOJ6XWSyIck8v6HQsnjAxFc7vTj2VwBg4aG78VdBHQFCk+dbVcxMdwev9gTSEC455sIBOu2KLsoJFzqasP9vjCeDBlYqzn4VXXwarGKZN7Crd5QfLDT/7KpBM84c9fFUFjFp2wdk6smflRsKKqMa7EgfJJ3Ac2OKlit2pEmBTQfngdpnupoU7BUtRGiiTe7fXiRqmK+KuDn6TpvYogmBRJcrOwIJLIWxmM+dOsyLKryQAaJpjJ1/AxrGO3SqdZt7kKZJrzJWBg5piHENuY8vV6e0UOye1TyftvC5l+gZB8SHJTwpSx4q4JeTUKaxhXoR57h7Rn+3iFolJ3xvPhab6HgJG/pJ7jsNP4sUX+jZiCgEsWd/DjH5IrSYpBUAr0yHpzSoXKOP25a6OBhndh0zcX1qIYM2RIbu6i0KiHD5B/GTMHG03kTGpEL7H80wHFOWwhqDZ+SpkBOtCDYJDhZE4gRcKNbYynAqbCMbXpwpVPFbEng0aKJGbYzK1p4wIegLlcEPmdt+DjXbzcsxFlCynRwwVAwW6hjqeg0Zt521SYCWCJvbe0Un29UDx7Hgrs3IEitHXkw3jOv2fl92D8BBgAJeyqBh90ENQAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-eps { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNp0U01vElEUPfMFCEVArdoSqEA0KV246UJdUJM2Lo2JK/9FjXu3utJqTNz4D9worrsQExbFpAFT0TYp0CZ8pIAiyMfMvBnvm2Foa9uX3Lw7c98979x77hNM0wRf7ufPsq7Z2SQYw2QJAkDxQalUZa3WI8hy3gmZr15bu+z8kILBkCeRCJi6bufKMji0NhwiCQR6iitdatTvQ5LyOLLEiWcYukm3m4Zhmbq1BX13FyoxuH7xAlbvpqKRK1fT0PWbRwEmDEyiy1QVg/V1GO02tO1tKLEY2PIy3KEAlmJRDLXb0TeZL+n9g4MHlLJ5HIBuYnSzXq+DlcsQLk/D9Hoh1WrIUjlPcpsYGQzS3LWoaBhvKeXWMQCDA1D9pt8PaXERUjwOjEZQFhZQp9L2yERiqYRCkPt/z58ogTGqHQLE1BLgUmC6XGD5AlipBIFKkbhanKHGYLBDqQ4ZED0OAbfLlo8OIxwGvhVgyTHlA3xkomjH/gegBgDURMv6faDbBZpN+/tHkUApkdTA/PwZAPxntwdUyjYA/+ZMqJHjLgM9iv/6zRt2GgMaIE21aVIjnSm0DGPfmhzyde0UAE2Dj+p7urKCPvkZku9eJILOSMUnkvVhIo7GYIB3xSKYdhoA1erXGVKXpvFxZwdBonnD68PQ7YEwM4O4xwMPxc8RYE87g4FIcz+kvfmnA0YzIJIy77/m0OCqsTkkCTysKPjJG3viLei63Gm3kCO6UWqcMejjxecMPmxsoFKtYop6UNirYL9Wtc5OHqzznIXHq1na7OfMJROcK8a6O7MjW7nfzZdrd7jzT4ABACh3NGsh3GcdAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-exe { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAo1JREFUeNp0k8tPE1EUxr+ZzvRJO62lUAQaKIQ0FVJFjBBdoIkrDDHuXJi4NnHtX+HCjW408Q/QmHTRaCRRohIJifgiiBICTQu29mHfnc7MHc+MlECKdxZz595zf+c737nD6boOYzxJLC6Nhwej7e/24HkO779s7G6mMjcEwfKZ21+/d+em+RbagaFev28qEpZwzKg3ZckqCPH1nfS8hScIdyhBe6JqTG3PfyTTeLrwFhvbKdy9/xi5QglXL0yGJsKDccZY7LDIAwWHpSferWBh+RN8ni4UylVER8MY6PHj0uSpUK0hxzfTmWsUtnoEwO3rer64jEyxim6/Hy67DXaHExvJX3jw7CX8XjfORUdDlOohhU4fAVjILCPbm9V1yIqK2FgYt+ZmsZcv4lH8Nb5upXD7+hVMjIRQa8qeDg8UTYPU5cTcxSk4nS709XTD53ZhpD+IYMAPj+TBz93fZiz5oHV4AP1fGdlyHZIkIZkrI7GyhnK9CZXy+Aig6p1+HQAY003AcF8AVtGGfLWG9XTO4MLZ5cL0WAixoT4zVmPHADSiMo3hzHA/xgeDWFjbNg8H3A7kKnX0koEcPdTu/ylgRGZgOjNv38zoSXC8BZJDRKOlwGEV0VJVGM0y4joAPO1spXbx6sNHeD1uRIYGUCxVSRlDt1fC8rfvcDnsmJ+dOaLgoAs6AVLZPJJ7WdhEkUyT8GJpBflSBcVKDTvpDBw2GzQqQT1OgaZqUOhtFQUTUKnVTVWNpgy51YLVKph7sqKYkA4A1ScEfT66vm5kC3+ofh6Xz59FQ5bpkvE4QW3M5Apoyorhl9ABIKnFgNdTOh2NkJG6WSf9eRBJtmFwLDJmriUzeaOkYvvcXwEGAIVNH6cDA1DkAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-flv { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmtJREFUeNpsUl1PE0EUPbssLYUCXdpaC9gWoSTgAyFigiRGY+KjvuuTr/4A44MP/gx/gMYfwIsan0RjIjGiJIZgSIGFIoXSD0t3Z3dnd70zpITazuZmJzP3nnvumaMEQQCx3jx69SV3a3KWMxetpSgKxP3m242Do43SQy2k/YRydvds67n8a63k+FRSn7l/bdg5tdsAuM3he/5weDC8vLdqPLgIIpba2niux52mg//DqlsYSg3iztO7mczN3DJ3+ByCLgCBH4hOFEF7cDpzPCRyOpaeLGXSc2PL3HbnW3XaRQCPEgWI2MsRVAVqrwbX9bHxbhOKpiJ/bzpDOr2k68V2BtRNzMtqDEqPejY/4zSGjb54BM0mQ8k4xsDoIMauXxnqYOD7PmwScP31d0SS/eAuh1lrolFpIBQNQw2pqJdqsAlIceB1AJCIkkE/FZskXDQVRXw6IYHiE0nBEcaPXSSvJnGwWkQXAE4acAhbxPMJpOdHweoMhc9b2F8zwKizbdlyPLVH7QLg+JKBYzoorxzjz3oRzUoToaEw9KyO8XQW5AE5jrFT6AbAYVVNxCZ0Ka3So+DSTAoDiej5ywTySbls1OEDobhFlMcXxrHw+AbINEjNXgb7y6BndLhk8cRkHHbD7g4gEhiJFxsdhrDqaamBaDKKerGGSKwPI9kR9EZCaNA5ubE7A5s8IFhsrxQkgJhZoa/06xC5xRz2v+3BOjFlbqcGlquxsondT9vY+2pAJdeZR6fI355CgQCN2A4O1w7gkQ7cdLUOAKdhV6uFSv3kd/n8mT68eC8dKWLnY4FsfeZQh7nVVt0/AQYAsf5g+SvepeQAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-gif { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmVJREFUeNp0U0tPE1EU/trplAqlL0laiw40xASByEJIZFGVnSvj1j+gWxNXJq7VrbrwF7h10cSNhMRHojEuACVBKmH6SJQyJeXRxzzv9dyZPiCtN5lMe8853znf953xcc4hztDzZ1+C6fQMHAfd4/MBFG+p6h/n4OAeAoGNToi/eOm+A50LKRaLh6amoty2vVpZdotNXccMEK3LwZxa2bsDSdrAqePv/mLM5tSdMwYBYqyvw9zdhUn/L59P4OGtG8qlZCoH254/DdCdQBCxqZu+ugqnWoW9swN5ehp2NotgIo6bGQWGtaS8+vQ5V9a0u5S+1gfABEilAqdUgm98HDwUQkDT8JXoPPq+BoM5kCYmFT9jryn1+hkAt7heBx8dhbSwACmTAUwTgdlZ/CVKJaLnI1GD8TikZiPSR8Gxib8chH95mZTxgwWHwH7+gFMswqcokIRbjMO2HDCnZ1VvArpjEmnKZc8+cZJJYGsLsMiZ8AgwEqaY6Mb6RQR33JFhGECzCRyfAFXNu9v+RVNRZWIMuDJNuYMAaDycUFGhCOgtuAtFVDA83G5A8TrFDw+F5QMAxAKJJxz2xnW3RPJGbm+rCyjotZetH4DGzaSSeDA3h4Zl4R0JOEZWTpIzF4n/m995bNdqZwB6m0gFft3Ak6vz+KYWwFsGlqIxXItEcDt1ARMEtKdVgZb+fwA0G2C2hXM0ZTZNRcSf0b1pmXi7uYnjI+Lfanm5fRQsK8BIxKcrK7i/uIgP+Tw+FlREqHN5fx/vyU4uHBE6UO4gDWqk/JFaLuMxcXeFk6TuJ90V0HOk1in7J8AAjmgkPfjU+isAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-h { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAbRJREFUeNqMUk1Lw0AQnf0woK0ttVqp0hwqVCl+UBERT94F7x78Cf4Uz179DT14F8WbYHtRkBYRLNqDtdaPZLObuLs1NGlXcWDJZGbey+x7QUEQgIqT07PL5WKhHL5H46J+22q22vsWpbWwdnR4oJ80LNiz2czGUjENhvj4ctIE4Wrj8XmPUlKL9nCYcOFzE9j1OKSTCdjdrtiLdr7KhVgzEvwW6krC92E6k4Kd9bJt57JV5vFK2KfRQRV+RAMkzxglYI1RaDy2dW1rpWRjQo5VGicYIorWVooFvQVCCAjG8Omw1MgG8AM0uSBUDSnCfk/IGCHwf3DCD/7UhOLBrFkDuep/hDUSSCv1iYo4rIfqGwmUSNJjfYbBcQKhZw0aBMA4B48LwBhBt/cON80HmM9NQ6fXg/Wlku4TwmNWDzaQqzHG+0PSKod5cH5Vh2RiAhYKc8DlV1UPSyuFMGygVlMg1/P6BC6DqXQK8jNZDXAYA1f21V34wMXYFaiyVw0rJyzLgs3VMkxOjGtix/V0XWChZ0cI2i/dzvXdfTd0Qf91BMPrhyNzgKfOmxaWypqaDXHfAgwAtCL8XOfF47gAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-hpp { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAehJREFUeNqEUk1v00AUHK/XKf1yZdESVRBXjRSRFqMQVBA5Ic5I3DnwE/gpnLnyG3LgXglx4UDDLZS0RWkDLiRxSusk9u6GXSembmLgWZbX7+2bnZl92mg0goo3b3ffO/ncdvyfjHef6q2Dlvs8Q2ktzr16+SL60jhhZ69bO8X8ClLC7w9XdKJVG8fuM0r1WrJG4gXjgqU1D0MGc2kBTytl+7a9XmWcl1IB/hZKEhccq5aJJ/e3bTu7Wg1CVo7rNLlRhUh4oMnXoDoyhoHGyWmUe+QUbELIa7W8CjAFlMzdzeckCwFN06ATAn8QmDMMMGlMuwWucpoCHNe4jBkAMenjYvRPTyi53JvuwX8AplleAeBcRFrH6rXIxLim9I/pi3QA1RhKaYxdjkN8IwalCMIwWs9ljMkh0wzk+9M7w179C3LZNXxve2h+c3Hu91HeKmD/6zHOLnw83ilB1/V0CeqU3Q81LC/O41b2Btx2N2JVP2riR8eTUxmi0TzBwrKZMsqMoz8MsDh/DWuWhUBKURLKxQIeOMWoptYPnS1c+INZBkwISomOSsmBZS7B+3WOzZvrKGzkMAiGqNy7g+LmRkRfekBnANy2163PZXrSbrQ6vch19Xz8fPDHyL39QzkHBKedXjfu+y3AAGU37INBJto1AAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-html { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmBJREFUeNqEUktPE1EU/mY605a+hhZTBNKRDApNrWIRA4nEBUZdmCgLNi4MK5f+FNdu3bFv1J1EXODCR1JJSMTwpqUP6NiCpe10Zjz3hj5Mm3iSybl37jnf+c53jmDbNpi9eb+6Ftcisea909bWNzNb6dwzSXKkhIt/r14+515qBqmDA8HpqKagh53XaopblpIbe+knDpFAhPab2Dw0TKvRK7lmNODzePBgZlK9oUWSpmVNdpIU8T+jaMsyMaD4MDcZVa+NhJMN00w0n6V2nN3yQgdHWZag+LzYPTomIAtT0THVtPGanmb/BbjwLFkvn2IttYGYplKyDzsHh7gdmyAWfh5zVq0Guhg4RAHFUhmfvq3j134aXo8bd+ITnMFOOovU5jbGRoZwNxFn1cxuAIcDW/sZDjA/c4u+BNxOJyxqaenpI3z88gMfPn9Hv98HQZS6RazW6kjExvFi8TGdDSy/W0Emf4LS6R8sv11BmfzSwkPcm74Jo9Ei0GZgmkw8QCOao8OXcaz/5vSZnPdnp3ApqBBLkWJE0Ci7ASzbIhCLLQ1E0iOkBDh9NpUgiUejo8oNuJwyn0YPABtn51UYFFivG3yBGCNZkuDtc/MW+ZQI3OrYpBaARCKufk3B5XIiWyhiL5ODp8+FfFHH+KiKSqWKUL8fC/NznGlPBmz+24dZjKnD0CJDcMoyW0SqXuMtHBFw7rhIAD1ErNUNafxKBNevapwu65NpEQ4FqXIA+RMd6VwBP3cPSERb6gLIFIq61+UqGWaFdcrVt/lmAuWjAi2aiMFwmOYuIJ/N6M28vwIMAMoNDyg4rcU9AAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-ics { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAhRJREFUeNqEUkFPE0EU/mZ2dra7bLNpi2AxQFKalkJrohICiYkXPagXrx78Df4K48GDBzmQePLMhUODNxQ5ciEkJVqDtJGmMWrCATRbd2ecoS5u3aovmezsvu9973vfPiKlhI4XL7c2r5YL81LIELEghLA3u/udxmHnPmfGW/Wuv+LpwwdneRYBx7PeWK0wOYYhcXxyckGV1fdbnbuMsXcklqPRJQxFMKz4RxDCtVO4s3xlRjWoB0FYjlQPEEBieChwKCRGMx5uLtaKs1P5ei8IKlGa/YkXMXYtlTEDlsnw/mMXhBJcqxSK6vlcpa4PEpCooUyIqs5M6hG1o2CUwqA091cFcYLf/sjzcX75EiQIojI9779CTYR4jwTBf+r7GAwh0AxCiL6JMT/04vQ79u8aI2O/7Jzg69o6Go8ewycUahtBpADhHKLnK/eVbkMdtROWIv80NQ2sPhncA9Htwn+9hZG0rY6DzFwJl+7dhs0ZstUy8rduwPS/wd/ehmi3kwq4zTHiWUgXp+EuL8FvNvFl5Rn4xAS86iyI2kY3n0Mv48ByrOQmancdi8I0Kcj3U5iuA29xAelKCUHrEIayzltagG2E4IwkFaQgSC6lYI09iN0d8It5uNV5nG5sgJdKYC0G8WoTOZvBISFNEBxnsuzD3GX4vfDsszzqAu0jkJQDedCGbB6AWg54pYbPo+NGVPdTgAEAqQq70PytIL0AAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-iso { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjlJREFUeNp0kstrU0EUxr/k5qbJzdPYpGkpsUJoA2q1oLjTdiGiIC5cuXHlxv9BEOrStTvBnQvRrSAIsejCrlqpsURq2hCJNQ+TNLm5uc/x3MmzJh34mDNnvvnNzOE4GGOwx8+t9XQkfn0VE0Y5/7Z+kHm+dvOhtd3P9c/xwNZh7nWaMYtNUmX/Fct/vlN7/8J5aRRgyzm8xzpRDjGE2aVH4VTqdnoUYg/XkEhmy+Cx3DhA5tMzdFolvg5Mx3Fx9SmH0JIg79Zo3j4GADMIokJTKtjbfAKXU4Y/2NvSfyH75TFOxa9Cmr0XnlPFl5ReOQ6wNMDsoFX6AElqQlNV1KsOuNwS/AGFjEUIDhmn5+/DMM16/9igBowAzFKIswPJr6MjlxFP3sV04gaP7RzMPe6xvWM1gNUBM2UKYlBau3QghGphg29J3gDlLLilWNdD3gkvIIDRhD9yGe2mCV0V4HFXuCxT5Dlv8Dz3sIkAs03FalDxBMQSt9BRBMhNncuO7dyU28c9tnf8C/Q0ZtR4GImeQSj8APLRH772BWcgiFODffCv/t8H9tO0v3RjV7VqkeeXLlzDfvYjj88uXhl4JwIsrYxmLY/M1gYclIvGE9jZfNPrSCD3/QgLyeWTADV6wW9AryIcCkB0u1Aq/oCPumlufoF72vIheaLDr4wCLIOqrYnULA14PSoqpSJEAUilZrD77Sv3LK+cI0+Be8cAbbmAOrob0agtD491LYfkoqvnyZLsWRkA/gkwABL4S3L78XYyAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-java { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjxJREFUeNp8U01v00AUnNiOEyepQyhQobRBSlVIoRCBEPTAjQsSEneE+An8FM5cuXLNoQduIAE3qopKNJAIIppA2jrOR93aa6/N8yZuUxyxkrXr3ffmzczbTQRBgHC83nj3ca28dD36nx6fvnzrNNrdp4oibyUmey9fPBezEgWVFuYLdyvlPGaMY4fl1aRS+9pqP5ElAkmcnknRwuO+Nyt5u/ETYfyj9WrpZnmpxn2/Ok1Swn/GvtnH5k4TLue4kNfxoFoprRQv1TzOb8cAIu3+ZD7oD/Hm7XuxzqRUNDtdkuLiTmW5tFxceBXlnXgQTAORSMt2oGezUJJJrK9dFWdEH7Ik4dB29LiESeUEJXd7/dAT3L+1ivlCHr8NEzutXTBvbJPPSdO/AH5wysChwM/1HzCGlmAzOrKxu2eCud6Z2Jke2MwThpUXL6Nn2ZAVFTlNw70bK0iRnGAq9qwHtOmTRpsx1NsHyKRVnNPnoMoK9kc2BjbD4vk5JGV5NkBoEPM4FFnCteJFWOS4ntHEfphQyKaFTWFLw704AJ26ZFx/ZEEi3YyY0O1Dmr4EKTUHA8hUnS6siI0DEHLYog+b28RCRuNXR/iQUpPUEQ+NVht6Lodnjx+GXYgDSFRnq97Ed2pXSlXhUSeGhxYc5sKlNXM5DGLR2TMwfZVPAIi+otGNWy1fEZUKeo4qc4ysI+F8VksLIJfYcD9QYgB/DNPMptWBlsnBIS86xmDMTBo/PWd0LB6VZfdEbJT3V4ABAA5HIzlv9dtdAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-jpeg, +.ipfs-jpg { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU8luUlEY/s4dmMpkWxRopGJNNbiwhk1tItbGtXHr0hcwmvgOdWld6Bu4coXumtREE3ZKu8FgOlC1kIoXtC3jPfdc/8PUIpzkBM7wf+f/hsts24YczuerGUc0moBlYTAYA+i8sbdXtAzjITRtq39kr73s/Gr9DTUYPOeamwvYnHdrdR0SnDebuCbswJGqpX+Uf92Hqm7hzFAG/4TgNr1uCwEJ0trcBC8U0Kb1/PQkHt9JxSLnL6TB+Y2zAIMOJBGLXmtsbEAYBsx8HnqCGKVScAX8uHf5EpqmGXv18VO6VDEe0PXsKABN8+AAgiabmYFNNJTDQ2RUFc8+Z9G0OPR4PKYwvKari0MAgiY/OQGCAajhMNR4nDZMaInrKBGl70SPMScck1NQG3X/CAWLE3/dAWV5hRRVIJxOWNksrP19sFgMqqAebUGYHMI6teq0A9oTVAhqu2sfbYYjsL7lCZ3683gA70T3TK7/B4BNoO020GwB9TpwfAz8LgMtWn/NkV8EHgoB81c7nYwCyBZlEVkHcqMTKFnkmehJTOPvEfCnKi0fAyADJKfXC/h83TaZTJjaa5lANLpOFqAXtlEAorAwO9u5syT5UxLfU0e3o1FMu1x4u7ODYq02BKAMAVSrSNLrK1MhLPj8mNF0vFm+C1ZvwKBwXXE4AGn1WAASazESwUW3BzUSMeJ2o1Aq4sPurvQYSRLwlhRR6mSaYyi0WlpAJrFRx3ouh5/lMt5lv8BLwXp0M4lSpYL17e2uK5wP6lj/c2ZPn2RI+YT8fDvqoyegVLyfG5kBKaQQOfvF2pLc+ifAABiQH3PEc1i/AAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-js { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RUQ5ODY5Q0NGMTE4MTFFMTlDRjlDN0VBQTY3QTk0MTEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RUQ5ODY5Q0RGMTE4MTFFMTlDRjlDN0VBQTY3QTk0MTEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRDk4NjlDQUYxMTgxMUUxOUNGOUM3RUFBNjdBOTQxMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFRDk4NjlDQkYxMTgxMUUxOUNGOUM3RUFBNjdBOTQxMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoT8zQ8AAAJdSURBVHjadFNbTxNREP52t7S0bktbKFAvTUVaw60YqkExUTD6oD74qC/yD/wp/gh885XEEI0RAyYQUiMpIBGMkYR6o23abi+73e2uc04v1LROMtnZPTPffvPNHMGyLDB7sbJ2ciUSli3U35smkK9t7x9v7n2dD/g8KUkUwWqeP3vKz23NxJGzgwOx0RC6mSgIo+WKuvP56MeUzy2nJEk8PWsGJVVTuhWbpgmHw47FB7d98Wg4mVWK52o1sxOg3Va3PmFp+Q2PdUquaFUM9/vw+O6cP3bxwm46Xwh1ALR3/vL1e+hGjcc9koScUsTSq3coVDQsXJ3wzo5HEs3clgZNMTVdx1T0Ep7cn6//QRQwMhzA6uZHLD5cIFEFSKIU+G8LK+tb0KsGZKcTJoEyP08AbpcLy6sbPKdQrigdAGaDwWxsDH1uGbliCYIgcM8WFPg8Mq5Pjzdyu4jYbCE44EepXMHuwXe+A8x3KKYxYsjvbUzmlPGpBmYdgI1oYjSMbL4Ao1YXMkcM2Dd2xnbAamPQAqg1GORLZdycmYTdJqFKk2DPR3fmwI4zBDrg9RADqxPAbPBif2WTSB584/3/TGegEOit+DRcvQ4OZJi1LgwIQKVCg2i6nb1I7H3Br3QWqT9pBAP9uDY5xjdSM3RqxeoUkfVnEOW8UkLykERTNXjkM7h3Iw6NNvHw6JjuhAhVrba0+QeALozcI9nQR0VvNxJc/ZmxCNGvIBQcpDG6udA22kyW29HC72wu8yG579ZoiSYuR/ly2+y9CA4NceWLmo717T1i5ULqJNtapL8CDACskxPFZRxLwQAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-key { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlZJREFUeNpsU11PE0EUPbM7u/2AtJUWU6qiiSYYo5EmmPDCD9AH46sx8cEnja/+CB989z+Y+MKPgMiDsYQACcbaWBBogYD92t2Zud7ZlQZsbzKZ3bl3zj3n3IwgItjYeDO3MlWme0bjUth8e8/fO2tHzx3XqUEk50uft+Ndnhdmc3SlfNPkVZT8Cy600DoIISvVfKYtlvfX1p66XmoIYsMZdjJQWvEFbbsC/S5g2QhSkKUK7rx6OzvzqLpsovAhaAxA3DUBQn2TUFsl7KwTfm4Z9DoO5LW7uPXi9Wxpfn7ZKF09vyPxX2iWcNRkKGZz0mQWKoNs8AVB6x1yRY2pYnc2LLofuXTxMgAlmlXIfngCxNxEzM+DPv6NQa2BygLgZyX6JT83ngHTN5GAL0WSoUQkSQnXkyBh/k0GegTAaldM20sTKvet+yyhIZApECamL0jUSe3oFChx3TopM4TeEQP2gc6BgGIwb4KGNXRhCkMGxgg2kJeybRiZM45D8W61qEAknSmpHStBhywu0nFVupSCTAcM4ECwqapv+NQ6LS9JGALoMIIoPYDjZiEL1xHtbyO39AQUDaA7R1AH23DSeSA4hv5RG/VAhxomPYP8sw9A4TaC9iHkjUWmrtGvbyC18BLe3GP0m3WW4I5hEBEnPIStXzyuFIxb4EkMEJ79Qa/xHbKxCdM7xeCwzUZOjgEwnuzt7qLz6T3cySmQP43uzjeIiTJM6io6W19B/NLCKMVGCzkCoLR/0lrfOI2fNy/huKC1FTsK/rbGNeMRC8dHpHByfu+vAAMAL/0jvAVZQl0AAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-less { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjZERjZENTJGMTE4MTFFMUIwOEVERjQ5MTZEMkVBREUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjZERjZENTNGMTE4MTFFMUIwOEVERjQ5MTZEMkVBREUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGNkRGNkQ1MEYxMTgxMUUxQjA4RURGNDkxNkQyRUFERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGNkRGNkQ1MUYxMTgxMUUxQjA4RURGNDkxNkQyRUFERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pl1w97IAAAJhSURBVHjahJNLbxJRFMf/wPAIMIxMkUI7tS0VYqlGDLGhjdKkqyZ24cJFN925de+XcONHaHRj4k7TND6SGo1VWwmp2kSLhlqMDbQ87gzPYcY7k4GgoJ6bmdw598zvnvM/95pUVYVma+svcovx8yMnFZHAMJPJBJfDzq5vpX6+/vD5qo/z7DOMBdo/d26t6jFMJ3iY51jBz4M+LP6wxEw40Gy23qYzB3HO7fpmpZCOmfEfa7Xb4NxOrC4lvbPToe2yKE3K1PdPwNOtHdx79ESfq4qKkijB5/XgevIyHxEC24USmewDqD2ABxubaLRkfW6zMqjWGlh7/ByyAtxYnOPnL0Q2+gGGmKRaw8zUBJaTiS5QOO1FJnuIAM8hciaIWHgi8NcSNt+loVDY8JBXh2ojJAR1HbTSNFMUpV8Dxcjg0nSYBrtBxdLbqI1iheCUh9XXNGurAwCdEkb9QyBSFam9TDfoPZ1LUg1BH28IiwEARTVAQOzcFKRaHZpLoa9avY6L1Gfs0c32t4PU6W2lWsV8LAorw0Cs1nXftYWE3qZGqwWHzYp2zzlgetuolVFvtiDLbRRKFTAWCxx2G/KlMtXFhWPqOzsWHJwBx7rxKv2R7mwFz3lw9/5DLC/M4Us2RwV0g3U58XJnF7dvrsBOoX0Abbej/DFKRMKI30fTVGC32WA2m5H9cQQvhYi0vE/7Wdgczn6ARA9QPBrBszcp/XvpyqxebzQ0Tlsq6llxLhe9bD4cFMr9XdjLHpLv+SLGBYHAYiVu1kNOpAaRTWbCejgiw0zGhFGSK1aw+zXbvfK/BBgAPwADAs5GpGsAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-logo { + background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 553 235.3'%3E%3Cdefs%3E%3C/defs%3E%3Cpath fill='%23ffffff' d='M239 63h17.8v105H239V63zm35.6 0h36.3c7.9 0 14.5.9 19.6 2.6s9.2 4.1 12.1 7.1a24.45 24.45 0 0 1 6.2 10.2 40.75 40.75 0 0 1 1.8 12.1 45.69 45.69 0 0 1-1.8 12.9 26.58 26.58 0 0 1-6.2 10.8 30.59 30.59 0 0 1-12.1 7.3c-5.1 1.8-11.5 2.7-19.3 2.7h-19.1V168h-17.5V63zm36.2 51a38.37 38.37 0 0 0 11.1-1.3 16.3 16.3 0 0 0 6.8-3.7 13.34 13.34 0 0 0 3.5-5.8 29.75 29.75 0 0 0 1-7.6 25.68 25.68 0 0 0-1-7.7 12 12 0 0 0-3.6-5.5 17.15 17.15 0 0 0-6.9-3.4 41.58 41.58 0 0 0-10.9-1.2h-18.5V114h18.5zm119.9-51v15.3h-49.2V108h46.3v15.4h-46.3V168h-17.8V63h67zm26.2 72.9c.8 6.9 3.3 11.9 7.4 15s10.4 4.7 18.6 4.7a32.61 32.61 0 0 0 10.1-1.3 20.52 20.52 0 0 0 6.6-3.5 12 12 0 0 0 3.5-5.2 19.08 19.08 0 0 0 1-6.4 16.14 16.14 0 0 0-.7-4.9 12.87 12.87 0 0 0-2.6-4.5 16.59 16.59 0 0 0-5.1-3.6 35 35 0 0 0-8.2-2.4l-13.4-2.5a89.76 89.76 0 0 1-14.1-3.7 33.51 33.51 0 0 1-10.4-5.8 22.28 22.28 0 0 1-6.3-8.8 34.1 34.1 0 0 1-2.1-12.7 26 26 0 0 1 11.3-22.4 36.35 36.35 0 0 1 12.6-5.6 65.89 65.89 0 0 1 15.8-1.8c7.2 0 13.3.8 18.2 2.5a34.46 34.46 0 0 1 11.9 6.5 28.21 28.21 0 0 1 6.9 9.3 42.1 42.1 0 0 1 3.2 11l-16.8 2.6c-1.4-5.9-3.7-10.2-7.1-13.1s-8.7-4.3-16.1-4.3a43.9 43.9 0 0 0-10.5 1.1 19.47 19.47 0 0 0-6.8 3.1 11.63 11.63 0 0 0-3.7 4.6 14.08 14.08 0 0 0-1.1 5.4c0 4.6 1.2 8 3.7 10.3s6.9 4 13.2 5.3l14.5 2.8c11.1 2.1 19.2 5.6 24.4 10.5s7.8 12.1 7.8 21.4a31.37 31.37 0 0 1-2.4 12.3 25.27 25.27 0 0 1-7.4 9.8 36.58 36.58 0 0 1-12.4 6.6 56 56 0 0 1-17.3 2.4c-13.4 0-24-2.8-31.6-8.5s-11.9-14.4-12.6-26.2h18z'/%3E%3Cpath fill='%23469ea2' d='M30.3 164l84 48.5 84-48.5V67l-84-48.5-84 48.5v97z'/%3E%3Cpath fill='%236acad1' d='M105.7 30.1l-61 35.2a18.19 18.19 0 0 1 0 3.3l60.9 35.2a14.55 14.55 0 0 1 17.3 0l60.9-35.2a18.19 18.19 0 0 1 0-3.3L123 30.1a14.55 14.55 0 0 1-17.3 0zm84 48.2l-61 35.6a14.73 14.73 0 0 1-8.6 15l.1 70a15.57 15.57 0 0 1 2.8 1.6l60.9-35.2a14.73 14.73 0 0 1 8.6-15V79.9a20 20 0 0 1-2.8-1.6zm-150.8.4a15.57 15.57 0 0 1-2.8 1.6v70.4a14.38 14.38 0 0 1 8.6 15l60.9 35.2a15.57 15.57 0 0 1 2.8-1.6v-70.4a14.38 14.38 0 0 1-8.6-15L38.9 78.7z'/%3E%3Cpath fill='%23469ea2' d='M114.3 29l75.1 43.4v86.7l-75.1 43.4-75.1-43.4V72.3L114.3 29m0-10.3l-84 48.5v97l84 48.5 84-48.5v-97l-84-48.5z'/%3E%3Cpath fill='%23469ea2' d='M114.9 132h-1.2A15.66 15.66 0 0 1 98 116.3v-1.2a15.66 15.66 0 0 1 15.7-15.7h1.2a15.66 15.66 0 0 1 15.7 15.7v1.2a15.66 15.66 0 0 1-15.7 15.7zm0 64.5h-1.2a15.65 15.65 0 0 0-13.7 8l14.3 8.2 14.3-8.2a15.65 15.65 0 0 0-13.7-8zm83.5-48.5h-.6a15.66 15.66 0 0 0-15.7 15.7v1.2a15.13 15.13 0 0 0 2 7.6l14.3-8.3V148zm-14.3-89a15.4 15.4 0 0 0-2 7.6v1.2a15.66 15.66 0 0 0 15.7 15.7h.6V67.2L184.1 59zm-69.8-40.3L100 26.9a15.73 15.73 0 0 0 13.7 8.1h1.2a15.65 15.65 0 0 0 13.7-8l-14.3-8.3zM44.6 58.9l-14.3 8.3v16.3h.6a15.66 15.66 0 0 0 15.7-15.7v-1.2a16.63 16.63 0 0 0-2-7.7zM30.9 148h-.6v16.2l14.3 8.3a15.4 15.4 0 0 0 2-7.6v-1.2A15.66 15.66 0 0 0 30.9 148z'/%3E%3Cpath fill='%23083b54' fill-opacity='0.15' d='M114.3 213.2v-97.1l-84-48.5v97.1z'/%3E%3Cpath fill='%23083b54' fill-opacity='0.05' d='M198.4 163.8v-97l-84 48.5v97.1z'/%3E%3C/svg%3E%0A"); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-mid { + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-mkv { + background-image:url("data:image/svg+xml;charset=utf8,%3Csvg id='Layer_2' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72 100'%3E%3Cstyle/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='36.2' y1='101' x2='36.2' y2='3.005' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='0' stop-color='%23e2cde4'/%3E%3Cstop offset='.17' stop-color='%23e0cae2'/%3E%3Cstop offset='.313' stop-color='%23dbc0dd'/%3E%3Cstop offset='.447' stop-color='%23d2b1d4'/%3E%3Cstop offset='.575' stop-color='%23c79dc7'/%3E%3Cstop offset='.698' stop-color='%23ba84b9'/%3E%3Cstop offset='.819' stop-color='%23ab68a9'/%3E%3Cstop offset='.934' stop-color='%239c4598'/%3E%3Cstop offset='1' stop-color='%23932a8e'/%3E%3C/linearGradient%3E%3Cpath d='M45.2 1l27 26.7V99H.2V1h45z' fill='url(%23SVGID_1_)'/%3E%3Cpath d='M45.2 1l27 26.7V99H.2V1h45z' fill-opacity='0' stroke='%23882383' stroke-width='2'/%3E%3Cpath d='M7.5 91.1V71.2h6.1l3.6 13.5 3.6-13.5h6.1V91h-3.8V75.4l-4 15.6h-3.9l-4-15.6V91H7.5zm23.5 0V71.2h4V80l8.2-8.8h5.4L41.1 79l8 12.1h-5.2l-5.5-9.3-3.4 3.3v6h-4zm25.2 0L49 71.3h4.4L58.5 86l4.9-14.7h4.3l-7.2 19.8h-4.3z' fill='%23fff'/%3E%3ClinearGradient id='SVGID_2_' gradientUnits='userSpaceOnUse' x1='18.2' y1='50.023' x2='18.2' y2='50.023' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='.005' stop-color='%23963491'/%3E%3Cstop offset='1' stop-color='%2370136b'/%3E%3C/linearGradient%3E%3ClinearGradient id='SVGID_3_' gradientUnits='userSpaceOnUse' x1='11.511' y1='51.716' x2='65.211' y2='51.716' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='.005' stop-color='%23963491'/%3E%3Cstop offset='1' stop-color='%2370136b'/%3E%3C/linearGradient%3E%3Cpath d='M64.3 55.5c-1.7-.2-3.4-.3-5.1-.3-7.3-.1-13.3 1.6-18.8 3.7S29.6 63.6 23.3 64c-3.4.2-7.3-.6-8.5-2.4-.8-1.3-.8-3.5-1-5.7-.6-5.7-1.6-11.7-2.4-17.3.8-.9 2.1-1.3 3.4-1.7.4 1.1.2 2.7.6 3.8 7.1.7 13.6-.4 20-1.5 6.3-1.1 12.4-2.2 19.4-2.6 3.4-.2 6.9-.2 10.3 0m-9.9 15.3c.5-.2 1.1-.3 1.9-.2.2-3.7.3-7.3.3-11.2-6.2.2-11.9.9-17 2.2.2 4 .4 7.8.3 12 4-1.1 7.7-2.5 12.6-2.7m2-12.1h1.1c.4-.4.2-1.2.2-1.9-1.5-.6-1.8 1-1.3 1.9zm3.9-.2h1.5V38h-1.3c0 .7-.4.9-.2 1.7zm4 0c.5-.1.8 0 1.1.2.4-.3.2-1.2.2-1.9h-1.3v1.7zm-11.5.3h.9c.4-.3.2-1.2.2-1.9-1.4-.4-1.6 1.2-1.1 1.9zm-4 .4c.7.2.8-.3 1.5-.2v-1.7c-1.5-.4-1.7.6-1.5 1.9zm-3.6-1.1c0 .6-.1 1.4.2 1.7.5.1.5-.4 1.1-.2-.2-.6.5-2-.4-1.9-.1.4-.8.1-.9.4zm-31.5.8c.4-.1 1.1.6 1.3 0-.5 0-.1-.8-.2-1.1-.7.2-1.3.3-1.1 1.1zm28.3-.4c-.3.3.2 1.1 0 1.9.6.2.6-.3 1.1-.2-.2-.6.5-2-.4-1.9-.1.3-.4.2-.7.2zm-3.5 2.8c.5-.1.9-.2 1.3-.4.2-.8-.4-.9-.2-1.7h-.9c-.3.3-.1 1.3-.2 2.1zm26.9-1.8c-2.1-.1-3.3-.2-5.5-.2-.5 3.4 0 7.8-.5 11.2 2.4 0 3.6.1 5.8.3M33.4 41.6c.5.2.1 1.2.2 1.7.5-.1 1.1-.2 1.5-.4.6-1.9-.9-2.4-1.7-1.3zm-4.7.6v1.9c.9.2 1.2-.2 1.9-.2-.1-.7.2-1.7-.2-2.1-.5.2-1.3.1-1.7.4zm-5.3.6c.3.5 0 1.6.4 2.1.7.1.8-.4 1.5-.2-.1-.7-.3-1.2-.2-2.1-.8-.2-.9.3-1.7.2zm-7.5 2H17c.2-.9-.4-1.2-.2-2.1-.4.1-1.2-.3-1.3.2.6.2-.1 1.7.4 1.9zm3.4 1c.1 4.1.9 9.3 1.4 13.7 8 .1 13.1-2.7 19.2-4.5-.5-3.9.1-8.7-.7-12.2-6.2 1.6-12.1 3.2-19.9 3zm.5-.8h1.1c.4-.5-.2-1.2 0-2.1h-1.5c.1.7.1 1.6.4 2.1zm-5.4 7.8c.2 0 .3.2.4.4-.4-.7-.7.5-.2.6.1-.2 0-.4.2-.4.3.5-.8.7-.2.8.7-.5 1.3-1.2 2.4-1.5-.1 1.5.4 2.4.4 3.8-.7.5-1.7.7-1.9 1.7 1.2.7 2.5 1.2 4.2 1.3-.7-4.9-1.1-8.8-1.6-13.7-2.2.3-4-.8-5.1-.9.9.8.6 2.5.8 3.6 0-.2 0-.4.2-.4-.1.7.1 1.7-.2 2.1.7.3.5-.2.4.9m44.6 3.2h1.1c.3-.3.2-1.1.2-1.7h-1.3v1.7zm-4-1.4v1.3c.4.4.7-.2 1.5 0v-1.5c-.6 0-1.2 0-1.5.2zm7.6 1.4h1.3v-1.5h-1.3c.1.5 0 1 0 1.5zm-11-1v1.3h1.1c.3-.3.4-1.7-.2-1.7-.1.4-.8.1-.9.4zm-3.6.4c.1.6-.3 1.7.4 1.7 0-.3.5-.2.9-.2-.2-.5.4-1.8-.4-1.7-.1.3-.6.2-.9.2zm-3.4 1v1.5c.7.2.6-.4 1.3-.2-.2-.5.4-1.8-.4-1.7-.1.3-.8.2-.9.4zM15 57c.7-.5 1.3-1.7.2-2.3-.7.4-.8 1.6-.2 2.3zm26.1-1.3c-.1.7.4.8.2 1.5.9 0 1.2-.6 1.1-1.7-.4-.5-.8.1-1.3.2zm-3 2.7c1 0 1.2-.8 1.1-1.9h-.9c-.3.4-.1 1.3-.2 1.9zm-3.6-.4v1.7c.6-.1 1.3-.2 1.5-.8-.6 0 .3-1.6-.6-1.3 0 .4-.7.1-.9.4zM16 60.8c-.4-.7-.2-2-1.3-1.9.2.7.2 2.7 1.3 1.9zm13.8-.9c.5 0 .1.9.2 1.3.8.1 1.2-.2 1.7-.4v-1.7c-.9-.1-1.6.1-1.9.8zm-4.7.6c0 .8-.1 1.7.4 1.9 0-.5.8-.1 1.1-.2.3-.3-.2-1.1 0-1.9-.7-.2-1 .1-1.5.2zM19 62.3v-1.7c-.5 0-.6-.4-1.3-.2-.1 1.1 0 2.1 1.3 1.9zm2.5.2h1.3c.2-.9-.3-1.1-.2-1.9h-1.3c-.1.9.2 1.2.2 1.9z' fill='url(%23SVGID_3_)'/%3E%3ClinearGradient id='SVGID_4_' gradientUnits='userSpaceOnUse' x1='45.269' y1='74.206' x2='58.769' y2='87.706' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='0' stop-color='%23f9eff6'/%3E%3Cstop offset='.378' stop-color='%23f8edf5'/%3E%3Cstop offset='.515' stop-color='%23f3e6f1'/%3E%3Cstop offset='.612' stop-color='%23ecdbeb'/%3E%3Cstop offset='.69' stop-color='%23e3cce2'/%3E%3Cstop offset='.757' stop-color='%23d7b8d7'/%3E%3Cstop offset='.817' stop-color='%23caa1c9'/%3E%3Cstop offset='.871' stop-color='%23bc88bb'/%3E%3Cstop offset='.921' stop-color='%23ae6cab'/%3E%3Cstop offset='.965' stop-color='%239f4d9b'/%3E%3Cstop offset='1' stop-color='%23932a8e'/%3E%3C/linearGradient%3E%3Cpath d='M45.2 1l27 26.7h-27V1z' fill='url(%23SVGID_4_)'/%3E%3Cpath d='M45.2 1l27 26.7h-27V1z' fill-opacity='0' stroke='%23882383' stroke-width='2' stroke-linejoin='bevel'/%3E%3C/svg%3E"); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-mov { + background-image:url("data:image/svg+xml;charset=utf8,%3Csvg id='Layer_2' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72 100'%3E%3Cstyle/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='36.2' y1='101' x2='36.2' y2='3.005' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='0' stop-color='%23e2cde4'/%3E%3Cstop offset='.17' stop-color='%23e0cae2'/%3E%3Cstop offset='.313' stop-color='%23dbc0dd'/%3E%3Cstop offset='.447' stop-color='%23d2b1d4'/%3E%3Cstop offset='.575' stop-color='%23c79dc7'/%3E%3Cstop offset='.698' stop-color='%23ba84b9'/%3E%3Cstop offset='.819' stop-color='%23ab68a9'/%3E%3Cstop offset='.934' stop-color='%239c4598'/%3E%3Cstop offset='1' stop-color='%23932a8e'/%3E%3C/linearGradient%3E%3Cpath d='M45.2 1l27 26.7V99H.2V1h45z' fill='url(%23SVGID_1_)'/%3E%3Cpath d='M45.2 1l27 26.7V99H.2V1h45z' fill-opacity='0' stroke='%23882383' stroke-width='2'/%3E%3Cpath d='M6.1 91.1V71.2h6.1l3.6 13.5 3.6-13.5h6.1V91h-3.8V75.4l-4 15.6h-3.9l-4-15.6V91H6.1zm22.6-9.8c0-2 .3-3.7.9-5.1.5-1 1.1-1.9 1.9-2.7.8-.8 1.7-1.4 2.6-1.8 1.2-.5 2.7-.8 4.3-.8 3 0 5.3.9 7.1 2.7 1.8 1.8 2.7 4.3 2.7 7.6 0 3.2-.9 5.7-2.6 7.5-1.8 1.8-4.1 2.7-7.1 2.7s-5.4-.9-7.1-2.7c-1.8-1.8-2.7-4.3-2.7-7.4zm4.1-.2c0 2.2.5 4 1.6 5.1 1 1.2 2.4 1.7 4 1.7s2.9-.6 4-1.7c1-1.2 1.6-2.9 1.6-5.2 0-2.3-.5-4-1.5-5.1-1-1.1-2.3-1.7-4-1.7s-3 .6-4 1.7c-1.1 1.2-1.7 3-1.7 5.2zm23.6 10l-7.2-19.8h4.4L58.7 86l4.9-14.7h4.3l-7.2 19.8h-4.3z' fill='%23fff'/%3E%3ClinearGradient id='SVGID_2_' gradientUnits='userSpaceOnUse' x1='18.2' y1='50.023' x2='18.2' y2='50.023' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='.005' stop-color='%23963491'/%3E%3Cstop offset='1' stop-color='%2370136b'/%3E%3C/linearGradient%3E%3ClinearGradient id='SVGID_3_' gradientUnits='userSpaceOnUse' x1='11.511' y1='51.716' x2='65.211' y2='51.716' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='.005' stop-color='%23963491'/%3E%3Cstop offset='1' stop-color='%2370136b'/%3E%3C/linearGradient%3E%3Cpath d='M64.3 55.5c-1.7-.2-3.4-.3-5.1-.3-7.3-.1-13.3 1.6-18.8 3.7S29.6 63.6 23.3 64c-3.4.2-7.3-.6-8.5-2.4-.8-1.3-.8-3.5-1-5.7-.6-5.7-1.6-11.7-2.4-17.3.8-.9 2.1-1.3 3.4-1.7.4 1.1.2 2.7.6 3.8 7.1.7 13.6-.4 20-1.5 6.3-1.1 12.4-2.2 19.4-2.6 3.4-.2 6.9-.2 10.3 0m-9.9 15.3c.5-.2 1.1-.3 1.9-.2.2-3.7.3-7.3.3-11.2-6.2.2-11.9.9-17 2.2.2 4 .4 7.8.3 12 4-1.1 7.7-2.5 12.6-2.7m2-12.1h1.1c.4-.4.2-1.2.2-1.9-1.5-.6-1.8 1-1.3 1.9zm3.9-.2h1.5V38h-1.3c0 .7-.4.9-.2 1.7zm4 0c.5-.1.8 0 1.1.2.4-.3.2-1.2.2-1.9h-1.3v1.7zm-11.5.3h.9c.4-.3.2-1.2.2-1.9-1.4-.4-1.6 1.2-1.1 1.9zm-4 .4c.7.2.8-.3 1.5-.2v-1.7c-1.5-.4-1.7.6-1.5 1.9zm-3.6-1.1c0 .6-.1 1.4.2 1.7.5.1.5-.4 1.1-.2-.2-.6.5-2-.4-1.9-.1.4-.8.1-.9.4zm-31.5.8c.4-.1 1.1.6 1.3 0-.5 0-.1-.8-.2-1.1-.7.2-1.3.3-1.1 1.1zm28.3-.4c-.3.3.2 1.1 0 1.9.6.2.6-.3 1.1-.2-.2-.6.5-2-.4-1.9-.1.3-.4.2-.7.2zm-3.5 2.8c.5-.1.9-.2 1.3-.4.2-.8-.4-.9-.2-1.7h-.9c-.3.3-.1 1.3-.2 2.1zm26.9-1.8c-2.1-.1-3.3-.2-5.5-.2-.5 3.4 0 7.8-.5 11.2 2.4 0 3.6.1 5.8.3M33.4 41.6c.5.2.1 1.2.2 1.7.5-.1 1.1-.2 1.5-.4.6-1.9-.9-2.4-1.7-1.3zm-4.7.6v1.9c.9.2 1.2-.2 1.9-.2-.1-.7.2-1.7-.2-2.1-.5.2-1.3.1-1.7.4zm-5.3.6c.3.5 0 1.6.4 2.1.7.1.8-.4 1.5-.2-.1-.7-.3-1.2-.2-2.1-.8-.2-.9.3-1.7.2zm-7.5 2H17c.2-.9-.4-1.2-.2-2.1-.4.1-1.2-.3-1.3.2.6.2-.1 1.7.4 1.9zm3.4 1c.1 4.1.9 9.3 1.4 13.7 8 .1 13.1-2.7 19.2-4.5-.5-3.9.1-8.7-.7-12.2-6.2 1.6-12.1 3.2-19.9 3zm.5-.8h1.1c.4-.5-.2-1.2 0-2.1h-1.5c.1.7.1 1.6.4 2.1zm-5.4 7.8c.2 0 .3.2.4.4-.4-.7-.7.5-.2.6.1-.2 0-.4.2-.4.3.5-.8.7-.2.8.7-.5 1.3-1.2 2.4-1.5-.1 1.5.4 2.4.4 3.8-.7.5-1.7.7-1.9 1.7 1.2.7 2.5 1.2 4.2 1.3-.7-4.9-1.1-8.8-1.6-13.7-2.2.3-4-.8-5.1-.9.9.8.6 2.5.8 3.6 0-.2 0-.4.2-.4-.1.7.1 1.7-.2 2.1.7.3.5-.2.4.9m44.6 3.2h1.1c.3-.3.2-1.1.2-1.7h-1.3v1.7zm-4-1.4v1.3c.4.4.7-.2 1.5 0v-1.5c-.6 0-1.2 0-1.5.2zm7.6 1.4h1.3v-1.5h-1.3c.1.5 0 1 0 1.5zm-11-1v1.3h1.1c.3-.3.4-1.7-.2-1.7-.1.4-.8.1-.9.4zm-3.6.4c.1.6-.3 1.7.4 1.7 0-.3.5-.2.9-.2-.2-.5.4-1.8-.4-1.7-.1.3-.6.2-.9.2zm-3.4 1v1.5c.7.2.6-.4 1.3-.2-.2-.5.4-1.8-.4-1.7-.1.3-.8.2-.9.4zM15 57c.7-.5 1.3-1.7.2-2.3-.7.4-.8 1.6-.2 2.3zm26.1-1.3c-.1.7.4.8.2 1.5.9 0 1.2-.6 1.1-1.7-.4-.5-.8.1-1.3.2zm-3 2.7c1 0 1.2-.8 1.1-1.9h-.9c-.3.4-.1 1.3-.2 1.9zm-3.6-.4v1.7c.6-.1 1.3-.2 1.5-.8-.6 0 .3-1.6-.6-1.3 0 .4-.7.1-.9.4zM16 60.8c-.4-.7-.2-2-1.3-1.9.2.7.2 2.7 1.3 1.9zm13.8-.9c.5 0 .1.9.2 1.3.8.1 1.2-.2 1.7-.4v-1.7c-.9-.1-1.6.1-1.9.8zm-4.7.6c0 .8-.1 1.7.4 1.9 0-.5.8-.1 1.1-.2.3-.3-.2-1.1 0-1.9-.7-.2-1 .1-1.5.2zM19 62.3v-1.7c-.5 0-.6-.4-1.3-.2-.1 1.1 0 2.1 1.3 1.9zm2.5.2h1.3c.2-.9-.3-1.1-.2-1.9h-1.3c-.1.9.2 1.2.2 1.9z' fill='url(%23SVGID_3_)'/%3E%3ClinearGradient id='SVGID_4_' gradientUnits='userSpaceOnUse' x1='45.269' y1='74.206' x2='58.769' y2='87.706' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='0' stop-color='%23f9eff6'/%3E%3Cstop offset='.378' stop-color='%23f8edf5'/%3E%3Cstop offset='.515' stop-color='%23f3e6f1'/%3E%3Cstop offset='.612' stop-color='%23ecdbeb'/%3E%3Cstop offset='.69' stop-color='%23e3cce2'/%3E%3Cstop offset='.757' stop-color='%23d7b8d7'/%3E%3Cstop offset='.817' stop-color='%23caa1c9'/%3E%3Cstop offset='.871' stop-color='%23bc88bb'/%3E%3Cstop offset='.921' stop-color='%23ae6cab'/%3E%3Cstop offset='.965' stop-color='%239f4d9b'/%3E%3Cstop offset='1' stop-color='%23932a8e'/%3E%3C/linearGradient%3E%3Cpath d='M45.2 1l27 26.7h-27V1z' fill='url(%23SVGID_4_)'/%3E%3Cpath d='M45.2 1l27 26.7h-27V1z' fill-opacity='0' stroke='%23882383' stroke-width='2' stroke-linejoin='bevel'/%3E%3C/svg%3E"); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-mp3 { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNp0U89PE0EU/ra7XWxpSsFYIbVQf9REFBHkYBRIPJh4wrN3DsZ4MPGP8b/wUCIHEw5EY0w04o9ILcREGmwVgaXbbXdnd2bXNxPahGyczebtzrz3ve99740WRRHkWn5cebu4cH6SMY7e0jRAHr9c3WxsVvcemmbys9yT6+uHJ8oaPefypdPDD5Ymh5w26wMkEho8JtDtuEOZFCrvN/4uJZNGH0T59D58X/C27aFNAL3Xthmsww5GCyN4+uzu+OLtQsUPxPQx6ZMAoQjBAw7O+bEVCMMQgqygs+LFs1h+dGd8bna0QmXO9OL6JYgwAvOFZKKoy3V44CgNfv7Yx8oLH+lUEgvzF8Ydhz+n41snAGRG5gUEwClzhHdvttFxfNyYK0EnJozKK5eGcf1qHo1GOxtjwI+pfvm4g/W1qtJgerYE2SXJSIL9+W0jk0mCShAxDXgQKgbNXxZq35vQKCiKQkSUXdc1+gcch1FHGPmKuIgBCdc66qJQHMG9+1NIpUylxxHtuW6gEiTIu+N4yjdWgty0yTmdNjFzcwKjY0MU7MLt+IjoSad16FoIx3b/A0DZ7FYXnsdpAjUMDOjI5zPgfoBsRodhhGhZHfBBU/nGAGRtxWIOg5lT2NtrI5dL0SB5KJzLodloqXaOEatPGztKq5gG3S5DNjuAK5NjKJfPYKI0okBkSdemCiSgS/rkQNLSePtxBj4LSCwfFtE0krqqX7ZVMnu9XlMXy2l7ME0dzA3iANQyY6vWxC61UY41zTyNcYh6/QCNXQvzi5dR39nHVq1BUyuMGAARsF6tbbe4iKD1r7Om5iFBdmW1SsDflLiuB6sX90+AAQDHAW7dW0YnzgAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-mp4 { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnBJREFUeNpsk99r01AUx79psrTrujVtbceabnZs4DYRHSoMh6Dgq77rn+AfoA/+If4Bok+C0CfxVRDBh+I2NqZzrpS1DVvbtU3SJPcm8SSlsJlecsn9dT73nO85V/B9H0H78OLdt/LDlQ1uMYybIAgI9n99OWxoe83nkiz9hDDae330JvxL48O51Xxm/enNtKPbVwAh0Ec6kYpXat9Pnl2GBC02HrjM5Y7h4P8+7FtIFVJ49OrxUnl7ucIdfhv+BIDv+fBcj7p/tXMPrs2RXVTw4OX2UnFTrXCbbY7tpMsA13FDSDAOQ4gJEGUJLs0PPh9CkESsPrmxxEz2lra3rnpAt3G6adgdQhBpmeLkFodNmsjpOPoXBrQTDcmFFNS7i3MRDzzPCw/vva8ikU+COQxm14BBhvJcHLGpGPTOAJxxeLbrRgAkYujBdH4G5oWJWXUW19YL4XqunAMFhnq1BqWYgaY1MAHASQOiU96zKzkU76mwehaOvx6h9uMv7KFN3RopL4oTAI4HRh4wSl399xla+00YbR3yrIzM9SzSqgJJnoKcklGrH08CcJjnBtLLCsSEGGpSWJvHtDKNoFippsJ0ulIsDDUCCATMlBQkNuahEyiZTcLsmFBKaQxaOk53TlHeKkM70AjAooCghBOk9sKtIvqtPqS4FBaRnJSRX8tj2DOh3lFB5Qw2ZNFK5LRo6w4sKt2ggAzywidAMN/9uIPSZglBLDO5FF3mRD3wHE9qVRvoHrUpfn+UEQK0/7ShtwboHJ6jdH8RZxSC57hSVETb7e5/2u0FxqPHJow+8iZ4lYY2QGu3idhIxO7Y7p8AAwALCGZKEPBGCgAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-mpg { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNpsU0tPE1EU/ubRdlqmnUBboa0UeUQDiUGCC1+JmrhxoXt/gBvXJi74If4AV0Y3sNKF0YUaICqoIfjgVShEiGF4tDOdO/fOeOaSKtie5GZu7pzz3e/c7ztKGIaI4vn9p+/P3h4e4a6Pv6EoQBDiy7P5rc1P1Xt6XP8M5ejXo6UJ+dWbuemeTGdpvNdiNe9YvQLe4Bi4PmTpRmyq8m71rp74BxKF2twIHvAo+f/l1T2Yp0zceHizfOZa/xRnfBRhG4CQqAYioBWeXDyA8Di6ei1ceXC1XBwrTXHPH2vW6ccBBBMI6BsSUEQzakGL6xB0tvjyBxRNxdCtc2Xf8R9TyaWTDOg2TjfVdw6hqIoE9B2GxkEDWlLH7s4ette2kSp0oDRezrQwCIIA3oGHr0/mKMmE53qo23W4+w5S+Q5ohob9X3tgHgO8ULQACC7gMx9mKQP30EW6mEHpYi8xcJEdzMucjfkKcrTfmqmiFYBxCF/Id+gayKJwoQjHdrA5v4HK7Cq44KjZNWpagaqp7QACks0H9znW365ia24DzoEDozOJbH8eVtGShXHTwNracnsG7q6LzsEuaAlNPm9h7DSSVjLyCMkppDI+GS2StQWA1RlKo0X56n2X+6QHkmkDakxF9WMVqWyK+s/BrthYfvWz1Ug+zUDcjMPMm0h3pxEjFma3CbIuCud7oMc0LL1ZgmElpGJtW3B+15HIGNITrMYIlOH7i0U41NrInREylYbu4R5qQbQBaAh95fVKZCnpQCnb9DrWZyrRERS6NDeUw+yHaXh7rt4C4B8y+9vkwn7kwKNRpDoa9aiFKBYnF+RcREqQ2e1m3R8BBgAy9kz9ysCE6QAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-odf { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAi5JREFUeNp0UktrU0EU/mbu3FfE1KRRUpWYheALNBURUVy7cy9UkO6KW/+Lbt0IPsFui4gLBbUqFaUuXETUKCYa0jS5yZ2ZO557b5MmTXpgmDPnfOc7jznMGINYPi0de5UvmpORxpjE/kbNqW005DVu8TWw1H758ZfkFgNgJmtyxSPRjJIj0QTW/RDiYGXGb7Dl32/eXrVsd0gSCx9miqC0ooCdp69g5Q/h6OLN0ty5ynIkwzMwUwh2FwMdcbDiCZQXlkqFCpEoPT/wih1YjLInANcD+/Ua9bu3wJlGvrBZCmet2+S6ME5g4oGlZ9A/I70XCDhhDexPNTFmswJBwcnuXkF86VSNZxVu0ukLSGnBcqlnN4HoCQIaIuIv7LUooMOgQ7q75LAAb59B9gCBHSKgqemRr94mMKmD24CfM8nb7THYGQNLpAkUkcb66JyGBFFEWRVL57gFEH5qj8Lxwca2qS3EZaugmzAw24dR/XQgwtsCSBjPIdWbUoE2UJLBnV8Ac/ciWHsK9/glWLnD6K2vgPszsOdOQdfeQ1c/ThKoTgDn9A3KUED/52d45xchZsvorD6Bf/Z60riV3Q9Z/0bbGU1uopYGkfERSQ3VbsMwl0qlqoIARmSoPYXWy0dor79LfBMEEd8jGs/uQ3Yl7PJFNFbuEXiV2riCf88fovXhBbo/vqP3t02/ZYmJFqTkzY160Go9uEMbFK8hR/NrdXtFuUVmnmySVGgO4v4LMAAjRgmO+SJJiQAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-ods { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAetJREFUeNqMUj1IHEEU/i7u7Z23e8tGgneGQPw3hZDkkhQiSuwMQREba4uUgpVlCrvEQhurkCoWqcQQ0oTAaYKNqJygGEwgHCSB6Knn7eXcdX/GmdHVPWYFP3gw78173/vmvYkQQsAwNvckq96UnyIEh7/d4t7uUd/8y+85P+bXSX4grkhI6nJYPW7LrXpBK2YxiSoShhu4Buq1NPofDeqdrZ3Z4cl7D4J3UtA5VyVAlmJoru9Af2ZAp1lcCQ3nqgiuKmbY3l/BH+MnHM9GVLP0Ww3KNA33CQoQQnL834Fj74PUGkANEIkCSSsa8gQqgYTIcB0PVsXB318GInRiCVWCkpRFAs+j5gKlA4t29Ggh4d0t04FKt9PQqF4UFgumSEA8ApeaElilWbYRVy/lsns/N1QBkxtENF4jxPxcgcB1CZVOrvMteK5IQDtJJIGh++PcX9iYwWjXK37+vP0WdYk0Ht99jtX8JywWFkQChw4tc+cZcvlF7rMze+ubbxN40fMalRMDP/6twaiUeK7wlZ0TD0a5hLTWxo2d45KKprqHKJslTsy209s2wnMFBTYNZjc/oLt9gPvLOx+hxVJIKS2YW5pCbSyJTGMK775O8VyBwDJd2LTDl/X5i8v3S7NVw9vJb51tITDEUwEGANCx2/rXEEFFAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-odt { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAepJREFUeNqMkz1II1EQx/+7Ca6JkqyYiJ8cKEpAQbBQFDm0sVOsFBS9wt5KOTgEG5twxVlZ+XEnKNiIghYKxx5nwEpIIXaiSAgKGmMi0d23u8+3T7OaZJEMLG9mmPnN/w1vBUopLPNNhRWXHOyDg0nx82TiJtZPlPVoNpftc2cTotcHtxx06kdXpSQ/BvzKESZzIDmAz6y+NojOjpDMZiqRPIgNoFyWM8DrKUV7axO+gcp4g7AzmquAdVNqOgL2z2I4id1B0wgeygOyt/rLL5buLwAIDgA9dY+L+DkuDQOCrkMgBsRglcMOqAGwIstMg8AkGsuZMNUMRMkLqE+QGloglvlA7uIOAKvZajR0qJkUj/XHe0BTIclVKKlrfKsj9qA8gA6wqSJzPaXlr7ky//tdLEUfawsBjExUFGVWbT7AxSa42H2LMfODmvd3wKb7RAMLYwM8nts8xJ/pEe7/3PmP2eGv3D+9usb35W0bINoA7RmjXSHsH0f5Z/mUSZ0Ir2JmsBtD80s8/rGyzWsLFTD5yUQCbfUBHl9d38LvkdDTXIuHVBo0k+bbt06qO+yAPGXwe/cA4wO9PN44jKDG70GougIzi2tQ00ms7/3lpwnBBgjZ37Kkd1Shht5XzBIFl/ufFtniT/lFgAEAU//g6kvdGBMAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-otp { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcJJREFUeNqMkssvA1EUxr+ZjkdbrfFKVD12ErYSRELY2fkH+BMsLcQaSwsrSzZi47EjJEQkEhYkFlhYSVtFpdqOqpk717l3jKZmiC+5mZlzv/s795wzCuccQncz3YeRBj4KHz0/RrOZe2NsZPP20o255zQ3EAxzEAC+6uzTw13G4TFQAakA/CWtIYbY0KBOrx7IvwDQqlHV1o3YxKTOvyAUvfQCfqmA3e4ikyS/zRAKvOot7eoSHEgZIHrCfQAfBqBaKQQDKScQAExd8emBANg+2U2CvNMkkgSqBmrCxFB8mujeoJBWwEqARcssKTAJEGrmaGrjqK1zvNknH4BtyxKl2VUpRxmj5W+x73q9AEaZrR/ND1EJluIpS3i9JQiA+a+hSq8HwJjTsLrRaWitPTCOlhEZn5N75sM1qigmlN+dB3u++Qao5W4TtbEXXIsiszGL4PA00itTsu6XnQWo0TjMTAJqfMDx/ryBJcaVzSNSH4fW0Q+rkIf5rsjRiid7yyN7uoXS3Zn0egE0NiORAN9bQ017D1Lri7CLlP2EDr3Rf7C/itzV2bfXA/igLDaRixfngFhSCooH2xVPCWBlwKcAAwBX1suA6te+hAAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-ots { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfZJREFUeNqMUk1rE1EUPS8zmabJdDKB2glEwY9ExJYiBUEQpV25qgtBXfgbpEtXuujKf+AfEKRddOdOGHClbYVCvyKWaijT2mhjphk7Sd7Me76ZONp0EsiBYWbOvfe88+69hHOOAE9f3zTVnDKNHvhlsfqPw/rM0ovyWsRFdXJEpDIyRnSlVz0KSkmvabaJeXSJBEhgAJzTDNybmtUnS5Pmg/lrN07H5NM/f13FoMgpXDSuhiIiK3Qi6LUugX7FAbaPPsJqfIHHKCStqRsXVFPQuZgD9BBxjikSiRq41AAkgCQBzVf0+BWEBX7GBm0xgHHUqk1UbBuEcIydzyCZlOI9YEGuDxwduCCitS3Xh3viCZ4jrcq4PJ6DLHd67tjtuAAXib54dCPVEfQ5XIcik/0/2iDeOYz3ceCxrisMi904y0XiMQFfkB7lg6xFHwFxEqUMV0anUNBLWKm8xd3i4zBWOzmASx0UsiW831mA59Xjm+h7HCOygduXHqJatzA7Poey9QnXjTuoVD/j/sRcmDOWLgqnLC5A2wwST+Pn8T629lahSCo291bwu9XA7vcy3m2+gTaUR14thrk9BXasbdiOjSe3nmPpwys0xSi/HpbDd3bIQC6dx/q3ZbRb/j8BEi3Po5cTJpHI9CBNDEa++GyDBN9/BBgAwfDlCVUQaNAAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-ott { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdFJREFUeNqMU89r02AYfpJ0iVm7EqhVOxw7dDBEdpiCE1RoEZRddvUgbIex/Rs7eehppyF4LOzQu4MxwYp0HgShIuwwUVSCVtl0s13afl+SzzcpyZYmyF74eN583/s+PO+PSEIIeJZdrtQVI19Cgmk/Ph39bpllXq82g7sgLxVcyKNZpIx8Uj5u5zSjc9Gov8ZihCRC8D+7On4JczevGeTGSEIC4ctKJtB1DTPXi1iCCEkIm1EFlC2Em0iwtWfinXkIzjiO0jljtDC5TtflGIGUQMB+mfja/oPv2Rx9MMjpMdJxOXyXTwkcwIkewfqQ1QtQNB385zcI14FrtQexsSb6SRysZ4Fbf+F6eHwATc9gJGNAm5iCTL5n/LCVRGADNoeaGoHqyaXj5gqQlTODovcwNk5Aj6wXqV8eCo7EDhMonEHpW+dZC7gUG98D3geo7vkb01h9cAvPdt76OGy1xntUd3bjUxAk3+l2sHJ/FgtrT0MUJNfDSm0bjQ/72Hzxxo+NK+h3B7XRNO4UrwymQtMIkdTBU0m+sBOayLsn8Ka78mQDjx/e87HXPkb1+UsfP37+AmZ1fP/suknBb6nefVQXjl06TxMlJfWKNWr+Kv8TYAAkUueexJF47QAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-pdf { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmhJREFUeNp0U0trU0EYPTP35qYxaW6TlDapNKWGbgo2FkF8rARB6rboXusf0F/hyq2U4krFqugqSBeuAyL4SERBstHa0iR9JKZJ7mvu+M0tqZGkH3x8987jzDnnm2FSSqh4ns0VU1ybFzj674Wa3uWiWbfsFQb+jrGj8Xvbm0HlvYVRxhJprpmTlGmum+OMm5uNPZNbtjk3l82ey8++8oW4Jv/H/wdA456g2kvH99FyHNiuAz2dwflbN8YW8zMK5Go/CMfQkAhpGsyQgRCtlpE4jIULyC9fHzu7MPPEl/5ib6WOE0JJNRiHHg6j86mMjw/2gG4bkbY4PW4Yj2j64skA5FTHdaEMPiAJszt1sK0d4suJmY4k0+IDDGRfqmh0u5gejQc+fG8eYCIahRQCEfgQnIuhEkgtONE+dGxYxEDj1DhiEycZ+1YXdUpHCqTMJIYyEES5aXXQsi2kYlGEia5GtHVKn+amPBeCutPgfLALPuVu+xDVPw2EQyFEjHDghbpYNm1yKVVnYjTOerepn4E6XQmLGSPkPkOXWATMSDcjQEkAaqOu6+i/rccALtFL53LI3r0Nq1ZD4/MXZJaWYFer+PXiJc6s3IEgY3+uPYZHTAcAHM+DTE8gnM1CSyaCulv+GrRy8uYyElcu4XfhLVpkpNtn/DGA5Uu0abFH36WnzzCayWAkmYJvWeCkfb9SwY+NDbSoOx4bYqJF8rZqVRRXV/HhzWtUSmWwmWl0RmN4v76OUqGASrmMOkntSHF8MOs954dT08W248wzYsJDOujRBAaqqikTpRo/qqd0/dv97c3Lat9fAQYA4z8bX9nTsb8AAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-php { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAhNJREFUeNqMkltrE0EUx//ZbDaXNrvZzdIkbYOXGgxYQlCK2IIY6EufxGdB8Av44AdR8AP44JOPBR+Ego0PClUKTTXQSmkTYtOkmubSJrQ1e3H2yJSEJNIDs3PmP+f89pyZcdm2DcdWvn7LzkxFHmCIra7nm9ulg8yLZ09yXON55Dgjt1PM2iPs0+aW/frdh8bzV2/SvQBnCLiEqcFxLKSSodlrU9leiGPihWePBkgeEZO6ShC2dCAZNuf6ADb+ldQ5PUPx4BCFcgXfdwq4Ph1Dtd5CZi4Nw7SQiMdCXkl6yVIy/QBWgcU+yx/XsLK2cdHndqlK/lZxH/OpJO7fnsWY3z/YAq+g0TmHpoUH2vB5PXi8RD9Fo10aAmDJTgWyIuOupmK38rsPcOvqJO33XWEvwLJsmKxHRVEwf/MKWl/yUMf8mIloWN8rw+sP0D6PHQmYuzGNgCRiMZVA17IQV4OIaTI8buH/AJMFd02Tkp05PO4jnWvc57EDAINt7u1X8Pb9KgI+Lxbv3cFR8xjx6AQ+b+Txs/qL9KePlih2CMBCq92hg2qzt1AoV7H5YxdhdqhHzRbgcpFeqdUplpvQW4FhmAixZ/sws4BoWCM/qmsE5XqE3dDQCrqGAYWdejqZgK6GUD8+IV9VghBFN1RZJv3sT5diBwC15gncggCPJKF0WCPN8dun55jQdVpz3Ynl9leAAQAJhiGatD9AOgAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-png { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmtJREFUeNpsU9tOE1EUXXPp0CAUWmJbC04xBANNTF+kKhG8fID6aqL/gPEj9E0lIf6Dj30HL03wxQtVIC0QKrWxNG1Dk9Z2Oj1zxn1m0oIZTnIyZ8/ee+211z5Hsm0bYg29fLGpxWIJWBYGS5IA8ncKhT9Wvf4Yqprtu+w3q85X7f9QxseD/pmZMZsxN9fnc5JNw0ACGGv6tPSvyvEDKEoWZ5Y8OHHObKpucw4B0t3agnl4CJPs2YkQVu4s61ORaBqMJc8CDBiIRhhVM9bXYdVqYAcH8M3NgS0tQQsFcfdKHEbvlr6WyaR/V6uPKPy7B4DT7lUq4MUipMlJ2MPDUKtVfKZ2nn/5BoNbkONxXeb8LYXe/A9AJLNWCxgdhZJagDI9DZg9qIkEytRSkdqTSFQtGILSbgc8LViM+tc0yPfukzIyOJ359k9YR0eQdB2KmBbpwXoM3Dod1SkD+scpEapCI5DdpsJhIJcjajQZagcjI+5oLe4VkeQnyiZgdIH2X6BJ7dSqQLfrggjw0AQwP+/GegCIHppNoFAgEMO1RZKo7BQgRi3yN05cnwdA0BQMAgF3C6pnbuNg92M9AFT1diSCh6kb+FGvo2MxnBB9ocZxp4Mns1cde213B81e7xwAcl4jkaa0IUSjUdLJwkL0Ej6VSvArCt7l81iku6GrKnYEU89VJlSJRmR0Dax+fI9suYxSo4HlWIw6M3FBlnD9YhiXabyOsOeIqG7TzDeIYo6EDGp+ZPb2kKKqH8h+mkxiI5/D1/19J3bwYPvPWXq2skkiJVxesqt0XzghpKM8nRVV2Lv2q9eLIvSfAAMAaacnllcFBmYAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-ppt { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkhJREFUeNpsU11rE0EUPTM7ySZpmzT9DNamWAtFfSiCigr+AxF9zKtv/hvf/Aki+FEi6ov4ItWHPGiwiBUKoUqqTUJImmR3M7Mz3t0kNe1m4LIwc+65595zlxljEJzdR5uf5nLmsvZx6gSvtd9W9bjhF7jg5dH9nRc/wq8YXaTSJptb0xklx7IZoKUEz1zJ2DUU69/37vFYrDxegJ9U0lC+AoIIVGg9CL+vIObP48KDQn7x0sWiVnJrnEDg7KGk+i/Ac4iUM/R7BsmrSSxtXMfa3X7el8+Kjf3KfUJ+iRJQw4w0Tc8BRyWGRAZY3rBR/VlC+XED2ayDhZyXl03+hNA3TxNQshlGLAnE44zCIL1goXZwiMNvB1i6zbC0KuAsxNITWwgNMYPeLVJiFEO9ArjHAivrAjNzBr4f4vwIgdGD4YUACsZCE8AtYGWT5jCsGQw5wEYJzP/pj5RwYTA1b07eQmfZ8P0sgdaM2FlYwWkMgMpl6NQAO33GKM0wsQWflkh1uqGVmVWblsiDkQyqxwfag35SqcktaEWTUTHYNx4iGU/C29+BvX4Lpu/C7zYgFjegSY63WySsHyXwpYHU00ieu0bAOuJbBTArBkiXKiaAmTzcvRJUV9E8rOgqBwqlY8ASs/AadbRLb8CzeTjVClqft6FdB17tL7yeCbFRBYoLr6vR/PiSEl5BZJaBD0/R2nkOZqfQ2fsKt+0SEQ+GLSIEUvJm+6jbah2+pS2aon+4g/afd4SYJVuA7vvXdC/IHQtSoTnK+yfAAIEaId1m+vudAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-psd { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqxJREFUeNpsU01ME0EYfbtdKKWGtoItRWgJHApCBE2I0YuoiSaaeDJeOJh41YN3TfTixcRwMfEk8eDJGA+Eg0YTTRRMg02KKFooCBbTlkJLS7f7P+u3K9Xo8iWT3Zn55s173/uGM00TVlwZfzJztD92iKO5ouvQGQPHcQDN380vlDPr65fdLj4Oa41i9sFt+ytgN7o7woGOrqgvvpLBaF8vWj1NUAwGTVNRM3mf5vU/zaU+XySQuTqIFXz9hxmGLkoS7r+YxvVnrzGzlgXPDOzUZPT4m3Dt/KlIuH9oUjXYEHZZ/wOgGQZi4TZcGI5hLb+FO++TSOSKcLtcMA0dI0EPrp4+HtnfG5skiUecDGwQE2MjAwiGWlFVNDz+tIyCokJhPKYSX7Gdz2I01hOJdnY9rJ/7UwPGTEiqjtbmJtw4MYx78S/4Wa3h5UoOYwPdIOp2Xi/t18rlFgcDw6o+ydiWVRwOBnCpL0oOAMmNEhLZIgSeoxwGSWcERon/M9DoBknTIdNQNAMnO4PIVGpIFXcwndlA2OtGc4MAxml27p4AIulWSIa9QVadiYSoJxhqBJivKgh5ad3k9gaw6JdlDaqq7q5wINY4F22HaLHSDZQkBW72O9cBYFEviBIURQH7a7MN0uDisUW12ZZcaGlmdq4DwCqeTo1zNtZuW7hUqGIw7MNqSUS2ImNsKEpSdEwt5lGhfQdAkQBEoub3NNrDJfAIeBuRrcrY5xGQ2RFJAjl00I8PCckJUCB9q1URBnk38XEJEuk41tmGwZAf66s1VOh2keqwoUnYpFxHH4iKIixkN3HzVQKP3iQR/5GDKMuYmE3h+fx3MHqh1sMafztHLuiCg0FAk0uFdLqcpGY5QEXbTC/j7mIaVjc18DxufUtBJ/vcggs+3ijVz/0SYABsJHPUtu/OYwAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-py { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlVJREFUeNpsUktvEmEUPTPzTUFmgJK2UqXQFG3pA6OBLrQxamJcaYwuu3Dp0l9iXLvVtRuDpgt3JIYaTVSaxtRHsJq2xEJBHgXmifebMhECXzKZme+ee+65516h2+2Cn2cb2VwyHl12//vP2/zOQaF4uD7GWN69e/LogfNm7kUsPBFaXYwHMeK0OlpQEJApHJTuykzK98dE98O0bLM/UNgr4v32Dj1fwSQRt9dSsfmZcMa0rIv9ODaqYrPVxuPnL1Cu1aEbJu7fvIZUIo4bqeVYRzcyv/8c3SPYpwECt/dmu4ON3Ed4TymI+hQc1ZqoE+F+uQLDsnHlwkKMscJTgl4eJOi9fxZLePNhGx6ZQRRFqH4VjZaGSv0Y6cQcJLpra0ZguIWegqDiw7lYBBZV6xiGk9DQDLzK5bEyF4Hi9VLMsoYI7J6Es5PjeHjnOl5ubqHaaJGBEkzbxplQAKIgDmBHekDTgI+qKKqKLvNApgmEgyquLs1CoFn2Y4cIeLJpkjoCLkWnUSIF3JxISIUsCjAoxhWNJLBIJs3YeXj/08oYZkOKY65HllE/bkMmY504YUd40HUq2JSSyW6iVPmLiXE/ZMYQCU+hXK3h1toqdNN0sEObyKtqtDQ6kXDwcadDS2TBryp4nX2HxXjsJK6bDnZIAZem6Tp5YMMmicn5OC4lztNWtvB9cg+hQABtWjKL2jH/T3GgBcYDXEE6mcDM6SlaJAGMWkivLBC54ZgniZaDHSI4rNSqn7/t1vgkGJPwZXffSeCjk2iUWz9+nSTQN8e6ef8EGAClUi/qoiOc3wAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-qt { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnVJREFUeNpsU8tu00AUPU5sp41NkzRxpfSZqi0VIIQqEEJUZYXECvbwCWxYsuBD+ABUFrDrCnWBQEJdIWigBSr6pqRJ1ebhxrE9M7aZmSrQ4o505fHMnXPPPWdGiaIIYrx89GKpNDdxmXkU3aEoCsT+z8W1Sm21+jCpJctQTvaerj+TX7WbnJ+0cpfuX8mQtn8GgJ4AZtIFY2Hz3foDVRcgyt+cRHcS0IARh+D/8G0PpmVi7smd0dLs+AIjwTVEiANEYYQwCHlEZyJgIQKfoX84g9uPZ0cHZ4YWmE9nuufU0wABCSSImMsWEgqSuoqA/39/swZFTWLy7vQo7dDnfPvWWQa8GuOV3IYLJXmyzDzG2/ChZ3pwbHdQ267BKJoYuj7SF2MQhiF8LuDK/Gf0DKTBKINz1IbTbEMzU1ANDW7LAfEIQKIgBsBFlAx6LYOz6MAcvoDCtAVGGPKlAiIu/F55F33FDA6W93EOAOMaMOl7biKPwRtD8Foetj5sYPfTDtxjl1f3Ubo5jkQieQ4ACSUD2iE4XDpAdbUiW9D7UsiN9WNkZgxajwbd0LGzt3keAJPUc1N5SVeENT0Ao2BKV6QzwlZeRBSKAYhe3aYHcZWn7l1EfjyPypcK9LQGa8qCvW9j9+MvaasQOHaRhGWdhsNLR8hwodYWf6B4tYjDjSOovRqq32rSYq/lytw4A77o1V2ERiAtzY5kkUrrsH+3QF2KY87ArTtQuQ6nAf4x6FCV1D001+vYersBM2vA4y1Rm2D7/Rac/TZIw4d/6MrcGAPf9htN0miJh7Lyuoyvr8rQeP9iVJcrSKgJ+TrFcyYebXTP/RFgAFQobmIOBxbsAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-rar { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnpJREFUeNpsUktPE1EU/u68OgylZXi0hZACQU1LEKKCMcat7jTRnQsXxsQtv4E/4M74P1iriUaNCw1FgxpjCJQKKAU60+m8mJnrmSll4XCTc8+959zz3e88GOcc8aq9evChOHl/lvMoubvWX/z4+BwTlbvw7bXdg8b7h6LE1gGW+O88CRMt4XTlR6/rYxce5Xv3jlHH19fPkBu+gWy5mlcFb3Wn/umeKOEMJF5C7xCFbtA9dRXjFoYKGiTRAlPGUV1aKU9O3VwNQ74A8DQAIZxqAuAhBPIMFYpQVAVB4CPSZjEzv1weH5tbDQN+JQ2Abu488mnzIbAAA3o/VK2PwDJo7r5Fy7ZRuvi4PFS6+qIXdVYD8Jg6BUcuOD8BozSLlRWyicgVKkTMQWwUlFF0Ooe5FIPk57BD7G0SiywyjD8bCDyHsOkeeeR3SUxEkROmU6BfQYFJMHfhWXV8efkUrb13VPMTsrcTQSzxZ/+n0GVA6EGbSGdgG9vo15fg2nFgbO8k70SRdd+mahDT81vUxTZRlJBRMsjq89C0EXCvSf7TIBZ136YZUJEiE7LgJ2dN01BZuE0dkIhxE7KcQTK1QUj+cwAEyrPZ+IydzRoyah+mLy2isbWBweESJEnB9q+1RM9Ub9GQOWkABg8HjRr2d9Yh0hTlBlRsfn+D4vg0BvUC9rZqECUJuk7Tzr1zahCYlB6HJAREPwfbbMBzLBzsbUKVI0qBgQkc+SxgWUYaIAqOpKwKXJ6bgGlaaDV/YvHaFNrtDsKTfVSrJeqIg/bRNwjclFIALeP3saybhu8SC4VBHwnhBXXIKocYRXD9QzBi4Xgchmkd9+L+CTAAMqwy+ZzluBgAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-rb { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAixJREFUeNqEUktvElEU/mag5f2yJhXLwxIt0kiqsVEXujP+A925cu1Pce3WtXVtYuJCF7KtTY0NrVQIpRVKeXTkMcO9F8+9ZVooJJ5kcmbmfOe733fO1YbDIWS8+/g1dycVX7W/xyO3vdsuVKqvnE7HZ230783rlyo7bVBicSGyfjsVwozomVbIPe/c+FmsPHfoRKJd1HT7hXHBZjVbA4aA14NnD9bC2VR8gwuxPi5Sx39Cp+M0XUP0ahhP1jLhW7HFD4zze3b93ILtXYyyVKlR8/5hFbnvO9gtlrGSjOF+OpXkYviWyo8mCS4R6bqO4p86vm3v4fC4DrPfw4unj1XN6JvBaQtjChzUXK43sVU4wNFJA43Tv/B73edQwTmfIhAjCVL6UdPAj1IVFSKhCdAcAI9rnjBiAjtBYEu3GEeh1sKJ0YXR68sVIujzIhzwY8DEBHZqiLRKkicQDfvABxaiQTc4Y/C65pCOXwcjcmlvJgHtlwi4epYifiQWgmoLZwPW6HQG07LgcOgKO0UglAKOTt/E+09fwAiUWU7QAE9xUK3jbvomsispZVHMVEDSZdHo9rCZ/4VIMKAu0XGjpU7d2S8hk0pCELHEzrjKnCQOYJoD+Dxu1RyiwUm5LaMDo9NFt2cqDLvY4oQFp/QpfT/MrmI5FkWebt+NpWto0j2QmQkOjZ9hpwhqjXZzM/+7LU+cc7lRrjXh8/lVLRK5ovLWXglOsiOxdt8/AQYAzv8qbmu6vgEAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-rtf { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAe5JREFUeNqEU01PE0EYfnZmd5FSvgLYFuwWt9EgHyEaox68eDJevHvwJ/hTPHv1N/QgZ2NC4g3kUAQKFKGhjVKqRrvbnRlnht262FHfy+y8877PPM8z71pCCKh4/ebt+rJfXEz26Vjf2mnsN5rPKKWbVpx7+eK5Xu2kyMtNTd5d8MdhiJ9BOO7atFI9ajy1UyAqSPIRMR6ZmoNehNHMMB7fX/UWvEKFMbYKE8DfQnAhwRmmJkbx6M6S5+WmK2Evup2c9yUk2nnKA0XVcSiGXAe1k5beP1i+4RFCXqnPywB/AKVzK34RjHNYlgVKCH50w7EBBogbTa/AVM5SgBdn0gc2AMDjPsbFPz2xye9asweS6n+NTbG8BCCfUtLjff2WoVnVpAH6z6hMUtJE3EykYfpF4vUiL3QNS7FMeSAQRBHW3r1Hq91B+VoBQRji4+ExFsvz6Hz7jm7Yw5OH92AcJKW9G4SoHhzhy/lXbB98Qmm2oCXN5WawsV2TACEoJXqwTKOsb3BtR2ucmZxANpPB8JUhyPnHWDaDpfJ1eZFALzJJ4MKO5MEtv4TSXB7V/br8iQLMz+almRZWbvoo5q9qRlxwewCgeXbe3qrVO5ZkUD/9jJGRLPaOm6COi92TU1DbxYe9umRD0DrrtJO+XwIMABWp9nS+FgaoAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-sass { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDNDMTBBM0JGMTE5MTFFMTg3N0NFOTIyMTQ2QzhBNkQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDNDMTBBM0NGMTE5MTFFMTg3N0NFOTIyMTQ2QzhBNkQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowM0MxMEEzOUYxMTkxMUUxODc3Q0U5MjIxNDZDOEE2RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowM0MxMEEzQUYxMTkxMUUxODc3Q0U5MjIxNDZDOEE2RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Po72XUcAAAJcSURBVHjahFJdTxNBFD1bykc/ttvdtttWGgI0bYrUgDZoNYqRJ014kMRXHvwB/hQTH/wFhMREJfFBQxBjhMRIFEQSCAlQxKYGggiU3e3HbnfX2bFt1EU9k9m9mblz5p4zlzFNExYmpue/jmTSZw5PZAl1MAwDT0c7O72wvPdudeNakPNtOZ0tsM7cvzdOc5yN5LDAsTFRAJks/kC2PxFRVe39Si6f4byez62EpAEH/gNN18F53Ri/Ocxf7OtdLMpKT42s/ZPg1cISJp/P0tg0TBzLCoK8D7eHh4RkLLJ4cCz12AjMXwgez8yhqtVo3NbqRKlcxcSL16gZwJ2Ry8KVc8kZO0HdTKlURn+8G6PD2SZhLMQj96WAiMAh2RXFYKI78lcJcx9WYBCycICnpNbojUWpD5Y0C4Zh2D0w6hWc70uQZC+IWfQZrXF0IsHvY+meBd08haAhoVMMQFJKWF7PNZM+klhRyogGhbqxOIXAMOtEwGAqDqVcgbVkkE+5UsEAWavf0az2t0ZqvK2qabh6IU3joizDwTgwej1LdVfJXkdbK8mt2QkayO99A0/0trQ46I1lVcX+UREhnsP34yLp1AD1xibBMuntpzU8mJyi3Tc1O4+l9U06n7x8Q/8PHz1DrrALt8tlr0CrkbJMHTop9Sk5sLa1g8L+ARJdnShKClY3tunN69t5iGLYTlCtakjFY7gxNABdN3B37BaqqoYT8pyX0in4ORbRkIA46YlDRbUTbBZ2Jb/Pw4qiKFnapcpPo9pdbrg8DjAOBsFgELJmsGs7eWkkc5bu/xBgAHkWC6UPADTOAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-scss { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM4QjYyNDVGMTE4MTFFMTlBREZCNDNEM0ExMTk0MUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM4QjYyNDZGMTE4MTFFMTlBREZCNDNEM0ExMTk0MUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQzhCNjI0M0YxMTgxMUUxOUFERkI0M0QzQTExOTQxQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQzhCNjI0NEYxMTgxMUUxOUFERkI0M0QzQTExOTQxQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pkf1yeMAAAJbSURBVHjahFNdTxNBFD0tLULpB91uodVWPmorUIxo0VSiNSExMYYHE33l0Ud/in+C+OSjYgjRGDBRCKJIUkIEWi0WKlja0ul22+5219lJ26gLeiezuXvn7rnnnrlrUFUVms3Mvd2bjIyezRVLBA0zGAzo6jhjm1te+7EU37rFO+w7JlMbtG+ePJ5mOaZmci/nsPl6ONBtw18WDQc9tZq0sp7YjTisXV/NFKRpRvzHpHodDqsF03djzuvDg6vHJWFAprF/Arxe/oins6+YryoqCiUBvNOO+7FrXMjnWc0WyIAOQP0N4Nn8IqqSzPx2swllsYqZl28gK8DDyRvcxKXQvB6gISYpiwgH+jEVi7YAfW4nEqk0PJwDofNejAX7Pae2sPhhHQoF63U5Gai2Bn1epoPWmmaKoug1UBoMrgwHabIVVCx2jdrKFwm67TZ2plldPQGg2cK5HheIUMbaZqKV9In6giDCy3MNYXECgKI2gICxoQAEsQItpNCHWKngMo01arTY/jFIzbutShJuXh1Fm9FImYiM7tTtKOtbO+toN9Nc+fQ5SGUOIVYl7HzPIH2YRZ0y2KZ+sVzBHn2v1mpMGx0DTaR3nzfwfGEJdybGkdo/wEigDyvxLzg4yiESvojZhfd49OAeLJ2degaSLIPOO6vwgiYaaRErTRREEdn8MeJbSVZ5M7nLdNExqFLaQwEfFfACQn1+HBWKSKb3MT4Sgstuh9vVDa+bQ4DORE6o6RlspzMk9TOPfr+fiLJCLFYr3TZSKNcI7+aJwWQmPM+TkqRg49tu65f/JcAAMwMas6WUKd8AAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-sql { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAh5JREFUeNp8kctrE1EUxr+ZyXMkoa1NBROaSkpTBE23PhZ25cql2y5duvAPUdGFS1FxIRRBXZlFQ9GVdDENIhGJxkDsw2mneZnM83ruNZlOmNoDhzlzz3d/9zv3Sowx8Ch/qlYK2XM3cEJsbH0+qjV/rd6/u6aN18b7RMFT+9aosP/Ex+0ae/puw7j36PlKEMAzctKJ3aGFamMHjV0d+wcGitkMrpWWp6hVIciEk2MAOwbUWjosx0UiFoWqJpGMx5DNzODq5aIPoa82AWBg/lyKLMH1PMp/a9XvLXLzG1cuFlBaWpiKxaIPSLY6CaC93ggQjyiQZRkeQSzLRovGaPciWLt5faSWEBoh6KBvOhiaNga0+Y9pwaFxvu7rfp8F5pWDt+qNMp2IijHGwddWCvN+33/CoAOP5nVdT9SdoQ1JkggiQ6Yvr7V60+9z7akA2gfH9cRF8hO5F5Ve4lQAF9uuK+qFsylkzsQxrcaQm04hdWkR83Mzfp9rQ3fAFzu9Ph6+WMfjl6/pGBdb2jbKmx8QlRjWy5vkyhUZBPgOeGNHN9AbDLGUz6He2hVj3Ll9C8/evsdgaMK0HV8bcmDTU0UUBYXcedR+NLGnH0I3jvDk1Rsy46FP4C/1BtrdntCGHNiOAzWZgEKQ5Qt5lIqLojbaXSQTcRy2OwT4SZqk0IYAOgkVWUE+lxX/zb0DpFNpkTzmZmfFtzewhHYcfwUYAMZmVaZQlLFHAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-tga { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNp0U89PE0EU/ra725K22ILRGipb22pMG6JcSEQTbUIwnozxpBcvepeEP0KPogcT/wlNT17kIKbEmChFUYKGVtL0R2gLtNCl3Z1Z3+zSAlonmezOe/O+973vvZEsy4JYnqdPMu6RkSQYQ29JEkB+PZcrslrtPhQl23VZc8/tr9I1yMHg0EA8HrBM04lVFAhoY38fSSDQVN3pfKV8G7KcxZHl6v1xblqU3eLc3p2VFZjr6+gQgwsnhzGTuq6Nhs6kYZqXjwL0GFhEl3U60OfnwWs1GGtrUKNRsKkpeIIBpKIRtI1J7cX7hXRhc/MOhXw5DkCZGG2zXAajzFIoBMvng1ypIKOqmP30GW3OIEcimovzlxRy5RgAFwDEAIODkCcmIMdiQLsNdWwMZdJlg8pzEUt1aBhKq3XinxKYqF9yQbqRIqsMy+0Gyy47bKgUWXSLtDENE5wdtuqQATm50F1VnPbRGeEw8HXZbiV8fsDvI9ldju9vADAyihLEbrWAZhOoVp3z6iqBUiB1A4nEfwCEsbkL/M4TgE5n5jDx+oTEzp1d8m9tC8H6MaAB0imzx0NU/WKUYE+loEyawDBo2ui6TGfT6ANAxrvx87gYCGCxXEKVJvCWFsG3eh1vN/J4OD6Od4UC8o0G3TX7TGLHwI9iEQmvF9X6Fh7F4/iYy+GcLOMSlfEgGsP0qdNOmX0BiGKpVkV1bw/1nW2b/gCpf1PTcI+Y7eg6ps+G4bG4PR99SjAVo9HE4q+fKNE0vl5awuSohjeijbRefVjAtUgEQRK7Yhi9OKn7nKWZxxlSPWl3QwgnaIrW8QMhD542vUbx/W49m7sq4v4IMABOqi3Ej7bAEAAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-tgz { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnhJREFUeNpsU1trE0EYPbMzSTfdtInFtkkpiaXVWou2FRUEn/so6JugL/oH/Af+B1988if40jcFERQURNBSQdDWlLQN2lsue8neZsZvc7FoOrDszM75znfOmVmmtUYyvry++36yfOeS1qqzDtvH2P76ApPlW3Drb2sHex/uccHWAdbZX30kO2+B3siN3zhTnHuQ66+95i423jzFzOVljBdKOZNHazvVT7e5wF+SZBj9iZJ+3J11mbW2kR8T4LwFli5i4fqTUvnczTUp9RLtDhKgJx0q4dEwWAxrREKICHEsoYYXMXvlcWmquLgmY71yCkG/c0AkARgLMZpnMDMpGNzEYe0dGp6HwvmHpbHC1Wf9MnFCkHQOyYEPzSJwQ2B65Tm5NZG3Fshim6wbMNJn4bpHowMKtIqo2COgR2IcAptwjvcgo6i77igjEmVDqbY8xQJ1VwRULhiBI6+G9Zf3cbTziuzIDkmHSNqECTFgQScEcYuc2NA8TcdYwXD+GkK/TYVN+u72WrIudiAD8o6oAR2RRCmQMjis3CIy1iSpPySCXhFTXeyAgh4BR+JVw8pauLi0Cp4yCX9A90FQhnSBYtnF/k+Q+HYam9itfIZB3QvT8zj8XSW5EhNTs9ivbSLwPUzPLNPJBIMEKnaQYg6aB9+RGR5F5VsNgnNKXMI1NdJGG5WfHzFVLJ7k8c8xUngpVodlDSGbFYj8Y4yMpOG09lHf3yIFPzA3fwHZTAQVtU4JUTeFDrdgDdlI8wAz5Qy2KxswReI7QODZcOr0ZH3q2hIDBI7zq16tuk3FNPxAI4wN+pkoccYoE4YJU5EdUtM4Qst26v26PwIMAKj3P/2YUKgYAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-tiff { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmRJREFUeNp0UktPE1EU/qYzHWstlrYJNcWUElyUJsaNGh9B0g1Lo0v9Ey78EbrVxBhXuHShm25YGBJRQpAYBDEWpaEPEhksdVpbyjzveO4MfZDCTWbauefc736PIziOA77OPH2yJCcSGdg2uksQAKofFou/7VrtASRpvVNynj13f6XOhjg8HAlMTIQdy/LO+v3uYUPTkAHCTb+cK+0pdyGK6+hbvu4/xiyHbncYAwfR19ZgbG/DoO9LsSgeTd9JXoxfyMG2rvQDdBlwIZauQ5ufh12twioU4E+nYU1NIRCNIDs+Bt28mXzx8VNuZ796j9q/DgAwomwqClilAmF0FE4wCInAlkjO4y+r0JgNX2os6XPYS2q/cQyAcQatFjA0BPH6NYipccAwIGUy2CVJFZInkKlyJAqx3T4/IMGmJkeWIWSz5KgI5pdhb3yDXS5DSCYh8rTID8s0wexeVD0GtMd85KkkefFxUfE47M1NokbJkByEQl6tL+ouAI+MUwbFhnYbaJKc/Sqg0x4H4eDRGDA56fUOABA9/GsCpaIHwr8FOhQ823O5RfW66tUGADhNy3RNRDjcN41HLxdQ8J6jYTsOQLfOJBK4f+s2/uoathoNGKT1MtFeVHZxdWTEZfEq/wMKl3rCJOIzTV6ADs2R5ulYDDNkYjp0DhrF+zCVgkw31+v1UxjQZkNV0SADd2o1MIuc9gmY+/kLxb0/UFoHePd9A1qzeUoKpilx9xcLWzgg+u/zeVfuQqkM9bCN1ysrWKXxdtPgvScwUAm58XZ52W16QyPtifRUzi588GbEi1ztHPsvwAC4uC9qhnsZvwAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-txt { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAeJJREFUeNp8UrtOG1EQPfsyXiyzBguIJSyChZBBEFCKpKHLo6egpErNn8CHgH8gkZIiTSIXLhJAWCgkoMgRMSiRBSK29z4y9+I1d/HCrFb3MTPnnjkzlpQSynY+fP70fGF2gQuByCz6lfdd9Uurfvrrjes6762eb3tzQ69uFJwPsqOPC+MBEmxxphi4tlU5OGmsOzaBWLc+O9oIIVhScidkyGZ8vH62nHtSKlaI4cse6TjAfSaFBBcco0EWqyvzubmpyQrj/FXk75cQaSEMeMXU8xykPA/Hjd/6/LRcyjEpt2i7HAe4A2TeLZWKUOJaVLxj27j813EHGKCXaAJExu/4BOdiAED08riQD2riOrexyRoYc3CvsAbLGAAjZga7vgZG23WMCdBvoxKJc36TRBlMiaa2JByjNqqD8qkYc1pjDK7abey+/YhrWlfKswhpiCR96aEU9o5+QE3g2ovVWDm2Sc22bBQm8vrVpbkS9r+doPr1EOWZaQ0yFoxg2PcREosEAI4uvZhJpzFMP+cSXRbq+043RManez+tNWKMI6GN0g0Z04HFR+NoNC/0yx717efZOSbzY3AcR4Op2AGA5p/W31r9e0vNgSrh9OwCrpeCkqvZuqTybnpRqx/r2CjvvwADAJC/7lzAzQmwAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-wav { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAApFJREFUeNpsU1tPE0EYPXtpKbX0wqUQKVQMFdIXQBNCQBs06KP+B8ODGh+Mf4b/4IsGE54kxhcMBrkp7YOQgBRvSKG73fvsrt8Otoask0xmd+b7zpxzvm8E3/cRjPkniyulW0NFy2JoDkEAguOlpXJ9p3L8MBqVl4O9YHxae8pXuRlcGO7KPLhfTDVUqwUgigJMy4Whm6lEXHjxYf3XnByRN0QB/2KaH7btMlUxoRJAcyqKhdOaht7+DJ49n+2cvTnwynXcsb+kLwJ4rgfmMDDGWqvneXCZS9ND7mov5h9ND85M9y86Dpto5rUkuJ4Py3YDJpy6QGJPayqB+Njf+43XL220t0cwOZkfrNXsBUqZugDA6CbLdAiAwaek1ZU9LmP8Rh6S78GsGxjOp9FdzKJaVZIhBgGASzK21w/wbrnCk8euX+EMAjaaZuPHdwUdHVFYluuGPGCORwwYjg5rqOwccRk+3Ux0IEvntmsNG4ZmUayL/wAwKHUNfZfTKN0ZRaw9Cof8qJ/pMAyHy5KkAMTksSEJtnMenM7EMVMawbejMzJRh67bXEYiIXEAVTW50SEAhzqwfqrBcXx4VOhYm4RsNgHbsJFOyZTsQ1MN+hcohoUlkFiMT+TQFpMwXOjGpXgE+XwGk1N5pFJtKNCequgYGupCRBbCDOp0KBJc4VoP3dyBONW8uydBgBHUThqQKCk3mEZ/LoUG+RBioJO7VarAwEAntjYPiUUW9Hh4b2R7k9j98hN37xWx8fGAt3eIAdVMLn+uUv+b2KReSCZjZJiB9bV9jIz2ofr1BKvvd7G9dRC80lae0HzOt+cWVnrSKDrMJykifwNBpCgE/UAllEXufmDu8Zlffvvm8XSQ90eAAQA0pF7c08o4PAAAAABJRU5ErkJggg==); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-wmv { + background-image:url("data:image/svg+xml;charset=utf8,%3Csvg id='Layer_2' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72 100'%3E%3Cstyle/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='36.2' y1='101' x2='36.2' y2='3.005' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='0' stop-color='%23e2cde4'/%3E%3Cstop offset='.17' stop-color='%23e0cae2'/%3E%3Cstop offset='.313' stop-color='%23dbc0dd'/%3E%3Cstop offset='.447' stop-color='%23d2b1d4'/%3E%3Cstop offset='.575' stop-color='%23c79dc7'/%3E%3Cstop offset='.698' stop-color='%23ba84b9'/%3E%3Cstop offset='.819' stop-color='%23ab68a9'/%3E%3Cstop offset='.934' stop-color='%239c4598'/%3E%3Cstop offset='1' stop-color='%23932a8e'/%3E%3C/linearGradient%3E%3Cpath d='M45.2 1l27 26.7V99H.2V1h45z' fill='url(%23SVGID_1_)'/%3E%3Cpath d='M45.2 1l27 26.7V99H.2V1h45z' fill-opacity='0' stroke='%23882383' stroke-width='2'/%3E%3Cpath d='M9.1 91.1L4.7 72.5h3.9l2.8 12.8 3.4-12.8h4.5l3.3 13 2.9-13h3.8l-4.6 18.6h-4L17 77.2l-3.7 13.9H9.1zm22.1 0V72.5h5.7l3.4 12.7 3.4-12.7h5.7v18.6h-3.5V76.4l-3.7 14.7h-3.7l-3.7-14.7v14.7h-3.6zm26.7 0l-6.7-18.6h4.1l4.8 13.8 4.6-13.8h4L62 91.1h-4.1z' fill='%23fff'/%3E%3ClinearGradient id='SVGID_2_' gradientUnits='userSpaceOnUse' x1='18.2' y1='50.023' x2='18.2' y2='50.023' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='.005' stop-color='%23963491'/%3E%3Cstop offset='1' stop-color='%2370136b'/%3E%3C/linearGradient%3E%3ClinearGradient id='SVGID_3_' gradientUnits='userSpaceOnUse' x1='11.511' y1='51.716' x2='65.211' y2='51.716' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='.005' stop-color='%23963491'/%3E%3Cstop offset='1' stop-color='%2370136b'/%3E%3C/linearGradient%3E%3Cpath d='M64.3 55.5c-1.7-.2-3.4-.3-5.1-.3-7.3-.1-13.3 1.6-18.8 3.7S29.6 63.6 23.3 64c-3.4.2-7.3-.6-8.5-2.4-.8-1.3-.8-3.5-1-5.7-.6-5.7-1.6-11.7-2.4-17.3.8-.9 2.1-1.3 3.4-1.7.4 1.1.2 2.7.6 3.8 7.1.7 13.6-.4 20-1.5 6.3-1.1 12.4-2.2 19.4-2.6 3.4-.2 6.9-.2 10.3 0m-9.9 15.3c.5-.2 1.1-.3 1.9-.2.2-3.7.3-7.3.3-11.2-6.2.2-11.9.9-17 2.2.2 4 .4 7.8.3 12 4-1.1 7.7-2.5 12.6-2.7m2-12.1h1.1c.4-.4.2-1.2.2-1.9-1.5-.6-1.8 1-1.3 1.9zm3.9-.2h1.5V38h-1.3c0 .7-.4.9-.2 1.7zm4 0c.5-.1.8 0 1.1.2.4-.3.2-1.2.2-1.9h-1.3v1.7zm-11.5.3h.9c.4-.3.2-1.2.2-1.9-1.4-.4-1.6 1.2-1.1 1.9zm-4 .4c.7.2.8-.3 1.5-.2v-1.7c-1.5-.4-1.7.6-1.5 1.9zm-3.6-1.1c0 .6-.1 1.4.2 1.7.5.1.5-.4 1.1-.2-.2-.6.5-2-.4-1.9-.1.4-.8.1-.9.4zm-31.5.8c.4-.1 1.1.6 1.3 0-.5 0-.1-.8-.2-1.1-.7.2-1.3.3-1.1 1.1zm28.3-.4c-.3.3.2 1.1 0 1.9.6.2.6-.3 1.1-.2-.2-.6.5-2-.4-1.9-.1.3-.4.2-.7.2zm-3.5 2.8c.5-.1.9-.2 1.3-.4.2-.8-.4-.9-.2-1.7h-.9c-.3.3-.1 1.3-.2 2.1zm26.9-1.8c-2.1-.1-3.3-.2-5.5-.2-.5 3.4 0 7.8-.5 11.2 2.4 0 3.6.1 5.8.3M33.4 41.6c.5.2.1 1.2.2 1.7.5-.1 1.1-.2 1.5-.4.6-1.9-.9-2.4-1.7-1.3zm-4.7.6v1.9c.9.2 1.2-.2 1.9-.2-.1-.7.2-1.7-.2-2.1-.5.2-1.3.1-1.7.4zm-5.3.6c.3.5 0 1.6.4 2.1.7.1.8-.4 1.5-.2-.1-.7-.3-1.2-.2-2.1-.8-.2-.9.3-1.7.2zm-7.5 2H17c.2-.9-.4-1.2-.2-2.1-.4.1-1.2-.3-1.3.2.6.2-.1 1.7.4 1.9zm3.4 1c.1 4.1.9 9.3 1.4 13.7 8 .1 13.1-2.7 19.2-4.5-.5-3.9.1-8.7-.7-12.2-6.2 1.6-12.1 3.2-19.9 3zm.5-.8h1.1c.4-.5-.2-1.2 0-2.1h-1.5c.1.7.1 1.6.4 2.1zm-5.4 7.8c.2 0 .3.2.4.4-.4-.7-.7.5-.2.6.1-.2 0-.4.2-.4.3.5-.8.7-.2.8.7-.5 1.3-1.2 2.4-1.5-.1 1.5.4 2.4.4 3.8-.7.5-1.7.7-1.9 1.7 1.2.7 2.5 1.2 4.2 1.3-.7-4.9-1.1-8.8-1.6-13.7-2.2.3-4-.8-5.1-.9.9.8.6 2.5.8 3.6 0-.2 0-.4.2-.4-.1.7.1 1.7-.2 2.1.7.3.5-.2.4.9m44.6 3.2h1.1c.3-.3.2-1.1.2-1.7h-1.3v1.7zm-4-1.4v1.3c.4.4.7-.2 1.5 0v-1.5c-.6 0-1.2 0-1.5.2zm7.6 1.4h1.3v-1.5h-1.3c.1.5 0 1 0 1.5zm-11-1v1.3h1.1c.3-.3.4-1.7-.2-1.7-.1.4-.8.1-.9.4zm-3.6.4c.1.6-.3 1.7.4 1.7 0-.3.5-.2.9-.2-.2-.5.4-1.8-.4-1.7-.1.3-.6.2-.9.2zm-3.4 1v1.5c.7.2.6-.4 1.3-.2-.2-.5.4-1.8-.4-1.7-.1.3-.8.2-.9.4zM15 57c.7-.5 1.3-1.7.2-2.3-.7.4-.8 1.6-.2 2.3zm26.1-1.3c-.1.7.4.8.2 1.5.9 0 1.2-.6 1.1-1.7-.4-.5-.8.1-1.3.2zm-3 2.7c1 0 1.2-.8 1.1-1.9h-.9c-.3.4-.1 1.3-.2 1.9zm-3.6-.4v1.7c.6-.1 1.3-.2 1.5-.8-.6 0 .3-1.6-.6-1.3 0 .4-.7.1-.9.4zM16 60.8c-.4-.7-.2-2-1.3-1.9.2.7.2 2.7 1.3 1.9zm13.8-.9c.5 0 .1.9.2 1.3.8.1 1.2-.2 1.7-.4v-1.7c-.9-.1-1.6.1-1.9.8zm-4.7.6c0 .8-.1 1.7.4 1.9 0-.5.8-.1 1.1-.2.3-.3-.2-1.1 0-1.9-.7-.2-1 .1-1.5.2zM19 62.3v-1.7c-.5 0-.6-.4-1.3-.2-.1 1.1 0 2.1 1.3 1.9zm2.5.2h1.3c.2-.9-.3-1.1-.2-1.9h-1.3c-.1.9.2 1.2.2 1.9z' fill='url(%23SVGID_3_)'/%3E%3ClinearGradient id='SVGID_4_' gradientUnits='userSpaceOnUse' x1='45.269' y1='74.206' x2='58.769' y2='87.706' gradientTransform='matrix(1 0 0 -1 0 102)'%3E%3Cstop offset='0' stop-color='%23f9eff6'/%3E%3Cstop offset='.378' stop-color='%23f8edf5'/%3E%3Cstop offset='.515' stop-color='%23f3e6f1'/%3E%3Cstop offset='.612' stop-color='%23ecdbeb'/%3E%3Cstop offset='.69' stop-color='%23e3cce2'/%3E%3Cstop offset='.757' stop-color='%23d7b8d7'/%3E%3Cstop offset='.817' stop-color='%23caa1c9'/%3E%3Cstop offset='.871' stop-color='%23bc88bb'/%3E%3Cstop offset='.921' stop-color='%23ae6cab'/%3E%3Cstop offset='.965' stop-color='%239f4d9b'/%3E%3Cstop offset='1' stop-color='%23932a8e'/%3E%3C/linearGradient%3E%3Cpath d='M45.2 1l27 26.7h-27V1z' fill='url(%23SVGID_4_)'/%3E%3Cpath d='M45.2 1l27 26.7h-27V1z' fill-opacity='0' stroke='%23882383' stroke-width='2' stroke-linejoin='bevel'/%3E%3C/svg%3E"); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-xls { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmxJREFUeNpsU0trFEEQ/mamZ3Y2+0zIC2MmITEkUYgERFQErx5E8KTi1b/h79A/4SW3nCNeYggBYZVEMU/y3N3Z7M7OTD/G6lk2ruw20zRdU/XV91VVG0mSQK/3n1a/jky6d6Xs3G8WXS+Pw5N6LXjLLGuna/78oZKerGsYKtrDE16uJGL1L9gEOOcYd2dL1fNwrbL//aXN7J1efPMmkUqEFAk0A0VZNbFEaQCBscIkXj975y3NLq9xye8PBkAniHOFph+j2eC4rsdoB4LsFubGl/Hq8RtvYWpxTQi52o1jvWiGYaRZL0/auDgOkC/Z8BYL2Pqxidp1FZkhoDxpeaXA/Ujuj/4HoOxKKjiOiek7RUShRNQWaNYFQuMafrYCxiw4ozZKfqbYJ0EvRdl1DQyyTs8XCNTA6UELMwvDyLpZWIZNNlNLlQOK2LMJRJ+5AkuZ1S7CFFzJzk56GnUjQWlYkqCoBWFbonEVYcLLA4dNnB624GQsDBWIgfZJEgxkoChzSFWvn4VpQemDm2VwXQsXJwF1h6c+gxlQ5jgSiEUEt0wdIe7tMES+nEG2aCLiJMOIIWIr9e0DEELAMUrwRuchVAyTKimUwO75Jm6VF3Bv7imOaj+xd7UFKVS/BPJF1b/E4tgTrE49J60O5kceoNqowiuuYKa8ghHXA48U9MT2AQgyRvTThE30bQiaSGa4yLMJNFo+Dq/2cHt4CYlwyFf2S6BHwwrMw/avDbR5C1k7h1YQ4KH3Amf+AcZyEbZPv9CItzQD1l9EbtYOjv74v/d3O9RMPTDrsEwGIWN8q2yk7XNYRs9JrRv3V4ABADSGR6eQ0/NQAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-xlsx { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU8tqFEEUPVXdPY/ueWZIoiYZiSYKYhJc6EbduHOhgijo3t/wH1z6B0JAhOyMILhxo4kJGk1ASTAxwWF0Mpp5dHc9vFUzYwidaoqmq+8959xzbzGtNcx69PTS26ETmQtS9r4Hy/xv7MW7jV+th5yzVcaYPX/++It9u4NAv+CVR6tBUUTqMJsDcRzjZOZM8W9ZLKx+/XDb4e5/kH5In0lpIYWGUaC0YTZnBCAEKoVR3L36oDo7NbsglZwbqD6iQKOXFMcKUVfBkBAoQhlD5xxMDp/HrSv3q1JgYW3z0x0KXzkCYJaRZljru23aHWTzLiamAyytv0O9UYdf5PArqlppBfMUfu4oALErqZBKcUxMFRCHEp0DgW5Lo4N9NIN1dF0XXsVFOUyPJTzo+WBANDidjp8tgHGG3c0DnJ4uIRf4cOCBaW5KjY8xkZL72xpJ9QcFz5bVqHUJGHZL2YtNmKi06YCyiVFb4s/vEKMTAf1p4edOG6mMi1zR6wEpdUwX+vLDtkCzHoK7ptcM6ayLmGajvtex4PliyoIkFRjmUEASelB2rXQRSfjUCT9PlWpmW21iTGzCAyEkUixPRqXhe2V4zKczbdmybgkpJ0cGOuA6Y2MTCsKoi5HsNK7N3MN+uwYaWbxYfoLLkzdxcew6lrYWaZhm8PHHG3zffp1UwJSHz9vvkU8PodbcQYYYS5lxYkxTkGdVDQdV1Js1qPgYD6JIuIE7gsXVefIhIuM05k7dwMbeMmh87a18ufIMaVYyprrJLgje2Nr+1tzYXANnDnr3zRhHj37Vvy2wpXHtNAd5/wQYAD6WMuT2CwoVAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-xml { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAilJREFUeNqMks1PE0EYxh+g3W2t1G0sEqyISynUFJsSOShNwCamiYZED3LgIkcuxoN/iCZePZiYGD2aGD+i0F5KMChxlVaakAK2ykcAt+WzdLu7zkxo3WZL4pu8mXfmeeY3885ug67roPFh5nvc62m9hjoR+5LMp7MrkYf370qVtco+VtCUFpbj+jGR+JbWn76OyQ8ePwsZATQb8R/hanZgINgj9IqeuBFCw1Kt9OMBnNWCs24XwkG/QKYUEiGjVAPQof/rq0783pShET3ULQo8xz0iS5FaANmrHQH2DoqY+DSLSz6RzecWlnD9ymU47LYjd4O5BXqDTG4FM3NpTEkpdJ5rw0AowLRMbhUfp58gTOaD/UHmNQPI6YmvKWRX1zESHUJ/oBs2nmPa+Mgw0ZIM3tZyGoJwygzQNB2jNyJIZX7iB0lpPoM70UGmPX8zCU+rG8NDVxHwdiC5mKsPUFUN/gvtLLf39sFzVqaN3YrC6TjBauqhXhNA1TQoqloV7Da+pjZq1FsXUCamF29j6LvYhf3iISamZ3Fv9DZevouhRzzPfOG+3hpA9U9UyioOlTJ7pFeTCQS6RGzIebyf+oz5pSzWtmSW1EO9phvQ00slBRt/8qR3DoWdXbiczUiTzd52D+tdLmyTB14mx1rMAKVcRpEATjrsuElee/HXGmnFRyBOGD30C/nEDjNgs7CDpsYmnHG3YPegBCvHs9oYfm8nG9dJa5X4K8AAQzQX4KSN3wcAAAAASUVORK5CYII=); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-yml { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdxJREFUeNqMUl1rE0EUPbM7m5Y0Zptu21AwWwhYpfSDFh+kvvRd8N0Hf4I/xWdf/Q158F0QoQ+CVsFKaLSQpt/dpmvztTOzzky6cetOpWcZZvbO3MO5514SxzEU3r57/3GpWllM/tP4sL3TarROXuSo/SWJvX71Uu80Cfhlr/T4UdWFAVfdnmsTUtvdP35OUyQKVnJgXDBTcj9icAsTeLax7j/052qM81UjwW1QJXEhMF0qYnN90fdnvdogYmvJPU0/VBApD4hcDrWRcyikfB17srzgW7b9Rh1vEvxDlI4tVytaBSEEtmWh0xsUMwpwnWjqAlcxogiHd1wiQyCu87iI/+sJtf6+NXsgpd7FWCMB50KvkYMGMbLdZgLlfj+K9K4+FnFQ2x7WntIs50AbmiGwLILt+k+EvzvSNIHzdigdJ/AmXQRhiHv5POSwYmG+cqPVo0HqDxj8uTK2vn1Hfa+JmdIkvtZ/4fOPXU3WPDpFeNWVyUKryCiIGMN4zsH98gym3CIcOTwT+XHdXrdQQHAZotE8kBPpSqPNHtBOr48HUmLOcXRJT9dWNMGYJFby91pHOAvaykSaITg+bwefdhrteDRTMSwyrFCgI88E056Hy+4Ah2cXQZL3R4ABALUe7fqXWFN6AAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} + +.ipfs-zip { + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAm9JREFUeNpsk0tv00AUhc+MY6dOmgeFJg1FoVVpUWlFC0s2IFF1jxBbhKj4BSxYdscPYcEmQmIDq0gsERIViy4TpD7VFzF1Ho5je2a4thOqNhlp5Mz4zudzzp0wpRTC8fPrk0/TC6+fDtYicLH97T1Kc2vQDcs+rH3eUAxVznn0fn1DRM8E+iOdv5ct3XmZG6yVlNj6solUbgVTt0q5FGtX6vXqC6VklTE+KAO/OODHSIQPRQpsXC+kkEz2ELA0ystv84tLzyucsbWByisAGf+QAS2CCDRRLMJMmxC+i8C4jdLCm/zM7OOKFGptcO6/BTpJ0yeQB0Y+mfKQuZZG0jQgeRbW8Xdomobs9LN8scc+UPHNy4Dwq8IljotIIQEm59/RoSyM1CKkXKZNBm7kIVgyM6wgAnSgRK9vqQfHPiMFDHqyFVsLR9Cm0o4YzoAASrSjCelQfRPb1Vc4qn0EY5L2W9GEaBLcxQgFHpGbkMIDJ69e+wjJ8VXqRgKid0r7ftQdxkRs9SqA2kgAm14SSIQh9uhuLGPMnKJs/5KquL1x0N0RCsizigoDaLqBdHoMiyvrlBsHVx1wphD4BCewoqxGKKDwAgtOy8JufYuk+5golGGaGZwc1sIGoDz3AOPZSVLaHgVwydoJDM1H4DbQODughB3YpOD44HfoHgnu4e7So0uAi0stHLJ3Aud8B9bpHu6vPoSu9TtDl6tUuoFiIYOgu0+158MKmOxomtyD3Qi/3MTR7i8K0EDG1GHO5DE3X4DvNahZlJOwEkOATvdPc2//hx3mXJ5lFJaF8K8bStd0YGfnOJbMGex21x6c+yfAAOlIPDJzr7cLAAAAAElFTkSuQmCC); + background-repeat:no-repeat; + background-size:contain +} diff --git a/assets/dir-index-html/src/style.css b/assets/dir-index-html/src/style.css new file mode 100644 index 000000000..3e7b8a734 --- /dev/null +++ b/assets/dir-index-html/src/style.css @@ -0,0 +1,212 @@ +body { + color:#34373f; + font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; + font-size:14px; + line-height:1.43; + margin:0; + word-break:break-all; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100%; + -webkit-tap-highlight-color:transparent +} + +a { + color:#117eb3; + text-decoration:none +} + +a:hover { + color:#00b0e9; + text-decoration:underline +} + +a:active, +a:visited { + color:#00b0e9 +} + +strong { + font-weight:700 +} + +table { + border-collapse:collapse; + border-spacing:0; + max-width:100%; + width:100% +} + +table:last-child { + border-bottom-left-radius:3px; + border-bottom-right-radius:3px +} + +tr:first-child td { + border-top:0 +} + +tr:nth-of-type(even) { + background-color:#f7f8fa +} + +td { + border-top:1px solid #d9dbe2; + padding:.65em; + vertical-align:top +} + +#page-header { + align-items:center; + background:#0b3a53; + border-bottom:4px solid #69c4cd; + color:#fff; + display:flex; + font-size:1.12em; + font-weight:500; + justify-content:space-between; + padding:0 1em +} + +#page-header a { + color:#69c4cd +} + +#page-header a:active { + color:#9ad4db +} + +#page-header a:hover { + color:#fff +} + +#page-header-logo { + height:2.25em; + margin:.7em .7em .7em 0; + width:7.15em +} + +#page-header-menu { + align-items:center; + display:flex; + margin:.65em 0 +} + +#page-header-menu div { + margin:0 .6em +} + +#page-header-menu div:last-child { + margin:0 0 0 .6em +} + +#page-header-menu svg { + fill:#69c4cd; + height:1.8em; + margin-top:.125em +} + +#page-header-menu svg:hover { + fill:#fff +} + +.menu-item-narrow { + display:none +} + +#content { + border:1px solid #d9dbe2; + border-radius:4px; + margin:1em +} + +#content-header { + background-color:#edf0f4; + border-bottom:1px solid #d9dbe2; + border-top-left-radius:3px; + border-top-right-radius:3px; + padding:.7em 1em +} + +.type-icon, +.type-icon>* { + width:1.15em +} + +.no-linebreak { + white-space:nowrap +} + +.ipfs-hash { + color:#7f8491; + font-family:monospace +} + +@media only screen and (max-width:500px) { + .menu-item-narrow { + display:inline + } + .menu-item-wide { + display:none + } +} + +@media print { + #page-header { + display:none + } + #content-header, + .ipfs-hash, + body { + color:#000 + } + #content-header { + border-bottom:1px solid #000 + } + #content { + border:1px solid #000 + } + a, + a:visited { + color:#000; + text-decoration:underline + } + a[href]:after { + content:" (" attr(href) ")" + } + tr { + page-break-inside:avoid + } + tr:nth-of-type(even) { + background-color:transparent + } + td { + border-top:1px solid #000 + } +} + +@-ms-viewport { + width:device-width +} + +.d-flex { + display:flex +} + +.flex-wrap { + flex-flow:wrap +} + +.flex-shrink-1 { + flex-shrink:1 +} + +.ml-auto { + margin-left:auto +} + +.table-responsive { + display:block; + width:100%; + overflow-x:auto; + -webkit-overflow-scrolling:touch +} diff --git a/assets/dir-index-html/test/go.mod b/assets/dir-index-html/test/go.mod new file mode 100644 index 000000000..fde71afe9 --- /dev/null +++ b/assets/dir-index-html/test/go.mod @@ -0,0 +1,3 @@ +module github.com/ipfs/dir-index-html/test + +go 1.16 diff --git a/assets/dir-index-html/test/main.go b/assets/dir-index-html/test/main.go new file mode 100644 index 000000000..c02523a9f --- /dev/null +++ b/assets/dir-index-html/test/main.go @@ -0,0 +1,116 @@ +package main + +import ( + "fmt" + "net/http" + "net/url" + "os" + "text/template" +) + +const templateFile = "../dir-index.html" + +// Copied from go-ipfs/core/corehttp/gateway_indexPage.go +type listingTemplateData struct { + GatewayURL string + DNSLink bool + Listing []directoryItem + Size string + Path string + Breadcrumbs []breadcrumb + BackLink string + Hash string +} + +type directoryItem struct { + Size string + Name string + Path string + Hash string + ShortHash string +} + +type breadcrumb struct { + Name string + Path string +} + +var testPath = "/ipfs/QmFooBarQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7/a/b/c" +var testData = listingTemplateData{ + GatewayURL: "//localhost:3000", + DNSLink: true, + Listing: []directoryItem{{ + Size: "25 MiB", + Name: "short-film.mov", + Path: testPath + "/short-film.mov", + Hash: "QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR", + ShortHash: "QmbW\u2026sMnR", + }, { + Size: "23 KiB", + Name: "250pxيوسف_الوزاني_صورة_ملتقطة_بواسطة_مرصد_هابل_الفضائي_توضح_سديم_السرطان،_وهو_بقايا_مستعر_أعظم._.jpg", + Path: testPath + "/250pxيوسف_الوزاني_صورة_ملتقطة_بواسطة_مرصد_هابل_الفضائي_توضح_سديم_السرطان،_وهو_بقايا_مستعر_أعظم._.jpg", + Hash: "QmUwrKrMTrNv8QjWGKMMH5QV9FMPUtRCoQ6zxTdgxATQW6", + ShortHash: "QmUw\u2026TQW6", + }, { + Size: "1 KiB", + Name: "this-piece-of-papers-got-47-words-37-sentences-58-words-we-wanna-know.txt", + Path: testPath + "/this-piece-of-papers-got-47-words-37-sentences-58-words-we-wanna-know.txt", + Hash: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + ShortHash: "bafy\u2026bzdi", + }}, + Size: "25 MiB", + Path: testPath, + Breadcrumbs: []breadcrumb{{ + Name: "ipfs", + }, { + Name: "QmFooBarQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7", + Path: testPath + "/../../..", + }, { + Name: "a", + Path: testPath + "/../..", + }, { + Name: "b", + Path: testPath + "/..", + }, { + Name: "c", + Path: testPath, + }}, + BackLink: testPath + "/..", + Hash: "QmFooBazBar2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7", +} + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/" { + http.Error(w, "Ha-ha, tricked you! There are no files here!", http.StatusNotFound) + return + } + listingTemplate, err := template.New("dir-index.html").Funcs(template.FuncMap{ + "iconFromExt": func(name string) string { + return "ipfs-_blank" // place-holder + }, + "urlEscape": func(rawUrl string) string { + pathUrl := url.URL{Path: rawUrl} + return pathUrl.String() + }, + }).ParseFiles(templateFile) + if err != nil { + http.Error(w, fmt.Sprintf("failed to parse template file: %s", err), http.StatusInternalServerError) + return + } + err = listingTemplate.Execute(w, &testData) + if err != nil { + http.Error(w, fmt.Sprintf("failed to execute template: %s", err), http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusOK) + }) + if _, err := os.Stat(templateFile); err != nil { + wd, _ := os.Getwd() + fmt.Printf("could not open template file %q, relative to %q: %s\n", templateFile, wd, err) + os.Exit(1) + } + fmt.Printf("listening on localhost:3000\n") + http.ListenAndServe("localhost:3000", mux) +} diff --git a/blocks/blockstoreutil/remove.go b/blocks/blockstoreutil/remove.go index ae645f6fd..880f03365 100644 --- a/blocks/blockstoreutil/remove.go +++ b/blocks/blockstoreutil/remove.go @@ -8,7 +8,7 @@ import ( cid "github.com/ipfs/go-cid" bs "github.com/ipfs/go-ipfs-blockstore" - "github.com/ipfs/go-ipfs-pinner" + pin "github.com/ipfs/go-ipfs-pinner" ) // RemovedBlock is used to represent the result of removing a block. @@ -40,15 +40,15 @@ func RmBlocks(ctx context.Context, blocks bs.GCBlockstore, pins pin.Pinner, cids go func() { defer close(out) - unlocker := blocks.GCLock() - defer unlocker.Unlock() + unlocker := blocks.GCLock(ctx) + defer unlocker.Unlock(ctx) stillOkay := FilterPinned(ctx, pins, out, cids) for _, c := range stillOkay { // Kept for backwards compatibility. We may want to // remove this sometime in the future. - has, err := blocks.Has(c) + has, err := blocks.Has(ctx, c) if err != nil { out <- &RemovedBlock{Hash: c.String(), Error: err.Error()} continue @@ -58,7 +58,7 @@ func RmBlocks(ctx context.Context, blocks bs.GCBlockstore, pins pin.Pinner, cids continue } - err = blocks.DeleteBlock(c) + err = blocks.DeleteBlock(ctx, c) if err != nil { out <- &RemovedBlock{Hash: c.String(), Error: err.Error()} } else if !opts.Quiet { diff --git a/cmd/ipfs/daemon.go b/cmd/ipfs/daemon.go index c2cefbafe..5de7e056e 100644 --- a/cmd/ipfs/daemon.go +++ b/cmd/ipfs/daemon.go @@ -178,8 +178,8 @@ Headers. cmds.BoolOption(enableGCKwd, "Enable automatic periodic repo garbage collection"), cmds.BoolOption(adjustFDLimitKwd, "Check and raise file descriptor limits if needed").WithDefault(true), cmds.BoolOption(migrateKwd, "If true, assume yes at the migrate prompt. If false, assume no."), - cmds.BoolOption(enablePubSubKwd, "Instantiate the ipfs daemon with the experimental pubsub feature enabled."), - cmds.BoolOption(enableIPNSPubSubKwd, "Enable IPNS record distribution through pubsub; enables pubsub."), + cmds.BoolOption(enablePubSubKwd, "Enable experimental pubsub feature. Overrides Pubsub.Enabled config."), + cmds.BoolOption(enableIPNSPubSubKwd, "Enable IPNS over pubsub. Implicitly enables pubsub, overrides Ipns.UsePubsub config."), cmds.BoolOption(enableMultiplexKwd, "DEPRECATED"), cmds.StringOption(agentVersionSuffix, "Optional suffix to the AgentVersion presented by `ipfs id` and also advertised through BitSwap."), @@ -365,13 +365,26 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment defer repo.Close() offline, _ := req.Options[offlineKwd].(bool) - ipnsps, _ := req.Options[enableIPNSPubSubKwd].(bool) - pubsub, _ := req.Options[enablePubSubKwd].(bool) + ipnsps, ipnsPsSet := req.Options[enableIPNSPubSubKwd].(bool) + pubsub, psSet := req.Options[enablePubSubKwd].(bool) + if _, hasMplex := req.Options[enableMultiplexKwd]; hasMplex { log.Errorf("The mplex multiplexer has been enabled by default and the experimental %s flag has been removed.") log.Errorf("To disable this multiplexer, please configure `Swarm.Transports.Multiplexers'.") } + cfg, err := repo.Config() + if err != nil { + return err + } + + if !psSet { + pubsub = cfg.Pubsub.Enabled.WithDefault(false) + } + if !ipnsPsSet { + ipnsps = cfg.Ipns.UsePubsub.WithDefault(false) + } + // Start assembling node config ncfg := &core.BuildCfg{ Repo: repo, @@ -387,11 +400,6 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment routingOption, _ := req.Options[routingOptionKwd].(string) if routingOption == routingOptionDefaultKwd { - cfg, err := repo.Config() - if err != nil { - return err - } - routingOption = cfg.Routing.Type if routingOption == "" { routingOption = routingOptionDHTKwd @@ -559,6 +567,12 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment log.Error("failed to bootstrap (no peers found): consider updating Bootstrap or Peering section of your config") } }) + + } + + // Hard deprecation notice if someone still uses IPFS_REUSEPORT + if flag := os.Getenv("IPFS_REUSEPORT"); flag != "" { + log.Fatal("Support for IPFS_REUSEPORT was removed. Use LIBP2P_TCP_REUSEPORT instead.") } // collect long-running errors and block for shutdown diff --git a/core/commands/add.go b/core/commands/add.go index 0be67a203..83534493e 100644 --- a/core/commands/add.go +++ b/core/commands/add.go @@ -133,10 +133,10 @@ only-hash, and progress/status related flags) will change the final hash. cmds.BoolOption(wrapOptionName, "w", "Wrap files with a directory object."), cmds.StringOption(chunkerOptionName, "s", "Chunking algorithm, size-[bytes], rabin-[min]-[avg]-[max] or buzhash").WithDefault("size-262144"), cmds.BoolOption(pinOptionName, "Pin this object when adding.").WithDefault(true), - cmds.BoolOption(rawLeavesOptionName, "Use raw blocks for leaf nodes. (experimental)"), + cmds.BoolOption(rawLeavesOptionName, "Use raw blocks for leaf nodes."), cmds.BoolOption(noCopyOptionName, "Add the file using filestore. Implies raw-leaves. (experimental)"), cmds.BoolOption(fstoreCacheOptionName, "Check the filestore for pre-existing blocks. (experimental)"), - cmds.IntOption(cidVersionOptionName, "CID version. Defaults to 0 unless an option that depends on CIDv1 is passed. (experimental)"), + cmds.IntOption(cidVersionOptionName, "CID version. Defaults to 0 unless an option that depends on CIDv1 is passed. Passing version 1 will cause the raw-leaves option to default to true."), cmds.StringOption(hashOptionName, "Hash function to use. Implies CIDv1 if not sha2-256. (experimental)").WithDefault("sha2-256"), cmds.BoolOption(inlineOptionName, "Inline small blocks into CIDs. (experimental)"), cmds.IntOption(inlineLimitOptionName, "Maximum block size to inline. (experimental)").WithDefault(32), diff --git a/core/commands/dag/export.go b/core/commands/dag/export.go index bff9dc479..7290002e7 100644 --- a/core/commands/dag/export.go +++ b/core/commands/dag/export.go @@ -1,6 +1,7 @@ package dagcmd import ( + "context" "errors" "fmt" "io" @@ -8,17 +9,18 @@ import ( "time" "github.com/cheggaaa/pb" + blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" "github.com/ipfs/go-ipfs/core/commands/cmdenv" ipld "github.com/ipfs/go-ipld-format" - mdag "github.com/ipfs/go-merkledag" + iface "github.com/ipfs/interface-go-ipfs-core" cmds "github.com/ipfs/go-ipfs-cmds" gocar "github.com/ipld/go-car" + selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" ) func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { - c, err := cid.Decode(req.Arguments[0]) if err != nil { return fmt.Errorf( @@ -32,24 +34,6 @@ func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment return err } - // Code disabled until descent-issue in go-ipld-prime is fixed - // https://github.com/ribasushi/gip-muddle-up - // - // sb := gipselectorbuilder.NewSelectorSpecBuilder(gipfree.NodeBuilder()) - // car := gocar.NewSelectiveCar( - // req.Context, - // , - // []gocar.Dag{gocar.Dag{ - // Root: c, - // Selector: sb.ExploreRecursive( - // gipselector.RecursionLimitNone(), - // sb.ExploreAll(sb.ExploreRecursiveEdge()), - // ).Node(), - // }}, - // ) - // ... - // if err := car.Write(pipeW); err != nil {} - pipeR, pipeW := io.Pipe() errCh := make(chan error, 2) // we only report the 1st error @@ -61,15 +45,12 @@ func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment close(errCh) }() - if err := gocar.WriteCar( - req.Context, - mdag.NewSession( - req.Context, - api.Dag(), - ), - []cid.Cid{c}, - pipeW, - ); err != nil { + store := dagStore{dag: api.Dag(), ctx: req.Context} + dag := gocar.Dag{Root: c, Selector: selectorparse.CommonSelector_ExploreAllRecursively} + // TraverseLinksOnlyOnce is safe for an exhaustive selector but won't be when we allow + // arbitrary selectors here + car := gocar.NewSelectiveCar(req.Context, store, []gocar.Dag{dag}, gocar.TraverseLinksOnlyOnce()) + if err := car.Write(pipeW); err != nil { errCh <- err } }() @@ -153,3 +134,13 @@ func finishCLIExport(res cmds.Response, re cmds.ResponseEmitter) error { } } } + +type dagStore struct { + dag iface.APIDagService + ctx context.Context +} + +func (ds dagStore) Get(c cid.Cid) (blocks.Block, error) { + obj, err := ds.dag.Get(ds.ctx, c) + return obj, err +} diff --git a/core/commands/dag/import.go b/core/commands/dag/import.go index 244260601..e206652ce 100644 --- a/core/commands/dag/import.go +++ b/core/commands/dag/import.go @@ -42,8 +42,8 @@ func dagImport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment // This is especially important for use cases like dagger: // ipfs dag import $( ... | ipfs-dagger --stdout=carfifos ) // - unlocker := node.Blockstore.PinLock() - defer unlocker.Unlock() + unlocker := node.Blockstore.PinLock(req.Context) + defer unlocker.Unlock(req.Context) doPinRoots, _ := req.Options[pinRootsOptionName].(bool) @@ -87,7 +87,7 @@ func dagImport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment ret := RootMeta{Cid: c} - if block, err := node.Blockstore.Get(c); err != nil { + if block, err := node.Blockstore.Get(req.Context, c); err != nil { ret.PinErrorMsg = err.Error() } else if nd, err := ipld.Decode(block); err != nil { ret.PinErrorMsg = err.Error() diff --git a/core/commands/dht.go b/core/commands/dht.go index c481c776a..4379fb041 100644 --- a/core/commands/dht.go +++ b/core/commands/dht.go @@ -273,7 +273,7 @@ var provideRefDhtCmd = &cmds.Command{ return err } - has, err := nd.Blockstore.Has(c) + has, err := nd.Blockstore.Has(req.Context, c) if err != nil { return err } diff --git a/core/commands/dht_test.go b/core/commands/dht_test.go index 4c31a4b5c..76d5fad77 100644 --- a/core/commands/dht_test.go +++ b/core/commands/dht_test.go @@ -25,10 +25,10 @@ func TestKeyTranslation(t *testing.T) { } if pkk != pkname { - t.Fatal("keys didnt match!") + t.Fatal("keys didn't match!") } if ipnsk != ipnsname { - t.Fatal("keys didnt match!") + t.Fatal("keys didn't match!") } } diff --git a/core/commands/files.go b/core/commands/files.go index f081af799..3f7e3e6b9 100644 --- a/core/commands/files.go +++ b/core/commands/files.go @@ -338,12 +338,12 @@ IPFS Content Identifier and then "ipfs files cp" to copy it into MFS: $ ipfs add --quieter --pin=false # ... # ... outputs the root CID at the end -$ ipfs cp /ipfs/ /your/desired/mfs/path +$ ipfs files cp /ipfs/ /your/desired/mfs/path If you wish to fully copy content from a different IPFS peer into MFS, do not forget to force IPFS to fetch to full DAG after doing the "cp" operation. i.e: -$ ipfs cp /ipfs/ /your/desired/mfs/path +$ ipfs files cp /ipfs/ /your/desired/mfs/path $ ipfs pin add The lazy-copy feature can also be used to protect partial DAG contents from @@ -1044,68 +1044,93 @@ Remove files or directories. if err != nil { return err } - - path, err := checkPath(req.Arguments[0]) - if err != nil { - return err - } - - if path == "/" { - return fmt.Errorf("cannot delete root") - } - - // 'rm a/b/c/' will fail unless we trim the slash at the end - if path[len(path)-1] == '/' { - path = path[:len(path)-1] - } - // if '--force' specified, it will remove anything else, // including file, directory, corrupted node, etc force, _ := req.Options[forceOptionName].(bool) - - dir, name := gopath.Split(path) - - pdir, err := getParentDir(nd.FilesRoot, dir) - if err != nil { - if force && err == os.ErrNotExist { - return nil - } - return fmt.Errorf("parent lookup: %s", err) - } - - if force { - err := pdir.Unlink(name) - if err != nil { - if err == os.ErrNotExist { - return nil - } - return err - } - return pdir.Flush() - } - - // get child node by name, when the node is corrupted and nonexistent, - // it will return specific error. - child, err := pdir.Child(name) - if err != nil { - return err - } - dashr, _ := req.Options[recursiveOptionName].(bool) - - switch child.(type) { - case *mfs.Directory: - if !dashr { - return fmt.Errorf("%s is a directory, use -r to remove directories", path) + var errs []error + for _, arg := range req.Arguments { + path, err := checkPath(arg) + if err != nil { + errs = append(errs, fmt.Errorf("%s: %w", arg, err)) + continue } - } - err = pdir.Unlink(name) - if err != nil { - return err - } + if path == "/" { + errs = append(errs, fmt.Errorf("%s: cannot delete root", path)) + continue + } - return pdir.Flush() + // 'rm a/b/c/' will fail unless we trim the slash at the end + if path[len(path)-1] == '/' { + path = path[:len(path)-1] + } + + dir, name := gopath.Split(path) + + pdir, err := getParentDir(nd.FilesRoot, dir) + if err != nil { + if force && err == os.ErrNotExist { + continue + } + errs = append(errs, fmt.Errorf("%s: parent lookup: %w", path, err)) + continue + } + + if force { + err := pdir.Unlink(name) + if err != nil { + if err == os.ErrNotExist { + continue + } + errs = append(errs, fmt.Errorf("%s: %w", path, err)) + continue + } + err = pdir.Flush() + if err != nil { + errs = append(errs, fmt.Errorf("%s: %w", path, err)) + } + continue + } + + // get child node by name, when the node is corrupted and nonexistent, + // it will return specific error. + child, err := pdir.Child(name) + if err != nil { + errs = append(errs, fmt.Errorf("%s: %w", path, err)) + continue + } + + switch child.(type) { + case *mfs.Directory: + if !dashr { + errs = append(errs, fmt.Errorf("%s is a directory, use -r to remove directories", path)) + continue + } + } + + err = pdir.Unlink(name) + if err != nil { + errs = append(errs, fmt.Errorf("%s: %w", path, err)) + continue + } + + err = pdir.Flush() + if err != nil { + errs = append(errs, fmt.Errorf("%s: %w", path, err)) + } + continue + } + if len(errs) > 0 { + for _, err = range errs { + e := res.Emit(err.Error()) + if e != nil { + return e + } + } + return fmt.Errorf("can't remove some files") + } + return nil }, } diff --git a/core/commands/filestore.go b/core/commands/filestore.go index c36308bc1..03024eb5f 100644 --- a/core/commands/filestore.go +++ b/core/commands/filestore.go @@ -1,17 +1,18 @@ package commands import ( + "context" "fmt" "io" "os" filestore "github.com/ipfs/go-filestore" + cmds "github.com/ipfs/go-ipfs-cmds" core "github.com/ipfs/go-ipfs/core" cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv" e "github.com/ipfs/go-ipfs/core/commands/e" "github.com/ipfs/go-cid" - "github.com/ipfs/go-ipfs-cmds" ) var FileStoreCmd = &cmds.Command{ @@ -56,17 +57,17 @@ The output is: } args := req.Arguments if len(args) > 0 { - return listByArgs(res, fs, args) + return listByArgs(req.Context, res, fs, args) } fileOrder, _ := req.Options[fileOrderOptionName].(bool) - next, err := filestore.ListAll(fs, fileOrder) + next, err := filestore.ListAll(req.Context, fs, fileOrder) if err != nil { return err } for { - r := next() + r := next(req.Context) if r == nil { break } @@ -133,17 +134,17 @@ For ERROR entries the error will also be printed to stderr. } args := req.Arguments if len(args) > 0 { - return listByArgs(res, fs, args) + return listByArgs(req.Context, res, fs, args) } fileOrder, _ := req.Options[fileOrderOptionName].(bool) - next, err := filestore.VerifyAll(fs, fileOrder) + next, err := filestore.VerifyAll(req.Context, fs, fileOrder) if err != nil { return err } for { - r := next() + r := next(req.Context) if r == nil { break } @@ -206,7 +207,7 @@ var dupsFileStore = &cmds.Command{ } for cid := range ch { - have, err := fs.MainBlockstore().Has(cid) + have, err := fs.MainBlockstore().Has(req.Context, cid) if err != nil { return res.Emit(&RefWrapper{Err: err.Error()}) } @@ -235,7 +236,7 @@ func getFilestore(env cmds.Environment) (*core.IpfsNode, *filestore.Filestore, e return n, fs, err } -func listByArgs(res cmds.ResponseEmitter, fs *filestore.Filestore, args []string) error { +func listByArgs(ctx context.Context, res cmds.ResponseEmitter, fs *filestore.Filestore, args []string) error { for _, arg := range args { c, err := cid.Decode(arg) if err != nil { @@ -248,7 +249,7 @@ func listByArgs(res cmds.ResponseEmitter, fs *filestore.Filestore, args []string } continue } - r := filestore.Verify(fs, c) + r := filestore.Verify(ctx, fs, c) if err := res.Emit(r); err != nil { return err } diff --git a/core/commands/object/patch.go b/core/commands/object/patch.go index c98f12506..78f927032 100644 --- a/core/commands/object/patch.go +++ b/core/commands/object/patch.go @@ -4,13 +4,20 @@ import ( "fmt" "io" + "github.com/ipfs/go-cid" cmds "github.com/ipfs/go-ipfs-cmds" "github.com/ipfs/go-ipfs/core/commands/cmdenv" + coreiface "github.com/ipfs/interface-go-ipfs-core" "github.com/ipfs/interface-go-ipfs-core/options" "github.com/ipfs/interface-go-ipfs-core/path" ) +const ( + softBlockLimit = 1024 * 1024 // https://github.com/ipfs/go-ipfs/issues/7421#issuecomment-910833499 + allowBigBlock = "allow-big-block" +) + var ObjectPatchCmd = &cmds.Command{ Helptext: cmds.HelpText{ Tagline: "Deprecated way to create a new merkledag object based on an existing one. Use MFS with 'files cp|rm' instead.", @@ -41,6 +48,9 @@ For modern use cases, use MFS with 'files' commands: 'ipfs files --help'. "rm-link": patchRmLinkCmd, "set-data": patchSetDataCmd, }, + Options: []cmds.Option{ + cmds.BoolOption(allowBigBlock, "Disable block size check and allow creation of blocks bigger than 1MB. WARNING: such blocks won't be transferable over the standard bitswap.").WithDefault(false), + }, } var patchAppendDataCmd = &cmds.Command{ @@ -82,6 +92,10 @@ DEPRECATED and provided for legacy reasons. Use 'ipfs add' or 'ipfs files' inste return err } + if err := checkBlockSize(req, p.Cid(), api.Dag()); err != nil { + return err + } + return cmds.EmitOnce(res, &Object{Hash: p.Cid().String()}) }, Type: &Object{}, @@ -128,6 +142,10 @@ DEPRECATED and provided for legacy reasons. Use 'files cp' and 'dag put' instead return err } + if err := checkBlockSize(req, p.Cid(), api.Dag()); err != nil { + return err + } + return cmds.EmitOnce(res, &Object{Hash: p.Cid().String()}) }, Type: Object{}, @@ -166,6 +184,10 @@ DEPRECATED and provided for legacy reasons. Use 'files rm' instead. return err } + if err := checkBlockSize(req, p.Cid(), api.Dag()); err != nil { + return err + } + return cmds.EmitOnce(res, &Object{Hash: p.Cid().String()}) }, Type: Object{}, @@ -232,6 +254,10 @@ Use MFS and 'files' commands instead: return err } + if err := checkBlockSize(req, p.Cid(), api.Dag()); err != nil { + return err + } + return cmds.EmitOnce(res, &Object{Hash: p.Cid().String()}) }, Type: Object{}, @@ -242,3 +268,26 @@ Use MFS and 'files' commands instead: }), }, } + +func checkBlockSize(req *cmds.Request, c cid.Cid, dagAPI coreiface.APIDagService) error { + allowAnyBlockSize, _ := req.Options[allowBigBlock].(bool) + if allowAnyBlockSize { + return nil + } + + // We do not allow producing blocks bigger than 1 MiB to avoid errors + // when transmitting them over BitSwap. The 1 MiB constant is an + // unenforced and undeclared rule of thumb hard-coded here. + modifiedNode, err := dagAPI.Get(req.Context, c) + if err != nil { + return err + } + modifiedNodeSize, err := modifiedNode.Size() + if err != nil { + return err + } + if modifiedNodeSize > softBlockLimit { + return fmt.Errorf("produced block is over 1MB, object API is deprecated and does not support HAMT-sharding: to create big directories, please use the files API (MFS)") + } + return nil +} diff --git a/core/commands/pin/remotepin.go b/core/commands/pin/remotepin.go index 6548f29c3..3ca0d3532 100644 --- a/core/commands/pin/remotepin.go +++ b/core/commands/pin/remotepin.go @@ -174,7 +174,7 @@ NOTE: a comma-separated notation is supported in CLI for convenience: return err } - isInBlockstore, err := node.Blockstore.Has(rp.Cid()) + isInBlockstore, err := node.Blockstore.Has(req.Context, rp.Cid()) if err != nil { return err } diff --git a/core/commands/pubsub.go b/core/commands/pubsub.go index 1ec5016d6..47d893852 100644 --- a/core/commands/pubsub.go +++ b/core/commands/pubsub.go @@ -2,13 +2,15 @@ package commands import ( "context" - "encoding/binary" "fmt" "io" + "io/ioutil" "net/http" "sort" cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv" + mbase "github.com/multiformats/go-multibase" + "github.com/pkg/errors" cmds "github.com/ipfs/go-ipfs-cmds" options "github.com/ipfs/interface-go-ipfs-core/options" @@ -21,10 +23,11 @@ var PubsubCmd = &cmds.Command{ ipfs pubsub allows you to publish messages to a given topic, and also to subscribe to new messages on a given topic. -This is an experimental feature. It is not intended in its current state -to be used in a production environment. +EXPERIMENTAL FEATURE -To use, the daemon must be run with '--enable-pubsub-experiment'. + It is not intended in its current state to be used in a production + environment. To use, the daemon must be run with + '--enable-pubsub-experiment'. `, }, Subcommands: map[string]*cmds.Command{ @@ -35,14 +38,10 @@ To use, the daemon must be run with '--enable-pubsub-experiment'. }, } -const ( - pubsubDiscoverOptionName = "discover" -) - type pubsubMessage struct { - From []byte `json:"from,omitempty"` - Data []byte `json:"data,omitempty"` - Seqno []byte `json:"seqno,omitempty"` + From string `json:"from,omitempty"` + Data string `json:"data,omitempty"` + Seqno string `json:"seqno,omitempty"` TopicIDs []string `json:"topicIDs,omitempty"` } @@ -52,37 +51,42 @@ var PubsubSubCmd = &cmds.Command{ ShortDescription: ` ipfs pubsub sub subscribes to messages on a given topic. -This is an experimental feature. It is not intended in its current state -to be used in a production environment. +EXPERIMENTAL FEATURE -To use, the daemon must be run with '--enable-pubsub-experiment'. -`, - LongDescription: ` -ipfs pubsub sub subscribes to messages on a given topic. + It is not intended in its current state to be used in a production + environment. To use, the daemon must be run with + '--enable-pubsub-experiment'. -This is an experimental feature. It is not intended in its current state -to be used in a production environment. +PEER ENCODING -To use, the daemon must be run with '--enable-pubsub-experiment'. + Peer IDs in From fields are encoded using the default text representation + from go-libp2p. This ensures the same string values as in 'ipfs pubsub peers'. -This command outputs data in the following encodings: - * "json" -(Specified by the "--encoding" or "--enc" flag) +TOPIC AND DATA ENCODING + + Topics, Data and Seqno are binary data. To ensure all bytes are transferred + correctly the RPC client and server will use multibase encoding behind + the scenes. + + You can inspect the format by passing --enc=json. The ipfs multibase commands + can be used for encoding/decoding multibase strings in the userland. `, }, Arguments: []cmds.Argument{ - cmds.StringArg("topic", true, false, "String name of topic to subscribe to."), - }, - Options: []cmds.Option{ - cmds.BoolOption(pubsubDiscoverOptionName, "Deprecated option to instruct pubsub to discovery peers for the topic. Discovery is now built into pubsub."), + cmds.StringArg("topic", true, false, "Name of topic to subscribe to."), }, + PreRun: urlArgsEncoder, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { api, err := cmdenv.GetApi(env, req) if err != nil { return err } + if err := urlArgsDecoder(req, env); err != nil { + return err + } topic := req.Arguments[0] + sub, err := api.PubSub().Subscribe(req.Context, topic) if err != nil { return err @@ -101,33 +105,39 @@ This command outputs data in the following encodings: return err } - if err := res.Emit(&pubsubMessage{ - Data: msg.Data(), - From: []byte(msg.From()), - Seqno: msg.Seq(), - TopicIDs: msg.Topics(), - }); err != nil { + // turn bytes into strings + encoder, _ := mbase.EncoderByName("base64url") + psm := pubsubMessage{ + Data: encoder.Encode(msg.Data()), + From: msg.From().Pretty(), + Seqno: encoder.Encode(msg.Seq()), + } + for _, topic := range msg.Topics() { + psm.TopicIDs = append(psm.TopicIDs, encoder.Encode([]byte(topic))) + } + if err := res.Emit(&psm); err != nil { return err } } }, Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, psm *pubsubMessage) error { - _, err := w.Write(psm.Data) + _, dec, err := mbase.Decode(psm.Data) + if err != nil { + return err + } + _, err = w.Write(dec) return err }), + // DEPRECATED, undocumented format we used in tests, but not anymore + // \n\n "ndpayload": cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, psm *pubsubMessage) error { - psm.Data = append(psm.Data, '\n') - _, err := w.Write(psm.Data) - return err + return errors.New("--enc=ndpayload was removed, use --enc=json instead") }), + // DEPRECATED, uncodumented format we used in tests, but not anymore + // "lenpayload": cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, psm *pubsubMessage) error { - buf := make([]byte, 8, len(psm.Data)+8) - - n := binary.PutUvarint(buf, uint64(len(psm.Data))) - buf = append(buf[:n], psm.Data...) - _, err := w.Write(buf) - return err + return errors.New("--enc=lenpayload was removed, use --enc=json instead") }), }, Type: pubsubMessage{}, @@ -135,40 +145,56 @@ This command outputs data in the following encodings: var PubsubPubCmd = &cmds.Command{ Helptext: cmds.HelpText{ - Tagline: "Publish a message to a given pubsub topic.", + Tagline: "Publish data to a given pubsub topic.", ShortDescription: ` ipfs pubsub pub publishes a message to a specified topic. +It reads binary data from stdin or a file. -This is an experimental feature. It is not intended in its current state -to be used in a production environment. +EXPERIMENTAL FEATURE + + It is not intended in its current state to be used in a production + environment. To use, the daemon must be run with + '--enable-pubsub-experiment'. + +HTTP RPC ENCODING + + The data to be published is sent in HTTP request body as multipart/form-data. + + Topic names are binary data too. To ensure all bytes are transferred + correctly via URL params, the RPC client and server will use multibase + encoding behind the scenes. -To use, the daemon must be run with '--enable-pubsub-experiment'. `, }, Arguments: []cmds.Argument{ cmds.StringArg("topic", true, false, "Topic to publish to."), - cmds.StringArg("data", true, true, "Payload of message to publish.").EnableStdin(), + cmds.FileArg("data", true, false, "The data to be published.").EnableStdin(), }, + PreRun: urlArgsEncoder, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { api, err := cmdenv.GetApi(env, req) if err != nil { return err } + if err := urlArgsDecoder(req, env); err != nil { + return err + } topic := req.Arguments[0] - err = req.ParseBodyArgs() + // read data passed as a file + file, err := cmdenv.GetFileArg(req.Files.Entries()) + if err != nil { + return err + } + defer file.Close() + data, err := ioutil.ReadAll(file) if err != nil { return err } - for _, data := range req.Arguments[1:] { - if err := api.PubSub().Publish(req.Context, topic, []byte(data)); err != nil { - return err - } - } - - return nil + // publish + return api.PubSub().Publish(req.Context, topic, data) }, } @@ -178,10 +204,20 @@ var PubsubLsCmd = &cmds.Command{ ShortDescription: ` ipfs pubsub ls lists out the names of topics you are currently subscribed to. -This is an experimental feature. It is not intended in its current state -to be used in a production environment. +EXPERIMENTAL FEATURE -To use, the daemon must be run with '--enable-pubsub-experiment'. + It is not intended in its current state to be used in a production + environment. To use, the daemon must be run with + '--enable-pubsub-experiment'. + +TOPIC ENCODING + + Topic names are a binary data. To ensure all bytes are transferred + correctly RPC client and server will use multibase encoding behind + the scenes. + + You can inspect the format by passing --enc=json. ipfs multibase commands + can be used for encoding/decoding multibase strings in the userland. `, }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { @@ -195,15 +231,35 @@ To use, the daemon must be run with '--enable-pubsub-experiment'. return err } + // emit topics encoded in multibase + encoder, _ := mbase.EncoderByName("base64url") + for n, topic := range l { + l[n] = encoder.Encode([]byte(topic)) + } + return cmds.EmitOnce(res, stringList{l}) }, Type: stringList{}, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(multibaseDecodedStringListEncoder), }, } -func stringListEncoder(req *cmds.Request, w io.Writer, list *stringList) error { +func multibaseDecodedStringListEncoder(req *cmds.Request, w io.Writer, list *stringList) error { + for n, mb := range list.Strings { + _, data, err := mbase.Decode(mb) + if err != nil { + return err + } + list.Strings[n] = string(data) + } + return safeTextListEncoder(req, w, list) +} + +// converts list of strings to text representation where each string is placed +// in separate line with non-printable/unsafe characters escaped +// (this protects terminal output from being mangled by non-ascii topic names) +func safeTextListEncoder(req *cmds.Request, w io.Writer, list *stringList) error { for _, str := range list.Strings { _, err := fmt.Fprintf(w, "%s\n", cmdenv.EscNonPrint(str)) if err != nil { @@ -218,23 +274,37 @@ var PubsubPeersCmd = &cmds.Command{ Tagline: "List peers we are currently pubsubbing with.", ShortDescription: ` ipfs pubsub peers with no arguments lists out the pubsub peers you are -currently connected to. If given a topic, it will list connected -peers who are subscribed to the named topic. +currently connected to. If given a topic, it will list connected peers who are +subscribed to the named topic. -This is an experimental feature. It is not intended in its current state -to be used in a production environment. +EXPERIMENTAL FEATURE -To use, the daemon must be run with '--enable-pubsub-experiment'. + It is not intended in its current state to be used in a production + environment. To use, the daemon must be run with + '--enable-pubsub-experiment'. + +TOPIC AND DATA ENCODING + + Topic names are a binary data. To ensure all bytes are transferred + correctly RPC client and server will use multibase encoding behind + the scenes. + + You can inspect the format by passing --enc=json. ipfs multibase commands + can be used for encoding/decoding multibase strings in the userland. `, }, Arguments: []cmds.Argument{ - cmds.StringArg("topic", false, false, "topic to list connected peers of"), + cmds.StringArg("topic", false, false, "Topic to list connected peers of."), }, + PreRun: urlArgsEncoder, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { api, err := cmdenv.GetApi(env, req) if err != nil { return err } + if err := urlArgsDecoder(req, env); err != nil { + return err + } var topic string if len(req.Arguments) == 1 { @@ -256,6 +326,40 @@ To use, the daemon must be run with '--enable-pubsub-experiment'. }, Type: stringList{}, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(safeTextListEncoder), }, } + +// TODO: move to cmdenv? +// Encode binary data to be passed as multibase string in URL arguments. +// (avoiding issues described in https://github.com/ipfs/go-ipfs/issues/7939) +func urlArgsEncoder(req *cmds.Request, env cmds.Environment) error { + encoder, _ := mbase.EncoderByName("base64url") + for n, arg := range req.Arguments { + req.Arguments[n] = encoder.Encode([]byte(arg)) + } + return nil +} + +// Decode binary data passed as multibase string in URL arguments. +// (avoiding issues described in https://github.com/ipfs/go-ipfs/issues/7939) +func urlArgsDecoder(req *cmds.Request, env cmds.Environment) error { + for n, arg := range req.Arguments { + encoding, data, err := mbase.Decode(arg) + if err != nil { + return errors.Wrap(err, "URL arg must be multibase encoded") + } + + // Enforce URL-safe encoding is used for data passed via URL arguments + // - without this we get data corruption similar to https://github.com/ipfs/go-ipfs/issues/7939 + // - we can't just deny base64, because there may be other bases that + // are not URL-safe – better to force base64url which is known to be + // safe in URL context + if encoding != mbase.Base64url { + return errors.New("URL arg must be base64url encoded") + } + + req.Arguments[n] = string(data) + } + return nil +} diff --git a/core/commands/repo.go b/core/commands/repo.go index 307b4ffc5..20cc41fcd 100644 --- a/core/commands/repo.go +++ b/core/commands/repo.go @@ -239,7 +239,7 @@ func verifyWorkerRun(ctx context.Context, wg *sync.WaitGroup, keys <-chan cid.Ci defer wg.Done() for k := range keys { - _, err := bs.Get(k) + _, err := bs.Get(ctx, k) if err != nil { select { case results <- fmt.Sprintf("block %s was corrupt (%s)", k, err): diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 7cde3f38d..7c7ee3e81 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -453,7 +453,7 @@ var swarmAddrsLocalCmd = &cmds.Command{ }, Type: stringList{}, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(safeTextListEncoder), }, } @@ -485,7 +485,7 @@ var swarmAddrsListenCmd = &cmds.Command{ }, Type: stringList{}, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(safeTextListEncoder), }, } @@ -535,7 +535,7 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N return cmds.EmitOnce(res, &stringList{output}) }, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(safeTextListEncoder), }, Type: stringList{}, } @@ -600,7 +600,7 @@ it will reconnect. return cmds.EmitOnce(res, &stringList{output}) }, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(safeTextListEncoder), }, Type: stringList{}, } @@ -722,7 +722,7 @@ Filters default to those specified under the "Swarm.AddrFilters" config key. return cmds.EmitOnce(res, &stringList{output}) }, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(safeTextListEncoder), }, Type: stringList{}, } @@ -778,7 +778,7 @@ var swarmFiltersAddCmd = &cmds.Command{ return cmds.EmitOnce(res, &stringList{added}) }, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(safeTextListEncoder), }, Type: stringList{}, } @@ -844,7 +844,7 @@ var swarmFiltersRmCmd = &cmds.Command{ return cmds.EmitOnce(res, &stringList{removed}) }, Encoders: cmds.EncoderMap{ - cmds.Text: cmds.MakeTypedEncoder(stringListEncoder), + cmds.Text: cmds.MakeTypedEncoder(safeTextListEncoder), }, Type: stringList{}, } diff --git a/core/coreapi/block.go b/core/coreapi/block.go index 18d9fb763..e1ad9badc 100644 --- a/core/coreapi/block.go +++ b/core/coreapi/block.go @@ -46,10 +46,10 @@ func (api *BlockAPI) Put(ctx context.Context, src io.Reader, opts ...caopts.Bloc } if settings.Pin { - defer api.blockstore.PinLock().Unlock() + defer api.blockstore.PinLock(ctx).Unlock(ctx) } - err = api.blocks.AddBlock(b) + err = api.blocks.AddBlock(ctx, b) if err != nil { return nil, err } diff --git a/core/coreapi/dag.go b/core/coreapi/dag.go index 7994842b8..d056e8e6e 100644 --- a/core/coreapi/dag.go +++ b/core/coreapi/dag.go @@ -4,7 +4,7 @@ import ( "context" cid "github.com/ipfs/go-cid" - "github.com/ipfs/go-ipfs-pinner" + pin "github.com/ipfs/go-ipfs-pinner" ipld "github.com/ipfs/go-ipld-format" dag "github.com/ipfs/go-merkledag" ) @@ -18,7 +18,7 @@ type dagAPI struct { type pinningAdder CoreAPI func (adder *pinningAdder) Add(ctx context.Context, nd ipld.Node) error { - defer adder.blockstore.PinLock().Unlock() + defer adder.blockstore.PinLock(ctx).Unlock(ctx) if err := adder.dag.Add(ctx, nd); err != nil { return err @@ -30,7 +30,7 @@ func (adder *pinningAdder) Add(ctx context.Context, nd ipld.Node) error { } func (adder *pinningAdder) AddMany(ctx context.Context, nds []ipld.Node) error { - defer adder.blockstore.PinLock().Unlock() + defer adder.blockstore.PinLock(ctx).Unlock(ctx) if err := adder.dag.AddMany(ctx, nds); err != nil { return err diff --git a/core/coreapi/dht.go b/core/coreapi/dht.go index 892e75576..3f10a0ffc 100644 --- a/core/coreapi/dht.go +++ b/core/coreapi/dht.go @@ -76,7 +76,7 @@ func (api *DhtAPI) Provide(ctx context.Context, path path.Path, opts ...caopts.D c := rp.Cid() - has, err := api.blockstore.Has(c) + has, err := api.blockstore.Has(ctx, c) if err != nil { return err } diff --git a/core/coreapi/object.go b/core/coreapi/object.go index 4408cec7f..62d31daed 100644 --- a/core/coreapi/object.go +++ b/core/coreapi/object.go @@ -12,7 +12,7 @@ import ( "io/ioutil" cid "github.com/ipfs/go-cid" - "github.com/ipfs/go-ipfs-pinner" + pin "github.com/ipfs/go-ipfs-pinner" ipld "github.com/ipfs/go-ipld-format" dag "github.com/ipfs/go-merkledag" "github.com/ipfs/go-merkledag/dagutils" @@ -110,7 +110,7 @@ func (api *ObjectAPI) Put(ctx context.Context, src io.Reader, opts ...caopts.Obj } if options.Pin { - defer api.blockstore.PinLock().Unlock() + defer api.blockstore.PinLock(ctx).Unlock(ctx) } err = api.dag.Add(ctx, dagnode) diff --git a/core/coreapi/pin.go b/core/coreapi/pin.go index b5db63d35..52ea6a6a4 100644 --- a/core/coreapi/pin.go +++ b/core/coreapi/pin.go @@ -27,7 +27,7 @@ func (api *PinAPI) Add(ctx context.Context, p path.Path, opts ...caopts.PinAddOp return err } - defer api.blockstore.PinLock().Unlock() + defer api.blockstore.PinLock(ctx).Unlock(ctx) err = api.pinning.Pin(ctx, dagNode, settings.Recursive) if err != nil { @@ -89,7 +89,7 @@ func (api *PinAPI) Rm(ctx context.Context, p path.Path, opts ...caopts.PinRmOpti // Note: after unpin the pin sets are flushed to the blockstore, so we need // to take a lock to prevent a concurrent garbage collection - defer api.blockstore.PinLock().Unlock() + defer api.blockstore.PinLock(ctx).Unlock(ctx) if err = api.pinning.Unpin(ctx, rp.Cid(), settings.Recursive); err != nil { return err @@ -114,7 +114,7 @@ func (api *PinAPI) Update(ctx context.Context, from path.Path, to path.Path, opt return err } - defer api.blockstore.PinLock().Unlock() + defer api.blockstore.PinLock(ctx).Unlock(ctx) err = api.pinning.Update(ctx, fp.Cid(), tp.Cid(), settings.Unpin) if err != nil { diff --git a/core/coreapi/test/path_test.go b/core/coreapi/test/path_test.go index cc7ba2efa..bf26b39ce 100644 --- a/core/coreapi/test/path_test.go +++ b/core/coreapi/test/path_test.go @@ -14,7 +14,6 @@ import ( "github.com/ipld/go-ipld-prime" ) - func TestPathUnixFSHAMTPartial(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -27,16 +26,16 @@ func TestPathUnixFSHAMTPartial(t *testing.T) { a := apis[0] // Setting this after instantiating the swarm so that it's not clobbered by loading the go-ipfs config - prevVal := uio.UseHAMTSharding - uio.UseHAMTSharding = true + prevVal := uio.HAMTShardingSize + uio.HAMTShardingSize = 1 defer func() { - uio.UseHAMTSharding = prevVal + uio.HAMTShardingSize = prevVal }() // Create and add a sharded directory dir := make(map[string]files.Node) // Make sure we have at least two levels of sharding - for i := 0; i < uio.DefaultShardWidth + 1; i++ { + for i := 0; i < uio.DefaultShardWidth+1; i++ { dir[strconv.Itoa(i)] = files.NewBytesFile([]byte(strconv.Itoa(i))) } @@ -67,7 +66,7 @@ func TestPathUnixFSHAMTPartial(t *testing.T) { for k := range dir { // The node will go out to the (non-existent) network looking for the missing block. Make sure we're erroring // because we exceeded the timeout on our query - timeoutCtx, timeoutCancel := context.WithTimeout(ctx, time.Second * 1) + timeoutCtx, timeoutCancel := context.WithTimeout(ctx, time.Second*1) _, err := a.ResolveNode(timeoutCtx, path.Join(r, k)) if err != nil { if timeoutCtx.Err() == nil { diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go index 53d13a3a4..55410dcb0 100644 --- a/core/coreapi/unixfs.go +++ b/core/coreapi/unixfs.go @@ -111,10 +111,10 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options DAGService: dserv, syncFn: func() error { ds := api.repo.Datastore() - if err := ds.Sync(bstore.BlockPrefix); err != nil { + if err := ds.Sync(ctx, bstore.BlockPrefix); err != nil { return err } - return ds.Sync(filestore.FilestorePrefix) + return ds.Sync(ctx, filestore.FilestorePrefix) }, } } @@ -164,7 +164,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options fileAdder.SetMfsRoot(mr) } - nd, err := fileAdder.AddAllAndPin(files) + nd, err := fileAdder.AddAllAndPin(ctx, files) if err != nil { return nil, err } @@ -217,13 +217,13 @@ func (api *UnixfsAPI) Ls(ctx context.Context, p path.Path, opts ...options.Unixf } func (api *UnixfsAPI) processLink(ctx context.Context, linkres ft.LinkResult, settings *options.UnixfsLsSettings) coreiface.DirEntry { + if linkres.Err != nil { + return coreiface.DirEntry{Err: linkres.Err} + } + lnk := coreiface.DirEntry{ Name: linkres.Link.Name, Cid: linkres.Link.Cid, - Err: linkres.Err, - } - if lnk.Err != nil { - return lnk } switch lnk.Cid.Type() { diff --git a/core/corehttp/gateway_test.go b/core/corehttp/gateway_test.go index 48c604e4a..8cccde0e2 100644 --- a/core/corehttp/gateway_test.go +++ b/core/corehttp/gateway_test.go @@ -506,7 +506,7 @@ func TestIPNSHostnameBacklinks(t *testing.T) { if !strings.Contains(s, "") { t.Fatalf("expected file in directory listing") } - if !strings.Contains(s, "") { t.Fatalf("expected file in directory listing") } - if !strings.Contains(s, " 2 { + t.Fatalf("expected at most 2 peers transport (tcp and upd/quic), got %d, transport map %v", + len(peersTransport), peersTransport) } - if actual["/ip4/tcp"] != float64(3) { - t.Fatalf("expected 3 peers, got %f", actual["/ip4/tcp"]) + totalPeers := peersTransport["/ip4/tcp"] + peersTransport["/ip4/udp/quic"] + if totalPeers != 3 { + t.Fatalf("expected 3 peers in either tcp or upd/quic transport, got %f", totalPeers) } } diff --git a/core/corerepo/gc.go b/core/corerepo/gc.go index 1fe888eb8..5db45bf47 100644 --- a/core/corerepo/gc.go +++ b/core/corerepo/gc.go @@ -205,7 +205,7 @@ func ConditionalGC(ctx context.Context, node *core.IpfsNode, offset uint64) erro } func (gc *GC) maybeGC(ctx context.Context, offset uint64) error { - storage, err := gc.Repo.GetStorageUsage() + storage, err := gc.Repo.GetStorageUsage(ctx) if err != nil { return err } diff --git a/core/corerepo/stat.go b/core/corerepo/stat.go index 370cd88e4..52a42ca8c 100644 --- a/core/corerepo/stat.go +++ b/core/corerepo/stat.go @@ -71,7 +71,7 @@ func RepoSize(ctx context.Context, n *core.IpfsNode) (SizeStat, error) { return SizeStat{}, err } - usage, err := r.GetStorageUsage() + usage, err := r.GetStorageUsage(ctx) if err != nil { return SizeStat{}, err } diff --git a/core/coreunix/add.go b/core/coreunix/add.go index 68be08056..387a97778 100644 --- a/core/coreunix/add.go +++ b/core/coreunix/add.go @@ -11,9 +11,9 @@ import ( "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" chunker "github.com/ipfs/go-ipfs-chunker" - "github.com/ipfs/go-ipfs-files" - "github.com/ipfs/go-ipfs-pinner" - "github.com/ipfs/go-ipfs-posinfo" + files "github.com/ipfs/go-ipfs-files" + pin "github.com/ipfs/go-ipfs-pinner" + posinfo "github.com/ipfs/go-ipfs-posinfo" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" dag "github.com/ipfs/go-merkledag" @@ -254,17 +254,17 @@ func (adder *Adder) addNode(node ipld.Node, path string) error { } // AddAllAndPin adds the given request's files and pin them. -func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) { +func (adder *Adder) AddAllAndPin(ctx context.Context, file files.Node) (ipld.Node, error) { if adder.Pin { - adder.unlocker = adder.gcLocker.PinLock() + adder.unlocker = adder.gcLocker.PinLock(ctx) } defer func() { if adder.unlocker != nil { - adder.unlocker.Unlock() + adder.unlocker.Unlock(ctx) } }() - if err := adder.addFileNode("", file, true); err != nil { + if err := adder.addFileNode(ctx, "", file, true); err != nil { return nil, err } @@ -333,10 +333,10 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) { return nd, adder.PinRoot(nd) } -func (adder *Adder) addFileNode(path string, file files.Node, toplevel bool) error { +func (adder *Adder) addFileNode(ctx context.Context, path string, file files.Node, toplevel bool) error { defer file.Close() - err := adder.maybePauseForGC() + err := adder.maybePauseForGC(ctx) if err != nil { return err } @@ -357,7 +357,7 @@ func (adder *Adder) addFileNode(path string, file files.Node, toplevel bool) err switch f := file.(type) { case files.Directory: - return adder.addDir(path, f, toplevel) + return adder.addDir(ctx, path, f, toplevel) case *files.Symlink: return adder.addSymlink(path, f) case files.File: @@ -405,7 +405,7 @@ func (adder *Adder) addFile(path string, file files.File) error { return adder.addNode(dagnode, path) } -func (adder *Adder) addDir(path string, dir files.Directory, toplevel bool) error { +func (adder *Adder) addDir(ctx context.Context, path string, dir files.Directory, toplevel bool) error { log.Infof("adding directory: %s", path) if !(toplevel && path == "") { @@ -426,7 +426,7 @@ func (adder *Adder) addDir(path string, dir files.Directory, toplevel bool) erro it := dir.Entries() for it.Next() { fpath := gopath.Join(path, it.Name()) - err := adder.addFileNode(fpath, it.Node(), false) + err := adder.addFileNode(ctx, fpath, it.Node(), false) if err != nil { return err } @@ -435,8 +435,8 @@ func (adder *Adder) addDir(path string, dir files.Directory, toplevel bool) erro return it.Err() } -func (adder *Adder) maybePauseForGC() error { - if adder.unlocker != nil && adder.gcLocker.GCRequested() { +func (adder *Adder) maybePauseForGC(ctx context.Context) error { + if adder.unlocker != nil && adder.gcLocker.GCRequested(ctx) { rn, err := adder.curRootNode() if err != nil { return err @@ -447,8 +447,8 @@ func (adder *Adder) maybePauseForGC() error { return err } - adder.unlocker.Unlock() - adder.unlocker = adder.gcLocker.PinLock() + adder.unlocker.Unlock(ctx) + adder.unlocker = adder.gcLocker.PinLock(ctx) } return nil } diff --git a/core/coreunix/add_test.go b/core/coreunix/add_test.go index 6277e858c..7dd2b0cec 100644 --- a/core/coreunix/add_test.go +++ b/core/coreunix/add_test.go @@ -68,7 +68,7 @@ func TestAddMultipleGCLive(t *testing.T) { go func() { defer close(out) - _, _ = adder.AddAllAndPin(slf) + _, _ = adder.AddAllAndPin(context.Background(), slf) // Ignore errors for clarity - the real bug would be gc'ing files while adding them, not this resultant error }() @@ -179,7 +179,7 @@ func TestAddGCLive(t *testing.T) { go func() { defer close(addDone) defer close(out) - _, err := adder.AddAllAndPin(slf) + _, err := adder.AddAllAndPin(context.Background(), slf) if err != nil { t.Error(err) @@ -288,7 +288,7 @@ func testAddWPosInfo(t *testing.T, rawLeaves bool) { go func() { defer close(adder.Out) - _, err = adder.AddAllAndPin(file) + _, err = adder.AddAllAndPin(context.Background(), file) if err != nil { t.Error(err) } @@ -327,16 +327,16 @@ type testBlockstore struct { countAtOffsetNonZero int } -func (bs *testBlockstore) Put(block blocks.Block) error { +func (bs *testBlockstore) Put(ctx context.Context, block blocks.Block) error { bs.CheckForPosInfo(block) - return bs.GCBlockstore.Put(block) + return bs.GCBlockstore.Put(ctx, block) } -func (bs *testBlockstore) PutMany(blocks []blocks.Block) error { +func (bs *testBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { for _, blk := range blocks { bs.CheckForPosInfo(blk) } - return bs.GCBlockstore.PutMany(blocks) + return bs.GCBlockstore.PutMany(ctx, blocks) } func (bs *testBlockstore) CheckForPosInfo(block blocks.Block) { diff --git a/core/mock/mock.go b/core/mock/mock.go index ed123dff7..d0a5cd7f6 100644 --- a/core/mock/mock.go +++ b/core/mock/mock.go @@ -16,8 +16,8 @@ import ( config "github.com/ipfs/go-ipfs-config" "github.com/libp2p/go-libp2p" - host "github.com/libp2p/go-libp2p-core/host" - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" pstore "github.com/libp2p/go-libp2p-core/peerstore" testutil "github.com/libp2p/go-libp2p-testing/net" @@ -36,7 +36,7 @@ func NewMockNode() (*core.IpfsNode, error) { } func MockHostOption(mn mocknet.Mocknet) libp2p2.HostOption { - return func(ctx context.Context, id peer.ID, ps pstore.Peerstore, _ ...libp2p.Option) (host.Host, error) { + return func(id peer.ID, ps pstore.Peerstore, _ ...libp2p.Option) (host.Host, error) { return mn.AddPeerWithPeerstore(id, ps) } } diff --git a/core/node/core.go b/core/node/core.go index cdb790bd2..c8305bb61 100644 --- a/core/node/core.go +++ b/core/node/core.go @@ -46,11 +46,11 @@ func BlockService(lc fx.Lifecycle, bs blockstore.Blockstore, rem exchange.Interf func Pinning(bstore blockstore.Blockstore, ds format.DAGService, repo repo.Repo) (pin.Pinner, error) { rootDS := repo.Datastore() - syncFn := func() error { - if err := rootDS.Sync(blockstore.BlockPrefix); err != nil { + syncFn := func(ctx context.Context) error { + if err := rootDS.Sync(ctx, blockstore.BlockPrefix); err != nil { return err } - return rootDS.Sync(filestore.FilestorePrefix) + return rootDS.Sync(ctx, filestore.FilestorePrefix) } syncDs := &syncDagService{ds, syncFn} @@ -72,11 +72,11 @@ var ( // syncDagService is used by the Pinner to ensure data gets persisted to the underlying datastore type syncDagService struct { format.DAGService - syncFn func() error + syncFn func(context.Context) error } -func (s *syncDagService) Sync() error { - return s.syncFn() +func (s *syncDagService) Sync(ctx context.Context) error { + return s.syncFn(ctx) } func (s *syncDagService) Session(ctx context.Context) format.NodeGetter { @@ -113,22 +113,22 @@ func Files(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo, dag format. dsk := datastore.NewKey("/local/filesroot") pf := func(ctx context.Context, c cid.Cid) error { rootDS := repo.Datastore() - if err := rootDS.Sync(blockstore.BlockPrefix); err != nil { + if err := rootDS.Sync(ctx, blockstore.BlockPrefix); err != nil { return err } - if err := rootDS.Sync(filestore.FilestorePrefix); err != nil { + if err := rootDS.Sync(ctx, filestore.FilestorePrefix); err != nil { return err } - if err := rootDS.Put(dsk, c.Bytes()); err != nil { + if err := rootDS.Put(ctx, dsk, c.Bytes()); err != nil { return err } - return rootDS.Sync(dsk) + return rootDS.Sync(ctx, dsk) } var nd *merkledag.ProtoNode - val, err := repo.Datastore().Get(dsk) ctx := helpers.LifecycleCtx(mctx, lc) + val, err := repo.Datastore().Get(ctx, dsk) switch { case err == datastore.ErrNotFound || val == nil: diff --git a/core/node/dns.go b/core/node/dns.go index 1aafbf107..e49a93ac1 100644 --- a/core/node/dns.go +++ b/core/node/dns.go @@ -28,7 +28,7 @@ func DNSResolver(cfg *config.Config) (*madns.Resolver, error) { var opts []madns.Option var err error - domains := make(map[string]struct{}) // to track overriden default resolvers + domains := make(map[string]struct{}) // to track overridden default resolvers rslvrs := make(map[string]madns.BasicResolver) // to reuse resolvers for the same URL for domain, url := range cfg.DNS.Resolvers { @@ -58,7 +58,7 @@ func DNSResolver(cfg *config.Config) (*madns.Resolver, error) { } } - // fill in defaults if not overriden by the user + // fill in defaults if not overridden by the user for domain, url := range defaultResolvers { _, ok := domains[domain] if ok { diff --git a/core/node/groups.go b/core/node/groups.go index 930a2151b..80367156e 100644 --- a/core/node/groups.go +++ b/core/node/groups.go @@ -9,8 +9,8 @@ import ( blockstore "github.com/ipfs/go-ipfs-blockstore" config "github.com/ipfs/go-ipfs-config" util "github.com/ipfs/go-ipfs-util" - log "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/ipfs/go-ipfs/core/node/libp2p" @@ -19,6 +19,8 @@ import ( offline "github.com/ipfs/go-ipfs-exchange-offline" offroute "github.com/ipfs/go-ipfs-routing/offline" uio "github.com/ipfs/go-unixfs/io" + + "github.com/dustin/go-humanize" "go.uber.org/fx" ) @@ -109,31 +111,50 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config) fx.Option { autonat = fx.Provide(libp2p.AutoNATService(cfg.AutoNAT.Throttle)) } - // If `cfg.Swarm.DisableRelay` is set and `Network.Relay` isn't, use the former. - enableRelay := cfg.Swarm.Transports.Network.Relay.WithDefault(!cfg.Swarm.DisableRelay) //nolint + // If `cfg.Swarm.DisableRelay` is set and `Network.RelayTransport` isn't, use the former. + enableRelayTransport := cfg.Swarm.Transports.Network.Relay.WithDefault(!cfg.Swarm.DisableRelay) //nolint // Warn about a deprecated option. //nolint if cfg.Swarm.DisableRelay { - logger.Error("The `Swarm.DisableRelay' config field is deprecated.") - if enableRelay { - logger.Error("`Swarm.DisableRelay' has been overridden by `Swarm.Transports.Network.Relay'") + logger.Error("The 'Swarm.DisableRelay' config field is deprecated.") + if enableRelayTransport { + logger.Error("'Swarm.DisableRelay' has been overridden by 'Swarm.Transports.Network.Relay'") } else { - logger.Error("Use the `Swarm.Transports.Network.Relay' config field instead") + logger.Error("Use the 'Swarm.Transports.Network.Relay' config field instead") } } + //nolint + if cfg.Swarm.EnableAutoRelay { + logger.Error("The 'Swarm.EnableAutoRelay' config field is deprecated.") + if cfg.Swarm.RelayClient.Enabled == config.Default { + logger.Error("Use the 'Swarm.AutoRelay.Enabled' config field instead") + } else { + logger.Error("'Swarm.EnableAutoRelay' has been overridden by 'Swarm.AutoRelay.Enabled'") + } + } + //nolint + if cfg.Swarm.EnableRelayHop { + logger.Fatal("The `Swarm.EnableRelayHop` config field is ignored.\n" + + "Use `Swarm.RelayService` to configure the circuit v2 relay.\n" + + "If you want to continue running a circuit v1 relay, please use the standalone relay daemon: https://github.com/libp2p/go-libp2p-relay-daemon (with RelayV1.Enabled: true)") + } // Gather all the options opts := fx.Options( BaseLibP2P, fx.Provide(libp2p.AddrFilters(cfg.Swarm.AddrFilters)), - fx.Provide(libp2p.AddrsFactory(cfg.Addresses.Announce, cfg.Addresses.NoAnnounce)), + fx.Provide(libp2p.AddrsFactory(cfg.Addresses.Announce, cfg.Addresses.AppendAnnounce, cfg.Addresses.NoAnnounce)), fx.Provide(libp2p.SmuxTransport(cfg.Swarm.Transports)), - fx.Provide(libp2p.Relay(enableRelay, cfg.Swarm.EnableRelayHop)), + fx.Provide(libp2p.RelayTransport(enableRelayTransport)), + fx.Provide(libp2p.RelayService(cfg.Swarm.RelayService.Enabled.WithDefault(true), cfg.Swarm.RelayService)), fx.Provide(libp2p.Transports(cfg.Swarm.Transports)), fx.Invoke(libp2p.StartListening(cfg.Addresses.Swarm)), fx.Invoke(libp2p.SetupDiscovery(cfg.Discovery.MDNS.Enabled, cfg.Discovery.MDNS.Interval)), + fx.Provide(libp2p.ForceReachability(cfg.Internal.Libp2pForceReachability)), + fx.Provide(libp2p.StaticRelays(cfg.Swarm.RelayClient.StaticRelays)), + fx.Provide(libp2p.HolePunching(cfg.Swarm.EnableHolePunching, cfg.Swarm.RelayClient.Enabled.WithDefault(false))), fx.Provide(libp2p.Security(!bcfg.DisableEncryptedConnections, cfg.Swarm.Transports)), @@ -143,7 +164,7 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config) fx.Option { maybeProvide(libp2p.BandwidthCounter, !cfg.Swarm.DisableBandwidthMetrics), maybeProvide(libp2p.NatPortMap, !cfg.Swarm.DisableNatPortMap), - maybeProvide(libp2p.AutoRelay, cfg.Swarm.EnableAutoRelay), + maybeProvide(libp2p.AutoRelay(len(cfg.Swarm.RelayClient.StaticRelays) == 0), cfg.Swarm.RelayClient.Enabled.WithDefault(false)), autonat, connmgr, ps, @@ -316,8 +337,20 @@ func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option { return bcfgOpts // error } - // TEMP: setting global sharding switch here - uio.UseHAMTSharding = cfg.Experimental.ShardingEnabled + // Auto-sharding settings + shardSizeString := cfg.Internal.UnixFSShardingSizeThreshold.WithDefault("256kiB") + shardSizeInt, err := humanize.ParseBytes(shardSizeString) + if err != nil { + return fx.Error(err) + } + uio.HAMTShardingSize = int(shardSizeInt) + + // Migrate users of deprecated Experimental.ShardingEnabled flag + if cfg.Experimental.ShardingEnabled { + logger.Fatal("The `Experimental.ShardingEnabled` field is no longer used, please remove it from the config.\n" + + "go-ipfs now automatically shards when directory block is bigger than `" + shardSizeString + "`.\n" + + "If you need to restore the old behavior (sharding everything) set `Internal.UnixFSShardingSizeThreshold` to `1B`.\n") + } return fx.Options( bcfgOpts, diff --git a/core/node/libp2p/addrs.go b/core/node/libp2p/addrs.go index 818385194..827c6cc4c 100644 --- a/core/node/libp2p/addrs.go +++ b/core/node/libp2p/addrs.go @@ -25,14 +25,30 @@ func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, error) { } } -func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) { - var annAddrs []ma.Multiaddr - for _, addr := range announce { - maddr, err := ma.NewMultiaddr(addr) +func makeAddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) { + var err error // To assign to the slice in the for loop + existing := make(map[string]bool) // To avoid duplicates + + annAddrs := make([]ma.Multiaddr, len(announce)) + for i, addr := range announce { + annAddrs[i], err = ma.NewMultiaddr(addr) if err != nil { return nil, err } - annAddrs = append(annAddrs, maddr) + existing[addr] = true + } + + var appendAnnAddrs []ma.Multiaddr + for _, addr := range appendAnnouce { + if existing[addr] { + // skip AppendAnnounce that is on the Announce list already + continue + } + appendAddr, err := ma.NewMultiaddr(addr) + if err != nil { + return nil, err + } + appendAnnAddrs = append(appendAnnAddrs, appendAddr) } filters := ma.NewFilters() @@ -57,6 +73,7 @@ func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFac } else { addrs = allAddrs } + addrs = append(addrs, appendAnnAddrs...) var out []ma.Multiaddr for _, maddr := range addrs { @@ -71,9 +88,9 @@ func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFac }, nil } -func AddrsFactory(announce []string, noAnnounce []string) func() (opts Libp2pOpts, err error) { +func AddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string) func() (opts Libp2pOpts, err error) { return func() (opts Libp2pOpts, err error) { - addrsFactory, err := makeAddrsFactory(announce, noAnnounce) + addrsFactory, err := makeAddrsFactory(announce, appendAnnouce, noAnnounce) if err != nil { return opts, err } diff --git a/core/node/libp2p/discovery.go b/core/node/libp2p/discovery.go index f29f523ce..64860ce5c 100644 --- a/core/node/libp2p/discovery.go +++ b/core/node/libp2p/discovery.go @@ -40,8 +40,10 @@ func DiscoveryHandler(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host) func SetupDiscovery(useMdns bool, mdnsInterval int) func(helpers.MetricsCtx, fx.Lifecycle, host.Host, *discoveryHandler) error { return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, handler *discoveryHandler) error { if useMdns { - service := mdns.NewMdnsService(host, mdns.ServiceName) - service.RegisterNotifee(handler) + service := mdns.NewMdnsService(host, mdns.ServiceName, handler) + if err := service.Start(); err != nil { + return err + } if mdnsInterval == 0 { mdnsInterval = 5 diff --git a/core/node/libp2p/host.go b/core/node/libp2p/host.go index 04682682b..9298f7ffb 100644 --- a/core/node/libp2p/host.go +++ b/core/node/libp2p/host.go @@ -4,10 +4,10 @@ import ( "context" "github.com/libp2p/go-libp2p" - host "github.com/libp2p/go-libp2p-core/host" - peer "github.com/libp2p/go-libp2p-core/peer" - peerstore "github.com/libp2p/go-libp2p-core/peerstore" - routing "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/routing" record "github.com/libp2p/go-libp2p-record" routedhost "github.com/libp2p/go-libp2p/p2p/host/routed" @@ -64,7 +64,7 @@ func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (out P2PHo return r, err })) - out.Host, err = params.HostOption(ctx, params.ID, params.Peerstore, opts...) + out.Host, err = params.HostOption(params.ID, params.Peerstore, opts...) if err != nil { return P2PHostOut{}, err } diff --git a/core/node/libp2p/hostopt.go b/core/node/libp2p/hostopt.go index 26d6cad70..23d28c8c0 100644 --- a/core/node/libp2p/hostopt.go +++ b/core/node/libp2p/hostopt.go @@ -1,25 +1,24 @@ package libp2p import ( - "context" "fmt" "github.com/libp2p/go-libp2p" - host "github.com/libp2p/go-libp2p-core/host" - peer "github.com/libp2p/go-libp2p-core/peer" - peerstore "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" ) -type HostOption func(ctx context.Context, id peer.ID, ps peerstore.Peerstore, options ...libp2p.Option) (host.Host, error) +type HostOption func(id peer.ID, ps peerstore.Peerstore, options ...libp2p.Option) (host.Host, error) var DefaultHostOption HostOption = constructPeerHost // isolates the complex initialization steps -func constructPeerHost(ctx context.Context, id peer.ID, ps peerstore.Peerstore, options ...libp2p.Option) (host.Host, error) { +func constructPeerHost(id peer.ID, ps peerstore.Peerstore, options ...libp2p.Option) (host.Host, error) { pkey := ps.PrivKey(id) if pkey == nil { return nil, fmt.Errorf("missing private key for node ID: %s", id.Pretty()) } options = append([]libp2p.Option{libp2p.Identity(pkey), libp2p.Peerstore(ps)}, options...) - return libp2p.New(ctx, options...) + return libp2p.New(options...) } diff --git a/core/node/libp2p/libp2p.go b/core/node/libp2p/libp2p.go index 57539259b..3659b3c61 100644 --- a/core/node/libp2p/libp2p.go +++ b/core/node/libp2p/libp2p.go @@ -1,6 +1,7 @@ package libp2p import ( + "fmt" "sort" "time" @@ -9,7 +10,7 @@ import ( logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p" - "github.com/libp2p/go-libp2p-connmgr" + connmgr "github.com/libp2p/go-libp2p-connmgr" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/peerstore" @@ -78,3 +79,21 @@ func prioritizeOptions(opts []priorityOption) libp2p.Option { } return libp2p.ChainOptions(p2pOpts...) } + +func ForceReachability(val *config.OptionalString) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + if val.IsDefault() { + return + } + v := val.WithDefault("unrecognized") + switch v { + case "public": + opts.Opts = append(opts.Opts, libp2p.ForceReachabilityPublic()) + case "private": + opts.Opts = append(opts.Opts, libp2p.ForceReachabilityPrivate()) + default: + return opts, fmt.Errorf("unrecognized reachability option: %s", v) + } + return + } +} diff --git a/core/node/libp2p/nat.go b/core/node/libp2p/nat.go index 9fe74d91c..ce0ca345f 100644 --- a/core/node/libp2p/nat.go +++ b/core/node/libp2p/nat.go @@ -3,7 +3,7 @@ package libp2p import ( "time" - "github.com/ipfs/go-ipfs-config" + config "github.com/ipfs/go-ipfs-config" "github.com/libp2p/go-libp2p" ) @@ -13,14 +13,12 @@ func AutoNATService(throttle *config.AutoNATThrottleConfig) func() Libp2pOpts { return func() (opts Libp2pOpts) { opts.Opts = append(opts.Opts, libp2p.EnableNATService()) if throttle != nil { - global := throttle.GlobalLimit - peer := throttle.PeerLimit - interval := time.Duration(throttle.Interval) - if interval == 0 { - interval = time.Minute - } opts.Opts = append(opts.Opts, - libp2p.AutoNATServiceRateLimit(global, peer, interval), + libp2p.AutoNATServiceRateLimit( + throttle.GlobalLimit, + throttle.PeerLimit, + throttle.Interval.WithDefault(time.Minute), + ), ) } return opts diff --git a/core/node/libp2p/peerstore.go b/core/node/libp2p/peerstore.go index 03ad64a6c..0cc6b21f5 100644 --- a/core/node/libp2p/peerstore.go +++ b/core/node/libp2p/peerstore.go @@ -8,13 +8,16 @@ import ( "go.uber.org/fx" ) -func Peerstore(lc fx.Lifecycle) peerstore.Peerstore { - pstore := pstoremem.NewPeerstore() +func Peerstore(lc fx.Lifecycle) (peerstore.Peerstore, error) { + pstore, err := pstoremem.NewPeerstore() + if err != nil { + return nil, err + } lc.Append(fx.Hook{ OnStop: func(ctx context.Context) error { return pstore.Close() }, }) - return pstore + return pstore, nil } diff --git a/core/node/libp2p/relay.go b/core/node/libp2p/relay.go index e625b4d00..33d958d5c 100644 --- a/core/node/libp2p/relay.go +++ b/core/node/libp2p/relay.go @@ -1,18 +1,17 @@ package libp2p import ( + config "github.com/ipfs/go-ipfs-config" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p" - relay "github.com/libp2p/go-libp2p-circuit" + "github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay" ) -func Relay(enableRelay, enableHop bool) func() (opts Libp2pOpts, err error) { +func RelayTransport(enableRelay bool) func() (opts Libp2pOpts, err error) { return func() (opts Libp2pOpts, err error) { if enableRelay { - relayOpts := []relay.RelayOpt{} - if enableHop { - relayOpts = append(relayOpts, relay.OptHop) - } - opts.Opts = append(opts.Opts, libp2p.EnableRelay(relayOpts...)) + opts.Opts = append(opts.Opts, libp2p.EnableRelay()) } else { opts.Opts = append(opts.Opts, libp2p.DisableRelay()) } @@ -20,4 +19,66 @@ func Relay(enableRelay, enableHop bool) func() (opts Libp2pOpts, err error) { } } -var AutoRelay = simpleOpt(libp2p.ChainOptions(libp2p.EnableAutoRelay(), libp2p.DefaultStaticRelays())) +func RelayService(enable bool, relayOpts config.RelayService) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + if enable { + def := relay.DefaultResources() + // Real defaults live in go-libp2p. + // Here we apply any overrides from user config. + opts.Opts = append(opts.Opts, libp2p.EnableRelayService(relay.WithResources(relay.Resources{ + Limit: &relay.RelayLimit{ + Data: relayOpts.ConnectionDataLimit.WithDefault(def.Limit.Data), + Duration: relayOpts.ConnectionDurationLimit.WithDefault(def.Limit.Duration), + }, + MaxCircuits: int(relayOpts.MaxCircuits.WithDefault(int64(def.MaxCircuits))), + BufferSize: int(relayOpts.BufferSize.WithDefault(int64(def.BufferSize))), + ReservationTTL: relayOpts.ReservationTTL.WithDefault(def.ReservationTTL), + MaxReservations: int(relayOpts.MaxReservations.WithDefault(int64(def.MaxReservations))), + MaxReservationsPerIP: int(relayOpts.MaxReservations.WithDefault(int64(def.MaxReservationsPerIP))), + MaxReservationsPerPeer: int(relayOpts.MaxReservations.WithDefault(int64(def.MaxReservationsPerPeer))), + MaxReservationsPerASN: int(relayOpts.MaxReservations.WithDefault(int64(def.MaxReservationsPerASN))), + }))) + } + return + } +} + +func StaticRelays(relays []string) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + staticRelays := make([]peer.AddrInfo, 0, len(relays)) + for _, s := range relays { + var addr *peer.AddrInfo + addr, err = peer.AddrInfoFromString(s) + if err != nil { + return + } + staticRelays = append(staticRelays, *addr) + } + if len(staticRelays) > 0 { + opts.Opts = append(opts.Opts, libp2p.StaticRelays(staticRelays)) + } + return + } +} + +func AutoRelay(addDefaultRelays bool) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + opts.Opts = append(opts.Opts, libp2p.EnableAutoRelay()) + if addDefaultRelays { + opts.Opts = append(opts.Opts, libp2p.DefaultStaticRelays()) + } + return + } +} + +func HolePunching(flag config.Flag, hasRelayClient bool) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + if flag.WithDefault(false) { + if !hasRelayClient { + log.Fatal("To enable `Swarm.EnableHolePunching` requires `Swarm.RelayClient.Enabled` to be enabled.") + } + opts.Opts = append(opts.Opts, libp2p.EnableHolePunching()) + } + return + } +} diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 000000000..eaf947cb3 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,21 @@ +version: '3.8' +services: + ipfs: + build: . + restart: unless-stopped + volumes: + - ipfs_path:/data/ipfs + - ipfs_fuse:/ipfs + - ipns_fuse:/ipns + environment: + - IPFS_PATH=/data/ipfs + ports: + - 4001:4001/tcp + - 4001:4001/udp + - 5001:5001 + - 8080:8080 + - 8081:8081 +volumes: + ipfs_path: + ipfs_fuse: + ipns_fuse: diff --git a/docs/EARLY_TESTERS.md b/docs/EARLY_TESTERS.md index 16d80f1fc..c68d00453 100644 --- a/docs/EARLY_TESTERS.md +++ b/docs/EARLY_TESTERS.md @@ -22,7 +22,7 @@ We will ask early testers to participate at two points in the process: ## Who has signed up? -- [ ] pacman.store ([@RubenKelevra](https://github.com/RubenKelevra)) +- [ ] pacman.store (@RubenKelevra) - [ ] Infura (@MichaelMure) - [ ] Textile (@sanderpick) - [ ] Pinata (@obo20) @@ -31,6 +31,7 @@ We will ask early testers to participate at two points in the process: - [ ] Siderus (@koalalorenzo) - [ ] Charity Engine (@rytiss, @tristanolive) - [ ] Fission (@bmann) +- [ ] OrbitDB (@tabcat) ## How to sign up? diff --git a/docs/RELEASE_ISSUE_TEMPLATE.md b/docs/RELEASE_ISSUE_TEMPLATE.md index 9b2d49317..e375d4906 100644 --- a/docs/RELEASE_ISSUE_TEMPLATE.md +++ b/docs/RELEASE_ISSUE_TEMPLATE.md @@ -18,10 +18,6 @@ As usual, this release includes important fixes, some of which may be critical f < top highlights for this release notes > -## Changelog - -< changelog generated by bin/mkreleaselog > - ## ✅ Release Checklist For each RC published in each stage: @@ -35,8 +31,8 @@ For each RC published in each stage: 4. Ask the infra team to update the DNSLink record for dist.ipfs.io to point to the new distribution. - cut a pre-release on [github](https://github.com/ipfs/go-ipfs/releases) and upload the result of the ipfs/distributions build in the previous step. - Announce the RC: - - [ ] On IRC/Matrix (both #ipfs and #ipfs-dev) - - [ ] To the _early testers_ listed in [docs/EARLY_TESTERS.md](https://github.com/ipfs/go-ipfs/tree/master/docs/EARLY_TESTERS.md). + - [ ] On Matrix (both #ipfs and #ipfs-dev) + - [ ] To the _early testers_ listed in [docs/EARLY_TESTERS.md](https://github.com/ipfs/go-ipfs/tree/master/docs/EARLY_TESTERS.md). Do this by copy/pasting their GitHub usernames and checkboxes as a comment so they get a GitHub notification. ([example](https://github.com/ipfs/go-ipfs/issues/8176#issuecomment-909356394)) Checklist: @@ -54,8 +50,6 @@ Checklist: - [ ] **Stage 1 - Internal Testing** - [ ] CHANGELOG.md has been updated - use [`./bin/mkreleaselog`](https://github.com/ipfs/go-ipfs/tree/master/bin/mkreleaselog) to generate a nice starter list - - [ ] Network Testing: - - [ ] test lab things - TBD - [ ] Infrastructure Testing: - [ ] Deploy new version to a subset of Bootstrappers - [ ] Deploy new version to a subset of Gateways @@ -67,25 +61,15 @@ Checklist: - [ ] Upgrade to the RC in [ipfs-desktop](https://github.com/ipfs-shipyard/ipfs-desktop) and push to a branch ([example](https://github.com/ipfs/ipfs-desktop/pull/1826/commits/b0a23db31ce942b46d95965ee6fe770fb24d6bde)), and open a draft PR to track through the final release ([example](https://github.com/ipfs/ipfs-desktop/pull/1826)) - [ ] Ensure CI tests pass, repeat for new RCs - [ ] [IPFS Companion](https://github.com/ipfs-shipyard/ipfs-companion) - @lidel - - [ ] [NPM on IPFS](https://github.com/ipfs-shipyard/npm-on-ipfs) - @achingbrain -- [ ] **Stage 2 - Community Dev Testing** - - [ ] Reach out to the IPFS _early testers_ listed in [docs/EARLY_TESTERS.md](https://github.com/ipfs/go-ipfs/tree/master/docs/EARLY_TESTERS.md) for testing this release (check when no more problems have been reported). If you'd like to be added to this list, please file a PR. - - [ ] Reach out to on IRC for beta testers. - - [ ] Run tests available in the following repos with the latest beta (check when all tests pass): - - [ ] [orbit-db](https://github.com/orbitdb/orbit-db) -- [ ] **Stage 3 - Community Prod Testing** +- [ ] **Stage 2 - Community Prod Testing** - [ ] Documentation - [ ] Ensure that [CHANGELOG.md](https://github.com/ipfs/go-ipfs/tree/master/CHANGELOG.md) is up to date - [ ] Ensure that [README.md](https://github.com/ipfs/go-ipfs/tree/master/README.md) is up to date - - [ ] Ensure that all the examples we have produced for go-ipfs run without problems - - [ ] Update HTTP-API Documentation on the Website using https://github.com/ipfs/http-api-docs - - [ ] Update [CLI Documentation](https://github.com/ipfs/ipfs-docs/blob/master/docs/reference/cli.md) on the Website using https://github.com/ipfs-inactive/docs/blob/master/scripts/cli.sh - - [ ] Invite the IPFS [_early testers_](https://github.com/ipfs/go-ipfs/tree/master/docs/EARLY_TESTERS.md) to deploy the release to part of their production infrastructure. + - [ ] Update docs by merging the auto-created PR in https://github.com/ipfs/ipfs-docs/pulls (they are auto-created every 12 hours) - [ ] Invite the wider community through (link to the release issue): - [ ] [discuss.ipfs.io](https://discuss.ipfs.io/c/announcements) - - [ ] Twitter - - [ ] IRC -- [ ] **Stage 4 - Release** + - [ ] Matrix +- [ ] **Stage 3 - Release** - [ ] Final preparation - [ ] Verify that version string in [`version.go`](https://github.com/ipfs/go-ipfs/tree/master/version.go) has been updated. - [ ] Merge `release-vX.Y.Z` into the `release` branch. @@ -93,15 +77,16 @@ Checklist: - [ ] Release published - [ ] to [dist.ipfs.io](https://dist.ipfs.io) - [ ] to [npm-go-ipfs](https://github.com/ipfs/npm-go-ipfs) - - [ ] to [chocolatey](https://chocolatey.org/packages/ipfs) + - [ ] to [chocolatey](https://chocolatey.org/packages/go-ipfs) - [ ] to [snap](https://snapcraft.io/ipfs) - [ ] to [github](https://github.com/ipfs/go-ipfs/releases) + - [ ] use the artifacts built in CI for dist.ipfs.io - [ ] to [arch](https://www.archlinux.org/packages/community/x86_64/go-ipfs/) (flag it out of date) - [ ] Cut a new ipfs-desktop release - - [ ] Publish a Release Blog post (at minimum, a c&p of this release issue with all the highlights, API changes, link to changelog and thank yous) + - [ ] Submit [this form](https://airtable.com/shrNH8YWole1xc70I) to publish a blog post, linking to the GitHub release notes - [ ] Broadcasting (link to blog post) - - [ ] Twitter - - [ ] IRC + - [ ] Twitter (request in Slack channel #pl-marketing-requests) + - [ ] Matrix - [ ] [Reddit](https://reddit.com/r/ipfs) - [ ] [discuss.ipfs.io](https://discuss.ipfs.io/c/announcements) - [ ] Announce it on the [IPFS Users Mailing List](https://groups.google.com/forum/#!forum/ipfs-users) @@ -111,7 +96,24 @@ Checklist: - [ ] Make sure any last-minute changelog updates from the blog post make it back into the CHANGELOG. - [ ] Mark PR draft created for IPFS Desktop as ready for review. -## ❤️ Contributors + +## ⁉️ Do you have questions? + +The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode, which is also [accessible through our Matrix bridge](https://riot.im/app/#/room/#freenode_#ipfs:matrix.org). + +## Release improvements for next time + +< Add any release improvements that were observed this cycle here so they can get incorporated into future releases. > + +## Items for a separate comment + +< Do these as a separate comment to avoid the main issue from getting too large and checkbox updates taking too long. > + +### Changelog + +< changelog generated by bin/mkreleaselog > + +### ❤️ Contributors < list generated by bin/mkreleaselog > @@ -122,7 +124,3 @@ Would you like to contribute to the IPFS project and don't know how? Well, there - Hack with IPFS and show us what you made! The All Hands call is also the perfect venue for demos, join in and show us what you built - Join the discussion at [discuss.ipfs.io](https://discuss.ipfs.io/) and help users finding their answers. - Join the [🚀 IPFS Core Implementations Weekly Sync 🛰](https://github.com/ipfs/team-mgmt/issues/992) and be part of the action! - -## ⁉️ Do you have questions? - -The best place to ask your questions about IPFS, how it works and what you can do with it is at [discuss.ipfs.io](http://discuss.ipfs.io). We are also available at the `#ipfs` channel on Freenode, which is also [accessible through our Matrix bridge](https://riot.im/app/#/room/#freenode_#ipfs:matrix.org). diff --git a/docs/config.md b/docs/config.md index ae39a3f88..fed335897 100644 --- a/docs/config.md +++ b/docs/config.md @@ -21,6 +21,7 @@ config file at runtime. - [`Addresses.Gateway`](#addressesgateway) - [`Addresses.Swarm`](#addressesswarm) - [`Addresses.Announce`](#addressesannounce) + - [`Addresses.AppendAnnounce`](#addressesappendannounce) - [`Addresses.NoAnnounce`](#addressesnoannounce) - [`API`](#api) - [`API.HTTPHeaders`](#apihttpheaders) @@ -68,6 +69,7 @@ config file at runtime. - [`Ipns.RepublishPeriod`](#ipnsrepublishperiod) - [`Ipns.RecordLifetime`](#ipnsrecordlifetime) - [`Ipns.ResolveCacheSize`](#ipnsresolvecachesize) + - [`Ipns.UsePubsub`](#ipnsusepubsub) - [`Migration`](#migration) - [`Migration.DownloadSources`](#migrationdownloadsources) - [`Migration.Keep`](#migrationkeep) @@ -86,6 +88,7 @@ config file at runtime. - [`Pinning.RemoteServices: Policies.MFS.PinName`](#pinningremoteservices-policiesmfspinname) - [`Pinning.RemoteServices: Policies.MFS.RepinInterval`](#pinningremoteservices-policiesmfsrepininterval) - [`Pubsub`](#pubsub) + - [`Pubsub.Enabled`](#pubsubenabled) - [`Pubsub.Router`](#pubsubrouter) - [`Pubsub.DisableSigning`](#pubsubdisablesigning) - [`Peering`](#peering) @@ -99,11 +102,23 @@ config file at runtime. - [`Swarm.AddrFilters`](#swarmaddrfilters) - [`Swarm.DisableBandwidthMetrics`](#swarmdisablebandwidthmetrics) - [`Swarm.DisableNatPortMap`](#swarmdisablenatportmap) - - [`Swarm.DisableRelay`](#swarmdisablerelay) - - [`Swarm.EnableRelayHop`](#swarmenablerelayhop) + - [`Swarm.EnableHolePunching`](#swarmenableholepunching) - [`Swarm.EnableAutoRelay`](#swarmenableautorelay) - - [Mode 1: `EnableRelayHop` is `false`](#mode-1-enablerelayhop-is-false) - - [Mode 2: `EnableRelayHop` is `true`](#mode-2-enablerelayhop-is-true) + - [`Swarm.RelayClient`](#swarmrelayclient) + - [`Swarm.RelayClient.Enabled`](#swarmrelayclientenabled) + - [`Swarm.RelayClient.StaticRelays`](#swarmrelayclientstaticrelays) + - [`Swarm.RelayService`](#swarmrelayservice) + - [`Swarm.RelayService.Enabled`](#swarmrelayserviceenabled) + - [`Swarm.RelayService.ConnectionDurationLimit`](#swarmrelayserviceconnectiondurationlimit) + - [`Swarm.RelayService.ConnectionDataLimit`](#swarmrelayserviceconnectiondatalimit) + - [`Swarm.RelayService.ReservationTTL`](#swarmrelayservicereservationttl) + - [`Swarm.RelayService.MaxReservations`](#swarmrelayservicemaxreservations) + - [`Swarm.RelayService.MaxCircuits`](#swarmrelayservicemaxcircuits) + - [`Swarm.RelayService.BufferSize`](#swarmrelayservicebuffersize) + - [`Swarm.RelayService.MaxReservationsPerPeer`](#swarmrelayservicemaxreservationsperpeer) + - [`Swarm.RelayService.MaxReservationsPerIP`](#swarmrelayservicemaxreservationsperip) + - [`Swarm.RelayService.MaxReservationsPerASN`](#swarmrelayservicemaxreservationsperasn) + - [`Swarm.DisableRelay`](#swarmdisablerelay) - [`Swarm.EnableAutoNATService`](#swarmenableautonatservice) - [`Swarm.ConnMgr`](#swarmconnmgr) - [`Swarm.ConnMgr.Type`](#swarmconnmgrtype) @@ -325,8 +340,19 @@ Default: `[]` Type: `array[string]` (multiaddrs) +### `Addresses.AppendAnnounce` + +Similar to [`Addresses.Announce`](#addressesannounce) except this doesn't +override inferred swarm addresses if non-empty. + +Default: `[]` + +Type: `array[string]` (multiaddrs) + ### `Addresses.NoAnnounce` + An array of swarm addresses not to announce to the network. +Takes precedence over `Addresses.Announce` and `Addresses.AppendAnnounce`. Default: `[]` @@ -923,6 +949,16 @@ Default: `128` Type: `integer` (non-negative, 0 means the default) +### `Ipns.UsePubsub` + +Enables IPFS over pubsub experiment for publishing IPNS records in real time. + +**EXPERIMENTAL:** read about current limitations at [experimental-features.md#ipns-pubsub](./experimental-features.md#ipns-pubsub). + +Default: `disabled` + +Type: `flag` + ## `Migration` Migration configures how migrations are downloaded and if the downloads are added to IPFS locally. @@ -1055,7 +1091,18 @@ Type: `duration` ## `Pubsub` Pubsub configures the `ipfs pubsub` subsystem. To use, it must be enabled by -passing the `--enable-pubsub-experiment` flag to the daemon. +passing the `--enable-pubsub-experiment` flag to the daemon +or via the `Pubsub.Enabled` flag below. + +### `Pubsub.Enabled` + +**EXPERIMENTAL:** read about current limitations at [experimental-features.md#ipfs-pubsub](./experimental-features.md#ipfs-pubsub). + +Enables the pubsub system. + +Default: `false` + +Type: `flag` ### `Pubsub.Router` @@ -1268,6 +1315,181 @@ Default: `false` Type: `bool` +### `Swarm.EnableHolePunching` + +Enable hole punching for NAT traversal +when port forwarding is not possible. + +When enabled, go-ipfs will coordinate with the counterparty using +a [relayed connection](https://github.com/libp2p/specs/blob/master/relay/circuit-v2.md), +to [upgrade to a direct connection](https://github.com/libp2p/specs/blob/master/relay/DCUtR.md) +through a NAT/firewall whenever possible. +This feature requires `Swarm.RelayClient.Enabled` to be set to `true`. + +Default: `false` + +Type: `flag` + +### `Swarm.EnableAutoRelay` + +Deprecated: Set `Swarm.RelayClient.Enabled` to `true`. + +Enables "automatic relay user" mode for this node. + +Your node will automatically _use_ public relays from the network if it detects +that it cannot be reached from the public internet (e.g., it's behind a +firewall) and get a `/p2p-circuit` address from a public relay. + +This is likely the feature you're looking for, but see also: +- [`Swarm.RelayService.Enabled`](#swarmrelayserviceenabled) if your node should act as a limited relay for other peers +- Docs: [Libp2p Circuit Relay](https://docs.libp2p.io/concepts/circuit-relay/) + +Default: `false` + +Type: `bool` + +### `Swarm.RelayClient` + +Configuration options for the relay client to use relay services. + +Default: `{}` + +Type: `object` + +#### `Swarm.RelayClient.Enabled` + +Enables "automatic relay user" mode for this node. + +Your node will automatically _use_ public relays from the network if it detects +that it cannot be reached from the public internet (e.g., it's behind a +firewall) and get a `/p2p-circuit` address from a public relay. + +Default: `false` + +Type: `bool` + +#### `Swarm.RelayClient.StaticRelays` + +Your node will use these statically configured relay servers instead of +discovering public relays from the network. + +Default: `[]` + +Type: `array[string]` + +### `Swarm.RelayService` + +Configuration options for the relay service that can be provided to _other_ peers +on the network ([Circuit Relay v2](https://github.com/libp2p/specs/blob/master/relay/circuit-v2.md)). + +Default: `{}` + +Type: `object` + +#### `Swarm.RelayService.Enabled` + +Enables providing `/p2p-circuit` v2 relay service to other peers on the network. + +NOTE: This is the service/server part of the relay system. +Disabling this will prevent this node from running as a relay server. +Use [`Swarm.EnableAutoRelay`](#swarmenableautorelay) for turning your node into a relay user. + +Default: Enabled + +Type: `flag` + +#### `Swarm.RelayService.Limit` + +Limits applied to every relayed connection. + +Default: `{}` + +Type: `object[string -> string]` + +##### `Swarm.RelayService.ConnectionDurationLimit` + +Time limit before a relayed connection is reset. + +Default: `"2m"` + +Type: `duration` + +##### `Swarm.RelayService.ConnectionDataLimit` + +Limit of data relayed (in each direction) before a relayed connection is reset. + +Default: `131072` (128 kb) + +Type: `optionalInteger` + + +#### `Swarm.RelayService.ReservationTTL` + +Duration of a new or refreshed reservation. + +Default: `"1h"` + +Type: `duration` + + +#### `Swarm.RelayService.MaxReservations` + +Maximum number of active relay slots. + +Default: `128` + +Type: `optionalInteger` + + +#### `Swarm.RelayService.MaxReservations` + +Maximum number of open relay connections for each peer. + +Default: `16` + +Type: `optionalInteger` + + +#### `Swarm.RelayService.BufferSize` + +Size of the relayed connection buffers. + +Default: `2048` + +Type: `optionalInteger` + + +#### `Swarm.RelayService.MaxReservationsPerPeer` + +Maximum number of reservations originating from the same peer. + +Default: `4` + +Type: `optionalInteger` + + +#### `Swarm.RelayService.MaxReservationsPerIP` + +Maximum number of reservations originating from the same IP. + +Default: `8` + +Type: `optionalInteger` + +#### `Swarm.RelayService.MaxReservationsPerASN` + +Maximum number of reservations originating from the same ASN. + +Default: `32` + +Type: `optionalInteger` + +### `Swarm.EnableRelayHop` + +**REMOVED** + +Replaced with [`Swarm.RelayService.Enabled`](#swarmrelayserviceenabled). + ### `Swarm.DisableRelay` Deprecated: Set `Swarm.Transports.Network.Relay` to `false`. @@ -1280,51 +1502,11 @@ Default: `false` Type: `bool` -### `Swarm.EnableRelayHop` - -Configures this node to act as a relay "hop". A relay "hop" relays traffic for other peers. - -WARNING: Do not enable this option unless you know what you're doing. Other -peers will randomly decide to use your node as a relay and consume _all_ -available bandwidth. There is _no_ rate-limiting. - -Default: `false` - -Type: `bool` - -### `Swarm.EnableAutoRelay` - -Enables "automatic relay" mode for this node. This option does two _very_ -different things based on the `Swarm.EnableRelayHop`. See -[#7228](https://github.com/ipfs/go-ipfs/issues/7228) for context. - -Default: `false` - -Type: `bool` - -#### Mode 1: `EnableRelayHop` is `false` - -If `Swarm.EnableAutoRelay` is enabled and `Swarm.EnableRelayHop` is disabled, -your node will automatically _use_ public relays from the network if it detects -that it cannot be reached from the public internet (e.g., it's behind a -firewall). This is likely the feature you're looking for. - -If you enable `EnableAutoRelay`, you should almost certainly disable -`EnableRelayHop`. - -#### Mode 2: `EnableRelayHop` is `true` - -If `EnableAutoRelay` is enabled and `EnableRelayHop` is enabled, your node will -_act_ as a public relay for the network. Furthermore, in addition to simply -relaying traffic, your node will advertise itself as a public relay. Unless you -have the bandwidth of a small ISP, do not enable both of these options at the -same time. - ### `Swarm.EnableAutoNATService` **REMOVED** -Please use [`AutoNAT.ServiceMode`][]. +Please use [`AutoNAT.ServiceMode`][#autonatservicemode]. ### `Swarm.ConnMgr` @@ -1470,16 +1652,25 @@ Listen Addresses: #### `Swarm.Transports.Network.Relay` [Libp2p Relay](https://github.com/libp2p/specs/tree/master/relay) proxy -transport that forms connections by hopping between multiple libp2p nodes. This -transport is primarily useful for bypassing firewalls and NATs. +transport that forms connections by hopping between multiple libp2p nodes. +Allows IPFS node to connect to other peers using their `/p2p-circuit` +multiaddrs. This transport is primarily useful for bypassing firewalls and +NATs. + +See also: +- Docs: [Libp2p Circuit Relay](https://docs.libp2p.io/concepts/circuit-relay/) +- [`Swarm.EnableAutoRelay`](#swarmenableautorelay) for getting a public + `/p2p-circuit` address when behind a firewall. +- [`Swarm.RelayService.Enabled`](#swarmrelayserviceenabled) for becoming a + limited relay for other peers Default: Enabled Type: `flag` -Listen Addresses: This transport is special. Any node that enables this -transport can receive inbound connections on this transport, without specifying -a listen address. +Listen Addresses: +* This transport is special. Any node that enables this transport can receive + inbound connections on this transport, without specifying a listen address. ### `Swarm.Transports.Security` @@ -1589,7 +1780,7 @@ Example: Be mindful that: - Currently only `https://` URLs for [DNS over HTTPS (DoH)](https://en.wikipedia.org/wiki/DNS_over_HTTPS) endpoints are supported as values. -- The default catch-all resolver is the cleartext one provided by your operating system. It can be overriden by adding a DoH entry for the DNS root indicated by `.` as illustrated above. +- The default catch-all resolver is the cleartext one provided by your operating system. It can be overridden by adding a DoH entry for the DNS root indicated by `.` as illustrated above. - Out-of-the-box support for selected decentralized TLDs relies on a [centralized service which is provided on best-effort basis](https://www.cloudflare.com/distributed-web-gateway-terms/). The implicit DoH resolvers are: ```json { diff --git a/docs/environment-variables.md b/docs/environment-variables.md index 78f3d4d5c..174e283f9 100644 --- a/docs/environment-variables.md +++ b/docs/environment-variables.md @@ -1,13 +1,11 @@ # go-ipfs environment variables -## `LIBP2P_TCP_REUSEPORT` (`IPFS_REUSEPORT`) +## `LIBP2P_TCP_REUSEPORT` go-ipfs tries to reuse the same source port for all connections to improve NAT traversal. If this is an issue, you can disable it by setting `LIBP2P_TCP_REUSEPORT` to false. -This variable was previously `IPFS_REUSEPORT`. - Default: true ## `IPFS_PATH` diff --git a/docs/examples/go-ipfs-as-a-library/go.mod b/docs/examples/go-ipfs-as-a-library/go.mod index f986c0e2b..00b294b63 100644 --- a/docs/examples/go-ipfs-as-a-library/go.mod +++ b/docs/examples/go-ipfs-as-a-library/go.mod @@ -3,12 +3,10 @@ module github.com/ipfs/go-ipfs/examples/go-ipfs-as-a-library go 1.16 require ( - github.com/ipfs/go-ipfs v0.9.1 + github.com/ipfs/go-ipfs v0.10.0 github.com/ipfs/go-ipfs-config v0.16.0 github.com/ipfs/go-ipfs-files v0.0.8 github.com/ipfs/interface-go-ipfs-core v0.5.1 - github.com/libp2p/go-libp2p-core v0.9.0 + github.com/libp2p/go-libp2p-core v0.11.0 github.com/multiformats/go-multiaddr v0.4.0 ) - -replace github.com/ipfs/go-ipfs => ./../../.. diff --git a/docs/examples/go-ipfs-as-a-library/go.sum b/docs/examples/go-ipfs-as-a-library/go.sum index 69491d31c..bb26555cc 100644 --- a/docs/examples/go-ipfs-as-a-library/go.sum +++ b/docs/examples/go-ipfs-as-a-library/go.sum @@ -113,8 +113,6 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -441,6 +439,8 @@ github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= github.com/ipfs/go-graphsync v0.8.0 h1:Zhh6QdTqdipYHD71ncLO8eA6c8EGUTOoJ4Rqybw3K+o= github.com/ipfs/go-graphsync v0.8.0/go.mod h1:CLxN859dUTcXCav1DvNvmAUWPZfmNLjlGLJYy+c3dlM= +github.com/ipfs/go-ipfs v0.10.0 h1:+b6QNlNvYTTEUPIFab484t1Ubylz+fBczIK+q0UV62Q= +github.com/ipfs/go-ipfs v0.10.0/go.mod h1:HsnRkQdpruG6JMaycJyrlLwJdduw1dJv2rEPgWxdJvA= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= @@ -465,7 +465,6 @@ github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFq github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= github.com/ipfs/go-ipfs-keystore v0.0.2 h1:Fa9xg9IFD1VbiZtrNLzsD0GuELVHUFXCWF64kCPfEXU= github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= @@ -639,8 +638,9 @@ github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40J github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-doh-resolver v0.3.1 h1:1wbVGkB4Tdj4WEvjAuYknOPyt4vSSDn9thnj13pKPaY= github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= @@ -662,10 +662,11 @@ github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= +github.com/libp2p/go-libp2p v0.15.0-rc.1.0.20211021081216-db8f9c6fddb5 h1:nE20CmFlCbwN56/3bADccjHEvbM9E9hFe7Y+0ebdpig= +github.com/libp2p/go-libp2p v0.15.0-rc.1.0.20211021081216-db8f9c6fddb5/go.mod h1:P+WgjkSS2d8eBj+NvkyKo0nb8fJAC04G+cCex0ZMcvI= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -673,8 +674,9 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.5.0 h1:/+3+4NcQV47DQ/duvRyFDP8oxv6CQTvSKYD5iWoPcYs= +github.com/libp2p/go-libp2p-autonat v0.5.0/go.mod h1:085tmmuXn0nXgFwuF7a2tt4UxgTjuapbuml27v4htKY= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= @@ -714,8 +716,10 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -755,8 +759,9 @@ github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aD github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= @@ -764,8 +769,8 @@ github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLK github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -779,8 +784,9 @@ github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRj github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.8 h1:nJghUlUkFVvyk7ccsM67oFA6kqUkwyCM1G4WPVMCWYA= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= +github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= @@ -792,8 +798,9 @@ github.com/libp2p/go-libp2p-pubsub-router v0.4.0 h1:KjzTLIOBCt0+/4wH6epTxD/Qu4Up github.com/libp2p/go-libp2p-pubsub-router v0.4.0/go.mod h1:hs0j0ugcBjMOMgJ6diOlZM2rZEId/w5Gg86E+ac4SmQ= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= -github.com/libp2p/go-libp2p-quic-transport v0.12.0 h1:7IjDH4XNkmJbOMD+mxRloTe4LzMTq+vqvm2nYNL1N7M= -github.com/libp2p/go-libp2p-quic-transport v0.12.0/go.mod h1:EKHqxZbWE/FhDJZ6ebyZ/4v3X9zyuuuKIN0XR9vANT0= +github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.14.0 h1:sBjT/8zKv8otFZh3Uhdxl91BhwXwuHAOB5lJgbT2zyk= +github.com/libp2p/go-libp2p-quic-transport v0.14.0/go.mod h1:/W4njiXIRowKk62w6j4y4dVpBZvEk9WtGOtOYh2M6J8= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= @@ -817,8 +824,9 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.7.0 h1:ZohJ/XtPP0O73Y1BeCvRRfBcoBfZkqRiKmBwKQfnYGg= +github.com/libp2p/go-libp2p-swarm v0.7.0/go.mod h1:Ii3RNGBC+CMIO3BzK/hmzzriJUOkCVT7viOd+alyEPY= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -828,11 +836,12 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0 h1:bTjC29TTQ/ODq0ld3+0KLq3irdA5cAH3OMbRi0/QsvE= +github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +github.com/libp2p/go-libp2p-tls v0.3.0 h1:8BgvUJiOTcj0Gp6XvEicF0rL5aUtRg/UzEdeZDmDlC8= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= @@ -842,8 +851,9 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0 h1:7SDl3O2+AYOgfE40Mis83ClpfGNkNA6m4FwhbOHs+iI= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db h1:EDoDKW8ZAHd6SIDeo+thU51PyQppqLYkBxx0ObvFj/w= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= @@ -876,12 +886,14 @@ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -894,13 +906,15 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= @@ -920,8 +934,8 @@ github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1 github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -946,14 +960,15 @@ github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawO github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/zeroconf/v2 v2.0.0 h1:qYAHAqUVh4hMSfu+iDTZNqH07wLGAvb1+DW4Tx/qUoQ= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +github.com/libp2p/zeroconf/v2 v2.1.1 h1:XAuSczA96MYkVwH+LqqqCUZb2yH3krobMJ1YE+0hG2s= +github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= 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/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= -github.com/lucas-clemente/quic-go v0.23.0 h1:5vFnKtZ6nHDFsc/F3uuiF4T3y/AXaQdxjUqiVw26GZE= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= diff --git a/docs/examples/go-ipfs-as-a-library/main.go b/docs/examples/go-ipfs-as-a-library/main.go index b7c1537dd..5b032e56a 100644 --- a/docs/examples/go-ipfs-as-a-library/main.go +++ b/docs/examples/go-ipfs-as-a-library/main.go @@ -66,8 +66,6 @@ func createTempRepo() (string, error) { cfg.Experimental.FilestoreEnabled = true // https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#ipfs-urlstore cfg.Experimental.UrlstoreEnabled = true - // https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#directory-sharding--hamt - cfg.Experimental.ShardingEnabled = true // https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#ipfs-p2p cfg.Experimental.Libp2pStreamMounting = true // https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#p2p-http-proxy diff --git a/docs/experimental-features.md b/docs/experimental-features.md index 9b0bffa1e..4d99f58c2 100644 --- a/docs/experimental-features.md +++ b/docs/experimental-features.md @@ -38,14 +38,22 @@ Candidate, disabled by default but will be enabled by default in 0.6.0. ### In Version -0.4.5 +0.4.5 (`--enable-pubsub-experiment`) +0.11.0 (`Pubsub.Enabled` flag in config) ### How to enable -run your daemon with the `--enable-pubsub-experiment` flag. Then use the -`ipfs pubsub` commands. +Run your daemon with the `--enable-pubsub-experiment` flag +or modify your ipfs config and restart the daemon: +``` +ipfs config --json Pubsub.Enabled true +``` -Configuration documentation can be found in [./config.md]() +Then use the `ipfs pubsub` commands. + +NOTE: `--enable-pubsub-experiment` CLI flag overrides `Pubsub.Enabled` config. + +Configuration documentation can be found in [go-ipfs/docs/config.md](./config.md#pubsub) ### Road to being a real feature @@ -402,27 +410,22 @@ See [Plugin docs](./plugins.md) ## Directory Sharding / HAMT ### In Version -0.4.8 + +- 0.4.8: + - Introduced `Experimental.ShardingEnabled` which enabled sharding globally. + - All-or-nothing, unnecessary sharding of small directories. + +- 0.11.0 : + - Removed support for `Experimental.ShardingEnabled` + - Replaced with automatic sharding based on the block size ### State -Experimental -Allows creating directories with an unlimited number of entries. +Replaced by autosharding. -**Caveats:** -1. right now it is a GLOBAL FLAG which will impact the final CID of all directories produced by `ipfs.add` (even the small ones) -2. currently size of unixfs directories is limited by the maximum block size +The `Experimental.ShardingEnabled` config field is no longer used, please remove it from your configs. -### Basic Usage: - -``` -ipfs config --json Experimental.ShardingEnabled true -``` - -### Road to being a real feature - -- [ ] Make sure that objects that don't have to be sharded aren't -- [ ] Generalize sharding and define a new layer between IPLD and IPFS +go-ipfs now automatically shards when directory block is bigger than 256KB, ensuring every block is small enough to be exchanged with other peers ## IPNS pubsub @@ -431,12 +434,15 @@ ipfs config --json Experimental.ShardingEnabled true 0.4.14 : - Introduced -0.5.0 : +0.5.0 : - No longer needs to use the DHT for the first resolution - When discovering PubSub peers via the DHT, the DHT key is different from previous versions - This leads to 0.5 IPNS pubsub peers and 0.4 IPNS pubsub peers not being able to find each other in the DHT - Robustness improvements +0.11.0 : + - Can be enabled via `Ipns.UsePubsub` flag in config + ### State Experimental, default-disabled. @@ -457,7 +463,15 @@ Users interested in this feature should upgrade to at least 0.5.0 ### How to enable -run your daemon with the `--enable-namesys-pubsub` flag; enables pubsub. +Run your daemon with the `--enable-namesys-pubsub` flag +or modify your ipfs config and restart the daemon: +``` +ipfs config --json Ipns.UsePubsub true +``` + +NOTE: +- This feature implicitly enables [ipfs pubsub](#ipfs-pubsub). +- Passing `--enable-namesys-pubsub` CLI flag overrides `Ipns.UsePubsub` config. ### Road to being a real feature @@ -468,7 +482,11 @@ run your daemon with the `--enable-namesys-pubsub` flag; enables pubsub. ### In Version -0.4.19 +- 0.4.19 : + - Introduced Circuit Relay v1 +- 0.11.0 : + - Deprecated v1 + - Introduced [Circuit Relay v2](https://github.com/libp2p/specs/blob/master/relay/circuit-v2.md) ### State @@ -481,15 +499,14 @@ Automatically discovers relays and advertises relay addresses when the node is b Modify your ipfs config: ``` -ipfs config --json Swarm.EnableRelayHop false -ipfs config --json Swarm.EnableAutoRelay true +ipfs config --json Swarm.RelayClient.Enabled true ``` -NOTE: Ensuring `Swarm.EnableRelayHop` is _false_ is extremely important here. If you set it to true, you will _act_ as a public relay for the rest of the network instead of _using_ the public relays. - ### Road to being a real feature - [ ] needs testing +- [ ] needs to be automatically enabled when AutoNAT detects node is behind an impenetrable NAT. + ## Strategic Providing @@ -600,4 +617,4 @@ ipfs config --json Experimental.AcceleratedDHTClient true - [ ] Needs more people to use and report on how well it works - [ ] Should be usable for queries (even if slower/less efficient) shortly after startup -- [ ] Should be usable with non-WAN DHTs \ No newline at end of file +- [ ] Should be usable with non-WAN DHTs diff --git a/docs/snap.md b/docs/snap.md index 203f7a566..01b62c12e 100644 --- a/docs/snap.md +++ b/docs/snap.md @@ -1,6 +1,6 @@ # Publishing go-ipfs as a snap -> Snap is the default package manager for ubuntu since the release of 20.04. This doc captures what we know about building go-ipfs as a snap packge and publishing it to the snapstore. +> Snap is the default package manager for ubuntu since the release of 20.04. This doc captures what we know about building go-ipfs as a snap package and publishing it to the snapstore. The go-ipfs snap is defined in [snap/snapcraft.yaml](https://github.com/ipfs/go-ipfs/blob/master/snap/snapcraft.yaml). For more detail on our snapcraft.yaml see: https://github.com/ipfs-shipyard/ipfs-snap @@ -15,7 +15,7 @@ Linux user can install go-ipfs with: $ snap install ipfs ``` -Apps installed via Snapcraft are auto-updating by default. Snapcraft uses 'Release Channels' to let the user pick their stability level, with channels for `stable`, `candidate`, `beta` and `edge`. Snap will install the lasest release from the `stable` channel by default. A user that wants to test out the bleeding edge can opt in by passing the `--edge` flag +Apps installed via Snapcraft are auto-updating by default. Snapcraft uses 'Release Channels' to let the user pick their stability level, with channels for `stable`, `candidate`, `beta` and `edge`. Snap will install the latest release from the `stable` channel by default. A user that wants to test out the bleeding edge can opt in by passing the `--edge` flag ``` $ snap install --edge ipfs @@ -182,10 +182,10 @@ The `ipfs` snapcraft.io listing can be edited by - @lidel - @olizilla -You need a Canonical developer account, then ask an existing owner to add you. Accsess is managed here https://dashboard.snapcraft.io/snaps/ipfs/collaboration/ +You need a Canonical developer account, then ask an existing owner to add you. Access is managed here https://dashboard.snapcraft.io/snaps/ipfs/collaboration/ -The launchpad.net config is managed by [**IPFS Maintainers**](https://launchpad.net/~ipfs) team, and you can request to join that team with your Canonical developer acccount. The list of maintainers is here: https://launchpad.net/~ipfs/+members +The launchpad.net config is managed by [**IPFS Maintainers**](https://launchpad.net/~ipfs) team, and you can request to join that team with your Canonical developer account. The list of maintainers is here: https://launchpad.net/~ipfs/+members At the time of writing the launchpad maintainers are: diff --git a/fuse/readonly/readonly_unix.go b/fuse/readonly/readonly_unix.go index 85d5e1a6b..1fbb47310 100644 --- a/fuse/readonly/readonly_unix.go +++ b/fuse/readonly/readonly_unix.go @@ -1,3 +1,4 @@ +//go:build (linux || darwin || freebsd) && !nofuse // +build linux darwin freebsd // +build !nofuse @@ -81,7 +82,7 @@ func (s *Root) Lookup(ctx context.Context, name string) (fs.Node, error) { } // convert ipld-prime node to universal node - blk, err := s.Ipfs.Blockstore.Get(cidLnk.Cid) + blk, err := s.Ipfs.Blockstore.Get(ctx, cidLnk.Cid) if err != nil { log.Debugf("fuse failed to retrieve block: %v: %s", cidLnk, err) return nil, fuse.ENOENT diff --git a/gc/gc.go b/gc/gc.go index 4b0e6c5d7..b65756f01 100644 --- a/gc/gc.go +++ b/gc/gc.go @@ -40,7 +40,7 @@ type Result struct { func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []cid.Cid) <-chan Result { ctx, cancel := context.WithCancel(ctx) - unlocker := bs.GCLock() + unlocker := bs.GCLock(ctx) bsrv := bserv.New(bs, offline.Exchange(bs)) ds := dag.NewDAGService(bsrv) @@ -50,7 +50,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn go func() { defer cancel() defer close(output) - defer unlocker.Unlock() + defer unlocker.Unlock(ctx) gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots, output) if err != nil { @@ -80,7 +80,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn break loop } if !gcs.Has(k) { - err := bs.DeleteBlock(k) + err := bs.DeleteBlock(ctx, k) removed++ if err != nil { errors = true @@ -115,7 +115,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn return } - err = gds.CollectGarbage() + err = gds.CollectGarbage(ctx) if err != nil { select { case output <- Result{Error: err}: diff --git a/go.mod b/go.mod index 5da91c596..c3c87b567 100644 --- a/go.mod +++ b/go.mod @@ -2,43 +2,44 @@ module github.com/ipfs/go-ipfs require ( bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc - contrib.go.opencensus.io/exporter/prometheus v0.3.0 + contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/blang/semver/v4 v4.0.0 + github.com/ceramicnetwork/go-dag-jose v0.1.0 github.com/cheggaaa/pb v1.0.29 github.com/coreos/go-systemd/v22 v22.3.2 github.com/dustin/go-humanize v1.0.0 github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302 - github.com/fsnotify/fsnotify v1.4.9 - github.com/gabriel-vasile/mimetype v1.1.2 + github.com/fsnotify/fsnotify v1.5.1 + github.com/gabriel-vasile/mimetype v1.4.0 github.com/go-bindata/go-bindata/v3 v3.1.3 github.com/hashicorp/go-multierror v1.1.1 - github.com/ipfs/go-bitswap v0.4.0 + github.com/ipfs/go-bitswap v0.5.1 github.com/ipfs/go-block-format v0.0.3 - github.com/ipfs/go-blockservice v0.1.7 - github.com/ipfs/go-cid v0.0.7 + github.com/ipfs/go-blockservice v0.2.1 + github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 - github.com/ipfs/go-datastore v0.4.6 + github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-detect-race v0.0.1 - github.com/ipfs/go-ds-badger v0.2.7 - github.com/ipfs/go-ds-flatfs v0.4.5 - github.com/ipfs/go-ds-leveldb v0.4.2 - github.com/ipfs/go-ds-measure v0.1.0 - github.com/ipfs/go-fetcher v1.5.0 - github.com/ipfs/go-filestore v0.0.3 + github.com/ipfs/go-ds-badger v0.3.0 + github.com/ipfs/go-ds-flatfs v0.5.1 + github.com/ipfs/go-ds-leveldb v0.5.0 + github.com/ipfs/go-ds-measure v0.2.0 + github.com/ipfs/go-fetcher v1.6.1 + github.com/ipfs/go-filestore v0.1.0 github.com/ipfs/go-fs-lock v0.0.7 - github.com/ipfs/go-graphsync v0.8.0 - github.com/ipfs/go-ipfs-blockstore v0.1.6 + github.com/ipfs/go-graphsync v0.11.0 + github.com/ipfs/go-ipfs-blockstore v0.2.1 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-cmds v0.6.0 - github.com/ipfs/go-ipfs-config v0.16.0 - github.com/ipfs/go-ipfs-exchange-interface v0.0.1 - github.com/ipfs/go-ipfs-exchange-offline v0.0.1 - github.com/ipfs/go-ipfs-files v0.0.8 + github.com/ipfs/go-ipfs-config v0.18.0 + github.com/ipfs/go-ipfs-exchange-interface v0.1.0 + github.com/ipfs/go-ipfs-exchange-offline v0.1.1 + github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipfs-keystore v0.0.2 - github.com/ipfs/go-ipfs-pinner v0.1.2 + github.com/ipfs/go-ipfs-pinner v0.2.1 github.com/ipfs/go-ipfs-posinfo v0.0.1 - github.com/ipfs/go-ipfs-provider v0.6.1 - github.com/ipfs/go-ipfs-routing v0.1.0 + github.com/ipfs/go-ipfs-provider v0.7.1 + github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.5 github.com/ipfs/go-ipld-format v0.2.0 @@ -46,71 +47,68 @@ require ( github.com/ipfs/go-ipld-legacy v0.1.0 github.com/ipfs/go-ipns v0.1.2 github.com/ipfs/go-log v1.0.5 - github.com/ipfs/go-merkledag v0.4.0 + github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 - github.com/ipfs/go-mfs v0.1.2 - github.com/ipfs/go-namesys v0.3.1 - github.com/ipfs/go-path v0.1.2 + github.com/ipfs/go-mfs v0.2.1 + github.com/ipfs/go-namesys v0.4.0 + github.com/ipfs/go-path v0.2.1 github.com/ipfs/go-pinning-service-http-client v0.1.0 - github.com/ipfs/go-unixfs v0.2.5 + github.com/ipfs/go-unixfs v0.3.1 github.com/ipfs/go-unixfsnode v1.1.3 github.com/ipfs/go-verifcid v0.0.1 - github.com/ipfs/interface-go-ipfs-core v0.5.1 - github.com/ipfs/tar-utils v0.0.1 - github.com/ipld/go-car v0.3.1 + github.com/ipfs/interface-go-ipfs-core v0.5.2 + github.com/ipfs/tar-utils v0.0.2 + github.com/ipld/go-car v0.3.2 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.12.2 + github.com/ipld/go-ipld-prime v0.14.2 github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c github.com/jbenet/go-temp-err-catcher v0.1.0 github.com/jbenet/goprocess v0.1.4 github.com/libp2p/go-doh-resolver v0.3.1 - github.com/libp2p/go-libp2p v0.15.0 - github.com/libp2p/go-libp2p-circuit v0.4.0 + github.com/libp2p/go-libp2p v0.16.0 github.com/libp2p/go-libp2p-connmgr v0.2.4 - github.com/libp2p/go-libp2p-core v0.9.0 - github.com/libp2p/go-libp2p-discovery v0.5.1 + github.com/libp2p/go-libp2p-core v0.11.0 + github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-http v0.2.1 - github.com/libp2p/go-libp2p-kad-dht v0.13.1 + github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-kbucket v0.4.7 github.com/libp2p/go-libp2p-loggables v0.1.0 github.com/libp2p/go-libp2p-mplex v0.4.1 - github.com/libp2p/go-libp2p-noise v0.2.2 - github.com/libp2p/go-libp2p-peerstore v0.2.8 - github.com/libp2p/go-libp2p-pubsub v0.5.4 - github.com/libp2p/go-libp2p-pubsub-router v0.4.0 - github.com/libp2p/go-libp2p-quic-transport v0.12.0 + github.com/libp2p/go-libp2p-noise v0.3.0 + github.com/libp2p/go-libp2p-peerstore v0.4.0 + github.com/libp2p/go-libp2p-pubsub v0.6.0 + github.com/libp2p/go-libp2p-pubsub-router v0.5.0 + github.com/libp2p/go-libp2p-quic-transport v0.15.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.5.3 - github.com/libp2p/go-libp2p-testing v0.4.2 - github.com/libp2p/go-libp2p-tls v0.2.0 - github.com/libp2p/go-libp2p-yamux v0.5.4 + github.com/libp2p/go-libp2p-swarm v0.8.0 + github.com/libp2p/go-libp2p-testing v0.5.0 + github.com/libp2p/go-libp2p-tls v0.3.1 + github.com/libp2p/go-libp2p-yamux v0.6.0 github.com/libp2p/go-socket-activation v0.1.0 - github.com/libp2p/go-tcp-transport v0.2.8 + github.com/libp2p/go-tcp-transport v0.4.0 github.com/libp2p/go-ws-transport v0.5.0 github.com/miekg/dns v1.1.43 github.com/mitchellh/go-homedir v1.1.0 - github.com/multiformats/go-multiaddr v0.4.0 + github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multicodec v0.3.0 - github.com/multiformats/go-multihash v0.0.15 + github.com/multiformats/go-multihash v0.1.0 github.com/opentracing/opentracing-go v1.2.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.11.0 - github.com/prometheus/statsd_exporter v0.21.0 // indirect github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.0 github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 go.opencensus.io v0.23.0 - go.uber.org/fx v1.13.1 - go.uber.org/zap v1.19.0 - golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e - golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect + go.uber.org/fx v1.15.0 + go.uber.org/zap v1.19.1 + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 + golang.org/x/sys v0.0.0-20211025112917-711f33c9992c ) go 1.16 diff --git a/go.sum b/go.sum index d8517932a..68cac021e 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/prometheus v0.3.0 h1:08FMdJYpItzsknogU6PiiNo7XQZg/25GjH236+YCwD0= -contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= +contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= +contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= @@ -65,6 +65,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= @@ -115,9 +117,9 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/ceramicnetwork/go-dag-jose v0.1.0 h1:yJ/HVlfKpnD3LdYP03AHyTvbm3BpPiz2oZiOeReJRdU= +github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= @@ -154,6 +156,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= 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/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -205,13 +208,15 @@ github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJn 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.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gabriel-vasile/mimetype v1.1.2 h1:gaPnPcNor5aZSVCJVSGipcpbgMWiAAj9z182ocSGbHU= -github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/gabriel-vasile/mimetype v1.4.0 h1:Cn9dkdYsMIu56tGho+fqzh7XmvY2YyGU0FnbhiOsEro= +github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI= @@ -294,13 +299,13 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= 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= @@ -324,9 +329,8 @@ github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE0 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 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/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -385,47 +389,48 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= +github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= -github.com/ipfs/go-bitswap v0.4.0 h1:bLiqrpef1na4wdqGLqHKv954s1zz6KFghfmQWCPjBik= -github.com/ipfs/go-bitswap v0.4.0/go.mod h1:J2sAsp9UKxLgHDektSy3y3Q9OfQjM9sjhKBR1dlwrMg= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.1/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= -github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.7 h1:ysQJVJA3fNDF1qigJbsSQOdjhVLsOEoPdh0+R97k3jY= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= +github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= -github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -433,31 +438,34 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.2.7 h1:ju5REfIm+v+wgVnQ19xGLYPHYHbYLR6qJfmMbCDSK1I= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-flatfs v0.4.5 h1:4QceuKEbH+HVZ2ZommstJMi3o3II+dWS3IhLaD7IGHs= -github.com/ipfs/go-ds-flatfs v0.4.5/go.mod h1:e4TesLyZoA8k1gV/yCuBTnt2PJtypn4XUlB5n8KQMZY= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +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-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= -github.com/ipfs/go-fetcher v1.5.0 h1:oreKTKBzja3S09rSmoZlA3KGVlRiUbJ1pQjtB4K6y3w= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= +github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= -github.com/ipfs/go-filestore v0.0.3 h1:MhZ1jT5K3NewZwim6rS/akcJLm1xM+r6nz6foeB9EwE= -github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE= +github.com/ipfs/go-fetcher v1.6.1 h1:UFuRVYX5AIllTiRhi5uK/iZkfhSpBCGX7L70nSZEmK8= +github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= +github.com/ipfs/go-filestore v0.1.0 h1:qxvDVTzGrbQElddMmkwsJwJn+fDwWb3pHQHtKc1H0a8= +github.com/ipfs/go-filestore v0.1.0/go.mod h1:0KTrzoJnJ3sJDEDM09Vq8nz8H475rRyeq4i0n/bpF00= github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.8.0 h1:Zhh6QdTqdipYHD71ncLO8eA6c8EGUTOoJ4Rqybw3K+o= -github.com/ipfs/go-graphsync v0.8.0/go.mod h1:CLxN859dUTcXCav1DvNvmAUWPZfmNLjlGLJYy+c3dlM= +github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v0.1.6 h1:+RNM/gkTF6lzLPtt/xqjEUXJuG0lFwAiv+MV8MoAhvA= github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-ipfs-blockstore v0.2.1 h1:624eIDnkZWNdWbp/N8aDBOUtSY0YW75aJu+vbxnNlkA= +github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= 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-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -465,35 +473,39 @@ github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7Na github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= github.com/ipfs/go-ipfs-cmds v0.6.0 h1:yAxdowQZzoFKjcLI08sXVNnqVj3jnABbf9smrPQmBsw= github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.16.0 h1:CBtIYyp/iWIczCv83bmfge8EA2KqxOOfqmETs3tUnnU= -github.com/ipfs/go-ipfs-config v0.16.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= +github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= +github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= 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-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1 h1:IW/bXGeaAZV2VH0Kuok+Ohva/zHkHmeLFBxC1k7mNPc= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= +github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= +github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-keystore v0.0.2 h1:Fa9xg9IFD1VbiZtrNLzsD0GuELVHUFXCWF64kCPfEXU= github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= -github.com/ipfs/go-ipfs-pinner v0.1.2 h1:Ve9OBhL6eg5+tVqEnIhPZOCXDtMjB+OhOohVZxPUxms= -github.com/ipfs/go-ipfs-pinner v0.1.2/go.mod h1:/u9kMe+TyQybN21O5OBicdyx3x93lVI77PCtiTnArUk= +github.com/ipfs/go-ipfs-pinner v0.2.1 h1:kw9hiqh2p8TatILYZ3WAfQQABby7SQARdrdA+5Z5QfY= +github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-provider v0.6.1 h1:4VenAH1J5XH+/mgM2Y7p+QN3wlk7CInMDG8rsT2CGW4= -github.com/ipfs/go-ipfs-provider v0.6.1/go.mod h1:I4Cig3InhftbRJohph76Qy/P2uKEZILNGiKvDJmmC28= +github.com/ipfs/go-ipfs-provider v0.7.1 h1:eKToBUAb6ZY8iiA6AYVxzW4G1ep67XUaaEBUIYpxhfw= +github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= 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= @@ -510,8 +522,6 @@ github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+ github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI= github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= -github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= -github.com/ipfs/go-ipns v0.1.0/go.mod h1:3IbsuPkR6eAGcnx+E7j6HpOSbSQJPZ6zlRj+NK3jPxQ= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -528,58 +538,57 @@ github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Ax github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= -github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.0/go.mod h1:4pymaZLhSLNVuiCITYrpViD6vmfZ/Ws4n/L9tfNv3S4= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.4.0 h1:ixNu/5MJSaT/Qs073T0/HsWKwnOoBgqSq1g+GaJIen0= github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= 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-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-mfs v0.1.2 h1:DlelNSmH+yz/Riy0RjPKlooPg0KML4lXGdLw7uZkfAg= -github.com/ipfs/go-mfs v0.1.2/go.mod h1:T1QBiZPEpkPLzDqEJLNnbK55BVKVlNi2a+gVm4diFo0= -github.com/ipfs/go-namesys v0.3.1 h1:DqmeXlVODejOyECAqoqhSB5JGRv8aRFhtG0oPDmxsMc= -github.com/ipfs/go-namesys v0.3.1/go.mod h1:/BL4xk8LP5Lq82AmaRKyxZv/eYRlumNiU9SZUe1Hlps= +github.com/ipfs/go-mfs v0.2.1 h1:5jz8+ukAg/z6jTkollzxGzhkl3yxm022Za9f2nL5ab8= +github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= +github.com/ipfs/go-namesys v0.4.0 h1:Gxg4kEWxVcHuUJl60KMNs1k8AiVB3luXbz8ZJkSGacs= +github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8= github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0= -github.com/ipfs/go-path v0.1.2 h1:yQxN9JNhO4KbaaYtVgVpIH0BQDzn5Zpl5A6to93O7Ck= -github.com/ipfs/go-path v0.1.2/go.mod h1:3DdbxZb0PtT0g3UlMqyzms1UBKPc0pQ2NHx5/XScYdY= +github.com/ipfs/go-path v0.2.1 h1:R0JYCu0JBnfa6A3C42nzsNPxtKU5/fnUPhWSuzcJHws= +github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -github.com/ipfs/go-peertaskqueue v0.4.0 h1:x1hFgA4JOUJ3ntPfqLRu6v4k6kKL0p07r3RSg9JNyHI= -github.com/ipfs/go-peertaskqueue v0.4.0/go.mod h1:KL9F49hXJMoXCad8e5anivjN+kWdr+CyGcyh4K6doLc= +github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-pinning-service-http-client v0.1.0 h1:Au0P4NglL5JfzhNSZHlZ1qra+IcJyO3RWMd9EYCwqSY= github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4= -github.com/ipfs/go-unixfs v0.1.0/go.mod h1:lysk5ELhOso8+Fed9U1QTGey2ocsfaZ18h0NCO2Fj9s= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.5 h1:irj/WzIcgTBay48mSMUYDbKlIzIocXWcuUUsi5qOMOE= -github.com/ipfs/go-unixfs v0.2.5/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= +github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= +github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= github.com/ipfs/go-unixfsnode v1.1.3 h1:IyqJBGIEvcHvll1wDDVIHOEVXnE+IH6tjzTWpZ6kGiI= github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/interface-go-ipfs-core v0.5.1 h1:1KMM7RkjUD8W5fSoRsa9xR6ZMzeL8fLHOUM1UEW9Y4M= -github.com/ipfs/interface-go-ipfs-core v0.5.1/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= -github.com/ipfs/tar-utils v0.0.1 h1:8Na0KBD6GddGyXwU4rXNtVTE24iuZws8mENJQPLG7W4= -github.com/ipfs/tar-utils v0.0.1/go.mod h1:ACflm9wXvV9w0eMJt6yYXxS2zuIV+yXGNwbuq1bhLeE= -github.com/ipld/go-car v0.3.1 h1:WT+3cdmXlvmWOlGxk9webhj4auGO5QvgqC2vCCkFRXs= -github.com/ipld/go-car v0.3.1/go.mod h1:dPkEWeAK8KaVvH5TahaCs6Mncpd4lDMpkbs0/SPzuVs= +github.com/ipfs/interface-go-ipfs-core v0.5.2 h1:m1/5U+WpOK2ZE7Qzs5iIu80QM1ZA3aWYi2Ilwpi+tdg= +github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= +github.com/ipfs/tar-utils v0.0.2 h1:UNgHB4x/PPzbMkmJi+7EqC9LNMPDztOVSnx1HAqSNg4= +github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM= +github.com/ipld/go-car v0.3.2 h1:V9wt/80FNfbMRWSD98W5br6fyjUAyVgI2lDOTZX16Lg= +github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.2 h1:StIquYvKIRuSEAtjJDr39fyzBtziioHPwVC75tBiXzo= -github.com/ipld/go-ipld-prime v0.12.2/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.2 h1:P5fO2usnisXwrN/1sR5exCgEvINg/w/27EuYPKB/zx8= +github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -606,7 +615,6 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -638,12 +646,14 @@ github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJ 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.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 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= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= @@ -657,8 +667,9 @@ github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40J github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-doh-resolver v0.3.1 h1:1wbVGkB4Tdj4WEvjAuYknOPyt4vSSDn9thnj13pKPaY= github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= @@ -680,10 +691,11 @@ github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= +github.com/libp2p/go-libp2p v0.16.0 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -691,8 +703,9 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.6.0 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= +github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= @@ -732,8 +745,10 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -742,8 +757,8 @@ github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFT github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-gostream v0.3.0 h1:rnas//vRdHYCr7bjraZJISPwZV8OGMjeX5k5fN5Ax44= github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= @@ -754,9 +769,8 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.11.1/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= -github.com/libp2p/go-libp2p-kad-dht v0.13.1 h1:wQgzOpoc+dcPVDb3h0HNWUjon5JiYEqsA4iNBUtIA7A= -github.com/libp2p/go-libp2p-kad-dht v0.13.1/go.mod h1:iVdxmsKHVPQSCGPP4V/A+tDFCLsxrREZUBX8ohOcKDw= +github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= +github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= @@ -775,8 +789,9 @@ github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aD github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= @@ -784,8 +799,8 @@ github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLK github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -799,24 +814,24 @@ github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRj github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.8 h1:nJghUlUkFVvyk7ccsM67oFA6kqUkwyCM1G4WPVMCWYA= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-peerstore v0.4.0 h1:DOhRJLnM9Dc9lIXi3rPDZBf789LXy1BrzwIs7Tj0cKA= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= -github.com/libp2p/go-libp2p-pubsub v0.4.0/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= -github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= -github.com/libp2p/go-libp2p-pubsub-router v0.4.0 h1:KjzTLIOBCt0+/4wH6epTxD/Qu4Up/IyeKHlj9MhWRJI= -github.com/libp2p/go-libp2p-pubsub-router v0.4.0/go.mod h1:hs0j0ugcBjMOMgJ6diOlZM2rZEId/w5Gg86E+ac4SmQ= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= +github.com/libp2p/go-libp2p-pubsub-router v0.5.0 h1:WuYdY42DVIJ+N0qMdq2du/E9poJH+xzsXL7Uptwj9tw= +github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= -github.com/libp2p/go-libp2p-quic-transport v0.12.0 h1:7IjDH4XNkmJbOMD+mxRloTe4LzMTq+vqvm2nYNL1N7M= -github.com/libp2p/go-libp2p-quic-transport v0.12.0/go.mod h1:EKHqxZbWE/FhDJZ6ebyZ/4v3X9zyuuuKIN0XR9vANT0= +github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.15.0 h1:DR0mP6kcieowikBprWkcNtbquRKOPWb5dLZ4ahDZujk= +github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= @@ -837,8 +852,9 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.8.0 h1:nRHNRhi86L7jhka02N4MoV+PSFFPoJFkHNQwCTFxNhw= +github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -848,11 +864,13 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0 h1:bTjC29TTQ/ODq0ld3+0KLq3irdA5cAH3OMbRi0/QsvE= +github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= +github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= @@ -862,8 +880,9 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0 h1:7SDl3O2+AYOgfE40Mis83ClpfGNkNA6m4FwhbOHs+iI= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db h1:EDoDKW8ZAHd6SIDeo+thU51PyQppqLYkBxx0ObvFj/w= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= @@ -878,8 +897,9 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= -github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.6.0 h1:TKayW983n92JhCGdCo7ej7eEb+DQ0VYfKNOxlN/1kNQ= +github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -896,12 +916,14 @@ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -914,13 +936,15 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= @@ -941,8 +965,8 @@ github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1 github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -965,16 +989,18 @@ github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/zeroconf/v2 v2.0.0 h1:qYAHAqUVh4hMSfu+iDTZNqH07wLGAvb1+DW4Tx/qUoQ= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= +github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +github.com/libp2p/zeroconf/v2 v2.1.1 h1:XAuSczA96MYkVwH+LqqqCUZb2yH3krobMJ1YE+0hG2s= +github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= 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/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= -github.com/lucas-clemente/quic-go v0.23.0 h1:5vFnKtZ6nHDFsc/F3uuiF4T3y/AXaQdxjUqiVw26GZE= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -1068,8 +1094,9 @@ github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.4.0 h1:hL/K4ZJhJ5PTw3nwylq9lGU5yArzcAroZmex1ghSEkQ= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= +github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= +github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= @@ -1100,8 +1127,10 @@ github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1187,7 +1216,6 @@ github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4 github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -1205,7 +1233,6 @@ github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7q github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= @@ -1219,19 +1246,19 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= 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/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -1268,9 +1295,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= -github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -1322,8 +1348,9 @@ github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2 github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= +github.com/warpfork/go-testmark v0.9.0 h1:nc+uaCiv5lFQLYjhuC2LTYeJ7JaC+gdDmsz9r0ISy0Y= +github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= @@ -1388,17 +1415,17 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= -go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.13.1 h1:CFNTr1oin5OJ0VCZ8EycL3wzF29Jz2g0xe55RFsf2a4= -go.uber.org/fx v1.13.1/go.mod h1:bREWhavnedxpJeTq9pQT53BbvwhUv7TcpsOqcH4a+3w= -go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= +go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= +go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= +go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= 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.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= @@ -1410,8 +1437,9 @@ go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= @@ -1446,8 +1474,9 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e h1:VvfwVmMH40bpMeizC9/K7ipM5Qjucuu16RWfneFPyhQ= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1470,9 +1499,8 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1481,7 +1509,6 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1537,6 +1564,7 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1614,7 +1642,6 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1641,8 +1668,11 @@ golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025112917-711f33c9992c h1:i4MLwL3EbCgobekQtkVW94UBSPLMadfEGtKq+CAFsEU= +golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1684,7 +1714,6 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1714,9 +1743,9 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1839,6 +1868,8 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -1866,6 +1897,10 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/misc/systemd/ipfs-hardened.service b/misc/systemd/ipfs-hardened.service index 87dd08f6a..dac21280e 100644 --- a/misc/systemd/ipfs-hardened.service +++ b/misc/systemd/ipfs-hardened.service @@ -1,6 +1,6 @@ # This file will be overwritten on package upgrades, avoid customizations here. # -# To make persistant changes, create file in +# To make persistent changes, create file in # "/etc/systemd/system/ipfs.service.d/overwrite.conf" with # `systemctl edit ipfs.service`. This file will be parsed after this # file has been parsed. @@ -13,7 +13,7 @@ # For more info about custom unit files see systemd.unit(5). # This service file enables systemd-hardening features compatible with IPFS, -# while breaking compability with the fuse-mount function. Use this one only +# while breaking compatibility with the fuse-mount function. Use this one only # if you don't need the fuse-mount functionality. [Unit] diff --git a/misc/systemd/ipfs.service b/misc/systemd/ipfs.service index 44519de77..52e8edb27 100644 --- a/misc/systemd/ipfs.service +++ b/misc/systemd/ipfs.service @@ -1,6 +1,6 @@ # This file will be overwritten on package upgrades, avoid customizations here. # -# To make persistant changes, create file in +# To make persistent changes, create file in # "/etc/systemd/system/ipfs.service.d/overwrite.conf" with # `systemctl edit ipfs.service`. This file will be parsed after this # file has been parsed. diff --git a/peering/peering_test.go b/peering/peering_test.go index cf91e637c..27c9b7175 100644 --- a/peering/peering_test.go +++ b/peering/peering_test.go @@ -16,7 +16,6 @@ import ( func newNode(ctx context.Context, t *testing.T) host.Host { h, err := libp2p.New( - ctx, libp2p.ListenAddrStrings("/ip4/127.0.0.1/tcp/0"), // We'd like to set the connection manager low water to 0, but // that would disable the connection manager. diff --git a/plugin/loader/preload.go b/plugin/loader/preload.go index 4be60625f..17da3c2f7 100644 --- a/plugin/loader/preload.go +++ b/plugin/loader/preload.go @@ -2,6 +2,7 @@ package loader import ( pluginbadgerds "github.com/ipfs/go-ipfs/plugin/plugins/badgerds" + pluginiplddagjose "github.com/ipfs/go-ipfs/plugin/plugins/dagjose" pluginflatfs "github.com/ipfs/go-ipfs/plugin/plugins/flatfs" pluginipldgit "github.com/ipfs/go-ipfs/plugin/plugins/git" pluginlevelds "github.com/ipfs/go-ipfs/plugin/plugins/levelds" @@ -14,6 +15,7 @@ import ( func init() { Preload(pluginipldgit.Plugins...) + Preload(pluginiplddagjose.Plugins...) Preload(pluginbadgerds.Plugins...) Preload(pluginflatfs.Plugins...) Preload(pluginlevelds.Plugins...) diff --git a/plugin/loader/preload_list b/plugin/loader/preload_list index d648da935..54b8dee6f 100644 --- a/plugin/loader/preload_list +++ b/plugin/loader/preload_list @@ -4,6 +4,7 @@ # name go-path number of the sub-plugin or * ipldgit github.com/ipfs/go-ipfs/plugin/plugins/git * +iplddagjose github.com/ipfs/go-ipfs/plugin/plugins/dagjose * badgerds github.com/ipfs/go-ipfs/plugin/plugins/badgerds * flatfs github.com/ipfs/go-ipfs/plugin/plugins/flatfs * diff --git a/plugin/plugins/Rules.mk b/plugin/plugins/Rules.mk index 334ea4491..4a4ed8161 100644 --- a/plugin/plugins/Rules.mk +++ b/plugin/plugins/Rules.mk @@ -1,6 +1,6 @@ include mk/header.mk -$(d)_plugins:=$(d)/git $(d)/badgerds $(d)/flatfs $(d)/levelds $(d)/peerlog +$(d)_plugins:=$(d)/git $(d)/dagjose $(d)/badgerds $(d)/flatfs $(d)/levelds $(d)/peerlog $(d)_plugins_so:=$(addsuffix .so,$($(d)_plugins)) $(d)_plugins_main:=$(addsuffix /main/main.go,$($(d)_plugins)) diff --git a/plugin/plugins/dagjose/dagjose.go b/plugin/plugins/dagjose/dagjose.go new file mode 100644 index 000000000..6d3e35b3d --- /dev/null +++ b/plugin/plugins/dagjose/dagjose.go @@ -0,0 +1,36 @@ +package dagjose + +import ( + "github.com/ipfs/go-ipfs/plugin" + + "github.com/ceramicnetwork/go-dag-jose/dagjose" + "github.com/ipld/go-ipld-prime/multicodec" + mc "github.com/multiformats/go-multicodec" +) + +// Plugins is exported list of plugins that will be loaded +var Plugins = []plugin.Plugin{ + &dagjosePlugin{}, +} + +type dagjosePlugin struct{} + +var _ plugin.PluginIPLD = (*dagjosePlugin)(nil) + +func (*dagjosePlugin) Name() string { + return "ipld-codec-dagjose" +} + +func (*dagjosePlugin) Version() string { + return "0.0.1" +} + +func (*dagjosePlugin) Init(_ *plugin.Environment) error { + return nil +} + +func (*dagjosePlugin) Register(reg multicodec.Registry) error { + reg.RegisterEncoder(uint64(mc.DagJose), dagjose.Encode) + reg.RegisterDecoder(uint64(mc.DagJose), dagjose.Decode) + return nil +} diff --git a/plugin/plugins/levelds/levelds.go b/plugin/plugins/levelds/levelds.go index 12cad713a..8e37bc3a5 100644 --- a/plugin/plugins/levelds/levelds.go +++ b/plugin/plugins/levelds/levelds.go @@ -54,12 +54,12 @@ func (*leveldsPlugin) DatastoreConfigParser() fsrepo.ConfigFromMap { return nil, fmt.Errorf("'path' field is missing or not string") } - switch cm := params["compression"].(string); cm { + switch cm := params["compression"]; cm { case "none": c.compression = ldbopts.NoCompression case "snappy": c.compression = ldbopts.SnappyCompression - case "": + case "", nil: c.compression = ldbopts.DefaultCompression default: return nil, fmt.Errorf("unrecognized value for compression: %s", cm) diff --git a/plugin/plugins/peerlog/peerlog_test.go b/plugin/plugins/peerlog/peerlog_test.go index b5ab6d6ad..47b496af2 100644 --- a/plugin/plugins/peerlog/peerlog_test.go +++ b/plugin/plugins/peerlog/peerlog_test.go @@ -34,7 +34,7 @@ func TestExtractEnabled(t *testing.T) { expected: false, }, { - name: "returns the vlaue of the Enabled field", + name: "returns the value of the Enabled field", config: map[string]interface{}{"Enabled": true}, expected: true, }, diff --git a/repo/fsrepo/fsrepo.go b/repo/fsrepo/fsrepo.go index dcb09e979..a5152a831 100644 --- a/repo/fsrepo/fsrepo.go +++ b/repo/fsrepo/fsrepo.go @@ -1,6 +1,7 @@ package fsrepo import ( + "context" "errors" "fmt" "io" @@ -660,8 +661,8 @@ func (r *FSRepo) Datastore() repo.Datastore { } // GetStorageUsage computes the storage space taken by the repo in bytes -func (r *FSRepo) GetStorageUsage() (uint64, error) { - return ds.DiskUsage(r.Datastore()) +func (r *FSRepo) GetStorageUsage(ctx context.Context) (uint64, error) { + return ds.DiskUsage(ctx, r.Datastore()) } func (r *FSRepo) SwarmKey() ([]byte, error) { diff --git a/repo/fsrepo/fsrepo_test.go b/repo/fsrepo/fsrepo_test.go index 63bd11fd1..cd2d66618 100644 --- a/repo/fsrepo/fsrepo_test.go +++ b/repo/fsrepo/fsrepo_test.go @@ -2,6 +2,7 @@ package fsrepo import ( "bytes" + "context" "io/ioutil" "os" "path/filepath" @@ -74,10 +75,10 @@ func TestDatastoreGetNotAllowedAfterClose(t *testing.T) { k := "key" data := []byte(k) - assert.Nil(r.Datastore().Put(datastore.NewKey(k), data), t, "Put should be successful") + assert.Nil(r.Datastore().Put(context.Background(), datastore.NewKey(k), data), t, "Put should be successful") assert.Nil(r.Close(), t) - _, err = r.Datastore().Get(datastore.NewKey(k)) + _, err = r.Datastore().Get(context.Background(), datastore.NewKey(k)) assert.Err(err, t, "after closer, Get should be fail") } @@ -91,12 +92,12 @@ func TestDatastorePersistsFromRepoToRepo(t *testing.T) { k := "key" expected := []byte(k) - assert.Nil(r1.Datastore().Put(datastore.NewKey(k), expected), t, "using first repo, Put should be successful") + assert.Nil(r1.Datastore().Put(context.Background(), datastore.NewKey(k), expected), t, "using first repo, Put should be successful") assert.Nil(r1.Close(), t) r2, err := Open(path) assert.Nil(err, t) - actual, err := r2.Datastore().Get(datastore.NewKey(k)) + actual, err := r2.Datastore().Get(context.Background(), datastore.NewKey(k)) assert.Nil(err, t, "using second repo, Get should be successful") assert.Nil(r2.Close(), t) assert.True(bytes.Equal(expected, actual), t, "data should match") diff --git a/repo/fsrepo/migrations/fetcher.go b/repo/fsrepo/migrations/fetcher.go index 812a8a929..c354d68a2 100644 --- a/repo/fsrepo/migrations/fetcher.go +++ b/repo/fsrepo/migrations/fetcher.go @@ -9,7 +9,7 @@ import ( ) const ( - // Current dirstibution to fetch migrations from + // Current distribution to fetch migrations from CurrentIpfsDist = "/ipfs/QmP7tLxzhLU1KauTRX3jkVkF93pCv4skcceyUYMhf4AKJR" // fs-repo-migrations v2.0.2 // Latest distribution path. Default for fetchers. LatestIpfsDist = "/ipns/dist.ipfs.io" diff --git a/repo/mock.go b/repo/mock.go index 298a49a29..057649871 100644 --- a/repo/mock.go +++ b/repo/mock.go @@ -1,6 +1,7 @@ package repo import ( + "context" "errors" filestore "github.com/ipfs/go-filestore" @@ -43,7 +44,7 @@ func (m *Mock) GetConfigKey(key string) (interface{}, error) { func (m *Mock) Datastore() Datastore { return m.D } -func (m *Mock) GetStorageUsage() (uint64, error) { return 0, nil } +func (m *Mock) GetStorageUsage(_ context.Context) (uint64, error) { return 0, nil } func (m *Mock) Close() error { return m.D.Close() } diff --git a/repo/repo.go b/repo/repo.go index 614bfa5be..744bfdf5d 100644 --- a/repo/repo.go +++ b/repo/repo.go @@ -1,6 +1,7 @@ package repo import ( + "context" "errors" "io" @@ -39,7 +40,7 @@ type Repo interface { Datastore() Datastore // GetStorageUsage returns the number of bytes stored. - GetStorageUsage() (uint64, error) + GetStorageUsage(context.Context) (uint64, error) // Keystore returns a reference to the key management interface. Keystore() keystore.Keystore diff --git a/test/integration/bitswap_wo_routing_test.go b/test/integration/bitswap_wo_routing_test.go index d854f3a6b..ec0c2f11a 100644 --- a/test/integration/bitswap_wo_routing_test.go +++ b/test/integration/bitswap_wo_routing_test.go @@ -5,10 +5,10 @@ import ( "context" "testing" - "github.com/ipfs/go-block-format" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/ipfs/go-ipfs/core" - "github.com/ipfs/go-ipfs/core/mock" + coremock "github.com/ipfs/go-ipfs/core/mock" "github.com/ipfs/go-ipfs/core/node/libp2p" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" ) @@ -61,7 +61,7 @@ func TestBitswapWithoutRouting(t *testing.T) { block1 := blocks.NewBlock([]byte("block1")) // put 1 before - if err := nodes[0].Blockstore.Put(block0); err != nil { + if err := nodes[0].Blockstore.Put(ctx, block0); err != nil { t.Fatal(err) } @@ -84,7 +84,7 @@ func TestBitswapWithoutRouting(t *testing.T) { } // put 1 after - if err := nodes[1].Blockstore.Put(block1); err != nil { + if err := nodes[1].Blockstore.Put(ctx, block1); err != nil { t.Fatal(err) } diff --git a/test/sharness/lib/test-lib.sh b/test/sharness/lib/test-lib.sh index a20668f50..a68c5d973 100644 --- a/test/sharness/lib/test-lib.sh +++ b/test/sharness/lib/test-lib.sh @@ -287,7 +287,7 @@ test_launch_ipfs_daemon_without_network() { do_umount() { if [ "$(uname -s)" = "Linux" ]; then - fusermount -u "$1" + fusermount -z -u "$1" else umount "$1" fi diff --git a/test/sharness/t0032-mount-sharded.sh b/test/sharness/t0032-mount-sharded.sh new file mode 100755 index 000000000..10ba421a2 --- /dev/null +++ b/test/sharness/t0032-mount-sharded.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2021 Protocol Labs +# MIT Licensed; see the LICENSE file in this repository. +# + +test_description="Test mount command with sharding enabled" + +. lib/test-lib.sh + +if ! test_have_prereq FUSE; then + skip_all='skipping mount sharded tests, fuse not available' + test_done +fi + +test_init_ipfs + +test_expect_success 'force sharding' ' + ipfs config --json Internal.UnixFSShardingSizeThreshold "\"1B\"" +' + +test_launch_ipfs_daemon +test_mount_ipfs + +# we're testing nested subdirs which ensures that IPLD ADLs work +test_expect_success 'setup test data' ' + mkdir testdata && + echo a > testdata/a && + mkdir testdata/subdir && + echo b > testdata/subdir/b +' + +HASH=QmY59Ufw8zA2BxGPMTcfXg86JVed81Qbxeq5rDkHWSLN1m + +test_expect_success 'can add the data' ' + echo $HASH > expected_hash && + ipfs add -r -Q testdata > actual_hash && + test_cmp expected_hash actual_hash +' + +test_expect_success 'can read the data' ' + echo a > expected_a && + cat "ipfs/$HASH/a" > actual_a && + test_cmp expected_a actual_a && + echo b > expected_b && + cat "ipfs/$HASH/subdir/b" > actual_b && + test_cmp expected_b actual_b +' + +test_expect_success 'can list directories' ' + printf "a\nsubdir\n" > expected_ls && + ls -1 "ipfs/$HASH" > actual_ls && + test_cmp expected_ls actual_ls && + printf "b\n" > expected_ls_subdir && + ls -1 "ipfs/$HASH/subdir" > actual_ls_subdir && + test_cmp expected_ls_subdir actual_ls_subdir +' + +test_expect_success "unmount" ' + do_umount "$(pwd)/ipfs" && + do_umount "$(pwd)/ipns" +' + +test_expect_success 'cleanup' 'rmdir ipfs ipns' + +test_kill_ipfs_daemon + +test_done diff --git a/test/sharness/t0040-add-and-cat.sh b/test/sharness/t0040-add-and-cat.sh index 8e8386db4..635b97453 100755 --- a/test/sharness/t0040-add-and-cat.sh +++ b/test/sharness/t0040-add-and-cat.sh @@ -259,12 +259,12 @@ test_add_cat_file() { mkdir test_current_dir/hello && echo "World" > test_current_dir/hello/world && ( cd test_current_dir && - ipfs add -r . | tail -n1 > ../actual && cd ../ ) && + ipfs add -r -Q . > ../actual && cd ../ ) && rm -r test_current_dir ' test_expect_success "ipfs add -r . output looks good" ' - echo "added QmZQWnfcqJ6hNkkPvrY9Q5X39GP3jUnUbAV4AbmbbR3Cb1 test_current_dir" > expected + echo "QmZQWnfcqJ6hNkkPvrY9Q5X39GP3jUnUbAV4AbmbbR3Cb1" > expected test_cmp expected actual ' @@ -274,12 +274,12 @@ test_add_cat_file() { mkdir test_current_dir/hello && echo "World" > test_current_dir/hello/world && ( cd test_current_dir && - ipfs add -r ./ | tail -n1 > ../actual && cd ../ ) && + ipfs add -r -Q ./ > ../actual && cd ../ ) && rm -r test_current_dir ' test_expect_success "ipfs add -r ./ output looks good" ' - echo "added QmZQWnfcqJ6hNkkPvrY9Q5X39GP3jUnUbAV4AbmbbR3Cb1 test_current_dir" > expected + echo "QmZQWnfcqJ6hNkkPvrY9Q5X39GP3jUnUbAV4AbmbbR3Cb1" > expected test_cmp expected actual ' diff --git a/test/sharness/t0043-add-w.sh b/test/sharness/t0043-add-w.sh index 4a809e1b2..1f13cae3a 100755 --- a/test/sharness/t0043-add-w.sh +++ b/test/sharness/t0043-add-w.sh @@ -64,7 +64,7 @@ test_add_w() { test_expect_success "random-files generates test files" ' random-files --seed 7547632 --files 5 --dirs 2 --depth 3 m && echo "$add_w_m" >expected && - ipfs add -q -r m | tail -n1 >actual && + ipfs add -Q -r m >actual && test_sort_cmp expected actual ' @@ -120,7 +120,7 @@ test_add_w() { # test -w -r m/* == -r m test_expect_success "ipfs add -w -r m/* == add -r m succeeds" ' - ipfs add -q -w -r m/* | tail -n1 >actual + ipfs add -Q -w -r m/* >actual ' test_expect_success "ipfs add -w -r m/* == add -r m is correct" ' @@ -130,10 +130,10 @@ test_add_w() { # test repeats together test_expect_success "ipfs add -w (repeats) succeeds" ' - ipfs add -q -w -r m/t_1wp-8a2/h3qpecj0 m/ha6f0x7su6/gnz66h \ + ipfs add -Q -w -r m/t_1wp-8a2/h3qpecj0 m/ha6f0x7su6/gnz66h \ m/t_1wp-8a2/_jo7 m/4r93 m/t_1wp-8a2 m/t_1wp-8a2 m/4r93 \ m/4r93 m/ha6f0x7su6/_rwujlf3qh_g08 \ - m/ha6f0x7su6/gnz66h/9cwudvacx | tail -n1 >actual + m/ha6f0x7su6/gnz66h/9cwudvacx >actual ' test_expect_success "ipfs add -w (repeats) is correct" ' diff --git a/test/sharness/t0044-add-symlink.sh b/test/sharness/t0044-add-symlink.sh index cd313aaca..0e5c6efec 100755 --- a/test/sharness/t0044-add-symlink.sh +++ b/test/sharness/t0044-add-symlink.sh @@ -18,8 +18,7 @@ test_expect_success "creating files succeeds" ' test_add_symlinks() { test_expect_success "ipfs add files succeeds" ' - ipfs add -q -r files >filehash_all && - tail -n 1 filehash_all >filehash_out + ipfs add -Q -r files >filehash_out ' test_expect_success "output looks good" ' @@ -28,8 +27,7 @@ test_add_symlinks() { ' test_expect_success "ipfs add --cid-version=1 files succeeds" ' - ipfs add -q -r --cid-version=1 files >filehash_all && - tail -n 1 filehash_all >filehash_out + ipfs add -Q -r --cid-version=1 files >filehash_out ' test_expect_success "output looks good" ' diff --git a/test/sharness/t0051-object.sh b/test/sharness/t0051-object.sh index 95de4fda7..875548411 100755 --- a/test/sharness/t0051-object.sh +++ b/test/sharness/t0051-object.sh @@ -223,6 +223,24 @@ test_object_cmd() { ipfs object stat $OUTPUT ' + test_expect_success "'ipfs object patch' check output block size" ' + DIR=$(ipfs object new unixfs-dir) + for i in {1..13} + do + DIR=$(ipfs object patch "$DIR" add-link "$DIR.jpg" "$DIR") + done + # Fail when new block goes over the BS limit of 1MB, but allow manual override + test_expect_code 1 ipfs object patch "$DIR" add-link "$DIR.jpg" "$DIR" >patch_out 2>&1 + ' + + test_expect_success "ipfs object patch add-link output has the correct error" ' + grep "produced block is over 1MB, object API is deprecated and does not support HAMT-sharding: to create big directories, please use the files API (MFS)" patch_out + ' + + test_expect_success "ipfs object patch --allow-big-block=true add-link works" ' + test_expect_code 0 ipfs object patch --allow-big-block=true "$DIR" add-link "$DIR.jpg" "$DIR" + ' + test_expect_success "'ipfs object new foo' shouldn't crash" ' test_expect_code 1 ipfs object new foo ' diff --git a/test/sharness/t0052-object-diff.sh b/test/sharness/t0052-object-diff.sh index 123937c6c..41c890cea 100755 --- a/test/sharness/t0052-object-diff.sh +++ b/test/sharness/t0052-object-diff.sh @@ -14,23 +14,23 @@ test_expect_success "create some objects for testing diffs" ' mkdir foo && echo "stuff" > foo/bar && mkdir foo/baz && - A=$(ipfs add -r -q foo | tail -n1) && - AR=$(ipfs add --raw-leaves -r -q foo | tail -n1) && + A=$(ipfs add -r -Q foo) && + AR=$(ipfs add --raw-leaves -r -Q foo) && echo "more things" > foo/cat && - B=$(ipfs add -r -q foo | tail -n1) && - BR=$(ipfs add --raw-leaves -r -q foo | tail -n1) && + B=$(ipfs add -r -Q foo) && + BR=$(ipfs add --raw-leaves -r -Q foo) && echo "nested" > foo/baz/dog && - C=$(ipfs add -r -q foo | tail -n1) - CR=$(ipfs add --raw-leaves -r -q foo | tail -n1) + C=$(ipfs add -r -Q foo) + CR=$(ipfs add --raw-leaves -r -Q foo) echo "changed" > foo/bar && - D=$(ipfs add -r -q foo | tail -n1) && - DR=$(ipfs add --raw-leaves -r -q foo | tail -n1) && + D=$(ipfs add -r -Q foo) && + DR=$(ipfs add --raw-leaves -r -Q foo) && echo "" > single_file && - SINGLE_FILE=$(ipfs add -r -q single_file | tail -n1) && - SINGLE_FILE_RAW=$(ipfs add --raw-leaves -r -q single_file | tail -n1) && + SINGLE_FILE=$(ipfs add -r -Q single_file) && + SINGLE_FILE_RAW=$(ipfs add --raw-leaves -r -Q single_file) && mkdir empty_dir - EMPTY_DIR=$(ipfs add -r -q empty_dir | tail -n1) - EMPTY_DIR_RAW=$(ipfs add --raw-leaves -r -q empty_dir | tail -n1) + EMPTY_DIR=$(ipfs add -r -Q empty_dir) + EMPTY_DIR_RAW=$(ipfs add --raw-leaves -r -Q empty_dir) ' test_expect_success "diff against self is empty" ' diff --git a/test/sharness/t0053-dag.sh b/test/sharness/t0053-dag.sh index 23666ae67..c46dcc8c1 100755 --- a/test/sharness/t0053-dag.sh +++ b/test/sharness/t0053-dag.sh @@ -314,7 +314,7 @@ test_dag_cmd() { test_expect_success "prepare dag-pb object" ' echo foo > test_file && - HASH=$(ipfs add -wq test_file | tail -n1 | ipfs cid base32) + HASH=$(ipfs add -wQ test_file | ipfs cid base32) ' test_expect_success "dag put with json dag-pb works" ' diff --git a/test/sharness/t0080-repo.sh b/test/sharness/t0080-repo.sh index ffb846603..7aa491efa 100755 --- a/test/sharness/t0080-repo.sh +++ b/test/sharness/t0080-repo.sh @@ -175,11 +175,10 @@ test_expect_success "'ipfs refs --unique' is correct" ' mkdir -p uniques && echo "content1" > uniques/file1 && echo "content1" > uniques/file2 && - ipfs add -r -q uniques > add_output && - ROOT=$(tail -n1 add_output) && + ROOT=$(ipfs add -r -Q uniques) && ipfs refs --unique $ROOT >expected && ipfs add -q uniques/file1 >unique_hash && - test_cmp expected unique_hash || test_fsh cat add_output + test_cmp expected unique_hash ' test_expect_success "'ipfs refs --unique --recursive' is correct" ' @@ -188,12 +187,11 @@ test_expect_success "'ipfs refs --unique --recursive' is correct" ' echo "c1" > a/b/f1 && echo "c1" > a/b/c/f1 && echo "c2" > a/b/c/f2 && - ipfs add -r -q a >add_output && - ROOT=$(tail -n1 add_output) && + ROOT=$(ipfs add -r -Q a) && ipfs refs --unique --recursive $ROOT >refs_output && wc -l refs_output | sed "s/^ *//g" >line_count && echo "4 refs_output" >expected && - test_cmp expected line_count || test_fsh cat add_output || test_fsh cat refs_output + test_cmp expected line_count || test_fsh cat refs_output ' test_expect_success "'ipfs refs --recursive (bigger)'" ' @@ -207,12 +205,11 @@ test_expect_success "'ipfs refs --recursive (bigger)'" ' cp -r b b2 && mv b2 b/b2 && cp -r b b3 && mv b3 b/b3 && cp -r b b4 && mv b4 b/b4 && - ipfs add -r -q b >add_output && - hash=$(tail -n1 add_output) && + hash=$(ipfs add -r -Q b) && ipfs refs -r "$hash" >refs_output && wc -l refs_output | sed "s/^ *//g" >actual && echo "79 refs_output" >expected && - test_cmp expected actual || test_fsh cat add_output || test_fsh cat refs_output + test_cmp expected actual || test_fsh cat refs_output ' test_expect_success "'ipfs refs --unique --recursive (bigger)'" ' diff --git a/test/sharness/t0081-repo-pinning.sh b/test/sharness/t0081-repo-pinning.sh index 06a4e6a45..250d3a827 100755 --- a/test/sharness/t0081-repo-pinning.sh +++ b/test/sharness/t0081-repo-pinning.sh @@ -94,11 +94,10 @@ test_expect_success "'ipfs add dir' succeeds" ' echo "some text 6" >dir1/dir2/dir4/file6 && echo "some text 2" >dir1/dir3/file2 && echo "some text 5" >dir1/dir3/file5 && - ipfs add -q -r dir1 >actualall && - tail -n1 actualall >actual1 && - echo "$HASH_DIR1" >expected1 && + ipfs add -Q -r dir1 >actual && + echo "$HASH_DIR1" >expected && ipfs repo gc && # remove the patch chaff - test_cmp expected1 actual1 + test_cmp expected actual ' test_expect_success "objects are there" ' @@ -265,9 +264,9 @@ test_expect_success "test add nopin dir" ' mkdir nopin_dir1 && echo "some nopin text 1" >nopin_dir1/file1 && echo "some nopin text 2" >nopin_dir1/file2 && - ipfs add -q -r --pin=false nopin_dir1 | tail -n1 >actual1 && - echo "$HASH_NOPINDIR" >expected1 && - test_cmp actual1 expected1 && + ipfs add -Q -r --pin=false nopin_dir1 >actual && + echo "$HASH_NOPINDIR" >expected && + test_cmp actual expected && test_pin_flag "$HASH_NOPINDIR" direct false && test_pin_flag "$HASH_NOPINDIR" indirect false && test_pin_flag "$HASH_NOPINDIR" recursive false && diff --git a/test/sharness/t0090-get.sh b/test/sharness/t0090-get.sh index dd173dc7f..5e16c7d01 100755 --- a/test/sharness/t0090-get.sh +++ b/test/sharness/t0090-get.sh @@ -89,7 +89,7 @@ test_get_cmd() { touch dir/a && mkdir -p dir/b && echo "Hello, Worlds!" >dir/b/c && - HASH2=`ipfs add -r -q dir | tail -n 1` && + HASH2=`ipfs add -r -Q dir` && ipfs get "$HASH2" >actual ' diff --git a/test/sharness/t0101-iptb-name.sh b/test/sharness/t0101-iptb-name.sh index 303704a36..e5cdadcb0 100755 --- a/test/sharness/t0101-iptb-name.sh +++ b/test/sharness/t0101-iptb-name.sh @@ -16,7 +16,7 @@ test_expect_success "set up an iptb cluster" ' startup_cluster $num_nodes -test_expect_success "add an obect on one node" ' +test_expect_success "add an object on one node" ' echo "ipns is super fun" > file && HASH_FILE=$(ipfsi 1 add -q file) ' diff --git a/test/sharness/t0110-gateway.sh b/test/sharness/t0110-gateway.sh index 8bd7937ee..276c90b22 100755 --- a/test/sharness/t0110-gateway.sh +++ b/test/sharness/t0110-gateway.sh @@ -167,7 +167,7 @@ test_expect_success "test failure conditions of mutex pprof endpoint" ' test_expect_success "setup index hash" ' mkdir index && echo "

" > index/index.html && - INDEXHASH=$(ipfs add -q -r index | tail -n1) + INDEXHASH=$(ipfs add -Q -r index) echo index: $INDEXHASH ' diff --git a/test/sharness/t0115-gateway-dir-listing.sh b/test/sharness/t0115-gateway-dir-listing.sh index 561604fef..0fc86ed79 100755 --- a/test/sharness/t0115-gateway-dir-listing.sh +++ b/test/sharness/t0115-gateway-dir-listing.sh @@ -60,7 +60,7 @@ test_expect_success "path gw: name column should be a link to its content path" ' test_expect_success "path gw: hash column should be a CID link with filename param" ' - test_should_contain "
" list_response + test_should_contain "" list_response ' ## ============================================================================ @@ -91,7 +91,7 @@ test_expect_success "path gw: name column should be a link to content root mount ' test_expect_success "path gw: hash column should be a CID link to path router with filename param" ' - test_should_contain "" list_response + test_should_contain "" list_response ' ## ============================================================================ @@ -132,7 +132,7 @@ test_expect_success "dnslink gw: name column should be a link to content root mo # DNSLink websites don't have public gateway mounted by default # See: https://github.com/ipfs/dir-index-html/issues/42 test_expect_success "dnslink gw: hash column should be a CID link to cid.ipfs.io" ' - test_should_contain "" list_response + test_should_contain "" list_response ' ## ============================================================================ diff --git a/test/sharness/t0125-twonode.sh b/test/sharness/t0125-twonode.sh index 28c919c22..6f819400a 100755 --- a/test/sharness/t0125-twonode.sh +++ b/test/sharness/t0125-twonode.sh @@ -46,7 +46,7 @@ run_random_dir_test() { ' test_expect_success "add those on node 0" ' - DIR_HASH=$(ipfsi 0 add -r -q foobar | tail -n1) + DIR_HASH=$(ipfsi 0 add -r -Q foobar) ' check_dir_fetch 1 $DIR_HASH diff --git a/test/sharness/t0130-multinode.sh b/test/sharness/t0130-multinode.sh index c018908d1..04746850b 100755 --- a/test/sharness/t0130-multinode.sh +++ b/test/sharness/t0130-multinode.sh @@ -50,7 +50,7 @@ run_random_dir_test() { ' test_expect_success "add those on node 2" ' - DIR_HASH=$(ipfsi 2 add -r -q foobar | tail -n1) + DIR_HASH=$(ipfsi 2 add -r -Q foobar) ' check_dir_fetch 0 $DIR_HASH diff --git a/test/sharness/t0140-swarm.sh b/test/sharness/t0140-swarm.sh index 20994c13e..d65831d3e 100755 --- a/test/sharness/t0140-swarm.sh +++ b/test/sharness/t0140-swarm.sh @@ -65,6 +65,33 @@ test_expect_success 'Addresses.Announce affects addresses' ' test_kill_ipfs_daemon + +announceCfg='["/ip4/127.0.0.1/tcp/4001", "/ip4/1.2.3.4/tcp/1234"]' +test_expect_success "test_config_set succeeds" " + ipfs config --json Addresses.Announce '$announceCfg' +" +# Include "/ip4/1.2.3.4/tcp/1234" to ensure we deduplicate addrs already present in Swarm.Announce +appendAnnounceCfg='["/dnsaddr/dynamic.example.com", "/ip4/10.20.30.40/tcp/4321", "/ip4/1.2.3.4/tcp/1234"]' +test_expect_success "test_config_set Announce and AppendAnnounce succeeds" " + ipfs config --json Addresses.Announce '$announceCfg' && + ipfs config --json Addresses.AppendAnnounce '$appendAnnounceCfg' +" + +test_launch_ipfs_daemon + +test_expect_success 'Addresses.AppendAnnounce is applied on top of Announce' ' + ipfs swarm addrs local >actual && + grep "/ip4/1.2.3.4/tcp/1234" actual && + grep "/dnsaddr/dynamic.example.com" actual && + grep "/ip4/10.20.30.40/tcp/4321" actual && + ipfs id -f"" | xargs -n1 echo | tee actual && + grep "/ip4/1.2.3.4/tcp/1234/p2p" actual && + grep "/dnsaddr/dynamic.example.com/p2p/" actual && + grep "/ip4/10.20.30.40/tcp/4321/p2p/" actual +' + +test_kill_ipfs_daemon + noAnnounceCfg='["/ip4/1.2.3.4/tcp/1234"]' test_expect_success "test_config_set succeeds" " ipfs config --json Addresses.NoAnnounce '$noAnnounceCfg' @@ -72,11 +99,13 @@ test_expect_success "test_config_set succeeds" " test_launch_ipfs_daemon -test_expect_success "Addresses.NoAnnounce affects addresses" ' +test_expect_success "Addresses.NoAnnounce affects addresses from Announce and AppendAnnounce" ' ipfs swarm addrs local >actual && grep -v "/ip4/1.2.3.4/tcp/1234" actual && + grep -v "/ip4/10.20.30.40/tcp/4321" actual && ipfs id -f"" | xargs -n1 echo >actual && - grep -v "/ip4/1.2.3.4/tcp/1234" actual + grep -v "/ip4/1.2.3.4/tcp/1234" actual && + grep -v "//ip4/10.20.30.40/tcp/4321" actual ' test_kill_ipfs_daemon diff --git a/test/sharness/t0160-resolve.sh b/test/sharness/t0160-resolve.sh index de3b2f287..600e4c07b 100755 --- a/test/sharness/t0160-resolve.sh +++ b/test/sharness/t0160-resolve.sh @@ -9,9 +9,9 @@ test_init_ipfs test_expect_success "resolve: prepare files" ' mkdir -p a/b && echo "a/b/c" >a/b/c && - a_hash=$(ipfs add -q -r a | tail -n1) && - b_hash=$(ipfs add -q -r a/b | tail -n1) && - c_hash=$(ipfs add -q -r a/b/c | tail -n1) && + a_hash=$(ipfs add -Q -r a) && + b_hash=$(ipfs add -Q -r a/b) && + c_hash=$(ipfs add -Q -r a/b/c) && a_hash_b32=$(cid-fmt -v 1 -b b %s $a_hash) && b_hash_b32=$(cid-fmt -v 1 -b b %s $b_hash) && c_hash_b32=$(cid-fmt -v 1 -b b %s $c_hash) diff --git a/test/sharness/t0175-reprovider.sh b/test/sharness/t0175-reprovider.sh index c94015585..746aa6b0a 100755 --- a/test/sharness/t0175-reprovider.sh +++ b/test/sharness/t0175-reprovider.sh @@ -86,7 +86,7 @@ test_expect_success 'add test objects' ' HASH_FOO=$(ipfsi 0 add -q --offline --pin=false f1) && HASH_BAR=$(ipfsi 0 add -q --offline --pin=false f2) && HASH_BAZ=$(ipfsi 0 add -q --offline f3) && - HASH_BAR_DIR=$(ipfsi 0 add -q --offline -w f2 | tail -1) + HASH_BAR_DIR=$(ipfsi 0 add -Q --offline -w f2) ' findprovs_empty '$HASH_FOO' diff --git a/test/sharness/t0181-private-network.sh b/test/sharness/t0181-private-network.sh index dfb4be203..86c6151d3 100755 --- a/test/sharness/t0181-private-network.sh +++ b/test/sharness/t0181-private-network.sh @@ -18,7 +18,7 @@ test_expect_success "daemon won't start with force pnet env but with no key" ' unset LIBP2P_FORCE_PNET -test_expect_success "daemon output incudes info about the reason" ' +test_expect_success "daemon output includes info about the reason" ' grep "private network was not configured but is enforced by the environment" stdout || test_fsh cat stdout ' diff --git a/test/sharness/t0182-circuit-relay.sh b/test/sharness/t0182-circuit-relay.sh index 3dd12ed68..2b855844d 100755 --- a/test/sharness/t0182-circuit-relay.sh +++ b/test/sharness/t0182-circuit-relay.sh @@ -15,8 +15,24 @@ test_expect_success 'start up nodes for configuration' ' iptb start -wait -- --routing=none ' -test_expect_success 'configure EnableRelayHop in relay node' ' - ipfsi 1 config --json Swarm.EnableRelayHop true +test_expect_success 'peer ids' ' + PEERID_0=$(iptb attr get 0 id) && + PEERID_1=$(iptb attr get 1 id) && + PEERID_2=$(iptb attr get 2 id) +' + +relayaddrs=$(ipfsi 1 swarm addrs local | jq --raw-input . | jq --slurp .) +staticrelay=$(ipfsi 1 swarm addrs local | sed -e "s|$|/p2p/$PEERID_1|g" | jq --raw-input . | jq --slurp .) + +test_expect_success 'configure the relay node as a static relay for node A' ' + ipfsi 0 config Internal.Libp2pForceReachability private && + ipfsi 0 config --json Swarm.RelayClient.Enabled true && + ipfsi 0 config --json Swarm.RelayClient.StaticRelays "$staticrelay" +' + +test_expect_success 'configure the relay node' ' + ipfsi 1 config --json Addresses.Swarm "$relayaddrs" && + ipfsi 1 config Internal.Libp2pForceReachability public ' test_expect_success 'restart nodes' ' @@ -37,18 +53,12 @@ test_expect_success 'wait until relay is ready to do work' ' sleep 1 ' -test_expect_success 'peer ids' ' - PEERID_0=$(iptb attr get 0 id) && - PEERID_1=$(iptb attr get 1 id) && - PEERID_2=$(iptb attr get 2 id) -' - test_expect_success 'connect A <-Relay-> B' ' - ipfsi 0 swarm connect /p2p/$PEERID_1/p2p-circuit/p2p/$PEERID_2 > peers_out + ipfsi 2 swarm connect /p2p/$PEERID_1/p2p-circuit/p2p/$PEERID_0 > peers_out ' test_expect_success 'output looks good' ' - echo "connect $PEERID_2 success" > peers_exp && + echo "connect $PEERID_0 success" > peers_exp && test_cmp peers_exp peers_out ' @@ -62,23 +72,6 @@ test_expect_success 'peers for B look good' ' test_should_contain "/p2p/$PEERID_1/p2p-circuit/p2p/$PEERID_0$" peers_out ' -test_expect_success 'add an object in A' ' - echo "hello relay" | ipfsi 0 add > peers_out -' - -test_expect_success 'object ID' ' - OBJID=$(cut -f3 -d " " peers_out) -' - -test_expect_success 'cat the object in B' ' - ipfsi 2 cat $OBJID > peers_out -' - -test_expect_success 'output looks good' ' - echo "hello relay" > peers_exp && - test_cmp peers_exp peers_out -' - test_expect_success 'stop iptb' ' iptb stop ' diff --git a/test/sharness/t0183-namesys-pubsub.sh b/test/sharness/t0183-namesys-pubsub.sh index 8161330c8..f9658e507 100755 --- a/test/sharness/t0183-namesys-pubsub.sh +++ b/test/sharness/t0183-namesys-pubsub.sh @@ -10,79 +10,116 @@ test_expect_success 'init iptb' ' iptb testbed create -type localipfs -count $NUM_NODES -init ' +run_ipnspubsub_tests() { + + test_expect_success 'peer ids' ' + PEERID_0_BASE36=$(ipfsi 0 key list --ipns-base=base36 -l | grep self | head -n 1 | cut -d " " -f1) && + PEERID_0_B58MH=$(ipfsi 0 key list --ipns-base=b58mh -l | grep self | head -n 1 | cut -d " " -f1) + ' + + test_expect_success 'check namesys pubsub state' ' + echo enabled > expected && + ipfsi 0 name pubsub state > state0 && + ipfsi 1 name pubsub state > state1 && + ipfsi 2 name pubsub state > state2 && + test_cmp expected state0 && + test_cmp expected state1 && + test_cmp expected state2 + ' + + # These commands are *expected* to fail. We haven't published anything yet. + test_expect_success 'subscribe nodes to the publisher topic' ' + ipfsi 1 name resolve /ipns/$PEERID_0_BASE36 --timeout=1s; + ipfsi 2 name resolve /ipns/$PEERID_0_BASE36 --timeout=1s; + true + ' + + test_expect_success 'check subscriptions' ' + echo /ipns/$PEERID_0_BASE36 > expected_base36 && + echo /ipns/$PEERID_0_B58MH > expected_b58mh && + ipfsi 1 name pubsub subs > subs1 && + ipfsi 2 name pubsub subs > subs2 && + ipfsi 1 name pubsub subs --ipns-base=b58mh > subs1_b58mh && + ipfsi 2 name pubsub subs --ipns-base=b58mh > subs2_b58mh && + test_cmp expected_base36 subs1 && + test_cmp expected_base36 subs2 && + test_cmp expected_b58mh subs1_b58mh && + test_cmp expected_b58mh subs2_b58mh + ' + + test_expect_success 'add an object on publisher node' ' + echo "ipns is super fun" > file && + HASH_FILE=$(ipfsi 0 add -q file) + ' + + test_expect_success 'publish that object as an ipns entry' ' + ipfsi 0 name publish $HASH_FILE + ' + + test_expect_success 'wait for the flood' ' + sleep 1 + ' + + test_expect_success 'resolve name in subscriber nodes' ' + echo "/ipfs/$HASH_FILE" > expected && + ipfsi 1 name resolve /ipns/$PEERID_0_BASE36 > name1 && + ipfsi 2 name resolve /ipns/$PEERID_0_BASE36 > name2 && + test_cmp expected name1 && + test_cmp expected name2 + ' + + test_expect_success 'cancel subscriptions to the publisher topic' ' + ipfsi 1 name pubsub cancel /ipns/$PEERID_0_BASE36 && + ipfsi 2 name pubsub cancel /ipns/$PEERID_0_BASE36 + ' + + test_expect_success 'check subscriptions' ' + rm -f expected && touch expected && + ipfsi 1 name pubsub subs > subs1 && + ipfsi 2 name pubsub subs > subs2 && + test_cmp expected subs1 && + test_cmp expected subs2 + ' + + test_expect_success "shut down iptb" ' + iptb stop + ' + +} + +# Test everything with ipns-pubsub enabled via config +test_expect_success 'enable ipns over pubsub' ' + iptb run -- ipfs config --json Ipns.UsePubsub true +' + +startup_cluster $NUM_NODES +run_ipnspubsub_tests + +# Test again, this time CLI parameter override the config +test_expect_success 'enable ipns over pubsub' ' + iptb run -- ipfs config --json Ipns.UsePubsub false +' startup_cluster $NUM_NODES --enable-namesys-pubsub +run_ipnspubsub_tests -test_expect_success 'peer ids' ' - PEERID_0_BASE36=$(ipfsi 0 key list --ipns-base=base36 -l | grep self | head -n 1 | cut -d " " -f1) && - PEERID_0_B58MH=$(ipfsi 0 key list --ipns-base=b58mh -l | grep self | head -n 1 | cut -d " " -f1) +# Confirm negative CLI flag takes precedence over positive config + +test_expect_success 'enable the pubsub-ipns via config' ' + iptb run -- ipfs config --json Ipns.UsePubsub true +' +startup_cluster $NUM_NODES --enable-namesys-pubsub=false + +test_expect_success 'ipns pubsub cmd fails because it was disabled via cli flag' ' + test_expect_code 1 ipfsi 1 name pubsub subs 2> pubsubipns_cmd_out ' -test_expect_success 'check namesys pubsub state' ' - echo enabled > expected && - ipfsi 0 name pubsub state > state0 && - ipfsi 1 name pubsub state > state1 && - ipfsi 2 name pubsub state > state2 && - test_cmp expected state0 && - test_cmp expected state1 && - test_cmp expected state2 -' +test_expect_success "ipns pubsub cmd produces error" " + echo -e \"Error: IPNS pubsub subsystem is not enabled\nUse 'ipfs name pubsub subs --help' for information about this command\" > expected && + test_cmp expected pubsubipns_cmd_out +" -# These commands are *expected* to fail. We haven't published anything yet. -test_expect_success 'subscribe nodes to the publisher topic' ' - ipfsi 1 name resolve /ipns/$PEERID_0_BASE36 --timeout=1s; - ipfsi 2 name resolve /ipns/$PEERID_0_BASE36 --timeout=1s; - true -' - -test_expect_success 'check subscriptions' ' - echo /ipns/$PEERID_0_BASE36 > expected_base36 && - echo /ipns/$PEERID_0_B58MH > expected_b58mh && - ipfsi 1 name pubsub subs > subs1 && - ipfsi 2 name pubsub subs > subs2 && - ipfsi 1 name pubsub subs --ipns-base=b58mh > subs1_b58mh && - ipfsi 2 name pubsub subs --ipns-base=b58mh > subs2_b58mh && - test_cmp expected_base36 subs1 && - test_cmp expected_base36 subs2 && - test_cmp expected_b58mh subs1_b58mh && - test_cmp expected_b58mh subs2_b58mh -' - -test_expect_success 'add an object on publisher node' ' - echo "ipns is super fun" > file && - HASH_FILE=$(ipfsi 0 add -q file) -' - -test_expect_success 'publish that object as an ipns entry' ' - ipfsi 0 name publish $HASH_FILE -' - -test_expect_success 'wait for the flood' ' - sleep 1 -' - -test_expect_success 'resolve name in subscriber nodes' ' - echo "/ipfs/$HASH_FILE" > expected && - ipfsi 1 name resolve /ipns/$PEERID_0_BASE36 > name1 && - ipfsi 2 name resolve /ipns/$PEERID_0_BASE36 > name2 && - test_cmp expected name1 && - test_cmp expected name2 -' - -test_expect_success 'cancel subscriptions to the publisher topic' ' - ipfsi 1 name pubsub cancel /ipns/$PEERID_0_BASE36 && - ipfsi 2 name pubsub cancel /ipns/$PEERID_0_BASE36 -' - -test_expect_success 'check subscriptions' ' - rm -f expected && touch expected && - ipfsi 1 name pubsub subs > subs1 && - ipfsi 2 name pubsub subs > subs2 && - test_cmp expected subs1 && - test_cmp expected subs2 -' - -test_expect_success "shut down iptb" ' - iptb stop +test_expect_success 'stop iptb' ' + iptb stop ' test_done diff --git a/test/sharness/t0250-files-api.sh b/test/sharness/t0250-files-api.sh index 08b9c6c11..c91dd123b 100755 --- a/test/sharness/t0250-files-api.sh +++ b/test/sharness/t0250-files-api.sh @@ -18,7 +18,7 @@ create_files() { echo cats > stuff_test/a && echo dogs > stuff_test/b && echo giraffes > stuff_test/c && - DIR1=$(ipfs add -r "$@" -q stuff_test | tail -n1) + DIR1=$(ipfs add -r "$@" -Q stuff_test) } verify_path_exists() { @@ -500,7 +500,7 @@ test_files_api() { test_cmp dirhash afterdirhash ' - test_expect_success "cannot write to nonexistant path $EXTRA" ' + test_expect_success "cannot write to nonexistent path $EXTRA" ' test_expect_code 1 ipfs files write $ARGS $RAW_LEAVES /cats/bar/ < output ' @@ -690,9 +690,7 @@ test_files_api() { ' test_expect_success "clean up $EXTRA" ' - ipfs files rm -r /foobar && - ipfs files rm -r /adir && - ipfs files rm -r /parents + ipfs files rm -r /foobar /adir /parents ' test_expect_success "root mfs entry is empty $EXTRA" ' @@ -711,18 +709,53 @@ test_files_api() { verify_dir_contents / ' + test_expect_success "remove multiple files forcibly" ' + echo "hello world" | ipfs files write --create /forcibly_one && + echo "hello world" | ipfs files write --create /forcibly_two && + ipfs files rm --force /forcibly_one /forcibly_two && + verify_dir_contents / + ' + test_expect_success "remove directory forcibly" ' ipfs files mkdir /forcibly-dir && ipfs files rm --force /forcibly-dir && verify_dir_contents / ' - test_expect_success "remove nonexistant path forcibly" ' - ipfs files rm --force /nonexistant + test_expect_success "remove multiple directories forcibly" ' + ipfs files mkdir /forcibly-dir-one && + ipfs files mkdir /forcibly-dir-two && + ipfs files rm --force /forcibly-dir-one /forcibly-dir-two && + verify_dir_contents / ' - test_expect_success "remove deeply nonexistant path forcibly" ' - ipfs files rm --force /deeply/nonexistant + test_expect_success "remove multiple files" ' + echo "hello world" | ipfs files write --create /file_one && + echo "hello world" | ipfs files write --create /file_two && + ipfs files rm /file_one /file_two + ' + + test_expect_success "remove multiple directories" ' + ipfs files mkdir /forcibly-dir-one && + ipfs files mkdir /forcibly-dir-two && + ipfs files rm -r /forcibly-dir-one /forcibly-dir-two && + verify_dir_contents / + ' + + test_expect_success "remove nonexistent path forcibly" ' + ipfs files rm --force /nonexistent + ' + + test_expect_success "remove deeply nonexistent path forcibly" ' + ipfs files rm --force /deeply/nonexistent + ' + + # This one should return code 1 but still remove the rest of the valid files. + test_expect_success "remove multiple files (with nonexistent one)" ' + echo "hello world" | ipfs files write --create /file_one && + echo "hello world" | ipfs files write --create /file_two && + test_expect_code 1 ipfs files rm /file_one /nonexistent /file_two + verify_dir_contents / ' } @@ -812,7 +845,7 @@ tests_for_files_api "with-daemon" test_kill_ipfs_daemon test_expect_success "enable sharding in config" ' - ipfs config --json Experimental.ShardingEnabled true + ipfs config --json Internal.UnixFSShardingSizeThreshold "\"1B\"" ' test_launch_ipfs_daemon_without_network @@ -825,4 +858,70 @@ test_sharding "(cidv1 root)" "--cid-version=1" test_kill_ipfs_daemon +# Test automatic sharding and unsharding + +# We shard based on size with a threshold of 256 KiB (see config file docs) +# above which directories are sharded. +# +# The directory size is estimated as the size of each link. Links are roughly +# the entry name + the CID byte length (e.g. 34 bytes for a CIDv0). So for +# entries of length 10 we need 256 KiB / (34 + 10) ~ 6000 entries in the +# directory to trigger sharding. +test_expect_success "set up automatic sharding/unsharding data" ' + mkdir big_dir + for i in `seq 5960` # Just above the number of entries that trigger sharding for 256KiB + do + echo $i > big_dir/`printf "file%06d" $i` # fixed length of 10 chars + done +' + +# TODO: This does not need to report an error https://github.com/ipfs/go-ipfs/issues/8088 +test_expect_failure "reset automatic sharding" ' + ipfs config --json Internal.UnixFSShardingSizeThreshold null +' + +test_launch_ipfs_daemon_without_network + +LARGE_SHARDED="QmWfjnRWRvdvYezQWnfbvrvY7JjrpevsE9cato1x76UqGr" +LARGE_MINUS_5_UNSHARDED="QmbVxi5zDdzytrjdufUejM92JsWj8wGVmukk6tiPce3p1m" + +test_add_large_sharded_dir() { + exphash="$1" + test_expect_success "ipfs add on directory succeeds" ' + ipfs add -r -Q big_dir > shardbigdir_out && + echo "$exphash" > shardbigdir_exp && + test_cmp shardbigdir_exp shardbigdir_out + ' + + test_expect_success "can access a path under the dir" ' + ipfs cat "$exphash/file000030" > file30_out && + test_cmp big_dir/file000030 file30_out + ' +} + +test_add_large_sharded_dir "$LARGE_SHARDED" + +test_expect_success "remove a few entries from big_dir/ to trigger unsharding" ' + ipfs files cp /ipfs/"$LARGE_SHARDED" /big_dir && + for i in `seq 5` + do + ipfs files rm /big_dir/`printf "file%06d" $i` + done && + ipfs files stat --hash /big_dir > unshard_dir_hash && + echo "$LARGE_MINUS_5_UNSHARDED" > unshard_exp && + test_cmp unshard_exp unshard_dir_hash +' + +test_expect_success "add a few entries to big_dir/ to retrigger sharding" ' + for i in `seq 5` + do + ipfs files cp /ipfs/"$LARGE_SHARDED"/`printf "file%06d" $i` /big_dir/`printf "file%06d" $i` + done && + ipfs files stat --hash /big_dir > shard_dir_hash && + echo "$LARGE_SHARDED" > shard_exp && + test_cmp shard_exp shard_dir_hash +' + +test_kill_ipfs_daemon + test_done diff --git a/test/sharness/t0252-files-gc.sh b/test/sharness/t0252-files-gc.sh index 3666d7a48..7267985d4 100755 --- a/test/sharness/t0252-files-gc.sh +++ b/test/sharness/t0252-files-gc.sh @@ -47,7 +47,7 @@ test_expect_success "add directory with direct pin" ' mkdir mydir/ && echo "hello world!" > mydir/hello.txt && FILE_UNPINNED=$(ipfs add --pin=false -q -r mydir/hello.txt) && - DIR_PINNED=$(ipfs add --pin=false -q -r mydir | tail -n1) && + DIR_PINNED=$(ipfs add --pin=false -Q -r mydir) && ipfs add --pin=false -r mydir && ipfs pin add --recursive=false $DIR_PINNED && ipfs cat $FILE_UNPINNED diff --git a/test/sharness/t0260-sharding.sh b/test/sharness/t0260-sharding.sh index 20be436c7..85e4a7ca7 100755 --- a/test/sharness/t0260-sharding.sh +++ b/test/sharness/t0260-sharding.sh @@ -16,14 +16,14 @@ test_expect_success "set up test data" ' done ' -test_add_large_dir() { +test_add_dir() { exphash="$1" - test_expect_success "ipfs add on very large directory succeeds" ' - ipfs add -r -q testdata | tail -n1 > sharddir_out && + test_expect_success "ipfs add on directory succeeds" ' + ipfs add -r -Q testdata > sharddir_out && echo "$exphash" > sharddir_exp && test_cmp sharddir_exp sharddir_out ' - test_expect_success "ipfs get on very large directory succeeds" ' + test_expect_success "ipfs get on directory succeeds" ' ipfs get -o testdata-out "$exphash" && test_cmp testdata testdata-out ' @@ -32,24 +32,29 @@ test_add_large_dir() { test_init_ipfs UNSHARDED="QmavrTrQG4VhoJmantURAYuw3bowq3E2WcvP36NRQDAC1N" -test_add_large_dir "$UNSHARDED" + +test_expect_success "force sharding off" ' +ipfs config --json Internal.UnixFSShardingSizeThreshold "\"1G\"" +' + +test_add_dir "$UNSHARDED" test_launch_ipfs_daemon -test_add_large_dir "$UNSHARDED" +test_add_dir "$UNSHARDED" test_kill_ipfs_daemon -test_expect_success "enable sharding" ' - ipfs config --json Experimental.ShardingEnabled true +test_expect_success "force sharding on" ' + ipfs config --json Internal.UnixFSShardingSizeThreshold "\"1B\"" ' SHARDED="QmSCJD1KYLhVVHqBK3YyXuoEqHt7vggyJhzoFYbT8v1XYL" -test_add_large_dir "$SHARDED" +test_add_dir "$SHARDED" test_launch_ipfs_daemon -test_add_large_dir "$SHARDED" +test_add_dir "$SHARDED" test_kill_ipfs_daemon @@ -93,10 +98,10 @@ test_expect_success "'ipfs resolve' can resolve sharded dirs" ' test_kill_ipfs_daemon -test_add_large_dir_v1() { +test_add_dir_v1() { exphash="$1" - test_expect_success "ipfs add (CIDv1) on very large directory succeeds" ' - ipfs add -r -q --cid-version=1 testdata | tail -n1 > sharddir_out && + test_expect_success "ipfs add (CIDv1) on directory succeeds" ' + ipfs add -r -Q --cid-version=1 testdata > sharddir_out && echo "$exphash" > sharddir_exp && test_cmp sharddir_exp sharddir_out ' @@ -109,12 +114,32 @@ test_add_large_dir_v1() { # this hash implies the directory is CIDv1 and leaf entries are CIDv1 and raw SHARDEDV1="bafybeibiemewfzzdyhq2l74wrd6qj2oz42usjlktgnlqv4yfawgouaqn4u" -test_add_large_dir_v1 "$SHARDEDV1" +test_add_dir_v1 "$SHARDEDV1" test_launch_ipfs_daemon -test_add_large_dir_v1 "$SHARDEDV1" +test_add_dir_v1 "$SHARDEDV1" test_kill_ipfs_daemon +test_list_incomplete_dir() { + test_expect_success "ipfs add (CIDv1) on very large directory with sha3 succeeds" ' + ipfs add -r -Q --cid-version=1 --hash=sha3-256 --pin=false testdata > sharddir_out && + largeSHA3dir=$(cat sharddir_out) + ' + + test_expect_success "delete intermediate node from DAG" ' + ipfs block rm "/ipld/$largeSHA3dir/Links/0/Hash" + ' + + test_expect_success "can list part of the directory" ' + ipfs ls "$largeSHA3dir" 2> ls_err_out + echo "Error: failed to fetch all nodes" > exp_err_out && + cat ls_err_out && + test_cmp exp_err_out ls_err_out + ' +} + +test_list_incomplete_dir + test_done diff --git a/test/sharness/t0270-filestore.sh b/test/sharness/t0270-filestore.sh index a8ca939a5..82b7ae492 100755 --- a/test/sharness/t0270-filestore.sh +++ b/test/sharness/t0270-filestore.sh @@ -24,7 +24,7 @@ assert_repo_size_less_than() { test_expect_success "check repo size" ' test "$(get_repo_size)" -lt "$expval" || - { echo should be bellow "$expval" && test_fsh get_repo_size; } + { echo should be below "$expval" && test_fsh get_repo_size; } ' } @@ -39,7 +39,7 @@ assert_repo_size_greater_than() { test_filestore_adds() { test_expect_success "nocopy add succeeds" ' - HASH=$(ipfs add --raw-leaves --nocopy -r -q somedir | tail -n1) + HASH=$(ipfs add --raw-leaves --nocopy -r -Q somedir) ' test_expect_success "nocopy add has right hash" ' diff --git a/test/sharness/t0271-filestore-utils.sh b/test/sharness/t0271-filestore-utils.sh index 387a8417f..c7e814b9d 100755 --- a/test/sharness/t0271-filestore-utils.sh +++ b/test/sharness/t0271-filestore-utils.sh @@ -67,7 +67,7 @@ IPFS_CMD="ipfs" test_filestore_adds() { test_expect_success "$IPFS_CMD add nocopy add succeeds" ' - HASH=$($IPFS_CMD add --raw-leaves --nocopy -r -q somedir | tail -n1) + HASH=$($IPFS_CMD add --raw-leaves --nocopy -r -Q somedir) ' test_expect_success "nocopy add has right hash" ' diff --git a/test/sharness/t0272-urlstore.sh b/test/sharness/t0272-urlstore.sh index d22c82dd3..40d025454 100755 --- a/test/sharness/t0272-urlstore.sh +++ b/test/sharness/t0272-urlstore.sh @@ -110,7 +110,7 @@ EOF ipfs repo gc > /dev/null ' - test_expect_success "gatway no longer has files" ' + test_expect_success "gateway no longer has files" ' test_must_fail curl -f http://127.0.0.1:$GWAY_PORT/ipfs/$HASH1a -o file1.actual test_must_fail curl -f http://127.0.0.1:$GWAY_PORT/ipfs/$HASH2a -o file2.actual ' diff --git a/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreicxyzuqbx5yb7ytkgkuofwksbal3ygtswxuri25crxdxms55m5fki b/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreicxyzuqbx5yb7ytkgkuofwksbal3ygtswxuri25crxdxms55m5fki new file mode 100644 index 000000000..85cacbd3d --- /dev/null +++ b/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreicxyzuqbx5yb7ytkgkuofwksbal3ygtswxuri25crxdxms55m5fki @@ -0,0 +1 @@ +bivpPSWIuAyO8CpevzCLctagvWZAMBblhzDCsQWOAKdlkSAiprotectedx'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4R0NNIn0jciphertextx 3XqLW28NHP-raqW8vMfIHOzko4N3IRaR \ No newline at end of file diff --git a/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreihdfxoshbhowufyvjk7kq46dt6h7u6byejmlnifz34z7ocoq7ugk4 b/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreihdfxoshbhowufyvjk7kq46dt6h7u6byejmlnifz34z7ocoq7ugk4 new file mode 100644 index 000000000..562073116 Binary files /dev/null and b/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreihdfxoshbhowufyvjk7kq46dt6h7u6byejmlnifz34z7ocoq7ugk4 differ diff --git a/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreihkt4u6euddfhofkutfzxwet7w7zm5qrjpop655yhnb5dnzqw26lm b/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreihkt4u6euddfhofkutfzxwet7w7zm5qrjpop655yhnb5dnzqw26lm new file mode 100644 index 000000000..064769cd0 --- /dev/null +++ b/test/sharness/t0280-plugin-dag-jose-data/dag-cbor/bafyreihkt4u6euddfhofkutfzxwet7w7zm5qrjpop655yhnb5dnzqw26lm @@ -0,0 +1 @@ +bivpQ8xpPt_zZrfvHgR-ctagvjxHjcVusu0yrOBzw-Ex5zAiprotectedx3eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0jciphertextx WTaw6WeqhaZDDhedzGYnsty4SMR-RzOwjrecipientsmencrypted_keyyVEqYaN4dFEH0vX4jU3d768hwOYSgZhElvVDzqdIKA6PFHsL4PPwJ7EIuebLrxwABJqXWBNG0kUBRjHuCv51VlxvX9WoH9ik7Qew0yROCGBj_AJef15PiZzUVUQwteHVDuSQs4OcsMfj18zc_ObskHvUMaN0PdCBA-G__7rGR2tcYSJOywbvxqqTENsCZNvasKxHSOuA_bjVsRmWloUMwLJkrbQxPAsVcwoPjAYF2agQ8D40AGFVEzGmhQDLI-OpXI-AfZYBurE7f_fU_NsYtqmFj5vZ9lvVCV1QsZa_HRhQlBBHxjTKyCBufY-0G4omt2nzYhyO-TaH44eUh81HFzww \ No newline at end of file diff --git a/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera542h3xc57nudkgjcceexyzyxrkwi4ikbn773ag6dqdcyjt6z6rga b/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera542h3xc57nudkgjcceexyzyxrkwi4ikbn773ag6dqdcyjt6z6rga new file mode 100644 index 000000000..3727682df Binary files /dev/null and b/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera542h3xc57nudkgjcceexyzyxrkwi4ikbn773ag6dqdcyjt6z6rga differ diff --git a/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera5uvz2qai6l4vmqjigwpowluilxngz3dyjnva2s3uwbfb5u4ao4fa b/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera5uvz2qai6l4vmqjigwpowluilxngz3dyjnva2s3uwbfb5u4ao4fa new file mode 100644 index 000000000..af5b95568 Binary files /dev/null and b/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera5uvz2qai6l4vmqjigwpowluilxngz3dyjnva2s3uwbfb5u4ao4fa differ diff --git a/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera7azagcqlpu4ivvh4xp4iv6psmb5d7eki6ln3fnfnsnbb2hzv4nxq b/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera7azagcqlpu4ivvh4xp4iv6psmb5d7eki6ln3fnfnsnbb2hzv4nxq new file mode 100644 index 000000000..e99f3a8fd Binary files /dev/null and b/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcera7azagcqlpu4ivvh4xp4iv6psmb5d7eki6ln3fnfnsnbb2hzv4nxq differ diff --git a/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcerakjv2mmdlbai3urym22bw5kaw7nqov73yaxf6xjnp7e56sclsrooa b/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcerakjv2mmdlbai3urym22bw5kaw7nqov73yaxf6xjnp7e56sclsrooa new file mode 100644 index 000000000..39a7c496f --- /dev/null +++ b/test/sharness/t0280-plugin-dag-jose-data/dag-jose/bagcqcerakjv2mmdlbai3urym22bw5kaw7nqov73yaxf6xjnp7e56sclsrooa @@ -0,0 +1 @@ +bivX;J:k5 Yi3J*ctagP2B]Ak $(basename {}); \ + diff {} $(basename {}) \' + ' + + test_expect_success "retrieve dag-jose in non-dag-jose encodings" $' + find ../t0280-plugin-dag-jose-data -type f | xargs -I {} sh -c \' \ + codec=$(basename $(dirname {})); \ + joseHash=$(ipfs dag put --store-codec dag-jose --input-codec=$codec {}); \ + ipfs dag get --output-codec dag-cbor $joseHash > /dev/null; \ + ipfs dag get --output-codec dag-json $joseHash > /dev/null \' + ' +} + +# should work offline +test_dag_jose + +# should work online +test_launch_ipfs_daemon +test_dag_jose +test_kill_ipfs_daemon + +test_done diff --git a/test/sharness/t0290-cid.sh b/test/sharness/t0290-cid.sh index f1fab8df6..680e5308d 100755 --- a/test/sharness/t0290-cid.sh +++ b/test/sharness/t0290-cid.sh @@ -107,6 +107,7 @@ cat < codecs_expect 112 protobuf 113 cbor 120 git-raw + 133 dag-jose 144 eth-block 145 eth-block-list 146 eth-tx-trie diff --git a/test/sharness/t0180-pubsub.sh b/test/sharness/t0320-pubsub.sh similarity index 56% rename from test/sharness/t0180-pubsub.sh rename to test/sharness/t0320-pubsub.sh index 349e98d54..676d890c2 100755 --- a/test/sharness/t0180-pubsub.sh +++ b/test/sharness/t0320-pubsub.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -test_description="Test dht command" +test_description="Test pubsub command" . lib/test-lib.sh @@ -19,72 +19,72 @@ run_pubsub_tests() { PEERID_0=$(iptb attr get 0 id) && PEERID_2=$(iptb attr get 2 id) ' - + # ipfs pubsub sub test_expect_success 'pubsub' ' - echo "testOK" > expected && + echo -n -e "test\nOK" | ipfs multibase encode -b base64url > expected && touch empty && mkfifo wait || test_fsh echo init fail - + # ipfs pubsub sub is long-running so we need to start it in the background and # wait put its output somewhere where we can access it ( - ipfsi 0 pubsub sub --enc=ndpayload testTopic | if read line; then - echo $line > actual && + ipfsi 0 pubsub sub --enc=json testTopic | if read line; then + echo $line | jq -j .data > actual && echo > wait fi ) & ' - + test_expect_success "wait until ipfs pubsub sub is ready to do work" ' go-sleep 500ms ' - + test_expect_success "can see peer subscribed to testTopic" ' ipfsi 1 pubsub peers testTopic > peers_out ' - + test_expect_success "output looks good" ' echo $PEERID_0 > peers_exp && test_cmp peers_exp peers_out ' - - test_expect_success "publish something" ' - ipfsi 1 pubsub pub testTopic "testOK" &> pubErr + + test_expect_success "publish something from file" ' + echo -n -e "test\nOK" > payload-file && + ipfsi 1 pubsub pub testTopic payload-file &> pubErr ' - + test_expect_success "wait until echo > wait executed" ' cat wait && test_cmp pubErr empty && test_cmp expected actual ' - + test_expect_success "wait for another pubsub message" ' - echo "testOK2" > expected && + echo -n -e "test\nOK\r\n2" | ipfs multibase encode -b base64url > expected && mkfifo wait2 || test_fsh echo init fail - + # ipfs pubsub sub is long-running so we need to start it in the background and # wait put its output somewhere where we can access it ( - ipfsi 2 pubsub sub --enc=ndpayload testTopic | if read line; then - echo $line > actual && + ipfsi 2 pubsub sub --enc=json testTopic | if read line; then + echo $line | jq -j .data > actual && echo > wait2 fi ) & ' - + test_expect_success "wait until ipfs pubsub sub is ready to do work" ' go-sleep 500ms ' - - test_expect_success "publish something" ' - echo "testOK2" | ipfsi 3 pubsub pub testTopic &> pubErr + + test_expect_success "publish something from stdin" ' + echo -n -e "test\nOK\r\n2" | ipfsi 3 pubsub pub testTopic &> pubErr ' - + test_expect_success "wait until echo > wait executed" ' - echo "testOK2" > expected && cat wait2 && test_cmp pubErr empty && test_cmp expected actual @@ -93,10 +93,26 @@ run_pubsub_tests() { test_expect_success 'cleanup fifos' ' rm -f wait wait2 ' - + } -# Normal tests +# Normal tests - enabled via config + +test_expect_success 'enable the pubsub' ' + iptb run -- ipfs config --json Pubsub.Enabled true +' + +startup_cluster $NUM_NODES +run_pubsub_tests +test_expect_success 'stop iptb' ' + iptb stop +' + +test_expect_success 'disable the pubsub' ' + iptb run -- ipfs config --json Pubsub.Enabled false +' + +# Normal tests - enabled via daemon option flag startup_cluster $NUM_NODES --enable-pubsub-experiment run_pubsub_tests @@ -114,7 +130,7 @@ startup_cluster $NUM_NODES --enable-pubsub-experiment test_expect_success 'set node 4 to listen on testTopic' ' rm -f node4_actual && - ipfsi 4 pubsub sub --enc=ndpayload testTopic > node4_actual & + ipfsi 4 pubsub sub --enc=json testTopic > node4_actual & ' run_pubsub_tests @@ -127,4 +143,27 @@ test_expect_success 'node 4 got no unsigned messages' ' test_must_be_empty node4_actual ' + +# Confirm negative CLI flag takes precedence over positive config + +# --enable-pubsub-experiment=false + Pubsub.Enabled:true + +test_expect_success 'enable the pubsub via config' ' + iptb run -- ipfs config --json Pubsub.Enabled true +' +startup_cluster $NUM_NODES --enable-pubsub-experiment=false + +test_expect_success 'pubsub cmd fails because it was disabled via cli flag' ' + test_expect_code 1 ipfsi 4 pubsub ls 2> pubsub_cmd_out +' + +test_expect_success "pubsub cmd produces error" ' + echo "Error: experimental pubsub feature not enabled. Run daemon with --enable-pubsub-experiment to use." > expected && + test_cmp expected pubsub_cmd_out +' + +test_expect_success 'stop iptb' ' + iptb stop +' + test_done diff --git a/test/sharness/t0180-pubsub-gossipsub.sh b/test/sharness/t0321-pubsub-gossipsub.sh similarity index 76% rename from test/sharness/t0180-pubsub-gossipsub.sh rename to test/sharness/t0321-pubsub-gossipsub.sh index c5ff8daf3..c89c8d1ae 100755 --- a/test/sharness/t0180-pubsub-gossipsub.sh +++ b/test/sharness/t0321-pubsub-gossipsub.sh @@ -25,7 +25,7 @@ test_expect_success 'peer ids' ' ' test_expect_success 'pubsub' ' - echo "testOK" > expected && + echo -n -e "test\nOK" | ipfs multibase encode -b base64url > expected && touch empty && mkfifo wait || test_fsh echo init fail @@ -33,8 +33,8 @@ test_expect_success 'pubsub' ' # ipfs pubsub sub is long-running so we need to start it in the background and # wait put its output somewhere where we can access it ( - ipfsi 0 pubsub sub --enc=ndpayload testTopic | if read line; then - echo $line > actual && + ipfsi 0 pubsub sub --enc=json testTopic | if read line; then + echo $line | jq -j .data > actual && echo > wait fi ) & @@ -53,8 +53,9 @@ test_expect_success "output looks good" ' test_cmp peers_exp peers_out ' -test_expect_success "publish something" ' - ipfsi 1 pubsub pub testTopic "testOK" &> pubErr +test_expect_success "publish something from a file" ' + echo -n -e "test\nOK" > payload-file && + ipfsi 1 pubsub pub testTopic payload-file &> pubErr ' test_expect_success "wait until echo > wait executed" ' @@ -64,15 +65,15 @@ test_expect_success "wait until echo > wait executed" ' ' test_expect_success "wait for another pubsub message" ' - echo "testOK2" > expected && + echo -n -e "test\nOK2" | ipfs multibase encode -b base64url > expected && mkfifo wait2 || test_fsh echo init fail # ipfs pubsub sub is long-running so we need to start it in the background and # wait put its output somewhere where we can access it ( - ipfsi 2 pubsub sub --enc=ndpayload testTopic | if read line; then - echo $line > actual && + ipfsi 2 pubsub sub --enc=json testTopic | if read line; then + echo $line | jq -j .data > actual && echo > wait2 fi ) & @@ -83,11 +84,10 @@ test_expect_success "wait until ipfs pubsub sub is ready to do work" ' ' test_expect_success "publish something" ' - echo "testOK2" | ipfsi 1 pubsub pub testTopic &> pubErr + echo -n -e "test\nOK2" | ipfsi 1 pubsub pub testTopic &> pubErr ' test_expect_success "wait until echo > wait executed" ' - echo "testOK2" > expected && cat wait2 && test_cmp pubErr empty && test_cmp expected actual diff --git a/test/sharness/t0322-pubsub-http-rpc.sh b/test/sharness/t0322-pubsub-http-rpc.sh new file mode 100755 index 000000000..4ecfefb69 --- /dev/null +++ b/test/sharness/t0322-pubsub-http-rpc.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +test_description="Test pubsub command behavior over HTTP RPC API" + +. lib/test-lib.sh + +test_init_ipfs +test_launch_ipfs_daemon --enable-pubsub-experiment + +# Require topic as multibase +# https://github.com/ipfs/go-ipfs/pull/8183 +test_expect_success "/api/v0/pubsub/pub URL arg must be multibase encoded" ' + echo test > data.txt && + curl -s -X POST -F "data=@data.txt" "$API_ADDR/api/v0/pubsub/pub?arg=foobar" > result && + test_should_contain "error" result && + test_should_contain "URL arg must be multibase encoded" result +' + +# Use URL-safe multibase +# base64 should produce error when used in URL args, base64url should be used +test_expect_success "/api/v0/pubsub/pub URL arg must be in URL-safe multibase" ' + echo test > data.txt && + curl -s -X POST -F "data=@data.txt" "$API_ADDR/api/v0/pubsub/pub?arg=mZm9vYmFyCg" > result && + test_should_contain "error" result && + test_should_contain "URL arg must be base64url encoded" result +' + +test_kill_ipfs_daemon +test_done diff --git a/testplans/bitswap/_compositions/large-k8s.toml b/testplans/bitswap/_compositions/large-k8s.toml new file mode 100644 index 000000000..fea91d000 --- /dev/null +++ b/testplans/bitswap/_compositions/large-k8s.toml @@ -0,0 +1,32 @@ +[metadata] + +[global] + plan = "bitswap" + case = "speed-test" + total_instances = 20 + builder = "docker:go" + runner = "cluster:k8s" + +[global.build_config] + push_registry=true + go_proxy_mode="remote" + go_proxy_url="http://localhost:8081" + registry_type="aws" + +[global.run.test_params] +size = "1MB" +count = "1000" + +[[groups]] + id = "providers" + instances = { count = 1 } + [groups.resources] + memory = "4096Mi" + cpu = "1000m" + +[[groups]] + id = "requestors" + instances = { count = 19 } + [groups.resources] + memory = "4096Mi" + cpu = "1000m" diff --git a/testplans/bitswap/_compositions/medium-k8s.toml b/testplans/bitswap/_compositions/medium-k8s.toml new file mode 100644 index 000000000..816d91fe4 --- /dev/null +++ b/testplans/bitswap/_compositions/medium-k8s.toml @@ -0,0 +1,33 @@ +[metadata] + name = "bitswap-medium-speed-test" + +[global] + plan = "bitswap" + case = "speed-test" + total_instances = 5 + builder = "docker:go" + runner = "cluster:k8s" + +[global.build_config] + push_registry=true + go_proxy_mode="remote" + go_proxy_url="http://localhost:8081" + registry_type="aws" + +[global.run.test_params] +size = "1MB" +count = "1000" + +[[groups]] + id = "providers" + instances = { count = 1 } + [groups.resources] + memory = "4096Mi" + cpu = "1000m" + +[[groups]] + id = "requestors" + instances = { count = 4 } + [groups.resources] + memory = "4096Mi" + cpu = "1000m" diff --git a/testplans/bitswap/_compositions/small-docker.toml b/testplans/bitswap/_compositions/small-docker.toml new file mode 100644 index 000000000..b0e9f96ae --- /dev/null +++ b/testplans/bitswap/_compositions/small-docker.toml @@ -0,0 +1,30 @@ +[metadata] + name = "bitswap-local-speed-test" + +[global] + plan = "bitswap" + case = "speed-test" + total_instances = 2 + builder = "docker:go" + runner = "local:docker" + +[global.build_config] + push_registry=false + +[global.run.test_params] +size = "1MB" +count = "1000" + +[[groups]] + id = "providers" + instances = { count = 1 } + [groups.resources] + memory = "4096Mi" + cpu = "1000m" + +[[groups]] + id = "requestors" + instances = { count = 1 } + [groups.resources] + memory = "4096Mi" + cpu = "1000m" diff --git a/testplans/bitswap/_compositions/small-k8s.toml b/testplans/bitswap/_compositions/small-k8s.toml new file mode 100644 index 000000000..3f454412d --- /dev/null +++ b/testplans/bitswap/_compositions/small-k8s.toml @@ -0,0 +1,33 @@ +[metadata] + name = "bitswap-small-speed-test" + +[global] + plan = "bitswap" + case = "speed-test" + total_instances = 2 + builder = "docker:go" + runner = "cluster:k8s" + +[global.build_config] + push_registry=true + go_proxy_mode="remote" + go_proxy_url="http://localhost:8081" + registry_type="aws" + +[global.run.test_params] +size = "1MB" +count = "1000" + +[[groups]] + id = "providers" + instances = { count = 1 } + [groups.resources] + memory = "4096Mi" + cpu = "1000m" + +[[groups]] + id = "requestors" + instances = { count = 1 } + [groups.resources] + memory = "4096Mi" + cpu = "1000m" diff --git a/testplans/bitswap/go.mod b/testplans/bitswap/go.mod new file mode 100644 index 000000000..3878d953c --- /dev/null +++ b/testplans/bitswap/go.mod @@ -0,0 +1,29 @@ +module github.com/ipfs/go-ipfs/testplans/bitswap + +require ( + github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f // indirect + github.com/ipfs/go-bitswap v0.3.4 + github.com/ipfs/go-block-format v0.0.3 + github.com/ipfs/go-cid v0.0.7 + github.com/ipfs/go-datastore v0.4.5 + github.com/ipfs/go-ipfs-blockstore v0.1.6 + github.com/ipfs/go-ipfs-exchange-interface v0.0.1 + github.com/ipfs/go-ipfs-regression v0.0.1 + github.com/ipfs/go-ipns v0.1.0 // indirect + github.com/ipfs/go-log/v2 v2.3.0 // indirect + github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db // indirect + github.com/libp2p/go-libp2p v0.14.4 + github.com/libp2p/go-libp2p-core v0.8.6 + github.com/libp2p/go-libp2p-discovery v0.5.1 // indirect + github.com/libp2p/go-libp2p-kad-dht v0.12.2 + github.com/libp2p/go-libp2p-peerstore v0.2.8 // indirect + github.com/libp2p/go-libp2p-quic-transport v0.11.2 // indirect + github.com/multiformats/go-multiaddr v0.3.3 + github.com/multiformats/go-multihash v0.0.15 + github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e // indirect + github.com/smartystreets/assertions v1.0.1 // indirect + github.com/testground/sdk-go v0.2.7 + golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect +) + +go 1.15 diff --git a/testplans/bitswap/go.sum b/testplans/bitswap/go.sum new file mode 100644 index 000000000..4ef964c93 --- /dev/null +++ b/testplans/bitswap/go.sum @@ -0,0 +1,1267 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/avast/retry-go v2.6.0+incompatible h1:FelcMrm7Bxacr1/RM8+/eqkDkmVN7tjlsy51dOzB3LI= +github.com/avast/retry-go v2.6.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +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= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= +github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +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/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= +github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= +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/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= +github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= +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/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.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= +github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +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-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +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/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +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= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3 h1:k3/6a1Shi7GGCp9QpyYuXsMM6ncTOjCzOE9Fd6CDA+Q= +github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= +github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= +github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= +github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= +github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= +github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.0.7 h1:ysQJVJA3fNDF1qigJbsSQOdjhVLsOEoPdh0+R97k3jY= +github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.5 h1:cwOUcGMLdLPWgu3SlrCckCMznaGADbPqE0r8h768/Dg= +github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= +github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= +github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= +github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= +github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= +github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= +github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= +github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-ipfs-blockstore v0.1.6 h1:+RNM/gkTF6lzLPtt/xqjEUXJuG0lFwAiv+MV8MoAhvA= +github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +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-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= +github.com/ipfs/go-ipfs-ds-help v0.1.1 h1:IW/bXGeaAZV2VH0Kuok+Ohva/zHkHmeLFBxC1k7mNPc= +github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= +github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= +github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= +github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/ipfs/go-ipfs-regression v0.0.1 h1:LX3lrYYgiCE9QmL/qlc4Mh0cewdOHRl5pArbeQRllsU= +github.com/ipfs/go-ipfs-regression v0.0.1/go.mod h1:I9yKzBjbirC5D0ND0DBkiQ5PPSQ2R2YjhcqHPj8L28A= +github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= +github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +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-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= +github.com/ipfs/go-ipns v0.1.0 h1:jk03sneWwh+/bSHrFjRfE38xHDnTzqCsx2wsJ8ipukM= +github.com/ipfs/go-ipns v0.1.0/go.mod h1:3IbsuPkR6eAGcnx+E7j6HpOSbSQJPZ6zlRj+NK3jPxQ= +github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= +github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= +github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= +github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= +github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= +github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= +github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= +github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= +github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +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.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= +github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db h1:kFwGn8rXa/Z31ev1OFNQsYeNKNCdifnTPl/NvPy5L38= +github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +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/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= +github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +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.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= +github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +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.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= +github.com/libp2p/go-addr-util v0.0.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU= +github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +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-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= +github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= +github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= +github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= +github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= +github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= +github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= +github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= +github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= +github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= +github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= +github.com/libp2p/go-libp2p v0.14.4 h1:QCJE+jGyqxWdrSPuS4jByXCzosgaIg4SJTLCRplJ53w= +github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= +github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= +github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= +github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= +github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= +github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= +github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= +github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= +github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= +github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= +github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= +github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= +github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= +github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= +github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= +github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= +github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= +github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= +github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= +github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= +github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= +github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= +github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= +github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= +github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= +github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= +github.com/libp2p/go-libp2p-core v0.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.8.6 h1:3S8g006qG6Tjpj1JdRK2S+TWc2DJQKX/RG9fdLeiLSU= +github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= +github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= +github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= +github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-kad-dht v0.12.2 h1:INBYK7pEPzka5TrAWB2II+PYLeEaRlu6RWIoukfEBFQ= +github.com/libp2p/go-libp2p-kad-dht v0.12.2/go.mod h1:mznpWRg0Nbkr9PB2Dm9XWN24V2BChE3FT1dHmwaDVws= +github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= +github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= +github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= +github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= +github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= +github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= +github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= +github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= +github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= +github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= +github.com/libp2p/go-libp2p-noise v0.2.0 h1:wmk5nhB9a2w2RxMOyvsoKjizgJOEaJdfAakr0jN8gds= +github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= +github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= +github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= +github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= +github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= +github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.8 h1:nJghUlUkFVvyk7ccsM67oFA6kqUkwyCM1G4WPVMCWYA= +github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= +github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= +github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= +github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= +github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= +github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= +github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= +github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= +github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= +github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= +github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= +github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= +github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= +github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= +github.com/libp2p/go-libp2p-swarm v0.5.0 h1:HIK0z3Eqoo8ugmN8YqWAhD2RORgR+3iNXYG4U2PFd1E= +github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= +github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= +github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= +github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= +github.com/libp2p/go-libp2p-testing v0.4.0 h1:PrwHRi0IGqOwVQWR3xzgigSlhlLfxgfXgkHxr77EghQ= +github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-tls v0.1.3 h1:twKMhMu44jQO+HgQK9X8NHO5HkeJu2QbhLzLJpa8oNM= +github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= +github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.2 h1:4JsnbfJzgZeRS9AWN7B9dPqn/LY/HoQTlO9gtdJTIYM= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= +github.com/libp2p/go-libp2p-xor v0.0.0-20200501025846-71e284145d58/go.mod h1:AYjOiqJIdcmI4SXE2ouKQuFrUbE5myv8txWaB2pl4TI= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= +github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= +github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= +github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= +github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= +github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= +github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= +github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= +github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= +github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= +github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= +github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= +github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.3.0 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= +github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= +github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= +github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= +github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= +github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= +github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= +github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= +github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= +github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= +github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= +github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= +github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= +github.com/libp2p/go-reuseport-transport v0.0.4 h1:OZGz0RB620QDGpv300n1zaOcKGGAoGVf8h9txtt/1uM= +github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= +github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= +github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-stream-muxer-multistream v0.3.0 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= +github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= +github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= +github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= +github.com/libp2p/go-tcp-transport v0.2.4 h1:IL5ZAQrkLftufe24mWrmGtTV6drGi6BiXWMTLEM9PBE= +github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= +github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= +github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= +github.com/libp2p/go-ws-transport v0.4.0 h1:9tvtQ9xbws6cA5LvqdE6Ne3vcmGB4f1z9SByggk4s0k= +github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= +github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= +github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= +github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +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/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= +github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= +github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= +github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= +github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= +github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= +github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= +github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= +github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= +github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= +github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= +github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= +github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= +github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= +github.com/multiformats/go-multiaddr v0.3.3 h1:vo2OTSAqnENB2rLk79pLtr+uhj+VAzSe3uef5q0lRSs= +github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= +github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= +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.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= +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-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= +github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= +github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= +github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= +github.com/multiformats/go-multiaddr-net v0.2.0 h1:MSXRGN0mFymt6B1yo/6BPnIRpLPEnKgQNvVfCX5VDJk= +github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multicodec v0.2.0 h1:MUzKZWxOFagwLLtlx96pub9zwDQAbMAf1k9fXOdc3so= +github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= +github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= +github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= +github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= +github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= +github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= +github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= +github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +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/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +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= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +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= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= +github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +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/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/testground/sdk-go v0.2.7 h1:SDLDukPZIaZOeG2gQjCNsh5EB3QL3mOhOM4p0BMpqlc= +github.com/testground/sdk-go v0.2.7/go.mod h1:Q4dnWsUBH+dZ1u7aEGDBHWGUaLfhitjUq3UJQqxeTmk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +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/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= +github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= +github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= +github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= +github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= +github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= +github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= +github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +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= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +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= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744 h1:yhBbb4IRs2HS9PPlAg6DMC6mUOKexJBNsLf4Z+6En1Q= +golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +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= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +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-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= +gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/testplans/bitswap/main.go b/testplans/bitswap/main.go new file mode 100644 index 000000000..f14c8a061 --- /dev/null +++ b/testplans/bitswap/main.go @@ -0,0 +1,204 @@ +package main + +import ( + "context" + "errors" + "fmt" + "math/rand" + "time" + + "github.com/testground/sdk-go/network" + "github.com/testground/sdk-go/run" + "github.com/testground/sdk-go/runtime" + "github.com/testground/sdk-go/sync" + + bitswap "github.com/ipfs/go-bitswap" + bsnet "github.com/ipfs/go-bitswap/network" + block "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + datastore "github.com/ipfs/go-datastore" + blockstore "github.com/ipfs/go-ipfs-blockstore" + exchange "github.com/ipfs/go-ipfs-exchange-interface" + bstats "github.com/ipfs/go-ipfs-regression/bitswap" + "github.com/libp2p/go-libp2p" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + dht "github.com/libp2p/go-libp2p-kad-dht" + "github.com/multiformats/go-multiaddr" + "github.com/multiformats/go-multihash" +) + +var ( + testcases = map[string]interface{}{ + "speed-test": run.InitializedTestCaseFn(runSpeedTest), + } + networkState = sync.State("network-configured") + readyState = sync.State("ready-to-publish") + readyDLState = sync.State("ready-to-download") + doneState = sync.State("done") + providerTopic = sync.NewTopic("provider", &peer.AddrInfo{}) + blockTopic = sync.NewTopic("blocks", &multihash.Multihash{}) +) + +func main() { + run.InvokeMap(testcases) +} + +func runSpeedTest(runenv *runtime.RunEnv, initCtx *run.InitContext) error { + runenv.RecordMessage("running speed-test") + ctx := context.Background() + linkShape := network.LinkShape{} + // linkShape := network.LinkShape{ + // Latency: 50 * time.Millisecond, + // Jitter: 20 * time.Millisecond, + // Bandwidth: 3e6, + // // Filter: (not implemented) + // Loss: 0.02, + // Corrupt: 0.01, + // CorruptCorr: 0.1, + // Reorder: 0.01, + // ReorderCorr: 0.1, + // Duplicate: 0.02, + // DuplicateCorr: 0.1, + // } + initCtx.NetClient.MustConfigureNetwork(ctx, &network.Config{ + Network: "default", + Enable: true, + Default: linkShape, + CallbackState: networkState, + CallbackTarget: runenv.TestGroupInstanceCount, + RoutingPolicy: network.AllowAll, + }) + listen, err := multiaddr.NewMultiaddr(fmt.Sprintf("/ip4/%s/tcp/3333", initCtx.NetClient.MustGetDataNetworkIP().String())) + if err != nil { + return err + } + h, err := libp2p.New(ctx, libp2p.ListenAddrs(listen)) + if err != nil { + return err + } + kad, err := dht.New(ctx, h) + if err != nil { + return err + } + for _, a := range h.Addrs() { + runenv.RecordMessage("listening on addr: %s", a.String()) + } + bstore := blockstore.NewBlockstore(datastore.NewMapDatastore()) + ex := bitswap.New(ctx, bsnet.NewFromIpfsHost(h, kad), bstore) + switch runenv.TestGroupID { + case "providers": + runenv.RecordMessage("running provider") + err = runProvide(ctx, runenv, h, bstore, ex) + case "requestors": + runenv.RecordMessage("running requestor") + err = runRequest(ctx, runenv, h, bstore, ex) + default: + runenv.RecordMessage("not part of a group") + err = errors.New("unknown test group id") + } + return err +} + +func runProvide(ctx context.Context, runenv *runtime.RunEnv, h host.Host, bstore blockstore.Blockstore, ex exchange.Interface) error { + tgc := sync.MustBoundClient(ctx, runenv) + ai := peer.AddrInfo{ + ID: h.ID(), + Addrs: h.Addrs(), + } + tgc.MustPublish(ctx, providerTopic, &ai) + tgc.MustSignalAndWait(ctx, readyState, runenv.TestInstanceCount) + + size := runenv.SizeParam("size") + count := runenv.IntParam("count") + for i := 0; i <= count; i++ { + runenv.RecordMessage("generating %d-sized random block", size) + buf := make([]byte, size) + rand.Read(buf) + blk := block.NewBlock(buf) + err := bstore.Put(blk) + if err != nil { + return err + } + err = ex.HasBlock(blk) + if err != nil { + return err + } + mh := blk.Multihash() + runenv.RecordMessage("publishing block %s", mh.String()) + tgc.MustPublish(ctx, blockTopic, &mh) + } + tgc.MustSignalAndWait(ctx, readyDLState, runenv.TestInstanceCount) + tgc.MustSignalAndWait(ctx, doneState, runenv.TestInstanceCount) + return nil +} + +func runRequest(ctx context.Context, runenv *runtime.RunEnv, h host.Host, bstore blockstore.Blockstore, ex exchange.Interface) error { + tgc := sync.MustBoundClient(ctx, runenv) + providers := make(chan *peer.AddrInfo) + blkmhs := make(chan *multihash.Multihash) + providerSub, err := tgc.Subscribe(ctx, providerTopic, providers) + if err != nil { + return err + } + ai := <-providers + + runenv.RecordMessage("connecting to provider provider: %s", fmt.Sprint(*ai)) + providerSub.Done() + + err = h.Connect(ctx, *ai) + if err != nil { + return fmt.Errorf("could not connect to provider: %w", err) + } + + runenv.RecordMessage("connected to provider") + + blockmhSub, err := tgc.Subscribe(ctx, blockTopic, blkmhs) + if err != nil { + return fmt.Errorf("could not subscribe to block sub: %w", err) + } + defer blockmhSub.Done() + + // tell the provider that we're ready for it to publish blocks + tgc.MustSignalAndWait(ctx, readyState, runenv.TestInstanceCount) + // wait until the provider is ready for us to start downloading + tgc.MustSignalAndWait(ctx, readyDLState, runenv.TestInstanceCount) + + begin := time.Now() + count := runenv.IntParam("count") + for i := 0; i <= count; i++ { + mh := <-blkmhs + runenv.RecordMessage("downloading block %s", mh.String()) + dlBegin := time.Now() + blk, err := ex.GetBlock(ctx, cid.NewCidV0(*mh)) + if err != nil { + return fmt.Errorf("could not download get block %s: %w", mh.String(), err) + } + dlDuration := time.Since(dlBegin) + s := &bstats.BitswapStat{ + SingleDownloadSpeed: &bstats.SingleDownloadSpeed{ + Cid: blk.Cid().String(), + DownloadDuration: dlDuration, + }, + } + runenv.RecordMessage(bstats.Marshal(s)) + + stored, err := bstore.Has(blk.Cid()) + if err != nil { + return fmt.Errorf("error checking if blck was stored %s: %w", mh.String(), err) + } + if !stored { + return fmt.Errorf("block was not stored %s: %w", mh.String(), err) + } + } + duration := time.Since(begin) + s := &bstats.BitswapStat{ + MultipleDownloadSpeed: &bstats.MultipleDownloadSpeed{ + BlockCount: count, + TotalDuration: duration, + }, + } + runenv.RecordMessage(bstats.Marshal(s)) + tgc.MustSignalEntry(ctx, doneState) + return nil +} diff --git a/testplans/bitswap/manifest.toml b/testplans/bitswap/manifest.toml new file mode 100644 index 000000000..cc6e2720a --- /dev/null +++ b/testplans/bitswap/manifest.toml @@ -0,0 +1,19 @@ +name = "bitswap" + +[builders] + "docker:go" = { enabled = true, enable_go_build_cache = true } + +[runners] + "local:docker" = { enabled = true } + "cluster:k8s" = { enabled = true } + +[global.build_config] + enable_go_build_cache = true + +[[testcases]] + name = "speed-test" + instances = { min = 2, max = 100, default = 2 } + + [testcases.params] + size = { type = "int", desc = "size of file to transfer, in human-friendly form", default = "1MiB" } + count = { type = "int", desc = "number of transfers", default = "10" } diff --git a/thirdparty/cidv0v1/blockstore.go b/thirdparty/cidv0v1/blockstore.go index 2f098dff9..f28feae75 100644 --- a/thirdparty/cidv0v1/blockstore.go +++ b/thirdparty/cidv0v1/blockstore.go @@ -1,6 +1,8 @@ package cidv0v1 import ( + "context" + blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" bs "github.com/ipfs/go-ipfs-blockstore" @@ -15,8 +17,8 @@ func NewBlockstore(b bs.Blockstore) bs.Blockstore { return &blockstore{b} } -func (b *blockstore) Has(c cid.Cid) (bool, error) { - have, err := b.Blockstore.Has(c) +func (b *blockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + have, err := b.Blockstore.Has(ctx, c) if have || err != nil { return have, err } @@ -24,11 +26,11 @@ func (b *blockstore) Has(c cid.Cid) (bool, error) { if !c1.Defined() { return false, nil } - return b.Blockstore.Has(c1) + return b.Blockstore.Has(ctx, c1) } -func (b *blockstore) Get(c cid.Cid) (blocks.Block, error) { - block, err := b.Blockstore.Get(c) +func (b *blockstore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + block, err := b.Blockstore.Get(ctx, c) if err == nil { return block, nil } @@ -39,7 +41,7 @@ func (b *blockstore) Get(c cid.Cid) (blocks.Block, error) { if !c1.Defined() { return nil, bs.ErrNotFound } - block, err = b.Blockstore.Get(c1) + block, err = b.Blockstore.Get(ctx, c1) if err != nil { return nil, err } @@ -50,15 +52,15 @@ func (b *blockstore) Get(c cid.Cid) (blocks.Block, error) { } // insert the block with the original CID to avoid problems // with pinning - err = b.Blockstore.Put(block) + err = b.Blockstore.Put(ctx, block) if err != nil { return nil, err } return block, nil } -func (b *blockstore) GetSize(c cid.Cid) (int, error) { - size, err := b.Blockstore.GetSize(c) +func (b *blockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + size, err := b.Blockstore.GetSize(ctx, c) if err == nil { return size, nil } @@ -69,7 +71,7 @@ func (b *blockstore) GetSize(c cid.Cid) (int, error) { if !c1.Defined() { return -1, bs.ErrNotFound } - return b.Blockstore.GetSize(c1) + return b.Blockstore.GetSize(ctx, c1) } func tryOtherCidVersion(c cid.Cid) cid.Cid { diff --git a/thirdparty/verifbs/verifbs.go b/thirdparty/verifbs/verifbs.go index 53b6d13ca..7be5348a8 100644 --- a/thirdparty/verifbs/verifbs.go +++ b/thirdparty/verifbs/verifbs.go @@ -1,6 +1,8 @@ package verifbs import ( + "context" + blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" @@ -11,52 +13,52 @@ type VerifBSGC struct { bstore.GCBlockstore } -func (bs *VerifBSGC) Put(b blocks.Block) error { +func (bs *VerifBSGC) Put(ctx context.Context, b blocks.Block) error { if err := verifcid.ValidateCid(b.Cid()); err != nil { return err } - return bs.GCBlockstore.Put(b) + return bs.GCBlockstore.Put(ctx, b) } -func (bs *VerifBSGC) PutMany(blks []blocks.Block) error { +func (bs *VerifBSGC) PutMany(ctx context.Context, blks []blocks.Block) error { for _, b := range blks { if err := verifcid.ValidateCid(b.Cid()); err != nil { return err } } - return bs.GCBlockstore.PutMany(blks) + return bs.GCBlockstore.PutMany(ctx, blks) } -func (bs *VerifBSGC) Get(c cid.Cid) (blocks.Block, error) { +func (bs *VerifBSGC) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { if err := verifcid.ValidateCid(c); err != nil { return nil, err } - return bs.GCBlockstore.Get(c) + return bs.GCBlockstore.Get(ctx, c) } type VerifBS struct { bstore.Blockstore } -func (bs *VerifBS) Put(b blocks.Block) error { +func (bs *VerifBS) Put(ctx context.Context, b blocks.Block) error { if err := verifcid.ValidateCid(b.Cid()); err != nil { return err } - return bs.Blockstore.Put(b) + return bs.Blockstore.Put(ctx, b) } -func (bs *VerifBS) PutMany(blks []blocks.Block) error { +func (bs *VerifBS) PutMany(ctx context.Context, blks []blocks.Block) error { for _, b := range blks { if err := verifcid.ValidateCid(b.Cid()); err != nil { return err } } - return bs.Blockstore.PutMany(blks) + return bs.Blockstore.PutMany(ctx, blks) } -func (bs *VerifBS) Get(c cid.Cid) (blocks.Block, error) { +func (bs *VerifBS) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { if err := verifcid.ValidateCid(c); err != nil { return nil, err } - return bs.Blockstore.Get(c) + return bs.Blockstore.Get(ctx, c) } diff --git a/version.go b/version.go index 09e2593c2..ee21352fb 100644 --- a/version.go +++ b/version.go @@ -4,7 +4,7 @@ package ipfs var CurrentCommit string // CurrentVersionNumber is the current application's version literal -const CurrentVersionNumber = "0.10.0" +const CurrentVersionNumber = "0.11.0" const ApiVersion = "/go-ipfs/" + CurrentVersionNumber + "/"