diff --git a/go.mod b/go.mod index 07b4cc2cd..8088f2391 100644 --- a/go.mod +++ b/go.mod @@ -1,27 +1,31 @@ module github.com/ipfs/gateway-conformance -go 1.19 +go 1.20 require ( - github.com/ipfs/boxo v0.8.0-rc3 - github.com/ipfs/go-cid v0.4.0 + github.com/ipfs/boxo v0.8.1 + github.com/ipfs/go-cid v0.4.1 github.com/ipld/go-ipld-prime v0.20.0 - github.com/urfave/cli/v2 v2.25.0 + github.com/stretchr/testify v1.8.2 + github.com/urfave/cli/v2 v2.25.3 ) require ( - github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect + github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/ipld/go-codec-dagpb v1.6.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.uber.org/goleak v1.1.12 // indirect golang.org/x/sync v0.1.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.3.0 // indirect @@ -38,14 +42,14 @@ require ( github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect github.com/jbenet/goprocess v0.1.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.3 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multibase v0.1.1 - github.com/multiformats/go-multicodec v0.8.1 + github.com/multiformats/go-multibase v0.2.0 + github.com/multiformats/go-multicodec v0.9.0 github.com/multiformats/go-multihash v0.2.1 github.com/multiformats/go-varint v0.0.7 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect @@ -53,16 +57,16 @@ require ( github.com/polydawn/refmt v0.89.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect - github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa // indirect - go.opentelemetry.io/otel v1.14.0 // indirect - go.opentelemetry.io/otel/trace v1.14.0 // indirect + github.com/whyrusleeping/cbor-gen v0.0.0-20230418232409-daab9ece03a0 // indirect + go.opentelemetry.io/otel v1.15.0 // indirect + go.opentelemetry.io/otel/trace v1.15.0 // indirect go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.9.0 // indirect + go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect - golang.org/x/sys v0.6.0 // indirect + golang.org/x/crypto v0.8.0 // indirect + golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53 // indirect + golang.org/x/sys v0.7.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.30.0 // indirect lukechampine.com/blake3 v1.1.7 // indirect ) diff --git a/go.sum b/go.sum index ae56defbd..dad4a8d01 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 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/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -21,6 +23,8 @@ github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0X github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= @@ -47,6 +51,8 @@ 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/boxo v0.8.0-rc3 h1:rttpGdhLE0zeTec8f2/e5YDgCYzEQf7dI4eRglu2ktc= github.com/ipfs/boxo v0.8.0-rc3/go.mod h1:RIsi4CnTyQ7AUsNn5gXljJYZlQrHBMnJp94p73liFiA= +github.com/ipfs/boxo v0.8.1 h1:3DkKBCK+3rdEB5t77WDShUXXhktYwH99mkAsgajsKrU= +github.com/ipfs/boxo v0.8.1/go.mod h1:xJ2hVb4La5WyD7GvKYE0lq2g1rmQZoCD2K4WNrV6aZI= github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= @@ -61,6 +67,8 @@ github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqg github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.4.0 h1:a4pdZq0sx6ZSxbCizebnKiMCx/xI/aBBFlB73IgH4rA= github.com/ipfs/go-cid v0.4.0/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= @@ -109,6 +117,8 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -129,6 +139,8 @@ github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9t github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= @@ -154,8 +166,12 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= github.com/multiformats/go-multicodec v0.8.1 h1:ycepHwavHafh3grIbR1jIXnKCsFm0fqsfEOsJ8NtKE8= github.com/multiformats/go-multicodec v0.8.1/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= 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= @@ -200,13 +216,20 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.0 h1:ykdZKuQey2zq0yin/l7JOm9Mh+pg72ngYMeB0ABn6q8= github.com/urfave/cli/v2 v2.25.0/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.25.3 h1:VJkt6wvEBOoSjPFQvOkv6iWIrsJyCrKGtCtxXWwmGeY= +github.com/urfave/cli/v2 v2.25.3/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/warpfork/go-testmark v0.11.0 h1:J6LnV8KpceDvo7spaNU4+DauH2n1x+6RaO2rJrmpQ9U= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= @@ -217,6 +240,8 @@ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/S github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20230418232409-daab9ece03a0 h1:XYEgH2nJgsrcrj32p+SAbx6T3s/6QknOXezXtz7kzbg= +github.com/whyrusleeping/cbor-gen v0.0.0-20230418232409-daab9ece03a0/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= @@ -225,8 +250,12 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= +go.opentelemetry.io/otel v1.15.0 h1:NIl24d4eiLJPM0vKn4HjLYM+UZf6gSfi9Z+NmCxkWbk= +go.opentelemetry.io/otel v1.15.0/go.mod h1:qfwLEbWhLPk5gyWrne4XnF0lC8wtywbuJbgfAE3zbek= go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= +go.opentelemetry.io/otel/trace v1.15.0 h1:5Fwje4O2ooOxkfyqI/kJwxWotggDLix4BSAvpE1wlpo= +go.opentelemetry.io/otel/trace v1.15.0/go.mod h1:CUsmE2Ht1CRkvE8OsMESvraoZrrcgD1J2W8GV1ev0Y4= 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.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= @@ -238,6 +267,8 @@ go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKY go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= @@ -252,8 +283,12 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb h1:PaBZQdo+iSDyHT053FjUCgZQ/9uqVwPOcl7KSWhKn6w= golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53 h1:5llv2sWeaMSnA3w2kS57ouQQ4pudlXrR0dCgw51QK9o= +golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -287,6 +322,8 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/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.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -311,6 +348,8 @@ golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNq google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= @@ -321,6 +360,7 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= diff --git a/tooling/car/_fixtures/Makefile b/tooling/car/_fixtures/Makefile new file mode 100644 index 000000000..185016cd4 --- /dev/null +++ b/tooling/car/_fixtures/Makefile @@ -0,0 +1,4 @@ +all: dag.car + +dag.car: + npx ipfs-car pack --no-wrap ./dir --output ./dag.car diff --git a/tooling/car/_fixtures/dag.car b/tooling/car/_fixtures/dag.car new file mode 100644 index 000000000..b2d6a9547 Binary files /dev/null and b/tooling/car/_fixtures/dag.car differ diff --git a/tooling/car/_fixtures/dir/a-file.txt b/tooling/car/_fixtures/dir/a-file.txt new file mode 100644 index 000000000..7ea96d6e6 --- /dev/null +++ b/tooling/car/_fixtures/dir/a-file.txt @@ -0,0 +1,2 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam euismod magna nulla, non mattis dolor faucibus a. Sed at vehicula ligula, vel gravida tortor. Vestibulum blandit tortor id lectus tincidunt porta. Nunc vitae lacinia libero, nec vehicula nisl. Mauris condimentum sit amet quam sed sodales. Nulla ultricies non odio non pharetra. Sed vitae purus semper arcu tincidunt viverra vitae vitae neque. In imperdiet nulla sed nisl viverra bibendum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Praesent cursus nunc in pretium porta. Quisque dapibus magna vel dignissim mattis. Etiam suscipit sodales convallis. In sit amet neque nec ante sollicitudin dictum nec sit amet libero. + diff --git a/tooling/car/_fixtures/dir/b-file.txt b/tooling/car/_fixtures/dir/b-file.txt new file mode 100644 index 000000000..bb73359a0 --- /dev/null +++ b/tooling/car/_fixtures/dir/b-file.txt @@ -0,0 +1,98 @@ +Quisque turpis sem, iaculis at tristique suscipit, consectetur id mi. Nam vehicula massa nec mi rhoncus, sed venenatis nibh scelerisque. Maecenas nec sodales magna, id feugiat mauris. Aliquam tempus at eros ac sagittis. Proin aliquet molestie rutrum. Aliquam nulla leo, dignissim ac laoreet nec, mattis ac eros. Aenean quis felis pretium elit viverra dapibus. Vestibulum commodo, nisl porta rhoncus efficitur, felis leo auctor tellus, at dictum orci elit ut tellus. Sed nec leo quis orci blandit vulputate. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Phasellus efficitur malesuada nisl et vestibulum. Aliquam tristique tellus eget libero facilisis, a aliquet elit sodales. Donec blandit sem risus, at molestie ligula vulputate faucibus. Mauris metus augue, tincidunt a lacus eu, rhoncus dapibus nisl. Suspendisse potenti. + +Phasellus in rhoncus felis. Vestibulum sodales, magna nec ornare placerat, lorem magna gravida neque, vel cursus quam lorem eget nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam consectetur massa eu tortor euismod, vel condimentum est vulputate. Quisque rutrum suscipit nisl, vitae venenatis ligula elementum at. Nunc vitae mollis odio. Quisque varius odio at mi condimentum semper. Cras semper turpis turpis, interdum ultrices dui porttitor eget. Sed et aliquet nulla. Cras quis ante nibh. Aliquam malesuada malesuada molestie. Fusce tincidunt sed ipsum ac hendrerit. Phasellus vestibulum mauris sed massa tincidunt blandit. Donec finibus tellus leo, viverra ornare augue luctus sit amet. Curabitur quis sapien neque. + +Donec dictum augue id lectus molestie dapibus. Fusce at libero vel sem congue semper. Proin vehicula, metus quis semper dignissim, orci nunc congue purus, a tincidunt lacus dolor non velit. Sed consequat vehicula nunc sit amet gravida. Vivamus ac fringilla nibh, ac pulvinar nisl. Suspendisse sagittis commodo condimentum. Praesent commodo in dui lobortis egestas. Pellentesque mollis tincidunt egestas. Nullam maximus pharetra pharetra. Morbi tincidunt elementum ligula. Aliquam erat volutpat. Integer nec rhoncus eros. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Fusce enim eros, tempus at velit id, tempor tristique turpis. + +Nunc at felis vehicula, sollicitudin ex sit amet, maximus enim. Fusce semper sodales dui. Sed sed finibus mi. Praesent semper neque et ex facilisis finibus. Maecenas sit amet orci id felis scelerisque semper in at tortor. Quisque at magna sed nulla placerat dignissim vel sit amet ligula. Ut mattis nunc augue, in vestibulum nunc pulvinar porttitor. + +Maecenas pulvinar dictum sapien. Praesent mattis, elit ac volutpat rhoncus, purus nibh porta ex, quis dictum magna orci id metus. Quisque at lacinia massa, sit amet maximus turpis. Duis nec sem convallis, ullamcorper turpis in, sollicitudin purus. Sed pulvinar placerat bibendum. Donec lobortis urna sit amet tellus semper volutpat. Integer consequat, ipsum vitae tincidunt commodo, lacus lectus porttitor nisi, id accumsan mi enim id turpis. Praesent quis libero mi. Aenean aliquam eu lorem at ullamcorper. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. + +Quisque dapibus felis eu mauris elementum pellentesque. Vestibulum in nisi at lorem tempor pellentesque. Etiam nec turpis lacus. Nulla vel arcu ipsum. In ac nulla et velit tincidunt pharetra. Sed vel nisl orci. Sed tincidunt tempus ex, ut viverra metus finibus nec. Aliquam quis orci mauris. Vestibulum aliquam egestas est vitae euismod. Integer lorem ligula, auctor blandit est eu, consequat sollicitudin turpis. Ut at tortor vulputate, pulvinar ipsum ut, ornare enim. Nam semper turpis ligula, sed tempus nunc venenatis sed. Sed at pellentesque diam. Quisque imperdiet metus dolor, a aliquet risus auctor vulputate. Mauris rutrum diam id nisl efficitur convallis non a augue. Cras pretium lectus arcu, pellentesque pretium libero euismod a. + +Nunc finibus, tortor id dictum scelerisque, massa enim iaculis neque, convallis euismod est tortor sit amet turpis. Integer efficitur scelerisque nisi id convallis. Sed imperdiet quam dolor. Vestibulum vel euismod lectus. Suspendisse sit amet ultrices elit. Etiam rutrum sem velit, non auctor ex hendrerit vel. Aenean convallis diam et neque volutpat, vel consectetur arcu mattis. Mauris vestibulum nibh in hendrerit facilisis. Aenean nunc leo, sollicitudin eget interdum ut, porttitor eget est. + +Nullam efficitur gravida dui, vel mollis dolor venenatis in. Maecenas cursus lorem vel convallis sollicitudin. Cras feugiat viverra porttitor. Aliquam dui tellus, sollicitudin a libero vel, condimentum pulvinar libero. Curabitur id varius orci. Nulla lobortis ipsum nibh, ut tincidunt augue rhoncus id. Nullam vel ipsum ut leo rhoncus imperdiet. Quisque erat odio, placerat a eros id, sollicitudin efficitur nunc. + +Nunc purus enim, placerat dictum porttitor non, auctor vitae nunc. Nulla ac viverra mi. Proin vulputate efficitur tincidunt. Nam sed tincidunt arcu. Nullam fringilla dui et nisi congue imperdiet. Vivamus accumsan at dui quis sagittis. Vivamus nec ligula id metus convallis posuere. Proin consequat mauris sapien, id scelerisque dolor accumsan ultrices. Sed risus ipsum, porta a iaculis et, commodo nec ante. Sed varius, dolor sit amet congue imperdiet, dolor risus aliquet ipsum, tempus hendrerit ex massa a sem. Nunc id ante lorem. Vivamus nec blandit urna. Vestibulum blandit lectus quis neque posuere condimentum. Phasellus eget ante tellus. Cras at augue sit amet lectus consectetur volutpat. + +Vivamus tempor lorem mauris, eu iaculis tortor sagittis id. Morbi tincidunt a sem ut pretium. Suspendisse varius nisi in dolor efficitur, eget iaculis est ultricies. Donec rhoncus porttitor elit, cursus imperdiet ligula. Pellentesque pretium viverra tempus. Vivamus euismod enim metus, malesuada dapibus dui porta eu. Sed ultricies neque nec nisi viverra sodales. Suspendisse a nulla pulvinar, malesuada lectus non, rhoncus nisi. Aenean feugiat et leo et vestibulum. + +Donec scelerisque scelerisque ligula, eget pretium diam condimentum quis. Donec a tellus diam. Nunc sed dolor in nunc convallis tincidunt quis eu odio. Aenean id egestas purus. Nullam nisi lectus, volutpat sed consectetur sagittis, feugiat id neque. Curabitur dui dui, tincidunt non diam vel, ultricies maximus lorem. Nunc hendrerit nec erat at rhoncus. Praesent porttitor interdum mauris, eu rhoncus quam fringilla non. Ut maximus congue rhoncus. Proin varius auctor lectus ac posuere. Fusce fermentum at dolor ut viverra. Pellentesque consectetur ornare enim vitae accumsan. Sed vel viverra eros. Donec in dictum felis. + +Nullam feugiat metus diam, quis commodo erat posuere auctor. Maecenas accumsan eu magna rhoncus mattis. Vivamus nec lacinia odio. Pellentesque a pharetra mauris. Suspendisse tempus, nulla a facilisis placerat, nunc massa auctor dui, sit amet imperdiet erat risus eu mi. Vestibulum viverra in nulla sit amet ullamcorper. Praesent tristique urna nec ipsum finibus, eu bibendum est dictum. Etiam nec elit non nulla pretium consectetur. Curabitur massa felis, hendrerit et nulla vel, convallis mollis tortor. Proin libero leo, aliquam vitae quam eu, mattis pharetra felis. + +Suspendisse maximus vehicula neque quis bibendum. Integer cursus, urna a mattis vehicula, tortor neque eleifend quam, sit amet ornare mauris purus sit amet nibh. Sed mollis arcu arcu, ut consequat enim convallis ut. Etiam vel ex vel elit lacinia vehicula. In lacinia quis quam ac aliquam. Suspendisse quis condimentum nisi. Donec venenatis facilisis orci, ut sagittis lorem sagittis eget. Duis arcu odio, vehicula quis turpis nec, finibus pretium magna. Nunc maximus, arcu in sagittis iaculis, risus neque consequat justo, ut dapibus lacus orci id tortor. Aenean eleifend condimentum ornare. + +Ut dolor justo, malesuada vitae ex id, aliquet volutpat eros. Curabitur tempus quam orci, id varius lacus gravida et. In ut interdum elit, vel sodales nibh. Nunc venenatis sodales euismod. Morbi pretium ante efficitur purus convallis luctus. Ut id posuere lectus. Duis condimentum sapien metus, imperdiet pretium augue convallis at. In molestie, tortor eget ultrices lacinia, ipsum nulla lacinia turpis, nec pharetra enim ante sed orci. + +Mauris convallis lacus nec est facilisis tincidunt. Sed pretium quis lacus sit amet finibus. Nunc molestie velit eu est sodales vestibulum. Phasellus libero diam, auctor et luctus sed, ornare in lacus. Vivamus vulputate neque sed tempus accumsan. Donec luctus imperdiet neque molestie sollicitudin. Ut ac dapibus sapien. Suspendisse porta ac felis laoreet faucibus. Suspendisse ante est, ultricies sagittis porttitor scelerisque, gravida vel arcu. Duis hendrerit augue sit amet neque mattis, sed efficitur nibh efficitur. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas tristique velit egestas accumsan hendrerit. Donec dapibus aliquet tellus nec porta. + +Vestibulum ipsum lectus, aliquet a eleifend vitae, feugiat eget magna. Nullam ullamcorper leo velit. Suspendisse auctor orci neque, at convallis turpis tincidunt ac. In molestie, tellus a posuere sagittis, nibh ipsum sagittis nunc, nec tempus enim neque non odio. Aliquam blandit pulvinar arcu consequat faucibus. Duis vitae efficitur urna. Ut vel hendrerit sapien. Cras est diam, imperdiet sed lacus et, accumsan hendrerit nulla. Vestibulum varius urna cursus tortor accumsan rhoncus. Integer laoreet tortor at eros faucibus, in malesuada odio aliquet. Curabitur sit amet feugiat justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer viverra metus in nisi molestie congue. Duis ultrices a libero sed tristique. + +Aenean sed lacus finibus, aliquet magna ut, rhoncus arcu. Sed consequat consectetur mauris, vel euismod dolor. Donec non tincidunt magna. Nam ultrices luctus eros, et ultrices dui pretium a. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc molestie dictum efficitur. Sed interdum, quam vitae ultricies lobortis, diam dolor fermentum eros, ut vulputate erat erat nec lectus. Proin eu eleifend elit, vitae porta mauris. Duis accumsan viverra fermentum. Nam in libero enim. Donec posuere consectetur velit, ut rhoncus erat finibus vitae. + +Nullam vel pretium dui, sit amet tristique tellus. Suspendisse ut enim nisl. Maecenas mauris augue, volutpat non scelerisque non, imperdiet a odio. Aliquam sed justo in ante lobortis ultricies. Curabitur enim odio, porttitor in eleifend vel, auctor vel turpis. Donec in nisl eros. Nunc eget quam vitae purus lobortis sollicitudin nec sit amet nunc. Etiam gravida ligula in est eleifend vulputate. Praesent venenatis nisl at vehicula porta. Fusce maximus elit ac leo sodales, semper dapibus mi tristique. + +Nunc rutrum in dui ut tincidunt. Fusce odio ex, suscipit eget velit eget, iaculis cursus augue. Pellentesque at sapien mollis, tempor enim vitae, aliquet orci. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam dignissim pharetra dignissim. Curabitur porta neque tincidunt molestie tincidunt. Morbi volutpat nunc a nisi iaculis facilisis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris risus nisi, blandit ut nunc sed, vulputate pretium velit. Maecenas vel erat ligula. In at nibh vel leo lobortis porttitor. Sed luctus nec tellus a egestas. Proin ac odio faucibus, placerat augue sed, accumsan nisi. Suspendisse potenti. + +Phasellus malesuada, ligula ac consequat scelerisque, dui risus venenatis odio, ut maximus neque orci non nisl. Praesent ac odio erat. Phasellus id lacus non elit rutrum suscipit. Aliquam vestibulum turpis eget tellus rhoncus, ac lobortis nibh maximus. Aliquam laoreet odio nec mi posuere, id dapibus nisi accumsan. Integer dignissim ligula at sapien iaculis varius. Aenean condimentum malesuada mollis. + +Vestibulum fermentum ultricies velit. Donec pulvinar orci quis sodales porttitor. Quisque ornare, magna a imperdiet tristique, ante nisl ultricies ex, eu volutpat leo leo in nunc. Etiam orci elit, porta et aliquet vitae, auctor in nunc. Fusce feugiat eget purus in vestibulum. Phasellus rutrum odio eu porttitor vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus porttitor mauris id nisl pretium, nec consectetur dolor sodales. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +Donec eget ipsum est. Praesent sed mi at nisi dapibus faucibus. Proin cursus nisl ac ligula ultricies, non luctus turpis consequat. Nunc at finibus est. Nunc non nulla eget tellus tempus laoreet. Phasellus aliquam odio non urna dictum, a sodales metus varius. Quisque iaculis nulla sit amet tortor porta, ac luctus risus vulputate. Donec vitae ipsum finibus, condimentum lorem nec, aliquet ex. Nulla facilisi. Nunc eget egestas magna. Etiam sollicitudin justo risus, a tempus tellus mattis ut. Pellentesque diam urna, dictum non leo quis, placerat accumsan ex. Etiam pellentesque, ligula in viverra placerat, ipsum turpis porta ligula, at rutrum erat leo et ante. Vivamus purus ipsum, ornare nec dapibus at, ultricies vel elit. Proin eros arcu, gravida sagittis felis id, eleifend bibendum nulla. Aliquam tincidunt scelerisque ante, ac ullamcorper ex varius a. + +Nulla lobortis viverra lectus vitae commodo. Cras ut elit sit amet purus laoreet sodales. Phasellus euismod volutpat sem, ut venenatis tortor hendrerit mattis. Etiam scelerisque, lectus sed volutpat commodo, purus nisl luctus urna, eu gravida magna tellus ac felis. Curabitur iaculis, massa nec accumsan fermentum, arcu neque lobortis elit, non sagittis elit mi non diam. Curabitur vehicula lectus tellus, viverra mattis mi lacinia in. Duis sit amet fringilla dui. Nulla gravida volutpat faucibus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur condimentum tristique leo fringilla euismod. Suspendisse aliquet consequat tortor. Vivamus aliquet neque in nulla sodales hendrerit. + +Aenean auctor ex ac auctor porta. Nunc faucibus malesuada quam, pharetra suscipit est. Suspendisse blandit iaculis neque id suscipit. Sed bibendum ac dui aliquam lacinia. Ut ex nibh, consectetur ac felis sed, auctor suscipit ipsum. Morbi at lacinia augue. Cras enim lectus, sollicitudin ultrices consectetur id, mollis vitae ex. Nulla rutrum dolor sit amet risus convallis, eu tempus tortor lobortis. Ut quis commodo sapien. Ut interdum libero euismod vulputate vulputate. Aliquam dolor nunc, elementum sed elementum eu, condimentum in nulla. Curabitur faucibus fermentum tellus a consectetur. Nullam sit amet ultrices neque. Cras dictum molestie nisl, eget rutrum metus ornare et. + +Integer ut tempus leo. Vestibulum ultricies tortor nec tortor lacinia porttitor. Curabitur rutrum imperdiet cursus. Pellentesque tristique enim eget egestas aliquam. Aliquam mi lectus, consequat nec finibus eu, vehicula vitae lacus. Pellentesque sit amet rhoncus orci. Sed a est sem. Sed bibendum neque in tellus consectetur consectetur. Integer ac nisi et nisi tincidunt varius. Nam sed vulputate eros. Morbi a tellus suscipit, interdum purus quis, fringilla velit. In erat urna, pellentesque sit amet lectus et, faucibus facilisis risus. Etiam et vulputate massa, at tempor lacus. Ut enim erat, rutrum ut semper sed, congue sed leo. Ut id lobortis velit, vitae lacinia risus. + +Proin nulla nisi, aliquet eget nunc et, suscipit egestas est. Proin vehicula, augue eu congue sagittis, velit libero volutpat mauris, et convallis dolor dolor ac tellus. Maecenas ullamcorper congue elit. Nullam interdum imperdiet dignissim. Donec ac ante fermentum, ultrices ligula et, luctus augue. Pellentesque dignissim nulla purus, vitae egestas mi maximus eget. In hac habitasse platea dictumst. Pellentesque eget ante arcu. Nulla facilisi. + +Quisque mattis dictum elit, ultrices aliquam velit porta id. Maecenas bibendum diam ut sapien fermentum mollis. Curabitur facilisis quam vel massa mattis, a laoreet ligula luctus. Maecenas tincidunt faucibus orci ut iaculis. Etiam blandit faucibus dolor in ultrices. Fusce malesuada pretium tortor eu ultricies. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque sit amet orci mollis, fringilla massa a, eleifend nibh. + +Nullam sed nunc ante. Fusce eleifend lorem ut egestas accumsan. Etiam consequat non augue sed fringilla. Maecenas rutrum orci non convallis molestie. Donec lacinia felis eget libero egestas, a rutrum nibh feugiat. Curabitur vestibulum felis quam, in auctor arcu finibus quis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mi justo, posuere et dictum in, commodo a urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; + +Quisque ex diam, consequat vel arcu non, eleifend commodo odio. Donec eget erat est. Mauris pellentesque blandit orci in venenatis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque malesuada mauris in dignissim. Sed lacus urna, aliquam non eros eu, dapibus porttitor metus. Duis nec ipsum mauris. Praesent placerat ultrices tempus. Donec vulputate aliquam nibh eu tincidunt. Donec ut turpis vehicula quam fringilla ultrices ut id nulla. Suspendisse potenti. Cras non pharetra ante, et mattis augue. Nam interdum sed sapien sit amet ultricies. Nullam et tellus nec mauris tempor venenatis. Integer cursus quam sit amet augue iaculis tempor. Sed tincidunt diam sed tellus facilisis elementum. + +Praesent rhoncus dolor a quam volutpat gravida. Aenean imperdiet sapien ac libero condimentum efficitur. Donec eget gravida nibh. Nulla pretium condimentum fermentum. Aenean vitae facilisis libero. Aliquam tincidunt metus non augue dapibus interdum. Donec vel dignissim enim, ac maximus enim. Vestibulum tincidunt, lorem at vestibulum condimentum, ipsum lorem elementum augue, at efficitur nisi metus vel diam. Maecenas pharetra sapien vel massa sollicitudin ultricies. Donec ac dui fringilla, congue velit at, condimentum sapien. Nullam commodo sem enim, non mollis ante volutpat quis. Maecenas at rhoncus sapien. Proin suscipit velit sapien, eget accumsan sapien bibendum varius. + +Aenean pellentesque tortor sed tempus elementum. Donec finibus iaculis sem, ac molestie erat consequat vel. Sed quis lobortis ante. Vivamus pellentesque ligula at enim lobortis bibendum. Curabitur aliquet, orci quis ultricies dignissim, purus justo maximus odio, in placerat lectus turpis convallis ante. Nulla facilisi. Aliquam bibendum volutpat scelerisque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed at arcu ullamcorper, tristique ligula sed, commodo urna. Proin vel volutpat leo. Aenean quis lorem non nisl luctus volutpat vel at orci. Sed et sem nec nisl aliquet commodo. Fusce lectus odio, molestie in lacus efficitur, aliquam sollicitudin nisi. Aliquam rutrum sapien nec turpis bibendum porta. Donec cursus malesuada tellus, quis cursus dui tincidunt non. + +Aenean efficitur vehicula iaculis. Etiam egestas urna massa, ac mattis nunc volutpat id. Nullam pharetra rutrum tortor, quis semper lacus pellentesque ut. Nullam rhoncus varius lacus ut luctus. Nunc bibendum posuere justo eu tincidunt. Nulla in ex nec eros imperdiet gravida sed quis nisi. Nam ac urna id dolor maximus gravida. + +Nulla convallis lacinia justo, nec bibendum purus finibus sit amet. Nullam felis lectus, elementum convallis consectetur sed, faucibus a lorem. Pellentesque quis mi eu odio iaculis pharetra. Quisque non neque vulputate, auctor augue et, pellentesque nunc. Fusce sodales feugiat auctor. Aliquam ante velit, fringilla egestas lacus convallis, rutrum auctor lacus. Phasellus id tellus nec neque luctus bibendum. In nibh enim, ultricies sed dui bibendum, viverra aliquam elit. Praesent feugiat, sapien eu bibendum tincidunt, lorem est vulputate mi, vitae consectetur dui tellus eu metus. Aliquam quis quam quis quam rutrum tempus id ut lorem. Proin eget bibendum mi. + +Sed a orci ligula. Pellentesque congue feugiat urna, eget pretium urna venenatis at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas ipsum dolor, ultricies sit amet aliquet sed, ullamcorper vitae massa. Ut viverra posuere felis, quis tempus lacus sodales eget. Curabitur consectetur orci mi, ut venenatis tellus aliquam sed. Vestibulum non magna ipsum. + +Nullam non commodo dolor. In bibendum, felis vel pretium dignissim, tellus arcu ultricies diam, porta aliquet velit sapien non justo. Nullam ipsum tortor, bibendum vitae tristique sit amet, interdum sed eros. Pellentesque sodales, lectus varius gravida porttitor, diam est ultricies mi, sit amet ultricies tortor nulla sed metus. Mauris maximus metus eu auctor accumsan. Phasellus sit amet mi rhoncus, convallis neque in, lacinia nisl. Mauris non tortor hendrerit, imperdiet lorem et, gravida nunc. Nunc vitae mauris feugiat, suscipit arcu eu, elementum justo. Aenean turpis velit, condimentum quis dictum porta, cursus consequat arcu. Donec consequat felis quis erat laoreet, accumsan lacinia neque faucibus. Ut laoreet elit sit amet dapibus auctor. + +Duis feugiat, nisi sed fermentum venenatis, sem libero elementum est, eu tristique sapien nunc vitae nisi. Suspendisse tempor blandit mi, vitae tristique nulla eleifend ut. Quisque at nisl in ligula tempus placerat id ac ante. Curabitur aliquet pretium suscipit. In ut nunc quis arcu mattis tempor. In lectus massa, vestibulum venenatis augue sit amet, ultrices semper quam. Ut ac mauris convallis, euismod metus et, feugiat nibh. Sed a lacus faucibus, pulvinar odio vel, fringilla augue. Vestibulum mollis nibh in nisl sagittis, vel porta libero consequat. Quisque sollicitudin scelerisque condimentum. Aenean a orci at purus gravida feugiat. + +Suspendisse ultrices consectetur velit quis pulvinar. Mauris id quam metus. Suspendisse velit magna, elementum at augue eget, pellentesque aliquam quam. Nam rhoncus sapien at risus vehicula, sit amet aliquam elit pharetra. Donec et sapien consequat, accumsan dui id, tempus sem. Ut euismod tellus arcu, ultrices facilisis elit viverra eu. Morbi rutrum quam eu leo aliquet aliquet. Vivamus nec eros est. Praesent sit amet mi at eros malesuada posuere. Morbi elementum dictum risus, a vulputate purus sagittis nec. Nam malesuada a quam at lacinia. Aenean nec dictum nulla. + +Vestibulum quis ex nec dui faucibus imperdiet eu in tortor. Curabitur lacinia diam at eros auctor venenatis pulvinar eget ligula. Duis imperdiet, odio id dapibus fermentum, felis ex scelerisque risus, a tristique sem dolor et urna. Morbi cursus lectus vel diam consequat, in bibendum ipsum laoreet. Maecenas blandit condimentum condimentum. Phasellus non mauris quam. Aenean convallis ultricies libero. Aliquam erat volutpat. Suspendisse eu erat a felis dapibus dapibus quis sit amet ligula. Aenean tristique condimentum placerat. Suspendisse consequat, dui quis semper fringilla, massa orci cursus ex, in dignissim felis ex posuere sapien. Sed quam leo, gravida vel lacus id, commodo dignissim velit. Etiam ultrices nisl non odio consequat accumsan. + +Donec rhoncus erat ut sem elementum sagittis non at dolor. Aenean ut libero tincidunt, tempus massa ac, volutpat magna. Nulla malesuada vel ligula quis feugiat. Proin at nisl in quam accumsan sagittis ac non nibh. Fusce ullamcorper ex purus. Nullam non dui in neque tristique ullamcorper. Proin in sapien ante. Nam ex massa, pharetra vel ligula et, vulputate vestibulum tellus. + +Curabitur ex dui, varius eget sodales at, bibendum quis ante. Curabitur odio tellus, venenatis non risus vitae, elementum sollicitudin ante. Nulla mollis mollis lorem, quis molestie dui aliquet a. Sed imperdiet nunc at eros sagittis volutpat. Pellentesque maximus urna in congue auctor. Sed turpis libero, mattis at dui non, vestibulum suscipit mauris. Vivamus ut bibendum sapien, vitae varius massa. Suspendisse et egestas sapien, elementum posuere dui. Maecenas sit amet ex fermentum, egestas augue ut, pretium velit. Sed vulputate consectetur justo ac consectetur. Sed eget felis tincidunt metus mollis ullamcorper nec quis purus. Donec commodo magna bibendum neque gravida varius. Donec metus nulla, aliquet sit amet porta et, ornare at arcu. In hac habitasse platea dictumst. Nullam accumsan, augue id lobortis convallis, arcu nisi elementum est, non scelerisque turpis sapien at felis. + +Proin aliquet nisl risus, sit amet luctus augue euismod tristique. Nunc et ipsum hendrerit, venenatis lacus ac, ornare eros. Nullam non nibh sapien. Donec tincidunt ac leo a eleifend. Suspendisse luctus sem lectus, vel facilisis risus tempus aliquet. Nullam at arcu in risus porta finibus at mollis erat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. + +Morbi sem quam, laoreet a malesuada a, dignissim rhoncus nulla. Maecenas a mauris ut sapien tincidunt lacinia sit amet ac diam. Donec tortor quam, venenatis et interdum sed, luctus eu mauris. Sed vestibulum justo id interdum auctor. Vivamus convallis quam et molestie fringilla. Donec at ex sem. Mauris in tortor molestie, hendrerit diam non, semper neque. Integer ut massa augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Morbi eget felis fringilla, scelerisque odio eu, lacinia ipsum. + +Donec egestas neque magna, non imperdiet diam sagittis nec. Nam venenatis nec dui in pulvinar. Praesent vel metus consequat, tempor ex in, porta metus. Etiam lacinia enim id semper lacinia. Maecenas egestas tellus quis enim auctor accumsan. Etiam lacus felis, blandit ac arcu sed, egestas commodo nisl. Integer lobortis sem varius neque dictum sagittis. Sed iaculis dapibus sem sit amet varius. In hac habitasse platea dictumst. Phasellus lacinia erat ut facilisis rhoncus. Donec sed purus vitae odio sollicitudin bibendum. Aenean nec arcu eu ligula fringilla pulvinar. + +Maecenas risus arcu, vehicula ac sapien id, tincidunt commodo enim. Sed maximus, arcu sed ornare sodales, ligula leo lobortis quam, ac luctus nisl nisl id arcu. Nam pulvinar, enim id molestie egestas, leo ligula maximus justo, quis lobortis diam neque ut turpis. Integer eu lorem suscipit, efficitur ligula ut, imperdiet elit. Nulla ultricies id lectus ac tristique. Nullam velit sapien, aliquam in velit nec, pellentesque eleifend risus. Sed vitae turpis luctus, rutrum dolor sed, porta erat. Cras urna nisl, suscipit ac faucibus ut, consectetur et lorem. Ut ut leo ac odio faucibus sagittis. In convallis neque tellus, at finibus neque efficitur ut. Sed egestas mi leo, quis euismod neque volutpat rutrum. Suspendisse nec ex vel risus cursus fermentum. Sed scelerisque in turpis nec dignissim. Aenean lacinia malesuada porta. + +Sed metus massa, congue ut sodales suscipit, hendrerit vestibulum nisi. Nullam rutrum tempor vulputate. Cras pulvinar dignissim orci vitae accumsan. Fusce eu faucibus augue. Phasellus condimentum lectus a nibh tempor porttitor. Curabitur hendrerit augue et vehicula ultrices. Aliquam nec massa interdum, ultricies dui at, venenatis nisi. Donec ac aliquam magna. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec dictum enim nulla, vitae faucibus nulla sodales vel. Vestibulum laoreet libero in eros ullamcorper commodo nec et ex. Sed commodo semper dignissim. Donec ullamcorper nulla bibendum diam ullamcorper sagittis. Nam lacinia lectus non commodo congue. + +Suspendisse potenti. Nulla tincidunt magna nec elit ornare semper. In lectus erat, dignissim ac viverra non, euismod non augue. Maecenas feugiat, elit eget ultrices tristique, sem lorem sodales erat, quis luctus orci nulla in mi. Ut vestibulum velit porttitor arcu venenatis, sit amet convallis arcu commodo. Suspendisse finibus tempus erat. Donec ut feugiat ex. Pellentesque facilisis erat dictum tortor dictum, et auctor risus facilisis. Proin sit amet mauris felis. Integer consectetur quis nulla nec finibus. + +Pellentesque justo metus, venenatis a vulputate ut, luctus non tortor. Maecenas consequat justo vel laoreet interdum. Etiam cursus scelerisque tellus, vel rhoncus tortor accumsan et. Phasellus quis luctus diam, ut euismod tortor. Cras vel lectus id libero malesuada hendrerit. Nullam egestas ipsum eu pretium venenatis. Donec eget fermentum nunc, eget tincidunt nulla. Nullam neque ex, lacinia eu eleifend eget, dignissim eu nulla. Quisque fringilla posuere ornare. Curabitur felis urna, sollicitudin ac augue sed, venenatis aliquet ipsum. Mauris consectetur odio sit amet nunc tempus, sed aliquam lorem pellentesque. Etiam est felis, elementum ultricies tincidunt at, bibendum eu ex. + +Nam lacinia enim at lorem condimentum, at sagittis libero mollis. Nullam ligula nisi, auctor et pharetra at, ornare in eros. Nam non risus pharetra, condimentum eros a, tincidunt augue. Mauris vitae ex odio. Nam pharetra suscipit nisl, in vulputate quam imperdiet nec. Duis ornare tincidunt lectus, at tempor odio vehicula a. Curabitur vestibulum lorem purus, at faucibus ipsum interdum sed. Sed vel mauris quis urna facilisis tincidunt non et nibh. Sed sit amet laoreet est. Donec a posuere tellus, elementum gravida est. Phasellus sit amet dignissim sem. Etiam et sem non ex pharetra efficitur in blandit arcu. Sed et libero eget turpis lacinia finibus. Nunc et aliquet enim. + +Ut hendrerit nisi vel diam vehicula, eu fermentum nunc rhoncus. Nullam fringilla ex viverra lobortis aliquam. Vestibulum a turpis purus. Praesent condimentum mauris quis neque porta mollis. Pellentesque aliquam mollis finibus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam aliquet metus vel magna dapibus, eu lobortis ipsum dictum. Maecenas maximus libero non mi ornare semper. Etiam eget pharetra neque, quis mollis libero. Nam quis leo nec justo suscipit egestas non in ante. Ut dignissim ante augue, in iaculis mauris ornare sit amet. Fusce at tincidunt lacus. Aenean et blandit ex. + diff --git a/tooling/car/_fixtures/dir/subdir/leaf.txt b/tooling/car/_fixtures/dir/subdir/leaf.txt new file mode 100644 index 000000000..8bcb582b5 --- /dev/null +++ b/tooling/car/_fixtures/dir/subdir/leaf.txt @@ -0,0 +1,100 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ac varius sapien. Aliquam sit amet pulvinar mauris, non facilisis mauris. In felis dolor, pulvinar eget pretium non, accumsan eu mi. In nec ligula condimentum, imperdiet felis et, tristique arcu. Fusce tellus erat, imperdiet sit amet ante id, varius auctor justo. In fringilla orci in est tincidunt, non euismod risus suscipit. Morbi risus purus, mollis ut diam sit amet, condimentum molestie massa. Pellentesque tristique, diam a sollicitudin rhoncus, velit mi laoreet diam, in vulputate tellus ex at diam. Morbi urna massa, sodales et felis sed, vestibulum faucibus arcu. Mauris egestas neque nec tortor rutrum pretium. Ut ullamcorper id lacus nec euismod. Mauris enim lorem, maximus aliquet egestas non, consectetur id mauris. Donec consectetur diam ut luctus posuere. Donec cursus suscipit sapien ut finibus. Cras sed sem venenatis, gravida erat ac, elementum quam. + +Sed tellus lacus, tristique id eleifend eget, aliquam sed nibh. Praesent aliquam, arcu et scelerisque facilisis, nisl sem molestie dolor, convallis maximus neque purus eget lectus. Nam urna eros, euismod fringilla congue nec, tristique at diam. In convallis consectetur mollis. Nullam purus metus, porta congue cursus quis, pellentesque at mi. Duis vel imperdiet nunc. Donec convallis vel est at dictum. Nam finibus at tortor vel cursus. Nullam viverra fringilla libero at aliquet. Sed dignissim ultrices massa non pulvinar. Maecenas ornare ac elit non finibus. Nunc dapibus eros vel ornare venenatis. Morbi lobortis eros ac odio condimentum, in facilisis elit molestie. Nam feugiat est nisl, vestibulum condimentum enim sagittis at. Duis eget lorem quis ex cursus vestibulum. Pellentesque euismod odio ac rutrum fringilla. + +Curabitur suscipit mollis felis, vel sodales sem elementum vitae. Nulla ut tristique sapien. Donec ut lectus sed felis tincidunt feugiat. Nunc et placerat purus. Pellentesque a consectetur neque, vel rhoncus tellus. Donec ex ligula, laoreet a luctus eu, lacinia id lectus. Fusce risus massa, tincidunt at elementum id, mattis id turpis. Curabitur pretium velit sed dui sollicitudin volutpat. Nullam ut leo id urna volutpat suscipit a ac purus. + +Pellentesque id pharetra magna. Proin a dictum lacus, a lobortis ligula. Nam fringilla hendrerit commodo. Praesent sed nulla id nulla luctus pulvinar et in nulla. Curabitur sodales, urna sed vehicula imperdiet, nisi est pulvinar tellus, vitae volutpat nunc felis sed dui. Curabitur sagittis gravida est a laoreet. Nunc tempus ligula eget luctus maximus. Fusce laoreet justo non risus vulputate porttitor. Sed sed magna non risus viverra faucibus sit amet vitae mauris. Sed in nisi ac enim tristique commodo vitae sed lorem. Aliquam mollis turpis eget arcu consectetur hendrerit. Sed eleifend, diam eu interdum sodales, metus odio vulputate justo, convallis tempor quam ex et orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris volutpat ornare ante. + +Donec egestas neque a turpis eleifend egestas. Mauris ultricies risus sed odio facilisis vehicula. Curabitur scelerisque tellus ornare lectus mollis consectetur. Sed dignissim vitae orci et scelerisque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Cras mollis purus sed felis malesuada fermentum. Vivamus lectus quam, iaculis quis sagittis ac, hendrerit ornare neque. Sed at consequat massa, id porta nisl. Integer sagittis dolor sed euismod scelerisque. Integer porttitor aliquam arcu. Nam quam ligula, pretium eu felis et, lacinia pharetra sapien. Donec metus mauris, accumsan non finibus non, vulputate pretium augue. + +Integer ultrices felis et purus tempus pretium. Nullam auctor diam at lectus consequat, sit amet dapibus felis congue. Curabitur tristique justo tellus, et vulputate ipsum facilisis non. Nam gravida odio dapibus pharetra suscipit. Phasellus lacus eros, bibendum eu venenatis nec, rhoncus at metus. Integer mauris tellus, porttitor nec euismod ac, volutpat sit amet quam. Sed at mauris sit amet est ultrices finibus. + +Nunc urna lectus, dignissim sed lorem ac, aliquet vestibulum quam. Aliquam scelerisque tempor arcu, sit amet hendrerit velit elementum vel. Integer in risus vestibulum libero iaculis egestas. Morbi venenatis a massa et rutrum. Nullam fermentum dui vitae enim faucibus, maximus placerat nisl venenatis. Pellentesque varius elit ac risus interdum, eu porttitor dolor vestibulum. Vivamus tincidunt neque a turpis sodales, a sollicitudin mi mattis. + +Nunc sed justo dolor. Morbi volutpat facilisis tellus, eleifend placerat tortor molestie sed. Nunc libero odio, tempus eget mi vel, eleifend venenatis ante. Nullam ac lacus justo. Nulla facilisi. Vivamus mattis ornare quam. Fusce accumsan orci lobortis, facilisis ligula quis, venenatis leo. Nam non felis at ex vestibulum fermentum non et mi. Duis nisl eros, tincidunt vitae porta eget, aliquet et felis. Fusce eu sem metus. Sed vel massa aliquet, pharetra nisl at, gravida urna. Nullam eu mollis massa, at elementum massa. Nunc erat lacus, pharetra ac ullamcorper non, fermentum in nunc. + +Vivamus nec justo sed risus maximus dapibus a eu orci. Mauris viverra maximus eros, at blandit nibh. Nullam bibendum magna in fringilla euismod. Nunc quis ex dapibus, volutpat ex non, iaculis neque. Duis rutrum enim nec sapien elementum, a fringilla erat facilisis. Ut vel euismod metus, non tempor lorem. Vestibulum aliquet tempus ipsum, et imperdiet magna egestas condimentum. Proin at felis mattis, elementum massa quis, ornare eros. Sed a mauris ac mauris lacinia convallis. Aenean egestas gravida risus vitae hendrerit. Donec vel aliquam nibh. Mauris in luctus nulla. Donec viverra quam vitae ornare convallis. Praesent ut enim eget nisi rutrum luctus. Curabitur laoreet mollis tellus, nec congue ante consequat euismod. Proin molestie fermentum odio in iaculis. + +In hac habitasse platea dictumst. Etiam rhoncus augue a scelerisque convallis. Donec eu varius nulla, venenatis commodo diam. Praesent a convallis urna. Aenean elementum felis nisl, sit amet auctor nulla dignissim fringilla. Nam molestie quam in odio sodales gravida. Pellentesque blandit vitae quam sed tincidunt. Phasellus gravida, turpis ac tincidunt venenatis, ex lectus rutrum diam, nec pharetra dui purus in dui. + +Vestibulum pharetra a lorem non vestibulum. Curabitur efficitur aliquet lorem, id tempor felis congue eu. Aliquam nec turpis at neque hendrerit blandit. Sed quam libero, interdum id fermentum ac, scelerisque nec ligula. Ut ipsum massa, pellentesque hendrerit risus lacinia, malesuada malesuada urna. Suspendisse tristique risus vel quam lacinia, quis rhoncus augue egestas. Fusce sed laoreet ante. Cras sed porta sem. Pellentesque vel fermentum est, ac sollicitudin dolor. Integer lacinia finibus porta. Nulla sed nulla nec dolor viverra gravida. Mauris at tristique ex, sed dictum lorem. Pellentesque bibendum consequat libero, nec porttitor dolor varius a. Praesent dictum tellus non lacus rutrum faucibus. Nunc aliquam dignissim massa. In vestibulum odio libero, vel porttitor ex tincidunt sit amet. + +Nullam scelerisque orci arcu, a mattis odio laoreet eget. Morbi ultrices, lectus et tincidunt hendrerit, velit nisi ullamcorper magna, a vestibulum ipsum elit eget urna. Nulla sit amet suscipit dolor. Aenean dapibus ipsum eget arcu commodo auctor. Curabitur dolor libero, aliquet in rhoncus porttitor, euismod vel nulla. Maecenas varius efficitur libero id vestibulum. Vivamus ac lorem mi. Mauris vulputate auctor maximus. Maecenas auctor faucibus augue, eget congue magna venenatis quis. Praesent felis nunc, facilisis non libero eu, pharetra vestibulum mauris. Morbi felis ante, pellentesque at augue vel, faucibus venenatis elit. Cras aliquam, nisi a tempus tempor, lorem ipsum pretium neque, ac varius neque enim id turpis. Proin mi lorem, ultrices et scelerisque sit amet, tincidunt at est. Nulla ac risus maximus, sollicitudin orci ac, scelerisque felis. Duis ullamcorper mauris a dictum varius. + +Sed eget malesuada eros. Fusce ac leo gravida, feugiat tellus quis, ultricies lacus. Nulla lorem nunc, molestie et magna nec, dictum cursus orci. Nunc imperdiet, purus eget gravida hendrerit, turpis neque maximus arcu, quis consectetur quam justo a ante. Praesent dui enim, venenatis eget nibh vitae, faucibus fringilla ex. Nam sed lacus eu dui viverra dignissim. Proin consectetur eros non libero pellentesque finibus. Donec et finibus quam, vitae iaculis lacus. Maecenas ultricies urna lobortis semper auctor. Aliquam erat volutpat. Nulla erat turpis, consectetur id bibendum in, cursus vehicula arcu. Quisque lectus mauris, bibendum tempor lacinia quis, hendrerit eleifend tortor. Donec et orci quis nunc mollis ornare. Integer ut sem at nisl elementum gravida a ac lacus. Praesent et auctor arcu, eu ultrices elit. + +Morbi vel dapibus eros, ac semper diam. Mauris quis turpis magna. Fusce interdum metus in turpis sodales malesuada. Curabitur ac porttitor eros. Donec non velit at sapien commodo feugiat. Donec auctor molestie rutrum. Duis laoreet suscipit mi, vitae ornare nisi efficitur eu. Nunc luctus urna at gravida venenatis. Integer elit mauris, finibus sit amet pulvinar sed, sodales ac nulla. Nulla a luctus libero, eget rutrum dui. + +Sed a augue quam. Sed rhoncus imperdiet tellus, id congue purus egestas id. Integer tincidunt quam sed gravida lobortis. Nulla hendrerit, ipsum non lacinia ultricies, risus purus dignissim neque, a consectetur lectus nibh quis lectus. Integer mollis tellus vitae auctor imperdiet. Sed accumsan pellentesque orci eget venenatis. Fusce efficitur venenatis mauris sit amet feugiat. Suspendisse ac felis libero. + +Etiam erat sem, tristique id feugiat eget, porta id purus. Nullam mauris ex, molestie eget pretium eu, euismod quis lorem. Mauris ac elementum libero, id lacinia lectus. Maecenas ipsum ipsum, sodales nec consectetur ut, elementum vel metus. Integer finibus, metus ut gravida hendrerit, orci nisl luctus nunc, et egestas enim quam condimentum leo. Etiam id rutrum magna, sit amet iaculis nibh. Cras eget dolor quis magna sollicitudin suscipit efficitur in orci. Quisque sed justo sed libero hendrerit tincidunt vel sed orci. Vestibulum varius eros id neque sodales eleifend. Aliquam erat volutpat. Mauris sit amet mauris diam. Suspendisse vel placerat diam, at tempus odio. Cras pharetra dictum blandit. Donec rutrum, nunc vehicula varius imperdiet, nibh mi pellentesque magna, a faucibus ante sapien non lacus. + +Sed quis lacus varius, mollis urna non, consequat justo. Suspendisse dui enim, efficitur quis ante vel, cursus sollicitudin lectus. Suspendisse maximus, mi eu mollis semper, ipsum dui placerat ex, quis volutpat nulla dolor eu nibh. Integer accumsan velit ut velit faucibus, quis faucibus nulla elementum. Maecenas at nibh sed velit sollicitudin aliquet non id ipsum. Nulla ut nisi ac urna tempor dignissim ut ut diam. Donec eget nulla elit. Donec ornare efficitur eros vel porta. Praesent vitae purus vitae turpis molestie luctus. Curabitur pulvinar ipsum eu laoreet consequat. Ut lacinia, justo sed molestie tincidunt, tellus nisi aliquet tortor, at cursus purus dolor nec metus. Donec feugiat gravida orci eget vehicula. Donec dictum egestas ligula, ac sodales ligula fringilla at. Nulla pellentesque ipsum blandit est varius mollis. + +Sed fermentum varius leo sit amet interdum. Fusce finibus sit amet leo sit amet scelerisque. Proin sodales urna ut elit pellentesque, vel feugiat eros posuere. Vivamus mi metus, consectetur eget gravida eget, porttitor feugiat diam. Quisque eu lorem lacinia, placerat neque id, pharetra nibh. In tempor vehicula sem sit amet porta. Vivamus ac libero vestibulum, volutpat ex malesuada, vulputate dolor. Aliquam pharetra nec lacus sit amet finibus. Cras sit amet libero luctus, viverra mauris sed, iaculis lorem. Phasellus quis faucibus nisl. Cras ullamcorper ex eget lacus luctus, non dapibus lectus iaculis. Phasellus mi tortor, placerat a massa nec, congue malesuada felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In hac habitasse platea dictumst. Sed ultrices purus felis, ac ultrices ante tristique vel. Aliquam consectetur nunc mattis, feugiat ex vitae, pellentesque sapien. + +Duis venenatis consequat diam, quis imperdiet odio pretium id. Maecenas ut mollis diam. Proin commodo tristique lorem. Nullam consequat eleifend turpis. Sed aliquet auctor lacus eget convallis. Vivamus ut turpis viverra, vulputate odio vitae, ultricies ante. Curabitur vulputate interdum libero ultricies faucibus. + +Nullam non feugiat felis. Donec pretium, lorem ac blandit mollis, est arcu elementum metus, sed tincidunt enim elit iaculis nibh. Pellentesque blandit urna in nisi ultrices, vel consectetur lacus gravida. Proin a elit volutpat, bibendum lorem eu, maximus eros. Etiam finibus eu lorem nec facilisis. Suspendisse potenti. Phasellus faucibus justo ut odio mattis tempor. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur facilisis neque sit amet mi ultrices hendrerit. Vivamus viverra odio justo, eget ullamcorper ante egestas sit amet. Donec quis neque at quam dignissim pulvinar. Nullam et nunc gravida, commodo tellus et, tincidunt lectus. Morbi vitae malesuada diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent dapibus dignissim mattis. Sed interdum nisl in sollicitudin tempor. + +Cras dictum lobortis lorem eu varius. Duis condimentum venenatis quam a consequat. Phasellus eget convallis nulla. Praesent felis enim, dictum non dapibus dapibus, auctor nec tortor. Sed blandit maximus tortor, dapibus vulputate lacus varius vel. Morbi consectetur tristique ipsum, et vulputate augue ornare sit amet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +Integer dignissim vestibulum mi at fermentum. Pellentesque facilisis, diam sed fringilla pharetra, est risus rhoncus ligula, ut mattis urna risus vel lectus. Fusce tristique dolor in dui tincidunt, ac malesuada lectus blandit. Quisque interdum velit bibendum purus rhoncus, vel eleifend lectus placerat. Proin interdum hendrerit elit ac tincidunt. Vestibulum in lectus ac neque sagittis porttitor quis malesuada risus. Donec diam nisl, ullamcorper non venenatis quis, tincidunt sed lacus. Nulla congue convallis ante. Proin nec lectus at ligula vestibulum dapibus. Ut eu justo efficitur, accumsan lectus vel, scelerisque erat. Phasellus imperdiet mattis aliquam. Donec posuere mauris quis sollicitudin euismod. + +In luctus nibh libero, in porttitor augue dapibus quis. Cras sodales quam eget elit lacinia dignissim. Proin semper nibh sed ante lacinia, faucibus rutrum metus finibus. Sed nec orci ut elit vulputate euismod. Mauris vel quam a urna vehicula accumsan in vitae arcu. Ut dui neque, ullamcorper nec aliquam id, posuere quis nisi. Duis tempor scelerisque augue ac sagittis. + +Donec lobortis sapien ut odio luctus, efficitur finibus lectus auctor. Quisque eu maximus ipsum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam placerat enim in blandit euismod. Suspendisse ultricies, nisi quis finibus mattis, elit odio consectetur arcu, nec rhoncus purus arcu id nulla. Aliquam erat nibh, consectetur at ullamcorper vel, imperdiet luctus elit. Vivamus a hendrerit ipsum. Sed consequat ultrices urna, a auctor leo accumsan nec. Cras at mollis velit, quis tincidunt nunc. Nunc tempus eros at consequat tincidunt. Curabitur blandit ut metus at egestas. Donec laoreet faucibus porttitor. Suspendisse bibendum diam at felis euismod vehicula. Integer accumsan risus sem, sed tincidunt risus ornare vel. + +Phasellus consequat vestibulum augue nec vestibulum. Integer efficitur rutrum feugiat. Cras interdum, orci eget vestibulum luctus, velit augue vehicula massa, ut ullamcorper lacus enim ac est. Mauris a efficitur mauris. Proin elementum sed dolor sed ornare. Vestibulum et eleifend ligula. Phasellus enim arcu, lobortis at feugiat vitae, pulvinar sed nunc. Nunc euismod vehicula ante, sit amet rhoncus orci sollicitudin eget. Duis ut scelerisque lacus, blandit facilisis erat. + +Curabitur tempor volutpat quam, eget pulvinar erat rutrum auctor. Aenean lacinia mi eu bibendum pellentesque. Pellentesque viverra condimentum nulla, interdum lacinia dui faucibus at. Nulla sit amet imperdiet leo. Aliquam id dolor quis lectus sollicitudin rhoncus at non urna. Sed vitae dolor ipsum. Suspendisse bibendum leo sit amet ligula finibus volutpat. + +Donec at lectus nec mi pulvinar scelerisque. Vestibulum ante tellus, pellentesque quis purus ornare, laoreet elementum arcu. Praesent porta, lorem a accumsan mattis, augue velit tincidunt tellus, ac pretium turpis ligula vitae justo. Phasellus blandit enim sed turpis ultricies, at gravida leo pretium. Sed non dolor posuere tellus finibus ultrices. Pellentesque vulputate justo in mattis lacinia. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +Ut luctus accumsan tortor ac maximus. Praesent aliquet dui vel porta viverra. Duis efficitur accumsan sapien, eu rutrum lorem porta non. Etiam sit amet purus lorem. Aliquam tincidunt sed neque quis sollicitudin. Nullam vel tincidunt turpis, quis lobortis mi. Aenean mattis, lectus nec placerat blandit, leo ante maximus sapien, nec pretium leo magna sed lectus. Nullam porta nibh nec ligula porttitor, eu lacinia enim dapibus. Nullam in mauris sit amet tellus porta tempor. Maecenas vulputate felis ut massa pretium, nec accumsan risus tincidunt. Nunc porttitor sollicitudin ligula nec sodales. + +Mauris aliquet sodales massa, nec pellentesque orci commodo vel. Morbi vulputate maximus libero nec suscipit. Aliquam aliquam enim sed rutrum maximus. Nunc volutpat, augue quis bibendum fermentum, elit eros porttitor ante, a accumsan nulla ex nec felis. Aliquam blandit nibh et efficitur interdum. Aliquam dictum vel metus id laoreet. Donec auctor risus pharetra, ultrices diam in, consectetur lorem. Sed dignissim dapibus hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin non sapien et arcu venenatis tempor. Vestibulum elit mauris, congue a neque non, faucibus bibendum sem. Fusce et lacus ultricies, dictum massa non, iaculis magna. Proin sit amet enim vitae nunc tincidunt congue nec sit amet sem. Curabitur sapien nisi, dapibus quis efficitur at, porta sit amet elit. Suspendisse aliquet facilisis urna, vel vulputate mauris. + +Fusce nisl ipsum, sagittis quis vestibulum vel, consectetur a ex. Nullam tempor interdum lectus et rutrum. Vestibulum purus augue, vestibulum a ex ut, commodo aliquam ligula. Mauris tincidunt leo sed tellus gravida, eu sagittis nisi faucibus. Sed non odio id diam gravida tincidunt. Nunc sed lacinia diam. Donec at consectetur velit, eu scelerisque sapien. Integer non porta elit, vel mattis est. Mauris quis nibh orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur eu volutpat nisl, non tempus elit. Vivamus purus dolor, ornare varius vehicula eu, viverra eu sem. Praesent at porttitor arcu, nec ornare libero. Aenean ac tortor sollicitudin, pretium mauris et, fermentum metus. Donec dui ligula, sollicitudin non hendrerit sit amet, vehicula non lacus. + +Fusce tempor dui vel dui iaculis tempus. In in fringilla mauris, eget lacinia velit. Maecenas ultrices sed purus ac bibendum. Suspendisse vitae mollis arcu. Praesent enim mauris, tincidunt nec dolor non, blandit vehicula nibh. Maecenas pharetra bibendum ex, nec facilisis arcu dictum non. Aliquam erat volutpat. Maecenas sed mauris mi. Quisque molestie urna non risus mattis, eget dictum nulla ultrices. Suspendisse potenti. Nunc lacinia vulputate egestas. Fusce malesuada enim sit amet consequat hendrerit. + +Nulla non justo eleifend quam eleifend eleifend. Sed sit amet cursus turpis, in mollis turpis. Sed porttitor massa at neque convallis, sit amet convallis lectus tristique. Nullam aliquam est vitae aliquet consequat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In mattis, ligula in finibus tempor, magna ante tincidunt lectus, vitae tristique ex elit nec enim. Suspendisse dapibus sem eros, pharetra iaculis neque mattis quis. Vestibulum metus sapien, dignissim ut ornare a, consectetur ornare justo. Nunc a lectus mollis, ultrices ipsum at, auctor diam. + +Nullam sed libero quis augue dapibus luctus sit amet id mauris. Vestibulum non odio vel nisi scelerisque dignissim. Sed augue est, semper eget diam non, consequat varius diam. Donec ut ipsum tortor. Curabitur pellentesque orci mauris. Curabitur faucibus justo id elit venenatis, scelerisque ullamcorper leo sagittis. Fusce in ornare nisl. Donec nisl leo, mollis quis tempor vel, vulputate ut est. Sed iaculis magna id nisl imperdiet, et sollicitudin mi fringilla. Quisque ut ante eu felis consequat imperdiet. Maecenas vel est dignissim, molestie ex eu, elementum turpis. Morbi mollis nulla lorem, sit amet aliquam ex dignissim id. + +Etiam non nisl quis augue feugiat porta. Donec quis sapien turpis. Nullam aliquam consectetur ante, sed blandit leo efficitur mollis. In nec risus lectus. Sed lobortis ligula quis bibendum rhoncus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vitae ultricies sem, ut auctor metus. Nunc dignissim tristique tellus at consectetur. Vivamus consectetur porttitor erat vitae porta. Aliquam a nunc cursus, bibendum urna quis, tincidunt mi. Integer convallis, nunc id vehicula blandit, urna urna commodo velit, sit amet eleifend est sem pulvinar tortor. Sed est lectus, feugiat nec mi sit amet, blandit placerat enim. Sed vitae tellus risus. Sed aliquet diam mi, et dictum tortor luctus id. Nam quis tincidunt elit. Aliquam pellentesque id metus non tincidunt. + +Duis vel tellus sit amet nunc venenatis vehicula. Donec facilisis molestie tortor, eu pulvinar turpis cursus at. Vestibulum pulvinar rutrum orci ac feugiat. Donec congue mauris eget sapien congue molestie. In quis imperdiet eros. In consequat pellentesque elit, ornare congue lacus ornare non. Duis ultricies porta risus nec mollis. + +Nulla molestie sagittis lacus sit amet rutrum. Vivamus nunc odio, faucibus ut porttitor eu, blandit at ante. Proin dui felis, tristique in tellus nec, sodales pretium libero. Duis lobortis facilisis erat, a consectetur tortor convallis a. Donec in massa eget urna sollicitudin elementum. Nulla dictum mollis fringilla. Sed maximus quam non vestibulum volutpat. Nam tincidunt commodo elit, a ullamcorper urna eleifend non. Fusce gravida tempus porttitor. Cras mollis sit amet libero ac interdum. Proin imperdiet feugiat leo, ut hendrerit leo elementum et. Fusce non varius odio. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +Morbi justo lectus, vulputate nec porttitor eget, mattis sed mi. Quisque vitae est vitae risus faucibus eleifend. Nunc sed turpis eu velit accumsan sodales at vel neque. Cras imperdiet interdum elit non vehicula. Quisque ac nisl lacinia, tempus nisi sit amet, varius massa. Pellentesque a ipsum lobortis, lacinia turpis eget, interdum elit. Ut ligula lacus, blandit sed ullamcorper non, iaculis eget dui. Sed ut gravida purus. Nullam aliquet tellus porttitor dolor tincidunt suscipit. Curabitur odio mauris, varius at ullamcorper a, commodo nec mauris. Sed eu porta lacus. + +Praesent at nisl laoreet, sodales ipsum vel, cursus purus. Morbi sed arcu sed ante ultricies dapibus in quis nibh. Donec ut metus volutpat, ornare eros a, tempus nisi. Vestibulum vel porttitor dui. Fusce fringilla nunc ut elementum tincidunt. Sed dignissim urna tristique ligula porta, a varius metus tempor. Pellentesque dictum turpis turpis, non bibendum leo pharetra eget. Nulla nulla elit, pulvinar vitae arcu non, aliquet mattis sem. Praesent pharetra libero ornare ex blandit eleifend. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed tellus tortor, varius sit amet orci nec, euismod lobortis orci. + +Cras eleifend scelerisque semper. Cras consequat ullamcorper semper. Cras ultrices auctor magna aliquam elementum. Morbi augue tellus, convallis ut libero in, consequat laoreet justo. Nam tempus faucibus nulla eu rutrum. Sed volutpat lacus ante, sed venenatis magna vehicula sed. Donec vitae augue a lorem consequat porta eu a arcu. Donec vel tellus a erat rhoncus sollicitudin et non metus. Fusce sed felis vel nisi suscipit ornare eget quis massa. + +Donec aliquet, arcu ac commodo molestie, dui dolor lacinia lacus, non vulputate magna ante sit amet risus. In auctor tempor urna a sodales. Etiam urna lectus, euismod a felis ac, molestie tempus mauris. Nunc et tellus ac est aliquet luctus. Nam metus neque, tempus quis sem in, pretium dignissim quam. Praesent ac porta lacus, sit amet ullamcorper neque. Donec suscipit sagittis congue. In aliquet nisl sed neque semper, placerat interdum mi vestibulum. + +Donec cursus aliquet leo nec ultricies. Nam tincidunt justo nunc, nec tincidunt purus sodales non. Nullam consectetur, turpis non sagittis volutpat, enim tellus efficitur arcu, ac ultrices nisl augue eget ante. Praesent eget augue lobortis, convallis orci a, convallis ex. Etiam sodales ligula sagittis odio congue, sed fringilla tortor vulputate. Morbi et dui pellentesque, accumsan quam eget, sodales dolor. Ut eget nisl non nunc efficitur cursus sit amet ac est. Vestibulum ante massa, iaculis sit amet tempus ac, efficitur consequat velit. Nulla non viverra orci. Nullam sed pretium ligula, at egestas sem. Quisque aliquet rhoncus odio vulputate molestie. Ut vel porta est, at fringilla nulla. Ut sed elit ut orci tincidunt congue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean non odio in metus scelerisque luctus. + +Nulla congue magna id tellus viverra, ultricies ultricies libero laoreet. Morbi sit amet condimentum felis. Pellentesque et elementum turpis, sit amet ultrices erat. Praesent nec pharetra mauris. Vivamus vulputate imperdiet mauris at dignissim. Vivamus bibendum commodo orci. Morbi at magna at purus dapibus porttitor. Praesent blandit porttitor gravida. In nec eros sit amet tortor tincidunt fermentum eu ac leo. Nam viverra molestie porttitor. Aenean tincidunt ornare magna, nec convallis mi gravida eu. Vestibulum placerat urna libero, ut fermentum est mattis vel. Quisque et lorem et odio maximus mollis a sit amet velit. + +Donec sollicitudin eros vitae aliquam feugiat. Aliquam nec felis ligula. In sodales neque enim, sit amet aliquet nibh rhoncus nec. Praesent sit amet finibus urna, ac pellentesque neque. Praesent eget posuere dolor. Aliquam eget mattis massa, at facilisis risus. Praesent tempor accumsan lorem, non scelerisque leo tincidunt id. Mauris in posuere urna. Maecenas efficitur eu eros eu porttitor. In hac habitasse platea dictumst. Integer at faucibus sapien. Cras sit amet ultricies odio. Maecenas in enim ut orci auctor pulvinar in nec sapien. Suspendisse varius ante sit amet mollis accumsan. Nunc placerat facilisis elit, vel rutrum mi dapibus sit amet. + +Aliquam a metus ac nisi cursus auctor ac et tortor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Quisque quis enim at est lobortis auctor ac eget libero. Quisque scelerisque massa non sapien accumsan, sit amet sollicitudin ipsum bibendum. Aliquam placerat varius laoreet. Fusce viverra lorem eget molestie dapibus. Sed non aliquam ante, at sodales ipsum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec efficitur vitae augue a aliquet. Proin tempus a mi non viverra. Mauris scelerisque mi et scelerisque fringilla. Nunc metus est, scelerisque fringilla sem in, iaculis vulputate diam. Aliquam eleifend, nisi non luctus luctus, velit ligula rutrum sem, et viverra velit sapien sit amet turpis. + +Donec ultricies congue nulla, ac condimentum massa dignissim quis. Sed cursus, tellus sed ultricies pellentesque, libero tortor posuere arcu, sit amet tincidunt odio ex eget mi. Aenean malesuada elementum magna, non pharetra lectus tempor et. Quisque faucibus lorem eu elit facilisis, eget vulputate sem vehicula. Maecenas sit amet aliquet arcu. Donec mauris nisl, lacinia in odio nec, porttitor vehicula nunc. Etiam mauris mauris, faucibus ac placerat et, iaculis nec elit. Curabitur at malesuada nisl. Morbi dignissim tempus dui sed finibus. + +Nulla aliquam augue neque, et tincidunt felis molestie vel. Nullam pulvinar rutrum purus, quis malesuada dolor consectetur et. Vivamus sit amet sem varius, rutrum risus ut, consectetur nisi. Nullam neque velit, lacinia nec ipsum vitae, rutrum eleifend est. Nam at dui ac odio venenatis luctus. Curabitur dapibus quam at ligula scelerisque faucibus. Donec eget porta sem. Ut maximus bibendum nisl sit amet iaculis. Proin malesuada, turpis non gravida rutrum, urna risus sagittis urna, id pretium justo tortor nec dolor. Maecenas tristique erat eu ante varius, sed fringilla magna blandit. Cras et tortor aliquam, scelerisque lorem et, accumsan odio. Suspendisse non libero ut metus ullamcorper tristique. Morbi placerat mollis mauris vel cursus. + +Ut nec augue orci. Vivamus vel rhoncus mauris, eget ultricies ex. Nullam porttitor turpis eu quam hendrerit, et congue eros tincidunt. Etiam fermentum lacinia dignissim. Morbi libero libero, semper eget dui et, porta tristique quam. Ut id ornare mauris, vel tempus felis. Integer auctor est ac cursus tempor. Sed magna est, scelerisque in augue vitae, posuere vulputate magna. Aenean suscipit purus vitae sem posuere, id eleifend sapien viverra. + +Vivamus consequat, dui tempor tincidunt blandit, dui libero fringilla magna, quis accumsan arcu quam ac augue. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam eu felis orci. Fusce euismod vel tellus non hendrerit. Proin id sodales dui. Curabitur a urna venenatis, fringilla eros a, vulputate erat. Donec congue scelerisque neque sed ornare. Fusce imperdiet cursus felis, id condimentum libero malesuada a. Aliquam suscipit nunc et sapien consectetur semper. Nunc a viverra arcu. Morbi mollis, lacus sed feugiat porta, magna arcu maximus lectus, at imperdiet dui arcu vel tellus. Nullam tellus tortor, pellentesque vitae turpis nec, vehicula tristique dui. Cras fringilla nec tortor vitae pretium. Etiam quis mattis lectus. Aenean at ultricies justo. + +Nullam erat tellus, pharetra ac consequat eget, gravida non odio. In vel nulla dolor. Aliquam nisl dolor, laoreet sed mi a, sodales dignissim ante. Sed sit amet sem nec tortor eleifend imperdiet nec id lacus. Mauris vitae luctus massa. Nulla venenatis orci quam, non vehicula metus tempus id. Donec velit dui, semper at mi sit amet, bibendum lobortis felis. Aenean a tincidunt metus. Nam vitae diam nec metus convallis pretium. Pellentesque molestie porta turpis at iaculis. Etiam in tincidunt justo, in dapibus quam. Pellentesque sed purus erat. Duis commodo augue id convallis ultricies. Donec hendrerit ac tellus non volutpat. Aenean egestas mollis mattis. Nulla malesuada metus tortor, nec egestas libero interdum ut. + diff --git a/tooling/car/fixture_test.go b/tooling/car/fixture_test.go new file mode 100644 index 000000000..95f8ca817 --- /dev/null +++ b/tooling/car/fixture_test.go @@ -0,0 +1,38 @@ +package car + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGetNodes(t *testing.T) { + f := MustOpenUnixfsCar("./_fixtures/dag.car") + + // › npx ipfs-car ls ./dag.car --verbose + // bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu - . + // bafkreidw23elffhagxz3oi6ctoibqouzfowfn3bwcvq2yzgd5n5h4gjyou 726 ./a-file.txt + // bafkreiaeqsxxqwmsnhzhrlyr2udn25hpj24bs7gzcgkhbrkmhcuikcgh4a 29998 ./b-file.txt + // bafybeiaq6e55xratife7s5cmzjcmwy4adzzlk74sbdpfcq72gus6cweeeq - ./subdir + // bafkreihdhgb5vyuqu7jssreyo3h567obewtqq37fi5hr2w4um5icacry7m 30999 ./subdir/leaf.txt + root := f.MustGetNode().Cid().String() + assert.Equal(t, "bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu", root) + + leaf := f.MustGetNode("subdir", "leaf.txt").Cid().String() + assert.Equal(t, "bafkreihdhgb5vyuqu7jssreyo3h567obewtqq37fi5hr2w4um5icacry7m", leaf) + + nodes := f.MustGetChildren() + + assert.Len(t, nodes, 4) + assert.Equal(t, "bafkreidw23elffhagxz3oi6ctoibqouzfowfn3bwcvq2yzgd5n5h4gjyou", nodes[0].Cid().String()) + assert.Equal(t, "bafkreiaeqsxxqwmsnhzhrlyr2udn25hpj24bs7gzcgkhbrkmhcuikcgh4a", nodes[1].Cid().String()) + assert.Equal(t, "bafybeiaq6e55xratife7s5cmzjcmwy4adzzlk74sbdpfcq72gus6cweeeq", nodes[2].Cid().String()) + assert.Equal(t, "bafkreihdhgb5vyuqu7jssreyo3h567obewtqq37fi5hr2w4um5icacry7m", nodes[3].Cid().String()) + + cids := f.MustGetChildrenCids() + assert.Len(t, nodes, 4) + assert.Equal(t, "bafkreidw23elffhagxz3oi6ctoibqouzfowfn3bwcvq2yzgd5n5h4gjyou", cids[0]) + assert.Equal(t, "bafkreiaeqsxxqwmsnhzhrlyr2udn25hpj24bs7gzcgkhbrkmhcuikcgh4a", cids[1]) + assert.Equal(t, "bafybeiaq6e55xratife7s5cmzjcmwy4adzzlk74sbdpfcq72gus6cweeeq", cids[2]) + assert.Equal(t, "bafkreihdhgb5vyuqu7jssreyo3h567obewtqq37fi5hr2w4um5icacry7m", cids[3]) +} diff --git a/tooling/car/unixfs.go b/tooling/car/unixfs.go index 21af7ffe8..90437f1ca 100644 --- a/tooling/car/unixfs.go +++ b/tooling/car/unixfs.go @@ -9,6 +9,7 @@ import ( "fmt" "os" "path" + "sort" "strings" "github.com/ipfs/boxo/blockservice" @@ -51,25 +52,35 @@ func newUnixfsDagFromCar(file string) (*UnixfsDag, error) { return &UnixfsDag{dsvc: dsvc, cid: root[0]}, nil } +func (d *UnixfsDag) loadLinks(node format.Node) (map[string]*UnixfsDag, error) { + result := make(map[string]*UnixfsDag) + dir, err := io.NewDirectoryFromNode(d.dsvc, node) + if err != nil { + return nil, err + } + links, err := dir.Links(context.Background()) + if err != nil { + return nil, err + } + for _, l := range links { + result[l.Name] = &UnixfsDag{dsvc: d.dsvc, cid: l.Cid} + } + + return result, nil +} + func (d *UnixfsDag) getNode(names ...string) (format.Node, error) { for _, name := range names { node, err := d.getNode() if err != nil { return nil, err } + if d.links == nil { - d.links = make(map[string]*UnixfsDag) - dir, err := io.NewDirectoryFromNode(d.dsvc, node) - if err != nil { - return nil, err - } - links, err := dir.Links(context.Background()) + d.links, err = d.loadLinks(node) if err != nil { return nil, err } - for _, l := range links { - d.links[l.Name] = &UnixfsDag{dsvc: d.dsvc, cid: l.Cid} - } } d = d.links[name] @@ -77,6 +88,7 @@ func (d *UnixfsDag) getNode(names ...string) (format.Node, error) { return nil, fmt.Errorf("no link named %s", strings.Join(names, "/")) } } + if d.node == nil { node, err := d.dsvc.Get(context.Background(), d.cid) if err != nil { @@ -84,9 +96,53 @@ func (d *UnixfsDag) getNode(names ...string) (format.Node, error) { } d.node = node } + return d.node, nil } +func (d *UnixfsDag) listChildren(names ...string) ([][]string, error) { + node, err := d.getNode(names...) + if err != nil { + return nil, err + } + + result := [][]string{} + + var recursive func(format.Node, []string) error + + recursive = func(node format.Node, path []string) error { + result = append(result, path) + + links, err := d.loadLinks(node) + if err != nil { + fmt.Println(err) + } + // ignore the error: we might descend through files. + + var names []string + for name := range links { + names = append(names, name) + } + sort.Strings(names) + + for _, name := range names { + err := recursive(links[name].mustGetNode(), append(path, name)) + if err != nil { + return err + } + } + + return nil + } + + err = recursive(node, names) + if err != nil { + return nil, err + } + + return result[1:], nil +} + func (d *UnixfsDag) mustGetNode(names ...string) format.Node { node, err := d.getNode(names...) if err != nil { @@ -99,6 +155,29 @@ func (d *UnixfsDag) MustGetNode(names ...string) *FixtureNode { return &FixtureNode{node: d.mustGetNode(names...), dsvc: d.dsvc} } +func (d *UnixfsDag) MustGetChildren(names ...string) [](*FixtureNode) { + paths, err := d.listChildren(names...) + if err != nil { + panic(err) + } + + var nodes [](*FixtureNode) + for _, path := range paths { + nodes = append(nodes, d.MustGetNode(path...)) + } + + return nodes +} + +func (d *UnixfsDag) MustGetChildrenCids(names ...string) []string { + nodes := d.MustGetChildren(names...) + var cids []string + for _, node := range nodes { + cids = append(cids, node.Cid().String()) + } + return cids +} + func (d *UnixfsDag) MustGetRoot() *FixtureNode { return d.MustGetNode() } @@ -141,6 +220,10 @@ func FormatDagNode(node ipld.Node, codecStr string) []byte { func MustOpenUnixfsCar(file string) *UnixfsDag { fixturePath := path.Join(fixtures.Dir(), file) + if strings.HasPrefix(file, "./") { + fixturePath = file + } + dag, err := newUnixfsDagFromCar(fixturePath) if err != nil { fmt.Println(err) diff --git a/tooling/check/_fixtures/Makefile b/tooling/check/_fixtures/Makefile new file mode 100644 index 000000000..185016cd4 --- /dev/null +++ b/tooling/check/_fixtures/Makefile @@ -0,0 +1,4 @@ +all: dag.car + +dag.car: + npx ipfs-car pack --no-wrap ./dir --output ./dag.car diff --git a/tooling/check/_fixtures/dag.car b/tooling/check/_fixtures/dag.car new file mode 100644 index 000000000..b2d6a9547 Binary files /dev/null and b/tooling/check/_fixtures/dag.car differ diff --git a/tooling/check/_fixtures/dir/a-file.txt b/tooling/check/_fixtures/dir/a-file.txt new file mode 100644 index 000000000..7ea96d6e6 --- /dev/null +++ b/tooling/check/_fixtures/dir/a-file.txt @@ -0,0 +1,2 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam euismod magna nulla, non mattis dolor faucibus a. Sed at vehicula ligula, vel gravida tortor. Vestibulum blandit tortor id lectus tincidunt porta. Nunc vitae lacinia libero, nec vehicula nisl. Mauris condimentum sit amet quam sed sodales. Nulla ultricies non odio non pharetra. Sed vitae purus semper arcu tincidunt viverra vitae vitae neque. In imperdiet nulla sed nisl viverra bibendum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Praesent cursus nunc in pretium porta. Quisque dapibus magna vel dignissim mattis. Etiam suscipit sodales convallis. In sit amet neque nec ante sollicitudin dictum nec sit amet libero. + diff --git a/tooling/check/_fixtures/dir/b-file.txt b/tooling/check/_fixtures/dir/b-file.txt new file mode 100644 index 000000000..bb73359a0 --- /dev/null +++ b/tooling/check/_fixtures/dir/b-file.txt @@ -0,0 +1,98 @@ +Quisque turpis sem, iaculis at tristique suscipit, consectetur id mi. Nam vehicula massa nec mi rhoncus, sed venenatis nibh scelerisque. Maecenas nec sodales magna, id feugiat mauris. Aliquam tempus at eros ac sagittis. Proin aliquet molestie rutrum. Aliquam nulla leo, dignissim ac laoreet nec, mattis ac eros. Aenean quis felis pretium elit viverra dapibus. Vestibulum commodo, nisl porta rhoncus efficitur, felis leo auctor tellus, at dictum orci elit ut tellus. Sed nec leo quis orci blandit vulputate. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Phasellus efficitur malesuada nisl et vestibulum. Aliquam tristique tellus eget libero facilisis, a aliquet elit sodales. Donec blandit sem risus, at molestie ligula vulputate faucibus. Mauris metus augue, tincidunt a lacus eu, rhoncus dapibus nisl. Suspendisse potenti. + +Phasellus in rhoncus felis. Vestibulum sodales, magna nec ornare placerat, lorem magna gravida neque, vel cursus quam lorem eget nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam consectetur massa eu tortor euismod, vel condimentum est vulputate. Quisque rutrum suscipit nisl, vitae venenatis ligula elementum at. Nunc vitae mollis odio. Quisque varius odio at mi condimentum semper. Cras semper turpis turpis, interdum ultrices dui porttitor eget. Sed et aliquet nulla. Cras quis ante nibh. Aliquam malesuada malesuada molestie. Fusce tincidunt sed ipsum ac hendrerit. Phasellus vestibulum mauris sed massa tincidunt blandit. Donec finibus tellus leo, viverra ornare augue luctus sit amet. Curabitur quis sapien neque. + +Donec dictum augue id lectus molestie dapibus. Fusce at libero vel sem congue semper. Proin vehicula, metus quis semper dignissim, orci nunc congue purus, a tincidunt lacus dolor non velit. Sed consequat vehicula nunc sit amet gravida. Vivamus ac fringilla nibh, ac pulvinar nisl. Suspendisse sagittis commodo condimentum. Praesent commodo in dui lobortis egestas. Pellentesque mollis tincidunt egestas. Nullam maximus pharetra pharetra. Morbi tincidunt elementum ligula. Aliquam erat volutpat. Integer nec rhoncus eros. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Fusce enim eros, tempus at velit id, tempor tristique turpis. + +Nunc at felis vehicula, sollicitudin ex sit amet, maximus enim. Fusce semper sodales dui. Sed sed finibus mi. Praesent semper neque et ex facilisis finibus. Maecenas sit amet orci id felis scelerisque semper in at tortor. Quisque at magna sed nulla placerat dignissim vel sit amet ligula. Ut mattis nunc augue, in vestibulum nunc pulvinar porttitor. + +Maecenas pulvinar dictum sapien. Praesent mattis, elit ac volutpat rhoncus, purus nibh porta ex, quis dictum magna orci id metus. Quisque at lacinia massa, sit amet maximus turpis. Duis nec sem convallis, ullamcorper turpis in, sollicitudin purus. Sed pulvinar placerat bibendum. Donec lobortis urna sit amet tellus semper volutpat. Integer consequat, ipsum vitae tincidunt commodo, lacus lectus porttitor nisi, id accumsan mi enim id turpis. Praesent quis libero mi. Aenean aliquam eu lorem at ullamcorper. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. + +Quisque dapibus felis eu mauris elementum pellentesque. Vestibulum in nisi at lorem tempor pellentesque. Etiam nec turpis lacus. Nulla vel arcu ipsum. In ac nulla et velit tincidunt pharetra. Sed vel nisl orci. Sed tincidunt tempus ex, ut viverra metus finibus nec. Aliquam quis orci mauris. Vestibulum aliquam egestas est vitae euismod. Integer lorem ligula, auctor blandit est eu, consequat sollicitudin turpis. Ut at tortor vulputate, pulvinar ipsum ut, ornare enim. Nam semper turpis ligula, sed tempus nunc venenatis sed. Sed at pellentesque diam. Quisque imperdiet metus dolor, a aliquet risus auctor vulputate. Mauris rutrum diam id nisl efficitur convallis non a augue. Cras pretium lectus arcu, pellentesque pretium libero euismod a. + +Nunc finibus, tortor id dictum scelerisque, massa enim iaculis neque, convallis euismod est tortor sit amet turpis. Integer efficitur scelerisque nisi id convallis. Sed imperdiet quam dolor. Vestibulum vel euismod lectus. Suspendisse sit amet ultrices elit. Etiam rutrum sem velit, non auctor ex hendrerit vel. Aenean convallis diam et neque volutpat, vel consectetur arcu mattis. Mauris vestibulum nibh in hendrerit facilisis. Aenean nunc leo, sollicitudin eget interdum ut, porttitor eget est. + +Nullam efficitur gravida dui, vel mollis dolor venenatis in. Maecenas cursus lorem vel convallis sollicitudin. Cras feugiat viverra porttitor. Aliquam dui tellus, sollicitudin a libero vel, condimentum pulvinar libero. Curabitur id varius orci. Nulla lobortis ipsum nibh, ut tincidunt augue rhoncus id. Nullam vel ipsum ut leo rhoncus imperdiet. Quisque erat odio, placerat a eros id, sollicitudin efficitur nunc. + +Nunc purus enim, placerat dictum porttitor non, auctor vitae nunc. Nulla ac viverra mi. Proin vulputate efficitur tincidunt. Nam sed tincidunt arcu. Nullam fringilla dui et nisi congue imperdiet. Vivamus accumsan at dui quis sagittis. Vivamus nec ligula id metus convallis posuere. Proin consequat mauris sapien, id scelerisque dolor accumsan ultrices. Sed risus ipsum, porta a iaculis et, commodo nec ante. Sed varius, dolor sit amet congue imperdiet, dolor risus aliquet ipsum, tempus hendrerit ex massa a sem. Nunc id ante lorem. Vivamus nec blandit urna. Vestibulum blandit lectus quis neque posuere condimentum. Phasellus eget ante tellus. Cras at augue sit amet lectus consectetur volutpat. + +Vivamus tempor lorem mauris, eu iaculis tortor sagittis id. Morbi tincidunt a sem ut pretium. Suspendisse varius nisi in dolor efficitur, eget iaculis est ultricies. Donec rhoncus porttitor elit, cursus imperdiet ligula. Pellentesque pretium viverra tempus. Vivamus euismod enim metus, malesuada dapibus dui porta eu. Sed ultricies neque nec nisi viverra sodales. Suspendisse a nulla pulvinar, malesuada lectus non, rhoncus nisi. Aenean feugiat et leo et vestibulum. + +Donec scelerisque scelerisque ligula, eget pretium diam condimentum quis. Donec a tellus diam. Nunc sed dolor in nunc convallis tincidunt quis eu odio. Aenean id egestas purus. Nullam nisi lectus, volutpat sed consectetur sagittis, feugiat id neque. Curabitur dui dui, tincidunt non diam vel, ultricies maximus lorem. Nunc hendrerit nec erat at rhoncus. Praesent porttitor interdum mauris, eu rhoncus quam fringilla non. Ut maximus congue rhoncus. Proin varius auctor lectus ac posuere. Fusce fermentum at dolor ut viverra. Pellentesque consectetur ornare enim vitae accumsan. Sed vel viverra eros. Donec in dictum felis. + +Nullam feugiat metus diam, quis commodo erat posuere auctor. Maecenas accumsan eu magna rhoncus mattis. Vivamus nec lacinia odio. Pellentesque a pharetra mauris. Suspendisse tempus, nulla a facilisis placerat, nunc massa auctor dui, sit amet imperdiet erat risus eu mi. Vestibulum viverra in nulla sit amet ullamcorper. Praesent tristique urna nec ipsum finibus, eu bibendum est dictum. Etiam nec elit non nulla pretium consectetur. Curabitur massa felis, hendrerit et nulla vel, convallis mollis tortor. Proin libero leo, aliquam vitae quam eu, mattis pharetra felis. + +Suspendisse maximus vehicula neque quis bibendum. Integer cursus, urna a mattis vehicula, tortor neque eleifend quam, sit amet ornare mauris purus sit amet nibh. Sed mollis arcu arcu, ut consequat enim convallis ut. Etiam vel ex vel elit lacinia vehicula. In lacinia quis quam ac aliquam. Suspendisse quis condimentum nisi. Donec venenatis facilisis orci, ut sagittis lorem sagittis eget. Duis arcu odio, vehicula quis turpis nec, finibus pretium magna. Nunc maximus, arcu in sagittis iaculis, risus neque consequat justo, ut dapibus lacus orci id tortor. Aenean eleifend condimentum ornare. + +Ut dolor justo, malesuada vitae ex id, aliquet volutpat eros. Curabitur tempus quam orci, id varius lacus gravida et. In ut interdum elit, vel sodales nibh. Nunc venenatis sodales euismod. Morbi pretium ante efficitur purus convallis luctus. Ut id posuere lectus. Duis condimentum sapien metus, imperdiet pretium augue convallis at. In molestie, tortor eget ultrices lacinia, ipsum nulla lacinia turpis, nec pharetra enim ante sed orci. + +Mauris convallis lacus nec est facilisis tincidunt. Sed pretium quis lacus sit amet finibus. Nunc molestie velit eu est sodales vestibulum. Phasellus libero diam, auctor et luctus sed, ornare in lacus. Vivamus vulputate neque sed tempus accumsan. Donec luctus imperdiet neque molestie sollicitudin. Ut ac dapibus sapien. Suspendisse porta ac felis laoreet faucibus. Suspendisse ante est, ultricies sagittis porttitor scelerisque, gravida vel arcu. Duis hendrerit augue sit amet neque mattis, sed efficitur nibh efficitur. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas tristique velit egestas accumsan hendrerit. Donec dapibus aliquet tellus nec porta. + +Vestibulum ipsum lectus, aliquet a eleifend vitae, feugiat eget magna. Nullam ullamcorper leo velit. Suspendisse auctor orci neque, at convallis turpis tincidunt ac. In molestie, tellus a posuere sagittis, nibh ipsum sagittis nunc, nec tempus enim neque non odio. Aliquam blandit pulvinar arcu consequat faucibus. Duis vitae efficitur urna. Ut vel hendrerit sapien. Cras est diam, imperdiet sed lacus et, accumsan hendrerit nulla. Vestibulum varius urna cursus tortor accumsan rhoncus. Integer laoreet tortor at eros faucibus, in malesuada odio aliquet. Curabitur sit amet feugiat justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer viverra metus in nisi molestie congue. Duis ultrices a libero sed tristique. + +Aenean sed lacus finibus, aliquet magna ut, rhoncus arcu. Sed consequat consectetur mauris, vel euismod dolor. Donec non tincidunt magna. Nam ultrices luctus eros, et ultrices dui pretium a. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc molestie dictum efficitur. Sed interdum, quam vitae ultricies lobortis, diam dolor fermentum eros, ut vulputate erat erat nec lectus. Proin eu eleifend elit, vitae porta mauris. Duis accumsan viverra fermentum. Nam in libero enim. Donec posuere consectetur velit, ut rhoncus erat finibus vitae. + +Nullam vel pretium dui, sit amet tristique tellus. Suspendisse ut enim nisl. Maecenas mauris augue, volutpat non scelerisque non, imperdiet a odio. Aliquam sed justo in ante lobortis ultricies. Curabitur enim odio, porttitor in eleifend vel, auctor vel turpis. Donec in nisl eros. Nunc eget quam vitae purus lobortis sollicitudin nec sit amet nunc. Etiam gravida ligula in est eleifend vulputate. Praesent venenatis nisl at vehicula porta. Fusce maximus elit ac leo sodales, semper dapibus mi tristique. + +Nunc rutrum in dui ut tincidunt. Fusce odio ex, suscipit eget velit eget, iaculis cursus augue. Pellentesque at sapien mollis, tempor enim vitae, aliquet orci. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam dignissim pharetra dignissim. Curabitur porta neque tincidunt molestie tincidunt. Morbi volutpat nunc a nisi iaculis facilisis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris risus nisi, blandit ut nunc sed, vulputate pretium velit. Maecenas vel erat ligula. In at nibh vel leo lobortis porttitor. Sed luctus nec tellus a egestas. Proin ac odio faucibus, placerat augue sed, accumsan nisi. Suspendisse potenti. + +Phasellus malesuada, ligula ac consequat scelerisque, dui risus venenatis odio, ut maximus neque orci non nisl. Praesent ac odio erat. Phasellus id lacus non elit rutrum suscipit. Aliquam vestibulum turpis eget tellus rhoncus, ac lobortis nibh maximus. Aliquam laoreet odio nec mi posuere, id dapibus nisi accumsan. Integer dignissim ligula at sapien iaculis varius. Aenean condimentum malesuada mollis. + +Vestibulum fermentum ultricies velit. Donec pulvinar orci quis sodales porttitor. Quisque ornare, magna a imperdiet tristique, ante nisl ultricies ex, eu volutpat leo leo in nunc. Etiam orci elit, porta et aliquet vitae, auctor in nunc. Fusce feugiat eget purus in vestibulum. Phasellus rutrum odio eu porttitor vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus porttitor mauris id nisl pretium, nec consectetur dolor sodales. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +Donec eget ipsum est. Praesent sed mi at nisi dapibus faucibus. Proin cursus nisl ac ligula ultricies, non luctus turpis consequat. Nunc at finibus est. Nunc non nulla eget tellus tempus laoreet. Phasellus aliquam odio non urna dictum, a sodales metus varius. Quisque iaculis nulla sit amet tortor porta, ac luctus risus vulputate. Donec vitae ipsum finibus, condimentum lorem nec, aliquet ex. Nulla facilisi. Nunc eget egestas magna. Etiam sollicitudin justo risus, a tempus tellus mattis ut. Pellentesque diam urna, dictum non leo quis, placerat accumsan ex. Etiam pellentesque, ligula in viverra placerat, ipsum turpis porta ligula, at rutrum erat leo et ante. Vivamus purus ipsum, ornare nec dapibus at, ultricies vel elit. Proin eros arcu, gravida sagittis felis id, eleifend bibendum nulla. Aliquam tincidunt scelerisque ante, ac ullamcorper ex varius a. + +Nulla lobortis viverra lectus vitae commodo. Cras ut elit sit amet purus laoreet sodales. Phasellus euismod volutpat sem, ut venenatis tortor hendrerit mattis. Etiam scelerisque, lectus sed volutpat commodo, purus nisl luctus urna, eu gravida magna tellus ac felis. Curabitur iaculis, massa nec accumsan fermentum, arcu neque lobortis elit, non sagittis elit mi non diam. Curabitur vehicula lectus tellus, viverra mattis mi lacinia in. Duis sit amet fringilla dui. Nulla gravida volutpat faucibus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur condimentum tristique leo fringilla euismod. Suspendisse aliquet consequat tortor. Vivamus aliquet neque in nulla sodales hendrerit. + +Aenean auctor ex ac auctor porta. Nunc faucibus malesuada quam, pharetra suscipit est. Suspendisse blandit iaculis neque id suscipit. Sed bibendum ac dui aliquam lacinia. Ut ex nibh, consectetur ac felis sed, auctor suscipit ipsum. Morbi at lacinia augue. Cras enim lectus, sollicitudin ultrices consectetur id, mollis vitae ex. Nulla rutrum dolor sit amet risus convallis, eu tempus tortor lobortis. Ut quis commodo sapien. Ut interdum libero euismod vulputate vulputate. Aliquam dolor nunc, elementum sed elementum eu, condimentum in nulla. Curabitur faucibus fermentum tellus a consectetur. Nullam sit amet ultrices neque. Cras dictum molestie nisl, eget rutrum metus ornare et. + +Integer ut tempus leo. Vestibulum ultricies tortor nec tortor lacinia porttitor. Curabitur rutrum imperdiet cursus. Pellentesque tristique enim eget egestas aliquam. Aliquam mi lectus, consequat nec finibus eu, vehicula vitae lacus. Pellentesque sit amet rhoncus orci. Sed a est sem. Sed bibendum neque in tellus consectetur consectetur. Integer ac nisi et nisi tincidunt varius. Nam sed vulputate eros. Morbi a tellus suscipit, interdum purus quis, fringilla velit. In erat urna, pellentesque sit amet lectus et, faucibus facilisis risus. Etiam et vulputate massa, at tempor lacus. Ut enim erat, rutrum ut semper sed, congue sed leo. Ut id lobortis velit, vitae lacinia risus. + +Proin nulla nisi, aliquet eget nunc et, suscipit egestas est. Proin vehicula, augue eu congue sagittis, velit libero volutpat mauris, et convallis dolor dolor ac tellus. Maecenas ullamcorper congue elit. Nullam interdum imperdiet dignissim. Donec ac ante fermentum, ultrices ligula et, luctus augue. Pellentesque dignissim nulla purus, vitae egestas mi maximus eget. In hac habitasse platea dictumst. Pellentesque eget ante arcu. Nulla facilisi. + +Quisque mattis dictum elit, ultrices aliquam velit porta id. Maecenas bibendum diam ut sapien fermentum mollis. Curabitur facilisis quam vel massa mattis, a laoreet ligula luctus. Maecenas tincidunt faucibus orci ut iaculis. Etiam blandit faucibus dolor in ultrices. Fusce malesuada pretium tortor eu ultricies. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque sit amet orci mollis, fringilla massa a, eleifend nibh. + +Nullam sed nunc ante. Fusce eleifend lorem ut egestas accumsan. Etiam consequat non augue sed fringilla. Maecenas rutrum orci non convallis molestie. Donec lacinia felis eget libero egestas, a rutrum nibh feugiat. Curabitur vestibulum felis quam, in auctor arcu finibus quis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mi justo, posuere et dictum in, commodo a urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; + +Quisque ex diam, consequat vel arcu non, eleifend commodo odio. Donec eget erat est. Mauris pellentesque blandit orci in venenatis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque malesuada mauris in dignissim. Sed lacus urna, aliquam non eros eu, dapibus porttitor metus. Duis nec ipsum mauris. Praesent placerat ultrices tempus. Donec vulputate aliquam nibh eu tincidunt. Donec ut turpis vehicula quam fringilla ultrices ut id nulla. Suspendisse potenti. Cras non pharetra ante, et mattis augue. Nam interdum sed sapien sit amet ultricies. Nullam et tellus nec mauris tempor venenatis. Integer cursus quam sit amet augue iaculis tempor. Sed tincidunt diam sed tellus facilisis elementum. + +Praesent rhoncus dolor a quam volutpat gravida. Aenean imperdiet sapien ac libero condimentum efficitur. Donec eget gravida nibh. Nulla pretium condimentum fermentum. Aenean vitae facilisis libero. Aliquam tincidunt metus non augue dapibus interdum. Donec vel dignissim enim, ac maximus enim. Vestibulum tincidunt, lorem at vestibulum condimentum, ipsum lorem elementum augue, at efficitur nisi metus vel diam. Maecenas pharetra sapien vel massa sollicitudin ultricies. Donec ac dui fringilla, congue velit at, condimentum sapien. Nullam commodo sem enim, non mollis ante volutpat quis. Maecenas at rhoncus sapien. Proin suscipit velit sapien, eget accumsan sapien bibendum varius. + +Aenean pellentesque tortor sed tempus elementum. Donec finibus iaculis sem, ac molestie erat consequat vel. Sed quis lobortis ante. Vivamus pellentesque ligula at enim lobortis bibendum. Curabitur aliquet, orci quis ultricies dignissim, purus justo maximus odio, in placerat lectus turpis convallis ante. Nulla facilisi. Aliquam bibendum volutpat scelerisque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed at arcu ullamcorper, tristique ligula sed, commodo urna. Proin vel volutpat leo. Aenean quis lorem non nisl luctus volutpat vel at orci. Sed et sem nec nisl aliquet commodo. Fusce lectus odio, molestie in lacus efficitur, aliquam sollicitudin nisi. Aliquam rutrum sapien nec turpis bibendum porta. Donec cursus malesuada tellus, quis cursus dui tincidunt non. + +Aenean efficitur vehicula iaculis. Etiam egestas urna massa, ac mattis nunc volutpat id. Nullam pharetra rutrum tortor, quis semper lacus pellentesque ut. Nullam rhoncus varius lacus ut luctus. Nunc bibendum posuere justo eu tincidunt. Nulla in ex nec eros imperdiet gravida sed quis nisi. Nam ac urna id dolor maximus gravida. + +Nulla convallis lacinia justo, nec bibendum purus finibus sit amet. Nullam felis lectus, elementum convallis consectetur sed, faucibus a lorem. Pellentesque quis mi eu odio iaculis pharetra. Quisque non neque vulputate, auctor augue et, pellentesque nunc. Fusce sodales feugiat auctor. Aliquam ante velit, fringilla egestas lacus convallis, rutrum auctor lacus. Phasellus id tellus nec neque luctus bibendum. In nibh enim, ultricies sed dui bibendum, viverra aliquam elit. Praesent feugiat, sapien eu bibendum tincidunt, lorem est vulputate mi, vitae consectetur dui tellus eu metus. Aliquam quis quam quis quam rutrum tempus id ut lorem. Proin eget bibendum mi. + +Sed a orci ligula. Pellentesque congue feugiat urna, eget pretium urna venenatis at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas ipsum dolor, ultricies sit amet aliquet sed, ullamcorper vitae massa. Ut viverra posuere felis, quis tempus lacus sodales eget. Curabitur consectetur orci mi, ut venenatis tellus aliquam sed. Vestibulum non magna ipsum. + +Nullam non commodo dolor. In bibendum, felis vel pretium dignissim, tellus arcu ultricies diam, porta aliquet velit sapien non justo. Nullam ipsum tortor, bibendum vitae tristique sit amet, interdum sed eros. Pellentesque sodales, lectus varius gravida porttitor, diam est ultricies mi, sit amet ultricies tortor nulla sed metus. Mauris maximus metus eu auctor accumsan. Phasellus sit amet mi rhoncus, convallis neque in, lacinia nisl. Mauris non tortor hendrerit, imperdiet lorem et, gravida nunc. Nunc vitae mauris feugiat, suscipit arcu eu, elementum justo. Aenean turpis velit, condimentum quis dictum porta, cursus consequat arcu. Donec consequat felis quis erat laoreet, accumsan lacinia neque faucibus. Ut laoreet elit sit amet dapibus auctor. + +Duis feugiat, nisi sed fermentum venenatis, sem libero elementum est, eu tristique sapien nunc vitae nisi. Suspendisse tempor blandit mi, vitae tristique nulla eleifend ut. Quisque at nisl in ligula tempus placerat id ac ante. Curabitur aliquet pretium suscipit. In ut nunc quis arcu mattis tempor. In lectus massa, vestibulum venenatis augue sit amet, ultrices semper quam. Ut ac mauris convallis, euismod metus et, feugiat nibh. Sed a lacus faucibus, pulvinar odio vel, fringilla augue. Vestibulum mollis nibh in nisl sagittis, vel porta libero consequat. Quisque sollicitudin scelerisque condimentum. Aenean a orci at purus gravida feugiat. + +Suspendisse ultrices consectetur velit quis pulvinar. Mauris id quam metus. Suspendisse velit magna, elementum at augue eget, pellentesque aliquam quam. Nam rhoncus sapien at risus vehicula, sit amet aliquam elit pharetra. Donec et sapien consequat, accumsan dui id, tempus sem. Ut euismod tellus arcu, ultrices facilisis elit viverra eu. Morbi rutrum quam eu leo aliquet aliquet. Vivamus nec eros est. Praesent sit amet mi at eros malesuada posuere. Morbi elementum dictum risus, a vulputate purus sagittis nec. Nam malesuada a quam at lacinia. Aenean nec dictum nulla. + +Vestibulum quis ex nec dui faucibus imperdiet eu in tortor. Curabitur lacinia diam at eros auctor venenatis pulvinar eget ligula. Duis imperdiet, odio id dapibus fermentum, felis ex scelerisque risus, a tristique sem dolor et urna. Morbi cursus lectus vel diam consequat, in bibendum ipsum laoreet. Maecenas blandit condimentum condimentum. Phasellus non mauris quam. Aenean convallis ultricies libero. Aliquam erat volutpat. Suspendisse eu erat a felis dapibus dapibus quis sit amet ligula. Aenean tristique condimentum placerat. Suspendisse consequat, dui quis semper fringilla, massa orci cursus ex, in dignissim felis ex posuere sapien. Sed quam leo, gravida vel lacus id, commodo dignissim velit. Etiam ultrices nisl non odio consequat accumsan. + +Donec rhoncus erat ut sem elementum sagittis non at dolor. Aenean ut libero tincidunt, tempus massa ac, volutpat magna. Nulla malesuada vel ligula quis feugiat. Proin at nisl in quam accumsan sagittis ac non nibh. Fusce ullamcorper ex purus. Nullam non dui in neque tristique ullamcorper. Proin in sapien ante. Nam ex massa, pharetra vel ligula et, vulputate vestibulum tellus. + +Curabitur ex dui, varius eget sodales at, bibendum quis ante. Curabitur odio tellus, venenatis non risus vitae, elementum sollicitudin ante. Nulla mollis mollis lorem, quis molestie dui aliquet a. Sed imperdiet nunc at eros sagittis volutpat. Pellentesque maximus urna in congue auctor. Sed turpis libero, mattis at dui non, vestibulum suscipit mauris. Vivamus ut bibendum sapien, vitae varius massa. Suspendisse et egestas sapien, elementum posuere dui. Maecenas sit amet ex fermentum, egestas augue ut, pretium velit. Sed vulputate consectetur justo ac consectetur. Sed eget felis tincidunt metus mollis ullamcorper nec quis purus. Donec commodo magna bibendum neque gravida varius. Donec metus nulla, aliquet sit amet porta et, ornare at arcu. In hac habitasse platea dictumst. Nullam accumsan, augue id lobortis convallis, arcu nisi elementum est, non scelerisque turpis sapien at felis. + +Proin aliquet nisl risus, sit amet luctus augue euismod tristique. Nunc et ipsum hendrerit, venenatis lacus ac, ornare eros. Nullam non nibh sapien. Donec tincidunt ac leo a eleifend. Suspendisse luctus sem lectus, vel facilisis risus tempus aliquet. Nullam at arcu in risus porta finibus at mollis erat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. + +Morbi sem quam, laoreet a malesuada a, dignissim rhoncus nulla. Maecenas a mauris ut sapien tincidunt lacinia sit amet ac diam. Donec tortor quam, venenatis et interdum sed, luctus eu mauris. Sed vestibulum justo id interdum auctor. Vivamus convallis quam et molestie fringilla. Donec at ex sem. Mauris in tortor molestie, hendrerit diam non, semper neque. Integer ut massa augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Morbi eget felis fringilla, scelerisque odio eu, lacinia ipsum. + +Donec egestas neque magna, non imperdiet diam sagittis nec. Nam venenatis nec dui in pulvinar. Praesent vel metus consequat, tempor ex in, porta metus. Etiam lacinia enim id semper lacinia. Maecenas egestas tellus quis enim auctor accumsan. Etiam lacus felis, blandit ac arcu sed, egestas commodo nisl. Integer lobortis sem varius neque dictum sagittis. Sed iaculis dapibus sem sit amet varius. In hac habitasse platea dictumst. Phasellus lacinia erat ut facilisis rhoncus. Donec sed purus vitae odio sollicitudin bibendum. Aenean nec arcu eu ligula fringilla pulvinar. + +Maecenas risus arcu, vehicula ac sapien id, tincidunt commodo enim. Sed maximus, arcu sed ornare sodales, ligula leo lobortis quam, ac luctus nisl nisl id arcu. Nam pulvinar, enim id molestie egestas, leo ligula maximus justo, quis lobortis diam neque ut turpis. Integer eu lorem suscipit, efficitur ligula ut, imperdiet elit. Nulla ultricies id lectus ac tristique. Nullam velit sapien, aliquam in velit nec, pellentesque eleifend risus. Sed vitae turpis luctus, rutrum dolor sed, porta erat. Cras urna nisl, suscipit ac faucibus ut, consectetur et lorem. Ut ut leo ac odio faucibus sagittis. In convallis neque tellus, at finibus neque efficitur ut. Sed egestas mi leo, quis euismod neque volutpat rutrum. Suspendisse nec ex vel risus cursus fermentum. Sed scelerisque in turpis nec dignissim. Aenean lacinia malesuada porta. + +Sed metus massa, congue ut sodales suscipit, hendrerit vestibulum nisi. Nullam rutrum tempor vulputate. Cras pulvinar dignissim orci vitae accumsan. Fusce eu faucibus augue. Phasellus condimentum lectus a nibh tempor porttitor. Curabitur hendrerit augue et vehicula ultrices. Aliquam nec massa interdum, ultricies dui at, venenatis nisi. Donec ac aliquam magna. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec dictum enim nulla, vitae faucibus nulla sodales vel. Vestibulum laoreet libero in eros ullamcorper commodo nec et ex. Sed commodo semper dignissim. Donec ullamcorper nulla bibendum diam ullamcorper sagittis. Nam lacinia lectus non commodo congue. + +Suspendisse potenti. Nulla tincidunt magna nec elit ornare semper. In lectus erat, dignissim ac viverra non, euismod non augue. Maecenas feugiat, elit eget ultrices tristique, sem lorem sodales erat, quis luctus orci nulla in mi. Ut vestibulum velit porttitor arcu venenatis, sit amet convallis arcu commodo. Suspendisse finibus tempus erat. Donec ut feugiat ex. Pellentesque facilisis erat dictum tortor dictum, et auctor risus facilisis. Proin sit amet mauris felis. Integer consectetur quis nulla nec finibus. + +Pellentesque justo metus, venenatis a vulputate ut, luctus non tortor. Maecenas consequat justo vel laoreet interdum. Etiam cursus scelerisque tellus, vel rhoncus tortor accumsan et. Phasellus quis luctus diam, ut euismod tortor. Cras vel lectus id libero malesuada hendrerit. Nullam egestas ipsum eu pretium venenatis. Donec eget fermentum nunc, eget tincidunt nulla. Nullam neque ex, lacinia eu eleifend eget, dignissim eu nulla. Quisque fringilla posuere ornare. Curabitur felis urna, sollicitudin ac augue sed, venenatis aliquet ipsum. Mauris consectetur odio sit amet nunc tempus, sed aliquam lorem pellentesque. Etiam est felis, elementum ultricies tincidunt at, bibendum eu ex. + +Nam lacinia enim at lorem condimentum, at sagittis libero mollis. Nullam ligula nisi, auctor et pharetra at, ornare in eros. Nam non risus pharetra, condimentum eros a, tincidunt augue. Mauris vitae ex odio. Nam pharetra suscipit nisl, in vulputate quam imperdiet nec. Duis ornare tincidunt lectus, at tempor odio vehicula a. Curabitur vestibulum lorem purus, at faucibus ipsum interdum sed. Sed vel mauris quis urna facilisis tincidunt non et nibh. Sed sit amet laoreet est. Donec a posuere tellus, elementum gravida est. Phasellus sit amet dignissim sem. Etiam et sem non ex pharetra efficitur in blandit arcu. Sed et libero eget turpis lacinia finibus. Nunc et aliquet enim. + +Ut hendrerit nisi vel diam vehicula, eu fermentum nunc rhoncus. Nullam fringilla ex viverra lobortis aliquam. Vestibulum a turpis purus. Praesent condimentum mauris quis neque porta mollis. Pellentesque aliquam mollis finibus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam aliquet metus vel magna dapibus, eu lobortis ipsum dictum. Maecenas maximus libero non mi ornare semper. Etiam eget pharetra neque, quis mollis libero. Nam quis leo nec justo suscipit egestas non in ante. Ut dignissim ante augue, in iaculis mauris ornare sit amet. Fusce at tincidunt lacus. Aenean et blandit ex. + diff --git a/tooling/check/_fixtures/dir/subdir/leaf.txt b/tooling/check/_fixtures/dir/subdir/leaf.txt new file mode 100644 index 000000000..8bcb582b5 --- /dev/null +++ b/tooling/check/_fixtures/dir/subdir/leaf.txt @@ -0,0 +1,100 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ac varius sapien. Aliquam sit amet pulvinar mauris, non facilisis mauris. In felis dolor, pulvinar eget pretium non, accumsan eu mi. In nec ligula condimentum, imperdiet felis et, tristique arcu. Fusce tellus erat, imperdiet sit amet ante id, varius auctor justo. In fringilla orci in est tincidunt, non euismod risus suscipit. Morbi risus purus, mollis ut diam sit amet, condimentum molestie massa. Pellentesque tristique, diam a sollicitudin rhoncus, velit mi laoreet diam, in vulputate tellus ex at diam. Morbi urna massa, sodales et felis sed, vestibulum faucibus arcu. Mauris egestas neque nec tortor rutrum pretium. Ut ullamcorper id lacus nec euismod. Mauris enim lorem, maximus aliquet egestas non, consectetur id mauris. Donec consectetur diam ut luctus posuere. Donec cursus suscipit sapien ut finibus. Cras sed sem venenatis, gravida erat ac, elementum quam. + +Sed tellus lacus, tristique id eleifend eget, aliquam sed nibh. Praesent aliquam, arcu et scelerisque facilisis, nisl sem molestie dolor, convallis maximus neque purus eget lectus. Nam urna eros, euismod fringilla congue nec, tristique at diam. In convallis consectetur mollis. Nullam purus metus, porta congue cursus quis, pellentesque at mi. Duis vel imperdiet nunc. Donec convallis vel est at dictum. Nam finibus at tortor vel cursus. Nullam viverra fringilla libero at aliquet. Sed dignissim ultrices massa non pulvinar. Maecenas ornare ac elit non finibus. Nunc dapibus eros vel ornare venenatis. Morbi lobortis eros ac odio condimentum, in facilisis elit molestie. Nam feugiat est nisl, vestibulum condimentum enim sagittis at. Duis eget lorem quis ex cursus vestibulum. Pellentesque euismod odio ac rutrum fringilla. + +Curabitur suscipit mollis felis, vel sodales sem elementum vitae. Nulla ut tristique sapien. Donec ut lectus sed felis tincidunt feugiat. Nunc et placerat purus. Pellentesque a consectetur neque, vel rhoncus tellus. Donec ex ligula, laoreet a luctus eu, lacinia id lectus. Fusce risus massa, tincidunt at elementum id, mattis id turpis. Curabitur pretium velit sed dui sollicitudin volutpat. Nullam ut leo id urna volutpat suscipit a ac purus. + +Pellentesque id pharetra magna. Proin a dictum lacus, a lobortis ligula. Nam fringilla hendrerit commodo. Praesent sed nulla id nulla luctus pulvinar et in nulla. Curabitur sodales, urna sed vehicula imperdiet, nisi est pulvinar tellus, vitae volutpat nunc felis sed dui. Curabitur sagittis gravida est a laoreet. Nunc tempus ligula eget luctus maximus. Fusce laoreet justo non risus vulputate porttitor. Sed sed magna non risus viverra faucibus sit amet vitae mauris. Sed in nisi ac enim tristique commodo vitae sed lorem. Aliquam mollis turpis eget arcu consectetur hendrerit. Sed eleifend, diam eu interdum sodales, metus odio vulputate justo, convallis tempor quam ex et orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris volutpat ornare ante. + +Donec egestas neque a turpis eleifend egestas. Mauris ultricies risus sed odio facilisis vehicula. Curabitur scelerisque tellus ornare lectus mollis consectetur. Sed dignissim vitae orci et scelerisque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Cras mollis purus sed felis malesuada fermentum. Vivamus lectus quam, iaculis quis sagittis ac, hendrerit ornare neque. Sed at consequat massa, id porta nisl. Integer sagittis dolor sed euismod scelerisque. Integer porttitor aliquam arcu. Nam quam ligula, pretium eu felis et, lacinia pharetra sapien. Donec metus mauris, accumsan non finibus non, vulputate pretium augue. + +Integer ultrices felis et purus tempus pretium. Nullam auctor diam at lectus consequat, sit amet dapibus felis congue. Curabitur tristique justo tellus, et vulputate ipsum facilisis non. Nam gravida odio dapibus pharetra suscipit. Phasellus lacus eros, bibendum eu venenatis nec, rhoncus at metus. Integer mauris tellus, porttitor nec euismod ac, volutpat sit amet quam. Sed at mauris sit amet est ultrices finibus. + +Nunc urna lectus, dignissim sed lorem ac, aliquet vestibulum quam. Aliquam scelerisque tempor arcu, sit amet hendrerit velit elementum vel. Integer in risus vestibulum libero iaculis egestas. Morbi venenatis a massa et rutrum. Nullam fermentum dui vitae enim faucibus, maximus placerat nisl venenatis. Pellentesque varius elit ac risus interdum, eu porttitor dolor vestibulum. Vivamus tincidunt neque a turpis sodales, a sollicitudin mi mattis. + +Nunc sed justo dolor. Morbi volutpat facilisis tellus, eleifend placerat tortor molestie sed. Nunc libero odio, tempus eget mi vel, eleifend venenatis ante. Nullam ac lacus justo. Nulla facilisi. Vivamus mattis ornare quam. Fusce accumsan orci lobortis, facilisis ligula quis, venenatis leo. Nam non felis at ex vestibulum fermentum non et mi. Duis nisl eros, tincidunt vitae porta eget, aliquet et felis. Fusce eu sem metus. Sed vel massa aliquet, pharetra nisl at, gravida urna. Nullam eu mollis massa, at elementum massa. Nunc erat lacus, pharetra ac ullamcorper non, fermentum in nunc. + +Vivamus nec justo sed risus maximus dapibus a eu orci. Mauris viverra maximus eros, at blandit nibh. Nullam bibendum magna in fringilla euismod. Nunc quis ex dapibus, volutpat ex non, iaculis neque. Duis rutrum enim nec sapien elementum, a fringilla erat facilisis. Ut vel euismod metus, non tempor lorem. Vestibulum aliquet tempus ipsum, et imperdiet magna egestas condimentum. Proin at felis mattis, elementum massa quis, ornare eros. Sed a mauris ac mauris lacinia convallis. Aenean egestas gravida risus vitae hendrerit. Donec vel aliquam nibh. Mauris in luctus nulla. Donec viverra quam vitae ornare convallis. Praesent ut enim eget nisi rutrum luctus. Curabitur laoreet mollis tellus, nec congue ante consequat euismod. Proin molestie fermentum odio in iaculis. + +In hac habitasse platea dictumst. Etiam rhoncus augue a scelerisque convallis. Donec eu varius nulla, venenatis commodo diam. Praesent a convallis urna. Aenean elementum felis nisl, sit amet auctor nulla dignissim fringilla. Nam molestie quam in odio sodales gravida. Pellentesque blandit vitae quam sed tincidunt. Phasellus gravida, turpis ac tincidunt venenatis, ex lectus rutrum diam, nec pharetra dui purus in dui. + +Vestibulum pharetra a lorem non vestibulum. Curabitur efficitur aliquet lorem, id tempor felis congue eu. Aliquam nec turpis at neque hendrerit blandit. Sed quam libero, interdum id fermentum ac, scelerisque nec ligula. Ut ipsum massa, pellentesque hendrerit risus lacinia, malesuada malesuada urna. Suspendisse tristique risus vel quam lacinia, quis rhoncus augue egestas. Fusce sed laoreet ante. Cras sed porta sem. Pellentesque vel fermentum est, ac sollicitudin dolor. Integer lacinia finibus porta. Nulla sed nulla nec dolor viverra gravida. Mauris at tristique ex, sed dictum lorem. Pellentesque bibendum consequat libero, nec porttitor dolor varius a. Praesent dictum tellus non lacus rutrum faucibus. Nunc aliquam dignissim massa. In vestibulum odio libero, vel porttitor ex tincidunt sit amet. + +Nullam scelerisque orci arcu, a mattis odio laoreet eget. Morbi ultrices, lectus et tincidunt hendrerit, velit nisi ullamcorper magna, a vestibulum ipsum elit eget urna. Nulla sit amet suscipit dolor. Aenean dapibus ipsum eget arcu commodo auctor. Curabitur dolor libero, aliquet in rhoncus porttitor, euismod vel nulla. Maecenas varius efficitur libero id vestibulum. Vivamus ac lorem mi. Mauris vulputate auctor maximus. Maecenas auctor faucibus augue, eget congue magna venenatis quis. Praesent felis nunc, facilisis non libero eu, pharetra vestibulum mauris. Morbi felis ante, pellentesque at augue vel, faucibus venenatis elit. Cras aliquam, nisi a tempus tempor, lorem ipsum pretium neque, ac varius neque enim id turpis. Proin mi lorem, ultrices et scelerisque sit amet, tincidunt at est. Nulla ac risus maximus, sollicitudin orci ac, scelerisque felis. Duis ullamcorper mauris a dictum varius. + +Sed eget malesuada eros. Fusce ac leo gravida, feugiat tellus quis, ultricies lacus. Nulla lorem nunc, molestie et magna nec, dictum cursus orci. Nunc imperdiet, purus eget gravida hendrerit, turpis neque maximus arcu, quis consectetur quam justo a ante. Praesent dui enim, venenatis eget nibh vitae, faucibus fringilla ex. Nam sed lacus eu dui viverra dignissim. Proin consectetur eros non libero pellentesque finibus. Donec et finibus quam, vitae iaculis lacus. Maecenas ultricies urna lobortis semper auctor. Aliquam erat volutpat. Nulla erat turpis, consectetur id bibendum in, cursus vehicula arcu. Quisque lectus mauris, bibendum tempor lacinia quis, hendrerit eleifend tortor. Donec et orci quis nunc mollis ornare. Integer ut sem at nisl elementum gravida a ac lacus. Praesent et auctor arcu, eu ultrices elit. + +Morbi vel dapibus eros, ac semper diam. Mauris quis turpis magna. Fusce interdum metus in turpis sodales malesuada. Curabitur ac porttitor eros. Donec non velit at sapien commodo feugiat. Donec auctor molestie rutrum. Duis laoreet suscipit mi, vitae ornare nisi efficitur eu. Nunc luctus urna at gravida venenatis. Integer elit mauris, finibus sit amet pulvinar sed, sodales ac nulla. Nulla a luctus libero, eget rutrum dui. + +Sed a augue quam. Sed rhoncus imperdiet tellus, id congue purus egestas id. Integer tincidunt quam sed gravida lobortis. Nulla hendrerit, ipsum non lacinia ultricies, risus purus dignissim neque, a consectetur lectus nibh quis lectus. Integer mollis tellus vitae auctor imperdiet. Sed accumsan pellentesque orci eget venenatis. Fusce efficitur venenatis mauris sit amet feugiat. Suspendisse ac felis libero. + +Etiam erat sem, tristique id feugiat eget, porta id purus. Nullam mauris ex, molestie eget pretium eu, euismod quis lorem. Mauris ac elementum libero, id lacinia lectus. Maecenas ipsum ipsum, sodales nec consectetur ut, elementum vel metus. Integer finibus, metus ut gravida hendrerit, orci nisl luctus nunc, et egestas enim quam condimentum leo. Etiam id rutrum magna, sit amet iaculis nibh. Cras eget dolor quis magna sollicitudin suscipit efficitur in orci. Quisque sed justo sed libero hendrerit tincidunt vel sed orci. Vestibulum varius eros id neque sodales eleifend. Aliquam erat volutpat. Mauris sit amet mauris diam. Suspendisse vel placerat diam, at tempus odio. Cras pharetra dictum blandit. Donec rutrum, nunc vehicula varius imperdiet, nibh mi pellentesque magna, a faucibus ante sapien non lacus. + +Sed quis lacus varius, mollis urna non, consequat justo. Suspendisse dui enim, efficitur quis ante vel, cursus sollicitudin lectus. Suspendisse maximus, mi eu mollis semper, ipsum dui placerat ex, quis volutpat nulla dolor eu nibh. Integer accumsan velit ut velit faucibus, quis faucibus nulla elementum. Maecenas at nibh sed velit sollicitudin aliquet non id ipsum. Nulla ut nisi ac urna tempor dignissim ut ut diam. Donec eget nulla elit. Donec ornare efficitur eros vel porta. Praesent vitae purus vitae turpis molestie luctus. Curabitur pulvinar ipsum eu laoreet consequat. Ut lacinia, justo sed molestie tincidunt, tellus nisi aliquet tortor, at cursus purus dolor nec metus. Donec feugiat gravida orci eget vehicula. Donec dictum egestas ligula, ac sodales ligula fringilla at. Nulla pellentesque ipsum blandit est varius mollis. + +Sed fermentum varius leo sit amet interdum. Fusce finibus sit amet leo sit amet scelerisque. Proin sodales urna ut elit pellentesque, vel feugiat eros posuere. Vivamus mi metus, consectetur eget gravida eget, porttitor feugiat diam. Quisque eu lorem lacinia, placerat neque id, pharetra nibh. In tempor vehicula sem sit amet porta. Vivamus ac libero vestibulum, volutpat ex malesuada, vulputate dolor. Aliquam pharetra nec lacus sit amet finibus. Cras sit amet libero luctus, viverra mauris sed, iaculis lorem. Phasellus quis faucibus nisl. Cras ullamcorper ex eget lacus luctus, non dapibus lectus iaculis. Phasellus mi tortor, placerat a massa nec, congue malesuada felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In hac habitasse platea dictumst. Sed ultrices purus felis, ac ultrices ante tristique vel. Aliquam consectetur nunc mattis, feugiat ex vitae, pellentesque sapien. + +Duis venenatis consequat diam, quis imperdiet odio pretium id. Maecenas ut mollis diam. Proin commodo tristique lorem. Nullam consequat eleifend turpis. Sed aliquet auctor lacus eget convallis. Vivamus ut turpis viverra, vulputate odio vitae, ultricies ante. Curabitur vulputate interdum libero ultricies faucibus. + +Nullam non feugiat felis. Donec pretium, lorem ac blandit mollis, est arcu elementum metus, sed tincidunt enim elit iaculis nibh. Pellentesque blandit urna in nisi ultrices, vel consectetur lacus gravida. Proin a elit volutpat, bibendum lorem eu, maximus eros. Etiam finibus eu lorem nec facilisis. Suspendisse potenti. Phasellus faucibus justo ut odio mattis tempor. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur facilisis neque sit amet mi ultrices hendrerit. Vivamus viverra odio justo, eget ullamcorper ante egestas sit amet. Donec quis neque at quam dignissim pulvinar. Nullam et nunc gravida, commodo tellus et, tincidunt lectus. Morbi vitae malesuada diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent dapibus dignissim mattis. Sed interdum nisl in sollicitudin tempor. + +Cras dictum lobortis lorem eu varius. Duis condimentum venenatis quam a consequat. Phasellus eget convallis nulla. Praesent felis enim, dictum non dapibus dapibus, auctor nec tortor. Sed blandit maximus tortor, dapibus vulputate lacus varius vel. Morbi consectetur tristique ipsum, et vulputate augue ornare sit amet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +Integer dignissim vestibulum mi at fermentum. Pellentesque facilisis, diam sed fringilla pharetra, est risus rhoncus ligula, ut mattis urna risus vel lectus. Fusce tristique dolor in dui tincidunt, ac malesuada lectus blandit. Quisque interdum velit bibendum purus rhoncus, vel eleifend lectus placerat. Proin interdum hendrerit elit ac tincidunt. Vestibulum in lectus ac neque sagittis porttitor quis malesuada risus. Donec diam nisl, ullamcorper non venenatis quis, tincidunt sed lacus. Nulla congue convallis ante. Proin nec lectus at ligula vestibulum dapibus. Ut eu justo efficitur, accumsan lectus vel, scelerisque erat. Phasellus imperdiet mattis aliquam. Donec posuere mauris quis sollicitudin euismod. + +In luctus nibh libero, in porttitor augue dapibus quis. Cras sodales quam eget elit lacinia dignissim. Proin semper nibh sed ante lacinia, faucibus rutrum metus finibus. Sed nec orci ut elit vulputate euismod. Mauris vel quam a urna vehicula accumsan in vitae arcu. Ut dui neque, ullamcorper nec aliquam id, posuere quis nisi. Duis tempor scelerisque augue ac sagittis. + +Donec lobortis sapien ut odio luctus, efficitur finibus lectus auctor. Quisque eu maximus ipsum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam placerat enim in blandit euismod. Suspendisse ultricies, nisi quis finibus mattis, elit odio consectetur arcu, nec rhoncus purus arcu id nulla. Aliquam erat nibh, consectetur at ullamcorper vel, imperdiet luctus elit. Vivamus a hendrerit ipsum. Sed consequat ultrices urna, a auctor leo accumsan nec. Cras at mollis velit, quis tincidunt nunc. Nunc tempus eros at consequat tincidunt. Curabitur blandit ut metus at egestas. Donec laoreet faucibus porttitor. Suspendisse bibendum diam at felis euismod vehicula. Integer accumsan risus sem, sed tincidunt risus ornare vel. + +Phasellus consequat vestibulum augue nec vestibulum. Integer efficitur rutrum feugiat. Cras interdum, orci eget vestibulum luctus, velit augue vehicula massa, ut ullamcorper lacus enim ac est. Mauris a efficitur mauris. Proin elementum sed dolor sed ornare. Vestibulum et eleifend ligula. Phasellus enim arcu, lobortis at feugiat vitae, pulvinar sed nunc. Nunc euismod vehicula ante, sit amet rhoncus orci sollicitudin eget. Duis ut scelerisque lacus, blandit facilisis erat. + +Curabitur tempor volutpat quam, eget pulvinar erat rutrum auctor. Aenean lacinia mi eu bibendum pellentesque. Pellentesque viverra condimentum nulla, interdum lacinia dui faucibus at. Nulla sit amet imperdiet leo. Aliquam id dolor quis lectus sollicitudin rhoncus at non urna. Sed vitae dolor ipsum. Suspendisse bibendum leo sit amet ligula finibus volutpat. + +Donec at lectus nec mi pulvinar scelerisque. Vestibulum ante tellus, pellentesque quis purus ornare, laoreet elementum arcu. Praesent porta, lorem a accumsan mattis, augue velit tincidunt tellus, ac pretium turpis ligula vitae justo. Phasellus blandit enim sed turpis ultricies, at gravida leo pretium. Sed non dolor posuere tellus finibus ultrices. Pellentesque vulputate justo in mattis lacinia. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +Ut luctus accumsan tortor ac maximus. Praesent aliquet dui vel porta viverra. Duis efficitur accumsan sapien, eu rutrum lorem porta non. Etiam sit amet purus lorem. Aliquam tincidunt sed neque quis sollicitudin. Nullam vel tincidunt turpis, quis lobortis mi. Aenean mattis, lectus nec placerat blandit, leo ante maximus sapien, nec pretium leo magna sed lectus. Nullam porta nibh nec ligula porttitor, eu lacinia enim dapibus. Nullam in mauris sit amet tellus porta tempor. Maecenas vulputate felis ut massa pretium, nec accumsan risus tincidunt. Nunc porttitor sollicitudin ligula nec sodales. + +Mauris aliquet sodales massa, nec pellentesque orci commodo vel. Morbi vulputate maximus libero nec suscipit. Aliquam aliquam enim sed rutrum maximus. Nunc volutpat, augue quis bibendum fermentum, elit eros porttitor ante, a accumsan nulla ex nec felis. Aliquam blandit nibh et efficitur interdum. Aliquam dictum vel metus id laoreet. Donec auctor risus pharetra, ultrices diam in, consectetur lorem. Sed dignissim dapibus hendrerit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin non sapien et arcu venenatis tempor. Vestibulum elit mauris, congue a neque non, faucibus bibendum sem. Fusce et lacus ultricies, dictum massa non, iaculis magna. Proin sit amet enim vitae nunc tincidunt congue nec sit amet sem. Curabitur sapien nisi, dapibus quis efficitur at, porta sit amet elit. Suspendisse aliquet facilisis urna, vel vulputate mauris. + +Fusce nisl ipsum, sagittis quis vestibulum vel, consectetur a ex. Nullam tempor interdum lectus et rutrum. Vestibulum purus augue, vestibulum a ex ut, commodo aliquam ligula. Mauris tincidunt leo sed tellus gravida, eu sagittis nisi faucibus. Sed non odio id diam gravida tincidunt. Nunc sed lacinia diam. Donec at consectetur velit, eu scelerisque sapien. Integer non porta elit, vel mattis est. Mauris quis nibh orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur eu volutpat nisl, non tempus elit. Vivamus purus dolor, ornare varius vehicula eu, viverra eu sem. Praesent at porttitor arcu, nec ornare libero. Aenean ac tortor sollicitudin, pretium mauris et, fermentum metus. Donec dui ligula, sollicitudin non hendrerit sit amet, vehicula non lacus. + +Fusce tempor dui vel dui iaculis tempus. In in fringilla mauris, eget lacinia velit. Maecenas ultrices sed purus ac bibendum. Suspendisse vitae mollis arcu. Praesent enim mauris, tincidunt nec dolor non, blandit vehicula nibh. Maecenas pharetra bibendum ex, nec facilisis arcu dictum non. Aliquam erat volutpat. Maecenas sed mauris mi. Quisque molestie urna non risus mattis, eget dictum nulla ultrices. Suspendisse potenti. Nunc lacinia vulputate egestas. Fusce malesuada enim sit amet consequat hendrerit. + +Nulla non justo eleifend quam eleifend eleifend. Sed sit amet cursus turpis, in mollis turpis. Sed porttitor massa at neque convallis, sit amet convallis lectus tristique. Nullam aliquam est vitae aliquet consequat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In mattis, ligula in finibus tempor, magna ante tincidunt lectus, vitae tristique ex elit nec enim. Suspendisse dapibus sem eros, pharetra iaculis neque mattis quis. Vestibulum metus sapien, dignissim ut ornare a, consectetur ornare justo. Nunc a lectus mollis, ultrices ipsum at, auctor diam. + +Nullam sed libero quis augue dapibus luctus sit amet id mauris. Vestibulum non odio vel nisi scelerisque dignissim. Sed augue est, semper eget diam non, consequat varius diam. Donec ut ipsum tortor. Curabitur pellentesque orci mauris. Curabitur faucibus justo id elit venenatis, scelerisque ullamcorper leo sagittis. Fusce in ornare nisl. Donec nisl leo, mollis quis tempor vel, vulputate ut est. Sed iaculis magna id nisl imperdiet, et sollicitudin mi fringilla. Quisque ut ante eu felis consequat imperdiet. Maecenas vel est dignissim, molestie ex eu, elementum turpis. Morbi mollis nulla lorem, sit amet aliquam ex dignissim id. + +Etiam non nisl quis augue feugiat porta. Donec quis sapien turpis. Nullam aliquam consectetur ante, sed blandit leo efficitur mollis. In nec risus lectus. Sed lobortis ligula quis bibendum rhoncus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vitae ultricies sem, ut auctor metus. Nunc dignissim tristique tellus at consectetur. Vivamus consectetur porttitor erat vitae porta. Aliquam a nunc cursus, bibendum urna quis, tincidunt mi. Integer convallis, nunc id vehicula blandit, urna urna commodo velit, sit amet eleifend est sem pulvinar tortor. Sed est lectus, feugiat nec mi sit amet, blandit placerat enim. Sed vitae tellus risus. Sed aliquet diam mi, et dictum tortor luctus id. Nam quis tincidunt elit. Aliquam pellentesque id metus non tincidunt. + +Duis vel tellus sit amet nunc venenatis vehicula. Donec facilisis molestie tortor, eu pulvinar turpis cursus at. Vestibulum pulvinar rutrum orci ac feugiat. Donec congue mauris eget sapien congue molestie. In quis imperdiet eros. In consequat pellentesque elit, ornare congue lacus ornare non. Duis ultricies porta risus nec mollis. + +Nulla molestie sagittis lacus sit amet rutrum. Vivamus nunc odio, faucibus ut porttitor eu, blandit at ante. Proin dui felis, tristique in tellus nec, sodales pretium libero. Duis lobortis facilisis erat, a consectetur tortor convallis a. Donec in massa eget urna sollicitudin elementum. Nulla dictum mollis fringilla. Sed maximus quam non vestibulum volutpat. Nam tincidunt commodo elit, a ullamcorper urna eleifend non. Fusce gravida tempus porttitor. Cras mollis sit amet libero ac interdum. Proin imperdiet feugiat leo, ut hendrerit leo elementum et. Fusce non varius odio. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +Morbi justo lectus, vulputate nec porttitor eget, mattis sed mi. Quisque vitae est vitae risus faucibus eleifend. Nunc sed turpis eu velit accumsan sodales at vel neque. Cras imperdiet interdum elit non vehicula. Quisque ac nisl lacinia, tempus nisi sit amet, varius massa. Pellentesque a ipsum lobortis, lacinia turpis eget, interdum elit. Ut ligula lacus, blandit sed ullamcorper non, iaculis eget dui. Sed ut gravida purus. Nullam aliquet tellus porttitor dolor tincidunt suscipit. Curabitur odio mauris, varius at ullamcorper a, commodo nec mauris. Sed eu porta lacus. + +Praesent at nisl laoreet, sodales ipsum vel, cursus purus. Morbi sed arcu sed ante ultricies dapibus in quis nibh. Donec ut metus volutpat, ornare eros a, tempus nisi. Vestibulum vel porttitor dui. Fusce fringilla nunc ut elementum tincidunt. Sed dignissim urna tristique ligula porta, a varius metus tempor. Pellentesque dictum turpis turpis, non bibendum leo pharetra eget. Nulla nulla elit, pulvinar vitae arcu non, aliquet mattis sem. Praesent pharetra libero ornare ex blandit eleifend. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed tellus tortor, varius sit amet orci nec, euismod lobortis orci. + +Cras eleifend scelerisque semper. Cras consequat ullamcorper semper. Cras ultrices auctor magna aliquam elementum. Morbi augue tellus, convallis ut libero in, consequat laoreet justo. Nam tempus faucibus nulla eu rutrum. Sed volutpat lacus ante, sed venenatis magna vehicula sed. Donec vitae augue a lorem consequat porta eu a arcu. Donec vel tellus a erat rhoncus sollicitudin et non metus. Fusce sed felis vel nisi suscipit ornare eget quis massa. + +Donec aliquet, arcu ac commodo molestie, dui dolor lacinia lacus, non vulputate magna ante sit amet risus. In auctor tempor urna a sodales. Etiam urna lectus, euismod a felis ac, molestie tempus mauris. Nunc et tellus ac est aliquet luctus. Nam metus neque, tempus quis sem in, pretium dignissim quam. Praesent ac porta lacus, sit amet ullamcorper neque. Donec suscipit sagittis congue. In aliquet nisl sed neque semper, placerat interdum mi vestibulum. + +Donec cursus aliquet leo nec ultricies. Nam tincidunt justo nunc, nec tincidunt purus sodales non. Nullam consectetur, turpis non sagittis volutpat, enim tellus efficitur arcu, ac ultrices nisl augue eget ante. Praesent eget augue lobortis, convallis orci a, convallis ex. Etiam sodales ligula sagittis odio congue, sed fringilla tortor vulputate. Morbi et dui pellentesque, accumsan quam eget, sodales dolor. Ut eget nisl non nunc efficitur cursus sit amet ac est. Vestibulum ante massa, iaculis sit amet tempus ac, efficitur consequat velit. Nulla non viverra orci. Nullam sed pretium ligula, at egestas sem. Quisque aliquet rhoncus odio vulputate molestie. Ut vel porta est, at fringilla nulla. Ut sed elit ut orci tincidunt congue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean non odio in metus scelerisque luctus. + +Nulla congue magna id tellus viverra, ultricies ultricies libero laoreet. Morbi sit amet condimentum felis. Pellentesque et elementum turpis, sit amet ultrices erat. Praesent nec pharetra mauris. Vivamus vulputate imperdiet mauris at dignissim. Vivamus bibendum commodo orci. Morbi at magna at purus dapibus porttitor. Praesent blandit porttitor gravida. In nec eros sit amet tortor tincidunt fermentum eu ac leo. Nam viverra molestie porttitor. Aenean tincidunt ornare magna, nec convallis mi gravida eu. Vestibulum placerat urna libero, ut fermentum est mattis vel. Quisque et lorem et odio maximus mollis a sit amet velit. + +Donec sollicitudin eros vitae aliquam feugiat. Aliquam nec felis ligula. In sodales neque enim, sit amet aliquet nibh rhoncus nec. Praesent sit amet finibus urna, ac pellentesque neque. Praesent eget posuere dolor. Aliquam eget mattis massa, at facilisis risus. Praesent tempor accumsan lorem, non scelerisque leo tincidunt id. Mauris in posuere urna. Maecenas efficitur eu eros eu porttitor. In hac habitasse platea dictumst. Integer at faucibus sapien. Cras sit amet ultricies odio. Maecenas in enim ut orci auctor pulvinar in nec sapien. Suspendisse varius ante sit amet mollis accumsan. Nunc placerat facilisis elit, vel rutrum mi dapibus sit amet. + +Aliquam a metus ac nisi cursus auctor ac et tortor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Quisque quis enim at est lobortis auctor ac eget libero. Quisque scelerisque massa non sapien accumsan, sit amet sollicitudin ipsum bibendum. Aliquam placerat varius laoreet. Fusce viverra lorem eget molestie dapibus. Sed non aliquam ante, at sodales ipsum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec efficitur vitae augue a aliquet. Proin tempus a mi non viverra. Mauris scelerisque mi et scelerisque fringilla. Nunc metus est, scelerisque fringilla sem in, iaculis vulputate diam. Aliquam eleifend, nisi non luctus luctus, velit ligula rutrum sem, et viverra velit sapien sit amet turpis. + +Donec ultricies congue nulla, ac condimentum massa dignissim quis. Sed cursus, tellus sed ultricies pellentesque, libero tortor posuere arcu, sit amet tincidunt odio ex eget mi. Aenean malesuada elementum magna, non pharetra lectus tempor et. Quisque faucibus lorem eu elit facilisis, eget vulputate sem vehicula. Maecenas sit amet aliquet arcu. Donec mauris nisl, lacinia in odio nec, porttitor vehicula nunc. Etiam mauris mauris, faucibus ac placerat et, iaculis nec elit. Curabitur at malesuada nisl. Morbi dignissim tempus dui sed finibus. + +Nulla aliquam augue neque, et tincidunt felis molestie vel. Nullam pulvinar rutrum purus, quis malesuada dolor consectetur et. Vivamus sit amet sem varius, rutrum risus ut, consectetur nisi. Nullam neque velit, lacinia nec ipsum vitae, rutrum eleifend est. Nam at dui ac odio venenatis luctus. Curabitur dapibus quam at ligula scelerisque faucibus. Donec eget porta sem. Ut maximus bibendum nisl sit amet iaculis. Proin malesuada, turpis non gravida rutrum, urna risus sagittis urna, id pretium justo tortor nec dolor. Maecenas tristique erat eu ante varius, sed fringilla magna blandit. Cras et tortor aliquam, scelerisque lorem et, accumsan odio. Suspendisse non libero ut metus ullamcorper tristique. Morbi placerat mollis mauris vel cursus. + +Ut nec augue orci. Vivamus vel rhoncus mauris, eget ultricies ex. Nullam porttitor turpis eu quam hendrerit, et congue eros tincidunt. Etiam fermentum lacinia dignissim. Morbi libero libero, semper eget dui et, porta tristique quam. Ut id ornare mauris, vel tempus felis. Integer auctor est ac cursus tempor. Sed magna est, scelerisque in augue vitae, posuere vulputate magna. Aenean suscipit purus vitae sem posuere, id eleifend sapien viverra. + +Vivamus consequat, dui tempor tincidunt blandit, dui libero fringilla magna, quis accumsan arcu quam ac augue. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam eu felis orci. Fusce euismod vel tellus non hendrerit. Proin id sodales dui. Curabitur a urna venenatis, fringilla eros a, vulputate erat. Donec congue scelerisque neque sed ornare. Fusce imperdiet cursus felis, id condimentum libero malesuada a. Aliquam suscipit nunc et sapien consectetur semper. Nunc a viverra arcu. Morbi mollis, lacus sed feugiat porta, magna arcu maximus lectus, at imperdiet dui arcu vel tellus. Nullam tellus tortor, pellentesque vitae turpis nec, vehicula tristique dui. Cras fringilla nec tortor vitae pretium. Etiam quis mattis lectus. Aenean at ultricies justo. + +Nullam erat tellus, pharetra ac consequat eget, gravida non odio. In vel nulla dolor. Aliquam nisl dolor, laoreet sed mi a, sodales dignissim ante. Sed sit amet sem nec tortor eleifend imperdiet nec id lacus. Mauris vitae luctus massa. Nulla venenatis orci quam, non vehicula metus tempus id. Donec velit dui, semper at mi sit amet, bibendum lobortis felis. Aenean a tincidunt metus. Nam vitae diam nec metus convallis pretium. Pellentesque molestie porta turpis at iaculis. Etiam in tincidunt justo, in dapibus quam. Pellentesque sed purus erat. Duis commodo augue id convallis ultricies. Donec hendrerit ac tellus non volutpat. Aenean egestas mollis mattis. Nulla malesuada metus tortor, nec egestas libero interdum ut. + diff --git a/tooling/check/_fixtures/hello_ipfs.car b/tooling/check/_fixtures/hello_ipfs.car new file mode 100644 index 000000000..5c541e430 Binary files /dev/null and b/tooling/check/_fixtures/hello_ipfs.car differ diff --git a/tooling/check/car.go b/tooling/check/car.go new file mode 100644 index 000000000..f58cbf554 --- /dev/null +++ b/tooling/check/car.go @@ -0,0 +1,115 @@ +package check + +import ( + "fmt" + + "github.com/ipfs/go-cid" +) + +type CheckIsCarFile struct { + blockCIDs []cid.Cid + rootCIDs []cid.Cid + isExact bool + isOrdered bool +} + +func IsCar() *CheckIsCarFile { + return &CheckIsCarFile{ + blockCIDs: []cid.Cid{}, + rootCIDs: []cid.Cid{}, + isExact: false, + isOrdered: false, + } +} + +func decoded(cidStr string) cid.Cid { + cid, err := cid.Decode(cidStr) + if err != nil { + panic(fmt.Errorf("invalid CID: %w", err)) + } + return cid +} + +func (c CheckIsCarFile) HasBlock(cidStr string) CheckIsCarFile { + c.blockCIDs = append(c.blockCIDs, decoded(cidStr)) + return c +} + +func (c CheckIsCarFile) HasBlocks(cidStrs ...string) CheckIsCarFile { + for _, cidStr := range cidStrs { + c.blockCIDs = append(c.blockCIDs, decoded(cidStr)) + } + return c +} + +func (c CheckIsCarFile) HasRoot(cidStr string) CheckIsCarFile { + c.rootCIDs = append(c.rootCIDs, decoded(cidStr)) + return c +} + +func (c CheckIsCarFile) HasRoots(cidStrs ...string) CheckIsCarFile { + for _, cidStr := range cidStrs { + c.rootCIDs = append(c.rootCIDs, decoded(cidStr)) + } + return c +} + +func (c CheckIsCarFile) Exactly() CheckIsCarFile { + c.isExact = true + return c +} + +func (c CheckIsCarFile) InThatOrder() CheckIsCarFile { + c.isOrdered = true + return c +} + +func (c *CheckIsCarFile) Check(carContent []byte) CheckOutput { + gotCIDs, err := listAllCids(carContent) + if err != nil { + return CheckOutput{ + Success: false, + Reason: fmt.Sprintf("failed to list all cids: %v", err), + } + } + + cmp := CidSetContains + + if c.isExact { + if c.isOrdered { + cmp = CidArrayEquals + } else { + cmp = CidSetEquals + } + } else { + if c.isOrdered { + cmp = CidOrderedSubsetContains + } + } + + output := cmp(gotCIDs, c.blockCIDs) + + if !output.Success { + return output + } + + if len(c.rootCIDs) > 0 || c.isExact { + gotRoots, err := listAllRoots(carContent) + if err != nil { + return CheckOutput{ + Success: false, + Reason: fmt.Sprintf("failed to list all roots: %v", err), + } + } + + output = cmp(gotRoots, c.rootCIDs) + + if !output.Success { + return output + } + } + + return CheckOutput{ + Success: true, + } +} diff --git a/tooling/check/car_test.go b/tooling/check/car_test.go new file mode 100644 index 000000000..d4446588c --- /dev/null +++ b/tooling/check/car_test.go @@ -0,0 +1,112 @@ +package check + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func loadFile(t *testing.T, carFilePath string) []byte { + file, err := os.Open(carFilePath) + if err != nil { + t.Fatalf("failed to open car file: %v", err) + } + defer file.Close() + + fileBytes, err := ioutil.ReadAll(file) + if err != nil { + t.Fatalf("failed to read car file: %v", err) + } + + return fileBytes +} + +func TestHasFile(t *testing.T) { + block := loadFile(t, "./_fixtures/dag.car") + + // › npx ipfs-car ls ./dag.car --verbose + // bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu - . + // bafkreidw23elffhagxz3oi6ctoibqouzfowfn3bwcvq2yzgd5n5h4gjyou 726 ./a-file.txt + // bafkreiaeqsxxqwmsnhzhrlyr2udn25hpj24bs7gzcgkhbrkmhcuikcgh4a 29998 ./b-file.txt + // bafybeiaq6e55xratife7s5cmzjcmwy4adzzlk74sbdpfcq72gus6cweeeq - ./subdir + // bafkreihdhgb5vyuqu7jssreyo3h567obewtqq37fi5hr2w4um5icacry7m 30999 ./subdir/leaf.txt + c := IsCar(). + HasBlock("bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu"). + HasRoot("bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu") + assert.True(t, c.Check(block).Success) + + c = IsCar(). + HasBlocks("bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu", + "bafkreidw23elffhagxz3oi6ctoibqouzfowfn3bwcvq2yzgd5n5h4gjyou", + "bafkreiaeqsxxqwmsnhzhrlyr2udn25hpj24bs7gzcgkhbrkmhcuikcgh4a", + "bafybeiaq6e55xratife7s5cmzjcmwy4adzzlk74sbdpfcq72gus6cweeeq", + "bafkreihdhgb5vyuqu7jssreyo3h567obewtqq37fi5hr2w4um5icacry7m", + ). + HasRoots( + "bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu", + ). + Exactly() + assert.True(t, c.Check(block).Success) + + c = IsCar(). + HasBlocks( + // Note the order here + "bafkreidw23elffhagxz3oi6ctoibqouzfowfn3bwcvq2yzgd5n5h4gjyou", + "bafkreiaeqsxxqwmsnhzhrlyr2udn25hpj24bs7gzcgkhbrkmhcuikcgh4a", + "bafkreihdhgb5vyuqu7jssreyo3h567obewtqq37fi5hr2w4um5icacry7m", + "bafybeiaq6e55xratife7s5cmzjcmwy4adzzlk74sbdpfcq72gus6cweeeq", + "bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu", + ). + HasRoots( + "bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu", + ). + InThatOrder(). + Exactly() + assert.True(t, c.Check(block).Success) + + c = IsCar(). + HasBlocks( + "bafkreiaeqsxxqwmsnhzhrlyr2udn25hpj24bs7gzcgkhbrkmhcuikcgh4a", + "bafkreihdhgb5vyuqu7jssreyo3h567obewtqq37fi5hr2w4um5icacry7m", + "bafybeiaq6e55xratife7s5cmzjcmwy4adzzlk74sbdpfcq72gus6cweeeq", + "bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu", + "bafkreidw23elffhagxz3oi6ctoibqouzfowfn3bwcvq2yzgd5n5h4gjyou", + ). + HasRoots( + "bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu", + ). + InThatOrder(). + Exactly() + assert.False(t, c.Check(block).Success) + + c = IsCar(). + HasBlock("bafybeidlbwbu73tbjr3atntjz4lq5ego5w2uyof35vvwcnheaftzi3rndu"). + HasRoot("bafkreidw23elffhagxz3oi6ctoibqouzfowfn3bwcvq2yzgd5n5h4gjyou"). + Exactly() + assert.False(t, c.Check(block).Success) + + // invalid CID + c2 := IsCar(). + HasBlock("bafkreiac7wncixdkhdew6wwnzya36b54t7nxcnhps377fjgtmezddnj6em") + + assert.False(t, c2.Check(block).Success) + + // missing Roots + c3 := IsCar(). + HasBlock("bafkreidfdrlkeq4m4xnxuyx6iae76fdm4wgl5d4xzsb77ixhyqwumhz244"). + Exactly() + + assert.False(t, c3.Check(block).Success) + + // more blocks than expected + c4 := IsCar() + assert.True(t, c4.Check(block).Success) + + // more blocks than expected, but exact + c5 := IsCar(). + Exactly() + + assert.False(t, c5.Check(block).Success) +} diff --git a/tooling/check/cid.go b/tooling/check/cid.go new file mode 100644 index 000000000..488ee5389 --- /dev/null +++ b/tooling/check/cid.go @@ -0,0 +1,123 @@ +package check + +import ( + "bytes" + "fmt" + "io" + + "github.com/ipfs/boxo/ipld/car" + "github.com/ipfs/boxo/ipld/car/v2/blockstore" + "github.com/ipfs/go-cid" +) + +func CidSetContains(a, b []cid.Cid) CheckOutput { + s1 := cid.NewSet() + for _, cid := range a { + s1.Add(cid) + } + + // for each cid in b, check if it's in a + for _, cid := range b { + if !s1.Has(cid) { + return CheckOutput{ + Success: false, + Reason: fmt.Sprintf("missing CID %s", cid), + } + } + } + + return CheckOutput{ + Success: true, + } +} + +func CidSetEquals(a, b []cid.Cid) CheckOutput { + t1 := CidSetContains(a, b) + + if !t1.Success { + return t1 + } + + return CidSetContains(b, a) +} + +func CidArrayEquals(a, b []cid.Cid) CheckOutput { + if len(a) != len(b) { + return CheckOutput{ + Success: false, + Reason: fmt.Sprintf("length mismatch: %d != %d", len(a), len(b)), + } + } + + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return CheckOutput{ + Success: false, + Reason: fmt.Sprintf("mismatch at index %d: %s != %s", i, a[i], b[i]), + } + } + } + + return CheckOutput{ + Success: true, + } +} + +func CidOrderedSubsetContains(a, b []cid.Cid) CheckOutput { + i, j := 0, 0 + + for i < len(a) && j < len(b) { + if a[i] == b[j] { + i++ + j++ + continue + } + + i++ + } + + if j != len(b) { + return CheckOutput{ + Success: false, + Reason: fmt.Sprintf("missing CID %s", b[j]), + } + } + + return CheckOutput{ + Success: true, + } +} + +func listAllCids(carContent []byte) ([]cid.Cid, error) { + reader := bytes.NewReader(carContent) + cr, err := car.NewCarReader(reader) + if err != nil { + return nil, err + } + + // aggregate all blocks, ordered + var gotCIDs []cid.Cid + for { + block, err := cr.Next() + if err == io.EOF { + break + } + if err != nil { + return nil, err + } + gotCIDs = append(gotCIDs, block.Cid()) + } + + return gotCIDs, nil +} + +func listAllRoots(carContent []byte) ([]cid.Cid, error) { + reader := bytes.NewReader(carContent) + bs, err := blockstore.NewReadOnly(reader, nil) + + if err != nil { + return nil, err + } + + return bs.Roots() +} diff --git a/tooling/check/cid_test.go b/tooling/check/cid_test.go new file mode 100644 index 000000000..d2aae7473 --- /dev/null +++ b/tooling/check/cid_test.go @@ -0,0 +1,133 @@ +package check + +import ( + "testing" + + "github.com/ipfs/go-cid" + mh "github.com/multiformats/go-multihash" + "github.com/stretchr/testify/assert" +) + +func makeCID(s string) cid.Cid { + hash, err := mh.Sum([]byte(s), mh.SHA2_256, -1) + if err != nil { + panic(err) + } + + // Create a CID using the multihash + cidV1 := cid.NewCidV1(cid.Raw, hash) + + return cidV1 +} + +func cids(s ...string) []cid.Cid { + out := make([]cid.Cid, len(s)) + for i, str := range s { + out[i] = makeCID(str) + } + return out +} + +func TestCIDContains(t *testing.T) { + a := cids("hello") + b := cids() + assert.True(t, CidSetContains(a, b).Success) + + a = cids("hello") + b = cids("hello") + assert.True(t, CidSetContains(a, b).Success) + + a = cids("hello") + b = cids("world") + assert.False(t, CidSetContains(a, b).Success) + + a = cids("hello", "world") + b = cids("hello") + assert.True(t, CidSetContains(a, b).Success) +} + +func TestCIDEquals(t *testing.T) { + a := cids("hello") + b := cids() + assert.False(t, CidSetEquals(a, b).Success) + + a = cids("hello") + b = cids("hello") + assert.True(t, CidSetEquals(a, b).Success) + + a = cids("hello", "world") + b = cids("world", "hello") + assert.True(t, CidSetEquals(a, b).Success) + + a = cids("hello") + b = cids("world") + assert.False(t, CidSetEquals(a, b).Success) + + a = cids("hello", "world") + b = cids("hello") + assert.False(t, CidSetEquals(a, b).Success) +} + +func TestCidArrayEquals(t *testing.T) { + a := cids("hello") + b := cids() + assert.False(t, CidArrayEquals(a, b).Success) + + a = cids("hello") + b = cids("hello") + assert.True(t, CidArrayEquals(a, b).Success) + + a = cids("hello", "world") + b = cids("world", "hello") + assert.False(t, CidArrayEquals(a, b).Success) + + a = cids("hello", "world") + b = cids("hello", "world", "foo") + assert.False(t, CidArrayEquals(a, b).Success) + + a = cids("hello", "world") + b = cids("hello", "world") + assert.True(t, CidArrayEquals(a, b).Success) + + a = cids("hello") + b = cids("world") + assert.False(t, CidArrayEquals(a, b).Success) + + a = cids("hello", "world") + b = cids("hello") + assert.False(t, CidArrayEquals(a, b).Success) +} + +func TestCidArrayContains(t *testing.T) { + a := cids("hello") + b := cids() + assert.True(t, CidOrderedSubsetContains(a, b).Success) + + a = cids("hello") + b = cids("hello") + assert.True(t, CidOrderedSubsetContains(a, b).Success) + + a = cids("hello", "world") + b = cids("world", "hello") + assert.False(t, CidOrderedSubsetContains(a, b).Success) + + a = cids("hello", "world") + b = cids("hello", "world", "foo") + assert.False(t, CidOrderedSubsetContains(a, b).Success) + + a = cids("hello", "world") + b = cids("hello", "world") + assert.True(t, CidOrderedSubsetContains(a, b).Success) + + a = cids("hello") + b = cids("world") + assert.False(t, CidOrderedSubsetContains(a, b).Success) + + a = cids("hello", "world") + b = cids("hello") + assert.True(t, CidOrderedSubsetContains(a, b).Success) + + a = cids("this", "hello", "world", "is", "a", "test") + b = cids("hello", "a", "test") + assert.True(t, CidOrderedSubsetContains(a, b).Success) +}