From 43a270947010191e5e8b90a2db29bff2b0de7d1e Mon Sep 17 00:00:00 2001 From: David Simansky Date: Thu, 2 Jun 2022 04:57:47 +0200 Subject: [PATCH] [release-v1.2.0] Add kn-plugin-func v0.24.0 (#1066) * [release-v1.2.0] Add kn-plugin-func v0.24.0 * Update vendor dir --- go.mod | 35 +- go.sum | 1503 +- openshift/release/kn.yaml | 8 +- pkg/kn/root/plugin_register.go | 1 + .../github.com/ProtonMail/go-crypto/LICENSE | 27 + .../coreos/go-semver/semver/LICENSE | 202 + .../github.com/coreos/go-semver/semver/NOTICE | 5 + .../github.com/emirpasic/gods/LICENSE | 41 + .../github.com/go-git/gcfg/LICENSE | 28 + .../github.com/go-git/go-billy/v5/LICENSE | 201 + .../github.com/go-git/go-git/v5/LICENSE | 201 + .../github.com/jbenet/go-context/io/LICENSE | 21 + .../github.com/kevinburke/ssh_config/LICENSE | 49 + .../sergi/go-diff/diffmatchpatch/LICENSE | 20 + .../github.com/whilp/git-urls/LICENSE | 21 + .../github.com/xanzy/ssh-agent/LICENSE | 202 + .../go.uber.org/multierr/LICENSE.txt | 2 +- .../gopkg.in/warnings.v0/LICENSE | 24 + .../knative.dev/kn-plugin-func/LICENSE | 202 + .../github.com/Microsoft/go-winio/.gitignore | 1 + .../github.com/Microsoft/go-winio/CODEOWNERS | 1 + vendor/github.com/Microsoft/go-winio/LICENSE | 22 + .../github.com/Microsoft/go-winio/README.md | 37 + .../github.com/Microsoft/go-winio/backup.go | 280 + vendor/github.com/Microsoft/go-winio/ea.go | 137 + vendor/github.com/Microsoft/go-winio/file.go | 329 + .../github.com/Microsoft/go-winio/fileinfo.go | 73 + vendor/github.com/Microsoft/go-winio/go.mod | 8 + vendor/github.com/Microsoft/go-winio/go.sum | 11 + .../github.com/Microsoft/go-winio/hvsock.go | 316 + vendor/github.com/Microsoft/go-winio/pipe.go | 517 + .../Microsoft/go-winio/pkg/guid/guid.go | 228 + .../go-winio/pkg/guid/guid_nonwindows.go | 15 + .../go-winio/pkg/guid/guid_windows.go | 10 + .../Microsoft/go-winio/privilege.go | 203 + .../github.com/Microsoft/go-winio/reparse.go | 128 + vendor/github.com/Microsoft/go-winio/sd.go | 98 + .../github.com/Microsoft/go-winio/syscall.go | 3 + .../Microsoft/go-winio/zsyscall_windows.go | 427 + .../github.com/ProtonMail/go-crypto/AUTHORS | 3 + .../ProtonMail/go-crypto/CONTRIBUTORS | 3 + .../github.com/ProtonMail/go-crypto/LICENSE | 27 + .../github.com/ProtonMail/go-crypto/PATENTS | 22 + .../go-crypto/bitcurves/bitcurve.go | 381 + .../go-crypto/brainpool/brainpool.go | 134 + .../ProtonMail/go-crypto/brainpool/rcurve.go | 83 + .../ProtonMail/go-crypto/eax/eax.go | 162 + .../go-crypto/eax/eax_test_vectors.go | 58 + .../go-crypto/eax/random_vectors.go | 131 + .../go-crypto/internal/byteutil/byteutil.go | 92 + .../ProtonMail/go-crypto/ocb/ocb.go | 317 + .../go-crypto/ocb/random_vectors.go | 136 + .../ocb/rfc7253_test_vectors_suite_a.go | 78 + .../ocb/rfc7253_test_vectors_suite_b.go | 24 + .../go-crypto/openpgp/aes/keywrap/keywrap.go | 153 + .../go-crypto/openpgp/armor/armor.go | 224 + .../go-crypto/openpgp/armor/encode.go | 160 + .../go-crypto/openpgp/canonical_text.go | 65 + .../ProtonMail/go-crypto/openpgp/ecdh/ecdh.go | 165 + .../go-crypto/openpgp/ecdh/x25519.go | 157 + .../go-crypto/openpgp/elgamal/elgamal.go | 124 + .../go-crypto/openpgp/errors/errors.go | 116 + .../openpgp/internal/algorithm/aead.go | 65 + .../openpgp/internal/algorithm/cipher.go | 107 + .../openpgp/internal/algorithm/hash.go | 86 + .../openpgp/internal/ecc/curveInfo.go | 118 + .../openpgp/internal/ecc/curveType.go | 10 + .../openpgp/internal/encoding/encoding.go | 27 + .../openpgp/internal/encoding/mpi.go | 91 + .../openpgp/internal/encoding/oid.go | 88 + .../go-crypto/openpgp/key_generation.go | 384 + .../ProtonMail/go-crypto/openpgp/keys.go | 789 + .../go-crypto/openpgp/keys_test_data.go | 400 + .../go-crypto/openpgp/packet/aead_config.go | 56 + .../openpgp/packet/aead_encrypted.go | 364 + .../go-crypto/openpgp/packet/compressed.go | 123 + .../go-crypto/openpgp/packet/config.go | 167 + .../go-crypto/openpgp/packet/encrypted_key.go | 282 + .../go-crypto/openpgp/packet/literal.go | 91 + .../go-crypto/openpgp/packet/ocfb.go | 137 + .../openpgp/packet/one_pass_signature.go | 73 + .../go-crypto/openpgp/packet/opaque.go | 162 + .../go-crypto/openpgp/packet/packet.go | 523 + .../go-crypto/openpgp/packet/private_key.go | 780 + .../openpgp/packet/private_key_test_data.go | 12 + .../go-crypto/openpgp/packet/public_key.go | 825 + .../openpgp/packet/public_key_test_data.go | 24 + .../go-crypto/openpgp/packet/reader.go | 78 + .../go-crypto/openpgp/packet/signature.go | 991 ++ .../openpgp/packet/symmetric_key_encrypted.go | 267 + .../openpgp/packet/symmetrically_encrypted.go | 290 + .../go-crypto/openpgp/packet/userattribute.go | 94 + .../go-crypto/openpgp/packet/userid.go | 160 + .../ProtonMail/go-crypto/openpgp/read.go | 528 + .../go-crypto/openpgp/read_write_test_data.go | 173 + .../ProtonMail/go-crypto/openpgp/s2k/s2k.go | 367 + .../ProtonMail/go-crypto/openpgp/write.go | 568 + vendor/github.com/acomagu/bufpipe/README.md | 42 + vendor/github.com/acomagu/bufpipe/bufpipe.go | 128 + vendor/github.com/acomagu/bufpipe/doc.go | 2 + vendor/github.com/acomagu/bufpipe/go.mod | 5 + vendor/github.com/acomagu/bufpipe/go.sum | 2 + .../antlr/antlr4/runtime/Go/antlr/utils.go | 121 +- vendor/github.com/coreos/go-semver/LICENSE | 202 + vendor/github.com/coreos/go-semver/NOTICE | 5 + .../coreos/go-semver/semver/semver.go | 296 + .../coreos/go-semver/semver/sort.go | 38 + vendor/github.com/emirpasic/gods/LICENSE | 41 + .../emirpasic/gods/containers/containers.go | 35 + .../emirpasic/gods/containers/enumerable.go | 61 + .../emirpasic/gods/containers/iterator.go | 109 + .../gods/containers/serialization.go | 17 + .../gods/lists/arraylist/arraylist.go | 228 + .../gods/lists/arraylist/enumerable.go | 79 + .../gods/lists/arraylist/iterator.go | 83 + .../gods/lists/arraylist/serialization.go | 29 + .../github.com/emirpasic/gods/lists/lists.go | 33 + .../gods/trees/binaryheap/binaryheap.go | 163 + .../gods/trees/binaryheap/iterator.go | 84 + .../gods/trees/binaryheap/serialization.go | 22 + .../github.com/emirpasic/gods/trees/trees.go | 21 + .../emirpasic/gods/utils/comparator.go | 251 + .../github.com/emirpasic/gods/utils/sort.go | 29 + .../github.com/emirpasic/gods/utils/utils.go | 47 + vendor/github.com/go-git/gcfg/LICENSE | 28 + vendor/github.com/go-git/gcfg/README | 4 + vendor/github.com/go-git/gcfg/doc.go | 145 + vendor/github.com/go-git/gcfg/errors.go | 41 + vendor/github.com/go-git/gcfg/go1_0.go | 7 + vendor/github.com/go-git/gcfg/go1_2.go | 9 + vendor/github.com/go-git/gcfg/read.go | 273 + .../github.com/go-git/gcfg/scanner/errors.go | 121 + .../github.com/go-git/gcfg/scanner/scanner.go | 342 + vendor/github.com/go-git/gcfg/set.go | 332 + .../github.com/go-git/gcfg/token/position.go | 435 + .../github.com/go-git/gcfg/token/serialize.go | 56 + vendor/github.com/go-git/gcfg/token/token.go | 83 + vendor/github.com/go-git/gcfg/types/bool.go | 23 + vendor/github.com/go-git/gcfg/types/doc.go | 4 + vendor/github.com/go-git/gcfg/types/enum.go | 44 + vendor/github.com/go-git/gcfg/types/int.go | 86 + vendor/github.com/go-git/gcfg/types/scan.go | 23 + .../github.com/go-git/go-billy/v5/.gitignore | 4 + vendor/github.com/go-git/go-billy/v5/LICENSE | 201 + .../github.com/go-git/go-billy/v5/README.md | 73 + vendor/github.com/go-git/go-billy/v5/fs.go | 202 + vendor/github.com/go-git/go-billy/v5/go.mod | 10 + vendor/github.com/go-git/go-billy/v5/go.sum | 14 + .../go-billy/v5/helper/chroot/chroot.go | 242 + .../go-billy/v5/helper/polyfill/polyfill.go | 105 + .../go-git/go-billy/v5/memfs/memory.go | 410 + .../go-git/go-billy/v5/memfs/storage.go | 229 + .../github.com/go-git/go-billy/v5/osfs/os.go | 144 + .../go-git/go-billy/v5/osfs/os_js.go | 21 + .../go-git/go-billy/v5/osfs/os_plan9.go | 85 + .../go-git/go-billy/v5/osfs/os_posix.go | 27 + .../go-git/go-billy/v5/osfs/os_windows.go | 61 + .../go-git/go-billy/v5/util/glob.go | 111 + .../go-git/go-billy/v5/util/util.go | 282 + vendor/github.com/go-git/go-git/v5/.gitignore | 4 + .../go-git/go-git/v5/CODE_OF_CONDUCT.md | 74 + .../go-git/go-git/v5/COMPATIBILITY.md | 111 + .../go-git/go-git/v5/CONTRIBUTING.md | 46 + vendor/github.com/go-git/go-git/v5/LICENSE | 201 + vendor/github.com/go-git/go-git/v5/Makefile | 38 + vendor/github.com/go-git/go-git/v5/README.md | 131 + vendor/github.com/go-git/go-git/v5/blame.go | 302 + vendor/github.com/go-git/go-git/v5/common.go | 20 + .../go-git/go-git/v5/config/branch.go | 90 + .../go-git/go-git/v5/config/config.go | 659 + .../go-git/go-git/v5/config/modules.go | 139 + .../go-git/go-git/v5/config/refspec.go | 155 + .../github.com/go-git/go-git/v5/config/url.go | 81 + vendor/github.com/go-git/go-git/v5/doc.go | 10 + vendor/github.com/go-git/go-git/v5/go.mod | 31 + vendor/github.com/go-git/go-git/v5/go.sum | 103 + .../go-git/v5/internal/revision/parser.go | 622 + .../go-git/v5/internal/revision/scanner.go | 117 + .../go-git/v5/internal/revision/token.go | 28 + .../go-git/go-git/v5/internal/url/url.go | 37 + .../go-git/go-git/v5/object_walker.go | 104 + vendor/github.com/go-git/go-git/v5/options.go | 634 + .../go-git/v5/plumbing/cache/buffer_lru.go | 98 + .../go-git/go-git/v5/plumbing/cache/common.go | 39 + .../go-git/v5/plumbing/cache/object_lru.go | 101 + .../go-git/go-git/v5/plumbing/color/color.go | 38 + .../go-git/go-git/v5/plumbing/error.go | 35 + .../go-git/v5/plumbing/filemode/filemode.go | 188 + .../v5/plumbing/format/config/common.go | 109 + .../v5/plumbing/format/config/decoder.go | 37 + .../go-git/v5/plumbing/format/config/doc.go | 122 + .../v5/plumbing/format/config/encoder.go | 77 + .../v5/plumbing/format/config/option.go | 127 + .../v5/plumbing/format/config/section.go | 181 + .../v5/plumbing/format/diff/colorconfig.go | 97 + .../go-git/v5/plumbing/format/diff/patch.go | 58 + .../plumbing/format/diff/unified_encoder.go | 395 + .../v5/plumbing/format/gitignore/dir.go | 135 + .../v5/plumbing/format/gitignore/doc.go | 70 + .../v5/plumbing/format/gitignore/matcher.go | 30 + .../v5/plumbing/format/gitignore/pattern.go | 153 + .../v5/plumbing/format/idxfile/decoder.go | 177 + .../go-git/v5/plumbing/format/idxfile/doc.go | 128 + .../v5/plumbing/format/idxfile/encoder.go | 142 + .../v5/plumbing/format/idxfile/idxfile.go | 346 + .../v5/plumbing/format/idxfile/writer.go | 186 + .../v5/plumbing/format/index/decoder.go | 479 + .../go-git/v5/plumbing/format/index/doc.go | 360 + .../v5/plumbing/format/index/encoder.go | 150 + .../go-git/v5/plumbing/format/index/index.go | 213 + .../go-git/v5/plumbing/format/index/match.go | 186 + .../go-git/v5/plumbing/format/objfile/doc.go | 2 + .../v5/plumbing/format/objfile/reader.go | 114 + .../v5/plumbing/format/objfile/writer.go | 109 + .../v5/plumbing/format/packfile/common.go | 78 + .../plumbing/format/packfile/delta_index.go | 297 + .../format/packfile/delta_selector.go | 369 + .../v5/plumbing/format/packfile/diff_delta.go | 204 + .../go-git/v5/plumbing/format/packfile/doc.go | 39 + .../v5/plumbing/format/packfile/encoder.go | 225 + .../v5/plumbing/format/packfile/error.go | 30 + .../v5/plumbing/format/packfile/fsobject.go | 116 + .../plumbing/format/packfile/object_pack.go | 164 + .../v5/plumbing/format/packfile/packfile.go | 565 + .../v5/plumbing/format/packfile/parser.go | 495 + .../plumbing/format/packfile/patch_delta.go | 252 + .../v5/plumbing/format/packfile/scanner.go | 466 + .../v5/plumbing/format/pktline/encoder.go | 122 + .../v5/plumbing/format/pktline/scanner.go | 134 + .../go-git/go-git/v5/plumbing/hash.go | 83 + .../go-git/go-git/v5/plumbing/memory.go | 72 + .../go-git/go-git/v5/plumbing/object.go | 111 + .../go-git/go-git/v5/plumbing/object/blob.go | 144 + .../go-git/v5/plumbing/object/change.go | 159 + .../v5/plumbing/object/change_adaptor.go | 61 + .../go-git/v5/plumbing/object/commit.go | 442 + .../v5/plumbing/object/commit_walker.go | 327 + .../v5/plumbing/object/commit_walker_bfs.go | 100 + .../object/commit_walker_bfs_filtered.go | 175 + .../v5/plumbing/object/commit_walker_ctime.go | 103 + .../v5/plumbing/object/commit_walker_limit.go | 65 + .../v5/plumbing/object/commit_walker_path.go | 160 + .../go-git/v5/plumbing/object/common.go | 12 + .../go-git/v5/plumbing/object/difftree.go | 98 + .../go-git/go-git/v5/plumbing/object/file.go | 137 + .../go-git/v5/plumbing/object/merge_base.go | 210 + .../go-git/v5/plumbing/object/object.go | 239 + .../go-git/go-git/v5/plumbing/object/patch.go | 354 + .../go-git/v5/plumbing/object/rename.go | 813 + .../go-git/go-git/v5/plumbing/object/tag.go | 357 + .../go-git/go-git/v5/plumbing/object/tree.go | 525 + .../go-git/v5/plumbing/object/treenoder.go | 136 + .../v5/plumbing/protocol/packp/advrefs.go | 211 + .../plumbing/protocol/packp/advrefs_decode.go | 288 + .../plumbing/protocol/packp/advrefs_encode.go | 176 + .../protocol/packp/capability/capability.go | 259 + .../protocol/packp/capability/list.go | 193 + .../v5/plumbing/protocol/packp/common.go | 70 + .../go-git/v5/plumbing/protocol/packp/doc.go | 724 + .../plumbing/protocol/packp/report_status.go | 165 + .../v5/plumbing/protocol/packp/shallowupd.go | 92 + .../protocol/packp/sideband/common.go | 33 + .../plumbing/protocol/packp/sideband/demux.go | 148 + .../plumbing/protocol/packp/sideband/doc.go | 31 + .../plumbing/protocol/packp/sideband/muxer.go | 65 + .../v5/plumbing/protocol/packp/srvresp.go | 127 + .../v5/plumbing/protocol/packp/ulreq.go | 168 + .../plumbing/protocol/packp/ulreq_decode.go | 257 + .../plumbing/protocol/packp/ulreq_encode.go | 145 + .../v5/plumbing/protocol/packp/updreq.go | 122 + .../plumbing/protocol/packp/updreq_decode.go | 250 + .../plumbing/protocol/packp/updreq_encode.go | 75 + .../v5/plumbing/protocol/packp/uppackreq.go | 98 + .../v5/plumbing/protocol/packp/uppackresp.go | 109 + .../go-git/go-git/v5/plumbing/reference.go | 209 + .../go-git/go-git/v5/plumbing/revision.go | 11 + .../go-git/v5/plumbing/revlist/revlist.go | 230 + .../go-git/go-git/v5/plumbing/storer/doc.go | 2 + .../go-git/go-git/v5/plumbing/storer/index.go | 9 + .../go-git/v5/plumbing/storer/object.go | 288 + .../go-git/v5/plumbing/storer/reference.go | 240 + .../go-git/v5/plumbing/storer/shallow.go | 10 + .../go-git/v5/plumbing/storer/storer.go | 15 + .../v5/plumbing/transport/client/client.go | 83 + .../go-git/v5/plumbing/transport/common.go | 283 + .../v5/plumbing/transport/file/client.go | 157 + .../v5/plumbing/transport/file/server.go | 53 + .../v5/plumbing/transport/git/common.go | 109 + .../v5/plumbing/transport/http/common.go | 282 + .../plumbing/transport/http/receive_pack.go | 110 + .../v5/plumbing/transport/http/upload_pack.go | 127 + .../transport/internal/common/common.go | 478 + .../transport/internal/common/server.go | 73 + .../v5/plumbing/transport/server/loader.go | 64 + .../v5/plumbing/transport/server/server.go | 432 + .../v5/plumbing/transport/ssh/auth_method.go | 308 + .../v5/plumbing/transport/ssh/common.go | 235 + vendor/github.com/go-git/go-git/v5/prune.go | 66 + .../github.com/go-git/go-git/v5/references.go | 264 + vendor/github.com/go-git/go-git/v5/remote.go | 1262 ++ .../github.com/go-git/go-git/v5/repository.go | 1722 +++ vendor/github.com/go-git/go-git/v5/status.go | 79 + .../go-git/v5/storage/filesystem/config.go | 48 + .../v5/storage/filesystem/deltaobject.go | 37 + .../v5/storage/filesystem/dotgit/dotgit.go | 1188 ++ .../dotgit/dotgit_rewrite_packed_refs.go | 81 + .../filesystem/dotgit/dotgit_setref.go | 90 + .../dotgit/repository_filesystem.go | 111 + .../v5/storage/filesystem/dotgit/writers.go | 284 + .../go-git/v5/storage/filesystem/index.go | 54 + .../go-git/v5/storage/filesystem/module.go | 20 + .../go-git/v5/storage/filesystem/object.go | 848 + .../go-git/v5/storage/filesystem/reference.go | 44 + .../go-git/v5/storage/filesystem/shallow.go | 54 + .../go-git/v5/storage/filesystem/storage.go | 73 + .../go-git/v5/storage/memory/storage.go | 320 + .../go-git/go-git/v5/storage/storer.go | 30 + .../github.com/go-git/go-git/v5/submodule.go | 397 + .../go-git/go-git/v5/utils/binary/read.go | 180 + .../go-git/go-git/v5/utils/binary/write.go | 50 + .../go-git/go-git/v5/utils/diff/diff.go | 61 + .../go-git/go-git/v5/utils/ioutil/common.go | 180 + .../go-git/go-git/v5/utils/ioutil/pipe.go | 9 + .../go-git/go-git/v5/utils/ioutil/pipe_js.go | 9 + .../go-git/v5/utils/merkletrie/change.go | 149 + .../go-git/v5/utils/merkletrie/difftree.go | 428 + .../go-git/go-git/v5/utils/merkletrie/doc.go | 34 + .../go-git/v5/utils/merkletrie/doubleiter.go | 187 + .../v5/utils/merkletrie/filesystem/node.go | 195 + .../go-git/v5/utils/merkletrie/index/node.go | 90 + .../utils/merkletrie/internal/frame/frame.go | 91 + .../go-git/go-git/v5/utils/merkletrie/iter.go | 216 + .../go-git/v5/utils/merkletrie/noder/noder.go | 59 + .../go-git/v5/utils/merkletrie/noder/path.go | 90 + .../github.com/go-git/go-git/v5/worktree.go | 965 ++ .../go-git/go-git/v5/worktree_bsd.go | 26 + .../go-git/go-git/v5/worktree_commit.go | 238 + .../go-git/go-git/v5/worktree_js.go | 26 + .../go-git/go-git/v5/worktree_linux.go | 26 + .../go-git/go-git/v5/worktree_plan9.go | 31 + .../go-git/go-git/v5/worktree_status.go | 708 + .../go-git/go-git/v5/worktree_unix_other.go | 26 + .../go-git/go-git/v5/worktree_windows.go | 35 + .../go-openapi/jsonreference/go.mod | 3 +- .../go-openapi/jsonreference/go.sum | 15 +- vendor/github.com/golang-jwt/jwt/v4/README.md | 13 +- vendor/github.com/golang-jwt/jwt/v4/claims.go | 12 +- vendor/github.com/golang-jwt/jwt/v4/errors.go | 48 + .../golang-jwt/jwt/v4/map_claims.go | 3 + .../golang-jwt/jwt/v4/parser_option.go | 4 +- vendor/github.com/golang-jwt/jwt/v4/token.go | 25 +- vendor/github.com/golang-jwt/jwt/v4/types.go | 6 +- vendor/github.com/jbenet/go-context/LICENSE | 21 + .../github.com/jbenet/go-context/io/ctxio.go | 120 + .../kevinburke/ssh_config/.gitattributes | 1 + .../kevinburke/ssh_config/.gitignore | 0 .../github.com/kevinburke/ssh_config/.mailmap | 1 + .../kevinburke/ssh_config/AUTHORS.txt | 6 + .../github.com/kevinburke/ssh_config/LICENSE | 49 + .../github.com/kevinburke/ssh_config/Makefile | 30 + .../kevinburke/ssh_config/README.md | 89 + .../kevinburke/ssh_config/config.go | 793 + .../github.com/kevinburke/ssh_config/lexer.go | 240 + .../kevinburke/ssh_config/parser.go | 191 + .../kevinburke/ssh_config/position.go | 25 + .../github.com/kevinburke/ssh_config/token.go | 49 + .../kevinburke/ssh_config/validators.go | 186 + .../github.com/klauspost/compress/README.md | 28 +- .../klauspost/compress/huff0/decompress.go | 333 +- .../klauspost/compress/huff0/huff0.go | 2 + .../klauspost/compress/zstd/enc_fast.go | 4 +- vendor/github.com/prometheus/procfs/Makefile | 2 + .../prometheus/procfs/Makefile.common | 15 +- vendor/github.com/prometheus/procfs/README.md | 4 +- .../github.com/prometheus/procfs/cmdline.go | 30 + vendor/github.com/prometheus/procfs/doc.go | 2 +- .../prometheus/procfs/fixtures.ttar | 1266 +- vendor/github.com/prometheus/procfs/mdstat.go | 105 +- .../prometheus/procfs/net_ip_socket.go | 10 +- .../github.com/prometheus/procfs/netstat.go | 68 + .../prometheus/procfs/proc_cgroup.go | 2 +- .../github.com/prometheus/procfs/proc_stat.go | 32 +- .../github.com/prometheus/procfs/zoneinfo.go | 1 - vendor/github.com/sergi/go-diff/AUTHORS | 25 + vendor/github.com/sergi/go-diff/CONTRIBUTORS | 32 + vendor/github.com/sergi/go-diff/LICENSE | 20 + .../sergi/go-diff/diffmatchpatch/diff.go | 1352 ++ .../go-diff/diffmatchpatch/diffmatchpatch.go | 46 + .../sergi/go-diff/diffmatchpatch/match.go | 160 + .../sergi/go-diff/diffmatchpatch/mathutil.go | 23 + .../diffmatchpatch/operation_string.go | 17 + .../sergi/go-diff/diffmatchpatch/patch.go | 556 + .../go-diff/diffmatchpatch/stringutil.go | 106 + vendor/github.com/whilp/git-urls/.travis.yml | 7 + vendor/github.com/whilp/git-urls/LICENSE | 21 + vendor/github.com/whilp/git-urls/Makefile | 16 + vendor/github.com/whilp/git-urls/README.md | 3 + vendor/github.com/whilp/git-urls/go.mod | 3 + vendor/github.com/whilp/git-urls/urls.go | 150 + vendor/github.com/xanzy/ssh-agent/.gitignore | 24 + vendor/github.com/xanzy/ssh-agent/LICENSE | 202 + vendor/github.com/xanzy/ssh-agent/README.md | 23 + vendor/github.com/xanzy/ssh-agent/go.mod | 9 + vendor/github.com/xanzy/ssh-agent/go.sum | 20 + .../xanzy/ssh-agent/pageant_windows.go | 143 + vendor/github.com/xanzy/ssh-agent/sshagent.go | 49 + .../xanzy/ssh-agent/sshagent_windows.go | 103 + vendor/go.uber.org/multierr/.travis.yml | 23 - vendor/go.uber.org/multierr/CHANGELOG.md | 6 + vendor/go.uber.org/multierr/LICENSE.txt | 2 +- vendor/go.uber.org/multierr/Makefile | 6 +- vendor/go.uber.org/multierr/README.md | 8 +- vendor/go.uber.org/multierr/error.go | 208 +- vendor/go.uber.org/multierr/go.mod | 5 +- vendor/go.uber.org/multierr/go.sum | 9 +- vendor/go.uber.org/multierr/go113.go | 52 - vendor/go.uber.org/zap/.readme.tmpl | 12 +- vendor/go.uber.org/zap/CHANGELOG.md | 29 +- vendor/go.uber.org/zap/README.md | 44 +- vendor/go.uber.org/zap/global.go | 1 + vendor/go.uber.org/zap/global_prego112.go | 26 - vendor/go.uber.org/zap/go.mod | 2 +- vendor/go.uber.org/zap/go.sum | 4 +- vendor/go.uber.org/zap/zapcore/clock.go | 4 +- .../zap/zapcore/console_encoder.go | 6 +- vendor/go.uber.org/zap/zapcore/encoder.go | 21 +- .../go.uber.org/zap/zapcore/json_encoder.go | 90 +- .../reflected_encoder.go} | 25 +- vendor/go.uber.org/zap/zapcore/sampler.go | 15 +- vendor/golang.org/x/crypto/blowfish/block.go | 159 + vendor/golang.org/x/crypto/blowfish/cipher.go | 99 + vendor/golang.org/x/crypto/blowfish/const.go | 199 + vendor/golang.org/x/crypto/cast5/cast5.go | 533 + .../x/crypto/chacha20/chacha_arm64.go | 17 + .../x/crypto/chacha20/chacha_arm64.s | 308 + .../x/crypto/chacha20/chacha_generic.go | 398 + .../x/crypto/chacha20/chacha_noasm.go | 14 + .../x/crypto/chacha20/chacha_ppc64le.go | 17 + .../x/crypto/chacha20/chacha_ppc64le.s | 450 + .../x/crypto/chacha20/chacha_s390x.go | 27 + .../x/crypto/chacha20/chacha_s390x.s | 225 + vendor/golang.org/x/crypto/chacha20/xor.go | 42 + .../x/crypto/curve25519/curve25519.go | 145 + .../x/crypto/curve25519/internal/field/README | 7 + .../x/crypto/curve25519/internal/field/fe.go | 416 + .../curve25519/internal/field/fe_amd64.go | 13 + .../curve25519/internal/field/fe_amd64.s | 379 + .../internal/field/fe_amd64_noasm.go | 12 + .../curve25519/internal/field/fe_arm64.go | 16 + .../curve25519/internal/field/fe_arm64.s | 43 + .../internal/field/fe_arm64_noasm.go | 12 + .../curve25519/internal/field/fe_generic.go | 264 + .../curve25519/internal/field/sync.checkpoint | 1 + .../crypto/curve25519/internal/field/sync.sh | 19 + vendor/golang.org/x/crypto/ed25519/ed25519.go | 71 + .../x/crypto/internal/poly1305/bits_compat.go | 40 + .../x/crypto/internal/poly1305/bits_go1.13.go | 22 + .../x/crypto/internal/poly1305/mac_noasm.go | 10 + .../x/crypto/internal/poly1305/poly1305.go | 99 + .../x/crypto/internal/poly1305/sum_amd64.go | 48 + .../x/crypto/internal/poly1305/sum_amd64.s | 109 + .../x/crypto/internal/poly1305/sum_generic.go | 310 + .../x/crypto/internal/poly1305/sum_ppc64le.go | 48 + .../x/crypto/internal/poly1305/sum_ppc64le.s | 182 + .../x/crypto/internal/poly1305/sum_s390x.go | 76 + .../x/crypto/internal/poly1305/sum_s390x.s | 504 + .../x/crypto/internal/subtle/aliasing.go | 33 + .../crypto/internal/subtle/aliasing_purego.go | 36 + .../golang.org/x/crypto/ssh/agent/client.go | 813 + .../golang.org/x/crypto/ssh/agent/forward.go | 103 + .../golang.org/x/crypto/ssh/agent/keyring.go | 241 + .../golang.org/x/crypto/ssh/agent/server.go | 570 + vendor/golang.org/x/crypto/ssh/buffer.go | 97 + vendor/golang.org/x/crypto/ssh/certs.go | 566 + vendor/golang.org/x/crypto/ssh/channel.go | 633 + vendor/golang.org/x/crypto/ssh/cipher.go | 789 + vendor/golang.org/x/crypto/ssh/client.go | 291 + vendor/golang.org/x/crypto/ssh/client_auth.go | 641 + vendor/golang.org/x/crypto/ssh/common.go | 410 + vendor/golang.org/x/crypto/ssh/connection.go | 143 + vendor/golang.org/x/crypto/ssh/doc.go | 21 + vendor/golang.org/x/crypto/ssh/handshake.go | 668 + .../ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go | 93 + vendor/golang.org/x/crypto/ssh/kex.go | 782 + vendor/golang.org/x/crypto/ssh/keys.go | 1483 ++ .../x/crypto/ssh/knownhosts/knownhosts.go | 540 + vendor/golang.org/x/crypto/ssh/mac.go | 61 + vendor/golang.org/x/crypto/ssh/messages.go | 866 ++ vendor/golang.org/x/crypto/ssh/mux.go | 351 + vendor/golang.org/x/crypto/ssh/server.go | 744 + vendor/golang.org/x/crypto/ssh/session.go | 647 + vendor/golang.org/x/crypto/ssh/ssh_gss.go | 139 + vendor/golang.org/x/crypto/ssh/streamlocal.go | 116 + vendor/golang.org/x/crypto/ssh/tcpip.go | 474 + vendor/golang.org/x/crypto/ssh/transport.go | 353 + vendor/golang.org/x/net/http2/go118.go | 17 + vendor/golang.org/x/net/http2/not_go118.go | 17 + vendor/golang.org/x/net/http2/transport.go | 41 +- vendor/golang.org/x/oauth2/go.mod | 2 +- vendor/golang.org/x/oauth2/go.sum | 7 +- vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 18 + vendor/golang.org/x/sys/cpu/byteorder.go | 65 + vendor/golang.org/x/sys/cpu/cpu.go | 287 + vendor/golang.org/x/sys/cpu/cpu_aix.go | 34 + vendor/golang.org/x/sys/cpu/cpu_arm.go | 73 + vendor/golang.org/x/sys/cpu/cpu_arm64.go | 172 + vendor/golang.org/x/sys/cpu/cpu_arm64.s | 32 + vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 12 + vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 22 + vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 17 + .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 12 + .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 23 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 43 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 33 + vendor/golang.org/x/sys/cpu/cpu_linux.go | 16 + vendor/golang.org/x/sys/cpu/cpu_linux_arm.go | 39 + .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 71 + .../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 24 + .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 10 + .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 32 + .../golang.org/x/sys/cpu/cpu_linux_s390x.go | 40 + vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 16 + vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 12 + .../golang.org/x/sys/cpu/cpu_netbsd_arm64.go | 173 + vendor/golang.org/x/sys/cpu/cpu_other_arm.go | 10 + .../golang.org/x/sys/cpu/cpu_other_arm64.go | 10 + .../golang.org/x/sys/cpu/cpu_other_mips64x.go | 13 + vendor/golang.org/x/sys/cpu/cpu_ppc64x.go | 17 + vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 12 + vendor/golang.org/x/sys/cpu/cpu_s390x.go | 172 + vendor/golang.org/x/sys/cpu/cpu_s390x.s | 58 + vendor/golang.org/x/sys/cpu/cpu_wasm.go | 18 + vendor/golang.org/x/sys/cpu/cpu_x86.go | 145 + vendor/golang.org/x/sys/cpu/cpu_x86.s | 28 + vendor/golang.org/x/sys/cpu/cpu_zos.go | 10 + vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go | 25 + vendor/golang.org/x/sys/cpu/hwcap_linux.go | 56 + .../golang.org/x/sys/cpu/syscall_aix_gccgo.go | 27 + .../x/sys/cpu/syscall_aix_ppc64_gc.go | 36 + vendor/golang.org/x/sys/unix/ioctl_linux.go | 23 + vendor/golang.org/x/sys/unix/mkerrors.sh | 3 + vendor/golang.org/x/sys/unix/syscall_linux.go | 7 + .../x/sys/unix/syscall_linux_386.go | 8 - .../x/sys/unix/syscall_linux_amd64.go | 1 - .../x/sys/unix/syscall_linux_arm.go | 1 - .../x/sys/unix/syscall_linux_arm64.go | 1 - .../x/sys/unix/syscall_linux_mips64x.go | 1 - .../x/sys/unix/syscall_linux_mipsx.go | 1 - .../x/sys/unix/syscall_linux_ppc.go | 1 - .../x/sys/unix/syscall_linux_ppc64x.go | 1 - .../x/sys/unix/syscall_linux_riscv64.go | 1 - .../x/sys/unix/syscall_linux_s390x.go | 9 - .../x/sys/unix/syscall_linux_sparc64.go | 1 - vendor/golang.org/x/sys/unix/zerrors_linux.go | 17 + .../x/sys/unix/zsyscall_linux_amd64.go | 11 - .../x/sys/unix/zsyscall_linux_arm.go | 11 - .../x/sys/unix/zsyscall_linux_arm64.go | 11 - .../x/sys/unix/zsyscall_linux_mips.go | 11 - .../x/sys/unix/zsyscall_linux_mips64.go | 11 - .../x/sys/unix/zsyscall_linux_mips64le.go | 11 - .../x/sys/unix/zsyscall_linux_mipsle.go | 11 - .../x/sys/unix/zsyscall_linux_ppc.go | 11 - .../x/sys/unix/zsyscall_linux_ppc64.go | 11 - .../x/sys/unix/zsyscall_linux_ppc64le.go | 11 - .../x/sys/unix/zsyscall_linux_riscv64.go | 11 - .../x/sys/unix/zsyscall_linux_sparc64.go | 11 - vendor/golang.org/x/sys/unix/ztypes_linux.go | 90 + .../x/sys/unix/ztypes_linux_s390x.go | 4 +- vendor/gopkg.in/warnings.v0/LICENSE | 24 + vendor/gopkg.in/warnings.v0/README | 77 + vendor/gopkg.in/warnings.v0/warnings.go | 194 + vendor/gotest.tools/v3/assert/assert_go113.go | 20 + .../v3/assert/cmp/compare_go113.go | 29 + .../k8s.io/kube-openapi/pkg/common/common.go | 7 + .../kube-openapi/pkg/common/interfaces.go | 88 + vendor/k8s.io/utils/pointer/pointer.go | 31 +- vendor/knative.dev/hack/README.md | 5 + vendor/knative.dev/hack/e2e-tests.sh | 3 - vendor/knative.dev/hack/infra-library.sh | 26 +- vendor/knative.dev/hack/presubmit-tests.sh | 4 +- .../knative.dev/kn-plugin-func/.codecov.yaml | 4 + .../knative.dev/kn-plugin-func/.gitattributes | 4 + vendor/knative.dev/kn-plugin-func/.gitignore | 18 + .../knative.dev/kn-plugin-func/.golangci.yaml | 31 + vendor/knative.dev/kn-plugin-func/.ko.yaml | 3 + .../.unicode-control-characters.config.py | 3 + vendor/knative.dev/kn-plugin-func/.versionrc | 16 + vendor/knative.dev/kn-plugin-func/AUTHORS | 7 + .../knative.dev/kn-plugin-func/CHANGELOG.md | 691 + .../kn-plugin-func/CODE-OF-CONDUCT.md | 3 + vendor/knative.dev/kn-plugin-func/LICENSE | 202 + vendor/knative.dev/kn-plugin-func/Makefile | 181 + vendor/knative.dev/kn-plugin-func/README.md | 17 + vendor/knative.dev/kn-plugin-func/ci | 1 + vendor/knative.dev/kn-plugin-func/client.go | 973 ++ vendor/knative.dev/kn-plugin-func/config.go | 5 + .../knative.dev/kn-plugin-func/filesystem.go | 250 + vendor/knative.dev/kn-plugin-func/function.go | 525 + .../kn-plugin-func/function_buildtype.go | 55 + .../kn-plugin-func/function_envs.go | 126 + .../kn-plugin-func/function_git.go | 40 + .../kn-plugin-func/function_labels.go | 75 + .../kn-plugin-func/function_migrations.go | 114 + .../kn-plugin-func/function_options.go | 139 + .../kn-plugin-func/function_volumes.go | 49 + vendor/knative.dev/kn-plugin-func/go.mod | 57 + vendor/knative.dev/kn-plugin-func/go.sum | 3929 +++++ .../knative.dev/kn-plugin-func/instances.go | 118 + vendor/knative.dev/kn-plugin-func/invoke.go | 206 + vendor/knative.dev/kn-plugin-func/job.go | 92 + .../kn-plugin-func/repositories.go | 219 + .../knative.dev/kn-plugin-func/repository.go | 526 + .../knative.dev/kn-plugin-func/sortedset.go | 45 + vendor/knative.dev/kn-plugin-func/template.go | 71 + .../knative.dev/kn-plugin-func/templates.go | 110 + .../knative.dev/kn-plugin-func/utils/names.go | 104 + vendor/knative.dev/kn-plugin-func/version.txt | 1 + .../kn-plugin-func/zz_filesystem_generated.go | 12803 ++++++++++++++++ vendor/modules.txt | 173 +- .../structured-merge-diff/v4/typed/merge.go | 180 +- 620 files changed, 109464 insertions(+), 944 deletions(-) create mode 100644 third_party/VENDOR-LICENSE/github.com/ProtonMail/go-crypto/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/coreos/go-semver/semver/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/coreos/go-semver/semver/NOTICE create mode 100644 third_party/VENDOR-LICENSE/github.com/emirpasic/gods/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/go-git/gcfg/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/go-git/go-billy/v5/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/go-git/go-git/v5/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/jbenet/go-context/io/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/kevinburke/ssh_config/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/sergi/go-diff/diffmatchpatch/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/whilp/git-urls/LICENSE create mode 100644 third_party/VENDOR-LICENSE/github.com/xanzy/ssh-agent/LICENSE create mode 100644 third_party/VENDOR-LICENSE/gopkg.in/warnings.v0/LICENSE create mode 100644 third_party/VENDOR-LICENSE/knative.dev/kn-plugin-func/LICENSE create mode 100644 vendor/github.com/Microsoft/go-winio/.gitignore create mode 100644 vendor/github.com/Microsoft/go-winio/CODEOWNERS create mode 100644 vendor/github.com/Microsoft/go-winio/LICENSE create mode 100644 vendor/github.com/Microsoft/go-winio/README.md create mode 100644 vendor/github.com/Microsoft/go-winio/backup.go create mode 100644 vendor/github.com/Microsoft/go-winio/ea.go create mode 100644 vendor/github.com/Microsoft/go-winio/file.go create mode 100644 vendor/github.com/Microsoft/go-winio/fileinfo.go create mode 100644 vendor/github.com/Microsoft/go-winio/go.mod create mode 100644 vendor/github.com/Microsoft/go-winio/go.sum create mode 100644 vendor/github.com/Microsoft/go-winio/hvsock.go create mode 100644 vendor/github.com/Microsoft/go-winio/pipe.go create mode 100644 vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go create mode 100644 vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go create mode 100644 vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go create mode 100644 vendor/github.com/Microsoft/go-winio/privilege.go create mode 100644 vendor/github.com/Microsoft/go-winio/reparse.go create mode 100644 vendor/github.com/Microsoft/go-winio/sd.go create mode 100644 vendor/github.com/Microsoft/go-winio/syscall.go create mode 100644 vendor/github.com/Microsoft/go-winio/zsyscall_windows.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/AUTHORS create mode 100644 vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS create mode 100644 vendor/github.com/ProtonMail/go-crypto/LICENSE create mode 100644 vendor/github.com/ProtonMail/go-crypto/PATENTS create mode 100644 vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/eax/eax.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/canonical_text.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/x25519.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/errors/errors.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/cipher.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curveInfo.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curveType.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/encoding.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/mpi.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/oid.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/compressed.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/literal.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/ocfb.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key_test_data.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key_test_data.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/reader.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userid.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/read.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/write.go create mode 100644 vendor/github.com/acomagu/bufpipe/README.md create mode 100644 vendor/github.com/acomagu/bufpipe/bufpipe.go create mode 100644 vendor/github.com/acomagu/bufpipe/doc.go create mode 100644 vendor/github.com/acomagu/bufpipe/go.mod create mode 100644 vendor/github.com/acomagu/bufpipe/go.sum create mode 100644 vendor/github.com/coreos/go-semver/LICENSE create mode 100644 vendor/github.com/coreos/go-semver/NOTICE create mode 100644 vendor/github.com/coreos/go-semver/semver/semver.go create mode 100644 vendor/github.com/coreos/go-semver/semver/sort.go create mode 100644 vendor/github.com/emirpasic/gods/LICENSE create mode 100644 vendor/github.com/emirpasic/gods/containers/containers.go create mode 100644 vendor/github.com/emirpasic/gods/containers/enumerable.go create mode 100644 vendor/github.com/emirpasic/gods/containers/iterator.go create mode 100644 vendor/github.com/emirpasic/gods/containers/serialization.go create mode 100644 vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go create mode 100644 vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go create mode 100644 vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go create mode 100644 vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go create mode 100644 vendor/github.com/emirpasic/gods/lists/lists.go create mode 100644 vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go create mode 100644 vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go create mode 100644 vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go create mode 100644 vendor/github.com/emirpasic/gods/trees/trees.go create mode 100644 vendor/github.com/emirpasic/gods/utils/comparator.go create mode 100644 vendor/github.com/emirpasic/gods/utils/sort.go create mode 100644 vendor/github.com/emirpasic/gods/utils/utils.go create mode 100644 vendor/github.com/go-git/gcfg/LICENSE create mode 100644 vendor/github.com/go-git/gcfg/README create mode 100644 vendor/github.com/go-git/gcfg/doc.go create mode 100644 vendor/github.com/go-git/gcfg/errors.go create mode 100644 vendor/github.com/go-git/gcfg/go1_0.go create mode 100644 vendor/github.com/go-git/gcfg/go1_2.go create mode 100644 vendor/github.com/go-git/gcfg/read.go create mode 100644 vendor/github.com/go-git/gcfg/scanner/errors.go create mode 100644 vendor/github.com/go-git/gcfg/scanner/scanner.go create mode 100644 vendor/github.com/go-git/gcfg/set.go create mode 100644 vendor/github.com/go-git/gcfg/token/position.go create mode 100644 vendor/github.com/go-git/gcfg/token/serialize.go create mode 100644 vendor/github.com/go-git/gcfg/token/token.go create mode 100644 vendor/github.com/go-git/gcfg/types/bool.go create mode 100644 vendor/github.com/go-git/gcfg/types/doc.go create mode 100644 vendor/github.com/go-git/gcfg/types/enum.go create mode 100644 vendor/github.com/go-git/gcfg/types/int.go create mode 100644 vendor/github.com/go-git/gcfg/types/scan.go create mode 100644 vendor/github.com/go-git/go-billy/v5/.gitignore create mode 100644 vendor/github.com/go-git/go-billy/v5/LICENSE create mode 100644 vendor/github.com/go-git/go-billy/v5/README.md create mode 100644 vendor/github.com/go-git/go-billy/v5/fs.go create mode 100644 vendor/github.com/go-git/go-billy/v5/go.mod create mode 100644 vendor/github.com/go-git/go-billy/v5/go.sum create mode 100644 vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go create mode 100644 vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go create mode 100644 vendor/github.com/go-git/go-billy/v5/memfs/memory.go create mode 100644 vendor/github.com/go-git/go-billy/v5/memfs/storage.go create mode 100644 vendor/github.com/go-git/go-billy/v5/osfs/os.go create mode 100644 vendor/github.com/go-git/go-billy/v5/osfs/os_js.go create mode 100644 vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go create mode 100644 vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go create mode 100644 vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go create mode 100644 vendor/github.com/go-git/go-billy/v5/util/glob.go create mode 100644 vendor/github.com/go-git/go-billy/v5/util/util.go create mode 100644 vendor/github.com/go-git/go-git/v5/.gitignore create mode 100644 vendor/github.com/go-git/go-git/v5/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/go-git/go-git/v5/COMPATIBILITY.md create mode 100644 vendor/github.com/go-git/go-git/v5/CONTRIBUTING.md create mode 100644 vendor/github.com/go-git/go-git/v5/LICENSE create mode 100644 vendor/github.com/go-git/go-git/v5/Makefile create mode 100644 vendor/github.com/go-git/go-git/v5/README.md create mode 100644 vendor/github.com/go-git/go-git/v5/blame.go create mode 100644 vendor/github.com/go-git/go-git/v5/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/config/branch.go create mode 100644 vendor/github.com/go-git/go-git/v5/config/config.go create mode 100644 vendor/github.com/go-git/go-git/v5/config/modules.go create mode 100644 vendor/github.com/go-git/go-git/v5/config/refspec.go create mode 100644 vendor/github.com/go-git/go-git/v5/config/url.go create mode 100644 vendor/github.com/go-git/go-git/v5/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/go.mod create mode 100644 vendor/github.com/go-git/go-git/v5/go.sum create mode 100644 vendor/github.com/go-git/go-git/v5/internal/revision/parser.go create mode 100644 vendor/github.com/go-git/go-git/v5/internal/revision/scanner.go create mode 100644 vendor/github.com/go-git/go-git/v5/internal/revision/token.go create mode 100644 vendor/github.com/go-git/go-git/v5/internal/url/url.go create mode 100644 vendor/github.com/go-git/go-git/v5/object_walker.go create mode 100644 vendor/github.com/go-git/go-git/v5/options.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/cache/buffer_lru.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/cache/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/cache/object_lru.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/color/color.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/error.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/filemode/filemode.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/diff/patch.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/index/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/index/index.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/index/match.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/reader.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/writer.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_index.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_selector.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/diff_delta.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/error.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/fsobject.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/object_pack.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/packfile.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/patch_delta.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/encoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/scanner.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/hash.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/memory.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/blob.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/change.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/change_adaptor.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/commit.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs_filtered.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_ctime.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_limit.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_path.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/difftree.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/file.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/merge_base.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/object.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/patch.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/tag.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/tree.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/object/treenoder.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_decode.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_encode.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/capability.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/list.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/report_status.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/shallowupd.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/demux.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/muxer.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/srvresp.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_decode.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_encode.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_encode.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackreq.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackresp.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/reference.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/revision.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/revlist/revlist.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/storer/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/storer/index.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/storer/object.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/storer/reference.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/storer/shallow.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/storer/storer.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/file/client.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/file/server.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/server.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/server/loader.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/server/server.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go create mode 100644 vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/prune.go create mode 100644 vendor/github.com/go-git/go-git/v5/references.go create mode 100644 vendor/github.com/go-git/go-git/v5/remote.go create mode 100644 vendor/github.com/go-git/go-git/v5/repository.go create mode 100644 vendor/github.com/go-git/go-git/v5/status.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/config.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/deltaobject.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_setref.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/repository_filesystem.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/index.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/module.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/reference.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/shallow.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/filesystem/storage.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/memory/storage.go create mode 100644 vendor/github.com/go-git/go-git/v5/storage/storer.go create mode 100644 vendor/github.com/go-git/go-git/v5/submodule.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/binary/read.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/binary/write.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/diff/diff.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/ioutil/pipe.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/ioutil/pipe_js.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/change.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/difftree.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/doc.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/doubleiter.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/filesystem/node.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/index/node.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame/frame.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/iter.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/noder.go create mode 100644 vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/path.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree_bsd.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree_commit.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree_js.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree_linux.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree_plan9.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree_status.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree_unix_other.go create mode 100644 vendor/github.com/go-git/go-git/v5/worktree_windows.go create mode 100644 vendor/github.com/jbenet/go-context/LICENSE create mode 100644 vendor/github.com/jbenet/go-context/io/ctxio.go create mode 100644 vendor/github.com/kevinburke/ssh_config/.gitattributes create mode 100644 vendor/github.com/kevinburke/ssh_config/.gitignore create mode 100644 vendor/github.com/kevinburke/ssh_config/.mailmap create mode 100644 vendor/github.com/kevinburke/ssh_config/AUTHORS.txt create mode 100644 vendor/github.com/kevinburke/ssh_config/LICENSE create mode 100644 vendor/github.com/kevinburke/ssh_config/Makefile create mode 100644 vendor/github.com/kevinburke/ssh_config/README.md create mode 100644 vendor/github.com/kevinburke/ssh_config/config.go create mode 100644 vendor/github.com/kevinburke/ssh_config/lexer.go create mode 100644 vendor/github.com/kevinburke/ssh_config/parser.go create mode 100644 vendor/github.com/kevinburke/ssh_config/position.go create mode 100644 vendor/github.com/kevinburke/ssh_config/token.go create mode 100644 vendor/github.com/kevinburke/ssh_config/validators.go create mode 100644 vendor/github.com/prometheus/procfs/cmdline.go create mode 100644 vendor/github.com/prometheus/procfs/netstat.go create mode 100644 vendor/github.com/sergi/go-diff/AUTHORS create mode 100644 vendor/github.com/sergi/go-diff/CONTRIBUTORS create mode 100644 vendor/github.com/sergi/go-diff/LICENSE create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/match.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/mathutil.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go create mode 100644 vendor/github.com/whilp/git-urls/.travis.yml create mode 100644 vendor/github.com/whilp/git-urls/LICENSE create mode 100644 vendor/github.com/whilp/git-urls/Makefile create mode 100644 vendor/github.com/whilp/git-urls/README.md create mode 100644 vendor/github.com/whilp/git-urls/go.mod create mode 100644 vendor/github.com/whilp/git-urls/urls.go create mode 100644 vendor/github.com/xanzy/ssh-agent/.gitignore create mode 100644 vendor/github.com/xanzy/ssh-agent/LICENSE create mode 100644 vendor/github.com/xanzy/ssh-agent/README.md create mode 100644 vendor/github.com/xanzy/ssh-agent/go.mod create mode 100644 vendor/github.com/xanzy/ssh-agent/go.sum create mode 100644 vendor/github.com/xanzy/ssh-agent/pageant_windows.go create mode 100644 vendor/github.com/xanzy/ssh-agent/sshagent.go create mode 100644 vendor/github.com/xanzy/ssh-agent/sshagent_windows.go delete mode 100644 vendor/go.uber.org/multierr/.travis.yml delete mode 100644 vendor/go.uber.org/multierr/go113.go delete mode 100644 vendor/go.uber.org/zap/global_prego112.go rename vendor/go.uber.org/zap/{global_go112.go => zapcore/reflected_encoder.go} (64%) create mode 100644 vendor/golang.org/x/crypto/blowfish/block.go create mode 100644 vendor/golang.org/x/crypto/blowfish/cipher.go create mode 100644 vendor/golang.org/x/crypto/blowfish/const.go create mode 100644 vendor/golang.org/x/crypto/cast5/cast5.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_arm64.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_arm64.s create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_generic.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_noasm.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_s390x.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_s390x.s create mode 100644 vendor/golang.org/x/crypto/chacha20/xor.go create mode 100644 vendor/golang.org/x/crypto/curve25519/curve25519.go create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/README create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/fe.go create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64_noasm.go create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.go create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.s create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64_noasm.go create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/fe_generic.go create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/sync.checkpoint create mode 100644 vendor/golang.org/x/crypto/curve25519/internal/field/sync.sh create mode 100644 vendor/golang.org/x/crypto/ed25519/ed25519.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/poly1305.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s create mode 100644 vendor/golang.org/x/crypto/internal/subtle/aliasing.go create mode 100644 vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go create mode 100644 vendor/golang.org/x/crypto/ssh/agent/client.go create mode 100644 vendor/golang.org/x/crypto/ssh/agent/forward.go create mode 100644 vendor/golang.org/x/crypto/ssh/agent/keyring.go create mode 100644 vendor/golang.org/x/crypto/ssh/agent/server.go create mode 100644 vendor/golang.org/x/crypto/ssh/buffer.go create mode 100644 vendor/golang.org/x/crypto/ssh/certs.go create mode 100644 vendor/golang.org/x/crypto/ssh/channel.go create mode 100644 vendor/golang.org/x/crypto/ssh/cipher.go create mode 100644 vendor/golang.org/x/crypto/ssh/client.go create mode 100644 vendor/golang.org/x/crypto/ssh/client_auth.go create mode 100644 vendor/golang.org/x/crypto/ssh/common.go create mode 100644 vendor/golang.org/x/crypto/ssh/connection.go create mode 100644 vendor/golang.org/x/crypto/ssh/doc.go create mode 100644 vendor/golang.org/x/crypto/ssh/handshake.go create mode 100644 vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go create mode 100644 vendor/golang.org/x/crypto/ssh/kex.go create mode 100644 vendor/golang.org/x/crypto/ssh/keys.go create mode 100644 vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go create mode 100644 vendor/golang.org/x/crypto/ssh/mac.go create mode 100644 vendor/golang.org/x/crypto/ssh/messages.go create mode 100644 vendor/golang.org/x/crypto/ssh/mux.go create mode 100644 vendor/golang.org/x/crypto/ssh/server.go create mode 100644 vendor/golang.org/x/crypto/ssh/session.go create mode 100644 vendor/golang.org/x/crypto/ssh/ssh_gss.go create mode 100644 vendor/golang.org/x/crypto/ssh/streamlocal.go create mode 100644 vendor/golang.org/x/crypto/ssh/tcpip.go create mode 100644 vendor/golang.org/x/crypto/ssh/transport.go create mode 100644 vendor/golang.org/x/net/http2/go118.go create mode 100644 vendor/golang.org/x/net/http2/not_go118.go create mode 100644 vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/cpu/byteorder.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_aix.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mipsx.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_riscv64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_wasm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_zos.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/hwcap_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go create mode 100644 vendor/gopkg.in/warnings.v0/LICENSE create mode 100644 vendor/gopkg.in/warnings.v0/README create mode 100644 vendor/gopkg.in/warnings.v0/warnings.go create mode 100644 vendor/gotest.tools/v3/assert/assert_go113.go create mode 100644 vendor/gotest.tools/v3/assert/cmp/compare_go113.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/common/interfaces.go create mode 100644 vendor/knative.dev/kn-plugin-func/.codecov.yaml create mode 100644 vendor/knative.dev/kn-plugin-func/.gitattributes create mode 100644 vendor/knative.dev/kn-plugin-func/.gitignore create mode 100644 vendor/knative.dev/kn-plugin-func/.golangci.yaml create mode 100644 vendor/knative.dev/kn-plugin-func/.ko.yaml create mode 100644 vendor/knative.dev/kn-plugin-func/.unicode-control-characters.config.py create mode 100644 vendor/knative.dev/kn-plugin-func/.versionrc create mode 100644 vendor/knative.dev/kn-plugin-func/AUTHORS create mode 100644 vendor/knative.dev/kn-plugin-func/CHANGELOG.md create mode 100644 vendor/knative.dev/kn-plugin-func/CODE-OF-CONDUCT.md create mode 100644 vendor/knative.dev/kn-plugin-func/LICENSE create mode 100644 vendor/knative.dev/kn-plugin-func/Makefile create mode 100644 vendor/knative.dev/kn-plugin-func/README.md create mode 100644 vendor/knative.dev/kn-plugin-func/ci create mode 100644 vendor/knative.dev/kn-plugin-func/client.go create mode 100644 vendor/knative.dev/kn-plugin-func/config.go create mode 100644 vendor/knative.dev/kn-plugin-func/filesystem.go create mode 100644 vendor/knative.dev/kn-plugin-func/function.go create mode 100644 vendor/knative.dev/kn-plugin-func/function_buildtype.go create mode 100644 vendor/knative.dev/kn-plugin-func/function_envs.go create mode 100644 vendor/knative.dev/kn-plugin-func/function_git.go create mode 100644 vendor/knative.dev/kn-plugin-func/function_labels.go create mode 100644 vendor/knative.dev/kn-plugin-func/function_migrations.go create mode 100644 vendor/knative.dev/kn-plugin-func/function_options.go create mode 100644 vendor/knative.dev/kn-plugin-func/function_volumes.go create mode 100644 vendor/knative.dev/kn-plugin-func/go.mod create mode 100644 vendor/knative.dev/kn-plugin-func/go.sum create mode 100644 vendor/knative.dev/kn-plugin-func/instances.go create mode 100644 vendor/knative.dev/kn-plugin-func/invoke.go create mode 100644 vendor/knative.dev/kn-plugin-func/job.go create mode 100644 vendor/knative.dev/kn-plugin-func/repositories.go create mode 100644 vendor/knative.dev/kn-plugin-func/repository.go create mode 100644 vendor/knative.dev/kn-plugin-func/sortedset.go create mode 100644 vendor/knative.dev/kn-plugin-func/template.go create mode 100644 vendor/knative.dev/kn-plugin-func/templates.go create mode 100644 vendor/knative.dev/kn-plugin-func/utils/names.go create mode 100644 vendor/knative.dev/kn-plugin-func/version.txt create mode 100644 vendor/knative.dev/kn-plugin-func/zz_filesystem_generated.go diff --git a/go.mod b/go.mod index 08826cb678..c069b07053 100644 --- a/go.mod +++ b/go.mod @@ -10,22 +10,37 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.10.1 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 - gotest.tools/v3 v3.0.3 - k8s.io/api v0.22.5 + gotest.tools/v3 v3.1.0 + k8s.io/api v0.23.5 k8s.io/apiextensions-apiserver v0.22.5 - k8s.io/apimachinery v0.22.5 + k8s.io/apimachinery v0.23.5 k8s.io/cli-runtime v0.22.5 - k8s.io/client-go v0.22.5 + k8s.io/client-go v1.5.2 k8s.io/code-generator v0.22.5 - knative.dev/eventing v0.29.1 - knative.dev/hack v0.0.0-20220118141833-9b2ed8471e30 + knative.dev/eventing v0.29.2-0.20220420140829-ce4fe0990d23 + knative.dev/hack v0.0.0-20220128200847-51a42b2eb63e knative.dev/kn-plugin-event v1.2.0 + knative.dev/kn-plugin-func v0.24.0 knative.dev/kn-plugin-source-kafka v0.29.0 - knative.dev/networking v0.0.0-20220120043934-ec785540a732 + knative.dev/networking v0.0.0-20220120045035-ec849677a316 knative.dev/pkg v0.0.0-20220222214439-083dd97300e1 - knative.dev/serving v0.29.3 + knative.dev/serving v0.29.5 sigs.k8s.io/yaml v1.3.0 ) -// Points at: https://github.com/openshift-knative/kn-plugin-event/commit/1868b0441a3a2768724ffe5508ce0dcd6ded97c0 -replace knative.dev/kn-plugin-event => github.com/openshift-knative/kn-plugin-event v0.29.1-0.20220412122141-1868b0441a3a +replace ( + // Tekton Triggers imports old google/cel-go, should be fixed with tektoncd/cli >=v0.24.x transitively + github.com/google/cel-go => github.com/google/cel-go v0.11.2 + // update docker to be compatible with version used by pack and removes invalid pseudo-version + github.com/openshift/source-to-image => github.com/boson-project/source-to-image v1.3.2 + // Pin k8s.io dependencies to align with Knative and Tekton needs + k8s.io/api => k8s.io/api v0.22.5 + k8s.io/apimachinery => k8s.io/apimachinery v0.22.5 + k8s.io/client-go => k8s.io/client-go v0.22.5 + + // Points at: https://github.com/openshift-knative/kn-plugin-event/commit/1868b0441a3a2768724ffe5508ce0dcd6ded97c0 + knative.dev/kn-plugin-event => github.com/openshift-knative/kn-plugin-event v0.29.1-0.20220412122141-1868b0441a3a + + // Points at: https://github.com/openshift-knative/kn-plugin-func/commit/a3f704bc3c5046683a31dc5644f753de936c4018 + knative.dev/kn-plugin-func => github.com/openshift-knative/kn-plugin-func v1.1.3-0.20220601222936-a3f704bc3c50 +) diff --git a/go.sum b/go.sum index f1bfd3c95b..2d9a2f09d6 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,17 @@ 4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA= +cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= @@ -19,21 +27,26 @@ cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZ cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.67.0/go.mod h1:YNan/mUhNZFrYUor0vqrsQ0Ffl7Xtm/ACOy/vsTS858= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.92.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= @@ -44,20 +57,33 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.1.0/go.mod h1:2NIffxgWfORSI7EOYMFatGTfjMLnqrOKBEyYb6NoRgA= -cloud.google.com/go/compute v1.3.0 h1:mPL/MzDDYHsh5tHRS9mhmhWlcgClCrCa6ApQCU6wnHI= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.2.0/go.mod h1:BCK88+tmjAwnZYfOSizmKCTSFjJHCa18t3DpdGEY13Y= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/kms v1.0.0/go.mod h1:nhUehi+w7zht2XrUfvTRNpxrfayBHqP4lu2NSywui/0= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/monitoring v0.1.0/go.mod h1:Hpm3XfzJv+UTiXzCG5Ffp0wijzHTC7Cv4eR7o3x/fEE= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/pubsub v1.17.1/go.mod h1:4qDxMr1WsM9+aQAz36ltDwCIM+R0QdlseyFjBuNvnss= +cloud.google.com/go/secretmanager v1.0.0/go.mod h1:+Qkm5qxIJ5mk74xxIXA+87fseaY1JLYBcFPQoc/GQxg= +cloud.google.com/go/security v1.1.0/go.mod h1:Zf3HhjGQIC3yQLUwW5cTcZ0u7sAQqYnvgx9r9KcFOJw= cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= +cloud.google.com/go/spanner v1.17.0/go.mod h1:+17t2ixFwRG4lWRwE+5kipDR9Ef07Jkmc8z0IbMDKUs= +cloud.google.com/go/spanner v1.18.0/go.mod h1:LvAjUXPeJRGNuGpikMULjhLj/t9cRvdc+fxRoLiugXA= +cloud.google.com/go/spanner v1.25.0/go.mod h1:kQUft3x355hzzaeFbObjsvkzZDgpDkesp3v75WBnI8w= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -65,64 +91,133 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.18.2/go.mod h1:AiIj7BWXyhO5gGVmYJ+S8tbkCx3yb0IMjua8Aw4naVM= +cloud.google.com/go/storage v1.19.0/go.mod h1:6rgiTRjOqI/Zd9YKimub5TIB4d+p3LH33V3ZE1DMuUM= +cloud.google.com/go/trace v0.1.0/go.mod h1:wxEwsoeRVPbeSkt7ZC9nWCgmoKQRAoySN7XHW2AmI7g= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +code.gitea.io/sdk/gitea v0.11.3/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +code.gitea.io/sdk/gitea v0.14.0/go.mod h1:89WiyOX1KEcvjP66sRHdu0RafojGo60bT9UqW17VbWs= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= contrib.go.opencensus.io/exporter/prometheus v0.2.1-0.20200609204449-6bcf6f8577f0/go.mod h1:MjHoxkI7Ny27toPeFkRbXbzVjzIGkwOAptrAy8Mxtm8= +contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/exporter/stackdriver v0.13.8/go.mod h1:huNtlWx75MwO7qMs0KrMxPZXzNNWebav1Sq/pm02JdQ= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= contrib.go.opencensus.io/exporter/zipkin v0.1.2/go.mod h1:mP5xM3rrgOjpn79MM8fZbj3gsxcuytSqtH0dxSWW1RE= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +cuelang.org/go v0.4.0/go.mod h1:tz/edkPi+T37AZcb5GlPY+WJkL6KiDlDVupKwL3vvjs= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20211102141018-f7be0cbad29c/go.mod h1:WpB7kf89yJUETZxQnP1kgYPNwlT2jjdDYUCoxVggM3g= +github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= +github.com/AlecAivazis/survey/v2 v2.2.12/go.mod h1:6d4saEvBsfSHXeN1a5OA5m2+HJ2LuVokllnC77pAIKI= +github.com/AlecAivazis/survey/v2 v2.3.2/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg= github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= github.com/Azure/azure-amqp-common-go/v3 v3.0.1/go.mod h1:PBIGdzcO1teYoufTKMcGibdKaYZv4avS+O6LNIp8bq0= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= github.com/Azure/azure-event-hubs-go/v3 v3.3.2/go.mod h1:sszMsQpFy8Au2s2NColbnJY8lRVm1koW0XxBJ3rN5TY= github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v37.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v46.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v47.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v50.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v55.8.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v60.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v60.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v61.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v62.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= github.com/Azure/azure-storage-blob-go v0.6.0/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs= github.com/Azure/go-amqp v0.13.1/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.3/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.6/go.mod h1:V6p3pKZx1KKkJubbxnDWrzNhEIfOy/pTGasLqzHIPHs= github.com/Azure/go-autorest/autorest v0.11.8/go.mod h1:V6p3pKZx1KKkJubbxnDWrzNhEIfOy/pTGasLqzHIPHs= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= github.com/Azure/go-autorest/autorest v0.11.24 h1:1fIGgHKqVm54KIPT+q8Zmd1QlVsmHqeUGso5qm2BqqE= github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.4/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= github.com/Azure/go-autorest/autorest/azure/auth v0.5.2/go.mod h1:q98IH4qgc3eWM4/WOeR5+YPmBuy8Lq0jNRDwSM0CuFk= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.8/go.mod h1:kxyKZTSfKh8OVFWPAgOgQ/frrJgeYQJPyR5fLFmXko4= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= github.com/Azure/go-autorest/autorest/azure/auth v0.5.11/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/azure/cli v0.4.1/go.mod h1:JfDgiIO1/RPu6z42AdQTyjOoCM2MFhLqSBDvMEkDgcg= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.4/go.mod h1:yAQ2b6eP/CmLPnmLvxtT1ALIY3OR1oFcCqVBi8vHiTc= github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= @@ -150,20 +245,38 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= +github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GoogleCloudPlatform/cloud-builders/gcs-fetcher v0.0.0-20191203181535-308b93ad1f39/go.mod h1:yfGmCjKuUzk9WzubMlW2zwjhCraIc/J+M40cufdemRM= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.27.0/go.mod h1:bn9iHmAjogMoIPkqBGyJ9R1m9cXGCjBE/cuhBs3oEsQ= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317/go.mod h1:DF8FZRxMHMGv/vP2lQP6h+dYzzjpuRn24VeRiYn3qjQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= @@ -171,21 +284,40 @@ github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JP github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= +github.com/Netflix/go-expect v0.0.0-20200312175327-da48e75238e2/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= +github.com/Netflix/go-expect v0.0.0-20210722184520-ef0bf57d82b3/go.mod h1:68ORG0HSEWDuH5Eh73AFbYWZ1zT4Y+b0vhOa+vZRUdI= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PaesslerAG/gval v1.0.0/go.mod h1:y/nm5yEyTeX6av0OfKJNp9rBNj2XrGhAf5+v24IBN1I= +github.com/PaesslerAG/jsonpath v0.1.0/go.mod h1:4BzmtoM/PI8fPO4aQGIusjGxGir2BzcV0grWtFzq1Y8= +github.com/PaesslerAG/jsonpath v0.1.1/go.mod h1:lVboNxFGal/VwW6d9JzIy56bUsYAP6tH/x80vjnCseY= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3 h1:XcF0cTDJeiuZ5NU8w7WUDge0HRwwNRmxj/GGk6KSA6g= +github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -193,6 +325,9 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/ReneKroon/ttlcache/v2 v2.9.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= +github.com/ReneKroon/ttlcache/v2 v2.10.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= +github.com/ReneKroon/ttlcache/v2 v2.11.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= @@ -204,13 +339,23 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWso github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae h1:ePgznFqEG1v3AjMklnK8H7BSc++FDSo7xfK9K7Af+0Y= github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/ThalesIgnite/crypto11 v1.2.5/go.mod h1:ILDKtnCKiQ7zRoNxcp36Y1ZR8LBPmR2E23+wTQe/MlE= +github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20210420163308-c1402a70e2f1/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20210609063737-0067dc6dcea2/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/jsonschema v0.0.0-20180308105923-f2c93856175a/go.mod h1:qpebaTNSsyUn5rPSJMsfqEtDw71TTggXM6stUDI16HA= +github.com/alecthomas/jsonschema v0.0.0-20210526225647-edb03dcab7bc/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -218,63 +363,155 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211221011931-643d94fcab96 h1:2P/dm3KbCLnRHQN/Ma50elhMx1Si9loEZe5hOrsuvuE= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211221011931-643d94fcab96/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220209173558-ad29539cd2e9 h1:zvkJv+9Pxm1nnEMcKnShREt4qtduHKz4iw4AB4ul0Ao= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220209173558-ad29539cd2e9/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/beam v2.28.0+incompatible/go.mod h1:/8NX3Qi8vGstDLLaeaU7+lzVEu/ACaQhYjeefzQ0y1o= +github.com/apache/beam v2.32.0+incompatible/go.mod h1:/8NX3Qi8vGstDLLaeaU7+lzVEu/ACaQhYjeefzQ0y1o= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= +github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= +github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0= +github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.31.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.42.1/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.8/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.22/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.25/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs= +github.com/aws/aws-sdk-go v1.42.26/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.7.1/go.mod h1:L5LuPC1ZgDr2xQS7AmIec/Jlc7O/Y1u2KxJyNVab250= +github.com/aws/aws-sdk-go-v2 v1.11.0/go.mod h1:SQfA+m2ltnu1cA0soUkj4dRSsmITiVQUJvBIZjzfPyQ= github.com/aws/aws-sdk-go-v2 v1.12.0/go.mod h1:tWhQI5N5SiMawto3uMAQJU5OUN/1ivhDDHq7HTsJvZ0= +github.com/aws/aws-sdk-go-v2 v1.13.0/go.mod h1:L6+ZpqHaLbAaxsqV0L4cvxZY7QupWJB4fhkf8LXvC7w= +github.com/aws/aws-sdk-go-v2 v1.14.0/go.mod h1:ZA3Y8V0LrlWj63MQAnRHgKf/5QB//LSZCPNWlWrNGLU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.0.0/go.mod h1:Xn6sxgRuIDflLRJFj5Ev7UxABIkNbccFPV/p8itDReM= github.com/aws/aws-sdk-go-v2/config v1.5.0/go.mod h1:RWlPOAW3E3tbtNAqTwvSW54Of/yP3oiZXMI0xfUdjyA= +github.com/aws/aws-sdk-go-v2/config v1.10.1/go.mod h1:auIv5pIIn3jIBHNRcVQcsczn6Pfa6Dyv80Fai0ueoJU= github.com/aws/aws-sdk-go-v2/config v1.12.0/go.mod h1:GQONFVSDdG6RRho1C730SGNyDhS1kSTnxpOE76ptBqo= +github.com/aws/aws-sdk-go-v2/config v1.13.0/go.mod h1:Pjv2OafecIn+4miw9VFDCr06YhKyf/oKOkIcpQOgWKk= +github.com/aws/aws-sdk-go-v2/config v1.13.1/go.mod h1:Ba5Z4yL/UGbjQUzsiaN378YobhFo0MLfueXGiOsYtEs= +github.com/aws/aws-sdk-go-v2/config v1.14.0/go.mod h1:GKDRrvsq/PTaOYc9252u8Uah1hsIdtor4oIrFvUNPNM= github.com/aws/aws-sdk-go-v2/credentials v1.3.1/go.mod h1:r0n73xwsIVagq8RsxmZbGSRQFj9As3je72C2WzUIToc= +github.com/aws/aws-sdk-go-v2/credentials v1.6.1/go.mod h1:QyvQk1IYTqBWSi1T6UgT/W8DMxBVa5pVuLFSRLLhGf8= github.com/aws/aws-sdk-go-v2/credentials v1.7.0/go.mod h1:Kmq64kahHJtXfmnEwnvRKeNjLBqkdP++Itln9BmQerE= +github.com/aws/aws-sdk-go-v2/credentials v1.8.0/go.mod h1:gnMo58Vwx3Mu7hj1wpcG8DI0s57c9o42UQ6wgTQT5to= +github.com/aws/aws-sdk-go-v2/credentials v1.9.0/go.mod h1:PyHKqk/+tJuDY7T8R580S1j/AcSD+ODeUZ99CAUKLqQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.3.0/go.mod h1:2LAuqPx1I6jNfaGDucWfA2zqQCYCOMCDHiCOciALyNw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.8.0/go.mod h1:5E1J3/TTYy6z909QNR0QnXGBpfESYGDqd3O0zqONghU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.9.0/go.mod h1:19SxQ+9zANyJCnNaoF3ovl8bFil4TaqCYEDdqNGKM+A= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.10.0/go.mod h1:I6/fHT/fH460v09eg2gVrd8B/IqskhNdpcLH0WNO3QI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.11.0/go.mod h1:rwdUKJV5rm+vHu1ncD1iGDqahBEL8O0tBjVqo9eO2N0= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.7.1/go.mod h1:wN/mvkow08GauDwJ70jnzJ1e+hE+Q3Q7TwpYLXOe9oI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.0/go.mod h1:NO3Q5ZTTQtO2xIg2+xTXYDiT7knSejfeDm7WGDaOo0U= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.3/go.mod h1:L72JSFj9OwHwyukeuKFFyTj6uFWE4AjB0IQp97bd9Lc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.4/go.mod h1:XHgQ7Hz2WY2GAn//UXHofLfPXWh+s62MbMOijrg12Lw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.5/go.mod h1:2hXc8ooJqF2nAznsbJQIn+7h851/bu8GVC80OVTTqf8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.0.0/go.mod h1:anlUzBoEWglcUxUQwZA7HQOEVEnQALVZsizAapB2hq8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.1.0/go.mod h1:KdVvdk4gb7iatuHZgIkIqvJlWHBtjCJLUtD/uO/FkWw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.2.0/go.mod h1:BsCSJHx5DnDXIrOcqB8KN1/B+hXLG/bi4Y6Vjcx/x9E= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.3.0/go.mod h1:miRSv9l093jX/t/j+mBCaLqFHo9xKYzJ7DGm1BsGoJM= github.com/aws/aws-sdk-go-v2/internal/ini v1.1.1/go.mod h1:Zy8smImhTdOETZqfyn01iNOe0CNggVbPjCajyaz6Gvg= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.0/go.mod h1:6oXGy4GLpypD3uCh8wcqztigGgmhLToMfjavgh+VySg= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.3/go.mod h1:N4dv+zawriMFZBO/6UKg3zt+XO6xWOQo1neAA0lFbo4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.4/go.mod h1:R3sWUqPcfXSiF/LSFJhjyJmpg9uV6yP2yv3YZZjldVI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.5/go.mod h1:R3sWUqPcfXSiF/LSFJhjyJmpg9uV6yP2yv3YZZjldVI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.6/go.mod h1:o1ippSg3yJx5EuT4AOGXJCUcmt5vrcxla1cg6K1Q8Iw= github.com/aws/aws-sdk-go-v2/service/ecr v1.4.1/go.mod h1:FglZcyeiBqcbvyinl+n14aT/EWC7S1MIH+Gan2iizt0= github.com/aws/aws-sdk-go-v2/service/ecr v1.13.0/go.mod h1:X9rkClmo0/dXh2fwvhkMoXR5zxirrzCqMgfU+Z0HIgs= +github.com/aws/aws-sdk-go-v2/service/ecr v1.14.0/go.mod h1:a3WUi3JjM3MFtIYenSYPJ7UZPXsw7U7vzebnynxucks= +github.com/aws/aws-sdk-go-v2/service/ecr v1.15.0/go.mod h1:4zYI85WiYDhFaU1jPFVfkD7HlBcdnITDE3QxDwy4Kus= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.4.1/go.mod h1:eD5Eo4drVP2FLTw0G+SMIPWNWvQRGGTtIZR2XeAagoA= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.10.0/go.mod h1:wlxlU/f1AOpsYIxt86LyrztTAIhyp/6HRNHcZjLzHjg= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.11.0/go.mod h1:iurUYk+aG+E2DO0MnQEZKh9zsaIxuTcrvCaAUTUhuTU= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.12.0/go.mod h1:IArQ3IBR00FkuraKwudKZZU32OxJfdTdwV+W5iZh3Y4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.5.0/go.mod h1:80NaCIH9YU3rzTTs/J/ECATjXuRqzo/wB6ukO6MZ0XY= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.1/go.mod h1:zceowr5Z1Nh2WVP8bf/3ikB41IZW59E4yIYbg+pC6mw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.5.0/go.mod h1:Mq6AEc+oEjCUlBuLiK5YwW4shSOAKCQ3tXN0sQeYoBA= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.6.0/go.mod h1:wTgFkG6t7jS/6Y0SILXwfspV3IXowb6ngsAlSajW0Kc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.7.0/go.mod h1:K/qPe6AP2TGYv4l6n7c88zh9jWBDf6nHhvg1fx/EWfU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.8.0/go.mod h1:rBDLgXDAwHOfxZKLRDl8OGTPzFDC+a2pLqNNj8+QwfI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.9.0/go.mod h1:xKCZ4YFSF2s4Hnb/J0TLeOsKuGzICzcElaOKNGrVnx4= +github.com/aws/aws-sdk-go-v2/service/kms v1.10.0/go.mod h1:ZkHWL8m5Nw1g9yMXqpCjnIJtSDToAmNbXXZ9gj0bO7s= +github.com/aws/aws-sdk-go-v2/service/s3 v1.19.0/go.mod h1:Gwz3aVctJe6mUY9T//bcALArPUaFmNAy2rTB9qN4No8= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.10.0/go.mod h1:qAgsrzF3Z2vvV01j79fs7D75ofCMQe81/OKBJx0rjFY= +github.com/aws/aws-sdk-go-v2/service/sns v1.11.0/go.mod h1:LIPf3BTbSY5UeVli+x/1y2Qw1w8T9DYyp7p18Qt8Zc8= +github.com/aws/aws-sdk-go-v2/service/sqs v1.12.0/go.mod h1:TDqDmQnsbgL2ZMIGUf3z9xTzCMqFX7FP1geAgIlYqvA= +github.com/aws/aws-sdk-go-v2/service/ssm v1.15.0/go.mod h1:kJa2uHklY03rKsNSbEsToeUgWJ1PambXBtRNacorRhg= github.com/aws/aws-sdk-go-v2/service/sso v1.3.1/go.mod h1:J3A3RGUvuCZjvSuZEcOpHDnzZP/sKbhDWV2T1EOzFIM= +github.com/aws/aws-sdk-go-v2/service/sso v1.6.0/go.mod h1:Q/l0ON1annSU+mc0JybDy1Gy6dnJxIcWjphO6qJPzvM= github.com/aws/aws-sdk-go-v2/service/sso v1.8.0/go.mod h1:AB6v3BedyhVRIbPQbJnUsBmtup2pFiikpp5n3YyB6Ac= +github.com/aws/aws-sdk-go-v2/service/sso v1.9.0/go.mod h1:vCV4glupK3tR7pw7ks7Y4jYRL86VvxS+g5qk04YeWrU= +github.com/aws/aws-sdk-go-v2/service/sso v1.10.0/go.mod h1:m1CRRFX7eH3EE6w0ntdu+lo+Ph9VS7y8qRV/vdym0ZY= github.com/aws/aws-sdk-go-v2/service/sts v1.6.0/go.mod h1:q7o0j7d7HrJk/vr9uUt3BVRASvcU7gYZB9PUgPiByXg= +github.com/aws/aws-sdk-go-v2/service/sts v1.10.0/go.mod h1:jLKCFqS+1T4i7HDqCP9GM4Uk75YW1cS0o82LdxpMyOE= github.com/aws/aws-sdk-go-v2/service/sts v1.13.0/go.mod h1:jQto17aC9pJ6xRa1g29uXZhbcS6qNT3PSnKfPShq4sY= +github.com/aws/aws-sdk-go-v2/service/sts v1.14.0/go.mod h1:u0xMJKDvvfocRjiozsoZglVNXRG19043xzp3r2ivLIk= +github.com/aws/aws-sdk-go-v2/service/sts v1.15.0/go.mod h1:E264g2Gl5U9KTGzmd8ypGEAoh75VmqyuA/Ox5O1eRE4= github.com/aws/smithy-go v1.6.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.9.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.9.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.10.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.11.0/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20211215200129-69c85dc22db6/go.mod h1:8vJsEZ4iRqG+Vx6pKhWK6U00qcj0KC37IsfszMkY6UE= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220216180153-3d7835abdf40/go.mod h1:8vJsEZ4iRqG+Vx6pKhWK6U00qcj0KC37IsfszMkY6UE= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220228164355-396b2034c795/go.mod h1:8vJsEZ4iRqG+Vx6pKhWK6U00qcj0KC37IsfszMkY6UE= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -289,6 +526,7 @@ github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= @@ -296,21 +534,47 @@ github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2y github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec= +github.com/bluekeyes/go-gitdiff v0.4.0/go.mod h1:QpfYYO1E0fTVHVZAZKiRjtSGY9823iCdvGXBcEzHGbM= +github.com/bmatcuk/doublestar/v4 v4.0.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= +github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= +github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= +github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/boson-project/source-to-image v1.3.2/go.mod h1:uT4SRJAhYbi9VbTIL0Os+0TTwTgqKwNydy7LoXrQ7v4= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/buildpacks/imgutil v0.0.0-20211203200417-76206845baac h1:XrKr6axRUBHEQdyyo7uffYDwWurOdeyH8MpNRJuBdIw= +github.com/buildpacks/imgutil v0.0.0-20211203200417-76206845baac/go.mod h1:YZReWjuSxwyvuN92Vlcul+WgaCXylpecgFn7T3rNang= +github.com/buildpacks/lifecycle v0.13.3 h1:vV2DGTPVQOELtrCSYpop8W9OF0m+l5gwxWDPmL9ZcOw= +github.com/buildpacks/lifecycle v0.13.3/go.mod h1:4Kv6HljeDJ1ibUcRijvvC1/AHXMCpNddIqH2KYnboks= +github.com/buildpacks/pack v0.24.0 h1:Oeq7DImb7PLX5z/11h5kWJC/YZtgCAxJiEBTU/XsnNo= +github.com/buildpacks/pack v0.24.0/go.mod h1:3BMdtlXEXTHUGAv31eeuPAebXq+JYZhFrAd7tEi6m0g= github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/bytecodealliance/wasmtime-go v0.31.0/go.mod h1:q320gUxqyI8yB+ZqRuaJOEnGkAnHh6WtJjMaT2CW4wI= github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cavaliercoder/badio v0.0.0-20160213150051-ce5280129e9e/go.mod h1:V284PjgVwSk4ETmz84rpu9ehpGg7swlIH8npP9k2bGw= +github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cavaliercoder/go-rpm v0.0.0-20200122174316-8cb9fd9c31a8/go.mod h1:AZIh1CCnMrcVm6afFf96PBvE2MRpWFco91z8ObJtgDY= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -326,6 +590,7 @@ github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6pr github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chrismellard/docker-credential-acr-env v0.0.0-20220119192733-fe33c00cee21/go.mod h1:Zlre/PVxuSI9y6/UV4NwGixQ48RHQDSPiUkofr6rbMU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -336,6 +601,7 @@ github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLI github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -347,6 +613,7 @@ github.com/cloudevents/sdk-go/sql/v2 v2.8.0 h1:gWednxJHL0Ycf93XeEFyQxYj81A7b4eNw github.com/cloudevents/sdk-go/sql/v2 v2.8.0/go.mod h1:u9acNJbhmi1wnDJro4PEAqbr4N1LTCyEUClErxbPS1A= github.com/cloudevents/sdk-go/v2 v2.2.0/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoaAhqaRVnOr2rCU= github.com/cloudevents/sdk-go/v2 v2.4.1/go.mod h1:MZiMwmAh5tGj+fPFvtHv9hKurKqXtdB9haJYMJ/7GJY= +github.com/cloudevents/sdk-go/v2 v2.5.0/go.mod h1:nlXhgFkf0uTopxmRXalyMwS2LG70cRGPrxzmjJgSG0U= github.com/cloudevents/sdk-go/v2 v2.8.0 h1:kmRaLbsafZmidZ0rZ6h7WOMqCkRMcVTLV5lxV/HKQ9Y= github.com/cloudevents/sdk-go/v2 v2.8.0/go.mod h1:GpCBmUj7DIRiDhVvsK5d6WCbgTWs8DxAWTRtAwQmIXs= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -359,11 +626,15 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/apd/v2 v2.0.1/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -378,17 +649,23 @@ github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4S github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -401,6 +678,9 @@ github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTV github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= github.com/containerd/containerd v1.5.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= +github.com/containerd/containerd v1.5.10/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= +github.com/containerd/containerd v1.6.0 h1:CLa12ZcV0d2ZTRKq1ssioeJpTnPJBMyndpEKA+UtzJg= +github.com/containerd/containerd v1.6.0/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -408,14 +688,18 @@ github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cE github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= @@ -425,15 +709,24 @@ github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= +github.com/containerd/stargz-snapshotter v0.6.4 h1:mox1Ozl/LicA5j0O5Xk9Q8z+nOQQLnClarhxokyw9hI= +github.com/containerd/stargz-snapshotter v0.6.4/go.mod h1:1t0SF1gAHJhCSftWKDLVitvfF3c2qhL5hymG7C50wto= github.com/containerd/stargz-snapshotter/estargz v0.0.0-20201223015020-a9a0c2d64694/go.mod h1:E9uVkkBKf0EaC39j2JVW9EzdNhYvpz6eQIjILHebruk= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/stargz-snapshotter/estargz v0.6.4/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= github.com/containerd/stargz-snapshotter/estargz v0.7.0/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= github.com/containerd/stargz-snapshotter/estargz v0.8.0/go.mod h1:mwIwuwb+D8FX2t45Trwi0hmWmZm5VW7zPP/rekwhWQU= github.com/containerd/stargz-snapshotter/estargz v0.9.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= +github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= github.com/containerd/stargz-snapshotter/estargz v0.10.1/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= github.com/containerd/stargz-snapshotter/estargz v0.11.0/go.mod h1:/KsZXsJRllMbTKFfG0miFQWViQKdI9+9aSXs+HN0+ac= +github.com/containerd/stargz-snapshotter/estargz v0.11.1 h1:mNQqxcAWmDrV6d6yUvzFhfY8puNzoQz9v4diW+Pmei4= +github.com/containerd/stargz-snapshotter/estargz v0.11.1/go.mod h1:6VoPcf4M1wvnogWxqc4TqBWWErCS+R+ucnPZId2VbpQ= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= @@ -452,28 +745,40 @@ github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNR github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containers/image/v5 v5.19.1/go.mod h1:ewoo3u+TpJvGmsz64XgzbyTHwHtM94q7mgK/pX+v2SE= +github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/storage v1.38.2/go.mod h1:INP0RPLHWBxx+pTsO5uiHlDUGHDFvWZPWprAbAlQWPQ= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc/v3 v3.1.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -484,58 +789,100 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberphone/json-canonicalization v0.0.0-20210303052042-6bc126869bf4/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/cyberphone/json-canonicalization v0.0.0-20210823021906-dc406ceaf94b/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= +github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/danieljoos/wincred v1.1.1/go.mod h1:gSBQmTx6G0VmLowygiA7ZD0p0E09HJ68vta8z/RT2d0= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= +github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= +github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-gk v0.0.0-20140819190930-201884a44051/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77/go.mod h1:Va5MyIzkU0rAM92tn3hb3Anb7oz7KcnixF49+2wOMe4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dimfeld/httppath v0.0.0-20170720192232-ee938bf73598/go.mod h1:0FpDmbrt36utu8jEmeU05dPC9AB5tsLYVVi+ZHfyuwI= +github.com/dimfeld/httptreemux/v5 v5.0.2/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= +github.com/dimfeld/httptreemux/v5 v5.2.2/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= +github.com/dimfeld/httptreemux/v5 v5.3.0/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.8+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.12+incompatible h1:lZlz0uzG+GH+c0plStMUdF/qk3ppmgnswpR5EbqzVGA= github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= +github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.3-0.20210609071616-4c2ec79bf2a8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.11+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U= github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dvyukov/go-fuzz v0.0.0-20210914135545-4980593459a1/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -549,6 +896,9 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.15.0+incompatible h1:8KpYO/Xl/ZudZs5RNOEhWMBY4hmzlZhhRd9cu+jrZP4= github.com/emicklei/go-restful v2.15.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/proto v1.6.15/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -561,10 +911,13 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= +github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -578,46 +931,87 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-docopt v0.0.0-20140912013429-f6dd2ebbb31e/go.mod h1:HyVoz1Mz5Co8TFO8EupIdlcpwShBmY98dkT2xeHkvEI= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.13.0 h1:yNZif1OkDfNoDfb9zZa9aXIpejNR4F23Wely0c+Qdqk= +github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fullstorydev/grpcurl v1.8.0/go.mod h1:Mn2jWbdMrQGJQ8UD62uNyMumT2acsZUCkZIqFxsQf1o= +github.com/fullstorydev/grpcurl v1.8.1/go.mod h1:3BWhvHZwNO7iLXaQlojdg5NA6SxUDePli4ecpK1N7gw= +github.com/fullstorydev/grpcurl v1.8.2/go.mod h1:YvWNT3xRp2KIRuvCphFodG0fKkMXwaxA9CJgKCcyzUQ= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell v1.2.0 h1:ikixzsxc8K8o3V2/CEmyoEW8mJZaNYQQ3NP3VIQdUe4= +github.com/gdamore/tcell v1.2.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= +github.com/gdamore/tcell/v2 v2.3.3/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= +github.com/gdamore/tcell/v2 v2.4.0 h1:W6dxJEmaxYvhICFoTY3WrLLEXsQ11SaFnKGVEXW57KM= +github.com/gdamore/tcell/v2 v2.4.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= +github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gormigrate/gormigrate/v2 v2.0.0/go.mod h1:YuVJ+D/dNt4HWrThTBnjgZuRbt7AuwINeg4q52ZE3Jw= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-ldap/ldap/v3 v3.1.10/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= @@ -626,18 +1020,33 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= +github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= +github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= +github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.1/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= @@ -650,83 +1059,186 @@ github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= +github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= +github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= +github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= +github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= +github.com/go-openapi/loads v0.21.0/go.mod h1:rHYve9nZrQ4CJhyeIIFJINGCg1tQpx2yJrrNo8sf1ws= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= +github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= +github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= +github.com/go-openapi/runtime v0.21.0/go.mod h1:aQg+kaIQEn+A2CRSY1TxbM8+sT9g2V3aLc1FbIAnbbs= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= +github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= +github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= github.com/go-openapi/spec v0.20.2/go.mod h1:RW6Xcbs6LOyWLU/mXGdzn2Qc+3aj+ASfI7rvSZh1Vls= +github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= +github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= +github.com/go-openapi/strfmt v0.20.2/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= +github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= +github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= +github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= +github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= +github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= +github.com/go-openapi/validate v0.20.3/go.mod h1:goDdqVGiigM3jChcrYJxD2joalke3ZXeftD16byIjA4= +github.com/go-piv/piv-go v1.9.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-rod/rod v0.101.8/go.mod h1:N/zlT53CfSpq74nb6rOR0K8UF0SPUPBmzBnArrms+mY= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-testfixtures/testfixtures/v3 v3.2.0/go.mod h1:RZctY24ixituGC73XlAV1gkCwYMVwiSwPm26MNlQIhE= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-training/helloworld v0.0.0-20200225145412-ba5f4379d78b/go.mod h1:hGGmX3bRUkYkc9aKA6mkUxi6d+f1GmZF1je0FlVTgwU= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.2.2/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= +github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= github.com/gobuffalo/flect v0.2.4/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= +github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -735,6 +1247,7 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -744,6 +1257,7 @@ github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -765,17 +1279,30 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4-0.20210608040537-544b4180ac70/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= +github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= @@ -787,12 +1314,20 @@ github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2 github.com/gonum/mathext v0.0.0-20181121095525-8a4bf007ea55/go.mod h1:fmo8aiSEWkJeiGXUJf+sPvuDgEFgqIoZSs843ePKrGg= github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs= +github.com/google/addlicense v1.0.0/go.mod h1:Sm/DHu7Jk+T5miFHHehdIjbi4M5+dJDRS3Cq0rncIxA= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/cel-go v0.11.2/go.mod h1:drz+knCRsctDZ180KZHwIEEUb9IdK/nxPoyhxi+O1K0= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/certificate-transparency-go v1.1.2-0.20210422104406-9f33727a7a18/go.mod h1:6CKh9dscIRoqc2kC6YUFICHZMT9NrClyPrRVFrdw1QQ= +github.com/google/certificate-transparency-go v1.1.2-0.20210512142713-bed466244fa6/go.mod h1:aF2dp7Dh81mY8Y/zpzyXps4fQW5zQbDu2CxfpJB6NkI= +github.com/google/certificate-transparency-go v1.1.2/go.mod h1:3OL+HKDqHPUfdKrHVQxO6T8nDLO0HF7LRTlkIWXaWvQ= +github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -807,49 +1342,102 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= +github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= github.com/google/go-containerregistry v0.4.1-0.20210128200529-19c2b639fab1/go.mod h1:GU9FUA/X9rd2cV3ZoUNaWihp27tki6/38EsVzL2Dyzc= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-containerregistry v0.5.2-0.20210609162550-f0ce2270b3b4/go.mod h1:R5WRYyTdQqTchlBhX4q+WICGh8HQIL5wDFoFZv7Jq6Q= +github.com/google/go-containerregistry v0.5.2-0.20210709161016-b448abac9a70/go.mod h1:nS0LmwaZT5kotebyNVC7ik7lC4OHOzGcctvvSosKlAc= github.com/google/go-containerregistry v0.6.0/go.mod h1:euCCtNbZ6tKqi1E72vwDj2xZcN5ttKpZLfa/wSo5iLw= +github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= +github.com/google/go-containerregistry v0.7.1-0.20211118220127-abdc633f8305/go.mod h1:6cMIl1RfryEiPzBE67OgtZdEiLWz4myqCQIiBMy3CsM= +github.com/google/go-containerregistry v0.7.1-0.20211203164431-c75901cce627/go.mod h1:IwJblnDNiCs8sxubbfPNniYsUqr8m+nt7YbPzecsGuE= github.com/google/go-containerregistry v0.8.0/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= github.com/google/go-containerregistry v0.8.1-0.20220110151055-a61fd0a8e2bb/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= github.com/google/go-containerregistry v0.8.1-0.20220120151853-ac864e57b117/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= -github.com/google/go-containerregistry v0.8.1-0.20220219142810-1571d7fdc46e h1:1KGep3inUBSyCDbpk4noN5CfemOpEpQPPnN7UbBrdCU= +github.com/google/go-containerregistry v0.8.1-0.20220202214207-9c35968ef47e/go.mod h1:cwx3SjrH84Rh9VFJSIhPh43ovyOp3DCWgY3h8nWmdGQ= +github.com/google/go-containerregistry v0.8.1-0.20220211173031-41f8d92709b7/go.mod h1:cwx3SjrH84Rh9VFJSIhPh43ovyOp3DCWgY3h8nWmdGQ= +github.com/google/go-containerregistry v0.8.1-0.20220216220642-00c59d91847c/go.mod h1:MMbnwuvLeZJRPqhTs8jDWc8xGlOs5YCGx1TSc/qdExk= github.com/google/go-containerregistry v0.8.1-0.20220219142810-1571d7fdc46e/go.mod h1:MMbnwuvLeZJRPqhTs8jDWc8xGlOs5YCGx1TSc/qdExk= +github.com/google/go-containerregistry v0.8.1-0.20220414133640-f1b729141d33/go.mod h1:eTLvLZaEe2FoQsb25t7BLxQQryyrwHTzFfwxN87mhAw= +github.com/google/go-containerregistry v0.8.1-0.20220414143355-892d7a808387 h1:GWICy4b02s8EA1M9H5krRQ48BKpIHO5LtBBm2BQLhx0= +github.com/google/go-containerregistry v0.8.1-0.20220414143355-892d7a808387/go.mod h1:eTLvLZaEe2FoQsb25t7BLxQQryyrwHTzFfwxN87mhAw= github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210129212729-5c4818de4025/go.mod h1:n9wRxRfKkHy6ZFyj0jJQHw11P+mGLnED4sqegwrXxDk= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210610160139-c086c7f16d4e/go.mod h1:u9BUkrFoN0hojbyaW5occdRyQvT74KjJKx2VClbrDC8= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210918223331-0e8b581974dd/go.mod h1:j3IqhBG3Ox1NXmmhbWU4UmiHVAf2dUgB7le1Ch7JZQ0= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20211215180950-ab77ea68f600/go.mod h1:j3IqhBG3Ox1NXmmhbWU4UmiHVAf2dUgB7le1Ch7JZQ0= github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20220120151853-ac864e57b117/go.mod h1:BH7pLQnIZhfVpL7cRyWhvvz1bZLY9V45/HvXVh5UMDY= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20220216220642-00c59d91847c/go.mod h1:m6nUV1MgElByyfWJCAKsEt+5s/BtU9ZLjyHDmoeAHcM= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20220414154538-570ba6c88a50/go.mod h1:m7mMYMlUraMy65yWp4AXkMgousS5LFPYcvI19yjz6W0= github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220110151055-a61fd0a8e2bb/go.mod h1:SK4EqntTk6tHEyNngoqHUwjjZaW6mfzLukei4+cbvu8= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220120123041-d22850aca581/go.mod h1:SK4EqntTk6tHEyNngoqHUwjjZaW6mfzLukei4+cbvu8= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220128225446-c63684ed5f15/go.mod h1:juPcrnQFaTyH72YA4Lt2MwEFSGi3orvGXyzxzo+RLss= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220223122423-dd8d514a9b24/go.mod h1:MO/Ilc3XTxy/Pi8aMXEiRUl6icOqResFyhSFCLlqtR8= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220414143355-892d7a808387/go.mod h1:QOryQrrP9Uq/1w9F7WOWWhK2/gHXg7F0i3J/hPG6yQA= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github/v27 v27.0.6/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= +github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-github/v30 v30.1.0/go.mod h1:n8jBpHl45a/rlBUtRJMOG4GhNADUQFEufcolZ95JfU8= +github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= +github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= +github.com/google/go-intervals v0.0.2/go.mod h1:MkaR3LNRfeKLPmqgJYs4E66z5InYjmCjbbr4TQlcT6Y= +github.com/google/go-licenses v0.0.0-20200602185517-f29a4c695c3d/go.mod h1:g1VOUGKZYIqe8lDq2mL7plhAWXqrEaGUs7eIjthN1sk= +github.com/google/go-licenses v0.0.0-20210329231322-ce1d9163b77d/go.mod h1:+TYOmkVoJOpwnS0wfdsJCV9CoD5nJYsHoFk/0CrTK4M= +github.com/google/go-licenses v0.0.0-20210816172045-3099c18c36e1/go.mod h1:WkPB6PtjnM1pF4qeK8RcFmk7z+TIsrPYOng7OPlFDiw= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/go-replayers/httpreplay v1.0.0/go.mod h1:LJhKoTwS5Wy5Ld/peq8dFFG5OfJyHEz7ft+DsTUv25M= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gxui v0.0.0-20151028112939-f85e0a97b3a4/go.mod h1:Pw1H1OjSNHiqeuxAduB1BKYXIwFtsyrY47nEqSgEiCM= github.com/google/ko v0.9.3/go.mod h1:Q6jYoY4SzKhRTaniQgnNoLaj4e4fVIWTBLK4FTJQPtM= +github.com/google/licenseclassifier v0.0.0-20190926221455-842c0d70d702/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= github.com/google/licenseclassifier v0.0.0-20200708223521-3d09a0ea2f39/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/licenseclassifier v0.0.0-20210325184830-bb04aff29e72/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/licenseclassifier v0.0.0-20210722185704-3043a050f148/go.mod h1:rq9F0RSpNKlrefnf6ZYMHKUnEJBCNzf6AcCXMYBeYvE= github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3/go.mod h1:YzLcVlL+NqWnmUEPuhS1LxDDwGO9WNbVlEXaF4IH35g= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/rpmpack v0.0.0-20210518075352-dc539ef4f2ea/go.mod h1:+y9lKiqDhR4zkLl+V9h4q0rdyrYVsWWm6LLCQP33DIk= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/trillian v1.3.14-0.20210409160123-c5ea3abd4a41/go.mod h1:1dPv0CUjNQVFEDuAUFhZql16pw/VlPgaX8qj+g5pVzQ= +github.com/google/trillian v1.3.14-0.20210511103300-67b5f349eefa/go.mod h1:s4jO3Ai4NSvxucdvqUHON0bCqJyoya32eNw6XJwsmNc= +github.com/google/trillian v1.4.0/go.mod h1:1Bja2nEgMDlEJWWRXBUemSPG9qYw84ZYX2gHRVHlR+g= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -857,30 +1445,45 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.3/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ= github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= +github.com/goreleaser/goreleaser v0.134.0/go.mod h1:ZT6Y2rSYa6NxQzIsdfWWNWAlYGXGbreo66NmE+3X3WQ= +github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= +github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= +github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -898,22 +1501,34 @@ github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/g github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.14.8/go.mod h1:NZE8t6vs6TnwLL/ITkaK8W3ecMLGAbh2jXTclvpiwYo= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= @@ -930,19 +1545,38 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.1.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.6.7/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-secure-stdlib/base62 v0.1.1/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.1/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.2/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.2/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-secure-stdlib/password v0.1.1/go.mod h1:9hH302QllNwu1o2TGYtSk8I8kTAN0ca1EHpwhm5Mmzo= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= +github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.1/go.mod h1:l8slYwnJA26yBz+ErHpp2IRCLr0vuOMGBORIz4rRiAs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -950,6 +1584,8 @@ github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2I github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -968,13 +1604,30 @@ github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= +github.com/hashicorp/vault/api v1.3.0/go.mod h1:EabNQLI0VWbWoGlA+oBLC8PXmR9D60aUVgQGvangFWQ= +github.com/hashicorp/vault/api v1.3.1/go.mod h1:QeJoWxMFt+MsuWcYhmwRLwKEXrjwAFFywzhptMsTIUw= +github.com/hashicorp/vault/sdk v0.3.0/go.mod h1:aZ3fNuL5VNydQk8GcLJ2TV8YCRVvyaakYkhZRoVuhj0= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= +github.com/heroku/color v0.0.6 h1:UTFFMrmMLFcL3OweqP1lAdp8i1y/9oHqkeHjQ/b/Ny0= +github.com/heroku/color v0.0.6/go.mod h1:ZBvOcx7cTF2QKOv4LbmoBtNl5uB17qWxGuzZrsi1wLU= +github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= +github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= +github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ikawaha/goahttpcheck v1.3.1/go.mod h1:RFH8+oq3GOW2yiRwI5tcx3FrVmONlT4DMmu80dsoBRE= +github.com/ikawaha/httpcheck v1.2.0/go.mod h1:eYUWSdmssaYCdUzcOUe8NMF0vgr4MKq7Iqbb3eXtpxI= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -983,6 +1636,7 @@ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/in-toto/in-toto-golang v0.3.4-0.20211211042327-af1f9fb822bf/go.mod h1:twl9XmClqj6/h/HANQQYaJZVKPPW/Mz53bd2t6UXGQA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -990,7 +1644,61 @@ github.com/influxdata/tdigest v0.0.0-20180711151920-a7d76c6f093a/go.mod h1:9Gkys github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/tdigest v0.0.0-20191024211133-5d87a7585faa/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/influxdata/tdigest v0.0.1/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.6.4/go.mod h1:w2pne1C2tZgP+TvjqLpOigGzNqjBgQW9dUw/4Chex78= +github.com/jackc/pgconn v1.7.0/go.mod h1:sF/lPpNEMEOp+IYhyQGdAvrG20gWf6A1tKlr0v7JMeA= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.5/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.4.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= +github.com/jackc/pgtype v1.5.0/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.8.1/go.mod h1:4HOLxrl8wToZJReD04/yB20GDwf4KBYETvlHciCnwW0= +github.com/jackc/pgx/v4 v4.9.0/go.mod h1:MNGWmViCgqbZck9ujOOBN63gK9XVGILXWCvKLGKmnms= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.2/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= +github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= +github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -1004,10 +1712,21 @@ github.com/jcmturner/gokrb5/v8 v8.4.2 h1:6ZIM6b/JJN0X8UM43ZOM6Z4SJzla+a/u7scXFJz github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jedisct1/go-minisign v0.0.0-20210703085342-c1f07ee84431/go.mod h1:3VIJLjlf5Iako82IX/5KOoCzDmogK5mO+bl+DRItnR8= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jenkins-x/go-scm v1.10.10/go.mod h1:z7xTO9/VzqW3xEbEMH2z5cpOGrZ8+nOHOWfU1ngFGxs= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -1016,6 +1735,7 @@ github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeY github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= @@ -1027,6 +1747,8 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -1043,15 +1765,25 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= +github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= @@ -1059,8 +1791,13 @@ github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.14.2 h1:S0OHlFk/Gbon/yauFJ4FfJJF5V0fc5HbBTJazi28pRw= github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.14.3/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.14.4 h1:eijASRJcobkVtSt81Olfh7JX43osYLwy5krOJo6YEu4= +github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1068,30 +1805,50 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/ktr0731/go-fuzzyfinder v0.2.0/go.mod h1:Ol2Z6Rc1tu/uUSlD6b67wnhB4nGQt0Mr2NtP0SNW6uM= github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lestrrat-go/jwx v0.9.0/go.mod h1:iEoxlYfZjvoGpuWwxUz+eR5e6KTJGsaRcy/YNA/UnBk= github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac/go.mod h1:Frd2bnT3w5FB5q49ENTfVlztJES+1k/7lyWX2+9gq/M= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -1108,35 +1865,67 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.1-0.20191009090205-6c0755d89d1e/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d/go.mod h1:WZy8Q5coAB1zhY9AOBJP0O6J4BuDfbupUDavKY+I3+s= +github.com/manveru/gobdd v0.0.0-20131210092515-f1a17fdd710b/go.mod h1:Bj8LjjP0ReT1eKt5QlKjwgi5AFm5mI6O1A2G4ChI0Ag= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA= +github.com/markbates/goth v1.68.0/go.mod h1:V2VcDMzDiMHW+YmqYl7i0cMiAUeCkAe4QE6jRKBhXZw= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattmoor/dep-notify v0.0.0-20190205035814-a45dec370a17/go.mod h1:qWnF4u+oS4UWOZMwZcBQXrt5IQIdWc6XVJLDdxGIfdQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +github.com/mattn/go-sqlite3 v2.0.2+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= @@ -1146,31 +1935,46 @@ github.com/maxbrunsfeld/counterfeiter/v6 v6.3.0/go.mod h1:fcEyUyXZXoV4Abw8DX0t7w github.com/maximilien/kn-source-pkg v0.6.3 h1:5S9jgof8KSvde/hrM0VaOMZ6LmBPTIMO05fdDpbVbvI= github.com/maximilien/kn-source-pkg v0.6.3/go.mod h1:3Nym+ahhV18lkHutauJdw1r3PmlDfu/DoTUuF8ySMt4= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mediocregopher/radix/v4 v4.0.0/go.mod h1:ajchozX/6ELmydxWeWM6xCFHVpZ4+67LXHOTOVR0nCE= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.17/go.mod h1:WgzbA6oji13JREwiNsRDNfl7jYdPnmz+VEuLrA+/48M= +github.com/miekg/dns v1.1.25/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e h1:Qa6dnn8DlasdXRnacluu8HzPts0S1I9zvvUPDbBnXFI= +github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e/go.mod h1:waEya8ee1Ro/lgxpVhkJI4BVASzkm3UZqkx/cFJiYHM= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= @@ -1178,17 +1982,36 @@ github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= +github.com/moby/buildkit v0.9.3/go.mod h1:5dZQUHg9STw/Fhl4zZiusDJKn8uje/0x952Nce4a8cg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.2.0 h1:WhCW5B355jtxndN5ovugJlMFJawbUODuW8fSnEH6SSM= +github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= +github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= +github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= @@ -1196,10 +2019,17 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY= +github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -1208,6 +2038,7 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= @@ -1216,21 +2047,26 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1243,77 +2079,110 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= -github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/open-policy-agent/opa v0.35.0/go.mod h1:xEmekKlk6/c+so5HF9wtPnGPXDfBuBsrMGhSHOHEF+U= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202193544-a5463b7f9c84/go.mod h1:Qnt1q4cjDNQI9bT832ziho5Iw2BhK8o1KwLOwW56VP4= +github.com/opencontainers/image-spec v1.0.3-0.20211202222133-eacdcc10569b/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= +github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0 h1:O9+X96OcDjkmmZyfaG996kV7yq8HsoU2h1XRRQcefG8= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/openshift-knative/kn-plugin-event v0.29.1-0.20220412122141-1868b0441a3a h1:/YDaMMhw/x5YBEiyBKMcKsaqwTU6MqRwpmli9qJ3hFc= github.com/openshift-knative/kn-plugin-event v0.29.1-0.20220412122141-1868b0441a3a/go.mod h1:kQyE1OOW1CdTUim/7xAGmGZoqnJqsU9G0nqazQ8nEl8= +github.com/openshift-knative/kn-plugin-func v1.1.3-0.20220601222936-a3f704bc3c50 h1:9desZnec/d04MX2vhIlBQms2jBQIm6DArlNstWUrqok= +github.com/openshift-knative/kn-plugin-func v1.1.3-0.20220601222936-a3f704bc3c50/go.mod h1:bn9LDPsTNbpY7e4VL03ewcTognbJfxu/juNdLLwqT7o= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.0/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/openzipkin/zipkin-go v0.3.0 h1:XtuXmOLIXLjiU2XduuWREDT0LOKtSgos/g7i7RYyoZQ= github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= +github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -1321,6 +2190,7 @@ github.com/pelletier/go-toml/v2 v2.0.0-beta.2/go.mod h1:+X+aW6gUj6Hda43TeYHVCIvY github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/peterh/liner v0.0.0-20170211195444-bf27d3ba8e1d/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= @@ -1331,12 +2201,14 @@ github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1346,7 +2218,9 @@ github.com/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:w github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/proglottis/gpgme v0.1.1/go.mod h1:fPbW/EZ0LvwQtH8Hy7eixhp1eF3G39dtx7GUN+0Gmy0= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -1355,8 +2229,11 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1368,6 +2245,7 @@ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1377,11 +2255,15 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1391,17 +2273,26 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.6/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.1/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/statsd_exporter v0.15.0/go.mod h1:Dv8HnkoLQkeEjkIE4/2ndAA7WL1zHKK7WMqFQqu72rw= +github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc/go.mod h1:KbKfKPy2I6ecOIGA9apfheFv14+P3RSmmQvshofQyMY= github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/pseudomuto/protoc-gen-doc v1.5.0/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ= github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= @@ -1409,8 +2300,10 @@ github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQ github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/qur/ar v0.0.0-20130629153254-282534b91770/go.mod h1:SjlYv2m9lpV0UW6K7lDqVJwEIIvSjaHbGk7nIfY8Hxw= github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1419,15 +2312,34 @@ github.com/rickb777/date v1.13.0 h1:+8AmwLuY1d/rldzdqvqTEg7107bZ8clW37x4nsdG3Hs= github.com/rickb777/date v1.13.0/go.mod h1:GZf3LoGnxPWjX+/1TXOuzHefZFDovTyNLHDMd3qH70k= github.com/rickb777/plural v1.2.1 h1:UitRAgR70+yHFt26Tmj/F9dU9aV6UfjGXSbO1DcC9/U= github.com/rickb777/plural v1.2.1/go.mod h1:j058+3M5QQFgcZZ2oKIOekcygoZUL8gKW5yRO14BuAw= +github.com/rivo/tview v0.0.0-20210624165335-29d673af0ce2 h1:I5N0WNMgPSq5NKUFspB4jMJ6n2P0ipz5FlOlB4BXviQ= +github.com/rivo/tview v0.0.0-20210624165335-29d673af0ce2/go.mod h1:IxQujbYMAh4trWr0Dwa8jfciForjVmxyHpskZX6aydQ= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/dnscache v0.0.0-20210201191234-295bba877686/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/rs/zerolog v1.17.2/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= @@ -1435,49 +2347,99 @@ github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNl github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sabhiram/go-gitignore v0.0.0-20201211074657-223ce5d391b0 h1:4Q/TASkyjpqyR5DL5+6c2FGSDpHM5bTMSspcXr7J6R8= +github.com/sabhiram/go-gitignore v0.0.0-20201211074657-223ce5d391b0/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= +github.com/sassoftware/go-rpmutils v0.1.1/go.mod h1:euhXULoBpvAxqrBHEyJS4Tsu3hHxUmQWNymxoJbzgUY= +github.com/sassoftware/relic v0.0.0-20210427151427-dfb082b79b74/go.mod h1:YlB8wFIZmFLZ1JllNBfSURzz52fBxbliNgYALk1UDmk= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/secure-systems-lab/go-securesystemslib v0.1.0/go.mod h1:eIjBmIP8LD2MLBL/DkQWayLiz006Q4p+hCu79rvWleY= +github.com/secure-systems-lab/go-securesystemslib v0.2.0/go.mod h1:eIjBmIP8LD2MLBL/DkQWayLiz006Q4p+hCu79rvWleY= +github.com/secure-systems-lab/go-securesystemslib v0.3.0/go.mod h1:o8hhjkbNl2gOamKUA/eNW3xUrntHT9L4W89W1nfj43U= +github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= +github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= +github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc= +github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sigstore/cosign v1.4.2-0.20220103014340-1a7f9d61a2e9/go.mod h1:07cmUkSH4O6pbvSXSulNP4VPPzNPccq4tB3BXM2u5M0= +github.com/sigstore/fulcio v0.1.2-0.20211207184413-f4746cc4ff3d/go.mod h1:4MU8ZIe1hJz85JUaYi7v1kIxG3z9t1T6I8Ae4KFjPV4= +github.com/sigstore/fulcio v0.1.2-0.20220103193424-0df42390d392/go.mod h1:HpEuqamoVS2jypmBqHcsF4goDzb28+0sQUyHUb+Cpf8= +github.com/sigstore/rekor v0.3.1-0.20211211150321-b8eca1b71e0b/go.mod h1:msxSFjTHSyqvb46svKXcvTIL5K39lqma91Gauu2Hj0Y= +github.com/sigstore/rekor v0.4.1-0.20220103184137-e86cf37242d3/go.mod h1:FTaicg3g+p5RV7H+MkxoXvx5ymI4coQLB/wHr2o84l0= +github.com/sigstore/sigstore v1.0.1/go.mod h1:1+krIdtuf81/fLC8mHPt/7uwYiOg7W8k/PAR7lzKW3w= +github.com/sigstore/sigstore v1.0.2-0.20211210190220-04746d994282/go.mod h1:SuM+QIHtnnR9eGsURRLv5JfxM6KeaU0XKA1O7FmLs4Q= +github.com/sigstore/sigstore v1.0.2-0.20211223185235-75bc699f921d/go.mod h1:gDpcHw4VwpoL5C6N1Ud1YtBsc+ikRDwDelDlWRyYoE8= +github.com/sigstore/sigstore v1.1.0/go.mod h1:gDpcHw4VwpoL5C6N1Ud1YtBsc+ikRDwDelDlWRyYoE8= +github.com/sigstore/sigstore v1.1.1-0.20220104191147-28bc731b4695/go.mod h1:HzhvIvMfEEPnqx4M7DoVT3O/47DFfvwxNuMXWPajWmE= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/slinkydeveloper/loadastic v0.0.0-20201218203601-5c69eea3b7d8/go.mod h1:vNSJ7ak+2OeAb5bhSHRmMKKcbadbxlokx/Wh1lC50e4= +github.com/smallstep/assert v0.0.0-20200723003110-82e2b9b3b262/go.mod h1:MyOHs9Po2fbM1LHej6sBUT8ozbxmMOFG+E+rx/GSGuc= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5-0.20210205191134-5ec6847320e5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= @@ -1510,6 +2472,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= @@ -1517,24 +2480,32 @@ github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhU github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/spiffe/go-spiffe/v2 v2.0.0-beta.10/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk= github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:CKI4AZ4XmGV240rTHfO0hfE83S6/a3/Q1siZJ/vXf7A= +github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1542,19 +2513,55 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/sylabs/release-tools v0.1.0/go.mod h1:pqP/z/11/rYMQ0OM/Nn7TxGijw7KfZwW9UolD/J1TUo= +github.com/sylabs/sif/v2 v2.3.1/go.mod h1:NnvveH62GiibimL00MrI6YYcZfb7DnZMcRo/40giY+0= github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tektoncd/chains v0.8.0/go.mod h1:54qsO4wJjmIkSt4BAv1FMwrh+S2HhuXiw4FNGgrxkLE= +github.com/tektoncd/cli v0.23.1/go.mod h1:vyHxuzvbdQQ0/HBAko20r6rZY9mWDh6994sVfoM/HII= +github.com/tektoncd/hub v1.7.0/go.mod h1:c3lL6qU1nFD9TCCrFuEnygB3KcfNn5Tbi27nZ3H6nxA= +github.com/tektoncd/pipeline v0.31.1-0.20220105002759-3e137645be61/go.mod h1:dO84qW4sTq7S7Jv5G0PRmbTjvxnUAuDDxD1NBrsQX9w= +github.com/tektoncd/pipeline v0.33.0/go.mod h1:FAxcjW5FRSBUDmNVXxv1Lq4YlT6Qjgh85TC9JKcxdX4= +github.com/tektoncd/pipeline v0.33.1/go.mod h1:5Re8byhcUd3afN6m6IKn0SfNvbJCRmQRyEOl7fz0OXo= +github.com/tektoncd/pipeline v0.34.1/go.mod h1:ZdUe14VvTODQFAxQRHrDyuTEvnM4pMY8dPI+RJufw7s= +github.com/tektoncd/plumbing v0.0.0-20211012143332-c7cc43d9bc0c/go.mod h1:b9esRuV1absBvaPzKkjYdKXjC5Tgs8/vh1sz++RiTdc= +github.com/tektoncd/triggers v0.19.0/go.mod h1:o1LZztX+exY/MbwRJbgbeTv1exn9rDnepX2vM2CD2q0= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tent/canonical-json-go v0.0.0-20130607151641-96e4ba3a7613/go.mod h1:g6AnIpDSYMcphz193otpSIzN+11Rs+AAIIC6rm1enug= +github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= github.com/thediveo/enumflag v0.10.0 h1:CQIGWQYgFIKTUvRf5FL3K5ksQzzBag/HSUCu3Oin+Jw= github.com/thediveo/enumflag v0.10.0/go.mod h1:zbsjXNJ3Np5ZXjUDgXeXsF2THwQd6ybEKMLw9XnQZ8o= +github.com/theupdateframework/go-tuf v0.0.0-20210722233521-90e262754396/go.mod h1:L+uU/NRFK/7h0NYAnsmvsX9EghDB5QVCcHCIrK2h5nw= +github.com/theupdateframework/go-tuf v0.0.0-20211203210025-7ded50136bf9/go.mod h1:n2n6wwC9BEnYS/C/APAtNln0eM5zYAYOkOTx6VEG/mA= +github.com/theupdateframework/go-tuf v0.0.0-20211213174152-470b5ab00139/go.mod h1:I0Gs4Tev4hYQ5wiNqN8VJ7qS0gw7KOZNQuckC624RmE= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.3/go.mod h1:5WdjKx3AQMvCJ4RG6/2UYT7dLrGvJUV1x4jdTAyGvZs= +github.com/tilinna/clock v1.0.2/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= +github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= +github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj52Uc= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -1563,14 +2570,30 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= +github.com/tonistiigi/fsutil v0.0.0-20210609172227-d72af97c0eaf/go.mod h1:lJAxK//iyZ3yGbQswdrPTxugZIDM7sd4bEsD0x3XMHk= +github.com/tonistiigi/go-actions-cache v0.0.0-20211002214948-4d48f2ff622a/go.mod h1:YiIBjH5gP7mao3t0dBrNNBGuKYdeJmcAJjYLXr43k6A= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= github.com/tsenart/go-tsz v0.0.0-20180814232043-cdeb9e1e981e/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible/go.mod h1:Smz/ZWfhKRcyDDChZkG3CyTHdj87lHzio/HOCkbndXM= github.com/tsenart/vegeta/v12 v12.8.4/go.mod h1:ZiJtwLn/9M4fTPdMY7bdbIeyNeFVE8/AHbWFqCsUuho= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -1578,44 +2601,77 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vbauerster/mpb/v7 v7.3.2/go.mod h1:wfxIZcOJq/bG1/lAtfzMXcOiSvbqVi/5GX5WCSi+IsA= +github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= github.com/vdemeester/k8s-pkg-credentialprovider v1.19.7/go.mod h1:K2nMO14cgZitdwBqdQps9tInJgcaXcU/7q5F59lpbNI= +github.com/vdemeester/k8s-pkg-credentialprovider v1.20.7/go.mod h1:K2nMO14cgZitdwBqdQps9tInJgcaXcU/7q5F59lpbNI= +github.com/vdemeester/k8s-pkg-credentialprovider v1.21.0-1/go.mod h1:l4LxiP0cmEcc5q4BTDE8tZSyIiyXe0T28x37yHpMzoM= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/wavesoftware/go-ensure v1.0.0 h1:6X3gQL5psBWwtu/H9a+69xQ+JGTUELaLhgOB/iB3AQk= github.com/wavesoftware/go-ensure v1.0.0/go.mod h1:K2UAFSwMTvpiRGay/M3aEYYuurcR8S4A6HkQlJPV8k4= github.com/wavesoftware/go-magetasks v0.6.0/go.mod h1:8/zmKLAbJFwjAZOF8U2BnmVa9aDrLPtd4XO5b67uflY= +github.com/whilp/git-urls v1.0.0 h1:95f6UMWN5FKW71ECsXRUd3FVYiXdrE7aX4NZKcPmIjU= +github.com/whilp/git-urls v1.0.0/go.mod h1:J16SAmobsqc3Qcy98brfl5f5+e0clUvg1krgwk/qCfE= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.52.2/go.mod h1:Q+hQhV508bDPoBijv7YjK/Lvlb4PhVhJdKqXVQrUoAE= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= +github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b/go.mod h1:HptNXiXVDcJjXe9SqMd0v2FsL9f8dz4GnXgltU6q/co= github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/ysmood/goob v0.3.0/go.mod h1:S3lq113Y91y1UBf1wj1pFOxeahvfKkCk6mTWTWbDdWs= +github.com/ysmood/got v0.15.1/go.mod h1:pE1l4LOwOBhQg6A/8IAatkGp7uZjnalzrZolnlhhMgY= +github.com/ysmood/gotrace v0.2.2/go.mod h1:TzhIG7nHDry5//eYZDYcTzuJLYQIkykJzCRIo4/dzQM= +github.com/ysmood/gson v0.6.4/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg= +github.com/ysmood/leakless v0.7.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= @@ -1629,6 +2685,11 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea/go.mod h1:eNr558nEUjP8acGw8FFjTeWvSgU1stO7FAO6eknhHe4= +github.com/zalando/go-keyring v0.1.0/go.mod h1:RaxNwUITJaHVdQ0VC7pELPZ3tOWn13nr0gZMZEhpVU0= +github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= +github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -1638,21 +2699,46 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0-alpha.0/go.mod h1:mPcW6aZJukV6Aa81LSKpBjQXTWlXB5r74ymPoSWa3Sw= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0-alpha.0/go.mod h1:kdV+xzCJ3luEBSIeQyB/OEKkWKd8Zkux4sbDeANrosU= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v3 v3.5.0-alpha.0/go.mod h1:wKt7jgDgf/OfKiYmCq5WFGxOFAkVMLxiiXgLDFhECr8= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/etcdctl/v3 v3.5.0-alpha.0/go.mod h1:YPwSaBciV5G6Gpt435AasAG3ROetZsKNUzibRa/++oo= +go.etcd.io/etcd/etcdctl/v3 v3.5.0/go.mod h1:vGTfKdsh87RI7kA2JHFBEGxjQEYx+pi299wqEOdi34M= +go.etcd.io/etcd/etcdutl/v3 v3.5.0/go.mod h1:o98rKMCibbFAG8QS9KmvlYDGDShmmIbmRE8vSofzYNg= +go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0/go.mod h1:tV31atvwzcybuqejDoY3oaNRTtlD2l/Ot78Pc9w7DMY= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0-alpha.0/go.mod h1:FAwse6Zlm5v4tEWZaTjmNhe17Int4Oxbu7+2r0DiD3w= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0-alpha.0/go.mod h1:tsKetYpt980ZTpzl/gb+UOJj9RkIyCb1u4wjzMg90BQ= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= +go.etcd.io/etcd/tests/v3 v3.5.0-alpha.0/go.mod h1:HnrHxjyCuZ8YDt8PYVyQQ5d1ZQfzJVEtQWllr5Vp/30= +go.etcd.io/etcd/tests/v3 v3.5.0/go.mod h1:f+mtZ1bE1YPvgKdOJV2BKy4JQW0nAFnQehgOE7+WyJE= +go.etcd.io/etcd/v3 v3.5.0-alpha.0/go.mod h1:JZ79d3LV6NUfPjUxXrpiFAYcjhT+06qqw+i28snx8To= +go.etcd.io/etcd/v3 v3.5.0/go.mod h1:FldM0/VzcxYWLvWx1sdA7ghKw7C3L2DvUTzGrcEtsC4= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= +go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= +go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1666,20 +2752,46 @@ go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib v0.21.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= +go.opentelemetry.io/contrib v1.3.0/go.mod h1:FlyPNX9s4U6MCsWEc5YAK4KzKNHFDsjrDUZijJiXvy8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.21.0/go.mod h1:Vm5u/mtkj1OMhtao0v+BGo2LUoLCgHYXvRmj0jWITlE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.21.0/go.mod h1:a9cocRplhIBkUAJmak+BPDx+LVL7cTmqUPB0uBcTA4k= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.21.0/go.mod h1:JQAtechjxLEL81EjmbRwxBq/XEzGaHcsPuDHAx54hg4= go.opentelemetry.io/otel v0.16.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC1/go.mod h1:FXJnjGCoTQL6nQ8OpFJ0JI1DrdOvMoVx49ic0Hg4+D4= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0-RC1/go.mod h1:FliQjImlo7emZVjixV8nbDMAa4iAkcWTE9zzSEOiEPw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0-RC1/go.mod h1:cDwRc2Jrh5Gku1peGK8p9rRuX/Uq2OtVmLicjlw2WYU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.0.0-RC1/go.mod h1:OYKzEoxgXFvehW7X12WYT4/a2BlASJK9l7RtG4A91fg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/internal/metric v0.21.0/go.mod h1:iOfAaY2YycsXfYD4kaRSbLx2LKmfpKObWBEv9QK5zFo= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.21.0/go.mod h1:JWCt1bjivC4iCrz/aCrM1GSw+ZcvY44KCbaeeRhzHnc= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/oteltest v1.0.0-RC1/go.mod h1:+eoIG0gdEOaPNftuy1YScLr1Gb4mL/9lpDkZ0JjMRq4= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.0.0-RC1/go.mod h1:kj6yPn7Pgt5ByRuwesbaWcRLA+V7BSDg3Hf8xRvsvf8= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= +go.step.sm/crypto v0.13.0/go.mod h1:5YzQ85BujYBu6NH18jw7nFjwuRnDch35nLzH0ES5sKg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1689,64 +2801,106 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.20.0 h1:N4oPlghZwYG55MlU6LXk/Zp00FVNE9X9wrYO8CEs4lc= +go.uber.org/zap v1.20.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +goa.design/goa/v3 v3.0.9/go.mod h1:oJR8VOFa4HV7wCQv4XhPtvyknz0B3VFFRUWDdEmI0FI= +goa.design/goa/v3 v3.1.3/go.mod h1:GEog3KvHosQPKrrZSlpXDSnm7PpmzZEiy3mLxI/FtXM= +goa.design/goa/v3 v3.3.1/go.mod h1:Br8id+evuay7oUIK3BXr6iFJVLxAiirb+FPzfYUYOWg= +goa.design/plugins/v3 v3.1.3/go.mod h1:j4gOWwZpEBsNmONKitV/tBlxG6Yu7unFCU1HJmqjiC8= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +gocloud.dev v0.24.1-0.20211119014450-028788aaaa4c/go.mod h1:EIJSlY7nvfeoWaV2GauF6es27gZfqtTVon47QFueoyE= +golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200930160638-afb6bcd081ae/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1755,9 +2909,12 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20210126221216-84987778548c/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1771,24 +2928,35 @@ golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20190806162312-597adff16ade/go.mod h1:AlhUtkH4DA4asiFC5RgK7ZKmauvtkAVcy9L0epCzlWo= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1812,6 +2980,10 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1821,13 +2993,17 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201026091529-146b70c837a4/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1837,27 +3013,48 @@ golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.0.0-20210326220855-61e056675ecf/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211111083644-e5c967477495/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211203184738-4852103109b8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211205041911-012df41ee64c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127074510-2fabfed7e28f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1869,13 +3066,17 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1885,40 +3086,53 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200930132711-30421366ff76/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1931,8 +3145,11 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191029155521-f43be2a4598c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1963,14 +3180,18 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201005172224-997123666555/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1985,14 +3206,21 @@ golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210326220804-49726bf1d181/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2005,29 +3233,40 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211001092434-39dca1131b70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220223155357-96fed51e1446/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/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/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2046,19 +3285,25 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2068,9 +3313,16 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -2078,48 +3330,65 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190807223507-b346f7fd45de/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191030232956-1e24073be82c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200313205530-4303120df7d8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512001501-aaeff5de670a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200612220849-54c614fe050c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2129,6 +3398,7 @@ golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -2138,8 +3408,10 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201014170642-d1624618ad65/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2154,6 +3426,7 @@ golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= @@ -2167,6 +3440,8 @@ golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2181,8 +3456,16 @@ gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6d gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= +google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2202,12 +3485,16 @@ google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -2218,15 +3505,18 @@ google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= google.golang.org/api v0.65.0/go.mod h1:ArYhxgGadlWmqO1IqVujw6Cs8IdD33bTmzKo2Sh+cbg= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.70.0 h1:67zQnAE0T2rB0A3CwLSas0K+SbVzSxP+zTLkQLexeiw= google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -2238,17 +3528,24 @@ google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -2275,8 +3572,10 @@ google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200929141702-51c3e5b607fe/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2284,13 +3583,21 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210325224202-eed09b1b5210/go.mod h1:f2Bd7+2PlaVKmvKQ52aspJZXIDaRQBVdOOBfJ5i8OEs= +google.golang.org/genproto v0.0.0-20210331142528-b7513248f0ba/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210416161957-9910b6c460de/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210427215850-f767ed18ee4d/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -2306,26 +3613,39 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211019152133-63b7e35f4404/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211027162914-98a5263abeca/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211207154714-918901c715cf/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf h1:SVYXkUz2yZS9FWb2Gm8ivSlbNQzL2Z/NpPKE3RG2jWk= google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220301145929-1ac2ace0dbf7/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220303160752-862486edd9cc/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6 h1:FglFEfyj61zP3c6LgjmVHxYxZWXYul9oiS1EZqD5gLc= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -2346,6 +3666,7 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= @@ -2365,6 +3686,7 @@ google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5 google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/examples v0.0.0-20201130180447-c456688b1860/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2375,6 +3697,7 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= @@ -2398,6 +3721,11 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/h2non/gentleman.v1 v1.0.4/go.mod h1:JYuHVdFzS4MKOXe0o+chKJ4hCe6tqKKw9XH9YP6WFrg= +gopkg.in/h2non/gock.v1 v1.0.16/go.mod h1:XVuDAssexPLwgxCLMvDTWNU5eqklsydR6I5phZ9oPB8= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2410,15 +3738,26 @@ gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLn gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2427,145 +3766,201 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= +gorm.io/driver/postgres v1.0.0/go.mod h1:wtMFcOzmuA5QigNsgEIb7O5lhvH1tHAF1RbWmLWV4to= +gorm.io/driver/postgres v1.0.2/go.mod h1:FvRSYfBI9jEp6ZSjlpS9qNcSjxwYxFc03UOTrHdvvYA= +gorm.io/driver/sqlite v1.1.1/go.mod h1:hm2olEcl8Tmsc6eZyxYSeznnsDaMqamBvEXLNtBg4cI= +gorm.io/driver/sqlserver v1.0.2/go.mod h1:gb0Y9QePGgqjzrVyTQUZeh9zkd5v0iz71cM1B4ZycEY= +gorm.io/gorm v1.9.19/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.20.0/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.20.2/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= +gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= -k8s.io/api v0.19.7/go.mod h1:KTryDUT3l6Mtv7K2J2486PNL9DBns3wOYTkGR+iz63Y= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= k8s.io/api v0.22.5 h1:xk7C+rMjF/EGELiD560jdmwzrB788mfcHiNbMQLIVI8= k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= k8s.io/apiextensions-apiserver v0.19.7/go.mod h1:XJNNtjISNNePDEUClHt/igzMpQcmjVVh88QH+PKztPU= +k8s.io/apiextensions-apiserver v0.20.7/go.mod h1:rBGJeRYoDJi1jJFHPA4QWXV6YX/5scZfSdkuMSgWoyA= +k8s.io/apiextensions-apiserver v0.21.4/go.mod h1:OoC8LhI9LnV+wKjZkXIBbLUwtnOGJiTRE33qctH5CIk= k8s.io/apiextensions-apiserver v0.22.5 h1:ML0QqT7FIlmZHN+9+2EtARJ3cJVHeoizt6GCteFRE0o= k8s.io/apiextensions-apiserver v0.22.5/go.mod h1:tIXeZ0BrDxUb1PoAz+tgOz43Zi1Bp4BEEqVtUccMJbE= -k8s.io/apimachinery v0.19.7/go.mod h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.3/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= k8s.io/apimachinery v0.22.5 h1:cIPwldOYm1Slq9VLBRPtEYpyhjIm1C6aAMAoENuvN9s= k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= k8s.io/apiserver v0.19.7/go.mod h1:DmWVQggNePspa+vSsVytVbS3iBSDTXdJVt0akfHacKk= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.20.7/go.mod h1:7gbB7UjDdP1/epYBGnIUE6jWY4Wpz99cZ7igfDa9rv4= +k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg= +k8s.io/apiserver v0.21.4/go.mod h1:SErUuFBBPZUcD2nsUU8hItxoYheqyYr2o/pCINEPW8g= k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= k8s.io/cli-runtime v0.19.7/go.mod h1:UTtbWaGV/USZSrnvuW/lRZGM5OsemAT/q/Du/Ac+wKU= +k8s.io/cli-runtime v0.21.4/go.mod h1:eRbLHYkdVWzvG87yrkgGd8CqX6/+fAG9DTdAqTXmlRY= k8s.io/cli-runtime v0.22.5 h1:bZqLgx1INiPgXyMk/Hu3o5NFmdfvlvtsoE+wHJuKA2U= k8s.io/cli-runtime v0.22.5/go.mod h1:12ah4O0kaevIYHsRcFGt8RKER0wlTN2yCgHp1c4Uxp4= -k8s.io/client-go v0.19.7/go.mod h1:iytGI7S3kmv6bWnn+bSQUE4VlrEi4YFssvVB7J7Hvqg= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= k8s.io/client-go v0.22.5 h1:I8Zn/UqIdi2r02aZmhaJ1hqMxcpfJ3t5VqvHtctHYFo= k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= k8s.io/cloud-provider v0.19.7/go.mod h1:aO/VpUwkG+JQN7ZXc5WBLZ5NBXuq/Y5B6vri6U94PZ8= +k8s.io/cloud-provider v0.21.0/go.mod h1:z17TQgu3JgUFjcgby8sj5X86YdVK5Pbt+jm/eYMZU9M= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/code-generator v0.20.7/go.mod h1:i6FmG+QxaLxvJsezvZp0q/gAEzzOz3U53KFibghWToU= +k8s.io/code-generator v0.21.4/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo= k8s.io/code-generator v0.22.5 h1:jn+mYXI5q7rzo7Bz/n8xZIgbe61SeXlIjU5jA8jLVps= k8s.io/code-generator v0.22.5/go.mod h1:sbdWCOVob+KaQ5O7xs8PNNaCTpbWVqNgA6EPwLOmRNk= +k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= k8s.io/component-base v0.19.7/go.mod h1:YX8spPBgwl3I6UGcSdQiEMAqRMSUsGQOW7SEr4+Qa3U= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.20.7/go.mod h1:878UWprXC07P2CWFg+jjvTfxJSlkHp1v2m1MTkNQnJY= +k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw= +k8s.io/component-base v0.21.4/go.mod h1:ZKG0eHVX+tUDcaoIGpU3Vtk4TIjMddN9uhEWDmW6Nyg= k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/controller-manager v0.21.0/go.mod h1:Ohy0GRNRKPVjB8C8G+dV+4aPn26m8HYUI6ejloUBvUA= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= k8s.io/csi-translation-lib v0.19.7/go.mod h1:WghizPQuzuygr2WdpgN2EjcNpDD2V4EAbxFXsgHgSBk= +k8s.io/csi-translation-lib v0.21.0/go.mod h1:edq+UMpgqEx3roTuGF/03uIuSOsI986jtu65+ytLlkA= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20210203185629-de9496dff47b/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210113233702-8566a335510f/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kube-openapi v0.0.0-20220114203427-a0453230fd26/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf h1:M9XBsiMslw2lb2ZzglC0TOkBPK5NQi0/noUrdnoFwUg= +k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= k8s.io/legacy-cloud-providers v0.19.7/go.mod h1:dsZk4gH9QIwAtHQ8CK0Ps257xlfgoXE3tMkMNhW2xDU= +k8s.io/legacy-cloud-providers v0.21.0/go.mod h1:bNxo7gDg+PGkBmT/MFZswLTWdSWK9kAlS1s8DJca5q4= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211208161948-7d6a63dca704 h1:ZKMMxTvduyf5WUtREOqg5LiXaN1KO/+0oOQPRFrClpo= k8s.io/utils v0.0.0-20211208161948-7d6a63dca704/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220127004650-9b3446523e65/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= knative.dev/caching v0.0.0-20210215030244-1212288570f0/go.mod h1:rAPalJe9Lx3jHffJpackk5WjZYl3j2QvXUgw0GPllxQ= +knative.dev/caching v0.0.0-20210803185815-4e553d2275a0/go.mod h1:Vs+HND39+KKaIQp9M3m3Jmt4YtznpitDQ3n53gxbDYQ= knative.dev/caching v0.0.0-20220118175933-0c1cc094a7f4/go.mod h1:OHsK3XaWmdi2/mPaNBiX8LbefbtM6TptnT90eVbYGSA= knative.dev/client v0.21.0/go.mod h1:1En9uxMhk62EReWR1d66/d3tnpkot/D3vBRfmuidFNc= knative.dev/client v0.29.0/go.mod h1:VaTZlNkplns4UrscGPp4CwKcIVRcfC4Po1yRvfF4JiQ= knative.dev/control-protocol v0.0.0-20220118185434-ad4ce9e9d455/go.mod h1:xiTC5Qt9GdPuhRknr0Oq744SsUqbkDx0oe04L9a+qYY= knative.dev/eventing v0.21.0/go.mod h1:JjbVEOTJJHqo9CTxbTfrMn018hG8fOr3UfBoCJ7KWaA= +knative.dev/eventing v0.25.0/go.mod h1:8jIsrnSONPgv+m63OTzpwZQJiQASYl77C3llCyYlBMU= knative.dev/eventing v0.29.0/go.mod h1:u5T5NZTDUsLR7yJwp5MDnBnDX5MhywD3yK3Rq+7gTtI= -knative.dev/eventing v0.29.1 h1:RUqdDW4oD51oRCbdsuJGYfPmV5LPob0jY4HbhpYZvH0= knative.dev/eventing v0.29.1/go.mod h1:u5T5NZTDUsLR7yJwp5MDnBnDX5MhywD3yK3Rq+7gTtI= +knative.dev/eventing v0.29.2-0.20220420140829-ce4fe0990d23 h1:9DucdcOalX90T2QMhQjh4MLjXUEgqgsRxuK1o1Tt+44= +knative.dev/eventing v0.29.2-0.20220420140829-ce4fe0990d23/go.mod h1:u5T5NZTDUsLR7yJwp5MDnBnDX5MhywD3yK3Rq+7gTtI= knative.dev/eventing-kafka v0.29.0 h1:/1DvUeQ27WuvTIqt7WakYxv+SFhCHh8+KVEoIM1P1fw= knative.dev/eventing-kafka v0.29.0/go.mod h1:Y9+hHdaYCmD46PPOU2pAfWCUXJyIfgJOnkWZwsBAEoU= knative.dev/hack v0.0.0-20210203173706-8368e1f6eacf/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= -knative.dev/hack v0.0.0-20220118141833-9b2ed8471e30 h1:UkNpCWCMM5C4AeQ8aTrPTuR/6OeARiqk+LEQ6tuMP7c= +knative.dev/hack v0.0.0-20210622141627-e28525d8d260/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack v0.0.0-20211122162614-813559cefdda/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack v0.0.0-20211203062838-e11ac125e707/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= knative.dev/hack v0.0.0-20220118141833-9b2ed8471e30/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack v0.0.0-20220128200847-51a42b2eb63e h1:pW3LMToyFhAhbHQWQwUHLY57i7gjvyFwFC8Sg6oNkJ8= +knative.dev/hack v0.0.0-20220128200847-51a42b2eb63e/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack/schema v0.0.0-20210622141627-e28525d8d260/go.mod h1:ffjwmdcrH5vN3mPhO8RrF2KfNnbHeCE2C60A+2cv3U0= knative.dev/hack/schema v0.0.0-20220118141833-9b2ed8471e30/go.mod h1:ffjwmdcrH5vN3mPhO8RrF2KfNnbHeCE2C60A+2cv3U0= knative.dev/kn-plugin-source-kafka v0.29.0 h1:8X3GvV45wor568PGy3JWbOH478MkvBiYnZOKx78MFAg= knative.dev/kn-plugin-source-kafka v0.29.0/go.mod h1:5Ca8bEvuEP5Of2CCTK6+XgPELTMpKKFtK9Ms/MxG1tI= knative.dev/networking v0.0.0-20210215030235-088986a1c2a3/go.mod h1:pmAMQjMqQUxpK0UyjE71KljMs6rwDMVIAlvrZsU3I6Y= knative.dev/networking v0.0.0-20210216014426-94bfc013982b/go.mod h1:Crdn87hxdFd3Jj6PIyrjzGnr8OGHX35k5xo9jlOrjjA= -knative.dev/networking v0.0.0-20220120043934-ec785540a732 h1:fUUb5NWfYm8TQkhv1uFYlEn91YNKp+E4BD7ax7WYHW0= +knative.dev/networking v0.0.0-20210803181815-acdfd41c575c/go.mod h1:UA9m1M3rGssy63gVwjSh7CYoWTKZNO8cnY9QsIu7tyo= knative.dev/networking v0.0.0-20220120043934-ec785540a732/go.mod h1:6cKBV/h/vIQWCPOkds/RvzUmMR8Vz6Dks2NWb0+3xks= +knative.dev/networking v0.0.0-20220120045035-ec849677a316 h1:fHgHP3nnJSfq115RgTMYVHPQBsBKQYtjUVGhMT/VLaA= +knative.dev/networking v0.0.0-20220120045035-ec849677a316/go.mod h1:+ozCw7PVf//G9+HOW04hfWnU8UJE5fmWAQkb+ieMaXY= knative.dev/pkg v0.0.0-20210212203835-448ae657fb5f/go.mod h1:TJSdebQOWX5N2bszohOYVi0H1QtXbtlYLuMghAFBMhY= knative.dev/pkg v0.0.0-20210215165523-84c98f3c3e7a/go.mod h1:TJSdebQOWX5N2bszohOYVi0H1QtXbtlYLuMghAFBMhY= knative.dev/pkg v0.0.0-20210216013737-584933f8280b/go.mod h1:TJSdebQOWX5N2bszohOYVi0H1QtXbtlYLuMghAFBMhY= +knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5/go.mod h1:RPk5txNA3apR9X40D4MpUOP9/VqOG8CrtABWfOwGVS4= +knative.dev/pkg v0.0.0-20211206113427-18589ac7627e/go.mod h1:E6B4RTjZyxe55a0kxOlnEHEl71zuG7gghnqYvNBKwBw= +knative.dev/pkg v0.0.0-20211215065729-552319d4f55b/go.mod h1:hrD91/shO1o4KMZa4oWhnbRPmVJhvq86TLy/STF/qf8= +knative.dev/pkg v0.0.0-20220104185830-52e42b760b54/go.mod h1:189cvGP0mwpqwZGFrLk5WuERIsNI/J6HuQ1CIX7SXxY= knative.dev/pkg v0.0.0-20220118160532-77555ea48cd4/go.mod h1:etVT7Tm8pSDf4RKhGk4r7j/hj3dNBpvT7bO6a6wpahs= +knative.dev/pkg v0.0.0-20220131144930-f4b57aef0006/go.mod h1:bZMFTPDPHV3wXuiQ09UJuEGYYQnfpe81MCxNvsMAiJk= knative.dev/pkg v0.0.0-20220222214439-083dd97300e1 h1:p6MI/Rs9AZC5+qRvqX48njRjmFBYi4Y80q23efgJ+38= knative.dev/pkg v0.0.0-20220222214439-083dd97300e1/go.mod h1:etVT7Tm8pSDf4RKhGk4r7j/hj3dNBpvT7bO6a6wpahs= knative.dev/reconciler-test v0.0.0-20210216030508-77f50054d024/go.mod h1:RP/K5xJylB72Go6eAsXYEsQHp4zCCNMNjmsqhvq7wko= +knative.dev/reconciler-test v0.0.0-20210803183715-b61cc77c06f6/go.mod h1:+Kovy+G5zXZNcuO/uB+zfo37vFKZzsLIlWezt/nKMz0= knative.dev/reconciler-test v0.0.0-20220118183433-c8bfbe66bada/go.mod h1:XV4cghzCtdASkfUsfMYSnGfGRyd/naDjy9h7Tnae22g= knative.dev/serving v0.21.0/go.mod h1:PU9k1Y6YMG27XQldEu5agNkcebvSafUXKXPircQYCsE= +knative.dev/serving v0.25.0/go.mod h1:24E4fVyViFnz8aAaafzdrYKB7CAsQr4FMU7QXoIE6CI= knative.dev/serving v0.29.0/go.mod h1:8Ay9QjyTcqoJE+2PietSmT5/VMdSQHe5aIBhsAFOCjM= -knative.dev/serving v0.29.3 h1:2TYzL6dSxys2WvZPzgWbNOkhhr0vdAKwdOV/Jtifb8A= knative.dev/serving v0.29.3/go.mod h1:NEccCc0yUf5K56f50FWpGDZOQa28ngW+Os9r4sz/PY0= +knative.dev/serving v0.29.5 h1:+NUjm2Npo43hWlQTkGsG89johEzIf9aiMKUsKfidzjA= +knative.dev/serving v0.29.5/go.mod h1:00SLmEVPRwqtDPu4dXn2L8BVyvILurecO1z/v6oDAg0= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= @@ -2574,7 +3969,11 @@ modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= @@ -2583,20 +3982,30 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQb sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/kind v0.11.1/go.mod h1:fRpgVhtqAWrtLB9ED7zQahUimpUXuG/iHT88xYqEGIA= sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/kustomize/api v0.8.8/go.mod h1:He1zoK0nk43Pc6NlV085xDXDXTNprtcyKZVm3swsdNY= sigs.k8s.io/kustomize/api v0.8.11 h1:LzQzlq6Z023b+mBtc6v72N2mSHYmN8x7ssgbf/hv0H8= sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= +sigs.k8s.io/kustomize/kyaml v0.10.17/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= sigs.k8s.io/kustomize/kyaml v0.11.0 h1:9KhiCPKaVyuPcgOLJXkvytOvjMJLoxpjodiycb4gHsA= sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/openshift/release/kn.yaml b/openshift/release/kn.yaml index b8fc042795..a755cc1478 100644 --- a/openshift/release/kn.yaml +++ b/openshift/release/kn.yaml @@ -3,10 +3,10 @@ plugins: module: knative.dev/kn-plugin-source-kafka pluginImportPath: knative.dev/kn-plugin-source-kafka/plugin version: knative-v1.2.0 - # - name: kn-plugin-func - # module: knative.dev/kn-plugin-func - # pluginImportPath: knative.dev/kn-plugin-func - # version: v0.24.0 + - name: kn-plugin-func + module: knative.dev/kn-plugin-func + pluginImportPath: knative.dev/kn-plugin-func + version: v0.24.0 - name: kn-plugin-event module: knative.dev/kn-plugin-event pluginImportPath: knative.dev/kn-plugin-event/pkg/plugin diff --git a/pkg/kn/root/plugin_register.go b/pkg/kn/root/plugin_register.go index e7956794b3..f490ce2530 100644 --- a/pkg/kn/root/plugin_register.go +++ b/pkg/kn/root/plugin_register.go @@ -19,6 +19,7 @@ package root import ( // Add #plugins# import here. Don't remove this line, it triggers an automatic replacement. _ "knative.dev/kn-plugin-event/pkg/plugin" + _ "knative.dev/kn-plugin-func" _ "knative.dev/kn-plugin-source-kafka/plugin" ) diff --git a/third_party/VENDOR-LICENSE/github.com/ProtonMail/go-crypto/LICENSE b/third_party/VENDOR-LICENSE/github.com/ProtonMail/go-crypto/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/ProtonMail/go-crypto/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/third_party/VENDOR-LICENSE/github.com/coreos/go-semver/semver/LICENSE b/third_party/VENDOR-LICENSE/github.com/coreos/go-semver/semver/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/coreos/go-semver/semver/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/third_party/VENDOR-LICENSE/github.com/coreos/go-semver/semver/NOTICE b/third_party/VENDOR-LICENSE/github.com/coreos/go-semver/semver/NOTICE new file mode 100644 index 0000000000..23a0ada2fb --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/coreos/go-semver/semver/NOTICE @@ -0,0 +1,5 @@ +CoreOS Project +Copyright 2018 CoreOS, Inc + +This product includes software developed at CoreOS, Inc. +(http://www.coreos.com/). diff --git a/third_party/VENDOR-LICENSE/github.com/emirpasic/gods/LICENSE b/third_party/VENDOR-LICENSE/github.com/emirpasic/gods/LICENSE new file mode 100644 index 0000000000..e5e449b6ec --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/emirpasic/gods/LICENSE @@ -0,0 +1,41 @@ +Copyright (c) 2015, Emir Pasic +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- + +AVL Tree: + +Copyright (c) 2017 Benjamin Scher Purcell + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/third_party/VENDOR-LICENSE/github.com/go-git/gcfg/LICENSE b/third_party/VENDOR-LICENSE/github.com/go-git/gcfg/LICENSE new file mode 100644 index 0000000000..87a5cede33 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/go-git/gcfg/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go +Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/third_party/VENDOR-LICENSE/github.com/go-git/go-billy/v5/LICENSE b/third_party/VENDOR-LICENSE/github.com/go-git/go-billy/v5/LICENSE new file mode 100644 index 0000000000..9d60756894 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/go-git/go-billy/v5/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Sourced Technologies S.L. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/third_party/VENDOR-LICENSE/github.com/go-git/go-git/v5/LICENSE b/third_party/VENDOR-LICENSE/github.com/go-git/go-git/v5/LICENSE new file mode 100644 index 0000000000..8aa3d854cf --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/go-git/go-git/v5/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Sourced Technologies, S.L. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/third_party/VENDOR-LICENSE/github.com/jbenet/go-context/io/LICENSE b/third_party/VENDOR-LICENSE/github.com/jbenet/go-context/io/LICENSE new file mode 100644 index 0000000000..c7386b3c94 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/jbenet/go-context/io/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Juan Batiz-Benet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/third_party/VENDOR-LICENSE/github.com/kevinburke/ssh_config/LICENSE b/third_party/VENDOR-LICENSE/github.com/kevinburke/ssh_config/LICENSE new file mode 100644 index 0000000000..b9a770ac2a --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/kevinburke/ssh_config/LICENSE @@ -0,0 +1,49 @@ +Copyright (c) 2017 Kevin Burke. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +=================== + +The lexer and parser borrow heavily from github.com/pelletier/go-toml. The +license for that project is copied below. + +The MIT License (MIT) + +Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/VENDOR-LICENSE/github.com/sergi/go-diff/diffmatchpatch/LICENSE b/third_party/VENDOR-LICENSE/github.com/sergi/go-diff/diffmatchpatch/LICENSE new file mode 100644 index 0000000000..937942c2b2 --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/sergi/go-diff/diffmatchpatch/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-2016 The go-diff Authors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + diff --git a/third_party/VENDOR-LICENSE/github.com/whilp/git-urls/LICENSE b/third_party/VENDOR-LICENSE/github.com/whilp/git-urls/LICENSE new file mode 100644 index 0000000000..2aa848db5f --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/whilp/git-urls/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Will Maier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/VENDOR-LICENSE/github.com/xanzy/ssh-agent/LICENSE b/third_party/VENDOR-LICENSE/github.com/xanzy/ssh-agent/LICENSE new file mode 100644 index 0000000000..8f71f43fee --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/xanzy/ssh-agent/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/third_party/VENDOR-LICENSE/go.uber.org/multierr/LICENSE.txt b/third_party/VENDOR-LICENSE/go.uber.org/multierr/LICENSE.txt index 858e02475f..413e30f7ce 100644 --- a/third_party/VENDOR-LICENSE/go.uber.org/multierr/LICENSE.txt +++ b/third_party/VENDOR-LICENSE/go.uber.org/multierr/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2017 Uber Technologies, Inc. +Copyright (c) 2017-2021 Uber Technologies, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/third_party/VENDOR-LICENSE/gopkg.in/warnings.v0/LICENSE b/third_party/VENDOR-LICENSE/gopkg.in/warnings.v0/LICENSE new file mode 100644 index 0000000000..d65f7e9d8c --- /dev/null +++ b/third_party/VENDOR-LICENSE/gopkg.in/warnings.v0/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2016 Péter Surányi. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/third_party/VENDOR-LICENSE/knative.dev/kn-plugin-func/LICENSE b/third_party/VENDOR-LICENSE/knative.dev/kn-plugin-func/LICENSE new file mode 100644 index 0000000000..57bc88a15a --- /dev/null +++ b/third_party/VENDOR-LICENSE/knative.dev/kn-plugin-func/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/vendor/github.com/Microsoft/go-winio/.gitignore b/vendor/github.com/Microsoft/go-winio/.gitignore new file mode 100644 index 0000000000..b883f1fdc6 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/.gitignore @@ -0,0 +1 @@ +*.exe diff --git a/vendor/github.com/Microsoft/go-winio/CODEOWNERS b/vendor/github.com/Microsoft/go-winio/CODEOWNERS new file mode 100644 index 0000000000..ae1b4942b9 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/CODEOWNERS @@ -0,0 +1 @@ + * @microsoft/containerplat diff --git a/vendor/github.com/Microsoft/go-winio/LICENSE b/vendor/github.com/Microsoft/go-winio/LICENSE new file mode 100644 index 0000000000..b8b569d774 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/github.com/Microsoft/go-winio/README.md b/vendor/github.com/Microsoft/go-winio/README.md new file mode 100644 index 0000000000..683be1dcf9 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/README.md @@ -0,0 +1,37 @@ +# go-winio [![Build Status](https://github.com/microsoft/go-winio/actions/workflows/ci.yml/badge.svg)](https://github.com/microsoft/go-winio/actions/workflows/ci.yml) + +This repository contains utilities for efficiently performing Win32 IO operations in +Go. Currently, this is focused on accessing named pipes and other file handles, and +for using named pipes as a net transport. + +This code relies on IO completion ports to avoid blocking IO on system threads, allowing Go +to reuse the thread to schedule another goroutine. This limits support to Windows Vista and +newer operating systems. This is similar to the implementation of network sockets in Go's net +package. + +Please see the LICENSE file for licensing information. + +## Contributing + +This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) +declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR +appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. + +We also require that contributors sign their commits using git commit -s or git commit --signoff to certify they either authored the work themselves +or otherwise have permission to use it in this project. Please see https://developercertificate.org/ for more info, as well as to make sure that you can +attest to the rules listed. Our CI uses the DCO Github app to ensure that all commits in a given PR are signed-off. + + +## Code of Conduct + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + + + +## Special Thanks +Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe +for another named pipe implementation. diff --git a/vendor/github.com/Microsoft/go-winio/backup.go b/vendor/github.com/Microsoft/go-winio/backup.go new file mode 100644 index 0000000000..2be34af431 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/backup.go @@ -0,0 +1,280 @@ +// +build windows + +package winio + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "runtime" + "syscall" + "unicode/utf16" +) + +//sys backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead +//sys backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupWrite + +const ( + BackupData = uint32(iota + 1) + BackupEaData + BackupSecurity + BackupAlternateData + BackupLink + BackupPropertyData + BackupObjectId + BackupReparseData + BackupSparseBlock + BackupTxfsData +) + +const ( + StreamSparseAttributes = uint32(8) +) + +const ( + WRITE_DAC = 0x40000 + WRITE_OWNER = 0x80000 + ACCESS_SYSTEM_SECURITY = 0x1000000 +) + +// BackupHeader represents a backup stream of a file. +type BackupHeader struct { + Id uint32 // The backup stream ID + Attributes uint32 // Stream attributes + Size int64 // The size of the stream in bytes + Name string // The name of the stream (for BackupAlternateData only). + Offset int64 // The offset of the stream in the file (for BackupSparseBlock only). +} + +type win32StreamId struct { + StreamId uint32 + Attributes uint32 + Size uint64 + NameSize uint32 +} + +// BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series +// of BackupHeader values. +type BackupStreamReader struct { + r io.Reader + bytesLeft int64 +} + +// NewBackupStreamReader produces a BackupStreamReader from any io.Reader. +func NewBackupStreamReader(r io.Reader) *BackupStreamReader { + return &BackupStreamReader{r, 0} +} + +// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if +// it was not completely read. +func (r *BackupStreamReader) Next() (*BackupHeader, error) { + if r.bytesLeft > 0 { + if s, ok := r.r.(io.Seeker); ok { + // Make sure Seek on io.SeekCurrent sometimes succeeds + // before trying the actual seek. + if _, err := s.Seek(0, io.SeekCurrent); err == nil { + if _, err = s.Seek(r.bytesLeft, io.SeekCurrent); err != nil { + return nil, err + } + r.bytesLeft = 0 + } + } + if _, err := io.Copy(ioutil.Discard, r); err != nil { + return nil, err + } + } + var wsi win32StreamId + if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil { + return nil, err + } + hdr := &BackupHeader{ + Id: wsi.StreamId, + Attributes: wsi.Attributes, + Size: int64(wsi.Size), + } + if wsi.NameSize != 0 { + name := make([]uint16, int(wsi.NameSize/2)) + if err := binary.Read(r.r, binary.LittleEndian, name); err != nil { + return nil, err + } + hdr.Name = syscall.UTF16ToString(name) + } + if wsi.StreamId == BackupSparseBlock { + if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil { + return nil, err + } + hdr.Size -= 8 + } + r.bytesLeft = hdr.Size + return hdr, nil +} + +// Read reads from the current backup stream. +func (r *BackupStreamReader) Read(b []byte) (int, error) { + if r.bytesLeft == 0 { + return 0, io.EOF + } + if int64(len(b)) > r.bytesLeft { + b = b[:r.bytesLeft] + } + n, err := r.r.Read(b) + r.bytesLeft -= int64(n) + if err == io.EOF { + err = io.ErrUnexpectedEOF + } else if r.bytesLeft == 0 && err == nil { + err = io.EOF + } + return n, err +} + +// BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API. +type BackupStreamWriter struct { + w io.Writer + bytesLeft int64 +} + +// NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer. +func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter { + return &BackupStreamWriter{w, 0} +} + +// WriteHeader writes the next backup stream header and prepares for calls to Write(). +func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error { + if w.bytesLeft != 0 { + return fmt.Errorf("missing %d bytes", w.bytesLeft) + } + name := utf16.Encode([]rune(hdr.Name)) + wsi := win32StreamId{ + StreamId: hdr.Id, + Attributes: hdr.Attributes, + Size: uint64(hdr.Size), + NameSize: uint32(len(name) * 2), + } + if hdr.Id == BackupSparseBlock { + // Include space for the int64 block offset + wsi.Size += 8 + } + if err := binary.Write(w.w, binary.LittleEndian, &wsi); err != nil { + return err + } + if len(name) != 0 { + if err := binary.Write(w.w, binary.LittleEndian, name); err != nil { + return err + } + } + if hdr.Id == BackupSparseBlock { + if err := binary.Write(w.w, binary.LittleEndian, hdr.Offset); err != nil { + return err + } + } + w.bytesLeft = hdr.Size + return nil +} + +// Write writes to the current backup stream. +func (w *BackupStreamWriter) Write(b []byte) (int, error) { + if w.bytesLeft < int64(len(b)) { + return 0, fmt.Errorf("too many bytes by %d", int64(len(b))-w.bytesLeft) + } + n, err := w.w.Write(b) + w.bytesLeft -= int64(n) + return n, err +} + +// BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API. +type BackupFileReader struct { + f *os.File + includeSecurity bool + ctx uintptr +} + +// NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true, +// Read will attempt to read the security descriptor of the file. +func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader { + r := &BackupFileReader{f, includeSecurity, 0} + return r +} + +// Read reads a backup stream from the file by calling the Win32 API BackupRead(). +func (r *BackupFileReader) Read(b []byte) (int, error) { + var bytesRead uint32 + err := backupRead(syscall.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx) + if err != nil { + return 0, &os.PathError{"BackupRead", r.f.Name(), err} + } + runtime.KeepAlive(r.f) + if bytesRead == 0 { + return 0, io.EOF + } + return int(bytesRead), nil +} + +// Close frees Win32 resources associated with the BackupFileReader. It does not close +// the underlying file. +func (r *BackupFileReader) Close() error { + if r.ctx != 0 { + backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx) + runtime.KeepAlive(r.f) + r.ctx = 0 + } + return nil +} + +// BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API. +type BackupFileWriter struct { + f *os.File + includeSecurity bool + ctx uintptr +} + +// NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true, +// Write() will attempt to restore the security descriptor from the stream. +func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter { + w := &BackupFileWriter{f, includeSecurity, 0} + return w +} + +// Write restores a portion of the file using the provided backup stream. +func (w *BackupFileWriter) Write(b []byte) (int, error) { + var bytesWritten uint32 + err := backupWrite(syscall.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx) + if err != nil { + return 0, &os.PathError{"BackupWrite", w.f.Name(), err} + } + runtime.KeepAlive(w.f) + if int(bytesWritten) != len(b) { + return int(bytesWritten), errors.New("not all bytes could be written") + } + return len(b), nil +} + +// Close frees Win32 resources associated with the BackupFileWriter. It does not +// close the underlying file. +func (w *BackupFileWriter) Close() error { + if w.ctx != 0 { + backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx) + runtime.KeepAlive(w.f) + w.ctx = 0 + } + return nil +} + +// OpenForBackup opens a file or directory, potentially skipping access checks if the backup +// or restore privileges have been acquired. +// +// If the file opened was a directory, it cannot be used with Readdir(). +func OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error) { + winPath, err := syscall.UTF16FromString(path) + if err != nil { + return nil, err + } + h, err := syscall.CreateFile(&winPath[0], access, share, nil, createmode, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0) + if err != nil { + err = &os.PathError{Op: "open", Path: path, Err: err} + return nil, err + } + return os.NewFile(uintptr(h), path), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/ea.go b/vendor/github.com/Microsoft/go-winio/ea.go new file mode 100644 index 0000000000..4051c1b33b --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/ea.go @@ -0,0 +1,137 @@ +package winio + +import ( + "bytes" + "encoding/binary" + "errors" +) + +type fileFullEaInformation struct { + NextEntryOffset uint32 + Flags uint8 + NameLength uint8 + ValueLength uint16 +} + +var ( + fileFullEaInformationSize = binary.Size(&fileFullEaInformation{}) + + errInvalidEaBuffer = errors.New("invalid extended attribute buffer") + errEaNameTooLarge = errors.New("extended attribute name too large") + errEaValueTooLarge = errors.New("extended attribute value too large") +) + +// ExtendedAttribute represents a single Windows EA. +type ExtendedAttribute struct { + Name string + Value []byte + Flags uint8 +} + +func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) { + var info fileFullEaInformation + err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info) + if err != nil { + err = errInvalidEaBuffer + return + } + + nameOffset := fileFullEaInformationSize + nameLen := int(info.NameLength) + valueOffset := nameOffset + int(info.NameLength) + 1 + valueLen := int(info.ValueLength) + nextOffset := int(info.NextEntryOffset) + if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) { + err = errInvalidEaBuffer + return + } + + ea.Name = string(b[nameOffset : nameOffset+nameLen]) + ea.Value = b[valueOffset : valueOffset+valueLen] + ea.Flags = info.Flags + if info.NextEntryOffset != 0 { + nb = b[info.NextEntryOffset:] + } + return +} + +// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION +// buffer retrieved from BackupRead, ZwQueryEaFile, etc. +func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) { + for len(b) != 0 { + ea, nb, err := parseEa(b) + if err != nil { + return nil, err + } + + eas = append(eas, ea) + b = nb + } + return +} + +func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error { + if int(uint8(len(ea.Name))) != len(ea.Name) { + return errEaNameTooLarge + } + if int(uint16(len(ea.Value))) != len(ea.Value) { + return errEaValueTooLarge + } + entrySize := uint32(fileFullEaInformationSize + len(ea.Name) + 1 + len(ea.Value)) + withPadding := (entrySize + 3) &^ 3 + nextOffset := uint32(0) + if !last { + nextOffset = withPadding + } + info := fileFullEaInformation{ + NextEntryOffset: nextOffset, + Flags: ea.Flags, + NameLength: uint8(len(ea.Name)), + ValueLength: uint16(len(ea.Value)), + } + + err := binary.Write(buf, binary.LittleEndian, &info) + if err != nil { + return err + } + + _, err = buf.Write([]byte(ea.Name)) + if err != nil { + return err + } + + err = buf.WriteByte(0) + if err != nil { + return err + } + + _, err = buf.Write(ea.Value) + if err != nil { + return err + } + + _, err = buf.Write([]byte{0, 0, 0}[0 : withPadding-entrySize]) + if err != nil { + return err + } + + return nil +} + +// EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION +// buffer for use with BackupWrite, ZwSetEaFile, etc. +func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) { + var buf bytes.Buffer + for i := range eas { + last := false + if i == len(eas)-1 { + last = true + } + + err := writeEa(&buf, &eas[i], last) + if err != nil { + return nil, err + } + } + return buf.Bytes(), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/file.go b/vendor/github.com/Microsoft/go-winio/file.go new file mode 100644 index 0000000000..293ab54c80 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/file.go @@ -0,0 +1,329 @@ +//go:build windows +// +build windows + +package winio + +import ( + "errors" + "io" + "runtime" + "sync" + "sync/atomic" + "syscall" + "time" +) + +//sys cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) = CancelIoEx +//sys createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) = CreateIoCompletionPort +//sys getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus +//sys setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes +//sys wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult + +type atomicBool int32 + +func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 } +func (b *atomicBool) setFalse() { atomic.StoreInt32((*int32)(b), 0) } +func (b *atomicBool) setTrue() { atomic.StoreInt32((*int32)(b), 1) } +func (b *atomicBool) swap(new bool) bool { + var newInt int32 + if new { + newInt = 1 + } + return atomic.SwapInt32((*int32)(b), newInt) == 1 +} + +const ( + cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 + cFILE_SKIP_SET_EVENT_ON_HANDLE = 2 +) + +var ( + ErrFileClosed = errors.New("file has already been closed") + ErrTimeout = &timeoutError{} +) + +type timeoutError struct{} + +func (e *timeoutError) Error() string { return "i/o timeout" } +func (e *timeoutError) Timeout() bool { return true } +func (e *timeoutError) Temporary() bool { return true } + +type timeoutChan chan struct{} + +var ioInitOnce sync.Once +var ioCompletionPort syscall.Handle + +// ioResult contains the result of an asynchronous IO operation +type ioResult struct { + bytes uint32 + err error +} + +// ioOperation represents an outstanding asynchronous Win32 IO +type ioOperation struct { + o syscall.Overlapped + ch chan ioResult +} + +func initIo() { + h, err := createIoCompletionPort(syscall.InvalidHandle, 0, 0, 0xffffffff) + if err != nil { + panic(err) + } + ioCompletionPort = h + go ioCompletionProcessor(h) +} + +// win32File implements Reader, Writer, and Closer on a Win32 handle without blocking in a syscall. +// It takes ownership of this handle and will close it if it is garbage collected. +type win32File struct { + handle syscall.Handle + wg sync.WaitGroup + wgLock sync.RWMutex + closing atomicBool + socket bool + readDeadline deadlineHandler + writeDeadline deadlineHandler +} + +type deadlineHandler struct { + setLock sync.Mutex + channel timeoutChan + channelLock sync.RWMutex + timer *time.Timer + timedout atomicBool +} + +// makeWin32File makes a new win32File from an existing file handle +func makeWin32File(h syscall.Handle) (*win32File, error) { + f := &win32File{handle: h} + ioInitOnce.Do(initIo) + _, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff) + if err != nil { + return nil, err + } + err = setFileCompletionNotificationModes(h, cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS|cFILE_SKIP_SET_EVENT_ON_HANDLE) + if err != nil { + return nil, err + } + f.readDeadline.channel = make(timeoutChan) + f.writeDeadline.channel = make(timeoutChan) + return f, nil +} + +func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) { + // If we return the result of makeWin32File directly, it can result in an + // interface-wrapped nil, rather than a nil interface value. + f, err := makeWin32File(h) + if err != nil { + return nil, err + } + return f, nil +} + +// closeHandle closes the resources associated with a Win32 handle +func (f *win32File) closeHandle() { + f.wgLock.Lock() + // Atomically set that we are closing, releasing the resources only once. + if !f.closing.swap(true) { + f.wgLock.Unlock() + // cancel all IO and wait for it to complete + cancelIoEx(f.handle, nil) + f.wg.Wait() + // at this point, no new IO can start + syscall.Close(f.handle) + f.handle = 0 + } else { + f.wgLock.Unlock() + } +} + +// Close closes a win32File. +func (f *win32File) Close() error { + f.closeHandle() + return nil +} + +// IsClosed checks if the file has been closed +func (f *win32File) IsClosed() bool { + return f.closing.isSet() +} + +// prepareIo prepares for a new IO operation. +// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning. +func (f *win32File) prepareIo() (*ioOperation, error) { + f.wgLock.RLock() + if f.closing.isSet() { + f.wgLock.RUnlock() + return nil, ErrFileClosed + } + f.wg.Add(1) + f.wgLock.RUnlock() + c := &ioOperation{} + c.ch = make(chan ioResult) + return c, nil +} + +// ioCompletionProcessor processes completed async IOs forever +func ioCompletionProcessor(h syscall.Handle) { + for { + var bytes uint32 + var key uintptr + var op *ioOperation + err := getQueuedCompletionStatus(h, &bytes, &key, &op, syscall.INFINITE) + if op == nil { + panic(err) + } + op.ch <- ioResult{bytes, err} + } +} + +// asyncIo processes the return value from ReadFile or WriteFile, blocking until +// the operation has actually completed. +func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) { + if err != syscall.ERROR_IO_PENDING { + return int(bytes), err + } + + if f.closing.isSet() { + cancelIoEx(f.handle, &c.o) + } + + var timeout timeoutChan + if d != nil { + d.channelLock.Lock() + timeout = d.channel + d.channelLock.Unlock() + } + + var r ioResult + select { + case r = <-c.ch: + err = r.err + if err == syscall.ERROR_OPERATION_ABORTED { + if f.closing.isSet() { + err = ErrFileClosed + } + } else if err != nil && f.socket { + // err is from Win32. Query the overlapped structure to get the winsock error. + var bytes, flags uint32 + err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags) + } + case <-timeout: + cancelIoEx(f.handle, &c.o) + r = <-c.ch + err = r.err + if err == syscall.ERROR_OPERATION_ABORTED { + err = ErrTimeout + } + } + + // runtime.KeepAlive is needed, as c is passed via native + // code to ioCompletionProcessor, c must remain alive + // until the channel read is complete. + runtime.KeepAlive(c) + return int(r.bytes), err +} + +// Read reads from a file handle. +func (f *win32File) Read(b []byte) (int, error) { + c, err := f.prepareIo() + if err != nil { + return 0, err + } + defer f.wg.Done() + + if f.readDeadline.timedout.isSet() { + return 0, ErrTimeout + } + + var bytes uint32 + err = syscall.ReadFile(f.handle, b, &bytes, &c.o) + n, err := f.asyncIo(c, &f.readDeadline, bytes, err) + runtime.KeepAlive(b) + + // Handle EOF conditions. + if err == nil && n == 0 && len(b) != 0 { + return 0, io.EOF + } else if err == syscall.ERROR_BROKEN_PIPE { + return 0, io.EOF + } else { + return n, err + } +} + +// Write writes to a file handle. +func (f *win32File) Write(b []byte) (int, error) { + c, err := f.prepareIo() + if err != nil { + return 0, err + } + defer f.wg.Done() + + if f.writeDeadline.timedout.isSet() { + return 0, ErrTimeout + } + + var bytes uint32 + err = syscall.WriteFile(f.handle, b, &bytes, &c.o) + n, err := f.asyncIo(c, &f.writeDeadline, bytes, err) + runtime.KeepAlive(b) + return n, err +} + +func (f *win32File) SetReadDeadline(deadline time.Time) error { + return f.readDeadline.set(deadline) +} + +func (f *win32File) SetWriteDeadline(deadline time.Time) error { + return f.writeDeadline.set(deadline) +} + +func (f *win32File) Flush() error { + return syscall.FlushFileBuffers(f.handle) +} + +func (f *win32File) Fd() uintptr { + return uintptr(f.handle) +} + +func (d *deadlineHandler) set(deadline time.Time) error { + d.setLock.Lock() + defer d.setLock.Unlock() + + if d.timer != nil { + if !d.timer.Stop() { + <-d.channel + } + d.timer = nil + } + d.timedout.setFalse() + + select { + case <-d.channel: + d.channelLock.Lock() + d.channel = make(chan struct{}) + d.channelLock.Unlock() + default: + } + + if deadline.IsZero() { + return nil + } + + timeoutIO := func() { + d.timedout.setTrue() + close(d.channel) + } + + now := time.Now() + duration := deadline.Sub(now) + if deadline.After(now) { + // Deadline is in the future, set a timer to wait + d.timer = time.AfterFunc(duration, timeoutIO) + } else { + // Deadline is in the past. Cancel all pending IO now. + timeoutIO() + } + return nil +} diff --git a/vendor/github.com/Microsoft/go-winio/fileinfo.go b/vendor/github.com/Microsoft/go-winio/fileinfo.go new file mode 100644 index 0000000000..3ab6bff69c --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/fileinfo.go @@ -0,0 +1,73 @@ +// +build windows + +package winio + +import ( + "os" + "runtime" + "unsafe" + + "golang.org/x/sys/windows" +) + +// FileBasicInfo contains file access time and file attributes information. +type FileBasicInfo struct { + CreationTime, LastAccessTime, LastWriteTime, ChangeTime windows.Filetime + FileAttributes uint32 + pad uint32 // padding +} + +// GetFileBasicInfo retrieves times and attributes for a file. +func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) { + bi := &FileBasicInfo{} + if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { + return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return bi, nil +} + +// SetFileBasicInfo sets times and attributes for a file. +func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error { + if err := windows.SetFileInformationByHandle(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { + return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return nil +} + +// FileStandardInfo contains extended information for the file. +// FILE_STANDARD_INFO in WinBase.h +// https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_standard_info +type FileStandardInfo struct { + AllocationSize, EndOfFile int64 + NumberOfLinks uint32 + DeletePending, Directory bool +} + +// GetFileStandardInfo retrieves ended information for the file. +func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) { + si := &FileStandardInfo{} + if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileStandardInfo, (*byte)(unsafe.Pointer(si)), uint32(unsafe.Sizeof(*si))); err != nil { + return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return si, nil +} + +// FileIDInfo contains the volume serial number and file ID for a file. This pair should be +// unique on a system. +type FileIDInfo struct { + VolumeSerialNumber uint64 + FileID [16]byte +} + +// GetFileID retrieves the unique (volume, file ID) pair for a file. +func GetFileID(f *os.File) (*FileIDInfo, error) { + fileID := &FileIDInfo{} + if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileIdInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil { + return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return fileID, nil +} diff --git a/vendor/github.com/Microsoft/go-winio/go.mod b/vendor/github.com/Microsoft/go-winio/go.mod new file mode 100644 index 0000000000..f39a608da3 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/go.mod @@ -0,0 +1,8 @@ +module github.com/Microsoft/go-winio + +go 1.13 + +require ( + github.com/sirupsen/logrus v1.7.0 + golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c +) diff --git a/vendor/github.com/Microsoft/go-winio/go.sum b/vendor/github.com/Microsoft/go-winio/go.sum new file mode 100644 index 0000000000..9bdcd9cfd9 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/Microsoft/go-winio/hvsock.go b/vendor/github.com/Microsoft/go-winio/hvsock.go new file mode 100644 index 0000000000..b2b644d002 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/hvsock.go @@ -0,0 +1,316 @@ +//go:build windows +// +build windows + +package winio + +import ( + "fmt" + "io" + "net" + "os" + "syscall" + "time" + "unsafe" + + "github.com/Microsoft/go-winio/pkg/guid" +) + +//sys bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind + +const ( + afHvSock = 34 // AF_HYPERV + + socketError = ^uintptr(0) +) + +// An HvsockAddr is an address for a AF_HYPERV socket. +type HvsockAddr struct { + VMID guid.GUID + ServiceID guid.GUID +} + +type rawHvsockAddr struct { + Family uint16 + _ uint16 + VMID guid.GUID + ServiceID guid.GUID +} + +// Network returns the address's network name, "hvsock". +func (addr *HvsockAddr) Network() string { + return "hvsock" +} + +func (addr *HvsockAddr) String() string { + return fmt.Sprintf("%s:%s", &addr.VMID, &addr.ServiceID) +} + +// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port. +func VsockServiceID(port uint32) guid.GUID { + g, _ := guid.FromString("00000000-facb-11e6-bd58-64006a7986d3") + g.Data1 = port + return g +} + +func (addr *HvsockAddr) raw() rawHvsockAddr { + return rawHvsockAddr{ + Family: afHvSock, + VMID: addr.VMID, + ServiceID: addr.ServiceID, + } +} + +func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) { + addr.VMID = raw.VMID + addr.ServiceID = raw.ServiceID +} + +// HvsockListener is a socket listener for the AF_HYPERV address family. +type HvsockListener struct { + sock *win32File + addr HvsockAddr +} + +// HvsockConn is a connected socket of the AF_HYPERV address family. +type HvsockConn struct { + sock *win32File + local, remote HvsockAddr +} + +func newHvSocket() (*win32File, error) { + fd, err := syscall.Socket(afHvSock, syscall.SOCK_STREAM, 1) + if err != nil { + return nil, os.NewSyscallError("socket", err) + } + f, err := makeWin32File(fd) + if err != nil { + syscall.Close(fd) + return nil, err + } + f.socket = true + return f, nil +} + +// ListenHvsock listens for connections on the specified hvsock address. +func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) { + l := &HvsockListener{addr: *addr} + sock, err := newHvSocket() + if err != nil { + return nil, l.opErr("listen", err) + } + sa := addr.raw() + err = bind(sock.handle, unsafe.Pointer(&sa), int32(unsafe.Sizeof(sa))) + if err != nil { + return nil, l.opErr("listen", os.NewSyscallError("socket", err)) + } + err = syscall.Listen(sock.handle, 16) + if err != nil { + return nil, l.opErr("listen", os.NewSyscallError("listen", err)) + } + return &HvsockListener{sock: sock, addr: *addr}, nil +} + +func (l *HvsockListener) opErr(op string, err error) error { + return &net.OpError{Op: op, Net: "hvsock", Addr: &l.addr, Err: err} +} + +// Addr returns the listener's network address. +func (l *HvsockListener) Addr() net.Addr { + return &l.addr +} + +// Accept waits for the next connection and returns it. +func (l *HvsockListener) Accept() (_ net.Conn, err error) { + sock, err := newHvSocket() + if err != nil { + return nil, l.opErr("accept", err) + } + defer func() { + if sock != nil { + sock.Close() + } + }() + c, err := l.sock.prepareIo() + if err != nil { + return nil, l.opErr("accept", err) + } + defer l.sock.wg.Done() + + // AcceptEx, per documentation, requires an extra 16 bytes per address. + const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{})) + var addrbuf [addrlen * 2]byte + + var bytes uint32 + err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0, addrlen, addrlen, &bytes, &c.o) + _, err = l.sock.asyncIo(c, nil, bytes, err) + if err != nil { + return nil, l.opErr("accept", os.NewSyscallError("acceptex", err)) + } + conn := &HvsockConn{ + sock: sock, + } + conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0]))) + conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen]))) + sock = nil + return conn, nil +} + +// Close closes the listener, causing any pending Accept calls to fail. +func (l *HvsockListener) Close() error { + return l.sock.Close() +} + +/* Need to finish ConnectEx handling +func DialHvsock(ctx context.Context, addr *HvsockAddr) (*HvsockConn, error) { + sock, err := newHvSocket() + if err != nil { + return nil, err + } + defer func() { + if sock != nil { + sock.Close() + } + }() + c, err := sock.prepareIo() + if err != nil { + return nil, err + } + defer sock.wg.Done() + var bytes uint32 + err = windows.ConnectEx(windows.Handle(sock.handle), sa, nil, 0, &bytes, &c.o) + _, err = sock.asyncIo(ctx, c, nil, bytes, err) + if err != nil { + return nil, err + } + conn := &HvsockConn{ + sock: sock, + remote: *addr, + } + sock = nil + return conn, nil +} +*/ + +func (conn *HvsockConn) opErr(op string, err error) error { + return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err} +} + +func (conn *HvsockConn) Read(b []byte) (int, error) { + c, err := conn.sock.prepareIo() + if err != nil { + return 0, conn.opErr("read", err) + } + defer conn.sock.wg.Done() + buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} + var flags, bytes uint32 + err = syscall.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil) + n, err := conn.sock.asyncIo(c, &conn.sock.readDeadline, bytes, err) + if err != nil { + if _, ok := err.(syscall.Errno); ok { + err = os.NewSyscallError("wsarecv", err) + } + return 0, conn.opErr("read", err) + } else if n == 0 { + err = io.EOF + } + return n, err +} + +func (conn *HvsockConn) Write(b []byte) (int, error) { + t := 0 + for len(b) != 0 { + n, err := conn.write(b) + if err != nil { + return t + n, err + } + t += n + b = b[n:] + } + return t, nil +} + +func (conn *HvsockConn) write(b []byte) (int, error) { + c, err := conn.sock.prepareIo() + if err != nil { + return 0, conn.opErr("write", err) + } + defer conn.sock.wg.Done() + buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} + var bytes uint32 + err = syscall.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil) + n, err := conn.sock.asyncIo(c, &conn.sock.writeDeadline, bytes, err) + if err != nil { + if _, ok := err.(syscall.Errno); ok { + err = os.NewSyscallError("wsasend", err) + } + return 0, conn.opErr("write", err) + } + return n, err +} + +// Close closes the socket connection, failing any pending read or write calls. +func (conn *HvsockConn) Close() error { + return conn.sock.Close() +} + +func (conn *HvsockConn) IsClosed() bool { + return conn.sock.IsClosed() +} + +func (conn *HvsockConn) shutdown(how int) error { + if conn.IsClosed() { + return ErrFileClosed + } + + err := syscall.Shutdown(conn.sock.handle, how) + if err != nil { + return os.NewSyscallError("shutdown", err) + } + return nil +} + +// CloseRead shuts down the read end of the socket, preventing future read operations. +func (conn *HvsockConn) CloseRead() error { + err := conn.shutdown(syscall.SHUT_RD) + if err != nil { + return conn.opErr("close", err) + } + return nil +} + +// CloseWrite shuts down the write end of the socket, preventing future write operations and +// notifying the other endpoint that no more data will be written. +func (conn *HvsockConn) CloseWrite() error { + err := conn.shutdown(syscall.SHUT_WR) + if err != nil { + return conn.opErr("close", err) + } + return nil +} + +// LocalAddr returns the local address of the connection. +func (conn *HvsockConn) LocalAddr() net.Addr { + return &conn.local +} + +// RemoteAddr returns the remote address of the connection. +func (conn *HvsockConn) RemoteAddr() net.Addr { + return &conn.remote +} + +// SetDeadline implements the net.Conn SetDeadline method. +func (conn *HvsockConn) SetDeadline(t time.Time) error { + conn.SetReadDeadline(t) + conn.SetWriteDeadline(t) + return nil +} + +// SetReadDeadline implements the net.Conn SetReadDeadline method. +func (conn *HvsockConn) SetReadDeadline(t time.Time) error { + return conn.sock.SetReadDeadline(t) +} + +// SetWriteDeadline implements the net.Conn SetWriteDeadline method. +func (conn *HvsockConn) SetWriteDeadline(t time.Time) error { + return conn.sock.SetWriteDeadline(t) +} diff --git a/vendor/github.com/Microsoft/go-winio/pipe.go b/vendor/github.com/Microsoft/go-winio/pipe.go new file mode 100644 index 0000000000..96700a73de --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pipe.go @@ -0,0 +1,517 @@ +// +build windows + +package winio + +import ( + "context" + "errors" + "fmt" + "io" + "net" + "os" + "runtime" + "syscall" + "time" + "unsafe" +) + +//sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe +//sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW +//sys createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateFileW +//sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo +//sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW +//sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc +//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) = ntdll.NtCreateNamedPipeFile +//sys rtlNtStatusToDosError(status ntstatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb +//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) = ntdll.RtlDosPathNameToNtPathName_U +//sys rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) = ntdll.RtlDefaultNpAcl + +type ioStatusBlock struct { + Status, Information uintptr +} + +type objectAttributes struct { + Length uintptr + RootDirectory uintptr + ObjectName *unicodeString + Attributes uintptr + SecurityDescriptor *securityDescriptor + SecurityQoS uintptr +} + +type unicodeString struct { + Length uint16 + MaximumLength uint16 + Buffer uintptr +} + +type securityDescriptor struct { + Revision byte + Sbz1 byte + Control uint16 + Owner uintptr + Group uintptr + Sacl uintptr + Dacl uintptr +} + +type ntstatus int32 + +func (status ntstatus) Err() error { + if status >= 0 { + return nil + } + return rtlNtStatusToDosError(status) +} + +const ( + cERROR_PIPE_BUSY = syscall.Errno(231) + cERROR_NO_DATA = syscall.Errno(232) + cERROR_PIPE_CONNECTED = syscall.Errno(535) + cERROR_SEM_TIMEOUT = syscall.Errno(121) + + cSECURITY_SQOS_PRESENT = 0x100000 + cSECURITY_ANONYMOUS = 0 + + cPIPE_TYPE_MESSAGE = 4 + + cPIPE_READMODE_MESSAGE = 2 + + cFILE_OPEN = 1 + cFILE_CREATE = 2 + + cFILE_PIPE_MESSAGE_TYPE = 1 + cFILE_PIPE_REJECT_REMOTE_CLIENTS = 2 + + cSE_DACL_PRESENT = 4 +) + +var ( + // ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed. + // This error should match net.errClosing since docker takes a dependency on its text. + ErrPipeListenerClosed = errors.New("use of closed network connection") + + errPipeWriteClosed = errors.New("pipe has been closed for write") +) + +type win32Pipe struct { + *win32File + path string +} + +type win32MessageBytePipe struct { + win32Pipe + writeClosed bool + readEOF bool +} + +type pipeAddress string + +func (f *win32Pipe) LocalAddr() net.Addr { + return pipeAddress(f.path) +} + +func (f *win32Pipe) RemoteAddr() net.Addr { + return pipeAddress(f.path) +} + +func (f *win32Pipe) SetDeadline(t time.Time) error { + f.SetReadDeadline(t) + f.SetWriteDeadline(t) + return nil +} + +// CloseWrite closes the write side of a message pipe in byte mode. +func (f *win32MessageBytePipe) CloseWrite() error { + if f.writeClosed { + return errPipeWriteClosed + } + err := f.win32File.Flush() + if err != nil { + return err + } + _, err = f.win32File.Write(nil) + if err != nil { + return err + } + f.writeClosed = true + return nil +} + +// Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since +// they are used to implement CloseWrite(). +func (f *win32MessageBytePipe) Write(b []byte) (int, error) { + if f.writeClosed { + return 0, errPipeWriteClosed + } + if len(b) == 0 { + return 0, nil + } + return f.win32File.Write(b) +} + +// Read reads bytes from a message pipe in byte mode. A read of a zero-byte message on a message +// mode pipe will return io.EOF, as will all subsequent reads. +func (f *win32MessageBytePipe) Read(b []byte) (int, error) { + if f.readEOF { + return 0, io.EOF + } + n, err := f.win32File.Read(b) + if err == io.EOF { + // If this was the result of a zero-byte read, then + // it is possible that the read was due to a zero-size + // message. Since we are simulating CloseWrite with a + // zero-byte message, ensure that all future Read() calls + // also return EOF. + f.readEOF = true + } else if err == syscall.ERROR_MORE_DATA { + // ERROR_MORE_DATA indicates that the pipe's read mode is message mode + // and the message still has more bytes. Treat this as a success, since + // this package presents all named pipes as byte streams. + err = nil + } + return n, err +} + +func (s pipeAddress) Network() string { + return "pipe" +} + +func (s pipeAddress) String() string { + return string(s) +} + +// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout. +func tryDialPipe(ctx context.Context, path *string, access uint32) (syscall.Handle, error) { + for { + + select { + case <-ctx.Done(): + return syscall.Handle(0), ctx.Err() + default: + h, err := createFile(*path, access, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0) + if err == nil { + return h, nil + } + if err != cERROR_PIPE_BUSY { + return h, &os.PathError{Err: err, Op: "open", Path: *path} + } + // Wait 10 msec and try again. This is a rather simplistic + // view, as we always try each 10 milliseconds. + time.Sleep(10 * time.Millisecond) + } + } +} + +// DialPipe connects to a named pipe by path, timing out if the connection +// takes longer than the specified duration. If timeout is nil, then we use +// a default timeout of 2 seconds. (We do not use WaitNamedPipe.) +func DialPipe(path string, timeout *time.Duration) (net.Conn, error) { + var absTimeout time.Time + if timeout != nil { + absTimeout = time.Now().Add(*timeout) + } else { + absTimeout = time.Now().Add(2 * time.Second) + } + ctx, _ := context.WithDeadline(context.Background(), absTimeout) + conn, err := DialPipeContext(ctx, path) + if err == context.DeadlineExceeded { + return nil, ErrTimeout + } + return conn, err +} + +// DialPipeContext attempts to connect to a named pipe by `path` until `ctx` +// cancellation or timeout. +func DialPipeContext(ctx context.Context, path string) (net.Conn, error) { + return DialPipeAccess(ctx, path, syscall.GENERIC_READ|syscall.GENERIC_WRITE) +} + +// DialPipeAccess attempts to connect to a named pipe by `path` with `access` until `ctx` +// cancellation or timeout. +func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error) { + var err error + var h syscall.Handle + h, err = tryDialPipe(ctx, &path, access) + if err != nil { + return nil, err + } + + var flags uint32 + err = getNamedPipeInfo(h, &flags, nil, nil, nil) + if err != nil { + return nil, err + } + + f, err := makeWin32File(h) + if err != nil { + syscall.Close(h) + return nil, err + } + + // If the pipe is in message mode, return a message byte pipe, which + // supports CloseWrite(). + if flags&cPIPE_TYPE_MESSAGE != 0 { + return &win32MessageBytePipe{ + win32Pipe: win32Pipe{win32File: f, path: path}, + }, nil + } + return &win32Pipe{win32File: f, path: path}, nil +} + +type acceptResponse struct { + f *win32File + err error +} + +type win32PipeListener struct { + firstHandle syscall.Handle + path string + config PipeConfig + acceptCh chan (chan acceptResponse) + closeCh chan int + doneCh chan int +} + +func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (syscall.Handle, error) { + path16, err := syscall.UTF16FromString(path) + if err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + + var oa objectAttributes + oa.Length = unsafe.Sizeof(oa) + + var ntPath unicodeString + if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0).Err(); err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + defer localFree(ntPath.Buffer) + oa.ObjectName = &ntPath + + // The security descriptor is only needed for the first pipe. + if first { + if sd != nil { + len := uint32(len(sd)) + sdb := localAlloc(0, len) + defer localFree(sdb) + copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd) + oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb)) + } else { + // Construct the default named pipe security descriptor. + var dacl uintptr + if err := rtlDefaultNpAcl(&dacl).Err(); err != nil { + return 0, fmt.Errorf("getting default named pipe ACL: %s", err) + } + defer localFree(dacl) + + sdb := &securityDescriptor{ + Revision: 1, + Control: cSE_DACL_PRESENT, + Dacl: dacl, + } + oa.SecurityDescriptor = sdb + } + } + + typ := uint32(cFILE_PIPE_REJECT_REMOTE_CLIENTS) + if c.MessageMode { + typ |= cFILE_PIPE_MESSAGE_TYPE + } + + disposition := uint32(cFILE_OPEN) + access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | syscall.SYNCHRONIZE) + if first { + disposition = cFILE_CREATE + // By not asking for read or write access, the named pipe file system + // will put this pipe into an initially disconnected state, blocking + // client connections until the next call with first == false. + access = syscall.SYNCHRONIZE + } + + timeout := int64(-50 * 10000) // 50ms + + var ( + h syscall.Handle + iosb ioStatusBlock + ) + err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err() + if err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + + runtime.KeepAlive(ntPath) + return h, nil +} + +func (l *win32PipeListener) makeServerPipe() (*win32File, error) { + h, err := makeServerPipeHandle(l.path, nil, &l.config, false) + if err != nil { + return nil, err + } + f, err := makeWin32File(h) + if err != nil { + syscall.Close(h) + return nil, err + } + return f, nil +} + +func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) { + p, err := l.makeServerPipe() + if err != nil { + return nil, err + } + + // Wait for the client to connect. + ch := make(chan error) + go func(p *win32File) { + ch <- connectPipe(p) + }(p) + + select { + case err = <-ch: + if err != nil { + p.Close() + p = nil + } + case <-l.closeCh: + // Abort the connect request by closing the handle. + p.Close() + p = nil + err = <-ch + if err == nil || err == ErrFileClosed { + err = ErrPipeListenerClosed + } + } + return p, err +} + +func (l *win32PipeListener) listenerRoutine() { + closed := false + for !closed { + select { + case <-l.closeCh: + closed = true + case responseCh := <-l.acceptCh: + var ( + p *win32File + err error + ) + for { + p, err = l.makeConnectedServerPipe() + // If the connection was immediately closed by the client, try + // again. + if err != cERROR_NO_DATA { + break + } + } + responseCh <- acceptResponse{p, err} + closed = err == ErrPipeListenerClosed + } + } + syscall.Close(l.firstHandle) + l.firstHandle = 0 + // Notify Close() and Accept() callers that the handle has been closed. + close(l.doneCh) +} + +// PipeConfig contain configuration for the pipe listener. +type PipeConfig struct { + // SecurityDescriptor contains a Windows security descriptor in SDDL format. + SecurityDescriptor string + + // MessageMode determines whether the pipe is in byte or message mode. In either + // case the pipe is read in byte mode by default. The only practical difference in + // this implementation is that CloseWrite() is only supported for message mode pipes; + // CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only + // transferred to the reader (and returned as io.EOF in this implementation) + // when the pipe is in message mode. + MessageMode bool + + // InputBufferSize specifies the size of the input buffer, in bytes. + InputBufferSize int32 + + // OutputBufferSize specifies the size of the output buffer, in bytes. + OutputBufferSize int32 +} + +// ListenPipe creates a listener on a Windows named pipe path, e.g. \\.\pipe\mypipe. +// The pipe must not already exist. +func ListenPipe(path string, c *PipeConfig) (net.Listener, error) { + var ( + sd []byte + err error + ) + if c == nil { + c = &PipeConfig{} + } + if c.SecurityDescriptor != "" { + sd, err = SddlToSecurityDescriptor(c.SecurityDescriptor) + if err != nil { + return nil, err + } + } + h, err := makeServerPipeHandle(path, sd, c, true) + if err != nil { + return nil, err + } + l := &win32PipeListener{ + firstHandle: h, + path: path, + config: *c, + acceptCh: make(chan (chan acceptResponse)), + closeCh: make(chan int), + doneCh: make(chan int), + } + go l.listenerRoutine() + return l, nil +} + +func connectPipe(p *win32File) error { + c, err := p.prepareIo() + if err != nil { + return err + } + defer p.wg.Done() + + err = connectNamedPipe(p.handle, &c.o) + _, err = p.asyncIo(c, nil, 0, err) + if err != nil && err != cERROR_PIPE_CONNECTED { + return err + } + return nil +} + +func (l *win32PipeListener) Accept() (net.Conn, error) { + ch := make(chan acceptResponse) + select { + case l.acceptCh <- ch: + response := <-ch + err := response.err + if err != nil { + return nil, err + } + if l.config.MessageMode { + return &win32MessageBytePipe{ + win32Pipe: win32Pipe{win32File: response.f, path: l.path}, + }, nil + } + return &win32Pipe{win32File: response.f, path: l.path}, nil + case <-l.doneCh: + return nil, ErrPipeListenerClosed + } +} + +func (l *win32PipeListener) Close() error { + select { + case l.closeCh <- 1: + <-l.doneCh + case <-l.doneCh: + } + return nil +} + +func (l *win32PipeListener) Addr() net.Addr { + return pipeAddress(l.path) +} diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go new file mode 100644 index 0000000000..2d9161e2de --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go @@ -0,0 +1,228 @@ +// +build windows + +// Package guid provides a GUID type. The backing structure for a GUID is +// identical to that used by the golang.org/x/sys/windows GUID type. +// There are two main binary encodings used for a GUID, the big-endian encoding, +// and the Windows (mixed-endian) encoding. See here for details: +// https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding +package guid + +import ( + "crypto/rand" + "crypto/sha1" + "encoding" + "encoding/binary" + "fmt" + "strconv" +) + +// Variant specifies which GUID variant (or "type") of the GUID. It determines +// how the entirety of the rest of the GUID is interpreted. +type Variant uint8 + +// The variants specified by RFC 4122. +const ( + // VariantUnknown specifies a GUID variant which does not conform to one of + // the variant encodings specified in RFC 4122. + VariantUnknown Variant = iota + VariantNCS + VariantRFC4122 + VariantMicrosoft + VariantFuture +) + +// Version specifies how the bits in the GUID were generated. For instance, a +// version 4 GUID is randomly generated, and a version 5 is generated from the +// hash of an input string. +type Version uint8 + +var _ = (encoding.TextMarshaler)(GUID{}) +var _ = (encoding.TextUnmarshaler)(&GUID{}) + +// NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122. +func NewV4() (GUID, error) { + var b [16]byte + if _, err := rand.Read(b[:]); err != nil { + return GUID{}, err + } + + g := FromArray(b) + g.setVersion(4) // Version 4 means randomly generated. + g.setVariant(VariantRFC4122) + + return g, nil +} + +// NewV5 returns a new version 5 (generated from a string via SHA-1 hashing) +// GUID, as defined by RFC 4122. The RFC is unclear on the encoding of the name, +// and the sample code treats it as a series of bytes, so we do the same here. +// +// Some implementations, such as those found on Windows, treat the name as a +// big-endian UTF16 stream of bytes. If that is desired, the string can be +// encoded as such before being passed to this function. +func NewV5(namespace GUID, name []byte) (GUID, error) { + b := sha1.New() + namespaceBytes := namespace.ToArray() + b.Write(namespaceBytes[:]) + b.Write(name) + + a := [16]byte{} + copy(a[:], b.Sum(nil)) + + g := FromArray(a) + g.setVersion(5) // Version 5 means generated from a string. + g.setVariant(VariantRFC4122) + + return g, nil +} + +func fromArray(b [16]byte, order binary.ByteOrder) GUID { + var g GUID + g.Data1 = order.Uint32(b[0:4]) + g.Data2 = order.Uint16(b[4:6]) + g.Data3 = order.Uint16(b[6:8]) + copy(g.Data4[:], b[8:16]) + return g +} + +func (g GUID) toArray(order binary.ByteOrder) [16]byte { + b := [16]byte{} + order.PutUint32(b[0:4], g.Data1) + order.PutUint16(b[4:6], g.Data2) + order.PutUint16(b[6:8], g.Data3) + copy(b[8:16], g.Data4[:]) + return b +} + +// FromArray constructs a GUID from a big-endian encoding array of 16 bytes. +func FromArray(b [16]byte) GUID { + return fromArray(b, binary.BigEndian) +} + +// ToArray returns an array of 16 bytes representing the GUID in big-endian +// encoding. +func (g GUID) ToArray() [16]byte { + return g.toArray(binary.BigEndian) +} + +// FromWindowsArray constructs a GUID from a Windows encoding array of bytes. +func FromWindowsArray(b [16]byte) GUID { + return fromArray(b, binary.LittleEndian) +} + +// ToWindowsArray returns an array of 16 bytes representing the GUID in Windows +// encoding. +func (g GUID) ToWindowsArray() [16]byte { + return g.toArray(binary.LittleEndian) +} + +func (g GUID) String() string { + return fmt.Sprintf( + "%08x-%04x-%04x-%04x-%012x", + g.Data1, + g.Data2, + g.Data3, + g.Data4[:2], + g.Data4[2:]) +} + +// FromString parses a string containing a GUID and returns the GUID. The only +// format currently supported is the `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` +// format. +func FromString(s string) (GUID, error) { + if len(s) != 36 { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + + var g GUID + + data1, err := strconv.ParseUint(s[0:8], 16, 32) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data1 = uint32(data1) + + data2, err := strconv.ParseUint(s[9:13], 16, 16) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data2 = uint16(data2) + + data3, err := strconv.ParseUint(s[14:18], 16, 16) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data3 = uint16(data3) + + for i, x := range []int{19, 21, 24, 26, 28, 30, 32, 34} { + v, err := strconv.ParseUint(s[x:x+2], 16, 8) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data4[i] = uint8(v) + } + + return g, nil +} + +func (g *GUID) setVariant(v Variant) { + d := g.Data4[0] + switch v { + case VariantNCS: + d = (d & 0x7f) + case VariantRFC4122: + d = (d & 0x3f) | 0x80 + case VariantMicrosoft: + d = (d & 0x1f) | 0xc0 + case VariantFuture: + d = (d & 0x0f) | 0xe0 + case VariantUnknown: + fallthrough + default: + panic(fmt.Sprintf("invalid variant: %d", v)) + } + g.Data4[0] = d +} + +// Variant returns the GUID variant, as defined in RFC 4122. +func (g GUID) Variant() Variant { + b := g.Data4[0] + if b&0x80 == 0 { + return VariantNCS + } else if b&0xc0 == 0x80 { + return VariantRFC4122 + } else if b&0xe0 == 0xc0 { + return VariantMicrosoft + } else if b&0xe0 == 0xe0 { + return VariantFuture + } + return VariantUnknown +} + +func (g *GUID) setVersion(v Version) { + g.Data3 = (g.Data3 & 0x0fff) | (uint16(v) << 12) +} + +// Version returns the GUID version, as defined in RFC 4122. +func (g GUID) Version() Version { + return Version((g.Data3 & 0xF000) >> 12) +} + +// MarshalText returns the textual representation of the GUID. +func (g GUID) MarshalText() ([]byte, error) { + return []byte(g.String()), nil +} + +// UnmarshalText takes the textual representation of a GUID, and unmarhals it +// into this GUID. +func (g *GUID) UnmarshalText(text []byte) error { + g2, err := FromString(string(text)) + if err != nil { + return err + } + *g = g2 + return nil +} diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go new file mode 100644 index 0000000000..f64d828c0b --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go @@ -0,0 +1,15 @@ +// +build !windows + +package guid + +// GUID represents a GUID/UUID. It has the same structure as +// golang.org/x/sys/windows.GUID so that it can be used with functions expecting +// that type. It is defined as its own type as that is only available to builds +// targeted at `windows`. The representation matches that used by native Windows +// code. +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go new file mode 100644 index 0000000000..83617f4eee --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go @@ -0,0 +1,10 @@ +package guid + +import "golang.org/x/sys/windows" + +// GUID represents a GUID/UUID. It has the same structure as +// golang.org/x/sys/windows.GUID so that it can be used with functions expecting +// that type. It is defined as its own type so that stringification and +// marshaling can be supported. The representation matches that used by native +// Windows code. +type GUID windows.GUID diff --git a/vendor/github.com/Microsoft/go-winio/privilege.go b/vendor/github.com/Microsoft/go-winio/privilege.go new file mode 100644 index 0000000000..c3dd7c2176 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/privilege.go @@ -0,0 +1,203 @@ +// +build windows + +package winio + +import ( + "bytes" + "encoding/binary" + "fmt" + "runtime" + "sync" + "syscall" + "unicode/utf16" + + "golang.org/x/sys/windows" +) + +//sys adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges +//sys impersonateSelf(level uint32) (err error) = advapi32.ImpersonateSelf +//sys revertToSelf() (err error) = advapi32.RevertToSelf +//sys openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) = advapi32.OpenThreadToken +//sys getCurrentThread() (h syscall.Handle) = GetCurrentThread +//sys lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) = advapi32.LookupPrivilegeValueW +//sys lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW +//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW + +const ( + SE_PRIVILEGE_ENABLED = 2 + + ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300 + + SeBackupPrivilege = "SeBackupPrivilege" + SeRestorePrivilege = "SeRestorePrivilege" + SeSecurityPrivilege = "SeSecurityPrivilege" +) + +const ( + securityAnonymous = iota + securityIdentification + securityImpersonation + securityDelegation +) + +var ( + privNames = make(map[string]uint64) + privNameMutex sync.Mutex +) + +// PrivilegeError represents an error enabling privileges. +type PrivilegeError struct { + privileges []uint64 +} + +func (e *PrivilegeError) Error() string { + s := "" + if len(e.privileges) > 1 { + s = "Could not enable privileges " + } else { + s = "Could not enable privilege " + } + for i, p := range e.privileges { + if i != 0 { + s += ", " + } + s += `"` + s += getPrivilegeName(p) + s += `"` + } + return s +} + +// RunWithPrivilege enables a single privilege for a function call. +func RunWithPrivilege(name string, fn func() error) error { + return RunWithPrivileges([]string{name}, fn) +} + +// RunWithPrivileges enables privileges for a function call. +func RunWithPrivileges(names []string, fn func() error) error { + privileges, err := mapPrivileges(names) + if err != nil { + return err + } + runtime.LockOSThread() + defer runtime.UnlockOSThread() + token, err := newThreadToken() + if err != nil { + return err + } + defer releaseThreadToken(token) + err = adjustPrivileges(token, privileges, SE_PRIVILEGE_ENABLED) + if err != nil { + return err + } + return fn() +} + +func mapPrivileges(names []string) ([]uint64, error) { + var privileges []uint64 + privNameMutex.Lock() + defer privNameMutex.Unlock() + for _, name := range names { + p, ok := privNames[name] + if !ok { + err := lookupPrivilegeValue("", name, &p) + if err != nil { + return nil, err + } + privNames[name] = p + } + privileges = append(privileges, p) + } + return privileges, nil +} + +// EnableProcessPrivileges enables privileges globally for the process. +func EnableProcessPrivileges(names []string) error { + return enableDisableProcessPrivilege(names, SE_PRIVILEGE_ENABLED) +} + +// DisableProcessPrivileges disables privileges globally for the process. +func DisableProcessPrivileges(names []string) error { + return enableDisableProcessPrivilege(names, 0) +} + +func enableDisableProcessPrivilege(names []string, action uint32) error { + privileges, err := mapPrivileges(names) + if err != nil { + return err + } + + p, _ := windows.GetCurrentProcess() + var token windows.Token + err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token) + if err != nil { + return err + } + + defer token.Close() + return adjustPrivileges(token, privileges, action) +} + +func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error { + var b bytes.Buffer + binary.Write(&b, binary.LittleEndian, uint32(len(privileges))) + for _, p := range privileges { + binary.Write(&b, binary.LittleEndian, p) + binary.Write(&b, binary.LittleEndian, action) + } + prevState := make([]byte, b.Len()) + reqSize := uint32(0) + success, err := adjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(len(prevState)), &prevState[0], &reqSize) + if !success { + return err + } + if err == ERROR_NOT_ALL_ASSIGNED { + return &PrivilegeError{privileges} + } + return nil +} + +func getPrivilegeName(luid uint64) string { + var nameBuffer [256]uint16 + bufSize := uint32(len(nameBuffer)) + err := lookupPrivilegeName("", &luid, &nameBuffer[0], &bufSize) + if err != nil { + return fmt.Sprintf("", luid) + } + + var displayNameBuffer [256]uint16 + displayBufSize := uint32(len(displayNameBuffer)) + var langID uint32 + err = lookupPrivilegeDisplayName("", &nameBuffer[0], &displayNameBuffer[0], &displayBufSize, &langID) + if err != nil { + return fmt.Sprintf("", string(utf16.Decode(nameBuffer[:bufSize]))) + } + + return string(utf16.Decode(displayNameBuffer[:displayBufSize])) +} + +func newThreadToken() (windows.Token, error) { + err := impersonateSelf(securityImpersonation) + if err != nil { + return 0, err + } + + var token windows.Token + err = openThreadToken(getCurrentThread(), syscall.TOKEN_ADJUST_PRIVILEGES|syscall.TOKEN_QUERY, false, &token) + if err != nil { + rerr := revertToSelf() + if rerr != nil { + panic(rerr) + } + return 0, err + } + return token, nil +} + +func releaseThreadToken(h windows.Token) { + err := revertToSelf() + if err != nil { + panic(err) + } + h.Close() +} diff --git a/vendor/github.com/Microsoft/go-winio/reparse.go b/vendor/github.com/Microsoft/go-winio/reparse.go new file mode 100644 index 0000000000..fc1ee4d3a3 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/reparse.go @@ -0,0 +1,128 @@ +package winio + +import ( + "bytes" + "encoding/binary" + "fmt" + "strings" + "unicode/utf16" + "unsafe" +) + +const ( + reparseTagMountPoint = 0xA0000003 + reparseTagSymlink = 0xA000000C +) + +type reparseDataBuffer struct { + ReparseTag uint32 + ReparseDataLength uint16 + Reserved uint16 + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 +} + +// ReparsePoint describes a Win32 symlink or mount point. +type ReparsePoint struct { + Target string + IsMountPoint bool +} + +// UnsupportedReparsePointError is returned when trying to decode a non-symlink or +// mount point reparse point. +type UnsupportedReparsePointError struct { + Tag uint32 +} + +func (e *UnsupportedReparsePointError) Error() string { + return fmt.Sprintf("unsupported reparse point %x", e.Tag) +} + +// DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink +// or a mount point. +func DecodeReparsePoint(b []byte) (*ReparsePoint, error) { + tag := binary.LittleEndian.Uint32(b[0:4]) + return DecodeReparsePointData(tag, b[8:]) +} + +func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) { + isMountPoint := false + switch tag { + case reparseTagMountPoint: + isMountPoint = true + case reparseTagSymlink: + default: + return nil, &UnsupportedReparsePointError{tag} + } + nameOffset := 8 + binary.LittleEndian.Uint16(b[4:6]) + if !isMountPoint { + nameOffset += 4 + } + nameLength := binary.LittleEndian.Uint16(b[6:8]) + name := make([]uint16, nameLength/2) + err := binary.Read(bytes.NewReader(b[nameOffset:nameOffset+nameLength]), binary.LittleEndian, &name) + if err != nil { + return nil, err + } + return &ReparsePoint{string(utf16.Decode(name)), isMountPoint}, nil +} + +func isDriveLetter(c byte) bool { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') +} + +// EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or +// mount point. +func EncodeReparsePoint(rp *ReparsePoint) []byte { + // Generate an NT path and determine if this is a relative path. + var ntTarget string + relative := false + if strings.HasPrefix(rp.Target, `\\?\`) { + ntTarget = `\??\` + rp.Target[4:] + } else if strings.HasPrefix(rp.Target, `\\`) { + ntTarget = `\??\UNC\` + rp.Target[2:] + } else if len(rp.Target) >= 2 && isDriveLetter(rp.Target[0]) && rp.Target[1] == ':' { + ntTarget = `\??\` + rp.Target + } else { + ntTarget = rp.Target + relative = true + } + + // The paths must be NUL-terminated even though they are counted strings. + target16 := utf16.Encode([]rune(rp.Target + "\x00")) + ntTarget16 := utf16.Encode([]rune(ntTarget + "\x00")) + + size := int(unsafe.Sizeof(reparseDataBuffer{})) - 8 + size += len(ntTarget16)*2 + len(target16)*2 + + tag := uint32(reparseTagMountPoint) + if !rp.IsMountPoint { + tag = reparseTagSymlink + size += 4 // Add room for symlink flags + } + + data := reparseDataBuffer{ + ReparseTag: tag, + ReparseDataLength: uint16(size), + SubstituteNameOffset: 0, + SubstituteNameLength: uint16((len(ntTarget16) - 1) * 2), + PrintNameOffset: uint16(len(ntTarget16) * 2), + PrintNameLength: uint16((len(target16) - 1) * 2), + } + + var b bytes.Buffer + binary.Write(&b, binary.LittleEndian, &data) + if !rp.IsMountPoint { + flags := uint32(0) + if relative { + flags |= 1 + } + binary.Write(&b, binary.LittleEndian, flags) + } + + binary.Write(&b, binary.LittleEndian, ntTarget16) + binary.Write(&b, binary.LittleEndian, target16) + return b.Bytes() +} diff --git a/vendor/github.com/Microsoft/go-winio/sd.go b/vendor/github.com/Microsoft/go-winio/sd.go new file mode 100644 index 0000000000..db1b370a1b --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/sd.go @@ -0,0 +1,98 @@ +// +build windows + +package winio + +import ( + "syscall" + "unsafe" +) + +//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW +//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW +//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW +//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW +//sys localFree(mem uintptr) = LocalFree +//sys getSecurityDescriptorLength(sd uintptr) (len uint32) = advapi32.GetSecurityDescriptorLength + +const ( + cERROR_NONE_MAPPED = syscall.Errno(1332) +) + +type AccountLookupError struct { + Name string + Err error +} + +func (e *AccountLookupError) Error() string { + if e.Name == "" { + return "lookup account: empty account name specified" + } + var s string + switch e.Err { + case cERROR_NONE_MAPPED: + s = "not found" + default: + s = e.Err.Error() + } + return "lookup account " + e.Name + ": " + s +} + +type SddlConversionError struct { + Sddl string + Err error +} + +func (e *SddlConversionError) Error() string { + return "convert " + e.Sddl + ": " + e.Err.Error() +} + +// LookupSidByName looks up the SID of an account by name +func LookupSidByName(name string) (sid string, err error) { + if name == "" { + return "", &AccountLookupError{name, cERROR_NONE_MAPPED} + } + + var sidSize, sidNameUse, refDomainSize uint32 + err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse) + if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER { + return "", &AccountLookupError{name, err} + } + sidBuffer := make([]byte, sidSize) + refDomainBuffer := make([]uint16, refDomainSize) + err = lookupAccountName(nil, name, &sidBuffer[0], &sidSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse) + if err != nil { + return "", &AccountLookupError{name, err} + } + var strBuffer *uint16 + err = convertSidToStringSid(&sidBuffer[0], &strBuffer) + if err != nil { + return "", &AccountLookupError{name, err} + } + sid = syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:]) + localFree(uintptr(unsafe.Pointer(strBuffer))) + return sid, nil +} + +func SddlToSecurityDescriptor(sddl string) ([]byte, error) { + var sdBuffer uintptr + err := convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &sdBuffer, nil) + if err != nil { + return nil, &SddlConversionError{sddl, err} + } + defer localFree(sdBuffer) + sd := make([]byte, getSecurityDescriptorLength(sdBuffer)) + copy(sd, (*[0xffff]byte)(unsafe.Pointer(sdBuffer))[:len(sd)]) + return sd, nil +} + +func SecurityDescriptorToSddl(sd []byte) (string, error) { + var sddl *uint16 + // The returned string length seems to including an aribtrary number of terminating NULs. + // Don't use it. + err := convertSecurityDescriptorToStringSecurityDescriptor(&sd[0], 1, 0xff, &sddl, nil) + if err != nil { + return "", err + } + defer localFree(uintptr(unsafe.Pointer(sddl))) + return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(sddl))[:]), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/syscall.go b/vendor/github.com/Microsoft/go-winio/syscall.go new file mode 100644 index 0000000000..5955c99fde --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/syscall.go @@ -0,0 +1,3 @@ +package winio + +//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go hvsock.go diff --git a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go new file mode 100644 index 0000000000..176ff75e32 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go @@ -0,0 +1,427 @@ +// Code generated by 'go generate'; DO NOT EDIT. + +package winio + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return errERROR_EINVAL + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + modntdll = windows.NewLazySystemDLL("ntdll.dll") + modws2_32 = windows.NewLazySystemDLL("ws2_32.dll") + + procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") + procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW") + procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") + procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW") + procGetSecurityDescriptorLength = modadvapi32.NewProc("GetSecurityDescriptorLength") + procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") + procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") + procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW") + procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW") + procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") + procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") + procRevertToSelf = modadvapi32.NewProc("RevertToSelf") + procBackupRead = modkernel32.NewProc("BackupRead") + procBackupWrite = modkernel32.NewProc("BackupWrite") + procCancelIoEx = modkernel32.NewProc("CancelIoEx") + procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") + procCreateFileW = modkernel32.NewProc("CreateFileW") + procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") + procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") + procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") + procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") + procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procLocalAlloc = modkernel32.NewProc("LocalAlloc") + procLocalFree = modkernel32.NewProc("LocalFree") + procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procNtCreateNamedPipeFile = modntdll.NewProc("NtCreateNamedPipeFile") + procRtlDefaultNpAcl = modntdll.NewProc("RtlDefaultNpAcl") + procRtlDosPathNameToNtPathName_U = modntdll.NewProc("RtlDosPathNameToNtPathName_U") + procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb") + procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult") + procbind = modws2_32.NewProc("bind") +) + +func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) { + var _p0 uint32 + if releaseAll { + _p0 = 1 + } + r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize))) + success = r0 != 0 + if true { + err = errnoErr(e1) + } + return +} + +func convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procConvertSecurityDescriptorToStringSecurityDescriptorW.Addr(), 5, uintptr(unsafe.Pointer(sd)), uintptr(revision), uintptr(secInfo), uintptr(unsafe.Pointer(sddl)), uintptr(unsafe.Pointer(sddlSize)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func convertSidToStringSid(sid *byte, str **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(str)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(str) + if err != nil { + return + } + return _convertStringSecurityDescriptorToSecurityDescriptor(_p0, revision, sd, size) +} + +func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision uint32, sd *uintptr, size *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procConvertStringSecurityDescriptorToSecurityDescriptorW.Addr(), 4, uintptr(unsafe.Pointer(str)), uintptr(revision), uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(size)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func getSecurityDescriptorLength(sd uintptr) (len uint32) { + r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(sd), 0, 0) + len = uint32(r0) + return +} + +func impersonateSelf(level uint32) (err error) { + r1, _, e1 := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(level), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(accountName) + if err != nil { + return + } + return _lookupAccountName(systemName, _p0, sid, sidSize, refDomain, refDomainSize, sidNameUse) +} + +func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + return _lookupPrivilegeDisplayName(_p0, name, buffer, size, languageId) +} + +func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procLookupPrivilegeDisplayNameW.Addr(), 5, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(languageId)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + return _lookupPrivilegeName(_p0, luid, buffer, size) +} + +func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint16, size *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + var _p1 *uint16 + _p1, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _lookupPrivilegeValue(_p0, _p1, luid) +} + +func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint64) (err error) { + r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) { + var _p0 uint32 + if openAsSelf { + _p0 = 1 + } + r1, _, e1 := syscall.Syscall6(procOpenThreadToken.Addr(), 4, uintptr(thread), uintptr(accessMask), uintptr(_p0), uintptr(unsafe.Pointer(token)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func revertToSelf() (err error) { + r1, _, e1 := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 uint32 + if abort { + _p1 = 1 + } + var _p2 uint32 + if processSecurity { + _p2 = 1 + } + r1, _, e1 := syscall.Syscall9(procBackupRead.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesRead)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 uint32 + if abort { + _p1 = 1 + } + var _p2 uint32 + if processSecurity { + _p2 = 1 + } + r1, _, e1 := syscall.Syscall9(procBackupWrite.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesWritten)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(file), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _createFile(_p0, access, mode, sa, createmode, attrs, templatefile) +} + +func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) + handle = syscall.Handle(r0) + if handle == syscall.InvalidHandle { + err = errnoErr(e1) + } + return +} + +func createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount), 0, 0) + newport = syscall.Handle(r0) + if newport == 0 { + err = errnoErr(e1) + } + return +} + +func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _createNamedPipe(_p0, flags, pipeMode, maxInstances, outSize, inSize, defaultTimeout, sa) +} + +func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(pipeMode), uintptr(maxInstances), uintptr(outSize), uintptr(inSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0) + handle = syscall.Handle(r0) + if handle == syscall.InvalidHandle { + err = errnoErr(e1) + } + return +} + +func getCurrentThread() (h syscall.Handle) { + r0, _, _ := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0) + h = syscall.Handle(r0) + return +} + +func getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procGetNamedPipeHandleStateW.Addr(), 7, uintptr(pipe), uintptr(unsafe.Pointer(state)), uintptr(unsafe.Pointer(curInstances)), uintptr(unsafe.Pointer(maxCollectionCount)), uintptr(unsafe.Pointer(collectDataTimeout)), uintptr(unsafe.Pointer(userName)), uintptr(maxUserNameSize), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetNamedPipeInfo.Addr(), 5, uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(port), uintptr(unsafe.Pointer(bytes)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(o)), uintptr(timeout), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func localAlloc(uFlags uint32, length uint32) (ptr uintptr) { + r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(uFlags), uintptr(length), 0) + ptr = uintptr(r0) + return +} + +func localFree(mem uintptr) { + syscall.Syscall(procLocalFree.Addr(), 1, uintptr(mem), 0, 0) + return +} + +func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(h), uintptr(flags), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) { + r0, _, _ := syscall.Syscall15(procNtCreateNamedPipeFile.Addr(), 14, uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)), 0) + status = ntstatus(r0) + return +} + +func rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) { + r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(dacl)), 0, 0) + status = ntstatus(r0) + return +} + +func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) { + r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved), 0, 0) + status = ntstatus(r0) + return +} + +func rtlNtStatusToDosError(status ntstatus) (winerr error) { + r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0) + if r0 != 0 { + winerr = syscall.Errno(r0) + } + return +} + +func wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) { + var _p0 uint32 + if wait { + _p0 = 1 + } + r1, _, e1 := syscall.Syscall6(procWSAGetOverlappedResult.Addr(), 5, uintptr(h), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(bytes)), uintptr(_p0), uintptr(unsafe.Pointer(flags)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socketError { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/AUTHORS b/vendor/github.com/ProtonMail/go-crypto/AUTHORS new file mode 100644 index 0000000000..2b00ddba0d --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at https://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS b/vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS new file mode 100644 index 0000000000..1fbd3e976f --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/ProtonMail/go-crypto/LICENSE b/vendor/github.com/ProtonMail/go-crypto/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/ProtonMail/go-crypto/PATENTS b/vendor/github.com/ProtonMail/go-crypto/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go b/vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go new file mode 100644 index 0000000000..3ed3f43573 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go @@ -0,0 +1,381 @@ +package bitcurves + +// Copyright 2010 The Go Authors. All rights reserved. +// Copyright 2011 ThePiachu. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package bitelliptic implements several Koblitz elliptic curves over prime +// fields. + +// This package operates, internally, on Jacobian coordinates. For a given +// (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1) +// where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole +// calculation can be performed within the transform (as in ScalarMult and +// ScalarBaseMult). But even for Add and Double, it's faster to apply and +// reverse the transform than to operate in affine coordinates. + +import ( + "crypto/elliptic" + "io" + "math/big" + "sync" +) + +// A BitCurve represents a Koblitz Curve with a=0. +// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html +type BitCurve struct { + Name string + P *big.Int // the order of the underlying field + N *big.Int // the order of the base point + B *big.Int // the constant of the BitCurve equation + Gx, Gy *big.Int // (x,y) of the base point + BitSize int // the size of the underlying field +} + +// Params returns the parameters of the given BitCurve (see BitCurve struct) +func (bitCurve *BitCurve) Params() (cp *elliptic.CurveParams) { + cp = new(elliptic.CurveParams) + cp.Name = bitCurve.Name + cp.P = bitCurve.P + cp.N = bitCurve.N + cp.Gx = bitCurve.Gx + cp.Gy = bitCurve.Gy + cp.BitSize = bitCurve.BitSize + return cp +} + +// IsOnCurve returns true if the given (x,y) lies on the BitCurve. +func (bitCurve *BitCurve) IsOnCurve(x, y *big.Int) bool { + // y² = x³ + b + y2 := new(big.Int).Mul(y, y) //y² + y2.Mod(y2, bitCurve.P) //y²%P + + x3 := new(big.Int).Mul(x, x) //x² + x3.Mul(x3, x) //x³ + + x3.Add(x3, bitCurve.B) //x³+B + x3.Mod(x3, bitCurve.P) //(x³+B)%P + + return x3.Cmp(y2) == 0 +} + +// affineFromJacobian reverses the Jacobian transform. See the comment at the +// top of the file. +func (bitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) { + if z.Cmp(big.NewInt(0)) == 0 { + panic("bitcurve: Can't convert to affine with Jacobian Z = 0") + } + // x = YZ^2 mod P + zinv := new(big.Int).ModInverse(z, bitCurve.P) + zinvsq := new(big.Int).Mul(zinv, zinv) + + xOut = new(big.Int).Mul(x, zinvsq) + xOut.Mod(xOut, bitCurve.P) + // y = YZ^3 mod P + zinvsq.Mul(zinvsq, zinv) + yOut = new(big.Int).Mul(y, zinvsq) + yOut.Mod(yOut, bitCurve.P) + return xOut, yOut +} + +// Add returns the sum of (x1,y1) and (x2,y2) +func (bitCurve *BitCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) { + z := new(big.Int).SetInt64(1) + x, y, z := bitCurve.addJacobian(x1, y1, z, x2, y2, z) + return bitCurve.affineFromJacobian(x, y, z) +} + +// addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and +// (x2, y2, z2) and returns their sum, also in Jacobian form. +func (bitCurve *BitCurve) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) { + // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl + z1z1 := new(big.Int).Mul(z1, z1) + z1z1.Mod(z1z1, bitCurve.P) + z2z2 := new(big.Int).Mul(z2, z2) + z2z2.Mod(z2z2, bitCurve.P) + + u1 := new(big.Int).Mul(x1, z2z2) + u1.Mod(u1, bitCurve.P) + u2 := new(big.Int).Mul(x2, z1z1) + u2.Mod(u2, bitCurve.P) + h := new(big.Int).Sub(u2, u1) + if h.Sign() == -1 { + h.Add(h, bitCurve.P) + } + i := new(big.Int).Lsh(h, 1) + i.Mul(i, i) + j := new(big.Int).Mul(h, i) + + s1 := new(big.Int).Mul(y1, z2) + s1.Mul(s1, z2z2) + s1.Mod(s1, bitCurve.P) + s2 := new(big.Int).Mul(y2, z1) + s2.Mul(s2, z1z1) + s2.Mod(s2, bitCurve.P) + r := new(big.Int).Sub(s2, s1) + if r.Sign() == -1 { + r.Add(r, bitCurve.P) + } + r.Lsh(r, 1) + v := new(big.Int).Mul(u1, i) + + x3 := new(big.Int).Set(r) + x3.Mul(x3, x3) + x3.Sub(x3, j) + x3.Sub(x3, v) + x3.Sub(x3, v) + x3.Mod(x3, bitCurve.P) + + y3 := new(big.Int).Set(r) + v.Sub(v, x3) + y3.Mul(y3, v) + s1.Mul(s1, j) + s1.Lsh(s1, 1) + y3.Sub(y3, s1) + y3.Mod(y3, bitCurve.P) + + z3 := new(big.Int).Add(z1, z2) + z3.Mul(z3, z3) + z3.Sub(z3, z1z1) + if z3.Sign() == -1 { + z3.Add(z3, bitCurve.P) + } + z3.Sub(z3, z2z2) + if z3.Sign() == -1 { + z3.Add(z3, bitCurve.P) + } + z3.Mul(z3, h) + z3.Mod(z3, bitCurve.P) + + return x3, y3, z3 +} + +// Double returns 2*(x,y) +func (bitCurve *BitCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) { + z1 := new(big.Int).SetInt64(1) + return bitCurve.affineFromJacobian(bitCurve.doubleJacobian(x1, y1, z1)) +} + +// doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and +// returns its double, also in Jacobian form. +func (bitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) { + // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l + + a := new(big.Int).Mul(x, x) //X1² + b := new(big.Int).Mul(y, y) //Y1² + c := new(big.Int).Mul(b, b) //B² + + d := new(big.Int).Add(x, b) //X1+B + d.Mul(d, d) //(X1+B)² + d.Sub(d, a) //(X1+B)²-A + d.Sub(d, c) //(X1+B)²-A-C + d.Mul(d, big.NewInt(2)) //2*((X1+B)²-A-C) + + e := new(big.Int).Mul(big.NewInt(3), a) //3*A + f := new(big.Int).Mul(e, e) //E² + + x3 := new(big.Int).Mul(big.NewInt(2), d) //2*D + x3.Sub(f, x3) //F-2*D + x3.Mod(x3, bitCurve.P) + + y3 := new(big.Int).Sub(d, x3) //D-X3 + y3.Mul(e, y3) //E*(D-X3) + y3.Sub(y3, new(big.Int).Mul(big.NewInt(8), c)) //E*(D-X3)-8*C + y3.Mod(y3, bitCurve.P) + + z3 := new(big.Int).Mul(y, z) //Y1*Z1 + z3.Mul(big.NewInt(2), z3) //3*Y1*Z1 + z3.Mod(z3, bitCurve.P) + + return x3, y3, z3 +} + +//TODO: double check if it is okay +// ScalarMult returns k*(Bx,By) where k is a number in big-endian form. +func (bitCurve *BitCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) { + // We have a slight problem in that the identity of the group (the + // point at infinity) cannot be represented in (x, y) form on a finite + // machine. Thus the standard add/double algorithm has to be tweaked + // slightly: our initial state is not the identity, but x, and we + // ignore the first true bit in |k|. If we don't find any true bits in + // |k|, then we return nil, nil, because we cannot return the identity + // element. + + Bz := new(big.Int).SetInt64(1) + x := Bx + y := By + z := Bz + + seenFirstTrue := false + for _, byte := range k { + for bitNum := 0; bitNum < 8; bitNum++ { + if seenFirstTrue { + x, y, z = bitCurve.doubleJacobian(x, y, z) + } + if byte&0x80 == 0x80 { + if !seenFirstTrue { + seenFirstTrue = true + } else { + x, y, z = bitCurve.addJacobian(Bx, By, Bz, x, y, z) + } + } + byte <<= 1 + } + } + + if !seenFirstTrue { + return nil, nil + } + + return bitCurve.affineFromJacobian(x, y, z) +} + +// ScalarBaseMult returns k*G, where G is the base point of the group and k is +// an integer in big-endian form. +func (bitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) { + return bitCurve.ScalarMult(bitCurve.Gx, bitCurve.Gy, k) +} + +var mask = []byte{0xff, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f} + +//TODO: double check if it is okay +// GenerateKey returns a public/private key pair. The private key is generated +// using the given reader, which must return random data. +func (bitCurve *BitCurve) GenerateKey(rand io.Reader) (priv []byte, x, y *big.Int, err error) { + byteLen := (bitCurve.BitSize + 7) >> 3 + priv = make([]byte, byteLen) + + for x == nil { + _, err = io.ReadFull(rand, priv) + if err != nil { + return + } + // We have to mask off any excess bits in the case that the size of the + // underlying field is not a whole number of bytes. + priv[0] &= mask[bitCurve.BitSize%8] + // This is because, in tests, rand will return all zeros and we don't + // want to get the point at infinity and loop forever. + priv[1] ^= 0x42 + x, y = bitCurve.ScalarBaseMult(priv) + } + return +} + +// Marshal converts a point into the form specified in section 4.3.6 of ANSI +// X9.62. +func (bitCurve *BitCurve) Marshal(x, y *big.Int) []byte { + byteLen := (bitCurve.BitSize + 7) >> 3 + + ret := make([]byte, 1+2*byteLen) + ret[0] = 4 // uncompressed point + + xBytes := x.Bytes() + copy(ret[1+byteLen-len(xBytes):], xBytes) + yBytes := y.Bytes() + copy(ret[1+2*byteLen-len(yBytes):], yBytes) + return ret +} + +// Unmarshal converts a point, serialised by Marshal, into an x, y pair. On +// error, x = nil. +func (bitCurve *BitCurve) Unmarshal(data []byte) (x, y *big.Int) { + byteLen := (bitCurve.BitSize + 7) >> 3 + if len(data) != 1+2*byteLen { + return + } + if data[0] != 4 { // uncompressed form + return + } + x = new(big.Int).SetBytes(data[1 : 1+byteLen]) + y = new(big.Int).SetBytes(data[1+byteLen:]) + return +} + +//curve parameters taken from: +//http://www.secg.org/collateral/sec2_final.pdf + +var initonce sync.Once +var secp160k1 *BitCurve +var secp192k1 *BitCurve +var secp224k1 *BitCurve +var secp256k1 *BitCurve + +func initAll() { + initS160() + initS192() + initS224() + initS256() +} + +func initS160() { + // See SEC 2 section 2.4.1 + secp160k1 = new(BitCurve) + secp160k1.Name = "secp160k1" + secp160k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", 16) + secp160k1.N, _ = new(big.Int).SetString("0100000000000000000001B8FA16DFAB9ACA16B6B3", 16) + secp160k1.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000007", 16) + secp160k1.Gx, _ = new(big.Int).SetString("3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", 16) + secp160k1.Gy, _ = new(big.Int).SetString("938CF935318FDCED6BC28286531733C3F03C4FEE", 16) + secp160k1.BitSize = 160 +} + +func initS192() { + // See SEC 2 section 2.5.1 + secp192k1 = new(BitCurve) + secp192k1.Name = "secp192k1" + secp192k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", 16) + secp192k1.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", 16) + secp192k1.B, _ = new(big.Int).SetString("000000000000000000000000000000000000000000000003", 16) + secp192k1.Gx, _ = new(big.Int).SetString("DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", 16) + secp192k1.Gy, _ = new(big.Int).SetString("9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", 16) + secp192k1.BitSize = 192 +} + +func initS224() { + // See SEC 2 section 2.6.1 + secp224k1 = new(BitCurve) + secp224k1.Name = "secp224k1" + secp224k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", 16) + secp224k1.N, _ = new(big.Int).SetString("010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7", 16) + secp224k1.B, _ = new(big.Int).SetString("00000000000000000000000000000000000000000000000000000005", 16) + secp224k1.Gx, _ = new(big.Int).SetString("A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", 16) + secp224k1.Gy, _ = new(big.Int).SetString("7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", 16) + secp224k1.BitSize = 224 +} + +func initS256() { + // See SEC 2 section 2.7.1 + secp256k1 = new(BitCurve) + secp256k1.Name = "secp256k1" + secp256k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16) + secp256k1.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16) + secp256k1.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000000000000000000000000000007", 16) + secp256k1.Gx, _ = new(big.Int).SetString("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16) + secp256k1.Gy, _ = new(big.Int).SetString("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16) + secp256k1.BitSize = 256 +} + +// S160 returns a BitCurve which implements secp160k1 (see SEC 2 section 2.4.1) +func S160() *BitCurve { + initonce.Do(initAll) + return secp160k1 +} + +// S192 returns a BitCurve which implements secp192k1 (see SEC 2 section 2.5.1) +func S192() *BitCurve { + initonce.Do(initAll) + return secp192k1 +} + +// S224 returns a BitCurve which implements secp224k1 (see SEC 2 section 2.6.1) +func S224() *BitCurve { + initonce.Do(initAll) + return secp224k1 +} + +// S256 returns a BitCurve which implements bitcurves (see SEC 2 section 2.7.1) +func S256() *BitCurve { + initonce.Do(initAll) + return secp256k1 +} diff --git a/vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go b/vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go new file mode 100644 index 0000000000..77fb8b9a04 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go @@ -0,0 +1,134 @@ +// Package brainpool implements Brainpool elliptic curves. +// Implementation of rcurves is from github.com/ebfe/brainpool +// Note that these curves are implemented with naive, non-constant time operations +// and are likely not suitable for enviroments where timing attacks are a concern. +package brainpool + +import ( + "crypto/elliptic" + "math/big" + "sync" +) + +var ( + once sync.Once + p256t1, p384t1, p512t1 *elliptic.CurveParams + p256r1, p384r1, p512r1 *rcurve +) + +func initAll() { + initP256t1() + initP384t1() + initP512t1() + initP256r1() + initP384r1() + initP512r1() +} + +func initP256t1() { + p256t1 = &elliptic.CurveParams{Name: "brainpoolP256t1"} + p256t1.P, _ = new(big.Int).SetString("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", 16) + p256t1.N, _ = new(big.Int).SetString("A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", 16) + p256t1.B, _ = new(big.Int).SetString("662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04", 16) + p256t1.Gx, _ = new(big.Int).SetString("A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4", 16) + p256t1.Gy, _ = new(big.Int).SetString("2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE", 16) + p256t1.BitSize = 256 +} + +func initP256r1() { + twisted := p256t1 + params := &elliptic.CurveParams{ + Name: "brainpoolP256r1", + P: twisted.P, + N: twisted.N, + BitSize: twisted.BitSize, + } + params.Gx, _ = new(big.Int).SetString("8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262", 16) + params.Gy, _ = new(big.Int).SetString("547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", 16) + z, _ := new(big.Int).SetString("3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0", 16) + p256r1 = newrcurve(twisted, params, z) +} + +func initP384t1() { + p384t1 = &elliptic.CurveParams{Name: "brainpoolP384t1"} + p384t1.P, _ = new(big.Int).SetString("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", 16) + p384t1.N, _ = new(big.Int).SetString("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", 16) + p384t1.B, _ = new(big.Int).SetString("7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE", 16) + p384t1.Gx, _ = new(big.Int).SetString("18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC", 16) + p384t1.Gy, _ = new(big.Int).SetString("25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928", 16) + p384t1.BitSize = 384 +} + +func initP384r1() { + twisted := p384t1 + params := &elliptic.CurveParams{ + Name: "brainpoolP384r1", + P: twisted.P, + N: twisted.N, + BitSize: twisted.BitSize, + } + params.Gx, _ = new(big.Int).SetString("1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E", 16) + params.Gy, _ = new(big.Int).SetString("8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315", 16) + z, _ := new(big.Int).SetString("41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE97D2D63DBC87BCCDDCCC5DA39E8589291C", 16) + p384r1 = newrcurve(twisted, params, z) +} + +func initP512t1() { + p512t1 = &elliptic.CurveParams{Name: "brainpoolP512t1"} + p512t1.P, _ = new(big.Int).SetString("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", 16) + p512t1.N, _ = new(big.Int).SetString("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", 16) + p512t1.B, _ = new(big.Int).SetString("7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E", 16) + p512t1.Gx, _ = new(big.Int).SetString("640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA", 16) + p512t1.Gy, _ = new(big.Int).SetString("5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332", 16) + p512t1.BitSize = 512 +} + +func initP512r1() { + twisted := p512t1 + params := &elliptic.CurveParams{ + Name: "brainpoolP512r1", + P: twisted.P, + N: twisted.N, + BitSize: twisted.BitSize, + } + params.Gx, _ = new(big.Int).SetString("81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822", 16) + params.Gy, _ = new(big.Int).SetString("7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892", 16) + z, _ := new(big.Int).SetString("12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB", 16) + p512r1 = newrcurve(twisted, params, z) +} + +// P256t1 returns a Curve which implements Brainpool P256t1 (see RFC 5639, section 3.4) +func P256t1() elliptic.Curve { + once.Do(initAll) + return p256t1 +} + +// P256r1 returns a Curve which implements Brainpool P256r1 (see RFC 5639, section 3.4) +func P256r1() elliptic.Curve { + once.Do(initAll) + return p256r1 +} + +// P384t1 returns a Curve which implements Brainpool P384t1 (see RFC 5639, section 3.6) +func P384t1() elliptic.Curve { + once.Do(initAll) + return p384t1 +} + +// P384r1 returns a Curve which implements Brainpool P384r1 (see RFC 5639, section 3.6) +func P384r1() elliptic.Curve { + once.Do(initAll) + return p384r1 +} + +// P512t1 returns a Curve which implements Brainpool P512t1 (see RFC 5639, section 3.7) +func P512t1() elliptic.Curve { + once.Do(initAll) + return p512t1 +} + +// P512r1 returns a Curve which implements Brainpool P512r1 (see RFC 5639, section 3.7) +func P512r1() elliptic.Curve { + once.Do(initAll) + return p512r1 +} diff --git a/vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go b/vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go new file mode 100644 index 0000000000..2d5355085f --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go @@ -0,0 +1,83 @@ +package brainpool + +import ( + "crypto/elliptic" + "math/big" +) + +var _ elliptic.Curve = (*rcurve)(nil) + +type rcurve struct { + twisted elliptic.Curve + params *elliptic.CurveParams + z *big.Int + zinv *big.Int + z2 *big.Int + z3 *big.Int + zinv2 *big.Int + zinv3 *big.Int +} + +var ( + two = big.NewInt(2) + three = big.NewInt(3) +) + +func newrcurve(twisted elliptic.Curve, params *elliptic.CurveParams, z *big.Int) *rcurve { + zinv := new(big.Int).ModInverse(z, params.P) + return &rcurve{ + twisted: twisted, + params: params, + z: z, + zinv: zinv, + z2: new(big.Int).Exp(z, two, params.P), + z3: new(big.Int).Exp(z, three, params.P), + zinv2: new(big.Int).Exp(zinv, two, params.P), + zinv3: new(big.Int).Exp(zinv, three, params.P), + } +} + +func (curve *rcurve) toTwisted(x, y *big.Int) (*big.Int, *big.Int) { + var tx, ty big.Int + tx.Mul(x, curve.z2) + tx.Mod(&tx, curve.params.P) + ty.Mul(y, curve.z3) + ty.Mod(&ty, curve.params.P) + return &tx, &ty +} + +func (curve *rcurve) fromTwisted(tx, ty *big.Int) (*big.Int, *big.Int) { + var x, y big.Int + x.Mul(tx, curve.zinv2) + x.Mod(&x, curve.params.P) + y.Mul(ty, curve.zinv3) + y.Mod(&y, curve.params.P) + return &x, &y +} + +func (curve *rcurve) Params() *elliptic.CurveParams { + return curve.params +} + +func (curve *rcurve) IsOnCurve(x, y *big.Int) bool { + return curve.twisted.IsOnCurve(curve.toTwisted(x, y)) +} + +func (curve *rcurve) Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int) { + tx1, ty1 := curve.toTwisted(x1, y1) + tx2, ty2 := curve.toTwisted(x2, y2) + return curve.fromTwisted(curve.twisted.Add(tx1, ty1, tx2, ty2)) +} + +func (curve *rcurve) Double(x1, y1 *big.Int) (x, y *big.Int) { + return curve.fromTwisted(curve.twisted.Double(curve.toTwisted(x1, y1))) +} + +func (curve *rcurve) ScalarMult(x1, y1 *big.Int, scalar []byte) (x, y *big.Int) { + tx1, ty1 := curve.toTwisted(x1, y1) + return curve.fromTwisted(curve.twisted.ScalarMult(tx1, ty1, scalar)) +} + +func (curve *rcurve) ScalarBaseMult(scalar []byte) (x, y *big.Int) { + return curve.fromTwisted(curve.twisted.ScalarBaseMult(scalar)) +} \ No newline at end of file diff --git a/vendor/github.com/ProtonMail/go-crypto/eax/eax.go b/vendor/github.com/ProtonMail/go-crypto/eax/eax.go new file mode 100644 index 0000000000..6b6bc7aed0 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/eax/eax.go @@ -0,0 +1,162 @@ +// Copyright (C) 2019 ProtonTech AG + +// Package eax provides an implementation of the EAX +// (encrypt-authenticate-translate) mode of operation, as described in +// Bellare, Rogaway, and Wagner "THE EAX MODE OF OPERATION: A TWO-PASS +// AUTHENTICATED-ENCRYPTION SCHEME OPTIMIZED FOR SIMPLICITY AND EFFICIENCY." +// In FSE'04, volume 3017 of LNCS, 2004 +package eax + +import ( + "crypto/cipher" + "crypto/subtle" + "errors" + "github.com/ProtonMail/go-crypto/internal/byteutil" +) + +const ( + defaultTagSize = 16 + defaultNonceSize = 16 +) + +type eax struct { + block cipher.Block // Only AES-{128, 192, 256} supported + tagSize int // At least 12 bytes recommended + nonceSize int +} + +func (e *eax) NonceSize() int { + return e.nonceSize +} + +func (e *eax) Overhead() int { + return e.tagSize +} + +// NewEAX returns an EAX instance with AES-{KEYLENGTH} and default nonce and +// tag lengths. Supports {128, 192, 256}- bit key length. +func NewEAX(block cipher.Block) (cipher.AEAD, error) { + return NewEAXWithNonceAndTagSize(block, defaultNonceSize, defaultTagSize) +} + +// NewEAXWithNonceAndTagSize returns an EAX instance with AES-{keyLength} and +// given nonce and tag lengths in bytes. Panics on zero nonceSize and +// exceedingly long tags. +// +// It is recommended to use at least 12 bytes as tag length (see, for instance, +// NIST SP 800-38D). +// +// Only to be used for compatibility with existing cryptosystems with +// non-standard parameters. For all other cases, prefer NewEAX. +func NewEAXWithNonceAndTagSize( + block cipher.Block, nonceSize, tagSize int) (cipher.AEAD, error) { + if nonceSize < 1 { + return nil, eaxError("Cannot initialize EAX with nonceSize = 0") + } + if tagSize > block.BlockSize() { + return nil, eaxError("Custom tag length exceeds blocksize") + } + return &eax{ + block: block, + tagSize: tagSize, + nonceSize: nonceSize, + }, nil +} + +func (e *eax) Seal(dst, nonce, plaintext, adata []byte) []byte { + if len(nonce) > e.nonceSize { + panic("crypto/eax: Nonce too long for this instance") + } + ret, out := byteutil.SliceForAppend(dst, len(plaintext) + e.tagSize) + omacNonce := e.omacT(0, nonce) + omacAdata := e.omacT(1, adata) + + // Encrypt message using CTR mode and omacNonce as IV + ctr := cipher.NewCTR(e.block, omacNonce) + ciphertextData := out[:len(plaintext)] + ctr.XORKeyStream(ciphertextData, plaintext) + + omacCiphertext := e.omacT(2, ciphertextData) + + tag := out[len(plaintext):] + for i := 0; i < e.tagSize; i++ { + tag[i] = omacCiphertext[i] ^ omacNonce[i] ^ omacAdata[i] + } + return ret +} + +func (e* eax) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) { + if len(nonce) > e.nonceSize { + panic("crypto/eax: Nonce too long for this instance") + } + if len(ciphertext) < e.tagSize { + return nil, eaxError("Ciphertext shorter than tag length") + } + sep := len(ciphertext) - e.tagSize + + // Compute tag + omacNonce := e.omacT(0, nonce) + omacAdata := e.omacT(1, adata) + omacCiphertext := e.omacT(2, ciphertext[:sep]) + + tag := make([]byte, e.tagSize) + for i := 0; i < e.tagSize; i++ { + tag[i] = omacCiphertext[i] ^ omacNonce[i] ^ omacAdata[i] + } + + // Compare tags + if subtle.ConstantTimeCompare(ciphertext[sep:], tag) != 1 { + return nil, eaxError("Tag authentication failed") + } + + // Decrypt ciphertext + ret, out := byteutil.SliceForAppend(dst, len(ciphertext)) + ctr := cipher.NewCTR(e.block, omacNonce) + ctr.XORKeyStream(out, ciphertext[:sep]) + + return ret[:sep], nil +} + +// Tweakable OMAC - Calls OMAC_K([t]_n || plaintext) +func (e *eax) omacT(t byte, plaintext []byte) []byte { + blockSize := e.block.BlockSize() + byteT := make([]byte, blockSize) + byteT[blockSize-1] = t + concat := append(byteT, plaintext...) + return e.omac(concat) +} + +func (e *eax) omac(plaintext []byte) []byte { + blockSize := e.block.BlockSize() + // L ← E_K(0^n); B ← 2L; P ← 4L + L := make([]byte, blockSize) + e.block.Encrypt(L, L) + B := byteutil.GfnDouble(L) + P := byteutil.GfnDouble(B) + + // CBC with IV = 0 + cbc := cipher.NewCBCEncrypter(e.block, make([]byte, blockSize)) + padded := e.pad(plaintext, B, P) + cbcCiphertext := make([]byte, len(padded)) + cbc.CryptBlocks(cbcCiphertext, padded) + + return cbcCiphertext[len(cbcCiphertext)-blockSize:] +} + +func (e *eax) pad(plaintext, B, P []byte) []byte { + // if |M| in {n, 2n, 3n, ...} + blockSize := e.block.BlockSize() + if len(plaintext) != 0 && len(plaintext)%blockSize == 0 { + return byteutil.RightXor(plaintext, B) + } + + // else return (M || 1 || 0^(n−1−(|M| % n))) xor→ P + ending := make([]byte, blockSize-len(plaintext)%blockSize) + ending[0] = 0x80 + padded := append(plaintext, ending...) + return byteutil.RightXor(padded, P) +} + +func eaxError(err string) error { + return errors.New("crypto/eax: " + err) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go b/vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go new file mode 100644 index 0000000000..ddb53d0790 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go @@ -0,0 +1,58 @@ +package eax + +// Test vectors from +// https://web.cs.ucdavis.edu/~rogaway/papers/eax.pdf +var testVectors = []struct { + msg, key, nonce, header, ciphertext string +}{ + {"", + "233952DEE4D5ED5F9B9C6D6FF80FF478", + "62EC67F9C3A4A407FCB2A8C49031A8B3", + "6BFB914FD07EAE6B", + "E037830E8389F27B025A2D6527E79D01"}, + {"F7FB", + "91945D3F4DCBEE0BF45EF52255F095A4", + "BECAF043B0A23D843194BA972C66DEBD", + "FA3BFD4806EB53FA", + "19DD5C4C9331049D0BDAB0277408F67967E5"}, + {"1A47CB4933", + "01F74AD64077F2E704C0F60ADA3DD523", + "70C3DB4F0D26368400A10ED05D2BFF5E", + "234A3463C1264AC6", + "D851D5BAE03A59F238A23E39199DC9266626C40F80"}, + {"481C9E39B1", + "D07CF6CBB7F313BDDE66B727AFD3C5E8", + "8408DFFF3C1A2B1292DC199E46B7D617", + "33CCE2EABFF5A79D", + "632A9D131AD4C168A4225D8E1FF755939974A7BEDE"}, + {"40D0C07DA5E4", + "35B6D0580005BBC12B0587124557D2C2", + "FDB6B06676EEDC5C61D74276E1F8E816", + "AEB96EAEBE2970E9", + "071DFE16C675CB0677E536F73AFE6A14B74EE49844DD"}, + {"4DE3B35C3FC039245BD1FB7D", + "BD8E6E11475E60B268784C38C62FEB22", + "6EAC5C93072D8E8513F750935E46DA1B", + "D4482D1CA78DCE0F", + "835BB4F15D743E350E728414ABB8644FD6CCB86947C5E10590210A4F"}, + {"8B0A79306C9CE7ED99DAE4F87F8DD61636", + "7C77D6E813BED5AC98BAA417477A2E7D", + "1A8C98DCD73D38393B2BF1569DEEFC19", + "65D2017990D62528", + "02083E3979DA014812F59F11D52630DA30137327D10649B0AA6E1C181DB617D7F2"}, + {"1BDA122BCE8A8DBAF1877D962B8592DD2D56", + "5FFF20CAFAB119CA2FC73549E20F5B0D", + "DDE59B97D722156D4D9AFF2BC7559826", + "54B9F04E6A09189A", + "2EC47B2C4954A489AFC7BA4897EDCDAE8CC33B60450599BD02C96382902AEF7F832A"}, + {"6CF36720872B8513F6EAB1A8A44438D5EF11", + "A4A4782BCFFD3EC5E7EF6D8C34A56123", + "B781FCF2F75FA5A8DE97A9CA48E522EC", + "899A175897561D7E", + "0DE18FD0FDD91E7AF19F1D8EE8733938B1E8E7F6D2231618102FDB7FE55FF1991700"}, + {"CA40D7446E545FFAED3BD12A740A659FFBBB3CEAB7", + "8395FCF1E95BEBD697BD010BC766AAC3", + "22E7ADD93CFC6393C57EC0B3C17D6B44", + "126735FCC320D25A", + "CB8920F87A6C75CFF39627B56E3ED197C552D295A7CFC46AFC253B4652B1AF3795B124AB6E"}, +} diff --git a/vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go b/vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go new file mode 100644 index 0000000000..4eb19f28d9 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go @@ -0,0 +1,131 @@ +// These vectors include key length in {128, 192, 256}, tag size 128, and +// random nonce, header, and plaintext lengths. + +// This file was automatically generated. + +package eax + +var randomVectors = []struct { + key, nonce, header, plaintext, ciphertext string +}{ + {"DFDE093F36B0356E5A81F609786982E3", + "1D8AC604419001816905BA72B14CED7E", + "152A1517A998D7A24163FCDD146DE81AC347C8B97088F502093C1ABB8F6E33D9A219C34D7603A18B1F5ABE02E56661B7D7F67E81EC08C1302EF38D80A859486D450E94A4F26AD9E68EEBBC0C857A0FC5CF9E641D63D565A7E361BC8908F5A8DC8FD6", + "1C8EAAB71077FE18B39730A3156ADE29C5EE824C7EE86ED2A253B775603FB237116E654F6FEC588DD27F523A0E01246FE73FE348491F2A8E9ABC6CA58D663F71CDBCF4AD798BE46C42AE6EE8B599DB44A1A48D7BBBBA0F7D2750181E1C5E66967F7D57CBD30AFBDA5727", + "79E7E150934BBEBF7013F61C60462A14D8B15AF7A248AFB8A344EF021C1500E16666891D6E973D8BB56B71A371F12CA34660C4410C016982B20F547E3762A58B7BF4F20236CADCF559E2BE7D783B13723B2741FC7CDC8997D839E39A3DDD2BADB96743DD7049F1BDB0516A262869915B3F70498AFB7B191BF960"}, + {"F10619EF02E5D94D7550EB84ED364A21", + "8DC0D4F2F745BBAE835CC5574B942D20", + "FE561358F2E8DF7E1024FF1AE9A8D36EBD01352214505CB99D644777A8A1F6027FA2BDBFC529A9B91136D5F2416CFC5F0F4EC3A1AFD32BDDA23CA504C5A5CB451785FABF4DFE4CD50D817491991A60615B30286361C100A95D1712F2A45F8E374461F4CA2B", + "D7B5A971FC219631D30EFC3664AE3127D9CF3097DAD9C24AC7905D15E8D9B25B026B31D68CAE00975CDB81EB1FD96FD5E1A12E2BB83FA25F1B1D91363457657FC03875C27F2946C5", + "2F336ED42D3CC38FC61660C4CD60BA4BD438B05F5965D8B7B399D2E7167F5D34F792D318F94DB15D67463AC449E13D568CC09BFCE32A35EE3EE96A041927680AE329811811E27F2D1E8E657707AF99BA96D13A478D695D59"}, + {"429F514EFC64D98A698A9247274CFF45", + "976AA5EB072F912D126ACEBC954FEC38", + "A71D89DC5B6CEDBB7451A27C3C2CAE09126DB4C421", + "5632FE62AB1DC549D54D3BC3FC868ACCEDEFD9ECF5E9F8", + "848AE4306CA8C7F416F8707625B7F55881C0AB430353A5C967CDA2DA787F581A70E34DBEBB2385"}, + {"398138F309085F47F8457CDF53895A63", + "F8A8A7F2D28E5FFF7BBC2F24353F7A36", + "5D633C21BA7764B8855CAB586F3746E236AD486039C83C6B56EFA9C651D38A41D6B20DAEE3418BFEA44B8BD6", + "A3BBAA91920AF5E10659818B1B3B300AC79BFC129C8329E75251F73A66D3AE0128EB91D5031E0A65C329DB7D1E9C0493E268", + "D078097267606E5FB07CFB7E2B4B718172A82C6A4CEE65D549A4DFB9838003BD2FBF64A7A66988AC1A632FD88F9E9FBB57C5A78AD2E086EACBA3DB68511D81C2970A"}, + {"7A4151EBD3901B42CBA45DAFB2E931BA", + "0FC88ACEE74DD538040321C330974EB8", + "250464FB04733BAB934C59E6AD2D6AE8D662CBCFEFBE61E5A308D4211E58C4C25935B72C69107722E946BFCBF416796600542D76AEB73F2B25BF53BAF97BDEB36ED3A7A51C31E7F170EB897457E7C17571D1BA0A908954E9", + "88C41F3EBEC23FAB8A362D969CAC810FAD4F7CA6A7F7D0D44F060F92E37E1183768DD4A8C733F71C96058D362A39876D183B86C103DE", + "74A25B2182C51096D48A870D80F18E1CE15867778E34FCBA6BD7BFB3739FDCD42AD0F2D9F4EBA29085285C6048C15BCE5E5166F1F962D3337AA88E6062F05523029D0A7F0BF9"}, + {"BFB147E1CD5459424F8C0271FC0E0DC5", + "EABCC126442BF373969EA3015988CC45", + "4C0880E1D71AA2C7", + "BE1B5EC78FBF73E7A6682B21BA7E0E5D2D1C7ABE", + "5660D7C1380E2F306895B1402CB2D6C37876504276B414D120F4CF92FDDDBB293A238EA0"}, + {"595DD6F52D18BC2CA8EB4EDAA18D9FA3", + "0F84B5D36CF4BC3B863313AF3B4D2E97", + "30AE6CC5F99580F12A779D98BD379A60948020C0B6FBD5746B30BA3A15C6CD33DAF376C70A9F15B6C0EB410A93161F7958AE23", + "8EF3687A1642B070970B0B91462229D1D76ABC154D18211F7152AA9FF368", + "317C1DDB11417E5A9CC4DDE7FDFF6659A5AC4B31DE025212580A05CDAC6024D3E4AE7C2966E52B9129E9ECDBED86"}, + {"44E6F2DC8FDC778AD007137D11410F50", + "270A237AD977F7187AA6C158A0BAB24F", + "509B0F0EB12E2AA5C5BA2DE553C07FAF4CE0C9E926531AA709A3D6224FCB783ACCF1559E10B1123EBB7D52E8AB54E6B5352A9ED0D04124BF0E9D9BACFD7E32B817B2E625F5EE94A64EDE9E470DE7FE6886C19B294F9F828209FE257A78", + "8B3D7815DF25618A5D0C55A601711881483878F113A12EC36CF64900549A3199555528559DC118F789788A55FAFD944E6E99A9CA3F72F238CD3F4D88223F7A745992B3FAED1848", + "1CC00D79F7AD82FDA71B58D286E5F34D0CC4CEF30704E771CC1E50746BDF83E182B078DB27149A42BAE619DF0F85B0B1090AD55D3B4471B0D6F6ECCD09C8F876B30081F0E7537A9624F8AAF29DA85E324122EFB4D68A56"}, + {"BB7BC352A03044B4428D8DBB4B0701FDEC4649FD17B81452", + "8B4BBE26CCD9859DCD84884159D6B0A4", + "2212BEB0E78E0F044A86944CF33C8D5C80D9DBE1034BF3BCF73611835C7D3A52F5BD2D81B68FD681B68540A496EE5DA16FD8AC8824E60E1EC2042BE28FB0BFAD4E4B03596446BDD8C37D936D9B3D5295BE19F19CF5ACE1D33A46C952CE4DE5C12F92C1DD051E04AEED", + "9037234CC44FFF828FABED3A7084AF40FA7ABFF8E0C0EFB57A1CC361E18FC4FAC1AB54F3ABFE9FF77263ACE16C3A", + "A9391B805CCD956081E0B63D282BEA46E7025126F1C1631239C33E92AA6F92CD56E5A4C56F00FF9658E93D48AF4EF0EF81628E34AD4DB0CDAEDCD2A17EE7"}, + {"99C0AD703196D2F60A74E6B378B838B31F82EA861F06FC4E", + "92745C018AA708ECFEB1667E9F3F1B01", + "828C69F376C0C0EC651C67749C69577D589EE39E51404D80EBF70C8660A8F5FD375473F4A7C611D59CB546A605D67446CE2AA844135FCD78BB5FBC90222A00D42920BB1D7EEDFB0C4672554F583EF23184F89063CDECBE482367B5F9AF3ACBC3AF61392BD94CBCD9B64677", + "A879214658FD0A5B0E09836639BF82E05EC7A5EF71D4701934BDA228435C68AC3D5CEB54997878B06A655EEACEFB1345C15867E7FE6C6423660C8B88DF128EBD6BCD85118DBAE16E9252FFB204324E5C8F38CA97759BDBF3CB0083", + "51FE87996F194A2585E438B023B345439EA60D1AEBED4650CDAF48A4D4EEC4FC77DC71CC4B09D3BEEF8B7B7AF716CE2B4EFFB3AC9E6323C18AC35E0AA6E2BBBC8889490EB6226C896B0D105EAB42BFE7053CCF00ED66BA94C1BA09A792AA873F0C3B26C5C5F9A936E57B25"}, + {"7086816D00D648FB8304AA8C9E552E1B69A9955FB59B25D1", + "0F45CF7F0BF31CCEB85D9DA10F4D749F", + "93F27C60A417D9F0669E86ACC784FC8917B502DAF30A6338F11B30B94D74FEFE2F8BE1BBE2EAD10FAB7EED3C6F72B7C3ECEE1937C32ED4970A6404E139209C05", + "877F046601F3CBE4FB1491943FA29487E738F94B99AF206262A1D6FF856C9AA0B8D4D08A54370C98F8E88FA3DCC2B14C1F76D71B2A4C7963AEE8AF960464C5BEC8357AD00DC8", + "FE96906B895CE6A8E72BC72344E2C8BB3C63113D70EAFA26C299BAFE77A8A6568172EB447FB3E86648A0AF3512DEB1AAC0819F3EC553903BF28A9FB0F43411237A774BF9EE03E445D280FBB9CD12B9BAAB6EF5E52691"}, + {"062F65A896D5BF1401BADFF70E91B458E1F9BD4888CB2E4D", + "5B11EA1D6008EBB41CF892FCA5B943D1", + "BAF4FF5C8242", + "A8870E091238355984EB2F7D61A865B9170F440BFF999A5993DD41A10F4440D21FF948DDA2BF663B2E03AC3324492DC5E40262ECC6A65C07672353BE23E7FB3A9D79FF6AA38D97960905A38DECC312CB6A59E5467ECF06C311CD43ADC0B543EDF34FE8BE611F176460D5627CA51F8F8D9FED71F55C", + "B10E127A632172CF8AA7539B140D2C9C2590E6F28C3CB892FC498FCE56A34F732FBFF32E79C7B9747D9094E8635A0C084D6F0247F9768FB5FF83493799A9BEC6C39572120C40E9292C8C947AE8573462A9108C36D9D7112E6995AE5867E6C8BB387D1C5D4BEF524F391B9FD9F0A3B4BFA079E915BCD920185CFD38D114C558928BD7D47877"}, + {"38A8E45D6D705A11AF58AED5A1344896998EACF359F2E26A", + "FD82B5B31804FF47D44199B533D0CF84", + "DE454D4E62FE879F2050EE3E25853623D3E9AC52EEC1A1779A48CFAF5ECA0BFDE44749391866D1", + "B804", + "164BB965C05EBE0931A1A63293EDF9C38C27"}, + {"34C33C97C6D7A0850DA94D78A58DC61EC717CD7574833068", + "343BE00DA9483F05C14F2E9EB8EA6AE8", + "78312A43EFDE3CAE34A65796FF059A3FE15304EEA5CF1D9306949FE5BF3349D4977D4EBE76C040FE894C5949E4E4D6681153DA87FB9AC5062063CA2EA183566343362370944CE0362D25FC195E124FD60E8682E665D13F2229DDA3E4B2CB1DCA", + "CC11BB284B1153578E4A5ED9D937B869DAF00F5B1960C23455CA9CC43F486A3BE0B66254F1041F04FDF459C8640465B6E1D2CF899A381451E8E7FCB50CF87823BE77E24B132BBEEDC72E53369B275E1D8F49ECE59F4F215230AC4FE133FC80E4F634EE80BA4682B62C86", + "E7F703DC31A95E3A4919FF957836CB76C063D81702AEA4703E1C2BF30831E58C4609D626EC6810E12EAA5B930F049FF9EFC22C3E3F1EBD4A1FB285CB02A1AC5AD46B425199FC0A85670A5C4E3DAA9636C8F64C199F42F18AAC8EA7457FD377F322DD7752D7D01B946C8F0A97E6113F0D50106F319AFD291AAACE"}, + {"C6ECF7F053573E403E61B83052A343D93CBCC179D1E835BE", + "E280E13D7367042E3AA09A80111B6184", + "21486C9D7A9647", + "5F2639AFA6F17931853791CD8C92382BBB677FD72D0AB1A080D0E49BFAA21810E963E4FACD422E92F65CBFAD5884A60CD94740DF31AF02F95AA57DA0C4401B0ED906", + "5C51DB20755302070C45F52E50128A67C8B2E4ED0EACB7E29998CCE2E8C289DD5655913EC1A51CC3AABE5CDC2402B2BE7D6D4BF6945F266FBD70BA9F37109067157AE7530678B45F64475D4EBFCB5FFF46A5"}, + {"5EC6CF7401BC57B18EF154E8C38ACCA8959E57D2F3975FF5", + "656B41CB3F9CF8C08BAD7EBFC80BD225", + "6B817C2906E2AF425861A7EF59BA5801F143EE2A139EE72697CDE168B4", + "2C0E1DDC9B1E5389BA63845B18B1F8A1DB062037151BCC56EF7C21C0BB4DAE366636BBA975685D7CC5A94AFBE89C769016388C56FB7B57CE750A12B718A8BDCF70E80E8659A8330EFC8F86640F21735E8C80E23FE43ABF23507CE3F964AE4EC99D", + "ED780CF911E6D1AA8C979B889B0B9DC1ABE261832980BDBFB576901D9EF5AB8048998E31A15BE54B3E5845A4D136AD24D0BDA1C3006168DF2F8AC06729CB0818867398150020131D8F04EDF1923758C9EABB5F735DE5EA1758D4BC0ACFCA98AFD202E9839B8720253693B874C65586C6F0"}, + {"C92F678EB2208662F5BCF3403EC05F5961E957908A3E79421E1D25FC19054153", + "DA0F3A40983D92F2D4C01FED33C7A192", + "2B6E9D26DB406A0FAB47608657AA10EFC2B4AA5F459B29FF85AC9A40BFFE7AEB04F77E9A11FAAA116D7F6D4DA417671A9AB02C588E0EF59CB1BFB4B1CC931B63A3B3A159FCEC97A04D1E6F0C7E6A9CEF6B0ABB04758A69F1FE754DF4C2610E8C46B6CF413BDB31351D55BEDCB7B4A13A1C98E10984475E0F2F957853", + "F37326A80E08", + "83519E53E321D334F7C10B568183775C0E9AAE55F806"}, + {"6847E0491BE57E72995D186D50094B0B3593957A5146798FCE68B287B2FB37B5", + "3EE1182AEBB19A02B128F28E1D5F7F99", + "D9F35ABB16D776CE", + "DB7566ED8EA95BDF837F23DB277BAFBC5E70D1105ADFD0D9EF15475051B1EF94709C67DCA9F8D5", + "2CDCED0C9EBD6E2A508822A685F7DCD1CDD99E7A5FCA786C234E7F7F1D27EC49751AD5DCFA30C5EDA87C43CAE3B919B6BBCFE34C8EDA59"}, + {"82B019673642C08388D3E42075A4D5D587558C229E4AB8F660E37650C4C41A0A", + "336F5D681E0410FAE7B607246092C6DC", + "D430CBD8FE435B64214E9E9CDC5DE99D31CFCFB8C10AA0587A49DF276611", + "998404153AD77003E1737EDE93ED79859EE6DCCA93CB40C4363AA817ABF2DBBD46E42A14A7183B6CC01E12A577888141363D0AE011EB6E8D28C0B235", + "9BEF69EEB60BD3D6065707B7557F25292A8872857CFBD24F2F3C088E4450995333088DA50FD9121221C504DF1D0CD5EFE6A12666C5D5BB12282CF4C19906E9CFAB97E9BDF7F49DC17CFC384B"}, + {"747B2E269B1859F0622C15C8BAD6A725028B1F94B8DB7326948D1E6ED663A8BC", + "AB91F7245DDCE3F1C747872D47BE0A8A", + "3B03F786EF1DDD76E1D42646DA4CD2A5165DC5383CE86D1A0B5F13F910DC278A4E451EE0192CBA178E13B3BA27FDC7840DF73D2E104B", + "6B803F4701114F3E5FE21718845F8416F70F626303F545BE197189E0A2BA396F37CE06D389EB2658BC7D56D67868708F6D0D32", + "1570DDB0BCE75AA25D1957A287A2C36B1A5F2270186DA81BA6112B7F43B0F3D1D0ED072591DCF1F1C99BBB25621FC39B896FF9BD9413A2845363A9DCD310C32CF98E57"}, + {"02E59853FB29AEDA0FE1C5F19180AD99A12FF2F144670BB2B8BADF09AD812E0A", + "C691294EF67CD04D1B9242AF83DD1421", + "879334DAE3", + "1E17F46A98FEF5CBB40759D95354", + "FED8C3FF27DDF6313AED444A2985B36CBA268AAD6AAC563C0BA28F6DB5DB"}, + {"F6C1FB9B4188F2288FF03BD716023198C3582CF2A037FC2F29760916C2B7FCDB", + "4228DA0678CA3534588859E77DFF014C", + "D8153CAF35539A61DD8D05B3C9B44F01E564FB9348BCD09A1C23B84195171308861058F0A3CD2A55B912A3AAEE06FF4D356C77275828F2157C2FC7C115DA39E443210CCC56BEDB0CC99BBFB227ABD5CC454F4E7F547C7378A659EEB6A7E809101A84F866503CB18D4484E1FA09B3EC7FC75EB2E35270800AA7", + "23B660A779AD285704B12EC1C580387A47BEC7B00D452C6570", + "5AA642BBABA8E49849002A2FAF31DB8FC7773EFDD656E469CEC19B3206D4174C9A263D0A05484261F6"}, + {"8FF6086F1FADB9A3FBE245EAC52640C43B39D43F89526BB5A6EBA47710931446", + "943188480C99437495958B0AE4831AA9", + "AD5CD0BDA426F6EBA23C8EB23DC73FF9FEC173355EDBD6C9344C4C4383F211888F7CE6B29899A6801DF6B38651A7C77150941A", + "80CD5EA8D7F81DDF5070B934937912E8F541A5301877528EB41AB60C020968D459960ED8FB73083329841A", + "ABAE8EB7F36FCA2362551E72DAC890BA1BB6794797E0FC3B67426EC9372726ED4725D379EA0AC9147E48DCD0005C502863C2C5358A38817C8264B5"}, + {"A083B54E6B1FE01B65D42FCD248F97BB477A41462BBFE6FD591006C022C8FD84", + "B0490F5BD68A52459556B3749ACDF40E", + "8892E047DA5CFBBDF7F3CFCBD1BD21C6D4C80774B1826999234394BD3E513CC7C222BB40E1E3140A152F19B3802F0D036C24A590512AD0E8", + "D7B15752789DC94ED0F36778A5C7BBB207BEC32BAC66E702B39966F06E381E090C6757653C3D26A81EC6AD6C364D66867A334C91BB0B8A8A4B6EACDF0783D09010AEBA2DD2062308FE99CC1F", + "C071280A732ADC93DF272BF1E613B2BB7D46FC6665EF2DC1671F3E211D6BDE1D6ADDD28DF3AA2E47053FC8BB8AE9271EC8BC8B2CFFA320D225B451685B6D23ACEFDD241FE284F8ADC8DB07F456985B14330BBB66E0FB212213E05B3E"}, +} diff --git a/vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go b/vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go new file mode 100644 index 0000000000..a6bdf51232 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go @@ -0,0 +1,92 @@ +// Copyright (C) 2019 ProtonTech AG +// This file contains necessary tools for the aex and ocb packages. +// +// These functions SHOULD NOT be used elsewhere, since they are optimized for +// specific input nature in the EAX and OCB modes of operation. + +package byteutil + +// GfnDouble computes 2 * input in the field of 2^n elements. +// The irreducible polynomial in the finite field for n=128 is +// x^128 + x^7 + x^2 + x + 1 (equals 0x87) +// Constant-time execution in order to avoid side-channel attacks +func GfnDouble(input []byte) []byte { + if len(input) != 16 { + panic("Doubling in GFn only implemented for n = 128") + } + // If the first bit is zero, return 2L = L << 1 + // Else return (L << 1) xor 0^120 10000111 + shifted := ShiftBytesLeft(input) + shifted[15] ^= ((input[0] >> 7) * 0x87) + return shifted +} + +// ShiftBytesLeft outputs the byte array corresponding to x << 1 in binary. +func ShiftBytesLeft(x []byte) []byte { + l := len(x) + dst := make([]byte, l) + for i := 0; i < l-1; i++ { + dst[i] = (x[i] << 1) | (x[i+1] >> 7) + } + dst[l-1] = x[l-1] << 1 + return dst +} + +// ShiftNBytesLeft puts in dst the byte array corresponding to x << n in binary. +func ShiftNBytesLeft(dst, x []byte, n int) { + // Erase first n / 8 bytes + copy(dst, x[n/8:]) + + // Shift the remaining n % 8 bits + bits := uint(n % 8) + l := len(dst) + for i := 0; i < l-1; i++ { + dst[i] = (dst[i] << bits) | (dst[i+1] >> uint(8 - bits)) + } + dst[l-1] = dst[l-1] << bits + + // Append trailing zeroes + dst = append(dst, make([]byte, n/8)...) +} + +// XorBytesMut assumes equal input length, replaces X with X XOR Y +func XorBytesMut(X, Y []byte) { + for i := 0; i < len(X); i++ { + X[i] ^= Y[i] + } +} + + +// XorBytes assumes equal input length, puts X XOR Y into Z +func XorBytes(Z, X, Y []byte) { + for i := 0; i < len(X); i++ { + Z[i] = X[i] ^ Y[i] + } +} + +// RightXor XORs smaller input (assumed Y) at the right of the larger input (assumed X) +func RightXor(X, Y []byte) []byte { + offset := len(X) - len(Y) + xored := make([]byte, len(X)); + copy(xored, X) + for i := 0; i < len(Y); i++ { + xored[offset + i] ^= Y[i] + } + return xored +} + +// SliceForAppend takes a slice and a requested number of bytes. It returns a +// slice with the contents of the given slice followed by that many bytes and a +// second slice that aliases into it and contains only the extra bytes. If the +// original slice has sufficient capacity then no allocation is performed. +func SliceForAppend(in []byte, n int) (head, tail []byte) { + if total := len(in) + n; cap(in) >= total { + head = in[:total] + } else { + head = make([]byte, total) + copy(head, in) + } + tail = head[len(in):] + return +} + diff --git a/vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go b/vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go new file mode 100644 index 0000000000..7f78cfa759 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go @@ -0,0 +1,317 @@ +// Copyright (C) 2019 ProtonTech AG + +// Package ocb provides an implementation of the OCB (offset codebook) mode of +// operation, as described in RFC-7253 of the IRTF and in Rogaway, Bellare, +// Black and Krovetz - OCB: A BLOCK-CIPHER MODE OF OPERATION FOR EFFICIENT +// AUTHENTICATED ENCRYPTION (2003). +// Security considerations (from RFC-7253): A private key MUST NOT be used to +// encrypt more than 2^48 blocks. Tag length should be at least 12 bytes (a +// brute-force forging adversary succeeds after 2^{tag length} attempts). A +// single key SHOULD NOT be used to decrypt ciphertext with different tag +// lengths. Nonces need not be secret, but MUST NOT be reused. +// This package only supports underlying block ciphers with 128-bit blocks, +// such as AES-{128, 192, 256}, but may be extended to other sizes. +package ocb + +import ( + "bytes" + "crypto/cipher" + "crypto/subtle" + "errors" + "github.com/ProtonMail/go-crypto/internal/byteutil" + "math/bits" +) + +type ocb struct { + block cipher.Block + tagSize int + nonceSize int + mask mask + // Optimized en/decrypt: For each nonce N used to en/decrypt, the 'Ktop' + // internal variable can be reused for en/decrypting with nonces sharing + // all but the last 6 bits with N. The prefix of the first nonce used to + // compute the new Ktop, and the Ktop value itself, are stored in + // reusableKtop. If using incremental nonces, this saves one block cipher + // call every 63 out of 64 OCB encryptions, and stores one nonce and one + // output of the block cipher in memory only. + reusableKtop reusableKtop +} + +type mask struct { + // L_*, L_$, (L_i)_{i ∈ N} + lAst []byte + lDol []byte + L [][]byte +} + +type reusableKtop struct { + noncePrefix []byte + Ktop []byte +} + +const ( + defaultTagSize = 16 + defaultNonceSize = 15 +) + +const ( + enc = iota + dec +) + +func (o *ocb) NonceSize() int { + return o.nonceSize +} + +func (o *ocb) Overhead() int { + return o.tagSize +} + +// NewOCB returns an OCB instance with the given block cipher and default +// tag and nonce sizes. +func NewOCB(block cipher.Block) (cipher.AEAD, error) { + return NewOCBWithNonceAndTagSize(block, defaultNonceSize, defaultTagSize) +} + +// NewOCBWithNonceAndTagSize returns an OCB instance with the given block +// cipher, nonce length, and tag length. Panics on zero nonceSize and +// exceedingly long tag size. +// +// It is recommended to use at least 12 bytes as tag length. +func NewOCBWithNonceAndTagSize( + block cipher.Block, nonceSize, tagSize int) (cipher.AEAD, error) { + if block.BlockSize() != 16 { + return nil, ocbError("Block cipher must have 128-bit blocks") + } + if nonceSize < 1 { + return nil, ocbError("Incorrect nonce length") + } + if nonceSize >= block.BlockSize() { + return nil, ocbError("Nonce length exceeds blocksize - 1") + } + if tagSize > block.BlockSize() { + return nil, ocbError("Custom tag length exceeds blocksize") + } + return &ocb{ + block: block, + tagSize: tagSize, + nonceSize: nonceSize, + mask: initializeMaskTable(block), + reusableKtop: reusableKtop{ + noncePrefix: nil, + Ktop: nil, + }, + }, nil +} + +func (o *ocb) Seal(dst, nonce, plaintext, adata []byte) []byte { + if len(nonce) > o.nonceSize { + panic("crypto/ocb: Incorrect nonce length given to OCB") + } + ret, out := byteutil.SliceForAppend(dst, len(plaintext)+o.tagSize) + o.crypt(enc, out, nonce, adata, plaintext) + return ret +} + +func (o *ocb) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) { + if len(nonce) > o.nonceSize { + panic("Nonce too long for this instance") + } + if len(ciphertext) < o.tagSize { + return nil, ocbError("Ciphertext shorter than tag length") + } + sep := len(ciphertext) - o.tagSize + ret, out := byteutil.SliceForAppend(dst, len(ciphertext)) + ciphertextData := ciphertext[:sep] + tag := ciphertext[sep:] + o.crypt(dec, out, nonce, adata, ciphertextData) + if subtle.ConstantTimeCompare(ret[sep:], tag) == 1 { + ret = ret[:sep] + return ret, nil + } + for i := range out { + out[i] = 0 + } + return nil, ocbError("Tag authentication failed") +} + +// On instruction enc (resp. dec), crypt is the encrypt (resp. decrypt) +// function. It returns the resulting plain/ciphertext with the tag appended. +func (o *ocb) crypt(instruction int, Y, nonce, adata, X []byte) []byte { + // + // Consider X as a sequence of 128-bit blocks + // + // Note: For encryption (resp. decryption), X is the plaintext (resp., the + // ciphertext without the tag). + blockSize := o.block.BlockSize() + + // + // Nonce-dependent and per-encryption variables + // + // Zero out the last 6 bits of the nonce into truncatedNonce to see if Ktop + // is already computed. + truncatedNonce := make([]byte, len(nonce)) + copy(truncatedNonce, nonce) + truncatedNonce[len(truncatedNonce)-1] &= 192 + Ktop := make([]byte, blockSize) + if bytes.Equal(truncatedNonce, o.reusableKtop.noncePrefix) { + Ktop = o.reusableKtop.Ktop + } else { + // Nonce = num2str(TAGLEN mod 128, 7) || zeros(120 - bitlen(N)) || 1 || N + paddedNonce := append(make([]byte, blockSize-1-len(nonce)), 1) + paddedNonce = append(paddedNonce, truncatedNonce...) + paddedNonce[0] |= byte(((8 * o.tagSize) % (8 * blockSize)) << 1) + // Last 6 bits of paddedNonce are already zero. Encrypt into Ktop + paddedNonce[blockSize-1] &= 192 + Ktop = paddedNonce + o.block.Encrypt(Ktop, Ktop) + o.reusableKtop.noncePrefix = truncatedNonce + o.reusableKtop.Ktop = Ktop + } + + // Stretch = Ktop || ((lower half of Ktop) XOR (lower half of Ktop << 8)) + xorHalves := make([]byte, blockSize/2) + byteutil.XorBytes(xorHalves, Ktop[:blockSize/2], Ktop[1:1+blockSize/2]) + stretch := append(Ktop, xorHalves...) + bottom := int(nonce[len(nonce)-1] & 63) + offset := make([]byte, len(stretch)) + byteutil.ShiftNBytesLeft(offset, stretch, bottom) + offset = offset[:blockSize] + + // + // Process any whole blocks + // + // Note: For encryption Y is ciphertext || tag, for decryption Y is + // plaintext || tag. + checksum := make([]byte, blockSize) + m := len(X) / blockSize + for i := 0; i < m; i++ { + index := bits.TrailingZeros(uint(i + 1)) + if len(o.mask.L)-1 < index { + o.mask.extendTable(index) + } + byteutil.XorBytesMut(offset, o.mask.L[bits.TrailingZeros(uint(i+1))]) + blockX := X[i*blockSize : (i+1)*blockSize] + blockY := Y[i*blockSize : (i+1)*blockSize] + byteutil.XorBytes(blockY, blockX, offset) + switch instruction { + case enc: + o.block.Encrypt(blockY, blockY) + byteutil.XorBytesMut(blockY, offset) + byteutil.XorBytesMut(checksum, blockX) + case dec: + o.block.Decrypt(blockY, blockY) + byteutil.XorBytesMut(blockY, offset) + byteutil.XorBytesMut(checksum, blockY) + } + } + // + // Process any final partial block and compute raw tag + // + tag := make([]byte, blockSize) + if len(X)%blockSize != 0 { + byteutil.XorBytesMut(offset, o.mask.lAst) + pad := make([]byte, blockSize) + o.block.Encrypt(pad, offset) + chunkX := X[blockSize*m:] + chunkY := Y[blockSize*m : len(X)] + byteutil.XorBytes(chunkY, chunkX, pad[:len(chunkX)]) + // P_* || bit(1) || zeroes(127) - len(P_*) + switch instruction { + case enc: + paddedY := append(chunkX, byte(128)) + paddedY = append(paddedY, make([]byte, blockSize-len(chunkX)-1)...) + byteutil.XorBytesMut(checksum, paddedY) + case dec: + paddedX := append(chunkY, byte(128)) + paddedX = append(paddedX, make([]byte, blockSize-len(chunkY)-1)...) + byteutil.XorBytesMut(checksum, paddedX) + } + byteutil.XorBytes(tag, checksum, offset) + byteutil.XorBytesMut(tag, o.mask.lDol) + o.block.Encrypt(tag, tag) + byteutil.XorBytesMut(tag, o.hash(adata)) + copy(Y[blockSize*m+len(chunkY):], tag[:o.tagSize]) + } else { + byteutil.XorBytes(tag, checksum, offset) + byteutil.XorBytesMut(tag, o.mask.lDol) + o.block.Encrypt(tag, tag) + byteutil.XorBytesMut(tag, o.hash(adata)) + copy(Y[blockSize*m:], tag[:o.tagSize]) + } + return Y +} + +// This hash function is used to compute the tag. Per design, on empty input it +// returns a slice of zeros, of the same length as the underlying block cipher +// block size. +func (o *ocb) hash(adata []byte) []byte { + // + // Consider A as a sequence of 128-bit blocks + // + A := make([]byte, len(adata)) + copy(A, adata) + blockSize := o.block.BlockSize() + + // + // Process any whole blocks + // + sum := make([]byte, blockSize) + offset := make([]byte, blockSize) + m := len(A) / blockSize + for i := 0; i < m; i++ { + chunk := A[blockSize*i : blockSize*(i+1)] + index := bits.TrailingZeros(uint(i + 1)) + // If the mask table is too short + if len(o.mask.L)-1 < index { + o.mask.extendTable(index) + } + byteutil.XorBytesMut(offset, o.mask.L[index]) + byteutil.XorBytesMut(chunk, offset) + o.block.Encrypt(chunk, chunk) + byteutil.XorBytesMut(sum, chunk) + } + + // + // Process any final partial block; compute final hash value + // + if len(A)%blockSize != 0 { + byteutil.XorBytesMut(offset, o.mask.lAst) + // Pad block with 1 || 0 ^ 127 - bitlength(a) + ending := make([]byte, blockSize-len(A)%blockSize) + ending[0] = 0x80 + encrypted := append(A[blockSize*m:], ending...) + byteutil.XorBytesMut(encrypted, offset) + o.block.Encrypt(encrypted, encrypted) + byteutil.XorBytesMut(sum, encrypted) + } + return sum +} + +func initializeMaskTable(block cipher.Block) mask { + // + // Key-dependent variables + // + lAst := make([]byte, block.BlockSize()) + block.Encrypt(lAst, lAst) + lDol := byteutil.GfnDouble(lAst) + L := make([][]byte, 1) + L[0] = byteutil.GfnDouble(lDol) + + return mask{ + lAst: lAst, + lDol: lDol, + L: L, + } +} + +// Extends the L array of mask m up to L[limit], with L[i] = GfnDouble(L[i-1]) +func (m *mask) extendTable(limit int) { + for i := len(m.L); i <= limit; i++ { + m.L = append(m.L, byteutil.GfnDouble(m.L[i-1])) + } +} + +func ocbError(err string) error { + return errors.New("crypto/ocb: " + err) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go b/vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go new file mode 100644 index 0000000000..0efaf344fd --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go @@ -0,0 +1,136 @@ +// In the test vectors provided by RFC 7253, the "bottom" +// internal variable, which defines "offset" for the first time, does not +// exceed 15. However, it can attain values up to 63. + +// These vectors include key length in {128, 192, 256}, tag size 128, and +// random nonce, header, and plaintext lengths. + +// This file was automatically generated. + +package ocb + +var randomVectors = []struct { + key, nonce, header, plaintext, ciphertext string +}{ + + {"9438C5D599308EAF13F800D2D31EA7F0", + "C38EE4801BEBFFA1CD8635BE", + "0E507B7DADD8A98CDFE272D3CB6B3E8332B56AE583FB049C0874D4200BED16BD1A044182434E9DA0E841F182DFD5B3016B34641CED0784F1745F63AB3D0DA22D3351C9EF9A658B8081E24498EBF61FCE40DA6D8E184536", + "962D227786FB8913A8BAD5DC3250", + "EEDEF5FFA5986D1E3BF86DDD33EF9ADC79DCA06E215FA772CCBA814F63AD"}, + {"BA7DE631C7D6712167C6724F5B9A2B1D", + "35263EBDA05765DC0E71F1F5", + "0103257B4224507C0242FEFE821EA7FA42E0A82863E5F8B68F7D881B4B44FA428A2B6B21D2F591260802D8AB6D83", + "9D6D1FC93AE8A64E7889B7B2E3521EFA9B920A8DDB692E6F833DDC4A38AFA535E5E2A3ED82CB7E26404AB86C54D01C4668F28398C2DF33D5D561CBA1C8DCFA7A912F5048E545B59483C0E3221F54B14DAA2E4EB657B3BEF9554F34CAD69B2724AE962D3D8A", + "E93852D1985C5E775655E937FA79CE5BF28A585F2AF53A5018853B9634BE3C84499AC0081918FDCE0624494D60E25F76ACD6853AC7576E3C350F332249BFCABD4E73CEABC36BE4EDDA40914E598AE74174A0D7442149B26990899491BDDFE8FC54D6C18E83AE9E9A6FFBF5D376565633862EEAD88D"}, + {"2E74B25289F6FD3E578C24866E9C72A5", + "FD912F15025AF8414642BA1D1D", + "FB5FB8C26F365EEDAB5FE260C6E3CCD27806729C8335F146063A7F9EA93290E56CF84576EB446350D22AD730547C267B1F0BBB97EB34E1E2C41A", + "6C092EBF78F76EE8C1C6E592277D9545BA16EDB67BC7D8480B9827702DC2F8A129E2B08A2CE710CA7E1DA45CE162BB6CD4B512E632116E2211D3C90871EFB06B8D4B902681C7FB", + "6AC0A77F26531BF4F354A1737F99E49BE32ECD909A7A71AD69352906F54B08A9CE9B8CA5D724CBFFC5673437F23F630697F3B84117A1431D6FA8CC13A974FB4AD360300522E09511B99E71065D5AC4BBCB1D791E864EF4"}, + {"E7EC507C802528F790AFF5303A017B17", + "4B97A7A568940A9E3CE7A99E93031E", + "28349BDC5A09390C480F9B8AA3EDEA3DDB8B9D64BCA322C570B8225DF0E31190DAB25A4014BA39519E02ABFB12B89AA28BBFD29E486E7FB28734258C817B63CED9912DBAFEBB93E2798AB2890DE3B0ACFCFF906AB15563EF7823CE83D27CDB251195E22BD1337BCBDE65E7C2C427321C463C2777BFE5AEAA", + "9455B3EA706B74", + "7F33BA3EA848D48A96B9530E26888F43EBD4463C9399B6"}, + {"6C928AA3224736F28EE7378DE0090191", + "8936138E2E4C6A13280017A1622D", + "6202717F2631565BDCDC57C6584543E72A7C8BD444D0D108ED35069819633C", + "DA0691439E5F035F3E455269D14FE5C201C8C9B0A3FE2D3F86BCC59387C868FE65733D388360B31E3CE28B4BF6A8BE636706B536D5720DB66B47CF1C7A5AFD6F61E0EF90F1726D6B0E169F9A768B2B7AE4EE00A17F630AC905FCAAA1B707FFF25B3A1AAE83B504837C64A5639B2A34002B300EC035C9B43654DA55", + "B8804D182AB0F0EEB464FA7BD1329AD6154F982013F3765FEDFE09E26DAC078C9C1439BFC1159D6C02A25E3FF83EF852570117B315852AD5EE20E0FA3AA0A626B0E43BC0CEA38B44579DD36803455FB46989B90E6D229F513FD727AF8372517E9488384C515D6067704119C931299A0982EDDFB9C2E86A90C450C077EB222511EC9CCABC9FCFDB19F70088"}, + {"ECEA315CA4B3F425B0C9957A17805EA4", + "664CDAE18403F4F9BA13015A44FC", + "642AFB090D6C6DB46783F08B01A3EF2A8FEB5736B531EAC226E7888FCC8505F396818F83105065FACB3267485B9E5E4A0261F621041C08FCCB2A809A49AB5252A91D0971BCC620B9D614BD77E57A0EED2FA5", + "6852C31F8083E20E364CEA21BB7854D67CEE812FE1C9ED2425C0932A90D3780728D1BB", + "2ECEF962A9695A463ADABB275BDA9FF8B2BA57AEC2F52EFFB700CD9271A74D2A011C24AEA946051BD6291776429B7E681BA33E"}, + {"4EE616C4A58AAA380878F71A373461F6", + "91B8C9C176D9C385E9C47E52", + "CDA440B7F9762C572A718AC754EDEECC119E5EE0CCB9FEA4FFB22EEE75087C032EBF3DA9CDD8A28CC010B99ED45143B41A4BA50EA2A005473F89639237838867A57F23B0F0ED3BF22490E4501DAC9C658A9B9F", + "D6E645FA9AE410D15B8123FD757FA356A8DBE9258DDB5BE88832E615910993F497EC", + "B70ED7BF959FB2AAED4F36174A2A99BFB16992C8CDF369C782C4DB9C73DE78C5DB8E0615F647243B97ACDB24503BC9CADC48"}, + {"DCD475773136C830D5E3D0C5FE05B7FF", + "BB8E1FBB483BE7616A922C4A", + "36FEF2E1CB29E76A6EA663FC3AF66ECD7404F466382F7B040AABED62293302B56E8783EF7EBC21B4A16C3E78A7483A0A403F253A2CDC5BBF79DC3DAE6C73F39A961D8FBBE8D41B", + "441E886EA38322B2437ECA7DEB5282518865A66780A454E510878E61BFEC3106A3CD93D2A02052E6F9E1832F9791053E3B76BF4C07EFDD6D4106E3027FABB752E60C1AA425416A87D53938163817A1051EBA1D1DEEB4B9B25C7E97368B52E5911A31810B0EC5AF547559B6142D9F4C4A6EF24A4CF75271BF9D48F62B", + "1BE4DD2F4E25A6512C2CC71D24BBB07368589A94C2714962CD0ACE5605688F06342587521E75F0ACAFFD86212FB5C34327D238DB36CF2B787794B9A4412E7CD1410EA5DDD2450C265F29CF96013CD213FD2880657694D718558964BC189B4A84AFCF47EB012935483052399DBA5B088B0A0477F20DFE0E85DCB735E21F22A439FB837DD365A93116D063E607"}, + {"3FBA2B3D30177FFE15C1C59ED2148BB2C091F5615FBA7C07", + "FACF804A4BEBF998505FF9DE", + "8213B9263B2971A5BDA18DBD02208EE1", + "15B323926993B326EA19F892D704439FC478828322AF72118748284A1FD8A6D814E641F70512FD706980337379F31DC63355974738D7FEA87AD2858C0C2EBBFBE74371C21450072373C7B651B334D7C4D43260B9D7CCD3AF9EDB", + "6D35DC1469B26E6AAB26272A41B46916397C24C485B61162E640A062D9275BC33DDCFD3D9E1A53B6C8F51AC89B66A41D59B3574197A40D9B6DCF8A4E2A001409C8112F16B9C389E0096179DB914E05D6D11ED0005AD17E1CE105A2F0BAB8F6B1540DEB968B7A5428FF44"}, + {"53B52B8D4D748BCDF1DDE68857832FA46227FA6E2F32EFA1", + "0B0EF53D4606B28D1398355F", + "F23882436349094AF98BCACA8218E81581A043B19009E28EFBF2DE37883E04864148CC01D240552CA8844EC1456F42034653067DA67E80F87105FD06E14FF771246C9612867BE4D215F6D761", + "F15030679BD4088D42CAC9BF2E9606EAD4798782FA3ED8C57EBE7F84A53236F51B25967C6489D0CD20C9EEA752F9BC", + "67B96E2D67C3729C96DAEAEDF821D61C17E648643A2134C5621FEC621186915AD80864BFD1EB5B238BF526A679385E012A457F583AFA78134242E9D9C1B4E4"}, + {"0272DD80F23399F49BFC320381A5CD8225867245A49A7D41", + "5C83F4896D0738E1366B1836", + "69B0337289B19F73A12BAEEA857CCAF396C11113715D9500CCCF48BA08CFF12BC8B4BADB3084E63B85719DB5058FA7C2C11DEB096D7943CFA7CAF5", + "C01AD10FC8B562CD17C7BC2FAB3E26CBDFF8D7F4DEA816794BBCC12336991712972F52816AABAB244EB43B0137E2BAC1DD413CE79531E78BEF782E6B439612BB3AEF154DE3502784F287958EBC159419F9EBA27916A28D6307324129F506B1DE80C1755A929F87", + "FEFE52DD7159C8DD6E8EC2D3D3C0F37AB6CB471A75A071D17EC4ACDD8F3AA4D7D4F7BB559F3C09099E3D9003E5E8AA1F556B79CECDE66F85B08FA5955E6976BF2695EA076388A62D2AD5BAB7CBF1A7F3F4C8D5CDF37CDE99BD3E30B685D9E5EEE48C7C89118EF4878EB89747F28271FA2CC45F8E9E7601"}, + {"3EEAED04A455D6E5E5AB53CFD5AFD2F2BC625C7BF4BE49A5", + "36B88F63ADBB5668588181D774", + "D367E3CB3703E762D23C6533188EF7028EFF9D935A3977150361997EC9DEAF1E4794BDE26AA8B53C124980B1362EC86FCDDFC7A90073171C1BAEE351A53234B86C66E8AB92FAE99EC6967A6D3428892D80", + "573454C719A9A55E04437BF7CBAAF27563CCCD92ADD5E515CD63305DFF0687E5EEF790C5DCA5C0033E9AB129505E2775438D92B38F08F3B0356BA142C6F694", + "E9F79A5B432D9E682C9AAA5661CFC2E49A0FCB81A431E54B42EB73DD3BED3F377FEC556ABA81624BA64A5D739AD41467460088F8D4F442180A9382CA635745473794C382FCDDC49BA4EB6D8A44AE3C"}, + {"B695C691538F8CBD60F039D0E28894E3693CC7C36D92D79D", + "BC099AEB637361BAC536B57618", + "BFFF1A65AE38D1DC142C71637319F5F6508E2CB33C9DCB94202B359ED5A5ED8042E7F4F09231D32A7242976677E6F4C549BF65FADC99E5AF43F7A46FD95E16C2", + "081DF3FD85B415D803F0BE5AC58CFF0023FDDED99788296C3731D8", + "E50C64E3614D94FE69C47092E46ACC9957C6FEA2CCBF96BC62FBABE7424753C75F9C147C42AE26FE171531"}, + {"C9ACBD2718F0689A1BE9802A551B6B8D9CF5614DAF5E65ED", + "B1B0AAF373B8B026EB80422051D8", + "6648C0E61AC733C76119D23FB24548D637751387AA2EAE9D80E912B7BD486CAAD9EAF4D7A5FE2B54AAD481E8EC94BB4D558000896E2010462B70C9FED1E7273080D1", + "189F591F6CB6D59AFEDD14C341741A8F1037DC0DF00FC57CE65C30F49E860255CEA5DC6019380CC0FE8880BC1A9E685F41C239C38F36E3F2A1388865C5C311059C0A", + "922A5E949B61D03BE34AB5F4E58607D4504EA14017BB363DAE3C873059EA7A1C77A746FB78981671D26C2CF6D9F24952D510044CE02A10177E9DB42D0145211DFE6E84369C5E3BC2669EAB4147B2822895F9"}, + {"7A832BD2CF5BF4919F353CE2A8C86A5E406DA2D52BE16A72", + "2F2F17CECF7E5A756D10785A3CB9DB", + "61DA05E3788CC2D8405DBA70C7A28E5AF699863C9F72E6C6770126929F5D6FA267F005EBCF49495CB46400958A3AE80D1289D1C671", + "44E91121195A41AF14E8CFDBD39A4B517BE0DF1A72977ED8A3EEF8EEDA1166B2EB6DB2C4AE2E74FA0F0C74537F659BFBD141E5DDEC67E64EDA85AABD3F52C85A785B9FB3CECD70E7DF", + "BEDF596EA21288D2B84901E188F6EE1468B14D5161D3802DBFE00D60203A24E2AB62714BF272A45551489838C3A7FEAADC177B591836E73684867CCF4E12901DCF2064058726BBA554E84ADC5136F507E961188D4AF06943D3"}, + {"1508E8AE9079AA15F1CEC4F776B4D11BCCB061B58AA56C18", + "BCA625674F41D1E3AB47672DC0C3", + "8B12CF84F16360F0EAD2A41BC021530FFCEC7F3579CAE658E10E2D3D81870F65AFCED0C77C6C4C6E6BA424FF23088C796BA6195ABA35094BF1829E089662E7A95FC90750AE16D0C8AFA55DAC789D7735B970B58D4BE7CEC7341DA82A0179A01929C27A59C5063215B859EA43", + "E525422519ECE070E82C", + "B47BC07C3ED1C0A43BA52C43CBACBCDBB29CAF1001E09FDF7107"}, + {"7550C2761644E911FE9ADD119BAC07376BEA442845FEAD876D7E7AC1B713E464", + "36D2EC25ADD33CDEDF495205BBC923", + "7FCFE81A3790DE97FFC3DE160C470847EA7E841177C2F759571CBD837EA004A6CA8C6F4AEBFF2E9FD552D73EB8A30705D58D70C0B67AEEA280CBBF0A477358ACEF1E7508F2735CD9A0E4F9AC92B8C008F575D3B6278F1C18BD01227E3502E5255F3AB1893632AD00C717C588EF652A51A43209E7EE90", + "2B1A62F8FDFAA3C16470A21AD307C9A7D03ADE8EF72C69B06F8D738CDE578D7AEFD0D40BD9C022FB9F580DF5394C998ACCCEFC5471A3996FB8F1045A81FDC6F32D13502EA65A211390C8D882B8E0BEFD8DD8CBEF51D1597B124E9F7F", + "C873E02A22DB89EB0787DB6A60B99F7E4A0A085D5C4232A81ADCE2D60AA36F92DDC33F93DD8640AC0E08416B187FB382B3EC3EE85A64B0E6EE41C1366A5AD2A282F66605E87031CCBA2FA7B2DA201D975994AADE3DD1EE122AE09604AD489B84BF0C1AB7129EE16C6934850E"}, + {"A51300285E554FDBDE7F771A9A9A80955639DD87129FAEF74987C91FB9687C71", + "81691D5D20EC818FCFF24B33DECC", + "C948093218AA9EB2A8E44A87EEA73FC8B6B75A196819A14BD83709EA323E8DF8B491045220E1D88729A38DBCFFB60D3056DAD4564498FD6574F74512945DEB34B69329ACED9FFC05D5D59DFCD5B973E2ACAFE6AD1EF8BBBC49351A2DD12508ED89ED", + "EB861165DAF7625F827C6B574ED703F03215", + "C6CD1CE76D2B3679C1B5AA1CFD67CCB55444B6BFD3E22C81CBC9BB738796B83E54E3"}, + {"8CE0156D26FAEB7E0B9B800BBB2E9D4075B5EAC5C62358B0E7F6FCE610223282", + "D2A7B94DD12CDACA909D3AD7", + "E021A78F374FC271389AB9A3E97077D755", + "7C26000B58929F5095E1CEE154F76C2A299248E299F9B5ADE6C403AA1FD4A67FD4E0232F214CE7B919EE7A1027D2B76C57475715CD078461", + "C556FB38DF069B56F337B5FF5775CE6EAA16824DFA754F20B78819028EA635C3BB7AA731DE8776B2DCB67DCA2D33EEDF3C7E52EA450013722A41755A0752433ED17BDD5991AAE77A"}, + {"1E8000A2CE00A561C9920A30BF0D7B983FEF8A1014C8F04C35CA6970E6BA02BD", + "65ED3D63F79F90BBFD19775E", + "336A8C0B7243582A46B221AA677647FCAE91", + "134A8B34824A290E7B", + "914FBEF80D0E6E17F8BDBB6097EBF5FBB0554952DC2B9E5151"}, + {"53D5607BBE690B6E8D8F6D97F3DF2BA853B682597A214B8AA0EA6E598650AF15", + "C391A856B9FE234E14BA1AC7BB40FF", + "479682BC21349C4BE1641D5E78FE2C79EC1B9CF5470936DCAD9967A4DCD7C4EFADA593BC9EDE71E6A08829B8580901B61E274227E9D918502DE3", + "EAD154DC09C5E26C5D26FF33ED148B27120C7F2C23225CC0D0631B03E1F6C6D96FEB88C1A4052ACB4CE746B884B6502931F407021126C6AAB8C514C077A5A38438AE88EE", + "938821286EBB671D999B87C032E1D6055392EB564E57970D55E545FC5E8BAB90E6E3E3C0913F6320995FC636D72CD9919657CC38BD51552F4A502D8D1FE56DB33EBAC5092630E69EBB986F0E15CEE9FC8C052501"}, + {"294362FCC984F440CEA3E9F7D2C06AF20C53AAC1B3738CA2186C914A6E193ABB", + "B15B61C8BB39261A8F55AB178EC3", + "D0729B6B75BB", + "2BD089ADCE9F334BAE3B065996C7D616DD0C27DF4218DCEEA0FBCA0F968837CE26B0876083327E25681FDDD620A32EC0DA12F73FAE826CC94BFF2B90A54D2651", + "AC94B25E4E21DE2437B806966CCD5D9385EF0CD4A51AB9FA6DE675C7B8952D67802E9FEC1FDE9F5D1EAB06057498BC0EEA454804FC9D2068982A3E24182D9AC2E7AB9994DDC899A604264583F63D066B"}, + {"959DBFEB039B1A5B8CE6A44649B602AAA5F98A906DB96143D202CD2024F749D9", + "01D7BDB1133E9C347486C1EFA6", + "F3843955BD741F379DD750585EDC55E2CDA05CCBA8C1F4622AC2FE35214BC3A019B8BD12C4CC42D9213D1E1556941E8D8450830287FFB3B763A13722DD4140ED9846FB5FFF745D7B0B967D810A068222E10B259AF1D392035B0D83DC1498A6830B11B2418A840212599171E0258A1C203B05362978", + "A21811232C950FA8B12237C2EBD6A7CD2C3A155905E9E0C7C120", + "63C1CE397B22F1A03F1FA549B43178BC405B152D3C95E977426D519B3DFCA28498823240592B6EEE7A14"}, + {"096AE499F5294173F34FF2B375F0E5D5AB79D0D03B33B1A74D7D576826345DF4", + "0C52B3D11D636E5910A4DD76D32C", + "229E9ECA3053789E937447BC719467075B6138A142DA528DA8F0CF8DDF022FD9AF8E74779BA3AC306609", + "8B7A00038783E8BAF6EDEAE0C4EAB48FC8FD501A588C7E4A4DB71E3604F2155A97687D3D2FFF8569261375A513CF4398CE0F87CA1658A1050F6EF6C4EA3E25", + "C20B6CF8D3C8241825FD90B2EDAC7593600646E579A8D8DAAE9E2E40C3835FE801B2BE4379131452BC5182C90307B176DFBE2049544222FE7783147B690774F6D9D7CEF52A91E61E298E9AA15464AC"}, +} diff --git a/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go b/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go new file mode 100644 index 0000000000..843085589c --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go @@ -0,0 +1,78 @@ +package ocb + +import ( + "encoding/hex" +) + +// Test vectors from https://tools.ietf.org/html/rfc7253. Note that key is +// shared accross tests. +var testKey, _ = hex.DecodeString("000102030405060708090A0B0C0D0E0F") + +var rfc7253testVectors = []struct { + nonce, header, plaintext, ciphertext string +}{ + {"BBAA99887766554433221100", + "", + "", + "785407BFFFC8AD9EDCC5520AC9111EE6"}, + {"BBAA99887766554433221101", + "0001020304050607", + "0001020304050607", + "6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009"}, + {"BBAA99887766554433221102", + "0001020304050607", + "", + "81017F8203F081277152FADE694A0A00"}, + {"BBAA99887766554433221103", + "", + "0001020304050607", + "45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9"}, + {"BBAA99887766554433221104", + "000102030405060708090A0B0C0D0E0F", + "000102030405060708090A0B0C0D0E0F", + "571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5701C1CCEC8FC3358"}, + {"BBAA99887766554433221105", + "000102030405060708090A0B0C0D0E0F", + "", + "8CF761B6902EF764462AD86498CA6B97"}, + {"BBAA99887766554433221106", + "", + "000102030405060708090A0B0C0D0E0F", + "5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436BDF06D8FA1ECA343D"}, + {"BBAA99887766554433221107", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "1CA2207308C87C010756104D8840CE1952F09673A448A122C92C62241051F57356D7F3C90BB0E07F"}, + {"BBAA99887766554433221108", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "", + "6DC225A071FC1B9F7C69F93B0F1E10DE"}, + {"BBAA99887766554433221109", + "", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3CE725F32494B9F914D85C0B1EB38357FF"}, + {"BBAA9988776655443322110A", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", + "BD6F6C496201C69296C11EFD138A467ABD3C707924B964DEAFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240"}, + {"BBAA9988776655443322110B", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", + "", + "FE80690BEE8A485D11F32965BC9D2A32"}, + {"BBAA9988776655443322110C", + "", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", + "2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF46040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF"}, + {"BBAA9988776655443322110D", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", + "D5CA91748410C1751FF8A2F618255B68A0A12E093FF454606E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483A7035490C5769E60"}, + {"BBAA9988776655443322110E", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", + "", + "C5CD9D1850C141E358649994EE701B68"}, + {"BBAA9988776655443322110F", + "", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", + "4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95A98CA5F3000B1479"}, +} diff --git a/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go b/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go new file mode 100644 index 0000000000..5dc158f012 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go @@ -0,0 +1,24 @@ +package ocb + +// Second set of test vectors from https://tools.ietf.org/html/rfc7253 +var rfc7253TestVectorTaglen96 = struct { + key, nonce, header, plaintext, ciphertext string +}{"0F0E0D0C0B0A09080706050403020100", + "BBAA9988776655443322110D", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", + "1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FDAC4F02AA"} + +var rfc7253AlgorithmTest = []struct { + KEYLEN, TAGLEN int + OUTPUT string }{ + {128, 128, "67E944D23256C5E0B6C61FA22FDF1EA2"}, + {192, 128, "F673F2C3E7174AAE7BAE986CA9F29E17"}, + {256, 128, "D90EB8E9C977C88B79DD793D7FFA161C"}, + {128, 96, "77A3D8E73589158D25D01209"}, + {192, 96, "05D56EAD2752C86BE6932C5E"}, + {256, 96, "5458359AC23B0CBA9E6330DD"}, + {128, 64, "192C9B7BD90BA06A"}, + {192, 64, "0066BC6E0EF34E24"}, + {256, 64, "7D4EA5D445501CBE"}, + } diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go new file mode 100644 index 0000000000..3c6251d1ce --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go @@ -0,0 +1,153 @@ +// Copyright 2014 Matthew Endsley +// All rights reserved +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted providing that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// Package keywrap is an implementation of the RFC 3394 AES key wrapping +// algorithm. This is used in OpenPGP with elliptic curve keys. +package keywrap + +import ( + "crypto/aes" + "encoding/binary" + "errors" +) + +var ( + // ErrWrapPlaintext is returned if the plaintext is not a multiple + // of 64 bits. + ErrWrapPlaintext = errors.New("keywrap: plainText must be a multiple of 64 bits") + + // ErrUnwrapCiphertext is returned if the ciphertext is not a + // multiple of 64 bits. + ErrUnwrapCiphertext = errors.New("keywrap: cipherText must by a multiple of 64 bits") + + // ErrUnwrapFailed is returned if unwrapping a key fails. + ErrUnwrapFailed = errors.New("keywrap: failed to unwrap key") + + // NB: the AES NewCipher call only fails if the key is an invalid length. + + // ErrInvalidKey is returned when the AES key is invalid. + ErrInvalidKey = errors.New("keywrap: invalid AES key") +) + +// Wrap a key using the RFC 3394 AES Key Wrap Algorithm. +func Wrap(key, plainText []byte) ([]byte, error) { + if len(plainText)%8 != 0 { + return nil, ErrWrapPlaintext + } + + c, err := aes.NewCipher(key) + if err != nil { + return nil, ErrInvalidKey + } + + nblocks := len(plainText) / 8 + + // 1) Initialize variables. + var block [aes.BlockSize]byte + // - Set A = IV, an initial value (see 2.2.3) + for ii := 0; ii < 8; ii++ { + block[ii] = 0xA6 + } + + // - For i = 1 to n + // - Set R[i] = P[i] + intermediate := make([]byte, len(plainText)) + copy(intermediate, plainText) + + // 2) Calculate intermediate values. + for ii := 0; ii < 6; ii++ { + for jj := 0; jj < nblocks; jj++ { + // - B = AES(K, A | R[i]) + copy(block[8:], intermediate[jj*8:jj*8+8]) + c.Encrypt(block[:], block[:]) + + // - A = MSB(64, B) ^ t where t = (n*j)+1 + t := uint64(ii*nblocks + jj + 1) + val := binary.BigEndian.Uint64(block[:8]) ^ t + binary.BigEndian.PutUint64(block[:8], val) + + // - R[i] = LSB(64, B) + copy(intermediate[jj*8:jj*8+8], block[8:]) + } + } + + // 3) Output results. + // - Set C[0] = A + // - For i = 1 to n + // - C[i] = R[i] + return append(block[:8], intermediate...), nil +} + +// Unwrap a key using the RFC 3394 AES Key Wrap Algorithm. +func Unwrap(key, cipherText []byte) ([]byte, error) { + if len(cipherText)%8 != 0 { + return nil, ErrUnwrapCiphertext + } + + c, err := aes.NewCipher(key) + if err != nil { + return nil, ErrInvalidKey + } + + nblocks := len(cipherText)/8 - 1 + + // 1) Initialize variables. + var block [aes.BlockSize]byte + // - Set A = C[0] + copy(block[:8], cipherText[:8]) + + // - For i = 1 to n + // - Set R[i] = C[i] + intermediate := make([]byte, len(cipherText)-8) + copy(intermediate, cipherText[8:]) + + // 2) Compute intermediate values. + for jj := 5; jj >= 0; jj-- { + for ii := nblocks - 1; ii >= 0; ii-- { + // - B = AES-1(K, (A ^ t) | R[i]) where t = n*j+1 + // - A = MSB(64, B) + t := uint64(jj*nblocks + ii + 1) + val := binary.BigEndian.Uint64(block[:8]) ^ t + binary.BigEndian.PutUint64(block[:8], val) + + copy(block[8:], intermediate[ii*8:ii*8+8]) + c.Decrypt(block[:], block[:]) + + // - R[i] = LSB(B, 64) + copy(intermediate[ii*8:ii*8+8], block[8:]) + } + } + + // 3) Output results. + // - If A is an appropriate initial value (see 2.2.3), + for ii := 0; ii < 8; ii++ { + if block[ii] != 0xA6 { + return nil, ErrUnwrapFailed + } + } + + // - For i = 1 to n + // - P[i] = R[i] + return intermediate, nil +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go new file mode 100644 index 0000000000..3b357e5851 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go @@ -0,0 +1,224 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package armor implements OpenPGP ASCII Armor, see RFC 4880. OpenPGP Armor is +// very similar to PEM except that it has an additional CRC checksum. +package armor // import "github.com/ProtonMail/go-crypto/openpgp/armor" + +import ( + "bufio" + "bytes" + "encoding/base64" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "io" +) + +// A Block represents an OpenPGP armored structure. +// +// The encoded form is: +// -----BEGIN Type----- +// Headers +// +// base64-encoded Bytes +// '=' base64 encoded checksum +// -----END Type----- +// where Headers is a possibly empty sequence of Key: Value lines. +// +// Since the armored data can be very large, this package presents a streaming +// interface. +type Block struct { + Type string // The type, taken from the preamble (i.e. "PGP SIGNATURE"). + Header map[string]string // Optional headers. + Body io.Reader // A Reader from which the contents can be read + lReader lineReader + oReader openpgpReader +} + +var ArmorCorrupt error = errors.StructuralError("armor invalid") + +const crc24Init = 0xb704ce +const crc24Poly = 0x1864cfb +const crc24Mask = 0xffffff + +// crc24 calculates the OpenPGP checksum as specified in RFC 4880, section 6.1 +func crc24(crc uint32, d []byte) uint32 { + for _, b := range d { + crc ^= uint32(b) << 16 + for i := 0; i < 8; i++ { + crc <<= 1 + if crc&0x1000000 != 0 { + crc ^= crc24Poly + } + } + } + return crc +} + +var armorStart = []byte("-----BEGIN ") +var armorEnd = []byte("-----END ") +var armorEndOfLine = []byte("-----") + +// lineReader wraps a line based reader. It watches for the end of an armor +// block and records the expected CRC value. +type lineReader struct { + in *bufio.Reader + buf []byte + eof bool + crc uint32 + crcSet bool +} + +func (l *lineReader) Read(p []byte) (n int, err error) { + if l.eof { + return 0, io.EOF + } + + if len(l.buf) > 0 { + n = copy(p, l.buf) + l.buf = l.buf[n:] + return + } + + line, isPrefix, err := l.in.ReadLine() + if err != nil { + return + } + if isPrefix { + return 0, ArmorCorrupt + } + + if bytes.HasPrefix(line, armorEnd) { + l.eof = true + return 0, io.EOF + } + + if len(line) == 5 && line[0] == '=' { + // This is the checksum line + var expectedBytes [3]byte + var m int + m, err = base64.StdEncoding.Decode(expectedBytes[0:], line[1:]) + if m != 3 || err != nil { + return + } + l.crc = uint32(expectedBytes[0])<<16 | + uint32(expectedBytes[1])<<8 | + uint32(expectedBytes[2]) + + line, _, err = l.in.ReadLine() + if err != nil && err != io.EOF { + return + } + if !bytes.HasPrefix(line, armorEnd) { + return 0, ArmorCorrupt + } + + l.eof = true + l.crcSet = true + return 0, io.EOF + } + + if len(line) > 96 { + return 0, ArmorCorrupt + } + + n = copy(p, line) + bytesToSave := len(line) - n + if bytesToSave > 0 { + if cap(l.buf) < bytesToSave { + l.buf = make([]byte, 0, bytesToSave) + } + l.buf = l.buf[0:bytesToSave] + copy(l.buf, line[n:]) + } + + return +} + +// openpgpReader passes Read calls to the underlying base64 decoder, but keeps +// a running CRC of the resulting data and checks the CRC against the value +// found by the lineReader at EOF. +type openpgpReader struct { + lReader *lineReader + b64Reader io.Reader + currentCRC uint32 +} + +func (r *openpgpReader) Read(p []byte) (n int, err error) { + n, err = r.b64Reader.Read(p) + r.currentCRC = crc24(r.currentCRC, p[:n]) + + if err == io.EOF && r.lReader.crcSet && r.lReader.crc != uint32(r.currentCRC&crc24Mask) { + return 0, ArmorCorrupt + } + + return +} + +// Decode reads a PGP armored block from the given Reader. It will ignore +// leading garbage. If it doesn't find a block, it will return nil, io.EOF. The +// given Reader is not usable after calling this function: an arbitrary amount +// of data may have been read past the end of the block. +func Decode(in io.Reader) (p *Block, err error) { + r := bufio.NewReaderSize(in, 100) + var line []byte + ignoreNext := false + +TryNextBlock: + p = nil + + // Skip leading garbage + for { + ignoreThis := ignoreNext + line, ignoreNext, err = r.ReadLine() + if err != nil { + return + } + if ignoreNext || ignoreThis { + continue + } + line = bytes.TrimSpace(line) + if len(line) > len(armorStart)+len(armorEndOfLine) && bytes.HasPrefix(line, armorStart) { + break + } + } + + p = new(Block) + p.Type = string(line[len(armorStart) : len(line)-len(armorEndOfLine)]) + p.Header = make(map[string]string) + nextIsContinuation := false + var lastKey string + + // Read headers + for { + isContinuation := nextIsContinuation + line, nextIsContinuation, err = r.ReadLine() + if err != nil { + p = nil + return + } + if isContinuation { + p.Header[lastKey] += string(line) + continue + } + line = bytes.TrimSpace(line) + if len(line) == 0 { + break + } + + i := bytes.Index(line, []byte(": ")) + if i == -1 { + goto TryNextBlock + } + lastKey = string(line[:i]) + p.Header[lastKey] = string(line[i+2:]) + } + + p.lReader.in = r + p.oReader.currentCRC = crc24Init + p.oReader.lReader = &p.lReader + p.oReader.b64Reader = base64.NewDecoder(base64.StdEncoding, &p.lReader) + p.Body = &p.oReader + + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go new file mode 100644 index 0000000000..6f07582c37 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go @@ -0,0 +1,160 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package armor + +import ( + "encoding/base64" + "io" +) + +var armorHeaderSep = []byte(": ") +var blockEnd = []byte("\n=") +var newline = []byte("\n") +var armorEndOfLineOut = []byte("-----\n") + +// writeSlices writes its arguments to the given Writer. +func writeSlices(out io.Writer, slices ...[]byte) (err error) { + for _, s := range slices { + _, err = out.Write(s) + if err != nil { + return err + } + } + return +} + +// lineBreaker breaks data across several lines, all of the same byte length +// (except possibly the last). Lines are broken with a single '\n'. +type lineBreaker struct { + lineLength int + line []byte + used int + out io.Writer + haveWritten bool +} + +func newLineBreaker(out io.Writer, lineLength int) *lineBreaker { + return &lineBreaker{ + lineLength: lineLength, + line: make([]byte, lineLength), + used: 0, + out: out, + } +} + +func (l *lineBreaker) Write(b []byte) (n int, err error) { + n = len(b) + + if n == 0 { + return + } + + if l.used == 0 && l.haveWritten { + _, err = l.out.Write([]byte{'\n'}) + if err != nil { + return + } + } + + if l.used+len(b) < l.lineLength { + l.used += copy(l.line[l.used:], b) + return + } + + l.haveWritten = true + _, err = l.out.Write(l.line[0:l.used]) + if err != nil { + return + } + excess := l.lineLength - l.used + l.used = 0 + + _, err = l.out.Write(b[0:excess]) + if err != nil { + return + } + + _, err = l.Write(b[excess:]) + return +} + +func (l *lineBreaker) Close() (err error) { + if l.used > 0 { + _, err = l.out.Write(l.line[0:l.used]) + if err != nil { + return + } + } + + return +} + +// encoding keeps track of a running CRC24 over the data which has been written +// to it and outputs a OpenPGP checksum when closed, followed by an armor +// trailer. +// +// It's built into a stack of io.Writers: +// encoding -> base64 encoder -> lineBreaker -> out +type encoding struct { + out io.Writer + breaker *lineBreaker + b64 io.WriteCloser + crc uint32 + blockType []byte +} + +func (e *encoding) Write(data []byte) (n int, err error) { + e.crc = crc24(e.crc, data) + return e.b64.Write(data) +} + +func (e *encoding) Close() (err error) { + err = e.b64.Close() + if err != nil { + return + } + e.breaker.Close() + + var checksumBytes [3]byte + checksumBytes[0] = byte(e.crc >> 16) + checksumBytes[1] = byte(e.crc >> 8) + checksumBytes[2] = byte(e.crc) + + var b64ChecksumBytes [4]byte + base64.StdEncoding.Encode(b64ChecksumBytes[:], checksumBytes[:]) + + return writeSlices(e.out, blockEnd, b64ChecksumBytes[:], newline, armorEnd, e.blockType, armorEndOfLine) +} + +// Encode returns a WriteCloser which will encode the data written to it in +// OpenPGP armor. +func Encode(out io.Writer, blockType string, headers map[string]string) (w io.WriteCloser, err error) { + bType := []byte(blockType) + err = writeSlices(out, armorStart, bType, armorEndOfLineOut) + if err != nil { + return + } + + for k, v := range headers { + err = writeSlices(out, []byte(k), armorHeaderSep, []byte(v), newline) + if err != nil { + return + } + } + + _, err = out.Write(newline) + if err != nil { + return + } + + e := &encoding{ + out: out, + breaker: newLineBreaker(out, 64), + crc: crc24Init, + blockType: bType, + } + e.b64 = base64.NewEncoder(base64.StdEncoding, e.breaker) + return e, nil +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/canonical_text.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/canonical_text.go new file mode 100644 index 0000000000..a94f6150c4 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/canonical_text.go @@ -0,0 +1,65 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package openpgp + +import ( + "hash" + "io" +) + +// NewCanonicalTextHash reformats text written to it into the canonical +// form and then applies the hash h. See RFC 4880, section 5.2.1. +func NewCanonicalTextHash(h hash.Hash) hash.Hash { + return &canonicalTextHash{h, 0} +} + +type canonicalTextHash struct { + h hash.Hash + s int +} + +var newline = []byte{'\r', '\n'} + +func writeCanonical(cw io.Writer, buf []byte, s *int) (int, error) { + start := 0 + for i, c := range buf { + switch *s { + case 0: + if c == '\r' { + *s = 1 + } else if c == '\n' { + cw.Write(buf[start:i]) + cw.Write(newline) + start = i + 1 + } + case 1: + *s = 0 + } + } + + cw.Write(buf[start:]) + return len(buf), nil +} + +func (cth *canonicalTextHash) Write(buf []byte) (int, error) { + return writeCanonical(cth.h, buf, &cth.s) +} + +func (cth *canonicalTextHash) Sum(in []byte) []byte { + return cth.h.Sum(in) +} + +func (cth *canonicalTextHash) Reset() { + cth.h.Reset() + cth.s = 0 +} + +func (cth *canonicalTextHash) Size() int { + return cth.h.Size() +} + +func (cth *canonicalTextHash) BlockSize() int { + return cth.h.BlockSize() +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go new file mode 100644 index 0000000000..0b49be4bf3 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go @@ -0,0 +1,165 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ecdh implements ECDH encryption, suitable for OpenPGP, +// as specified in RFC 6637, section 8. +package ecdh + +import ( + "bytes" + "crypto/elliptic" + "errors" + "io" + "math/big" + + "github.com/ProtonMail/go-crypto/openpgp/aes/keywrap" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" + "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" +) + +type KDF struct { + Hash algorithm.Hash + Cipher algorithm.Cipher +} + +type PublicKey struct { + ecc.CurveType + elliptic.Curve + X, Y *big.Int + KDF +} + +type PrivateKey struct { + PublicKey + D []byte +} + +func GenerateKey(c elliptic.Curve, kdf KDF, rand io.Reader) (priv *PrivateKey, err error) { + priv = new(PrivateKey) + priv.PublicKey.Curve = c + priv.PublicKey.KDF = kdf + priv.D, priv.PublicKey.X, priv.PublicKey.Y, err = elliptic.GenerateKey(c, rand) + return +} + +func Encrypt(random io.Reader, pub *PublicKey, msg, curveOID, fingerprint []byte) (vsG, c []byte, err error) { + if len(msg) > 40 { + return nil, nil, errors.New("ecdh: message too long") + } + // the sender MAY use 21, 13, and 5 bytes of padding for AES-128, + // AES-192, and AES-256, respectively, to provide the same number of + // octets, 40 total, as an input to the key wrapping method. + padding := make([]byte, 40-len(msg)) + for i := range padding { + padding[i] = byte(40 - len(msg)) + } + m := append(msg, padding...) + + if pub.CurveType == ecc.Curve25519 { + return X25519Encrypt(random, pub, m, curveOID, fingerprint) + } + + d, x, y, err := elliptic.GenerateKey(pub.Curve, random) + if err != nil { + return nil, nil, err + } + + vsG = elliptic.Marshal(pub.Curve, x, y) + zbBig, _ := pub.Curve.ScalarMult(pub.X, pub.Y, d) + + byteLen := (pub.Curve.Params().BitSize + 7) >> 3 + zb := make([]byte, byteLen) + zbBytes := zbBig.Bytes() + copy(zb[byteLen-len(zbBytes):], zbBytes) + + z, err := buildKey(pub, zb, curveOID, fingerprint, false, false) + if err != nil { + return nil, nil, err + } + + if c, err = keywrap.Wrap(z, m); err != nil { + return nil, nil, err + } + + return vsG, c, nil + +} + +func Decrypt(priv *PrivateKey, vsG, m, curveOID, fingerprint []byte) (msg []byte, err error) { + if priv.PublicKey.CurveType == ecc.Curve25519 { + return X25519Decrypt(priv, vsG, m, curveOID, fingerprint) + } + x, y := elliptic.Unmarshal(priv.Curve, vsG) + zbBig, _ := priv.Curve.ScalarMult(x, y, priv.D) + + byteLen := (priv.Curve.Params().BitSize + 7) >> 3 + zb := make([]byte, byteLen) + zbBytes := zbBig.Bytes() + copy(zb[byteLen-len(zbBytes):], zbBytes) + + z, err := buildKey(&priv.PublicKey, zb, curveOID, fingerprint, false, false) + if err != nil { + return nil, err + } + + c, err := keywrap.Unwrap(z, m) + if err != nil { + return nil, err + } + + return c[:len(c)-int(c[len(c)-1])], nil +} + +func buildKey(pub *PublicKey, zb []byte, curveOID, fingerprint []byte, stripLeading, stripTrailing bool) ([]byte, error) { + // Param = curve_OID_len || curve_OID || public_key_alg_ID || 03 + // || 01 || KDF_hash_ID || KEK_alg_ID for AESKeyWrap + // || "Anonymous Sender " || recipient_fingerprint; + param := new(bytes.Buffer) + if _, err := param.Write(curveOID); err != nil { + return nil, err + } + algKDF := []byte{18, 3, 1, pub.KDF.Hash.Id(), pub.KDF.Cipher.Id()} + if _, err := param.Write(algKDF); err != nil { + return nil, err + } + if _, err := param.Write([]byte("Anonymous Sender ")); err != nil { + return nil, err + } + // For v5 keys, the 20 leftmost octets of the fingerprint are used. + if _, err := param.Write(fingerprint[:20]); err != nil { + return nil, err + } + if param.Len() - len(curveOID) != 45 { + return nil, errors.New("ecdh: malformed KDF Param") + } + + // MB = Hash ( 00 || 00 || 00 || 01 || ZB || Param ); + h := pub.KDF.Hash.New() + if _, err := h.Write([]byte{0x0, 0x0, 0x0, 0x1}); err != nil { + return nil, err + } + zbLen := len(zb) + i := 0 + j := zbLen - 1 + if stripLeading { + // Work around old go crypto bug where the leading zeros are missing. + for ; i < zbLen && zb[i] == 0; i++ {} + } + if stripTrailing { + // Work around old OpenPGP.js bug where insignificant trailing zeros in + // this little-endian number are missing. + // (See https://github.com/openpgpjs/openpgpjs/pull/853.) + for ; j >= 0 && zb[j] == 0; j-- {} + } + if _, err := h.Write(zb[i:j+1]); err != nil { + return nil, err + } + if _, err := h.Write(param.Bytes()); err != nil { + return nil, err + } + mb := h.Sum(nil) + + return mb[:pub.KDF.Cipher.KeySize()], nil // return oBits leftmost bits of MB. + +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/x25519.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/x25519.go new file mode 100644 index 0000000000..15b41a31df --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/x25519.go @@ -0,0 +1,157 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ecdh implements ECDH encryption, suitable for OpenPGP, +// as specified in RFC 6637, section 8. +package ecdh + +import ( + "errors" + "io" + "math/big" + + "github.com/ProtonMail/go-crypto/openpgp/aes/keywrap" + "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" + "golang.org/x/crypto/curve25519" +) + +// Generates a private-public key-pair. +// 'priv' is a private key; a scalar belonging to the set +// 2^{254} + 8 * [0, 2^{251}), in order to avoid the small subgroup of the +// curve. 'pub' is simply 'priv' * G where G is the base point. +// See https://cr.yp.to/ecdh.html and RFC7748, sec 5. +func x25519GenerateKeyPairBytes(rand io.Reader) (priv [32]byte, pub [32]byte, err error) { + var n, helper = new(big.Int), new(big.Int) + n.SetUint64(1) + n.Lsh(n, 252) + helper.SetString("27742317777372353535851937790883648493", 10) + n.Add(n, helper) + + for true { + _, err = io.ReadFull(rand, priv[:]) + if err != nil { + return + } + // The following ensures that the private key is a number of the form + // 2^{254} + 8 * [0, 2^{251}), in order to avoid the small subgroup of + // of the curve. + priv[0] &= 248 + priv[31] &= 127 + priv[31] |= 64 + + // If the scalar is out of range, sample another random number. + if new(big.Int).SetBytes(priv[:]).Cmp(n) >= 0 { + continue + } + + curve25519.ScalarBaseMult(&pub, &priv) + return + } + return +} + +// X25519GenerateKey samples the key pair according to the correct distribution. +// It also sets the given key-derivation function and returns the *PrivateKey +// object along with an error. +func X25519GenerateKey(rand io.Reader, kdf KDF) (priv *PrivateKey, err error) { + ci := ecc.FindByName("Curve25519") + priv = new(PrivateKey) + priv.PublicKey.Curve = ci.Curve + d, pubKey, err := x25519GenerateKeyPairBytes(rand) + if err != nil { + return nil, err + } + priv.PublicKey.KDF = kdf + priv.D = make([]byte, 32) + copyReversed(priv.D, d[:]) + priv.PublicKey.CurveType = ci.CurveType + priv.PublicKey.Curve = ci.Curve + /* + * Note that ECPoint.point differs from the definition of public keys in + * [Curve25519] in two ways: (1) the byte-ordering is big-endian, which is + * more uniform with how big integers are represented in TLS, and (2) there + * is an additional length byte (so ECpoint.point is actually 33 bytes), + * again for uniformity (and extensibility). + */ + var encodedKey = make([]byte, 33) + encodedKey[0] = 0x40 + copy(encodedKey[1:], pubKey[:]) + priv.PublicKey.X = new(big.Int).SetBytes(encodedKey[:]) + priv.PublicKey.Y = new(big.Int) + return priv, nil +} + +func X25519Encrypt(random io.Reader, pub *PublicKey, msg, curveOID, fingerprint []byte) (vsG, c []byte, err error) { + d, ephemeralKey, err := x25519GenerateKeyPairBytes(random) + if err != nil { + return nil, nil, err + } + var pubKey [32]byte + + if pub.X.BitLen() > 33*264 { + return nil, nil, errors.New("ecdh: invalid key") + } + copy(pubKey[:], pub.X.Bytes()[1:]) + + var zb [32]byte + curve25519.ScalarBaseMult(&zb, &d) + curve25519.ScalarMult(&zb, &d, &pubKey) + z, err := buildKey(pub, zb[:], curveOID, fingerprint, false, false) + + if err != nil { + return nil, nil, err + } + + if c, err = keywrap.Wrap(z, msg); err != nil { + return nil, nil, err + } + + var vsg [33]byte + vsg[0] = 0x40 + copy(vsg[1:], ephemeralKey[:]) + + return vsg[:], c, nil +} + +func X25519Decrypt(priv *PrivateKey, vsG, m, curveOID, fingerprint []byte) (msg []byte, err error) { + var zb, d, ephemeralKey [32]byte + if len(vsG) != 33 || vsG[0] != 0x40 { + return nil, errors.New("ecdh: invalid key") + } + copy(ephemeralKey[:], vsG[1:33]) + + copyReversed(d[:], priv.D) + curve25519.ScalarBaseMult(&zb, &d) + curve25519.ScalarMult(&zb, &d, &ephemeralKey) + + var c []byte + + for i := 0; i < 3; i++ { + // Try buildKey three times for compat, see comments in buildKey. + z, err := buildKey(&priv.PublicKey, zb[:], curveOID, fingerprint, i == 1, i == 2) + if err != nil { + return nil, err + } + + res, err := keywrap.Unwrap(z, m) + if i == 2 && err != nil { + // Only return an error after we've tried all variants of buildKey. + return nil, err + } + + c = res + if err == nil { + break + } + } + + return c[:len(c)-int(c[len(c)-1])], nil +} + +func copyReversed(out []byte, in []byte) { + l := len(in) + for i := 0; i < l; i++ { + out[i] = in[l-i-1] + } +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go new file mode 100644 index 0000000000..6a07d8ff27 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go @@ -0,0 +1,124 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package elgamal implements ElGamal encryption, suitable for OpenPGP, +// as specified in "A Public-Key Cryptosystem and a Signature Scheme Based on +// Discrete Logarithms," IEEE Transactions on Information Theory, v. IT-31, +// n. 4, 1985, pp. 469-472. +// +// This form of ElGamal embeds PKCS#1 v1.5 padding, which may make it +// unsuitable for other protocols. RSA should be used in preference in any +// case. +package elgamal // import "github.com/ProtonMail/go-crypto/openpgp/elgamal" + +import ( + "crypto/rand" + "crypto/subtle" + "errors" + "io" + "math/big" +) + +// PublicKey represents an ElGamal public key. +type PublicKey struct { + G, P, Y *big.Int +} + +// PrivateKey represents an ElGamal private key. +type PrivateKey struct { + PublicKey + X *big.Int +} + +// Encrypt encrypts the given message to the given public key. The result is a +// pair of integers. Errors can result from reading random, or because msg is +// too large to be encrypted to the public key. +func Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err error) { + pLen := (pub.P.BitLen() + 7) / 8 + if len(msg) > pLen-11 { + err = errors.New("elgamal: message too long") + return + } + + // EM = 0x02 || PS || 0x00 || M + em := make([]byte, pLen-1) + em[0] = 2 + ps, mm := em[1:len(em)-len(msg)-1], em[len(em)-len(msg):] + err = nonZeroRandomBytes(ps, random) + if err != nil { + return + } + em[len(em)-len(msg)-1] = 0 + copy(mm, msg) + + m := new(big.Int).SetBytes(em) + + k, err := rand.Int(random, pub.P) + if err != nil { + return + } + + c1 = new(big.Int).Exp(pub.G, k, pub.P) + s := new(big.Int).Exp(pub.Y, k, pub.P) + c2 = s.Mul(s, m) + c2.Mod(c2, pub.P) + + return +} + +// Decrypt takes two integers, resulting from an ElGamal encryption, and +// returns the plaintext of the message. An error can result only if the +// ciphertext is invalid. Users should keep in mind that this is a padding +// oracle and thus, if exposed to an adaptive chosen ciphertext attack, can +// be used to break the cryptosystem. See ``Chosen Ciphertext Attacks +// Against Protocols Based on the RSA Encryption Standard PKCS #1'', Daniel +// Bleichenbacher, Advances in Cryptology (Crypto '98), +func Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) { + s := new(big.Int).Exp(c1, priv.X, priv.P) + if s.ModInverse(s, priv.P) == nil { + return nil, errors.New("elgamal: invalid private key") + } + s.Mul(s, c2) + s.Mod(s, priv.P) + em := s.Bytes() + + firstByteIsTwo := subtle.ConstantTimeByteEq(em[0], 2) + + // The remainder of the plaintext must be a string of non-zero random + // octets, followed by a 0, followed by the message. + // lookingForIndex: 1 iff we are still looking for the zero. + // index: the offset of the first zero byte. + var lookingForIndex, index int + lookingForIndex = 1 + + for i := 1; i < len(em); i++ { + equals0 := subtle.ConstantTimeByteEq(em[i], 0) + index = subtle.ConstantTimeSelect(lookingForIndex&equals0, i, index) + lookingForIndex = subtle.ConstantTimeSelect(equals0, 0, lookingForIndex) + } + + if firstByteIsTwo != 1 || lookingForIndex != 0 || index < 9 { + return nil, errors.New("elgamal: decryption error") + } + return em[index+1:], nil +} + +// nonZeroRandomBytes fills the given slice with non-zero random octets. +func nonZeroRandomBytes(s []byte, rand io.Reader) (err error) { + _, err = io.ReadFull(rand, s) + if err != nil { + return + } + + for i := 0; i < len(s); i++ { + for s[i] == 0 { + _, err = io.ReadFull(rand, s[i:i+1]) + if err != nil { + return + } + } + } + + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/errors/errors.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/errors/errors.go new file mode 100644 index 0000000000..17e2bcfed2 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/errors/errors.go @@ -0,0 +1,116 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package errors contains common error types for the OpenPGP packages. +package errors // import "github.com/ProtonMail/go-crypto/openpgp/errors" + +import ( + "strconv" +) + +// A StructuralError is returned when OpenPGP data is found to be syntactically +// invalid. +type StructuralError string + +func (s StructuralError) Error() string { + return "openpgp: invalid data: " + string(s) +} + +// UnsupportedError indicates that, although the OpenPGP data is valid, it +// makes use of currently unimplemented features. +type UnsupportedError string + +func (s UnsupportedError) Error() string { + return "openpgp: unsupported feature: " + string(s) +} + +// InvalidArgumentError indicates that the caller is in error and passed an +// incorrect value. +type InvalidArgumentError string + +func (i InvalidArgumentError) Error() string { + return "openpgp: invalid argument: " + string(i) +} + +// SignatureError indicates that a syntactically valid signature failed to +// validate. +type SignatureError string + +func (b SignatureError) Error() string { + return "openpgp: invalid signature: " + string(b) +} + +var ErrMDCHashMismatch error = SignatureError("MDC hash mismatch") +var ErrMDCMissing error = SignatureError("MDC packet not found") + +type signatureExpiredError int + +func (se signatureExpiredError) Error() string { + return "openpgp: signature expired" +} + +var ErrSignatureExpired error = signatureExpiredError(0) + +type keyExpiredError int + +func (ke keyExpiredError) Error() string { + return "openpgp: key expired" +} + +var ErrKeyExpired error = keyExpiredError(0) + +type keyIncorrectError int + +func (ki keyIncorrectError) Error() string { + return "openpgp: incorrect key" +} + +var ErrKeyIncorrect error = keyIncorrectError(0) + +// KeyInvalidError indicates that the public key parameters are invalid +// as they do not match the private ones +type KeyInvalidError string + +func (e KeyInvalidError) Error() string { + return "openpgp: invalid key: " + string(e) +} + +type unknownIssuerError int + +func (unknownIssuerError) Error() string { + return "openpgp: signature made by unknown entity" +} + +var ErrUnknownIssuer error = unknownIssuerError(0) + +type keyRevokedError int + +func (keyRevokedError) Error() string { + return "openpgp: signature made by revoked key" +} + +var ErrKeyRevoked error = keyRevokedError(0) + +type UnknownPacketTypeError uint8 + +func (upte UnknownPacketTypeError) Error() string { + return "openpgp: unknown packet type: " + strconv.Itoa(int(upte)) +} + +// AEADError indicates that there is a problem when initializing or using a +// AEAD instance, configuration struct, nonces or index values. +type AEADError string + +func (ae AEADError) Error() string { + return "openpgp: aead error: " + string(ae) +} + +// ErrDummyPrivateKey results when operations are attempted on a private key +// that is just a dummy key. See +// https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=doc/DETAILS;h=fe55ae16ab4e26d8356dc574c9e8bc935e71aef1;hb=23191d7851eae2217ecdac6484349849a24fd94a#l1109 +type ErrDummyPrivateKey string + +func (dke ErrDummyPrivateKey) Error() string { + return "openpgp: s2k GNU dummy key: " + string(dke) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go new file mode 100644 index 0000000000..17a1bfe9cb --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go @@ -0,0 +1,65 @@ +// Copyright (C) 2019 ProtonTech AG + +package algorithm + +import ( + "crypto/cipher" + "github.com/ProtonMail/go-crypto/eax" + "github.com/ProtonMail/go-crypto/ocb" +) + +// AEADMode defines the Authenticated Encryption with Associated Data mode of +// operation. +type AEADMode uint8 + +// Supported modes of operation (see RFC4880bis [EAX] and RFC7253) +const ( + AEADModeEAX = AEADMode(1) + AEADModeOCB = AEADMode(2) + AEADModeGCM = AEADMode(100) +) + +// TagLength returns the length in bytes of authentication tags. +func (mode AEADMode) TagLength() int { + switch mode { + case AEADModeEAX: + return 16 + case AEADModeOCB: + return 16 + case AEADModeGCM: + return 16 + default: + return 0 + } +} + +// NonceLength returns the length in bytes of nonces. +func (mode AEADMode) NonceLength() int { + switch mode { + case AEADModeEAX: + return 16 + case AEADModeOCB: + return 15 + case AEADModeGCM: + return 12 + default: + return 0 + } +} + +// New returns a fresh instance of the given mode +func (mode AEADMode) New(block cipher.Block) (alg cipher.AEAD) { + var err error + switch mode { + case AEADModeEAX: + alg, err = eax.NewEAX(block) + case AEADModeOCB: + alg, err = ocb.NewOCB(block) + case AEADModeGCM: + alg, err = cipher.NewGCM(block) + } + if err != nil { + panic(err.Error()) + } + return alg +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/cipher.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/cipher.go new file mode 100644 index 0000000000..5760cff80e --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/cipher.go @@ -0,0 +1,107 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package algorithm + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/des" + + "golang.org/x/crypto/cast5" +) + +// Cipher is an official symmetric key cipher algorithm. See RFC 4880, +// section 9.2. +type Cipher interface { + // Id returns the algorithm ID, as a byte, of the cipher. + Id() uint8 + // KeySize returns the key size, in bytes, of the cipher. + KeySize() int + // BlockSize returns the block size, in bytes, of the cipher. + BlockSize() int + // New returns a fresh instance of the given cipher. + New(key []byte) cipher.Block +} + +// The following constants mirror the OpenPGP standard (RFC 4880). +const ( + TripleDES = CipherFunction(2) + CAST5 = CipherFunction(3) + AES128 = CipherFunction(7) + AES192 = CipherFunction(8) + AES256 = CipherFunction(9) +) + +// CipherById represents the different block ciphers specified for OpenPGP. See +// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13 +var CipherById = map[uint8]Cipher{ + TripleDES.Id(): TripleDES, + CAST5.Id(): CAST5, + AES128.Id(): AES128, + AES192.Id(): AES192, + AES256.Id(): AES256, +} + +type CipherFunction uint8 + +// ID returns the algorithm Id, as a byte, of cipher. +func (sk CipherFunction) Id() uint8 { + return uint8(sk) +} + +var keySizeByID = map[uint8]int{ + TripleDES.Id(): 24, + CAST5.Id(): cast5.KeySize, + AES128.Id(): 16, + AES192.Id(): 24, + AES256.Id(): 32, +} + +// KeySize returns the key size, in bytes, of cipher. +func (cipher CipherFunction) KeySize() int { + switch cipher { + case TripleDES: + return 24 + case CAST5: + return cast5.KeySize + case AES128: + return 16 + case AES192: + return 24 + case AES256: + return 32 + } + return 0 +} + +// BlockSize returns the block size, in bytes, of cipher. +func (cipher CipherFunction) BlockSize() int { + switch cipher { + case TripleDES: + return des.BlockSize + case CAST5: + return 8 + case AES128, AES192, AES256: + return 16 + } + return 0 +} + +// New returns a fresh instance of the given cipher. +func (cipher CipherFunction) New(key []byte) (block cipher.Block) { + var err error + switch cipher { + case TripleDES: + block, err = des.NewTripleDESCipher(key) + case CAST5: + block, err = cast5.NewCipher(key) + case AES128, AES192, AES256: + block, err = aes.NewCipher(key) + } + if err != nil { + panic(err.Error()) + } + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go new file mode 100644 index 0000000000..3f1b61b88e --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go @@ -0,0 +1,86 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package algorithm + +import ( + "crypto" + "fmt" + "hash" +) + +// Hash is an official hash function algorithm. See RFC 4880, section 9.4. +type Hash interface { + // Id returns the algorithm ID, as a byte, of Hash. + Id() uint8 + // Available reports whether the given hash function is linked into the binary. + Available() bool + // HashFunc simply returns the value of h so that Hash implements SignerOpts. + HashFunc() crypto.Hash + // New returns a new hash.Hash calculating the given hash function. New + // panics if the hash function is not linked into the binary. + New() hash.Hash + // Size returns the length, in bytes, of a digest resulting from the given + // hash function. It doesn't require that the hash function in question be + // linked into the program. + Size() int + // String is the name of the hash function corresponding to the given + // OpenPGP hash id. + String() string +} + +// The following vars mirror the crypto/Hash supported hash functions. +var ( + MD5 Hash = cryptoHash{1, crypto.MD5} + SHA1 Hash = cryptoHash{2, crypto.SHA1} + RIPEMD160 Hash = cryptoHash{3, crypto.RIPEMD160} + SHA256 Hash = cryptoHash{8, crypto.SHA256} + SHA384 Hash = cryptoHash{9, crypto.SHA384} + SHA512 Hash = cryptoHash{10, crypto.SHA512} + SHA224 Hash = cryptoHash{11, crypto.SHA224} +) + +// HashById represents the different hash functions specified for OpenPGP. See +// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-14 +var ( + HashById = map[uint8]Hash{ + MD5.Id(): MD5, + SHA1.Id(): SHA1, + RIPEMD160.Id(): RIPEMD160, + SHA256.Id(): SHA256, + SHA384.Id(): SHA384, + SHA512.Id(): SHA512, + SHA224.Id(): SHA224, + } +) + +// cryptoHash contains pairs relating OpenPGP's hash identifier with +// Go's crypto.Hash type. See RFC 4880, section 9.4. +type cryptoHash struct { + id uint8 + crypto.Hash +} + +// Id returns the algorithm ID, as a byte, of cryptoHash. +func (h cryptoHash) Id() uint8 { + return h.id +} + +var hashNames = map[uint8]string{ + MD5.Id(): "MD5", + SHA1.Id(): "SHA1", + RIPEMD160.Id(): "RIPEMD160", + SHA256.Id(): "SHA256", + SHA384.Id(): "SHA384", + SHA512.Id(): "SHA512", + SHA224.Id(): "SHA224", +} + +func (h cryptoHash) String() string { + s, ok := hashNames[h.id] + if !ok { + panic(fmt.Sprintf("Unsupported hash function %d", h.id)) + } + return s +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curveInfo.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curveInfo.go new file mode 100644 index 0000000000..f91042fd85 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curveInfo.go @@ -0,0 +1,118 @@ +package ecc + +import ( + "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" + "crypto/elliptic" + "bytes" + "github.com/ProtonMail/go-crypto/bitcurves" + "github.com/ProtonMail/go-crypto/brainpool" +) + +type SignatureAlgorithm uint8 + +const ( + ECDSA SignatureAlgorithm = 1 + EdDSA SignatureAlgorithm = 2 +) + +type CurveInfo struct { + Name string + Oid *encoding.OID + Curve elliptic.Curve + SigAlgorithm SignatureAlgorithm + CurveType CurveType +} + +var curves = []CurveInfo{ + { + Name: "NIST curve P-256", + Oid: encoding.NewOID([]byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}), + Curve: elliptic.P256(), + CurveType: NISTCurve, + SigAlgorithm: ECDSA, + }, + { + Name: "NIST curve P-384", + Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x22}), + Curve: elliptic.P384(), + CurveType: NISTCurve, + SigAlgorithm: ECDSA, + }, + { + Name: "NIST curve P-521", + Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x23}), + Curve: elliptic.P521(), + CurveType: NISTCurve, + SigAlgorithm: ECDSA, + }, + { + Name: "SecP256k1", + Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x0A}), + Curve: bitcurves.S256(), + CurveType: BitCurve, + SigAlgorithm: ECDSA, + }, + { + Name: "Curve25519", + Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01}), + Curve: elliptic.P256(),// filler + CurveType: Curve25519, + SigAlgorithm: ECDSA, + }, + { + Name: "Ed25519", + Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01}), + Curve: elliptic.P256(), // filler + CurveType: NISTCurve, + SigAlgorithm: EdDSA, + }, + { + Name: "Brainpool P256r1", + Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07}), + Curve: brainpool.P256r1(), + CurveType: BrainpoolCurve, + SigAlgorithm: ECDSA, + }, + { + Name: "BrainpoolP384r1", + Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B}), + Curve: brainpool.P384r1(), + CurveType: BrainpoolCurve, + SigAlgorithm: ECDSA, + }, + { + Name: "BrainpoolP512r1", + Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D}), + Curve: brainpool.P512r1(), + CurveType: BrainpoolCurve, + SigAlgorithm: ECDSA, + }, +} + +func FindByCurve(curve elliptic.Curve) *CurveInfo { + for _, curveInfo := range curves { + if curveInfo.Curve == curve { + return &curveInfo + } + } + return nil +} + +func FindByOid(oid encoding.Field) *CurveInfo { + var rawBytes = oid.Bytes() + for _, curveInfo := range curves { + if bytes.Equal(curveInfo.Oid.Bytes(), rawBytes) { + return &curveInfo + } + } + return nil +} + +func FindByName(name string) *CurveInfo { + for _, curveInfo := range curves { + if curveInfo.Name == name { + return &curveInfo + } + } + return nil +} \ No newline at end of file diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curveType.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curveType.go new file mode 100644 index 0000000000..de8bca0ac2 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curveType.go @@ -0,0 +1,10 @@ +package ecc + +type CurveType uint8 + +const ( + NISTCurve CurveType = 1 + Curve25519 CurveType = 2 + BitCurve CurveType = 3 + BrainpoolCurve CurveType = 4 +) \ No newline at end of file diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/encoding.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/encoding.go new file mode 100644 index 0000000000..6c921481b7 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/encoding.go @@ -0,0 +1,27 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package encoding implements openpgp packet field encodings as specified in +// RFC 4880 and 6637. +package encoding + +import "io" + +// Field is an encoded field of an openpgp packet. +type Field interface { + // Bytes returns the decoded data. + Bytes() []byte + + // BitLength is the size in bits of the decoded data. + BitLength() uint16 + + // EncodedBytes returns the encoded data. + EncodedBytes() []byte + + // EncodedLength is the size in bytes of the encoded data. + EncodedLength() uint16 + + // ReadFrom reads the next Field from r. + ReadFrom(r io.Reader) (int64, error) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/mpi.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/mpi.go new file mode 100644 index 0000000000..02e5e695c3 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/mpi.go @@ -0,0 +1,91 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package encoding + +import ( + "io" + "math/big" + "math/bits" +) + +// An MPI is used to store the contents of a big integer, along with the bit +// length that was specified in the original input. This allows the MPI to be +// reserialized exactly. +type MPI struct { + bytes []byte + bitLength uint16 +} + +// NewMPI returns a MPI initialized with bytes. +func NewMPI(bytes []byte) *MPI { + for len(bytes) != 0 && bytes[0] == 0 { + bytes = bytes[1:] + } + if len(bytes) == 0 { + bitLength := uint16(0) + return &MPI{bytes, bitLength} + } + bitLength := 8*uint16(len(bytes)-1) + uint16(bits.Len8(bytes[0])) + return &MPI{bytes, bitLength} +} + +// Bytes returns the decoded data. +func (m *MPI) Bytes() []byte { + return m.bytes +} + +// BitLength is the size in bits of the decoded data. +func (m *MPI) BitLength() uint16 { + return m.bitLength +} + +// EncodedBytes returns the encoded data. +func (m *MPI) EncodedBytes() []byte { + return append([]byte{byte(m.bitLength >> 8), byte(m.bitLength)}, m.bytes...) +} + +// EncodedLength is the size in bytes of the encoded data. +func (m *MPI) EncodedLength() uint16 { + return uint16(2 + len(m.bytes)) +} + +// ReadFrom reads into m the next MPI from r. +func (m *MPI) ReadFrom(r io.Reader) (int64, error) { + var buf [2]byte + n, err := io.ReadFull(r, buf[0:]) + if err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return int64(n), err + } + + m.bitLength = uint16(buf[0])<<8 | uint16(buf[1]) + m.bytes = make([]byte, (int(m.bitLength)+7)/8) + + nn, err := io.ReadFull(r, m.bytes) + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + + // remove leading zero bytes from malformed GnuPG encoded MPIs: + // https://bugs.gnupg.org/gnupg/issue1853 + // for _, b := range m.bytes { + // if b != 0 { + // break + // } + // m.bytes = m.bytes[1:] + // m.bitLength -= 8 + // } + + return int64(n) + int64(nn), err +} + +// SetBig initializes m with the bits from n. +func (m *MPI) SetBig(n *big.Int) *MPI { + m.bytes = n.Bytes() + m.bitLength = uint16(n.BitLen()) + return m +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/oid.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/oid.go new file mode 100644 index 0000000000..ee39fd6bbb --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/oid.go @@ -0,0 +1,88 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package encoding + +import ( + "io" + + "github.com/ProtonMail/go-crypto/openpgp/errors" +) + +// OID is used to store a variable-length field with a one-octet size +// prefix. See https://tools.ietf.org/html/rfc6637#section-9. +type OID struct { + bytes []byte +} + +const ( + // maxOID is the maximum number of bytes in a OID. + maxOID = 254 + // reservedOIDLength1 and reservedOIDLength2 are OID lengths that the RFC + // specifies are reserved. + reservedOIDLength1 = 0 + reservedOIDLength2 = 0xff +) + +// NewOID returns a OID initialized with bytes. +func NewOID(bytes []byte) *OID { + switch len(bytes) { + case reservedOIDLength1, reservedOIDLength2: + panic("encoding: NewOID argument length is reserved") + default: + if len(bytes) > maxOID { + panic("encoding: NewOID argment too large") + } + } + + return &OID{ + bytes: bytes, + } +} + +// Bytes returns the decoded data. +func (o *OID) Bytes() []byte { + return o.bytes +} + +// BitLength is the size in bits of the decoded data. +func (o *OID) BitLength() uint16 { + return uint16(len(o.bytes) * 8) +} + +// EncodedBytes returns the encoded data. +func (o *OID) EncodedBytes() []byte { + return append([]byte{byte(len(o.bytes))}, o.bytes...) +} + +// EncodedLength is the size in bytes of the encoded data. +func (o *OID) EncodedLength() uint16 { + return uint16(1 + len(o.bytes)) +} + +// ReadFrom reads into b the next OID from r. +func (o *OID) ReadFrom(r io.Reader) (int64, error) { + var buf [1]byte + n, err := io.ReadFull(r, buf[:]) + if err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return int64(n), err + } + + switch buf[0] { + case reservedOIDLength1, reservedOIDLength2: + return int64(n), errors.UnsupportedError("reserved for future extensions") + } + + o.bytes = make([]byte, buf[0]) + + nn, err := io.ReadFull(r, o.bytes) + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + + return int64(n) + int64(nn), err +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go new file mode 100644 index 0000000000..0952d8c739 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go @@ -0,0 +1,384 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package openpgp + +import ( + "crypto" + "crypto/rand" + "crypto/rsa" + goerrors "errors" + "io" + "math/big" + + "github.com/ProtonMail/go-crypto/openpgp/ecdh" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" + "github.com/ProtonMail/go-crypto/openpgp/packet" + "golang.org/x/crypto/ed25519" +) + +// NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a +// single identity composed of the given full name, comment and email, any of +// which may be empty but must not contain any of "()<>\x00". +// If config is nil, sensible defaults will be used. +func NewEntity(name, comment, email string, config *packet.Config) (*Entity, error) { + creationTime := config.Now() + keyLifetimeSecs := config.KeyLifetime() + + uid := packet.NewUserId(name, comment, email) + if uid == nil { + return nil, errors.InvalidArgumentError("user id field contained invalid characters") + } + + // Generate a primary signing key + primaryPrivRaw, err := newSigner(config) + if err != nil { + return nil, err + } + primary := packet.NewSignerPrivateKey(creationTime, primaryPrivRaw) + if config != nil && config.V5Keys { + primary.UpgradeToV5() + } + + isPrimaryId := true + selfSignature := &packet.Signature{ + Version: primary.PublicKey.Version, + SigType: packet.SigTypePositiveCert, + PubKeyAlgo: primary.PublicKey.PubKeyAlgo, + Hash: config.Hash(), + CreationTime: creationTime, + KeyLifetimeSecs: &keyLifetimeSecs, + IssuerKeyId: &primary.PublicKey.KeyId, + IssuerFingerprint: primary.PublicKey.Fingerprint, + IsPrimaryId: &isPrimaryId, + FlagsValid: true, + FlagSign: true, + FlagCertify: true, + MDC: true, // true by default, see 5.8 vs. 5.14 + AEAD: config.AEAD() != nil, + V5Keys: config != nil && config.V5Keys, + } + + // Set the PreferredHash for the SelfSignature from the packet.Config. + // If it is not the must-implement algorithm from rfc4880bis, append that. + selfSignature.PreferredHash = []uint8{hashToHashId(config.Hash())} + if config.Hash() != crypto.SHA256 { + selfSignature.PreferredHash = append(selfSignature.PreferredHash, hashToHashId(crypto.SHA256)) + } + + // Likewise for DefaultCipher. + selfSignature.PreferredSymmetric = []uint8{uint8(config.Cipher())} + if config.Cipher() != packet.CipherAES128 { + selfSignature.PreferredSymmetric = append(selfSignature.PreferredSymmetric, uint8(packet.CipherAES128)) + } + + // We set CompressionNone as the preferred compression algorithm because + // of compression side channel attacks, then append the configured + // DefaultCompressionAlgo if any is set (to signal support for cases + // where the application knows that using compression is safe). + selfSignature.PreferredCompression = []uint8{uint8(packet.CompressionNone)} + if config.Compression() != packet.CompressionNone { + selfSignature.PreferredCompression = append(selfSignature.PreferredCompression, uint8(config.Compression())) + } + + // And for DefaultMode. + selfSignature.PreferredAEAD = []uint8{uint8(config.AEAD().Mode())} + if config.AEAD().Mode() != packet.AEADModeEAX { + selfSignature.PreferredAEAD = append(selfSignature.PreferredAEAD, uint8(packet.AEADModeEAX)) + } + + // User ID binding signature + err = selfSignature.SignUserId(uid.Id, &primary.PublicKey, primary, config) + if err != nil { + return nil, err + } + + // Generate an encryption subkey + subPrivRaw, err := newDecrypter(config) + if err != nil { + return nil, err + } + sub := packet.NewDecrypterPrivateKey(creationTime, subPrivRaw) + sub.IsSubkey = true + sub.PublicKey.IsSubkey = true + if config != nil && config.V5Keys { + sub.UpgradeToV5() + } + + // NOTE: No KeyLifetimeSecs here, but we will not return this subkey in EncryptionKey() + // if the primary/master key has expired. + subKey := Subkey{ + PublicKey: &sub.PublicKey, + PrivateKey: sub, + Sig: &packet.Signature{ + Version: primary.PublicKey.Version, + CreationTime: creationTime, + SigType: packet.SigTypeSubkeyBinding, + PubKeyAlgo: primary.PublicKey.PubKeyAlgo, + Hash: config.Hash(), + FlagsValid: true, + FlagEncryptStorage: true, + FlagEncryptCommunications: true, + IssuerKeyId: &primary.PublicKey.KeyId, + }, + } + + // Subkey binding signature + err = subKey.Sig.SignKey(subKey.PublicKey, primary, config) + if err != nil { + return nil, err + } + + return &Entity{ + PrimaryKey: &primary.PublicKey, + PrivateKey: primary, + Identities: map[string]*Identity{ + uid.Id: &Identity{ + Name: uid.Id, + UserId: uid, + SelfSignature: selfSignature, + Signatures: []*packet.Signature{selfSignature}, + }, + }, + Subkeys: []Subkey{subKey}, + }, nil +} + +// AddSigningSubkey adds a signing keypair as a subkey to the Entity. +// If config is nil, sensible defaults will be used. +func (e *Entity) AddSigningSubkey(config *packet.Config) error { + creationTime := config.Now() + keyLifetimeSecs := config.KeyLifetime() + + subPrivRaw, err := newSigner(config) + if err != nil { + return err + } + sub := packet.NewSignerPrivateKey(creationTime, subPrivRaw) + + subkey := Subkey{ + PublicKey: &sub.PublicKey, + PrivateKey: sub, + Sig: &packet.Signature{ + Version: e.PrimaryKey.Version, + CreationTime: creationTime, + KeyLifetimeSecs: &keyLifetimeSecs, + SigType: packet.SigTypeSubkeyBinding, + PubKeyAlgo: e.PrimaryKey.PubKeyAlgo, + Hash: config.Hash(), + FlagsValid: true, + FlagSign: true, + IssuerKeyId: &e.PrimaryKey.KeyId, + EmbeddedSignature: &packet.Signature{ + Version: e.PrimaryKey.Version, + CreationTime: creationTime, + SigType: packet.SigTypePrimaryKeyBinding, + PubKeyAlgo: sub.PublicKey.PubKeyAlgo, + Hash: config.Hash(), + IssuerKeyId: &e.PrimaryKey.KeyId, + }, + }, + } + if config != nil && config.V5Keys { + subkey.PublicKey.UpgradeToV5() + } + + err = subkey.Sig.EmbeddedSignature.CrossSignKey(subkey.PublicKey, e.PrimaryKey, subkey.PrivateKey, config) + if err != nil { + return err + } + + subkey.PublicKey.IsSubkey = true + subkey.PrivateKey.IsSubkey = true + if err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config); err != nil { + return err + } + + e.Subkeys = append(e.Subkeys, subkey) + return nil +} + +// AddEncryptionSubkey adds an encryption keypair as a subkey to the Entity. +// If config is nil, sensible defaults will be used. +func (e *Entity) AddEncryptionSubkey(config *packet.Config) error { + creationTime := config.Now() + keyLifetimeSecs := config.KeyLifetime() + + subPrivRaw, err := newDecrypter(config) + if err != nil { + return err + } + sub := packet.NewDecrypterPrivateKey(creationTime, subPrivRaw) + + subkey := Subkey{ + PublicKey: &sub.PublicKey, + PrivateKey: sub, + Sig: &packet.Signature{ + Version: e.PrimaryKey.Version, + CreationTime: creationTime, + KeyLifetimeSecs: &keyLifetimeSecs, + SigType: packet.SigTypeSubkeyBinding, + PubKeyAlgo: e.PrimaryKey.PubKeyAlgo, + Hash: config.Hash(), + FlagsValid: true, + FlagEncryptStorage: true, + FlagEncryptCommunications: true, + IssuerKeyId: &e.PrimaryKey.KeyId, + }, + } + if config != nil && config.V5Keys { + subkey.PublicKey.UpgradeToV5() + } + + subkey.PublicKey.IsSubkey = true + subkey.PrivateKey.IsSubkey = true + if err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config); err != nil { + return err + } + + e.Subkeys = append(e.Subkeys, subkey) + return nil +} + +// Generates a signing key +func newSigner(config *packet.Config) (signer crypto.Signer, err error) { + switch config.PublicKeyAlgorithm() { + case packet.PubKeyAlgoRSA: + bits := config.RSAModulusBits() + if bits < 1024 { + return nil, errors.InvalidArgumentError("bits must be >= 1024") + } + if config != nil && len(config.RSAPrimes) >= 2 { + primes := config.RSAPrimes[0:2] + config.RSAPrimes = config.RSAPrimes[2:] + return generateRSAKeyWithPrimes(config.Random(), 2, bits, primes) + } + return rsa.GenerateKey(config.Random(), bits) + case packet.PubKeyAlgoEdDSA: + _, priv, err := ed25519.GenerateKey(config.Random()) + if err != nil { + return nil, err + } + return &priv, nil + default: + return nil, errors.InvalidArgumentError("unsupported public key algorithm") + } +} + +// Generates an encryption/decryption key +func newDecrypter(config *packet.Config) (decrypter interface{}, err error) { + switch config.PublicKeyAlgorithm() { + case packet.PubKeyAlgoRSA: + bits := config.RSAModulusBits() + if bits < 1024 { + return nil, errors.InvalidArgumentError("bits must be >= 1024") + } + if config != nil && len(config.RSAPrimes) >= 2 { + primes := config.RSAPrimes[0:2] + config.RSAPrimes = config.RSAPrimes[2:] + return generateRSAKeyWithPrimes(config.Random(), 2, bits, primes) + } + return rsa.GenerateKey(config.Random(), bits) + case packet.PubKeyAlgoEdDSA: + fallthrough // When passing EdDSA, we generate an ECDH subkey + case packet.PubKeyAlgoECDH: + var kdf = ecdh.KDF{ + Hash: algorithm.SHA512, + Cipher: algorithm.AES256, + } + return ecdh.X25519GenerateKey(config.Random(), kdf) + default: + return nil, errors.InvalidArgumentError("unsupported public key algorithm") + } +} + +var bigOne = big.NewInt(1) + +// generateRSAKeyWithPrimes generates a multi-prime RSA keypair of the +// given bit size, using the given random source and prepopulated primes. +func generateRSAKeyWithPrimes(random io.Reader, nprimes int, bits int, prepopulatedPrimes []*big.Int) (*rsa.PrivateKey, error) { + priv := new(rsa.PrivateKey) + priv.E = 65537 + + if nprimes < 2 { + return nil, goerrors.New("generateRSAKeyWithPrimes: nprimes must be >= 2") + } + + if bits < 1024 { + return nil, goerrors.New("generateRSAKeyWithPrimes: bits must be >= 1024") + } + + primes := make([]*big.Int, nprimes) + +NextSetOfPrimes: + for { + todo := bits + // crypto/rand should set the top two bits in each prime. + // Thus each prime has the form + // p_i = 2^bitlen(p_i) × 0.11... (in base 2). + // And the product is: + // P = 2^todo × α + // where α is the product of nprimes numbers of the form 0.11... + // + // If α < 1/2 (which can happen for nprimes > 2), we need to + // shift todo to compensate for lost bits: the mean value of 0.11... + // is 7/8, so todo + shift - nprimes * log2(7/8) ~= bits - 1/2 + // will give good results. + if nprimes >= 7 { + todo += (nprimes - 2) / 5 + } + for i := 0; i < nprimes; i++ { + var err error + if len(prepopulatedPrimes) == 0 { + primes[i], err = rand.Prime(random, todo/(nprimes-i)) + if err != nil { + return nil, err + } + } else { + primes[i] = prepopulatedPrimes[0] + prepopulatedPrimes = prepopulatedPrimes[1:] + } + + todo -= primes[i].BitLen() + } + + // Make sure that primes is pairwise unequal. + for i, prime := range primes { + for j := 0; j < i; j++ { + if prime.Cmp(primes[j]) == 0 { + continue NextSetOfPrimes + } + } + } + + n := new(big.Int).Set(bigOne) + totient := new(big.Int).Set(bigOne) + pminus1 := new(big.Int) + for _, prime := range primes { + n.Mul(n, prime) + pminus1.Sub(prime, bigOne) + totient.Mul(totient, pminus1) + } + if n.BitLen() != bits { + // This should never happen for nprimes == 2 because + // crypto/rand should set the top two bits in each prime. + // For nprimes > 2 we hope it does not happen often. + continue NextSetOfPrimes + } + + priv.D = new(big.Int) + e := big.NewInt(int64(priv.E)) + ok := priv.D.ModInverse(e, totient) + + if ok != nil { + priv.Primes = primes + priv.N = n + break + } + } + + priv.Precompute() + return priv, nil +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go new file mode 100644 index 0000000000..cef3613b61 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go @@ -0,0 +1,789 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package openpgp + +import ( + goerrors "errors" + "io" + "time" + + "github.com/ProtonMail/go-crypto/openpgp/armor" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/packet" +) + +// PublicKeyType is the armor type for a PGP public key. +var PublicKeyType = "PGP PUBLIC KEY BLOCK" + +// PrivateKeyType is the armor type for a PGP private key. +var PrivateKeyType = "PGP PRIVATE KEY BLOCK" + +// An Entity represents the components of an OpenPGP key: a primary public key +// (which must be a signing key), one or more identities claimed by that key, +// and zero or more subkeys, which may be encryption keys. +type Entity struct { + PrimaryKey *packet.PublicKey + PrivateKey *packet.PrivateKey + Identities map[string]*Identity // indexed by Identity.Name + Revocations []*packet.Signature + Subkeys []Subkey +} + +// An Identity represents an identity claimed by an Entity and zero or more +// assertions by other entities about that claim. +type Identity struct { + Name string // by convention, has the form "Full Name (comment) " + UserId *packet.UserId + SelfSignature *packet.Signature + Revocations []*packet.Signature + Signatures []*packet.Signature // all (potentially unverified) self-signatures, revocations, and third-party signatures +} + +// A Subkey is an additional public key in an Entity. Subkeys can be used for +// encryption. +type Subkey struct { + PublicKey *packet.PublicKey + PrivateKey *packet.PrivateKey + Sig *packet.Signature + Revocations []*packet.Signature +} + +// A Key identifies a specific public key in an Entity. This is either the +// Entity's primary key or a subkey. +type Key struct { + Entity *Entity + PublicKey *packet.PublicKey + PrivateKey *packet.PrivateKey + SelfSignature *packet.Signature + Revocations []*packet.Signature +} + +// A KeyRing provides access to public and private keys. +type KeyRing interface { + // KeysById returns the set of keys that have the given key id. + KeysById(id uint64) []Key + // KeysByIdAndUsage returns the set of keys with the given id + // that also meet the key usage given by requiredUsage. + // The requiredUsage is expressed as the bitwise-OR of + // packet.KeyFlag* values. + KeysByIdUsage(id uint64, requiredUsage byte) []Key + // DecryptionKeys returns all private keys that are valid for + // decryption. + DecryptionKeys() []Key +} + +// PrimaryIdentity returns an Identity, preferring non-revoked identities, +// identities marked as primary, or the latest-created identity, in that order. +func (e *Entity) PrimaryIdentity() *Identity { + var primaryIdentity *Identity + for _, ident := range e.Identities { + if shouldPreferIdentity(primaryIdentity, ident) { + primaryIdentity = ident + } + } + return primaryIdentity +} + +func shouldPreferIdentity(existingId, potentialNewId *Identity) bool { + if (existingId == nil) { + return true + } + + if (len(existingId.Revocations) > len(potentialNewId.Revocations)) { + return true + } + + if (len(existingId.Revocations) < len(potentialNewId.Revocations)) { + return false + } + + if (existingId.SelfSignature.IsPrimaryId != nil && *existingId.SelfSignature.IsPrimaryId && + !(potentialNewId.SelfSignature.IsPrimaryId != nil && *potentialNewId.SelfSignature.IsPrimaryId)) { + return false + } + + if (!(existingId.SelfSignature.IsPrimaryId != nil && *existingId.SelfSignature.IsPrimaryId) && + potentialNewId.SelfSignature.IsPrimaryId != nil && *potentialNewId.SelfSignature.IsPrimaryId) { + return true + } + + return potentialNewId.SelfSignature.CreationTime.After(existingId.SelfSignature.CreationTime) +} + +// EncryptionKey returns the best candidate Key for encrypting a message to the +// given Entity. +func (e *Entity) EncryptionKey(now time.Time) (Key, bool) { + // Fail to find any encryption key if the... + i := e.PrimaryIdentity() + if e.PrimaryKey.KeyExpired(i.SelfSignature, now) || // primary key has expired + i.SelfSignature.SigExpired(now) || // user ID self-signature has expired + e.Revoked(now) || // primary key has been revoked + i.Revoked(now) { // user ID has been revoked + return Key{}, false + } + + // Iterate the keys to find the newest, unexpired one + candidateSubkey := -1 + var maxTime time.Time + for i, subkey := range e.Subkeys { + if subkey.Sig.FlagsValid && + subkey.Sig.FlagEncryptCommunications && + subkey.PublicKey.PubKeyAlgo.CanEncrypt() && + !subkey.PublicKey.KeyExpired(subkey.Sig, now) && + !subkey.Sig.SigExpired(now) && + !subkey.Revoked(now) && + (maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) { + candidateSubkey = i + maxTime = subkey.Sig.CreationTime + } + } + + if candidateSubkey != -1 { + subkey := e.Subkeys[candidateSubkey] + return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig, subkey.Revocations}, true + } + + // If we don't have any candidate subkeys for encryption and + // the primary key doesn't have any usage metadata then we + // assume that the primary key is ok. Or, if the primary key is + // marked as ok to encrypt with, then we can obviously use it. + if !i.SelfSignature.FlagsValid || i.SelfSignature.FlagEncryptCommunications && + e.PrimaryKey.PubKeyAlgo.CanEncrypt() { + return Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature, e.Revocations}, true + } + + return Key{}, false +} + +// SigningKey return the best candidate Key for signing a message with this +// Entity. +func (e *Entity) SigningKey(now time.Time) (Key, bool) { + return e.SigningKeyById(now, 0) +} + +// SigningKeyById return the Key for signing a message with this +// Entity and keyID. +func (e *Entity) SigningKeyById(now time.Time, id uint64) (Key, bool) { + // Fail to find any signing key if the... + i := e.PrimaryIdentity() + if e.PrimaryKey.KeyExpired(i.SelfSignature, now) || // primary key has expired + i.SelfSignature.SigExpired(now) || // user ID self-signature has expired + e.Revoked(now) || // primary key has been revoked + i.Revoked(now) { // user ID has been revoked + return Key{}, false + } + + // Iterate the keys to find the newest, unexpired one + candidateSubkey := -1 + var maxTime time.Time + for idx, subkey := range e.Subkeys { + if subkey.Sig.FlagsValid && + subkey.Sig.FlagSign && + subkey.PublicKey.PubKeyAlgo.CanSign() && + !subkey.PublicKey.KeyExpired(subkey.Sig, now) && + !subkey.Sig.SigExpired(now) && + !subkey.Revoked(now) && + (maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) && + (id == 0 || subkey.PublicKey.KeyId == id) { + candidateSubkey = idx + maxTime = subkey.Sig.CreationTime + } + } + + if candidateSubkey != -1 { + subkey := e.Subkeys[candidateSubkey] + return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig, subkey.Revocations}, true + } + + // If we have no candidate subkey then we assume that it's ok to sign + // with the primary key. Or, if the primary key is marked as ok to + // sign with, then we can use it. + if !i.SelfSignature.FlagsValid || i.SelfSignature.FlagSign && + e.PrimaryKey.PubKeyAlgo.CanSign() && + (id == 0 || e.PrimaryKey.KeyId == id) { + return Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature, e.Revocations}, true + } + + // No keys with a valid Signing Flag or no keys matched the id passed in + return Key{}, false +} + +func revoked(revocations []*packet.Signature, now time.Time) bool { + for _, revocation := range revocations { + if revocation.RevocationReason != nil && *revocation.RevocationReason == packet.KeyCompromised { + // If the key is compromised, the key is considered revoked even before the revocation date. + return true + } + if !revocation.SigExpired(now) { + return true + } + } + return false +} + +// Revoked returns whether the entity has any direct key revocation signatures. +// Note that third-party revocation signatures are not supported. +// Note also that Identity and Subkey revocation should be checked separately. +func (e *Entity) Revoked(now time.Time) bool { + return revoked(e.Revocations, now) +} + +// Revoked returns whether the identity has been revoked by a self-signature. +// Note that third-party revocation signatures are not supported. +func (i *Identity) Revoked(now time.Time) bool { + return revoked(i.Revocations, now) +} + +// Revoked returns whether the subkey has been revoked by a self-signature. +// Note that third-party revocation signatures are not supported. +func (s *Subkey) Revoked(now time.Time) bool { + return revoked(s.Revocations, now) +} + +// Revoked returns whether the key or subkey has been revoked by a self-signature. +// Note that third-party revocation signatures are not supported. +// Note also that Identity revocation should be checked separately. +// Normally, it's not necessary to call this function, except on keys returned by +// KeysById or KeysByIdUsage. +func (key *Key) Revoked(now time.Time) bool { + return revoked(key.Revocations, now) +} + +// An EntityList contains one or more Entities. +type EntityList []*Entity + +// KeysById returns the set of keys that have the given key id. +func (el EntityList) KeysById(id uint64) (keys []Key) { + for _, e := range el { + if e.PrimaryKey.KeyId == id { + ident := e.PrimaryIdentity() + selfSig := ident.SelfSignature + keys = append(keys, Key{e, e.PrimaryKey, e.PrivateKey, selfSig, e.Revocations}) + } + + for _, subKey := range e.Subkeys { + if subKey.PublicKey.KeyId == id { + keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig, subKey.Revocations}) + } + } + } + return +} + +// KeysByIdAndUsage returns the set of keys with the given id that also meet +// the key usage given by requiredUsage. The requiredUsage is expressed as +// the bitwise-OR of packet.KeyFlag* values. +func (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) { + for _, key := range el.KeysById(id) { + if key.SelfSignature.FlagsValid && requiredUsage != 0 { + var usage byte + if key.SelfSignature.FlagCertify { + usage |= packet.KeyFlagCertify + } + if key.SelfSignature.FlagSign { + usage |= packet.KeyFlagSign + } + if key.SelfSignature.FlagEncryptCommunications { + usage |= packet.KeyFlagEncryptCommunications + } + if key.SelfSignature.FlagEncryptStorage { + usage |= packet.KeyFlagEncryptStorage + } + if usage&requiredUsage != requiredUsage { + continue + } + } + + keys = append(keys, key) + } + return +} + +// DecryptionKeys returns all private keys that are valid for decryption. +func (el EntityList) DecryptionKeys() (keys []Key) { + for _, e := range el { + for _, subKey := range e.Subkeys { + if subKey.PrivateKey != nil && (!subKey.Sig.FlagsValid || subKey.Sig.FlagEncryptStorage || subKey.Sig.FlagEncryptCommunications) { + keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig, subKey.Revocations}) + } + } + } + return +} + +// ReadArmoredKeyRing reads one or more public/private keys from an armor keyring file. +func ReadArmoredKeyRing(r io.Reader) (EntityList, error) { + block, err := armor.Decode(r) + if err == io.EOF { + return nil, errors.InvalidArgumentError("no armored data found") + } + if err != nil { + return nil, err + } + if block.Type != PublicKeyType && block.Type != PrivateKeyType { + return nil, errors.InvalidArgumentError("expected public or private key block, got: " + block.Type) + } + + return ReadKeyRing(block.Body) +} + +// ReadKeyRing reads one or more public/private keys. Unsupported keys are +// ignored as long as at least a single valid key is found. +func ReadKeyRing(r io.Reader) (el EntityList, err error) { + packets := packet.NewReader(r) + var lastUnsupportedError error + + for { + var e *Entity + e, err = ReadEntity(packets) + if err != nil { + // TODO: warn about skipped unsupported/unreadable keys + if _, ok := err.(errors.UnsupportedError); ok { + lastUnsupportedError = err + err = readToNextPublicKey(packets) + } else if _, ok := err.(errors.StructuralError); ok { + // Skip unreadable, badly-formatted keys + lastUnsupportedError = err + err = readToNextPublicKey(packets) + } + if err == io.EOF { + err = nil + break + } + if err != nil { + el = nil + break + } + } else { + el = append(el, e) + } + } + + if len(el) == 0 && err == nil { + err = lastUnsupportedError + } + return +} + +// readToNextPublicKey reads packets until the start of the entity and leaves +// the first packet of the new entity in the Reader. +func readToNextPublicKey(packets *packet.Reader) (err error) { + var p packet.Packet + for { + p, err = packets.Next() + if err == io.EOF { + return + } else if err != nil { + if _, ok := err.(errors.UnsupportedError); ok { + err = nil + continue + } + return + } + + if pk, ok := p.(*packet.PublicKey); ok && !pk.IsSubkey { + packets.Unread(p) + return + } + } +} + +// ReadEntity reads an entity (public key, identities, subkeys etc) from the +// given Reader. +func ReadEntity(packets *packet.Reader) (*Entity, error) { + e := new(Entity) + e.Identities = make(map[string]*Identity) + + p, err := packets.Next() + if err != nil { + return nil, err + } + + var ok bool + if e.PrimaryKey, ok = p.(*packet.PublicKey); !ok { + if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok { + packets.Unread(p) + return nil, errors.StructuralError("first packet was not a public/private key") + } + e.PrimaryKey = &e.PrivateKey.PublicKey + } + + if !e.PrimaryKey.PubKeyAlgo.CanSign() { + return nil, errors.StructuralError("primary key cannot be used for signatures") + } + + var revocations []*packet.Signature +EachPacket: + for { + p, err := packets.Next() + if err == io.EOF { + break + } else if err != nil { + return nil, err + } + + switch pkt := p.(type) { + case *packet.UserId: + if err := addUserID(e, packets, pkt); err != nil { + return nil, err + } + case *packet.Signature: + if pkt.SigType == packet.SigTypeKeyRevocation { + revocations = append(revocations, pkt) + } else if pkt.SigType == packet.SigTypeDirectSignature { + // TODO: RFC4880 5.2.1 permits signatures + // directly on keys (eg. to bind additional + // revocation keys). + } + // Else, ignoring the signature as it does not follow anything + // we would know to attach it to. + case *packet.PrivateKey: + if pkt.IsSubkey == false { + packets.Unread(p) + break EachPacket + } + err = addSubkey(e, packets, &pkt.PublicKey, pkt) + if err != nil { + return nil, err + } + case *packet.PublicKey: + if pkt.IsSubkey == false { + packets.Unread(p) + break EachPacket + } + err = addSubkey(e, packets, pkt, nil) + if err != nil { + return nil, err + } + default: + // we ignore unknown packets + } + } + + if len(e.Identities) == 0 { + return nil, errors.StructuralError("entity without any identities") + } + + for _, revocation := range revocations { + err = e.PrimaryKey.VerifyRevocationSignature(revocation) + if err == nil { + e.Revocations = append(e.Revocations, revocation) + } else { + // TODO: RFC 4880 5.2.3.15 defines revocation keys. + return nil, errors.StructuralError("revocation signature signed by alternate key") + } + } + + return e, nil +} + +func addUserID(e *Entity, packets *packet.Reader, pkt *packet.UserId) error { + // Make a new Identity object, that we might wind up throwing away. + // We'll only add it if we get a valid self-signature over this + // userID. + identity := new(Identity) + identity.Name = pkt.Id + identity.UserId = pkt + + for { + p, err := packets.Next() + if err == io.EOF { + break + } else if err != nil { + return err + } + + sig, ok := p.(*packet.Signature) + if !ok { + packets.Unread(p) + break + } + + if sig.SigType != packet.SigTypeGenericCert && + sig.SigType != packet.SigTypePersonaCert && + sig.SigType != packet.SigTypeCasualCert && + sig.SigType != packet.SigTypePositiveCert && + sig.SigType != packet.SigTypeCertificationRevocation { + return errors.StructuralError("user ID signature with wrong type") + } + + + if sig.CheckKeyIdOrFingerprint(e.PrimaryKey) { + if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { + return errors.StructuralError("user ID self-signature invalid: " + err.Error()) + } + if sig.SigType == packet.SigTypeCertificationRevocation { + identity.Revocations = append(identity.Revocations, sig) + } else if identity.SelfSignature == nil || sig.CreationTime.After(identity.SelfSignature.CreationTime) { + identity.SelfSignature = sig + } + identity.Signatures = append(identity.Signatures, sig) + e.Identities[pkt.Id] = identity + } else { + identity.Signatures = append(identity.Signatures, sig) + } + } + + return nil +} + +func addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error { + var subKey Subkey + subKey.PublicKey = pub + subKey.PrivateKey = priv + + for { + p, err := packets.Next() + if err == io.EOF { + break + } else if err != nil { + return errors.StructuralError("subkey signature invalid: " + err.Error()) + } + + sig, ok := p.(*packet.Signature) + if !ok { + packets.Unread(p) + break + } + + if sig.SigType != packet.SigTypeSubkeyBinding && sig.SigType != packet.SigTypeSubkeyRevocation { + return errors.StructuralError("subkey signature with wrong type") + } + + if err := e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, sig); err != nil { + return errors.StructuralError("subkey signature invalid: " + err.Error()) + } + + switch sig.SigType { + case packet.SigTypeSubkeyRevocation: + subKey.Revocations = append(subKey.Revocations, sig) + case packet.SigTypeSubkeyBinding: + if subKey.Sig == nil || sig.CreationTime.After(subKey.Sig.CreationTime) { + subKey.Sig = sig + } + } + } + + if subKey.Sig == nil { + return errors.StructuralError("subkey packet not followed by signature") + } + + e.Subkeys = append(e.Subkeys, subKey) + + return nil +} + +// SerializePrivate serializes an Entity, including private key material, but +// excluding signatures from other entities, to the given Writer. +// Identities and subkeys are re-signed in case they changed since NewEntry. +// If config is nil, sensible defaults will be used. +func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) { + if e.PrivateKey.Dummy() { + return errors.ErrDummyPrivateKey("dummy private key cannot re-sign identities") + } + return e.serializePrivate(w, config, true) +} + +// SerializePrivateWithoutSigning serializes an Entity, including private key +// material, but excluding signatures from other entities, to the given Writer. +// Self-signatures of identities and subkeys are not re-signed. This is useful +// when serializing GNU dummy keys, among other things. +// If config is nil, sensible defaults will be used. +func (e *Entity) SerializePrivateWithoutSigning(w io.Writer, config *packet.Config) (err error) { + return e.serializePrivate(w, config, false) +} + +func (e *Entity) serializePrivate(w io.Writer, config *packet.Config, reSign bool) (err error) { + if e.PrivateKey == nil { + return goerrors.New("openpgp: private key is missing") + } + err = e.PrivateKey.Serialize(w) + if err != nil { + return + } + for _, revocation := range e.Revocations { + err := revocation.Serialize(w) + if err != nil { + return err + } + } + for _, ident := range e.Identities { + err = ident.UserId.Serialize(w) + if err != nil { + return + } + if reSign { + err = ident.SelfSignature.SignUserId(ident.UserId.Id, e.PrimaryKey, e.PrivateKey, config) + if err != nil { + return + } + } + for _, revocation := range ident.Revocations { + err := revocation.Serialize(w) + if err != nil { + return err + } + } + err = ident.SelfSignature.Serialize(w) + if err != nil { + return + } + } + for _, subkey := range e.Subkeys { + err = subkey.PrivateKey.Serialize(w) + if err != nil { + return + } + if reSign { + err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config) + if err != nil { + return + } + if subkey.Sig.EmbeddedSignature != nil { + err = subkey.Sig.EmbeddedSignature.CrossSignKey(subkey.PublicKey, e.PrimaryKey, + subkey.PrivateKey, config) + if err != nil { + return + } + } + } + for _, revocation := range subkey.Revocations { + err := revocation.Serialize(w) + if err != nil { + return err + } + } + err = subkey.Sig.Serialize(w) + if err != nil { + return + } + } + return nil +} + +// Serialize writes the public part of the given Entity to w, including +// signatures from other entities. No private key material will be output. +func (e *Entity) Serialize(w io.Writer) error { + err := e.PrimaryKey.Serialize(w) + if err != nil { + return err + } + for _, revocation := range e.Revocations { + err := revocation.Serialize(w) + if err != nil { + return err + } + } + for _, ident := range e.Identities { + err = ident.UserId.Serialize(w) + if err != nil { + return err + } + for _, sig := range ident.Signatures { + err = sig.Serialize(w) + if err != nil { + return err + } + } + } + for _, subkey := range e.Subkeys { + err = subkey.PublicKey.Serialize(w) + if err != nil { + return err + } + for _, revocation := range subkey.Revocations { + err := revocation.Serialize(w) + if err != nil { + return err + } + } + err = subkey.Sig.Serialize(w) + if err != nil { + return err + } + } + return nil +} + +// SignIdentity adds a signature to e, from signer, attesting that identity is +// associated with e. The provided identity must already be an element of +// e.Identities and the private key of signer must have been decrypted if +// necessary. +// If config is nil, sensible defaults will be used. +func (e *Entity) SignIdentity(identity string, signer *Entity, config *packet.Config) error { + if signer.PrivateKey == nil { + return errors.InvalidArgumentError("signing Entity must have a private key") + } + if signer.PrivateKey.Encrypted { + return errors.InvalidArgumentError("signing Entity's private key must be decrypted") + } + ident, ok := e.Identities[identity] + if !ok { + return errors.InvalidArgumentError("given identity string not found in Entity") + } + + sig := &packet.Signature{ + Version: signer.PrivateKey.Version, + SigType: packet.SigTypeGenericCert, + PubKeyAlgo: signer.PrivateKey.PubKeyAlgo, + Hash: config.Hash(), + CreationTime: config.Now(), + IssuerKeyId: &signer.PrivateKey.KeyId, + } + if err := sig.SignUserId(identity, e.PrimaryKey, signer.PrivateKey, config); err != nil { + return err + } + ident.Signatures = append(ident.Signatures, sig) + return nil +} + +// RevokeKey generates a key revocation signature (packet.SigTypeKeyRevocation) with the +// specified reason code and text (RFC4880 section-5.2.3.23). +// If config is nil, sensible defaults will be used. +func (e *Entity) RevokeKey(reason packet.ReasonForRevocation, reasonText string, config *packet.Config) error { + revSig := &packet.Signature{ + Version: e.PrimaryKey.Version, + CreationTime: config.Now(), + SigType: packet.SigTypeKeyRevocation, + PubKeyAlgo: e.PrimaryKey.PubKeyAlgo, + Hash: config.Hash(), + RevocationReason: &reason, + RevocationReasonText: reasonText, + IssuerKeyId: &e.PrimaryKey.KeyId, + } + + if err := revSig.RevokeKey(e.PrimaryKey, e.PrivateKey, config); err != nil { + return err + } + e.Revocations = append(e.Revocations, revSig) + return nil +} + +// RevokeSubkey generates a subkey revocation signature (packet.SigTypeSubkeyRevocation) for +// a subkey with the specified reason code and text (RFC4880 section-5.2.3.23). +// If config is nil, sensible defaults will be used. +func (e *Entity) RevokeSubkey(sk *Subkey, reason packet.ReasonForRevocation, reasonText string, config *packet.Config) error { + if err := e.PrimaryKey.VerifyKeySignature(sk.PublicKey, sk.Sig); err != nil { + return errors.InvalidArgumentError("given subkey is not associated with this key") + } + + revSig := &packet.Signature{ + Version: e.PrimaryKey.Version, + CreationTime: config.Now(), + SigType: packet.SigTypeSubkeyRevocation, + PubKeyAlgo: e.PrimaryKey.PubKeyAlgo, + Hash: config.Hash(), + RevocationReason: &reason, + RevocationReasonText: reasonText, + IssuerKeyId: &e.PrimaryKey.KeyId, + } + + if err := revSig.RevokeSubkey(sk.PublicKey, e.PrivateKey, config); err != nil { + return err + } + + sk.Revocations = append(sk.Revocations, revSig) + return nil +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go new file mode 100644 index 0000000000..a2219e64d1 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go @@ -0,0 +1,400 @@ +package openpgp + +const expiringKeyHex = "c6c04d0451d0c680010800abbb021fd03ffc4e96618901180c3fdcb060ee69eeead97b91256d11420d80b5f1b51930248044130bd300605cf8a05b7a40d3d8cfb0a910be2e3db50dcd50a9c54064c2a5550801daa834ff4480b33d3d3ca495ff8a4e84a886977d17d998f881241a874083d8b995beab555b6d22b8a4817ab17ac3e7304f7d4d2c05c495fb2218348d3bc13651db1d92732e368a9dd7dcefa6eddff30b94706a9aaee47e9d39321460b740c59c6fc3c2fd8ab6c0fb868cb87c0051f0321301fe0f0e1820b15e7fb7063395769b525005c7e30a7ce85984f5cac00504e7b4fdc45d74958de8388436fd5c7ba9ea121f1c851b5911dd1b47a14d81a09e92ef37721e2325b6790011010001cd00c2c07b041001080025050251d0c680050900278d00060b09070803020415080a0203160201021901021b03021e01000a0910e7b484133a890a35ae4b0800a1beb82e7f28eaf5273d6af9d3391314f6280b2b624eaca2851f89a9ebcaf80ac589ebd509f168bc4322106ca2e2ce77a76e071a3c7444787d65216b5f05e82c77928860b92aace3b7d0327db59492f422eb9dfab7249266d37429870b091a98aba8724c2259ebf8f85093f21255eafa75aa841e31d94f2ac891b9755fed455e539044ee69fc47950b80e003fc9f298d695660f28329eaa38037c367efde1727458e514faf990d439a21461b719edaddf9296d3d0647b43ca56cb8dbf63b4fcf8b9968e7928c463470fab3b98e44d0d95645062f94b2d04fe56bd52822b71934db8ce845622c40b92fcbe765a142e7f38b61a6aa9606c8e8858dcd3b6eb1894acec04d0451d1f06b01080088bea67444e1789390e7c0335c86775502d58ec783d99c8ef4e06de235ed3dd4b0467f6f358d818c7d8989d43ec6d69fcbc8c32632d5a1b605e3fa8e41d695fcdcaa535936cd0157f9040dce362519803b908eafe838bb13216c885c6f93e9e8d5745607f0d062322085d6bdc760969149a8ff8dd9f5c18d9bfe2e6f63a06e17694cf1f67587c6fb70e9aebf90ffc528ca3b615ac7c9d4a21ea4f7c06f2e98fbbd90a859b8608bf9ea638e3a54289ce44c283110d0c45fa458de6251cd6e7baf71f80f12c8978340490fd90c92b81736ae902ed958e478dceae2835953d189c45d182aff02ea2be61b81d8e94430f041d638647b43e2fcb45fd512fbf5068b810011010001c2c06504180108000f050251d1f06b050900081095021b0c000a0910e7b484133a890a35e63407fe2ec88d6d1e6c9ce7553ece0cb2524747217bad29f251d33df84599ffcc900141a355abd62126800744068a5e05dc167056aa9205273dc7765a2ed49db15c2a83b8d6e6429c902136f1e12229086c1c10c0053242c2a4ae1930db58163387a48cad64607ff2153c320e42843dec28e3fce90e7399d63ac0affa2fee1f0adc0953c89eb3f46ef1d6c04328ed13b491669d5120a3782e3ffb7c69575fb77eebd108794f4dda9d34be2bae57e8e59ec8ebfda2f6f06104b2321be408ea146e2db482b00c5055c8618de36ac9716f80da2617e225556d0fce61b01c8cea2d1e0ea982c31711060ca370f2739366e1e708f38405d784b49d16a26cf62d152eae734327cec04d0451d1f07b010800d5af91c5e7c2fd8951c8d254eab0c97cdcb66822f868b79b78c366255059a68fd74ebca9adb9b970cd9e586690e6e0756705432306878c897b10a4b4ca0005966f99ac8fa4e6f9caf54bf8e53844544beee9872a7ac64c119cf1393d96e674254b661f61ee975633d0e8a8672531edb6bb8e211204e7754a9efa802342118eee850beea742bac95a3f706cc2024cf6037a308bb68162b2f53b9a6346a96e6d31871a2456186e24a1c7a82b82ac04afdfd57cd7fb9ba77a9c760d40b76a170f7be525e5fb6a9848cc726e806187710d9b190387df28700f321f988a392899f93815cc937f309129eb94d5299c5547cb2c085898e6639496e70d746c9d3fb9881d0011010001c2c06504180108000f050251d1f07b050900266305021b0c000a0910e7b484133a890a35bff207fd10dfe8c4a6ea1dd30568012b6fd6891a763c87ad0f7a1d112aad9e8e3239378a3b85588c235865bac2e614348cb4f216d7217f53b3ef48c192e0a4d31d64d7bfa5faccf21155965fa156e887056db644a05ad08a85cc6152d1377d9e37b46f4ff462bbe68ace2dc586ef90070314576c985d8037c2ba63f0a7dc17a62e15bd77e88bc61d9d00858979709f12304264a4cf4225c5cf86f12c8e19486cb9cdcc69f18f027e5f16f4ca8b50e28b3115eaff3a345acd21f624aef81f6ede515c1b55b26b84c1e32264754eab672d5489b287e7277ea855e0a5ff2aa9e8b8c76d579a964ec225255f4d57bf66639ccb34b64798846943e162a41096a7002ca21c7f56" +const subkeyUsageHex = "988d04533a52bc010400d26af43085558f65b9e7dbc90cb9238015259aed5e954637adcfa2181548b2d0b60c65f1f42ec5081cbf1bc0a8aa4900acfb77070837c58f26012fbce297d70afe96e759ad63531f0037538e70dbf8e384569b9720d99d8eb39d8d0a2947233ed242436cb6ac7dfe74123354b3d0119b5c235d3dd9c9d6c004f8ffaf67ad8583001101000188b7041f010200210502533b8552170c8001ce094aa433f7040bb2ddf0be3893cb843d0fe70c020700000a0910a42704b92866382aa98404009d63d916a27543da4221c60087c33f1c44bec9998c5438018ed370cca4962876c748e94b73eb39c58eb698063f3fd6346d58dd2a11c0247934c4a9d71f24754f7468f96fb24c3e791dd2392b62f626148ad724189498cbf993db2df7c0cdc2d677c35da0f16cb16c9ce7c33b4de65a4a91b1d21a130ae9cc26067718910ef8e2b417556d627261203c756d627261407379642e65642e61753e88b80413010200220502533a52bc021b03060b090807030206150802090a0b0416020301021e01021780000a0910a42704b92866382a47840400c0c2bd04f5fca586de408b395b3c280a278259c93eaaa8b79a53b97003f8ed502a8a00446dd9947fb462677e4fcac0dac2f0701847d15130aadb6cd9e0705ea0cf5f92f129136c7be21a718d46c8e641eb7f044f2adae573e11ae423a0a9ca51324f03a8a2f34b91fa40c3cc764bee4dccadedb54c768ba0469b683ea53f1c29b88d04533a52bc01040099c92a5d6f8b744224da27bc2369127c35269b58bec179de6bbc038f749344222f85a31933224f26b70243c4e4b2d242f0c4777eaef7b5502f9dad6d8bf3aaeb471210674b74de2d7078af497d55f5cdad97c7bedfbc1b41e8065a97c9c3d344b21fc81d27723af8e374bc595da26ea242dccb6ae497be26eea57e563ed517e90011010001889f0418010200090502533a52bc021b0c000a0910a42704b92866382afa1403ff70284c2de8a043ff51d8d29772602fa98009b7861c540535f874f2c230af8caf5638151a636b21f8255003997ccd29747fdd06777bb24f9593bd7d98a3e887689bf902f999915fcc94625ae487e5d13e6616f89090ebc4fdc7eb5cad8943e4056995bb61c6af37f8043016876a958ec7ebf39c43d20d53b7f546cfa83e8d2604b88d04533b8283010400c0b529316dbdf58b4c54461e7e669dc11c09eb7f73819f178ccd4177b9182b91d138605fcf1e463262fabefa73f94a52b5e15d1904635541c7ea540f07050ce0fb51b73e6f88644cec86e91107c957a114f69554548a85295d2b70bd0b203992f76eb5d493d86d9eabcaa7ef3fc7db7e458438db3fcdb0ca1cc97c638439a9170011010001889f0418010200090502533b8283021b0c000a0910a42704b92866382adc6d0400cfff6258485a21675adb7a811c3e19ebca18851533f75a7ba317950b9997fda8d1a4c8c76505c08c04b6c2cc31dc704d33da36a21273f2b388a1a706f7c3378b66d887197a525936ed9a69acb57fe7f718133da85ec742001c5d1864e9c6c8ea1b94f1c3759cebfd93b18606066c063a63be86085b7e37bdbc65f9a915bf084bb901a204533b85cd110400aed3d2c52af2b38b5b67904b0ef73d6dd7aef86adb770e2b153cd22489654dcc91730892087bb9856ae2d9f7ed1eb48f214243fe86bfe87b349ebd7c30e630e49c07b21fdabf78b7a95c8b7f969e97e3d33f2e074c63552ba64a2ded7badc05ce0ea2be6d53485f6900c7860c7aa76560376ce963d7271b9b54638a4028b573f00a0d8854bfcdb04986141568046202192263b9b67350400aaa1049dbc7943141ef590a70dcb028d730371d92ea4863de715f7f0f16d168bd3dc266c2450457d46dcbbf0b071547e5fbee7700a820c3750b236335d8d5848adb3c0da010e998908dfd93d961480084f3aea20b247034f8988eccb5546efaa35a92d0451df3aaf1aee5aa36a4c4d462c760ecd9cebcabfbe1412b1f21450f203fd126687cd486496e971a87fd9e1a8a765fe654baa219a6871ab97768596ab05c26c1aeea8f1a2c72395a58dbc12ef9640d2b95784e974a4d2d5a9b17c25fedacfe551bda52602de8f6d2e48443f5dd1a2a2a8e6a5e70ecdb88cd6e766ad9745c7ee91d78cc55c3d06536b49c3fee6c3d0b6ff0fb2bf13a314f57c953b8f4d93bf88e70418010200090502533b85cd021b0200520910a42704b92866382a47200419110200060502533b85cd000a091042ce2c64bc0ba99214b2009e26b26852c8b13b10c35768e40e78fbbb48bd084100a0c79d9ea0844fa5853dd3c85ff3ecae6f2c9dd6c557aa04008bbbc964cd65b9b8299d4ebf31f41cc7264b8cf33a00e82c5af022331fac79efc9563a822497ba012953cefe2629f1242fcdcb911dbb2315985bab060bfd58261ace3c654bdbbe2e8ed27a46e836490145c86dc7bae15c011f7e1ffc33730109b9338cd9f483e7cef3d2f396aab5bd80efb6646d7e778270ee99d934d187dd98" +const revokedKeyHex = "988d045331ce82010400c4fdf7b40a5477f206e6ee278eaef888ca73bf9128a9eef9f2f1ddb8b7b71a4c07cfa241f028a04edb405e4d916c61d6beabc333813dc7b484d2b3c52ee233c6a79b1eea4e9cc51596ba9cd5ac5aeb9df62d86ea051055b79d03f8a4fa9f38386f5bd17529138f3325d46801514ea9047977e0829ed728e68636802796801be10011010001889f04200102000905025331d0e3021d03000a0910a401d9f09a34f7c042aa040086631196405b7e6af71026b88e98012eab44aa9849f6ef3fa930c7c9f23deaedba9db1538830f8652fb7648ec3fcade8dbcbf9eaf428e83c6cbcc272201bfe2fbb90d41963397a7c0637a1a9d9448ce695d9790db2dc95433ad7be19eb3de72dacf1d6db82c3644c13eae2a3d072b99bb341debba012c5ce4006a7d34a1f4b94b444526567205265766f6b657220283c52656727732022424d204261726973746122204b657920262530305c303e5c29203c72656740626d626172697374612e636f2e61753e88b704130102002205025331ce82021b03060b090807030206150802090a0b0416020301021e01021780000a0910a401d9f09a34f7c0019c03f75edfbeb6a73e7225ad3cc52724e2872e04260d7daf0d693c170d8c4b243b8767bc7785763533febc62ec2600c30603c433c095453ede59ff2fcabeb84ce32e0ed9d5cf15ffcbc816202b64370d4d77c1e9077d74e94a16fb4fa2e5bec23a56d7a73cf275f91691ae1801a976fcde09e981a2f6327ac27ea1fecf3185df0d56889c04100102000605025331cfb5000a0910fe9645554e8266b64b4303fc084075396674fb6f778d302ac07cef6bc0b5d07b66b2004c44aef711cbac79617ef06d836b4957522d8772dd94bf41a2f4ac8b1ee6d70c57503f837445a74765a076d07b829b8111fc2a918423ddb817ead7ca2a613ef0bfb9c6b3562aec6c3cf3c75ef3031d81d95f6563e4cdcc9960bcb386c5d757b104fcca5fe11fc709df884604101102000605025331cfe7000a09107b15a67f0b3ddc0317f6009e360beea58f29c1d963a22b962b80788c3fa6c84e009d148cfde6b351469b8eae91187eff07ad9d08fcaab88d045331ce820104009f25e20a42b904f3fa555530fe5c46737cf7bd076c35a2a0d22b11f7e0b61a69320b768f4a80fe13980ce380d1cfc4a0cd8fbe2d2e2ef85416668b77208baa65bf973fe8e500e78cc310d7c8705cdb34328bf80e24f0385fce5845c33bc7943cf6b11b02348a23da0bf6428e57c05135f2dc6bd7c1ce325d666d5a5fd2fd5e410011010001889f04180102000905025331ce82021b0c000a0910a401d9f09a34f7c0418003fe34feafcbeaef348a800a0d908a7a6809cc7304017d820f70f0474d5e23cb17e38b67dc6dca282c6ca00961f4ec9edf2738d0f087b1d81e4871ef08e1798010863afb4eac4c44a376cb343be929c5be66a78cfd4456ae9ec6a99d97f4e1c3ff3583351db2147a65c0acef5c003fb544ab3a2e2dc4d43646f58b811a6c3a369d1f" +const revokedSubkeyHex = "988d04533121f6010400aefc803a3e4bb1a61c86e8a86d2726c6a43e0079e9f2713f1fa017e9854c83877f4aced8e331d675c67ea83ddab80aacbfa0b9040bb12d96f5a3d6be09455e2a76546cbd21677537db941cab710216b6d24ec277ee0bd65b910f416737ed120f6b93a9d3b306245c8cfd8394606fdb462e5cf43c551438d2864506c63367fc890011010001b41d416c696365203c616c69636540626d626172697374612e636f2e61753e88bb041301020025021b03060b090807030206150802090a0b0416020301021e01021780050253312798021901000a09104ef7e4beccde97f015a803ff5448437780f63263b0df8442a995e7f76c221351a51edd06f2063d8166cf3157aada4923dfc44aa0f2a6a4da5cf83b7fe722ba8ab416c976e77c6b5682e7f1069026673bd0de56ba06fd5d7a9f177607f277d9b55ff940a638c3e68525c67517e2b3d976899b93ca267f705b3e5efad7d61220e96b618a4497eab8d04403d23f8846041011020006050253312910000a09107b15a67f0b3ddc03d96e009f50b6365d86c4be5d5e9d0ea42d5e56f5794c617700a0ab274e19c2827780016d23417ce89e0a2c0d987d889c04100102000605025331cf7a000a0910a401d9f09a34f7c0ee970400aca292f213041c9f3b3fc49148cbda9d84afee6183c8dd6c5ff2600b29482db5fecd4303797be1ee6d544a20a858080fec43412061c9a71fae4039fd58013b4ae341273e6c66ad4c7cdd9e68245bedb260562e7b166f2461a1032f2b38c0e0e5715fb3d1656979e052b55ca827a76f872b78a9fdae64bc298170bfcebedc1271b41a416c696365203c616c696365407379646973702e6f722e61753e88b804130102002205025331278b021b03060b090807030206150802090a0b0416020301021e01021780000a09104ef7e4beccde97f06a7003fa03c3af68d272ebc1fa08aa72a03b02189c26496a2833d90450801c4e42c5b5f51ad96ce2d2c9cef4b7c02a6a2fcf1412d6a2d486098eb762f5010a201819c17fd2888aec8eda20c65a3b75744de7ee5cc8ac7bfc470cbe3cb982720405a27a3c6a8c229cfe36905f881b02ed5680f6a8f05866efb9d6c5844897e631deb949ca8846041011020006050253312910000a09107b15a67f0b3ddc0347bc009f7fa35db59147469eb6f2c5aaf6428accb138b22800a0caa2f5f0874bacc5909c652a57a31beda65eddd5889c04100102000605025331cf7a000a0910a401d9f09a34f7c0316403ff46f2a5c101256627f16384d34a38fb47a6c88ba60506843e532d91614339fccae5f884a5741e7582ffaf292ba38ee10a270a05f139bde3814b6a077e8cd2db0f105ebea2a83af70d385f13b507fac2ad93ff79d84950328bb86f3074745a8b7f9b64990fb142e2a12976e27e8d09a28dc5621f957ac49091116da410ac3cbde1b88d04533121f6010400cbd785b56905e4192e2fb62a720727d43c4fa487821203cf72138b884b78b701093243e1d8c92a0248a6c0203a5a88693da34af357499abacaf4b3309c640797d03093870a323b4b6f37865f6eaa2838148a67df4735d43a90ca87942554cdf1c4a751b1e75f9fd4ce4e97e278d6c1c7ed59d33441df7d084f3f02beb68896c70011010001889f0418010200090502533121f6021b0c000a09104ef7e4beccde97f0b98b03fc0a5ccf6a372995835a2f5da33b282a7d612c0ab2a97f59cf9fff73e9110981aac2858c41399afa29624a7fd8a0add11654e3d882c0fd199e161bdad65e5e2548f7b68a437ea64293db1246e3011cbb94dc1bcdeaf0f2539bd88ff16d95547144d97cead6a8c5927660a91e6db0d16eb36b7b49a3525b54d1644e65599b032b7eb901a204533127a0110400bd3edaa09eff9809c4edc2c2a0ebe52e53c50a19c1e49ab78e6167bf61473bb08f2050d78a5cbbc6ed66aff7b42cd503f16b4a0b99fa1609681fca9b7ce2bbb1a5b3864d6cdda4d7ef7849d156d534dea30fb0efb9e4cf8959a2b2ce623905882d5430b995a15c3b9fe92906086788b891002924f94abe139b42cbbfaaabe42f00a0b65dc1a1ad27d798adbcb5b5ad02d2688c89477b03ff4eebb6f7b15a73b96a96bed201c0e5e4ea27e4c6e2dd1005b94d4b90137a5b1cf5e01c6226c070c4cc999938101578877ee76d296b9aab8246d57049caacf489e80a3f40589cade790a020b1ac146d6f7a6241184b8c7fcde680eae3188f5dcbe846d7f7bdad34f6fcfca08413e19c1d5df83fc7c7c627d493492e009c2f52a80400a2fe82de87136fd2e8845888c4431b032ba29d9a29a804277e31002a8201fb8591a3e55c7a0d0881496caf8b9fb07544a5a4879291d0dc026a0ea9e5bd88eb4aa4947bbd694b25012e208a250d65ddc6f1eea59d3aed3b4ec15fcab85e2afaa23a40ab1ef9ce3e11e1bc1c34a0e758e7aa64deb8739276df0af7d4121f834a9b88e70418010200090502533127a0021b02005209104ef7e4beccde97f047200419110200060502533127a0000a0910dbce4ee19529437fe045009c0b32f5ead48ee8a7e98fac0dea3d3e6c0e2c552500a0ad71fadc5007cfaf842d9b7db3335a8cdad15d3d1a6404009b08e2c68fe8f3b45c1bb72a4b3278cdf3012aa0f229883ad74aa1f6000bb90b18301b2f85372ca5d6b9bf478d235b733b1b197d19ccca48e9daf8e890cb64546b4ce1b178faccfff07003c172a2d4f5ebaba9f57153955f3f61a9b80a4f5cb959908f8b211b03b7026a8a82fc612bfedd3794969bcf458c4ce92be215a1176ab88d045331d144010400a5063000c5aaf34953c1aa3bfc95045b3aab9882b9a8027fecfe2142dc6b47ba8aca667399990244d513dd0504716908c17d92c65e74219e004f7b83fc125e575dd58efec3ab6dd22e3580106998523dea42ec75bf9aa111734c82df54630bebdff20fe981cfc36c76f865eb1c2fb62c9e85bc3a6e5015a361a2eb1c8431578d0011010001889f04280102000905025331d433021d03000a09104ef7e4beccde97f02e5503ff5e0630d1b65291f4882b6d40a29da4616bb5088717d469fbcc3648b8276de04a04988b1f1b9f3e18f52265c1f8b6c85861691c1a6b8a3a25a1809a0b32ad330aec5667cb4262f4450649184e8113849b05e5ad06a316ea80c001e8e71838190339a6e48bbde30647bcf245134b9a97fa875c1d83a9862cae87ffd7e2c4ce3a1b89013d04180102000905025331d144021b0200a809104ef7e4beccde97f09d2004190102000605025331d144000a0910677815e371c2fd23522203fe22ab62b8e7a151383cea3edd3a12995693911426f8ccf125e1f6426388c0010f88d9ca7da2224aee8d1c12135998640c5e1813d55a93df472faae75bef858457248db41b4505827590aeccf6f9eb646da7f980655dd3050c6897feddddaca90676dee856d66db8923477d251712bb9b3186b4d0114daf7d6b59272b53218dd1da94a03ff64006fcbe71211e5daecd9961fba66cdb6de3f914882c58ba5beddeba7dcb950c1156d7fba18c19ea880dccc800eae335deec34e3b84ac75ffa24864f782f87815cda1c0f634b3dd2fa67cea30811d21723d21d9551fa12ccbcfa62b6d3a15d01307b99925707992556d50065505b090aadb8579083a20fe65bd2a270da9b011" + +const missingCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- +Charset: UTF-8 + +mQENBFMYynYBCACVOZ3/e8Bm2b9KH9QyIlHGo/i1bnkpqsgXj8tpJ2MIUOnXMMAY +ztW7kKFLCmgVdLIC0vSoLA4yhaLcMojznh/2CcUglZeb6Ao8Gtelr//Rd5DRfPpG +zqcfUo+m+eO1co2Orabw0tZDfGpg5p3AYl0hmxhUyYSc/xUq93xL1UJzBFgYXY54 +QsM8dgeQgFseSk/YvdP5SMx1ev+eraUyiiUtWzWrWC1TdyRa5p4UZg6Rkoppf+WJ +QrW6BWrhAtqATHc8ozV7uJjeONjUEq24roRc/OFZdmQQGK6yrzKnnbA6MdHhqpdo +9kWDcXYb7pSE63Lc+OBa5X2GUVvXJLS/3nrtABEBAAG0F2ludmFsaWQtc2lnbmlu +Zy1zdWJrZXlziQEoBBMBAgASBQJTnKB5AhsBAgsHAhUIAh4BAAoJEO3UDQUIHpI/ +dN4H/idX4FQ1LIZCnpHS/oxoWQWfpRgdKAEM0qCqjMgiipJeEwSQbqjTCynuh5/R +JlODDz85ABR06aoF4l5ebGLQWFCYifPnJZ/Yf5OYcMGtb7dIbqxWVFL9iLMO/oDL +ioI3dotjPui5e+2hI9pVH1UHB/bZ/GvMGo6Zg0XxLPolKQODMVjpjLAQ0YJ3spew +RAmOGre6tIvbDsMBnm8qREt7a07cBJ6XK7xjxYaZHQBiHVxyEWDa6gyANONx8duW +/fhQ/zDTnyVM/ik6VO0Ty9BhPpcEYLFwh5c1ilFari1ta3e6qKo6ZGa9YMk/REhu +yBHd9nTkI+0CiQUmbckUiVjDKKe5AQ0EUxjKdgEIAJcXQeP+NmuciE99YcJoffxv +2gVLU4ZXBNHEaP0mgaJ1+tmMD089vUQAcyGRvw8jfsNsVZQIOAuRxY94aHQhIRHR +bUzBN28ofo/AJJtfx62C15xt6fDKRV6HXYqAiygrHIpEoRLyiN69iScUsjIJeyFL +C8wa72e8pSL6dkHoaV1N9ZH/xmrJ+k0vsgkQaAh9CzYufncDxcwkoP+aOlGtX1gP +WwWoIbz0JwLEMPHBWvDDXQcQPQTYQyj+LGC9U6f9VZHN25E94subM1MjuT9OhN9Y +MLfWaaIc5WyhLFyQKW2Upofn9wSFi8ubyBnv640Dfd0rVmaWv7LNTZpoZ/GbJAMA +EQEAAYkBHwQYAQIACQUCU5ygeQIbAgAKCRDt1A0FCB6SP0zCB/sEzaVR38vpx+OQ +MMynCBJrakiqDmUZv9xtplY7zsHSQjpd6xGflbU2n+iX99Q+nav0ETQZifNUEd4N +1ljDGQejcTyKD6Pkg6wBL3x9/RJye7Zszazm4+toJXZ8xJ3800+BtaPoI39akYJm ++ijzbskvN0v/j5GOFJwQO0pPRAFtdHqRs9Kf4YanxhedB4dIUblzlIJuKsxFit6N +lgGRblagG3Vv2eBszbxzPbJjHCgVLR3RmrVezKOsZjr/2i7X+xLWIR0uD3IN1qOW +CXQxLBizEEmSNVNxsp7KPGTLnqO3bPtqFirxS9PJLIMPTPLNBY7ZYuPNTMqVIUWF +4artDmrG +=7FfJ +-----END PGP PUBLIC KEY BLOCK-----` + +const invalidCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFMYynYBCACVOZ3/e8Bm2b9KH9QyIlHGo/i1bnkpqsgXj8tpJ2MIUOnXMMAY +ztW7kKFLCmgVdLIC0vSoLA4yhaLcMojznh/2CcUglZeb6Ao8Gtelr//Rd5DRfPpG +zqcfUo+m+eO1co2Orabw0tZDfGpg5p3AYl0hmxhUyYSc/xUq93xL1UJzBFgYXY54 +QsM8dgeQgFseSk/YvdP5SMx1ev+eraUyiiUtWzWrWC1TdyRa5p4UZg6Rkoppf+WJ +QrW6BWrhAtqATHc8ozV7uJjeONjUEq24roRc/OFZdmQQGK6yrzKnnbA6MdHhqpdo +9kWDcXYb7pSE63Lc+OBa5X2GUVvXJLS/3nrtABEBAAG0F2ludmFsaWQtc2lnbmlu +Zy1zdWJrZXlziQEoBBMBAgASBQJTnKB5AhsBAgsHAhUIAh4BAAoJEO3UDQUIHpI/ +dN4H/idX4FQ1LIZCnpHS/oxoWQWfpRgdKAEM0qCqjMgiipJeEwSQbqjTCynuh5/R +JlODDz85ABR06aoF4l5ebGLQWFCYifPnJZ/Yf5OYcMGtb7dIbqxWVFL9iLMO/oDL +ioI3dotjPui5e+2hI9pVH1UHB/bZ/GvMGo6Zg0XxLPolKQODMVjpjLAQ0YJ3spew +RAmOGre6tIvbDsMBnm8qREt7a07cBJ6XK7xjxYaZHQBiHVxyEWDa6gyANONx8duW +/fhQ/zDTnyVM/ik6VO0Ty9BhPpcEYLFwh5c1ilFari1ta3e6qKo6ZGa9YMk/REhu +yBHd9nTkI+0CiQUmbckUiVjDKKe5AQ0EUxjKdgEIAIINDqlj7X6jYKc6DjwrOkjQ +UIRWbQQar0LwmNilehmt70g5DCL1SYm9q4LcgJJ2Nhxj0/5qqsYib50OSWMcKeEe +iRXpXzv1ObpcQtI5ithp0gR53YPXBib80t3bUzomQ5UyZqAAHzMp3BKC54/vUrSK +FeRaxDzNLrCeyI00+LHNUtwghAqHvdNcsIf8VRumK8oTm3RmDh0TyjASWYbrt9c8 +R1Um3zuoACOVy+mEIgIzsfHq0u7dwYwJB5+KeM7ZLx+HGIYdUYzHuUE1sLwVoELh ++SHIGHI1HDicOjzqgajShuIjj5hZTyQySVprrsLKiXS6NEwHAP20+XjayJ/R3tEA +EQEAAYkCPgQYAQIBKAUCU5ygeQIbAsBdIAQZAQIABgUCU5ygeQAKCRCpVlnFZmhO +52RJB/9uD1MSa0wjY6tHOIgquZcP3bHBvHmrHNMw9HR2wRCMO91ZkhrpdS3ZHtgb +u3/55etj0FdvDo1tb8P8FGSVtO5Vcwf5APM8sbbqoi8L951Q3i7qt847lfhu6sMl +w0LWFvPTOLHrliZHItPRjOltS1WAWfr2jUYhsU9ytaDAJmvf9DujxEOsN5G1YJep +54JCKVCkM/y585Zcnn+yxk/XwqoNQ0/iJUT9qRrZWvoeasxhl1PQcwihCwss44A+ +YXaAt3hbk+6LEQuZoYS73yR3WHj+42tfm7YxRGeubXfgCEz/brETEWXMh4pe0vCL +bfWrmfSPq2rDegYcAybxRQz0lF8PAAoJEO3UDQUIHpI/exkH/0vQfdHA8g/N4T6E +i6b1CUVBAkvtdJpCATZjWPhXmShOw62gkDw306vHPilL4SCvEEi4KzG72zkp6VsB +DSRcpxCwT4mHue+duiy53/aRMtSJ+vDfiV1Vhq+3sWAck/yUtfDU9/u4eFaiNok1 +8/Gd7reyuZt5CiJnpdPpjCwelK21l2w7sHAnJF55ITXdOxI8oG3BRKufz0z5lyDY +s2tXYmhhQIggdgelN8LbcMhWs/PBbtUr6uZlNJG2lW1yscD4aI529VjwJlCeo745 +U7pO4eF05VViUJ2mmfoivL3tkhoTUWhx8xs8xCUcCg8DoEoSIhxtOmoTPR22Z9BL +6LCg2mg= +=Dhm4 +-----END PGP PUBLIC KEY BLOCK-----` + +const goodCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mI0EVUqeVwEEAMufHRrMPWK3gyvi0O0tABCs/oON9zV9KDZlr1a1M91ShCSFwCPo +7r80PxdWVWcj0V5h50/CJYtpN3eE/mUIgW2z1uDYQF1OzrQ8ubrksfsJvpAhENom +lTQEppv9mV8qhcM278teb7TX0pgrUHLYF5CfPdp1L957JLLXoQR/lwLVABEBAAG0 +E2dvb2Qtc2lnbmluZy1zdWJrZXmIuAQTAQIAIgUCVUqeVwIbAwYLCQgHAwIGFQgC +CQoLBBYCAwECHgECF4AACgkQNRjL95IRWP69XQQAlH6+eyXJN4DZTLX78KGjHrsw +6FCvxxClEPtPUjcJy/1KCRQmtLAt9PbbA78dvgzjDeZMZqRAwdjyJhjyg/fkU2OH +7wq4ktjUu+dLcOBb+BFMEY+YjKZhf6EJuVfxoTVr5f82XNPbYHfTho9/OABKH6kv +X70PaKZhbwnwij8Nts65AaIEVUqftREEAJ3WxZfqAX0bTDbQPf2CMT2IVMGDfhK7 +GyubOZgDFFjwUJQvHNvsrbeGLZ0xOBumLINyPO1amIfTgJNm1iiWFWfmnHReGcDl +y5mpYG60Mb79Whdcer7CMm3AqYh/dW4g6IB02NwZMKoUHo3PXmFLxMKXnWyJ0clw +R0LI/Qn509yXAKDh1SO20rqrBM+EAP2c5bfI98kyNwQAi3buu94qo3RR1ZbvfxgW +CKXDVm6N99jdZGNK7FbRifXqzJJDLcXZKLnstnC4Sd3uyfyf1uFhmDLIQRryn5m+ +LBYHfDBPN3kdm7bsZDDq9GbTHiFZUfm/tChVKXWxkhpAmHhU/tH6GGzNSMXuIWSO +aOz3Rqq0ED4NXyNKjdF9MiwD/i83S0ZBc0LmJYt4Z10jtH2B6tYdqnAK29uQaadx +yZCX2scE09UIm32/w7pV77CKr1Cp/4OzAXS1tmFzQ+bX7DR+Gl8t4wxr57VeEMvl +BGw4Vjh3X8//m3xynxycQU18Q1zJ6PkiMyPw2owZ/nss3hpSRKFJsxMLhW3fKmKr +Ey2KiOcEGAECAAkFAlVKn7UCGwIAUgkQNRjL95IRWP5HIAQZEQIABgUCVUqftQAK +CRD98VjDN10SqkWrAKDTpEY8D8HC02E/KVC5YUI01B30wgCgurpILm20kXEDCeHp +C5pygfXw1DJrhAP+NyPJ4um/bU1I+rXaHHJYroYJs8YSweiNcwiHDQn0Engh/mVZ +SqLHvbKh2dL/RXymC3+rjPvQf5cup9bPxNMa6WagdYBNAfzWGtkVISeaQW+cTEp/ +MtgVijRGXR/lGLGETPg2X3Afwn9N9bLMBkBprKgbBqU7lpaoPupxT61bL70= +=vtbN +-----END PGP PUBLIC KEY BLOCK-----` + +const revokedUserIDKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFsgO5EBCADhREPmcjsPkXe1z7ctvyWL0S7oa9JaoGZ9oPDHFDlQxd0qlX2e +DZJZDg0qYvVixmaULIulApq1puEsaJCn3lHUbHlb4PYKwLEywYXM28JN91KtLsz/ +uaEX2KC5WqeP40utmzkNLq+oRX/xnRMgwbO7yUNVG2UlEa6eI+xOXO3YtLdmJMBW +ClQ066ZnOIzEo1JxnIwha1CDBMWLLfOLrg6l8InUqaXbtEBbnaIYO6fXVXELUjkx +nmk7t/QOk0tXCy8muH9UDqJkwDUESY2l79XwBAcx9riX8vY7vwC34pm22fAUVLCJ +x1SJx0J8bkeNp38jKM2Zd9SUQqSbfBopQ4pPABEBAAG0I0dvbGFuZyBHb3BoZXIg +PG5vLXJlcGx5QGdvbGFuZy5jb20+iQFUBBMBCgA+FiEE5Ik5JLcNx6l6rZfw1oFy +9I6cUoMFAlsgO5ECGwMFCQPCZwAFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQ +1oFy9I6cUoMIkwf8DNPeD23i4jRwd/pylbvxwZintZl1fSwTJW1xcOa1emXaEtX2 +depuqhP04fjlRQGfsYAQh7X9jOJxAHjTmhqFBi5sD7QvKU00cPFYbJ/JTx0B41bl +aXnSbGhRPh63QtEZL7ACAs+shwvvojJqysx7kyVRu0EW2wqjXdHwR/SJO6nhNBa2 +DXzSiOU/SUA42mmG+5kjF8Aabq9wPwT9wjraHShEweNerNMmOqJExBOy3yFeyDpa +XwEZFzBfOKoxFNkIaVf5GSdIUGhFECkGvBMB935khftmgR8APxdU4BE7XrXexFJU +8RCuPXonm4WQOwTWR0vQg64pb2WKAzZ8HhwTGbQiR29sYW5nIEdvcGhlciA8cmV2 +b2tlZEBnb2xhbmcuY29tPokBNgQwAQoAIBYhBOSJOSS3Dcepeq2X8NaBcvSOnFKD +BQJbIDv3Ah0AAAoJENaBcvSOnFKDfWMIAKhI/Tvu3h8fSUxp/gSAcduT6bC1JttG +0lYQ5ilKB/58lBUA5CO3ZrKDKlzW3M8VEcvohVaqeTMKeoQd5rCZq8KxHn/KvN6N +s85REfXfniCKfAbnGgVXX3kDmZ1g63pkxrFu0fDZjVDXC6vy+I0sGyI/Inro0Pzb +tvn0QCsxjapKK15BtmSrpgHgzVqVg0cUp8vqZeKFxarYbYB2idtGRci4b9tObOK0 +BSTVFy26+I/mrFGaPrySYiy2Kz5NMEcRhjmTxJ8jSwEr2O2sUR0yjbgUAXbTxDVE +/jg5fQZ1ACvBRQnB7LvMHcInbzjyeTM3FazkkSYQD6b97+dkWwb1iWG5AQ0EWyA7 +kQEIALkg04REDZo1JgdYV4x8HJKFS4xAYWbIva1ZPqvDNmZRUbQZR2+gpJGEwn7z +VofGvnOYiGW56AS5j31SFf5kro1+1bZQ5iOONBng08OOo58/l1hRseIIVGB5TGSa +PCdChKKHreJI6hS3mShxH6hdfFtiZuB45rwoaArMMsYcjaezLwKeLc396cpUwwcZ +snLUNd1Xu5EWEF2OdFkZ2a1qYdxBvAYdQf4+1Nr+NRIx1u1NS9c8jp3PuMOkrQEi +bNtc1v6v0Jy52mKLG4y7mC/erIkvkQBYJdxPaP7LZVaPYc3/xskcyijrJ/5ufoD8 +K71/ShtsZUXSQn9jlRaYR0EbojMAEQEAAYkBPAQYAQoAJhYhBOSJOSS3Dcepeq2X +8NaBcvSOnFKDBQJbIDuRAhsMBQkDwmcAAAoJENaBcvSOnFKDkFMIAIt64bVZ8x7+ +TitH1bR4pgcNkaKmgKoZz6FXu80+SnbuEt2NnDyf1cLOSimSTILpwLIuv9Uft5Pb +OraQbYt3xi9yrqdKqGLv80bxqK0NuryNkvh9yyx5WoG1iKqMj9/FjGghuPrRaT4l +QinNAghGVkEy1+aXGFrG2DsOC1FFI51CC2WVTzZ5RwR2GpiNRfESsU1rZAUqf/2V +yJl9bD5R4SUNy8oQmhOxi+gbhD4Ao34e4W0ilibslI/uawvCiOwlu5NGd8zv5n+U +heiQvzkApQup5c+BhH5zFDFdKJ2CBByxw9+7QjMFI/wgLixKuE0Ob2kAokXf7RlB +7qTZOahrETw= +=IKnw +-----END PGP PUBLIC KEY BLOCK-----` + +const keyWithFirstUserIDRevoked = `-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: OpenPGP.js v4.10.10 +Comment: https://openpgpjs.org + +xsBNBFsgO5EBCADhREPmcjsPkXe1z7ctvyWL0S7oa9JaoGZ9oPDHFDlQxd0q +lX2eDZJZDg0qYvVixmaULIulApq1puEsaJCn3lHUbHlb4PYKwLEywYXM28JN +91KtLsz/uaEX2KC5WqeP40utmzkNLq+oRX/xnRMgwbO7yUNVG2UlEa6eI+xO +XO3YtLdmJMBWClQ066ZnOIzEo1JxnIwha1CDBMWLLfOLrg6l8InUqaXbtEBb +naIYO6fXVXELUjkxnmk7t/QOk0tXCy8muH9UDqJkwDUESY2l79XwBAcx9riX +8vY7vwC34pm22fAUVLCJx1SJx0J8bkeNp38jKM2Zd9SUQqSbfBopQ4pPABEB +AAHNIkdvbGFuZyBHb3BoZXIgPHJldm9rZWRAZ29sYW5nLmNvbT7CwI0EMAEK +ACAWIQTkiTkktw3HqXqtl/DWgXL0jpxSgwUCWyA79wIdAAAhCRDWgXL0jpxS +gxYhBOSJOSS3Dcepeq2X8NaBcvSOnFKDfWMIAKhI/Tvu3h8fSUxp/gSAcduT +6bC1JttG0lYQ5ilKB/58lBUA5CO3ZrKDKlzW3M8VEcvohVaqeTMKeoQd5rCZ +q8KxHn/KvN6Ns85REfXfniCKfAbnGgVXX3kDmZ1g63pkxrFu0fDZjVDXC6vy ++I0sGyI/Inro0Pzbtvn0QCsxjapKK15BtmSrpgHgzVqVg0cUp8vqZeKFxarY +bYB2idtGRci4b9tObOK0BSTVFy26+I/mrFGaPrySYiy2Kz5NMEcRhjmTxJ8j +SwEr2O2sUR0yjbgUAXbTxDVE/jg5fQZ1ACvBRQnB7LvMHcInbzjyeTM3Fazk +kSYQD6b97+dkWwb1iWHNI0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFu +Zy5jb20+wsCrBBMBCgA+FiEE5Ik5JLcNx6l6rZfw1oFy9I6cUoMFAlsgO5EC +GwMFCQPCZwAFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AAIQkQ1oFy9I6cUoMW +IQTkiTkktw3HqXqtl/DWgXL0jpxSgwiTB/wM094PbeLiNHB3+nKVu/HBmKe1 +mXV9LBMlbXFw5rV6ZdoS1fZ16m6qE/Th+OVFAZ+xgBCHtf2M4nEAeNOaGoUG +LmwPtC8pTTRw8Vhsn8lPHQHjVuVpedJsaFE+HrdC0RkvsAICz6yHC++iMmrK +zHuTJVG7QRbbCqNd0fBH9Ik7qeE0FrYNfNKI5T9JQDjaaYb7mSMXwBpur3A/ +BP3COtodKETB416s0yY6okTEE7LfIV7IOlpfARkXMF84qjEU2QhpV/kZJ0hQ +aEUQKQa8EwH3fmSF+2aBHwA/F1TgETtetd7EUlTxEK49eiebhZA7BNZHS9CD +rilvZYoDNnweHBMZzsBNBFsgO5EBCAC5INOERA2aNSYHWFeMfByShUuMQGFm +yL2tWT6rwzZmUVG0GUdvoKSRhMJ+81aHxr5zmIhluegEuY99UhX+ZK6NftW2 +UOYjjjQZ4NPDjqOfP5dYUbHiCFRgeUxkmjwnQoSih63iSOoUt5kocR+oXXxb +YmbgeOa8KGgKzDLGHI2nsy8Cni3N/enKVMMHGbJy1DXdV7uRFhBdjnRZGdmt +amHcQbwGHUH+PtTa/jUSMdbtTUvXPI6dz7jDpK0BImzbXNb+r9CcudpiixuM +u5gv3qyJL5EAWCXcT2j+y2VWj2HN/8bJHMoo6yf+bn6A/Cu9f0obbGVF0kJ/ +Y5UWmEdBG6IzABEBAAHCwJMEGAEKACYWIQTkiTkktw3HqXqtl/DWgXL0jpxS +gwUCWyA7kQIbDAUJA8JnAAAhCRDWgXL0jpxSgxYhBOSJOSS3Dcepeq2X8NaB +cvSOnFKDkFMIAIt64bVZ8x7+TitH1bR4pgcNkaKmgKoZz6FXu80+SnbuEt2N +nDyf1cLOSimSTILpwLIuv9Uft5PbOraQbYt3xi9yrqdKqGLv80bxqK0NuryN +kvh9yyx5WoG1iKqMj9/FjGghuPrRaT4lQinNAghGVkEy1+aXGFrG2DsOC1FF +I51CC2WVTzZ5RwR2GpiNRfESsU1rZAUqf/2VyJl9bD5R4SUNy8oQmhOxi+gb +hD4Ao34e4W0ilibslI/uawvCiOwlu5NGd8zv5n+UheiQvzkApQup5c+BhH5z +FDFdKJ2CBByxw9+7QjMFI/wgLixKuE0Ob2kAokXf7RlB7qTZOahrETw= +=+2T8 +-----END PGP PUBLIC KEY BLOCK----- +` + +const keyWithOnlyUserIDRevoked = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEYYwB7RYJKwYBBAHaRw8BAQdARimqhPPzyGAXmfQJjcqM1QVPzLtURJSzNVll +JV4tEaW0KVJldm9rZWQgUHJpbWFyeSBVc2VyIElEIDxyZXZva2VkQGtleS5jb20+ +iHgEMBYIACAWIQSpyJZAXYqVEFkjyKutFcS0yeB0LQUCYYwCtgIdAAAKCRCtFcS0 +yeB0LbSsAQD8OYMaaBjrdzzpwIkP1stgmPd4/kzN/ZG28Ywl6a5F5QEA5Xg7aq4e +/t6Fsb4F5iqB956kSPe6YJrikobD/tBbMwSIkAQTFggAOBYhBKnIlkBdipUQWSPI +q60VxLTJ4HQtBQJhjAHtAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEK0V +xLTJ4HQtBaoBAPZL7luTCji+Tqhn7XNfFE/0QIahCt8k9wfO1cGlB3inAQDf8Tzw +ZGR5fNluUcNoVxQT7bUSFStbaGo3k0BaOYPbCLg4BGGMAe0SCisGAQQBl1UBBQEB +B0DLwSpveSrbIO/IVZD13yrs1XuB3FURZUnafGrRq7+jUAMBCAeIeAQYFggAIBYh +BKnIlkBdipUQWSPIq60VxLTJ4HQtBQJhjAHtAhsMAAoJEK0VxLTJ4HQtZ1oA/j9u +8+p3xTNzsmabTL6BkNbMeB/RUKCrlm6woM6AV+vxAQCcXTn3JC2sNoNrLoXuVzaA +mcG3/TwG5GSQUUPkrDsGDA== +=mFWy +-----END PGP PUBLIC KEY BLOCK----- +` + +const keyWithSubKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mI0EWyKwKQEEALwXhKBnyaaNFeK3ljfc/qn9X/QFw+28EUfgZPHjRmHubuXLE2uR +s3ZoSXY2z7Dkv+NyHYMt8p+X8q5fR7JvUjK2XbPyKoiJVnHINll83yl67DaWfKNL +EjNoO0kIfbXfCkZ7EG6DL+iKtuxniGTcnGT47e+HJSqb/STpLMnWwXjBABEBAAG0 +I0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFuZy5jb20+iM4EEwEKADgWIQQ/ +lRafP/p9PytHbwxMvYJsOQdOOAUCWyKwKQIbAwULCQgHAwUVCgkICwUWAgMBAAIe +AQIXgAAKCRBMvYJsOQdOOOsFBAC62mXww8XuqvYLcVOvHkWLT6mhxrQOJXnlfpn7 +2uBV9CMhoG/Ycd43NONsJrB95Apr9TDIqWnVszNbqPCuBhZQSGLdbiDKjxnCWBk0 +69qv4RNtkpOhYB7jK4s8F5oQZqId6JasT/PmJTH92mhBYhhTQr0GYFuPX2UJdkw9 +Sn9C67iNBFsisDUBBAC3A+Yo9lgCnxi/pfskyLrweYif6kIXWLAtLTsM6g/6jt7b +wTrknuCPyTv0QKGXsAEe/cK/Xq3HvX9WfXPGIHc/X56ZIsHQ+RLowbZV/Lhok1IW +FAuQm8axr/by80cRwFnzhfPc/ukkAq2Qyj4hLsGblu6mxeAhzcp8aqmWOO2H9QAR +AQABiLYEKAEKACAWIQQ/lRafP/p9PytHbwxMvYJsOQdOOAUCWyK16gIdAAAKCRBM +vYJsOQdOOB1vA/4u4uLONsE+2GVOyBsHyy7uTdkuxaR9b54A/cz6jT/tzUbeIzgx +22neWhgvIEghnUZd0vEyK9k1wy5vbDlEo6nKzHso32N1QExGr5upRERAxweDxGOj +7luDwNypI7QcifE64lS/JmlnunwRCdRWMKc0Fp+7jtRc5mpwyHN/Suf5RokBagQY +AQoAIBYhBD+VFp8/+n0/K0dvDEy9gmw5B044BQJbIrA1AhsCAL8JEEy9gmw5B044 +tCAEGQEKAB0WIQSNdnkaWY6t62iX336UXbGvYdhXJwUCWyKwNQAKCRCUXbGvYdhX +JxJSA/9fCPHP6sUtGF1o3G1a3yvOUDGr1JWcct9U+QpbCt1mZoNopCNDDQAJvDWl +mvDgHfuogmgNJRjOMznvahbF+wpTXmB7LS0SK412gJzl1fFIpK4bgnhu0TwxNsO1 +8UkCZWqxRMgcNUn9z6XWONK8dgt5JNvHSHrwF4CxxwjL23AAtK+FA/UUoi3U4kbC +0XnSr1Sl+mrzQi1+H7xyMe7zjqe+gGANtskqexHzwWPUJCPZ5qpIa2l8ghiUim6b +4ymJ+N8/T8Yva1FaPEqfMzzqJr8McYFm0URioXJPvOAlRxdHPteZ0qUopt/Jawxl +Xt6B9h1YpeLoJwjwsvbi98UTRs0jXwoY +=3fWu +-----END PGP PUBLIC KEY BLOCK-----` + +const keyWithSubKeyAndBadSelfSigOrder = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mI0EWyLLDQEEAOqIOpJ/ha1OYAGduu9tS3rBz5vyjbNgJO4sFveEM0mgsHQ0X9/L +plonW+d0gRoO1dhJ8QICjDAc6+cna1DE3tEb5m6JtQ30teLZuqrR398Cf6w7NNVz +r3lrlmnH9JaKRuXl7tZciwyovneBfZVCdtsRZjaLI1uMQCz/BToiYe3DABEBAAG0 +I0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFuZy5jb20+iM4EEwEKADgWIQRZ +sixZOfQcZdW0wUqmgmdsv1O9xgUCWyLLDQIbAwULCQgHAwUVCgkICwUWAgMBAAIe +AQIXgAAKCRCmgmdsv1O9xql2A/4pix98NxjhdsXtazA9agpAKeADf9tG4Za27Gj+ +3DCww/E4iP2X35jZimSm/30QRB6j08uGCqd9vXkkJxtOt63y/IpVOtWX6vMWSTUm +k8xKkaYMP0/IzKNJ1qC/qYEUYpwERBKg9Z+k99E2Ql4kRHdxXUHq6OzY79H18Y+s +GdeM/riNBFsiyxsBBAC54Pxg/8ZWaZX1phGdwfe5mek27SOYpC0AxIDCSOdMeQ6G +HPk38pywl1d+S+KmF/F4Tdi+kWro62O4eG2uc/T8JQuRDUhSjX0Qa51gPzJrUOVT +CFyUkiZ/3ZDhtXkgfuso8ua2ChBgR9Ngr4v43tSqa9y6AK7v0qjxD1x+xMrjXQAR +AQABiQFxBBgBCgAmAhsCFiEEWbIsWTn0HGXVtMFKpoJnbL9TvcYFAlsizTIFCQAN +MRcAv7QgBBkBCgAdFiEEJcoVUVJIk5RWj1c/o62jUpRPICQFAlsiyxsACgkQo62j +UpRPICQq5gQApoWIigZxXFoM0uw4uJBS5JFZtirTANvirZV5RhndwHeMN6JttaBS +YnjyA4+n1D+zB2VqliD2QrsX12KJN6rGOehCtEIClQ1Hodo9nC6kMzzAwW1O8bZs +nRJmXV+bsvD4sidLZLjdwOVa3Cxh6pvq4Uur6a7/UYx121hEY0Qx0s8JEKaCZ2y/ +U73GGi0D/i20VW8AWYAPACm2zMlzExKTOAV01YTQH/3vW0WLrOse53WcIVZga6es +HuO4So0SOEAvxKMe5HpRIu2dJxTvd99Bo9xk9xJU0AoFrO0vNCRnL+5y68xMlODK +lEw5/kl0jeaTBp6xX0HDQOEVOpPGUwWV4Ij2EnvfNDXaE1vK1kffiQFrBBgBCgAg +AhsCFiEEWbIsWTn0HGXVtMFKpoJnbL9TvcYFAlsi0AYAv7QgBBkBCgAdFiEEJcoV +UVJIk5RWj1c/o62jUpRPICQFAlsiyxsACgkQo62jUpRPICQq5gQApoWIigZxXFoM +0uw4uJBS5JFZtirTANvirZV5RhndwHeMN6JttaBSYnjyA4+n1D+zB2VqliD2QrsX +12KJN6rGOehCtEIClQ1Hodo9nC6kMzzAwW1O8bZsnRJmXV+bsvD4sidLZLjdwOVa +3Cxh6pvq4Uur6a7/UYx121hEY0Qx0s8JEKaCZ2y/U73GRl0EAJokkXmy4zKDHWWi +wvK9gi2gQgRkVnu2AiONxJb5vjeLhM/07BRmH6K1o+w3fOeEQp4FjXj1eQ5fPSM6 +Hhwx2CTl9SDnPSBMiKXsEFRkmwQ2AAsQZLmQZvKBkLZYeBiwf+IY621eYDhZfo+G +1dh1WoUCyREZsJQg2YoIpWIcvw+a +=bNRo +-----END PGP PUBLIC KEY BLOCK----- +` + +const onlySubkeyNoPrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v1 + +lQCVBFggvocBBAC7vBsHn7MKmS6IiiZNTXdciplVgS9cqVd+RTdIAoyNTcsiV1H0 +GQ3QtodOPeDlQDNoqinqaobd7R9g3m3hS53Nor7yBZkCWQ5x9v9JxRtoAq0sklh1 +I1X2zEqZk2l6YrfBF/64zWrhjnW3j23szkrAIVu0faQXbQ4z56tmZrw11wARAQAB +/gdlAkdOVQG0CUdOVSBEdW1teYi4BBMBAgAiBQJYIL6HAhsDBgsJCAcDAgYVCAIJ +CgsEFgIDAQIeAQIXgAAKCRCd1xxWp1CYAnjGA/9synn6ZXJUKAXQzySgmCZvCIbl +rqBfEpxwLG4Q/lONhm5vthAE0z49I8hj5Gc5e2tLYUtq0o0OCRdCrYHa/efOYWpJ +6RsK99bePOisVzmOABLIgZkcr022kHoMCmkPgv9CUGKP1yqbGl+zzAwQfUjRUmvD +ZIcWLHi2ge4GzPMPi50B2ARYIL6cAQQAxWHnicKejAFcFcF1/3gUSgSH7eiwuBPX +M7vDdgGzlve1o1jbV4tzrjN9jsCl6r0nJPDMfBSzgLr1auNTRG6HpJ4abcOx86ED +Ad+avDcQPZb7z3dPhH/gb2lQejZsHh7bbeOS8WMSzHV3RqCLd8J/xwWPNR5zKn1f +yp4IGfopidMAEQEAAQAD+wQOelnR82+dxyM2IFmZdOB9wSXQeCVOvxSaNMh6Y3lk +UOOkO8Nlic4x0ungQRvjoRs4wBmCuwFK/MII6jKui0B7dn/NDf51i7rGdNGuJXDH +e676By1sEY/NGkc74jr74T+5GWNU64W0vkpfgVmjSAzsUtpmhJMXsc7beBhJdnVl +AgDKCb8hZqj1alcdmLoNvb7ibA3K/V8J462CPD7bMySPBa/uayoFhNxibpoXml2r +oOtHa5izF3b0/9JY97F6rqkdAgD6GdTJ+xmlCoz1Sewoif1I6krq6xoa7gOYpIXo +UL1Afr+LiJeyAnF/M34j/kjIVmPanZJjry0kkjHE5ILjH3uvAf4/6n9np+Th8ujS +YDCIzKwR7639+H+qccOaddCep8Y6KGUMVdD/vTKEx1rMtK+hK/CDkkkxnFslifMJ +kqoqv3WUqCWJAT0EGAECAAkFAlggvpwCGwIAqAkQndccVqdQmAKdIAQZAQIABgUC +WCC+nAAKCRDmGUholQPwvQk+A/9latnSsR5s5/1A9TFki11GzSEnfLbx46FYOdkW +n3YBxZoPQGxNA1vIn8GmouxZInw9CF4jdOJxEdzLlYQJ9YLTLtN5tQEMl/19/bR8 +/qLacAZ9IOezYRWxxZsyn6//jfl7A0Y+FV59d4YajKkEfItcIIlgVBSW6T+TNQT3 +R+EH5HJ/A/4/AN0CmBhhE2vGzTnVU0VPrE4V64pjn1rufFdclgpixNZCuuqpKpoE +VVHn6mnBf4njKjZrAGPs5kfQ+H4NsM7v3Zz4yV6deu9FZc4O6E+V1WJ38rO8eBix +7G2jko106CC6vtxsCPVIzY7aaG3H5pjRtomw+pX7SzrQ7FUg2PGumg== +=F/T0 +-----END PGP PRIVATE KEY BLOCK-----` + +const ecdsaPrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- + +xaUEX1KsSRMIKoZIzj0DAQcCAwTpYqJsnJiFhKKh+8TulWD+lVmerBFNS+Ii +B+nlG3T0xQQ4Sy5eIjJ0CExIQQzi3EElF/Z2l4F3WC5taFA11NgA/gkDCHSS +PThf1M2K4LN8F1MRcvR+sb7i0nH55ojkwuVB1DE6jqIT9m9i+mX1tzjSAS+6 +lPQiweCJvG7xTC7Hs3AzRapf/r1At4TB+v+5G2/CKynNFEJpbGwgPGJpbGxA +aG9tZS5jb20+wncEEBMIAB8FAl9SrEkGCwkHCAMCBBUICgIDFgIBAhkBAhsD +Ah4BAAoJEMpwT3+q3+xqw5UBAMebZN9isEZ1ML+R/jWAAWMwa/knMugrEZ1v +Bl9+ZwM0AQCZdf80/wYY4Nve01qSRFv8OmKswLli3TvDv6FKc4cLz8epBF9S +rEkSCCqGSM49AwEHAgMEAjKnT9b5wY2bf9TpAV3d7OUfPOxKj9c4VzeVzSrH +AtQgo/MuI1cdYVURicV4i76DNjFhQHQFTk7BrC+C2u1yqQMBCAf+CQMIHImA +iYfzQtjgQWSFZYUkCFpbbwhNF0ch+3HNaZkaHCnZRIsWsRnc6FCb6lRQyK9+ +Dq59kHlduE5QgY40894jfmP2JdJHU6nBdYrivbEdbMJhBBgTCAAJBQJfUqxJ +AhsMAAoJEMpwT3+q3+xqUI0BAMykhV08kQ4Ip9Qlbss6Jdufv7YrU0Vd5hou +b5TmiPd0APoDBh3qIic+aLLUcAuG3+Gt1P1AbUlmqV61ozn1WfHxfw== +=KLN8 +-----END PGP PRIVATE KEY BLOCK-----` + +const dsaPrivateKeyWithElGamalSubkey = `-----BEGIN PGP PRIVATE KEY BLOCK----- + +lQOBBF9/MLsRCACeaF6BI0jTgDAs86t8/kXPfwlPvR2MCYzB0BCqAdcq1hV/GTYd +oNmJRna/ZJfsI/vf+d8Nv+EYOQkPheFS1MJVBitkAXjQPgm8i1tQWen1FCWZxqGk +/vwZYF4yo8GhZ+Wxi3w09W9Cp9QM/CTmyE1Xe7wpPBGe+oD+me8Zxjyt8JBS4Qx+ +gvWbfHxfHnggh4pz7U8QkItlLsBNQEdX4R5+zwRN66g2ZSX/shaa/EkVnihUhD7r +njP9I51ORWucTQD6OvgooaNQZCkQ/Se9TzdakwWKS2XSIFXiY/e2E5ZgKI/pfKDU +iA/KessxddPb7nP/05OIJqg9AoDrD4vmehLzAQD+zsUS3LDU1m9/cG4LMsQbT2VK +Te4HqbGIAle+eu/asQf8DDJMrbZpiJZvADum9j0TJ0oep6VdMbzo9RSDKvlLKT9m +kG63H8oDWnCZm1a+HmGq9YIX+JHWmsLXXsFLeEouLzHO+mZo0X28eji3V2T87hyR +MmUM0wFo4k7jK8uVmkDXv3XwNp2uByWxUKZd7EnWmcEZWqIiexJ7XpCS0Pg3tRaI +zxve0SRe/dxfUPnTk/9KQ9hS6DWroBKquL182zx1Fggh4LIWWE2zq+UYn8BI0E8A +rmIDFJdF8ymFQGRrEy6g79NnkPmkrZWsgMRYY65P6v4zLVmqohJKkpm3/Uxa6QAP +CCoPh/JTOvPeCP2bOJH8z4Z9Py3ouMIjofQW8sXqRgf/RIHbh0KsINHrwwZ4gVIr +MK3RofpaYxw1ztPIWb4cMWoWZHH1Pxh7ggTGSBpAhKXkiWw2Rxat8QF5aA7e962c +bLvVv8dqsPrD/RnVJHag89cbPTzjn7gY9elE8EM8ithV3oQkwHTr4avYlpDZsgNd +hUW3YgRwGo31tdzxoG04AcpV2t+07P8XMPr9hsfWs4rHohXPi38Hseu1Ji+dBoWQ +3+1w/HH3o55s+jy4Ruaz78AIrjbmAJq+6rA2mIcCgrhw3DnzuwQAKeBvSeqn9zfS +ZC812osMBVmkycwelpaIh64WZ0vWL3GvdXDctV2kXM+qVpDTLEny0LuiXxrwCKQL +Ev4HAwK9uQBcreDEEud7pfRb8EYP5lzO2ZA7RaIvje6EWAGBvJGMRT0QQE5SGqc7 +Fw5geigBdt+vVyRuNNhg3c2fdn/OBQaYu0J/8AiOogG8EaM8tCFlbGdhbWFsQGRz +YS5jb20gPGVsZ2FtYWxAZHNhLmNvbT6IkAQTEQgAOBYhBI+gnfiHQxB35/Dp0XAQ +aE/rsWC5BQJffzC7AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEHAQaE/r +sWC5A4EA/0GcJmyPtN+Klc7b9sVT3JgKTRnB/URxOJfYJofP0hZLAQCkqyMO+adV +JvbgDH0zaITQWZSSXPqpgMpCA6juTrDsd50CawRffzC7EAgAxFFFSAAEQzWTgKU5 +EBtpxxoPzHqcChawTHRxHxjcELXzmUBS5PzfA1HXSPnNqK/x3Ut5ycC3CsW41Fnt +Gm3706Wu9VFbFZVn55F9lPiplUo61n5pqMvOr1gmuQsdXiTa0t5FRa4TZ2VSiHFw +vdAVSPTUsT4ZxJ1rPyFYRtq1n3pQcvdZowd07r0JnzTMjLLMFYCKhwIowoOC4zqJ +iB8enjwOlpaqBATRm9xpVF7SJkroPF6/B1vdhj7E3c1aJyHlo0PYBAg756sSHWHg +UuLyUQ4TA0hcCVenn/L/aSY2LnbdZB1EBhlYjA7dTCgwIqsQhfQmPkjz6g64A7+Y +HbbrLwADBQgAk14QIEQ+J/VHetpQV/jt2pNsFK1kVK7mXK0spTExaC2yj2sXlHjL +Ie3bO5T/KqmIaBEB5db5fA5xK9cZt79qrQHDKsEqUetUeMUWLBx77zBsus3grIgy +bwDZKseRzQ715pwxquxQlScGoDIBKEh08HpwHkq140eIj3w+MAIfndaZaSCNaxaP +Snky7BQmJ7Wc7qrIwoQP6yrnUqyW2yNi81nJYUhxjChqaFSlwzLs/iNGryBKo0ic +BqVIRjikKHBlwBng6WyrltQo/Vt9GG8w+lqaAVXbJRlaBZJUR+2NKi/YhP3qQse3 +v8fi4kns0gh5LK+2C01RvdX4T49QSExuIf4HAwLJqYIGwadA2uem5v7/765ZtFWV +oL0iZ0ueTJDby4wTFDpLVzzDi/uVcB0ZRFrGOp7w6OYcNYTtV8n3xmli2Q5Trw0c +wZVzvg+ABKWiv7faBjMczIFF8y6WZKOIeAQYEQgAIBYhBI+gnfiHQxB35/Dp0XAQ +aE/rsWC5BQJffzC7AhsMAAoJEHAQaE/rsWC5ZmIA/jhS4r4lClbvjuPWt0Yqdn7R +fss2SPMYvMrrDh42aE0OAQD8xn4G6CN8UtW9xihXOY6FpxiJ/sMc2VaneeUd34oa +4g== +=XZm8 +-----END PGP PRIVATE KEY BLOCK-----` + +// https://tests.sequoia-pgp.org/#Certificate_expiration +// P _ U p +const expiringPrimaryUIDKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBF2lnPIBDAC5cL9PQoQLTMuhjbYvb4Ncuuo0bfmgPRFywX53jPhoFf4Zg6mv +/seOXpgecTdOcVttfzC8ycIKrt3aQTiwOG/ctaR4Bk/t6ayNFfdUNxHWk4WCKzdz +/56fW2O0F23qIRd8UUJp5IIlN4RDdRCtdhVQIAuzvp2oVy/LaS2kxQoKvph/5pQ/ +5whqsyroEWDJoSV0yOb25B/iwk/pLUFoyhDG9bj0kIzDxrEqW+7Ba8nocQlecMF3 +X5KMN5kp2zraLv9dlBBpWW43XktjcCZgMy20SouraVma8Je/ECwUWYUiAZxLIlMv +9CurEOtxUw6N3RdOtLmYZS9uEnn5y1UkF88o8Nku890uk6BrewFzJyLAx5wRZ4F0 +qV/yq36UWQ0JB/AUGhHVPdFf6pl6eaxBwT5GXvbBUibtf8YI2og5RsgTWtXfU7eb +SGXrl5ZMpbA6mbfhd0R8aPxWfmDWiIOhBufhMCvUHh1sApMKVZnvIff9/0Dca3wb +vLIwa3T4CyshfT0AEQEAAc0hQm9iIEJhYmJhZ2UgPGJvYkBvcGVucGdwLmV4YW1w +bGU+wsFcBBMBCgCQBYJhesp/BYkEWQPJBQsJCAcCCRD7/MgqAV5zMEcUAAAAAAAe +ACBzYWx0QG5vdGF0aW9ucy5zZXF1b2lhLXBncC5vcmeEOQlNyTLFkc9I/elp+BpY +495V7KatqtDmsyDr+zDAdwYVCgkICwIEFgIDAQIXgAIbAwIeARYhBNGmbhojsYLJ +mA94jPv8yCoBXnMwAABSCQv/av8hKyynMtXVKFuWOGJw0mR8auDm84WdhMFRZg8t +yTJ1L88+Ny4WUAFeqo2j7DU2yPGrm5rmuvzlEedFYFeOWt+A4adz+oumgRd0nsgG +Lf3QYUWQhLWVlz+H7zubgKqSB2A2RqV65S7mTTVro42nb2Mng6rvGWiqeKG5nrXN +/01p1mIBQGR/KnZSqYLzA2Pw2PiJoSkXT26PDz/kiEMXpjKMR6sicV4bKVlEdUvm +pIImIPBHZq1EsKXEyWtWC41w/pc+FofGE+uSFs2aef1vvEHFkj3BHSK8gRcH3kfR +eFroTET8C2q9V1AOELWm+Ys6PzGzF72URK1MKXlThuL4t4LjvXWGNA78IKW+/RQH +DzK4U0jqSO0mL6qxqVS5Ij6jjL6OTrVEGdtDf5n0vI8tcUTBKtVqYAYk+t2YGT05 +ayxALtb7viVKo8f10WEcCuKshn0gdsEFMRZQzJ89uQIY3R3FbsdRCaE6OEaDgKMQ +UTFROyfhthgzRKbRxfcplMUCzsDNBF2lnPIBDADWML9cbGMrp12CtF9b2P6z9TTT +74S8iyBOzaSvdGDQY/sUtZXRg21HWamXnn9sSXvIDEINOQ6A9QxdxoqWdCHrOuW3 +ofneYXoG+zeKc4dC86wa1TR2q9vW+RMXSO4uImA+Uzula/6k1DogDf28qhCxMwG/ +i/m9g1c/0aApuDyKdQ1PXsHHNlgd/Dn6rrd5y2AObaifV7wIhEJnvqgFXDN2RXGj +LeCOHV4Q2WTYPg/S4k1nMXVDwZXrvIsA0YwIMgIT86Rafp1qKlgPNbiIlC1g9RY/ +iFaGN2b4Ir6GDohBQSfZW2+LXoPZuVE/wGlQ01rh827KVZW4lXvqsge+wtnWlszc +selGATyzqOK9LdHPdZGzROZYI2e8c+paLNDdVPL6vdRBUnkCaEkOtl1mr2JpQi5n +TU+gTX4IeInC7E+1a9UDF/Y85ybUz8XV8rUnR76UqVC7KidNepdHbZjjXCt8/Zo+ +Tec9JNbYNQB/e9ExmDntmlHEsSEQzFwzj8sxH48AEQEAAcLA9gQYAQoAIBYhBNGm +bhojsYLJmA94jPv8yCoBXnMwBQJdpZzyAhsMAAoJEPv8yCoBXnMw6f8L/26C34dk +jBffTzMj5Bdzm8MtF67OYneJ4TQMw7+41IL4rVcSKhIhk/3Ud5knaRtP2ef1+5F6 +6h9/RPQOJ5+tvBwhBAcUWSupKnUrdVaZQanYmtSxcVV2PL9+QEiNN3tzluhaWO// +rACxJ+K/ZXQlIzwQVTpNhfGzAaMVV9zpf3u0k14itcv6alKY8+rLZvO1wIIeRZLm +U0tZDD5HtWDvUV7rIFI1WuoLb+KZgbYn3OWjCPHVdTrdZ2CqnZbG3SXw6awH9bzR +LV9EXkbhIMez0deCVdeo+wFFklh8/5VK2b0vk/+wqMJxfpa1lHvJLobzOP9fvrsw +sr92MA2+k901WeISR7qEzcI0Fdg8AyFAExaEK6VyjP7SXGLwvfisw34OxuZr3qmx +1Sufu4toH3XrB7QJN8XyqqbsGxUCBqWif9RSK4xjzRTe56iPeiSJJOIciMP9i2ld +I+KgLycyeDvGoBj0HCLO3gVaBe4ubVrj5KjhX2PVNEJd3XZRzaXZE2aAMQ== +=AmgT +-----END PGP PUBLIC KEY BLOCK-----` diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go new file mode 100644 index 0000000000..7350974eff --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go @@ -0,0 +1,56 @@ +// Copyright (C) 2019 ProtonTech AG + +package packet + +import "math/bits" + +// AEADConfig collects a number of AEAD parameters along with sensible defaults. +// A nil AEADConfig is valid and results in all default values. +type AEADConfig struct { + // The AEAD mode of operation. + DefaultMode AEADMode + // Amount of octets in each chunk of data + ChunkSize uint64 +} + +// Mode returns the AEAD mode of operation. +func (conf *AEADConfig) Mode() AEADMode { + if conf == nil || conf.DefaultMode == 0 { + return AEADModeEAX + } + mode := conf.DefaultMode + if mode != AEADModeEAX && mode != AEADModeOCB && + mode != AEADModeExperimentalGCM { + panic("AEAD mode unsupported") + } + return mode +} + +// ChunkSizeByte returns the byte indicating the chunk size. The effective +// chunk size is computed with the formula uint64(1) << (chunkSizeByte + 6) +func (conf *AEADConfig) ChunkSizeByte() byte { + if conf == nil || conf.ChunkSize == 0 { + return 12 // 1 << (12 + 6) == 262144 bytes + } + + chunkSize := conf.ChunkSize + exponent := bits.Len64(chunkSize) - 1 + switch { + case exponent < 6: + exponent = 6 + case exponent > 27: + exponent = 27 + } + + return byte(exponent - 6) +} + +// decodeAEADChunkSize returns the effective chunk size. In 32-bit systems, the +// maximum returned value is 1 << 30. +func decodeAEADChunkSize(c byte) int { + size := uint64(1 << (c + 6)) + if size != uint64(int(size)) { + return 1 << 30 + } + return int(size) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go new file mode 100644 index 0000000000..85c53f08aa --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go @@ -0,0 +1,364 @@ +// Copyright (C) 2019 ProtonTech AG + +package packet + +import ( + "bytes" + "crypto/cipher" + "crypto/rand" + "encoding/binary" + "io" + + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" +) + +// AEADEncrypted represents an AEAD Encrypted Packet (tag 20, RFC4880bis-5.16). +type AEADEncrypted struct { + cipher CipherFunction + mode AEADMode + chunkSizeByte byte + Contents io.Reader // Encrypted chunks and tags + initialNonce []byte // Referred to as IV in RFC4880-bis +} + +// Only currently defined version +const aeadEncryptedVersion = 1 + +// An AEAD opener/sealer, its configuration, and data for en/decryption. +type aeadCrypter struct { + aead cipher.AEAD + chunkSize int + initialNonce []byte + associatedData []byte // Chunk-independent associated data + chunkIndex []byte // Chunk counter + bytesProcessed int // Amount of plaintext bytes encrypted/decrypted + buffer bytes.Buffer // Buffered bytes accross chunks +} + +// aeadEncrypter encrypts and writes bytes. It encrypts when necessary according +// to the AEAD block size, and buffers the extra encrypted bytes for next write. +type aeadEncrypter struct { + aeadCrypter // Embedded plaintext sealer + writer io.WriteCloser // 'writer' is a partialLengthWriter +} + +// aeadDecrypter reads and decrypts bytes. It buffers extra decrypted bytes when +// necessary, similar to aeadEncrypter. +type aeadDecrypter struct { + aeadCrypter // Embedded ciphertext opener + reader io.Reader // 'reader' is a partialLengthReader + peekedBytes []byte // Used to detect last chunk + eof bool +} + +func (ae *AEADEncrypted) parse(buf io.Reader) error { + headerData := make([]byte, 4) + if n, err := io.ReadFull(buf, headerData); n < 4 { + return errors.AEADError("could not read aead header:" + err.Error()) + } + // Read initial nonce + mode := AEADMode(headerData[2]) + nonceLen := mode.NonceLength() + if nonceLen == 0 { + return errors.AEADError("unknown mode") + } + initialNonce := make([]byte, nonceLen) + if n, err := io.ReadFull(buf, initialNonce); n < nonceLen { + return errors.AEADError("could not read aead nonce:" + err.Error()) + } + ae.Contents = buf + ae.initialNonce = initialNonce + c := headerData[1] + if _, ok := algorithm.CipherById[c]; !ok { + return errors.UnsupportedError("unknown cipher: " + string(c)) + } + ae.cipher = CipherFunction(c) + ae.mode = mode + ae.chunkSizeByte = byte(headerData[3]) + return nil +} + +// Decrypt returns a io.ReadCloser from which decrypted bytes can be read, or +// an error. +func (ae *AEADEncrypted) Decrypt(ciph CipherFunction, key []byte) (io.ReadCloser, error) { + return ae.decrypt(key) +} + +// decrypt prepares an aeadCrypter and returns a ReadCloser from which +// decrypted bytes can be read (see aeadDecrypter.Read()). +func (ae *AEADEncrypted) decrypt(key []byte) (io.ReadCloser, error) { + blockCipher := ae.cipher.new(key) + aead := ae.mode.new(blockCipher) + // Carry the first tagLen bytes + tagLen := ae.mode.TagLength() + peekedBytes := make([]byte, tagLen) + n, err := io.ReadFull(ae.Contents, peekedBytes) + if n < tagLen || (err != nil && err != io.EOF) { + return nil, errors.AEADError("Not enough data to decrypt:" + err.Error()) + } + chunkSize := decodeAEADChunkSize(ae.chunkSizeByte) + return &aeadDecrypter{ + aeadCrypter: aeadCrypter{ + aead: aead, + chunkSize: chunkSize, + initialNonce: ae.initialNonce, + associatedData: ae.associatedData(), + chunkIndex: make([]byte, 8), + }, + reader: ae.Contents, + peekedBytes: peekedBytes}, nil +} + +// Read decrypts bytes and reads them into dst. It decrypts when necessary and +// buffers extra decrypted bytes. It returns the number of bytes copied into dst +// and an error. +func (ar *aeadDecrypter) Read(dst []byte) (n int, err error) { + // Return buffered plaintext bytes from previous calls + if ar.buffer.Len() > 0 { + return ar.buffer.Read(dst) + } + + // Return EOF if we've previously validated the final tag + if ar.eof { + return 0, io.EOF + } + + // Read a chunk + tagLen := ar.aead.Overhead() + cipherChunkBuf := new(bytes.Buffer) + _, errRead := io.CopyN(cipherChunkBuf, ar.reader, int64(ar.chunkSize + tagLen)) + cipherChunk := cipherChunkBuf.Bytes() + if errRead != nil && errRead != io.EOF { + return 0, errRead + } + decrypted, errChunk := ar.openChunk(cipherChunk) + if errChunk != nil { + return 0, errChunk + } + + // Return decrypted bytes, buffering if necessary + if len(dst) < len(decrypted) { + n = copy(dst, decrypted[:len(dst)]) + ar.buffer.Write(decrypted[len(dst):]) + } else { + n = copy(dst, decrypted) + } + + // Check final authentication tag + if errRead == io.EOF { + errChunk := ar.validateFinalTag(ar.peekedBytes) + if errChunk != nil { + return n, errChunk + } + ar.eof = true // Mark EOF for when we've returned all buffered data + } + return +} + +// Close is noOp. The final authentication tag of the stream was already +// checked in the last Read call. In the future, this function could be used to +// wipe the reader and peeked, decrypted bytes, if necessary. +func (ar *aeadDecrypter) Close() (err error) { + return nil +} + +// SerializeAEADEncrypted initializes the aeadCrypter and returns a writer. +// This writer encrypts and writes bytes (see aeadEncrypter.Write()). +func SerializeAEADEncrypted(w io.Writer, key []byte, cipher CipherFunction, mode AEADMode, config *Config) (io.WriteCloser, error) { + writeCloser := noOpCloser{w} + writer, err := serializeStreamHeader(writeCloser, packetTypeAEADEncrypted) + if err != nil { + return nil, err + } + + // Data for en/decryption: tag, version, cipher, aead mode, chunk size + aeadConf := config.AEAD() + prefix := []byte{ + 0xD4, + aeadEncryptedVersion, + byte(config.Cipher()), + byte(aeadConf.Mode()), + aeadConf.ChunkSizeByte(), + } + n, err := writer.Write(prefix[1:]) + if err != nil || n < 4 { + return nil, errors.AEADError("could not write AEAD headers") + } + // Sample nonce + nonceLen := aeadConf.Mode().NonceLength() + nonce := make([]byte, nonceLen) + n, err = rand.Read(nonce) + if err != nil { + panic("Could not sample random nonce") + } + _, err = writer.Write(nonce) + if err != nil { + return nil, err + } + blockCipher := CipherFunction(config.Cipher()).new(key) + alg := AEADMode(aeadConf.Mode()).new(blockCipher) + + chunkSize := decodeAEADChunkSize(aeadConf.ChunkSizeByte()) + return &aeadEncrypter{ + aeadCrypter: aeadCrypter{ + aead: alg, + chunkSize: chunkSize, + associatedData: prefix, + chunkIndex: make([]byte, 8), + initialNonce: nonce, + }, + writer: writer}, nil +} + +// Write encrypts and writes bytes. It encrypts when necessary and buffers extra +// plaintext bytes for next call. When the stream is finished, Close() MUST be +// called to append the final tag. +func (aw *aeadEncrypter) Write(plaintextBytes []byte) (n int, err error) { + // Append plaintextBytes to existing buffered bytes + n, err = aw.buffer.Write(plaintextBytes) + if err != nil { + return n, err + } + // Encrypt and write chunks + for aw.buffer.Len() >= aw.chunkSize { + plainChunk := aw.buffer.Next(aw.chunkSize) + encryptedChunk, err := aw.sealChunk(plainChunk) + if err != nil { + return n, err + } + _, err = aw.writer.Write(encryptedChunk) + if err != nil { + return n, err + } + } + return +} + +// Close encrypts and writes the remaining buffered plaintext if any, appends +// the final authentication tag, and closes the embedded writer. This function +// MUST be called at the end of a stream. +func (aw *aeadEncrypter) Close() (err error) { + // Encrypt and write a chunk if there's buffered data left, or if we haven't + // written any chunks yet. + if aw.buffer.Len() > 0 || aw.bytesProcessed == 0 { + plainChunk := aw.buffer.Bytes() + lastEncryptedChunk, err := aw.sealChunk(plainChunk) + if err != nil { + return err + } + _, err = aw.writer.Write(lastEncryptedChunk) + if err != nil { + return err + } + } + // Compute final tag (associated data: packet tag, version, cipher, aead, + // chunk size, index, total number of encrypted octets). + adata := append(aw.associatedData[:], aw.chunkIndex[:]...) + adata = append(adata, make([]byte, 8)...) + binary.BigEndian.PutUint64(adata[13:], uint64(aw.bytesProcessed)) + nonce := aw.computeNextNonce() + finalTag := aw.aead.Seal(nil, nonce, nil, adata) + _, err = aw.writer.Write(finalTag) + if err != nil { + return err + } + return aw.writer.Close() +} + +// sealChunk Encrypts and authenticates the given chunk. +func (aw *aeadEncrypter) sealChunk(data []byte) ([]byte, error) { + if len(data) > aw.chunkSize { + return nil, errors.AEADError("chunk exceeds maximum length") + } + if aw.associatedData == nil { + return nil, errors.AEADError("can't seal without headers") + } + adata := append(aw.associatedData, aw.chunkIndex...) + nonce := aw.computeNextNonce() + encrypted := aw.aead.Seal(nil, nonce, data, adata) + aw.bytesProcessed += len(data) + if err := aw.aeadCrypter.incrementIndex(); err != nil { + return nil, err + } + return encrypted, nil +} + +// openChunk decrypts and checks integrity of an encrypted chunk, returning +// the underlying plaintext and an error. It access peeked bytes from next +// chunk, to identify the last chunk and decrypt/validate accordingly. +func (ar *aeadDecrypter) openChunk(data []byte) ([]byte, error) { + tagLen := ar.aead.Overhead() + // Restore carried bytes from last call + chunkExtra := append(ar.peekedBytes, data...) + // 'chunk' contains encrypted bytes, followed by an authentication tag. + chunk := chunkExtra[:len(chunkExtra)-tagLen] + ar.peekedBytes = chunkExtra[len(chunkExtra)-tagLen:] + adata := append(ar.associatedData, ar.chunkIndex...) + nonce := ar.computeNextNonce() + plainChunk, err := ar.aead.Open(nil, nonce, chunk, adata) + if err != nil { + return nil, err + } + ar.bytesProcessed += len(plainChunk) + if err = ar.aeadCrypter.incrementIndex(); err != nil { + return nil, err + } + return plainChunk, nil +} + +// Checks the summary tag. It takes into account the total decrypted bytes into +// the associated data. It returns an error, or nil if the tag is valid. +func (ar *aeadDecrypter) validateFinalTag(tag []byte) error { + // Associated: tag, version, cipher, aead, chunk size, index, and octets + amountBytes := make([]byte, 8) + binary.BigEndian.PutUint64(amountBytes, uint64(ar.bytesProcessed)) + adata := append(ar.associatedData, ar.chunkIndex...) + adata = append(adata, amountBytes...) + nonce := ar.computeNextNonce() + _, err := ar.aead.Open(nil, nonce, tag, adata) + if err != nil { + return err + } + return nil +} + +// Associated data for chunks: tag, version, cipher, mode, chunk size byte +func (ae *AEADEncrypted) associatedData() []byte { + return []byte{ + 0xD4, + aeadEncryptedVersion, + byte(ae.cipher), + byte(ae.mode), + ae.chunkSizeByte} +} + +// computeNonce takes the incremental index and computes an eXclusive OR with +// the least significant 8 bytes of the receivers' initial nonce (see sec. +// 5.16.1 and 5.16.2). It returns the resulting nonce. +func (wo *aeadCrypter) computeNextNonce() (nonce []byte) { + nonce = make([]byte, len(wo.initialNonce)) + copy(nonce, wo.initialNonce) + offset := len(wo.initialNonce) - 8 + for i := 0; i < 8; i++ { + nonce[i+offset] ^= wo.chunkIndex[i] + } + return +} + +// incrementIndex perfoms an integer increment by 1 of the integer represented by the +// slice, modifying it accordingly. +func (wo *aeadCrypter) incrementIndex() error { + index := wo.chunkIndex + if len(index) == 0 { + return errors.AEADError("Index has length 0") + } + for i := len(index) - 1; i >= 0; i-- { + if index[i] < 255 { + index[i]++ + return nil + } + index[i] = 0 + } + return errors.AEADError("cannot further increment index") +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/compressed.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/compressed.go new file mode 100644 index 0000000000..c55cecd357 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/compressed.go @@ -0,0 +1,123 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "compress/bzip2" + "compress/flate" + "compress/zlib" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "io" + "strconv" +) + +// Compressed represents a compressed OpenPGP packet. The decompressed contents +// will contain more OpenPGP packets. See RFC 4880, section 5.6. +type Compressed struct { + Body io.Reader +} + +const ( + NoCompression = flate.NoCompression + BestSpeed = flate.BestSpeed + BestCompression = flate.BestCompression + DefaultCompression = flate.DefaultCompression +) + +// CompressionConfig contains compressor configuration settings. +type CompressionConfig struct { + // Level is the compression level to use. It must be set to + // between -1 and 9, with -1 causing the compressor to use the + // default compression level, 0 causing the compressor to use + // no compression and 1 to 9 representing increasing (better, + // slower) compression levels. If Level is less than -1 or + // more then 9, a non-nil error will be returned during + // encryption. See the constants above for convenient common + // settings for Level. + Level int +} + +func (c *Compressed) parse(r io.Reader) error { + var buf [1]byte + _, err := readFull(r, buf[:]) + if err != nil { + return err + } + + switch buf[0] { + case 1: + c.Body = flate.NewReader(r) + case 2: + c.Body, err = zlib.NewReader(r) + case 3: + c.Body = bzip2.NewReader(r) + default: + err = errors.UnsupportedError("unknown compression algorithm: " + strconv.Itoa(int(buf[0]))) + } + + return err +} + +// compressedWriterCloser represents the serialized compression stream +// header and the compressor. Its Close() method ensures that both the +// compressor and serialized stream header are closed. Its Write() +// method writes to the compressor. +type compressedWriteCloser struct { + sh io.Closer // Stream Header + c io.WriteCloser // Compressor +} + +func (cwc compressedWriteCloser) Write(p []byte) (int, error) { + return cwc.c.Write(p) +} + +func (cwc compressedWriteCloser) Close() (err error) { + err = cwc.c.Close() + if err != nil { + return err + } + + return cwc.sh.Close() +} + +// SerializeCompressed serializes a compressed data packet to w and +// returns a WriteCloser to which the literal data packets themselves +// can be written and which MUST be closed on completion. If cc is +// nil, sensible defaults will be used to configure the compression +// algorithm. +func SerializeCompressed(w io.WriteCloser, algo CompressionAlgo, cc *CompressionConfig) (literaldata io.WriteCloser, err error) { + compressed, err := serializeStreamHeader(w, packetTypeCompressed) + if err != nil { + return + } + + _, err = compressed.Write([]byte{uint8(algo)}) + if err != nil { + return + } + + level := DefaultCompression + if cc != nil { + level = cc.Level + } + + var compressor io.WriteCloser + switch algo { + case CompressionZIP: + compressor, err = flate.NewWriter(compressed, level) + case CompressionZLIB: + compressor, err = zlib.NewWriterLevel(compressed, level) + default: + s := strconv.Itoa(int(algo)) + err = errors.UnsupportedError("Unsupported compression algorithm: " + s) + } + if err != nil { + return + } + + literaldata = compressedWriteCloser{compressed, compressor} + + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go new file mode 100644 index 0000000000..5652dd8148 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go @@ -0,0 +1,167 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "crypto" + "crypto/rand" + "io" + "math/big" + "time" +) + +// Config collects a number of parameters along with sensible defaults. +// A nil *Config is valid and results in all default values. +type Config struct { + // Rand provides the source of entropy. + // If nil, the crypto/rand Reader is used. + Rand io.Reader + // DefaultHash is the default hash function to be used. + // If zero, SHA-256 is used. + DefaultHash crypto.Hash + // DefaultCipher is the cipher to be used. + // If zero, AES-128 is used. + DefaultCipher CipherFunction + // Time returns the current time as the number of seconds since the + // epoch. If Time is nil, time.Now is used. + Time func() time.Time + // DefaultCompressionAlgo is the compression algorithm to be + // applied to the plaintext before encryption. If zero, no + // compression is done. + DefaultCompressionAlgo CompressionAlgo + // CompressionConfig configures the compression settings. + CompressionConfig *CompressionConfig + // S2KCount is only used for symmetric encryption. It + // determines the strength of the passphrase stretching when + // the said passphrase is hashed to produce a key. S2KCount + // should be between 1024 and 65011712, inclusive. If Config + // is nil or S2KCount is 0, the value 65536 used. Not all + // values in the above range can be represented. S2KCount will + // be rounded up to the next representable value if it cannot + // be encoded exactly. When set, it is strongly encrouraged to + // use a value that is at least 65536. See RFC 4880 Section + // 3.7.1.3. + S2KCount int + // RSABits is the number of bits in new RSA keys made with NewEntity. + // If zero, then 2048 bit keys are created. + RSABits int + // The public key algorithm to use - will always create a signing primary + // key and encryption subkey. + Algorithm PublicKeyAlgorithm + // Some known primes that are optionally prepopulated by the caller + RSAPrimes []*big.Int + // AEADConfig configures the use of the new AEAD Encrypted Data Packet, + // defined in the draft of the next version of the OpenPGP specification. + // If a non-nil AEADConfig is passed, usage of this packet is enabled. By + // default, it is disabled. See the documentation of AEADConfig for more + // configuration options related to AEAD. + // **Note: using this option may break compatibility with other OpenPGP + // implementations, as well as future versions of this library.** + AEADConfig *AEADConfig + // V5Keys configures version 5 key generation. If false, this package still + // supports version 5 keys, but produces version 4 keys. + V5Keys bool + // "The validity period of the key. This is the number of seconds after + // the key creation time that the key expires. If this is not present + // or has a value of zero, the key never expires. This is found only on + // a self-signature."" + // https://tools.ietf.org/html/rfc4880#section-5.2.3.6 + KeyLifetimeSecs uint32 + // "The validity period of the signature. This is the number of seconds + // after the signature creation time that the signature expires. If + // this is not present or has a value of zero, it never expires." + // https://tools.ietf.org/html/rfc4880#section-5.2.3.10 + SigLifetimeSecs uint32 + // SigningKeyId is used to specify the signing key to use (by Key ID). + // By default, the signing key is selected automatically, preferring + // signing subkeys if available. + SigningKeyId uint64 +} + +func (c *Config) Random() io.Reader { + if c == nil || c.Rand == nil { + return rand.Reader + } + return c.Rand +} + +func (c *Config) Hash() crypto.Hash { + if c == nil || uint(c.DefaultHash) == 0 { + return crypto.SHA256 + } + return c.DefaultHash +} + +func (c *Config) Cipher() CipherFunction { + if c == nil || uint8(c.DefaultCipher) == 0 { + return CipherAES128 + } + return c.DefaultCipher +} + +func (c *Config) Now() time.Time { + if c == nil || c.Time == nil { + return time.Now() + } + return c.Time() +} + +// KeyLifetime returns the validity period of the key. +func (c *Config) KeyLifetime() uint32 { + if c == nil { + return 0 + } + return c.KeyLifetimeSecs +} + +// SigLifetime returns the validity period of the signature. +func (c *Config) SigLifetime() uint32 { + if c == nil { + return 0 + } + return c.SigLifetimeSecs +} + +func (c *Config) Compression() CompressionAlgo { + if c == nil { + return CompressionNone + } + return c.DefaultCompressionAlgo +} + +func (c *Config) PasswordHashIterations() int { + if c == nil || c.S2KCount == 0 { + return 0 + } + return c.S2KCount +} + +func (c *Config) RSAModulusBits() int { + if c == nil || c.RSABits == 0 { + return 2048 + } + return c.RSABits +} + +func (c *Config) PublicKeyAlgorithm() PublicKeyAlgorithm { + if c == nil || c.Algorithm == 0 { + return PubKeyAlgoRSA + } + return c.Algorithm +} + +func (c *Config) AEAD() *AEADConfig { + if c == nil { + return nil + } + return c.AEADConfig +} + +func (c *Config) SigningKey() uint64 { + if c == nil { + return 0 + } + return c.SigningKeyId +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go new file mode 100644 index 0000000000..801aec92b4 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go @@ -0,0 +1,282 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "crypto" + "crypto/rsa" + "encoding/binary" + "io" + "math/big" + "strconv" + + "github.com/ProtonMail/go-crypto/openpgp/ecdh" + "github.com/ProtonMail/go-crypto/openpgp/elgamal" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" +) + +const encryptedKeyVersion = 3 + +// EncryptedKey represents a public-key encrypted session key. See RFC 4880, +// section 5.1. +type EncryptedKey struct { + KeyId uint64 + Algo PublicKeyAlgorithm + CipherFunc CipherFunction // only valid after a successful Decrypt + Key []byte // only valid after a successful Decrypt + + encryptedMPI1, encryptedMPI2 encoding.Field +} + +func (e *EncryptedKey) parse(r io.Reader) (err error) { + var buf [10]byte + _, err = readFull(r, buf[:]) + if err != nil { + return + } + if buf[0] != encryptedKeyVersion { + return errors.UnsupportedError("unknown EncryptedKey version " + strconv.Itoa(int(buf[0]))) + } + e.KeyId = binary.BigEndian.Uint64(buf[1:9]) + e.Algo = PublicKeyAlgorithm(buf[9]) + switch e.Algo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: + e.encryptedMPI1 = new(encoding.MPI) + if _, err = e.encryptedMPI1.ReadFrom(r); err != nil { + return + } + case PubKeyAlgoElGamal: + e.encryptedMPI1 = new(encoding.MPI) + if _, err = e.encryptedMPI1.ReadFrom(r); err != nil { + return + } + + e.encryptedMPI2 = new(encoding.MPI) + if _, err = e.encryptedMPI2.ReadFrom(r); err != nil { + return + } + case PubKeyAlgoECDH: + e.encryptedMPI1 = new(encoding.MPI) + if _, err = e.encryptedMPI1.ReadFrom(r); err != nil { + return + } + + e.encryptedMPI2 = new(encoding.OID) + if _, err = e.encryptedMPI2.ReadFrom(r); err != nil { + return + } + } + _, err = consumeAll(r) + return +} + +func checksumKeyMaterial(key []byte) uint16 { + var checksum uint16 + for _, v := range key { + checksum += uint16(v) + } + return checksum +} + +// Decrypt decrypts an encrypted session key with the given private key. The +// private key must have been decrypted first. +// If config is nil, sensible defaults will be used. +func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { + if e.KeyId != 0 && e.KeyId != priv.KeyId { + return errors.InvalidArgumentError("cannot decrypt encrypted session key for key id " + strconv.FormatUint(e.KeyId, 16) + " with private key id " + strconv.FormatUint(priv.KeyId, 16)) + } + if e.Algo != priv.PubKeyAlgo { + return errors.InvalidArgumentError("cannot decrypt encrypted session key of type " + strconv.Itoa(int(e.Algo)) + " with private key of type " + strconv.Itoa(int(priv.PubKeyAlgo))) + } + if priv.Dummy() { + return errors.ErrDummyPrivateKey("dummy key found") + } + + var err error + var b []byte + + // TODO(agl): use session key decryption routines here to avoid + // padding oracle attacks. + switch priv.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: + // Supports both *rsa.PrivateKey and crypto.Decrypter + k := priv.PrivateKey.(crypto.Decrypter) + b, err = k.Decrypt(config.Random(), padToKeySize(k.Public().(*rsa.PublicKey), e.encryptedMPI1.Bytes()), nil) + case PubKeyAlgoElGamal: + c1 := new(big.Int).SetBytes(e.encryptedMPI1.Bytes()) + c2 := new(big.Int).SetBytes(e.encryptedMPI2.Bytes()) + b, err = elgamal.Decrypt(priv.PrivateKey.(*elgamal.PrivateKey), c1, c2) + case PubKeyAlgoECDH: + vsG := e.encryptedMPI1.Bytes() + m := e.encryptedMPI2.Bytes() + oid := priv.PublicKey.oid.EncodedBytes() + b, err = ecdh.Decrypt(priv.PrivateKey.(*ecdh.PrivateKey), vsG, m, oid, priv.PublicKey.Fingerprint[:]) + default: + err = errors.InvalidArgumentError("cannot decrypt encrypted session key with private key of type " + strconv.Itoa(int(priv.PubKeyAlgo))) + } + + if err != nil { + return err + } + + e.CipherFunc = CipherFunction(b[0]) + e.Key = b[1 : len(b)-2] + expectedChecksum := uint16(b[len(b)-2])<<8 | uint16(b[len(b)-1]) + checksum := checksumKeyMaterial(e.Key) + if checksum != expectedChecksum { + return errors.StructuralError("EncryptedKey checksum incorrect") + } + + return nil +} + +// Serialize writes the encrypted key packet, e, to w. +func (e *EncryptedKey) Serialize(w io.Writer) error { + var mpiLen int + switch e.Algo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: + mpiLen = int(e.encryptedMPI1.EncodedLength()) + case PubKeyAlgoElGamal: + mpiLen = int(e.encryptedMPI1.EncodedLength()) + int(e.encryptedMPI2.EncodedLength()) + case PubKeyAlgoECDH: + mpiLen = int(e.encryptedMPI1.EncodedLength()) + int(e.encryptedMPI2.EncodedLength()) + default: + return errors.InvalidArgumentError("don't know how to serialize encrypted key type " + strconv.Itoa(int(e.Algo))) + } + + err := serializeHeader(w, packetTypeEncryptedKey, 1 /* version */ +8 /* key id */ +1 /* algo */ +mpiLen) + if err != nil { + return err + } + + w.Write([]byte{encryptedKeyVersion}) + binary.Write(w, binary.BigEndian, e.KeyId) + w.Write([]byte{byte(e.Algo)}) + + switch e.Algo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: + _, err := w.Write(e.encryptedMPI1.EncodedBytes()) + return err + case PubKeyAlgoElGamal: + if _, err := w.Write(e.encryptedMPI1.EncodedBytes()); err != nil { + return err + } + _, err := w.Write(e.encryptedMPI2.EncodedBytes()) + return err + case PubKeyAlgoECDH: + if _, err := w.Write(e.encryptedMPI1.EncodedBytes()); err != nil { + return err + } + _, err := w.Write(e.encryptedMPI2.EncodedBytes()) + return err + default: + panic("internal error") + } +} + +// SerializeEncryptedKey serializes an encrypted key packet to w that contains +// key, encrypted to pub. +// If config is nil, sensible defaults will be used. +func SerializeEncryptedKey(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, key []byte, config *Config) error { + var buf [10]byte + buf[0] = encryptedKeyVersion + binary.BigEndian.PutUint64(buf[1:9], pub.KeyId) + buf[9] = byte(pub.PubKeyAlgo) + + keyBlock := make([]byte, 1 /* cipher type */ +len(key)+2 /* checksum */) + keyBlock[0] = byte(cipherFunc) + copy(keyBlock[1:], key) + checksum := checksumKeyMaterial(key) + keyBlock[1+len(key)] = byte(checksum >> 8) + keyBlock[1+len(key)+1] = byte(checksum) + + switch pub.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: + return serializeEncryptedKeyRSA(w, config.Random(), buf, pub.PublicKey.(*rsa.PublicKey), keyBlock) + case PubKeyAlgoElGamal: + return serializeEncryptedKeyElGamal(w, config.Random(), buf, pub.PublicKey.(*elgamal.PublicKey), keyBlock) + case PubKeyAlgoECDH: + return serializeEncryptedKeyECDH(w, config.Random(), buf, pub.PublicKey.(*ecdh.PublicKey), keyBlock, pub.oid, pub.Fingerprint) + case PubKeyAlgoDSA, PubKeyAlgoRSASignOnly: + return errors.InvalidArgumentError("cannot encrypt to public key of type " + strconv.Itoa(int(pub.PubKeyAlgo))) + } + + return errors.UnsupportedError("encrypting a key to public key of type " + strconv.Itoa(int(pub.PubKeyAlgo))) +} + +func serializeEncryptedKeyRSA(w io.Writer, rand io.Reader, header [10]byte, pub *rsa.PublicKey, keyBlock []byte) error { + cipherText, err := rsa.EncryptPKCS1v15(rand, pub, keyBlock) + if err != nil { + return errors.InvalidArgumentError("RSA encryption failed: " + err.Error()) + } + + cipherMPI := encoding.NewMPI(cipherText) + packetLen := 10 /* header length */ + int(cipherMPI.EncodedLength()) + + err = serializeHeader(w, packetTypeEncryptedKey, packetLen) + if err != nil { + return err + } + _, err = w.Write(header[:]) + if err != nil { + return err + } + _, err = w.Write(cipherMPI.EncodedBytes()) + return err +} + +func serializeEncryptedKeyElGamal(w io.Writer, rand io.Reader, header [10]byte, pub *elgamal.PublicKey, keyBlock []byte) error { + c1, c2, err := elgamal.Encrypt(rand, pub, keyBlock) + if err != nil { + return errors.InvalidArgumentError("ElGamal encryption failed: " + err.Error()) + } + + packetLen := 10 /* header length */ + packetLen += 2 /* mpi size */ + (c1.BitLen()+7)/8 + packetLen += 2 /* mpi size */ + (c2.BitLen()+7)/8 + + err = serializeHeader(w, packetTypeEncryptedKey, packetLen) + if err != nil { + return err + } + _, err = w.Write(header[:]) + if err != nil { + return err + } + if _, err = w.Write(new(encoding.MPI).SetBig(c1).EncodedBytes()); err != nil { + return err + } + _, err = w.Write(new(encoding.MPI).SetBig(c2).EncodedBytes()) + return err +} + +func serializeEncryptedKeyECDH(w io.Writer, rand io.Reader, header [10]byte, pub *ecdh.PublicKey, keyBlock []byte, oid encoding.Field, fingerprint []byte) error { + vsG, c, err := ecdh.Encrypt(rand, pub, keyBlock, oid.EncodedBytes(), fingerprint) + if err != nil { + return errors.InvalidArgumentError("ECDH encryption failed: " + err.Error()) + } + + g := encoding.NewMPI(vsG) + m := encoding.NewOID(c) + + packetLen := 10 /* header length */ + packetLen += int(g.EncodedLength()) + int(m.EncodedLength()) + + err = serializeHeader(w, packetTypeEncryptedKey, packetLen) + if err != nil { + return err + } + + _, err = w.Write(header[:]) + if err != nil { + return err + } + if _, err = w.Write(g.EncodedBytes()); err != nil { + return err + } + _, err = w.Write(m.EncodedBytes()) + return err +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/literal.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/literal.go new file mode 100644 index 0000000000..4be987609b --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/literal.go @@ -0,0 +1,91 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "encoding/binary" + "io" +) + +// LiteralData represents an encrypted file. See RFC 4880, section 5.9. +type LiteralData struct { + Format uint8 + IsBinary bool + FileName string + Time uint32 // Unix epoch time. Either creation time or modification time. 0 means undefined. + Body io.Reader +} + +// ForEyesOnly returns whether the contents of the LiteralData have been marked +// as especially sensitive. +func (l *LiteralData) ForEyesOnly() bool { + return l.FileName == "_CONSOLE" +} + +func (l *LiteralData) parse(r io.Reader) (err error) { + var buf [256]byte + + _, err = readFull(r, buf[:2]) + if err != nil { + return + } + + l.Format = buf[0] + l.IsBinary = l.Format == 'b' + fileNameLen := int(buf[1]) + + _, err = readFull(r, buf[:fileNameLen]) + if err != nil { + return + } + + l.FileName = string(buf[:fileNameLen]) + + _, err = readFull(r, buf[:4]) + if err != nil { + return + } + + l.Time = binary.BigEndian.Uint32(buf[:4]) + l.Body = r + return +} + +// SerializeLiteral serializes a literal data packet to w and returns a +// WriteCloser to which the data itself can be written and which MUST be closed +// on completion. The fileName is truncated to 255 bytes. +func SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, err error) { + var buf [4]byte + buf[0] = 't' + if isBinary { + buf[0] = 'b' + } + if len(fileName) > 255 { + fileName = fileName[:255] + } + buf[1] = byte(len(fileName)) + + inner, err := serializeStreamHeader(w, packetTypeLiteralData) + if err != nil { + return + } + + _, err = inner.Write(buf[:2]) + if err != nil { + return + } + _, err = inner.Write([]byte(fileName)) + if err != nil { + return + } + binary.BigEndian.PutUint32(buf[:], time) + _, err = inner.Write(buf[:]) + if err != nil { + return + } + + plaintext = inner + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/ocfb.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/ocfb.go new file mode 100644 index 0000000000..4f26d0a00b --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/ocfb.go @@ -0,0 +1,137 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// OpenPGP CFB Mode. http://tools.ietf.org/html/rfc4880#section-13.9 + +package packet + +import ( + "crypto/cipher" +) + +type ocfbEncrypter struct { + b cipher.Block + fre []byte + outUsed int +} + +// An OCFBResyncOption determines if the "resynchronization step" of OCFB is +// performed. +type OCFBResyncOption bool + +const ( + OCFBResync OCFBResyncOption = true + OCFBNoResync OCFBResyncOption = false +) + +// NewOCFBEncrypter returns a cipher.Stream which encrypts data with OpenPGP's +// cipher feedback mode using the given cipher.Block, and an initial amount of +// ciphertext. randData must be random bytes and be the same length as the +// cipher.Block's block size. Resync determines if the "resynchronization step" +// from RFC 4880, 13.9 step 7 is performed. Different parts of OpenPGP vary on +// this point. +func NewOCFBEncrypter(block cipher.Block, randData []byte, resync OCFBResyncOption) (cipher.Stream, []byte) { + blockSize := block.BlockSize() + if len(randData) != blockSize { + return nil, nil + } + + x := &ocfbEncrypter{ + b: block, + fre: make([]byte, blockSize), + outUsed: 0, + } + prefix := make([]byte, blockSize+2) + + block.Encrypt(x.fre, x.fre) + for i := 0; i < blockSize; i++ { + prefix[i] = randData[i] ^ x.fre[i] + } + + block.Encrypt(x.fre, prefix[:blockSize]) + prefix[blockSize] = x.fre[0] ^ randData[blockSize-2] + prefix[blockSize+1] = x.fre[1] ^ randData[blockSize-1] + + if resync { + block.Encrypt(x.fre, prefix[2:]) + } else { + x.fre[0] = prefix[blockSize] + x.fre[1] = prefix[blockSize+1] + x.outUsed = 2 + } + return x, prefix +} + +func (x *ocfbEncrypter) XORKeyStream(dst, src []byte) { + for i := 0; i < len(src); i++ { + if x.outUsed == len(x.fre) { + x.b.Encrypt(x.fre, x.fre) + x.outUsed = 0 + } + + x.fre[x.outUsed] ^= src[i] + dst[i] = x.fre[x.outUsed] + x.outUsed++ + } +} + +type ocfbDecrypter struct { + b cipher.Block + fre []byte + outUsed int +} + +// NewOCFBDecrypter returns a cipher.Stream which decrypts data with OpenPGP's +// cipher feedback mode using the given cipher.Block. Prefix must be the first +// blockSize + 2 bytes of the ciphertext, where blockSize is the cipher.Block's +// block size. On successful exit, blockSize+2 bytes of decrypted data are written into +// prefix. Resync determines if the "resynchronization step" from RFC 4880, +// 13.9 step 7 is performed. Different parts of OpenPGP vary on this point. +func NewOCFBDecrypter(block cipher.Block, prefix []byte, resync OCFBResyncOption) cipher.Stream { + blockSize := block.BlockSize() + if len(prefix) != blockSize+2 { + return nil + } + + x := &ocfbDecrypter{ + b: block, + fre: make([]byte, blockSize), + outUsed: 0, + } + prefixCopy := make([]byte, len(prefix)) + copy(prefixCopy, prefix) + + block.Encrypt(x.fre, x.fre) + for i := 0; i < blockSize; i++ { + prefixCopy[i] ^= x.fre[i] + } + + block.Encrypt(x.fre, prefix[:blockSize]) + prefixCopy[blockSize] ^= x.fre[0] + prefixCopy[blockSize+1] ^= x.fre[1] + + if resync { + block.Encrypt(x.fre, prefix[2:]) + } else { + x.fre[0] = prefix[blockSize] + x.fre[1] = prefix[blockSize+1] + x.outUsed = 2 + } + copy(prefix, prefixCopy) + return x +} + +func (x *ocfbDecrypter) XORKeyStream(dst, src []byte) { + for i := 0; i < len(src); i++ { + if x.outUsed == len(x.fre) { + x.b.Encrypt(x.fre, x.fre) + x.outUsed = 0 + } + + c := src[i] + dst[i] = x.fre[x.outUsed] ^ src[i] + x.fre[x.outUsed] = c + x.outUsed++ + } +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go new file mode 100644 index 0000000000..41c35de219 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go @@ -0,0 +1,73 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "crypto" + "encoding/binary" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/s2k" + "io" + "strconv" +) + +// OnePassSignature represents a one-pass signature packet. See RFC 4880, +// section 5.4. +type OnePassSignature struct { + SigType SignatureType + Hash crypto.Hash + PubKeyAlgo PublicKeyAlgorithm + KeyId uint64 + IsLast bool +} + +const onePassSignatureVersion = 3 + +func (ops *OnePassSignature) parse(r io.Reader) (err error) { + var buf [13]byte + + _, err = readFull(r, buf[:]) + if err != nil { + return + } + if buf[0] != onePassSignatureVersion { + err = errors.UnsupportedError("one-pass-signature packet version " + strconv.Itoa(int(buf[0]))) + } + + var ok bool + ops.Hash, ok = s2k.HashIdToHash(buf[2]) + if !ok { + return errors.UnsupportedError("hash function: " + strconv.Itoa(int(buf[2]))) + } + + ops.SigType = SignatureType(buf[1]) + ops.PubKeyAlgo = PublicKeyAlgorithm(buf[3]) + ops.KeyId = binary.BigEndian.Uint64(buf[4:12]) + ops.IsLast = buf[12] != 0 + return +} + +// Serialize marshals the given OnePassSignature to w. +func (ops *OnePassSignature) Serialize(w io.Writer) error { + var buf [13]byte + buf[0] = onePassSignatureVersion + buf[1] = uint8(ops.SigType) + var ok bool + buf[2], ok = s2k.HashToHashId(ops.Hash) + if !ok { + return errors.UnsupportedError("hash type: " + strconv.Itoa(int(ops.Hash))) + } + buf[3] = uint8(ops.PubKeyAlgo) + binary.BigEndian.PutUint64(buf[4:12], ops.KeyId) + if ops.IsLast { + buf[12] = 1 + } + + if err := serializeHeader(w, packetTypeOnePassSignature, len(buf)); err != nil { + return err + } + _, err := w.Write(buf[:]) + return err +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go new file mode 100644 index 0000000000..e3879199e6 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go @@ -0,0 +1,162 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "bytes" + "io" + "io/ioutil" + + "github.com/ProtonMail/go-crypto/openpgp/errors" +) + +// OpaquePacket represents an OpenPGP packet as raw, unparsed data. This is +// useful for splitting and storing the original packet contents separately, +// handling unsupported packet types or accessing parts of the packet not yet +// implemented by this package. +type OpaquePacket struct { + // Packet type + Tag uint8 + // Reason why the packet was parsed opaquely + Reason error + // Binary contents of the packet data + Contents []byte +} + +func (op *OpaquePacket) parse(r io.Reader) (err error) { + op.Contents, err = ioutil.ReadAll(r) + return +} + +// Serialize marshals the packet to a writer in its original form, including +// the packet header. +func (op *OpaquePacket) Serialize(w io.Writer) (err error) { + err = serializeHeader(w, packetType(op.Tag), len(op.Contents)) + if err == nil { + _, err = w.Write(op.Contents) + } + return +} + +// Parse attempts to parse the opaque contents into a structure supported by +// this package. If the packet is not known then the result will be another +// OpaquePacket. +func (op *OpaquePacket) Parse() (p Packet, err error) { + hdr := bytes.NewBuffer(nil) + err = serializeHeader(hdr, packetType(op.Tag), len(op.Contents)) + if err != nil { + op.Reason = err + return op, err + } + p, err = Read(io.MultiReader(hdr, bytes.NewBuffer(op.Contents))) + if err != nil { + op.Reason = err + p = op + } + return +} + +// OpaqueReader reads OpaquePackets from an io.Reader. +type OpaqueReader struct { + r io.Reader +} + +func NewOpaqueReader(r io.Reader) *OpaqueReader { + return &OpaqueReader{r: r} +} + +// Read the next OpaquePacket. +func (or *OpaqueReader) Next() (op *OpaquePacket, err error) { + tag, _, contents, err := readHeader(or.r) + if err != nil { + return + } + op = &OpaquePacket{Tag: uint8(tag), Reason: err} + err = op.parse(contents) + if err != nil { + consumeAll(contents) + } + return +} + +// OpaqueSubpacket represents an unparsed OpenPGP subpacket, +// as found in signature and user attribute packets. +type OpaqueSubpacket struct { + SubType uint8 + Contents []byte +} + +// OpaqueSubpackets extracts opaque, unparsed OpenPGP subpackets from +// their byte representation. +func OpaqueSubpackets(contents []byte) (result []*OpaqueSubpacket, err error) { + var ( + subHeaderLen int + subPacket *OpaqueSubpacket + ) + for len(contents) > 0 { + subHeaderLen, subPacket, err = nextSubpacket(contents) + if err != nil { + break + } + result = append(result, subPacket) + contents = contents[subHeaderLen+len(subPacket.Contents):] + } + return +} + +func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacket, err error) { + // RFC 4880, section 5.2.3.1 + var subLen uint32 + if len(contents) < 1 { + goto Truncated + } + subPacket = &OpaqueSubpacket{} + switch { + case contents[0] < 192: + subHeaderLen = 2 // 1 length byte, 1 subtype byte + if len(contents) < subHeaderLen { + goto Truncated + } + subLen = uint32(contents[0]) + contents = contents[1:] + case contents[0] < 255: + subHeaderLen = 3 // 2 length bytes, 1 subtype + if len(contents) < subHeaderLen { + goto Truncated + } + subLen = uint32(contents[0]-192)<<8 + uint32(contents[1]) + 192 + contents = contents[2:] + default: + subHeaderLen = 6 // 5 length bytes, 1 subtype + if len(contents) < subHeaderLen { + goto Truncated + } + subLen = uint32(contents[1])<<24 | + uint32(contents[2])<<16 | + uint32(contents[3])<<8 | + uint32(contents[4]) + contents = contents[5:] + } + if subLen > uint32(len(contents)) || subLen == 0 { + goto Truncated + } + subPacket.SubType = contents[0] + subPacket.Contents = contents[1:subLen] + return +Truncated: + err = errors.StructuralError("subpacket truncated") + return +} + +func (osp *OpaqueSubpacket) Serialize(w io.Writer) (err error) { + buf := make([]byte, 6) + n := serializeSubpacketLength(buf, len(osp.Contents)+1) + buf[n] = osp.SubType + if _, err = w.Write(buf[:n+1]); err != nil { + return + } + _, err = w.Write(osp.Contents) + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go new file mode 100644 index 0000000000..6520381377 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go @@ -0,0 +1,523 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package packet implements parsing and serialization of OpenPGP packets, as +// specified in RFC 4880. +package packet // import "github.com/ProtonMail/go-crypto/openpgp/packet" + +import ( + "bytes" + "crypto/cipher" + "crypto/rsa" + "io" + + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" +) + +// readFull is the same as io.ReadFull except that reading zero bytes returns +// ErrUnexpectedEOF rather than EOF. +func readFull(r io.Reader, buf []byte) (n int, err error) { + n, err = io.ReadFull(r, buf) + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return +} + +// readLength reads an OpenPGP length from r. See RFC 4880, section 4.2.2. +func readLength(r io.Reader) (length int64, isPartial bool, err error) { + var buf [4]byte + _, err = readFull(r, buf[:1]) + if err != nil { + return + } + switch { + case buf[0] < 192: + length = int64(buf[0]) + case buf[0] < 224: + length = int64(buf[0]-192) << 8 + _, err = readFull(r, buf[0:1]) + if err != nil { + return + } + length += int64(buf[0]) + 192 + case buf[0] < 255: + length = int64(1) << (buf[0] & 0x1f) + isPartial = true + default: + _, err = readFull(r, buf[0:4]) + if err != nil { + return + } + length = int64(buf[0])<<24 | + int64(buf[1])<<16 | + int64(buf[2])<<8 | + int64(buf[3]) + } + return +} + +// partialLengthReader wraps an io.Reader and handles OpenPGP partial lengths. +// The continuation lengths are parsed and removed from the stream and EOF is +// returned at the end of the packet. See RFC 4880, section 4.2.2.4. +type partialLengthReader struct { + r io.Reader + remaining int64 + isPartial bool +} + +func (r *partialLengthReader) Read(p []byte) (n int, err error) { + for r.remaining == 0 { + if !r.isPartial { + return 0, io.EOF + } + r.remaining, r.isPartial, err = readLength(r.r) + if err != nil { + return 0, err + } + } + + toRead := int64(len(p)) + if toRead > r.remaining { + toRead = r.remaining + } + + n, err = r.r.Read(p[:int(toRead)]) + r.remaining -= int64(n) + if n < int(toRead) && err == io.EOF { + err = io.ErrUnexpectedEOF + } + return +} + +// partialLengthWriter writes a stream of data using OpenPGP partial lengths. +// See RFC 4880, section 4.2.2.4. +type partialLengthWriter struct { + w io.WriteCloser + buf bytes.Buffer + lengthByte [1]byte +} + +func (w *partialLengthWriter) Write(p []byte) (n int, err error) { + bufLen := w.buf.Len() + if bufLen > 512 { + for power := uint(30); ; power-- { + l := 1 << power + if bufLen >= l { + w.lengthByte[0] = 224 + uint8(power) + _, err = w.w.Write(w.lengthByte[:]) + if err != nil { + return + } + var m int + m, err = w.w.Write(w.buf.Next(l)) + if err != nil { + return + } + if m != l { + return 0, io.ErrShortWrite + } + break + } + } + } + return w.buf.Write(p) +} + +func (w *partialLengthWriter) Close() (err error) { + len := w.buf.Len() + err = serializeLength(w.w, len) + if err != nil { + return err + } + _, err = w.buf.WriteTo(w.w) + if err != nil { + return err + } + return w.w.Close() +} + +// A spanReader is an io.LimitReader, but it returns ErrUnexpectedEOF if the +// underlying Reader returns EOF before the limit has been reached. +type spanReader struct { + r io.Reader + n int64 +} + +func (l *spanReader) Read(p []byte) (n int, err error) { + if l.n <= 0 { + return 0, io.EOF + } + if int64(len(p)) > l.n { + p = p[0:l.n] + } + n, err = l.r.Read(p) + l.n -= int64(n) + if l.n > 0 && err == io.EOF { + err = io.ErrUnexpectedEOF + } + return +} + +// readHeader parses a packet header and returns an io.Reader which will return +// the contents of the packet. See RFC 4880, section 4.2. +func readHeader(r io.Reader) (tag packetType, length int64, contents io.Reader, err error) { + var buf [4]byte + _, err = io.ReadFull(r, buf[:1]) + if err != nil { + return + } + if buf[0]&0x80 == 0 { + err = errors.StructuralError("tag byte does not have MSB set") + return + } + if buf[0]&0x40 == 0 { + // Old format packet + tag = packetType((buf[0] & 0x3f) >> 2) + lengthType := buf[0] & 3 + if lengthType == 3 { + length = -1 + contents = r + return + } + lengthBytes := 1 << lengthType + _, err = readFull(r, buf[0:lengthBytes]) + if err != nil { + return + } + for i := 0; i < lengthBytes; i++ { + length <<= 8 + length |= int64(buf[i]) + } + contents = &spanReader{r, length} + return + } + + // New format packet + tag = packetType(buf[0] & 0x3f) + length, isPartial, err := readLength(r) + if err != nil { + return + } + if isPartial { + contents = &partialLengthReader{ + remaining: length, + isPartial: true, + r: r, + } + length = -1 + } else { + contents = &spanReader{r, length} + } + return +} + +// serializeHeader writes an OpenPGP packet header to w. See RFC 4880, section +// 4.2. +func serializeHeader(w io.Writer, ptype packetType, length int) (err error) { + err = serializeType(w, ptype) + if err != nil { + return + } + return serializeLength(w, length) +} + +// serializeType writes an OpenPGP packet type to w. See RFC 4880, section +// 4.2. +func serializeType(w io.Writer, ptype packetType) (err error) { + var buf [1]byte + buf[0] = 0x80 | 0x40 | byte(ptype) + _, err = w.Write(buf[:]) + return +} + +// serializeLength writes an OpenPGP packet length to w. See RFC 4880, section +// 4.2.2. +func serializeLength(w io.Writer, length int) (err error) { + var buf [5]byte + var n int + + if length < 192 { + buf[0] = byte(length) + n = 1 + } else if length < 8384 { + length -= 192 + buf[0] = 192 + byte(length>>8) + buf[1] = byte(length) + n = 2 + } else { + buf[0] = 255 + buf[1] = byte(length >> 24) + buf[2] = byte(length >> 16) + buf[3] = byte(length >> 8) + buf[4] = byte(length) + n = 5 + } + + _, err = w.Write(buf[:n]) + return +} + +// serializeStreamHeader writes an OpenPGP packet header to w where the +// length of the packet is unknown. It returns a io.WriteCloser which can be +// used to write the contents of the packet. See RFC 4880, section 4.2. +func serializeStreamHeader(w io.WriteCloser, ptype packetType) (out io.WriteCloser, err error) { + err = serializeType(w, ptype) + if err != nil { + return + } + out = &partialLengthWriter{w: w} + return +} + +// Packet represents an OpenPGP packet. Users are expected to try casting +// instances of this interface to specific packet types. +type Packet interface { + parse(io.Reader) error +} + +// consumeAll reads from the given Reader until error, returning the number of +// bytes read. +func consumeAll(r io.Reader) (n int64, err error) { + var m int + var buf [1024]byte + + for { + m, err = r.Read(buf[:]) + n += int64(m) + if err == io.EOF { + err = nil + return + } + if err != nil { + return + } + } +} + +// packetType represents the numeric ids of the different OpenPGP packet types. See +// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-2 +type packetType uint8 + +const ( + packetTypeEncryptedKey packetType = 1 + packetTypeSignature packetType = 2 + packetTypeSymmetricKeyEncrypted packetType = 3 + packetTypeOnePassSignature packetType = 4 + packetTypePrivateKey packetType = 5 + packetTypePublicKey packetType = 6 + packetTypePrivateSubkey packetType = 7 + packetTypeCompressed packetType = 8 + packetTypeSymmetricallyEncrypted packetType = 9 + packetTypeLiteralData packetType = 11 + packetTypeUserId packetType = 13 + packetTypePublicSubkey packetType = 14 + packetTypeUserAttribute packetType = 17 + packetTypeSymmetricallyEncryptedMDC packetType = 18 + packetTypeAEADEncrypted packetType = 20 +) + +// EncryptedDataPacket holds encrypted data. It is currently implemented by +// SymmetricallyEncrypted and AEADEncrypted. +type EncryptedDataPacket interface { + Decrypt(CipherFunction, []byte) (io.ReadCloser, error) +} + +// Read reads a single OpenPGP packet from the given io.Reader. If there is an +// error parsing a packet, the whole packet is consumed from the input. +func Read(r io.Reader) (p Packet, err error) { + tag, _, contents, err := readHeader(r) + if err != nil { + return + } + + switch tag { + case packetTypeEncryptedKey: + p = new(EncryptedKey) + case packetTypeSignature: + p = new(Signature) + case packetTypeSymmetricKeyEncrypted: + p = new(SymmetricKeyEncrypted) + case packetTypeOnePassSignature: + p = new(OnePassSignature) + case packetTypePrivateKey, packetTypePrivateSubkey: + pk := new(PrivateKey) + if tag == packetTypePrivateSubkey { + pk.IsSubkey = true + } + p = pk + case packetTypePublicKey, packetTypePublicSubkey: + isSubkey := tag == packetTypePublicSubkey + p = &PublicKey{IsSubkey: isSubkey} + case packetTypeCompressed: + p = new(Compressed) + case packetTypeSymmetricallyEncrypted: + err = errors.UnsupportedError("Symmetrically encrypted packets without MDC are not supported") + case packetTypeLiteralData: + p = new(LiteralData) + case packetTypeUserId: + p = new(UserId) + case packetTypeUserAttribute: + p = new(UserAttribute) + case packetTypeSymmetricallyEncryptedMDC: + se := new(SymmetricallyEncrypted) + se.MDC = true + p = se + case packetTypeAEADEncrypted: + p = new(AEADEncrypted) + default: + err = errors.UnknownPacketTypeError(tag) + } + if p != nil { + err = p.parse(contents) + } + if err != nil { + consumeAll(contents) + } + return +} + +// SignatureType represents the different semantic meanings of an OpenPGP +// signature. See RFC 4880, section 5.2.1. +type SignatureType uint8 + +const ( + SigTypeBinary SignatureType = 0x00 + SigTypeText = 0x01 + SigTypeGenericCert = 0x10 + SigTypePersonaCert = 0x11 + SigTypeCasualCert = 0x12 + SigTypePositiveCert = 0x13 + SigTypeSubkeyBinding = 0x18 + SigTypePrimaryKeyBinding = 0x19 + SigTypeDirectSignature = 0x1F + SigTypeKeyRevocation = 0x20 + SigTypeSubkeyRevocation = 0x28 + SigTypeCertificationRevocation = 0x30 +) + +// PublicKeyAlgorithm represents the different public key system specified for +// OpenPGP. See +// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-12 +type PublicKeyAlgorithm uint8 + +const ( + PubKeyAlgoRSA PublicKeyAlgorithm = 1 + PubKeyAlgoElGamal PublicKeyAlgorithm = 16 + PubKeyAlgoDSA PublicKeyAlgorithm = 17 + // RFC 6637, Section 5. + PubKeyAlgoECDH PublicKeyAlgorithm = 18 + PubKeyAlgoECDSA PublicKeyAlgorithm = 19 + // https://www.ietf.org/archive/id/draft-koch-eddsa-for-openpgp-04.txt + PubKeyAlgoEdDSA PublicKeyAlgorithm = 22 + + // Deprecated in RFC 4880, Section 13.5. Use key flags instead. + PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 + PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3 +) + +// CanEncrypt returns true if it's possible to encrypt a message to a public +// key of the given type. +func (pka PublicKeyAlgorithm) CanEncrypt() bool { + switch pka { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal, PubKeyAlgoECDH: + return true + } + return false +} + +// CanSign returns true if it's possible for a public key of the given type to +// sign a message. +func (pka PublicKeyAlgorithm) CanSign() bool { + switch pka { + case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA, PubKeyAlgoEdDSA: + return true + } + return false +} + +// CipherFunction represents the different block ciphers specified for OpenPGP. See +// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13 +type CipherFunction algorithm.CipherFunction + +const ( + Cipher3DES CipherFunction = 2 + CipherCAST5 CipherFunction = 3 + CipherAES128 CipherFunction = 7 + CipherAES192 CipherFunction = 8 + CipherAES256 CipherFunction = 9 +) + +// KeySize returns the key size, in bytes, of cipher. +func (cipher CipherFunction) KeySize() int { + return algorithm.CipherFunction(cipher).KeySize() +} + +// blockSize returns the block size, in bytes, of cipher. +func (cipher CipherFunction) blockSize() int { + return algorithm.CipherFunction(cipher).BlockSize() +} + +// new returns a fresh instance of the given cipher. +func (cipher CipherFunction) new(key []byte) (block cipher.Block) { + return algorithm.CipherFunction(cipher).New(key) +} + +// padToKeySize left-pads a MPI with zeroes to match the length of the +// specified RSA public. +func padToKeySize(pub *rsa.PublicKey, b []byte) []byte { + k := (pub.N.BitLen() + 7) / 8 + if len(b) >= k { + return b + } + bb := make([]byte, k) + copy(bb[len(bb)-len(b):], b) + return bb +} + +// CompressionAlgo Represents the different compression algorithms +// supported by OpenPGP (except for BZIP2, which is not currently +// supported). See Section 9.3 of RFC 4880. +type CompressionAlgo uint8 + +const ( + CompressionNone CompressionAlgo = 0 + CompressionZIP CompressionAlgo = 1 + CompressionZLIB CompressionAlgo = 2 +) + +// AEADMode represents the different Authenticated Encryption with Associated +// Data specified for OpenPGP. +type AEADMode algorithm.AEADMode + +const ( + AEADModeEAX AEADMode = 1 + AEADModeOCB AEADMode = 2 + AEADModeExperimentalGCM AEADMode = 100 +) + +func (mode AEADMode) NonceLength() int { + return algorithm.AEADMode(mode).NonceLength() +} + +func (mode AEADMode) TagLength() int { + return algorithm.AEADMode(mode).TagLength() +} + +// new returns a fresh instance of the given mode. +func (mode AEADMode) new(block cipher.Block) cipher.AEAD { + return algorithm.AEADMode(mode).New(block) +} + +// ReasonForRevocation represents a revocation reason code as per RFC4880 +// section 5.2.3.23. +type ReasonForRevocation uint8 + +const ( + NoReason ReasonForRevocation = 0 + KeySuperseded ReasonForRevocation = 1 + KeyCompromised ReasonForRevocation = 2 + KeyRetired ReasonForRevocation = 3 +) diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go new file mode 100644 index 0000000000..854f9c4bbb --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go @@ -0,0 +1,780 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "bytes" + "crypto" + "crypto/cipher" + "crypto/dsa" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "fmt" + "io" + "io/ioutil" + "math/big" + "strconv" + "time" + + "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" + "golang.org/x/crypto/curve25519" + + "github.com/ProtonMail/go-crypto/openpgp/ecdh" + "github.com/ProtonMail/go-crypto/openpgp/elgamal" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" + "github.com/ProtonMail/go-crypto/openpgp/s2k" + "golang.org/x/crypto/ed25519" +) + +// PrivateKey represents a possibly encrypted private key. See RFC 4880, +// section 5.5.3. +type PrivateKey struct { + PublicKey + Encrypted bool // if true then the private key is unavailable until Decrypt has been called. + encryptedData []byte + cipher CipherFunction + s2k func(out, in []byte) + // An *{rsa|dsa|elgamal|ecdh|ecdsa|ed25519}.PrivateKey or + // crypto.Signer/crypto.Decrypter (Decryptor RSA only). + PrivateKey interface{} + sha1Checksum bool + iv []byte + + // Type of encryption of the S2K packet + // Allowed values are 0 (Not encrypted), 254 (SHA1), or + // 255 (2-byte checksum) + s2kType S2KType + // Full parameters of the S2K packet + s2kParams *s2k.Params +} + +//S2KType s2k packet type +type S2KType uint8 + +const ( + // S2KNON unencrypt + S2KNON S2KType = 0 + // S2KSHA1 sha1 sum check + S2KSHA1 S2KType = 254 + // S2KCHECKSUM sum check + S2KCHECKSUM S2KType = 255 +) + +func NewRSAPrivateKey(creationTime time.Time, priv *rsa.PrivateKey) *PrivateKey { + pk := new(PrivateKey) + pk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey) + pk.PrivateKey = priv + return pk +} + +func NewDSAPrivateKey(creationTime time.Time, priv *dsa.PrivateKey) *PrivateKey { + pk := new(PrivateKey) + pk.PublicKey = *NewDSAPublicKey(creationTime, &priv.PublicKey) + pk.PrivateKey = priv + return pk +} + +func NewElGamalPrivateKey(creationTime time.Time, priv *elgamal.PrivateKey) *PrivateKey { + pk := new(PrivateKey) + pk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey) + pk.PrivateKey = priv + return pk +} + +func NewECDSAPrivateKey(creationTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey { + pk := new(PrivateKey) + pk.PublicKey = *NewECDSAPublicKey(creationTime, &priv.PublicKey) + pk.PrivateKey = priv + return pk +} + +func NewEdDSAPrivateKey(creationTime time.Time, priv *ed25519.PrivateKey) *PrivateKey { + pk := new(PrivateKey) + pub := priv.Public().(ed25519.PublicKey) + pk.PublicKey = *NewEdDSAPublicKey(creationTime, &pub) + pk.PrivateKey = priv + return pk +} + +func NewECDHPrivateKey(creationTime time.Time, priv *ecdh.PrivateKey) *PrivateKey { + pk := new(PrivateKey) + pk.PublicKey = *NewECDHPublicKey(creationTime, &priv.PublicKey) + pk.PrivateKey = priv + return pk +} + +// NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that +// implements RSA, ECDSA or EdDSA. +func NewSignerPrivateKey(creationTime time.Time, signer crypto.Signer) *PrivateKey { + pk := new(PrivateKey) + // In general, the public Keys should be used as pointers. We still + // type-switch on the values, for backwards-compatibility. + switch pubkey := signer.Public().(type) { + case *rsa.PublicKey: + pk.PublicKey = *NewRSAPublicKey(creationTime, pubkey) + case rsa.PublicKey: + pk.PublicKey = *NewRSAPublicKey(creationTime, &pubkey) + case *ecdsa.PublicKey: + pk.PublicKey = *NewECDSAPublicKey(creationTime, pubkey) + case ecdsa.PublicKey: + pk.PublicKey = *NewECDSAPublicKey(creationTime, &pubkey) + case *ed25519.PublicKey: + pk.PublicKey = *NewEdDSAPublicKey(creationTime, pubkey) + case ed25519.PublicKey: + pk.PublicKey = *NewEdDSAPublicKey(creationTime, &pubkey) + default: + panic("openpgp: unknown crypto.Signer type in NewSignerPrivateKey") + } + pk.PrivateKey = signer + return pk +} + +// NewDecrypterPrivateKey creates a PrivateKey from a *{rsa|elgamal|ecdh}.PrivateKey. +func NewDecrypterPrivateKey(creationTime time.Time, decrypter interface{}) *PrivateKey { + pk := new(PrivateKey) + switch priv := decrypter.(type) { + case *rsa.PrivateKey: + pk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey) + case *elgamal.PrivateKey: + pk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey) + case *ecdh.PrivateKey: + pk.PublicKey = *NewECDHPublicKey(creationTime, &priv.PublicKey) + default: + panic("openpgp: unknown decrypter type in NewDecrypterPrivateKey") + } + pk.PrivateKey = decrypter + return pk +} + +func (pk *PrivateKey) parse(r io.Reader) (err error) { + err = (&pk.PublicKey).parse(r) + if err != nil { + return + } + v5 := pk.PublicKey.Version == 5 + + var buf [1]byte + _, err = readFull(r, buf[:]) + if err != nil { + return + } + pk.s2kType = S2KType(buf[0]) + var optCount [1]byte + if v5 { + if _, err = readFull(r, optCount[:]); err != nil { + return + } + } + + switch pk.s2kType { + case S2KNON: + pk.s2k = nil + pk.Encrypted = false + case S2KSHA1, S2KCHECKSUM: + if v5 && pk.s2kType == S2KCHECKSUM { + return errors.StructuralError("wrong s2k identifier for version 5") + } + _, err = readFull(r, buf[:]) + if err != nil { + return + } + pk.cipher = CipherFunction(buf[0]) + pk.s2kParams, err = s2k.ParseIntoParams(r) + if err != nil { + return + } + if pk.s2kParams.Dummy() { + return + } + pk.s2k, err = pk.s2kParams.Function() + if err != nil { + return + } + pk.Encrypted = true + if pk.s2kType == S2KSHA1 { + pk.sha1Checksum = true + } + default: + return errors.UnsupportedError("deprecated s2k function in private key") + } + + if pk.Encrypted { + blockSize := pk.cipher.blockSize() + if blockSize == 0 { + return errors.UnsupportedError("unsupported cipher in private key: " + strconv.Itoa(int(pk.cipher))) + } + pk.iv = make([]byte, blockSize) + _, err = readFull(r, pk.iv) + if err != nil { + return + } + } + + var privateKeyData []byte + if v5 { + var n [4]byte /* secret material four octet count */ + _, err = readFull(r, n[:]) + if err != nil { + return + } + count := uint32(uint32(n[0])<<24 | uint32(n[1])<<16 | uint32(n[2])<<8 | uint32(n[3])) + if !pk.Encrypted { + count = count + 2 /* two octet checksum */ + } + privateKeyData = make([]byte, count) + _, err = readFull(r, privateKeyData) + if err != nil { + return + } + } else { + privateKeyData, err = ioutil.ReadAll(r) + if err != nil { + return + } + } + if !pk.Encrypted { + return pk.parsePrivateKey(privateKeyData) + } + + pk.encryptedData = privateKeyData + return +} + +// Dummy returns true if the private key is a dummy key. This is a GNU extension. +func (pk *PrivateKey) Dummy() bool { + return pk.s2kParams.Dummy() +} + +func mod64kHash(d []byte) uint16 { + var h uint16 + for _, b := range d { + h += uint16(b) + } + return h +} + +func (pk *PrivateKey) Serialize(w io.Writer) (err error) { + contents := bytes.NewBuffer(nil) + err = pk.PublicKey.serializeWithoutHeaders(contents) + if err != nil { + return + } + if _, err = contents.Write([]byte{uint8(pk.s2kType)}); err != nil { + return + } + + optional := bytes.NewBuffer(nil) + if pk.Encrypted || pk.Dummy() { + optional.Write([]byte{uint8(pk.cipher)}) + if err := pk.s2kParams.Serialize(optional); err != nil { + return err + } + if pk.Encrypted { + optional.Write(pk.iv) + } + } + if pk.Version == 5 { + contents.Write([]byte{uint8(optional.Len())}) + } + io.Copy(contents, optional) + + if !pk.Dummy() { + l := 0 + var priv []byte + if !pk.Encrypted { + buf := bytes.NewBuffer(nil) + err = pk.serializePrivateKey(buf) + if err != nil { + return err + } + l = buf.Len() + if pk.sha1Checksum { + h := sha1.New() + h.Write(buf.Bytes()) + buf.Write(h.Sum(nil)) + } else { + checksum := mod64kHash(buf.Bytes()) + buf.Write([]byte{byte(checksum >> 8), byte(checksum)}) + } + priv = buf.Bytes() + } else { + priv, l = pk.encryptedData, len(pk.encryptedData) + } + + if pk.Version == 5 { + contents.Write([]byte{byte(l >> 24), byte(l >> 16), byte(l >> 8), byte(l)}) + } + contents.Write(priv) + } + + ptype := packetTypePrivateKey + if pk.IsSubkey { + ptype = packetTypePrivateSubkey + } + err = serializeHeader(w, ptype, contents.Len()) + if err != nil { + return + } + _, err = io.Copy(w, contents) + if err != nil { + return + } + return +} + +func serializeRSAPrivateKey(w io.Writer, priv *rsa.PrivateKey) error { + if _, err := w.Write(new(encoding.MPI).SetBig(priv.D).EncodedBytes()); err != nil { + return err + } + if _, err := w.Write(new(encoding.MPI).SetBig(priv.Primes[1]).EncodedBytes()); err != nil { + return err + } + if _, err := w.Write(new(encoding.MPI).SetBig(priv.Primes[0]).EncodedBytes()); err != nil { + return err + } + _, err := w.Write(new(encoding.MPI).SetBig(priv.Precomputed.Qinv).EncodedBytes()) + return err +} + +func serializeDSAPrivateKey(w io.Writer, priv *dsa.PrivateKey) error { + _, err := w.Write(new(encoding.MPI).SetBig(priv.X).EncodedBytes()) + return err +} + +func serializeElGamalPrivateKey(w io.Writer, priv *elgamal.PrivateKey) error { + _, err := w.Write(new(encoding.MPI).SetBig(priv.X).EncodedBytes()) + return err +} + +func serializeECDSAPrivateKey(w io.Writer, priv *ecdsa.PrivateKey) error { + _, err := w.Write(new(encoding.MPI).SetBig(priv.D).EncodedBytes()) + return err +} + +func serializeEdDSAPrivateKey(w io.Writer, priv *ed25519.PrivateKey) error { + keySize := ed25519.PrivateKeySize - ed25519.PublicKeySize + _, err := w.Write(encoding.NewMPI((*priv)[:keySize]).EncodedBytes()) + return err +} + +func serializeECDHPrivateKey(w io.Writer, priv *ecdh.PrivateKey) error { + _, err := w.Write(encoding.NewMPI(priv.D).EncodedBytes()) + return err +} + +// Decrypt decrypts an encrypted private key using a passphrase. +func (pk *PrivateKey) Decrypt(passphrase []byte) error { + if pk.Dummy() { + return errors.ErrDummyPrivateKey("dummy key found") + } + if !pk.Encrypted { + return nil + } + + key := make([]byte, pk.cipher.KeySize()) + pk.s2k(key, passphrase) + block := pk.cipher.new(key) + cfb := cipher.NewCFBDecrypter(block, pk.iv) + + data := make([]byte, len(pk.encryptedData)) + cfb.XORKeyStream(data, pk.encryptedData) + + if pk.sha1Checksum { + if len(data) < sha1.Size { + return errors.StructuralError("truncated private key data") + } + h := sha1.New() + h.Write(data[:len(data)-sha1.Size]) + sum := h.Sum(nil) + if !bytes.Equal(sum, data[len(data)-sha1.Size:]) { + return errors.StructuralError("private key checksum failure") + } + data = data[:len(data)-sha1.Size] + } else { + if len(data) < 2 { + return errors.StructuralError("truncated private key data") + } + var sum uint16 + for i := 0; i < len(data)-2; i++ { + sum += uint16(data[i]) + } + if data[len(data)-2] != uint8(sum>>8) || + data[len(data)-1] != uint8(sum) { + return errors.StructuralError("private key checksum failure") + } + data = data[:len(data)-2] + } + + err := pk.parsePrivateKey(data) + if _, ok := err.(errors.KeyInvalidError); ok { + return errors.KeyInvalidError("invalid key parameters") + } + if err != nil { + return err + } + + // Mark key as unencrypted + pk.s2kType = S2KNON + pk.s2k = nil + pk.Encrypted = false + pk.encryptedData = nil + + return nil +} + +// Encrypt encrypts an unencrypted private key using a passphrase. +func (pk *PrivateKey) Encrypt(passphrase []byte) error { + priv := bytes.NewBuffer(nil) + err := pk.serializePrivateKey(priv) + if err != nil { + return err + } + + //Default config of private key encryption + pk.cipher = CipherAES256 + s2kConfig := &s2k.Config{ + S2KMode: 3, //Iterated + S2KCount: 65536, + Hash: crypto.SHA256, + } + + pk.s2kParams, err = s2k.Generate(rand.Reader, s2kConfig) + if err != nil { + return err + } + privateKeyBytes := priv.Bytes() + key := make([]byte, pk.cipher.KeySize()) + + pk.sha1Checksum = true + pk.s2k, err = pk.s2kParams.Function() + if err != nil { + return err + } + pk.s2k(key, passphrase) + block := pk.cipher.new(key) + pk.iv = make([]byte, pk.cipher.blockSize()) + _, err = rand.Read(pk.iv) + if err != nil { + return err + } + cfb := cipher.NewCFBEncrypter(block, pk.iv) + + if pk.sha1Checksum { + pk.s2kType = S2KSHA1 + h := sha1.New() + h.Write(privateKeyBytes) + sum := h.Sum(nil) + privateKeyBytes = append(privateKeyBytes, sum...) + } else { + pk.s2kType = S2KCHECKSUM + var sum uint16 + for _, b := range privateKeyBytes { + sum += uint16(b) + } + priv.Write([]byte{uint8(sum >> 8), uint8(sum)}) + } + + pk.encryptedData = make([]byte, len(privateKeyBytes)) + cfb.XORKeyStream(pk.encryptedData, privateKeyBytes) + pk.Encrypted = true + pk.PrivateKey = nil + return err +} + +func (pk *PrivateKey) serializePrivateKey(w io.Writer) (err error) { + switch priv := pk.PrivateKey.(type) { + case *rsa.PrivateKey: + err = serializeRSAPrivateKey(w, priv) + case *dsa.PrivateKey: + err = serializeDSAPrivateKey(w, priv) + case *elgamal.PrivateKey: + err = serializeElGamalPrivateKey(w, priv) + case *ecdsa.PrivateKey: + err = serializeECDSAPrivateKey(w, priv) + case *ed25519.PrivateKey: + err = serializeEdDSAPrivateKey(w, priv) + case *ecdh.PrivateKey: + err = serializeECDHPrivateKey(w, priv) + default: + err = errors.InvalidArgumentError("unknown private key type") + } + return +} + +func (pk *PrivateKey) parsePrivateKey(data []byte) (err error) { + switch pk.PublicKey.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoRSAEncryptOnly: + return pk.parseRSAPrivateKey(data) + case PubKeyAlgoDSA: + return pk.parseDSAPrivateKey(data) + case PubKeyAlgoElGamal: + return pk.parseElGamalPrivateKey(data) + case PubKeyAlgoECDSA: + return pk.parseECDSAPrivateKey(data) + case PubKeyAlgoECDH: + return pk.parseECDHPrivateKey(data) + case PubKeyAlgoEdDSA: + return pk.parseEdDSAPrivateKey(data) + } + panic("impossible") +} + +func (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err error) { + rsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey) + rsaPriv := new(rsa.PrivateKey) + rsaPriv.PublicKey = *rsaPub + + buf := bytes.NewBuffer(data) + d := new(encoding.MPI) + if _, err := d.ReadFrom(buf); err != nil { + return err + } + + p := new(encoding.MPI) + if _, err := p.ReadFrom(buf); err != nil { + return err + } + + q := new(encoding.MPI) + if _, err := q.ReadFrom(buf); err != nil { + return err + } + + rsaPriv.D = new(big.Int).SetBytes(d.Bytes()) + rsaPriv.Primes = make([]*big.Int, 2) + rsaPriv.Primes[0] = new(big.Int).SetBytes(p.Bytes()) + rsaPriv.Primes[1] = new(big.Int).SetBytes(q.Bytes()) + if err := rsaPriv.Validate(); err != nil { + return errors.KeyInvalidError(err.Error()) + } + rsaPriv.Precompute() + pk.PrivateKey = rsaPriv + + return nil +} + +func (pk *PrivateKey) parseDSAPrivateKey(data []byte) (err error) { + dsaPub := pk.PublicKey.PublicKey.(*dsa.PublicKey) + dsaPriv := new(dsa.PrivateKey) + dsaPriv.PublicKey = *dsaPub + + buf := bytes.NewBuffer(data) + x := new(encoding.MPI) + if _, err := x.ReadFrom(buf); err != nil { + return err + } + + dsaPriv.X = new(big.Int).SetBytes(x.Bytes()) + if err := validateDSAParameters(dsaPriv); err != nil { + return err + } + pk.PrivateKey = dsaPriv + + return nil +} + +func (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err error) { + pub := pk.PublicKey.PublicKey.(*elgamal.PublicKey) + priv := new(elgamal.PrivateKey) + priv.PublicKey = *pub + + buf := bytes.NewBuffer(data) + x := new(encoding.MPI) + if _, err := x.ReadFrom(buf); err != nil { + return err + } + + priv.X = new(big.Int).SetBytes(x.Bytes()) + if err := validateElGamalParameters(priv); err != nil { + return err + } + pk.PrivateKey = priv + + return nil +} + +func (pk *PrivateKey) parseECDSAPrivateKey(data []byte) (err error) { + ecdsaPub := pk.PublicKey.PublicKey.(*ecdsa.PublicKey) + ecdsaPriv := new(ecdsa.PrivateKey) + ecdsaPriv.PublicKey = *ecdsaPub + + buf := bytes.NewBuffer(data) + d := new(encoding.MPI) + if _, err := d.ReadFrom(buf); err != nil { + return err + } + + ecdsaPriv.D = new(big.Int).SetBytes(d.Bytes()) + if err := validateECDSAParameters(ecdsaPriv); err != nil { + return err + } + pk.PrivateKey = ecdsaPriv + + return nil +} + +func (pk *PrivateKey) parseECDHPrivateKey(data []byte) (err error) { + ecdhPub := pk.PublicKey.PublicKey.(*ecdh.PublicKey) + ecdhPriv := new(ecdh.PrivateKey) + ecdhPriv.PublicKey = *ecdhPub + + buf := bytes.NewBuffer(data) + d := new(encoding.MPI) + if _, err := d.ReadFrom(buf); err != nil { + return err + } + + ecdhPriv.D = d.Bytes() + if err := validateECDHParameters(ecdhPriv); err != nil { + return err + } + pk.PrivateKey = ecdhPriv + + return nil +} + +func (pk *PrivateKey) parseEdDSAPrivateKey(data []byte) (err error) { + eddsaPub := pk.PublicKey.PublicKey.(*ed25519.PublicKey) + eddsaPriv := make(ed25519.PrivateKey, ed25519.PrivateKeySize) + + buf := bytes.NewBuffer(data) + d := new(encoding.MPI) + if _, err := d.ReadFrom(buf); err != nil { + return err + } + + priv := d.Bytes() + copy(eddsaPriv[32-len(priv):32], priv) + copy(eddsaPriv[32:], (*eddsaPub)[:]) + if err := validateEdDSAParameters(&eddsaPriv); err != nil { + return err + } + pk.PrivateKey = &eddsaPriv + + return nil +} + +func validateECDSAParameters(priv *ecdsa.PrivateKey) error { + return validateCommonECC(priv.Curve, priv.D.Bytes(), priv.X, priv.Y) +} + +func validateECDHParameters(priv *ecdh.PrivateKey) error { + if priv.CurveType != ecc.Curve25519 { + return validateCommonECC(priv.Curve, priv.D, priv.X, priv.Y) + } + // Handle Curve25519 + Q := priv.X.Bytes()[1:] + var d [32]byte + // Copy reversed d + l := len(priv.D) + for i := 0; i < l; i++ { + d[i] = priv.D[l-i-1] + } + var expectedQ [32]byte + curve25519.ScalarBaseMult(&expectedQ, &d) + if !bytes.Equal(Q, expectedQ[:]) { + return errors.KeyInvalidError("ECDH curve25519: invalid point") + } + return nil +} + +func validateCommonECC(curve elliptic.Curve, d []byte, X, Y *big.Int) error { + // the public point should not be at infinity (0,0) + zero := new(big.Int) + if X.Cmp(zero) == 0 && Y.Cmp(zero) == 0 { + return errors.KeyInvalidError(fmt.Sprintf("ecc (%s): infinity point", curve.Params().Name)) + } + // re-derive the public point Q' = (X,Y) = dG + // to compare to declared Q in public key + expectedX, expectedY := curve.ScalarBaseMult(d) + if X.Cmp(expectedX) != 0 || Y.Cmp(expectedY) != 0 { + return errors.KeyInvalidError(fmt.Sprintf("ecc (%s): invalid point", curve.Params().Name)) + } + return nil +} + +func validateEdDSAParameters(priv *ed25519.PrivateKey) error { + // In EdDSA, the serialized public point is stored as part of private key (together with the seed), + // hence we can re-derive the key from the seed + seed := priv.Seed() + expectedPriv := ed25519.NewKeyFromSeed(seed) + if !bytes.Equal(*priv, expectedPriv) { + return errors.KeyInvalidError("eddsa: invalid point") + } + return nil +} + +func validateDSAParameters(priv *dsa.PrivateKey) error { + p := priv.P // group prime + q := priv.Q // subgroup order + g := priv.G // g has order q mod p + x := priv.X // secret + y := priv.Y // y == g**x mod p + one := big.NewInt(1) + // expect g, y >= 2 and g < p + if g.Cmp(one) <= 0 || y.Cmp(one) <= 0 || g.Cmp(p) > 0 { + return errors.KeyInvalidError("dsa: invalid group") + } + // expect p > q + if p.Cmp(q) <= 0 { + return errors.KeyInvalidError("dsa: invalid group prime") + } + // q should be large enough and divide p-1 + pSub1 := new(big.Int).Sub(p, one) + if q.BitLen() < 150 || new(big.Int).Mod(pSub1, q).Cmp(big.NewInt(0)) != 0 { + return errors.KeyInvalidError("dsa: invalid order") + } + // confirm that g has order q mod p + if !q.ProbablyPrime(32) || new(big.Int).Exp(g, q, p).Cmp(one) != 0 { + return errors.KeyInvalidError("dsa: invalid order") + } + // check y + if new(big.Int).Exp(g, x, p).Cmp(y) != 0 { + return errors.KeyInvalidError("dsa: mismatching values") + } + + return nil +} + +func validateElGamalParameters(priv *elgamal.PrivateKey) error { + p := priv.P // group prime + g := priv.G // g has order p-1 mod p + x := priv.X // secret + y := priv.Y // y == g**x mod p + one := big.NewInt(1) + // Expect g, y >= 2 and g < p + if g.Cmp(one) <= 0 || y.Cmp(one) <= 0 || g.Cmp(p) > 0 { + return errors.KeyInvalidError("elgamal: invalid group") + } + if p.BitLen() < 1024 { + return errors.KeyInvalidError("elgamal: group order too small") + } + pSub1 := new(big.Int).Sub(p, one) + if new(big.Int).Exp(g, pSub1, p).Cmp(one) != 0 { + return errors.KeyInvalidError("elgamal: invalid group") + } + // Since p-1 is not prime, g might have a smaller order that divides p-1. + // We cannot confirm the exact order of g, but we make sure it is not too small. + gExpI := new(big.Int).Set(g) + i := 1 + threshold := 2 << 17 // we want order > threshold + for i < threshold { + i++ // we check every order to make sure key validation is not easily bypassed by guessing y' + gExpI.Mod(new(big.Int).Mul(gExpI, g), p) + if gExpI.Cmp(one) == 0 { + return errors.KeyInvalidError("elgamal: order too small") + } + } + // Check y + if new(big.Int).Exp(g, x, p).Cmp(y) != 0 { + return errors.KeyInvalidError("elgamal: mismatching values") + } + + return nil +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key_test_data.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key_test_data.go new file mode 100644 index 0000000000..029b8f1aab --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key_test_data.go @@ -0,0 +1,12 @@ +package packet + +// Generated with `gpg --export-secret-keys "Test Key 2"` +const privKeyRSAHex = "9501fe044cc349a8010400b70ca0010e98c090008d45d1ee8f9113bd5861fd57b88bacb7c68658747663f1e1a3b5a98f32fda6472373c024b97359cd2efc88ff60f77751adfbf6af5e615e6a1408cfad8bf0cea30b0d5f53aa27ad59089ba9b15b7ebc2777a25d7b436144027e3bcd203909f147d0e332b240cf63d3395f5dfe0df0a6c04e8655af7eacdf0011010001fe0303024a252e7d475fd445607de39a265472aa74a9320ba2dac395faa687e9e0336aeb7e9a7397e511b5afd9dc84557c80ac0f3d4d7bfec5ae16f20d41c8c84a04552a33870b930420e230e179564f6d19bb153145e76c33ae993886c388832b0fa042ddda7f133924f3854481533e0ede31d51278c0519b29abc3bf53da673e13e3e1214b52413d179d7f66deee35cac8eacb060f78379d70ef4af8607e68131ff529439668fc39c9ce6dfef8a5ac234d234802cbfb749a26107db26406213ae5c06d4673253a3cbee1fcbae58d6ab77e38d6e2c0e7c6317c48e054edadb5a40d0d48acb44643d998139a8a66bb820be1f3f80185bc777d14b5954b60effe2448a036d565c6bc0b915fcea518acdd20ab07bc1529f561c58cd044f723109b93f6fd99f876ff891d64306b5d08f48bab59f38695e9109c4dec34013ba3153488ce070268381ba923ee1eb77125b36afcb4347ec3478c8f2735b06ef17351d872e577fa95d0c397c88c71b59629a36aec" + +// Generated by `gpg --export-secret-keys` followed by a manual extraction of +// the ElGamal subkey from the packets. +const privKeyElGamalHex = "9d0157044df9ee1a100400eb8e136a58ec39b582629cdadf830bc64e0a94ed8103ca8bb247b27b11b46d1d25297ef4bcc3071785ba0c0bedfe89eabc5287fcc0edf81ab5896c1c8e4b20d27d79813c7aede75320b33eaeeaa586edc00fd1036c10133e6ba0ff277245d0d59d04b2b3421b7244aca5f4a8d870c6f1c1fbff9e1c26699a860b9504f35ca1d700030503fd1ededd3b840795be6d9ccbe3c51ee42e2f39233c432b831ddd9c4e72b7025a819317e47bf94f9ee316d7273b05d5fcf2999c3a681f519b1234bbfa6d359b4752bd9c3f77d6b6456cde152464763414ca130f4e91d91041432f90620fec0e6d6b5116076c2985d5aeaae13be492b9b329efcaf7ee25120159a0a30cd976b42d7afe030302dae7eb80db744d4960c4df930d57e87fe81412eaace9f900e6c839817a614ddb75ba6603b9417c33ea7b6c93967dfa2bcff3fa3c74a5ce2c962db65b03aece14c96cbd0038fc" + +// pkcs1PrivKeyHex is a PKCS#1, RSA private key. +// Generated by `openssl genrsa 1024 | openssl rsa -outform DER | xxd -p` +const pkcs1PrivKeyHex = "3082025d02010002818100e98edfa1c3b35884a54d0b36a6a603b0290fa85e49e30fa23fc94fef9c6790bc4849928607aa48d809da326fb42a969d06ad756b98b9c1a90f5d4a2b6d0ac05953c97f4da3120164a21a679793ce181c906dc01d235cc085ddcdf6ea06c389b6ab8885dfd685959e693138856a68a7e5db263337ff82a088d583a897cf2d59e9020301000102818100b6d5c9eb70b02d5369b3ee5b520a14490b5bde8a317d36f7e4c74b7460141311d1e5067735f8f01d6f5908b2b96fbd881f7a1ab9a84d82753e39e19e2d36856be960d05ac9ef8e8782ea1b6d65aee28fdfe1d61451e8cff0adfe84322f12cf455028b581cf60eb9e0e140ba5d21aeba6c2634d7c65318b9a665fc01c3191ca21024100fa5e818da3705b0fa33278bb28d4b6f6050388af2d4b75ec9375dd91ccf2e7d7068086a8b82a8f6282e4fbbdb8a7f2622eb97295249d87acea7f5f816f54d347024100eecf9406d7dc49cdfb95ab1eff4064de84c7a30f64b2798936a0d2018ba9eb52e4b636f82e96c49cc63b80b675e91e40d1b2e4017d4b9adaf33ab3d9cf1c214f024100c173704ace742c082323066226a4655226819a85304c542b9dacbeacbf5d1881ee863485fcf6f59f3a604f9b42289282067447f2b13dfeed3eab7851fc81e0550240741fc41f3fc002b382eed8730e33c5d8de40256e4accee846667f536832f711ab1d4590e7db91a8a116ac5bff3be13d3f9243ff2e976662aa9b395d907f8e9c9024046a5696c9ef882363e06c9fa4e2f5b580906452befba03f4a99d0f873697ef1f851d2226ca7934b30b7c3e80cb634a67172bbbf4781735fe3e09263e2dd723e7" diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go new file mode 100644 index 0000000000..297dc40ba8 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go @@ -0,0 +1,825 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "crypto" + "crypto/dsa" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rsa" + "crypto/sha1" + "crypto/sha256" + _ "crypto/sha512" + "encoding/binary" + "fmt" + "hash" + "io" + "math/big" + "strconv" + "time" + + "github.com/ProtonMail/go-crypto/openpgp/ecdh" + "github.com/ProtonMail/go-crypto/openpgp/elgamal" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" + "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" + "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" + "golang.org/x/crypto/ed25519" +) + +type kdfHashFunction byte +type kdfAlgorithm byte + +// PublicKey represents an OpenPGP public key. See RFC 4880, section 5.5.2. +type PublicKey struct { + Version int + CreationTime time.Time + PubKeyAlgo PublicKeyAlgorithm + PublicKey interface{} // *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey or *eddsa.PublicKey + Fingerprint []byte + KeyId uint64 + IsSubkey bool + + // RFC 4880 fields + n, e, p, q, g, y encoding.Field + + // RFC 6637 fields + // oid contains the OID byte sequence identifying the elliptic curve used + oid encoding.Field + + // kdf stores key derivation function parameters + // used for ECDH encryption. See RFC 6637, Section 9. + kdf encoding.Field +} + +// UpgradeToV5 updates the version of the key to v5, and updates all necessary +// fields. +func (pk *PublicKey) UpgradeToV5() { + pk.Version = 5 + pk.setFingerprintAndKeyId() +} + +// signingKey provides a convenient abstraction over signature verification +// for v3 and v4 public keys. +type signingKey interface { + SerializeForHash(io.Writer) error + SerializeSignaturePrefix(io.Writer) + serializeWithoutHeaders(io.Writer) error +} + +// NewRSAPublicKey returns a PublicKey that wraps the given rsa.PublicKey. +func NewRSAPublicKey(creationTime time.Time, pub *rsa.PublicKey) *PublicKey { + pk := &PublicKey{ + Version: 4, + CreationTime: creationTime, + PubKeyAlgo: PubKeyAlgoRSA, + PublicKey: pub, + n: new(encoding.MPI).SetBig(pub.N), + e: new(encoding.MPI).SetBig(big.NewInt(int64(pub.E))), + } + + pk.setFingerprintAndKeyId() + return pk +} + +// NewDSAPublicKey returns a PublicKey that wraps the given dsa.PublicKey. +func NewDSAPublicKey(creationTime time.Time, pub *dsa.PublicKey) *PublicKey { + pk := &PublicKey{ + Version: 4, + CreationTime: creationTime, + PubKeyAlgo: PubKeyAlgoDSA, + PublicKey: pub, + p: new(encoding.MPI).SetBig(pub.P), + q: new(encoding.MPI).SetBig(pub.Q), + g: new(encoding.MPI).SetBig(pub.G), + y: new(encoding.MPI).SetBig(pub.Y), + } + + pk.setFingerprintAndKeyId() + return pk +} + +// NewElGamalPublicKey returns a PublicKey that wraps the given elgamal.PublicKey. +func NewElGamalPublicKey(creationTime time.Time, pub *elgamal.PublicKey) *PublicKey { + pk := &PublicKey{ + Version: 4, + CreationTime: creationTime, + PubKeyAlgo: PubKeyAlgoElGamal, + PublicKey: pub, + p: new(encoding.MPI).SetBig(pub.P), + g: new(encoding.MPI).SetBig(pub.G), + y: new(encoding.MPI).SetBig(pub.Y), + } + + pk.setFingerprintAndKeyId() + return pk +} + +func NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey { + pk := &PublicKey{ + Version: 4, + CreationTime: creationTime, + PubKeyAlgo: PubKeyAlgoECDSA, + PublicKey: pub, + p: encoding.NewMPI(elliptic.Marshal(pub.Curve, pub.X, pub.Y)), + } + + curveInfo := ecc.FindByCurve(pub.Curve) + if curveInfo == nil { + panic("unknown elliptic curve") + } + pk.oid = curveInfo.Oid + pk.setFingerprintAndKeyId() + return pk +} + +func NewECDHPublicKey(creationTime time.Time, pub *ecdh.PublicKey) *PublicKey { + var pk *PublicKey + var curveInfo *ecc.CurveInfo + var kdf = encoding.NewOID([]byte{0x1, pub.Hash.Id(), pub.Cipher.Id()}) + if pub.CurveType == ecc.Curve25519 { + pk = &PublicKey{ + Version: 4, + CreationTime: creationTime, + PubKeyAlgo: PubKeyAlgoECDH, + PublicKey: pub, + p: encoding.NewMPI(pub.X.Bytes()), + kdf: kdf, + } + curveInfo = ecc.FindByName("Curve25519") + } else { + pk = &PublicKey{ + Version: 4, + CreationTime: creationTime, + PubKeyAlgo: PubKeyAlgoECDH, + PublicKey: pub, + p: encoding.NewMPI(elliptic.Marshal(pub.Curve, pub.X, pub.Y)), + kdf: kdf, + } + curveInfo = ecc.FindByCurve(pub.Curve) + } + if curveInfo == nil { + panic("unknown elliptic curve") + } + pk.oid = curveInfo.Oid + pk.setFingerprintAndKeyId() + return pk +} + +func NewEdDSAPublicKey(creationTime time.Time, pub *ed25519.PublicKey) *PublicKey { + curveInfo := ecc.FindByName("Ed25519") + pk := &PublicKey{ + Version: 4, + CreationTime: creationTime, + PubKeyAlgo: PubKeyAlgoEdDSA, + PublicKey: pub, + oid: curveInfo.Oid, + // Native point format, see draft-koch-eddsa-for-openpgp-04, Appendix B + p: encoding.NewMPI(append([]byte{0x40}, *pub...)), + } + + pk.setFingerprintAndKeyId() + return pk +} + +func (pk *PublicKey) parse(r io.Reader) (err error) { + // RFC 4880, section 5.5.2 + var buf [6]byte + _, err = readFull(r, buf[:]) + if err != nil { + return + } + if buf[0] != 4 && buf[0] != 5 { + return errors.UnsupportedError("public key version " + strconv.Itoa(int(buf[0]))) + } + + pk.Version = int(buf[0]) + if pk.Version == 5 { + var n [4]byte + _, err = readFull(r, n[:]) + if err != nil { + return + } + } + pk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0) + pk.PubKeyAlgo = PublicKeyAlgorithm(buf[5]) + switch pk.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: + err = pk.parseRSA(r) + case PubKeyAlgoDSA: + err = pk.parseDSA(r) + case PubKeyAlgoElGamal: + err = pk.parseElGamal(r) + case PubKeyAlgoECDSA: + err = pk.parseECDSA(r) + case PubKeyAlgoECDH: + err = pk.parseECDH(r) + case PubKeyAlgoEdDSA: + err = pk.parseEdDSA(r) + default: + err = errors.UnsupportedError("public key type: " + strconv.Itoa(int(pk.PubKeyAlgo))) + } + if err != nil { + return + } + + pk.setFingerprintAndKeyId() + return +} + +func (pk *PublicKey) setFingerprintAndKeyId() { + // RFC 4880, section 12.2 + if pk.Version == 5 { + fingerprint := sha256.New() + pk.SerializeForHash(fingerprint) + pk.Fingerprint = make([]byte, 32) + copy(pk.Fingerprint, fingerprint.Sum(nil)) + pk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[:8]) + } else { + fingerprint := sha1.New() + pk.SerializeForHash(fingerprint) + pk.Fingerprint = make([]byte, 20) + copy(pk.Fingerprint, fingerprint.Sum(nil)) + pk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[12:20]) + } +} + +// parseRSA parses RSA public key material from the given Reader. See RFC 4880, +// section 5.5.2. +func (pk *PublicKey) parseRSA(r io.Reader) (err error) { + pk.n = new(encoding.MPI) + if _, err = pk.n.ReadFrom(r); err != nil { + return + } + pk.e = new(encoding.MPI) + if _, err = pk.e.ReadFrom(r); err != nil { + return + } + + if len(pk.e.Bytes()) > 3 { + err = errors.UnsupportedError("large public exponent") + return + } + rsa := &rsa.PublicKey{ + N: new(big.Int).SetBytes(pk.n.Bytes()), + E: 0, + } + for i := 0; i < len(pk.e.Bytes()); i++ { + rsa.E <<= 8 + rsa.E |= int(pk.e.Bytes()[i]) + } + pk.PublicKey = rsa + return +} + +// parseDSA parses DSA public key material from the given Reader. See RFC 4880, +// section 5.5.2. +func (pk *PublicKey) parseDSA(r io.Reader) (err error) { + pk.p = new(encoding.MPI) + if _, err = pk.p.ReadFrom(r); err != nil { + return + } + pk.q = new(encoding.MPI) + if _, err = pk.q.ReadFrom(r); err != nil { + return + } + pk.g = new(encoding.MPI) + if _, err = pk.g.ReadFrom(r); err != nil { + return + } + pk.y = new(encoding.MPI) + if _, err = pk.y.ReadFrom(r); err != nil { + return + } + + dsa := new(dsa.PublicKey) + dsa.P = new(big.Int).SetBytes(pk.p.Bytes()) + dsa.Q = new(big.Int).SetBytes(pk.q.Bytes()) + dsa.G = new(big.Int).SetBytes(pk.g.Bytes()) + dsa.Y = new(big.Int).SetBytes(pk.y.Bytes()) + pk.PublicKey = dsa + return +} + +// parseElGamal parses ElGamal public key material from the given Reader. See +// RFC 4880, section 5.5.2. +func (pk *PublicKey) parseElGamal(r io.Reader) (err error) { + pk.p = new(encoding.MPI) + if _, err = pk.p.ReadFrom(r); err != nil { + return + } + pk.g = new(encoding.MPI) + if _, err = pk.g.ReadFrom(r); err != nil { + return + } + pk.y = new(encoding.MPI) + if _, err = pk.y.ReadFrom(r); err != nil { + return + } + + elgamal := new(elgamal.PublicKey) + elgamal.P = new(big.Int).SetBytes(pk.p.Bytes()) + elgamal.G = new(big.Int).SetBytes(pk.g.Bytes()) + elgamal.Y = new(big.Int).SetBytes(pk.y.Bytes()) + pk.PublicKey = elgamal + return +} + +// parseECDSA parses ECDSA public key material from the given Reader. See +// RFC 6637, Section 9. +func (pk *PublicKey) parseECDSA(r io.Reader) (err error) { + pk.oid = new(encoding.OID) + if _, err = pk.oid.ReadFrom(r); err != nil { + return + } + pk.p = new(encoding.MPI) + if _, err = pk.p.ReadFrom(r); err != nil { + return + } + + var c elliptic.Curve + curveInfo := ecc.FindByOid(pk.oid) + if curveInfo == nil || curveInfo.SigAlgorithm != ecc.ECDSA { + return errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", pk.oid)) + } + c = curveInfo.Curve + x, y := elliptic.Unmarshal(c, pk.p.Bytes()) + if x == nil { + return errors.UnsupportedError("failed to parse EC point") + } + pk.PublicKey = &ecdsa.PublicKey{Curve: c, X: x, Y: y} + return +} + +// parseECDH parses ECDH public key material from the given Reader. See +// RFC 6637, Section 9. +func (pk *PublicKey) parseECDH(r io.Reader) (err error) { + pk.oid = new(encoding.OID) + if _, err = pk.oid.ReadFrom(r); err != nil { + return + } + pk.p = new(encoding.MPI) + if _, err = pk.p.ReadFrom(r); err != nil { + return + } + pk.kdf = new(encoding.OID) + if _, err = pk.kdf.ReadFrom(r); err != nil { + return + } + + curveInfo := ecc.FindByOid(pk.oid) + if curveInfo == nil { + return errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", pk.oid)) + } + + c := curveInfo.Curve + cType := curveInfo.CurveType + + var x, y *big.Int + if cType == ecc.Curve25519 { + x = new(big.Int) + x.SetBytes(pk.p.Bytes()) + } else { + x, y = elliptic.Unmarshal(c, pk.p.Bytes()) + } + if x == nil { + return errors.UnsupportedError("failed to parse EC point") + } + + if kdfLen := len(pk.kdf.Bytes()); kdfLen < 3 { + return errors.UnsupportedError("unsupported ECDH KDF length: " + strconv.Itoa(kdfLen)) + } + if reserved := pk.kdf.Bytes()[0]; reserved != 0x01 { + return errors.UnsupportedError("unsupported KDF reserved field: " + strconv.Itoa(int(reserved))) + } + kdfHash, ok := algorithm.HashById[pk.kdf.Bytes()[1]] + if !ok { + return errors.UnsupportedError("unsupported ECDH KDF hash: " + strconv.Itoa(int(pk.kdf.Bytes()[1]))) + } + kdfCipher, ok := algorithm.CipherById[pk.kdf.Bytes()[2]] + if !ok { + return errors.UnsupportedError("unsupported ECDH KDF cipher: " + strconv.Itoa(int(pk.kdf.Bytes()[2]))) + } + + pk.PublicKey = &ecdh.PublicKey{ + CurveType: cType, + Curve: c, + X: x, + Y: y, + KDF: ecdh.KDF{ + Hash: kdfHash, + Cipher: kdfCipher, + }, + } + return +} + +func (pk *PublicKey) parseEdDSA(r io.Reader) (err error) { + pk.oid = new(encoding.OID) + if _, err = pk.oid.ReadFrom(r); err != nil { + return + } + curveInfo := ecc.FindByOid(pk.oid) + if curveInfo == nil || curveInfo.SigAlgorithm != ecc.EdDSA { + return errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", pk.oid)) + } + pk.p = new(encoding.MPI) + if _, err = pk.p.ReadFrom(r); err != nil { + return + } + + eddsa := make(ed25519.PublicKey, ed25519.PublicKeySize) + switch flag := pk.p.Bytes()[0]; flag { + case 0x04: + // TODO: see _grcy_ecc_eddsa_ensure_compact in grcypt + return errors.UnsupportedError("unsupported EdDSA compression: " + strconv.Itoa(int(flag))) + case 0x40: + copy(eddsa[:], pk.p.Bytes()[1:]) + default: + return errors.UnsupportedError("unsupported EdDSA compression: " + strconv.Itoa(int(flag))) + } + + pk.PublicKey = &eddsa + return +} + +// SerializeForHash serializes the PublicKey to w with the special packet +// header format needed for hashing. +func (pk *PublicKey) SerializeForHash(w io.Writer) error { + pk.SerializeSignaturePrefix(w) + return pk.serializeWithoutHeaders(w) +} + +// SerializeSignaturePrefix writes the prefix for this public key to the given Writer. +// The prefix is used when calculating a signature over this public key. See +// RFC 4880, section 5.2.4. +func (pk *PublicKey) SerializeSignaturePrefix(w io.Writer) { + var pLength = pk.algorithmSpecificByteCount() + if pk.Version == 5 { + pLength += 10 // version, timestamp (4), algorithm, key octet count (4). + w.Write([]byte{ + 0x9A, + byte(pLength >> 24), + byte(pLength >> 16), + byte(pLength >> 8), + byte(pLength), + }) + return + } + pLength += 6 + w.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)}) +} + +func (pk *PublicKey) Serialize(w io.Writer) (err error) { + length := 6 // 6 byte header + length += pk.algorithmSpecificByteCount() + if pk.Version == 5 { + length += 4 // octet key count + } + packetType := packetTypePublicKey + if pk.IsSubkey { + packetType = packetTypePublicSubkey + } + err = serializeHeader(w, packetType, length) + if err != nil { + return + } + return pk.serializeWithoutHeaders(w) +} + +func (pk *PublicKey) algorithmSpecificByteCount() int { + length := 0 + switch pk.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: + length += int(pk.n.EncodedLength()) + length += int(pk.e.EncodedLength()) + case PubKeyAlgoDSA: + length += int(pk.p.EncodedLength()) + length += int(pk.q.EncodedLength()) + length += int(pk.g.EncodedLength()) + length += int(pk.y.EncodedLength()) + case PubKeyAlgoElGamal: + length += int(pk.p.EncodedLength()) + length += int(pk.g.EncodedLength()) + length += int(pk.y.EncodedLength()) + case PubKeyAlgoECDSA: + length += int(pk.oid.EncodedLength()) + length += int(pk.p.EncodedLength()) + case PubKeyAlgoECDH: + length += int(pk.oid.EncodedLength()) + length += int(pk.p.EncodedLength()) + length += int(pk.kdf.EncodedLength()) + case PubKeyAlgoEdDSA: + length += int(pk.oid.EncodedLength()) + length += int(pk.p.EncodedLength()) + default: + panic("unknown public key algorithm") + } + return length +} + +// serializeWithoutHeaders marshals the PublicKey to w in the form of an +// OpenPGP public key packet, not including the packet header. +func (pk *PublicKey) serializeWithoutHeaders(w io.Writer) (err error) { + t := uint32(pk.CreationTime.Unix()) + if _, err = w.Write([]byte{ + byte(pk.Version), + byte(t >> 24), byte(t >> 16), byte(t >> 8), byte(t), + byte(pk.PubKeyAlgo), + }); err != nil { + return + } + + if pk.Version == 5 { + n := pk.algorithmSpecificByteCount() + if _, err = w.Write([]byte{ + byte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n), + }); err != nil { + return + } + } + + switch pk.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: + if _, err = w.Write(pk.n.EncodedBytes()); err != nil { + return + } + _, err = w.Write(pk.e.EncodedBytes()) + return + case PubKeyAlgoDSA: + if _, err = w.Write(pk.p.EncodedBytes()); err != nil { + return + } + if _, err = w.Write(pk.q.EncodedBytes()); err != nil { + return + } + if _, err = w.Write(pk.g.EncodedBytes()); err != nil { + return + } + _, err = w.Write(pk.y.EncodedBytes()) + return + case PubKeyAlgoElGamal: + if _, err = w.Write(pk.p.EncodedBytes()); err != nil { + return + } + if _, err = w.Write(pk.g.EncodedBytes()); err != nil { + return + } + _, err = w.Write(pk.y.EncodedBytes()) + return + case PubKeyAlgoECDSA: + if _, err = w.Write(pk.oid.EncodedBytes()); err != nil { + return + } + _, err = w.Write(pk.p.EncodedBytes()) + return + case PubKeyAlgoECDH: + if _, err = w.Write(pk.oid.EncodedBytes()); err != nil { + return + } + if _, err = w.Write(pk.p.EncodedBytes()); err != nil { + return + } + _, err = w.Write(pk.kdf.EncodedBytes()) + return + case PubKeyAlgoEdDSA: + if _, err = w.Write(pk.oid.EncodedBytes()); err != nil { + return + } + _, err = w.Write(pk.p.EncodedBytes()) + return + } + return errors.InvalidArgumentError("bad public-key algorithm") +} + +// CanSign returns true iff this public key can generate signatures +func (pk *PublicKey) CanSign() bool { + return pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly && pk.PubKeyAlgo != PubKeyAlgoElGamal && pk.PubKeyAlgo != PubKeyAlgoECDH +} + +// VerifySignature returns nil iff sig is a valid signature, made by this +// public key, of the data hashed into signed. signed is mutated by this call. +func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err error) { + if !pk.CanSign() { + return errors.InvalidArgumentError("public key cannot generate signatures") + } + if sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) { + sig.AddMetadataToHashSuffix() + } + signed.Write(sig.HashSuffix) + hashBytes := signed.Sum(nil) + if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { + return errors.SignatureError("hash tag doesn't match") + } + + if pk.PubKeyAlgo != sig.PubKeyAlgo { + return errors.InvalidArgumentError("public key and signature use different algorithms") + } + + switch pk.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: + rsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey) + err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.Bytes())) + if err != nil { + return errors.SignatureError("RSA verification failure") + } + return nil + case PubKeyAlgoDSA: + dsaPublicKey, _ := pk.PublicKey.(*dsa.PublicKey) + // Need to truncate hashBytes to match FIPS 186-3 section 4.6. + subgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8 + if len(hashBytes) > subgroupSize { + hashBytes = hashBytes[:subgroupSize] + } + if !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.Bytes()), new(big.Int).SetBytes(sig.DSASigS.Bytes())) { + return errors.SignatureError("DSA verification failure") + } + return nil + case PubKeyAlgoECDSA: + ecdsaPublicKey := pk.PublicKey.(*ecdsa.PublicKey) + if !ecdsa.Verify(ecdsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.ECDSASigR.Bytes()), new(big.Int).SetBytes(sig.ECDSASigS.Bytes())) { + return errors.SignatureError("ECDSA verification failure") + } + return nil + case PubKeyAlgoEdDSA: + eddsaPublicKey := pk.PublicKey.(*ed25519.PublicKey) + + sigR := sig.EdDSASigR.Bytes() + sigS := sig.EdDSASigS.Bytes() + + eddsaSig := make([]byte, ed25519.SignatureSize) + copy(eddsaSig[32-len(sigR):32], sigR) + copy(eddsaSig[64-len(sigS):], sigS) + + if !ed25519.Verify(*eddsaPublicKey, hashBytes, eddsaSig) { + return errors.SignatureError("EdDSA verification failure") + } + return nil + default: + return errors.SignatureError("Unsupported public key algorithm used in signature") + } +} + +// keySignatureHash returns a Hash of the message that needs to be signed for +// pk to assert a subkey relationship to signed. +func keySignatureHash(pk, signed signingKey, hashFunc crypto.Hash) (h hash.Hash, err error) { + if !hashFunc.Available() { + return nil, errors.UnsupportedError("hash function") + } + h = hashFunc.New() + + // RFC 4880, section 5.2.4 + err = pk.SerializeForHash(h) + if err != nil { + return nil, err + } + + err = signed.SerializeForHash(h) + return +} + +// VerifyKeySignature returns nil iff sig is a valid signature, made by this +// public key, of signed. +func (pk *PublicKey) VerifyKeySignature(signed *PublicKey, sig *Signature) error { + h, err := keySignatureHash(pk, signed, sig.Hash) + if err != nil { + return err + } + if err = pk.VerifySignature(h, sig); err != nil { + return err + } + + if sig.FlagSign { + // Signing subkeys must be cross-signed. See + // https://www.gnupg.org/faq/subkey-cross-certify.html. + if sig.EmbeddedSignature == nil { + return errors.StructuralError("signing subkey is missing cross-signature") + } + // Verify the cross-signature. This is calculated over the same + // data as the main signature, so we cannot just recursively + // call signed.VerifyKeySignature(...) + if h, err = keySignatureHash(pk, signed, sig.EmbeddedSignature.Hash); err != nil { + return errors.StructuralError("error while hashing for cross-signature: " + err.Error()) + } + if err := signed.VerifySignature(h, sig.EmbeddedSignature); err != nil { + return errors.StructuralError("error while verifying cross-signature: " + err.Error()) + } + } + + return nil +} + +func keyRevocationHash(pk signingKey, hashFunc crypto.Hash) (h hash.Hash, err error) { + if !hashFunc.Available() { + return nil, errors.UnsupportedError("hash function") + } + h = hashFunc.New() + + // RFC 4880, section 5.2.4 + err = pk.SerializeForHash(h) + + return +} + +// VerifyRevocationSignature returns nil iff sig is a valid signature, made by this +// public key. +func (pk *PublicKey) VerifyRevocationSignature(sig *Signature) (err error) { + h, err := keyRevocationHash(pk, sig.Hash) + if err != nil { + return err + } + return pk.VerifySignature(h, sig) +} + +// VerifySubkeyRevocationSignature returns nil iff sig is a valid subkey revocation signature, +// made by this public key, of signed. +func (pk *PublicKey) VerifySubkeyRevocationSignature(sig *Signature, signed *PublicKey) (err error) { + h, err := keySignatureHash(pk, signed, sig.Hash) + if err != nil { + return err + } + return pk.VerifySignature(h, sig) +} + +// userIdSignatureHash returns a Hash of the message that needs to be signed +// to assert that pk is a valid key for id. +func userIdSignatureHash(id string, pk *PublicKey, hashFunc crypto.Hash) (h hash.Hash, err error) { + if !hashFunc.Available() { + return nil, errors.UnsupportedError("hash function") + } + h = hashFunc.New() + + // RFC 4880, section 5.2.4 + pk.SerializeSignaturePrefix(h) + pk.serializeWithoutHeaders(h) + + var buf [5]byte + buf[0] = 0xb4 + buf[1] = byte(len(id) >> 24) + buf[2] = byte(len(id) >> 16) + buf[3] = byte(len(id) >> 8) + buf[4] = byte(len(id)) + h.Write(buf[:]) + h.Write([]byte(id)) + + return +} + +// VerifyUserIdSignature returns nil iff sig is a valid signature, made by this +// public key, that id is the identity of pub. +func (pk *PublicKey) VerifyUserIdSignature(id string, pub *PublicKey, sig *Signature) (err error) { + h, err := userIdSignatureHash(id, pub, sig.Hash) + if err != nil { + return err + } + return pk.VerifySignature(h, sig) +} + +// KeyIdString returns the public key's fingerprint in capital hex +// (e.g. "6C7EE1B8621CC013"). +func (pk *PublicKey) KeyIdString() string { + return fmt.Sprintf("%X", pk.Fingerprint[12:20]) +} + +// KeyIdShortString returns the short form of public key's fingerprint +// in capital hex, as shown by gpg --list-keys (e.g. "621CC013"). +func (pk *PublicKey) KeyIdShortString() string { + return fmt.Sprintf("%X", pk.Fingerprint[16:20]) +} + +// BitLength returns the bit length for the given public key. +func (pk *PublicKey) BitLength() (bitLength uint16, err error) { + switch pk.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: + bitLength = pk.n.BitLength() + case PubKeyAlgoDSA: + bitLength = pk.p.BitLength() + case PubKeyAlgoElGamal: + bitLength = pk.p.BitLength() + case PubKeyAlgoECDSA: + bitLength = pk.p.BitLength() + case PubKeyAlgoECDH: + bitLength = pk.p.BitLength() + case PubKeyAlgoEdDSA: + bitLength = pk.p.BitLength() + default: + err = errors.InvalidArgumentError("bad public-key algorithm") + } + return +} + +// KeyExpired returns whether sig is a self-signature of a key that has +// expired or is created in the future. +func (pk *PublicKey) KeyExpired(sig *Signature, currentTime time.Time) bool { + if pk.CreationTime.After(currentTime) { + return true + } + if sig.KeyLifetimeSecs == nil || *sig.KeyLifetimeSecs == 0 { + return false + } + expiry := pk.CreationTime.Add(time.Duration(*sig.KeyLifetimeSecs) * time.Second) + return currentTime.After(expiry) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key_test_data.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key_test_data.go new file mode 100644 index 0000000000..b255f1f6f8 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key_test_data.go @@ -0,0 +1,24 @@ +package packet + +const rsaFingerprintHex = "5fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb" + +const rsaPkDataHex = "988d044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd0011010001" + +const dsaFingerprintHex = "eece4c094db002103714c63c8e8fbe54062f19ed" + +const dsaPkDataHex = "9901a2044d432f89110400cd581334f0d7a1e1bdc8b9d6d8c0baf68793632735d2bb0903224cbaa1dfbf35a60ee7a13b92643421e1eb41aa8d79bea19a115a677f6b8ba3c7818ce53a6c2a24a1608bd8b8d6e55c5090cbde09dd26e356267465ae25e69ec8bdd57c7bbb2623e4d73336f73a0a9098f7f16da2e25252130fd694c0e8070c55a812a423ae7f00a0ebf50e70c2f19c3520a551bd4b08d30f23530d3d03ff7d0bf4a53a64a09dc5e6e6e35854b7d70c882b0c60293401958b1bd9e40abec3ea05ba87cf64899299d4bd6aa7f459c201d3fbbd6c82004bdc5e8a9eb8082d12054cc90fa9d4ec251a843236a588bf49552441817436c4f43326966fe85447d4e6d0acf8fa1ef0f014730770603ad7634c3088dc52501c237328417c31c89ed70400b2f1a98b0bf42f11fefc430704bebbaa41d9f355600c3facee1e490f64208e0e094ea55e3a598a219a58500bf78ac677b670a14f4e47e9cf8eab4f368cc1ddcaa18cc59309d4cc62dd4f680e73e6cc3e1ce87a84d0925efbcb26c575c093fc42eecf45135fabf6403a25c2016e1774c0484e440a18319072c617cc97ac0a3bb0" + +const ecdsaFingerprintHex = "9892270b38b8980b05c8d56d43fe956c542ca00b" + +const ecdsaPkDataHex = "9893045071c29413052b8104002304230401f4867769cedfa52c325018896245443968e52e51d0c2df8d939949cb5b330f2921711fbee1c9b9dddb95d15cb0255e99badeddda7cc23d9ddcaacbc290969b9f24019375d61c2e4e3b36953a28d8b2bc95f78c3f1d592fb24499be348656a7b17e3963187b4361afe497bc5f9f81213f04069f8e1fb9e6a6290ae295ca1a92b894396cb4" + +const ecdhFingerprintHex = "722354df2475a42164d1d49faa8b938f9a201946" + +const ecdhPkDataHex = "b90073044d53059212052b810400220303042faa84024a20b6735c4897efa5bfb41bf85b7eefeab5ca0cb9ffc8ea04a46acb25534a577694f9e25340a4ab5223a9dd1eda530c8aa2e6718db10d7e672558c7736fe09369ea5739a2a3554bf16d41faa50562f11c6d39bbd5dffb6b9a9ec91803010909" + +const eddsaFingerprintHex = "b2d5e5ec0e6deca6bc8eeeb00907e75e1dd99ad8" + +const eddsaPkDataHex = "98330456e2132b16092b06010401da470f01010740bbda39266affa511a8c2d02edf690fb784b0499c4406185811a163539ef11dc1b41d74657374696e67203c74657374696e674074657374696e672e636f6d3e8879041316080021050256e2132b021b03050b09080702061508090a0b020416020301021e01021780000a09100907e75e1dd99ad86d0c00fe39d2008359352782bc9b61ac382584cd8eff3f57a18c2287e3afeeb05d1f04ba00fe2d0bc1ddf3ff8adb9afa3e7d9287244b4ec567f3db4d60b74a9b5465ed528203" + +// Source: https://sites.google.com/site/brainhub/pgpecckeys#TOC-ECC-NIST-P-384-key +const ecc384PubHex = `99006f044d53059213052b81040022030304f6b8c5aced5b84ef9f4a209db2e4a9dfb70d28cb8c10ecd57674a9fa5a67389942b62d5e51367df4c7bfd3f8e500feecf07ed265a621a8ebbbe53e947ec78c677eba143bd1533c2b350e1c29f82313e1e1108eba063be1e64b10e6950e799c2db42465635f6473615f64685f333834203c6f70656e70677040627261696e6875622e6f72673e8900cb04101309005305024d530592301480000000002000077072656665727265642d656d61696c2d656e636f64696e67407067702e636f6d7067706d696d65040b090807021901051b03000000021602051e010000000415090a08000a0910098033880f54719fca2b0180aa37350968bd5f115afd8ce7bc7b103822152dbff06d0afcda835329510905b98cb469ba208faab87c7412b799e7b633017f58364ea480e8a1a3f253a0c5f22c446e8be9a9fce6210136ee30811abbd49139de28b5bdf8dc36d06ae748579e9ff503b90073044d53059212052b810400220303042faa84024a20b6735c4897efa5bfb41bf85b7eefeab5ca0cb9ffc8ea04a46acb25534a577694f9e25340a4ab5223a9dd1eda530c8aa2e6718db10d7e672558c7736fe09369ea5739a2a3554bf16d41faa50562f11c6d39bbd5dffb6b9a9ec9180301090989008404181309000c05024d530592051b0c000000000a0910098033880f54719f80970180eee7a6d8fcee41ee4f9289df17f9bcf9d955dca25c583b94336f3a2b2d4986dc5cf417b8d2dc86f741a9e1a6d236c0e3017d1c76575458a0cfb93ae8a2b274fcc65ceecd7a91eec83656ba13219969f06945b48c56bd04152c3a0553c5f2f4bd1267` diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/reader.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/reader.go new file mode 100644 index 0000000000..94ae9ad9ac --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/reader.go @@ -0,0 +1,78 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "io" + + "github.com/ProtonMail/go-crypto/openpgp/errors" +) + +// Reader reads packets from an io.Reader and allows packets to be 'unread' so +// that they result from the next call to Next. +type Reader struct { + q []Packet + readers []io.Reader +} + +// New io.Readers are pushed when a compressed or encrypted packet is processed +// and recursively treated as a new source of packets. However, a carefully +// crafted packet can trigger an infinite recursive sequence of packets. See +// http://mumble.net/~campbell/misc/pgp-quine +// https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-4402 +// This constant limits the number of recursive packets that may be pushed. +const maxReaders = 32 + +// Next returns the most recently unread Packet, or reads another packet from +// the top-most io.Reader. Unknown packet types are skipped. +func (r *Reader) Next() (p Packet, err error) { + if len(r.q) > 0 { + p = r.q[len(r.q)-1] + r.q = r.q[:len(r.q)-1] + return + } + + for len(r.readers) > 0 { + p, err = Read(r.readers[len(r.readers)-1]) + if err == nil { + return + } + if err == io.EOF { + r.readers = r.readers[:len(r.readers)-1] + continue + } + // TODO: Add strict mode that rejects unknown packets, instead of ignoring them. + if _, ok := err.(errors.UnknownPacketTypeError); !ok { + return nil, err + } + } + + return nil, io.EOF +} + +// Push causes the Reader to start reading from a new io.Reader. When an EOF +// error is seen from the new io.Reader, it is popped and the Reader continues +// to read from the next most recent io.Reader. Push returns a StructuralError +// if pushing the reader would exceed the maximum recursion level, otherwise it +// returns nil. +func (r *Reader) Push(reader io.Reader) (err error) { + if len(r.readers) >= maxReaders { + return errors.StructuralError("too many layers of packets") + } + r.readers = append(r.readers, reader) + return nil +} + +// Unread causes the given Packet to be returned from the next call to Next. +func (r *Reader) Unread(p Packet) { + r.q = append(r.q, p) +} + +func NewReader(r io.Reader) *Reader { + return &Reader{ + q: nil, + readers: []io.Reader{r}, + } +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go new file mode 100644 index 0000000000..9131b876e5 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go @@ -0,0 +1,991 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "bytes" + "crypto" + "crypto/dsa" + "crypto/ecdsa" + "encoding/asn1" + "encoding/binary" + "hash" + "io" + "math/big" + "strconv" + "time" + + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" + "github.com/ProtonMail/go-crypto/openpgp/s2k" +) + +const ( + // See RFC 4880, section 5.2.3.21 for details. + KeyFlagCertify = 1 << iota + KeyFlagSign + KeyFlagEncryptCommunications + KeyFlagEncryptStorage +) + +// Signature represents a signature. See RFC 4880, section 5.2. +type Signature struct { + Version int + SigType SignatureType + PubKeyAlgo PublicKeyAlgorithm + Hash crypto.Hash + + // HashSuffix is extra data that is hashed in after the signed data. + HashSuffix []byte + // HashTag contains the first two bytes of the hash for fast rejection + // of bad signed data. + HashTag [2]byte + + // Metadata includes format, filename and time, and is protected by v5 + // signatures of type 0x00 or 0x01. This metadata is included into the hash + // computation; if nil, six 0x00 bytes are used instead. See section 5.2.4. + Metadata *LiteralData + + CreationTime time.Time + + RSASignature encoding.Field + DSASigR, DSASigS encoding.Field + ECDSASigR, ECDSASigS encoding.Field + EdDSASigR, EdDSASigS encoding.Field + + // rawSubpackets contains the unparsed subpackets, in order. + rawSubpackets []outputSubpacket + + // The following are optional so are nil when not included in the + // signature. + + SigLifetimeSecs, KeyLifetimeSecs *uint32 + PreferredSymmetric, PreferredHash, PreferredCompression []uint8 + PreferredAEAD []uint8 + IssuerKeyId *uint64 + IssuerFingerprint []byte + IsPrimaryId *bool + + // PolicyURI can be set to the URI of a document that describes the + // policy under which the signature was issued. See RFC 4880, section + // 5.2.3.20 for details. + PolicyURI string + + // FlagsValid is set if any flags were given. See RFC 4880, section + // 5.2.3.21 for details. + FlagsValid bool + FlagCertify, FlagSign, FlagEncryptCommunications, FlagEncryptStorage bool + + // RevocationReason is set if this signature has been revoked. + // See RFC 4880, section 5.2.3.23 for details. + RevocationReason *ReasonForRevocation + RevocationReasonText string + + // In a self-signature, these flags are set there is a features subpacket + // indicating that the issuer implementation supports these features + // (section 5.2.5.25). + MDC, AEAD, V5Keys bool + + // EmbeddedSignature, if non-nil, is a signature of the parent key, by + // this key. This prevents an attacker from claiming another's signing + // subkey as their own. + EmbeddedSignature *Signature + + outSubpackets []outputSubpacket +} + +func (sig *Signature) parse(r io.Reader) (err error) { + // RFC 4880, section 5.2.3 + var buf [5]byte + _, err = readFull(r, buf[:1]) + if err != nil { + return + } + if buf[0] != 4 && buf[0] != 5 { + err = errors.UnsupportedError("signature packet version " + strconv.Itoa(int(buf[0]))) + return + } + sig.Version = int(buf[0]) + _, err = readFull(r, buf[:5]) + if err != nil { + return + } + sig.SigType = SignatureType(buf[0]) + sig.PubKeyAlgo = PublicKeyAlgorithm(buf[1]) + switch sig.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA, PubKeyAlgoEdDSA: + default: + err = errors.UnsupportedError("public key algorithm " + strconv.Itoa(int(sig.PubKeyAlgo))) + return + } + + var ok bool + sig.Hash, ok = s2k.HashIdToHash(buf[2]) + if !ok { + return errors.UnsupportedError("hash function " + strconv.Itoa(int(buf[2]))) + } + + hashedSubpacketsLength := int(buf[3])<<8 | int(buf[4]) + hashedSubpackets := make([]byte, hashedSubpacketsLength) + _, err = readFull(r, hashedSubpackets) + if err != nil { + return + } + sig.buildHashSuffix(hashedSubpackets) + err = parseSignatureSubpackets(sig, hashedSubpackets, true) + if err != nil { + return + } + + _, err = readFull(r, buf[:2]) + if err != nil { + return + } + unhashedSubpacketsLength := int(buf[0])<<8 | int(buf[1]) + unhashedSubpackets := make([]byte, unhashedSubpacketsLength) + _, err = readFull(r, unhashedSubpackets) + if err != nil { + return + } + err = parseSignatureSubpackets(sig, unhashedSubpackets, false) + if err != nil { + return + } + + _, err = readFull(r, sig.HashTag[:2]) + if err != nil { + return + } + + switch sig.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: + sig.RSASignature = new(encoding.MPI) + _, err = sig.RSASignature.ReadFrom(r) + case PubKeyAlgoDSA: + sig.DSASigR = new(encoding.MPI) + if _, err = sig.DSASigR.ReadFrom(r); err != nil { + return + } + + sig.DSASigS = new(encoding.MPI) + _, err = sig.DSASigS.ReadFrom(r) + case PubKeyAlgoECDSA: + sig.ECDSASigR = new(encoding.MPI) + if _, err = sig.ECDSASigR.ReadFrom(r); err != nil { + return + } + + sig.ECDSASigS = new(encoding.MPI) + _, err = sig.ECDSASigS.ReadFrom(r) + case PubKeyAlgoEdDSA: + sig.EdDSASigR = new(encoding.MPI) + if _, err = sig.EdDSASigR.ReadFrom(r); err != nil { + return + } + + sig.EdDSASigS = new(encoding.MPI) + if _, err = sig.EdDSASigS.ReadFrom(r); err != nil { + return + } + default: + panic("unreachable") + } + return +} + +// parseSignatureSubpackets parses subpackets of the main signature packet. See +// RFC 4880, section 5.2.3.1. +func parseSignatureSubpackets(sig *Signature, subpackets []byte, isHashed bool) (err error) { + for len(subpackets) > 0 { + subpackets, err = parseSignatureSubpacket(sig, subpackets, isHashed) + if err != nil { + return + } + } + + if sig.CreationTime.IsZero() { + err = errors.StructuralError("no creation time in signature") + } + + return +} + +type signatureSubpacketType uint8 + +const ( + creationTimeSubpacket signatureSubpacketType = 2 + signatureExpirationSubpacket signatureSubpacketType = 3 + keyExpirationSubpacket signatureSubpacketType = 9 + prefSymmetricAlgosSubpacket signatureSubpacketType = 11 + issuerSubpacket signatureSubpacketType = 16 + prefHashAlgosSubpacket signatureSubpacketType = 21 + prefCompressionSubpacket signatureSubpacketType = 22 + primaryUserIdSubpacket signatureSubpacketType = 25 + policyUriSubpacket signatureSubpacketType = 26 + keyFlagsSubpacket signatureSubpacketType = 27 + reasonForRevocationSubpacket signatureSubpacketType = 29 + featuresSubpacket signatureSubpacketType = 30 + embeddedSignatureSubpacket signatureSubpacketType = 32 + issuerFingerprintSubpacket signatureSubpacketType = 33 + prefAeadAlgosSubpacket signatureSubpacketType = 34 +) + +// parseSignatureSubpacket parses a single subpacket. len(subpacket) is >= 1. +func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (rest []byte, err error) { + // RFC 4880, section 5.2.3.1 + var ( + length uint32 + packetType signatureSubpacketType + isCritical bool + ) + switch { + case subpacket[0] < 192: + length = uint32(subpacket[0]) + subpacket = subpacket[1:] + case subpacket[0] < 255: + if len(subpacket) < 2 { + goto Truncated + } + length = uint32(subpacket[0]-192)<<8 + uint32(subpacket[1]) + 192 + subpacket = subpacket[2:] + default: + if len(subpacket) < 5 { + goto Truncated + } + length = uint32(subpacket[1])<<24 | + uint32(subpacket[2])<<16 | + uint32(subpacket[3])<<8 | + uint32(subpacket[4]) + subpacket = subpacket[5:] + } + if length > uint32(len(subpacket)) { + goto Truncated + } + rest = subpacket[length:] + subpacket = subpacket[:length] + if len(subpacket) == 0 { + err = errors.StructuralError("zero length signature subpacket") + return + } + packetType = signatureSubpacketType(subpacket[0] & 0x7f) + isCritical = subpacket[0]&0x80 == 0x80 + subpacket = subpacket[1:] + sig.rawSubpackets = append(sig.rawSubpackets, outputSubpacket{isHashed, packetType, isCritical, subpacket}) + switch packetType { + case creationTimeSubpacket: + if !isHashed { + err = errors.StructuralError("signature creation time in non-hashed area") + return + } + if len(subpacket) != 4 { + err = errors.StructuralError("signature creation time not four bytes") + return + } + t := binary.BigEndian.Uint32(subpacket) + sig.CreationTime = time.Unix(int64(t), 0) + case signatureExpirationSubpacket: + // Signature expiration time, section 5.2.3.10 + if !isHashed { + return + } + if len(subpacket) != 4 { + err = errors.StructuralError("expiration subpacket with bad length") + return + } + sig.SigLifetimeSecs = new(uint32) + *sig.SigLifetimeSecs = binary.BigEndian.Uint32(subpacket) + case keyExpirationSubpacket: + // Key expiration time, section 5.2.3.6 + if !isHashed { + return + } + if len(subpacket) != 4 { + err = errors.StructuralError("key expiration subpacket with bad length") + return + } + sig.KeyLifetimeSecs = new(uint32) + *sig.KeyLifetimeSecs = binary.BigEndian.Uint32(subpacket) + case prefSymmetricAlgosSubpacket: + // Preferred symmetric algorithms, section 5.2.3.7 + if !isHashed { + return + } + sig.PreferredSymmetric = make([]byte, len(subpacket)) + copy(sig.PreferredSymmetric, subpacket) + case issuerSubpacket: + if sig.Version > 4 { + err = errors.StructuralError("issuer subpacket found in v5 key") + } + // Issuer, section 5.2.3.5 + if len(subpacket) != 8 { + err = errors.StructuralError("issuer subpacket with bad length") + return + } + sig.IssuerKeyId = new(uint64) + *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket) + case prefHashAlgosSubpacket: + // Preferred hash algorithms, section 5.2.3.8 + if !isHashed { + return + } + sig.PreferredHash = make([]byte, len(subpacket)) + copy(sig.PreferredHash, subpacket) + case prefCompressionSubpacket: + // Preferred compression algorithms, section 5.2.3.9 + if !isHashed { + return + } + sig.PreferredCompression = make([]byte, len(subpacket)) + copy(sig.PreferredCompression, subpacket) + case primaryUserIdSubpacket: + // Primary User ID, section 5.2.3.19 + if !isHashed { + return + } + if len(subpacket) != 1 { + err = errors.StructuralError("primary user id subpacket with bad length") + return + } + sig.IsPrimaryId = new(bool) + if subpacket[0] > 0 { + *sig.IsPrimaryId = true + } + case keyFlagsSubpacket: + // Key flags, section 5.2.3.21 + if !isHashed { + return + } + if len(subpacket) == 0 { + err = errors.StructuralError("empty key flags subpacket") + return + } + sig.FlagsValid = true + if subpacket[0]&KeyFlagCertify != 0 { + sig.FlagCertify = true + } + if subpacket[0]&KeyFlagSign != 0 { + sig.FlagSign = true + } + if subpacket[0]&KeyFlagEncryptCommunications != 0 { + sig.FlagEncryptCommunications = true + } + if subpacket[0]&KeyFlagEncryptStorage != 0 { + sig.FlagEncryptStorage = true + } + case reasonForRevocationSubpacket: + // Reason For Revocation, section 5.2.3.23 + if !isHashed { + return + } + if len(subpacket) == 0 { + err = errors.StructuralError("empty revocation reason subpacket") + return + } + sig.RevocationReason = new(ReasonForRevocation) + *sig.RevocationReason = ReasonForRevocation(subpacket[0]) + sig.RevocationReasonText = string(subpacket[1:]) + case featuresSubpacket: + // Features subpacket, section 5.2.3.24 specifies a very general + // mechanism for OpenPGP implementations to signal support for new + // features. + if !isHashed { + return + } + if len(subpacket) > 0 { + if subpacket[0]&0x01 != 0 { + sig.MDC = true + } + if subpacket[0]&0x02 != 0 { + sig.AEAD = true + } + if subpacket[0]&0x04 != 0 { + sig.V5Keys = true + } + } + case embeddedSignatureSubpacket: + // Only usage is in signatures that cross-certify + // signing subkeys. section 5.2.3.26 describes the + // format, with its usage described in section 11.1 + if sig.EmbeddedSignature != nil { + err = errors.StructuralError("Cannot have multiple embedded signatures") + return + } + sig.EmbeddedSignature = new(Signature) + // Embedded signatures are required to be v4 signatures see + // section 12.1. However, we only parse v4 signatures in this + // file anyway. + if err := sig.EmbeddedSignature.parse(bytes.NewBuffer(subpacket)); err != nil { + return nil, err + } + if sigType := sig.EmbeddedSignature.SigType; sigType != SigTypePrimaryKeyBinding { + return nil, errors.StructuralError("cross-signature has unexpected type " + strconv.Itoa(int(sigType))) + } + case policyUriSubpacket: + // Policy URI, section 5.2.3.20 + if !isHashed { + return + } + sig.PolicyURI = string(subpacket) + case issuerFingerprintSubpacket: + v, l := subpacket[0], len(subpacket[1:]) + if v == 5 && l != 32 || v != 5 && l != 20 { + return nil, errors.StructuralError("bad fingerprint length") + } + sig.IssuerFingerprint = make([]byte, l) + copy(sig.IssuerFingerprint, subpacket[1:]) + sig.IssuerKeyId = new(uint64) + if v == 5 { + *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket[1:9]) + } else { + *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket[13:21]) + } + case prefAeadAlgosSubpacket: + // Preferred symmetric algorithms, section 5.2.3.8 + if !isHashed { + return + } + sig.PreferredAEAD = make([]byte, len(subpacket)) + copy(sig.PreferredAEAD, subpacket) + default: + if isCritical { + err = errors.UnsupportedError("unknown critical signature subpacket type " + strconv.Itoa(int(packetType))) + return + } + } + return + +Truncated: + err = errors.StructuralError("signature subpacket truncated") + return +} + +// subpacketLengthLength returns the length, in bytes, of an encoded length value. +func subpacketLengthLength(length int) int { + if length < 192 { + return 1 + } + if length < 16320 { + return 2 + } + return 5 +} + +func (sig *Signature) CheckKeyIdOrFingerprint(pk *PublicKey) bool { + if sig.IssuerFingerprint != nil && len(sig.IssuerFingerprint) >= 20 { + return bytes.Equal(sig.IssuerFingerprint, pk.Fingerprint) + } + return sig.IssuerKeyId != nil && *sig.IssuerKeyId == pk.KeyId +} + +// serializeSubpacketLength marshals the given length into to. +func serializeSubpacketLength(to []byte, length int) int { + // RFC 4880, Section 4.2.2. + if length < 192 { + to[0] = byte(length) + return 1 + } + if length < 16320 { + length -= 192 + to[0] = byte((length >> 8) + 192) + to[1] = byte(length) + return 2 + } + to[0] = 255 + to[1] = byte(length >> 24) + to[2] = byte(length >> 16) + to[3] = byte(length >> 8) + to[4] = byte(length) + return 5 +} + +// subpacketsLength returns the serialized length, in bytes, of the given +// subpackets. +func subpacketsLength(subpackets []outputSubpacket, hashed bool) (length int) { + for _, subpacket := range subpackets { + if subpacket.hashed == hashed { + length += subpacketLengthLength(len(subpacket.contents) + 1) + length += 1 // type byte + length += len(subpacket.contents) + } + } + return +} + +// serializeSubpackets marshals the given subpackets into to. +func serializeSubpackets(to []byte, subpackets []outputSubpacket, hashed bool) { + for _, subpacket := range subpackets { + if subpacket.hashed == hashed { + n := serializeSubpacketLength(to, len(subpacket.contents)+1) + to[n] = byte(subpacket.subpacketType) + if subpacket.isCritical { + to[n] |= 0x80 + } + to = to[1+n:] + n = copy(to, subpacket.contents) + to = to[n:] + } + } + return +} + +// SigExpired returns whether sig is a signature that has expired or is created +// in the future. +func (sig *Signature) SigExpired(currentTime time.Time) bool { + if sig.CreationTime.After(currentTime) { + return true + } + if sig.SigLifetimeSecs == nil || *sig.SigLifetimeSecs == 0 { + return false + } + expiry := sig.CreationTime.Add(time.Duration(*sig.SigLifetimeSecs) * time.Second) + return currentTime.After(expiry) +} + +// buildHashSuffix constructs the HashSuffix member of sig in preparation for signing. +func (sig *Signature) buildHashSuffix(hashedSubpackets []byte) (err error) { + hash, ok := s2k.HashToHashId(sig.Hash) + if !ok { + sig.HashSuffix = nil + return errors.InvalidArgumentError("hash cannot be represented in OpenPGP: " + strconv.Itoa(int(sig.Hash))) + } + + hashedFields := bytes.NewBuffer([]byte{ + uint8(sig.Version), + uint8(sig.SigType), + uint8(sig.PubKeyAlgo), + uint8(hash), + uint8(len(hashedSubpackets) >> 8), + uint8(len(hashedSubpackets)), + }) + hashedFields.Write(hashedSubpackets) + + var l uint64 = uint64(6 + len(hashedSubpackets)) + if sig.Version == 5 { + hashedFields.Write([]byte{0x05, 0xff}) + hashedFields.Write([]byte{ + uint8(l >> 56), uint8(l >> 48), uint8(l >> 40), uint8(l >> 32), + uint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l), + }) + } else { + hashedFields.Write([]byte{0x04, 0xff}) + hashedFields.Write([]byte{ + uint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l), + }) + } + sig.HashSuffix = make([]byte, hashedFields.Len()) + copy(sig.HashSuffix, hashedFields.Bytes()) + return +} + +func (sig *Signature) signPrepareHash(h hash.Hash) (digest []byte, err error) { + hashedSubpacketsLen := subpacketsLength(sig.outSubpackets, true) + hashedSubpackets := make([]byte, hashedSubpacketsLen) + serializeSubpackets(hashedSubpackets, sig.outSubpackets, true) + err = sig.buildHashSuffix(hashedSubpackets) + if err != nil { + return + } + if sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) { + sig.AddMetadataToHashSuffix() + } + + h.Write(sig.HashSuffix) + digest = h.Sum(nil) + copy(sig.HashTag[:], digest) + return +} + +// Sign signs a message with a private key. The hash, h, must contain +// the hash of the message to be signed and will be mutated by this function. +// On success, the signature is stored in sig. Call Serialize to write it out. +// If config is nil, sensible defaults will be used. +func (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err error) { + if priv.Dummy() { + return errors.ErrDummyPrivateKey("dummy key found") + } + sig.Version = priv.PublicKey.Version + sig.IssuerFingerprint = priv.PublicKey.Fingerprint + sig.outSubpackets, err = sig.buildSubpackets(priv.PublicKey) + if err != nil { + return err + } + digest, err := sig.signPrepareHash(h) + if err != nil { + return + } + switch priv.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: + // supports both *rsa.PrivateKey and crypto.Signer + sigdata, err := priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) + if err == nil { + sig.RSASignature = encoding.NewMPI(sigdata) + } + case PubKeyAlgoDSA: + dsaPriv := priv.PrivateKey.(*dsa.PrivateKey) + + // Need to truncate hashBytes to match FIPS 186-3 section 4.6. + subgroupSize := (dsaPriv.Q.BitLen() + 7) / 8 + if len(digest) > subgroupSize { + digest = digest[:subgroupSize] + } + r, s, err := dsa.Sign(config.Random(), dsaPriv, digest) + if err == nil { + sig.DSASigR = new(encoding.MPI).SetBig(r) + sig.DSASigS = new(encoding.MPI).SetBig(s) + } + case PubKeyAlgoECDSA: + var r, s *big.Int + if pk, ok := priv.PrivateKey.(*ecdsa.PrivateKey); ok { + // direct support, avoid asn1 wrapping/unwrapping + r, s, err = ecdsa.Sign(config.Random(), pk, digest) + } else { + var b []byte + b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) + if err == nil { + r, s, err = unwrapECDSASig(b) + } + } + if err == nil { + sig.ECDSASigR = new(encoding.MPI).SetBig(r) + sig.ECDSASigS = new(encoding.MPI).SetBig(s) + } + case PubKeyAlgoEdDSA: + sigdata, err := priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, crypto.Hash(0)) + if err == nil { + sig.EdDSASigR = encoding.NewMPI(sigdata[:32]) + sig.EdDSASigS = encoding.NewMPI(sigdata[32:]) + } + default: + err = errors.UnsupportedError("public key algorithm: " + strconv.Itoa(int(sig.PubKeyAlgo))) + } + + return +} + +// unwrapECDSASig parses the two integer components of an ASN.1-encoded ECDSA +// signature. +func unwrapECDSASig(b []byte) (r, s *big.Int, err error) { + var ecsdaSig struct { + R, S *big.Int + } + _, err = asn1.Unmarshal(b, &ecsdaSig) + if err != nil { + return + } + return ecsdaSig.R, ecsdaSig.S, nil +} + +// SignUserId computes a signature from priv, asserting that pub is a valid +// key for the identity id. On success, the signature is stored in sig. Call +// Serialize to write it out. +// If config is nil, sensible defaults will be used. +func (sig *Signature) SignUserId(id string, pub *PublicKey, priv *PrivateKey, config *Config) error { + if priv.Dummy() { + return errors.ErrDummyPrivateKey("dummy key found") + } + h, err := userIdSignatureHash(id, pub, sig.Hash) + if err != nil { + return err + } + return sig.Sign(h, priv, config) +} + +// CrossSignKey computes a signature from signingKey on pub hashed using hashKey. On success, +// the signature is stored in sig. Call Serialize to write it out. +// If config is nil, sensible defaults will be used. +func (sig *Signature) CrossSignKey(pub *PublicKey, hashKey *PublicKey, signingKey *PrivateKey, + config *Config) error { + h, err := keySignatureHash(hashKey, pub, sig.Hash) + if err != nil { + return err + } + return sig.Sign(h, signingKey, config) +} + +// SignKey computes a signature from priv, asserting that pub is a subkey. On +// success, the signature is stored in sig. Call Serialize to write it out. +// If config is nil, sensible defaults will be used. +func (sig *Signature) SignKey(pub *PublicKey, priv *PrivateKey, config *Config) error { + if priv.Dummy() { + return errors.ErrDummyPrivateKey("dummy key found") + } + h, err := keySignatureHash(&priv.PublicKey, pub, sig.Hash) + if err != nil { + return err + } + return sig.Sign(h, priv, config) +} + +// RevokeKey computes a revocation signature of pub using priv. On success, the signature is +// stored in sig. Call Serialize to write it out. +// If config is nil, sensible defaults will be used. +func (sig *Signature) RevokeKey(pub *PublicKey, priv *PrivateKey, config *Config) error { + h, err := keyRevocationHash(pub, sig.Hash) + if err != nil { + return err + } + return sig.Sign(h, priv, config) +} + +// RevokeSubkey computes a subkey revocation signature of pub using priv. +// On success, the signature is stored in sig. Call Serialize to write it out. +// If config is nil, sensible defaults will be used. +func (sig *Signature) RevokeSubkey(pub *PublicKey, priv *PrivateKey, config *Config) error { + // Identical to a subkey binding signature + return sig.SignKey(pub, priv, config) +} + +// Serialize marshals sig to w. Sign, SignUserId or SignKey must have been +// called first. +func (sig *Signature) Serialize(w io.Writer) (err error) { + if len(sig.outSubpackets) == 0 { + sig.outSubpackets = sig.rawSubpackets + } + if sig.RSASignature == nil && sig.DSASigR == nil && sig.ECDSASigR == nil && sig.EdDSASigR == nil { + return errors.InvalidArgumentError("Signature: need to call Sign, SignUserId or SignKey before Serialize") + } + + sigLength := 0 + switch sig.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: + sigLength = int(sig.RSASignature.EncodedLength()) + case PubKeyAlgoDSA: + sigLength = int(sig.DSASigR.EncodedLength()) + sigLength += int(sig.DSASigS.EncodedLength()) + case PubKeyAlgoECDSA: + sigLength = int(sig.ECDSASigR.EncodedLength()) + sigLength += int(sig.ECDSASigS.EncodedLength()) + case PubKeyAlgoEdDSA: + sigLength = int(sig.EdDSASigR.EncodedLength()) + sigLength += int(sig.EdDSASigS.EncodedLength()) + default: + panic("impossible") + } + + unhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false) + length := len(sig.HashSuffix) - 6 /* trailer not included */ + + 2 /* length of unhashed subpackets */ + unhashedSubpacketsLen + + 2 /* hash tag */ + sigLength + if sig.Version == 5 { + length -= 4 // eight-octet instead of four-octet big endian + } + err = serializeHeader(w, packetTypeSignature, length) + if err != nil { + return + } + err = sig.serializeBody(w) + if err != nil { + return err + } + return +} + +func (sig *Signature) serializeBody(w io.Writer) (err error) { + hashedSubpacketsLen := uint16(uint16(sig.HashSuffix[4])<<8) | uint16(sig.HashSuffix[5]) + fields := sig.HashSuffix[:6+hashedSubpacketsLen] + _, err = w.Write(fields) + if err != nil { + return + } + + unhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false) + unhashedSubpackets := make([]byte, 2+unhashedSubpacketsLen) + unhashedSubpackets[0] = byte(unhashedSubpacketsLen >> 8) + unhashedSubpackets[1] = byte(unhashedSubpacketsLen) + serializeSubpackets(unhashedSubpackets[2:], sig.outSubpackets, false) + + _, err = w.Write(unhashedSubpackets) + if err != nil { + return + } + _, err = w.Write(sig.HashTag[:]) + if err != nil { + return + } + + switch sig.PubKeyAlgo { + case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: + _, err = w.Write(sig.RSASignature.EncodedBytes()) + case PubKeyAlgoDSA: + if _, err = w.Write(sig.DSASigR.EncodedBytes()); err != nil { + return + } + _, err = w.Write(sig.DSASigS.EncodedBytes()) + case PubKeyAlgoECDSA: + if _, err = w.Write(sig.ECDSASigR.EncodedBytes()); err != nil { + return + } + _, err = w.Write(sig.ECDSASigS.EncodedBytes()) + case PubKeyAlgoEdDSA: + if _, err = w.Write(sig.EdDSASigR.EncodedBytes()); err != nil { + return + } + _, err = w.Write(sig.EdDSASigS.EncodedBytes()) + default: + panic("impossible") + } + return +} + +// outputSubpacket represents a subpacket to be marshaled. +type outputSubpacket struct { + hashed bool // true if this subpacket is in the hashed area. + subpacketType signatureSubpacketType + isCritical bool + contents []byte +} + +func (sig *Signature) buildSubpackets(issuer PublicKey) (subpackets []outputSubpacket, err error) { + creationTime := make([]byte, 4) + binary.BigEndian.PutUint32(creationTime, uint32(sig.CreationTime.Unix())) + subpackets = append(subpackets, outputSubpacket{true, creationTimeSubpacket, false, creationTime}) + + if sig.IssuerKeyId != nil && sig.Version == 4 { + keyId := make([]byte, 8) + binary.BigEndian.PutUint64(keyId, *sig.IssuerKeyId) + subpackets = append(subpackets, outputSubpacket{true, issuerSubpacket, true, keyId}) + } + if sig.IssuerFingerprint != nil { + contents := append([]uint8{uint8(issuer.Version)}, sig.IssuerFingerprint...) + subpackets = append(subpackets, outputSubpacket{true, issuerFingerprintSubpacket, true, contents}) + } + if sig.SigLifetimeSecs != nil && *sig.SigLifetimeSecs != 0 { + sigLifetime := make([]byte, 4) + binary.BigEndian.PutUint32(sigLifetime, *sig.SigLifetimeSecs) + subpackets = append(subpackets, outputSubpacket{true, signatureExpirationSubpacket, true, sigLifetime}) + } + + // Key flags may only appear in self-signatures or certification signatures. + + if sig.FlagsValid { + var flags byte + if sig.FlagCertify { + flags |= KeyFlagCertify + } + if sig.FlagSign { + flags |= KeyFlagSign + } + if sig.FlagEncryptCommunications { + flags |= KeyFlagEncryptCommunications + } + if sig.FlagEncryptStorage { + flags |= KeyFlagEncryptStorage + } + subpackets = append(subpackets, outputSubpacket{true, keyFlagsSubpacket, false, []byte{flags}}) + } + + // The following subpackets may only appear in self-signatures. + + var features = byte(0x00) + if sig.MDC { + features |= 0x01 + } + if sig.AEAD { + features |= 0x02 + } + if sig.V5Keys { + features |= 0x04 + } + + if features != 0x00 { + subpackets = append(subpackets, outputSubpacket{true, featuresSubpacket, false, []byte{features}}) + } + + if sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 { + keyLifetime := make([]byte, 4) + binary.BigEndian.PutUint32(keyLifetime, *sig.KeyLifetimeSecs) + subpackets = append(subpackets, outputSubpacket{true, keyExpirationSubpacket, true, keyLifetime}) + } + + if sig.IsPrimaryId != nil && *sig.IsPrimaryId { + subpackets = append(subpackets, outputSubpacket{true, primaryUserIdSubpacket, false, []byte{1}}) + } + + if len(sig.PreferredSymmetric) > 0 { + subpackets = append(subpackets, outputSubpacket{true, prefSymmetricAlgosSubpacket, false, sig.PreferredSymmetric}) + } + + if len(sig.PreferredHash) > 0 { + subpackets = append(subpackets, outputSubpacket{true, prefHashAlgosSubpacket, false, sig.PreferredHash}) + } + + if len(sig.PreferredCompression) > 0 { + subpackets = append(subpackets, outputSubpacket{true, prefCompressionSubpacket, false, sig.PreferredCompression}) + } + + if len(sig.PolicyURI) > 0 { + subpackets = append(subpackets, outputSubpacket{true, policyUriSubpacket, false, []uint8(sig.PolicyURI)}) + } + + if len(sig.PreferredAEAD) > 0 { + subpackets = append(subpackets, outputSubpacket{true, prefAeadAlgosSubpacket, false, sig.PreferredAEAD}) + } + + // Revocation reason appears only in revocation signatures and is serialized as per section 5.2.3.23. + if sig.RevocationReason != nil { + subpackets = append(subpackets, outputSubpacket{true, reasonForRevocationSubpacket, true, + append([]uint8{uint8(*sig.RevocationReason)}, []uint8(sig.RevocationReasonText)...)}) + } + + // EmbeddedSignature appears only in subkeys capable of signing and is serialized as per section 5.2.3.26. + if sig.EmbeddedSignature != nil { + var buf bytes.Buffer + err = sig.EmbeddedSignature.serializeBody(&buf) + if err != nil { + return + } + subpackets = append(subpackets, outputSubpacket{true, embeddedSignatureSubpacket, true, buf.Bytes()}) + } + + return +} + +// AddMetadataToHashSuffix modifies the current hash suffix to include metadata +// (format, filename, and time). Version 5 keys protect this data including it +// in the hash computation. See section 5.2.4. +func (sig *Signature) AddMetadataToHashSuffix() { + if sig == nil || sig.Version != 5 { + return + } + if sig.SigType != 0x00 && sig.SigType != 0x01 { + return + } + lit := sig.Metadata + if lit == nil { + // This will translate into six 0x00 bytes. + lit = &LiteralData{} + } + + // Extract the current byte count + n := sig.HashSuffix[len(sig.HashSuffix)-8:] + l := uint64( + uint64(n[0])<<56 | uint64(n[1])<<48 | uint64(n[2])<<40 | uint64(n[3])<<32 | + uint64(n[4])<<24 | uint64(n[5])<<16 | uint64(n[6])<<8 | uint64(n[7])) + + suffix := bytes.NewBuffer(nil) + suffix.Write(sig.HashSuffix[:l]) + + // Add the metadata + var buf [4]byte + buf[0] = lit.Format + fileName := lit.FileName + if len(lit.FileName) > 255 { + fileName = fileName[:255] + } + buf[1] = byte(len(fileName)) + suffix.Write(buf[:2]) + suffix.Write([]byte(lit.FileName)) + binary.BigEndian.PutUint32(buf[:], lit.Time) + suffix.Write(buf[:]) + + // Update the counter and restore trailing bytes + l = uint64(suffix.Len()) + suffix.Write([]byte{0x05, 0xff}) + suffix.Write([]byte{ + uint8(l >> 56), uint8(l >> 48), uint8(l >> 40), uint8(l >> 32), + uint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l), + }) + sig.HashSuffix = suffix.Bytes() +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go new file mode 100644 index 0000000000..0e9f51d51b --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go @@ -0,0 +1,267 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "bytes" + "crypto/cipher" + "io" + "strconv" + + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/s2k" +) + +// This is the largest session key that we'll support. Since no 512-bit cipher +// has even been seriously used, this is comfortably large. +const maxSessionKeySizeInBytes = 64 + +// SymmetricKeyEncrypted represents a passphrase protected session key. See RFC +// 4880, section 5.3. +type SymmetricKeyEncrypted struct { + Version int + CipherFunc CipherFunction + Mode AEADMode + s2k func(out, in []byte) + aeadNonce []byte + encryptedKey []byte +} + +func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error { + // RFC 4880, section 5.3. + var buf [2]byte + if _, err := readFull(r, buf[:]); err != nil { + return err + } + ske.Version = int(buf[0]) + if ske.Version != 4 && ske.Version != 5 { + return errors.UnsupportedError("unknown SymmetricKeyEncrypted version") + } + ske.CipherFunc = CipherFunction(buf[1]) + if ske.CipherFunc.KeySize() == 0 { + return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(buf[1]))) + } + + if ske.Version == 5 { + mode := make([]byte, 1) + if _, err := r.Read(mode); err != nil { + return errors.StructuralError("cannot read AEAD octect from packet") + } + ske.Mode = AEADMode(mode[0]) + } + + var err error + if ske.s2k, err = s2k.Parse(r); err != nil { + if _, ok := err.(errors.ErrDummyPrivateKey); ok { + return errors.UnsupportedError("missing key GNU extension in session key") + } + return err + } + + if ske.Version == 5 { + // AEAD nonce + nonce := make([]byte, ske.Mode.NonceLength()) + _, err := readFull(r, nonce) + if err != nil && err != io.ErrUnexpectedEOF { + return err + } + ske.aeadNonce = nonce + } + + encryptedKey := make([]byte, maxSessionKeySizeInBytes) + // The session key may follow. We just have to try and read to find + // out. If it exists then we limit it to maxSessionKeySizeInBytes. + n, err := readFull(r, encryptedKey) + if err != nil && err != io.ErrUnexpectedEOF { + return err + } + + if n != 0 { + if n == maxSessionKeySizeInBytes { + return errors.UnsupportedError("oversized encrypted session key") + } + ske.encryptedKey = encryptedKey[:n] + } + return nil +} + +// Decrypt attempts to decrypt an encrypted session key and returns the key and +// the cipher to use when decrypting a subsequent Symmetrically Encrypted Data +// packet. +func (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) ([]byte, CipherFunction, error) { + key := make([]byte, ske.CipherFunc.KeySize()) + ske.s2k(key, passphrase) + if len(ske.encryptedKey) == 0 { + return key, ske.CipherFunc, nil + } + switch ske.Version { + case 4: + plaintextKey, cipherFunc, err := ske.decryptV4(key) + return plaintextKey, cipherFunc, err + case 5: + plaintextKey, err := ske.decryptV5(key) + return plaintextKey, CipherFunction(0), err + } + err := errors.UnsupportedError("unknown SymmetricKeyEncrypted version") + return nil, CipherFunction(0), err +} + +func (ske *SymmetricKeyEncrypted) decryptV4(key []byte) ([]byte, CipherFunction, error) { + // the IV is all zeros + iv := make([]byte, ske.CipherFunc.blockSize()) + c := cipher.NewCFBDecrypter(ske.CipherFunc.new(key), iv) + plaintextKey := make([]byte, len(ske.encryptedKey)) + c.XORKeyStream(plaintextKey, ske.encryptedKey) + cipherFunc := CipherFunction(plaintextKey[0]) + if cipherFunc.blockSize() == 0 { + return nil, ske.CipherFunc, errors.UnsupportedError( + "unknown cipher: " + strconv.Itoa(int(cipherFunc))) + } + plaintextKey = plaintextKey[1:] + if len(plaintextKey) != cipherFunc.KeySize() { + return nil, cipherFunc, errors.StructuralError( + "length of decrypted key not equal to cipher keysize") + } + return plaintextKey, cipherFunc, nil +} + +func (ske *SymmetricKeyEncrypted) decryptV5(key []byte) ([]byte, error) { + blockCipher := CipherFunction(ske.CipherFunc).new(key) + aead := ske.Mode.new(blockCipher) + + adata := []byte{0xc3, byte(5), byte(ske.CipherFunc), byte(ske.Mode)} + plaintextKey, err := aead.Open(nil, ske.aeadNonce, ske.encryptedKey, adata) + if err != nil { + return nil, err + } + return plaintextKey, nil +} + +// SerializeSymmetricKeyEncrypted serializes a symmetric key packet to w. +// The packet contains a random session key, encrypted by a key derived from +// the given passphrase. The session key is returned and must be passed to +// SerializeSymmetricallyEncrypted or SerializeAEADEncrypted, depending on +// whether config.AEADConfig != nil. +// If config is nil, sensible defaults will be used. +func SerializeSymmetricKeyEncrypted(w io.Writer, passphrase []byte, config *Config) (key []byte, err error) { + cipherFunc := config.Cipher() + keySize := cipherFunc.KeySize() + if keySize == 0 { + return nil, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) + } + + sessionKey := make([]byte, keySize) + _, err = io.ReadFull(config.Random(), sessionKey) + if err != nil { + return + } + + err = SerializeSymmetricKeyEncryptedReuseKey(w, sessionKey, passphrase, config) + if err != nil { + return + } + + key = sessionKey + return +} + +// SerializeSymmetricKeyEncryptedReuseKey serializes a symmetric key packet to w. +// The packet contains the given session key, encrypted by a key derived from +// the given passphrase. The session key must be passed to +// SerializeSymmetricallyEncrypted or SerializeAEADEncrypted, depending on +// whether config.AEADConfig != nil. +// If config is nil, sensible defaults will be used. +func SerializeSymmetricKeyEncryptedReuseKey(w io.Writer, sessionKey []byte, passphrase []byte, config *Config) (err error) { + var version int + if config.AEAD() != nil { + version = 5 + } else { + version = 4 + } + cipherFunc := config.Cipher() + keySize := cipherFunc.KeySize() + if keySize == 0 { + return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) + } + + s2kBuf := new(bytes.Buffer) + keyEncryptingKey := make([]byte, keySize) + // s2k.Serialize salts and stretches the passphrase, and writes the + // resulting key to keyEncryptingKey and the s2k descriptor to s2kBuf. + err = s2k.Serialize(s2kBuf, keyEncryptingKey, config.Random(), passphrase, &s2k.Config{Hash: config.Hash(), S2KCount: config.PasswordHashIterations()}) + if err != nil { + return + } + s2kBytes := s2kBuf.Bytes() + + var packetLength int + switch version { + case 4: + packetLength = 2 /* header */ + len(s2kBytes) + 1 /* cipher type */ + keySize + case 5: + nonceLen := config.AEAD().Mode().NonceLength() + tagLen := config.AEAD().Mode().TagLength() + packetLength = 3 + len(s2kBytes) + nonceLen + keySize + tagLen + } + err = serializeHeader(w, packetTypeSymmetricKeyEncrypted, packetLength) + if err != nil { + return + } + + buf := make([]byte, 2) + // Symmetric Key Encrypted Version + buf[0] = byte(version) + // Cipher function + buf[1] = byte(cipherFunc) + + if version == 5 { + // AEAD mode + buf = append(buf, byte(config.AEAD().Mode())) + } + _, err = w.Write(buf) + if err != nil { + return + } + _, err = w.Write(s2kBytes) + if err != nil { + return + } + + switch version { + case 4: + iv := make([]byte, cipherFunc.blockSize()) + c := cipher.NewCFBEncrypter(cipherFunc.new(keyEncryptingKey), iv) + encryptedCipherAndKey := make([]byte, keySize+1) + c.XORKeyStream(encryptedCipherAndKey, buf[1:]) + c.XORKeyStream(encryptedCipherAndKey[1:], sessionKey) + _, err = w.Write(encryptedCipherAndKey) + if err != nil { + return + } + case 5: + blockCipher := cipherFunc.new(keyEncryptingKey) + mode := config.AEAD().Mode() + aead := mode.new(blockCipher) + // Sample nonce using random reader + nonce := make([]byte, config.AEAD().Mode().NonceLength()) + _, err = io.ReadFull(config.Random(), nonce) + if err != nil { + return + } + // Seal and write (encryptedData includes auth. tag) + adata := []byte{0xc3, byte(5), byte(cipherFunc), byte(mode)} + encryptedData := aead.Seal(nil, nonce, sessionKey, adata) + _, err = w.Write(nonce) + if err != nil { + return + } + _, err = w.Write(encryptedData) + if err != nil { + return + } + } + + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go new file mode 100644 index 0000000000..8b84de177f --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go @@ -0,0 +1,290 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "crypto/cipher" + "crypto/sha1" + "crypto/subtle" + "hash" + "io" + "strconv" + + "github.com/ProtonMail/go-crypto/openpgp/errors" +) + +// SymmetricallyEncrypted represents a symmetrically encrypted byte string. The +// encrypted Contents will consist of more OpenPGP packets. See RFC 4880, +// sections 5.7 and 5.13. +type SymmetricallyEncrypted struct { + MDC bool // true iff this is a type 18 packet and thus has an embedded MAC. + Contents io.Reader + prefix []byte +} + +const symmetricallyEncryptedVersion = 1 + +func (se *SymmetricallyEncrypted) parse(r io.Reader) error { + if se.MDC { + // See RFC 4880, section 5.13. + var buf [1]byte + _, err := readFull(r, buf[:]) + if err != nil { + return err + } + if buf[0] != symmetricallyEncryptedVersion { + return errors.UnsupportedError("unknown SymmetricallyEncrypted version") + } + } + se.Contents = r + return nil +} + +// Decrypt returns a ReadCloser, from which the decrypted Contents of the +// packet can be read. An incorrect key will only be detected after trying +// to decrypt the entire data. +func (se *SymmetricallyEncrypted) Decrypt(c CipherFunction, key []byte) (io.ReadCloser, error) { + keySize := c.KeySize() + if keySize == 0 { + return nil, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(c))) + } + if len(key) != keySize { + return nil, errors.InvalidArgumentError("SymmetricallyEncrypted: incorrect key length") + } + + if se.prefix == nil { + se.prefix = make([]byte, c.blockSize()+2) + _, err := readFull(se.Contents, se.prefix) + if err != nil { + return nil, err + } + } else if len(se.prefix) != c.blockSize()+2 { + return nil, errors.InvalidArgumentError("can't try ciphers with different block lengths") + } + + ocfbResync := OCFBResync + if se.MDC { + // MDC packets use a different form of OCFB mode. + ocfbResync = OCFBNoResync + } + + s := NewOCFBDecrypter(c.new(key), se.prefix, ocfbResync) + + plaintext := cipher.StreamReader{S: s, R: se.Contents} + + if se.MDC { + // MDC packets have an embedded hash that we need to check. + h := sha1.New() + h.Write(se.prefix) + return &seMDCReader{in: plaintext, h: h}, nil + } + + // Otherwise, we just need to wrap plaintext so that it's a valid ReadCloser. + return seReader{plaintext}, nil +} + +// seReader wraps an io.Reader with a no-op Close method. +type seReader struct { + in io.Reader +} + +func (ser seReader) Read(buf []byte) (int, error) { + return ser.in.Read(buf) +} + +func (ser seReader) Close() error { + return nil +} + +const mdcTrailerSize = 1 /* tag byte */ + 1 /* length byte */ + sha1.Size + +// An seMDCReader wraps an io.Reader, maintains a running hash and keeps hold +// of the most recent 22 bytes (mdcTrailerSize). Upon EOF, those bytes form an +// MDC packet containing a hash of the previous Contents which is checked +// against the running hash. See RFC 4880, section 5.13. +type seMDCReader struct { + in io.Reader + h hash.Hash + trailer [mdcTrailerSize]byte + scratch [mdcTrailerSize]byte + trailerUsed int + error bool + eof bool +} + +func (ser *seMDCReader) Read(buf []byte) (n int, err error) { + if ser.error { + err = io.ErrUnexpectedEOF + return + } + if ser.eof { + err = io.EOF + return + } + + // If we haven't yet filled the trailer buffer then we must do that + // first. + for ser.trailerUsed < mdcTrailerSize { + n, err = ser.in.Read(ser.trailer[ser.trailerUsed:]) + ser.trailerUsed += n + if err == io.EOF { + if ser.trailerUsed != mdcTrailerSize { + n = 0 + err = io.ErrUnexpectedEOF + ser.error = true + return + } + ser.eof = true + n = 0 + return + } + + if err != nil { + n = 0 + return + } + } + + // If it's a short read then we read into a temporary buffer and shift + // the data into the caller's buffer. + if len(buf) <= mdcTrailerSize { + n, err = readFull(ser.in, ser.scratch[:len(buf)]) + copy(buf, ser.trailer[:n]) + ser.h.Write(buf[:n]) + copy(ser.trailer[:], ser.trailer[n:]) + copy(ser.trailer[mdcTrailerSize-n:], ser.scratch[:]) + if n < len(buf) { + ser.eof = true + err = io.EOF + } + return + } + + n, err = ser.in.Read(buf[mdcTrailerSize:]) + copy(buf, ser.trailer[:]) + ser.h.Write(buf[:n]) + copy(ser.trailer[:], buf[n:]) + + if err == io.EOF { + ser.eof = true + } + return +} + +// This is a new-format packet tag byte for a type 19 (MDC) packet. +const mdcPacketTagByte = byte(0x80) | 0x40 | 19 + +func (ser *seMDCReader) Close() error { + if ser.error { + return errors.ErrMDCMissing + } + + for !ser.eof { + // We haven't seen EOF so we need to read to the end + var buf [1024]byte + _, err := ser.Read(buf[:]) + if err == io.EOF { + break + } + if err != nil { + return errors.ErrMDCMissing + } + } + + ser.h.Write(ser.trailer[:2]) + + final := ser.h.Sum(nil) + if subtle.ConstantTimeCompare(final, ser.trailer[2:]) != 1 { + return errors.ErrMDCHashMismatch + } + // The hash already includes the MDC header, but we still check its value + // to confirm encryption correctness + if ser.trailer[0] != mdcPacketTagByte || ser.trailer[1] != sha1.Size { + return errors.ErrMDCMissing + } + return nil +} + +// An seMDCWriter writes through to an io.WriteCloser while maintains a running +// hash of the data written. On close, it emits an MDC packet containing the +// running hash. +type seMDCWriter struct { + w io.WriteCloser + h hash.Hash +} + +func (w *seMDCWriter) Write(buf []byte) (n int, err error) { + w.h.Write(buf) + return w.w.Write(buf) +} + +func (w *seMDCWriter) Close() (err error) { + var buf [mdcTrailerSize]byte + + buf[0] = mdcPacketTagByte + buf[1] = sha1.Size + w.h.Write(buf[:2]) + digest := w.h.Sum(nil) + copy(buf[2:], digest) + + _, err = w.w.Write(buf[:]) + if err != nil { + return + } + return w.w.Close() +} + +// noOpCloser is like an ioutil.NopCloser, but for an io.Writer. +type noOpCloser struct { + w io.Writer +} + +func (c noOpCloser) Write(data []byte) (n int, err error) { + return c.w.Write(data) +} + +func (c noOpCloser) Close() error { + return nil +} + +// SerializeSymmetricallyEncrypted serializes a symmetrically encrypted packet +// to w and returns a WriteCloser to which the to-be-encrypted packets can be +// written. +// If config is nil, sensible defaults will be used. +func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, key []byte, config *Config) (Contents io.WriteCloser, err error) { + if c.KeySize() != len(key) { + return nil, errors.InvalidArgumentError("SymmetricallyEncrypted.Serialize: bad key length") + } + writeCloser := noOpCloser{w} + ciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedMDC) + if err != nil { + return + } + + _, err = ciphertext.Write([]byte{symmetricallyEncryptedVersion}) + if err != nil { + return + } + + block := c.new(key) + blockSize := block.BlockSize() + iv := make([]byte, blockSize) + _, err = config.Random().Read(iv) + if err != nil { + return + } + s, prefix := NewOCFBEncrypter(block, iv, OCFBNoResync) + _, err = ciphertext.Write(prefix) + if err != nil { + return + } + plaintext := cipher.StreamWriter{S: s, W: ciphertext} + + h := sha1.New() + h.Write(iv) + h.Write(iv[blockSize-2:]) + Contents = &seMDCWriter{w: plaintext, h: h} + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go new file mode 100644 index 0000000000..0f760ade2c --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go @@ -0,0 +1,94 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "bytes" + "image" + "image/jpeg" + "io" + "io/ioutil" +) + +const UserAttrImageSubpacket = 1 + +// UserAttribute is capable of storing other types of data about a user +// beyond name, email and a text comment. In practice, user attributes are typically used +// to store a signed thumbnail photo JPEG image of the user. +// See RFC 4880, section 5.12. +type UserAttribute struct { + Contents []*OpaqueSubpacket +} + +// NewUserAttributePhoto creates a user attribute packet +// containing the given images. +func NewUserAttributePhoto(photos ...image.Image) (uat *UserAttribute, err error) { + uat = new(UserAttribute) + for _, photo := range photos { + var buf bytes.Buffer + // RFC 4880, Section 5.12.1. + data := []byte{ + 0x10, 0x00, // Little-endian image header length (16 bytes) + 0x01, // Image header version 1 + 0x01, // JPEG + 0, 0, 0, 0, // 12 reserved octets, must be all zero. + 0, 0, 0, 0, + 0, 0, 0, 0} + if _, err = buf.Write(data); err != nil { + return + } + if err = jpeg.Encode(&buf, photo, nil); err != nil { + return + } + uat.Contents = append(uat.Contents, &OpaqueSubpacket{ + SubType: UserAttrImageSubpacket, + Contents: buf.Bytes()}) + } + return +} + +// NewUserAttribute creates a new user attribute packet containing the given subpackets. +func NewUserAttribute(contents ...*OpaqueSubpacket) *UserAttribute { + return &UserAttribute{Contents: contents} +} + +func (uat *UserAttribute) parse(r io.Reader) (err error) { + // RFC 4880, section 5.13 + b, err := ioutil.ReadAll(r) + if err != nil { + return + } + uat.Contents, err = OpaqueSubpackets(b) + return +} + +// Serialize marshals the user attribute to w in the form of an OpenPGP packet, including +// header. +func (uat *UserAttribute) Serialize(w io.Writer) (err error) { + var buf bytes.Buffer + for _, sp := range uat.Contents { + err = sp.Serialize(&buf) + if err != nil { + return err + } + } + if err = serializeHeader(w, packetTypeUserAttribute, buf.Len()); err != nil { + return err + } + _, err = w.Write(buf.Bytes()) + return +} + +// ImageData returns zero or more byte slices, each containing +// JPEG File Interchange Format (JFIF), for each photo in the +// user attribute packet. +func (uat *UserAttribute) ImageData() (imageData [][]byte) { + for _, sp := range uat.Contents { + if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 { + imageData = append(imageData, sp.Contents[16:]) + } + } + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userid.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userid.go new file mode 100644 index 0000000000..d6bea7d4ac --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userid.go @@ -0,0 +1,160 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packet + +import ( + "io" + "io/ioutil" + "strings" +) + +// UserId contains text that is intended to represent the name and email +// address of the key holder. See RFC 4880, section 5.11. By convention, this +// takes the form "Full Name (Comment) " +type UserId struct { + Id string // By convention, this takes the form "Full Name (Comment) " which is split out in the fields below. + + Name, Comment, Email string +} + +func hasInvalidCharacters(s string) bool { + for _, c := range s { + switch c { + case '(', ')', '<', '>', 0: + return true + } + } + return false +} + +// NewUserId returns a UserId or nil if any of the arguments contain invalid +// characters. The invalid characters are '\x00', '(', ')', '<' and '>' +func NewUserId(name, comment, email string) *UserId { + // RFC 4880 doesn't deal with the structure of userid strings; the + // name, comment and email form is just a convention. However, there's + // no convention about escaping the metacharacters and GPG just refuses + // to create user ids where, say, the name contains a '('. We mirror + // this behaviour. + + if hasInvalidCharacters(name) || hasInvalidCharacters(comment) || hasInvalidCharacters(email) { + return nil + } + + uid := new(UserId) + uid.Name, uid.Comment, uid.Email = name, comment, email + uid.Id = name + if len(comment) > 0 { + if len(uid.Id) > 0 { + uid.Id += " " + } + uid.Id += "(" + uid.Id += comment + uid.Id += ")" + } + if len(email) > 0 { + if len(uid.Id) > 0 { + uid.Id += " " + } + uid.Id += "<" + uid.Id += email + uid.Id += ">" + } + return uid +} + +func (uid *UserId) parse(r io.Reader) (err error) { + // RFC 4880, section 5.11 + b, err := ioutil.ReadAll(r) + if err != nil { + return + } + uid.Id = string(b) + uid.Name, uid.Comment, uid.Email = parseUserId(uid.Id) + return +} + +// Serialize marshals uid to w in the form of an OpenPGP packet, including +// header. +func (uid *UserId) Serialize(w io.Writer) error { + err := serializeHeader(w, packetTypeUserId, len(uid.Id)) + if err != nil { + return err + } + _, err = w.Write([]byte(uid.Id)) + return err +} + +// parseUserId extracts the name, comment and email from a user id string that +// is formatted as "Full Name (Comment) ". +func parseUserId(id string) (name, comment, email string) { + var n, c, e struct { + start, end int + } + var state int + + for offset, rune := range id { + switch state { + case 0: + // Entering name + n.start = offset + state = 1 + fallthrough + case 1: + // In name + if rune == '(' { + state = 2 + n.end = offset + } else if rune == '<' { + state = 5 + n.end = offset + } + case 2: + // Entering comment + c.start = offset + state = 3 + fallthrough + case 3: + // In comment + if rune == ')' { + state = 4 + c.end = offset + } + case 4: + // Between comment and email + if rune == '<' { + state = 5 + } + case 5: + // Entering email + e.start = offset + state = 6 + fallthrough + case 6: + // In email + if rune == '>' { + state = 7 + e.end = offset + } + default: + // After email + } + } + switch state { + case 1: + // ended in the name + n.end = len(id) + case 3: + // ended in comment + c.end = len(id) + case 6: + // ended in email + e.end = len(id) + } + + name = strings.TrimSpace(id[n.start:n.end]) + comment = strings.TrimSpace(id[c.start:c.end]) + email = strings.TrimSpace(id[e.start:e.end]) + return +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/read.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/read.go new file mode 100644 index 0000000000..acb7cc6e29 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/read.go @@ -0,0 +1,528 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package openpgp implements high level operations on OpenPGP messages. +package openpgp // import "github.com/ProtonMail/go-crypto/openpgp" + +import ( + "crypto" + _ "crypto/sha256" + "hash" + "io" + "strconv" + + "github.com/ProtonMail/go-crypto/openpgp/armor" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/packet" +) + +// SignatureType is the armor type for a PGP signature. +var SignatureType = "PGP SIGNATURE" + +// readArmored reads an armored block with the given type. +func readArmored(r io.Reader, expectedType string) (body io.Reader, err error) { + block, err := armor.Decode(r) + if err != nil { + return + } + + if block.Type != expectedType { + return nil, errors.InvalidArgumentError("expected '" + expectedType + "', got: " + block.Type) + } + + return block.Body, nil +} + +// MessageDetails contains the result of parsing an OpenPGP encrypted and/or +// signed message. +type MessageDetails struct { + IsEncrypted bool // true if the message was encrypted. + EncryptedToKeyIds []uint64 // the list of recipient key ids. + IsSymmetricallyEncrypted bool // true if a passphrase could have decrypted the message. + DecryptedWith Key // the private key used to decrypt the message, if any. + IsSigned bool // true if the message is signed. + SignedByKeyId uint64 // the key id of the signer, if any. + SignedBy *Key // the key of the signer, if available. + LiteralData *packet.LiteralData // the metadata of the contents + UnverifiedBody io.Reader // the contents of the message. + + // If IsSigned is true and SignedBy is non-zero then the signature will + // be verified as UnverifiedBody is read. The signature cannot be + // checked until the whole of UnverifiedBody is read so UnverifiedBody + // must be consumed until EOF before the data can be trusted. Even if a + // message isn't signed (or the signer is unknown) the data may contain + // an authentication code that is only checked once UnverifiedBody has + // been consumed. Once EOF has been seen, the following fields are + // valid. (An authentication code failure is reported as a + // SignatureError error when reading from UnverifiedBody.) + Signature *packet.Signature // the signature packet itself. + SignatureError error // nil if the signature is good. + UnverifiedSignatures []*packet.Signature // all other unverified signature packets. + + decrypted io.ReadCloser +} + +// A PromptFunction is used as a callback by functions that may need to decrypt +// a private key, or prompt for a passphrase. It is called with a list of +// acceptable, encrypted private keys and a boolean that indicates whether a +// passphrase is usable. It should either decrypt a private key or return a +// passphrase to try. If the decrypted private key or given passphrase isn't +// correct, the function will be called again, forever. Any error returned will +// be passed up. +type PromptFunction func(keys []Key, symmetric bool) ([]byte, error) + +// A keyEnvelopePair is used to store a private key with the envelope that +// contains a symmetric key, encrypted with that key. +type keyEnvelopePair struct { + key Key + encryptedKey *packet.EncryptedKey +} + +// ReadMessage parses an OpenPGP message that may be signed and/or encrypted. +// The given KeyRing should contain both public keys (for signature +// verification) and, possibly encrypted, private keys for decrypting. +// If config is nil, sensible defaults will be used. +func ReadMessage(r io.Reader, keyring KeyRing, prompt PromptFunction, config *packet.Config) (md *MessageDetails, err error) { + var p packet.Packet + + var symKeys []*packet.SymmetricKeyEncrypted + var pubKeys []keyEnvelopePair + // Integrity protected encrypted packet: SymmetricallyEncrypted or AEADEncrypted + var edp packet.EncryptedDataPacket + + packets := packet.NewReader(r) + md = new(MessageDetails) + md.IsEncrypted = true + + // The message, if encrypted, starts with a number of packets + // containing an encrypted decryption key. The decryption key is either + // encrypted to a public key, or with a passphrase. This loop + // collects these packets. +ParsePackets: + for { + p, err = packets.Next() + if err != nil { + return nil, err + } + switch p := p.(type) { + case *packet.SymmetricKeyEncrypted: + // This packet contains the decryption key encrypted with a passphrase. + md.IsSymmetricallyEncrypted = true + symKeys = append(symKeys, p) + case *packet.EncryptedKey: + // This packet contains the decryption key encrypted to a public key. + md.EncryptedToKeyIds = append(md.EncryptedToKeyIds, p.KeyId) + switch p.Algo { + case packet.PubKeyAlgoRSA, packet.PubKeyAlgoRSAEncryptOnly, packet.PubKeyAlgoElGamal, packet.PubKeyAlgoECDH: + break + default: + continue + } + var keys []Key + if p.KeyId == 0 { + keys = keyring.DecryptionKeys() + } else { + keys = keyring.KeysById(p.KeyId) + } + for _, k := range keys { + pubKeys = append(pubKeys, keyEnvelopePair{k, p}) + } + case *packet.SymmetricallyEncrypted, *packet.AEADEncrypted: + edp = p.(packet.EncryptedDataPacket) + break ParsePackets + case *packet.Compressed, *packet.LiteralData, *packet.OnePassSignature: + // This message isn't encrypted. + if len(symKeys) != 0 || len(pubKeys) != 0 { + return nil, errors.StructuralError("key material not followed by encrypted message") + } + packets.Unread(p) + return readSignedMessage(packets, nil, keyring, config) + } + } + + var candidates []Key + var decrypted io.ReadCloser + + // Now that we have the list of encrypted keys we need to decrypt at + // least one of them or, if we cannot, we need to call the prompt + // function so that it can decrypt a key or give us a passphrase. +FindKey: + for { + // See if any of the keys already have a private key available + candidates = candidates[:0] + candidateFingerprints := make(map[string]bool) + + for _, pk := range pubKeys { + if pk.key.PrivateKey == nil { + continue + } + if !pk.key.PrivateKey.Encrypted { + if len(pk.encryptedKey.Key) == 0 { + errDec := pk.encryptedKey.Decrypt(pk.key.PrivateKey, config) + if errDec != nil { + continue + } + } + // Try to decrypt symmetrically encrypted + decrypted, err = edp.Decrypt(pk.encryptedKey.CipherFunc, pk.encryptedKey.Key) + if err != nil && err != errors.ErrKeyIncorrect { + return nil, err + } + if decrypted != nil { + md.DecryptedWith = pk.key + break FindKey + } + } else { + fpr := string(pk.key.PublicKey.Fingerprint[:]) + if v := candidateFingerprints[fpr]; v { + continue + } + candidates = append(candidates, pk.key) + candidateFingerprints[fpr] = true + } + } + + if len(candidates) == 0 && len(symKeys) == 0 { + return nil, errors.ErrKeyIncorrect + } + + if prompt == nil { + return nil, errors.ErrKeyIncorrect + } + + passphrase, err := prompt(candidates, len(symKeys) != 0) + if err != nil { + return nil, err + } + + // Try the symmetric passphrase first + if len(symKeys) != 0 && passphrase != nil { + for _, s := range symKeys { + key, cipherFunc, err := s.Decrypt(passphrase) + // On wrong passphrase, session key decryption is very likely to result in an invalid cipherFunc: + // only for < 5% of cases we will proceed to decrypt the data + if err == nil { + decrypted, err = edp.Decrypt(cipherFunc, key) + // TODO: ErrKeyIncorrect is no longer thrown on SEIP decryption, + // but it might still be relevant for when we implement AEAD decryption (otherwise, remove?) + if err != nil && err != errors.ErrKeyIncorrect { + return nil, err + } + if decrypted != nil { + break FindKey + } + } + } + } + } + + md.decrypted = decrypted + if err := packets.Push(decrypted); err != nil { + return nil, err + } + mdFinal, sensitiveParsingErr := readSignedMessage(packets, md, keyring, config) + if sensitiveParsingErr != nil { + return nil, errors.StructuralError("parsing error") + } + return mdFinal, nil +} + +// readSignedMessage reads a possibly signed message if mdin is non-zero then +// that structure is updated and returned. Otherwise a fresh MessageDetails is +// used. +func readSignedMessage(packets *packet.Reader, mdin *MessageDetails, keyring KeyRing, config *packet.Config) (md *MessageDetails, err error) { + if mdin == nil { + mdin = new(MessageDetails) + } + md = mdin + + var p packet.Packet + var h hash.Hash + var wrappedHash hash.Hash + var prevLast bool +FindLiteralData: + for { + p, err = packets.Next() + if err != nil { + return nil, err + } + switch p := p.(type) { + case *packet.Compressed: + if err := packets.Push(p.Body); err != nil { + return nil, err + } + case *packet.OnePassSignature: + if prevLast { + return nil, errors.UnsupportedError("nested signature packets") + } + + if p.IsLast { + prevLast = true + } + + h, wrappedHash, err = hashForSignature(p.Hash, p.SigType) + if err != nil { + md.SignatureError = err + } + + md.IsSigned = true + md.SignedByKeyId = p.KeyId + keys := keyring.KeysByIdUsage(p.KeyId, packet.KeyFlagSign) + if len(keys) > 0 { + md.SignedBy = &keys[0] + } + case *packet.LiteralData: + md.LiteralData = p + break FindLiteralData + } + } + + if md.IsSigned && md.SignatureError == nil { + md.UnverifiedBody = &signatureCheckReader{packets, h, wrappedHash, md, config} + } else if md.decrypted != nil { + md.UnverifiedBody = checkReader{md} + } else { + md.UnverifiedBody = md.LiteralData.Body + } + + return md, nil +} + +// hashForSignature returns a pair of hashes that can be used to verify a +// signature. The signature may specify that the contents of the signed message +// should be preprocessed (i.e. to normalize line endings). Thus this function +// returns two hashes. The second should be used to hash the message itself and +// performs any needed preprocessing. +func hashForSignature(hashId crypto.Hash, sigType packet.SignatureType) (hash.Hash, hash.Hash, error) { + if hashId == crypto.MD5 { + return nil, nil, errors.UnsupportedError("insecure hash algorithm: MD5") + } + if !hashId.Available() { + return nil, nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashId))) + } + h := hashId.New() + + switch sigType { + case packet.SigTypeBinary: + return h, h, nil + case packet.SigTypeText: + return h, NewCanonicalTextHash(h), nil + } + + return nil, nil, errors.UnsupportedError("unsupported signature type: " + strconv.Itoa(int(sigType))) +} + +// checkReader wraps an io.Reader from a LiteralData packet. When it sees EOF +// it closes the ReadCloser from any SymmetricallyEncrypted packet to trigger +// MDC checks. +type checkReader struct { + md *MessageDetails +} + +func (cr checkReader) Read(buf []byte) (int, error) { + n, sensitiveParsingError := cr.md.LiteralData.Body.Read(buf) + if sensitiveParsingError == io.EOF { + mdcErr := cr.md.decrypted.Close() + if mdcErr != nil { + return n, mdcErr + } + return n, io.EOF + } + + if sensitiveParsingError != nil { + return n, errors.StructuralError("parsing error") + } + + return n, nil +} + +// signatureCheckReader wraps an io.Reader from a LiteralData packet and hashes +// the data as it is read. When it sees an EOF from the underlying io.Reader +// it parses and checks a trailing Signature packet and triggers any MDC checks. +type signatureCheckReader struct { + packets *packet.Reader + h, wrappedHash hash.Hash + md *MessageDetails + config *packet.Config +} + +func (scr *signatureCheckReader) Read(buf []byte) (int, error) { + n, sensitiveParsingError := scr.md.LiteralData.Body.Read(buf) + + // Hash only if required + if scr.md.SignedBy != nil { + scr.wrappedHash.Write(buf[:n]) + } + + if sensitiveParsingError == io.EOF { + var p packet.Packet + var readError error + var sig *packet.Signature + + p, readError = scr.packets.Next() + for readError == nil { + var ok bool + if sig, ok = p.(*packet.Signature); ok { + if sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) { + sig.Metadata = scr.md.LiteralData + } + + // If signature KeyID matches + if scr.md.SignedBy != nil && *sig.IssuerKeyId == scr.md.SignedByKeyId { + key := scr.md.SignedBy + signatureError := key.PublicKey.VerifySignature(scr.h, sig) + if signatureError == nil { + now := scr.config.Now() + if key.Revoked(now) || + key.Entity.Revoked(now) || // primary key is revoked (redundant if key is the primary key) + key.Entity.PrimaryIdentity().Revoked(now) { + signatureError = errors.ErrKeyRevoked + } + if sig.SigExpired(now) { + signatureError = errors.ErrSignatureExpired + } + if key.PublicKey.KeyExpired(key.SelfSignature, now) || + key.SelfSignature.SigExpired(now) { + signatureError = errors.ErrKeyExpired + } + } + scr.md.Signature = sig + scr.md.SignatureError = signatureError + } else { + scr.md.UnverifiedSignatures = append(scr.md.UnverifiedSignatures, sig) + } + } + + p, readError = scr.packets.Next() + } + + if scr.md.SignedBy != nil && scr.md.Signature == nil { + if scr.md.UnverifiedSignatures == nil { + scr.md.SignatureError = errors.StructuralError("LiteralData not followed by signature") + } else { + scr.md.SignatureError = errors.StructuralError("No matching signature found") + } + } + + // The SymmetricallyEncrypted packet, if any, might have an + // unsigned hash of its own. In order to check this we need to + // close that Reader. + if scr.md.decrypted != nil { + mdcErr := scr.md.decrypted.Close() + if mdcErr != nil { + return n, mdcErr + } + } + return n, io.EOF + } + + if sensitiveParsingError != nil { + return n, errors.StructuralError("parsing error") + } + + return n, nil +} + +// CheckDetachedSignature takes a signed file and a detached signature and +// returns the signer if the signature is valid. If the signer isn't known, +// ErrUnknownIssuer is returned. +func CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (signer *Entity, err error) { + var expectedHashes []crypto.Hash + return CheckDetachedSignatureAndHash(keyring, signed, signature, expectedHashes, config) +} + +// CheckDetachedSignatureAndHash performs the same actions as +// CheckDetachedSignature and checks that the expected hash functions were used. +func CheckDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, config *packet.Config) (signer *Entity, err error) { + var issuerKeyId uint64 + var hashFunc crypto.Hash + var sigType packet.SignatureType + var keys []Key + var p packet.Packet + + expectedHashesLen := len(expectedHashes) + packets := packet.NewReader(signature) + var sig *packet.Signature + for { + p, err = packets.Next() + if err == io.EOF { + return nil, errors.ErrUnknownIssuer + } + if err != nil { + return nil, err + } + + var ok bool + sig, ok = p.(*packet.Signature) + if !ok { + return nil, errors.StructuralError("non signature packet found") + } + if sig.IssuerKeyId == nil { + return nil, errors.StructuralError("signature doesn't have an issuer") + } + issuerKeyId = *sig.IssuerKeyId + hashFunc = sig.Hash + sigType = sig.SigType + + for i, expectedHash := range expectedHashes { + if hashFunc == expectedHash { + break + } + if i+1 == expectedHashesLen { + return nil, errors.StructuralError("hash algorithm mismatch with cleartext message headers") + } + } + + keys = keyring.KeysByIdUsage(issuerKeyId, packet.KeyFlagSign) + if len(keys) > 0 { + break + } + } + + if len(keys) == 0 { + panic("unreachable") + } + + h, wrappedHash, err := hashForSignature(hashFunc, sigType) + if err != nil { + return nil, err + } + + if _, err := io.Copy(wrappedHash, signed); err != nil && err != io.EOF { + return nil, err + } + + for _, key := range keys { + err = key.PublicKey.VerifySignature(h, sig) + if err == nil { + now := config.Now() + if key.Revoked(now) || + key.Entity.Revoked(now) || // primary key is revoked (redundant if key is the primary key) + key.Entity.PrimaryIdentity().Revoked(now) { + return key.Entity, errors.ErrKeyRevoked + } + if sig.SigExpired(now) { + return key.Entity, errors.ErrSignatureExpired + } + if key.PublicKey.KeyExpired(key.SelfSignature, now) || + key.SelfSignature.SigExpired(now) { + return key.Entity, errors.ErrKeyExpired + } + return key.Entity, nil + } + } + + return nil, err +} + +// CheckArmoredDetachedSignature performs the same actions as +// CheckDetachedSignature but expects the signature to be armored. +func CheckArmoredDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (signer *Entity, err error) { + body, err := readArmored(signature, SignatureType) + if err != nil { + return + } + + return CheckDetachedSignature(keyring, signed, body, config) +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go new file mode 100644 index 0000000000..8caed36e3e --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go @@ -0,0 +1,173 @@ +package openpgp + +const testKey1KeyId = 0xA34D7E18C20C31BB +const testKey3KeyId = 0x338934250CCC0360 +const testKeyP256KeyId = 0xd44a2c495918513e + +const signedInput = "Signed message\nline 2\nline 3\n" +const signedTextInput = "Signed message\r\nline 2\r\nline 3\r\n" + +const recipientUnspecifiedHex = "848c0300000000000000000103ff62d4d578d03cf40c3da998dfe216c074fa6ddec5e31c197c9666ba292830d91d18716a80f699f9d897389a90e6d62d0238f5f07a5248073c0f24920e4bc4a30c2d17ee4e0cae7c3d4aaa4e8dced50e3010a80ee692175fa0385f62ecca4b56ee6e9980aa3ec51b61b077096ac9e800edaf161268593eedb6cc7027ff5cb32745d250010d407a6221ae22ef18469b444f2822478c4d190b24d36371a95cb40087cdd42d9399c3d06a53c0673349bfb607927f20d1e122bde1e2bf3aa6cae6edf489629bcaa0689539ae3b718914d88ededc3b" + +const detachedSignatureHex = "889c04000102000605024d449cd1000a0910a34d7e18c20c31bb167603ff57718d09f28a519fdc7b5a68b6a3336da04df85e38c5cd5d5bd2092fa4629848a33d85b1729402a2aab39c3ac19f9d573f773cc62c264dc924c067a79dfd8a863ae06c7c8686120760749f5fd9b1e03a64d20a7df3446ddc8f0aeadeaeba7cbaee5c1e366d65b6a0c6cc749bcb912d2f15013f812795c2e29eb7f7b77f39ce77" + +const detachedSignatureTextHex = "889c04010102000605024d449d21000a0910a34d7e18c20c31bbc8c60400a24fbef7342603a41cb1165767bd18985d015fb72fe05db42db36cfb2f1d455967f1e491194fbf6cf88146222b23bf6ffbd50d17598d976a0417d3192ff9cc0034fd00f287b02e90418bbefe609484b09231e4e7a5f3562e199bf39909ab5276c4d37382fe088f6b5c3426fc1052865da8b3ab158672d58b6264b10823dc4b39" + +const detachedSignatureDSAHex = "884604001102000605024d6c4eac000a0910338934250ccc0360f18d00a087d743d6405ed7b87755476629600b8b694a39e900a0abff8126f46faf1547c1743c37b21b4ea15b8f83" + +const detachedSignatureP256Hex = "885e0400130a0006050256e5bb00000a0910d44a2c495918513edef001009841a4f792beb0befccb35c8838a6a87d9b936beaa86db6745ddc7b045eee0cf00fd1ac1f78306b17e965935dd3f8bae4587a76587e4af231efe19cc4011a8434817" + +// The plaintext is https://www.gutenberg.org/cache/epub/1080/pg1080.txt +const modestProposalSha512 = "lbbrB1+WP3T9AaC9OQqBdOcCjgeEQadlulXsNPgVx0tyqPzDHwUugZ2gE7V0ESKAw6kAVfgkcuvfgxAAGaeHtw==" + +const testKeys1And2Hex = "988d044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd0011010001b41054657374204b6579203120285253412988b804130102002205024d3c5c10021b03060b090807030206150802090a0b0416020301021e01021780000a0910a34d7e18c20c31bbb5b304009cc45fe610b641a2c146331be94dade0a396e73ca725e1b25c21708d9cab46ecca5ccebc23055879df8f99eea39b377962a400f2ebdc36a7c99c333d74aeba346315137c3ff9d0a09b0273299090343048afb8107cf94cbd1400e3026f0ccac7ecebbc4d78588eb3e478fe2754d3ca664bcf3eac96ca4a6b0c8d7df5102f60f6b0020003b88d044d3c5c10010400b201df61d67487301f11879d514f4248ade90c8f68c7af1284c161098de4c28c2850f1ec7b8e30f959793e571542ffc6532189409cb51c3d30dad78c4ad5165eda18b20d9826d8707d0f742e2ab492103a85bbd9ddf4f5720f6de7064feb0d39ee002219765bb07bcfb8b877f47abe270ddeda4f676108cecb6b9bb2ad484a4f0011010001889f04180102000905024d3c5c10021b0c000a0910a34d7e18c20c31bb1a03040085c8d62e16d05dc4e9dad64953c8a2eed8b6c12f92b1575eeaa6dcf7be9473dd5b24b37b6dffbb4e7c99ed1bd3cb11634be19b3e6e207bed7505c7ca111ccf47cb323bf1f8851eb6360e8034cbff8dd149993c959de89f8f77f38e7e98b8e3076323aa719328e2b408db5ec0d03936efd57422ba04f925cdc7b4c1af7590e40ab0020003988d044d3c5c33010400b488c3e5f83f4d561f317817538d9d0397981e9aef1321ca68ebfae1cf8b7d388e19f4b5a24a82e2fbbf1c6c26557a6c5845307a03d815756f564ac7325b02bc83e87d5480a8fae848f07cb891f2d51ce7df83dcafdc12324517c86d472cc0ee10d47a68fd1d9ae49a6c19bbd36d82af597a0d88cc9c49de9df4e696fc1f0b5d0011010001b42754657374204b6579203220285253412c20656e637279707465642070726976617465206b65792988b804130102002205024d3c5c33021b03060b090807030206150802090a0b0416020301021e01021780000a0910d4984f961e35246b98940400908a73b6a6169f700434f076c6c79015a49bee37130eaf23aaa3cfa9ce60bfe4acaa7bc95f1146ada5867e0079babb38804891f4f0b8ebca57a86b249dee786161a755b7a342e68ccf3f78ed6440a93a6626beb9a37aa66afcd4f888790cb4bb46d94a4ae3eb3d7d3e6b00f6bfec940303e89ec5b32a1eaaacce66497d539328b0020003b88d044d3c5c33010400a4e913f9442abcc7f1804ccab27d2f787ffa592077ca935a8bb23165bd8d57576acac647cc596b2c3f814518cc8c82953c7a4478f32e0cf645630a5ba38d9618ef2bc3add69d459ae3dece5cab778938d988239f8c5ae437807075e06c828019959c644ff05ef6a5a1dab72227c98e3a040b0cf219026640698d7a13d8538a570011010001889f04180102000905024d3c5c33021b0c000a0910d4984f961e35246b26c703ff7ee29ef53bc1ae1ead533c408fa136db508434e233d6e62be621e031e5940bbd4c08142aed0f82217e7c3e1ec8de574bc06ccf3c36633be41ad78a9eacd209f861cae7b064100758545cc9dd83db71806dc1cfd5fb9ae5c7474bba0c19c44034ae61bae5eca379383339dece94ff56ff7aa44a582f3e5c38f45763af577c0934b0020003" + +const testKeys1And2PrivateHex = "9501d8044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd00110100010003ff4d91393b9a8e3430b14d6209df42f98dc927425b881f1209f319220841273a802a97c7bdb8b3a7740b3ab5866c4d1d308ad0d3a79bd1e883aacf1ac92dfe720285d10d08752a7efe3c609b1d00f17f2805b217be53999a7da7e493bfc3e9618fd17018991b8128aea70a05dbce30e4fbe626aa45775fa255dd9177aabf4df7cf0200c1ded12566e4bc2bb590455e5becfb2e2c9796482270a943343a7835de41080582c2be3caf5981aa838140e97afa40ad652a0b544f83eb1833b0957dce26e47b0200eacd6046741e9ce2ec5beb6fb5e6335457844fb09477f83b050a96be7da043e17f3a9523567ed40e7a521f818813a8b8a72209f1442844843ccc7eb9805442570200bdafe0438d97ac36e773c7162028d65844c4d463e2420aa2228c6e50dc2743c3d6c72d0d782a5173fe7be2169c8a9f4ef8a7cf3e37165e8c61b89c346cdc6c1799d2b41054657374204b6579203120285253412988b804130102002205024d3c5c10021b03060b090807030206150802090a0b0416020301021e01021780000a0910a34d7e18c20c31bbb5b304009cc45fe610b641a2c146331be94dade0a396e73ca725e1b25c21708d9cab46ecca5ccebc23055879df8f99eea39b377962a400f2ebdc36a7c99c333d74aeba346315137c3ff9d0a09b0273299090343048afb8107cf94cbd1400e3026f0ccac7ecebbc4d78588eb3e478fe2754d3ca664bcf3eac96ca4a6b0c8d7df5102f60f6b00200009d01d8044d3c5c10010400b201df61d67487301f11879d514f4248ade90c8f68c7af1284c161098de4c28c2850f1ec7b8e30f959793e571542ffc6532189409cb51c3d30dad78c4ad5165eda18b20d9826d8707d0f742e2ab492103a85bbd9ddf4f5720f6de7064feb0d39ee002219765bb07bcfb8b877f47abe270ddeda4f676108cecb6b9bb2ad484a4f00110100010003fd17a7490c22a79c59281fb7b20f5e6553ec0c1637ae382e8adaea295f50241037f8997cf42c1ce26417e015091451b15424b2c59eb8d4161b0975630408e394d3b00f88d4b4e18e2cc85e8251d4753a27c639c83f5ad4a571c4f19d7cd460b9b73c25ade730c99df09637bd173d8e3e981ac64432078263bb6dc30d3e974150dd0200d0ee05be3d4604d2146fb0457f31ba17c057560785aa804e8ca5530a7cd81d3440d0f4ba6851efcfd3954b7e68908fc0ba47f7ac37bf559c6c168b70d3a7c8cd0200da1c677c4bce06a068070f2b3733b0a714e88d62aa3f9a26c6f5216d48d5c2b5624144f3807c0df30be66b3268eeeca4df1fbded58faf49fc95dc3c35f134f8b01fd1396b6c0fc1b6c4f0eb8f5e44b8eace1e6073e20d0b8bc5385f86f1cf3f050f66af789f3ef1fc107b7f4421e19e0349c730c68f0a226981f4e889054fdb4dc149e8e889f04180102000905024d3c5c10021b0c000a0910a34d7e18c20c31bb1a03040085c8d62e16d05dc4e9dad64953c8a2eed8b6c12f92b1575eeaa6dcf7be9473dd5b24b37b6dffbb4e7c99ed1bd3cb11634be19b3e6e207bed7505c7ca111ccf47cb323bf1f8851eb6360e8034cbff8dd149993c959de89f8f77f38e7e98b8e3076323aa719328e2b408db5ec0d03936efd57422ba04f925cdc7b4c1af7590e40ab00200009501fe044d3c5c33010400b488c3e5f83f4d561f317817538d9d0397981e9aef1321ca68ebfae1cf8b7d388e19f4b5a24a82e2fbbf1c6c26557a6c5845307a03d815756f564ac7325b02bc83e87d5480a8fae848f07cb891f2d51ce7df83dcafdc12324517c86d472cc0ee10d47a68fd1d9ae49a6c19bbd36d82af597a0d88cc9c49de9df4e696fc1f0b5d0011010001fe030302e9030f3c783e14856063f16938530e148bc57a7aa3f3e4f90df9dceccdc779bc0835e1ad3d006e4a8d7b36d08b8e0de5a0d947254ecfbd22037e6572b426bcfdc517796b224b0036ff90bc574b5509bede85512f2eefb520fb4b02aa523ba739bff424a6fe81c5041f253f8d757e69a503d3563a104d0d49e9e890b9d0c26f96b55b743883b472caa7050c4acfd4a21f875bdf1258d88bd61224d303dc9df77f743137d51e6d5246b88c406780528fd9a3e15bab5452e5b93970d9dcc79f48b38651b9f15bfbcf6da452837e9cc70683d1bdca94507870f743e4ad902005812488dd342f836e72869afd00ce1850eea4cfa53ce10e3608e13d3c149394ee3cbd0e23d018fcbcb6e2ec5a1a22972d1d462ca05355d0d290dd2751e550d5efb38c6c89686344df64852bf4ff86638708f644e8ec6bd4af9b50d8541cb91891a431326ab2e332faa7ae86cfb6e0540aa63160c1e5cdd5a4add518b303fff0a20117c6bc77f7cfbaf36b04c865c6c2b42754657374204b6579203220285253412c20656e637279707465642070726976617465206b65792988b804130102002205024d3c5c33021b03060b090807030206150802090a0b0416020301021e01021780000a0910d4984f961e35246b98940400908a73b6a6169f700434f076c6c79015a49bee37130eaf23aaa3cfa9ce60bfe4acaa7bc95f1146ada5867e0079babb38804891f4f0b8ebca57a86b249dee786161a755b7a342e68ccf3f78ed6440a93a6626beb9a37aa66afcd4f888790cb4bb46d94a4ae3eb3d7d3e6b00f6bfec940303e89ec5b32a1eaaacce66497d539328b00200009d01fe044d3c5c33010400a4e913f9442abcc7f1804ccab27d2f787ffa592077ca935a8bb23165bd8d57576acac647cc596b2c3f814518cc8c82953c7a4478f32e0cf645630a5ba38d9618ef2bc3add69d459ae3dece5cab778938d988239f8c5ae437807075e06c828019959c644ff05ef6a5a1dab72227c98e3a040b0cf219026640698d7a13d8538a570011010001fe030302e9030f3c783e148560f936097339ae381d63116efcf802ff8b1c9360767db5219cc987375702a4123fd8657d3e22700f23f95020d1b261eda5257e9a72f9a918e8ef22dd5b3323ae03bbc1923dd224db988cadc16acc04b120a9f8b7e84da9716c53e0334d7b66586ddb9014df604b41be1e960dcfcbc96f4ed150a1a0dd070b9eb14276b9b6be413a769a75b519a53d3ecc0c220e85cd91ca354d57e7344517e64b43b6e29823cbd87eae26e2b2e78e6dedfbb76e3e9f77bcb844f9a8932eb3db2c3f9e44316e6f5d60e9e2a56e46b72abe6b06dc9a31cc63f10023d1f5e12d2a3ee93b675c96f504af0001220991c88db759e231b3320dcedf814dcf723fd9857e3d72d66a0f2af26950b915abdf56c1596f46a325bf17ad4810d3535fb02a259b247ac3dbd4cc3ecf9c51b6c07cebb009c1506fba0a89321ec8683e3fd009a6e551d50243e2d5092fefb3321083a4bad91320dc624bd6b5dddf93553e3d53924c05bfebec1fb4bd47e89a1a889f04180102000905024d3c5c33021b0c000a0910d4984f961e35246b26c703ff7ee29ef53bc1ae1ead533c408fa136db508434e233d6e62be621e031e5940bbd4c08142aed0f82217e7c3e1ec8de574bc06ccf3c36633be41ad78a9eacd209f861cae7b064100758545cc9dd83db71806dc1cfd5fb9ae5c7474bba0c19c44034ae61bae5eca379383339dece94ff56ff7aa44a582f3e5c38f45763af577c0934b0020000" + +const dsaElGamalTestKeysHex = "9501e1044dfcb16a110400aa3e5c1a1f43dd28c2ffae8abf5cfce555ee874134d8ba0a0f7b868ce2214beddc74e5e1e21ded354a95d18acdaf69e5e342371a71fbb9093162e0c5f3427de413a7f2c157d83f5cd2f9d791256dc4f6f0e13f13c3302af27f2384075ab3021dff7a050e14854bbde0a1094174855fc02f0bae8e00a340d94a1f22b32e48485700a0cec672ac21258fb95f61de2ce1af74b2c4fa3e6703ff698edc9be22c02ae4d916e4fa223f819d46582c0516235848a77b577ea49018dcd5e9e15cff9dbb4663a1ae6dd7580fa40946d40c05f72814b0f88481207e6c0832c3bded4853ebba0a7e3bd8e8c66df33d5a537cd4acf946d1080e7a3dcea679cb2b11a72a33a2b6a9dc85f466ad2ddf4c3db6283fa645343286971e3dd700703fc0c4e290d45767f370831a90187e74e9972aae5bff488eeff7d620af0362bfb95c1a6c3413ab5d15a2e4139e5d07a54d72583914661ed6a87cce810be28a0aa8879a2dd39e52fb6fe800f4f181ac7e328f740cde3d09a05cecf9483e4cca4253e60d4429ffd679d9996a520012aad119878c941e3cf151459873bdfc2a9563472fe0303027a728f9feb3b864260a1babe83925ce794710cfd642ee4ae0e5b9d74cee49e9c67b6cd0ea5dfbb582132195a121356a1513e1bca73e5b80c58c7ccb4164453412f456c47616d616c2054657374204b65792031886204131102002205024dfcb16a021b03060b090807030206150802090a0b0416020301021e01021780000a091033af447ccd759b09fadd00a0b8fd6f5a790bad7e9f2dbb7632046dc4493588db009c087c6a9ba9f7f49fab221587a74788c00db4889ab00200009d0157044dfcb16a1004008dec3f9291205255ccff8c532318133a6840739dd68b03ba942676f9038612071447bf07d00d559c5c0875724ea16a4c774f80d8338b55fca691a0522e530e604215b467bbc9ccfd483a1da99d7bc2648b4318fdbd27766fc8bfad3fddb37c62b8ae7ccfe9577e9b8d1e77c1d417ed2c2ef02d52f4da11600d85d3229607943700030503ff506c94c87c8cab778e963b76cf63770f0a79bf48fb49d3b4e52234620fc9f7657f9f8d56c96a2b7c7826ae6b57ebb2221a3fe154b03b6637cea7e6d98e3e45d87cf8dc432f723d3d71f89c5192ac8d7290684d2c25ce55846a80c9a7823f6acd9bb29fa6cd71f20bc90eccfca20451d0c976e460e672b000df49466408d527affe0303027a728f9feb3b864260abd761730327bca2aaa4ea0525c175e92bf240682a0e83b226f97ecb2e935b62c9a133858ce31b271fa8eb41f6a1b3cd72a63025ce1a75ee4180dcc284884904181102000905024dfcb16a021b0c000a091033af447ccd759b09dd0b009e3c3e7296092c81bee5a19929462caaf2fff3ae26009e218c437a2340e7ea628149af1ec98ec091a43992b00200009501e1044dfcb1be1104009f61faa61aa43df75d128cbe53de528c4aec49ce9360c992e70c77072ad5623de0a3a6212771b66b39a30dad6781799e92608316900518ec01184a85d872365b7d2ba4bacfb5882ea3c2473d3750dc6178cc1cf82147fb58caa28b28e9f12f6d1efcb0534abed644156c91cca4ab78834268495160b2400bc422beb37d237c2300a0cac94911b6d493bda1e1fbc6feeca7cb7421d34b03fe22cec6ccb39675bb7b94a335c2b7be888fd3906a1125f33301d8aa6ec6ee6878f46f73961c8d57a3e9544d8ef2a2cbfd4d52da665b1266928cfe4cb347a58c412815f3b2d2369dec04b41ac9a71cc9547426d5ab941cccf3b18575637ccfb42df1a802df3cfe0a999f9e7109331170e3a221991bf868543960f8c816c28097e503fe319db10fb98049f3a57d7c80c420da66d56f3644371631fad3f0ff4040a19a4fedc2d07727a1b27576f75a4d28c47d8246f27071e12d7a8de62aad216ddbae6aa02efd6b8a3e2818cda48526549791ab277e447b3a36c57cefe9b592f5eab73959743fcc8e83cbefec03a329b55018b53eec196765ae40ef9e20521a603c551efe0303020950d53a146bf9c66034d00c23130cce95576a2ff78016ca471276e8227fb30b1ffbd92e61804fb0c3eff9e30b1a826ee8f3e4730b4d86273ca977b4164453412f456c47616d616c2054657374204b65792032886204131102002205024dfcb1be021b03060b090807030206150802090a0b0416020301021e01021780000a0910a86bf526325b21b22bd9009e34511620415c974750a20df5cb56b182f3b48e6600a0a9466cb1a1305a84953445f77d461593f1d42bc1b00200009d0157044dfcb1be1004009565a951da1ee87119d600c077198f1c1bceb0f7aa54552489298e41ff788fa8f0d43a69871f0f6f77ebdfb14a4260cf9fbeb65d5844b4272a1904dd95136d06c3da745dc46327dd44a0f16f60135914368c8039a34033862261806bb2c5ce1152e2840254697872c85441ccb7321431d75a747a4bfb1d2c66362b51ce76311700030503fc0ea76601c196768070b7365a200e6ddb09307f262d5f39eec467b5f5784e22abdf1aa49226f59ab37cb49969d8f5230ea65caf56015abda62604544ed526c5c522bf92bed178a078789f6c807b6d34885688024a5bed9e9f8c58d11d4b82487b44c5f470c5606806a0443b79cadb45e0f897a561a53f724e5349b9267c75ca17fe0303020950d53a146bf9c660bc5f4ce8f072465e2d2466434320c1e712272fafc20e342fe7608101580fa1a1a367e60486a7cd1246b7ef5586cf5e10b32762b710a30144f12dd17dd4884904181102000905024dfcb1be021b0c000a0910a86bf526325b21b2904c00a0b2b66b4b39ccffda1d10f3ea8d58f827e30a8b8e009f4255b2d8112a184e40cde43a34e8655ca7809370b0020000" + +const signedMessageHex = "a3019bc0cbccc0c4b8d8b74ee2108fe16ec6d3ca490cbe362d3f8333d3f352531472538b8b13d353b97232f352158c20943157c71c16064626063656269052062e4e01987e9b6fccff4b7df3a34c534b23e679cbec3bc0f8f6e64dfb4b55fe3f8efa9ce110ddb5cd79faf1d753c51aecfa669f7e7aa043436596cccc3359cb7dd6bbe9ecaa69e5989d9e57209571edc0b2fa7f57b9b79a64ee6e99ce1371395fee92fec2796f7b15a77c386ff668ee27f6d38f0baa6c438b561657377bf6acff3c5947befd7bf4c196252f1d6e5c524d0300" + +const signedTextMessageHex = "a3019bc0cbccc8c4b8d8b74ee2108fe16ec6d36a250cbece0c178233d3f352531472538b8b13d35379b97232f352158ca0b4312f57c71c1646462606365626906a062e4e019811591798ff99bf8afee860b0d8a8c2a85c3387e3bcf0bb3b17987f2bbcfab2aa526d930cbfd3d98757184df3995c9f3e7790e36e3e9779f06089d4c64e9e47dd6202cb6e9bc73c5d11bb59fbaf89d22d8dc7cf199ddf17af96e77c5f65f9bbed56f427bd8db7af37f6c9984bf9385efaf5f184f986fb3e6adb0ecfe35bbf92d16a7aa2a344fb0bc52fb7624f0200" + +const signedEncryptedMessageHex = "c18c032a67d68660df41c70103ff5a84c9a72f80e74ef0384c2d6a9ebfe2b09e06a8f298394f6d2abf174e40934ab0ec01fb2d0ddf21211c6fe13eb238563663b017a6b44edca552eb4736c4b7dc6ed907dd9e12a21b51b64b46f902f76fb7aaf805c1db8070574d8d0431a23e324a750f77fb72340a17a42300ee4ca8207301e95a731da229a63ab9c6b44541fbd2c11d016d810b3b3b2b38f15b5b40f0a4910332829c2062f1f7cc61f5b03677d73c54cafa1004ced41f315d46444946faae571d6f426e6dbd45d9780eb466df042005298adabf7ce0ef766dfeb94cd449c7ed0046c880339599c4711af073ce649b1e237c40b50a5536283e03bdbb7afad78bd08707715c67fb43295f905b4c479178809d429a8e167a9a8c6dfd8ab20b4edebdc38d6dec879a3202e1b752690d9bb5b0c07c5a227c79cc200e713a99251a4219d62ad5556900cf69bd384b6c8e726c7be267471d0d23af956da165af4af757246c2ebcc302b39e8ef2fccb4971b234fcda22d759ddb20e27269ee7f7fe67898a9de721bfa02ab0becaa046d00ea16cb1afc4e2eab40d0ac17121c565686e5cbd0cbdfbd9d6db5c70278b9c9db5a83176d04f61fbfbc4471d721340ede2746e5c312ded4f26787985af92b64fae3f253dbdde97f6a5e1996fd4d865599e32ff76325d3e9abe93184c02988ee89a4504356a4ef3b9b7a57cbb9637ca90af34a7676b9ef559325c3cca4e29d69fec1887f5440bb101361d744ad292a8547f22b4f22b419a42aa836169b89190f46d9560824cb2ac6e8771de8223216a5e647e132ab9eebcba89569ab339cb1c3d70fe806b31f4f4c600b4103b8d7583ebff16e43dcda551e6530f975122eb8b29" + +const verifiedSignatureEncryptedMessageHex = "c2b304000108000605026048f6d600210910a34d7e18c20c31bb1621045fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb9a3b0400a32ddac1af259c1b0abab0041327ea04970944401978fb647dd1cf9aba4f164e43f0d8a9389501886474bdd4a6e77f6aea945c07dfbf87743835b44cc2c39a1f9aeecfa83135abc92e18e50396f2e6a06c44e0188b0081effbfb4160d28f118d4ff73dd199a102e47cffd8c7ff2bacd83ae72b5820c021a486766dd587b5da61" + +const unverifiedSignatureEncryptedMessageHex = "c2b304000108000605026048f6d600210910a34d7e18c20c31bb1621045fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb9a3b0400a32ddac1af259c1b0abab0041327ea04970944401978fb647dd1cf9aba4f164e43f0d8a9389501886474bdd4a6e77f6aea945c07dfbf87743835b44cc2c39a1f9aeecfa83135abc92e18e50396f2e6a06c44e0188b0081effbfb4160d28f118d4ff73dd199a102e47cffd8c7ff2bacd83ae72b5820c021a486766dd587b5da61" + +const signedEncryptedMessage2Hex = "85010e03cf6a7abcd43e36731003fb057f5495b79db367e277cdbe4ab90d924ddee0c0381494112ff8c1238fb0184af35d1731573b01bc4c55ecacd2aafbe2003d36310487d1ecc9ac994f3fada7f9f7f5c3a64248ab7782906c82c6ff1303b69a84d9a9529c31ecafbcdb9ba87e05439897d87e8a2a3dec55e14df19bba7f7bd316291c002ae2efd24f83f9e3441203fc081c0c23dc3092a454ca8a082b27f631abf73aca341686982e8fbda7e0e7d863941d68f3de4a755c2964407f4b5e0477b3196b8c93d551dd23c8beef7d0f03fbb1b6066f78907faf4bf1677d8fcec72651124080e0b7feae6b476e72ab207d38d90b958759fdedfc3c6c35717c9dbfc979b3cfbbff0a76d24a5e57056bb88acbd2a901ef64bc6e4db02adc05b6250ff378de81dca18c1910ab257dff1b9771b85bb9bbe0a69f5989e6d1710a35e6dfcceb7d8fb5ccea8db3932b3d9ff3fe0d327597c68b3622aec8e3716c83a6c93f497543b459b58ba504ed6bcaa747d37d2ca746fe49ae0a6ce4a8b694234e941b5159ff8bd34b9023da2814076163b86f40eed7c9472f81b551452d5ab87004a373c0172ec87ea6ce42ccfa7dbdad66b745496c4873d8019e8c28d6b3" + +const signatureEncryptedMessage2Hex = "c24604001102000605024dfd0166000a091033af447ccd759b09bae600a096ec5e63ecf0a403085e10f75cc3bab327663282009f51fad9df457ed8d2b70d8a73c76e0443eac0f377" + +const symmetricallyEncryptedCompressedHex = "c32e040903085a357c1a7b5614ed00cc0d1d92f428162058b3f558a0fb0980d221ebac6c97d5eda4e0fe32f6e706e94dd263012d6ca1ef8c4bbd324098225e603a10c85ebf09cbf7b5aeeb5ce46381a52edc51038b76a8454483be74e6dcd1e50d5689a8ae7eceaeefed98a0023d49b22eb1f65c2aa1ef1783bb5e1995713b0457102ec3c3075fe871267ffa4b686ad5d52000d857" + +const dsaTestKeyHex = "9901a2044d6c49de110400cb5ce438cf9250907ac2ba5bf6547931270b89f7c4b53d9d09f4d0213a5ef2ec1f26806d3d259960f872a4a102ef1581ea3f6d6882d15134f21ef6a84de933cc34c47cc9106efe3bd84c6aec12e78523661e29bc1a61f0aab17fa58a627fd5fd33f5149153fbe8cd70edf3d963bc287ef875270ff14b5bfdd1bca4483793923b00a0fe46d76cb6e4cbdc568435cd5480af3266d610d303fe33ae8273f30a96d4d34f42fa28ce1112d425b2e3bf7ea553d526e2db6b9255e9dc7419045ce817214d1a0056dbc8d5289956a4b1b69f20f1105124096e6a438f41f2e2495923b0f34b70642607d45559595c7fe94d7fa85fc41bf7d68c1fd509ebeaa5f315f6059a446b9369c277597e4f474a9591535354c7e7f4fd98a08aa60400b130c24ff20bdfbf683313f5daebf1c9b34b3bdadfc77f2ddd72ee1fb17e56c473664bc21d66467655dd74b9005e3a2bacce446f1920cd7017231ae447b67036c9b431b8179deacd5120262d894c26bc015bffe3d827ba7087ad9b700d2ca1f6d16cc1786581e5dd065f293c31209300f9b0afcc3f7c08dd26d0a22d87580b4db41054657374204b65792033202844534129886204131102002205024d6c49de021b03060b090807030206150802090a0b0416020301021e01021780000a0910338934250ccc03607e0400a0bdb9193e8a6b96fc2dfc108ae848914b504481f100a09c4dc148cb693293a67af24dd40d2b13a9e36794" + +const dsaTestKeyPrivateHex = "9501bb044d6c49de110400cb5ce438cf9250907ac2ba5bf6547931270b89f7c4b53d9d09f4d0213a5ef2ec1f26806d3d259960f872a4a102ef1581ea3f6d6882d15134f21ef6a84de933cc34c47cc9106efe3bd84c6aec12e78523661e29bc1a61f0aab17fa58a627fd5fd33f5149153fbe8cd70edf3d963bc287ef875270ff14b5bfdd1bca4483793923b00a0fe46d76cb6e4cbdc568435cd5480af3266d610d303fe33ae8273f30a96d4d34f42fa28ce1112d425b2e3bf7ea553d526e2db6b9255e9dc7419045ce817214d1a0056dbc8d5289956a4b1b69f20f1105124096e6a438f41f2e2495923b0f34b70642607d45559595c7fe94d7fa85fc41bf7d68c1fd509ebeaa5f315f6059a446b9369c277597e4f474a9591535354c7e7f4fd98a08aa60400b130c24ff20bdfbf683313f5daebf1c9b34b3bdadfc77f2ddd72ee1fb17e56c473664bc21d66467655dd74b9005e3a2bacce446f1920cd7017231ae447b67036c9b431b8179deacd5120262d894c26bc015bffe3d827ba7087ad9b700d2ca1f6d16cc1786581e5dd065f293c31209300f9b0afcc3f7c08dd26d0a22d87580b4d00009f592e0619d823953577d4503061706843317e4fee083db41054657374204b65792033202844534129886204131102002205024d6c49de021b03060b090807030206150802090a0b0416020301021e01021780000a0910338934250ccc03607e0400a0bdb9193e8a6b96fc2dfc108ae848914b504481f100a09c4dc148cb693293a67af24dd40d2b13a9e36794" + +const p256TestKeyHex = "98520456e5b83813082a8648ce3d030107020304a2072cd6d21321266c758cc5b83fab0510f751cb8d91897cddb7047d8d6f185546e2107111b0a95cb8ef063c33245502af7a65f004d5919d93ee74eb71a66253b424502d3235362054657374204b6579203c696e76616c6964406578616d706c652e636f6d3e8879041313080021050256e5b838021b03050b09080702061508090a0b020416020301021e01021780000a0910d44a2c495918513e54e50100dfa64f97d9b47766fc1943c6314ba3f2b2a103d71ad286dc5b1efb96a345b0c80100dbc8150b54241f559da6ef4baacea6d31902b4f4b1bdc09b34bf0502334b7754b8560456e5b83812082a8648ce3d030107020304bfe3cea9cee13486f8d518aa487fecab451f25467d2bf08e58f63e5fa525d5482133e6a79299c274b068ef0be448152ad65cf11cf764348588ca4f6a0bcf22b6030108078861041813080009050256e5b838021b0c000a0910d44a2c495918513e4a4800ff49d589fa64024ad30be363a032e3a0e0e6f5db56ba4c73db850518bf0121b8f20100fd78e065f4c70ea5be9df319ea67e493b936fc78da834a71828043d3154af56e" + +const p256TestKeyPrivateHex = "94a50456e5b83813082a8648ce3d030107020304a2072cd6d21321266c758cc5b83fab0510f751cb8d91897cddb7047d8d6f185546e2107111b0a95cb8ef063c33245502af7a65f004d5919d93ee74eb71a66253fe070302f0c2bfb0b6c30f87ee1599472b8636477eab23ced13b271886a4b50ed34c9d8436af5af5b8f88921f0efba6ef8c37c459bbb88bc1c6a13bbd25c4ce9b1e97679569ee77645d469bf4b43de637f5561b424502d3235362054657374204b6579203c696e76616c6964406578616d706c652e636f6d3e8879041313080021050256e5b838021b03050b09080702061508090a0b020416020301021e01021780000a0910d44a2c495918513e54e50100dfa64f97d9b47766fc1943c6314ba3f2b2a103d71ad286dc5b1efb96a345b0c80100dbc8150b54241f559da6ef4baacea6d31902b4f4b1bdc09b34bf0502334b77549ca90456e5b83812082a8648ce3d030107020304bfe3cea9cee13486f8d518aa487fecab451f25467d2bf08e58f63e5fa525d5482133e6a79299c274b068ef0be448152ad65cf11cf764348588ca4f6a0bcf22b603010807fe0703027510012471a603cfee2968dce19f732721ddf03e966fd133b4e3c7a685b788705cbc46fb026dc94724b830c9edbaecd2fb2c662f23169516cacd1fe423f0475c364ecc10abcabcfd4bbbda1a36a1bd8861041813080009050256e5b838021b0c000a0910d44a2c495918513e4a4800ff49d589fa64024ad30be363a032e3a0e0e6f5db56ba4c73db850518bf0121b8f20100fd78e065f4c70ea5be9df319ea67e493b936fc78da834a71828043d3154af56e" + +const armoredPrivateKeyBlock = `-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v1.4.10 (GNU/Linux) + +lQHYBE2rFNoBBADFwqWQIW/DSqcB4yCQqnAFTJ27qS5AnB46ccAdw3u4Greeu3Bp +idpoHdjULy7zSKlwR1EA873dO/k/e11Ml3dlAFUinWeejWaK2ugFP6JjiieSsrKn +vWNicdCS4HTWn0X4sjl0ZiAygw6GNhqEQ3cpLeL0g8E9hnYzJKQ0LWJa0QARAQAB +AAP/TB81EIo2VYNmTq0pK1ZXwUpxCrvAAIG3hwKjEzHcbQznsjNvPUihZ+NZQ6+X +0HCfPAdPkGDCLCb6NavcSW+iNnLTrdDnSI6+3BbIONqWWdRDYJhqZCkqmG6zqSfL +IdkJgCw94taUg5BWP/AAeQrhzjChvpMQTVKQL5mnuZbUCeMCAN5qrYMP2S9iKdnk +VANIFj7656ARKt/nf4CBzxcpHTyB8+d2CtPDKCmlJP6vL8t58Jmih+kHJMvC0dzn +gr5f5+sCAOOe5gt9e0am7AvQWhdbHVfJU0TQJx+m2OiCJAqGTB1nvtBLHdJnfdC9 +TnXXQ6ZXibqLyBies/xeY2sCKL5qtTMCAKnX9+9d/5yQxRyrQUHt1NYhaXZnJbHx +q4ytu0eWz+5i68IYUSK69jJ1NWPM0T6SkqpB3KCAIv68VFm9PxqG1KmhSrQIVGVz +dCBLZXmIuAQTAQIAIgUCTasU2gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA +CgkQO9o98PRieSoLhgQAkLEZex02Qt7vGhZzMwuN0R22w3VwyYyjBx+fM3JFETy1 +ut4xcLJoJfIaF5ZS38UplgakHG0FQ+b49i8dMij0aZmDqGxrew1m4kBfjXw9B/v+ +eIqpODryb6cOSwyQFH0lQkXC040pjq9YqDsO5w0WYNXYKDnzRV0p4H1pweo2VDid +AdgETasU2gEEAN46UPeWRqKHvA99arOxee38fBt2CI08iiWyI8T3J6ivtFGixSqV +bRcPxYO/qLpVe5l84Nb3X71GfVXlc9hyv7CD6tcowL59hg1E/DC5ydI8K8iEpUmK +/UnHdIY5h8/kqgGxkY/T/hgp5fRQgW1ZoZxLajVlMRZ8W4tFtT0DeA+JABEBAAEA +A/0bE1jaaZKj6ndqcw86jd+QtD1SF+Cf21CWRNeLKnUds4FRRvclzTyUMuWPkUeX +TaNNsUOFqBsf6QQ2oHUBBK4VCHffHCW4ZEX2cd6umz7mpHW6XzN4DECEzOVksXtc +lUC1j4UB91DC/RNQqwX1IV2QLSwssVotPMPqhOi0ZLNY7wIA3n7DWKInxYZZ4K+6 +rQ+POsz6brEoRHwr8x6XlHenq1Oki855pSa1yXIARoTrSJkBtn5oI+f8AzrnN0BN +oyeQAwIA/7E++3HDi5aweWrViiul9cd3rcsS0dEnksPhvS0ozCJiHsq/6GFmy7J8 +QSHZPteedBnZyNp5jR+H7cIfVN3KgwH/Skq4PsuPhDq5TKK6i8Pc1WW8MA6DXTdU +nLkX7RGmMwjC0DBf7KWAlPjFaONAX3a8ndnz//fy1q7u2l9AZwrj1qa1iJ8EGAEC +AAkFAk2rFNoCGwwACgkQO9o98PRieSo2/QP/WTzr4ioINVsvN1akKuekmEMI3LAp +BfHwatufxxP1U+3Si/6YIk7kuPB9Hs+pRqCXzbvPRrI8NHZBmc8qIGthishdCYad +AHcVnXjtxrULkQFGbGvhKURLvS9WnzD/m1K2zzwxzkPTzT9/Yf06O6Mal5AdugPL +VrM0m72/jnpKo04= +=zNCn +-----END PGP PRIVATE KEY BLOCK-----` + +const e2ePublicKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- +Charset: UTF-8 + +xv8AAABSBAAAAAATCCqGSM49AwEHAgME1LRoXSpOxtHXDUdmuvzchyg6005qIBJ4 +sfaSxX7QgH9RV2ONUhC+WiayCNADq+UMzuR/vunSr4aQffXvuGnR383/AAAAFDxk +Z2lsQHlhaG9vLWluYy5jb20+wv8AAACGBBATCAA4/wAAAAWCVGvAG/8AAAACiwn/ +AAAACZC2VkQCOjdvYf8AAAAFlQgJCgv/AAAAA5YBAv8AAAACngEAAE1BAP0X8veD +24IjmI5/C6ZAfVNXxgZZFhTAACFX75jUA3oD6AEAzoSwKf1aqH6oq62qhCN/pekX ++WAsVMBhNwzLpqtCRjLO/wAAAFYEAAAAABIIKoZIzj0DAQcCAwT50ain7vXiIRv8 +B1DO3x3cE/aattZ5sHNixJzRCXi2vQIA5QmOxZ6b5jjUekNbdHG3SZi1a2Ak5mfX +fRxC/5VGAwEIB8L/AAAAZQQYEwgAGP8AAAAFglRrwBz/AAAACZC2VkQCOjdvYQAA +FJAA9isX3xtGyMLYwp2F3nXm7QEdY5bq5VUcD/RJlj792VwA/1wH0pCzVLl4Q9F9 +ex7En5r7rHR5xwX82Msc+Rq9dSyO +=7MrZ +-----END PGP PUBLIC KEY BLOCK-----` + +const dsaKeyWithSHA512 = `9901a2044f04b07f110400db244efecc7316553ee08d179972aab87bb1214de7692593fcf5b6feb1c80fba268722dd464748539b85b81d574cd2d7ad0ca2444de4d849b8756bad7768c486c83a824f9bba4af773d11742bdfb4ac3b89ef8cc9452d4aad31a37e4b630d33927bff68e879284a1672659b8b298222fc68f370f3e24dccacc4a862442b9438b00a0ea444a24088dc23e26df7daf8f43cba3bffc4fe703fe3d6cd7fdca199d54ed8ae501c30e3ec7871ea9cdd4cf63cfe6fc82281d70a5b8bb493f922cd99fba5f088935596af087c8d818d5ec4d0b9afa7f070b3d7c1dd32a84fca08d8280b4890c8da1dde334de8e3cad8450eed2a4a4fcc2db7b8e5528b869a74a7f0189e11ef097ef1253582348de072bb07a9fa8ab838e993cef0ee203ff49298723e2d1f549b00559f886cd417a41692ce58d0ac1307dc71d85a8af21b0cf6eaa14baf2922d3a70389bedf17cc514ba0febbd107675a372fe84b90162a9e88b14d4b1c6be855b96b33fb198c46f058568817780435b6936167ebb3724b680f32bf27382ada2e37a879b3d9de2abe0c3f399350afd1ad438883f4791e2e3b4184453412068617368207472756e636174696f6e207465737488620413110a002205024f04b07f021b03060b090807030206150802090a0b0416020301021e01021780000a0910ef20e0cefca131581318009e2bf3bf047a44d75a9bacd00161ee04d435522397009a03a60d51bd8a568c6c021c8d7cf1be8d990d6417b0020003` + +const unknownHashFunctionHex = `8a00000040040001990006050253863c24000a09103b4fe6acc0b21f32ffff01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101` + +const rsaSignatureBadMPIlength = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101` + +const missingHashFunctionHex = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101` + +const campbellQuine = `a0b001000300fcffa0b001000d00f2ff000300fcffa0b001000d00f2ff8270a01c00000500faff8270a01c00000500faff000500faff001400ebff8270a01c00000500faff000500faff001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400000000ffff000000ffff000b00f4ff428821c400000000ffff000000ffff000b00f4ff0233214c40000100feff000233214c40000100feff0000` + +const keyV4forVerifyingSignedMessageV3 = `-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: GPGTools - https://gpgtools.org + +mI0EVfxoFQEEAMBIqmbDfYygcvP6Phr1wr1XI41IF7Qixqybs/foBF8qqblD9gIY +BKpXjnBOtbkcVOJ0nljd3/sQIfH4E0vQwK5/4YRQSI59eKOqd6Fx+fWQOLG+uu6z +tewpeCj9LLHvibx/Sc7VWRnrznia6ftrXxJ/wHMezSab3tnGC0YPVdGNABEBAAG0 +JEdvY3J5cHRvIFRlc3QgS2V5IDx0aGVtYXhAZ21haWwuY29tPoi5BBMBCgAjBQJV +/GgVAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQeXnQmhdGW9PFVAP+ +K7TU0qX5ArvIONIxh/WAweyOk884c5cE8f+3NOPOOCRGyVy0FId5A7MmD5GOQh4H +JseOZVEVCqlmngEvtHZb3U1VYtVGE5WZ+6rQhGsMcWP5qaT4soYwMBlSYxgYwQcx +YhN9qOr292f9j2Y//TTIJmZT4Oa+lMxhWdqTfX+qMgG4jQRV/GgVAQQArhFSiij1 +b+hT3dnapbEU+23Z1yTu1DfF6zsxQ4XQWEV3eR8v+8mEDDNcz8oyyF56k6UQ3rXi +UMTIwRDg4V6SbZmaFbZYCOwp/EmXJ3rfhm7z7yzXj2OFN22luuqbyVhuL7LRdB0M +pxgmjXb4tTvfgKd26x34S+QqUJ7W6uprY4sAEQEAAYifBBgBCgAJBQJV/GgVAhsM +AAoJEHl50JoXRlvT7y8D/02ckx4OMkKBZo7viyrBw0MLG92i+DC2bs35PooHR6zz +786mitjOp5z2QWNLBvxC70S0qVfCIz8jKupO1J6rq6Z8CcbLF3qjm6h1omUBf8Nd +EfXKD2/2HV6zMKVknnKzIEzauh+eCKS2CeJUSSSryap/QLVAjRnckaES/OsEWhNB +=RZia +-----END PGP PUBLIC KEY BLOCK----- +` + +const signedMessageV3 = `-----BEGIN PGP MESSAGE----- +Comment: GPGTools - https://gpgtools.org + +owGbwMvMwMVYWXlhlrhb9GXG03JJDKF/MtxDMjKLFYAoUaEktbhEITe1uDgxPVWP +q5NhKjMrWAVcC9evD8z/bF/uWNjqtk/X3y5/38XGRQHm/57rrDRYuGnTw597Xqka +uM3137/hH3Os+Jf2dc0fXOITKwJvXJvecPVs0ta+Vg7ZO1MLn8w58Xx+6L58mbka +DGHyU9yTueZE8D+QF/Tz28Y78dqtF56R1VPn9Xw4uJqrWYdd7b3vIZ1V6R4Nh05d +iT57d/OhWwA= +=hG7R +-----END PGP MESSAGE----- +` + +// https://mailarchive.ietf.org/arch/msg/openpgp/9SheW_LENE0Kxf7haNllovPyAdY/ +const v5PrivKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- + +lGEFXJH05BYAAAAtCSsGAQQB2kcPAQEHQFhZlVcVVtwf+21xNQPX+ecMJJBL0MPd +fj75iux+my8QAAAAAAAiAQCHZ1SnSUmWqxEsoI6facIVZQu6mph3cBFzzTvcm5lA +Ng5ctBhlbW1hLmdvbGRtYW5AZXhhbXBsZS5uZXSIlgUTFggASCIhBRk0e8mHJGQC +X5nfPsLgAA7ZiEiS4fez6kyUAJFZVptUBQJckfTkAhsDBQsJCAcCAyICAQYVCgkI +CwIEFgIDAQIeBwIXgAAA9cAA/jiR3yMsZMeEQ40u6uzEoXa6UXeV/S3wwJAXRJy9 +M8s0AP9vuL/7AyTfFXwwzSjDnYmzS0qAhbLDQ643N+MXGBJ2BZxmBVyR9OQSAAAA +MgorBgEEAZdVAQUBAQdA+nysrzml2UCweAqtpDuncSPlvrcBWKU0yfU0YvYWWAoD +AQgHAAAAAAAiAP9OdAPppjU1WwpqjIItkxr+VPQRT8Zm/Riw7U3F6v3OiBFHiHoF +GBYIACwiIQUZNHvJhyRkAl+Z3z7C4AAO2YhIkuH3s+pMlACRWVabVAUCXJH05AIb +DAAAOSQBAP4BOOIR/sGLNMOfeb5fPs/02QMieoiSjIBnijhob2U5AQC+RtOHCHx7 +TcIYl5/Uyoi+FOvPLcNw4hOv2nwUzSSVAw== +=IiS2 +-----END PGP PRIVATE KEY BLOCK-----` + +// Generated with the above private key +const v5PrivKeyMsg = `-----BEGIN PGP MESSAGE----- +Version: OpenPGP.js v4.10.7 +Comment: https://openpgpjs.org + +xA0DAQoWGTR7yYckZAIByxF1B21zZy50eHRfbIGSdGVzdMJ3BQEWCgAGBQJf +bIGSACMiIQUZNHvJhyRkAl+Z3z7C4AAO2YhIkuH3s+pMlACRWVabVDQvAP9G +y29VPonFXqi2zKkpZrvyvZxg+n5e8Nt9wNbuxeCd3QD/TtO2s+JvjrE4Siwv +UQdl5MlBka1QSNbMq2Bz7XwNPg4= +=6lbM +-----END PGP MESSAGE-----` diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go new file mode 100644 index 0000000000..14f58548bd --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go @@ -0,0 +1,367 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package s2k implements the various OpenPGP string-to-key transforms as +// specified in RFC 4800 section 3.7.1. +package s2k // import "github.com/ProtonMail/go-crypto/openpgp/s2k" + +import ( + "crypto" + "hash" + "io" + "strconv" + + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" +) + +// Config collects configuration parameters for s2k key-stretching +// transformations. A nil *Config is valid and results in all default +// values. Currently, Config is used only by the Serialize function in +// this package. +type Config struct { + // S2KMode is the mode of s2k function. + // It can be 0 (simple), 1(salted), 3(iterated) + // 2(reserved) 100-110(private/experimental). + S2KMode uint8 + // Hash is the default hash function to be used. If + // nil, SHA256 is used. + Hash crypto.Hash + // S2KCount is only used for symmetric encryption. It + // determines the strength of the passphrase stretching when + // the said passphrase is hashed to produce a key. S2KCount + // should be between 65536 and 65011712, inclusive. If Config + // is nil or S2KCount is 0, the value 16777216 used. Not all + // values in the above range can be represented. S2KCount will + // be rounded up to the next representable value if it cannot + // be encoded exactly. See RFC 4880 Section 3.7.1.3. + S2KCount int +} + +// Params contains all the parameters of the s2k packet +type Params struct { + // mode is the mode of s2k function. + // It can be 0 (simple), 1(salted), 3(iterated) + // 2(reserved) 100-110(private/experimental). + mode uint8 + // hashId is the ID of the hash function used in any of the modes + hashId byte + // salt is a byte array to use as a salt in hashing process + salt []byte + // countByte is used to determine how many rounds of hashing are to + // be performed in s2k mode 3. See RFC 4880 Section 3.7.1.3. + countByte byte +} + +func (c *Config) hash() crypto.Hash { + if c == nil || uint(c.Hash) == 0 { + return crypto.SHA256 + } + + return c.Hash +} + +// EncodedCount get encoded count +func (c *Config) EncodedCount() uint8 { + if c == nil || c.S2KCount == 0 { + return 224 // The common case. Corresponding to 16777216 + } + + i := c.S2KCount + + switch { + case i < 65536: + i = 65536 + case i > 65011712: + i = 65011712 + } + + return encodeCount(i) +} + +// encodeCount converts an iterative "count" in the range 1024 to +// 65011712, inclusive, to an encoded count. The return value is the +// octet that is actually stored in the GPG file. encodeCount panics +// if i is not in the above range (encodedCount above takes care to +// pass i in the correct range). See RFC 4880 Section 3.7.7.1. +func encodeCount(i int) uint8 { + if i < 65536 || i > 65011712 { + panic("count arg i outside the required range") + } + + for encoded := 96; encoded < 256; encoded++ { + count := decodeCount(uint8(encoded)) + if count >= i { + return uint8(encoded) + } + } + + return 255 +} + +// decodeCount returns the s2k mode 3 iterative "count" corresponding to +// the encoded octet c. +func decodeCount(c uint8) int { + return (16 + int(c&15)) << (uint32(c>>4) + 6) +} + +// Simple writes to out the result of computing the Simple S2K function (RFC +// 4880, section 3.7.1.1) using the given hash and input passphrase. +func Simple(out []byte, h hash.Hash, in []byte) { + Salted(out, h, in, nil) +} + +var zero [1]byte + +// Salted writes to out the result of computing the Salted S2K function (RFC +// 4880, section 3.7.1.2) using the given hash, input passphrase and salt. +func Salted(out []byte, h hash.Hash, in []byte, salt []byte) { + done := 0 + var digest []byte + + for i := 0; done < len(out); i++ { + h.Reset() + for j := 0; j < i; j++ { + h.Write(zero[:]) + } + h.Write(salt) + h.Write(in) + digest = h.Sum(digest[:0]) + n := copy(out[done:], digest) + done += n + } +} + +// Iterated writes to out the result of computing the Iterated and Salted S2K +// function (RFC 4880, section 3.7.1.3) using the given hash, input passphrase, +// salt and iteration count. +func Iterated(out []byte, h hash.Hash, in []byte, salt []byte, count int) { + combined := make([]byte, len(in)+len(salt)) + copy(combined, salt) + copy(combined[len(salt):], in) + + if count < len(combined) { + count = len(combined) + } + + done := 0 + var digest []byte + for i := 0; done < len(out); i++ { + h.Reset() + for j := 0; j < i; j++ { + h.Write(zero[:]) + } + written := 0 + for written < count { + if written+len(combined) > count { + todo := count - written + h.Write(combined[:todo]) + written = count + } else { + h.Write(combined) + written += len(combined) + } + } + digest = h.Sum(digest[:0]) + n := copy(out[done:], digest) + done += n + } +} + +// Generate generates valid parameters from given configuration. +// It will enforce salted + hashed s2k method +func Generate(rand io.Reader, c *Config) (*Params, error) { + hashId, ok := HashToHashId(c.Hash) + if !ok { + return nil, errors.UnsupportedError("no such hash") + } + + params := &Params{ + mode: 3, // Enforce iterared + salted method + hashId: hashId, + salt: make([]byte, 8), + countByte: c.EncodedCount(), + } + + if _, err := io.ReadFull(rand, params.salt); err != nil { + return nil, err + } + + return params, nil +} + +// Parse reads a binary specification for a string-to-key transformation from r +// and returns a function which performs that transform. If the S2K is a special +// GNU extension that indicates that the private key is missing, then the error +// returned is errors.ErrDummyPrivateKey. +func Parse(r io.Reader) (f func(out, in []byte), err error) { + params, err := ParseIntoParams(r) + if err != nil { + return nil, err + } + + return params.Function() +} + +// ParseIntoParams reads a binary specification for a string-to-key +// transformation from r and returns a struct describing the s2k parameters. +func ParseIntoParams(r io.Reader) (params *Params, err error) { + var buf [9]byte + + _, err = io.ReadFull(r, buf[:2]) + if err != nil { + return + } + + params = &Params{ + mode: buf[0], + hashId: buf[1], + } + + switch params.mode { + case 0: + return params, nil + case 1: + _, err = io.ReadFull(r, buf[:8]) + if err != nil { + return nil, err + } + + params.salt = buf[:8] + return params, nil + case 3: + _, err = io.ReadFull(r, buf[:9]) + if err != nil { + return nil, err + } + + params.salt = buf[:8] + params.countByte = buf[8] + return params, nil + case 101: + // This is a GNU extension. See + // https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=doc/DETAILS;h=fe55ae16ab4e26d8356dc574c9e8bc935e71aef1;hb=23191d7851eae2217ecdac6484349849a24fd94a#l1109 + if _, err = io.ReadFull(r, buf[:4]); err != nil { + return nil, err + } + if buf[0] == 'G' && buf[1] == 'N' && buf[2] == 'U' && buf[3] == 1 { + return params, nil + } + return nil, errors.UnsupportedError("GNU S2K extension") + } + + return nil, errors.UnsupportedError("S2K function") +} + +func (params *Params) Dummy() bool { + return params != nil && params.mode == 101 +} + +func (params *Params) Function() (f func(out, in []byte), err error) { + if params.Dummy() { + return nil, errors.ErrDummyPrivateKey("dummy key found") + } + hashObj, ok := HashIdToHash(params.hashId) + if !ok { + return nil, errors.UnsupportedError("hash for S2K function: " + strconv.Itoa(int(params.hashId))) + } + if !hashObj.Available() { + return nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashObj))) + } + + switch params.mode { + case 0: + f := func(out, in []byte) { + Simple(out, hashObj.New(), in) + } + + return f, nil + case 1: + f := func(out, in []byte) { + Salted(out, hashObj.New(), in, params.salt) + } + + return f, nil + case 3: + f := func(out, in []byte) { + Iterated(out, hashObj.New(), in, params.salt, decodeCount(params.countByte)) + } + + return f, nil + } + + return nil, errors.UnsupportedError("S2K function") +} + +func (params *Params) Serialize(w io.Writer) (err error) { + if _, err = w.Write([]byte{params.mode}); err != nil { + return + } + if _, err = w.Write([]byte{params.hashId}); err != nil { + return + } + if params.Dummy() { + _, err = w.Write(append([]byte("GNU"), 1)) + return + } + if params.mode > 0 { + if _, err = w.Write(params.salt); err != nil { + return + } + if params.mode == 3 { + _, err = w.Write([]byte{params.countByte}) + } + } + return +} + +// Serialize salts and stretches the given passphrase and writes the +// resulting key into key. It also serializes an S2K descriptor to +// w. The key stretching can be configured with c, which may be +// nil. In that case, sensible defaults will be used. +func Serialize(w io.Writer, key []byte, rand io.Reader, passphrase []byte, c *Config) error { + params, err := Generate(rand, c) + if err != nil { + return err + } + err = params.Serialize(w) + if err != nil { + return err + } + + f, err := params.Function() + if err != nil { + return err + } + f(key, passphrase) + return nil +} + +// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP +// hash id. +func HashIdToHash(id byte) (h crypto.Hash, ok bool) { + if hash, ok := algorithm.HashById[id]; ok { + return hash.HashFunc(), true + } + return 0, false +} + +// HashIdToString returns the name of the hash function corresponding to the +// given OpenPGP hash id. +func HashIdToString(id byte) (name string, ok bool) { + if hash, ok := algorithm.HashById[id]; ok { + return hash.String(), true + } + return "", false +} + +// HashIdToHash returns an OpenPGP hash id which corresponds the given Hash. +func HashToHashId(h crypto.Hash) (id byte, ok bool) { + for id, hash := range algorithm.HashById { + if hash.HashFunc() == h { + return id, true + } + } + return 0, false +} diff --git a/vendor/github.com/ProtonMail/go-crypto/openpgp/write.go b/vendor/github.com/ProtonMail/go-crypto/openpgp/write.go new file mode 100644 index 0000000000..35e18f6112 --- /dev/null +++ b/vendor/github.com/ProtonMail/go-crypto/openpgp/write.go @@ -0,0 +1,568 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package openpgp + +import ( + "crypto" + "hash" + "io" + "strconv" + "time" + + "github.com/ProtonMail/go-crypto/openpgp/armor" + "github.com/ProtonMail/go-crypto/openpgp/errors" + "github.com/ProtonMail/go-crypto/openpgp/packet" + "github.com/ProtonMail/go-crypto/openpgp/s2k" +) + +// DetachSign signs message with the private key from signer (which must +// already have been decrypted) and writes the signature to w. +// If config is nil, sensible defaults will be used. +func DetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { + return detachSign(w, signer, message, packet.SigTypeBinary, config) +} + +// ArmoredDetachSign signs message with the private key from signer (which +// must already have been decrypted) and writes an armored signature to w. +// If config is nil, sensible defaults will be used. +func ArmoredDetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) (err error) { + return armoredDetachSign(w, signer, message, packet.SigTypeBinary, config) +} + +// DetachSignText signs message (after canonicalising the line endings) with +// the private key from signer (which must already have been decrypted) and +// writes the signature to w. +// If config is nil, sensible defaults will be used. +func DetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { + return detachSign(w, signer, message, packet.SigTypeText, config) +} + +// ArmoredDetachSignText signs message (after canonicalising the line endings) +// with the private key from signer (which must already have been decrypted) +// and writes an armored signature to w. +// If config is nil, sensible defaults will be used. +func ArmoredDetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { + return armoredDetachSign(w, signer, message, packet.SigTypeText, config) +} + +func armoredDetachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { + out, err := armor.Encode(w, SignatureType, nil) + if err != nil { + return + } + err = detachSign(out, signer, message, sigType, config) + if err != nil { + return + } + return out.Close() +} + +func detachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { + signingKey, ok := signer.SigningKeyById(config.Now(), config.SigningKey()) + if !ok { + return errors.InvalidArgumentError("no valid signing keys") + } + if signingKey.PrivateKey == nil { + return errors.InvalidArgumentError("signing key doesn't have a private key") + } + if signingKey.PrivateKey.Encrypted { + return errors.InvalidArgumentError("signing key is encrypted") + } + + sig := new(packet.Signature) + sig.SigType = sigType + sig.PubKeyAlgo = signingKey.PrivateKey.PubKeyAlgo + sig.Hash = config.Hash() + sig.CreationTime = config.Now() + sigLifetimeSecs := config.SigLifetime() + sig.SigLifetimeSecs = &sigLifetimeSecs + sig.IssuerKeyId = &signingKey.PrivateKey.KeyId + + h, wrappedHash, err := hashForSignature(sig.Hash, sig.SigType) + if err != nil { + return + } + if _, err = io.Copy(wrappedHash, message); err != nil { + return err + } + + err = sig.Sign(h, signingKey.PrivateKey, config) + if err != nil { + return + } + + return sig.Serialize(w) +} + +// FileHints contains metadata about encrypted files. This metadata is, itself, +// encrypted. +type FileHints struct { + // IsBinary can be set to hint that the contents are binary data. + IsBinary bool + // FileName hints at the name of the file that should be written. It's + // truncated to 255 bytes if longer. It may be empty to suggest that the + // file should not be written to disk. It may be equal to "_CONSOLE" to + // suggest the data should not be written to disk. + FileName string + // ModTime contains the modification time of the file, or the zero time if not applicable. + ModTime time.Time +} + +// SymmetricallyEncrypt acts like gpg -c: it encrypts a file with a passphrase. +// The resulting WriteCloser must be closed after the contents of the file have +// been written. +// If config is nil, sensible defaults will be used. +func SymmetricallyEncrypt(ciphertext io.Writer, passphrase []byte, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { + if hints == nil { + hints = &FileHints{} + } + + key, err := packet.SerializeSymmetricKeyEncrypted(ciphertext, passphrase, config) + if err != nil { + return + } + + var w io.WriteCloser + if config.AEAD() != nil { + w, err = packet.SerializeAEADEncrypted(ciphertext, key, config.Cipher(), config.AEAD().Mode(), config) + if err != nil { + return + } + } else { + w, err = packet.SerializeSymmetricallyEncrypted(ciphertext, config.Cipher(), key, config) + if err != nil { + return + } + } + + literalData := w + if algo := config.Compression(); algo != packet.CompressionNone { + var compConfig *packet.CompressionConfig + if config != nil { + compConfig = config.CompressionConfig + } + literalData, err = packet.SerializeCompressed(w, algo, compConfig) + if err != nil { + return + } + } + + var epochSeconds uint32 + if !hints.ModTime.IsZero() { + epochSeconds = uint32(hints.ModTime.Unix()) + } + return packet.SerializeLiteral(literalData, hints.IsBinary, hints.FileName, epochSeconds) +} + +// intersectPreferences mutates and returns a prefix of a that contains only +// the values in the intersection of a and b. The order of a is preserved. +func intersectPreferences(a []uint8, b []uint8) (intersection []uint8) { + var j int + for _, v := range a { + for _, v2 := range b { + if v == v2 { + a[j] = v + j++ + break + } + } + } + + return a[:j] +} + +func hashToHashId(h crypto.Hash) uint8 { + v, ok := s2k.HashToHashId(h) + if !ok { + panic("tried to convert unknown hash") + } + return v +} + +// EncryptText encrypts a message to a number of recipients and, optionally, +// signs it. Optional information is contained in 'hints', also encrypted, that +// aids the recipients in processing the message. The resulting WriteCloser +// must be closed after the contents of the file have been written. If config +// is nil, sensible defaults will be used. The signing is done in text mode. +func EncryptText(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { + return encrypt(ciphertext, ciphertext, to, signed, hints, packet.SigTypeText, config) +} + +// Encrypt encrypts a message to a number of recipients and, optionally, signs +// it. hints contains optional information, that is also encrypted, that aids +// the recipients in processing the message. The resulting WriteCloser must +// be closed after the contents of the file have been written. +// If config is nil, sensible defaults will be used. +func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { + return encrypt(ciphertext, ciphertext, to, signed, hints, packet.SigTypeBinary, config) +} + +// EncryptSplit encrypts a message to a number of recipients and, optionally, signs +// it. hints contains optional information, that is also encrypted, that aids +// the recipients in processing the message. The resulting WriteCloser must +// be closed after the contents of the file have been written. +// If config is nil, sensible defaults will be used. +func EncryptSplit(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { + return encrypt(keyWriter, dataWriter, to, signed, hints, packet.SigTypeBinary, config) +} + +// EncryptTextSplit encrypts a message to a number of recipients and, optionally, signs +// it. hints contains optional information, that is also encrypted, that aids +// the recipients in processing the message. The resulting WriteCloser must +// be closed after the contents of the file have been written. +// If config is nil, sensible defaults will be used. +func EncryptTextSplit(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { + return encrypt(keyWriter, dataWriter, to, signed, hints, packet.SigTypeText, config) +} + +// writeAndSign writes the data as a payload package and, optionally, signs +// it. hints contains optional information, that is also encrypted, +// that aids the recipients in processing the message. The resulting +// WriteCloser must be closed after the contents of the file have been +// written. If config is nil, sensible defaults will be used. +func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entity, hints *FileHints, sigType packet.SignatureType, config *packet.Config) (plaintext io.WriteCloser, err error) { + var signer *packet.PrivateKey + if signed != nil { + signKey, ok := signed.SigningKeyById(config.Now(), config.SigningKey()) + if !ok { + return nil, errors.InvalidArgumentError("no valid signing keys") + } + signer = signKey.PrivateKey + if signer == nil { + return nil, errors.InvalidArgumentError("no private key in signing key") + } + if signer.Encrypted { + return nil, errors.InvalidArgumentError("signing key must be decrypted") + } + } + + var hash crypto.Hash + for _, hashId := range candidateHashes { + if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { + hash = h + break + } + } + + // If the hash specified by config is a candidate, we'll use that. + if configuredHash := config.Hash(); configuredHash.Available() { + for _, hashId := range candidateHashes { + if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { + hash = h + break + } + } + } + + if hash == 0 { + hashId := candidateHashes[0] + name, ok := s2k.HashIdToString(hashId) + if !ok { + name = "#" + strconv.Itoa(int(hashId)) + } + return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") + } + + if signer != nil { + ops := &packet.OnePassSignature{ + SigType: sigType, + Hash: hash, + PubKeyAlgo: signer.PubKeyAlgo, + KeyId: signer.KeyId, + IsLast: true, + } + if err := ops.Serialize(payload); err != nil { + return nil, err + } + } + + if hints == nil { + hints = &FileHints{} + } + + w := payload + if signer != nil { + // If we need to write a signature packet after the literal + // data then we need to stop literalData from closing + // encryptedData. + w = noOpCloser{w} + + } + var epochSeconds uint32 + if !hints.ModTime.IsZero() { + epochSeconds = uint32(hints.ModTime.Unix()) + } + literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) + if err != nil { + return nil, err + } + + if signer != nil { + h, wrappedHash, err := hashForSignature(hash, sigType) + if err != nil { + return nil, err + } + metadata := &packet.LiteralData{ + Format: 't', + FileName: hints.FileName, + Time: epochSeconds, + } + if hints.IsBinary { + metadata.Format = 'b' + } + return signatureWriter{payload, literalData, hash, wrappedHash, h, signer, sigType, config, metadata}, nil + } + return literalData, nil +} + +// encrypt encrypts a message to a number of recipients and, optionally, signs +// it. hints contains optional information, that is also encrypted, that aids +// the recipients in processing the message. The resulting WriteCloser must +// be closed after the contents of the file have been written. +// If config is nil, sensible defaults will be used. +func encrypt(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, sigType packet.SignatureType, config *packet.Config) (plaintext io.WriteCloser, err error) { + if len(to) == 0 { + return nil, errors.InvalidArgumentError("no encryption recipient provided") + } + + // These are the possible ciphers that we'll use for the message. + candidateCiphers := []uint8{ + uint8(packet.CipherAES128), + uint8(packet.CipherAES256), + uint8(packet.CipherCAST5), + } + // These are the possible hash functions that we'll use for the signature. + candidateHashes := []uint8{ + hashToHashId(crypto.SHA256), + hashToHashId(crypto.SHA384), + hashToHashId(crypto.SHA512), + hashToHashId(crypto.SHA1), + hashToHashId(crypto.RIPEMD160), + } + candidateAeadModes := []uint8{ + uint8(packet.AEADModeEAX), + uint8(packet.AEADModeOCB), + uint8(packet.AEADModeExperimentalGCM), + } + candidateCompression := []uint8{ + uint8(packet.CompressionNone), + uint8(packet.CompressionZIP), + uint8(packet.CompressionZLIB), + } + // In the event that a recipient doesn't specify any supported ciphers + // or hash functions, these are the ones that we assume that every + // implementation supports. + defaultCiphers := candidateCiphers[0:1] + defaultHashes := candidateHashes[0:1] + defaultAeadModes := candidateAeadModes[0:1] + defaultCompression := candidateCompression[0:1] + + encryptKeys := make([]Key, len(to)) + // AEAD is used only if every key supports it. + aeadSupported := true + + for i := range to { + var ok bool + encryptKeys[i], ok = to[i].EncryptionKey(config.Now()) + if !ok { + return nil, errors.InvalidArgumentError("cannot encrypt a message to key id " + strconv.FormatUint(to[i].PrimaryKey.KeyId, 16) + " because it has no valid encryption keys") + } + + sig := to[i].PrimaryIdentity().SelfSignature + if sig.AEAD == false { + aeadSupported = false + } + + preferredSymmetric := sig.PreferredSymmetric + if len(preferredSymmetric) == 0 { + preferredSymmetric = defaultCiphers + } + preferredHashes := sig.PreferredHash + if len(preferredHashes) == 0 { + preferredHashes = defaultHashes + } + preferredAeadModes := sig.PreferredAEAD + if len(preferredAeadModes) == 0 { + preferredAeadModes = defaultAeadModes + } + preferredCompression := sig.PreferredCompression + if len(preferredCompression) == 0 { + preferredCompression = defaultCompression + } + candidateCiphers = intersectPreferences(candidateCiphers, preferredSymmetric) + candidateHashes = intersectPreferences(candidateHashes, preferredHashes) + candidateAeadModes = intersectPreferences(candidateAeadModes, preferredAeadModes) + candidateCompression = intersectPreferences(candidateCompression, preferredCompression) + } + + if len(candidateCiphers) == 0 || len(candidateHashes) == 0 || len(candidateAeadModes) == 0 { + return nil, errors.InvalidArgumentError("cannot encrypt because recipient set shares no common algorithms") + } + + cipher := packet.CipherFunction(candidateCiphers[0]) + mode := packet.AEADMode(candidateAeadModes[0]) + // If the cipher specified by config is a candidate, we'll use that. + configuredCipher := config.Cipher() + for _, c := range candidateCiphers { + cipherFunc := packet.CipherFunction(c) + if cipherFunc == configuredCipher { + cipher = cipherFunc + break + } + } + + symKey := make([]byte, cipher.KeySize()) + if _, err := io.ReadFull(config.Random(), symKey); err != nil { + return nil, err + } + + for _, key := range encryptKeys { + if err := packet.SerializeEncryptedKey(keyWriter, key.PublicKey, cipher, symKey, config); err != nil { + return nil, err + } + } + + var payload io.WriteCloser + if aeadSupported { + payload, err = packet.SerializeAEADEncrypted(dataWriter, symKey, cipher, mode, config) + if err != nil { + return + } + } else { + payload, err = packet.SerializeSymmetricallyEncrypted(dataWriter, cipher, symKey, config) + if err != nil { + return + } + } + payload, err = handleCompression(payload, candidateCompression, config) + if err != nil { + return nil, err + } + + return writeAndSign(payload, candidateHashes, signed, hints, sigType, config) +} + +// Sign signs a message. The resulting WriteCloser must be closed after the +// contents of the file have been written. hints contains optional information +// that aids the recipients in processing the message. +// If config is nil, sensible defaults will be used. +func Sign(output io.Writer, signed *Entity, hints *FileHints, config *packet.Config) (input io.WriteCloser, err error) { + if signed == nil { + return nil, errors.InvalidArgumentError("no signer provided") + } + + // These are the possible hash functions that we'll use for the signature. + candidateHashes := []uint8{ + hashToHashId(crypto.SHA256), + hashToHashId(crypto.SHA384), + hashToHashId(crypto.SHA512), + hashToHashId(crypto.SHA1), + hashToHashId(crypto.RIPEMD160), + } + defaultHashes := candidateHashes[0:1] + preferredHashes := signed.PrimaryIdentity().SelfSignature.PreferredHash + if len(preferredHashes) == 0 { + preferredHashes = defaultHashes + } + candidateHashes = intersectPreferences(candidateHashes, preferredHashes) + if len(candidateHashes) == 0 { + return nil, errors.InvalidArgumentError("cannot sign because signing key shares no common algorithms with candidate hashes") + } + + return writeAndSign(noOpCloser{output}, candidateHashes, signed, hints, packet.SigTypeBinary, config) +} + +// signatureWriter hashes the contents of a message while passing it along to +// literalData. When closed, it closes literalData, writes a signature packet +// to encryptedData and then also closes encryptedData. +type signatureWriter struct { + encryptedData io.WriteCloser + literalData io.WriteCloser + hashType crypto.Hash + wrappedHash hash.Hash + h hash.Hash + signer *packet.PrivateKey + sigType packet.SignatureType + config *packet.Config + metadata *packet.LiteralData // V5 signatures protect document metadata +} + +func (s signatureWriter) Write(data []byte) (int, error) { + s.wrappedHash.Write(data) + switch s.sigType { + case packet.SigTypeBinary: + return s.literalData.Write(data) + case packet.SigTypeText: + flag := 0 + return writeCanonical(s.literalData, data, &flag) + } + return 0, errors.UnsupportedError("unsupported signature type: " + strconv.Itoa(int(s.sigType))) +} + +func (s signatureWriter) Close() error { + sig := &packet.Signature{ + Version: s.signer.Version, + SigType: s.sigType, + PubKeyAlgo: s.signer.PubKeyAlgo, + Hash: s.hashType, + CreationTime: s.config.Now(), + IssuerKeyId: &s.signer.KeyId, + Metadata: s.metadata, + } + + if err := sig.Sign(s.h, s.signer, s.config); err != nil { + return err + } + if err := s.literalData.Close(); err != nil { + return err + } + if err := sig.Serialize(s.encryptedData); err != nil { + return err + } + return s.encryptedData.Close() +} + +// noOpCloser is like an ioutil.NopCloser, but for an io.Writer. +// TODO: we have two of these in OpenPGP packages alone. This probably needs +// to be promoted somewhere more common. +type noOpCloser struct { + w io.Writer +} + +func (c noOpCloser) Write(data []byte) (n int, err error) { + return c.w.Write(data) +} + +func (c noOpCloser) Close() error { + return nil +} + +func handleCompression(compressed io.WriteCloser, candidateCompression []uint8, config *packet.Config) (data io.WriteCloser, err error) { + data = compressed + confAlgo := config.Compression() + if confAlgo == packet.CompressionNone { + return + } + finalAlgo := packet.CompressionNone + // if compression specified by config available we will use it + for _, c := range candidateCompression { + if uint8(confAlgo) == c { + finalAlgo = confAlgo + break + } + } + + if finalAlgo != packet.CompressionNone { + var compConfig *packet.CompressionConfig + if config != nil { + compConfig = config.CompressionConfig + } + data, err = packet.SerializeCompressed(compressed, finalAlgo, compConfig) + if err != nil { + return + } + } + return data, nil +} diff --git a/vendor/github.com/acomagu/bufpipe/README.md b/vendor/github.com/acomagu/bufpipe/README.md new file mode 100644 index 0000000000..19df083142 --- /dev/null +++ b/vendor/github.com/acomagu/bufpipe/README.md @@ -0,0 +1,42 @@ +# bufpipe: Buffered Pipe + +[![CircleCI](https://img.shields.io/circleci/build/github/acomagu/bufpipe.svg?style=flat-square)](https://circleci.com/gh/acomagu/bufpipe) [![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](https://godoc.org/github.com/acomagu/bufpipe) + +The buffered version of io.Pipe. It's safe for concurrent use. + +## How does it differ from io.Pipe? + +Writes never block because the pipe has variable-sized buffer. + +```Go +r, w := bufpipe.New(nil) +io.WriteString(w, "abc") // No blocking. +io.WriteString(w, "def") // No blocking, too. +w.Close() +io.Copy(os.Stdout, r) +// Output: abcdef +``` + +[Playground](https://play.golang.org/p/PdyBAS3pVob) + +## How does it differ from bytes.Buffer? + +Reads block if the internal buffer is empty until the writer is closed. + +```Go +r, w := bufpipe.New(nil) + +done := make(chan struct{}) +go func() { + io.Copy(os.Stdout, r) // The reads block until the writer is closed. + done <- struct{}{} +}() + +io.WriteString(w, "abc") +io.WriteString(w, "def") +w.Close() +<-done +// Output: abcdef +``` + +[Playground](https://play.golang.org/p/UppmyLeRgX6) diff --git a/vendor/github.com/acomagu/bufpipe/bufpipe.go b/vendor/github.com/acomagu/bufpipe/bufpipe.go new file mode 100644 index 0000000000..846dbcc290 --- /dev/null +++ b/vendor/github.com/acomagu/bufpipe/bufpipe.go @@ -0,0 +1,128 @@ +package bufpipe + +import ( + "bytes" + "errors" + "io" + "sync" +) + +// ErrClosedPipe is the error used for read or write operations on a closed pipe. +var ErrClosedPipe = errors.New("bufpipe: read/write on closed pipe") + +type pipe struct { + cond *sync.Cond + buf *bytes.Buffer + rerr, werr error +} + +// A PipeReader is the read half of a pipe. +type PipeReader struct { + *pipe +} + +// A PipeWriter is the write half of a pipe. +type PipeWriter struct { + *pipe +} + +// New creates a synchronous pipe using buf as its initial contents. It can be +// used to connect code expecting an io.Reader with code expecting an io.Writer. +// +// Unlike io.Pipe, writes never block because the internal buffer has variable +// size. Reads block only when the buffer is empty. +// +// It is safe to call Read and Write in parallel with each other or with Close. +// Parallel calls to Read and parallel calls to Write are also safe: the +// individual calls will be gated sequentially. +// +// The new pipe takes ownership of buf, and the caller should not use buf after +// this call. New is intended to prepare a PipeReader to read existing data. It +// can also be used to set the initial size of the internal buffer for writing. +// To do that, buf should have the desired capacity but a length of zero. +func New(buf []byte) (*PipeReader, *PipeWriter) { + p := &pipe{ + buf: bytes.NewBuffer(buf), + cond: sync.NewCond(new(sync.Mutex)), + } + return &PipeReader{ + pipe: p, + }, &PipeWriter{ + pipe: p, + } +} + +// Read implements the standard Read interface: it reads data from the pipe, +// reading from the internal buffer, otherwise blocking until a writer arrives +// or the write end is closed. If the write end is closed with an error, that +// error is returned as err; otherwise err is io.EOF. +func (r *PipeReader) Read(data []byte) (int, error) { + r.cond.L.Lock() + defer r.cond.L.Unlock() + +RETRY: + n, err := r.buf.Read(data) + // If not closed and no read, wait for writing. + if err == io.EOF && r.rerr == nil && n == 0 { + r.cond.Wait() + goto RETRY + } + if err == io.EOF { + return n, r.rerr + } + return n, err +} + +// Close closes the reader; subsequent writes from the write half of the pipe +// will return error ErrClosedPipe. +func (r *PipeReader) Close() error { + return r.CloseWithError(nil) +} + +// CloseWithError closes the reader; subsequent writes to the write half of the +// pipe will return the error err. +func (r *PipeReader) CloseWithError(err error) error { + r.cond.L.Lock() + defer r.cond.L.Unlock() + + if err == nil { + err = ErrClosedPipe + } + r.werr = err + return nil +} + +// Write implements the standard Write interface: it writes data to the internal +// buffer. If the read end is closed with an error, that err is returned as err; +// otherwise err is ErrClosedPipe. +func (w *PipeWriter) Write(data []byte) (int, error) { + w.cond.L.Lock() + defer w.cond.L.Unlock() + + if w.werr != nil { + return 0, w.werr + } + + n, err := w.buf.Write(data) + w.cond.Signal() + return n, err +} + +// Close closes the writer; subsequent reads from the read half of the pipe will +// return io.EOF once the internal buffer get empty. +func (w *PipeWriter) Close() error { + return w.CloseWithError(nil) +} + +// Close closes the writer; subsequent reads from the read half of the pipe will +// return err once the internal buffer get empty. +func (w *PipeWriter) CloseWithError(err error) error { + w.cond.L.Lock() + defer w.cond.L.Unlock() + + if err == nil { + err = io.EOF + } + w.rerr = err + return nil +} diff --git a/vendor/github.com/acomagu/bufpipe/doc.go b/vendor/github.com/acomagu/bufpipe/doc.go new file mode 100644 index 0000000000..16a3948001 --- /dev/null +++ b/vendor/github.com/acomagu/bufpipe/doc.go @@ -0,0 +1,2 @@ +// Package bufpipe provides a IO pipe, has variable-sized buffer. +package bufpipe diff --git a/vendor/github.com/acomagu/bufpipe/go.mod b/vendor/github.com/acomagu/bufpipe/go.mod new file mode 100644 index 0000000000..bab097a2f5 --- /dev/null +++ b/vendor/github.com/acomagu/bufpipe/go.mod @@ -0,0 +1,5 @@ +module github.com/acomagu/bufpipe + +go 1.12 + +require github.com/matryer/is v1.2.0 diff --git a/vendor/github.com/acomagu/bufpipe/go.sum b/vendor/github.com/acomagu/bufpipe/go.sum new file mode 100644 index 0000000000..6378c9bd6f --- /dev/null +++ b/vendor/github.com/acomagu/bufpipe/go.sum @@ -0,0 +1,2 @@ +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils.go index 8fc8763345..9c7d0a6cda 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils.go @@ -8,7 +8,7 @@ import ( "bytes" "errors" "fmt" - "math/bits" + "sort" "strconv" "strings" ) @@ -71,87 +71,59 @@ type hasher interface { hash() int } -const bitsPerWord = 64 - -func indexForBit(bit int) int { - return bit / bitsPerWord -} - -func wordForBit(data []uint64, bit int) uint64 { - idx := indexForBit(bit) - if idx >= len(data) { - return 0 - } - return data[idx] -} - -func maskForBit(bit int) uint64 { - return uint64(1) << (bit % bitsPerWord) -} - -func wordsNeeded(bit int) int { - return indexForBit(bit) + 1 -} - type BitSet struct { - data []uint64 + data map[int]bool } func NewBitSet() *BitSet { - return &BitSet{} + b := new(BitSet) + b.data = make(map[int]bool) + return b } func (b *BitSet) add(value int) { - idx := indexForBit(value) - if idx >= len(b.data) { - size := wordsNeeded(value) - data := make([]uint64, size) - copy(data, b.data) - b.data = data - } - b.data[idx] |= maskForBit(value) + b.data[value] = true } func (b *BitSet) clear(index int) { - idx := indexForBit(index) - if idx >= len(b.data) { - return - } - b.data[idx] &= ^maskForBit(index) + delete(b.data, index) } func (b *BitSet) or(set *BitSet) { - size := intMax(b.minLen(), set.minLen()) - if size > len(b.data) { - data := make([]uint64, size) - copy(data, b.data) - b.data = data - } - for i := 0; i < size; i++ { - b.data[i] |= set.data[i] + for k := range set.data { + b.add(k) } } func (b *BitSet) remove(value int) { - b.clear(value) + delete(b.data, value) } func (b *BitSet) contains(value int) bool { - idx := indexForBit(value) - if idx >= len(b.data) { - return false + return b.data[value] +} + +func (b *BitSet) values() []int { + ks := make([]int, len(b.data)) + i := 0 + for k := range b.data { + ks[i] = k + i++ } - return (b.data[idx] & maskForBit(value)) != 0 + sort.Ints(ks) + return ks } func (b *BitSet) minValue() int { - for i, v := range b.data { - if v == 0 { - continue + min := 2147483647 + + for k := range b.data { + if k < min { + min = k } - return i*bitsPerWord + bits.TrailingZeros64(v) } - return 2147483647 + + return min } func (b *BitSet) equals(other interface{}) bool { @@ -160,16 +132,12 @@ func (b *BitSet) equals(other interface{}) bool { return false } - if b == otherBitSet { - return true - } - if len(b.data) != len(otherBitSet.data) { return false } - for k := range b.data { - if b.data[k] != otherBitSet.data[k] { + for k, v := range b.data { + if otherBitSet.data[k] != v { return false } } @@ -177,35 +145,18 @@ func (b *BitSet) equals(other interface{}) bool { return true } -func (b *BitSet) minLen() int { - for i := len(b.data); i > 0; i-- { - if b.data[i-1] != 0 { - return i - } - } - return 0 -} - func (b *BitSet) length() int { - cnt := 0 - for _, val := range b.data { - cnt += bits.OnesCount64(val) - } - return cnt + return len(b.data) } func (b *BitSet) String() string { - vals := make([]string, 0, b.length()) + vals := b.values() + valsS := make([]string, len(vals)) - for i, v := range b.data { - for v != 0 { - n := bits.TrailingZeros64(v) - vals = append(vals, strconv.Itoa(i*bitsPerWord+n)) - v &= ^(uint64(1) << n) - } + for i, val := range vals { + valsS[i] = strconv.Itoa(val) } - - return "{" + strings.Join(vals, ", ") + "}" + return "{" + strings.Join(valsS, ", ") + "}" } type AltDict struct { diff --git a/vendor/github.com/coreos/go-semver/LICENSE b/vendor/github.com/coreos/go-semver/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/coreos/go-semver/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/coreos/go-semver/NOTICE b/vendor/github.com/coreos/go-semver/NOTICE new file mode 100644 index 0000000000..23a0ada2fb --- /dev/null +++ b/vendor/github.com/coreos/go-semver/NOTICE @@ -0,0 +1,5 @@ +CoreOS Project +Copyright 2018 CoreOS, Inc + +This product includes software developed at CoreOS, Inc. +(http://www.coreos.com/). diff --git a/vendor/github.com/coreos/go-semver/semver/semver.go b/vendor/github.com/coreos/go-semver/semver/semver.go new file mode 100644 index 0000000000..76cf4852c7 --- /dev/null +++ b/vendor/github.com/coreos/go-semver/semver/semver.go @@ -0,0 +1,296 @@ +// Copyright 2013-2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Semantic Versions http://semver.org +package semver + +import ( + "bytes" + "errors" + "fmt" + "regexp" + "strconv" + "strings" +) + +type Version struct { + Major int64 + Minor int64 + Patch int64 + PreRelease PreRelease + Metadata string +} + +type PreRelease string + +func splitOff(input *string, delim string) (val string) { + parts := strings.SplitN(*input, delim, 2) + + if len(parts) == 2 { + *input = parts[0] + val = parts[1] + } + + return val +} + +func New(version string) *Version { + return Must(NewVersion(version)) +} + +func NewVersion(version string) (*Version, error) { + v := Version{} + + if err := v.Set(version); err != nil { + return nil, err + } + + return &v, nil +} + +// Must is a helper for wrapping NewVersion and will panic if err is not nil. +func Must(v *Version, err error) *Version { + if err != nil { + panic(err) + } + return v +} + +// Set parses and updates v from the given version string. Implements flag.Value +func (v *Version) Set(version string) error { + metadata := splitOff(&version, "+") + preRelease := PreRelease(splitOff(&version, "-")) + dotParts := strings.SplitN(version, ".", 3) + + if len(dotParts) != 3 { + return fmt.Errorf("%s is not in dotted-tri format", version) + } + + if err := validateIdentifier(string(preRelease)); err != nil { + return fmt.Errorf("failed to validate pre-release: %v", err) + } + + if err := validateIdentifier(metadata); err != nil { + return fmt.Errorf("failed to validate metadata: %v", err) + } + + parsed := make([]int64, 3, 3) + + for i, v := range dotParts[:3] { + val, err := strconv.ParseInt(v, 10, 64) + parsed[i] = val + if err != nil { + return err + } + } + + v.Metadata = metadata + v.PreRelease = preRelease + v.Major = parsed[0] + v.Minor = parsed[1] + v.Patch = parsed[2] + return nil +} + +func (v Version) String() string { + var buffer bytes.Buffer + + fmt.Fprintf(&buffer, "%d.%d.%d", v.Major, v.Minor, v.Patch) + + if v.PreRelease != "" { + fmt.Fprintf(&buffer, "-%s", v.PreRelease) + } + + if v.Metadata != "" { + fmt.Fprintf(&buffer, "+%s", v.Metadata) + } + + return buffer.String() +} + +func (v *Version) UnmarshalYAML(unmarshal func(interface{}) error) error { + var data string + if err := unmarshal(&data); err != nil { + return err + } + return v.Set(data) +} + +func (v Version) MarshalJSON() ([]byte, error) { + return []byte(`"` + v.String() + `"`), nil +} + +func (v *Version) UnmarshalJSON(data []byte) error { + l := len(data) + if l == 0 || string(data) == `""` { + return nil + } + if l < 2 || data[0] != '"' || data[l-1] != '"' { + return errors.New("invalid semver string") + } + return v.Set(string(data[1 : l-1])) +} + +// Compare tests if v is less than, equal to, or greater than versionB, +// returning -1, 0, or +1 respectively. +func (v Version) Compare(versionB Version) int { + if cmp := recursiveCompare(v.Slice(), versionB.Slice()); cmp != 0 { + return cmp + } + return preReleaseCompare(v, versionB) +} + +// Equal tests if v is equal to versionB. +func (v Version) Equal(versionB Version) bool { + return v.Compare(versionB) == 0 +} + +// LessThan tests if v is less than versionB. +func (v Version) LessThan(versionB Version) bool { + return v.Compare(versionB) < 0 +} + +// Slice converts the comparable parts of the semver into a slice of integers. +func (v Version) Slice() []int64 { + return []int64{v.Major, v.Minor, v.Patch} +} + +func (p PreRelease) Slice() []string { + preRelease := string(p) + return strings.Split(preRelease, ".") +} + +func preReleaseCompare(versionA Version, versionB Version) int { + a := versionA.PreRelease + b := versionB.PreRelease + + /* Handle the case where if two versions are otherwise equal it is the + * one without a PreRelease that is greater */ + if len(a) == 0 && (len(b) > 0) { + return 1 + } else if len(b) == 0 && (len(a) > 0) { + return -1 + } + + // If there is a prerelease, check and compare each part. + return recursivePreReleaseCompare(a.Slice(), b.Slice()) +} + +func recursiveCompare(versionA []int64, versionB []int64) int { + if len(versionA) == 0 { + return 0 + } + + a := versionA[0] + b := versionB[0] + + if a > b { + return 1 + } else if a < b { + return -1 + } + + return recursiveCompare(versionA[1:], versionB[1:]) +} + +func recursivePreReleaseCompare(versionA []string, versionB []string) int { + // A larger set of pre-release fields has a higher precedence than a smaller set, + // if all of the preceding identifiers are equal. + if len(versionA) == 0 { + if len(versionB) > 0 { + return -1 + } + return 0 + } else if len(versionB) == 0 { + // We're longer than versionB so return 1. + return 1 + } + + a := versionA[0] + b := versionB[0] + + aInt := false + bInt := false + + aI, err := strconv.Atoi(versionA[0]) + if err == nil { + aInt = true + } + + bI, err := strconv.Atoi(versionB[0]) + if err == nil { + bInt = true + } + + // Numeric identifiers always have lower precedence than non-numeric identifiers. + if aInt && !bInt { + return -1 + } else if !aInt && bInt { + return 1 + } + + // Handle Integer Comparison + if aInt && bInt { + if aI > bI { + return 1 + } else if aI < bI { + return -1 + } + } + + // Handle String Comparison + if a > b { + return 1 + } else if a < b { + return -1 + } + + return recursivePreReleaseCompare(versionA[1:], versionB[1:]) +} + +// BumpMajor increments the Major field by 1 and resets all other fields to their default values +func (v *Version) BumpMajor() { + v.Major += 1 + v.Minor = 0 + v.Patch = 0 + v.PreRelease = PreRelease("") + v.Metadata = "" +} + +// BumpMinor increments the Minor field by 1 and resets all other fields to their default values +func (v *Version) BumpMinor() { + v.Minor += 1 + v.Patch = 0 + v.PreRelease = PreRelease("") + v.Metadata = "" +} + +// BumpPatch increments the Patch field by 1 and resets all other fields to their default values +func (v *Version) BumpPatch() { + v.Patch += 1 + v.PreRelease = PreRelease("") + v.Metadata = "" +} + +// validateIdentifier makes sure the provided identifier satisfies semver spec +func validateIdentifier(id string) error { + if id != "" && !reIdentifier.MatchString(id) { + return fmt.Errorf("%s is not a valid semver identifier", id) + } + return nil +} + +// reIdentifier is a regular expression used to check that pre-release and metadata +// identifiers satisfy the spec requirements +var reIdentifier = regexp.MustCompile(`^[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*$`) diff --git a/vendor/github.com/coreos/go-semver/semver/sort.go b/vendor/github.com/coreos/go-semver/semver/sort.go new file mode 100644 index 0000000000..e256b41a5d --- /dev/null +++ b/vendor/github.com/coreos/go-semver/semver/sort.go @@ -0,0 +1,38 @@ +// Copyright 2013-2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package semver + +import ( + "sort" +) + +type Versions []*Version + +func (s Versions) Len() int { + return len(s) +} + +func (s Versions) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s Versions) Less(i, j int) bool { + return s[i].LessThan(*s[j]) +} + +// Sort sorts the given slice of Version +func Sort(versions []*Version) { + sort.Sort(Versions(versions)) +} diff --git a/vendor/github.com/emirpasic/gods/LICENSE b/vendor/github.com/emirpasic/gods/LICENSE new file mode 100644 index 0000000000..e5e449b6ec --- /dev/null +++ b/vendor/github.com/emirpasic/gods/LICENSE @@ -0,0 +1,41 @@ +Copyright (c) 2015, Emir Pasic +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- + +AVL Tree: + +Copyright (c) 2017 Benjamin Scher Purcell + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/emirpasic/gods/containers/containers.go b/vendor/github.com/emirpasic/gods/containers/containers.go new file mode 100644 index 0000000000..c35ab36d2c --- /dev/null +++ b/vendor/github.com/emirpasic/gods/containers/containers.go @@ -0,0 +1,35 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package containers provides core interfaces and functions for data structures. +// +// Container is the base interface for all data structures to implement. +// +// Iterators provide stateful iterators. +// +// Enumerable provides Ruby inspired (each, select, map, find, any?, etc.) container functions. +// +// Serialization provides serializers (marshalers) and deserializers (unmarshalers). +package containers + +import "github.com/emirpasic/gods/utils" + +// Container is base interface that all data structures implement. +type Container interface { + Empty() bool + Size() int + Clear() + Values() []interface{} +} + +// GetSortedValues returns sorted container's elements with respect to the passed comparator. +// Does not effect the ordering of elements within the container. +func GetSortedValues(container Container, comparator utils.Comparator) []interface{} { + values := container.Values() + if len(values) < 2 { + return values + } + utils.Sort(values, comparator) + return values +} diff --git a/vendor/github.com/emirpasic/gods/containers/enumerable.go b/vendor/github.com/emirpasic/gods/containers/enumerable.go new file mode 100644 index 0000000000..ac48b54531 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/containers/enumerable.go @@ -0,0 +1,61 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package containers + +// EnumerableWithIndex provides functions for ordered containers whose values can be fetched by an index. +type EnumerableWithIndex interface { + // Each calls the given function once for each element, passing that element's index and value. + Each(func(index int, value interface{})) + + // Map invokes the given function once for each element and returns a + // container containing the values returned by the given function. + // TODO would appreciate help on how to enforce this in containers (don't want to type assert when chaining) + // Map(func(index int, value interface{}) interface{}) Container + + // Select returns a new container containing all elements for which the given function returns a true value. + // TODO need help on how to enforce this in containers (don't want to type assert when chaining) + // Select(func(index int, value interface{}) bool) Container + + // Any passes each element of the container to the given function and + // returns true if the function ever returns true for any element. + Any(func(index int, value interface{}) bool) bool + + // All passes each element of the container to the given function and + // returns true if the function returns true for all elements. + All(func(index int, value interface{}) bool) bool + + // Find passes each element of the container to the given function and returns + // the first (index,value) for which the function is true or -1,nil otherwise + // if no element matches the criteria. + Find(func(index int, value interface{}) bool) (int, interface{}) +} + +// EnumerableWithKey provides functions for ordered containers whose values whose elements are key/value pairs. +type EnumerableWithKey interface { + // Each calls the given function once for each element, passing that element's key and value. + Each(func(key interface{}, value interface{})) + + // Map invokes the given function once for each element and returns a container + // containing the values returned by the given function as key/value pairs. + // TODO need help on how to enforce this in containers (don't want to type assert when chaining) + // Map(func(key interface{}, value interface{}) (interface{}, interface{})) Container + + // Select returns a new container containing all elements for which the given function returns a true value. + // TODO need help on how to enforce this in containers (don't want to type assert when chaining) + // Select(func(key interface{}, value interface{}) bool) Container + + // Any passes each element of the container to the given function and + // returns true if the function ever returns true for any element. + Any(func(key interface{}, value interface{}) bool) bool + + // All passes each element of the container to the given function and + // returns true if the function returns true for all elements. + All(func(key interface{}, value interface{}) bool) bool + + // Find passes each element of the container to the given function and returns + // the first (key,value) for which the function is true or nil,nil otherwise if no element + // matches the criteria. + Find(func(key interface{}, value interface{}) bool) (interface{}, interface{}) +} diff --git a/vendor/github.com/emirpasic/gods/containers/iterator.go b/vendor/github.com/emirpasic/gods/containers/iterator.go new file mode 100644 index 0000000000..f1a52a365a --- /dev/null +++ b/vendor/github.com/emirpasic/gods/containers/iterator.go @@ -0,0 +1,109 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package containers + +// IteratorWithIndex is stateful iterator for ordered containers whose values can be fetched by an index. +type IteratorWithIndex interface { + // Next moves the iterator to the next element and returns true if there was a next element in the container. + // If Next() returns true, then next element's index and value can be retrieved by Index() and Value(). + // If Next() was called for the first time, then it will point the iterator to the first element if it exists. + // Modifies the state of the iterator. + Next() bool + + // Value returns the current element's value. + // Does not modify the state of the iterator. + Value() interface{} + + // Index returns the current element's index. + // Does not modify the state of the iterator. + Index() int + + // Begin resets the iterator to its initial state (one-before-first) + // Call Next() to fetch the first element if any. + Begin() + + // First moves the iterator to the first element and returns true if there was a first element in the container. + // If First() returns true, then first element's index and value can be retrieved by Index() and Value(). + // Modifies the state of the iterator. + First() bool +} + +// IteratorWithKey is a stateful iterator for ordered containers whose elements are key value pairs. +type IteratorWithKey interface { + // Next moves the iterator to the next element and returns true if there was a next element in the container. + // If Next() returns true, then next element's key and value can be retrieved by Key() and Value(). + // If Next() was called for the first time, then it will point the iterator to the first element if it exists. + // Modifies the state of the iterator. + Next() bool + + // Value returns the current element's value. + // Does not modify the state of the iterator. + Value() interface{} + + // Key returns the current element's key. + // Does not modify the state of the iterator. + Key() interface{} + + // Begin resets the iterator to its initial state (one-before-first) + // Call Next() to fetch the first element if any. + Begin() + + // First moves the iterator to the first element and returns true if there was a first element in the container. + // If First() returns true, then first element's key and value can be retrieved by Key() and Value(). + // Modifies the state of the iterator. + First() bool +} + +// ReverseIteratorWithIndex is stateful iterator for ordered containers whose values can be fetched by an index. +// +// Essentially it is the same as IteratorWithIndex, but provides additional: +// +// Prev() function to enable traversal in reverse +// +// Last() function to move the iterator to the last element. +// +// End() function to move the iterator past the last element (one-past-the-end). +type ReverseIteratorWithIndex interface { + // Prev moves the iterator to the previous element and returns true if there was a previous element in the container. + // If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value(). + // Modifies the state of the iterator. + Prev() bool + + // End moves the iterator past the last element (one-past-the-end). + // Call Prev() to fetch the last element if any. + End() + + // Last moves the iterator to the last element and returns true if there was a last element in the container. + // If Last() returns true, then last element's index and value can be retrieved by Index() and Value(). + // Modifies the state of the iterator. + Last() bool + + IteratorWithIndex +} + +// ReverseIteratorWithKey is a stateful iterator for ordered containers whose elements are key value pairs. +// +// Essentially it is the same as IteratorWithKey, but provides additional: +// +// Prev() function to enable traversal in reverse +// +// Last() function to move the iterator to the last element. +type ReverseIteratorWithKey interface { + // Prev moves the iterator to the previous element and returns true if there was a previous element in the container. + // If Prev() returns true, then previous element's key and value can be retrieved by Key() and Value(). + // Modifies the state of the iterator. + Prev() bool + + // End moves the iterator past the last element (one-past-the-end). + // Call Prev() to fetch the last element if any. + End() + + // Last moves the iterator to the last element and returns true if there was a last element in the container. + // If Last() returns true, then last element's key and value can be retrieved by Key() and Value(). + // Modifies the state of the iterator. + Last() bool + + IteratorWithKey +} diff --git a/vendor/github.com/emirpasic/gods/containers/serialization.go b/vendor/github.com/emirpasic/gods/containers/serialization.go new file mode 100644 index 0000000000..d7c90c83a0 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/containers/serialization.go @@ -0,0 +1,17 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package containers + +// JSONSerializer provides JSON serialization +type JSONSerializer interface { + // ToJSON outputs the JSON representation of containers's elements. + ToJSON() ([]byte, error) +} + +// JSONDeserializer provides JSON deserialization +type JSONDeserializer interface { + // FromJSON populates containers's elements from the input JSON representation. + FromJSON([]byte) error +} diff --git a/vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go b/vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go new file mode 100644 index 0000000000..bfedac9eef --- /dev/null +++ b/vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go @@ -0,0 +1,228 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package arraylist implements the array list. +// +// Structure is not thread safe. +// +// Reference: https://en.wikipedia.org/wiki/List_%28abstract_data_type%29 +package arraylist + +import ( + "fmt" + "strings" + + "github.com/emirpasic/gods/lists" + "github.com/emirpasic/gods/utils" +) + +func assertListImplementation() { + var _ lists.List = (*List)(nil) +} + +// List holds the elements in a slice +type List struct { + elements []interface{} + size int +} + +const ( + growthFactor = float32(2.0) // growth by 100% + shrinkFactor = float32(0.25) // shrink when size is 25% of capacity (0 means never shrink) +) + +// New instantiates a new list and adds the passed values, if any, to the list +func New(values ...interface{}) *List { + list := &List{} + if len(values) > 0 { + list.Add(values...) + } + return list +} + +// Add appends a value at the end of the list +func (list *List) Add(values ...interface{}) { + list.growBy(len(values)) + for _, value := range values { + list.elements[list.size] = value + list.size++ + } +} + +// Get returns the element at index. +// Second return parameter is true if index is within bounds of the array and array is not empty, otherwise false. +func (list *List) Get(index int) (interface{}, bool) { + + if !list.withinRange(index) { + return nil, false + } + + return list.elements[index], true +} + +// Remove removes the element at the given index from the list. +func (list *List) Remove(index int) { + + if !list.withinRange(index) { + return + } + + list.elements[index] = nil // cleanup reference + copy(list.elements[index:], list.elements[index+1:list.size]) // shift to the left by one (slow operation, need ways to optimize this) + list.size-- + + list.shrink() +} + +// Contains checks if elements (one or more) are present in the set. +// All elements have to be present in the set for the method to return true. +// Performance time complexity of n^2. +// Returns true if no arguments are passed at all, i.e. set is always super-set of empty set. +func (list *List) Contains(values ...interface{}) bool { + + for _, searchValue := range values { + found := false + for _, element := range list.elements { + if element == searchValue { + found = true + break + } + } + if !found { + return false + } + } + return true +} + +// Values returns all elements in the list. +func (list *List) Values() []interface{} { + newElements := make([]interface{}, list.size, list.size) + copy(newElements, list.elements[:list.size]) + return newElements +} + +//IndexOf returns index of provided element +func (list *List) IndexOf(value interface{}) int { + if list.size == 0 { + return -1 + } + for index, element := range list.elements { + if element == value { + return index + } + } + return -1 +} + +// Empty returns true if list does not contain any elements. +func (list *List) Empty() bool { + return list.size == 0 +} + +// Size returns number of elements within the list. +func (list *List) Size() int { + return list.size +} + +// Clear removes all elements from the list. +func (list *List) Clear() { + list.size = 0 + list.elements = []interface{}{} +} + +// Sort sorts values (in-place) using. +func (list *List) Sort(comparator utils.Comparator) { + if len(list.elements) < 2 { + return + } + utils.Sort(list.elements[:list.size], comparator) +} + +// Swap swaps the two values at the specified positions. +func (list *List) Swap(i, j int) { + if list.withinRange(i) && list.withinRange(j) { + list.elements[i], list.elements[j] = list.elements[j], list.elements[i] + } +} + +// Insert inserts values at specified index position shifting the value at that position (if any) and any subsequent elements to the right. +// Does not do anything if position is negative or bigger than list's size +// Note: position equal to list's size is valid, i.e. append. +func (list *List) Insert(index int, values ...interface{}) { + + if !list.withinRange(index) { + // Append + if index == list.size { + list.Add(values...) + } + return + } + + l := len(values) + list.growBy(l) + list.size += l + copy(list.elements[index+l:], list.elements[index:list.size-l]) + copy(list.elements[index:], values) +} + +// Set the value at specified index +// Does not do anything if position is negative or bigger than list's size +// Note: position equal to list's size is valid, i.e. append. +func (list *List) Set(index int, value interface{}) { + + if !list.withinRange(index) { + // Append + if index == list.size { + list.Add(value) + } + return + } + + list.elements[index] = value +} + +// String returns a string representation of container +func (list *List) String() string { + str := "ArrayList\n" + values := []string{} + for _, value := range list.elements[:list.size] { + values = append(values, fmt.Sprintf("%v", value)) + } + str += strings.Join(values, ", ") + return str +} + +// Check that the index is within bounds of the list +func (list *List) withinRange(index int) bool { + return index >= 0 && index < list.size +} + +func (list *List) resize(cap int) { + newElements := make([]interface{}, cap, cap) + copy(newElements, list.elements) + list.elements = newElements +} + +// Expand the array if necessary, i.e. capacity will be reached if we add n elements +func (list *List) growBy(n int) { + // When capacity is reached, grow by a factor of growthFactor and add number of elements + currentCapacity := cap(list.elements) + if list.size+n >= currentCapacity { + newCapacity := int(growthFactor * float32(currentCapacity+n)) + list.resize(newCapacity) + } +} + +// Shrink the array if necessary, i.e. when size is shrinkFactor percent of current capacity +func (list *List) shrink() { + if shrinkFactor == 0.0 { + return + } + // Shrink when size is at shrinkFactor * capacity + currentCapacity := cap(list.elements) + if list.size <= int(float32(currentCapacity)*shrinkFactor) { + list.resize(list.size) + } +} diff --git a/vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go b/vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go new file mode 100644 index 0000000000..b3a8738825 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go @@ -0,0 +1,79 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package arraylist + +import "github.com/emirpasic/gods/containers" + +func assertEnumerableImplementation() { + var _ containers.EnumerableWithIndex = (*List)(nil) +} + +// Each calls the given function once for each element, passing that element's index and value. +func (list *List) Each(f func(index int, value interface{})) { + iterator := list.Iterator() + for iterator.Next() { + f(iterator.Index(), iterator.Value()) + } +} + +// Map invokes the given function once for each element and returns a +// container containing the values returned by the given function. +func (list *List) Map(f func(index int, value interface{}) interface{}) *List { + newList := &List{} + iterator := list.Iterator() + for iterator.Next() { + newList.Add(f(iterator.Index(), iterator.Value())) + } + return newList +} + +// Select returns a new container containing all elements for which the given function returns a true value. +func (list *List) Select(f func(index int, value interface{}) bool) *List { + newList := &List{} + iterator := list.Iterator() + for iterator.Next() { + if f(iterator.Index(), iterator.Value()) { + newList.Add(iterator.Value()) + } + } + return newList +} + +// Any passes each element of the collection to the given function and +// returns true if the function ever returns true for any element. +func (list *List) Any(f func(index int, value interface{}) bool) bool { + iterator := list.Iterator() + for iterator.Next() { + if f(iterator.Index(), iterator.Value()) { + return true + } + } + return false +} + +// All passes each element of the collection to the given function and +// returns true if the function returns true for all elements. +func (list *List) All(f func(index int, value interface{}) bool) bool { + iterator := list.Iterator() + for iterator.Next() { + if !f(iterator.Index(), iterator.Value()) { + return false + } + } + return true +} + +// Find passes each element of the container to the given function and returns +// the first (index,value) for which the function is true or -1,nil otherwise +// if no element matches the criteria. +func (list *List) Find(f func(index int, value interface{}) bool) (int, interface{}) { + iterator := list.Iterator() + for iterator.Next() { + if f(iterator.Index(), iterator.Value()) { + return iterator.Index(), iterator.Value() + } + } + return -1, nil +} diff --git a/vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go b/vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go new file mode 100644 index 0000000000..38a93f3a8f --- /dev/null +++ b/vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go @@ -0,0 +1,83 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package arraylist + +import "github.com/emirpasic/gods/containers" + +func assertIteratorImplementation() { + var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil) +} + +// Iterator holding the iterator's state +type Iterator struct { + list *List + index int +} + +// Iterator returns a stateful iterator whose values can be fetched by an index. +func (list *List) Iterator() Iterator { + return Iterator{list: list, index: -1} +} + +// Next moves the iterator to the next element and returns true if there was a next element in the container. +// If Next() returns true, then next element's index and value can be retrieved by Index() and Value(). +// If Next() was called for the first time, then it will point the iterator to the first element if it exists. +// Modifies the state of the iterator. +func (iterator *Iterator) Next() bool { + if iterator.index < iterator.list.size { + iterator.index++ + } + return iterator.list.withinRange(iterator.index) +} + +// Prev moves the iterator to the previous element and returns true if there was a previous element in the container. +// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value(). +// Modifies the state of the iterator. +func (iterator *Iterator) Prev() bool { + if iterator.index >= 0 { + iterator.index-- + } + return iterator.list.withinRange(iterator.index) +} + +// Value returns the current element's value. +// Does not modify the state of the iterator. +func (iterator *Iterator) Value() interface{} { + return iterator.list.elements[iterator.index] +} + +// Index returns the current element's index. +// Does not modify the state of the iterator. +func (iterator *Iterator) Index() int { + return iterator.index +} + +// Begin resets the iterator to its initial state (one-before-first) +// Call Next() to fetch the first element if any. +func (iterator *Iterator) Begin() { + iterator.index = -1 +} + +// End moves the iterator past the last element (one-past-the-end). +// Call Prev() to fetch the last element if any. +func (iterator *Iterator) End() { + iterator.index = iterator.list.size +} + +// First moves the iterator to the first element and returns true if there was a first element in the container. +// If First() returns true, then first element's index and value can be retrieved by Index() and Value(). +// Modifies the state of the iterator. +func (iterator *Iterator) First() bool { + iterator.Begin() + return iterator.Next() +} + +// Last moves the iterator to the last element and returns true if there was a last element in the container. +// If Last() returns true, then last element's index and value can be retrieved by Index() and Value(). +// Modifies the state of the iterator. +func (iterator *Iterator) Last() bool { + iterator.End() + return iterator.Prev() +} diff --git a/vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go b/vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go new file mode 100644 index 0000000000..2f283fb97d --- /dev/null +++ b/vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go @@ -0,0 +1,29 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package arraylist + +import ( + "encoding/json" + "github.com/emirpasic/gods/containers" +) + +func assertSerializationImplementation() { + var _ containers.JSONSerializer = (*List)(nil) + var _ containers.JSONDeserializer = (*List)(nil) +} + +// ToJSON outputs the JSON representation of list's elements. +func (list *List) ToJSON() ([]byte, error) { + return json.Marshal(list.elements[:list.size]) +} + +// FromJSON populates list's elements from the input JSON representation. +func (list *List) FromJSON(data []byte) error { + err := json.Unmarshal(data, &list.elements) + if err == nil { + list.size = len(list.elements) + } + return err +} diff --git a/vendor/github.com/emirpasic/gods/lists/lists.go b/vendor/github.com/emirpasic/gods/lists/lists.go new file mode 100644 index 0000000000..1f6bb08e94 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/lists/lists.go @@ -0,0 +1,33 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package lists provides an abstract List interface. +// +// In computer science, a list or sequence is an abstract data type that represents an ordered sequence of values, where the same value may occur more than once. An instance of a list is a computer representation of the mathematical concept of a finite sequence; the (potentially) infinite analog of a list is a stream. Lists are a basic example of containers, as they contain other values. If the same value occurs multiple times, each occurrence is considered a distinct item. +// +// Reference: https://en.wikipedia.org/wiki/List_%28abstract_data_type%29 +package lists + +import ( + "github.com/emirpasic/gods/containers" + "github.com/emirpasic/gods/utils" +) + +// List interface that all lists implement +type List interface { + Get(index int) (interface{}, bool) + Remove(index int) + Add(values ...interface{}) + Contains(values ...interface{}) bool + Sort(comparator utils.Comparator) + Swap(index1, index2 int) + Insert(index int, values ...interface{}) + Set(index int, value interface{}) + + containers.Container + // Empty() bool + // Size() int + // Clear() + // Values() []interface{} +} diff --git a/vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go b/vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go new file mode 100644 index 0000000000..70b28cf52d --- /dev/null +++ b/vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go @@ -0,0 +1,163 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package binaryheap implements a binary heap backed by array list. +// +// Comparator defines this heap as either min or max heap. +// +// Structure is not thread safe. +// +// References: http://en.wikipedia.org/wiki/Binary_heap +package binaryheap + +import ( + "fmt" + "github.com/emirpasic/gods/lists/arraylist" + "github.com/emirpasic/gods/trees" + "github.com/emirpasic/gods/utils" + "strings" +) + +func assertTreeImplementation() { + var _ trees.Tree = (*Heap)(nil) +} + +// Heap holds elements in an array-list +type Heap struct { + list *arraylist.List + Comparator utils.Comparator +} + +// NewWith instantiates a new empty heap tree with the custom comparator. +func NewWith(comparator utils.Comparator) *Heap { + return &Heap{list: arraylist.New(), Comparator: comparator} +} + +// NewWithIntComparator instantiates a new empty heap with the IntComparator, i.e. elements are of type int. +func NewWithIntComparator() *Heap { + return &Heap{list: arraylist.New(), Comparator: utils.IntComparator} +} + +// NewWithStringComparator instantiates a new empty heap with the StringComparator, i.e. elements are of type string. +func NewWithStringComparator() *Heap { + return &Heap{list: arraylist.New(), Comparator: utils.StringComparator} +} + +// Push adds a value onto the heap and bubbles it up accordingly. +func (heap *Heap) Push(values ...interface{}) { + if len(values) == 1 { + heap.list.Add(values[0]) + heap.bubbleUp() + } else { + // Reference: https://en.wikipedia.org/wiki/Binary_heap#Building_a_heap + for _, value := range values { + heap.list.Add(value) + } + size := heap.list.Size()/2 + 1 + for i := size; i >= 0; i-- { + heap.bubbleDownIndex(i) + } + } +} + +// Pop removes top element on heap and returns it, or nil if heap is empty. +// Second return parameter is true, unless the heap was empty and there was nothing to pop. +func (heap *Heap) Pop() (value interface{}, ok bool) { + value, ok = heap.list.Get(0) + if !ok { + return + } + lastIndex := heap.list.Size() - 1 + heap.list.Swap(0, lastIndex) + heap.list.Remove(lastIndex) + heap.bubbleDown() + return +} + +// Peek returns top element on the heap without removing it, or nil if heap is empty. +// Second return parameter is true, unless the heap was empty and there was nothing to peek. +func (heap *Heap) Peek() (value interface{}, ok bool) { + return heap.list.Get(0) +} + +// Empty returns true if heap does not contain any elements. +func (heap *Heap) Empty() bool { + return heap.list.Empty() +} + +// Size returns number of elements within the heap. +func (heap *Heap) Size() int { + return heap.list.Size() +} + +// Clear removes all elements from the heap. +func (heap *Heap) Clear() { + heap.list.Clear() +} + +// Values returns all elements in the heap. +func (heap *Heap) Values() []interface{} { + return heap.list.Values() +} + +// String returns a string representation of container +func (heap *Heap) String() string { + str := "BinaryHeap\n" + values := []string{} + for _, value := range heap.list.Values() { + values = append(values, fmt.Sprintf("%v", value)) + } + str += strings.Join(values, ", ") + return str +} + +// Performs the "bubble down" operation. This is to place the element that is at the root +// of the heap in its correct place so that the heap maintains the min/max-heap order property. +func (heap *Heap) bubbleDown() { + heap.bubbleDownIndex(0) +} + +// Performs the "bubble down" operation. This is to place the element that is at the index +// of the heap in its correct place so that the heap maintains the min/max-heap order property. +func (heap *Heap) bubbleDownIndex(index int) { + size := heap.list.Size() + for leftIndex := index<<1 + 1; leftIndex < size; leftIndex = index<<1 + 1 { + rightIndex := index<<1 + 2 + smallerIndex := leftIndex + leftValue, _ := heap.list.Get(leftIndex) + rightValue, _ := heap.list.Get(rightIndex) + if rightIndex < size && heap.Comparator(leftValue, rightValue) > 0 { + smallerIndex = rightIndex + } + indexValue, _ := heap.list.Get(index) + smallerValue, _ := heap.list.Get(smallerIndex) + if heap.Comparator(indexValue, smallerValue) > 0 { + heap.list.Swap(index, smallerIndex) + } else { + break + } + index = smallerIndex + } +} + +// Performs the "bubble up" operation. This is to place a newly inserted +// element (i.e. last element in the list) in its correct place so that +// the heap maintains the min/max-heap order property. +func (heap *Heap) bubbleUp() { + index := heap.list.Size() - 1 + for parentIndex := (index - 1) >> 1; index > 0; parentIndex = (index - 1) >> 1 { + indexValue, _ := heap.list.Get(index) + parentValue, _ := heap.list.Get(parentIndex) + if heap.Comparator(parentValue, indexValue) <= 0 { + break + } + heap.list.Swap(index, parentIndex) + index = parentIndex + } +} + +// Check that the index is within bounds of the list +func (heap *Heap) withinRange(index int) bool { + return index >= 0 && index < heap.list.Size() +} diff --git a/vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go b/vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go new file mode 100644 index 0000000000..beeb8d7013 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go @@ -0,0 +1,84 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package binaryheap + +import "github.com/emirpasic/gods/containers" + +func assertIteratorImplementation() { + var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil) +} + +// Iterator returns a stateful iterator whose values can be fetched by an index. +type Iterator struct { + heap *Heap + index int +} + +// Iterator returns a stateful iterator whose values can be fetched by an index. +func (heap *Heap) Iterator() Iterator { + return Iterator{heap: heap, index: -1} +} + +// Next moves the iterator to the next element and returns true if there was a next element in the container. +// If Next() returns true, then next element's index and value can be retrieved by Index() and Value(). +// If Next() was called for the first time, then it will point the iterator to the first element if it exists. +// Modifies the state of the iterator. +func (iterator *Iterator) Next() bool { + if iterator.index < iterator.heap.Size() { + iterator.index++ + } + return iterator.heap.withinRange(iterator.index) +} + +// Prev moves the iterator to the previous element and returns true if there was a previous element in the container. +// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value(). +// Modifies the state of the iterator. +func (iterator *Iterator) Prev() bool { + if iterator.index >= 0 { + iterator.index-- + } + return iterator.heap.withinRange(iterator.index) +} + +// Value returns the current element's value. +// Does not modify the state of the iterator. +func (iterator *Iterator) Value() interface{} { + value, _ := iterator.heap.list.Get(iterator.index) + return value +} + +// Index returns the current element's index. +// Does not modify the state of the iterator. +func (iterator *Iterator) Index() int { + return iterator.index +} + +// Begin resets the iterator to its initial state (one-before-first) +// Call Next() to fetch the first element if any. +func (iterator *Iterator) Begin() { + iterator.index = -1 +} + +// End moves the iterator past the last element (one-past-the-end). +// Call Prev() to fetch the last element if any. +func (iterator *Iterator) End() { + iterator.index = iterator.heap.Size() +} + +// First moves the iterator to the first element and returns true if there was a first element in the container. +// If First() returns true, then first element's index and value can be retrieved by Index() and Value(). +// Modifies the state of the iterator. +func (iterator *Iterator) First() bool { + iterator.Begin() + return iterator.Next() +} + +// Last moves the iterator to the last element and returns true if there was a last element in the container. +// If Last() returns true, then last element's index and value can be retrieved by Index() and Value(). +// Modifies the state of the iterator. +func (iterator *Iterator) Last() bool { + iterator.End() + return iterator.Prev() +} diff --git a/vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go b/vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go new file mode 100644 index 0000000000..00d0c7719c --- /dev/null +++ b/vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go @@ -0,0 +1,22 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package binaryheap + +import "github.com/emirpasic/gods/containers" + +func assertSerializationImplementation() { + var _ containers.JSONSerializer = (*Heap)(nil) + var _ containers.JSONDeserializer = (*Heap)(nil) +} + +// ToJSON outputs the JSON representation of the heap. +func (heap *Heap) ToJSON() ([]byte, error) { + return heap.list.ToJSON() +} + +// FromJSON populates the heap from the input JSON representation. +func (heap *Heap) FromJSON(data []byte) error { + return heap.list.FromJSON(data) +} diff --git a/vendor/github.com/emirpasic/gods/trees/trees.go b/vendor/github.com/emirpasic/gods/trees/trees.go new file mode 100644 index 0000000000..a5a7427d34 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/trees/trees.go @@ -0,0 +1,21 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package trees provides an abstract Tree interface. +// +// In computer science, a tree is a widely used abstract data type (ADT) or data structure implementing this ADT that simulates a hierarchical tree structure, with a root value and subtrees of children with a parent node, represented as a set of linked nodes. +// +// Reference: https://en.wikipedia.org/wiki/Tree_%28data_structure%29 +package trees + +import "github.com/emirpasic/gods/containers" + +// Tree interface that all trees implement +type Tree interface { + containers.Container + // Empty() bool + // Size() int + // Clear() + // Values() []interface{} +} diff --git a/vendor/github.com/emirpasic/gods/utils/comparator.go b/vendor/github.com/emirpasic/gods/utils/comparator.go new file mode 100644 index 0000000000..6a9afbf346 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/utils/comparator.go @@ -0,0 +1,251 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package utils + +import "time" + +// Comparator will make type assertion (see IntComparator for example), +// which will panic if a or b are not of the asserted type. +// +// Should return a number: +// negative , if a < b +// zero , if a == b +// positive , if a > b +type Comparator func(a, b interface{}) int + +// StringComparator provides a fast comparison on strings +func StringComparator(a, b interface{}) int { + s1 := a.(string) + s2 := b.(string) + min := len(s2) + if len(s1) < len(s2) { + min = len(s1) + } + diff := 0 + for i := 0; i < min && diff == 0; i++ { + diff = int(s1[i]) - int(s2[i]) + } + if diff == 0 { + diff = len(s1) - len(s2) + } + if diff < 0 { + return -1 + } + if diff > 0 { + return 1 + } + return 0 +} + +// IntComparator provides a basic comparison on int +func IntComparator(a, b interface{}) int { + aAsserted := a.(int) + bAsserted := b.(int) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// Int8Comparator provides a basic comparison on int8 +func Int8Comparator(a, b interface{}) int { + aAsserted := a.(int8) + bAsserted := b.(int8) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// Int16Comparator provides a basic comparison on int16 +func Int16Comparator(a, b interface{}) int { + aAsserted := a.(int16) + bAsserted := b.(int16) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// Int32Comparator provides a basic comparison on int32 +func Int32Comparator(a, b interface{}) int { + aAsserted := a.(int32) + bAsserted := b.(int32) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// Int64Comparator provides a basic comparison on int64 +func Int64Comparator(a, b interface{}) int { + aAsserted := a.(int64) + bAsserted := b.(int64) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// UIntComparator provides a basic comparison on uint +func UIntComparator(a, b interface{}) int { + aAsserted := a.(uint) + bAsserted := b.(uint) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// UInt8Comparator provides a basic comparison on uint8 +func UInt8Comparator(a, b interface{}) int { + aAsserted := a.(uint8) + bAsserted := b.(uint8) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// UInt16Comparator provides a basic comparison on uint16 +func UInt16Comparator(a, b interface{}) int { + aAsserted := a.(uint16) + bAsserted := b.(uint16) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// UInt32Comparator provides a basic comparison on uint32 +func UInt32Comparator(a, b interface{}) int { + aAsserted := a.(uint32) + bAsserted := b.(uint32) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// UInt64Comparator provides a basic comparison on uint64 +func UInt64Comparator(a, b interface{}) int { + aAsserted := a.(uint64) + bAsserted := b.(uint64) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// Float32Comparator provides a basic comparison on float32 +func Float32Comparator(a, b interface{}) int { + aAsserted := a.(float32) + bAsserted := b.(float32) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// Float64Comparator provides a basic comparison on float64 +func Float64Comparator(a, b interface{}) int { + aAsserted := a.(float64) + bAsserted := b.(float64) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// ByteComparator provides a basic comparison on byte +func ByteComparator(a, b interface{}) int { + aAsserted := a.(byte) + bAsserted := b.(byte) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// RuneComparator provides a basic comparison on rune +func RuneComparator(a, b interface{}) int { + aAsserted := a.(rune) + bAsserted := b.(rune) + switch { + case aAsserted > bAsserted: + return 1 + case aAsserted < bAsserted: + return -1 + default: + return 0 + } +} + +// TimeComparator provides a basic comparison on time.Time +func TimeComparator(a, b interface{}) int { + aAsserted := a.(time.Time) + bAsserted := b.(time.Time) + + switch { + case aAsserted.After(bAsserted): + return 1 + case aAsserted.Before(bAsserted): + return -1 + default: + return 0 + } +} diff --git a/vendor/github.com/emirpasic/gods/utils/sort.go b/vendor/github.com/emirpasic/gods/utils/sort.go new file mode 100644 index 0000000000..79ced1f5d2 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/utils/sort.go @@ -0,0 +1,29 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package utils + +import "sort" + +// Sort sorts values (in-place) with respect to the given comparator. +// +// Uses Go's sort (hybrid of quicksort for large and then insertion sort for smaller slices). +func Sort(values []interface{}, comparator Comparator) { + sort.Sort(sortable{values, comparator}) +} + +type sortable struct { + values []interface{} + comparator Comparator +} + +func (s sortable) Len() int { + return len(s.values) +} +func (s sortable) Swap(i, j int) { + s.values[i], s.values[j] = s.values[j], s.values[i] +} +func (s sortable) Less(i, j int) bool { + return s.comparator(s.values[i], s.values[j]) < 0 +} diff --git a/vendor/github.com/emirpasic/gods/utils/utils.go b/vendor/github.com/emirpasic/gods/utils/utils.go new file mode 100644 index 0000000000..1ad49cbc07 --- /dev/null +++ b/vendor/github.com/emirpasic/gods/utils/utils.go @@ -0,0 +1,47 @@ +// Copyright (c) 2015, Emir Pasic. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package utils provides common utility functions. +// +// Provided functionalities: +// - sorting +// - comparators +package utils + +import ( + "fmt" + "strconv" +) + +// ToString converts a value to string. +func ToString(value interface{}) string { + switch value.(type) { + case string: + return value.(string) + case int8: + return strconv.FormatInt(int64(value.(int8)), 10) + case int16: + return strconv.FormatInt(int64(value.(int16)), 10) + case int32: + return strconv.FormatInt(int64(value.(int32)), 10) + case int64: + return strconv.FormatInt(int64(value.(int64)), 10) + case uint8: + return strconv.FormatUint(uint64(value.(uint8)), 10) + case uint16: + return strconv.FormatUint(uint64(value.(uint16)), 10) + case uint32: + return strconv.FormatUint(uint64(value.(uint32)), 10) + case uint64: + return strconv.FormatUint(uint64(value.(uint64)), 10) + case float32: + return strconv.FormatFloat(float64(value.(float32)), 'g', -1, 64) + case float64: + return strconv.FormatFloat(float64(value.(float64)), 'g', -1, 64) + case bool: + return strconv.FormatBool(value.(bool)) + default: + return fmt.Sprintf("%+v", value) + } +} diff --git a/vendor/github.com/go-git/gcfg/LICENSE b/vendor/github.com/go-git/gcfg/LICENSE new file mode 100644 index 0000000000..87a5cede33 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go +Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/go-git/gcfg/README b/vendor/github.com/go-git/gcfg/README new file mode 100644 index 0000000000..1ff233a529 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/README @@ -0,0 +1,4 @@ +Gcfg reads INI-style configuration files into Go structs; +supports user-defined types and subsections. + +Package docs: https://godoc.org/gopkg.in/gcfg.v1 diff --git a/vendor/github.com/go-git/gcfg/doc.go b/vendor/github.com/go-git/gcfg/doc.go new file mode 100644 index 0000000000..7bdefbf020 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/doc.go @@ -0,0 +1,145 @@ +// Package gcfg reads "INI-style" text-based configuration files with +// "name=value" pairs grouped into sections (gcfg files). +// +// This package is still a work in progress; see the sections below for planned +// changes. +// +// Syntax +// +// The syntax is based on that used by git config: +// http://git-scm.com/docs/git-config#_syntax . +// There are some (planned) differences compared to the git config format: +// - improve data portability: +// - must be encoded in UTF-8 (for now) and must not contain the 0 byte +// - include and "path" type is not supported +// (path type may be implementable as a user-defined type) +// - internationalization +// - section and variable names can contain unicode letters, unicode digits +// (as defined in http://golang.org/ref/spec#Characters ) and hyphens +// (U+002D), starting with a unicode letter +// - disallow potentially ambiguous or misleading definitions: +// - `[sec.sub]` format is not allowed (deprecated in gitconfig) +// - `[sec ""]` is not allowed +// - use `[sec]` for section name "sec" and empty subsection name +// - (planned) within a single file, definitions must be contiguous for each: +// - section: '[secA]' -> '[secB]' -> '[secA]' is an error +// - subsection: '[sec "A"]' -> '[sec "B"]' -> '[sec "A"]' is an error +// - multivalued variable: 'multi=a' -> 'other=x' -> 'multi=b' is an error +// +// Data structure +// +// The functions in this package read values into a user-defined struct. +// Each section corresponds to a struct field in the config struct, and each +// variable in a section corresponds to a data field in the section struct. +// The mapping of each section or variable name to fields is done either based +// on the "gcfg" struct tag or by matching the name of the section or variable, +// ignoring case. In the latter case, hyphens '-' in section and variable names +// correspond to underscores '_' in field names. +// Fields must be exported; to use a section or variable name starting with a +// letter that is neither upper- or lower-case, prefix the field name with 'X'. +// (See https://code.google.com/p/go/issues/detail?id=5763#c4 .) +// +// For sections with subsections, the corresponding field in config must be a +// map, rather than a struct, with string keys and pointer-to-struct values. +// Values for subsection variables are stored in the map with the subsection +// name used as the map key. +// (Note that unlike section and variable names, subsection names are case +// sensitive.) +// When using a map, and there is a section with the same section name but +// without a subsection name, its values are stored with the empty string used +// as the key. +// It is possible to provide default values for subsections in the section +// "default-" (or by setting values in the corresponding struct +// field "Default_"). +// +// The functions in this package panic if config is not a pointer to a struct, +// or when a field is not of a suitable type (either a struct or a map with +// string keys and pointer-to-struct values). +// +// Parsing of values +// +// The section structs in the config struct may contain single-valued or +// multi-valued variables. Variables of unnamed slice type (that is, a type +// starting with `[]`) are treated as multi-value; all others (including named +// slice types) are treated as single-valued variables. +// +// Single-valued variables are handled based on the type as follows. +// Unnamed pointer types (that is, types starting with `*`) are dereferenced, +// and if necessary, a new instance is allocated. +// +// For types implementing the encoding.TextUnmarshaler interface, the +// UnmarshalText method is used to set the value. Implementing this method is +// the recommended way for parsing user-defined types. +// +// For fields of string kind, the value string is assigned to the field, after +// unquoting and unescaping as needed. +// For fields of bool kind, the field is set to true if the value is "true", +// "yes", "on" or "1", and set to false if the value is "false", "no", "off" or +// "0", ignoring case. In addition, single-valued bool fields can be specified +// with a "blank" value (variable name without equals sign and value); in such +// case the value is set to true. +// +// Predefined integer types [u]int(|8|16|32|64) and big.Int are parsed as +// decimal or hexadecimal (if having '0x' prefix). (This is to prevent +// unintuitively handling zero-padded numbers as octal.) Other types having +// [u]int* as the underlying type, such as os.FileMode and uintptr allow +// decimal, hexadecimal, or octal values. +// Parsing mode for integer types can be overridden using the struct tag option +// ",int=mode" where mode is a combination of the 'd', 'h', and 'o' characters +// (each standing for decimal, hexadecimal, and octal, respectively.) +// +// All other types are parsed using fmt.Sscanf with the "%v" verb. +// +// For multi-valued variables, each individual value is parsed as above and +// appended to the slice. If the first value is specified as a "blank" value +// (variable name without equals sign and value), a new slice is allocated; +// that is any values previously set in the slice will be ignored. +// +// The types subpackage for provides helpers for parsing "enum-like" and integer +// types. +// +// Error handling +// +// There are 3 types of errors: +// +// - programmer errors / panics: +// - invalid configuration structure +// - data errors: +// - fatal errors: +// - invalid configuration syntax +// - warnings: +// - data that doesn't belong to any part of the config structure +// +// Programmer errors trigger panics. These are should be fixed by the programmer +// before releasing code that uses gcfg. +// +// Data errors cause gcfg to return a non-nil error value. This includes the +// case when there are extra unknown key-value definitions in the configuration +// data (extra data). +// However, in some occasions it is desirable to be able to proceed in +// situations when the only data error is that of extra data. +// These errors are handled at a different (warning) priority and can be +// filtered out programmatically. To ignore extra data warnings, wrap the +// gcfg.Read*Into invocation into a call to gcfg.FatalOnly. +// +// TODO +// +// The following is a list of changes under consideration: +// - documentation +// - self-contained syntax documentation +// - more practical examples +// - move TODOs to issue tracker (eventually) +// - syntax +// - reconsider valid escape sequences +// (gitconfig doesn't support \r in value, \t in subsection name, etc.) +// - reading / parsing gcfg files +// - define internal representation structure +// - support multiple inputs (readers, strings, files) +// - support declaring encoding (?) +// - support varying fields sets for subsections (?) +// - writing gcfg files +// - error handling +// - make error context accessible programmatically? +// - limit input size? +// +package gcfg // import "github.com/go-git/gcfg" diff --git a/vendor/github.com/go-git/gcfg/errors.go b/vendor/github.com/go-git/gcfg/errors.go new file mode 100644 index 0000000000..853c76021d --- /dev/null +++ b/vendor/github.com/go-git/gcfg/errors.go @@ -0,0 +1,41 @@ +package gcfg + +import ( + "gopkg.in/warnings.v0" +) + +// FatalOnly filters the results of a Read*Into invocation and returns only +// fatal errors. That is, errors (warnings) indicating data for unknown +// sections / variables is ignored. Example invocation: +// +// err := gcfg.FatalOnly(gcfg.ReadFileInto(&cfg, configFile)) +// if err != nil { +// ... +// +func FatalOnly(err error) error { + return warnings.FatalOnly(err) +} + +func isFatal(err error) bool { + _, ok := err.(extraData) + return !ok +} + +type extraData struct { + section string + subsection *string + variable *string +} + +func (e extraData) Error() string { + s := "can't store data at section \"" + e.section + "\"" + if e.subsection != nil { + s += ", subsection \"" + *e.subsection + "\"" + } + if e.variable != nil { + s += ", variable \"" + *e.variable + "\"" + } + return s +} + +var _ error = extraData{} diff --git a/vendor/github.com/go-git/gcfg/go1_0.go b/vendor/github.com/go-git/gcfg/go1_0.go new file mode 100644 index 0000000000..6670210791 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/go1_0.go @@ -0,0 +1,7 @@ +// +build !go1.2 + +package gcfg + +type textUnmarshaler interface { + UnmarshalText(text []byte) error +} diff --git a/vendor/github.com/go-git/gcfg/go1_2.go b/vendor/github.com/go-git/gcfg/go1_2.go new file mode 100644 index 0000000000..6f5843bc7c --- /dev/null +++ b/vendor/github.com/go-git/gcfg/go1_2.go @@ -0,0 +1,9 @@ +// +build go1.2 + +package gcfg + +import ( + "encoding" +) + +type textUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/go-git/gcfg/read.go b/vendor/github.com/go-git/gcfg/read.go new file mode 100644 index 0000000000..4dfdc5cf30 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/read.go @@ -0,0 +1,273 @@ +package gcfg + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "strings" + + "github.com/go-git/gcfg/scanner" + "github.com/go-git/gcfg/token" + "gopkg.in/warnings.v0" +) + +var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t', 'b': '\b'} + +// no error: invalid literals should be caught by scanner +func unquote(s string) string { + u, q, esc := make([]rune, 0, len(s)), false, false + for _, c := range s { + if esc { + uc, ok := unescape[c] + switch { + case ok: + u = append(u, uc) + fallthrough + case !q && c == '\n': + esc = false + continue + } + panic("invalid escape sequence") + } + switch c { + case '"': + q = !q + case '\\': + esc = true + default: + u = append(u, c) + } + } + if q { + panic("missing end quote") + } + if esc { + panic("invalid escape sequence") + } + return string(u) +} + +func read(c *warnings.Collector, callback func(string, string, string, string, bool) error, + fset *token.FileSet, file *token.File, src []byte) error { + // + var s scanner.Scanner + var errs scanner.ErrorList + s.Init(file, src, func(p token.Position, m string) { errs.Add(p, m) }, 0) + sect, sectsub := "", "" + pos, tok, lit := s.Scan() + errfn := func(msg string) error { + return fmt.Errorf("%s: %s", fset.Position(pos), msg) + } + for { + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + switch tok { + case token.EOF: + return nil + case token.EOL, token.COMMENT: + pos, tok, lit = s.Scan() + case token.LBRACK: + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + if tok != token.IDENT { + if err := c.Collect(errfn("expected section name")); err != nil { + return err + } + } + sect, sectsub = lit, "" + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + if tok == token.STRING { + sectsub = unquote(lit) + if sectsub == "" { + if err := c.Collect(errfn("empty subsection name")); err != nil { + return err + } + } + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + } + if tok != token.RBRACK { + if sectsub == "" { + if err := c.Collect(errfn("expected subsection name or right bracket")); err != nil { + return err + } + } + if err := c.Collect(errfn("expected right bracket")); err != nil { + return err + } + } + pos, tok, lit = s.Scan() + if tok != token.EOL && tok != token.EOF && tok != token.COMMENT { + if err := c.Collect(errfn("expected EOL, EOF, or comment")); err != nil { + return err + } + } + // If a section/subsection header was found, ensure a + // container object is created, even if there are no + // variables further down. + err := c.Collect(callback(sect, sectsub, "", "", true)) + if err != nil { + return err + } + case token.IDENT: + if sect == "" { + if err := c.Collect(errfn("expected section header")); err != nil { + return err + } + } + n := lit + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + return errs.Err() + } + blank, v := tok == token.EOF || tok == token.EOL || tok == token.COMMENT, "" + if !blank { + if tok != token.ASSIGN { + if err := c.Collect(errfn("expected '='")); err != nil { + return err + } + } + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + if tok != token.STRING { + if err := c.Collect(errfn("expected value")); err != nil { + return err + } + } + v = unquote(lit) + pos, tok, lit = s.Scan() + if errs.Len() > 0 { + if err := c.Collect(errs.Err()); err != nil { + return err + } + } + if tok != token.EOL && tok != token.EOF && tok != token.COMMENT { + if err := c.Collect(errfn("expected EOL, EOF, or comment")); err != nil { + return err + } + } + } + err := c.Collect(callback(sect, sectsub, n, v, blank)) + if err != nil { + return err + } + default: + if sect == "" { + if err := c.Collect(errfn("expected section header")); err != nil { + return err + } + } + if err := c.Collect(errfn("expected section header or variable declaration")); err != nil { + return err + } + } + } + panic("never reached") +} + +func readInto(config interface{}, fset *token.FileSet, file *token.File, + src []byte) error { + // + c := warnings.NewCollector(isFatal) + firstPassCallback := func(s string, ss string, k string, v string, bv bool) error { + return set(c, config, s, ss, k, v, bv, false) + } + err := read(c, firstPassCallback, fset, file, src) + if err != nil { + return err + } + secondPassCallback := func(s string, ss string, k string, v string, bv bool) error { + return set(c, config, s, ss, k, v, bv, true) + } + err = read(c, secondPassCallback, fset, file, src) + if err != nil { + return err + } + return c.Done() +} + +// ReadWithCallback reads gcfg formatted data from reader and calls +// callback with each section and option found. +// +// Callback is called with section, subsection, option key, option value +// and blank value flag as arguments. +// +// When a section is found, callback is called with nil subsection, option key +// and option value. +// +// When a subsection is found, callback is called with nil option key and +// option value. +// +// If blank value flag is true, it means that the value was not set for an option +// (as opposed to set to empty string). +// +// If callback returns an error, ReadWithCallback terminates with an error too. +func ReadWithCallback(reader io.Reader, callback func(string, string, string, string, bool) error) error { + src, err := ioutil.ReadAll(reader) + if err != nil { + return err + } + + fset := token.NewFileSet() + file := fset.AddFile("", fset.Base(), len(src)) + c := warnings.NewCollector(isFatal) + + return read(c, callback, fset, file, src) +} + +// ReadInto reads gcfg formatted data from reader and sets the values into the +// corresponding fields in config. +func ReadInto(config interface{}, reader io.Reader) error { + src, err := ioutil.ReadAll(reader) + if err != nil { + return err + } + fset := token.NewFileSet() + file := fset.AddFile("", fset.Base(), len(src)) + return readInto(config, fset, file, src) +} + +// ReadStringInto reads gcfg formatted data from str and sets the values into +// the corresponding fields in config. +func ReadStringInto(config interface{}, str string) error { + r := strings.NewReader(str) + return ReadInto(config, r) +} + +// ReadFileInto reads gcfg formatted data from the file filename and sets the +// values into the corresponding fields in config. +func ReadFileInto(config interface{}, filename string) error { + f, err := os.Open(filename) + if err != nil { + return err + } + defer f.Close() + src, err := ioutil.ReadAll(f) + if err != nil { + return err + } + fset := token.NewFileSet() + file := fset.AddFile(filename, fset.Base(), len(src)) + return readInto(config, fset, file, src) +} diff --git a/vendor/github.com/go-git/gcfg/scanner/errors.go b/vendor/github.com/go-git/gcfg/scanner/errors.go new file mode 100644 index 0000000000..a6e00f5c64 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/scanner/errors.go @@ -0,0 +1,121 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package scanner + +import ( + "fmt" + "io" + "sort" +) + +import ( + "github.com/go-git/gcfg/token" +) + +// In an ErrorList, an error is represented by an *Error. +// The position Pos, if valid, points to the beginning of +// the offending token, and the error condition is described +// by Msg. +// +type Error struct { + Pos token.Position + Msg string +} + +// Error implements the error interface. +func (e Error) Error() string { + if e.Pos.Filename != "" || e.Pos.IsValid() { + // don't print "" + // TODO(gri) reconsider the semantics of Position.IsValid + return e.Pos.String() + ": " + e.Msg + } + return e.Msg +} + +// ErrorList is a list of *Errors. +// The zero value for an ErrorList is an empty ErrorList ready to use. +// +type ErrorList []*Error + +// Add adds an Error with given position and error message to an ErrorList. +func (p *ErrorList) Add(pos token.Position, msg string) { + *p = append(*p, &Error{pos, msg}) +} + +// Reset resets an ErrorList to no errors. +func (p *ErrorList) Reset() { *p = (*p)[0:0] } + +// ErrorList implements the sort Interface. +func (p ErrorList) Len() int { return len(p) } +func (p ErrorList) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +func (p ErrorList) Less(i, j int) bool { + e := &p[i].Pos + f := &p[j].Pos + if e.Filename < f.Filename { + return true + } + if e.Filename == f.Filename { + return e.Offset < f.Offset + } + return false +} + +// Sort sorts an ErrorList. *Error entries are sorted by position, +// other errors are sorted by error message, and before any *Error +// entry. +// +func (p ErrorList) Sort() { + sort.Sort(p) +} + +// RemoveMultiples sorts an ErrorList and removes all but the first error per line. +func (p *ErrorList) RemoveMultiples() { + sort.Sort(p) + var last token.Position // initial last.Line is != any legal error line + i := 0 + for _, e := range *p { + if e.Pos.Filename != last.Filename || e.Pos.Line != last.Line { + last = e.Pos + (*p)[i] = e + i++ + } + } + (*p) = (*p)[0:i] +} + +// An ErrorList implements the error interface. +func (p ErrorList) Error() string { + switch len(p) { + case 0: + return "no errors" + case 1: + return p[0].Error() + } + return fmt.Sprintf("%s (and %d more errors)", p[0], len(p)-1) +} + +// Err returns an error equivalent to this error list. +// If the list is empty, Err returns nil. +func (p ErrorList) Err() error { + if len(p) == 0 { + return nil + } + return p +} + +// PrintError is a utility function that prints a list of errors to w, +// one error per line, if the err parameter is an ErrorList. Otherwise +// it prints the err string. +// +func PrintError(w io.Writer, err error) { + if list, ok := err.(ErrorList); ok { + for _, e := range list { + fmt.Fprintf(w, "%s\n", e) + } + } else if err != nil { + fmt.Fprintf(w, "%s\n", err) + } +} diff --git a/vendor/github.com/go-git/gcfg/scanner/scanner.go b/vendor/github.com/go-git/gcfg/scanner/scanner.go new file mode 100644 index 0000000000..41aafec758 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/scanner/scanner.go @@ -0,0 +1,342 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package scanner implements a scanner for gcfg configuration text. +// It takes a []byte as source which can then be tokenized +// through repeated calls to the Scan method. +// +// Note that the API for the scanner package may change to accommodate new +// features or implementation changes in gcfg. +// +package scanner + +import ( + "fmt" + "path/filepath" + "unicode" + "unicode/utf8" +) + +import ( + "github.com/go-git/gcfg/token" +) + +// An ErrorHandler may be provided to Scanner.Init. If a syntax error is +// encountered and a handler was installed, the handler is called with a +// position and an error message. The position points to the beginning of +// the offending token. +// +type ErrorHandler func(pos token.Position, msg string) + +// A Scanner holds the scanner's internal state while processing +// a given text. It can be allocated as part of another data +// structure but must be initialized via Init before use. +// +type Scanner struct { + // immutable state + file *token.File // source file handle + dir string // directory portion of file.Name() + src []byte // source + err ErrorHandler // error reporting; or nil + mode Mode // scanning mode + + // scanning state + ch rune // current character + offset int // character offset + rdOffset int // reading offset (position after current character) + lineOffset int // current line offset + nextVal bool // next token is expected to be a value + + // public state - ok to modify + ErrorCount int // number of errors encountered +} + +// Read the next Unicode char into s.ch. +// s.ch < 0 means end-of-file. +// +func (s *Scanner) next() { + if s.rdOffset < len(s.src) { + s.offset = s.rdOffset + if s.ch == '\n' { + s.lineOffset = s.offset + s.file.AddLine(s.offset) + } + r, w := rune(s.src[s.rdOffset]), 1 + switch { + case r == 0: + s.error(s.offset, "illegal character NUL") + case r >= 0x80: + // not ASCII + r, w = utf8.DecodeRune(s.src[s.rdOffset:]) + if r == utf8.RuneError && w == 1 { + s.error(s.offset, "illegal UTF-8 encoding") + } + } + s.rdOffset += w + s.ch = r + } else { + s.offset = len(s.src) + if s.ch == '\n' { + s.lineOffset = s.offset + s.file.AddLine(s.offset) + } + s.ch = -1 // eof + } +} + +// A mode value is a set of flags (or 0). +// They control scanner behavior. +// +type Mode uint + +const ( + ScanComments Mode = 1 << iota // return comments as COMMENT tokens +) + +// Init prepares the scanner s to tokenize the text src by setting the +// scanner at the beginning of src. The scanner uses the file set file +// for position information and it adds line information for each line. +// It is ok to re-use the same file when re-scanning the same file as +// line information which is already present is ignored. Init causes a +// panic if the file size does not match the src size. +// +// Calls to Scan will invoke the error handler err if they encounter a +// syntax error and err is not nil. Also, for each error encountered, +// the Scanner field ErrorCount is incremented by one. The mode parameter +// determines how comments are handled. +// +// Note that Init may call err if there is an error in the first character +// of the file. +// +func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode) { + // Explicitly initialize all fields since a scanner may be reused. + if file.Size() != len(src) { + panic(fmt.Sprintf("file size (%d) does not match src len (%d)", file.Size(), len(src))) + } + s.file = file + s.dir, _ = filepath.Split(file.Name()) + s.src = src + s.err = err + s.mode = mode + + s.ch = ' ' + s.offset = 0 + s.rdOffset = 0 + s.lineOffset = 0 + s.ErrorCount = 0 + s.nextVal = false + + s.next() +} + +func (s *Scanner) error(offs int, msg string) { + if s.err != nil { + s.err(s.file.Position(s.file.Pos(offs)), msg) + } + s.ErrorCount++ +} + +func (s *Scanner) scanComment() string { + // initial [;#] already consumed + offs := s.offset - 1 // position of initial [;#] + + for s.ch != '\n' && s.ch >= 0 { + s.next() + } + return string(s.src[offs:s.offset]) +} + +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch >= 0x80 && unicode.IsLetter(ch) +} + +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +func (s *Scanner) scanIdentifier() string { + offs := s.offset + for isLetter(s.ch) || isDigit(s.ch) || s.ch == '-' { + s.next() + } + return string(s.src[offs:s.offset]) +} + +func (s *Scanner) scanEscape(val bool) { + offs := s.offset + ch := s.ch + s.next() // always make progress + switch ch { + case '\\', '"': + // ok + case 'n', 't', 'b': + if val { + break // ok + } + fallthrough + default: + s.error(offs, "unknown escape sequence") + } +} + +func (s *Scanner) scanString() string { + // '"' opening already consumed + offs := s.offset - 1 + + for s.ch != '"' { + ch := s.ch + s.next() + if ch == '\n' || ch < 0 { + s.error(offs, "string not terminated") + break + } + if ch == '\\' { + s.scanEscape(false) + } + } + + s.next() + + return string(s.src[offs:s.offset]) +} + +func stripCR(b []byte) []byte { + c := make([]byte, len(b)) + i := 0 + for _, ch := range b { + if ch != '\r' { + c[i] = ch + i++ + } + } + return c[:i] +} + +func (s *Scanner) scanValString() string { + offs := s.offset + + hasCR := false + end := offs + inQuote := false +loop: + for inQuote || s.ch >= 0 && s.ch != '\n' && s.ch != ';' && s.ch != '#' { + ch := s.ch + s.next() + switch { + case inQuote && ch == '\\': + s.scanEscape(true) + case !inQuote && ch == '\\': + if s.ch == '\r' { + hasCR = true + s.next() + } + if s.ch != '\n' { + s.scanEscape(true) + } else { + s.next() + } + case ch == '"': + inQuote = !inQuote + case ch == '\r': + hasCR = true + case ch < 0 || inQuote && ch == '\n': + s.error(offs, "string not terminated") + break loop + } + if inQuote || !isWhiteSpace(ch) { + end = s.offset + } + } + + lit := s.src[offs:end] + if hasCR { + lit = stripCR(lit) + } + + return string(lit) +} + +func isWhiteSpace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\r' +} + +func (s *Scanner) skipWhitespace() { + for isWhiteSpace(s.ch) { + s.next() + } +} + +// Scan scans the next token and returns the token position, the token, +// and its literal string if applicable. The source end is indicated by +// token.EOF. +// +// If the returned token is a literal (token.IDENT, token.STRING) or +// token.COMMENT, the literal string has the corresponding value. +// +// If the returned token is token.ILLEGAL, the literal string is the +// offending character. +// +// In all other cases, Scan returns an empty literal string. +// +// For more tolerant parsing, Scan will return a valid token if +// possible even if a syntax error was encountered. Thus, even +// if the resulting token sequence contains no illegal tokens, +// a client may not assume that no error occurred. Instead it +// must check the scanner's ErrorCount or the number of calls +// of the error handler, if there was one installed. +// +// Scan adds line information to the file added to the file +// set with Init. Token positions are relative to that file +// and thus relative to the file set. +// +func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string) { +scanAgain: + s.skipWhitespace() + + // current token start + pos = s.file.Pos(s.offset) + + // determine token value + switch ch := s.ch; { + case s.nextVal: + lit = s.scanValString() + tok = token.STRING + s.nextVal = false + case isLetter(ch): + lit = s.scanIdentifier() + tok = token.IDENT + default: + s.next() // always make progress + switch ch { + case -1: + tok = token.EOF + case '\n': + tok = token.EOL + case '"': + tok = token.STRING + lit = s.scanString() + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case ';', '#': + // comment + lit = s.scanComment() + if s.mode&ScanComments == 0 { + // skip comment + goto scanAgain + } + tok = token.COMMENT + case '=': + tok = token.ASSIGN + s.nextVal = true + default: + s.error(s.file.Offset(pos), fmt.Sprintf("illegal character %#U", ch)) + tok = token.ILLEGAL + lit = string(ch) + } + } + + return +} diff --git a/vendor/github.com/go-git/gcfg/set.go b/vendor/github.com/go-git/gcfg/set.go new file mode 100644 index 0000000000..e2d9278025 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/set.go @@ -0,0 +1,332 @@ +package gcfg + +import ( + "bytes" + "encoding/gob" + "fmt" + "math/big" + "reflect" + "strings" + "unicode" + "unicode/utf8" + + "github.com/go-git/gcfg/types" + "gopkg.in/warnings.v0" +) + +type tag struct { + ident string + intMode string +} + +func newTag(ts string) tag { + t := tag{} + s := strings.Split(ts, ",") + t.ident = s[0] + for _, tse := range s[1:] { + if strings.HasPrefix(tse, "int=") { + t.intMode = tse[len("int="):] + } + } + return t +} + +func fieldFold(v reflect.Value, name string) (reflect.Value, tag) { + var n string + r0, _ := utf8.DecodeRuneInString(name) + if unicode.IsLetter(r0) && !unicode.IsLower(r0) && !unicode.IsUpper(r0) { + n = "X" + } + n += strings.Replace(name, "-", "_", -1) + f, ok := v.Type().FieldByNameFunc(func(fieldName string) bool { + if !v.FieldByName(fieldName).CanSet() { + return false + } + f, _ := v.Type().FieldByName(fieldName) + t := newTag(f.Tag.Get("gcfg")) + if t.ident != "" { + return strings.EqualFold(t.ident, name) + } + return strings.EqualFold(n, fieldName) + }) + if !ok { + return reflect.Value{}, tag{} + } + return v.FieldByName(f.Name), newTag(f.Tag.Get("gcfg")) +} + +type setter func(destp interface{}, blank bool, val string, t tag) error + +var errUnsupportedType = fmt.Errorf("unsupported type") +var errBlankUnsupported = fmt.Errorf("blank value not supported for type") + +var setters = []setter{ + typeSetter, textUnmarshalerSetter, kindSetter, scanSetter, +} + +func textUnmarshalerSetter(d interface{}, blank bool, val string, t tag) error { + dtu, ok := d.(textUnmarshaler) + if !ok { + return errUnsupportedType + } + if blank { + return errBlankUnsupported + } + return dtu.UnmarshalText([]byte(val)) +} + +func boolSetter(d interface{}, blank bool, val string, t tag) error { + if blank { + reflect.ValueOf(d).Elem().Set(reflect.ValueOf(true)) + return nil + } + b, err := types.ParseBool(val) + if err == nil { + reflect.ValueOf(d).Elem().Set(reflect.ValueOf(b)) + } + return err +} + +func intMode(mode string) types.IntMode { + var m types.IntMode + if strings.ContainsAny(mode, "dD") { + m |= types.Dec + } + if strings.ContainsAny(mode, "hH") { + m |= types.Hex + } + if strings.ContainsAny(mode, "oO") { + m |= types.Oct + } + return m +} + +var typeModes = map[reflect.Type]types.IntMode{ + reflect.TypeOf(int(0)): types.Dec | types.Hex, + reflect.TypeOf(int8(0)): types.Dec | types.Hex, + reflect.TypeOf(int16(0)): types.Dec | types.Hex, + reflect.TypeOf(int32(0)): types.Dec | types.Hex, + reflect.TypeOf(int64(0)): types.Dec | types.Hex, + reflect.TypeOf(uint(0)): types.Dec | types.Hex, + reflect.TypeOf(uint8(0)): types.Dec | types.Hex, + reflect.TypeOf(uint16(0)): types.Dec | types.Hex, + reflect.TypeOf(uint32(0)): types.Dec | types.Hex, + reflect.TypeOf(uint64(0)): types.Dec | types.Hex, + // use default mode (allow dec/hex/oct) for uintptr type + reflect.TypeOf(big.Int{}): types.Dec | types.Hex, +} + +func intModeDefault(t reflect.Type) types.IntMode { + m, ok := typeModes[t] + if !ok { + m = types.Dec | types.Hex | types.Oct + } + return m +} + +func intSetter(d interface{}, blank bool, val string, t tag) error { + if blank { + return errBlankUnsupported + } + mode := intMode(t.intMode) + if mode == 0 { + mode = intModeDefault(reflect.TypeOf(d).Elem()) + } + return types.ParseInt(d, val, mode) +} + +func stringSetter(d interface{}, blank bool, val string, t tag) error { + if blank { + return errBlankUnsupported + } + dsp, ok := d.(*string) + if !ok { + return errUnsupportedType + } + *dsp = val + return nil +} + +var kindSetters = map[reflect.Kind]setter{ + reflect.String: stringSetter, + reflect.Bool: boolSetter, + reflect.Int: intSetter, + reflect.Int8: intSetter, + reflect.Int16: intSetter, + reflect.Int32: intSetter, + reflect.Int64: intSetter, + reflect.Uint: intSetter, + reflect.Uint8: intSetter, + reflect.Uint16: intSetter, + reflect.Uint32: intSetter, + reflect.Uint64: intSetter, + reflect.Uintptr: intSetter, +} + +var typeSetters = map[reflect.Type]setter{ + reflect.TypeOf(big.Int{}): intSetter, +} + +func typeSetter(d interface{}, blank bool, val string, tt tag) error { + t := reflect.ValueOf(d).Type().Elem() + setter, ok := typeSetters[t] + if !ok { + return errUnsupportedType + } + return setter(d, blank, val, tt) +} + +func kindSetter(d interface{}, blank bool, val string, tt tag) error { + k := reflect.ValueOf(d).Type().Elem().Kind() + setter, ok := kindSetters[k] + if !ok { + return errUnsupportedType + } + return setter(d, blank, val, tt) +} + +func scanSetter(d interface{}, blank bool, val string, tt tag) error { + if blank { + return errBlankUnsupported + } + return types.ScanFully(d, val, 'v') +} + +func newValue(c *warnings.Collector, sect string, vCfg reflect.Value, + vType reflect.Type) (reflect.Value, error) { + // + pv := reflect.New(vType) + dfltName := "default-" + sect + dfltField, _ := fieldFold(vCfg, dfltName) + var err error + if dfltField.IsValid() { + b := bytes.NewBuffer(nil) + ge := gob.NewEncoder(b) + if err = c.Collect(ge.EncodeValue(dfltField)); err != nil { + return pv, err + } + gd := gob.NewDecoder(bytes.NewReader(b.Bytes())) + if err = c.Collect(gd.DecodeValue(pv.Elem())); err != nil { + return pv, err + } + } + return pv, nil +} + +func set(c *warnings.Collector, cfg interface{}, sect, sub, name string, + value string, blankValue bool, subsectPass bool) error { + // + vPCfg := reflect.ValueOf(cfg) + if vPCfg.Kind() != reflect.Ptr || vPCfg.Elem().Kind() != reflect.Struct { + panic(fmt.Errorf("config must be a pointer to a struct")) + } + vCfg := vPCfg.Elem() + vSect, _ := fieldFold(vCfg, sect) + if !vSect.IsValid() { + err := extraData{section: sect} + return c.Collect(err) + } + isSubsect := vSect.Kind() == reflect.Map + if subsectPass != isSubsect { + return nil + } + if isSubsect { + vst := vSect.Type() + if vst.Key().Kind() != reflect.String || + vst.Elem().Kind() != reflect.Ptr || + vst.Elem().Elem().Kind() != reflect.Struct { + panic(fmt.Errorf("map field for section must have string keys and "+ + " pointer-to-struct values: section %q", sect)) + } + if vSect.IsNil() { + vSect.Set(reflect.MakeMap(vst)) + } + k := reflect.ValueOf(sub) + pv := vSect.MapIndex(k) + if !pv.IsValid() { + vType := vSect.Type().Elem().Elem() + var err error + if pv, err = newValue(c, sect, vCfg, vType); err != nil { + return err + } + vSect.SetMapIndex(k, pv) + } + vSect = pv.Elem() + } else if vSect.Kind() != reflect.Struct { + panic(fmt.Errorf("field for section must be a map or a struct: "+ + "section %q", sect)) + } else if sub != "" { + err := extraData{section: sect, subsection: &sub} + return c.Collect(err) + } + // Empty name is a special value, meaning that only the + // section/subsection object is to be created, with no values set. + if name == "" { + return nil + } + vVar, t := fieldFold(vSect, name) + if !vVar.IsValid() { + var err error + if isSubsect { + err = extraData{section: sect, subsection: &sub, variable: &name} + } else { + err = extraData{section: sect, variable: &name} + } + return c.Collect(err) + } + // vVal is either single-valued var, or newly allocated value within multi-valued var + var vVal reflect.Value + // multi-value if unnamed slice type + isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice || + vVar.Type().Name() == "" && vVar.Kind() == reflect.Ptr && vVar.Type().Elem().Name() == "" && vVar.Type().Elem().Kind() == reflect.Slice + if isMulti && vVar.Kind() == reflect.Ptr { + if vVar.IsNil() { + vVar.Set(reflect.New(vVar.Type().Elem())) + } + vVar = vVar.Elem() + } + if isMulti && blankValue { + vVar.Set(reflect.Zero(vVar.Type())) + return nil + } + if isMulti { + vVal = reflect.New(vVar.Type().Elem()).Elem() + } else { + vVal = vVar + } + isDeref := vVal.Type().Name() == "" && vVal.Type().Kind() == reflect.Ptr + isNew := isDeref && vVal.IsNil() + // vAddr is address of value to set (dereferenced & allocated as needed) + var vAddr reflect.Value + switch { + case isNew: + vAddr = reflect.New(vVal.Type().Elem()) + case isDeref && !isNew: + vAddr = vVal + default: + vAddr = vVal.Addr() + } + vAddrI := vAddr.Interface() + err, ok := error(nil), false + for _, s := range setters { + err = s(vAddrI, blankValue, value, t) + if err == nil { + ok = true + break + } + if err != errUnsupportedType { + return err + } + } + if !ok { + // in case all setters returned errUnsupportedType + return err + } + if isNew { // set reference if it was dereferenced and newly allocated + vVal.Set(vAddr) + } + if isMulti { // append if multi-valued + vVar.Set(reflect.Append(vVar, vVal)) + } + return nil +} diff --git a/vendor/github.com/go-git/gcfg/token/position.go b/vendor/github.com/go-git/gcfg/token/position.go new file mode 100644 index 0000000000..fc45c1e769 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/token/position.go @@ -0,0 +1,435 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO(gri) consider making this a separate package outside the go directory. + +package token + +import ( + "fmt" + "sort" + "sync" +) + +// ----------------------------------------------------------------------------- +// Positions + +// Position describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +// +type Position struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (pos *Position) IsValid() bool { return pos.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +// +func (pos Position) String() string { + s := pos.Filename + if pos.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", pos.Line, pos.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Pos is a compact encoding of a source position within a file set. +// It can be converted into a Position for a more convenient, but much +// larger, representation. +// +// The Pos value for a given file is a number in the range [base, base+size], +// where base and size are specified when adding the file to the file set via +// AddFile. +// +// To create the Pos value for a specific source offset, first add +// the respective file to the current file set (via FileSet.AddFile) +// and then call File.Pos(offset) for that file. Given a Pos value p +// for a specific file set fset, the corresponding Position value is +// obtained by calling fset.Position(p). +// +// Pos values can be compared directly with the usual comparison operators: +// If two Pos values p and q are in the same file, comparing p and q is +// equivalent to comparing the respective source file offsets. If p and q +// are in different files, p < q is true if the file implied by p was added +// to the respective file set before the file implied by q. +// +type Pos int + +// The zero value for Pos is NoPos; there is no file and line information +// associated with it, and NoPos().IsValid() is false. NoPos is always +// smaller than any other Pos value. The corresponding Position value +// for NoPos is the zero value for Position. +// +const NoPos Pos = 0 + +// IsValid returns true if the position is valid. +func (p Pos) IsValid() bool { + return p != NoPos +} + +// ----------------------------------------------------------------------------- +// File + +// A File is a handle for a file belonging to a FileSet. +// A File has a name, size, and line offset table. +// +type File struct { + set *FileSet + name string // file name as provided to AddFile + base int // Pos value range for this file is [base...base+size] + size int // file size as provided to AddFile + + // lines and infos are protected by set.mutex + lines []int + infos []lineInfo +} + +// Name returns the file name of file f as registered with AddFile. +func (f *File) Name() string { + return f.name +} + +// Base returns the base offset of file f as registered with AddFile. +func (f *File) Base() int { + return f.base +} + +// Size returns the size of file f as registered with AddFile. +func (f *File) Size() int { + return f.size +} + +// LineCount returns the number of lines in file f. +func (f *File) LineCount() int { + f.set.mutex.RLock() + n := len(f.lines) + f.set.mutex.RUnlock() + return n +} + +// AddLine adds the line offset for a new line. +// The line offset must be larger than the offset for the previous line +// and smaller than the file size; otherwise the line offset is ignored. +// +func (f *File) AddLine(offset int) { + f.set.mutex.Lock() + if i := len(f.lines); (i == 0 || f.lines[i-1] < offset) && offset < f.size { + f.lines = append(f.lines, offset) + } + f.set.mutex.Unlock() +} + +// SetLines sets the line offsets for a file and returns true if successful. +// The line offsets are the offsets of the first character of each line; +// for instance for the content "ab\nc\n" the line offsets are {0, 3}. +// An empty file has an empty line offset table. +// Each line offset must be larger than the offset for the previous line +// and smaller than the file size; otherwise SetLines fails and returns +// false. +// +func (f *File) SetLines(lines []int) bool { + // verify validity of lines table + size := f.size + for i, offset := range lines { + if i > 0 && offset <= lines[i-1] || size <= offset { + return false + } + } + + // set lines table + f.set.mutex.Lock() + f.lines = lines + f.set.mutex.Unlock() + return true +} + +// SetLinesForContent sets the line offsets for the given file content. +func (f *File) SetLinesForContent(content []byte) { + var lines []int + line := 0 + for offset, b := range content { + if line >= 0 { + lines = append(lines, line) + } + line = -1 + if b == '\n' { + line = offset + 1 + } + } + + // set lines table + f.set.mutex.Lock() + f.lines = lines + f.set.mutex.Unlock() +} + +// A lineInfo object describes alternative file and line number +// information (such as provided via a //line comment in a .go +// file) for a given file offset. +type lineInfo struct { + // fields are exported to make them accessible to gob + Offset int + Filename string + Line int +} + +// AddLineInfo adds alternative file and line number information for +// a given file offset. The offset must be larger than the offset for +// the previously added alternative line info and smaller than the +// file size; otherwise the information is ignored. +// +// AddLineInfo is typically used to register alternative position +// information for //line filename:line comments in source files. +// +func (f *File) AddLineInfo(offset int, filename string, line int) { + f.set.mutex.Lock() + if i := len(f.infos); i == 0 || f.infos[i-1].Offset < offset && offset < f.size { + f.infos = append(f.infos, lineInfo{offset, filename, line}) + } + f.set.mutex.Unlock() +} + +// Pos returns the Pos value for the given file offset; +// the offset must be <= f.Size(). +// f.Pos(f.Offset(p)) == p. +// +func (f *File) Pos(offset int) Pos { + if offset > f.size { + panic("illegal file offset") + } + return Pos(f.base + offset) +} + +// Offset returns the offset for the given file position p; +// p must be a valid Pos value in that file. +// f.Offset(f.Pos(offset)) == offset. +// +func (f *File) Offset(p Pos) int { + if int(p) < f.base || int(p) > f.base+f.size { + panic("illegal Pos value") + } + return int(p) - f.base +} + +// Line returns the line number for the given file position p; +// p must be a Pos value in that file or NoPos. +// +func (f *File) Line(p Pos) int { + // TODO(gri) this can be implemented much more efficiently + return f.Position(p).Line +} + +func searchLineInfos(a []lineInfo, x int) int { + return sort.Search(len(a), func(i int) bool { return a[i].Offset > x }) - 1 +} + +// info returns the file name, line, and column number for a file offset. +func (f *File) info(offset int) (filename string, line, column int) { + filename = f.name + if i := searchInts(f.lines, offset); i >= 0 { + line, column = i+1, offset-f.lines[i]+1 + } + if len(f.infos) > 0 { + // almost no files have extra line infos + if i := searchLineInfos(f.infos, offset); i >= 0 { + alt := &f.infos[i] + filename = alt.Filename + if i := searchInts(f.lines, alt.Offset); i >= 0 { + line += alt.Line - i - 1 + } + } + } + return +} + +func (f *File) position(p Pos) (pos Position) { + offset := int(p) - f.base + pos.Offset = offset + pos.Filename, pos.Line, pos.Column = f.info(offset) + return +} + +// Position returns the Position value for the given file position p; +// p must be a Pos value in that file or NoPos. +// +func (f *File) Position(p Pos) (pos Position) { + if p != NoPos { + if int(p) < f.base || int(p) > f.base+f.size { + panic("illegal Pos value") + } + pos = f.position(p) + } + return +} + +// ----------------------------------------------------------------------------- +// FileSet + +// A FileSet represents a set of source files. +// Methods of file sets are synchronized; multiple goroutines +// may invoke them concurrently. +// +type FileSet struct { + mutex sync.RWMutex // protects the file set + base int // base offset for the next file + files []*File // list of files in the order added to the set + last *File // cache of last file looked up +} + +// NewFileSet creates a new file set. +func NewFileSet() *FileSet { + s := new(FileSet) + s.base = 1 // 0 == NoPos + return s +} + +// Base returns the minimum base offset that must be provided to +// AddFile when adding the next file. +// +func (s *FileSet) Base() int { + s.mutex.RLock() + b := s.base + s.mutex.RUnlock() + return b + +} + +// AddFile adds a new file with a given filename, base offset, and file size +// to the file set s and returns the file. Multiple files may have the same +// name. The base offset must not be smaller than the FileSet's Base(), and +// size must not be negative. +// +// Adding the file will set the file set's Base() value to base + size + 1 +// as the minimum base value for the next file. The following relationship +// exists between a Pos value p for a given file offset offs: +// +// int(p) = base + offs +// +// with offs in the range [0, size] and thus p in the range [base, base+size]. +// For convenience, File.Pos may be used to create file-specific position +// values from a file offset. +// +func (s *FileSet) AddFile(filename string, base, size int) *File { + s.mutex.Lock() + defer s.mutex.Unlock() + if base < s.base || size < 0 { + panic("illegal base or size") + } + // base >= s.base && size >= 0 + f := &File{s, filename, base, size, []int{0}, nil} + base += size + 1 // +1 because EOF also has a position + if base < 0 { + panic("token.Pos offset overflow (> 2G of source code in file set)") + } + // add the file to the file set + s.base = base + s.files = append(s.files, f) + s.last = f + return f +} + +// Iterate calls f for the files in the file set in the order they were added +// until f returns false. +// +func (s *FileSet) Iterate(f func(*File) bool) { + for i := 0; ; i++ { + var file *File + s.mutex.RLock() + if i < len(s.files) { + file = s.files[i] + } + s.mutex.RUnlock() + if file == nil || !f(file) { + break + } + } +} + +func searchFiles(a []*File, x int) int { + return sort.Search(len(a), func(i int) bool { return a[i].base > x }) - 1 +} + +func (s *FileSet) file(p Pos) *File { + // common case: p is in last file + if f := s.last; f != nil && f.base <= int(p) && int(p) <= f.base+f.size { + return f + } + // p is not in last file - search all files + if i := searchFiles(s.files, int(p)); i >= 0 { + f := s.files[i] + // f.base <= int(p) by definition of searchFiles + if int(p) <= f.base+f.size { + s.last = f + return f + } + } + return nil +} + +// File returns the file that contains the position p. +// If no such file is found (for instance for p == NoPos), +// the result is nil. +// +func (s *FileSet) File(p Pos) (f *File) { + if p != NoPos { + s.mutex.RLock() + f = s.file(p) + s.mutex.RUnlock() + } + return +} + +// Position converts a Pos in the fileset into a general Position. +func (s *FileSet) Position(p Pos) (pos Position) { + if p != NoPos { + s.mutex.RLock() + if f := s.file(p); f != nil { + pos = f.position(p) + } + s.mutex.RUnlock() + } + return +} + +// ----------------------------------------------------------------------------- +// Helper functions + +func searchInts(a []int, x int) int { + // This function body is a manually inlined version of: + // + // return sort.Search(len(a), func(i int) bool { return a[i] > x }) - 1 + // + // With better compiler optimizations, this may not be needed in the + // future, but at the moment this change improves the go/printer + // benchmark performance by ~30%. This has a direct impact on the + // speed of gofmt and thus seems worthwhile (2011-04-29). + // TODO(gri): Remove this when compilers have caught up. + i, j := 0, len(a) + for i < j { + h := i + (j-i)/2 // avoid overflow when computing h + // i ≤ h < j + if a[h] <= x { + i = h + 1 + } else { + j = h + } + } + return i - 1 +} diff --git a/vendor/github.com/go-git/gcfg/token/serialize.go b/vendor/github.com/go-git/gcfg/token/serialize.go new file mode 100644 index 0000000000..4adc8f9e33 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/token/serialize.go @@ -0,0 +1,56 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package token + +type serializedFile struct { + // fields correspond 1:1 to fields with same (lower-case) name in File + Name string + Base int + Size int + Lines []int + Infos []lineInfo +} + +type serializedFileSet struct { + Base int + Files []serializedFile +} + +// Read calls decode to deserialize a file set into s; s must not be nil. +func (s *FileSet) Read(decode func(interface{}) error) error { + var ss serializedFileSet + if err := decode(&ss); err != nil { + return err + } + + s.mutex.Lock() + s.base = ss.Base + files := make([]*File, len(ss.Files)) + for i := 0; i < len(ss.Files); i++ { + f := &ss.Files[i] + files[i] = &File{s, f.Name, f.Base, f.Size, f.Lines, f.Infos} + } + s.files = files + s.last = nil + s.mutex.Unlock() + + return nil +} + +// Write calls encode to serialize the file set s. +func (s *FileSet) Write(encode func(interface{}) error) error { + var ss serializedFileSet + + s.mutex.Lock() + ss.Base = s.base + files := make([]serializedFile, len(s.files)) + for i, f := range s.files { + files[i] = serializedFile{f.name, f.base, f.size, f.lines, f.infos} + } + ss.Files = files + s.mutex.Unlock() + + return encode(ss) +} diff --git a/vendor/github.com/go-git/gcfg/token/token.go b/vendor/github.com/go-git/gcfg/token/token.go new file mode 100644 index 0000000000..b3c7c83fa9 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/token/token.go @@ -0,0 +1,83 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package token defines constants representing the lexical tokens of the gcfg +// configuration syntax and basic operations on tokens (printing, predicates). +// +// Note that the API for the token package may change to accommodate new +// features or implementation changes in gcfg. +// +package token + +import "strconv" + +// Token is the set of lexical tokens of the gcfg configuration syntax. +type Token int + +// The list of tokens. +const ( + // Special tokens + ILLEGAL Token = iota + EOF + COMMENT + + literal_beg + // Identifiers and basic type literals + // (these tokens stand for classes of literals) + IDENT // section-name, variable-name + STRING // "subsection-name", variable value + literal_end + + operator_beg + // Operators and delimiters + ASSIGN // = + LBRACK // [ + RBRACK // ] + EOL // \n + operator_end +) + +var tokens = [...]string{ + ILLEGAL: "ILLEGAL", + + EOF: "EOF", + COMMENT: "COMMENT", + + IDENT: "IDENT", + STRING: "STRING", + + ASSIGN: "=", + LBRACK: "[", + RBRACK: "]", + EOL: "\n", +} + +// String returns the string corresponding to the token tok. +// For operators and delimiters, the string is the actual token character +// sequence (e.g., for the token ASSIGN, the string is "="). For all other +// tokens the string corresponds to the token constant name (e.g. for the +// token IDENT, the string is "IDENT"). +// +func (tok Token) String() string { + s := "" + if 0 <= tok && tok < Token(len(tokens)) { + s = tokens[tok] + } + if s == "" { + s = "token(" + strconv.Itoa(int(tok)) + ")" + } + return s +} + +// Predicates + +// IsLiteral returns true for tokens corresponding to identifiers +// and basic type literals; it returns false otherwise. +// +func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end } + +// IsOperator returns true for tokens corresponding to operators and +// delimiters; it returns false otherwise. +// +func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end } diff --git a/vendor/github.com/go-git/gcfg/types/bool.go b/vendor/github.com/go-git/gcfg/types/bool.go new file mode 100644 index 0000000000..8dcae0d8cf --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/bool.go @@ -0,0 +1,23 @@ +package types + +// BoolValues defines the name and value mappings for ParseBool. +var BoolValues = map[string]interface{}{ + "true": true, "yes": true, "on": true, "1": true, + "false": false, "no": false, "off": false, "0": false, +} + +var boolParser = func() *EnumParser { + ep := &EnumParser{} + ep.AddVals(BoolValues) + return ep +}() + +// ParseBool parses bool values according to the definitions in BoolValues. +// Parsing is case-insensitive. +func ParseBool(s string) (bool, error) { + v, err := boolParser.Parse(s) + if err != nil { + return false, err + } + return v.(bool), nil +} diff --git a/vendor/github.com/go-git/gcfg/types/doc.go b/vendor/github.com/go-git/gcfg/types/doc.go new file mode 100644 index 0000000000..9f9c345f6e --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/doc.go @@ -0,0 +1,4 @@ +// Package types defines helpers for type conversions. +// +// The API for this package is not finalized yet. +package types diff --git a/vendor/github.com/go-git/gcfg/types/enum.go b/vendor/github.com/go-git/gcfg/types/enum.go new file mode 100644 index 0000000000..1a0c7ef453 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/enum.go @@ -0,0 +1,44 @@ +package types + +import ( + "fmt" + "reflect" + "strings" +) + +// EnumParser parses "enum" values; i.e. a predefined set of strings to +// predefined values. +type EnumParser struct { + Type string // type name; if not set, use type of first value added + CaseMatch bool // if true, matching of strings is case-sensitive + // PrefixMatch bool + vals map[string]interface{} +} + +// AddVals adds strings and values to an EnumParser. +func (ep *EnumParser) AddVals(vals map[string]interface{}) { + if ep.vals == nil { + ep.vals = make(map[string]interface{}) + } + for k, v := range vals { + if ep.Type == "" { + ep.Type = reflect.TypeOf(v).Name() + } + if !ep.CaseMatch { + k = strings.ToLower(k) + } + ep.vals[k] = v + } +} + +// Parse parses the string and returns the value or an error. +func (ep EnumParser) Parse(s string) (interface{}, error) { + if !ep.CaseMatch { + s = strings.ToLower(s) + } + v, ok := ep.vals[s] + if !ok { + return false, fmt.Errorf("failed to parse %s %#q", ep.Type, s) + } + return v, nil +} diff --git a/vendor/github.com/go-git/gcfg/types/int.go b/vendor/github.com/go-git/gcfg/types/int.go new file mode 100644 index 0000000000..af7e75c125 --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/int.go @@ -0,0 +1,86 @@ +package types + +import ( + "fmt" + "strings" +) + +// An IntMode is a mode for parsing integer values, representing a set of +// accepted bases. +type IntMode uint8 + +// IntMode values for ParseInt; can be combined using binary or. +const ( + Dec IntMode = 1 << iota + Hex + Oct +) + +// String returns a string representation of IntMode; e.g. `IntMode(Dec|Hex)`. +func (m IntMode) String() string { + var modes []string + if m&Dec != 0 { + modes = append(modes, "Dec") + } + if m&Hex != 0 { + modes = append(modes, "Hex") + } + if m&Oct != 0 { + modes = append(modes, "Oct") + } + return "IntMode(" + strings.Join(modes, "|") + ")" +} + +var errIntAmbig = fmt.Errorf("ambiguous integer value; must include '0' prefix") + +func prefix0(val string) bool { + return strings.HasPrefix(val, "0") || strings.HasPrefix(val, "-0") +} + +func prefix0x(val string) bool { + return strings.HasPrefix(val, "0x") || strings.HasPrefix(val, "-0x") +} + +// ParseInt parses val using mode into intptr, which must be a pointer to an +// integer kind type. Non-decimal value require prefix `0` or `0x` in the cases +// when mode permits ambiguity of base; otherwise the prefix can be omitted. +func ParseInt(intptr interface{}, val string, mode IntMode) error { + val = strings.TrimSpace(val) + verb := byte(0) + switch mode { + case Dec: + verb = 'd' + case Dec + Hex: + if prefix0x(val) { + verb = 'v' + } else { + verb = 'd' + } + case Dec + Oct: + if prefix0(val) && !prefix0x(val) { + verb = 'v' + } else { + verb = 'd' + } + case Dec + Hex + Oct: + verb = 'v' + case Hex: + if prefix0x(val) { + verb = 'v' + } else { + verb = 'x' + } + case Oct: + verb = 'o' + case Hex + Oct: + if prefix0(val) { + verb = 'v' + } else { + return errIntAmbig + } + } + if verb == 0 { + panic("unsupported mode") + } + return ScanFully(intptr, val, verb) +} diff --git a/vendor/github.com/go-git/gcfg/types/scan.go b/vendor/github.com/go-git/gcfg/types/scan.go new file mode 100644 index 0000000000..db2f6ed3ca --- /dev/null +++ b/vendor/github.com/go-git/gcfg/types/scan.go @@ -0,0 +1,23 @@ +package types + +import ( + "fmt" + "io" + "reflect" +) + +// ScanFully uses fmt.Sscanf with verb to fully scan val into ptr. +func ScanFully(ptr interface{}, val string, verb byte) error { + t := reflect.ValueOf(ptr).Elem().Type() + // attempt to read extra bytes to make sure the value is consumed + var b []byte + n, err := fmt.Sscanf(val, "%"+string(verb)+"%s", ptr, &b) + switch { + case n < 1 || n == 1 && err != io.EOF: + return fmt.Errorf("failed to parse %q as %v: %v", val, t, err) + case n > 1: + return fmt.Errorf("failed to parse %q as %v: extra characters %q", val, t, string(b)) + } + // n == 1 && err == io.EOF + return nil +} diff --git a/vendor/github.com/go-git/go-billy/v5/.gitignore b/vendor/github.com/go-git/go-billy/v5/.gitignore new file mode 100644 index 0000000000..7aeb46699c --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/.gitignore @@ -0,0 +1,4 @@ +/coverage.txt +/vendor +Gopkg.lock +Gopkg.toml diff --git a/vendor/github.com/go-git/go-billy/v5/LICENSE b/vendor/github.com/go-git/go-billy/v5/LICENSE new file mode 100644 index 0000000000..9d60756894 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Sourced Technologies S.L. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-git/go-billy/v5/README.md b/vendor/github.com/go-git/go-billy/v5/README.md new file mode 100644 index 0000000000..da5c074782 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/README.md @@ -0,0 +1,73 @@ +# go-billy [![GoDoc](https://godoc.org/gopkg.in/go-git/go-billy.v5?status.svg)](https://pkg.go.dev/github.com/go-git/go-billy/v5) [![Test](https://github.com/go-git/go-billy/workflows/Test/badge.svg)](https://github.com/go-git/go-billy/actions?query=workflow%3ATest) + +The missing interface filesystem abstraction for Go. +Billy implements an interface based on the `os` standard library, allowing to develop applications without dependency on the underlying storage. Makes it virtually free to implement mocks and testing over filesystem operations. + +Billy was born as part of [go-git/go-git](https://github.com/go-git/go-git) project. + +## Installation + +```go +import "github.com/go-git/go-billy/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH) +import "github.com/go-git/go-billy" // with go modules disabled +``` + +## Usage + +Billy exposes filesystems using the +[`Filesystem` interface](https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem). +Each filesystem implementation gives you a `New` method, whose arguments depend on +the implementation itself, that returns a new `Filesystem`. + +The following example caches in memory all readable files in a directory from any +billy's filesystem implementation. + +```go +func LoadToMemory(origin billy.Filesystem, path string) (*memory.Memory, error) { + memory := memory.New() + + files, err := origin.ReadDir("/") + if err != nil { + return nil, err + } + + for _, file := range files { + if file.IsDir() { + continue + } + + src, err := origin.Open(file.Name()) + if err != nil { + return nil, err + } + + dst, err := memory.Create(file.Name()) + if err != nil { + return nil, err + } + + if _, err = io.Copy(dst, src); err != nil { + return nil, err + } + + if err := dst.Close(); err != nil { + return nil, err + } + + if err := src.Close(); err != nil { + return nil, err + } + } + + return memory, nil +} +``` + +## Why billy? + +The library billy deals with storage systems and Billy is the name of a well-known, IKEA +bookcase. That's it. + +## License + +Apache License Version 2.0, see [LICENSE](LICENSE) diff --git a/vendor/github.com/go-git/go-billy/v5/fs.go b/vendor/github.com/go-git/go-billy/v5/fs.go new file mode 100644 index 0000000000..a9efccdeb2 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/fs.go @@ -0,0 +1,202 @@ +package billy + +import ( + "errors" + "io" + "os" + "time" +) + +var ( + ErrReadOnly = errors.New("read-only filesystem") + ErrNotSupported = errors.New("feature not supported") + ErrCrossedBoundary = errors.New("chroot boundary crossed") +) + +// Capability holds the supported features of a billy filesystem. This does +// not mean that the capability has to be supported by the underlying storage. +// For example, a billy filesystem may support WriteCapability but the +// storage be mounted in read only mode. +type Capability uint64 + +const ( + // WriteCapability means that the fs is writable. + WriteCapability Capability = 1 << iota + // ReadCapability means that the fs is readable. + ReadCapability + // ReadAndWriteCapability is the ability to open a file in read and write mode. + ReadAndWriteCapability + // SeekCapability means it is able to move position inside the file. + SeekCapability + // TruncateCapability means that a file can be truncated. + TruncateCapability + // LockCapability is the ability to lock a file. + LockCapability + + // DefaultCapabilities lists all capable features supported by filesystems + // without Capability interface. This list should not be changed until a + // major version is released. + DefaultCapabilities Capability = WriteCapability | ReadCapability | + ReadAndWriteCapability | SeekCapability | TruncateCapability | + LockCapability + + // AllCapabilities lists all capable features. + AllCapabilities Capability = WriteCapability | ReadCapability | + ReadAndWriteCapability | SeekCapability | TruncateCapability | + LockCapability +) + +// Filesystem abstract the operations in a storage-agnostic interface. +// Each method implementation mimics the behavior of the equivalent functions +// at the os package from the standard library. +type Filesystem interface { + Basic + TempFile + Dir + Symlink + Chroot +} + +// Basic abstract the basic operations in a storage-agnostic interface as +// an extension to the Basic interface. +type Basic interface { + // Create creates the named file with mode 0666 (before umask), truncating + // it if it already exists. If successful, methods on the returned File can + // be used for I/O; the associated file descriptor has mode O_RDWR. + Create(filename string) (File, error) + // Open opens the named file for reading. If successful, methods on the + // returned file can be used for reading; the associated file descriptor has + // mode O_RDONLY. + Open(filename string) (File, error) + // OpenFile is the generalized open call; most users will use Open or Create + // instead. It opens the named file with specified flag (O_RDONLY etc.) and + // perm, (0666 etc.) if applicable. If successful, methods on the returned + // File can be used for I/O. + OpenFile(filename string, flag int, perm os.FileMode) (File, error) + // Stat returns a FileInfo describing the named file. + Stat(filename string) (os.FileInfo, error) + // Rename renames (moves) oldpath to newpath. If newpath already exists and + // is not a directory, Rename replaces it. OS-specific restrictions may + // apply when oldpath and newpath are in different directories. + Rename(oldpath, newpath string) error + // Remove removes the named file or directory. + Remove(filename string) error + // Join joins any number of path elements into a single path, adding a + // Separator if necessary. Join calls filepath.Clean on the result; in + // particular, all empty strings are ignored. On Windows, the result is a + // UNC path if and only if the first path element is a UNC path. + Join(elem ...string) string +} + +type TempFile interface { + // TempFile creates a new temporary file in the directory dir with a name + // beginning with prefix, opens the file for reading and writing, and + // returns the resulting *os.File. If dir is the empty string, TempFile + // uses the default directory for temporary files (see os.TempDir). + // Multiple programs calling TempFile simultaneously will not choose the + // same file. The caller can use f.Name() to find the pathname of the file. + // It is the caller's responsibility to remove the file when no longer + // needed. + TempFile(dir, prefix string) (File, error) +} + +// Dir abstract the dir related operations in a storage-agnostic interface as +// an extension to the Basic interface. +type Dir interface { + // ReadDir reads the directory named by dirname and returns a list of + // directory entries sorted by filename. + ReadDir(path string) ([]os.FileInfo, error) + // MkdirAll creates a directory named path, along with any necessary + // parents, and returns nil, or else returns an error. The permission bits + // perm are used for all directories that MkdirAll creates. If path is/ + // already a directory, MkdirAll does nothing and returns nil. + MkdirAll(filename string, perm os.FileMode) error +} + +// Symlink abstract the symlink related operations in a storage-agnostic +// interface as an extension to the Basic interface. +type Symlink interface { + // Lstat returns a FileInfo describing the named file. If the file is a + // symbolic link, the returned FileInfo describes the symbolic link. Lstat + // makes no attempt to follow the link. + Lstat(filename string) (os.FileInfo, error) + // Symlink creates a symbolic-link from link to target. target may be an + // absolute or relative path, and need not refer to an existing node. + // Parent directories of link are created as necessary. + Symlink(target, link string) error + // Readlink returns the target path of link. + Readlink(link string) (string, error) +} + +// Change abstract the FileInfo change related operations in a storage-agnostic +// interface as an extension to the Basic interface +type Change interface { + // Chmod changes the mode of the named file to mode. If the file is a + // symbolic link, it changes the mode of the link's target. + Chmod(name string, mode os.FileMode) error + // Lchown changes the numeric uid and gid of the named file. If the file is + // a symbolic link, it changes the uid and gid of the link itself. + Lchown(name string, uid, gid int) error + // Chown changes the numeric uid and gid of the named file. If the file is a + // symbolic link, it changes the uid and gid of the link's target. + Chown(name string, uid, gid int) error + // Chtimes changes the access and modification times of the named file, + // similar to the Unix utime() or utimes() functions. + // + // The underlying filesystem may truncate or round the values to a less + // precise time unit. + Chtimes(name string, atime time.Time, mtime time.Time) error +} + +// Chroot abstract the chroot related operations in a storage-agnostic interface +// as an extension to the Basic interface. +type Chroot interface { + // Chroot returns a new filesystem from the same type where the new root is + // the given path. Files outside of the designated directory tree cannot be + // accessed. + Chroot(path string) (Filesystem, error) + // Root returns the root path of the filesystem. + Root() string +} + +// File represent a file, being a subset of the os.File +type File interface { + // Name returns the name of the file as presented to Open. + Name() string + io.Writer + io.Reader + io.ReaderAt + io.Seeker + io.Closer + // Lock locks the file like e.g. flock. It protects against access from + // other processes. + Lock() error + // Unlock unlocks the file. + Unlock() error + // Truncate the file. + Truncate(size int64) error +} + +// Capable interface can return the available features of a filesystem. +type Capable interface { + // Capabilities returns the capabilities of a filesystem in bit flags. + Capabilities() Capability +} + +// Capabilities returns the features supported by a filesystem. If the FS +// does not implement Capable interface it returns all features. +func Capabilities(fs Basic) Capability { + capable, ok := fs.(Capable) + if !ok { + return DefaultCapabilities + } + + return capable.Capabilities() +} + +// CapabilityCheck tests the filesystem for the provided capabilities and +// returns true in case it supports all of them. +func CapabilityCheck(fs Basic, capabilities Capability) bool { + fsCaps := Capabilities(fs) + return fsCaps&capabilities == capabilities +} diff --git a/vendor/github.com/go-git/go-billy/v5/go.mod b/vendor/github.com/go-git/go-billy/v5/go.mod new file mode 100644 index 0000000000..78ce0af2a5 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/go.mod @@ -0,0 +1,10 @@ +module github.com/go-git/go-billy/v5 + +require ( + github.com/kr/text v0.2.0 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f +) + +go 1.13 diff --git a/vendor/github.com/go-git/go-billy/v5/go.sum b/vendor/github.com/go-git/go-billy/v5/go.sum new file mode 100644 index 0000000000..cdc052bc7e --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/go.sum @@ -0,0 +1,14 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/go-git/go-billy v1.0.0 h1:bXR6Zu3opPSg0R4dDxqaLglY4rxw7ja7wS16qSpOKL4= +github.com/go-git/go-billy v3.1.0+incompatible h1:dwrJ8G2Jt1srYgIJs+lRjA36qBY68O2Lg5idKG8ef5M= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go b/vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go new file mode 100644 index 0000000000..8b44e784bd --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/helper/chroot/chroot.go @@ -0,0 +1,242 @@ +package chroot + +import ( + "os" + "path/filepath" + "strings" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/helper/polyfill" +) + +// ChrootHelper is a helper to implement billy.Chroot. +type ChrootHelper struct { + underlying billy.Filesystem + base string +} + +// New creates a new filesystem wrapping up the given 'fs'. +// The created filesystem has its base in the given ChrootHelperectory of the +// underlying filesystem. +func New(fs billy.Basic, base string) billy.Filesystem { + return &ChrootHelper{ + underlying: polyfill.New(fs), + base: base, + } +} + +func (fs *ChrootHelper) underlyingPath(filename string) (string, error) { + if isCrossBoundaries(filename) { + return "", billy.ErrCrossedBoundary + } + + return fs.Join(fs.Root(), filename), nil +} + +func isCrossBoundaries(path string) bool { + path = filepath.ToSlash(path) + path = filepath.Clean(path) + + return strings.HasPrefix(path, ".."+string(filepath.Separator)) +} + +func (fs *ChrootHelper) Create(filename string) (billy.File, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + f, err := fs.underlying.Create(fullpath) + if err != nil { + return nil, err + } + + return newFile(fs, f, filename), nil +} + +func (fs *ChrootHelper) Open(filename string) (billy.File, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + f, err := fs.underlying.Open(fullpath) + if err != nil { + return nil, err + } + + return newFile(fs, f, filename), nil +} + +func (fs *ChrootHelper) OpenFile(filename string, flag int, mode os.FileMode) (billy.File, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + f, err := fs.underlying.OpenFile(fullpath, flag, mode) + if err != nil { + return nil, err + } + + return newFile(fs, f, filename), nil +} + +func (fs *ChrootHelper) Stat(filename string) (os.FileInfo, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + return fs.underlying.Stat(fullpath) +} + +func (fs *ChrootHelper) Rename(from, to string) error { + var err error + from, err = fs.underlyingPath(from) + if err != nil { + return err + } + + to, err = fs.underlyingPath(to) + if err != nil { + return err + } + + return fs.underlying.Rename(from, to) +} + +func (fs *ChrootHelper) Remove(path string) error { + fullpath, err := fs.underlyingPath(path) + if err != nil { + return err + } + + return fs.underlying.Remove(fullpath) +} + +func (fs *ChrootHelper) Join(elem ...string) string { + return fs.underlying.Join(elem...) +} + +func (fs *ChrootHelper) TempFile(dir, prefix string) (billy.File, error) { + fullpath, err := fs.underlyingPath(dir) + if err != nil { + return nil, err + } + + f, err := fs.underlying.(billy.TempFile).TempFile(fullpath, prefix) + if err != nil { + return nil, err + } + + return newFile(fs, f, fs.Join(dir, filepath.Base(f.Name()))), nil +} + +func (fs *ChrootHelper) ReadDir(path string) ([]os.FileInfo, error) { + fullpath, err := fs.underlyingPath(path) + if err != nil { + return nil, err + } + + return fs.underlying.(billy.Dir).ReadDir(fullpath) +} + +func (fs *ChrootHelper) MkdirAll(filename string, perm os.FileMode) error { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return err + } + + return fs.underlying.(billy.Dir).MkdirAll(fullpath, perm) +} + +func (fs *ChrootHelper) Lstat(filename string) (os.FileInfo, error) { + fullpath, err := fs.underlyingPath(filename) + if err != nil { + return nil, err + } + + return fs.underlying.(billy.Symlink).Lstat(fullpath) +} + +func (fs *ChrootHelper) Symlink(target, link string) error { + target = filepath.FromSlash(target) + + // only rewrite target if it's already absolute + if filepath.IsAbs(target) || strings.HasPrefix(target, string(filepath.Separator)) { + target = fs.Join(fs.Root(), target) + target = filepath.Clean(filepath.FromSlash(target)) + } + + link, err := fs.underlyingPath(link) + if err != nil { + return err + } + + return fs.underlying.(billy.Symlink).Symlink(target, link) +} + +func (fs *ChrootHelper) Readlink(link string) (string, error) { + fullpath, err := fs.underlyingPath(link) + if err != nil { + return "", err + } + + target, err := fs.underlying.(billy.Symlink).Readlink(fullpath) + if err != nil { + return "", err + } + + if !filepath.IsAbs(target) && !strings.HasPrefix(target, string(filepath.Separator)) { + return target, nil + } + + target, err = filepath.Rel(fs.base, target) + if err != nil { + return "", err + } + + return string(os.PathSeparator) + target, nil +} + +func (fs *ChrootHelper) Chroot(path string) (billy.Filesystem, error) { + fullpath, err := fs.underlyingPath(path) + if err != nil { + return nil, err + } + + return New(fs.underlying, fullpath), nil +} + +func (fs *ChrootHelper) Root() string { + return fs.base +} + +func (fs *ChrootHelper) Underlying() billy.Basic { + return fs.underlying +} + +// Capabilities implements the Capable interface. +func (fs *ChrootHelper) Capabilities() billy.Capability { + return billy.Capabilities(fs.underlying) +} + +type file struct { + billy.File + name string +} + +func newFile(fs billy.Filesystem, f billy.File, filename string) billy.File { + filename = fs.Join(fs.Root(), filename) + filename, _ = filepath.Rel(fs.Root(), filename) + + return &file{ + File: f, + name: filename, + } +} + +func (f *file) Name() string { + return f.name +} diff --git a/vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go b/vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go new file mode 100644 index 0000000000..1efce0e7b8 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/helper/polyfill/polyfill.go @@ -0,0 +1,105 @@ +package polyfill + +import ( + "os" + "path/filepath" + + "github.com/go-git/go-billy/v5" +) + +// Polyfill is a helper that implements all missing method from billy.Filesystem. +type Polyfill struct { + billy.Basic + c capabilities +} + +type capabilities struct{ tempfile, dir, symlink, chroot bool } + +// New creates a new filesystem wrapping up 'fs' the intercepts all the calls +// made and errors if fs doesn't implement any of the billy interfaces. +func New(fs billy.Basic) billy.Filesystem { + if original, ok := fs.(billy.Filesystem); ok { + return original + } + + h := &Polyfill{Basic: fs} + + _, h.c.tempfile = h.Basic.(billy.TempFile) + _, h.c.dir = h.Basic.(billy.Dir) + _, h.c.symlink = h.Basic.(billy.Symlink) + _, h.c.chroot = h.Basic.(billy.Chroot) + return h +} + +func (h *Polyfill) TempFile(dir, prefix string) (billy.File, error) { + if !h.c.tempfile { + return nil, billy.ErrNotSupported + } + + return h.Basic.(billy.TempFile).TempFile(dir, prefix) +} + +func (h *Polyfill) ReadDir(path string) ([]os.FileInfo, error) { + if !h.c.dir { + return nil, billy.ErrNotSupported + } + + return h.Basic.(billy.Dir).ReadDir(path) +} + +func (h *Polyfill) MkdirAll(filename string, perm os.FileMode) error { + if !h.c.dir { + return billy.ErrNotSupported + } + + return h.Basic.(billy.Dir).MkdirAll(filename, perm) +} + +func (h *Polyfill) Symlink(target, link string) error { + if !h.c.symlink { + return billy.ErrNotSupported + } + + return h.Basic.(billy.Symlink).Symlink(target, link) +} + +func (h *Polyfill) Readlink(link string) (string, error) { + if !h.c.symlink { + return "", billy.ErrNotSupported + } + + return h.Basic.(billy.Symlink).Readlink(link) +} + +func (h *Polyfill) Lstat(path string) (os.FileInfo, error) { + if !h.c.symlink { + return nil, billy.ErrNotSupported + } + + return h.Basic.(billy.Symlink).Lstat(path) +} + +func (h *Polyfill) Chroot(path string) (billy.Filesystem, error) { + if !h.c.chroot { + return nil, billy.ErrNotSupported + } + + return h.Basic.(billy.Chroot).Chroot(path) +} + +func (h *Polyfill) Root() string { + if !h.c.chroot { + return string(filepath.Separator) + } + + return h.Basic.(billy.Chroot).Root() +} + +func (h *Polyfill) Underlying() billy.Basic { + return h.Basic +} + +// Capabilities implements the Capable interface. +func (h *Polyfill) Capabilities() billy.Capability { + return billy.Capabilities(h.Basic) +} diff --git a/vendor/github.com/go-git/go-billy/v5/memfs/memory.go b/vendor/github.com/go-git/go-billy/v5/memfs/memory.go new file mode 100644 index 0000000000..f217693e6f --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/memfs/memory.go @@ -0,0 +1,410 @@ +// Package memfs provides a billy filesystem base on memory. +package memfs // import "github.com/go-git/go-billy/v5/memfs" + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" + "time" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/helper/chroot" + "github.com/go-git/go-billy/v5/util" +) + +const separator = filepath.Separator + +// Memory a very convenient filesystem based on memory files +type Memory struct { + s *storage + + tempCount int +} + +//New returns a new Memory filesystem. +func New() billy.Filesystem { + fs := &Memory{s: newStorage()} + return chroot.New(fs, string(separator)) +} + +func (fs *Memory) Create(filename string) (billy.File, error) { + return fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) +} + +func (fs *Memory) Open(filename string) (billy.File, error) { + return fs.OpenFile(filename, os.O_RDONLY, 0) +} + +func (fs *Memory) OpenFile(filename string, flag int, perm os.FileMode) (billy.File, error) { + f, has := fs.s.Get(filename) + if !has { + if !isCreate(flag) { + return nil, os.ErrNotExist + } + + var err error + f, err = fs.s.New(filename, perm, flag) + if err != nil { + return nil, err + } + } else { + if isExclusive(flag) { + return nil, os.ErrExist + } + + if target, isLink := fs.resolveLink(filename, f); isLink { + return fs.OpenFile(target, flag, perm) + } + } + + if f.mode.IsDir() { + return nil, fmt.Errorf("cannot open directory: %s", filename) + } + + return f.Duplicate(filename, perm, flag), nil +} + +var errNotLink = errors.New("not a link") + +func (fs *Memory) resolveLink(fullpath string, f *file) (target string, isLink bool) { + if !isSymlink(f.mode) { + return fullpath, false + } + + target = string(f.content.bytes) + if !isAbs(target) { + target = fs.Join(filepath.Dir(fullpath), target) + } + + return target, true +} + +// On Windows OS, IsAbs validates if a path is valid based on if stars with a +// unit (eg.: `C:\`) to assert that is absolute, but in this mem implementation +// any path starting by `separator` is also considered absolute. +func isAbs(path string) bool { + return filepath.IsAbs(path) || strings.HasPrefix(path, string(separator)) +} + +func (fs *Memory) Stat(filename string) (os.FileInfo, error) { + f, has := fs.s.Get(filename) + if !has { + return nil, os.ErrNotExist + } + + fi, _ := f.Stat() + + var err error + if target, isLink := fs.resolveLink(filename, f); isLink { + fi, err = fs.Stat(target) + if err != nil { + return nil, err + } + } + + // the name of the file should always the name of the stated file, so we + // overwrite the Stat returned from the storage with it, since the + // filename may belong to a link. + fi.(*fileInfo).name = filepath.Base(filename) + return fi, nil +} + +func (fs *Memory) Lstat(filename string) (os.FileInfo, error) { + f, has := fs.s.Get(filename) + if !has { + return nil, os.ErrNotExist + } + + return f.Stat() +} + +type ByName []os.FileInfo + +func (a ByName) Len() int { return len(a) } +func (a ByName) Less(i, j int) bool { return a[i].Name() < a[j].Name() } +func (a ByName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func (fs *Memory) ReadDir(path string) ([]os.FileInfo, error) { + if f, has := fs.s.Get(path); has { + if target, isLink := fs.resolveLink(path, f); isLink { + return fs.ReadDir(target) + } + } + + var entries []os.FileInfo + for _, f := range fs.s.Children(path) { + fi, _ := f.Stat() + entries = append(entries, fi) + } + + sort.Sort(ByName(entries)) + + return entries, nil +} + +func (fs *Memory) MkdirAll(path string, perm os.FileMode) error { + _, err := fs.s.New(path, perm|os.ModeDir, 0) + return err +} + +func (fs *Memory) TempFile(dir, prefix string) (billy.File, error) { + return util.TempFile(fs, dir, prefix) +} + +func (fs *Memory) getTempFilename(dir, prefix string) string { + fs.tempCount++ + filename := fmt.Sprintf("%s_%d_%d", prefix, fs.tempCount, time.Now().UnixNano()) + return fs.Join(dir, filename) +} + +func (fs *Memory) Rename(from, to string) error { + return fs.s.Rename(from, to) +} + +func (fs *Memory) Remove(filename string) error { + return fs.s.Remove(filename) +} + +func (fs *Memory) Join(elem ...string) string { + return filepath.Join(elem...) +} + +func (fs *Memory) Symlink(target, link string) error { + _, err := fs.Stat(link) + if err == nil { + return os.ErrExist + } + + if !os.IsNotExist(err) { + return err + } + + return util.WriteFile(fs, link, []byte(target), 0777|os.ModeSymlink) +} + +func (fs *Memory) Readlink(link string) (string, error) { + f, has := fs.s.Get(link) + if !has { + return "", os.ErrNotExist + } + + if !isSymlink(f.mode) { + return "", &os.PathError{ + Op: "readlink", + Path: link, + Err: fmt.Errorf("not a symlink"), + } + } + + return string(f.content.bytes), nil +} + +// Capabilities implements the Capable interface. +func (fs *Memory) Capabilities() billy.Capability { + return billy.WriteCapability | + billy.ReadCapability | + billy.ReadAndWriteCapability | + billy.SeekCapability | + billy.TruncateCapability +} + +type file struct { + name string + content *content + position int64 + flag int + mode os.FileMode + + isClosed bool +} + +func (f *file) Name() string { + return f.name +} + +func (f *file) Read(b []byte) (int, error) { + n, err := f.ReadAt(b, f.position) + f.position += int64(n) + + if err == io.EOF && n != 0 { + err = nil + } + + return n, err +} + +func (f *file) ReadAt(b []byte, off int64) (int, error) { + if f.isClosed { + return 0, os.ErrClosed + } + + if !isReadAndWrite(f.flag) && !isReadOnly(f.flag) { + return 0, errors.New("read not supported") + } + + n, err := f.content.ReadAt(b, off) + + return n, err +} + +func (f *file) Seek(offset int64, whence int) (int64, error) { + if f.isClosed { + return 0, os.ErrClosed + } + + switch whence { + case io.SeekCurrent: + f.position += offset + case io.SeekStart: + f.position = offset + case io.SeekEnd: + f.position = int64(f.content.Len()) + offset + } + + return f.position, nil +} + +func (f *file) Write(p []byte) (int, error) { + if f.isClosed { + return 0, os.ErrClosed + } + + if !isReadAndWrite(f.flag) && !isWriteOnly(f.flag) { + return 0, errors.New("write not supported") + } + + n, err := f.content.WriteAt(p, f.position) + f.position += int64(n) + + return n, err +} + +func (f *file) Close() error { + if f.isClosed { + return os.ErrClosed + } + + f.isClosed = true + return nil +} + +func (f *file) Truncate(size int64) error { + if size < int64(len(f.content.bytes)) { + f.content.bytes = f.content.bytes[:size] + } else if more := int(size) - len(f.content.bytes); more > 0 { + f.content.bytes = append(f.content.bytes, make([]byte, more)...) + } + + return nil +} + +func (f *file) Duplicate(filename string, mode os.FileMode, flag int) billy.File { + new := &file{ + name: filename, + content: f.content, + mode: mode, + flag: flag, + } + + if isAppend(flag) { + new.position = int64(new.content.Len()) + } + + if isTruncate(flag) { + new.content.Truncate() + } + + return new +} + +func (f *file) Stat() (os.FileInfo, error) { + return &fileInfo{ + name: f.Name(), + mode: f.mode, + size: f.content.Len(), + }, nil +} + +// Lock is a no-op in memfs. +func (f *file) Lock() error { + return nil +} + +// Unlock is a no-op in memfs. +func (f *file) Unlock() error { + return nil +} + +type fileInfo struct { + name string + size int + mode os.FileMode +} + +func (fi *fileInfo) Name() string { + return fi.name +} + +func (fi *fileInfo) Size() int64 { + return int64(fi.size) +} + +func (fi *fileInfo) Mode() os.FileMode { + return fi.mode +} + +func (*fileInfo) ModTime() time.Time { + return time.Now() +} + +func (fi *fileInfo) IsDir() bool { + return fi.mode.IsDir() +} + +func (*fileInfo) Sys() interface{} { + return nil +} + +func (c *content) Truncate() { + c.bytes = make([]byte, 0) +} + +func (c *content) Len() int { + return len(c.bytes) +} + +func isCreate(flag int) bool { + return flag&os.O_CREATE != 0 +} + +func isExclusive(flag int) bool { + return flag&os.O_EXCL != 0 +} + +func isAppend(flag int) bool { + return flag&os.O_APPEND != 0 +} + +func isTruncate(flag int) bool { + return flag&os.O_TRUNC != 0 +} + +func isReadAndWrite(flag int) bool { + return flag&os.O_RDWR != 0 +} + +func isReadOnly(flag int) bool { + return flag == os.O_RDONLY +} + +func isWriteOnly(flag int) bool { + return flag&os.O_WRONLY != 0 +} + +func isSymlink(m os.FileMode) bool { + return m&os.ModeSymlink != 0 +} diff --git a/vendor/github.com/go-git/go-billy/v5/memfs/storage.go b/vendor/github.com/go-git/go-billy/v5/memfs/storage.go new file mode 100644 index 0000000000..d3ff5a25db --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/memfs/storage.go @@ -0,0 +1,229 @@ +package memfs + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" +) + +type storage struct { + files map[string]*file + children map[string]map[string]*file +} + +func newStorage() *storage { + return &storage{ + files: make(map[string]*file, 0), + children: make(map[string]map[string]*file, 0), + } +} + +func (s *storage) Has(path string) bool { + path = clean(path) + + _, ok := s.files[path] + return ok +} + +func (s *storage) New(path string, mode os.FileMode, flag int) (*file, error) { + path = clean(path) + if s.Has(path) { + if !s.MustGet(path).mode.IsDir() { + return nil, fmt.Errorf("file already exists %q", path) + } + + return nil, nil + } + + name := filepath.Base(path) + + f := &file{ + name: name, + content: &content{name: name}, + mode: mode, + flag: flag, + } + + s.files[path] = f + s.createParent(path, mode, f) + return f, nil +} + +func (s *storage) createParent(path string, mode os.FileMode, f *file) error { + base := filepath.Dir(path) + base = clean(base) + if f.Name() == string(separator) { + return nil + } + + if _, err := s.New(base, mode.Perm()|os.ModeDir, 0); err != nil { + return err + } + + if _, ok := s.children[base]; !ok { + s.children[base] = make(map[string]*file, 0) + } + + s.children[base][f.Name()] = f + return nil +} + +func (s *storage) Children(path string) []*file { + path = clean(path) + + l := make([]*file, 0) + for _, f := range s.children[path] { + l = append(l, f) + } + + return l +} + +func (s *storage) MustGet(path string) *file { + f, ok := s.Get(path) + if !ok { + panic(fmt.Errorf("couldn't find %q", path)) + } + + return f +} + +func (s *storage) Get(path string) (*file, bool) { + path = clean(path) + if !s.Has(path) { + return nil, false + } + + file, ok := s.files[path] + return file, ok +} + +func (s *storage) Rename(from, to string) error { + from = clean(from) + to = clean(to) + + if !s.Has(from) { + return os.ErrNotExist + } + + move := [][2]string{{from, to}} + + for pathFrom := range s.files { + if pathFrom == from || !filepath.HasPrefix(pathFrom, from) { + continue + } + + rel, _ := filepath.Rel(from, pathFrom) + pathTo := filepath.Join(to, rel) + + move = append(move, [2]string{pathFrom, pathTo}) + } + + for _, ops := range move { + from := ops[0] + to := ops[1] + + if err := s.move(from, to); err != nil { + return err + } + } + + return nil +} + +func (s *storage) move(from, to string) error { + s.files[to] = s.files[from] + s.files[to].name = filepath.Base(to) + s.children[to] = s.children[from] + + defer func() { + delete(s.children, from) + delete(s.files, from) + delete(s.children[filepath.Dir(from)], filepath.Base(from)) + }() + + return s.createParent(to, 0644, s.files[to]) +} + +func (s *storage) Remove(path string) error { + path = clean(path) + + f, has := s.Get(path) + if !has { + return os.ErrNotExist + } + + if f.mode.IsDir() && len(s.children[path]) != 0 { + return fmt.Errorf("dir: %s contains files", path) + } + + base, file := filepath.Split(path) + base = filepath.Clean(base) + + delete(s.children[base], file) + delete(s.files, path) + return nil +} + +func clean(path string) string { + return filepath.Clean(filepath.FromSlash(path)) +} + +type content struct { + name string + bytes []byte +} + +func (c *content) WriteAt(p []byte, off int64) (int, error) { + if off < 0 { + return 0, &os.PathError{ + Op: "writeat", + Path: c.name, + Err: errors.New("negative offset"), + } + } + + prev := len(c.bytes) + + diff := int(off) - prev + if diff > 0 { + c.bytes = append(c.bytes, make([]byte, diff)...) + } + + c.bytes = append(c.bytes[:off], p...) + if len(c.bytes) < prev { + c.bytes = c.bytes[:prev] + } + + return len(p), nil +} + +func (c *content) ReadAt(b []byte, off int64) (n int, err error) { + if off < 0 { + return 0, &os.PathError{ + Op: "readat", + Path: c.name, + Err: errors.New("negative offset"), + } + } + + size := int64(len(c.bytes)) + if off >= size { + return 0, io.EOF + } + + l := int64(len(b)) + if off+l > size { + l = size - off + } + + btr := c.bytes[off : off+l] + if len(btr) < len(b) { + err = io.EOF + } + n = copy(b, btr) + + return +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os.go b/vendor/github.com/go-git/go-billy/v5/osfs/os.go new file mode 100644 index 0000000000..9665d2755d --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os.go @@ -0,0 +1,144 @@ +// +build !js + +// Package osfs provides a billy filesystem for the OS. +package osfs // import "github.com/go-git/go-billy/v5/osfs" + +import ( + "io/ioutil" + "os" + "path/filepath" + "sync" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/helper/chroot" +) + +const ( + defaultDirectoryMode = 0755 + defaultCreateMode = 0666 +) + +// Default Filesystem representing the root of the os filesystem. +var Default = &OS{} + +// OS is a filesystem based on the os filesystem. +type OS struct{} + +// New returns a new OS filesystem. +func New(baseDir string) billy.Filesystem { + return chroot.New(Default, baseDir) +} + +func (fs *OS) Create(filename string) (billy.File, error) { + return fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, defaultCreateMode) +} + +func (fs *OS) OpenFile(filename string, flag int, perm os.FileMode) (billy.File, error) { + if flag&os.O_CREATE != 0 { + if err := fs.createDir(filename); err != nil { + return nil, err + } + } + + f, err := os.OpenFile(filename, flag, perm) + if err != nil { + return nil, err + } + return &file{File: f}, err +} + +func (fs *OS) createDir(fullpath string) error { + dir := filepath.Dir(fullpath) + if dir != "." { + if err := os.MkdirAll(dir, defaultDirectoryMode); err != nil { + return err + } + } + + return nil +} + +func (fs *OS) ReadDir(path string) ([]os.FileInfo, error) { + l, err := ioutil.ReadDir(path) + if err != nil { + return nil, err + } + + var s = make([]os.FileInfo, len(l)) + for i, f := range l { + s[i] = f + } + + return s, nil +} + +func (fs *OS) Rename(from, to string) error { + if err := fs.createDir(to); err != nil { + return err + } + + return rename(from, to) +} + +func (fs *OS) MkdirAll(path string, perm os.FileMode) error { + return os.MkdirAll(path, defaultDirectoryMode) +} + +func (fs *OS) Open(filename string) (billy.File, error) { + return fs.OpenFile(filename, os.O_RDONLY, 0) +} + +func (fs *OS) Stat(filename string) (os.FileInfo, error) { + return os.Stat(filename) +} + +func (fs *OS) Remove(filename string) error { + return os.Remove(filename) +} + +func (fs *OS) TempFile(dir, prefix string) (billy.File, error) { + if err := fs.createDir(dir + string(os.PathSeparator)); err != nil { + return nil, err + } + + f, err := ioutil.TempFile(dir, prefix) + if err != nil { + return nil, err + } + return &file{File: f}, nil +} + +func (fs *OS) Join(elem ...string) string { + return filepath.Join(elem...) +} + +func (fs *OS) RemoveAll(path string) error { + return os.RemoveAll(filepath.Clean(path)) +} + +func (fs *OS) Lstat(filename string) (os.FileInfo, error) { + return os.Lstat(filepath.Clean(filename)) +} + +func (fs *OS) Symlink(target, link string) error { + if err := fs.createDir(link); err != nil { + return err + } + + return os.Symlink(target, link) +} + +func (fs *OS) Readlink(link string) (string, error) { + return os.Readlink(link) +} + +// Capabilities implements the Capable interface. +func (fs *OS) Capabilities() billy.Capability { + return billy.DefaultCapabilities +} + +// file is a wrapper for an os.File which adds support for file locking. +type file struct { + *os.File + m sync.Mutex +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os_js.go b/vendor/github.com/go-git/go-billy/v5/osfs/os_js.go new file mode 100644 index 0000000000..8ae68fed68 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os_js.go @@ -0,0 +1,21 @@ +// +build js + +package osfs + +import ( + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/helper/chroot" + "github.com/go-git/go-billy/v5/memfs" +) + +// globalMemFs is the global memory fs +var globalMemFs = memfs.New() + +// Default Filesystem representing the root of in-memory filesystem for a +// js/wasm environment. +var Default = memfs.New() + +// New returns a new OS filesystem. +func New(baseDir string) billy.Filesystem { + return chroot.New(Default, Default.Join("/", baseDir)) +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go b/vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go new file mode 100644 index 0000000000..e8f519ffe2 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os_plan9.go @@ -0,0 +1,85 @@ +// +build plan9 + +package osfs + +import ( + "io" + "os" + "path/filepath" + "syscall" +) + +func (f *file) Lock() error { + // Plan 9 uses a mode bit instead of explicit lock/unlock syscalls. + // + // Per http://man.cat-v.org/plan_9/5/stat: “Exclusive use files may be open + // for I/O by only one fid at a time across all clients of the server. If a + // second open is attempted, it draws an error.” + // + // There is no obvious way to implement this function using the exclusive use bit. + // See https://golang.org/src/cmd/go/internal/lockedfile/lockedfile_plan9.go + // for how file locking is done by the go tool on Plan 9. + return nil +} + +func (f *file) Unlock() error { + return nil +} + +func rename(from, to string) error { + // If from and to are in different directories, copy the file + // since Plan 9 does not support cross-directory rename. + if filepath.Dir(from) != filepath.Dir(to) { + fi, err := os.Stat(from) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + if fi.Mode().IsDir() { + return &os.LinkError{"rename", from, to, syscall.EISDIR} + } + fromFile, err := os.Open(from) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + toFile, err := os.OpenFile(to, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, fi.Mode()) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + _, err = io.Copy(toFile, fromFile) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + + // Copy mtime and mode from original file. + // We need only one syscall if we avoid os.Chmod and os.Chtimes. + dir := fi.Sys().(*syscall.Dir) + var d syscall.Dir + d.Null() + d.Mtime = dir.Mtime + d.Mode = dir.Mode + if err = dirwstat(to, &d); err != nil { + return &os.LinkError{"rename", from, to, err} + } + + // Remove original file. + err = os.Remove(from) + if err != nil { + return &os.LinkError{"rename", from, to, err} + } + return nil + } + return os.Rename(from, to) +} + +func dirwstat(name string, d *syscall.Dir) error { + var buf [syscall.STATFIXLEN]byte + + n, err := d.Marshal(buf[:]) + if err != nil { + return &os.PathError{"dirwstat", name, err} + } + if err = syscall.Wstat(name, buf[:n]); err != nil { + return &os.PathError{"dirwstat", name, err} + } + return nil +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go b/vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go new file mode 100644 index 0000000000..c74d60ee6b --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os_posix.go @@ -0,0 +1,27 @@ +// +build !plan9,!windows,!js + +package osfs + +import ( + "os" + + "golang.org/x/sys/unix" +) + +func (f *file) Lock() error { + f.m.Lock() + defer f.m.Unlock() + + return unix.Flock(int(f.File.Fd()), unix.LOCK_EX) +} + +func (f *file) Unlock() error { + f.m.Lock() + defer f.m.Unlock() + + return unix.Flock(int(f.File.Fd()), unix.LOCK_UN) +} + +func rename(from, to string) error { + return os.Rename(from, to) +} diff --git a/vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go b/vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go new file mode 100644 index 0000000000..8f5caeb0ed --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/osfs/os_windows.go @@ -0,0 +1,61 @@ +// +build windows + +package osfs + +import ( + "os" + "runtime" + "unsafe" + + "golang.org/x/sys/windows" +) + +type fileInfo struct { + os.FileInfo + name string +} + +func (fi *fileInfo) Name() string { + return fi.name +} + +var ( + kernel32DLL = windows.NewLazySystemDLL("kernel32.dll") + lockFileExProc = kernel32DLL.NewProc("LockFileEx") + unlockFileProc = kernel32DLL.NewProc("UnlockFile") +) + +const ( + lockfileExclusiveLock = 0x2 +) + +func (f *file) Lock() error { + f.m.Lock() + defer f.m.Unlock() + + var overlapped windows.Overlapped + // err is always non-nil as per sys/windows semantics. + ret, _, err := lockFileExProc.Call(f.File.Fd(), lockfileExclusiveLock, 0, 0xFFFFFFFF, 0, + uintptr(unsafe.Pointer(&overlapped))) + runtime.KeepAlive(&overlapped) + if ret == 0 { + return err + } + return nil +} + +func (f *file) Unlock() error { + f.m.Lock() + defer f.m.Unlock() + + // err is always non-nil as per sys/windows semantics. + ret, _, err := unlockFileProc.Call(f.File.Fd(), 0, 0, 0xFFFFFFFF, 0) + if ret == 0 { + return err + } + return nil +} + +func rename(from, to string) error { + return os.Rename(from, to) +} diff --git a/vendor/github.com/go-git/go-billy/v5/util/glob.go b/vendor/github.com/go-git/go-billy/v5/util/glob.go new file mode 100644 index 0000000000..f7cb1de896 --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/util/glob.go @@ -0,0 +1,111 @@ +package util + +import ( + "path/filepath" + "sort" + "strings" + + "github.com/go-git/go-billy/v5" +) + +// Glob returns the names of all files matching pattern or nil +// if there is no matching file. The syntax of patterns is the same +// as in Match. The pattern may describe hierarchical names such as +// /usr/*/bin/ed (assuming the Separator is '/'). +// +// Glob ignores file system errors such as I/O errors reading directories. +// The only possible returned error is ErrBadPattern, when pattern +// is malformed. +// +// Function originally from https://golang.org/src/path/filepath/match_test.go +func Glob(fs billy.Filesystem, pattern string) (matches []string, err error) { + if !hasMeta(pattern) { + if _, err = fs.Lstat(pattern); err != nil { + return nil, nil + } + return []string{pattern}, nil + } + + dir, file := filepath.Split(pattern) + // Prevent infinite recursion. See issue 15879. + if dir == pattern { + return nil, filepath.ErrBadPattern + } + + var m []string + m, err = Glob(fs, cleanGlobPath(dir)) + if err != nil { + return + } + for _, d := range m { + matches, err = glob(fs, d, file, matches) + if err != nil { + return + } + } + return +} + +// cleanGlobPath prepares path for glob matching. +func cleanGlobPath(path string) string { + switch path { + case "": + return "." + case string(filepath.Separator): + // do nothing to the path + return path + default: + return path[0 : len(path)-1] // chop off trailing separator + } +} + +// glob searches for files matching pattern in the directory dir +// and appends them to matches. If the directory cannot be +// opened, it returns the existing matches. New matches are +// added in lexicographical order. +func glob(fs billy.Filesystem, dir, pattern string, matches []string) (m []string, e error) { + m = matches + fi, err := fs.Stat(dir) + if err != nil { + return + } + + if !fi.IsDir() { + return + } + + names, _ := readdirnames(fs, dir) + sort.Strings(names) + + for _, n := range names { + matched, err := filepath.Match(pattern, n) + if err != nil { + return m, err + } + if matched { + m = append(m, filepath.Join(dir, n)) + } + } + return +} + +// hasMeta reports whether path contains any of the magic characters +// recognized by Match. +func hasMeta(path string) bool { + // TODO(niemeyer): Should other magic characters be added here? + return strings.ContainsAny(path, "*?[") +} + +func readdirnames(fs billy.Filesystem, dir string) ([]string, error) { + files, err := fs.ReadDir(dir) + if err != nil { + return nil, err + } + + var names []string + for _, file := range files { + names = append(names, file.Name()) + } + + return names, nil +} diff --git a/vendor/github.com/go-git/go-billy/v5/util/util.go b/vendor/github.com/go-git/go-billy/v5/util/util.go new file mode 100644 index 0000000000..5c77128c3c --- /dev/null +++ b/vendor/github.com/go-git/go-billy/v5/util/util.go @@ -0,0 +1,282 @@ +package util + +import ( + "io" + "os" + "path/filepath" + "strconv" + "sync" + "time" + + "github.com/go-git/go-billy/v5" +) + +// RemoveAll removes path and any children it contains. It removes everything it +// can but returns the first error it encounters. If the path does not exist, +// RemoveAll returns nil (no error). +func RemoveAll(fs billy.Basic, path string) error { + fs, path = getUnderlyingAndPath(fs, path) + + if r, ok := fs.(removerAll); ok { + return r.RemoveAll(path) + } + + return removeAll(fs, path) +} + +type removerAll interface { + RemoveAll(string) error +} + +func removeAll(fs billy.Basic, path string) error { + // This implementation is adapted from os.RemoveAll. + + // Simple case: if Remove works, we're done. + err := fs.Remove(path) + if err == nil || os.IsNotExist(err) { + return nil + } + + // Otherwise, is this a directory we need to recurse into? + dir, serr := fs.Stat(path) + if serr != nil { + if os.IsNotExist(serr) { + return nil + } + + return serr + } + + if !dir.IsDir() { + // Not a directory; return the error from Remove. + return err + } + + dirfs, ok := fs.(billy.Dir) + if !ok { + return billy.ErrNotSupported + } + + // Directory. + fis, err := dirfs.ReadDir(path) + if err != nil { + if os.IsNotExist(err) { + // Race. It was deleted between the Lstat and Open. + // Return nil per RemoveAll's docs. + return nil + } + + return err + } + + // Remove contents & return first error. + err = nil + for _, fi := range fis { + cpath := fs.Join(path, fi.Name()) + err1 := removeAll(fs, cpath) + if err == nil { + err = err1 + } + } + + // Remove directory. + err1 := fs.Remove(path) + if err1 == nil || os.IsNotExist(err1) { + return nil + } + + if err == nil { + err = err1 + } + + return err + +} + +// WriteFile writes data to a file named by filename in the given filesystem. +// If the file does not exist, WriteFile creates it with permissions perm; +// otherwise WriteFile truncates it before writing. +func WriteFile(fs billy.Basic, filename string, data []byte, perm os.FileMode) error { + f, err := fs.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) + if err != nil { + return err + } + + n, err := f.Write(data) + if err == nil && n < len(data) { + err = io.ErrShortWrite + } + + if err1 := f.Close(); err == nil { + err = err1 + } + + return err +} + +// Random number state. +// We generate random temporary file names so that there's a good +// chance the file doesn't exist yet - keeps the number of tries in +// TempFile to a minimum. +var rand uint32 +var randmu sync.Mutex + +func reseed() uint32 { + return uint32(time.Now().UnixNano() + int64(os.Getpid())) +} + +func nextSuffix() string { + randmu.Lock() + r := rand + if r == 0 { + r = reseed() + } + r = r*1664525 + 1013904223 // constants from Numerical Recipes + rand = r + randmu.Unlock() + return strconv.Itoa(int(1e9 + r%1e9))[1:] +} + +// TempFile creates a new temporary file in the directory dir with a name +// beginning with prefix, opens the file for reading and writing, and returns +// the resulting *os.File. If dir is the empty string, TempFile uses the default +// directory for temporary files (see os.TempDir). Multiple programs calling +// TempFile simultaneously will not choose the same file. The caller can use +// f.Name() to find the pathname of the file. It is the caller's responsibility +// to remove the file when no longer needed. +func TempFile(fs billy.Basic, dir, prefix string) (f billy.File, err error) { + // This implementation is based on stdlib ioutil.TempFile. + if dir == "" { + dir = getTempDir(fs) + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + name := filepath.Join(dir, prefix+nextSuffix()) + f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + break + } + return +} + +// TempDir creates a new temporary directory in the directory dir +// with a name beginning with prefix and returns the path of the +// new directory. If dir is the empty string, TempDir uses the +// default directory for temporary files (see os.TempDir). +// Multiple programs calling TempDir simultaneously +// will not choose the same directory. It is the caller's responsibility +// to remove the directory when no longer needed. +func TempDir(fs billy.Dir, dir, prefix string) (name string, err error) { + // This implementation is based on stdlib ioutil.TempDir + + if dir == "" { + dir = getTempDir(fs.(billy.Basic)) + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + try := filepath.Join(dir, prefix+nextSuffix()) + err = fs.MkdirAll(try, 0700) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + if os.IsNotExist(err) { + if _, err := os.Stat(dir); os.IsNotExist(err) { + return "", err + } + } + if err == nil { + name = try + } + break + } + return +} + +func getTempDir(fs billy.Basic) string { + ch, ok := fs.(billy.Chroot) + if !ok || ch.Root() == "" || ch.Root() == "/" || ch.Root() == string(filepath.Separator) { + return os.TempDir() + } + + return ".tmp" +} + +type underlying interface { + Underlying() billy.Basic +} + +func getUnderlyingAndPath(fs billy.Basic, path string) (billy.Basic, string) { + u, ok := fs.(underlying) + if !ok { + return fs, path + } + if ch, ok := fs.(billy.Chroot); ok { + path = fs.Join(ch.Root(), path) + } + + return u.Underlying(), path +} + +// ReadFile reads the named file and returns the contents from the given filesystem. +// A successful call returns err == nil, not err == EOF. +// Because ReadFile reads the whole file, it does not treat an EOF from Read +// as an error to be reported. +func ReadFile(fs billy.Basic, name string) ([]byte, error) { + f, err := fs.Open(name) + if err != nil { + return nil, err + } + + defer f.Close() + + var size int + if info, err := fs.Stat(name); err == nil { + size64 := info.Size() + if int64(int(size64)) == size64 { + size = int(size64) + } + } + + size++ // one byte for final read at EOF + // If a file claims a small size, read at least 512 bytes. + // In particular, files in Linux's /proc claim size 0 but + // then do not work right if read in small pieces, + // so an initial read of 1 byte would not work correctly. + + if size < 512 { + size = 512 + } + + data := make([]byte, 0, size) + for { + if len(data) >= cap(data) { + d := append(data[:cap(data)], 0) + data = d[:len(data)] + } + + n, err := f.Read(data[len(data):cap(data)]) + data = data[:len(data)+n] + + if err != nil { + if err == io.EOF { + err = nil + } + + return data, err + } + } +} diff --git a/vendor/github.com/go-git/go-git/v5/.gitignore b/vendor/github.com/go-git/go-git/v5/.gitignore new file mode 100644 index 0000000000..038dd9f1ed --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/.gitignore @@ -0,0 +1,4 @@ +coverage.out +*~ +coverage.txt +profile.out diff --git a/vendor/github.com/go-git/go-git/v5/CODE_OF_CONDUCT.md b/vendor/github.com/go-git/go-git/v5/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..a689fa3c34 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +education, socio-economic status, nationality, personal appearance, race, +religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at conduct@sourced.tech. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + diff --git a/vendor/github.com/go-git/go-git/v5/COMPATIBILITY.md b/vendor/github.com/go-git/go-git/v5/COMPATIBILITY.md new file mode 100644 index 0000000000..2a72b501e2 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/COMPATIBILITY.md @@ -0,0 +1,111 @@ +Supported Capabilities +====================== + +Here is a non-comprehensive table of git commands and features whose equivalent +is supported by go-git. + +| Feature | Status | Notes | +|---------------------------------------|--------|-------| +| **config** | +| config | ✔ | Reading and modifying per-repository configuration (`.git/config`) is supported. Global configuration (`$HOME/.gitconfig`) is not. | +| **getting and creating repositories** | +| init | ✔ | Plain init and `--bare` are supported. Flags `--template`, `--separate-git-dir` and `--shared` are not. | +| clone | ✔ | Plain clone and equivalents to `--progress`, `--single-branch`, `--depth`, `--origin`, `--recurse-submodules` are supported. Others are not. | +| **basic snapshotting** | +| add | ✔ | Plain add is supported. Any other flags aren't supported | +| status | ✔ | +| commit | ✔ | +| reset | ✔ | +| rm | ✔ | +| mv | ✔ | +| **branching and merging** | +| branch | ✔ | +| checkout | ✔ | Basic usages of checkout are supported. | +| merge | ✖ | +| mergetool | ✖ | +| stash | ✖ | +| tag | ✔ | +| **sharing and updating projects** | +| fetch | ✔ | +| pull | ✔ | Only supports merges where the merge can be resolved as a fast-forward. | +| push | ✔ | +| remote | ✔ | +| submodule | ✔ | +| **inspection and comparison** | +| show | ✔ | +| log | ✔ | +| shortlog | (see log) | +| describe | | +| **patching** | +| apply | ✖ | +| cherry-pick | ✖ | +| diff | ✔ | Patch object with UnifiedDiff output representation | +| rebase | ✖ | +| revert | ✖ | +| **debugging** | +| bisect | ✖ | +| blame | ✔ | +| grep | ✔ | +| **email** || +| am | ✖ | +| apply | ✖ | +| format-patch | ✖ | +| send-email | ✖ | +| request-pull | ✖ | +| **external systems** | +| svn | ✖ | +| fast-import | ✖ | +| **administration** | +| clean | ✔ | +| gc | ✖ | +| fsck | ✖ | +| reflog | ✖ | +| filter-branch | ✖ | +| instaweb | ✖ | +| archive | ✖ | +| bundle | ✖ | +| prune | ✖ | +| repack | ✖ | +| **server admin** | +| daemon | | +| update-server-info | | +| **advanced** | +| notes | ✖ | +| replace | ✖ | +| worktree | ✖ | +| annotate | (see blame) | +| **gpg** | +| git-verify-commit | ✔ | +| git-verify-tag | ✔ | +| **plumbing commands** | +| cat-file | ✔ | +| check-ignore | | +| commit-tree | | +| count-objects | | +| diff-index | | +| for-each-ref | ✔ | +| hash-object | ✔ | +| ls-files | ✔ | +| merge-base | ✔ | Calculates the merge-base only between two commits, and supports `--independent` and `--is-ancestor` modifiers; Does not support `--fork-point` nor `--octopus` modifiers. | +| read-tree | | +| rev-list | ✔ | +| rev-parse | | +| show-ref | ✔ | +| symbolic-ref | ✔ | +| update-index | | +| update-ref | | +| verify-pack | | +| write-tree | | +| **protocols** | +| http(s):// (dumb) | ✖ | +| http(s):// (smart) | ✔ | +| git:// | ✔ | +| ssh:// | ✔ | +| file:// | partial | Warning: this is not pure Golang. This shells out to the `git` binary. | +| custom | ✔ | +| **other features** | +| gitignore | ✔ | +| gitattributes | ✖ | +| index version | | +| packfile version | | +| push-certs | ✖ | diff --git a/vendor/github.com/go-git/go-git/v5/CONTRIBUTING.md b/vendor/github.com/go-git/go-git/v5/CONTRIBUTING.md new file mode 100644 index 0000000000..fce25328a7 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/CONTRIBUTING.md @@ -0,0 +1,46 @@ +# Contributing Guidelines + +source{d} go-git project is [Apache 2.0 licensed](LICENSE) and accepts +contributions via GitHub pull requests. This document outlines some of the +conventions on development workflow, commit message formatting, contact points, +and other resources to make it easier to get your contribution accepted. + +## Support Channels + +The official support channels, for both users and contributors, are: + +- [StackOverflow go-git tag](https://stackoverflow.com/questions/tagged/go-git) for user questions. +- GitHub [Issues](https://github.com/src-d/go-git/issues)* for bug reports and feature requests. + +*Before opening a new issue or submitting a new pull request, it's helpful to +search the project - it's likely that another user has already reported the +issue you're facing, or it's a known issue that we're already aware of. + + +## How to Contribute + +Pull Requests (PRs) are the main and exclusive way to contribute to the official go-git project. +In order for a PR to be accepted it needs to pass a list of requirements: + +- You should be able to run the same query using `git`. We don't accept features that are not implemented in the official git implementation. +- The expected behavior must match the [official git implementation](https://github.com/git/git). +- The actual behavior must be correctly explained with natural language and providing a minimum working example in Go that reproduces it. +- All PRs must be written in idiomatic Go, formatted according to [gofmt](https://golang.org/cmd/gofmt/), and without any warnings from [go lint](https://github.com/golang/lint) nor [go vet](https://golang.org/cmd/vet/). +- They should in general include tests, and those shall pass. +- If the PR is a bug fix, it has to include a suite of unit tests for the new functionality. +- If the PR is a new feature, it has to come with a suite of unit tests, that tests the new functionality. +- In any case, all the PRs have to pass the personal evaluation of at least one of the maintainers of go-git. + +### Format of the commit message + +Every commit message should describe what was changed, under which context and, if applicable, the GitHub issue it relates to: + +``` +plumbing: packp, Skip argument validations for unknown capabilities. Fixes #623 +``` + +The format can be described more formally as follows: + +``` +: , . [Fixes #] +``` diff --git a/vendor/github.com/go-git/go-git/v5/LICENSE b/vendor/github.com/go-git/go-git/v5/LICENSE new file mode 100644 index 0000000000..8aa3d854cf --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Sourced Technologies, S.L. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-git/go-git/v5/Makefile b/vendor/github.com/go-git/go-git/v5/Makefile new file mode 100644 index 0000000000..d10922fb10 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/Makefile @@ -0,0 +1,38 @@ +# General +WORKDIR = $(PWD) + +# Go parameters +GOCMD = go +GOTEST = $(GOCMD) test + +# Git config +GIT_VERSION ?= +GIT_DIST_PATH ?= $(PWD)/.git-dist +GIT_REPOSITORY = http://github.com/git/git.git + +# Coverage +COVERAGE_REPORT = coverage.out +COVERAGE_MODE = count + +build-git: + @if [ -f $(GIT_DIST_PATH)/git ]; then \ + echo "nothing to do, using cache $(GIT_DIST_PATH)"; \ + else \ + git clone $(GIT_REPOSITORY) -b $(GIT_VERSION) --depth 1 --single-branch $(GIT_DIST_PATH); \ + cd $(GIT_DIST_PATH); \ + make configure; \ + ./configure; \ + make all; \ + fi + +test: + @echo "running against `git version`"; \ + $(GOTEST) ./... + +test-coverage: + @echo "running against `git version`"; \ + echo "" > $(COVERAGE_REPORT); \ + $(GOTEST) -coverprofile=$(COVERAGE_REPORT) -coverpkg=./... -covermode=$(COVERAGE_MODE) ./... + +clean: + rm -rf $(GIT_DIST_PATH) \ No newline at end of file diff --git a/vendor/github.com/go-git/go-git/v5/README.md b/vendor/github.com/go-git/go-git/v5/README.md new file mode 100644 index 0000000000..ff0c9b72ba --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/README.md @@ -0,0 +1,131 @@ +![go-git logo](https://cdn.rawgit.com/src-d/artwork/02036484/go-git/files/go-git-github-readme-header.png) +[![GoDoc](https://godoc.org/github.com/go-git/go-git/v5?status.svg)](https://pkg.go.dev/github.com/go-git/go-git/v5) [![Build Status](https://github.com/go-git/go-git/workflows/Test/badge.svg)](https://github.com/go-git/go-git/actions) [![Go Report Card](https://goreportcard.com/badge/github.com/go-git/go-git)](https://goreportcard.com/report/github.com/go-git/go-git) + +*go-git* is a highly extensible git implementation library written in **pure Go**. + +It can be used to manipulate git repositories at low level *(plumbing)* or high level *(porcelain)*, through an idiomatic Go API. It also supports several types of storage, such as in-memory filesystems, or custom implementations, thanks to the [`Storer`](https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/storer) interface. + +It's being actively developed since 2015 and is being used extensively by [Keybase](https://keybase.io/blog/encrypted-git-for-everyone), [Gitea](https://gitea.io/en-us/) or [Pulumi](https://github.com/search?q=org%3Apulumi+go-git&type=Code), and by many other libraries and tools. + +Project Status +-------------- + +After the legal issues with the [`src-d`](https://github.com/src-d) organization, the lack of update for four months and the requirement to make a hard fork, the project is **now back to normality**. + +The project is currently actively maintained by individual contributors, including several of the original authors, but also backed by a new company, [gitsight](https://github.com/gitsight), where `go-git` is a critical component used at scale. + + +Comparison with git +------------------- + +*go-git* aims to be fully compatible with [git](https://github.com/git/git), all the *porcelain* operations are implemented to work exactly as *git* does. + +*git* is a humongous project with years of development by thousands of contributors, making it challenging for *go-git* to implement all the features. You can find a comparison of *go-git* vs *git* in the [compatibility documentation](COMPATIBILITY.md). + + +Installation +------------ + +The recommended way to install *go-git* is: + +```go +import "github.com/go-git/go-git/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH) +import "github.com/go-git/go-git" // with go modules disabled +``` + + +Examples +-------- + +> Please note that the `CheckIfError` and `Info` functions used in the examples are from the [examples package](https://github.com/go-git/go-git/blob/master/_examples/common.go#L19) just to be used in the examples. + + +### Basic example + +A basic example that mimics the standard `git clone` command + +```go +// Clone the given repository to the given directory +Info("git clone https://github.com/go-git/go-git") + +_, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{ + URL: "https://github.com/go-git/go-git", + Progress: os.Stdout, +}) + +CheckIfError(err) +``` + +Outputs: +``` +Counting objects: 4924, done. +Compressing objects: 100% (1333/1333), done. +Total 4924 (delta 530), reused 6 (delta 6), pack-reused 3533 +``` + +### In-memory example + +Cloning a repository into memory and printing the history of HEAD, just like `git log` does + + +```go +// Clones the given repository in memory, creating the remote, the local +// branches and fetching the objects, exactly as: +Info("git clone https://github.com/go-git/go-billy") + +r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ + URL: "https://github.com/go-git/go-billy", +}) + +CheckIfError(err) + +// Gets the HEAD history from HEAD, just like this command: +Info("git log") + +// ... retrieves the branch pointed by HEAD +ref, err := r.Head() +CheckIfError(err) + + +// ... retrieves the commit history +cIter, err := r.Log(&git.LogOptions{From: ref.Hash()}) +CheckIfError(err) + +// ... just iterates over the commits, printing it +err = cIter.ForEach(func(c *object.Commit) error { + fmt.Println(c) + return nil +}) +CheckIfError(err) +``` + +Outputs: +``` +commit ded8054fd0c3994453e9c8aacaf48d118d42991e +Author: Santiago M. Mola +Date: Sat Nov 12 21:18:41 2016 +0100 + + index: ReadFrom/WriteTo returns IndexReadError/IndexWriteError. (#9) + +commit df707095626f384ce2dc1a83b30f9a21d69b9dfc +Author: Santiago M. Mola +Date: Fri Nov 11 13:23:22 2016 +0100 + + readwriter: fix bug when writing index. (#10) + + When using ReadWriter on an existing siva file, absolute offset for + index entries was not being calculated correctly. +... +``` + +You can find this [example](_examples/log/main.go) and many others in the [examples](_examples) folder. + +Contribute +---------- + +[Contributions](https://github.com/go-git/go-git/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) are more than welcome, if you are interested please take a look to +our [Contributing Guidelines](CONTRIBUTING.md). + +License +------- +Apache License Version 2.0, see [LICENSE](LICENSE) diff --git a/vendor/github.com/go-git/go-git/v5/blame.go b/vendor/github.com/go-git/go-git/v5/blame.go new file mode 100644 index 0000000000..43634b32ca --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/blame.go @@ -0,0 +1,302 @@ +package git + +import ( + "bytes" + "errors" + "fmt" + "strconv" + "strings" + "time" + "unicode/utf8" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/utils/diff" +) + +// BlameResult represents the result of a Blame operation. +type BlameResult struct { + // Path is the path of the File that we're blaming. + Path string + // Rev (Revision) is the hash of the specified Commit used to generate this result. + Rev plumbing.Hash + // Lines contains every line with its authorship. + Lines []*Line +} + +// Blame returns a BlameResult with the information about the last author of +// each line from file `path` at commit `c`. +func Blame(c *object.Commit, path string) (*BlameResult, error) { + // The file to blame is identified by the input arguments: + // commit and path. commit is a Commit object obtained from a Repository. Path + // represents a path to a specific file contained into the repository. + // + // Blaming a file is a two step process: + // + // 1. Create a linear history of the commits affecting a file. We use + // revlist.New for that. + // + // 2. Then build a graph with a node for every line in every file in + // the history of the file. + // + // Each node is assigned a commit: Start by the nodes in the first + // commit. Assign that commit as the creator of all its lines. + // + // Then jump to the nodes in the next commit, and calculate the diff + // between the two files. Newly created lines get + // assigned the new commit as its origin. Modified lines also get + // this new commit. Untouched lines retain the old commit. + // + // All this work is done in the assignOrigin function which holds all + // the internal relevant data in a "blame" struct, that is not + // exported. + // + // TODO: ways to improve the efficiency of this function: + // 1. Improve revlist + // 2. Improve how to traverse the history (example a backward traversal will + // be much more efficient) + // + // TODO: ways to improve the function in general: + // 1. Add memoization between revlist and assign. + // 2. It is using much more memory than needed, see the TODOs below. + + b := new(blame) + b.fRev = c + b.path = path + + // get all the file revisions + if err := b.fillRevs(); err != nil { + return nil, err + } + + // calculate the line tracking graph and fill in + // file contents in data. + if err := b.fillGraphAndData(); err != nil { + return nil, err + } + + file, err := b.fRev.File(b.path) + if err != nil { + return nil, err + } + finalLines, err := file.Lines() + if err != nil { + return nil, err + } + + // Each node (line) holds the commit where it was introduced or + // last modified. To achieve that we use the FORWARD algorithm + // described in Zimmermann, et al. "Mining Version Archives for + // Co-changed Lines", in proceedings of the Mining Software + // Repositories workshop, Shanghai, May 22-23, 2006. + lines, err := newLines(finalLines, b.sliceGraph(len(b.graph)-1)) + if err != nil { + return nil, err + } + + return &BlameResult{ + Path: path, + Rev: c.Hash, + Lines: lines, + }, nil +} + +// Line values represent the contents and author of a line in BlamedResult values. +type Line struct { + // Author is the email address of the last author that modified the line. + Author string + // Text is the original text of the line. + Text string + // Date is when the original text of the line was introduced + Date time.Time + // Hash is the commit hash that introduced the original line + Hash plumbing.Hash +} + +func newLine(author, text string, date time.Time, hash plumbing.Hash) *Line { + return &Line{ + Author: author, + Text: text, + Hash: hash, + Date: date, + } +} + +func newLines(contents []string, commits []*object.Commit) ([]*Line, error) { + lcontents := len(contents) + lcommits := len(commits) + + if lcontents != lcommits { + if lcontents == lcommits-1 && contents[lcontents-1] != "\n" { + contents = append(contents, "\n") + } else { + return nil, errors.New("contents and commits have different length") + } + } + + result := make([]*Line, 0, lcontents) + for i := range contents { + result = append(result, newLine( + commits[i].Author.Email, contents[i], + commits[i].Author.When, commits[i].Hash, + )) + } + + return result, nil +} + +// this struct is internally used by the blame function to hold its +// inputs, outputs and state. +type blame struct { + // the path of the file to blame + path string + // the commit of the final revision of the file to blame + fRev *object.Commit + // the chain of revisions affecting the the file to blame + revs []*object.Commit + // the contents of the file across all its revisions + data []string + // the graph of the lines in the file across all the revisions + graph [][]*object.Commit +} + +// calculate the history of a file "path", starting from commit "from", sorted by commit date. +func (b *blame) fillRevs() error { + var err error + + b.revs, err = references(b.fRev, b.path) + return err +} + +// build graph of a file from its revision history +func (b *blame) fillGraphAndData() error { + //TODO: not all commits are needed, only the current rev and the prev + b.graph = make([][]*object.Commit, len(b.revs)) + b.data = make([]string, len(b.revs)) // file contents in all the revisions + // for every revision of the file, starting with the first + // one... + for i, rev := range b.revs { + // get the contents of the file + file, err := rev.File(b.path) + if err != nil { + return nil + } + b.data[i], err = file.Contents() + if err != nil { + return err + } + nLines := countLines(b.data[i]) + // create a node for each line + b.graph[i] = make([]*object.Commit, nLines) + // assign a commit to each node + // if this is the first revision, then the node is assigned to + // this first commit. + if i == 0 { + for j := 0; j < nLines; j++ { + b.graph[i][j] = b.revs[i] + } + } else { + // if this is not the first commit, then assign to the old + // commit or to the new one, depending on what the diff + // says. + b.assignOrigin(i, i-1) + } + } + return nil +} + +// sliceGraph returns a slice of commits (one per line) for a particular +// revision of a file (0=first revision). +func (b *blame) sliceGraph(i int) []*object.Commit { + fVs := b.graph[i] + result := make([]*object.Commit, 0, len(fVs)) + for _, v := range fVs { + c := *v + result = append(result, &c) + } + return result +} + +// Assigns origin to vertexes in current (c) rev from data in its previous (p) +// revision +func (b *blame) assignOrigin(c, p int) { + // assign origin based on diff info + hunks := diff.Do(b.data[p], b.data[c]) + sl := -1 // source line + dl := -1 // destination line + for h := range hunks { + hLines := countLines(hunks[h].Text) + for hl := 0; hl < hLines; hl++ { + switch { + case hunks[h].Type == 0: + sl++ + dl++ + b.graph[c][dl] = b.graph[p][sl] + case hunks[h].Type == 1: + dl++ + b.graph[c][dl] = b.revs[c] + case hunks[h].Type == -1: + sl++ + default: + panic("unreachable") + } + } + } +} + +// GoString prints the results of a Blame using git-blame's style. +func (b *blame) GoString() string { + var buf bytes.Buffer + + file, err := b.fRev.File(b.path) + if err != nil { + panic("PrettyPrint: internal error in repo.Data") + } + contents, err := file.Contents() + if err != nil { + panic("PrettyPrint: internal error in repo.Data") + } + + lines := strings.Split(contents, "\n") + // max line number length + mlnl := len(strconv.Itoa(len(lines))) + // max author length + mal := b.maxAuthorLength() + format := fmt.Sprintf("%%s (%%-%ds %%%dd) %%s\n", + mal, mlnl) + + fVs := b.graph[len(b.graph)-1] + for ln, v := range fVs { + fmt.Fprintf(&buf, format, v.Hash.String()[:8], + prettyPrintAuthor(fVs[ln]), ln+1, lines[ln]) + } + return buf.String() +} + +// utility function to pretty print the author. +func prettyPrintAuthor(c *object.Commit) string { + return fmt.Sprintf("%s %s", c.Author.Name, c.Author.When.Format("2006-01-02")) +} + +// utility function to calculate the number of runes needed +// to print the longest author name in the blame of a file. +func (b *blame) maxAuthorLength() int { + memo := make(map[plumbing.Hash]struct{}, len(b.graph)-1) + fVs := b.graph[len(b.graph)-1] + m := 0 + for ln := range fVs { + if _, ok := memo[fVs[ln].Hash]; ok { + continue + } + memo[fVs[ln].Hash] = struct{}{} + m = max(m, utf8.RuneCountInString(prettyPrintAuthor(fVs[ln]))) + } + return m +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} diff --git a/vendor/github.com/go-git/go-git/v5/common.go b/vendor/github.com/go-git/go-git/v5/common.go new file mode 100644 index 0000000000..6174339a81 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/common.go @@ -0,0 +1,20 @@ +package git + +import "strings" + +// countLines returns the number of lines in a string à la git, this is +// The newline character is assumed to be '\n'. The empty string +// contains 0 lines. If the last line of the string doesn't end with a +// newline, it will still be considered a line. +func countLines(s string) int { + if s == "" { + return 0 + } + + nEOL := strings.Count(s, "\n") + if strings.HasSuffix(s, "\n") { + return nEOL + } + + return nEOL + 1 +} diff --git a/vendor/github.com/go-git/go-git/v5/config/branch.go b/vendor/github.com/go-git/go-git/v5/config/branch.go new file mode 100644 index 0000000000..fe86cf542c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/branch.go @@ -0,0 +1,90 @@ +package config + +import ( + "errors" + + "github.com/go-git/go-git/v5/plumbing" + format "github.com/go-git/go-git/v5/plumbing/format/config" +) + +var ( + errBranchEmptyName = errors.New("branch config: empty name") + errBranchInvalidMerge = errors.New("branch config: invalid merge") + errBranchInvalidRebase = errors.New("branch config: rebase must be one of 'true' or 'interactive'") +) + +// Branch contains information on the +// local branches and which remote to track +type Branch struct { + // Name of branch + Name string + // Remote name of remote to track + Remote string + // Merge is the local refspec for the branch + Merge plumbing.ReferenceName + // Rebase instead of merge when pulling. Valid values are + // "true" and "interactive". "false" is undocumented and + // typically represented by the non-existence of this field + Rebase string + + raw *format.Subsection +} + +// Validate validates fields of branch +func (b *Branch) Validate() error { + if b.Name == "" { + return errBranchEmptyName + } + + if b.Merge != "" && !b.Merge.IsBranch() { + return errBranchInvalidMerge + } + + if b.Rebase != "" && + b.Rebase != "true" && + b.Rebase != "interactive" && + b.Rebase != "false" { + return errBranchInvalidRebase + } + + return nil +} + +func (b *Branch) marshal() *format.Subsection { + if b.raw == nil { + b.raw = &format.Subsection{} + } + + b.raw.Name = b.Name + + if b.Remote == "" { + b.raw.RemoveOption(remoteSection) + } else { + b.raw.SetOption(remoteSection, b.Remote) + } + + if b.Merge == "" { + b.raw.RemoveOption(mergeKey) + } else { + b.raw.SetOption(mergeKey, string(b.Merge)) + } + + if b.Rebase == "" { + b.raw.RemoveOption(rebaseKey) + } else { + b.raw.SetOption(rebaseKey, b.Rebase) + } + + return b.raw +} + +func (b *Branch) unmarshal(s *format.Subsection) error { + b.raw = s + + b.Name = b.raw.Name + b.Remote = b.raw.Options.Get(remoteSection) + b.Merge = plumbing.ReferenceName(b.raw.Options.Get(mergeKey)) + b.Rebase = b.raw.Options.Get(rebaseKey) + + return b.Validate() +} diff --git a/vendor/github.com/go-git/go-git/v5/config/config.go b/vendor/github.com/go-git/go-git/v5/config/config.go new file mode 100644 index 0000000000..1aee25a4c5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/config.go @@ -0,0 +1,659 @@ +// Package config contains the abstraction of multiple config files +package config + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "strconv" + + "github.com/go-git/go-billy/v5/osfs" + "github.com/go-git/go-git/v5/internal/url" + format "github.com/go-git/go-git/v5/plumbing/format/config" + "github.com/mitchellh/go-homedir" +) + +const ( + // DefaultFetchRefSpec is the default refspec used for fetch. + DefaultFetchRefSpec = "+refs/heads/*:refs/remotes/%s/*" + // DefaultPushRefSpec is the default refspec used for push. + DefaultPushRefSpec = "refs/heads/*:refs/heads/*" +) + +// ConfigStorer generic storage of Config object +type ConfigStorer interface { + Config() (*Config, error) + SetConfig(*Config) error +} + +var ( + ErrInvalid = errors.New("config invalid key in remote or branch") + ErrRemoteConfigNotFound = errors.New("remote config not found") + ErrRemoteConfigEmptyURL = errors.New("remote config: empty URL") + ErrRemoteConfigEmptyName = errors.New("remote config: empty name") +) + +// Scope defines the scope of a config file, such as local, global or system. +type Scope int + +// Available ConfigScope's +const ( + LocalScope Scope = iota + GlobalScope + SystemScope +) + +// Config contains the repository configuration +// https://www.kernel.org/pub/software/scm/git/docs/git-config.html#FILES +type Config struct { + Core struct { + // IsBare if true this repository is assumed to be bare and has no + // working directory associated with it. + IsBare bool + // Worktree is the path to the root of the working tree. + Worktree string + // CommentChar is the character indicating the start of a + // comment for commands like commit and tag + CommentChar string + } + + User struct { + // Name is the personal name of the author and the commiter of a commit. + Name string + // Email is the email of the author and the commiter of a commit. + Email string + } + + Author struct { + // Name is the personal name of the author of a commit. + Name string + // Email is the email of the author of a commit. + Email string + } + + Committer struct { + // Name is the personal name of the commiter of a commit. + Name string + // Email is the email of the the commiter of a commit. + Email string + } + + Pack struct { + // Window controls the size of the sliding window for delta + // compression. The default is 10. A value of 0 turns off + // delta compression entirely. + Window uint + } + + Init struct { + // DefaultBranch Allows overriding the default branch name + // e.g. when initializing a new repository or when cloning + // an empty repository. + DefaultBranch string + } + + // Remotes list of repository remotes, the key of the map is the name + // of the remote, should equal to RemoteConfig.Name. + Remotes map[string]*RemoteConfig + // Submodules list of repository submodules, the key of the map is the name + // of the submodule, should equal to Submodule.Name. + Submodules map[string]*Submodule + // Branches list of branches, the key is the branch name and should + // equal Branch.Name + Branches map[string]*Branch + // URLs list of url rewrite rules, if repo url starts with URL.InsteadOf value, it will be replaced with the + // key instead. + URLs map[string]*URL + // Raw contains the raw information of a config file. The main goal is + // preserve the parsed information from the original format, to avoid + // dropping unsupported fields. + Raw *format.Config +} + +// NewConfig returns a new empty Config. +func NewConfig() *Config { + config := &Config{ + Remotes: make(map[string]*RemoteConfig), + Submodules: make(map[string]*Submodule), + Branches: make(map[string]*Branch), + URLs: make(map[string]*URL), + Raw: format.New(), + } + + config.Pack.Window = DefaultPackWindow + + return config +} + +// ReadConfig reads a config file from a io.Reader. +func ReadConfig(r io.Reader) (*Config, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + cfg := NewConfig() + if err = cfg.Unmarshal(b); err != nil { + return nil, err + } + + return cfg, nil +} + +// LoadConfig loads a config file from a given scope. The returned Config, +// contains exclusively information fom the given scope. If couldn't find a +// config file to the given scope, a empty one is returned. +func LoadConfig(scope Scope) (*Config, error) { + if scope == LocalScope { + return nil, fmt.Errorf("LocalScope should be read from the a ConfigStorer.") + } + + files, err := Paths(scope) + if err != nil { + return nil, err + } + + for _, file := range files { + f, err := osfs.Default.Open(file) + if err != nil { + if os.IsNotExist(err) { + continue + } + + return nil, err + } + + defer f.Close() + return ReadConfig(f) + } + + return NewConfig(), nil +} + +// Paths returns the config file location for a given scope. +func Paths(scope Scope) ([]string, error) { + var files []string + switch scope { + case GlobalScope: + xdg := os.Getenv("XDG_CONFIG_HOME") + if xdg != "" { + files = append(files, filepath.Join(xdg, "git/config")) + } + + home, err := homedir.Dir() + if err != nil { + return nil, err + } + + files = append(files, + filepath.Join(home, ".gitconfig"), + filepath.Join(home, ".config/git/config"), + ) + case SystemScope: + files = append(files, "/etc/gitconfig") + } + + return files, nil +} + +// Validate validates the fields and sets the default values. +func (c *Config) Validate() error { + for name, r := range c.Remotes { + if r.Name != name { + return ErrInvalid + } + + if err := r.Validate(); err != nil { + return err + } + } + + for name, b := range c.Branches { + if b.Name != name { + return ErrInvalid + } + + if err := b.Validate(); err != nil { + return err + } + } + + return nil +} + +const ( + remoteSection = "remote" + submoduleSection = "submodule" + branchSection = "branch" + coreSection = "core" + packSection = "pack" + userSection = "user" + authorSection = "author" + committerSection = "committer" + initSection = "init" + urlSection = "url" + fetchKey = "fetch" + urlKey = "url" + bareKey = "bare" + worktreeKey = "worktree" + commentCharKey = "commentChar" + windowKey = "window" + mergeKey = "merge" + rebaseKey = "rebase" + nameKey = "name" + emailKey = "email" + defaultBranchKey = "defaultBranch" + + // DefaultPackWindow holds the number of previous objects used to + // generate deltas. The value 10 is the same used by git command. + DefaultPackWindow = uint(10) +) + +// Unmarshal parses a git-config file and stores it. +func (c *Config) Unmarshal(b []byte) error { + r := bytes.NewBuffer(b) + d := format.NewDecoder(r) + + c.Raw = format.New() + if err := d.Decode(c.Raw); err != nil { + return err + } + + c.unmarshalCore() + c.unmarshalUser() + c.unmarshalInit() + if err := c.unmarshalPack(); err != nil { + return err + } + unmarshalSubmodules(c.Raw, c.Submodules) + + if err := c.unmarshalBranches(); err != nil { + return err + } + + if err := c.unmarshalURLs(); err != nil { + return err + } + + return c.unmarshalRemotes() +} + +func (c *Config) unmarshalCore() { + s := c.Raw.Section(coreSection) + if s.Options.Get(bareKey) == "true" { + c.Core.IsBare = true + } + + c.Core.Worktree = s.Options.Get(worktreeKey) + c.Core.CommentChar = s.Options.Get(commentCharKey) +} + +func (c *Config) unmarshalUser() { + s := c.Raw.Section(userSection) + c.User.Name = s.Options.Get(nameKey) + c.User.Email = s.Options.Get(emailKey) + + s = c.Raw.Section(authorSection) + c.Author.Name = s.Options.Get(nameKey) + c.Author.Email = s.Options.Get(emailKey) + + s = c.Raw.Section(committerSection) + c.Committer.Name = s.Options.Get(nameKey) + c.Committer.Email = s.Options.Get(emailKey) +} + +func (c *Config) unmarshalPack() error { + s := c.Raw.Section(packSection) + window := s.Options.Get(windowKey) + if window == "" { + c.Pack.Window = DefaultPackWindow + } else { + winUint, err := strconv.ParseUint(window, 10, 32) + if err != nil { + return err + } + c.Pack.Window = uint(winUint) + } + return nil +} + +func (c *Config) unmarshalRemotes() error { + s := c.Raw.Section(remoteSection) + for _, sub := range s.Subsections { + r := &RemoteConfig{} + if err := r.unmarshal(sub); err != nil { + return err + } + + c.Remotes[r.Name] = r + } + + // Apply insteadOf url rules + for _, r := range c.Remotes { + r.applyURLRules(c.URLs) + } + + return nil +} + +func (c *Config) unmarshalURLs() error { + s := c.Raw.Section(urlSection) + for _, sub := range s.Subsections { + r := &URL{} + if err := r.unmarshal(sub); err != nil { + return err + } + + c.URLs[r.Name] = r + } + + return nil +} + +func unmarshalSubmodules(fc *format.Config, submodules map[string]*Submodule) { + s := fc.Section(submoduleSection) + for _, sub := range s.Subsections { + m := &Submodule{} + m.unmarshal(sub) + + if m.Validate() == ErrModuleBadPath { + continue + } + + submodules[m.Name] = m + } +} + +func (c *Config) unmarshalBranches() error { + bs := c.Raw.Section(branchSection) + for _, sub := range bs.Subsections { + b := &Branch{} + + if err := b.unmarshal(sub); err != nil { + return err + } + + c.Branches[b.Name] = b + } + return nil +} + +func (c *Config) unmarshalInit() { + s := c.Raw.Section(initSection) + c.Init.DefaultBranch = s.Options.Get(defaultBranchKey) +} + +// Marshal returns Config encoded as a git-config file. +func (c *Config) Marshal() ([]byte, error) { + c.marshalCore() + c.marshalUser() + c.marshalPack() + c.marshalRemotes() + c.marshalSubmodules() + c.marshalBranches() + c.marshalURLs() + c.marshalInit() + + buf := bytes.NewBuffer(nil) + if err := format.NewEncoder(buf).Encode(c.Raw); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (c *Config) marshalCore() { + s := c.Raw.Section(coreSection) + s.SetOption(bareKey, fmt.Sprintf("%t", c.Core.IsBare)) + + if c.Core.Worktree != "" { + s.SetOption(worktreeKey, c.Core.Worktree) + } +} + +func (c *Config) marshalUser() { + s := c.Raw.Section(userSection) + if c.User.Name != "" { + s.SetOption(nameKey, c.User.Name) + } + + if c.User.Email != "" { + s.SetOption(emailKey, c.User.Email) + } + + s = c.Raw.Section(authorSection) + if c.Author.Name != "" { + s.SetOption(nameKey, c.Author.Name) + } + + if c.Author.Email != "" { + s.SetOption(emailKey, c.Author.Email) + } + + s = c.Raw.Section(committerSection) + if c.Committer.Name != "" { + s.SetOption(nameKey, c.Committer.Name) + } + + if c.Committer.Email != "" { + s.SetOption(emailKey, c.Committer.Email) + } +} + +func (c *Config) marshalPack() { + s := c.Raw.Section(packSection) + if c.Pack.Window != DefaultPackWindow { + s.SetOption(windowKey, fmt.Sprintf("%d", c.Pack.Window)) + } +} + +func (c *Config) marshalRemotes() { + s := c.Raw.Section(remoteSection) + newSubsections := make(format.Subsections, 0, len(c.Remotes)) + added := make(map[string]bool) + for _, subsection := range s.Subsections { + if remote, ok := c.Remotes[subsection.Name]; ok { + newSubsections = append(newSubsections, remote.marshal()) + added[subsection.Name] = true + } + } + + remoteNames := make([]string, 0, len(c.Remotes)) + for name := range c.Remotes { + remoteNames = append(remoteNames, name) + } + + sort.Strings(remoteNames) + + for _, name := range remoteNames { + if !added[name] { + newSubsections = append(newSubsections, c.Remotes[name].marshal()) + } + } + + s.Subsections = newSubsections +} + +func (c *Config) marshalSubmodules() { + s := c.Raw.Section(submoduleSection) + s.Subsections = make(format.Subsections, len(c.Submodules)) + + var i int + for _, r := range c.Submodules { + section := r.marshal() + // the submodule section at config is a subset of the .gitmodule file + // we should remove the non-valid options for the config file. + section.RemoveOption(pathKey) + s.Subsections[i] = section + i++ + } +} + +func (c *Config) marshalBranches() { + s := c.Raw.Section(branchSection) + newSubsections := make(format.Subsections, 0, len(c.Branches)) + added := make(map[string]bool) + for _, subsection := range s.Subsections { + if branch, ok := c.Branches[subsection.Name]; ok { + newSubsections = append(newSubsections, branch.marshal()) + added[subsection.Name] = true + } + } + + branchNames := make([]string, 0, len(c.Branches)) + for name := range c.Branches { + branchNames = append(branchNames, name) + } + + sort.Strings(branchNames) + + for _, name := range branchNames { + if !added[name] { + newSubsections = append(newSubsections, c.Branches[name].marshal()) + } + } + + s.Subsections = newSubsections +} + +func (c *Config) marshalURLs() { + s := c.Raw.Section(urlSection) + s.Subsections = make(format.Subsections, len(c.URLs)) + + var i int + for _, r := range c.URLs { + section := r.marshal() + // the submodule section at config is a subset of the .gitmodule file + // we should remove the non-valid options for the config file. + s.Subsections[i] = section + i++ + } +} + +func (c *Config) marshalInit() { + s := c.Raw.Section(initSection) + if c.Init.DefaultBranch != "" { + s.SetOption(defaultBranchKey, c.Init.DefaultBranch) + } +} + +// RemoteConfig contains the configuration for a given remote repository. +type RemoteConfig struct { + // Name of the remote + Name string + // URLs the URLs of a remote repository. It must be non-empty. Fetch will + // always use the first URL, while push will use all of them. + URLs []string + + // insteadOfRulesApplied have urls been modified + insteadOfRulesApplied bool + // originalURLs are the urls before applying insteadOf rules + originalURLs []string + + // Fetch the default set of "refspec" for fetch operation + Fetch []RefSpec + + // raw representation of the subsection, filled by marshal or unmarshal are + // called + raw *format.Subsection +} + +// Validate validates the fields and sets the default values. +func (c *RemoteConfig) Validate() error { + if c.Name == "" { + return ErrRemoteConfigEmptyName + } + + if len(c.URLs) == 0 { + return ErrRemoteConfigEmptyURL + } + + for _, r := range c.Fetch { + if err := r.Validate(); err != nil { + return err + } + } + + if len(c.Fetch) == 0 { + c.Fetch = []RefSpec{RefSpec(fmt.Sprintf(DefaultFetchRefSpec, c.Name))} + } + + return nil +} + +func (c *RemoteConfig) unmarshal(s *format.Subsection) error { + c.raw = s + + fetch := []RefSpec{} + for _, f := range c.raw.Options.GetAll(fetchKey) { + rs := RefSpec(f) + if err := rs.Validate(); err != nil { + return err + } + + fetch = append(fetch, rs) + } + + c.Name = c.raw.Name + c.URLs = append([]string(nil), c.raw.Options.GetAll(urlKey)...) + c.Fetch = fetch + + return nil +} + +func (c *RemoteConfig) marshal() *format.Subsection { + if c.raw == nil { + c.raw = &format.Subsection{} + } + + c.raw.Name = c.Name + if len(c.URLs) == 0 { + c.raw.RemoveOption(urlKey) + } else { + urls := c.URLs + if c.insteadOfRulesApplied { + urls = c.originalURLs + } + + c.raw.SetOption(urlKey, urls...) + } + + if len(c.Fetch) == 0 { + c.raw.RemoveOption(fetchKey) + } else { + var values []string + for _, rs := range c.Fetch { + values = append(values, rs.String()) + } + + c.raw.SetOption(fetchKey, values...) + } + + return c.raw +} + +func (c *RemoteConfig) IsFirstURLLocal() bool { + return url.IsLocalEndpoint(c.URLs[0]) +} + +func (c *RemoteConfig) applyURLRules(urlRules map[string]*URL) { + // save original urls + originalURLs := make([]string, len(c.URLs)) + copy(originalURLs, c.URLs) + + for i, url := range c.URLs { + if matchingURLRule := findLongestInsteadOfMatch(url, urlRules); matchingURLRule != nil { + c.URLs[i] = matchingURLRule.ApplyInsteadOf(c.URLs[i]) + c.insteadOfRulesApplied = true + } + } + + if c.insteadOfRulesApplied { + c.originalURLs = originalURLs + } +} diff --git a/vendor/github.com/go-git/go-git/v5/config/modules.go b/vendor/github.com/go-git/go-git/v5/config/modules.go new file mode 100644 index 0000000000..1c10aa354e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/modules.go @@ -0,0 +1,139 @@ +package config + +import ( + "bytes" + "errors" + "regexp" + + format "github.com/go-git/go-git/v5/plumbing/format/config" +) + +var ( + ErrModuleEmptyURL = errors.New("module config: empty URL") + ErrModuleEmptyPath = errors.New("module config: empty path") + ErrModuleBadPath = errors.New("submodule has an invalid path") +) + +var ( + // Matches module paths with dotdot ".." components. + dotdotPath = regexp.MustCompile(`(^|[/\\])\.\.([/\\]|$)`) +) + +// Modules defines the submodules properties, represents a .gitmodules file +// https://www.kernel.org/pub/software/scm/git/docs/gitmodules.html +type Modules struct { + // Submodules is a map of submodules being the key the name of the submodule. + Submodules map[string]*Submodule + + raw *format.Config +} + +// NewModules returns a new empty Modules +func NewModules() *Modules { + return &Modules{ + Submodules: make(map[string]*Submodule), + raw: format.New(), + } +} + +const ( + pathKey = "path" + branchKey = "branch" +) + +// Unmarshal parses a git-config file and stores it. +func (m *Modules) Unmarshal(b []byte) error { + r := bytes.NewBuffer(b) + d := format.NewDecoder(r) + + m.raw = format.New() + if err := d.Decode(m.raw); err != nil { + return err + } + + unmarshalSubmodules(m.raw, m.Submodules) + return nil +} + +// Marshal returns Modules encoded as a git-config file. +func (m *Modules) Marshal() ([]byte, error) { + s := m.raw.Section(submoduleSection) + s.Subsections = make(format.Subsections, len(m.Submodules)) + + var i int + for _, r := range m.Submodules { + s.Subsections[i] = r.marshal() + i++ + } + + buf := bytes.NewBuffer(nil) + if err := format.NewEncoder(buf).Encode(m.raw); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +// Submodule defines a submodule. +type Submodule struct { + // Name module name + Name string + // Path defines the path, relative to the top-level directory of the Git + // working tree. + Path string + // URL defines a URL from which the submodule repository can be cloned. + URL string + // Branch is a remote branch name for tracking updates in the upstream + // submodule. Optional value. + Branch string + + // raw representation of the subsection, filled by marshal or unmarshal are + // called. + raw *format.Subsection +} + +// Validate validates the fields and sets the default values. +func (m *Submodule) Validate() error { + if m.Path == "" { + return ErrModuleEmptyPath + } + + if m.URL == "" { + return ErrModuleEmptyURL + } + + if dotdotPath.MatchString(m.Path) { + return ErrModuleBadPath + } + + return nil +} + +func (m *Submodule) unmarshal(s *format.Subsection) { + m.raw = s + + m.Name = m.raw.Name + m.Path = m.raw.Option(pathKey) + m.URL = m.raw.Option(urlKey) + m.Branch = m.raw.Option(branchKey) +} + +func (m *Submodule) marshal() *format.Subsection { + if m.raw == nil { + m.raw = &format.Subsection{} + } + + m.raw.Name = m.Name + if m.raw.Name == "" { + m.raw.Name = m.Path + } + + m.raw.SetOption(pathKey, m.Path) + m.raw.SetOption(urlKey, m.URL) + + if m.Branch != "" { + m.raw.SetOption(branchKey, m.Branch) + } + + return m.raw +} diff --git a/vendor/github.com/go-git/go-git/v5/config/refspec.go b/vendor/github.com/go-git/go-git/v5/config/refspec.go new file mode 100644 index 0000000000..4bfaa37bbb --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/refspec.go @@ -0,0 +1,155 @@ +package config + +import ( + "errors" + "strings" + + "github.com/go-git/go-git/v5/plumbing" +) + +const ( + refSpecWildcard = "*" + refSpecForce = "+" + refSpecSeparator = ":" +) + +var ( + ErrRefSpecMalformedSeparator = errors.New("malformed refspec, separators are wrong") + ErrRefSpecMalformedWildcard = errors.New("malformed refspec, mismatched number of wildcards") +) + +// RefSpec is a mapping from local branches to remote references. +// The format of the refspec is an optional +, followed by :, where +// is the pattern for references on the remote side and is where +// those references will be written locally. The + tells Git to update the +// reference even if it isn’t a fast-forward. +// eg.: "+refs/heads/*:refs/remotes/origin/*" +// +// https://git-scm.com/book/en/v2/Git-Internals-The-Refspec +type RefSpec string + +// Validate validates the RefSpec +func (s RefSpec) Validate() error { + spec := string(s) + if strings.Count(spec, refSpecSeparator) != 1 { + return ErrRefSpecMalformedSeparator + } + + sep := strings.Index(spec, refSpecSeparator) + if sep == len(spec)-1 { + return ErrRefSpecMalformedSeparator + } + + ws := strings.Count(spec[0:sep], refSpecWildcard) + wd := strings.Count(spec[sep+1:], refSpecWildcard) + if ws == wd && ws < 2 && wd < 2 { + return nil + } + + return ErrRefSpecMalformedWildcard +} + +// IsForceUpdate returns if update is allowed in non fast-forward merges. +func (s RefSpec) IsForceUpdate() bool { + return s[0] == refSpecForce[0] +} + +// IsDelete returns true if the refspec indicates a delete (empty src). +func (s RefSpec) IsDelete() bool { + return s[0] == refSpecSeparator[0] +} + +// IsExactSHA1 returns true if the source is a SHA1 hash. +func (s RefSpec) IsExactSHA1() bool { + return plumbing.IsHash(s.Src()) +} + +// Src return the src side. +func (s RefSpec) Src() string { + spec := string(s) + + var start int + if s.IsForceUpdate() { + start = 1 + } else { + start = 0 + } + + end := strings.Index(spec, refSpecSeparator) + return spec[start:end] +} + +// Match match the given plumbing.ReferenceName against the source. +func (s RefSpec) Match(n plumbing.ReferenceName) bool { + if !s.IsWildcard() { + return s.matchExact(n) + } + + return s.matchGlob(n) +} + +// IsWildcard returns true if the RefSpec contains a wildcard. +func (s RefSpec) IsWildcard() bool { + return strings.Contains(string(s), refSpecWildcard) +} + +func (s RefSpec) matchExact(n plumbing.ReferenceName) bool { + return s.Src() == n.String() +} + +func (s RefSpec) matchGlob(n plumbing.ReferenceName) bool { + src := s.Src() + name := n.String() + wildcard := strings.Index(src, refSpecWildcard) + + var prefix, suffix string + prefix = src[0:wildcard] + if len(src) > wildcard+1 { + suffix = src[wildcard+1:] + } + + return len(name) >= len(prefix)+len(suffix) && + strings.HasPrefix(name, prefix) && + strings.HasSuffix(name, suffix) +} + +// Dst returns the destination for the given remote reference. +func (s RefSpec) Dst(n plumbing.ReferenceName) plumbing.ReferenceName { + spec := string(s) + start := strings.Index(spec, refSpecSeparator) + 1 + dst := spec[start:] + src := s.Src() + + if !s.IsWildcard() { + return plumbing.ReferenceName(dst) + } + + name := n.String() + ws := strings.Index(src, refSpecWildcard) + wd := strings.Index(dst, refSpecWildcard) + match := name[ws : len(name)-(len(src)-(ws+1))] + + return plumbing.ReferenceName(dst[0:wd] + match + dst[wd+1:]) +} + +func (s RefSpec) Reverse() RefSpec { + spec := string(s) + separator := strings.Index(spec, refSpecSeparator) + + return RefSpec(spec[separator+1:] + refSpecSeparator + spec[:separator]) +} + +func (s RefSpec) String() string { + return string(s) +} + +// MatchAny returns true if any of the RefSpec match with the given ReferenceName. +func MatchAny(l []RefSpec, n plumbing.ReferenceName) bool { + for _, r := range l { + if r.Match(n) { + return true + } + } + + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/config/url.go b/vendor/github.com/go-git/go-git/v5/config/url.go new file mode 100644 index 0000000000..114d6b2662 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/config/url.go @@ -0,0 +1,81 @@ +package config + +import ( + "errors" + "strings" + + format "github.com/go-git/go-git/v5/plumbing/format/config" +) + +var ( + errURLEmptyInsteadOf = errors.New("url config: empty insteadOf") +) + +// Url defines Url rewrite rules +type URL struct { + // Name new base url + Name string + // Any URL that starts with this value will be rewritten to start, instead, with . + // When more than one insteadOf strings match a given URL, the longest match is used. + InsteadOf string + + // raw representation of the subsection, filled by marshal or unmarshal are + // called. + raw *format.Subsection +} + +// Validate validates fields of branch +func (b *URL) Validate() error { + if b.InsteadOf == "" { + return errURLEmptyInsteadOf + } + + return nil +} + +const ( + insteadOfKey = "insteadOf" +) + +func (u *URL) unmarshal(s *format.Subsection) error { + u.raw = s + + u.Name = s.Name + u.InsteadOf = u.raw.Option(insteadOfKey) + return nil +} + +func (u *URL) marshal() *format.Subsection { + if u.raw == nil { + u.raw = &format.Subsection{} + } + + u.raw.Name = u.Name + u.raw.SetOption(insteadOfKey, u.InsteadOf) + + return u.raw +} + +func findLongestInsteadOfMatch(remoteURL string, urls map[string]*URL) *URL { + var longestMatch *URL + for _, u := range urls { + if !strings.HasPrefix(remoteURL, u.InsteadOf) { + continue + } + + // according to spec if there is more than one match, take the logest + if longestMatch == nil || len(longestMatch.InsteadOf) < len(u.InsteadOf) { + longestMatch = u + } + } + + return longestMatch +} + +func (u *URL) ApplyInsteadOf(url string) string { + if !strings.HasPrefix(url, u.InsteadOf) { + return url + } + + return u.Name + url[len(u.InsteadOf):] +} diff --git a/vendor/github.com/go-git/go-git/v5/doc.go b/vendor/github.com/go-git/go-git/v5/doc.go new file mode 100644 index 0000000000..3d817fe9c8 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/doc.go @@ -0,0 +1,10 @@ +// A highly extensible git implementation in pure Go. +// +// go-git aims to reach the completeness of libgit2 or jgit, nowadays covers the +// majority of the plumbing read operations and some of the main write +// operations, but lacks the main porcelain operations such as merges. +// +// It is highly extensible, we have been following the open/close principle in +// its design to facilitate extensions, mainly focusing the efforts on the +// persistence of the objects. +package git diff --git a/vendor/github.com/go-git/go-git/v5/go.mod b/vendor/github.com/go-git/go-git/v5/go.mod new file mode 100644 index 0000000000..402613f0f1 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/go.mod @@ -0,0 +1,31 @@ +module github.com/go-git/go-git/v5 + +require ( + github.com/Microsoft/go-winio v0.4.16 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 + github.com/acomagu/bufpipe v1.0.3 + github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 // indirect + github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 + github.com/emirpasic/gods v1.12.0 + github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect + github.com/gliderlabs/ssh v0.2.2 + github.com/go-git/gcfg v1.5.0 + github.com/go-git/go-billy/v5 v5.3.1 + github.com/go-git/go-git-fixtures/v4 v4.2.1 + github.com/google/go-cmp v0.3.0 + github.com/imdario/mergo v0.3.12 + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 + github.com/jessevdk/go-flags v1.5.0 + github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 + github.com/mitchellh/go-homedir v1.1.0 + github.com/sergi/go-diff v1.1.0 + github.com/xanzy/ssh-agent v0.3.0 + golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b + golang.org/x/net v0.0.0-20210326060303-6b1517762897 + golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79 + golang.org/x/text v0.3.3 + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c + gopkg.in/warnings.v0 v0.1.2 // indirect +) + +go 1.13 diff --git a/vendor/github.com/go-git/go-git/v5/go.sum b/vendor/github.com/go-git/go-git/v5/go.sum new file mode 100644 index 0000000000..9227247750 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/go.sum @@ -0,0 +1,103 @@ +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.0 h1:KZL1OFdS+afiIjN4hr/zpj5cEtC0OJhbmTA18PsBb8c= +github.com/go-git/go-billy/v5 v5.3.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210326060303-6b1517762897 h1:KrsHThm5nFk34YtATK1LsThyGhGbGe1olrte/HInHvs= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79 h1:RX8C8PRZc2hTIod4ds8ij+/4RQX3AqhYj3uOHmyaz4E= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/go-git/go-git/v5/internal/revision/parser.go b/vendor/github.com/go-git/go-git/v5/internal/revision/parser.go new file mode 100644 index 0000000000..8facf17ffb --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/internal/revision/parser.go @@ -0,0 +1,622 @@ +// Package revision extracts git revision from string +// More information about revision : https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html +package revision + +import ( + "bytes" + "fmt" + "io" + "regexp" + "strconv" + "time" +) + +// ErrInvalidRevision is emitted if string doesn't match valid revision +type ErrInvalidRevision struct { + s string +} + +func (e *ErrInvalidRevision) Error() string { + return "Revision invalid : " + e.s +} + +// Revisioner represents a revision component. +// A revision is made of multiple revision components +// obtained after parsing a revision string, +// for instance revision "master~" will be converted in +// two revision components Ref and TildePath +type Revisioner interface { +} + +// Ref represents a reference name : HEAD, master, +type Ref string + +// TildePath represents ~, ~{n} +type TildePath struct { + Depth int +} + +// CaretPath represents ^, ^{n} +type CaretPath struct { + Depth int +} + +// CaretReg represents ^{/foo bar} +type CaretReg struct { + Regexp *regexp.Regexp + Negate bool +} + +// CaretType represents ^{commit} +type CaretType struct { + ObjectType string +} + +// AtReflog represents @{n} +type AtReflog struct { + Depth int +} + +// AtCheckout represents @{-n} +type AtCheckout struct { + Depth int +} + +// AtUpstream represents @{upstream}, @{u} +type AtUpstream struct { + BranchName string +} + +// AtPush represents @{push} +type AtPush struct { + BranchName string +} + +// AtDate represents @{"2006-01-02T15:04:05Z"} +type AtDate struct { + Date time.Time +} + +// ColonReg represents :/foo bar +type ColonReg struct { + Regexp *regexp.Regexp + Negate bool +} + +// ColonPath represents :./ : +type ColonPath struct { + Path string +} + +// ColonStagePath represents ::/ +type ColonStagePath struct { + Path string + Stage int +} + +// Parser represents a parser +// use to tokenize and transform to revisioner chunks +// a given string +type Parser struct { + s *scanner + currentParsedChar struct { + tok token + lit string + } + unreadLastChar bool +} + +// NewParserFromString returns a new instance of parser from a string. +func NewParserFromString(s string) *Parser { + return NewParser(bytes.NewBufferString(s)) +} + +// NewParser returns a new instance of parser. +func NewParser(r io.Reader) *Parser { + return &Parser{s: newScanner(r)} +} + +// scan returns the next token from the underlying scanner +// or the last scanned token if an unscan was requested +func (p *Parser) scan() (token, string, error) { + if p.unreadLastChar { + p.unreadLastChar = false + return p.currentParsedChar.tok, p.currentParsedChar.lit, nil + } + + tok, lit, err := p.s.scan() + + p.currentParsedChar.tok, p.currentParsedChar.lit = tok, lit + + return tok, lit, err +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { p.unreadLastChar = true } + +// Parse explode a revision string into revisioner chunks +func (p *Parser) Parse() ([]Revisioner, error) { + var rev Revisioner + var revs []Revisioner + var tok token + var err error + + for { + tok, _, err = p.scan() + + if err != nil { + return nil, err + } + + switch tok { + case at: + rev, err = p.parseAt() + case tilde: + rev, err = p.parseTilde() + case caret: + rev, err = p.parseCaret() + case colon: + rev, err = p.parseColon() + case eof: + err = p.validateFullRevision(&revs) + + if err != nil { + return []Revisioner{}, err + } + + return revs, nil + default: + p.unscan() + rev, err = p.parseRef() + } + + if err != nil { + return []Revisioner{}, err + } + + revs = append(revs, rev) + } +} + +// validateFullRevision ensures all revisioner chunks make a valid revision +func (p *Parser) validateFullRevision(chunks *[]Revisioner) error { + var hasReference bool + + for i, chunk := range *chunks { + switch chunk.(type) { + case Ref: + if i == 0 { + hasReference = true + } else { + return &ErrInvalidRevision{`reference must be defined once at the beginning`} + } + case AtDate: + if len(*chunks) == 1 || hasReference && len(*chunks) == 2 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{}, @{}`} + case AtReflog: + if len(*chunks) == 1 || hasReference && len(*chunks) == 2 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{}, @{}`} + case AtCheckout: + if len(*chunks) == 1 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{-}`} + case AtUpstream: + if len(*chunks) == 1 || hasReference && len(*chunks) == 2 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{upstream}, @{upstream}, @{u}, @{u}`} + case AtPush: + if len(*chunks) == 1 || hasReference && len(*chunks) == 2 { + return nil + } + + return &ErrInvalidRevision{`"@" statement is not valid, could be : @{push}, @{push}`} + case TildePath, CaretPath, CaretReg: + if !hasReference { + return &ErrInvalidRevision{`"~" or "^" statement must have a reference defined at the beginning`} + } + case ColonReg: + if len(*chunks) == 1 { + return nil + } + + return &ErrInvalidRevision{`":" statement is not valid, could be : :/`} + case ColonPath: + if i == len(*chunks)-1 && hasReference || len(*chunks) == 1 { + return nil + } + + return &ErrInvalidRevision{`":" statement is not valid, could be : :`} + case ColonStagePath: + if len(*chunks) == 1 { + return nil + } + + return &ErrInvalidRevision{`":" statement is not valid, could be : ::`} + } + } + + return nil +} + +// parseAt extract @ statements +func (p *Parser) parseAt() (Revisioner, error) { + var tok, nextTok token + var lit, nextLit string + var err error + + tok, _, err = p.scan() + + if err != nil { + return nil, err + } + + if tok != obrace { + p.unscan() + + return Ref("HEAD"), nil + } + + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + nextTok, nextLit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == word && (lit == "u" || lit == "upstream") && nextTok == cbrace: + return AtUpstream{}, nil + case tok == word && lit == "push" && nextTok == cbrace: + return AtPush{}, nil + case tok == number && nextTok == cbrace: + n, _ := strconv.Atoi(lit) + + return AtReflog{n}, nil + case tok == minus && nextTok == number: + n, _ := strconv.Atoi(nextLit) + + t, _, err := p.scan() + + if err != nil { + return nil, err + } + + if t != cbrace { + return nil, &ErrInvalidRevision{s: `missing "}" in @{-n} structure`} + } + + return AtCheckout{n}, nil + default: + p.unscan() + + date := lit + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == cbrace: + t, err := time.Parse("2006-01-02T15:04:05Z", date) + + if err != nil { + return nil, &ErrInvalidRevision{fmt.Sprintf(`wrong date "%s" must fit ISO-8601 format : 2006-01-02T15:04:05Z`, date)} + } + + return AtDate{t}, nil + default: + date += lit + } + } + } +} + +// parseTilde extract ~ statements +func (p *Parser) parseTilde() (Revisioner, error) { + var tok token + var lit string + var err error + + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == number: + n, _ := strconv.Atoi(lit) + + return TildePath{n}, nil + default: + p.unscan() + return TildePath{1}, nil + } +} + +// parseCaret extract ^ statements +func (p *Parser) parseCaret() (Revisioner, error) { + var tok token + var lit string + var err error + + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == obrace: + r, err := p.parseCaretBraces() + + if err != nil { + return nil, err + } + + return r, nil + case tok == number: + n, _ := strconv.Atoi(lit) + + if n > 2 { + return nil, &ErrInvalidRevision{fmt.Sprintf(`"%s" found must be 0, 1 or 2 after "^"`, lit)} + } + + return CaretPath{n}, nil + default: + p.unscan() + return CaretPath{1}, nil + } +} + +// parseCaretBraces extract ^{} statements +func (p *Parser) parseCaretBraces() (Revisioner, error) { + var tok, nextTok token + var lit, _ string + start := true + var re string + var negate bool + var err error + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + nextTok, _, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == word && nextTok == cbrace && (lit == "commit" || lit == "tree" || lit == "blob" || lit == "tag" || lit == "object"): + return CaretType{lit}, nil + case re == "" && tok == cbrace: + return CaretType{"tag"}, nil + case re == "" && tok == emark && nextTok == emark: + re += lit + case re == "" && tok == emark && nextTok == minus: + negate = true + case re == "" && tok == emark: + return nil, &ErrInvalidRevision{s: `revision suffix brace component sequences starting with "/!" others than those defined are reserved`} + case re == "" && tok == slash: + p.unscan() + case tok != slash && start: + return nil, &ErrInvalidRevision{fmt.Sprintf(`"%s" is not a valid revision suffix brace component`, lit)} + case tok != cbrace: + p.unscan() + re += lit + case tok == cbrace: + p.unscan() + + reg, err := regexp.Compile(re) + + if err != nil { + return CaretReg{}, &ErrInvalidRevision{fmt.Sprintf(`revision suffix brace component, %s`, err.Error())} + } + + return CaretReg{reg, negate}, nil + } + + start = false + } +} + +// parseColon extract : statements +func (p *Parser) parseColon() (Revisioner, error) { + var tok token + var err error + + tok, _, err = p.scan() + + if err != nil { + return nil, err + } + + switch tok { + case slash: + return p.parseColonSlash() + default: + p.unscan() + return p.parseColonDefault() + } +} + +// parseColonSlash extract :/ statements +func (p *Parser) parseColonSlash() (Revisioner, error) { + var tok, nextTok token + var lit string + var re string + var negate bool + var err error + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + nextTok, _, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == emark && nextTok == emark: + re += lit + case re == "" && tok == emark && nextTok == minus: + negate = true + case re == "" && tok == emark: + return nil, &ErrInvalidRevision{s: `revision suffix brace component sequences starting with "/!" others than those defined are reserved`} + case tok == eof: + p.unscan() + reg, err := regexp.Compile(re) + + if err != nil { + return ColonReg{}, &ErrInvalidRevision{fmt.Sprintf(`revision suffix brace component, %s`, err.Error())} + } + + return ColonReg{reg, negate}, nil + default: + p.unscan() + re += lit + } + } +} + +// parseColonDefault extract : statements +func (p *Parser) parseColonDefault() (Revisioner, error) { + var tok token + var lit string + var path string + var stage int + var err error + var n = -1 + + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + nextTok, _, err := p.scan() + + if err != nil { + return nil, err + } + + if tok == number && nextTok == colon { + n, _ = strconv.Atoi(lit) + } + + switch n { + case 0, 1, 2, 3: + stage = n + default: + path += lit + p.unscan() + } + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch { + case tok == eof && n == -1: + return ColonPath{path}, nil + case tok == eof: + return ColonStagePath{path, stage}, nil + default: + path += lit + } + } +} + +// parseRef extract reference name +func (p *Parser) parseRef() (Revisioner, error) { + var tok, prevTok token + var lit, buf string + var endOfRef bool + var err error + + for { + tok, lit, err = p.scan() + + if err != nil { + return nil, err + } + + switch tok { + case eof, at, colon, tilde, caret: + endOfRef = true + } + + err := p.checkRefFormat(tok, lit, prevTok, buf, endOfRef) + + if err != nil { + return "", err + } + + if endOfRef { + p.unscan() + return Ref(buf), nil + } + + buf += lit + prevTok = tok + } +} + +// checkRefFormat ensure reference name follow rules defined here : +// https://git-scm.com/docs/git-check-ref-format +func (p *Parser) checkRefFormat(token token, literal string, previousToken token, buffer string, endOfRef bool) error { + switch token { + case aslash, space, control, qmark, asterisk, obracket: + return &ErrInvalidRevision{fmt.Sprintf(`must not contains "%s"`, literal)} + } + + switch { + case (token == dot || token == slash) && buffer == "": + return &ErrInvalidRevision{fmt.Sprintf(`must not start with "%s"`, literal)} + case previousToken == slash && endOfRef: + return &ErrInvalidRevision{`must not end with "/"`} + case previousToken == dot && endOfRef: + return &ErrInvalidRevision{`must not end with "."`} + case token == dot && previousToken == slash: + return &ErrInvalidRevision{`must not contains "/."`} + case previousToken == dot && token == dot: + return &ErrInvalidRevision{`must not contains ".."`} + case previousToken == slash && token == slash: + return &ErrInvalidRevision{`must not contains consecutively "/"`} + case (token == slash || endOfRef) && len(buffer) > 4 && buffer[len(buffer)-5:] == ".lock": + return &ErrInvalidRevision{"cannot end with .lock"} + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/internal/revision/scanner.go b/vendor/github.com/go-git/go-git/v5/internal/revision/scanner.go new file mode 100644 index 0000000000..c46c21b795 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/internal/revision/scanner.go @@ -0,0 +1,117 @@ +package revision + +import ( + "bufio" + "io" + "unicode" +) + +// runeCategoryValidator takes a rune as input and +// validates it belongs to a rune category +type runeCategoryValidator func(r rune) bool + +// tokenizeExpression aggregates a series of runes matching check predicate into a single +// string and provides given tokenType as token type +func tokenizeExpression(ch rune, tokenType token, check runeCategoryValidator, r *bufio.Reader) (token, string, error) { + var data []rune + data = append(data, ch) + + for { + c, _, err := r.ReadRune() + + if c == zeroRune { + break + } + + if err != nil { + return tokenError, "", err + } + + if check(c) { + data = append(data, c) + } else { + err := r.UnreadRune() + + if err != nil { + return tokenError, "", err + } + + return tokenType, string(data), nil + } + } + + return tokenType, string(data), nil +} + +var zeroRune = rune(0) + +// scanner represents a lexical scanner. +type scanner struct { + r *bufio.Reader +} + +// newScanner returns a new instance of scanner. +func newScanner(r io.Reader) *scanner { + return &scanner{r: bufio.NewReader(r)} +} + +// Scan extracts tokens and their strings counterpart +// from the reader +func (s *scanner) scan() (token, string, error) { + ch, _, err := s.r.ReadRune() + + if err != nil && err != io.EOF { + return tokenError, "", err + } + + switch ch { + case zeroRune: + return eof, "", nil + case ':': + return colon, string(ch), nil + case '~': + return tilde, string(ch), nil + case '^': + return caret, string(ch), nil + case '.': + return dot, string(ch), nil + case '/': + return slash, string(ch), nil + case '{': + return obrace, string(ch), nil + case '}': + return cbrace, string(ch), nil + case '-': + return minus, string(ch), nil + case '@': + return at, string(ch), nil + case '\\': + return aslash, string(ch), nil + case '?': + return qmark, string(ch), nil + case '*': + return asterisk, string(ch), nil + case '[': + return obracket, string(ch), nil + case '!': + return emark, string(ch), nil + } + + if unicode.IsSpace(ch) { + return space, string(ch), nil + } + + if unicode.IsControl(ch) { + return control, string(ch), nil + } + + if unicode.IsLetter(ch) { + return tokenizeExpression(ch, word, unicode.IsLetter, s.r) + } + + if unicode.IsNumber(ch) { + return tokenizeExpression(ch, number, unicode.IsNumber, s.r) + } + + return tokenError, string(ch), nil +} diff --git a/vendor/github.com/go-git/go-git/v5/internal/revision/token.go b/vendor/github.com/go-git/go-git/v5/internal/revision/token.go new file mode 100644 index 0000000000..abc4048869 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/internal/revision/token.go @@ -0,0 +1,28 @@ +package revision + +// token represents a entity extracted from string parsing +type token int + +const ( + eof token = iota + + aslash + asterisk + at + caret + cbrace + colon + control + dot + emark + minus + number + obrace + obracket + qmark + slash + space + tilde + tokenError + word +) diff --git a/vendor/github.com/go-git/go-git/v5/internal/url/url.go b/vendor/github.com/go-git/go-git/v5/internal/url/url.go new file mode 100644 index 0000000000..14cf133de8 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/internal/url/url.go @@ -0,0 +1,37 @@ +package url + +import ( + "regexp" +) + +var ( + isSchemeRegExp = regexp.MustCompile(`^[^:]+://`) + scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P[^@]+)@)?(?P[^:\s]+):(?:(?P[0-9]{1,5})(?:\/|:))?(?P[^\\].*\/[^\\].*)$`) +) + +// MatchesScheme returns true if the given string matches a URL-like +// format scheme. +func MatchesScheme(url string) bool { + return isSchemeRegExp.MatchString(url) +} + +// MatchesScpLike returns true if the given string matches an SCP-like +// format scheme. +func MatchesScpLike(url string) bool { + return scpLikeUrlRegExp.MatchString(url) +} + +// FindScpLikeComponents returns the user, host, port and path of the +// given SCP-like URL. +func FindScpLikeComponents(url string) (user, host, port, path string) { + m := scpLikeUrlRegExp.FindStringSubmatch(url) + return m[1], m[2], m[3], m[4] +} + +// IsLocalEndpoint returns true if the given URL string specifies a +// local file endpoint. For example, on a Linux machine, +// `/home/user/src/go-git` would match as a local endpoint, but +// `https://github.com/src-d/go-git` would not. +func IsLocalEndpoint(url string) bool { + return !MatchesScheme(url) && !MatchesScpLike(url) +} diff --git a/vendor/github.com/go-git/go-git/v5/object_walker.go b/vendor/github.com/go-git/go-git/v5/object_walker.go new file mode 100644 index 0000000000..3fcdd2999c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/object_walker.go @@ -0,0 +1,104 @@ +package git + +import ( + "fmt" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/storage" +) + +type objectWalker struct { + Storer storage.Storer + // seen is the set of objects seen in the repo. + // seen map can become huge if walking over large + // repos. Thus using struct{} as the value type. + seen map[plumbing.Hash]struct{} +} + +func newObjectWalker(s storage.Storer) *objectWalker { + return &objectWalker{s, map[plumbing.Hash]struct{}{}} +} + +// walkAllRefs walks all (hash) references from the repo. +func (p *objectWalker) walkAllRefs() error { + // Walk over all the references in the repo. + it, err := p.Storer.IterReferences() + if err != nil { + return err + } + defer it.Close() + err = it.ForEach(func(ref *plumbing.Reference) error { + // Exit this iteration early for non-hash references. + if ref.Type() != plumbing.HashReference { + return nil + } + return p.walkObjectTree(ref.Hash()) + }) + return err +} + +func (p *objectWalker) isSeen(hash plumbing.Hash) bool { + _, seen := p.seen[hash] + return seen +} + +func (p *objectWalker) add(hash plumbing.Hash) { + p.seen[hash] = struct{}{} +} + +// walkObjectTree walks over all objects and remembers references +// to them in the objectWalker. This is used instead of the revlist +// walks because memory usage is tight with huge repos. +func (p *objectWalker) walkObjectTree(hash plumbing.Hash) error { + // Check if we have already seen, and mark this object + if p.isSeen(hash) { + return nil + } + p.add(hash) + // Fetch the object. + obj, err := object.GetObject(p.Storer, hash) + if err != nil { + return fmt.Errorf("Getting object %s failed: %v", hash, err) + } + // Walk all children depending on object type. + switch obj := obj.(type) { + case *object.Commit: + err = p.walkObjectTree(obj.TreeHash) + if err != nil { + return err + } + for _, h := range obj.ParentHashes { + err = p.walkObjectTree(h) + if err != nil { + return err + } + } + case *object.Tree: + for i := range obj.Entries { + // Shortcut for blob objects: + // 'or' the lower bits of a mode and check that it + // it matches a filemode.Executable. The type information + // is in the higher bits, but this is the cleanest way + // to handle plain files with different modes. + // Other non-tree objects are somewhat rare, so they + // are not special-cased. + if obj.Entries[i].Mode|0755 == filemode.Executable { + p.add(obj.Entries[i].Hash) + continue + } + // Normal walk for sub-trees (and symlinks etc). + err = p.walkObjectTree(obj.Entries[i].Hash) + if err != nil { + return err + } + } + case *object.Tag: + return p.walkObjectTree(obj.Target) + default: + // Error out on unhandled object types. + return fmt.Errorf("Unknown object %X %s %T\n", obj.ID(), obj.Type(), obj) + } + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/options.go b/vendor/github.com/go-git/go-git/v5/options.go new file mode 100644 index 0000000000..70687965bb --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/options.go @@ -0,0 +1,634 @@ +package git + +import ( + "errors" + "fmt" + "regexp" + "strings" + "time" + + "github.com/ProtonMail/go-crypto/openpgp" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" + "github.com/go-git/go-git/v5/plumbing/transport" +) + +// SubmoduleRescursivity defines how depth will affect any submodule recursive +// operation. +type SubmoduleRescursivity uint + +const ( + // DefaultRemoteName name of the default Remote, just like git command. + DefaultRemoteName = "origin" + + // NoRecurseSubmodules disables the recursion for a submodule operation. + NoRecurseSubmodules SubmoduleRescursivity = 0 + // DefaultSubmoduleRecursionDepth allow recursion in a submodule operation. + DefaultSubmoduleRecursionDepth SubmoduleRescursivity = 10 +) + +var ( + ErrMissingURL = errors.New("URL field is required") +) + +// CloneOptions describes how a clone should be performed. +type CloneOptions struct { + // The (possibly remote) repository URL to clone from. + URL string + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // Name of the remote to be added, by default `origin`. + RemoteName string + // Remote branch to clone. + ReferenceName plumbing.ReferenceName + // Fetch only ReferenceName if true. + SingleBranch bool + // No checkout of HEAD after clone if true. + NoCheckout bool + // Limit fetching to the specified number of commits. + Depth int + // RecurseSubmodules after the clone is created, initialize all submodules + // within, using their default settings. This option is ignored if the + // cloned repository does not have a worktree. + RecurseSubmodules SubmoduleRescursivity + // Progress is where the human readable information sent by the server is + // stored, if nil nothing is stored and the capability (if supported) + // no-progress, is sent to the server to avoid send this information. + Progress sideband.Progress + // Tags describe how the tags will be fetched from the remote repository, + // by default is AllTags. + Tags TagMode + // InsecureSkipTLS skips ssl verify if protocol is https + InsecureSkipTLS bool + // CABundle specify additional ca bundle with system cert pool + CABundle []byte +} + +// Validate validates the fields and sets the default values. +func (o *CloneOptions) Validate() error { + if o.URL == "" { + return ErrMissingURL + } + + if o.RemoteName == "" { + o.RemoteName = DefaultRemoteName + } + + if o.ReferenceName == "" { + o.ReferenceName = plumbing.HEAD + } + + if o.Tags == InvalidTagMode { + o.Tags = AllTags + } + + return nil +} + +// PullOptions describes how a pull should be performed. +type PullOptions struct { + // Name of the remote to be pulled. If empty, uses the default. + RemoteName string + // Remote branch to clone. If empty, uses HEAD. + ReferenceName plumbing.ReferenceName + // Fetch only ReferenceName if true. + SingleBranch bool + // Limit fetching to the specified number of commits. + Depth int + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // RecurseSubmodules controls if new commits of all populated submodules + // should be fetched too. + RecurseSubmodules SubmoduleRescursivity + // Progress is where the human readable information sent by the server is + // stored, if nil nothing is stored and the capability (if supported) + // no-progress, is sent to the server to avoid send this information. + Progress sideband.Progress + // Force allows the pull to update a local branch even when the remote + // branch does not descend from it. + Force bool + // InsecureSkipTLS skips ssl verify if protocol is https + InsecureSkipTLS bool + // CABundle specify additional ca bundle with system cert pool + CABundle []byte +} + +// Validate validates the fields and sets the default values. +func (o *PullOptions) Validate() error { + if o.RemoteName == "" { + o.RemoteName = DefaultRemoteName + } + + if o.ReferenceName == "" { + o.ReferenceName = plumbing.HEAD + } + + return nil +} + +type TagMode int + +const ( + InvalidTagMode TagMode = iota + // TagFollowing any tag that points into the histories being fetched is also + // fetched. TagFollowing requires a server with `include-tag` capability + // in order to fetch the annotated tags objects. + TagFollowing + // AllTags fetch all tags from the remote (i.e., fetch remote tags + // refs/tags/* into local tags with the same name) + AllTags + //NoTags fetch no tags from the remote at all + NoTags +) + +// FetchOptions describes how a fetch should be performed +type FetchOptions struct { + // Name of the remote to fetch from. Defaults to origin. + RemoteName string + RefSpecs []config.RefSpec + // Depth limit fetching to the specified number of commits from the tip of + // each remote branch history. + Depth int + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // Progress is where the human readable information sent by the server is + // stored, if nil nothing is stored and the capability (if supported) + // no-progress, is sent to the server to avoid send this information. + Progress sideband.Progress + // Tags describe how the tags will be fetched from the remote repository, + // by default is TagFollowing. + Tags TagMode + // Force allows the fetch to update a local branch even when the remote + // branch does not descend from it. + Force bool + // InsecureSkipTLS skips ssl verify if protocol is https + InsecureSkipTLS bool + // CABundle specify additional ca bundle with system cert pool + CABundle []byte +} + +// Validate validates the fields and sets the default values. +func (o *FetchOptions) Validate() error { + if o.RemoteName == "" { + o.RemoteName = DefaultRemoteName + } + + if o.Tags == InvalidTagMode { + o.Tags = TagFollowing + } + + for _, r := range o.RefSpecs { + if err := r.Validate(); err != nil { + return err + } + } + + return nil +} + +// PushOptions describes how a push should be performed. +type PushOptions struct { + // RemoteName is the name of the remote to be pushed to. + RemoteName string + // RefSpecs specify what destination ref to update with what source + // object. A refspec with empty src can be used to delete a reference. + RefSpecs []config.RefSpec + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // Progress is where the human readable information sent by the server is + // stored, if nil nothing is stored. + Progress sideband.Progress + // Prune specify that remote refs that match given RefSpecs and that do + // not exist locally will be removed. + Prune bool + // Force allows the push to update a remote branch even when the local + // branch does not descend from it. + Force bool + // InsecureSkipTLS skips ssl verify if protocal is https + InsecureSkipTLS bool + // CABundle specify additional ca bundle with system cert pool + CABundle []byte + // RequireRemoteRefs only allows a remote ref to be updated if its current + // value is the one specified here. + RequireRemoteRefs []config.RefSpec +} + +// Validate validates the fields and sets the default values. +func (o *PushOptions) Validate() error { + if o.RemoteName == "" { + o.RemoteName = DefaultRemoteName + } + + if len(o.RefSpecs) == 0 { + o.RefSpecs = []config.RefSpec{ + config.RefSpec(config.DefaultPushRefSpec), + } + } + + for _, r := range o.RefSpecs { + if err := r.Validate(); err != nil { + return err + } + } + + return nil +} + +// SubmoduleUpdateOptions describes how a submodule update should be performed. +type SubmoduleUpdateOptions struct { + // Init, if true initializes the submodules recorded in the index. + Init bool + // NoFetch tell to the update command to not fetch new objects from the + // remote site. + NoFetch bool + // RecurseSubmodules the update is performed not only in the submodules of + // the current repository but also in any nested submodules inside those + // submodules (and so on). Until the SubmoduleRescursivity is reached. + RecurseSubmodules SubmoduleRescursivity + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod +} + +var ( + ErrBranchHashExclusive = errors.New("Branch and Hash are mutually exclusive") + ErrCreateRequiresBranch = errors.New("Branch is mandatory when Create is used") +) + +// CheckoutOptions describes how a checkout operation should be performed. +type CheckoutOptions struct { + // Hash is the hash of the commit to be checked out. If used, HEAD will be + // in detached mode. If Create is not used, Branch and Hash are mutually + // exclusive. + Hash plumbing.Hash + // Branch to be checked out, if Branch and Hash are empty is set to `master`. + Branch plumbing.ReferenceName + // Create a new branch named Branch and start it at Hash. + Create bool + // Force, if true when switching branches, proceed even if the index or the + // working tree differs from HEAD. This is used to throw away local changes + Force bool + // Keep, if true when switching branches, local changes (the index or the + // working tree changes) will be kept so that they can be committed to the + // target branch. Force and Keep are mutually exclusive, should not be both + // set to true. + Keep bool +} + +// Validate validates the fields and sets the default values. +func (o *CheckoutOptions) Validate() error { + if !o.Create && !o.Hash.IsZero() && o.Branch != "" { + return ErrBranchHashExclusive + } + + if o.Create && o.Branch == "" { + return ErrCreateRequiresBranch + } + + if o.Branch == "" { + o.Branch = plumbing.Master + } + + return nil +} + +// ResetMode defines the mode of a reset operation. +type ResetMode int8 + +const ( + // MixedReset resets the index but not the working tree (i.e., the changed + // files are preserved but not marked for commit) and reports what has not + // been updated. This is the default action. + MixedReset ResetMode = iota + // HardReset resets the index and working tree. Any changes to tracked files + // in the working tree are discarded. + HardReset + // MergeReset resets the index and updates the files in the working tree + // that are different between Commit and HEAD, but keeps those which are + // different between the index and working tree (i.e. which have changes + // which have not been added). + // + // If a file that is different between Commit and the index has unstaged + // changes, reset is aborted. + MergeReset + // SoftReset does not touch the index file or the working tree at all (but + // resets the head to , just like all modes do). This leaves all + // your changed files "Changes to be committed", as git status would put it. + SoftReset +) + +// ResetOptions describes how a reset operation should be performed. +type ResetOptions struct { + // Commit, if commit is present set the current branch head (HEAD) to it. + Commit plumbing.Hash + // Mode, form resets the current branch head to Commit and possibly updates + // the index (resetting it to the tree of Commit) and the working tree + // depending on Mode. If empty MixedReset is used. + Mode ResetMode +} + +// Validate validates the fields and sets the default values. +func (o *ResetOptions) Validate(r *Repository) error { + if o.Commit == plumbing.ZeroHash { + ref, err := r.Head() + if err != nil { + return err + } + + o.Commit = ref.Hash() + } + + return nil +} + +type LogOrder int8 + +const ( + LogOrderDefault LogOrder = iota + LogOrderDFS + LogOrderDFSPost + LogOrderBSF + LogOrderCommitterTime +) + +// LogOptions describes how a log action should be performed. +type LogOptions struct { + // When the From option is set the log will only contain commits + // reachable from it. If this option is not set, HEAD will be used as + // the default From. + From plumbing.Hash + + // The default traversal algorithm is Depth-first search + // set Order=LogOrderCommitterTime for ordering by committer time (more compatible with `git log`) + // set Order=LogOrderBSF for Breadth-first search + Order LogOrder + + // Show only those commits in which the specified file was inserted/updated. + // It is equivalent to running `git log -- `. + // this field is kept for compatility, it can be replaced with PathFilter + FileName *string + + // Filter commits based on the path of files that are updated + // takes file path as argument and should return true if the file is desired + // It can be used to implement `git log -- ` + // either is a file path, or directory path, or a regexp of file/directory path + PathFilter func(string) bool + + // Pretend as if all the refs in refs/, along with HEAD, are listed on the command line as . + // It is equivalent to running `git log --all`. + // If set on true, the From option will be ignored. + All bool + + // Show commits more recent than a specific date. + // It is equivalent to running `git log --since ` or `git log --after `. + Since *time.Time + + // Show commits older than a specific date. + // It is equivalent to running `git log --until ` or `git log --before `. + Until *time.Time +} + +var ( + ErrMissingAuthor = errors.New("author field is required") +) + +// AddOptions describes how an `add` operation should be performed +type AddOptions struct { + // All equivalent to `git add -A`, update the index not only where the + // working tree has a file matching `Path` but also where the index already + // has an entry. This adds, modifies, and removes index entries to match the + // working tree. If no `Path` nor `Glob` is given when `All` option is + // used, all files in the entire working tree are updated. + All bool + // Path is the exact filepath to the file or directory to be added. + Path string + // Glob adds all paths, matching pattern, to the index. If pattern matches a + // directory path, all directory contents are added to the index recursively. + Glob string +} + +// Validate validates the fields and sets the default values. +func (o *AddOptions) Validate(r *Repository) error { + if o.Path != "" && o.Glob != "" { + return fmt.Errorf("fields Path and Glob are mutual exclusive") + } + + return nil +} + +// CommitOptions describes how a commit operation should be performed. +type CommitOptions struct { + // All automatically stage files that have been modified and deleted, but + // new files you have not told Git about are not affected. + All bool + // Author is the author's signature of the commit. If Author is empty the + // Name and Email is read from the config, and time.Now it's used as When. + Author *object.Signature + // Committer is the committer's signature of the commit. If Committer is + // nil the Author signature is used. + Committer *object.Signature + // Parents are the parents commits for the new commit, by default when + // len(Parents) is zero, the hash of HEAD reference is used. + Parents []plumbing.Hash + // SignKey denotes a key to sign the commit with. A nil value here means the + // commit will not be signed. The private key must be present and already + // decrypted. + SignKey *openpgp.Entity +} + +// Validate validates the fields and sets the default values. +func (o *CommitOptions) Validate(r *Repository) error { + if o.Author == nil { + if err := o.loadConfigAuthorAndCommitter(r); err != nil { + return err + } + } + + if o.Committer == nil { + o.Committer = o.Author + } + + if len(o.Parents) == 0 { + head, err := r.Head() + if err != nil && err != plumbing.ErrReferenceNotFound { + return err + } + + if head != nil { + o.Parents = []plumbing.Hash{head.Hash()} + } + } + + return nil +} + +func (o *CommitOptions) loadConfigAuthorAndCommitter(r *Repository) error { + cfg, err := r.ConfigScoped(config.SystemScope) + if err != nil { + return err + } + + if o.Author == nil && cfg.Author.Email != "" && cfg.Author.Name != "" { + o.Author = &object.Signature{ + Name: cfg.Author.Name, + Email: cfg.Author.Email, + When: time.Now(), + } + } + + if o.Committer == nil && cfg.Committer.Email != "" && cfg.Committer.Name != "" { + o.Committer = &object.Signature{ + Name: cfg.Committer.Name, + Email: cfg.Committer.Email, + When: time.Now(), + } + } + + if o.Author == nil && cfg.User.Email != "" && cfg.User.Name != "" { + o.Author = &object.Signature{ + Name: cfg.User.Name, + Email: cfg.User.Email, + When: time.Now(), + } + } + + if o.Author == nil { + return ErrMissingAuthor + } + + return nil +} + +var ( + ErrMissingName = errors.New("name field is required") + ErrMissingTagger = errors.New("tagger field is required") + ErrMissingMessage = errors.New("message field is required") +) + +// CreateTagOptions describes how a tag object should be created. +type CreateTagOptions struct { + // Tagger defines the signature of the tag creator. If Tagger is empty the + // Name and Email is read from the config, and time.Now it's used as When. + Tagger *object.Signature + // Message defines the annotation of the tag. It is canonicalized during + // validation into the format expected by git - no leading whitespace and + // ending in a newline. + Message string + // SignKey denotes a key to sign the tag with. A nil value here means the tag + // will not be signed. The private key must be present and already decrypted. + SignKey *openpgp.Entity +} + +// Validate validates the fields and sets the default values. +func (o *CreateTagOptions) Validate(r *Repository, hash plumbing.Hash) error { + if o.Tagger == nil { + if err := o.loadConfigTagger(r); err != nil { + return err + } + } + + if o.Message == "" { + return ErrMissingMessage + } + + // Canonicalize the message into the expected message format. + o.Message = strings.TrimSpace(o.Message) + "\n" + + return nil +} + +func (o *CreateTagOptions) loadConfigTagger(r *Repository) error { + cfg, err := r.ConfigScoped(config.SystemScope) + if err != nil { + return err + } + + if o.Tagger == nil && cfg.Author.Email != "" && cfg.Author.Name != "" { + o.Tagger = &object.Signature{ + Name: cfg.Author.Name, + Email: cfg.Author.Email, + When: time.Now(), + } + } + + if o.Tagger == nil && cfg.User.Email != "" && cfg.User.Name != "" { + o.Tagger = &object.Signature{ + Name: cfg.User.Name, + Email: cfg.User.Email, + When: time.Now(), + } + } + + if o.Tagger == nil { + return ErrMissingTagger + } + + return nil +} + +// ListOptions describes how a remote list should be performed. +type ListOptions struct { + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod + // InsecureSkipTLS skips ssl verify if protocal is https + InsecureSkipTLS bool + // CABundle specify additional ca bundle with system cert pool + CABundle []byte +} + +// CleanOptions describes how a clean should be performed. +type CleanOptions struct { + Dir bool +} + +// GrepOptions describes how a grep should be performed. +type GrepOptions struct { + // Patterns are compiled Regexp objects to be matched. + Patterns []*regexp.Regexp + // InvertMatch selects non-matching lines. + InvertMatch bool + // CommitHash is the hash of the commit from which worktree should be derived. + CommitHash plumbing.Hash + // ReferenceName is the branch or tag name from which worktree should be derived. + ReferenceName plumbing.ReferenceName + // PathSpecs are compiled Regexp objects of pathspec to use in the matching. + PathSpecs []*regexp.Regexp +} + +var ( + ErrHashOrReference = errors.New("ambiguous options, only one of CommitHash or ReferenceName can be passed") +) + +// Validate validates the fields and sets the default values. +func (o *GrepOptions) Validate(w *Worktree) error { + if !o.CommitHash.IsZero() && o.ReferenceName != "" { + return ErrHashOrReference + } + + // If none of CommitHash and ReferenceName are provided, set commit hash of + // the repository's head. + if o.CommitHash.IsZero() && o.ReferenceName == "" { + ref, err := w.r.Head() + if err != nil { + return err + } + o.CommitHash = ref.Hash() + } + + return nil +} + +// PlainOpenOptions describes how opening a plain repository should be +// performed. +type PlainOpenOptions struct { + // DetectDotGit defines whether parent directories should be + // walked until a .git directory or file is found. + DetectDotGit bool + // Enable .git/commondir support (see https://git-scm.com/docs/gitrepository-layout#Documentation/gitrepository-layout.txt). + // NOTE: This option will only work with the filesystem storage. + EnableDotGitCommonDir bool +} + +// Validate validates the fields and sets the default values. +func (o *PlainOpenOptions) Validate() error { return nil } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/cache/buffer_lru.go b/vendor/github.com/go-git/go-git/v5/plumbing/cache/buffer_lru.go new file mode 100644 index 0000000000..acaf195203 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/cache/buffer_lru.go @@ -0,0 +1,98 @@ +package cache + +import ( + "container/list" + "sync" +) + +// BufferLRU implements an object cache with an LRU eviction policy and a +// maximum size (measured in object size). +type BufferLRU struct { + MaxSize FileSize + + actualSize FileSize + ll *list.List + cache map[int64]*list.Element + mut sync.Mutex +} + +// NewBufferLRU creates a new BufferLRU with the given maximum size. The maximum +// size will never be exceeded. +func NewBufferLRU(maxSize FileSize) *BufferLRU { + return &BufferLRU{MaxSize: maxSize} +} + +// NewBufferLRUDefault creates a new BufferLRU with the default cache size. +func NewBufferLRUDefault() *BufferLRU { + return &BufferLRU{MaxSize: DefaultMaxSize} +} + +type buffer struct { + Key int64 + Slice []byte +} + +// Put puts a buffer into the cache. If the buffer is already in the cache, it +// will be marked as used. Otherwise, it will be inserted. A buffers might +// be evicted to make room for the new one. +func (c *BufferLRU) Put(key int64, slice []byte) { + c.mut.Lock() + defer c.mut.Unlock() + + if c.cache == nil { + c.actualSize = 0 + c.cache = make(map[int64]*list.Element, 1000) + c.ll = list.New() + } + + bufSize := FileSize(len(slice)) + if ee, ok := c.cache[key]; ok { + oldBuf := ee.Value.(buffer) + // in this case bufSize is a delta: new size - old size + bufSize -= FileSize(len(oldBuf.Slice)) + c.ll.MoveToFront(ee) + ee.Value = buffer{key, slice} + } else { + if bufSize > c.MaxSize { + return + } + ee := c.ll.PushFront(buffer{key, slice}) + c.cache[key] = ee + } + + c.actualSize += bufSize + for c.actualSize > c.MaxSize { + last := c.ll.Back() + lastObj := last.Value.(buffer) + lastSize := FileSize(len(lastObj.Slice)) + + c.ll.Remove(last) + delete(c.cache, lastObj.Key) + c.actualSize -= lastSize + } +} + +// Get returns a buffer by its key. It marks the buffer as used. If the buffer +// is not in the cache, (nil, false) will be returned. +func (c *BufferLRU) Get(key int64) ([]byte, bool) { + c.mut.Lock() + defer c.mut.Unlock() + + ee, ok := c.cache[key] + if !ok { + return nil, false + } + + c.ll.MoveToFront(ee) + return ee.Value.(buffer).Slice, true +} + +// Clear the content of this buffer cache. +func (c *BufferLRU) Clear() { + c.mut.Lock() + defer c.mut.Unlock() + + c.ll = nil + c.cache = nil + c.actualSize = 0 +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/cache/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/cache/common.go new file mode 100644 index 0000000000..7b0d0c76bb --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/cache/common.go @@ -0,0 +1,39 @@ +package cache + +import "github.com/go-git/go-git/v5/plumbing" + +const ( + Byte FileSize = 1 << (iota * 10) + KiByte + MiByte + GiByte +) + +type FileSize int64 + +const DefaultMaxSize FileSize = 96 * MiByte + +// Object is an interface to a object cache. +type Object interface { + // Put puts the given object into the cache. Whether this object will + // actually be put into the cache or not is implementation specific. + Put(o plumbing.EncodedObject) + // Get gets an object from the cache given its hash. The second return value + // is true if the object was returned, and false otherwise. + Get(k plumbing.Hash) (plumbing.EncodedObject, bool) + // Clear clears every object from the cache. + Clear() +} + +// Buffer is an interface to a buffer cache. +type Buffer interface { + // Put puts a buffer into the cache. If the buffer is already in the cache, + // it will be marked as used. Otherwise, it will be inserted. Buffer might + // be evicted to make room for the new one. + Put(key int64, slice []byte) + // Get returns a buffer by its key. It marks the buffer as used. If the + // buffer is not in the cache, (nil, false) will be returned. + Get(key int64) ([]byte, bool) + // Clear clears every object from the cache. + Clear() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/cache/object_lru.go b/vendor/github.com/go-git/go-git/v5/plumbing/cache/object_lru.go new file mode 100644 index 0000000000..c50d0d1e6c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/cache/object_lru.go @@ -0,0 +1,101 @@ +package cache + +import ( + "container/list" + "sync" + + "github.com/go-git/go-git/v5/plumbing" +) + +// ObjectLRU implements an object cache with an LRU eviction policy and a +// maximum size (measured in object size). +type ObjectLRU struct { + MaxSize FileSize + + actualSize FileSize + ll *list.List + cache map[interface{}]*list.Element + mut sync.Mutex +} + +// NewObjectLRU creates a new ObjectLRU with the given maximum size. The maximum +// size will never be exceeded. +func NewObjectLRU(maxSize FileSize) *ObjectLRU { + return &ObjectLRU{MaxSize: maxSize} +} + +// NewObjectLRUDefault creates a new ObjectLRU with the default cache size. +func NewObjectLRUDefault() *ObjectLRU { + return &ObjectLRU{MaxSize: DefaultMaxSize} +} + +// Put puts an object into the cache. If the object is already in the cache, it +// will be marked as used. Otherwise, it will be inserted. A single object might +// be evicted to make room for the new object. +func (c *ObjectLRU) Put(obj plumbing.EncodedObject) { + c.mut.Lock() + defer c.mut.Unlock() + + if c.cache == nil { + c.actualSize = 0 + c.cache = make(map[interface{}]*list.Element, 1000) + c.ll = list.New() + } + + objSize := FileSize(obj.Size()) + key := obj.Hash() + if ee, ok := c.cache[key]; ok { + oldObj := ee.Value.(plumbing.EncodedObject) + // in this case objSize is a delta: new size - old size + objSize -= FileSize(oldObj.Size()) + c.ll.MoveToFront(ee) + ee.Value = obj + } else { + if objSize > c.MaxSize { + return + } + ee := c.ll.PushFront(obj) + c.cache[key] = ee + } + + c.actualSize += objSize + for c.actualSize > c.MaxSize { + last := c.ll.Back() + if last == nil { + c.actualSize = 0 + break + } + + lastObj := last.Value.(plumbing.EncodedObject) + lastSize := FileSize(lastObj.Size()) + + c.ll.Remove(last) + delete(c.cache, lastObj.Hash()) + c.actualSize -= lastSize + } +} + +// Get returns an object by its hash. It marks the object as used. If the object +// is not in the cache, (nil, false) will be returned. +func (c *ObjectLRU) Get(k plumbing.Hash) (plumbing.EncodedObject, bool) { + c.mut.Lock() + defer c.mut.Unlock() + + ee, ok := c.cache[k] + if !ok { + return nil, false + } + + c.ll.MoveToFront(ee) + return ee.Value.(plumbing.EncodedObject), true +} + +// Clear the content of this object cache. +func (c *ObjectLRU) Clear() { + c.mut.Lock() + defer c.mut.Unlock() + + c.ll = nil + c.cache = nil + c.actualSize = 0 +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/color/color.go b/vendor/github.com/go-git/go-git/v5/plumbing/color/color.go new file mode 100644 index 0000000000..2cd74bdc1a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/color/color.go @@ -0,0 +1,38 @@ +package color + +// TODO read colors from a github.com/go-git/go-git/plumbing/format/config.Config struct +// TODO implement color parsing, see https://github.com/git/git/blob/v2.26.2/color.c + +// Colors. See https://github.com/git/git/blob/v2.26.2/color.h#L24-L53. +const ( + Normal = "" + Reset = "\033[m" + Bold = "\033[1m" + Red = "\033[31m" + Green = "\033[32m" + Yellow = "\033[33m" + Blue = "\033[34m" + Magenta = "\033[35m" + Cyan = "\033[36m" + BoldRed = "\033[1;31m" + BoldGreen = "\033[1;32m" + BoldYellow = "\033[1;33m" + BoldBlue = "\033[1;34m" + BoldMagenta = "\033[1;35m" + BoldCyan = "\033[1;36m" + FaintRed = "\033[2;31m" + FaintGreen = "\033[2;32m" + FaintYellow = "\033[2;33m" + FaintBlue = "\033[2;34m" + FaintMagenta = "\033[2;35m" + FaintCyan = "\033[2;36m" + BgRed = "\033[41m" + BgGreen = "\033[42m" + BgYellow = "\033[43m" + BgBlue = "\033[44m" + BgMagenta = "\033[45m" + BgCyan = "\033[46m" + Faint = "\033[2m" + FaintItalic = "\033[2;3m" + Reverse = "\033[7m" +) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/error.go b/vendor/github.com/go-git/go-git/v5/plumbing/error.go new file mode 100644 index 0000000000..a3ebed3f6c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/error.go @@ -0,0 +1,35 @@ +package plumbing + +import "fmt" + +type PermanentError struct { + Err error +} + +func NewPermanentError(err error) *PermanentError { + if err == nil { + return nil + } + + return &PermanentError{Err: err} +} + +func (e *PermanentError) Error() string { + return fmt.Sprintf("permanent client error: %s", e.Err.Error()) +} + +type UnexpectedError struct { + Err error +} + +func NewUnexpectedError(err error) *UnexpectedError { + if err == nil { + return nil + } + + return &UnexpectedError{Err: err} +} + +func (e *UnexpectedError) Error() string { + return fmt.Sprintf("unexpected client error: %s", e.Err.Error()) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/filemode/filemode.go b/vendor/github.com/go-git/go-git/v5/plumbing/filemode/filemode.go new file mode 100644 index 0000000000..b848a97961 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/filemode/filemode.go @@ -0,0 +1,188 @@ +package filemode + +import ( + "encoding/binary" + "fmt" + "os" + "strconv" +) + +// A FileMode represents the kind of tree entries used by git. It +// resembles regular file systems modes, although FileModes are +// considerably simpler (there are not so many), and there are some, +// like Submodule that has no file system equivalent. +type FileMode uint32 + +const ( + // Empty is used as the FileMode of tree elements when comparing + // trees in the following situations: + // + // - the mode of tree elements before their creation. - the mode of + // tree elements after their deletion. - the mode of unmerged + // elements when checking the index. + // + // Empty has no file system equivalent. As Empty is the zero value + // of FileMode, it is also returned by New and + // NewFromOsNewFromOSFileMode along with an error, when they fail. + Empty FileMode = 0 + // Dir represent a Directory. + Dir FileMode = 0040000 + // Regular represent non-executable files. Please note this is not + // the same as golang regular files, which include executable files. + Regular FileMode = 0100644 + // Deprecated represent non-executable files with the group writable + // bit set. This mode was supported by the first versions of git, + // but it has been deprecated nowadays. This library uses them + // internally, so you can read old packfiles, but will treat them as + // Regulars when interfacing with the outside world. This is the + // standard git behaviour. + Deprecated FileMode = 0100664 + // Executable represents executable files. + Executable FileMode = 0100755 + // Symlink represents symbolic links to files. + Symlink FileMode = 0120000 + // Submodule represents git submodules. This mode has no file system + // equivalent. + Submodule FileMode = 0160000 +) + +// New takes the octal string representation of a FileMode and returns +// the FileMode and a nil error. If the string can not be parsed to a +// 32 bit unsigned octal number, it returns Empty and the parsing error. +// +// Example: "40000" means Dir, "100644" means Regular. +// +// Please note this function does not check if the returned FileMode +// is valid in git or if it is malformed. For instance, "1" will +// return the malformed FileMode(1) and a nil error. +func New(s string) (FileMode, error) { + n, err := strconv.ParseUint(s, 8, 32) + if err != nil { + return Empty, err + } + + return FileMode(n), nil +} + +// NewFromOSFileMode returns the FileMode used by git to represent +// the provided file system modes and a nil error on success. If the +// file system mode cannot be mapped to any valid git mode (as with +// sockets or named pipes), it will return Empty and an error. +// +// Note that some git modes cannot be generated from os.FileModes, like +// Deprecated and Submodule; while Empty will be returned, along with an +// error, only when the method fails. +func NewFromOSFileMode(m os.FileMode) (FileMode, error) { + if m.IsRegular() { + if isSetTemporary(m) { + return Empty, fmt.Errorf("no equivalent git mode for %s", m) + } + if isSetCharDevice(m) { + return Empty, fmt.Errorf("no equivalent git mode for %s", m) + } + if isSetUserExecutable(m) { + return Executable, nil + } + return Regular, nil + } + + if m.IsDir() { + return Dir, nil + } + + if isSetSymLink(m) { + return Symlink, nil + } + + return Empty, fmt.Errorf("no equivalent git mode for %s", m) +} + +func isSetCharDevice(m os.FileMode) bool { + return m&os.ModeCharDevice != 0 +} + +func isSetTemporary(m os.FileMode) bool { + return m&os.ModeTemporary != 0 +} + +func isSetUserExecutable(m os.FileMode) bool { + return m&0100 != 0 +} + +func isSetSymLink(m os.FileMode) bool { + return m&os.ModeSymlink != 0 +} + +// Bytes return a slice of 4 bytes with the mode in little endian +// encoding. +func (m FileMode) Bytes() []byte { + ret := make([]byte, 4) + binary.LittleEndian.PutUint32(ret, uint32(m)) + return ret +} + +// IsMalformed returns if the FileMode should not appear in a git packfile, +// this is: Empty and any other mode not mentioned as a constant in this +// package. +func (m FileMode) IsMalformed() bool { + return m != Dir && + m != Regular && + m != Deprecated && + m != Executable && + m != Symlink && + m != Submodule +} + +// String returns the FileMode as a string in the standatd git format, +// this is, an octal number padded with ceros to 7 digits. Malformed +// modes are printed in that same format, for easier debugging. +// +// Example: Regular is "0100644", Empty is "0000000". +func (m FileMode) String() string { + return fmt.Sprintf("%07o", uint32(m)) +} + +// IsRegular returns if the FileMode represents that of a regular file, +// this is, either Regular or Deprecated. Please note that Executable +// are not regular even though in the UNIX tradition, they usually are: +// See the IsFile method. +func (m FileMode) IsRegular() bool { + return m == Regular || + m == Deprecated +} + +// IsFile returns if the FileMode represents that of a file, this is, +// Regular, Deprecated, Executable or Link. +func (m FileMode) IsFile() bool { + return m == Regular || + m == Deprecated || + m == Executable || + m == Symlink +} + +// ToOSFileMode returns the os.FileMode to be used when creating file +// system elements with the given git mode and a nil error on success. +// +// When the provided mode cannot be mapped to a valid file system mode +// (e.g. Submodule) it returns os.FileMode(0) and an error. +// +// The returned file mode does not take into account the umask. +func (m FileMode) ToOSFileMode() (os.FileMode, error) { + switch m { + case Dir: + return os.ModePerm | os.ModeDir, nil + case Submodule: + return os.ModePerm | os.ModeDir, nil + case Regular: + return os.FileMode(0644), nil + // Deprecated is no longer allowed: treated as a Regular instead + case Deprecated: + return os.FileMode(0644), nil + case Executable: + return os.FileMode(0755), nil + case Symlink: + return os.ModePerm | os.ModeSymlink, nil + } + + return os.FileMode(0), fmt.Errorf("malformed mode (%s)", m) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go new file mode 100644 index 0000000000..6d689ea1e0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go @@ -0,0 +1,109 @@ +package config + +// New creates a new config instance. +func New() *Config { + return &Config{} +} + +// Config contains all the sections, comments and includes from a config file. +type Config struct { + Comment *Comment + Sections Sections + Includes Includes +} + +// Includes is a list of Includes in a config file. +type Includes []*Include + +// Include is a reference to an included config file. +type Include struct { + Path string + Config *Config +} + +// Comment string without the prefix '#' or ';'. +type Comment string + +const ( + // NoSubsection token is passed to Config.Section and Config.SetSection to + // represent the absence of a section. + NoSubsection = "" +) + +// Section returns a existing section with the given name or creates a new one. +func (c *Config) Section(name string) *Section { + for i := len(c.Sections) - 1; i >= 0; i-- { + s := c.Sections[i] + if s.IsName(name) { + return s + } + } + + s := &Section{Name: name} + c.Sections = append(c.Sections, s) + return s +} + +// HasSection checks if the Config has a section with the specified name. +func (c *Config) HasSection(name string) bool { + for _, s := range c.Sections { + if s.IsName(name) { + return true + } + } + return false +} + +// RemoveSection removes a section from a config file. +func (c *Config) RemoveSection(name string) *Config { + result := Sections{} + for _, s := range c.Sections { + if !s.IsName(name) { + result = append(result, s) + } + } + + c.Sections = result + return c +} + +// RemoveSubsection remove a subsection from a config file. +func (c *Config) RemoveSubsection(section string, subsection string) *Config { + for _, s := range c.Sections { + if s.IsName(section) { + result := Subsections{} + for _, ss := range s.Subsections { + if !ss.IsName(subsection) { + result = append(result, ss) + } + } + s.Subsections = result + } + } + + return c +} + +// AddOption adds an option to a given section and subsection. Use the +// NoSubsection constant for the subsection argument if no subsection is wanted. +func (c *Config) AddOption(section string, subsection string, key string, value string) *Config { + if subsection == "" { + c.Section(section).AddOption(key, value) + } else { + c.Section(section).Subsection(subsection).AddOption(key, value) + } + + return c +} + +// SetOption sets an option to a given section and subsection. Use the +// NoSubsection constant for the subsection argument if no subsection is wanted. +func (c *Config) SetOption(section string, subsection string, key string, value string) *Config { + if subsection == "" { + c.Section(section).SetOption(key, value) + } else { + c.Section(section).Subsection(subsection).SetOption(key, value) + } + + return c +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go new file mode 100644 index 0000000000..8e52d57f30 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go @@ -0,0 +1,37 @@ +package config + +import ( + "io" + + "github.com/go-git/gcfg" +) + +// A Decoder reads and decodes config files from an input stream. +type Decoder struct { + io.Reader +} + +// NewDecoder returns a new decoder that reads from r. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{r} +} + +// Decode reads the whole config from its input and stores it in the +// value pointed to by config. +func (d *Decoder) Decode(config *Config) error { + cb := func(s string, ss string, k string, v string, bv bool) error { + if ss == "" && k == "" { + config.Section(s) + return nil + } + + if ss != "" && k == "" { + config.Section(s).Subsection(ss) + return nil + } + + config.AddOption(s, ss, k, v) + return nil + } + return gcfg.ReadWithCallback(d, cb) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go new file mode 100644 index 0000000000..3986c83658 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go @@ -0,0 +1,122 @@ +// Package config implements encoding and decoding of git config files. +// +// Configuration File +// ------------------ +// +// The Git configuration file contains a number of variables that affect +// the Git commands' behavior. The `.git/config` file in each repository +// is used to store the configuration for that repository, and +// `$HOME/.gitconfig` is used to store a per-user configuration as +// fallback values for the `.git/config` file. The file `/etc/gitconfig` +// can be used to store a system-wide default configuration. +// +// The configuration variables are used by both the Git plumbing +// and the porcelains. The variables are divided into sections, wherein +// the fully qualified variable name of the variable itself is the last +// dot-separated segment and the section name is everything before the last +// dot. The variable names are case-insensitive, allow only alphanumeric +// characters and `-`, and must start with an alphabetic character. Some +// variables may appear multiple times; we say then that the variable is +// multivalued. +// +// Syntax +// ~~~~~~ +// +// The syntax is fairly flexible and permissive; whitespaces are mostly +// ignored. The '#' and ';' characters begin comments to the end of line, +// blank lines are ignored. +// +// The file consists of sections and variables. A section begins with +// the name of the section in square brackets and continues until the next +// section begins. Section names are case-insensitive. Only alphanumeric +// characters, `-` and `.` are allowed in section names. Each variable +// must belong to some section, which means that there must be a section +// header before the first setting of a variable. +// +// Sections can be further divided into subsections. To begin a subsection +// put its name in double quotes, separated by space from the section name, +// in the section header, like in the example below: +// +// -------- +// [section "subsection"] +// +// -------- +// +// Subsection names are case sensitive and can contain any characters except +// newline (doublequote `"` and backslash can be included by escaping them +// as `\"` and `\\`, respectively). Section headers cannot span multiple +// lines. Variables may belong directly to a section or to a given subsection. +// You can have `[section]` if you have `[section "subsection"]`, but you +// don't need to. +// +// There is also a deprecated `[section.subsection]` syntax. With this +// syntax, the subsection name is converted to lower-case and is also +// compared case sensitively. These subsection names follow the same +// restrictions as section names. +// +// All the other lines (and the remainder of the line after the section +// header) are recognized as setting variables, in the form +// 'name = value' (or just 'name', which is a short-hand to say that +// the variable is the boolean "true"). +// The variable names are case-insensitive, allow only alphanumeric characters +// and `-`, and must start with an alphabetic character. +// +// A line that defines a value can be continued to the next line by +// ending it with a `\`; the backquote and the end-of-line are +// stripped. Leading whitespaces after 'name =', the remainder of the +// line after the first comment character '#' or ';', and trailing +// whitespaces of the line are discarded unless they are enclosed in +// double quotes. Internal whitespaces within the value are retained +// verbatim. +// +// Inside double quotes, double quote `"` and backslash `\` characters +// must be escaped: use `\"` for `"` and `\\` for `\`. +// +// The following escape sequences (beside `\"` and `\\`) are recognized: +// `\n` for newline character (NL), `\t` for horizontal tabulation (HT, TAB) +// and `\b` for backspace (BS). Other char escape sequences (including octal +// escape sequences) are invalid. +// +// Includes +// ~~~~~~~~ +// +// You can include one config file from another by setting the special +// `include.path` variable to the name of the file to be included. The +// variable takes a pathname as its value, and is subject to tilde +// expansion. +// +// The included file is expanded immediately, as if its contents had been +// found at the location of the include directive. If the value of the +// `include.path` variable is a relative path, the path is considered to be +// relative to the configuration file in which the include directive was +// found. See below for examples. +// +// +// Example +// ~~~~~~~ +// +// # Core variables +// [core] +// ; Don't trust file modes +// filemode = false +// +// # Our diff algorithm +// [diff] +// external = /usr/local/bin/diff-wrapper +// renames = true +// +// [branch "devel"] +// remote = origin +// merge = refs/heads/devel +// +// # Proxy settings +// [core] +// gitProxy="ssh" for "kernel.org" +// gitProxy=default-proxy ; for the rest +// +// [include] +// path = /path/to/foo.inc ; include by absolute path +// path = foo ; expand "foo" relative to the current file +// path = ~/foo ; expand "foo" in your `$HOME` directory +// +package config diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go new file mode 100644 index 0000000000..4eac8968ad --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go @@ -0,0 +1,77 @@ +package config + +import ( + "fmt" + "io" + "strings" +) + +// An Encoder writes config files to an output stream. +type Encoder struct { + w io.Writer +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{w} +} + +// Encode writes the config in git config format to the stream of the encoder. +func (e *Encoder) Encode(cfg *Config) error { + for _, s := range cfg.Sections { + if err := e.encodeSection(s); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) encodeSection(s *Section) error { + if len(s.Options) > 0 { + if err := e.printf("[%s]\n", s.Name); err != nil { + return err + } + + if err := e.encodeOptions(s.Options); err != nil { + return err + } + } + + for _, ss := range s.Subsections { + if err := e.encodeSubsection(s.Name, ss); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) encodeSubsection(sectionName string, s *Subsection) error { + //TODO: escape + if err := e.printf("[%s \"%s\"]\n", sectionName, s.Name); err != nil { + return err + } + + return e.encodeOptions(s.Options) +} + +func (e *Encoder) encodeOptions(opts Options) error { + for _, o := range opts { + pattern := "\t%s = %s\n" + if strings.Contains(o.Value, "\\") { + pattern = "\t%s = %q\n" + } + + if err := e.printf(pattern, o.Key, o.Value); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) printf(msg string, args ...interface{}) error { + _, err := fmt.Fprintf(e.w, msg, args...) + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go new file mode 100644 index 0000000000..cad394810a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go @@ -0,0 +1,127 @@ +package config + +import ( + "fmt" + "strings" +) + +// Option defines a key/value entity in a config file. +type Option struct { + // Key preserving original caseness. + // Use IsKey instead to compare key regardless of caseness. + Key string + // Original value as string, could be not normalized. + Value string +} + +type Options []*Option + +// IsKey returns true if the given key matches +// this option's key in a case-insensitive comparison. +func (o *Option) IsKey(key string) bool { + return strings.EqualFold(o.Key, key) +} + +func (opts Options) GoString() string { + var strs []string + for _, opt := range opts { + strs = append(strs, fmt.Sprintf("%#v", opt)) + } + + return strings.Join(strs, ", ") +} + +// Get gets the value for the given key if set, +// otherwise it returns the empty string. +// +// Note that there is no difference +// +// This matches git behaviour since git v1.8.1-rc1, +// if there are multiple definitions of a key, the +// last one wins. +// +// See: http://article.gmane.org/gmane.linux.kernel/1407184 +// +// In order to get all possible values for the same key, +// use GetAll. +func (opts Options) Get(key string) string { + for i := len(opts) - 1; i >= 0; i-- { + o := opts[i] + if o.IsKey(key) { + return o.Value + } + } + return "" +} + +// Has checks if an Option exist with the given key. +func (opts Options) Has(key string) bool { + for _, o := range opts { + if o.IsKey(key) { + return true + } + } + return false +} + +// GetAll returns all possible values for the same key. +func (opts Options) GetAll(key string) []string { + result := []string{} + for _, o := range opts { + if o.IsKey(key) { + result = append(result, o.Value) + } + } + return result +} + +func (opts Options) withoutOption(key string) Options { + result := Options{} + for _, o := range opts { + if !o.IsKey(key) { + result = append(result, o) + } + } + return result +} + +func (opts Options) withAddedOption(key string, value string) Options { + return append(opts, &Option{key, value}) +} + +func (opts Options) withSettedOption(key string, values ...string) Options { + var result Options + var added []string + for _, o := range opts { + if !o.IsKey(key) { + result = append(result, o) + continue + } + + if contains(values, o.Value) { + added = append(added, o.Value) + result = append(result, o) + continue + } + } + + for _, value := range values { + if contains(added, value) { + continue + } + + result = result.withAddedOption(key, value) + } + + return result +} + +func contains(haystack []string, needle string) bool { + for _, s := range haystack { + if s == needle { + return true + } + } + + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go new file mode 100644 index 0000000000..07f72f35af --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go @@ -0,0 +1,181 @@ +package config + +import ( + "fmt" + "strings" +) + +// Section is the representation of a section inside git configuration files. +// Each Section contains Options that are used by both the Git plumbing +// and the porcelains. +// Sections can be further divided into subsections. To begin a subsection +// put its name in double quotes, separated by space from the section name, +// in the section header, like in the example below: +// +// [section "subsection"] +// +// All the other lines (and the remainder of the line after the section header) +// are recognized as option variables, in the form "name = value" (or just name, +// which is a short-hand to say that the variable is the boolean "true"). +// The variable names are case-insensitive, allow only alphanumeric characters +// and -, and must start with an alphabetic character: +// +// [section "subsection1"] +// option1 = value1 +// option2 +// [section "subsection2"] +// option3 = value2 +// +type Section struct { + Name string + Options Options + Subsections Subsections +} + +type Subsection struct { + Name string + Options Options +} + +type Sections []*Section + +func (s Sections) GoString() string { + var strs []string + for _, ss := range s { + strs = append(strs, fmt.Sprintf("%#v", ss)) + } + + return strings.Join(strs, ", ") +} + +type Subsections []*Subsection + +func (s Subsections) GoString() string { + var strs []string + for _, ss := range s { + strs = append(strs, fmt.Sprintf("%#v", ss)) + } + + return strings.Join(strs, ", ") +} + +// IsName checks if the name provided is equals to the Section name, case insensitive. +func (s *Section) IsName(name string) bool { + return strings.EqualFold(s.Name, name) +} + +// Subsection returns a Subsection from the specified Section. If the +// Subsection does not exists, new one is created and added to Section. +func (s *Section) Subsection(name string) *Subsection { + for i := len(s.Subsections) - 1; i >= 0; i-- { + ss := s.Subsections[i] + if ss.IsName(name) { + return ss + } + } + + ss := &Subsection{Name: name} + s.Subsections = append(s.Subsections, ss) + return ss +} + +// HasSubsection checks if the Section has a Subsection with the specified name. +func (s *Section) HasSubsection(name string) bool { + for _, ss := range s.Subsections { + if ss.IsName(name) { + return true + } + } + + return false +} + +// RemoveSubsection removes a subsection from a Section. +func (s *Section) RemoveSubsection(name string) *Section { + result := Subsections{} + for _, s := range s.Subsections { + if !s.IsName(name) { + result = append(result, s) + } + } + + s.Subsections = result + return s +} + +// Option return the value for the specified key. Empty string is returned if +// key does not exists. +func (s *Section) Option(key string) string { + return s.Options.Get(key) +} + +// OptionAll returns all possible values for an option with the specified key. +// If the option does not exists, an empty slice will be returned. +func (s *Section) OptionAll(key string) []string { + return s.Options.GetAll(key) +} + +// HasOption checks if the Section has an Option with the given key. +func (s *Section) HasOption(key string) bool { + return s.Options.Has(key) +} + +// AddOption adds a new Option to the Section. The updated Section is returned. +func (s *Section) AddOption(key string, value string) *Section { + s.Options = s.Options.withAddedOption(key, value) + return s +} + +// SetOption adds a new Option to the Section. If the option already exists, is replaced. +// The updated Section is returned. +func (s *Section) SetOption(key string, value string) *Section { + s.Options = s.Options.withSettedOption(key, value) + return s +} + +// Remove an option with the specified key. The updated Section is returned. +func (s *Section) RemoveOption(key string) *Section { + s.Options = s.Options.withoutOption(key) + return s +} + +// IsName checks if the name of the subsection is exactly the specified name. +func (s *Subsection) IsName(name string) bool { + return s.Name == name +} + +// Option returns an option with the specified key. If the option does not exists, +// empty spring will be returned. +func (s *Subsection) Option(key string) string { + return s.Options.Get(key) +} + +// OptionAll returns all possible values for an option with the specified key. +// If the option does not exists, an empty slice will be returned. +func (s *Subsection) OptionAll(key string) []string { + return s.Options.GetAll(key) +} + +// HasOption checks if the Subsection has an Option with the given key. +func (s *Subsection) HasOption(key string) bool { + return s.Options.Has(key) +} + +// AddOption adds a new Option to the Subsection. The updated Subsection is returned. +func (s *Subsection) AddOption(key string, value string) *Subsection { + s.Options = s.Options.withAddedOption(key, value) + return s +} + +// SetOption adds a new Option to the Subsection. If the option already exists, is replaced. +// The updated Subsection is returned. +func (s *Subsection) SetOption(key string, value ...string) *Subsection { + s.Options = s.Options.withSettedOption(key, value...) + return s +} + +// RemoveOption removes the option with the specified key. The updated Subsection is returned. +func (s *Subsection) RemoveOption(key string) *Subsection { + s.Options = s.Options.withoutOption(key) + return s +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go new file mode 100644 index 0000000000..6fd4158462 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go @@ -0,0 +1,97 @@ +package diff + +import "github.com/go-git/go-git/v5/plumbing/color" + +// A ColorKey is a key into a ColorConfig map and also equal to the key in the +// diff.color subsection of the config. See +// https://github.com/git/git/blob/v2.26.2/diff.c#L83-L106. +type ColorKey string + +// ColorKeys. +const ( + Context ColorKey = "context" + Meta ColorKey = "meta" + Frag ColorKey = "frag" + Old ColorKey = "old" + New ColorKey = "new" + Commit ColorKey = "commit" + Whitespace ColorKey = "whitespace" + Func ColorKey = "func" + OldMoved ColorKey = "oldMoved" + OldMovedAlternative ColorKey = "oldMovedAlternative" + OldMovedDimmed ColorKey = "oldMovedDimmed" + OldMovedAlternativeDimmed ColorKey = "oldMovedAlternativeDimmed" + NewMoved ColorKey = "newMoved" + NewMovedAlternative ColorKey = "newMovedAlternative" + NewMovedDimmed ColorKey = "newMovedDimmed" + NewMovedAlternativeDimmed ColorKey = "newMovedAlternativeDimmed" + ContextDimmed ColorKey = "contextDimmed" + OldDimmed ColorKey = "oldDimmed" + NewDimmed ColorKey = "newDimmed" + ContextBold ColorKey = "contextBold" + OldBold ColorKey = "oldBold" + NewBold ColorKey = "newBold" +) + +// A ColorConfig is a color configuration. A nil or empty ColorConfig +// corresponds to no color. +type ColorConfig map[ColorKey]string + +// A ColorConfigOption sets an option on a ColorConfig. +type ColorConfigOption func(ColorConfig) + +// WithColor sets the color for key. +func WithColor(key ColorKey, color string) ColorConfigOption { + return func(cc ColorConfig) { + cc[key] = color + } +} + +// defaultColorConfig is the default color configuration. See +// https://github.com/git/git/blob/v2.26.2/diff.c#L57-L81. +var defaultColorConfig = ColorConfig{ + Context: color.Normal, + Meta: color.Bold, + Frag: color.Cyan, + Old: color.Red, + New: color.Green, + Commit: color.Yellow, + Whitespace: color.BgRed, + Func: color.Normal, + OldMoved: color.BoldMagenta, + OldMovedAlternative: color.BoldBlue, + OldMovedDimmed: color.Faint, + OldMovedAlternativeDimmed: color.FaintItalic, + NewMoved: color.BoldCyan, + NewMovedAlternative: color.BoldYellow, + NewMovedDimmed: color.Faint, + NewMovedAlternativeDimmed: color.FaintItalic, + ContextDimmed: color.Faint, + OldDimmed: color.FaintRed, + NewDimmed: color.FaintGreen, + ContextBold: color.Bold, + OldBold: color.BoldRed, + NewBold: color.BoldGreen, +} + +// NewColorConfig returns a new ColorConfig. +func NewColorConfig(options ...ColorConfigOption) ColorConfig { + cc := make(ColorConfig) + for key, value := range defaultColorConfig { + cc[key] = value + } + for _, option := range options { + option(cc) + } + return cc +} + +// Reset returns the ANSI escape sequence to reset the color with key set from +// cc. If no color was set then no reset is needed so it returns the empty +// string. +func (cc ColorConfig) Reset(key ColorKey) string { + if cc[key] == "" { + return "" + } + return color.Reset +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/patch.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/patch.go new file mode 100644 index 0000000000..39a66a1a80 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/patch.go @@ -0,0 +1,58 @@ +package diff + +import ( + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" +) + +// Operation defines the operation of a diff item. +type Operation int + +const ( + // Equal item represents a equals diff. + Equal Operation = iota + // Add item represents an insert diff. + Add + // Delete item represents a delete diff. + Delete +) + +// Patch represents a collection of steps to transform several files. +type Patch interface { + // FilePatches returns a slice of patches per file. + FilePatches() []FilePatch + // Message returns an optional message that can be at the top of the + // Patch representation. + Message() string +} + +// FilePatch represents the necessary steps to transform one file to another. +type FilePatch interface { + // IsBinary returns true if this patch is representing a binary file. + IsBinary() bool + // Files returns the from and to Files, with all the necessary metadata to + // about them. If the patch creates a new file, "from" will be nil. + // If the patch deletes a file, "to" will be nil. + Files() (from, to File) + // Chunks returns a slice of ordered changes to transform "from" File to + // "to" File. If the file is a binary one, Chunks will be empty. + Chunks() []Chunk +} + +// File contains all the file metadata necessary to print some patch formats. +type File interface { + // Hash returns the File Hash. + Hash() plumbing.Hash + // Mode returns the FileMode. + Mode() filemode.FileMode + // Path returns the complete Path to the file, including the filename. + Path() string +} + +// Chunk represents a portion of a file transformation to another. +type Chunk interface { + // Content contains the portion of the file. + Content() string + // Type contains the Operation to do with this Chunk. + Type() Operation +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go new file mode 100644 index 0000000000..fa605b1985 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go @@ -0,0 +1,395 @@ +package diff + +import ( + "fmt" + "io" + "regexp" + "strconv" + "strings" + + "github.com/go-git/go-git/v5/plumbing" +) + +// DefaultContextLines is the default number of context lines. +const DefaultContextLines = 3 + +var ( + splitLinesRegexp = regexp.MustCompile(`[^\n]*(\n|$)`) + + operationChar = map[Operation]byte{ + Add: '+', + Delete: '-', + Equal: ' ', + } + + operationColorKey = map[Operation]ColorKey{ + Add: New, + Delete: Old, + Equal: Context, + } +) + +// UnifiedEncoder encodes an unified diff into the provided Writer. It does not +// support similarity index for renames or sorting hash representations. +type UnifiedEncoder struct { + io.Writer + + // contextLines is the count of unchanged lines that will appear surrounding + // a change. + contextLines int + + // srcPrefix and dstPrefix are prepended to file paths when encoding a diff. + srcPrefix string + dstPrefix string + + // colorConfig is the color configuration. The default is no color. + color ColorConfig +} + +// NewUnifiedEncoder returns a new UnifiedEncoder that writes to w. +func NewUnifiedEncoder(w io.Writer, contextLines int) *UnifiedEncoder { + return &UnifiedEncoder{ + Writer: w, + srcPrefix: "a/", + dstPrefix: "b/", + contextLines: contextLines, + } +} + +// SetColor sets e's color configuration and returns e. +func (e *UnifiedEncoder) SetColor(colorConfig ColorConfig) *UnifiedEncoder { + e.color = colorConfig + return e +} + +// SetSrcPrefix sets e's srcPrefix and returns e. +func (e *UnifiedEncoder) SetSrcPrefix(prefix string) *UnifiedEncoder { + e.srcPrefix = prefix + return e +} + +// SetDstPrefix sets e's dstPrefix and returns e. +func (e *UnifiedEncoder) SetDstPrefix(prefix string) *UnifiedEncoder { + e.dstPrefix = prefix + return e +} + +// Encode encodes patch. +func (e *UnifiedEncoder) Encode(patch Patch) error { + sb := &strings.Builder{} + + if message := patch.Message(); message != "" { + sb.WriteString(message) + if !strings.HasSuffix(message, "\n") { + sb.WriteByte('\n') + } + } + + for _, filePatch := range patch.FilePatches() { + e.writeFilePatchHeader(sb, filePatch) + g := newHunksGenerator(filePatch.Chunks(), e.contextLines) + for _, hunk := range g.Generate() { + hunk.writeTo(sb, e.color) + } + } + + _, err := e.Write([]byte(sb.String())) + return err +} + +func (e *UnifiedEncoder) writeFilePatchHeader(sb *strings.Builder, filePatch FilePatch) { + from, to := filePatch.Files() + if from == nil && to == nil { + return + } + isBinary := filePatch.IsBinary() + + var lines []string + switch { + case from != nil && to != nil: + hashEquals := from.Hash() == to.Hash() + lines = append(lines, + fmt.Sprintf("diff --git %s%s %s%s", + e.srcPrefix, from.Path(), e.dstPrefix, to.Path()), + ) + if from.Mode() != to.Mode() { + lines = append(lines, + fmt.Sprintf("old mode %o", from.Mode()), + fmt.Sprintf("new mode %o", to.Mode()), + ) + } + if from.Path() != to.Path() { + lines = append(lines, + fmt.Sprintf("rename from %s", from.Path()), + fmt.Sprintf("rename to %s", to.Path()), + ) + } + if from.Mode() != to.Mode() && !hashEquals { + lines = append(lines, + fmt.Sprintf("index %s..%s", from.Hash(), to.Hash()), + ) + } else if !hashEquals { + lines = append(lines, + fmt.Sprintf("index %s..%s %o", from.Hash(), to.Hash(), from.Mode()), + ) + } + if !hashEquals { + lines = e.appendPathLines(lines, e.srcPrefix+from.Path(), e.dstPrefix+to.Path(), isBinary) + } + case from == nil: + lines = append(lines, + fmt.Sprintf("diff --git %s %s", e.srcPrefix+to.Path(), e.dstPrefix+to.Path()), + fmt.Sprintf("new file mode %o", to.Mode()), + fmt.Sprintf("index %s..%s", plumbing.ZeroHash, to.Hash()), + ) + lines = e.appendPathLines(lines, "/dev/null", e.dstPrefix+to.Path(), isBinary) + case to == nil: + lines = append(lines, + fmt.Sprintf("diff --git %s %s", e.srcPrefix+from.Path(), e.dstPrefix+from.Path()), + fmt.Sprintf("deleted file mode %o", from.Mode()), + fmt.Sprintf("index %s..%s", from.Hash(), plumbing.ZeroHash), + ) + lines = e.appendPathLines(lines, e.srcPrefix+from.Path(), "/dev/null", isBinary) + } + + sb.WriteString(e.color[Meta]) + sb.WriteString(lines[0]) + for _, line := range lines[1:] { + sb.WriteByte('\n') + sb.WriteString(line) + } + sb.WriteString(e.color.Reset(Meta)) + sb.WriteByte('\n') +} + +func (e *UnifiedEncoder) appendPathLines(lines []string, fromPath, toPath string, isBinary bool) []string { + if isBinary { + return append(lines, + fmt.Sprintf("Binary files %s and %s differ", fromPath, toPath), + ) + } + return append(lines, + fmt.Sprintf("--- %s", fromPath), + fmt.Sprintf("+++ %s", toPath), + ) +} + +type hunksGenerator struct { + fromLine, toLine int + ctxLines int + chunks []Chunk + current *hunk + hunks []*hunk + beforeContext, afterContext []string +} + +func newHunksGenerator(chunks []Chunk, ctxLines int) *hunksGenerator { + return &hunksGenerator{ + chunks: chunks, + ctxLines: ctxLines, + } +} + +func (g *hunksGenerator) Generate() []*hunk { + for i, chunk := range g.chunks { + lines := splitLines(chunk.Content()) + nLines := len(lines) + + switch chunk.Type() { + case Equal: + g.fromLine += nLines + g.toLine += nLines + g.processEqualsLines(lines, i) + case Delete: + if nLines != 0 { + g.fromLine++ + } + + g.processHunk(i, chunk.Type()) + g.fromLine += nLines - 1 + g.current.AddOp(chunk.Type(), lines...) + case Add: + if nLines != 0 { + g.toLine++ + } + g.processHunk(i, chunk.Type()) + g.toLine += nLines - 1 + g.current.AddOp(chunk.Type(), lines...) + } + + if i == len(g.chunks)-1 && g.current != nil { + g.hunks = append(g.hunks, g.current) + } + } + + return g.hunks +} + +func (g *hunksGenerator) processHunk(i int, op Operation) { + if g.current != nil { + return + } + + var ctxPrefix string + linesBefore := len(g.beforeContext) + if linesBefore > g.ctxLines { + ctxPrefix = g.beforeContext[linesBefore-g.ctxLines-1] + g.beforeContext = g.beforeContext[linesBefore-g.ctxLines:] + linesBefore = g.ctxLines + } + + g.current = &hunk{ctxPrefix: strings.TrimSuffix(ctxPrefix, "\n")} + g.current.AddOp(Equal, g.beforeContext...) + + switch op { + case Delete: + g.current.fromLine, g.current.toLine = + g.addLineNumbers(g.fromLine, g.toLine, linesBefore, i, Add) + case Add: + g.current.toLine, g.current.fromLine = + g.addLineNumbers(g.toLine, g.fromLine, linesBefore, i, Delete) + } + + g.beforeContext = nil +} + +// addLineNumbers obtains the line numbers in a new chunk. +func (g *hunksGenerator) addLineNumbers(la, lb int, linesBefore int, i int, op Operation) (cla, clb int) { + cla = la - linesBefore + // we need to search for a reference for the next diff + switch { + case linesBefore != 0 && g.ctxLines != 0: + if lb > g.ctxLines { + clb = lb - g.ctxLines + 1 + } else { + clb = 1 + } + case g.ctxLines == 0: + clb = lb + case i != len(g.chunks)-1: + next := g.chunks[i+1] + if next.Type() == op || next.Type() == Equal { + // this diff will be into this chunk + clb = lb + 1 + } + } + + return +} + +func (g *hunksGenerator) processEqualsLines(ls []string, i int) { + if g.current == nil { + g.beforeContext = append(g.beforeContext, ls...) + return + } + + g.afterContext = append(g.afterContext, ls...) + if len(g.afterContext) <= g.ctxLines*2 && i != len(g.chunks)-1 { + g.current.AddOp(Equal, g.afterContext...) + g.afterContext = nil + } else { + ctxLines := g.ctxLines + if ctxLines > len(g.afterContext) { + ctxLines = len(g.afterContext) + } + g.current.AddOp(Equal, g.afterContext[:ctxLines]...) + g.hunks = append(g.hunks, g.current) + + g.current = nil + g.beforeContext = g.afterContext[ctxLines:] + g.afterContext = nil + } +} + +func splitLines(s string) []string { + out := splitLinesRegexp.FindAllString(s, -1) + if out[len(out)-1] == "" { + out = out[:len(out)-1] + } + return out +} + +type hunk struct { + fromLine int + toLine int + + fromCount int + toCount int + + ctxPrefix string + ops []*op +} + +func (h *hunk) writeTo(sb *strings.Builder, color ColorConfig) { + sb.WriteString(color[Frag]) + sb.WriteString("@@ -") + + if h.fromCount == 1 { + sb.WriteString(strconv.Itoa(h.fromLine)) + } else { + sb.WriteString(strconv.Itoa(h.fromLine)) + sb.WriteByte(',') + sb.WriteString(strconv.Itoa(h.fromCount)) + } + + sb.WriteString(" +") + + if h.toCount == 1 { + sb.WriteString(strconv.Itoa(h.toLine)) + } else { + sb.WriteString(strconv.Itoa(h.toLine)) + sb.WriteByte(',') + sb.WriteString(strconv.Itoa(h.toCount)) + } + + sb.WriteString(" @@") + sb.WriteString(color.Reset(Frag)) + + if h.ctxPrefix != "" { + sb.WriteByte(' ') + sb.WriteString(color[Func]) + sb.WriteString(h.ctxPrefix) + sb.WriteString(color.Reset(Func)) + } + + sb.WriteByte('\n') + + for _, op := range h.ops { + op.writeTo(sb, color) + } +} + +func (h *hunk) AddOp(t Operation, ss ...string) { + n := len(ss) + switch t { + case Add: + h.toCount += n + case Delete: + h.fromCount += n + case Equal: + h.toCount += n + h.fromCount += n + } + + for _, s := range ss { + h.ops = append(h.ops, &op{s, t}) + } +} + +type op struct { + text string + t Operation +} + +func (o *op) writeTo(sb *strings.Builder, color ColorConfig) { + colorKey := operationColorKey[o.t] + sb.WriteString(color[colorKey]) + sb.WriteByte(operationChar[o.t]) + if strings.HasSuffix(o.text, "\n") { + sb.WriteString(strings.TrimSuffix(o.text, "\n")) + } else { + sb.WriteString(o.text + "\n\\ No newline at end of file") + } + sb.WriteString(color.Reset(colorKey)) + sb.WriteByte('\n') +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go new file mode 100644 index 0000000000..7cea50cd8f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go @@ -0,0 +1,135 @@ +package gitignore + +import ( + "bufio" + "bytes" + "io/ioutil" + "os" + "strings" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/plumbing/format/config" + gioutil "github.com/go-git/go-git/v5/utils/ioutil" +) + +const ( + commentPrefix = "#" + coreSection = "core" + excludesfile = "excludesfile" + gitDir = ".git" + gitignoreFile = ".gitignore" + gitconfigFile = ".gitconfig" + systemFile = "/etc/gitconfig" +) + +// readIgnoreFile reads a specific git ignore file. +func readIgnoreFile(fs billy.Filesystem, path []string, ignoreFile string) (ps []Pattern, err error) { + f, err := fs.Open(fs.Join(append(path, ignoreFile)...)) + if err == nil { + defer f.Close() + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + s := scanner.Text() + if !strings.HasPrefix(s, commentPrefix) && len(strings.TrimSpace(s)) > 0 { + ps = append(ps, ParsePattern(s, path)) + } + } + } else if !os.IsNotExist(err) { + return nil, err + } + + return +} + +// ReadPatterns reads gitignore patterns recursively traversing through the directory +// structure. The result is in the ascending order of priority (last higher). +func ReadPatterns(fs billy.Filesystem, path []string) (ps []Pattern, err error) { + ps, _ = readIgnoreFile(fs, path, gitignoreFile) + + var fis []os.FileInfo + fis, err = fs.ReadDir(fs.Join(path...)) + if err != nil { + return + } + + for _, fi := range fis { + if fi.IsDir() && fi.Name() != gitDir { + var subps []Pattern + subps, err = ReadPatterns(fs, append(path, fi.Name())) + if err != nil { + return + } + + if len(subps) > 0 { + ps = append(ps, subps...) + } + } + } + + return +} + +func loadPatterns(fs billy.Filesystem, path string) (ps []Pattern, err error) { + f, err := fs.Open(path) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + + defer gioutil.CheckClose(f, &err) + + b, err := ioutil.ReadAll(f) + if err != nil { + return + } + + d := config.NewDecoder(bytes.NewBuffer(b)) + + raw := config.New() + if err = d.Decode(raw); err != nil { + return + } + + s := raw.Section(coreSection) + efo := s.Options.Get(excludesfile) + if efo == "" { + return nil, nil + } + + ps, err = readIgnoreFile(fs, nil, efo) + if os.IsNotExist(err) { + return nil, nil + } + + return +} + +// LoadGlobalPatterns loads gitignore patterns from from the gitignore file +// declared in a user's ~/.gitconfig file. If the ~/.gitconfig file does not +// exist the function will return nil. If the core.excludesfile property +// is not declared, the function will return nil. If the file pointed to by +// the core.excludesfile property does not exist, the function will return nil. +// +// The function assumes fs is rooted at the root filesystem. +func LoadGlobalPatterns(fs billy.Filesystem) (ps []Pattern, err error) { + home, err := os.UserHomeDir() + if err != nil { + return + } + + return loadPatterns(fs, fs.Join(home, gitconfigFile)) +} + +// LoadSystemPatterns loads gitignore patterns from from the gitignore file +// declared in a system's /etc/gitconfig file. If the /etc/gitconfig file does +// not exist the function will return nil. If the core.excludesfile property +// is not declared, the function will return nil. If the file pointed to by +// the core.excludesfile property does not exist, the function will return nil. +// +// The function assumes fs is rooted at the root filesystem. +func LoadSystemPatterns(fs billy.Filesystem) (ps []Pattern, err error) { + return loadPatterns(fs, systemFile) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go new file mode 100644 index 0000000000..eecd4baccb --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go @@ -0,0 +1,70 @@ +// Package gitignore implements matching file system paths to gitignore patterns that +// can be automatically read from a git repository tree in the order of definition +// priorities. It support all pattern formats as specified in the original gitignore +// documentation, copied below: +// +// Pattern format +// ============== +// +// - A blank line matches no files, so it can serve as a separator for readability. +// +// - A line starting with # serves as a comment. Put a backslash ("\") in front of +// the first hash for patterns that begin with a hash. +// +// - Trailing spaces are ignored unless they are quoted with backslash ("\"). +// +// - An optional prefix "!" which negates the pattern; any matching file excluded +// by a previous pattern will become included again. It is not possible to +// re-include a file if a parent directory of that file is excluded. +// Git doesn’t list excluded directories for performance reasons, so +// any patterns on contained files have no effect, no matter where they are +// defined. Put a backslash ("\") in front of the first "!" for patterns +// that begin with a literal "!", for example, "\!important!.txt". +// +// - If the pattern ends with a slash, it is removed for the purpose of the +// following description, but it would only find a match with a directory. +// In other words, foo/ will match a directory foo and paths underneath it, +// but will not match a regular file or a symbolic link foo (this is consistent +// with the way how pathspec works in general in Git). +// +// - If the pattern does not contain a slash /, Git treats it as a shell glob +// pattern and checks for a match against the pathname relative to the location +// of the .gitignore file (relative to the toplevel of the work tree if not +// from a .gitignore file). +// +// - Otherwise, Git treats the pattern as a shell glob suitable for consumption +// by fnmatch(3) with the FNM_PATHNAME flag: wildcards in the pattern will +// not match a / in the pathname. For example, "Documentation/*.html" matches +// "Documentation/git.html" but not "Documentation/ppc/ppc.html" or +// "tools/perf/Documentation/perf.html". +// +// - A leading slash matches the beginning of the pathname. For example, +// "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". +// +// Two consecutive asterisks ("**") in patterns matched against full pathname +// may have special meaning: +// +// - A leading "**" followed by a slash means match in all directories. +// For example, "**/foo" matches file or directory "foo" anywhere, the same as +// pattern "foo". "**/foo/bar" matches file or directory "bar" +// anywhere that is directly under directory "foo". +// +// - A trailing "/**" matches everything inside. For example, "abc/**" matches +// all files inside directory "abc", relative to the location of the +// .gitignore file, with infinite depth. +// +// - A slash followed by two consecutive asterisks then a slash matches +// zero or more directories. For example, "a/**/b" matches "a/b", "a/x/b", +// "a/x/y/b" and so on. +// +// - Other consecutive asterisks are considered invalid. +// +// Copyright and license +// ===================== +// +// Copyright (c) Oleg Sklyar, Silvertern and source{d} +// +// The package code was donated to source{d} to include, modify and develop +// further as a part of the `go-git` project, release it on the license of +// the whole project or delete it from the project. +package gitignore diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go new file mode 100644 index 0000000000..bd1e9e2d4c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go @@ -0,0 +1,30 @@ +package gitignore + +// Matcher defines a global multi-pattern matcher for gitignore patterns +type Matcher interface { + // Match matches patterns in the order of priorities. As soon as an inclusion or + // exclusion is found, not further matching is performed. + Match(path []string, isDir bool) bool +} + +// NewMatcher constructs a new global matcher. Patterns must be given in the order of +// increasing priority. That is most generic settings files first, then the content of +// the repo .gitignore, then content of .gitignore down the path or the repo and then +// the content command line arguments. +func NewMatcher(ps []Pattern) Matcher { + return &matcher{ps} +} + +type matcher struct { + patterns []Pattern +} + +func (m *matcher) Match(path []string, isDir bool) bool { + n := len(m.patterns) + for i := n - 1; i >= 0; i-- { + if match := m.patterns[i].Match(path, isDir); match > NoMatch { + return match == Exclude + } + } + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go new file mode 100644 index 0000000000..098cb50212 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go @@ -0,0 +1,153 @@ +package gitignore + +import ( + "path/filepath" + "strings" +) + +// MatchResult defines outcomes of a match, no match, exclusion or inclusion. +type MatchResult int + +const ( + // NoMatch defines the no match outcome of a match check + NoMatch MatchResult = iota + // Exclude defines an exclusion of a file as a result of a match check + Exclude + // Include defines an explicit inclusion of a file as a result of a match check + Include +) + +const ( + inclusionPrefix = "!" + zeroToManyDirs = "**" + patternDirSep = "/" +) + +// Pattern defines a single gitignore pattern. +type Pattern interface { + // Match matches the given path to the pattern. + Match(path []string, isDir bool) MatchResult +} + +type pattern struct { + domain []string + pattern []string + inclusion bool + dirOnly bool + isGlob bool +} + +// ParsePattern parses a gitignore pattern string into the Pattern structure. +func ParsePattern(p string, domain []string) Pattern { + res := pattern{domain: domain} + + if strings.HasPrefix(p, inclusionPrefix) { + res.inclusion = true + p = p[1:] + } + + if !strings.HasSuffix(p, "\\ ") { + p = strings.TrimRight(p, " ") + } + + if strings.HasSuffix(p, patternDirSep) { + res.dirOnly = true + p = p[:len(p)-1] + } + + if strings.Contains(p, patternDirSep) { + res.isGlob = true + } + + res.pattern = strings.Split(p, patternDirSep) + return &res +} + +func (p *pattern) Match(path []string, isDir bool) MatchResult { + if len(path) <= len(p.domain) { + return NoMatch + } + for i, e := range p.domain { + if path[i] != e { + return NoMatch + } + } + + path = path[len(p.domain):] + if p.isGlob && !p.globMatch(path, isDir) { + return NoMatch + } else if !p.isGlob && !p.simpleNameMatch(path, isDir) { + return NoMatch + } + + if p.inclusion { + return Include + } else { + return Exclude + } +} + +func (p *pattern) simpleNameMatch(path []string, isDir bool) bool { + for i, name := range path { + if match, err := filepath.Match(p.pattern[0], name); err != nil { + return false + } else if !match { + continue + } + if p.dirOnly && !isDir && i == len(path)-1 { + return false + } + return true + } + return false +} + +func (p *pattern) globMatch(path []string, isDir bool) bool { + matched := false + canTraverse := false + for i, pattern := range p.pattern { + if pattern == "" { + canTraverse = false + continue + } + if pattern == zeroToManyDirs { + if i == len(p.pattern)-1 { + break + } + canTraverse = true + continue + } + if strings.Contains(pattern, zeroToManyDirs) { + return false + } + if len(path) == 0 { + return false + } + if canTraverse { + canTraverse = false + for len(path) > 0 { + e := path[0] + path = path[1:] + if match, err := filepath.Match(pattern, e); err != nil { + return false + } else if match { + matched = true + break + } else if len(path) == 0 { + // if nothing left then fail + matched = false + } + } + } else { + if match, err := filepath.Match(pattern, path[0]); err != nil || !match { + return false + } + matched = true + path = path[1:] + } + } + if matched && p.dirOnly && !isDir && len(path) == 0 { + matched = false + } + return matched +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go new file mode 100644 index 0000000000..7768bd6505 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go @@ -0,0 +1,177 @@ +package idxfile + +import ( + "bufio" + "bytes" + "errors" + "io" + + "github.com/go-git/go-git/v5/utils/binary" +) + +var ( + // ErrUnsupportedVersion is returned by Decode when the idx file version + // is not supported. + ErrUnsupportedVersion = errors.New("Unsupported version") + // ErrMalformedIdxFile is returned by Decode when the idx file is corrupted. + ErrMalformedIdxFile = errors.New("Malformed IDX file") +) + +const ( + fanout = 256 + objectIDLength = 20 +) + +// Decoder reads and decodes idx files from an input stream. +type Decoder struct { + *bufio.Reader +} + +// NewDecoder builds a new idx stream decoder, that reads from r. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{bufio.NewReader(r)} +} + +// Decode reads from the stream and decode the content into the MemoryIndex struct. +func (d *Decoder) Decode(idx *MemoryIndex) error { + if err := validateHeader(d); err != nil { + return err + } + + flow := []func(*MemoryIndex, io.Reader) error{ + readVersion, + readFanout, + readObjectNames, + readCRC32, + readOffsets, + readChecksums, + } + + for _, f := range flow { + if err := f(idx, d); err != nil { + return err + } + } + + return nil +} + +func validateHeader(r io.Reader) error { + var h = make([]byte, 4) + if _, err := io.ReadFull(r, h); err != nil { + return err + } + + if !bytes.Equal(h, idxHeader) { + return ErrMalformedIdxFile + } + + return nil +} + +func readVersion(idx *MemoryIndex, r io.Reader) error { + v, err := binary.ReadUint32(r) + if err != nil { + return err + } + + if v > VersionSupported { + return ErrUnsupportedVersion + } + + idx.Version = v + return nil +} + +func readFanout(idx *MemoryIndex, r io.Reader) error { + for k := 0; k < fanout; k++ { + n, err := binary.ReadUint32(r) + if err != nil { + return err + } + + idx.Fanout[k] = n + idx.FanoutMapping[k] = noMapping + } + + return nil +} + +func readObjectNames(idx *MemoryIndex, r io.Reader) error { + for k := 0; k < fanout; k++ { + var buckets uint32 + if k == 0 { + buckets = idx.Fanout[k] + } else { + buckets = idx.Fanout[k] - idx.Fanout[k-1] + } + + if buckets == 0 { + continue + } + + idx.FanoutMapping[k] = len(idx.Names) + + nameLen := int(buckets * objectIDLength) + bin := make([]byte, nameLen) + if _, err := io.ReadFull(r, bin); err != nil { + return err + } + + idx.Names = append(idx.Names, bin) + idx.Offset32 = append(idx.Offset32, make([]byte, buckets*4)) + idx.CRC32 = append(idx.CRC32, make([]byte, buckets*4)) + } + + return nil +} + +func readCRC32(idx *MemoryIndex, r io.Reader) error { + for k := 0; k < fanout; k++ { + if pos := idx.FanoutMapping[k]; pos != noMapping { + if _, err := io.ReadFull(r, idx.CRC32[pos]); err != nil { + return err + } + } + } + + return nil +} + +func readOffsets(idx *MemoryIndex, r io.Reader) error { + var o64cnt int + for k := 0; k < fanout; k++ { + if pos := idx.FanoutMapping[k]; pos != noMapping { + if _, err := io.ReadFull(r, idx.Offset32[pos]); err != nil { + return err + } + + for p := 0; p < len(idx.Offset32[pos]); p += 4 { + if idx.Offset32[pos][p]&(byte(1)<<7) > 0 { + o64cnt++ + } + } + } + } + + if o64cnt > 0 { + idx.Offset64 = make([]byte, o64cnt*8) + if _, err := io.ReadFull(r, idx.Offset64); err != nil { + return err + } + } + + return nil +} + +func readChecksums(idx *MemoryIndex, r io.Reader) error { + if _, err := io.ReadFull(r, idx.PackfileChecksum[:]); err != nil { + return err + } + + if _, err := io.ReadFull(r, idx.IdxChecksum[:]); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/doc.go new file mode 100644 index 0000000000..1e628ab4a5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/doc.go @@ -0,0 +1,128 @@ +// Package idxfile implements encoding and decoding of packfile idx files. +// +// == Original (version 1) pack-*.idx files have the following format: +// +// - The header consists of 256 4-byte network byte order +// integers. N-th entry of this table records the number of +// objects in the corresponding pack, the first byte of whose +// object name is less than or equal to N. This is called the +// 'first-level fan-out' table. +// +// - The header is followed by sorted 24-byte entries, one entry +// per object in the pack. Each entry is: +// +// 4-byte network byte order integer, recording where the +// object is stored in the packfile as the offset from the +// beginning. +// +// 20-byte object name. +// +// - The file is concluded with a trailer: +// +// A copy of the 20-byte SHA1 checksum at the end of +// corresponding packfile. +// +// 20-byte SHA1-checksum of all of the above. +// +// Pack Idx file: +// +// -- +--------------------------------+ +// fanout | fanout[0] = 2 (for example) |-. +// table +--------------------------------+ | +// | fanout[1] | | +// +--------------------------------+ | +// | fanout[2] | | +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | +// | fanout[255] = total objects |---. +// -- +--------------------------------+ | | +// main | offset | | | +// index | object name 00XXXXXXXXXXXXXXXX | | | +// tab +--------------------------------+ | | +// | offset | | | +// | object name 00XXXXXXXXXXXXXXXX | | | +// +--------------------------------+<+ | +// .-| offset | | +// | | object name 01XXXXXXXXXXXXXXXX | | +// | +--------------------------------+ | +// | | offset | | +// | | object name 01XXXXXXXXXXXXXXXX | | +// | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | +// | | offset | | +// | | object name FFXXXXXXXXXXXXXXXX | | +// --| +--------------------------------+<--+ +// trailer | | packfile checksum | +// | +--------------------------------+ +// | | idxfile checksum | +// | +--------------------------------+ +// .---------. +// | +// Pack file entry: <+ +// +// packed object header: +// 1-byte size extension bit (MSB) +// type (next 3 bit) +// size0 (lower 4-bit) +// n-byte sizeN (as long as MSB is set, each 7-bit) +// size0..sizeN form 4+7+7+..+7 bit integer, size0 +// is the least significant part, and sizeN is the +// most significant part. +// packed object data: +// If it is not DELTA, then deflated bytes (the size above +// is the size before compression). +// If it is REF_DELTA, then +// 20-byte base object name SHA1 (the size above is the +// size of the delta data that follows). +// delta data, deflated. +// If it is OFS_DELTA, then +// n-byte offset (see below) interpreted as a negative +// offset from the type-byte of the header of the +// ofs-delta entry (the size above is the size of +// the delta data that follows). +// delta data, deflated. +// +// offset encoding: +// n bytes with MSB set in all but the last one. +// The offset is then the number constructed by +// concatenating the lower 7 bit of each byte, and +// for n >= 2 adding 2^7 + 2^14 + ... + 2^(7*(n-1)) +// to the result. +// +// == Version 2 pack-*.idx files support packs larger than 4 GiB, and +// have some other reorganizations. They have the format: +// +// - A 4-byte magic number '\377tOc' which is an unreasonable +// fanout[0] value. +// +// - A 4-byte version number (= 2) +// +// - A 256-entry fan-out table just like v1. +// +// - A table of sorted 20-byte SHA1 object names. These are +// packed together without offset values to reduce the cache +// footprint of the binary search for a specific object name. +// +// - A table of 4-byte CRC32 values of the packed object data. +// This is new in v2 so compressed data can be copied directly +// from pack to pack during repacking without undetected +// data corruption. +// +// - A table of 4-byte offset values (in network byte order). +// These are usually 31-bit pack file offsets, but large +// offsets are encoded as an index into the next table with +// the msbit set. +// +// - A table of 8-byte offset entries (empty for pack files less +// than 2 GiB). Pack files are organized with heavily used +// objects toward the front, so most object references should +// not need to refer to this table. +// +// - The same trailer as a v1 pack file: +// +// A copy of the 20-byte SHA1 checksum at the end of +// corresponding packfile. +// +// 20-byte SHA1-checksum of all of the above. +// +// Source: +// https://www.kernel.org/pub/software/scm/git/docs/v1.7.5/technical/pack-format.txt +package idxfile diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go new file mode 100644 index 0000000000..26b2e4d6b5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go @@ -0,0 +1,142 @@ +package idxfile + +import ( + "crypto/sha1" + "hash" + "io" + + "github.com/go-git/go-git/v5/utils/binary" +) + +// Encoder writes MemoryIndex structs to an output stream. +type Encoder struct { + io.Writer + hash hash.Hash +} + +// NewEncoder returns a new stream encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + h := sha1.New() + mw := io.MultiWriter(w, h) + return &Encoder{mw, h} +} + +// Encode encodes an MemoryIndex to the encoder writer. +func (e *Encoder) Encode(idx *MemoryIndex) (int, error) { + flow := []func(*MemoryIndex) (int, error){ + e.encodeHeader, + e.encodeFanout, + e.encodeHashes, + e.encodeCRC32, + e.encodeOffsets, + e.encodeChecksums, + } + + sz := 0 + for _, f := range flow { + i, err := f(idx) + sz += i + + if err != nil { + return sz, err + } + } + + return sz, nil +} + +func (e *Encoder) encodeHeader(idx *MemoryIndex) (int, error) { + c, err := e.Write(idxHeader) + if err != nil { + return c, err + } + + return c + 4, binary.WriteUint32(e, idx.Version) +} + +func (e *Encoder) encodeFanout(idx *MemoryIndex) (int, error) { + for _, c := range idx.Fanout { + if err := binary.WriteUint32(e, c); err != nil { + return 0, err + } + } + + return fanout * 4, nil +} + +func (e *Encoder) encodeHashes(idx *MemoryIndex) (int, error) { + var size int + for k := 0; k < fanout; k++ { + pos := idx.FanoutMapping[k] + if pos == noMapping { + continue + } + + n, err := e.Write(idx.Names[pos]) + if err != nil { + return size, err + } + size += n + } + return size, nil +} + +func (e *Encoder) encodeCRC32(idx *MemoryIndex) (int, error) { + var size int + for k := 0; k < fanout; k++ { + pos := idx.FanoutMapping[k] + if pos == noMapping { + continue + } + + n, err := e.Write(idx.CRC32[pos]) + if err != nil { + return size, err + } + + size += n + } + + return size, nil +} + +func (e *Encoder) encodeOffsets(idx *MemoryIndex) (int, error) { + var size int + for k := 0; k < fanout; k++ { + pos := idx.FanoutMapping[k] + if pos == noMapping { + continue + } + + n, err := e.Write(idx.Offset32[pos]) + if err != nil { + return size, err + } + + size += n + } + + if len(idx.Offset64) > 0 { + n, err := e.Write(idx.Offset64) + if err != nil { + return size, err + } + + size += n + } + + return size, nil +} + +func (e *Encoder) encodeChecksums(idx *MemoryIndex) (int, error) { + if _, err := e.Write(idx.PackfileChecksum[:]); err != nil { + return 0, err + } + + copy(idx.IdxChecksum[:], e.hash.Sum(nil)[:20]) + if _, err := e.Write(idx.IdxChecksum[:]); err != nil { + return 0, err + } + + return 40, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go new file mode 100644 index 0000000000..64dd8dcef4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go @@ -0,0 +1,346 @@ +package idxfile + +import ( + "bytes" + "io" + "sort" + + encbin "encoding/binary" + + "github.com/go-git/go-git/v5/plumbing" +) + +const ( + // VersionSupported is the only idx version supported. + VersionSupported = 2 + + noMapping = -1 +) + +var ( + idxHeader = []byte{255, 't', 'O', 'c'} +) + +// Index represents an index of a packfile. +type Index interface { + // Contains checks whether the given hash is in the index. + Contains(h plumbing.Hash) (bool, error) + // FindOffset finds the offset in the packfile for the object with + // the given hash. + FindOffset(h plumbing.Hash) (int64, error) + // FindCRC32 finds the CRC32 of the object with the given hash. + FindCRC32(h plumbing.Hash) (uint32, error) + // FindHash finds the hash for the object with the given offset. + FindHash(o int64) (plumbing.Hash, error) + // Count returns the number of entries in the index. + Count() (int64, error) + // Entries returns an iterator to retrieve all index entries. + Entries() (EntryIter, error) + // EntriesByOffset returns an iterator to retrieve all index entries ordered + // by offset. + EntriesByOffset() (EntryIter, error) +} + +// MemoryIndex is the in memory representation of an idx file. +type MemoryIndex struct { + Version uint32 + Fanout [256]uint32 + // FanoutMapping maps the position in the fanout table to the position + // in the Names, Offset32 and CRC32 slices. This improves the memory + // usage by not needing an array with unnecessary empty slots. + FanoutMapping [256]int + Names [][]byte + Offset32 [][]byte + CRC32 [][]byte + Offset64 []byte + PackfileChecksum [20]byte + IdxChecksum [20]byte + + offsetHash map[int64]plumbing.Hash + offsetHashIsFull bool +} + +var _ Index = (*MemoryIndex)(nil) + +// NewMemoryIndex returns an instance of a new MemoryIndex. +func NewMemoryIndex() *MemoryIndex { + return &MemoryIndex{} +} + +func (idx *MemoryIndex) findHashIndex(h plumbing.Hash) (int, bool) { + k := idx.FanoutMapping[h[0]] + if k == noMapping { + return 0, false + } + + if len(idx.Names) <= k { + return 0, false + } + + data := idx.Names[k] + high := uint64(len(idx.Offset32[k])) >> 2 + if high == 0 { + return 0, false + } + + low := uint64(0) + for { + mid := (low + high) >> 1 + offset := mid * objectIDLength + + cmp := bytes.Compare(h[:], data[offset:offset+objectIDLength]) + if cmp < 0 { + high = mid + } else if cmp == 0 { + return int(mid), true + } else { + low = mid + 1 + } + + if low >= high { + break + } + } + + return 0, false +} + +// Contains implements the Index interface. +func (idx *MemoryIndex) Contains(h plumbing.Hash) (bool, error) { + _, ok := idx.findHashIndex(h) + return ok, nil +} + +// FindOffset implements the Index interface. +func (idx *MemoryIndex) FindOffset(h plumbing.Hash) (int64, error) { + if len(idx.FanoutMapping) <= int(h[0]) { + return 0, plumbing.ErrObjectNotFound + } + + k := idx.FanoutMapping[h[0]] + i, ok := idx.findHashIndex(h) + if !ok { + return 0, plumbing.ErrObjectNotFound + } + + offset := idx.getOffset(k, i) + + if !idx.offsetHashIsFull { + // Save the offset for reverse lookup + if idx.offsetHash == nil { + idx.offsetHash = make(map[int64]plumbing.Hash) + } + idx.offsetHash[int64(offset)] = h + } + + return int64(offset), nil +} + +const isO64Mask = uint64(1) << 31 + +func (idx *MemoryIndex) getOffset(firstLevel, secondLevel int) uint64 { + offset := secondLevel << 2 + ofs := encbin.BigEndian.Uint32(idx.Offset32[firstLevel][offset : offset+4]) + + if (uint64(ofs) & isO64Mask) != 0 { + offset := 8 * (uint64(ofs) & ^isO64Mask) + n := encbin.BigEndian.Uint64(idx.Offset64[offset : offset+8]) + return n + } + + return uint64(ofs) +} + +// FindCRC32 implements the Index interface. +func (idx *MemoryIndex) FindCRC32(h plumbing.Hash) (uint32, error) { + k := idx.FanoutMapping[h[0]] + i, ok := idx.findHashIndex(h) + if !ok { + return 0, plumbing.ErrObjectNotFound + } + + return idx.getCRC32(k, i), nil +} + +func (idx *MemoryIndex) getCRC32(firstLevel, secondLevel int) uint32 { + offset := secondLevel << 2 + return encbin.BigEndian.Uint32(idx.CRC32[firstLevel][offset : offset+4]) +} + +// FindHash implements the Index interface. +func (idx *MemoryIndex) FindHash(o int64) (plumbing.Hash, error) { + var hash plumbing.Hash + var ok bool + + if idx.offsetHash != nil { + if hash, ok = idx.offsetHash[o]; ok { + return hash, nil + } + } + + // Lazily generate the reverse offset/hash map if required. + if !idx.offsetHashIsFull || idx.offsetHash == nil { + if err := idx.genOffsetHash(); err != nil { + return plumbing.ZeroHash, err + } + + hash, ok = idx.offsetHash[o] + } + + if !ok { + return plumbing.ZeroHash, plumbing.ErrObjectNotFound + } + + return hash, nil +} + +// genOffsetHash generates the offset/hash mapping for reverse search. +func (idx *MemoryIndex) genOffsetHash() error { + count, err := idx.Count() + if err != nil { + return err + } + + idx.offsetHash = make(map[int64]plumbing.Hash, count) + idx.offsetHashIsFull = true + + var hash plumbing.Hash + i := uint32(0) + for firstLevel, fanoutValue := range idx.Fanout { + mappedFirstLevel := idx.FanoutMapping[firstLevel] + for secondLevel := uint32(0); i < fanoutValue; i++ { + copy(hash[:], idx.Names[mappedFirstLevel][secondLevel*objectIDLength:]) + offset := int64(idx.getOffset(mappedFirstLevel, int(secondLevel))) + idx.offsetHash[offset] = hash + secondLevel++ + } + } + + return nil +} + +// Count implements the Index interface. +func (idx *MemoryIndex) Count() (int64, error) { + return int64(idx.Fanout[fanout-1]), nil +} + +// Entries implements the Index interface. +func (idx *MemoryIndex) Entries() (EntryIter, error) { + return &idxfileEntryIter{idx, 0, 0, 0}, nil +} + +// EntriesByOffset implements the Index interface. +func (idx *MemoryIndex) EntriesByOffset() (EntryIter, error) { + count, err := idx.Count() + if err != nil { + return nil, err + } + + iter := &idxfileEntryOffsetIter{ + entries: make(entriesByOffset, count), + } + + entries, err := idx.Entries() + if err != nil { + return nil, err + } + + for pos := 0; int64(pos) < count; pos++ { + entry, err := entries.Next() + if err != nil { + return nil, err + } + + iter.entries[pos] = entry + } + + sort.Sort(iter.entries) + + return iter, nil +} + +// EntryIter is an iterator that will return the entries in a packfile index. +type EntryIter interface { + // Next returns the next entry in the packfile index. + Next() (*Entry, error) + // Close closes the iterator. + Close() error +} + +type idxfileEntryIter struct { + idx *MemoryIndex + total int + firstLevel, secondLevel int +} + +func (i *idxfileEntryIter) Next() (*Entry, error) { + for { + if i.firstLevel >= fanout { + return nil, io.EOF + } + + if i.total >= int(i.idx.Fanout[i.firstLevel]) { + i.firstLevel++ + i.secondLevel = 0 + continue + } + + mappedFirstLevel := i.idx.FanoutMapping[i.firstLevel] + entry := new(Entry) + copy(entry.Hash[:], i.idx.Names[mappedFirstLevel][i.secondLevel*objectIDLength:]) + entry.Offset = i.idx.getOffset(mappedFirstLevel, i.secondLevel) + entry.CRC32 = i.idx.getCRC32(mappedFirstLevel, i.secondLevel) + + i.secondLevel++ + i.total++ + + return entry, nil + } +} + +func (i *idxfileEntryIter) Close() error { + i.firstLevel = fanout + return nil +} + +// Entry is the in memory representation of an object entry in the idx file. +type Entry struct { + Hash plumbing.Hash + CRC32 uint32 + Offset uint64 +} + +type idxfileEntryOffsetIter struct { + entries entriesByOffset + pos int +} + +func (i *idxfileEntryOffsetIter) Next() (*Entry, error) { + if i.pos >= len(i.entries) { + return nil, io.EOF + } + + entry := i.entries[i.pos] + i.pos++ + + return entry, nil +} + +func (i *idxfileEntryOffsetIter) Close() error { + i.pos = len(i.entries) + 1 + return nil +} + +type entriesByOffset []*Entry + +func (o entriesByOffset) Len() int { + return len(o) +} + +func (o entriesByOffset) Less(i int, j int) bool { + return o[i].Offset < o[j].Offset +} + +func (o entriesByOffset) Swap(i int, j int) { + o[i], o[j] = o[j], o[i] +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go new file mode 100644 index 0000000000..daa160502a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go @@ -0,0 +1,186 @@ +package idxfile + +import ( + "bytes" + "fmt" + "math" + "sort" + "sync" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/binary" +) + +// objects implements sort.Interface and uses hash as sorting key. +type objects []Entry + +// Writer implements a packfile Observer interface and is used to generate +// indexes. +type Writer struct { + m sync.Mutex + + count uint32 + checksum plumbing.Hash + objects objects + offset64 uint32 + finished bool + index *MemoryIndex + added map[plumbing.Hash]struct{} +} + +// Index returns a previously created MemoryIndex or creates a new one if +// needed. +func (w *Writer) Index() (*MemoryIndex, error) { + w.m.Lock() + defer w.m.Unlock() + + if w.index == nil { + return w.createIndex() + } + + return w.index, nil +} + +// Add appends new object data. +func (w *Writer) Add(h plumbing.Hash, pos uint64, crc uint32) { + w.m.Lock() + defer w.m.Unlock() + + if w.added == nil { + w.added = make(map[plumbing.Hash]struct{}) + } + + if _, ok := w.added[h]; !ok { + w.added[h] = struct{}{} + w.objects = append(w.objects, Entry{h, crc, pos}) + } + +} + +func (w *Writer) Finished() bool { + return w.finished +} + +// OnHeader implements packfile.Observer interface. +func (w *Writer) OnHeader(count uint32) error { + w.count = count + w.objects = make(objects, 0, count) + return nil +} + +// OnInflatedObjectHeader implements packfile.Observer interface. +func (w *Writer) OnInflatedObjectHeader(t plumbing.ObjectType, objSize int64, pos int64) error { + return nil +} + +// OnInflatedObjectContent implements packfile.Observer interface. +func (w *Writer) OnInflatedObjectContent(h plumbing.Hash, pos int64, crc uint32, _ []byte) error { + w.Add(h, uint64(pos), crc) + return nil +} + +// OnFooter implements packfile.Observer interface. +func (w *Writer) OnFooter(h plumbing.Hash) error { + w.checksum = h + w.finished = true + _, err := w.createIndex() + if err != nil { + return err + } + + return nil +} + +// creatIndex returns a filled MemoryIndex with the information filled by +// the observer callbacks. +func (w *Writer) createIndex() (*MemoryIndex, error) { + if !w.finished { + return nil, fmt.Errorf("the index still hasn't finished building") + } + + idx := new(MemoryIndex) + w.index = idx + + sort.Sort(w.objects) + + // unmap all fans by default + for i := range idx.FanoutMapping { + idx.FanoutMapping[i] = noMapping + } + + buf := new(bytes.Buffer) + + last := -1 + bucket := -1 + for i, o := range w.objects { + fan := o.Hash[0] + + // fill the gaps between fans + for j := last + 1; j < int(fan); j++ { + idx.Fanout[j] = uint32(i) + } + + // update the number of objects for this position + idx.Fanout[fan] = uint32(i + 1) + + // we move from one bucket to another, update counters and allocate + // memory + if last != int(fan) { + bucket++ + idx.FanoutMapping[fan] = bucket + last = int(fan) + + idx.Names = append(idx.Names, make([]byte, 0)) + idx.Offset32 = append(idx.Offset32, make([]byte, 0)) + idx.CRC32 = append(idx.CRC32, make([]byte, 0)) + } + + idx.Names[bucket] = append(idx.Names[bucket], o.Hash[:]...) + + offset := o.Offset + if offset > math.MaxInt32 { + offset = w.addOffset64(offset) + } + + buf.Truncate(0) + binary.WriteUint32(buf, uint32(offset)) + idx.Offset32[bucket] = append(idx.Offset32[bucket], buf.Bytes()...) + + buf.Truncate(0) + binary.WriteUint32(buf, o.CRC32) + idx.CRC32[bucket] = append(idx.CRC32[bucket], buf.Bytes()...) + } + + for j := last + 1; j < 256; j++ { + idx.Fanout[j] = uint32(len(w.objects)) + } + + idx.Version = VersionSupported + idx.PackfileChecksum = w.checksum + + return idx, nil +} + +func (w *Writer) addOffset64(pos uint64) uint64 { + buf := new(bytes.Buffer) + binary.WriteUint64(buf, pos) + w.index.Offset64 = append(w.index.Offset64, buf.Bytes()...) + + index := uint64(w.offset64 | (1 << 31)) + w.offset64++ + + return index +} + +func (o objects) Len() int { + return len(o) +} + +func (o objects) Less(i int, j int) bool { + cmp := bytes.Compare(o[i].Hash[:], o[j].Hash[:]) + return cmp < 0 +} + +func (o objects) Swap(i int, j int) { + o[i], o[j] = o[j], o[i] +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go new file mode 100644 index 0000000000..036b6365e6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go @@ -0,0 +1,479 @@ +package index + +import ( + "bufio" + "bytes" + "crypto/sha1" + "errors" + "hash" + "io" + "io/ioutil" + "strconv" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/binary" +) + +var ( + // DecodeVersionSupported is the range of supported index versions + DecodeVersionSupported = struct{ Min, Max uint32 }{Min: 2, Max: 4} + + // ErrMalformedSignature is returned by Decode when the index header file is + // malformed + ErrMalformedSignature = errors.New("malformed index signature file") + // ErrInvalidChecksum is returned by Decode if the SHA1 hash mismatch with + // the read content + ErrInvalidChecksum = errors.New("invalid checksum") + + errUnknownExtension = errors.New("unknown extension") +) + +const ( + entryHeaderLength = 62 + entryExtended = 0x4000 + entryValid = 0x8000 + nameMask = 0xfff + intentToAddMask = 1 << 13 + skipWorkTreeMask = 1 << 14 +) + +// A Decoder reads and decodes index files from an input stream. +type Decoder struct { + r io.Reader + hash hash.Hash + lastEntry *Entry + + extReader *bufio.Reader +} + +// NewDecoder returns a new decoder that reads from r. +func NewDecoder(r io.Reader) *Decoder { + h := sha1.New() + return &Decoder{ + r: io.TeeReader(r, h), + hash: h, + extReader: bufio.NewReader(nil), + } +} + +// Decode reads the whole index object from its input and stores it in the +// value pointed to by idx. +func (d *Decoder) Decode(idx *Index) error { + var err error + idx.Version, err = validateHeader(d.r) + if err != nil { + return err + } + + entryCount, err := binary.ReadUint32(d.r) + if err != nil { + return err + } + + if err := d.readEntries(idx, int(entryCount)); err != nil { + return err + } + + return d.readExtensions(idx) +} + +func (d *Decoder) readEntries(idx *Index, count int) error { + for i := 0; i < count; i++ { + e, err := d.readEntry(idx) + if err != nil { + return err + } + + d.lastEntry = e + idx.Entries = append(idx.Entries, e) + } + + return nil +} + +func (d *Decoder) readEntry(idx *Index) (*Entry, error) { + e := &Entry{} + + var msec, mnsec, sec, nsec uint32 + var flags uint16 + + flow := []interface{}{ + &sec, &nsec, + &msec, &mnsec, + &e.Dev, + &e.Inode, + &e.Mode, + &e.UID, + &e.GID, + &e.Size, + &e.Hash, + &flags, + } + + if err := binary.Read(d.r, flow...); err != nil { + return nil, err + } + + read := entryHeaderLength + + if sec != 0 || nsec != 0 { + e.CreatedAt = time.Unix(int64(sec), int64(nsec)) + } + + if msec != 0 || mnsec != 0 { + e.ModifiedAt = time.Unix(int64(msec), int64(mnsec)) + } + + e.Stage = Stage(flags>>12) & 0x3 + + if flags&entryExtended != 0 { + extended, err := binary.ReadUint16(d.r) + if err != nil { + return nil, err + } + + read += 2 + e.IntentToAdd = extended&intentToAddMask != 0 + e.SkipWorktree = extended&skipWorkTreeMask != 0 + } + + if err := d.readEntryName(idx, e, flags); err != nil { + return nil, err + } + + return e, d.padEntry(idx, e, read) +} + +func (d *Decoder) readEntryName(idx *Index, e *Entry, flags uint16) error { + var name string + var err error + + switch idx.Version { + case 2, 3: + len := flags & nameMask + name, err = d.doReadEntryName(len) + case 4: + name, err = d.doReadEntryNameV4() + default: + return ErrUnsupportedVersion + } + + if err != nil { + return err + } + + e.Name = name + return nil +} + +func (d *Decoder) doReadEntryNameV4() (string, error) { + l, err := binary.ReadVariableWidthInt(d.r) + if err != nil { + return "", err + } + + var base string + if d.lastEntry != nil { + base = d.lastEntry.Name[:len(d.lastEntry.Name)-int(l)] + } + + name, err := binary.ReadUntil(d.r, '\x00') + if err != nil { + return "", err + } + + return base + string(name), nil +} + +func (d *Decoder) doReadEntryName(len uint16) (string, error) { + name := make([]byte, len) + _, err := io.ReadFull(d.r, name) + + return string(name), err +} + +// Index entries are padded out to the next 8 byte alignment +// for historical reasons related to how C Git read the files. +func (d *Decoder) padEntry(idx *Index, e *Entry, read int) error { + if idx.Version == 4 { + return nil + } + + entrySize := read + len(e.Name) + padLen := 8 - entrySize%8 + _, err := io.CopyN(ioutil.Discard, d.r, int64(padLen)) + return err +} + +func (d *Decoder) readExtensions(idx *Index) error { + // TODO: support 'Split index' and 'Untracked cache' extensions, take in + // count that they are not supported by jgit or libgit + + var expected []byte + var err error + + var header [4]byte + for { + expected = d.hash.Sum(nil) + + var n int + if n, err = io.ReadFull(d.r, header[:]); err != nil { + if n == 0 { + err = io.EOF + } + + break + } + + err = d.readExtension(idx, header[:]) + if err != nil { + break + } + } + + if err != errUnknownExtension { + return err + } + + return d.readChecksum(expected, header) +} + +func (d *Decoder) readExtension(idx *Index, header []byte) error { + switch { + case bytes.Equal(header, treeExtSignature): + r, err := d.getExtensionReader() + if err != nil { + return err + } + + idx.Cache = &Tree{} + d := &treeExtensionDecoder{r} + if err := d.Decode(idx.Cache); err != nil { + return err + } + case bytes.Equal(header, resolveUndoExtSignature): + r, err := d.getExtensionReader() + if err != nil { + return err + } + + idx.ResolveUndo = &ResolveUndo{} + d := &resolveUndoDecoder{r} + if err := d.Decode(idx.ResolveUndo); err != nil { + return err + } + case bytes.Equal(header, endOfIndexEntryExtSignature): + r, err := d.getExtensionReader() + if err != nil { + return err + } + + idx.EndOfIndexEntry = &EndOfIndexEntry{} + d := &endOfIndexEntryDecoder{r} + if err := d.Decode(idx.EndOfIndexEntry); err != nil { + return err + } + default: + return errUnknownExtension + } + + return nil +} + +func (d *Decoder) getExtensionReader() (*bufio.Reader, error) { + len, err := binary.ReadUint32(d.r) + if err != nil { + return nil, err + } + + d.extReader.Reset(&io.LimitedReader{R: d.r, N: int64(len)}) + return d.extReader, nil +} + +func (d *Decoder) readChecksum(expected []byte, alreadyRead [4]byte) error { + var h plumbing.Hash + copy(h[:4], alreadyRead[:]) + + if _, err := io.ReadFull(d.r, h[4:]); err != nil { + return err + } + + if !bytes.Equal(h[:], expected) { + return ErrInvalidChecksum + } + + return nil +} + +func validateHeader(r io.Reader) (version uint32, err error) { + var s = make([]byte, 4) + if _, err := io.ReadFull(r, s); err != nil { + return 0, err + } + + if !bytes.Equal(s, indexSignature) { + return 0, ErrMalformedSignature + } + + version, err = binary.ReadUint32(r) + if err != nil { + return 0, err + } + + if version < DecodeVersionSupported.Min || version > DecodeVersionSupported.Max { + return 0, ErrUnsupportedVersion + } + + return +} + +type treeExtensionDecoder struct { + r *bufio.Reader +} + +func (d *treeExtensionDecoder) Decode(t *Tree) error { + for { + e, err := d.readEntry() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if e == nil { + continue + } + + t.Entries = append(t.Entries, *e) + } +} + +func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) { + e := &TreeEntry{} + + path, err := binary.ReadUntil(d.r, '\x00') + if err != nil { + return nil, err + } + + e.Path = string(path) + + count, err := binary.ReadUntil(d.r, ' ') + if err != nil { + return nil, err + } + + i, err := strconv.Atoi(string(count)) + if err != nil { + return nil, err + } + + // An entry can be in an invalidated state and is represented by having a + // negative number in the entry_count field. + if i == -1 { + return nil, nil + } + + e.Entries = i + trees, err := binary.ReadUntil(d.r, '\n') + if err != nil { + return nil, err + } + + i, err = strconv.Atoi(string(trees)) + if err != nil { + return nil, err + } + + e.Trees = i + _, err = io.ReadFull(d.r, e.Hash[:]) + if err != nil { + return nil, err + } + return e, nil +} + +type resolveUndoDecoder struct { + r *bufio.Reader +} + +func (d *resolveUndoDecoder) Decode(ru *ResolveUndo) error { + for { + e, err := d.readEntry() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + ru.Entries = append(ru.Entries, *e) + } +} + +func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) { + e := &ResolveUndoEntry{ + Stages: make(map[Stage]plumbing.Hash), + } + + path, err := binary.ReadUntil(d.r, '\x00') + if err != nil { + return nil, err + } + + e.Path = string(path) + + for i := 0; i < 3; i++ { + if err := d.readStage(e, Stage(i+1)); err != nil { + return nil, err + } + } + + for s := range e.Stages { + var hash plumbing.Hash + if _, err := io.ReadFull(d.r, hash[:]); err != nil { + return nil, err + } + + e.Stages[s] = hash + } + + return e, nil +} + +func (d *resolveUndoDecoder) readStage(e *ResolveUndoEntry, s Stage) error { + ascii, err := binary.ReadUntil(d.r, '\x00') + if err != nil { + return err + } + + stage, err := strconv.ParseInt(string(ascii), 8, 64) + if err != nil { + return err + } + + if stage != 0 { + e.Stages[s] = plumbing.ZeroHash + } + + return nil +} + +type endOfIndexEntryDecoder struct { + r *bufio.Reader +} + +func (d *endOfIndexEntryDecoder) Decode(e *EndOfIndexEntry) error { + var err error + e.Offset, err = binary.ReadUint32(d.r) + if err != nil { + return err + } + + _, err = io.ReadFull(d.r, e.Hash[:]) + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/doc.go new file mode 100644 index 0000000000..39ae6ad5f9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/doc.go @@ -0,0 +1,360 @@ +// Package index implements encoding and decoding of index format files. +// +// Git index format +// ================ +// +// == The Git index file has the following format +// +// All binary numbers are in network byte order. Version 2 is described +// here unless stated otherwise. +// +// - A 12-byte header consisting of +// +// 4-byte signature: +// The signature is { 'D', 'I', 'R', 'C' } (stands for "dircache") +// +// 4-byte version number: +// The current supported versions are 2, 3 and 4. +// +// 32-bit number of index entries. +// +// - A number of sorted index entries (see below). +// +// - Extensions +// +// Extensions are identified by signature. Optional extensions can +// be ignored if Git does not understand them. +// +// Git currently supports cached tree and resolve undo extensions. +// +// 4-byte extension signature. If the first byte is 'A'..'Z' the +// extension is optional and can be ignored. +// +// 32-bit size of the extension +// +// Extension data +// +// - 160-bit SHA-1 over the content of the index file before this +// checksum. +// +// == Index entry +// +// Index entries are sorted in ascending order on the name field, +// interpreted as a string of unsigned bytes (i.e. memcmp() order, no +// localization, no special casing of directory separator '/'). Entries +// with the same name are sorted by their stage field. +// +// 32-bit ctime seconds, the last time a file's metadata changed +// this is stat(2) data +// +// 32-bit ctime nanosecond fractions +// this is stat(2) data +// +// 32-bit mtime seconds, the last time a file's data changed +// this is stat(2) data +// +// 32-bit mtime nanosecond fractions +// this is stat(2) data +// +// 32-bit dev +// this is stat(2) data +// +// 32-bit ino +// this is stat(2) data +// +// 32-bit mode, split into (high to low bits) +// +// 4-bit object type +// valid values in binary are 1000 (regular file), 1010 (symbolic link) +// and 1110 (gitlink) +// +// 3-bit unused +// +// 9-bit unix permission. Only 0755 and 0644 are valid for regular files. +// Symbolic links and gitlinks have value 0 in this field. +// +// 32-bit uid +// this is stat(2) data +// +// 32-bit gid +// this is stat(2) data +// +// 32-bit file size +// This is the on-disk size from stat(2), truncated to 32-bit. +// +// 160-bit SHA-1 for the represented object +// +// A 16-bit 'flags' field split into (high to low bits) +// +// 1-bit assume-valid flag +// +// 1-bit extended flag (must be zero in version 2) +// +// 2-bit stage (during merge) +// +// 12-bit name length if the length is less than 0xFFF; otherwise 0xFFF +// is stored in this field. +// +// (Version 3 or later) A 16-bit field, only applicable if the +// "extended flag" above is 1, split into (high to low bits). +// +// 1-bit reserved for future +// +// 1-bit skip-worktree flag (used by sparse checkout) +// +// 1-bit intent-to-add flag (used by "git add -N") +// +// 13-bit unused, must be zero +// +// Entry path name (variable length) relative to top level directory +// (without leading slash). '/' is used as path separator. The special +// path components ".", ".." and ".git" (without quotes) are disallowed. +// Trailing slash is also disallowed. +// +// The exact encoding is undefined, but the '.' and '/' characters +// are encoded in 7-bit ASCII and the encoding cannot contain a NUL +// byte (iow, this is a UNIX pathname). +// +// (Version 4) In version 4, the entry path name is prefix-compressed +// relative to the path name for the previous entry (the very first +// entry is encoded as if the path name for the previous entry is an +// empty string). At the beginning of an entry, an integer N in the +// variable width encoding (the same encoding as the offset is encoded +// for OFS_DELTA pack entries; see pack-format.txt) is stored, followed +// by a NUL-terminated string S. Removing N bytes from the end of the +// path name for the previous entry, and replacing it with the string S +// yields the path name for this entry. +// +// 1-8 nul bytes as necessary to pad the entry to a multiple of eight bytes +// while keeping the name NUL-terminated. +// +// (Version 4) In version 4, the padding after the pathname does not +// exist. +// +// Interpretation of index entries in split index mode is completely +// different. See below for details. +// +// == Extensions +// +// === Cached tree +// +// Cached tree extension contains pre-computed hashes for trees that can +// be derived from the index. It helps speed up tree object generation +// from index for a new commit. +// +// When a path is updated in index, the path must be invalidated and +// removed from tree cache. +// +// The signature for this extension is { 'T', 'R', 'E', 'E' }. +// +// A series of entries fill the entire extension; each of which +// consists of: +// +// - NUL-terminated path component (relative to its parent directory); +// +// - ASCII decimal number of entries in the index that is covered by the +// tree this entry represents (entry_count); +// +// - A space (ASCII 32); +// +// - ASCII decimal number that represents the number of subtrees this +// tree has; +// +// - A newline (ASCII 10); and +// +// - 160-bit object name for the object that would result from writing +// this span of index as a tree. +// +// An entry can be in an invalidated state and is represented by having +// a negative number in the entry_count field. In this case, there is no +// object name and the next entry starts immediately after the newline. +// When writing an invalid entry, -1 should always be used as entry_count. +// +// The entries are written out in the top-down, depth-first order. The +// first entry represents the root level of the repository, followed by the +// first subtree--let's call this A--of the root level (with its name +// relative to the root level), followed by the first subtree of A (with +// its name relative to A), ... +// +// === Resolve undo +// +// A conflict is represented in the index as a set of higher stage entries. +// When a conflict is resolved (e.g. with "git add path"), these higher +// stage entries will be removed and a stage-0 entry with proper resolution +// is added. +// +// When these higher stage entries are removed, they are saved in the +// resolve undo extension, so that conflicts can be recreated (e.g. with +// "git checkout -m"), in case users want to redo a conflict resolution +// from scratch. +// +// The signature for this extension is { 'R', 'E', 'U', 'C' }. +// +// A series of entries fill the entire extension; each of which +// consists of: +// +// - NUL-terminated pathname the entry describes (relative to the root of +// the repository, i.e. full pathname); +// +// - Three NUL-terminated ASCII octal numbers, entry mode of entries in +// stage 1 to 3 (a missing stage is represented by "0" in this field); +// and +// +// - At most three 160-bit object names of the entry in stages from 1 to 3 +// (nothing is written for a missing stage). +// +// === Split index +// +// In split index mode, the majority of index entries could be stored +// in a separate file. This extension records the changes to be made on +// top of that to produce the final index. +// +// The signature for this extension is { 'l', 'i', 'n', 'k' }. +// +// The extension consists of: +// +// - 160-bit SHA-1 of the shared index file. The shared index file path +// is $GIT_DIR/sharedindex.. If all 160 bits are zero, the +// index does not require a shared index file. +// +// - An ewah-encoded delete bitmap, each bit represents an entry in the +// shared index. If a bit is set, its corresponding entry in the +// shared index will be removed from the final index. Note, because +// a delete operation changes index entry positions, but we do need +// original positions in replace phase, it's best to just mark +// entries for removal, then do a mass deletion after replacement. +// +// - An ewah-encoded replace bitmap, each bit represents an entry in +// the shared index. If a bit is set, its corresponding entry in the +// shared index will be replaced with an entry in this index +// file. All replaced entries are stored in sorted order in this +// index. The first "1" bit in the replace bitmap corresponds to the +// first index entry, the second "1" bit to the second entry and so +// on. Replaced entries may have empty path names to save space. +// +// The remaining index entries after replaced ones will be added to the +// final index. These added entries are also sorted by entry name then +// stage. +// +// == Untracked cache +// +// Untracked cache saves the untracked file list and necessary data to +// verify the cache. The signature for this extension is { 'U', 'N', +// 'T', 'R' }. +// +// The extension starts with +// +// - A sequence of NUL-terminated strings, preceded by the size of the +// sequence in variable width encoding. Each string describes the +// environment where the cache can be used. +// +// - Stat data of $GIT_DIR/info/exclude. See "Index entry" section from +// ctime field until "file size". +// +// - Stat data of plumbing.excludesfile +// +// - 32-bit dir_flags (see struct dir_struct) +// +// - 160-bit SHA-1 of $GIT_DIR/info/exclude. Null SHA-1 means the file +// does not exist. +// +// - 160-bit SHA-1 of plumbing.excludesfile. Null SHA-1 means the file does +// not exist. +// +// - NUL-terminated string of per-dir exclude file name. This usually +// is ".gitignore". +// +// - The number of following directory blocks, variable width +// encoding. If this number is zero, the extension ends here with a +// following NUL. +// +// - A number of directory blocks in depth-first-search order, each +// consists of +// +// - The number of untracked entries, variable width encoding. +// +// - The number of sub-directory blocks, variable width encoding. +// +// - The directory name terminated by NUL. +// +// - A number of untracked file/dir names terminated by NUL. +// +// The remaining data of each directory block is grouped by type: +// +// - An ewah bitmap, the n-th bit marks whether the n-th directory has +// valid untracked cache entries. +// +// - An ewah bitmap, the n-th bit records "check-only" bit of +// read_directory_recursive() for the n-th directory. +// +// - An ewah bitmap, the n-th bit indicates whether SHA-1 and stat data +// is valid for the n-th directory and exists in the next data. +// +// - An array of stat data. The n-th data corresponds with the n-th +// "one" bit in the previous ewah bitmap. +// +// - An array of SHA-1. The n-th SHA-1 corresponds with the n-th "one" bit +// in the previous ewah bitmap. +// +// - One NUL. +// +// == File System Monitor cache +// +// The file system monitor cache tracks files for which the core.fsmonitor +// hook has told us about changes. The signature for this extension is +// { 'F', 'S', 'M', 'N' }. +// +// The extension starts with +// +// - 32-bit version number: the current supported version is 1. +// +// - 64-bit time: the extension data reflects all changes through the given +// time which is stored as the nanoseconds elapsed since midnight, +// January 1, 1970. +// +// - 32-bit bitmap size: the size of the CE_FSMONITOR_VALID bitmap. +// +// - An ewah bitmap, the n-th bit indicates whether the n-th index entry +// is not CE_FSMONITOR_VALID. +// +// == End of Index Entry +// +// The End of Index Entry (EOIE) is used to locate the end of the variable +// length index entries and the beginning of the extensions. Code can take +// advantage of this to quickly locate the index extensions without having +// to parse through all of the index entries. +// +// Because it must be able to be loaded before the variable length cache +// entries and other index extensions, this extension must be written last. +// The signature for this extension is { 'E', 'O', 'I', 'E' }. +// +// The extension consists of: +// +// - 32-bit offset to the end of the index entries +// +// - 160-bit SHA-1 over the extension types and their sizes (but not +// their contents). E.g. if we have "TREE" extension that is N-bytes +// long, "REUC" extension that is M-bytes long, followed by "EOIE", +// then the hash would be: +// +// SHA-1("TREE" + + +// "REUC" + ) +// +// == Index Entry Offset Table +// +// The Index Entry Offset Table (IEOT) is used to help address the CPU +// cost of loading the index by enabling multi-threading the process of +// converting cache entries from the on-disk format to the in-memory format. +// The signature for this extension is { 'I', 'E', 'O', 'T' }. +// +// The extension consists of: +// +// - 32-bit version (currently 1) +// +// - A number of index offset entries each consisting of: +// +// - 32-bit offset from the beginning of the file to the first cache entry +// in this block of entries. +// +// - 32-bit count of cache entries in this blockpackage index +package index diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go new file mode 100644 index 0000000000..00d4e7a317 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go @@ -0,0 +1,150 @@ +package index + +import ( + "bytes" + "crypto/sha1" + "errors" + "hash" + "io" + "sort" + "time" + + "github.com/go-git/go-git/v5/utils/binary" +) + +var ( + // EncodeVersionSupported is the range of supported index versions + EncodeVersionSupported uint32 = 2 + + // ErrInvalidTimestamp is returned by Encode if a Index with a Entry with + // negative timestamp values + ErrInvalidTimestamp = errors.New("negative timestamps are not allowed") +) + +// An Encoder writes an Index to an output stream. +type Encoder struct { + w io.Writer + hash hash.Hash +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + h := sha1.New() + mw := io.MultiWriter(w, h) + return &Encoder{mw, h} +} + +// Encode writes the Index to the stream of the encoder. +func (e *Encoder) Encode(idx *Index) error { + // TODO: support versions v3 and v4 + // TODO: support extensions + if idx.Version != EncodeVersionSupported { + return ErrUnsupportedVersion + } + + if err := e.encodeHeader(idx); err != nil { + return err + } + + if err := e.encodeEntries(idx); err != nil { + return err + } + + return e.encodeFooter() +} + +func (e *Encoder) encodeHeader(idx *Index) error { + return binary.Write(e.w, + indexSignature, + idx.Version, + uint32(len(idx.Entries)), + ) +} + +func (e *Encoder) encodeEntries(idx *Index) error { + sort.Sort(byName(idx.Entries)) + + for _, entry := range idx.Entries { + if err := e.encodeEntry(entry); err != nil { + return err + } + + wrote := entryHeaderLength + len(entry.Name) + if err := e.padEntry(wrote); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) encodeEntry(entry *Entry) error { + if entry.IntentToAdd || entry.SkipWorktree { + return ErrUnsupportedVersion + } + + sec, nsec, err := e.timeToUint32(&entry.CreatedAt) + if err != nil { + return err + } + + msec, mnsec, err := e.timeToUint32(&entry.ModifiedAt) + if err != nil { + return err + } + + flags := uint16(entry.Stage&0x3) << 12 + if l := len(entry.Name); l < nameMask { + flags |= uint16(l) + } else { + flags |= nameMask + } + + flow := []interface{}{ + sec, nsec, + msec, mnsec, + entry.Dev, + entry.Inode, + entry.Mode, + entry.UID, + entry.GID, + entry.Size, + entry.Hash[:], + flags, + } + + if err := binary.Write(e.w, flow...); err != nil { + return err + } + + return binary.Write(e.w, []byte(entry.Name)) +} + +func (e *Encoder) timeToUint32(t *time.Time) (uint32, uint32, error) { + if t.IsZero() { + return 0, 0, nil + } + + if t.Unix() < 0 || t.UnixNano() < 0 { + return 0, 0, ErrInvalidTimestamp + } + + return uint32(t.Unix()), uint32(t.Nanosecond()), nil +} + +func (e *Encoder) padEntry(wrote int) error { + padLen := 8 - wrote%8 + + _, err := e.w.Write(bytes.Repeat([]byte{'\x00'}, padLen)) + return err +} + +func (e *Encoder) encodeFooter() error { + return binary.Write(e.w, e.hash.Sum(nil)) +} + +type byName []*Entry + +func (l byName) Len() int { return len(l) } +func (l byName) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l byName) Less(i, j int) bool { return l[i].Name < l[j].Name } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/index.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/index.go new file mode 100644 index 0000000000..649416a2b4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/index.go @@ -0,0 +1,213 @@ +package index + +import ( + "bytes" + "errors" + "fmt" + "path/filepath" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" +) + +var ( + // ErrUnsupportedVersion is returned by Decode when the index file version + // is not supported. + ErrUnsupportedVersion = errors.New("unsupported version") + // ErrEntryNotFound is returned by Index.Entry, if an entry is not found. + ErrEntryNotFound = errors.New("entry not found") + + indexSignature = []byte{'D', 'I', 'R', 'C'} + treeExtSignature = []byte{'T', 'R', 'E', 'E'} + resolveUndoExtSignature = []byte{'R', 'E', 'U', 'C'} + endOfIndexEntryExtSignature = []byte{'E', 'O', 'I', 'E'} +) + +// Stage during merge +type Stage int + +const ( + // Merged is the default stage, fully merged + Merged Stage = 1 + // AncestorMode is the base revision + AncestorMode Stage = 1 + // OurMode is the first tree revision, ours + OurMode Stage = 2 + // TheirMode is the second tree revision, theirs + TheirMode Stage = 3 +) + +// Index contains the information about which objects are currently checked out +// in the worktree, having information about the working files. Changes in +// worktree are detected using this Index. The Index is also used during merges +type Index struct { + // Version is index version + Version uint32 + // Entries collection of entries represented by this Index. The order of + // this collection is not guaranteed + Entries []*Entry + // Cache represents the 'Cached tree' extension + Cache *Tree + // ResolveUndo represents the 'Resolve undo' extension + ResolveUndo *ResolveUndo + // EndOfIndexEntry represents the 'End of Index Entry' extension + EndOfIndexEntry *EndOfIndexEntry +} + +// Add creates a new Entry and returns it. The caller should first check that +// another entry with the same path does not exist. +func (i *Index) Add(path string) *Entry { + e := &Entry{ + Name: filepath.ToSlash(path), + } + + i.Entries = append(i.Entries, e) + return e +} + +// Entry returns the entry that match the given path, if any. +func (i *Index) Entry(path string) (*Entry, error) { + path = filepath.ToSlash(path) + for _, e := range i.Entries { + if e.Name == path { + return e, nil + } + } + + return nil, ErrEntryNotFound +} + +// Remove remove the entry that match the give path and returns deleted entry. +func (i *Index) Remove(path string) (*Entry, error) { + path = filepath.ToSlash(path) + for index, e := range i.Entries { + if e.Name == path { + i.Entries = append(i.Entries[:index], i.Entries[index+1:]...) + return e, nil + } + } + + return nil, ErrEntryNotFound +} + +// Glob returns the all entries matching pattern or nil if there is no matching +// entry. The syntax of patterns is the same as in filepath.Glob. +func (i *Index) Glob(pattern string) (matches []*Entry, err error) { + pattern = filepath.ToSlash(pattern) + for _, e := range i.Entries { + m, err := match(pattern, e.Name) + if err != nil { + return nil, err + } + + if m { + matches = append(matches, e) + } + } + + return +} + +// String is equivalent to `git ls-files --stage --debug` +func (i *Index) String() string { + buf := bytes.NewBuffer(nil) + for _, e := range i.Entries { + buf.WriteString(e.String()) + } + + return buf.String() +} + +// Entry represents a single file (or stage of a file) in the cache. An entry +// represents exactly one stage of a file. If a file path is unmerged then +// multiple Entry instances may appear for the same path name. +type Entry struct { + // Hash is the SHA1 of the represented file + Hash plumbing.Hash + // Name is the Entry path name relative to top level directory + Name string + // CreatedAt time when the tracked path was created + CreatedAt time.Time + // ModifiedAt time when the tracked path was changed + ModifiedAt time.Time + // Dev and Inode of the tracked path + Dev, Inode uint32 + // Mode of the path + Mode filemode.FileMode + // UID and GID, userid and group id of the owner + UID, GID uint32 + // Size is the length in bytes for regular files + Size uint32 + // Stage on a merge is defines what stage is representing this entry + // https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging + Stage Stage + // SkipWorktree used in sparse checkouts + // https://git-scm.com/docs/git-read-tree#_sparse_checkout + SkipWorktree bool + // IntentToAdd record only the fact that the path will be added later + // https://git-scm.com/docs/git-add ("git add -N") + IntentToAdd bool +} + +func (e Entry) String() string { + buf := bytes.NewBuffer(nil) + + fmt.Fprintf(buf, "%06o %s %d\t%s\n", e.Mode, e.Hash, e.Stage, e.Name) + fmt.Fprintf(buf, " ctime: %d:%d\n", e.CreatedAt.Unix(), e.CreatedAt.Nanosecond()) + fmt.Fprintf(buf, " mtime: %d:%d\n", e.ModifiedAt.Unix(), e.ModifiedAt.Nanosecond()) + fmt.Fprintf(buf, " dev: %d\tino: %d\n", e.Dev, e.Inode) + fmt.Fprintf(buf, " uid: %d\tgid: %d\n", e.UID, e.GID) + fmt.Fprintf(buf, " size: %d\tflags: %x\n", e.Size, 0) + + return buf.String() +} + +// Tree contains pre-computed hashes for trees that can be derived from the +// index. It helps speed up tree object generation from index for a new commit. +type Tree struct { + Entries []TreeEntry +} + +// TreeEntry entry of a cached Tree +type TreeEntry struct { + // Path component (relative to its parent directory) + Path string + // Entries is the number of entries in the index that is covered by the tree + // this entry represents. + Entries int + // Trees is the number that represents the number of subtrees this tree has + Trees int + // Hash object name for the object that would result from writing this span + // of index as a tree. + Hash plumbing.Hash +} + +// ResolveUndo is used when a conflict is resolved (e.g. with "git add path"), +// these higher stage entries are removed and a stage-0 entry with proper +// resolution is added. When these higher stage entries are removed, they are +// saved in the resolve undo extension. +type ResolveUndo struct { + Entries []ResolveUndoEntry +} + +// ResolveUndoEntry contains the information about a conflict when is resolved +type ResolveUndoEntry struct { + Path string + Stages map[Stage]plumbing.Hash +} + +// EndOfIndexEntry is the End of Index Entry (EOIE) is used to locate the end of +// the variable length index entries and the beginning of the extensions. Code +// can take advantage of this to quickly locate the index extensions without +// having to parse through all of the index entries. +// +// Because it must be able to be loaded before the variable length cache +// entries and other index extensions, this extension must be written last. +type EndOfIndexEntry struct { + // Offset to the end of the index entries + Offset uint32 + // Hash is a SHA-1 over the extension types and their sizes (but not + // their contents). + Hash plumbing.Hash +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/index/match.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/match.go new file mode 100644 index 0000000000..2891d7d34c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/index/match.go @@ -0,0 +1,186 @@ +package index + +import ( + "path/filepath" + "runtime" + "unicode/utf8" +) + +// match is filepath.Match with support to match fullpath and not only filenames +// code from: +// https://github.com/golang/go/blob/39852bf4cce6927e01d0136c7843f65a801738cb/src/path/filepath/match.go#L44-L224 +func match(pattern, name string) (matched bool, err error) { +Pattern: + for len(pattern) > 0 { + var star bool + var chunk string + star, chunk, pattern = scanChunk(pattern) + + // Look for match at current position. + t, ok, err := matchChunk(chunk, name) + // if we're the last chunk, make sure we've exhausted the name + // otherwise we'll give a false result even if we could still match + // using the star + if ok && (len(t) == 0 || len(pattern) > 0) { + name = t + continue + } + if err != nil { + return false, err + } + if star { + // Look for match skipping i+1 bytes. + // Cannot skip /. + for i := 0; i < len(name); i++ { + t, ok, err := matchChunk(chunk, name[i+1:]) + if ok { + // if we're the last chunk, make sure we exhausted the name + if len(pattern) == 0 && len(t) > 0 { + continue + } + name = t + continue Pattern + } + if err != nil { + return false, err + } + } + } + return false, nil + } + return len(name) == 0, nil +} + +// scanChunk gets the next segment of pattern, which is a non-star string +// possibly preceded by a star. +func scanChunk(pattern string) (star bool, chunk, rest string) { + for len(pattern) > 0 && pattern[0] == '*' { + pattern = pattern[1:] + star = true + } + inrange := false + var i int +Scan: + for i = 0; i < len(pattern); i++ { + switch pattern[i] { + case '\\': + if runtime.GOOS != "windows" { + // error check handled in matchChunk: bad pattern. + if i+1 < len(pattern) { + i++ + } + } + case '[': + inrange = true + case ']': + inrange = false + case '*': + if !inrange { + break Scan + } + } + } + return star, pattern[0:i], pattern[i:] +} + +// matchChunk checks whether chunk matches the beginning of s. +// If so, it returns the remainder of s (after the match). +// Chunk is all single-character operators: literals, char classes, and ?. +func matchChunk(chunk, s string) (rest string, ok bool, err error) { + for len(chunk) > 0 { + if len(s) == 0 { + return + } + switch chunk[0] { + case '[': + // character class + r, n := utf8.DecodeRuneInString(s) + s = s[n:] + chunk = chunk[1:] + // We can't end right after '[', we're expecting at least + // a closing bracket and possibly a caret. + if len(chunk) == 0 { + err = filepath.ErrBadPattern + return + } + // possibly negated + negated := chunk[0] == '^' + if negated { + chunk = chunk[1:] + } + // parse all ranges + match := false + nrange := 0 + for { + if len(chunk) > 0 && chunk[0] == ']' && nrange > 0 { + chunk = chunk[1:] + break + } + var lo, hi rune + if lo, chunk, err = getEsc(chunk); err != nil { + return + } + hi = lo + if chunk[0] == '-' { + if hi, chunk, err = getEsc(chunk[1:]); err != nil { + return + } + } + if lo <= r && r <= hi { + match = true + } + nrange++ + } + if match == negated { + return + } + + case '?': + _, n := utf8.DecodeRuneInString(s) + s = s[n:] + chunk = chunk[1:] + + case '\\': + if runtime.GOOS != "windows" { + chunk = chunk[1:] + if len(chunk) == 0 { + err = filepath.ErrBadPattern + return + } + } + fallthrough + + default: + if chunk[0] != s[0] { + return + } + s = s[1:] + chunk = chunk[1:] + } + } + return s, true, nil +} + +// getEsc gets a possibly-escaped character from chunk, for a character class. +func getEsc(chunk string) (r rune, nchunk string, err error) { + if len(chunk) == 0 || chunk[0] == '-' || chunk[0] == ']' { + err = filepath.ErrBadPattern + return + } + if chunk[0] == '\\' && runtime.GOOS != "windows" { + chunk = chunk[1:] + if len(chunk) == 0 { + err = filepath.ErrBadPattern + return + } + } + r, n := utf8.DecodeRuneInString(chunk) + if r == utf8.RuneError && n == 1 { + err = filepath.ErrBadPattern + } + nchunk = chunk[n:] + if len(nchunk) == 0 { + err = filepath.ErrBadPattern + } + return +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/doc.go new file mode 100644 index 0000000000..a7145160ae --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/doc.go @@ -0,0 +1,2 @@ +// Package objfile implements encoding and decoding of object files. +package objfile diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/reader.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/reader.go new file mode 100644 index 0000000000..b6b2ca06dd --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/reader.go @@ -0,0 +1,114 @@ +package objfile + +import ( + "compress/zlib" + "errors" + "io" + "strconv" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/packfile" +) + +var ( + ErrClosed = errors.New("objfile: already closed") + ErrHeader = errors.New("objfile: invalid header") + ErrNegativeSize = errors.New("objfile: negative object size") +) + +// Reader reads and decodes compressed objfile data from a provided io.Reader. +// Reader implements io.ReadCloser. Close should be called when finished with +// the Reader. Close will not close the underlying io.Reader. +type Reader struct { + multi io.Reader + zlib io.ReadCloser + hasher plumbing.Hasher +} + +// NewReader returns a new Reader reading from r. +func NewReader(r io.Reader) (*Reader, error) { + zlib, err := zlib.NewReader(r) + if err != nil { + return nil, packfile.ErrZLib.AddDetails(err.Error()) + } + + return &Reader{ + zlib: zlib, + }, nil +} + +// Header reads the type and the size of object, and prepares the reader for read +func (r *Reader) Header() (t plumbing.ObjectType, size int64, err error) { + var raw []byte + raw, err = r.readUntil(' ') + if err != nil { + return + } + + t, err = plumbing.ParseObjectType(string(raw)) + if err != nil { + return + } + + raw, err = r.readUntil(0) + if err != nil { + return + } + + size, err = strconv.ParseInt(string(raw), 10, 64) + if err != nil { + err = ErrHeader + return + } + + defer r.prepareForRead(t, size) + return +} + +// readSlice reads one byte at a time from r until it encounters delim or an +// error. +func (r *Reader) readUntil(delim byte) ([]byte, error) { + var buf [1]byte + value := make([]byte, 0, 16) + for { + if n, err := r.zlib.Read(buf[:]); err != nil && (err != io.EOF || n == 0) { + if err == io.EOF { + return nil, ErrHeader + } + return nil, err + } + + if buf[0] == delim { + return value, nil + } + + value = append(value, buf[0]) + } +} + +func (r *Reader) prepareForRead(t plumbing.ObjectType, size int64) { + r.hasher = plumbing.NewHasher(t, size) + r.multi = io.TeeReader(r.zlib, r.hasher) +} + +// Read reads len(p) bytes into p from the object data stream. It returns +// the number of bytes read (0 <= n <= len(p)) and any error encountered. Even +// if Read returns n < len(p), it may use all of p as scratch space during the +// call. +// +// If Read encounters the end of the data stream it will return err == io.EOF, +// either in the current call if n > 0 or in a subsequent call. +func (r *Reader) Read(p []byte) (n int, err error) { + return r.multi.Read(p) +} + +// Hash returns the hash of the object data stream that has been read so far. +func (r *Reader) Hash() plumbing.Hash { + return r.hasher.Sum() +} + +// Close releases any resources consumed by the Reader. Calling Close does not +// close the wrapped io.Reader originally passed to NewReader. +func (r *Reader) Close() error { + return r.zlib.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/writer.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/writer.go new file mode 100644 index 0000000000..2a96a4370b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/writer.go @@ -0,0 +1,109 @@ +package objfile + +import ( + "compress/zlib" + "errors" + "io" + "strconv" + + "github.com/go-git/go-git/v5/plumbing" +) + +var ( + ErrOverflow = errors.New("objfile: declared data length exceeded (overflow)") +) + +// Writer writes and encodes data in compressed objfile format to a provided +// io.Writer. Close should be called when finished with the Writer. Close will +// not close the underlying io.Writer. +type Writer struct { + raw io.Writer + zlib io.WriteCloser + hasher plumbing.Hasher + multi io.Writer + + closed bool + pending int64 // number of unwritten bytes +} + +// NewWriter returns a new Writer writing to w. +// +// The returned Writer implements io.WriteCloser. Close should be called when +// finished with the Writer. Close will not close the underlying io.Writer. +func NewWriter(w io.Writer) *Writer { + return &Writer{ + raw: w, + zlib: zlib.NewWriter(w), + } +} + +// WriteHeader writes the type and the size and prepares to accept the object's +// contents. If an invalid t is provided, plumbing.ErrInvalidType is returned. If a +// negative size is provided, ErrNegativeSize is returned. +func (w *Writer) WriteHeader(t plumbing.ObjectType, size int64) error { + if !t.Valid() { + return plumbing.ErrInvalidType + } + if size < 0 { + return ErrNegativeSize + } + + b := t.Bytes() + b = append(b, ' ') + b = append(b, []byte(strconv.FormatInt(size, 10))...) + b = append(b, 0) + + defer w.prepareForWrite(t, size) + _, err := w.zlib.Write(b) + + return err +} + +func (w *Writer) prepareForWrite(t plumbing.ObjectType, size int64) { + w.pending = size + + w.hasher = plumbing.NewHasher(t, size) + w.multi = io.MultiWriter(w.zlib, w.hasher) +} + +// Write writes the object's contents. Write returns the error ErrOverflow if +// more than size bytes are written after WriteHeader. +func (w *Writer) Write(p []byte) (n int, err error) { + if w.closed { + return 0, ErrClosed + } + + overwrite := false + if int64(len(p)) > w.pending { + p = p[0:w.pending] + overwrite = true + } + + n, err = w.multi.Write(p) + w.pending -= int64(n) + if err == nil && overwrite { + err = ErrOverflow + return + } + + return +} + +// Hash returns the hash of the object data stream that has been written so far. +// It can be called before or after Close. +func (w *Writer) Hash() plumbing.Hash { + return w.hasher.Sum() // Not yet closed, return hash of data written so far +} + +// Close releases any resources consumed by the Writer. +// +// Calling Close does not close the wrapped io.Writer originally passed to +// NewWriter. +func (w *Writer) Close() error { + if err := w.zlib.Close(); err != nil { + return err + } + + w.closed = true + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/common.go new file mode 100644 index 0000000000..df423ad50c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/common.go @@ -0,0 +1,78 @@ +package packfile + +import ( + "bytes" + "compress/zlib" + "io" + "sync" + + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var signature = []byte{'P', 'A', 'C', 'K'} + +const ( + // VersionSupported is the packfile version supported by this package + VersionSupported uint32 = 2 + + firstLengthBits = uint8(4) // the first byte into object header has 4 bits to store the length + lengthBits = uint8(7) // subsequent bytes has 7 bits to store the length + maskFirstLength = 15 // 0000 1111 + maskContinue = 0x80 // 1000 0000 + maskLength = uint8(127) // 0111 1111 + maskType = uint8(112) // 0111 0000 +) + +// UpdateObjectStorage updates the storer with the objects in the given +// packfile. +func UpdateObjectStorage(s storer.Storer, packfile io.Reader) error { + if pw, ok := s.(storer.PackfileWriter); ok { + return WritePackfileToObjectStorage(pw, packfile) + } + + p, err := NewParserWithStorage(NewScanner(packfile), s) + if err != nil { + return err + } + + _, err = p.Parse() + return err +} + +// WritePackfileToObjectStorage writes all the packfile objects into the given +// object storage. +func WritePackfileToObjectStorage( + sw storer.PackfileWriter, + packfile io.Reader, +) (err error) { + w, err := sw.PackfileWriter() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + var n int64 + n, err = io.Copy(w, packfile) + if err == nil && n == 0 { + return ErrEmptyPackfile + } + + return err +} + +var bufPool = sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(nil) + }, +} + +var zlibInitBytes = []byte{0x78, 0x9c, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01} + +var zlibReaderPool = sync.Pool{ + New: func() interface{} { + r, _ := zlib.NewReader(bytes.NewReader(zlibInitBytes)) + return r + }, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_index.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_index.go new file mode 100644 index 0000000000..07a61120e5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_index.go @@ -0,0 +1,297 @@ +package packfile + +const blksz = 16 +const maxChainLength = 64 + +// deltaIndex is a modified version of JGit's DeltaIndex adapted to our current +// design. +type deltaIndex struct { + table []int + entries []int + mask int +} + +func (idx *deltaIndex) init(buf []byte) { + scanner := newDeltaIndexScanner(buf, len(buf)) + idx.mask = scanner.mask + idx.table = scanner.table + idx.entries = make([]int, countEntries(scanner)+1) + idx.copyEntries(scanner) +} + +// findMatch returns the offset of src where the block starting at tgtOffset +// is and the length of the match. A length of 0 means there was no match. A +// length of -1 means the src length is lower than the blksz and whatever +// other positive length is the length of the match in bytes. +func (idx *deltaIndex) findMatch(src, tgt []byte, tgtOffset int) (srcOffset, l int) { + if len(tgt) < tgtOffset+s { + return 0, len(tgt) - tgtOffset + } + + if len(src) < blksz { + return 0, -1 + } + + if len(tgt) >= tgtOffset+s && len(src) >= blksz { + h := hashBlock(tgt, tgtOffset) + tIdx := h & idx.mask + eIdx := idx.table[tIdx] + if eIdx != 0 { + srcOffset = idx.entries[eIdx] + } else { + return + } + + l = matchLength(src, tgt, tgtOffset, srcOffset) + } + + return +} + +func matchLength(src, tgt []byte, otgt, osrc int) (l int) { + lensrc := len(src) + lentgt := len(tgt) + for (osrc < lensrc && otgt < lentgt) && src[osrc] == tgt[otgt] { + l++ + osrc++ + otgt++ + } + return +} + +func countEntries(scan *deltaIndexScanner) (cnt int) { + // Figure out exactly how many entries we need. As we do the + // enumeration truncate any delta chains longer than what we + // are willing to scan during encode. This keeps the encode + // logic linear in the size of the input rather than quadratic. + for i := 0; i < len(scan.table); i++ { + h := scan.table[i] + if h == 0 { + continue + } + + size := 0 + for { + size++ + if size == maxChainLength { + scan.next[h] = 0 + break + } + h = scan.next[h] + + if h == 0 { + break + } + } + cnt += size + } + + return +} + +func (idx *deltaIndex) copyEntries(scanner *deltaIndexScanner) { + // Rebuild the entries list from the scanner, positioning all + // blocks in the same hash chain next to each other. We can + // then later discard the next list, along with the scanner. + // + next := 1 + for i := 0; i < len(idx.table); i++ { + h := idx.table[i] + if h == 0 { + continue + } + + idx.table[i] = next + for { + idx.entries[next] = scanner.entries[h] + next++ + h = scanner.next[h] + + if h == 0 { + break + } + } + } +} + +type deltaIndexScanner struct { + table []int + entries []int + next []int + mask int + count int +} + +func newDeltaIndexScanner(buf []byte, size int) *deltaIndexScanner { + size -= size % blksz + worstCaseBlockCnt := size / blksz + if worstCaseBlockCnt < 1 { + return new(deltaIndexScanner) + } + + tableSize := tableSize(worstCaseBlockCnt) + scanner := &deltaIndexScanner{ + table: make([]int, tableSize), + mask: tableSize - 1, + entries: make([]int, worstCaseBlockCnt+1), + next: make([]int, worstCaseBlockCnt+1), + } + + scanner.scan(buf, size) + return scanner +} + +// slightly modified version of JGit's DeltaIndexScanner. We store the offset on the entries +// instead of the entries and the key, so we avoid operations to retrieve the offset later, as +// we don't use the key. +// See: https://github.com/eclipse/jgit/blob/005e5feb4ecd08c4e4d141a38b9e7942accb3212/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/DeltaIndexScanner.java +func (s *deltaIndexScanner) scan(buf []byte, end int) { + lastHash := 0 + ptr := end - blksz + + for { + key := hashBlock(buf, ptr) + tIdx := key & s.mask + head := s.table[tIdx] + if head != 0 && lastHash == key { + s.entries[head] = ptr + } else { + s.count++ + eIdx := s.count + s.entries[eIdx] = ptr + s.next[eIdx] = head + s.table[tIdx] = eIdx + } + + lastHash = key + ptr -= blksz + + if 0 > ptr { + break + } + } +} + +func tableSize(worstCaseBlockCnt int) int { + shift := 32 - leadingZeros(uint32(worstCaseBlockCnt)) + sz := 1 << uint(shift-1) + if sz < worstCaseBlockCnt { + sz <<= 1 + } + return sz +} + +// use https://golang.org/pkg/math/bits/#LeadingZeros32 in the future +func leadingZeros(x uint32) (n int) { + if x >= 1<<16 { + x >>= 16 + n = 16 + } + if x >= 1<<8 { + x >>= 8 + n += 8 + } + n += int(len8tab[x]) + return 32 - n +} + +var len8tab = [256]uint8{ + 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +} + +func hashBlock(raw []byte, ptr int) int { + // The first 4 steps collapse out into a 4 byte big-endian decode, + // with a larger right shift as we combined shift lefts together. + // + hash := ((uint32(raw[ptr]) & 0xff) << 24) | + ((uint32(raw[ptr+1]) & 0xff) << 16) | + ((uint32(raw[ptr+2]) & 0xff) << 8) | + (uint32(raw[ptr+3]) & 0xff) + hash ^= T[hash>>31] + + hash = ((hash << 8) | (uint32(raw[ptr+4]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+5]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+6]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+7]) & 0xff)) ^ T[hash>>23] + + hash = ((hash << 8) | (uint32(raw[ptr+8]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+9]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+10]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+11]) & 0xff)) ^ T[hash>>23] + + hash = ((hash << 8) | (uint32(raw[ptr+12]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+13]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+14]) & 0xff)) ^ T[hash>>23] + hash = ((hash << 8) | (uint32(raw[ptr+15]) & 0xff)) ^ T[hash>>23] + + return int(hash) +} + +var T = []uint32{0x00000000, 0xd4c6b32d, 0x7d4bd577, + 0xa98d665a, 0x2e5119c3, 0xfa97aaee, 0x531accb4, 0x87dc7f99, + 0x5ca23386, 0x886480ab, 0x21e9e6f1, 0xf52f55dc, 0x72f32a45, + 0xa6359968, 0x0fb8ff32, 0xdb7e4c1f, 0x6d82d421, 0xb944670c, + 0x10c90156, 0xc40fb27b, 0x43d3cde2, 0x97157ecf, 0x3e981895, + 0xea5eabb8, 0x3120e7a7, 0xe5e6548a, 0x4c6b32d0, 0x98ad81fd, + 0x1f71fe64, 0xcbb74d49, 0x623a2b13, 0xb6fc983e, 0x0fc31b6f, + 0xdb05a842, 0x7288ce18, 0xa64e7d35, 0x219202ac, 0xf554b181, + 0x5cd9d7db, 0x881f64f6, 0x536128e9, 0x87a79bc4, 0x2e2afd9e, + 0xfaec4eb3, 0x7d30312a, 0xa9f68207, 0x007be45d, 0xd4bd5770, + 0x6241cf4e, 0xb6877c63, 0x1f0a1a39, 0xcbcca914, 0x4c10d68d, + 0x98d665a0, 0x315b03fa, 0xe59db0d7, 0x3ee3fcc8, 0xea254fe5, + 0x43a829bf, 0x976e9a92, 0x10b2e50b, 0xc4745626, 0x6df9307c, + 0xb93f8351, 0x1f8636de, 0xcb4085f3, 0x62cde3a9, 0xb60b5084, + 0x31d72f1d, 0xe5119c30, 0x4c9cfa6a, 0x985a4947, 0x43240558, + 0x97e2b675, 0x3e6fd02f, 0xeaa96302, 0x6d751c9b, 0xb9b3afb6, + 0x103ec9ec, 0xc4f87ac1, 0x7204e2ff, 0xa6c251d2, 0x0f4f3788, + 0xdb8984a5, 0x5c55fb3c, 0x88934811, 0x211e2e4b, 0xf5d89d66, + 0x2ea6d179, 0xfa606254, 0x53ed040e, 0x872bb723, 0x00f7c8ba, + 0xd4317b97, 0x7dbc1dcd, 0xa97aaee0, 0x10452db1, 0xc4839e9c, + 0x6d0ef8c6, 0xb9c84beb, 0x3e143472, 0xead2875f, 0x435fe105, + 0x97995228, 0x4ce71e37, 0x9821ad1a, 0x31accb40, 0xe56a786d, + 0x62b607f4, 0xb670b4d9, 0x1ffdd283, 0xcb3b61ae, 0x7dc7f990, + 0xa9014abd, 0x008c2ce7, 0xd44a9fca, 0x5396e053, 0x8750537e, + 0x2edd3524, 0xfa1b8609, 0x2165ca16, 0xf5a3793b, 0x5c2e1f61, + 0x88e8ac4c, 0x0f34d3d5, 0xdbf260f8, 0x727f06a2, 0xa6b9b58f, + 0x3f0c6dbc, 0xebcade91, 0x4247b8cb, 0x96810be6, 0x115d747f, + 0xc59bc752, 0x6c16a108, 0xb8d01225, 0x63ae5e3a, 0xb768ed17, + 0x1ee58b4d, 0xca233860, 0x4dff47f9, 0x9939f4d4, 0x30b4928e, + 0xe47221a3, 0x528eb99d, 0x86480ab0, 0x2fc56cea, 0xfb03dfc7, + 0x7cdfa05e, 0xa8191373, 0x01947529, 0xd552c604, 0x0e2c8a1b, + 0xdaea3936, 0x73675f6c, 0xa7a1ec41, 0x207d93d8, 0xf4bb20f5, + 0x5d3646af, 0x89f0f582, 0x30cf76d3, 0xe409c5fe, 0x4d84a3a4, + 0x99421089, 0x1e9e6f10, 0xca58dc3d, 0x63d5ba67, 0xb713094a, + 0x6c6d4555, 0xb8abf678, 0x11269022, 0xc5e0230f, 0x423c5c96, + 0x96faefbb, 0x3f7789e1, 0xebb13acc, 0x5d4da2f2, 0x898b11df, + 0x20067785, 0xf4c0c4a8, 0x731cbb31, 0xa7da081c, 0x0e576e46, + 0xda91dd6b, 0x01ef9174, 0xd5292259, 0x7ca44403, 0xa862f72e, + 0x2fbe88b7, 0xfb783b9a, 0x52f55dc0, 0x8633eeed, 0x208a5b62, + 0xf44ce84f, 0x5dc18e15, 0x89073d38, 0x0edb42a1, 0xda1df18c, + 0x739097d6, 0xa75624fb, 0x7c2868e4, 0xa8eedbc9, 0x0163bd93, + 0xd5a50ebe, 0x52797127, 0x86bfc20a, 0x2f32a450, 0xfbf4177d, + 0x4d088f43, 0x99ce3c6e, 0x30435a34, 0xe485e919, 0x63599680, + 0xb79f25ad, 0x1e1243f7, 0xcad4f0da, 0x11aabcc5, 0xc56c0fe8, + 0x6ce169b2, 0xb827da9f, 0x3ffba506, 0xeb3d162b, 0x42b07071, + 0x9676c35c, 0x2f49400d, 0xfb8ff320, 0x5202957a, 0x86c42657, + 0x011859ce, 0xd5deeae3, 0x7c538cb9, 0xa8953f94, 0x73eb738b, + 0xa72dc0a6, 0x0ea0a6fc, 0xda6615d1, 0x5dba6a48, 0x897cd965, + 0x20f1bf3f, 0xf4370c12, 0x42cb942c, 0x960d2701, 0x3f80415b, + 0xeb46f276, 0x6c9a8def, 0xb85c3ec2, 0x11d15898, 0xc517ebb5, + 0x1e69a7aa, 0xcaaf1487, 0x632272dd, 0xb7e4c1f0, 0x3038be69, + 0xe4fe0d44, 0x4d736b1e, 0x99b5d833, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_selector.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_selector.go new file mode 100644 index 0000000000..4b60ff3947 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_selector.go @@ -0,0 +1,369 @@ +package packfile + +import ( + "sort" + "sync" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +const ( + // deltas based on deltas, how many steps we can do. + // 50 is the default value used in JGit + maxDepth = int64(50) +) + +// applyDelta is the set of object types that we should apply deltas +var applyDelta = map[plumbing.ObjectType]bool{ + plumbing.BlobObject: true, + plumbing.TreeObject: true, +} + +type deltaSelector struct { + storer storer.EncodedObjectStorer +} + +func newDeltaSelector(s storer.EncodedObjectStorer) *deltaSelector { + return &deltaSelector{s} +} + +// ObjectsToPack creates a list of ObjectToPack from the hashes +// provided, creating deltas if it's suitable, using an specific +// internal logic. `packWindow` specifies the size of the sliding +// window used to compare objects for delta compression; 0 turns off +// delta compression entirely. +func (dw *deltaSelector) ObjectsToPack( + hashes []plumbing.Hash, + packWindow uint, +) ([]*ObjectToPack, error) { + otp, err := dw.objectsToPack(hashes, packWindow) + if err != nil { + return nil, err + } + + if packWindow == 0 { + return otp, nil + } + + dw.sort(otp) + + var objectGroups [][]*ObjectToPack + var prev *ObjectToPack + i := -1 + for _, obj := range otp { + if prev == nil || prev.Type() != obj.Type() { + objectGroups = append(objectGroups, []*ObjectToPack{obj}) + i++ + prev = obj + } else { + objectGroups[i] = append(objectGroups[i], obj) + } + } + + var wg sync.WaitGroup + var once sync.Once + for _, objs := range objectGroups { + objs := objs + wg.Add(1) + go func() { + if walkErr := dw.walk(objs, packWindow); walkErr != nil { + once.Do(func() { + err = walkErr + }) + } + wg.Done() + }() + } + wg.Wait() + + if err != nil { + return nil, err + } + + return otp, nil +} + +func (dw *deltaSelector) objectsToPack( + hashes []plumbing.Hash, + packWindow uint, +) ([]*ObjectToPack, error) { + var objectsToPack []*ObjectToPack + for _, h := range hashes { + var o plumbing.EncodedObject + var err error + if packWindow == 0 { + o, err = dw.encodedObject(h) + } else { + o, err = dw.encodedDeltaObject(h) + } + if err != nil { + return nil, err + } + + otp := newObjectToPack(o) + if _, ok := o.(plumbing.DeltaObject); ok { + otp.CleanOriginal() + } + + objectsToPack = append(objectsToPack, otp) + } + + if packWindow == 0 { + return objectsToPack, nil + } + + if err := dw.fixAndBreakChains(objectsToPack); err != nil { + return nil, err + } + + return objectsToPack, nil +} + +func (dw *deltaSelector) encodedDeltaObject(h plumbing.Hash) (plumbing.EncodedObject, error) { + edos, ok := dw.storer.(storer.DeltaObjectStorer) + if !ok { + return dw.encodedObject(h) + } + + return edos.DeltaObject(plumbing.AnyObject, h) +} + +func (dw *deltaSelector) encodedObject(h plumbing.Hash) (plumbing.EncodedObject, error) { + return dw.storer.EncodedObject(plumbing.AnyObject, h) +} + +func (dw *deltaSelector) fixAndBreakChains(objectsToPack []*ObjectToPack) error { + m := make(map[plumbing.Hash]*ObjectToPack, len(objectsToPack)) + for _, otp := range objectsToPack { + m[otp.Hash()] = otp + } + + for _, otp := range objectsToPack { + if err := dw.fixAndBreakChainsOne(m, otp); err != nil { + return err + } + } + + return nil +} + +func (dw *deltaSelector) fixAndBreakChainsOne(objectsToPack map[plumbing.Hash]*ObjectToPack, otp *ObjectToPack) error { + if !otp.Object.Type().IsDelta() { + return nil + } + + // Initial ObjectToPack instances might have a delta assigned to Object + // but no actual base initially. Once Base is assigned to a delta, it means + // we already fixed it. + if otp.Base != nil { + return nil + } + + do, ok := otp.Object.(plumbing.DeltaObject) + if !ok { + // if this is not a DeltaObject, then we cannot retrieve its base, + // so we have to break the delta chain here. + return dw.undeltify(otp) + } + + base, ok := objectsToPack[do.BaseHash()] + if !ok { + // The base of the delta is not in our list of objects to pack, so + // we break the chain. + return dw.undeltify(otp) + } + + if err := dw.fixAndBreakChainsOne(objectsToPack, base); err != nil { + return err + } + + otp.SetDelta(base, otp.Object) + return nil +} + +func (dw *deltaSelector) restoreOriginal(otp *ObjectToPack) error { + if otp.Original != nil { + return nil + } + + if !otp.Object.Type().IsDelta() { + return nil + } + + obj, err := dw.encodedObject(otp.Hash()) + if err != nil { + return err + } + + otp.SetOriginal(obj) + + return nil +} + +// undeltify undeltifies an *ObjectToPack by retrieving the original object from +// the storer and resetting it. +func (dw *deltaSelector) undeltify(otp *ObjectToPack) error { + if err := dw.restoreOriginal(otp); err != nil { + return err + } + + otp.Object = otp.Original + otp.Depth = 0 + return nil +} + +func (dw *deltaSelector) sort(objectsToPack []*ObjectToPack) { + sort.Sort(byTypeAndSize(objectsToPack)) +} + +func (dw *deltaSelector) walk( + objectsToPack []*ObjectToPack, + packWindow uint, +) error { + indexMap := make(map[plumbing.Hash]*deltaIndex) + for i := 0; i < len(objectsToPack); i++ { + // Clean up the index map and reconstructed delta objects for anything + // outside our pack window, to save memory. + if i > int(packWindow) { + obj := objectsToPack[i-int(packWindow)] + + delete(indexMap, obj.Hash()) + + if obj.IsDelta() { + obj.SaveOriginalMetadata() + obj.CleanOriginal() + } + } + + target := objectsToPack[i] + + // If we already have a delta, we don't try to find a new one for this + // object. This happens when a delta is set to be reused from an existing + // packfile. + if target.IsDelta() { + continue + } + + // We only want to create deltas from specific types. + if !applyDelta[target.Type()] { + continue + } + + for j := i - 1; j >= 0 && i-j < int(packWindow); j-- { + base := objectsToPack[j] + // Objects must use only the same type as their delta base. + // Since objectsToPack is sorted by type and size, once we find + // a different type, we know we won't find more of them. + if base.Type() != target.Type() { + break + } + + if err := dw.tryToDeltify(indexMap, base, target); err != nil { + return err + } + } + } + + return nil +} + +func (dw *deltaSelector) tryToDeltify(indexMap map[plumbing.Hash]*deltaIndex, base, target *ObjectToPack) error { + // Original object might not be present if we're reusing a delta, so we + // ensure it is restored. + if err := dw.restoreOriginal(target); err != nil { + return err + } + + if err := dw.restoreOriginal(base); err != nil { + return err + } + + // If the sizes are radically different, this is a bad pairing. + if target.Size() < base.Size()>>4 { + return nil + } + + msz := dw.deltaSizeLimit( + target.Object.Size(), + base.Depth, + target.Depth, + target.IsDelta(), + ) + + // Nearly impossible to fit useful delta. + if msz <= 8 { + return nil + } + + // If we have to insert a lot to make this work, find another. + if base.Size()-target.Size() > msz { + return nil + } + + if _, ok := indexMap[base.Hash()]; !ok { + indexMap[base.Hash()] = new(deltaIndex) + } + + // Now we can generate the delta using originals + delta, err := getDelta(indexMap[base.Hash()], base.Original, target.Original) + if err != nil { + return err + } + + // if delta better than target + if delta.Size() < msz { + target.SetDelta(base, delta) + } + + return nil +} + +func (dw *deltaSelector) deltaSizeLimit(targetSize int64, baseDepth int, + targetDepth int, targetDelta bool) int64 { + if !targetDelta { + // Any delta should be no more than 50% of the original size + // (for text files deflate of whole form should shrink 50%). + n := targetSize >> 1 + + // Evenly distribute delta size limits over allowed depth. + // If src is non-delta (depth = 0), delta <= 50% of original. + // If src is almost at limit (9/10), delta <= 10% of original. + return n * (maxDepth - int64(baseDepth)) / maxDepth + } + + // With a delta base chosen any new delta must be "better". + // Retain the distribution described above. + d := int64(targetDepth) + n := targetSize + + // If target depth is bigger than maxDepth, this delta is not suitable to be used. + if d >= maxDepth { + return 0 + } + + // If src is whole (depth=0) and base is near limit (depth=9/10) + // any delta using src can be 10x larger and still be better. + // + // If src is near limit (depth=9/10) and base is whole (depth=0) + // a new delta dependent on src must be 1/10th the size. + return n * (maxDepth - int64(baseDepth)) / (maxDepth - d) +} + +type byTypeAndSize []*ObjectToPack + +func (a byTypeAndSize) Len() int { return len(a) } + +func (a byTypeAndSize) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func (a byTypeAndSize) Less(i, j int) bool { + if a[i].Type() < a[j].Type() { + return false + } + + if a[i].Type() > a[j].Type() { + return true + } + + return a[i].Size() > a[j].Size() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/diff_delta.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/diff_delta.go new file mode 100644 index 0000000000..1951b34ef1 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/diff_delta.go @@ -0,0 +1,204 @@ +package packfile + +import ( + "bytes" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// See https://github.com/jelmer/dulwich/blob/master/dulwich/pack.py and +// https://github.com/tarruda/node-git-core/blob/master/src/js/delta.js +// for more info + +const ( + // Standard chunk size used to generate fingerprints + s = 16 + + // https://github.com/git/git/blob/f7466e94375b3be27f229c78873f0acf8301c0a5/diff-delta.c#L428 + // Max size of a copy operation (64KB) + maxCopySize = 64 * 1024 +) + +// GetDelta returns an EncodedObject of type OFSDeltaObject. Base and Target object, +// will be loaded into memory to be able to create the delta object. +// To generate target again, you will need the obtained object and "base" one. +// Error will be returned if base or target object cannot be read. +func GetDelta(base, target plumbing.EncodedObject) (plumbing.EncodedObject, error) { + return getDelta(new(deltaIndex), base, target) +} + +func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (o plumbing.EncodedObject, err error) { + br, err := base.Reader() + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(br, &err) + + tr, err := target.Reader() + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(tr, &err) + + bb := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(bb) + bb.Reset() + + _, err = bb.ReadFrom(br) + if err != nil { + return nil, err + } + + tb := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(tb) + tb.Reset() + + _, err = tb.ReadFrom(tr) + if err != nil { + return nil, err + } + + db := diffDelta(index, bb.Bytes(), tb.Bytes()) + delta := &plumbing.MemoryObject{} + _, err = delta.Write(db) + if err != nil { + return nil, err + } + + delta.SetSize(int64(len(db))) + delta.SetType(plumbing.OFSDeltaObject) + + return delta, nil +} + +// DiffDelta returns the delta that transforms src into tgt. +func DiffDelta(src, tgt []byte) []byte { + return diffDelta(new(deltaIndex), src, tgt) +} + +func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte { + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + buf.Write(deltaEncodeSize(len(src))) + buf.Write(deltaEncodeSize(len(tgt))) + + if len(index.entries) == 0 { + index.init(src) + } + + ibuf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(ibuf) + ibuf.Reset() + for i := 0; i < len(tgt); i++ { + offset, l := index.findMatch(src, tgt, i) + + if l == 0 { + // couldn't find a match, just write the current byte and continue + ibuf.WriteByte(tgt[i]) + } else if l < 0 { + // src is less than blksz, copy the rest of the target to avoid + // calls to findMatch + for ; i < len(tgt); i++ { + ibuf.WriteByte(tgt[i]) + } + } else if l < s { + // remaining target is less than blksz, copy what's left of it + // and avoid calls to findMatch + for j := i; j < i+l; j++ { + ibuf.WriteByte(tgt[j]) + } + i += l - 1 + } else { + encodeInsertOperation(ibuf, buf) + + rl := l + aOffset := offset + for rl > 0 { + if rl < maxCopySize { + buf.Write(encodeCopyOperation(aOffset, rl)) + break + } + + buf.Write(encodeCopyOperation(aOffset, maxCopySize)) + rl -= maxCopySize + aOffset += maxCopySize + } + + i += l - 1 + } + } + + encodeInsertOperation(ibuf, buf) + + // buf.Bytes() is only valid until the next modifying operation on the buffer. Copy it. + return append([]byte{}, buf.Bytes()...) +} + +func encodeInsertOperation(ibuf, buf *bytes.Buffer) { + if ibuf.Len() == 0 { + return + } + + b := ibuf.Bytes() + s := ibuf.Len() + o := 0 + for { + if s <= 127 { + break + } + buf.WriteByte(byte(127)) + buf.Write(b[o : o+127]) + s -= 127 + o += 127 + } + buf.WriteByte(byte(s)) + buf.Write(b[o : o+s]) + + ibuf.Reset() +} + +func deltaEncodeSize(size int) []byte { + var ret []byte + c := size & 0x7f + size >>= 7 + for { + if size == 0 { + break + } + + ret = append(ret, byte(c|0x80)) + c = size & 0x7f + size >>= 7 + } + ret = append(ret, byte(c)) + + return ret +} + +func encodeCopyOperation(offset, length int) []byte { + code := 0x80 + var opcodes []byte + + var i uint + for i = 0; i < 4; i++ { + f := 0xff << (i * 8) + if offset&f != 0 { + opcodes = append(opcodes, byte(offset&f>>(i*8))) + code |= 0x01 << i + } + } + + for i = 0; i < 3; i++ { + f := 0xff << (i * 8) + if length&f != 0 { + opcodes = append(opcodes, byte(length&f>>(i*8))) + code |= 0x10 << i + } + } + + return append([]byte{byte(code)}, opcodes...) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/doc.go new file mode 100644 index 0000000000..2882a7f378 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/doc.go @@ -0,0 +1,39 @@ +// Package packfile implements encoding and decoding of packfile format. +// +// == pack-*.pack files have the following format: +// +// - A header appears at the beginning and consists of the following: +// +// 4-byte signature: +// The signature is: {'P', 'A', 'C', 'K'} +// +// 4-byte version number (network byte order): +// GIT currently accepts version number 2 or 3 but +// generates version 2 only. +// +// 4-byte number of objects contained in the pack (network byte order) +// +// Observation: we cannot have more than 4G versions ;-) and +// more than 4G objects in a pack. +// +// - The header is followed by number of object entries, each of +// which looks like this: +// +// (undeltified representation) +// n-byte type and length (3-bit type, (n-1)*7+4-bit length) +// compressed data +// +// (deltified representation) +// n-byte type and length (3-bit type, (n-1)*7+4-bit length) +// 20-byte base object name +// compressed delta data +// +// Observation: length of each object is encoded in a variable +// length format and is not constrained to 32-bit or anything. +// +// - The trailer records 20-byte SHA1 checksum of all of the above. +// +// +// Source: +// https://www.kernel.org/pub/software/scm/git/docs/v1.7.5/technical/pack-protocol.txt +package packfile diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go new file mode 100644 index 0000000000..5501f8861c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go @@ -0,0 +1,225 @@ +package packfile + +import ( + "compress/zlib" + "crypto/sha1" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/binary" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// Encoder gets the data from the storage and write it into the writer in PACK +// format +type Encoder struct { + selector *deltaSelector + w *offsetWriter + zw *zlib.Writer + hasher plumbing.Hasher + + useRefDeltas bool +} + +// NewEncoder creates a new packfile encoder using a specific Writer and +// EncodedObjectStorer. By default deltas used to generate the packfile will be +// OFSDeltaObject. To use Reference deltas, set useRefDeltas to true. +func NewEncoder(w io.Writer, s storer.EncodedObjectStorer, useRefDeltas bool) *Encoder { + h := plumbing.Hasher{ + Hash: sha1.New(), + } + mw := io.MultiWriter(w, h) + ow := newOffsetWriter(mw) + zw := zlib.NewWriter(mw) + return &Encoder{ + selector: newDeltaSelector(s), + w: ow, + zw: zw, + hasher: h, + useRefDeltas: useRefDeltas, + } +} + +// Encode creates a packfile containing all the objects referenced in +// hashes and writes it to the writer in the Encoder. `packWindow` +// specifies the size of the sliding window used to compare objects +// for delta compression; 0 turns off delta compression entirely. +func (e *Encoder) Encode( + hashes []plumbing.Hash, + packWindow uint, +) (plumbing.Hash, error) { + objects, err := e.selector.ObjectsToPack(hashes, packWindow) + if err != nil { + return plumbing.ZeroHash, err + } + + return e.encode(objects) +} + +func (e *Encoder) encode(objects []*ObjectToPack) (plumbing.Hash, error) { + if err := e.head(len(objects)); err != nil { + return plumbing.ZeroHash, err + } + + for _, o := range objects { + if err := e.entry(o); err != nil { + return plumbing.ZeroHash, err + } + } + + return e.footer() +} + +func (e *Encoder) head(numEntries int) error { + return binary.Write( + e.w, + signature, + int32(VersionSupported), + int32(numEntries), + ) +} + +func (e *Encoder) entry(o *ObjectToPack) (err error) { + if o.WantWrite() { + // A cycle exists in this delta chain. This should only occur if a + // selected object representation disappeared during writing + // (for example due to a concurrent repack) and a different base + // was chosen, forcing a cycle. Select something other than a + // delta, and write this object. + e.selector.restoreOriginal(o) + o.BackToOriginal() + } + + if o.IsWritten() { + return nil + } + + o.MarkWantWrite() + + if err := e.writeBaseIfDelta(o); err != nil { + return err + } + + // We need to check if we already write that object due a cyclic delta chain + if o.IsWritten() { + return nil + } + + o.Offset = e.w.Offset() + + if o.IsDelta() { + if err := e.writeDeltaHeader(o); err != nil { + return err + } + } else { + if err := e.entryHead(o.Type(), o.Size()); err != nil { + return err + } + } + + e.zw.Reset(e.w) + + defer ioutil.CheckClose(e.zw, &err) + + or, err := o.Object.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(or, &err) + + _, err = io.Copy(e.zw, or) + if err != nil { + return err + } + + return nil +} + +func (e *Encoder) writeBaseIfDelta(o *ObjectToPack) error { + if o.IsDelta() && !o.Base.IsWritten() { + // We must write base first + return e.entry(o.Base) + } + + return nil +} + +func (e *Encoder) writeDeltaHeader(o *ObjectToPack) error { + // Write offset deltas by default + t := plumbing.OFSDeltaObject + if e.useRefDeltas { + t = plumbing.REFDeltaObject + } + + if err := e.entryHead(t, o.Object.Size()); err != nil { + return err + } + + if e.useRefDeltas { + return e.writeRefDeltaHeader(o.Base.Hash()) + } else { + return e.writeOfsDeltaHeader(o) + } +} + +func (e *Encoder) writeRefDeltaHeader(base plumbing.Hash) error { + return binary.Write(e.w, base) +} + +func (e *Encoder) writeOfsDeltaHeader(o *ObjectToPack) error { + // for OFS_DELTA, offset of the base is interpreted as negative offset + // relative to the type-byte of the header of the ofs-delta entry. + relativeOffset := o.Offset - o.Base.Offset + if relativeOffset <= 0 { + return fmt.Errorf("bad offset for OFS_DELTA entry: %d", relativeOffset) + } + + return binary.WriteVariableWidthInt(e.w, relativeOffset) +} + +func (e *Encoder) entryHead(typeNum plumbing.ObjectType, size int64) error { + t := int64(typeNum) + header := []byte{} + c := (t << firstLengthBits) | (size & maskFirstLength) + size >>= firstLengthBits + for { + if size == 0 { + break + } + header = append(header, byte(c|maskContinue)) + c = size & int64(maskLength) + size >>= lengthBits + } + + header = append(header, byte(c)) + _, err := e.w.Write(header) + + return err +} + +func (e *Encoder) footer() (plumbing.Hash, error) { + h := e.hasher.Sum() + return h, binary.Write(e.w, h) +} + +type offsetWriter struct { + w io.Writer + offset int64 +} + +func newOffsetWriter(w io.Writer) *offsetWriter { + return &offsetWriter{w: w} +} + +func (ow *offsetWriter) Write(p []byte) (n int, err error) { + n, err = ow.w.Write(p) + ow.offset += int64(n) + return n, err +} + +func (ow *offsetWriter) Offset() int64 { + return ow.offset +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/error.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/error.go new file mode 100644 index 0000000000..c0b9163313 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/error.go @@ -0,0 +1,30 @@ +package packfile + +import "fmt" + +// Error specifies errors returned during packfile parsing. +type Error struct { + reason, details string +} + +// NewError returns a new error. +func NewError(reason string) *Error { + return &Error{reason: reason} +} + +// Error returns a text representation of the error. +func (e *Error) Error() string { + if e.details == "" { + return e.reason + } + + return fmt.Sprintf("%s: %s", e.reason, e.details) +} + +// AddDetails adds details to an error, with additional text. +func (e *Error) AddDetails(format string, args ...interface{}) *Error { + return &Error{ + reason: e.reason, + details: fmt.Sprintf(format, args...), + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/fsobject.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/fsobject.go new file mode 100644 index 0000000000..c5edaf52ee --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/fsobject.go @@ -0,0 +1,116 @@ +package packfile + +import ( + "io" + + billy "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/idxfile" +) + +// FSObject is an object from the packfile on the filesystem. +type FSObject struct { + hash plumbing.Hash + h *ObjectHeader + offset int64 + size int64 + typ plumbing.ObjectType + index idxfile.Index + fs billy.Filesystem + path string + cache cache.Object +} + +// NewFSObject creates a new filesystem object. +func NewFSObject( + hash plumbing.Hash, + finalType plumbing.ObjectType, + offset int64, + contentSize int64, + index idxfile.Index, + fs billy.Filesystem, + path string, + cache cache.Object, +) *FSObject { + return &FSObject{ + hash: hash, + offset: offset, + size: contentSize, + typ: finalType, + index: index, + fs: fs, + path: path, + cache: cache, + } +} + +// Reader implements the plumbing.EncodedObject interface. +func (o *FSObject) Reader() (io.ReadCloser, error) { + obj, ok := o.cache.Get(o.hash) + if ok && obj != o { + reader, err := obj.Reader() + if err != nil { + return nil, err + } + + return reader, nil + } + + f, err := o.fs.Open(o.path) + if err != nil { + return nil, err + } + + p := NewPackfileWithCache(o.index, nil, f, o.cache) + r, err := p.getObjectContent(o.offset) + if err != nil { + _ = f.Close() + return nil, err + } + + if err := f.Close(); err != nil { + return nil, err + } + + return r, nil +} + +// SetSize implements the plumbing.EncodedObject interface. This method +// is a noop. +func (o *FSObject) SetSize(int64) {} + +// SetType implements the plumbing.EncodedObject interface. This method is +// a noop. +func (o *FSObject) SetType(plumbing.ObjectType) {} + +// Hash implements the plumbing.EncodedObject interface. +func (o *FSObject) Hash() plumbing.Hash { return o.hash } + +// Size implements the plumbing.EncodedObject interface. +func (o *FSObject) Size() int64 { return o.size } + +// Type implements the plumbing.EncodedObject interface. +func (o *FSObject) Type() plumbing.ObjectType { + return o.typ +} + +// Writer implements the plumbing.EncodedObject interface. This method always +// returns a nil writer. +func (o *FSObject) Writer() (io.WriteCloser, error) { + return nil, nil +} + +type objectReader struct { + io.ReadCloser + f billy.File +} + +func (r *objectReader) Close() error { + if err := r.ReadCloser.Close(); err != nil { + _ = r.f.Close() + return err + } + + return r.f.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/object_pack.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/object_pack.go new file mode 100644 index 0000000000..8ce29ef8ba --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/object_pack.go @@ -0,0 +1,164 @@ +package packfile + +import ( + "github.com/go-git/go-git/v5/plumbing" +) + +// ObjectToPack is a representation of an object that is going to be into a +// pack file. +type ObjectToPack struct { + // The main object to pack, it could be any object, including deltas + Object plumbing.EncodedObject + // Base is the object that a delta is based on (it could be also another delta). + // If the main object is not a delta, Base will be null + Base *ObjectToPack + // Original is the object that we can generate applying the delta to + // Base, or the same object as Object in the case of a non-delta + // object. + Original plumbing.EncodedObject + // Depth is the amount of deltas needed to resolve to obtain Original + // (delta based on delta based on ...) + Depth int + + // offset in pack when object has been already written, or 0 if it + // has not been written yet + Offset int64 + + // Information from the original object + resolvedOriginal bool + originalType plumbing.ObjectType + originalSize int64 + originalHash plumbing.Hash +} + +// newObjectToPack creates a correct ObjectToPack based on a non-delta object +func newObjectToPack(o plumbing.EncodedObject) *ObjectToPack { + return &ObjectToPack{ + Object: o, + Original: o, + } +} + +// newDeltaObjectToPack creates a correct ObjectToPack for a delta object, based on +// his base (could be another delta), the delta target (in this case called original), +// and the delta Object itself +func newDeltaObjectToPack(base *ObjectToPack, original, delta plumbing.EncodedObject) *ObjectToPack { + return &ObjectToPack{ + Object: delta, + Base: base, + Original: original, + Depth: base.Depth + 1, + } +} + +// BackToOriginal converts that ObjectToPack to a non-deltified object if it was one +func (o *ObjectToPack) BackToOriginal() { + if o.IsDelta() && o.Original != nil { + o.Object = o.Original + o.Base = nil + o.Depth = 0 + } +} + +// IsWritten returns if that ObjectToPack was +// already written into the packfile or not +func (o *ObjectToPack) IsWritten() bool { + return o.Offset > 1 +} + +// MarkWantWrite marks this ObjectToPack as WantWrite +// to avoid delta chain loops +func (o *ObjectToPack) MarkWantWrite() { + o.Offset = 1 +} + +// WantWrite checks if this ObjectToPack was marked as WantWrite before +func (o *ObjectToPack) WantWrite() bool { + return o.Offset == 1 +} + +// SetOriginal sets both Original and saves size, type and hash. If object +// is nil Original is set but previous resolved values are kept +func (o *ObjectToPack) SetOriginal(obj plumbing.EncodedObject) { + o.Original = obj + o.SaveOriginalMetadata() +} + +// SaveOriginalMetadata saves size, type and hash of Original object +func (o *ObjectToPack) SaveOriginalMetadata() { + if o.Original != nil { + o.originalSize = o.Original.Size() + o.originalType = o.Original.Type() + o.originalHash = o.Original.Hash() + o.resolvedOriginal = true + } +} + +// CleanOriginal sets Original to nil +func (o *ObjectToPack) CleanOriginal() { + o.Original = nil +} + +func (o *ObjectToPack) Type() plumbing.ObjectType { + if o.Original != nil { + return o.Original.Type() + } + + if o.resolvedOriginal { + return o.originalType + } + + if o.Base != nil { + return o.Base.Type() + } + + if o.Object != nil { + return o.Object.Type() + } + + panic("cannot get type") +} + +func (o *ObjectToPack) Hash() plumbing.Hash { + if o.Original != nil { + return o.Original.Hash() + } + + if o.resolvedOriginal { + return o.originalHash + } + + do, ok := o.Object.(plumbing.DeltaObject) + if ok { + return do.ActualHash() + } + + panic("cannot get hash") +} + +func (o *ObjectToPack) Size() int64 { + if o.Original != nil { + return o.Original.Size() + } + + if o.resolvedOriginal { + return o.originalSize + } + + do, ok := o.Object.(plumbing.DeltaObject) + if ok { + return do.ActualSize() + } + + panic("cannot get ObjectToPack size") +} + +func (o *ObjectToPack) IsDelta() bool { + return o.Base != nil +} + +func (o *ObjectToPack) SetDelta(base *ObjectToPack, delta plumbing.EncodedObject) { + o.Object = delta + o.Base = base + o.Depth = base.Depth + 1 +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/packfile.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/packfile.go new file mode 100644 index 0000000000..ddd7f62fce --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/packfile.go @@ -0,0 +1,565 @@ +package packfile + +import ( + "bytes" + "io" + "os" + + billy "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/idxfile" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var ( + // ErrInvalidObject is returned by Decode when an invalid object is + // found in the packfile. + ErrInvalidObject = NewError("invalid git object") + // ErrZLib is returned by Decode when there was an error unzipping + // the packfile contents. + ErrZLib = NewError("zlib reading error") +) + +// When reading small objects from packfile it is beneficial to do so at +// once to exploit the buffered I/O. In many cases the objects are so small +// that they were already loaded to memory when the object header was +// loaded from the packfile. Wrapping in FSObject would cause this buffered +// data to be thrown away and then re-read later, with the additional +// seeking causing reloads from disk. Objects smaller than this threshold +// are now always read into memory and stored in cache instead of being +// wrapped in FSObject. +const smallObjectThreshold = 16 * 1024 + +// Packfile allows retrieving information from inside a packfile. +type Packfile struct { + idxfile.Index + fs billy.Filesystem + file billy.File + s *Scanner + deltaBaseCache cache.Object + offsetToType map[int64]plumbing.ObjectType +} + +// NewPackfileWithCache creates a new Packfile with the given object cache. +// If the filesystem is provided, the packfile will return FSObjects, otherwise +// it will return MemoryObjects. +func NewPackfileWithCache( + index idxfile.Index, + fs billy.Filesystem, + file billy.File, + cache cache.Object, +) *Packfile { + s := NewScanner(file) + return &Packfile{ + index, + fs, + file, + s, + cache, + make(map[int64]plumbing.ObjectType), + } +} + +// NewPackfile returns a packfile representation for the given packfile file +// and packfile idx. +// If the filesystem is provided, the packfile will return FSObjects, otherwise +// it will return MemoryObjects. +func NewPackfile(index idxfile.Index, fs billy.Filesystem, file billy.File) *Packfile { + return NewPackfileWithCache(index, fs, file, cache.NewObjectLRUDefault()) +} + +// Get retrieves the encoded object in the packfile with the given hash. +func (p *Packfile) Get(h plumbing.Hash) (plumbing.EncodedObject, error) { + offset, err := p.FindOffset(h) + if err != nil { + return nil, err + } + + return p.objectAtOffset(offset, h) +} + +// GetByOffset retrieves the encoded object from the packfile at the given +// offset. +func (p *Packfile) GetByOffset(o int64) (plumbing.EncodedObject, error) { + hash, err := p.FindHash(o) + if err != nil { + return nil, err + } + + return p.objectAtOffset(o, hash) +} + +// GetSizeByOffset retrieves the size of the encoded object from the +// packfile with the given offset. +func (p *Packfile) GetSizeByOffset(o int64) (size int64, err error) { + if _, err := p.s.SeekFromStart(o); err != nil { + if err == io.EOF || isInvalid(err) { + return 0, plumbing.ErrObjectNotFound + } + + return 0, err + } + + h, err := p.nextObjectHeader() + if err != nil { + return 0, err + } + return p.getObjectSize(h) +} + +func (p *Packfile) objectHeaderAtOffset(offset int64) (*ObjectHeader, error) { + h, err := p.s.SeekObjectHeader(offset) + p.s.pendingObject = nil + return h, err +} + +func (p *Packfile) nextObjectHeader() (*ObjectHeader, error) { + h, err := p.s.NextObjectHeader() + p.s.pendingObject = nil + return h, err +} + +func (p *Packfile) getDeltaObjectSize(buf *bytes.Buffer) int64 { + delta := buf.Bytes() + _, delta = decodeLEB128(delta) // skip src size + sz, _ := decodeLEB128(delta) + return int64(sz) +} + +func (p *Packfile) getObjectSize(h *ObjectHeader) (int64, error) { + switch h.Type { + case plumbing.CommitObject, plumbing.TreeObject, plumbing.BlobObject, plumbing.TagObject: + return h.Length, nil + case plumbing.REFDeltaObject, plumbing.OFSDeltaObject: + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + + if _, _, err := p.s.NextObject(buf); err != nil { + return 0, err + } + + return p.getDeltaObjectSize(buf), nil + default: + return 0, ErrInvalidObject.AddDetails("type %q", h.Type) + } +} + +func (p *Packfile) getObjectType(h *ObjectHeader) (typ plumbing.ObjectType, err error) { + switch h.Type { + case plumbing.CommitObject, plumbing.TreeObject, plumbing.BlobObject, plumbing.TagObject: + return h.Type, nil + case plumbing.REFDeltaObject, plumbing.OFSDeltaObject: + var offset int64 + if h.Type == plumbing.REFDeltaObject { + offset, err = p.FindOffset(h.Reference) + if err != nil { + return + } + } else { + offset = h.OffsetReference + } + + if baseType, ok := p.offsetToType[offset]; ok { + typ = baseType + } else { + h, err = p.objectHeaderAtOffset(offset) + if err != nil { + return + } + + typ, err = p.getObjectType(h) + if err != nil { + return + } + } + default: + err = ErrInvalidObject.AddDetails("type %q", h.Type) + } + + p.offsetToType[h.Offset] = typ + + return +} + +func (p *Packfile) objectAtOffset(offset int64, hash plumbing.Hash) (plumbing.EncodedObject, error) { + if obj, ok := p.cacheGet(hash); ok { + return obj, nil + } + + h, err := p.objectHeaderAtOffset(offset) + if err != nil { + if err == io.EOF || isInvalid(err) { + return nil, plumbing.ErrObjectNotFound + } + return nil, err + } + + return p.getNextObject(h, hash) +} + +func (p *Packfile) getNextObject(h *ObjectHeader, hash plumbing.Hash) (plumbing.EncodedObject, error) { + var err error + + // If we have no filesystem, we will return a MemoryObject instead + // of an FSObject. + if p.fs == nil { + return p.getNextMemoryObject(h) + } + + // If the object is small enough then read it completely into memory now since + // it is already read from disk into buffer anyway. For delta objects we want + // to perform the optimization too, but we have to be careful about applying + // small deltas on big objects. + var size int64 + if h.Length <= smallObjectThreshold { + if h.Type != plumbing.OFSDeltaObject && h.Type != plumbing.REFDeltaObject { + return p.getNextMemoryObject(h) + } + + // For delta objects we read the delta data and apply the small object + // optimization only if the expanded version of the object still meets + // the small object threshold condition. + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + if _, _, err := p.s.NextObject(buf); err != nil { + return nil, err + } + + size = p.getDeltaObjectSize(buf) + if size <= smallObjectThreshold { + var obj = new(plumbing.MemoryObject) + obj.SetSize(size) + if h.Type == plumbing.REFDeltaObject { + err = p.fillREFDeltaObjectContentWithBuffer(obj, h.Reference, buf) + } else { + err = p.fillOFSDeltaObjectContentWithBuffer(obj, h.OffsetReference, buf) + } + return obj, err + } + } else { + size, err = p.getObjectSize(h) + if err != nil { + return nil, err + } + } + + typ, err := p.getObjectType(h) + if err != nil { + return nil, err + } + + p.offsetToType[h.Offset] = typ + + return NewFSObject( + hash, + typ, + h.Offset, + size, + p.Index, + p.fs, + p.file.Name(), + p.deltaBaseCache, + ), nil +} + +func (p *Packfile) getObjectContent(offset int64) (io.ReadCloser, error) { + h, err := p.objectHeaderAtOffset(offset) + if err != nil { + return nil, err + } + + // getObjectContent is called from FSObject, so we have to explicitly + // get memory object here to avoid recursive cycle + obj, err := p.getNextMemoryObject(h) + if err != nil { + return nil, err + } + + return obj.Reader() +} + +func (p *Packfile) getNextMemoryObject(h *ObjectHeader) (plumbing.EncodedObject, error) { + var obj = new(plumbing.MemoryObject) + obj.SetSize(h.Length) + obj.SetType(h.Type) + + var err error + switch h.Type { + case plumbing.CommitObject, plumbing.TreeObject, plumbing.BlobObject, plumbing.TagObject: + err = p.fillRegularObjectContent(obj) + case plumbing.REFDeltaObject: + err = p.fillREFDeltaObjectContent(obj, h.Reference) + case plumbing.OFSDeltaObject: + err = p.fillOFSDeltaObjectContent(obj, h.OffsetReference) + default: + err = ErrInvalidObject.AddDetails("type %q", h.Type) + } + + if err != nil { + return nil, err + } + + p.offsetToType[h.Offset] = obj.Type() + + return obj, nil +} + +func (p *Packfile) fillRegularObjectContent(obj plumbing.EncodedObject) (err error) { + w, err := obj.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + _, _, err = p.s.NextObject(w) + p.cachePut(obj) + + return err +} + +func (p *Packfile) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plumbing.Hash) error { + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + _, _, err := p.s.NextObject(buf) + if err != nil { + return err + } + + return p.fillREFDeltaObjectContentWithBuffer(obj, ref, buf) +} + +func (p *Packfile) fillREFDeltaObjectContentWithBuffer(obj plumbing.EncodedObject, ref plumbing.Hash, buf *bytes.Buffer) error { + var err error + + base, ok := p.cacheGet(ref) + if !ok { + base, err = p.Get(ref) + if err != nil { + return err + } + } + + obj.SetType(base.Type()) + err = ApplyDelta(obj, base, buf.Bytes()) + p.cachePut(obj) + + return err +} + +func (p *Packfile) fillOFSDeltaObjectContent(obj plumbing.EncodedObject, offset int64) error { + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + _, _, err := p.s.NextObject(buf) + if err != nil { + return err + } + + return p.fillOFSDeltaObjectContentWithBuffer(obj, offset, buf) +} + +func (p *Packfile) fillOFSDeltaObjectContentWithBuffer(obj plumbing.EncodedObject, offset int64, buf *bytes.Buffer) error { + hash, err := p.FindHash(offset) + if err != nil { + return err + } + + base, err := p.objectAtOffset(offset, hash) + if err != nil { + return err + } + + obj.SetType(base.Type()) + err = ApplyDelta(obj, base, buf.Bytes()) + p.cachePut(obj) + + return err +} + +func (p *Packfile) cacheGet(h plumbing.Hash) (plumbing.EncodedObject, bool) { + if p.deltaBaseCache == nil { + return nil, false + } + + return p.deltaBaseCache.Get(h) +} + +func (p *Packfile) cachePut(obj plumbing.EncodedObject) { + if p.deltaBaseCache == nil { + return + } + + p.deltaBaseCache.Put(obj) +} + +// GetAll returns an iterator with all encoded objects in the packfile. +// The iterator returned is not thread-safe, it should be used in the same +// thread as the Packfile instance. +func (p *Packfile) GetAll() (storer.EncodedObjectIter, error) { + return p.GetByType(plumbing.AnyObject) +} + +// GetByType returns all the objects of the given type. +func (p *Packfile) GetByType(typ plumbing.ObjectType) (storer.EncodedObjectIter, error) { + switch typ { + case plumbing.AnyObject, + plumbing.BlobObject, + plumbing.TreeObject, + plumbing.CommitObject, + plumbing.TagObject: + entries, err := p.EntriesByOffset() + if err != nil { + return nil, err + } + + return &objectIter{ + // Easiest way to provide an object decoder is just to pass a Packfile + // instance. To not mess with the seeks, it's a new instance with a + // different scanner but the same cache and offset to hash map for + // reusing as much cache as possible. + p: p, + iter: entries, + typ: typ, + }, nil + default: + return nil, plumbing.ErrInvalidType + } +} + +// ID returns the ID of the packfile, which is the checksum at the end of it. +func (p *Packfile) ID() (plumbing.Hash, error) { + prev, err := p.file.Seek(-20, io.SeekEnd) + if err != nil { + return plumbing.ZeroHash, err + } + + var hash plumbing.Hash + if _, err := io.ReadFull(p.file, hash[:]); err != nil { + return plumbing.ZeroHash, err + } + + if _, err := p.file.Seek(prev, io.SeekStart); err != nil { + return plumbing.ZeroHash, err + } + + return hash, nil +} + +// Scanner returns the packfile's Scanner +func (p *Packfile) Scanner() *Scanner { + return p.s +} + +// Close the packfile and its resources. +func (p *Packfile) Close() error { + closer, ok := p.file.(io.Closer) + if !ok { + return nil + } + + return closer.Close() +} + +type objectIter struct { + p *Packfile + typ plumbing.ObjectType + iter idxfile.EntryIter +} + +func (i *objectIter) Next() (plumbing.EncodedObject, error) { + for { + e, err := i.iter.Next() + if err != nil { + return nil, err + } + + if i.typ != plumbing.AnyObject { + if typ, ok := i.p.offsetToType[int64(e.Offset)]; ok { + if typ != i.typ { + continue + } + } else if obj, ok := i.p.cacheGet(e.Hash); ok { + if obj.Type() != i.typ { + i.p.offsetToType[int64(e.Offset)] = obj.Type() + continue + } + return obj, nil + } else { + h, err := i.p.objectHeaderAtOffset(int64(e.Offset)) + if err != nil { + return nil, err + } + + if h.Type == plumbing.REFDeltaObject || h.Type == plumbing.OFSDeltaObject { + typ, err := i.p.getObjectType(h) + if err != nil { + return nil, err + } + if typ != i.typ { + i.p.offsetToType[int64(e.Offset)] = typ + continue + } + // getObjectType will seek in the file so we cannot use getNextObject safely + return i.p.objectAtOffset(int64(e.Offset), e.Hash) + } else { + if h.Type != i.typ { + i.p.offsetToType[int64(e.Offset)] = h.Type + continue + } + return i.p.getNextObject(h, e.Hash) + } + } + } + + obj, err := i.p.objectAtOffset(int64(e.Offset), e.Hash) + if err != nil { + return nil, err + } + + return obj, nil + } +} + +func (i *objectIter) ForEach(f func(plumbing.EncodedObject) error) error { + for { + o, err := i.Next() + if err != nil { + if err == io.EOF { + return nil + } + return err + } + + if err := f(o); err != nil { + return err + } + } +} + +func (i *objectIter) Close() { + i.iter.Close() +} + +// isInvalid checks whether an error is an os.PathError with an os.ErrInvalid +// error inside. It also checks for the windows error, which is different from +// os.ErrInvalid. +func isInvalid(err error) bool { + pe, ok := err.(*os.PathError) + if !ok { + return false + } + + errstr := pe.Err.Error() + return errstr == errInvalidUnix || errstr == errInvalidWindows +} + +// errInvalidWindows is the Windows equivalent to os.ErrInvalid +const errInvalidWindows = "The parameter is incorrect." + +var errInvalidUnix = os.ErrInvalid.Error() diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go new file mode 100644 index 0000000000..4b5a5708cc --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go @@ -0,0 +1,495 @@ +package packfile + +import ( + "bytes" + "errors" + "io" + stdioutil "io/ioutil" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var ( + // ErrReferenceDeltaNotFound is returned when the reference delta is not + // found. + ErrReferenceDeltaNotFound = errors.New("reference delta not found") + + // ErrNotSeekableSource is returned when the source for the parser is not + // seekable and a storage was not provided, so it can't be parsed. + ErrNotSeekableSource = errors.New("parser source is not seekable and storage was not provided") + + // ErrDeltaNotCached is returned when the delta could not be found in cache. + ErrDeltaNotCached = errors.New("delta could not be found in cache") +) + +// Observer interface is implemented by index encoders. +type Observer interface { + // OnHeader is called when a new packfile is opened. + OnHeader(count uint32) error + // OnInflatedObjectHeader is called for each object header read. + OnInflatedObjectHeader(t plumbing.ObjectType, objSize int64, pos int64) error + // OnInflatedObjectContent is called for each decoded object. + OnInflatedObjectContent(h plumbing.Hash, pos int64, crc uint32, content []byte) error + // OnFooter is called when decoding is done. + OnFooter(h plumbing.Hash) error +} + +// Parser decodes a packfile and calls any observer associated to it. Is used +// to generate indexes. +type Parser struct { + storage storer.EncodedObjectStorer + scanner *Scanner + count uint32 + oi []*objectInfo + oiByHash map[plumbing.Hash]*objectInfo + oiByOffset map[int64]*objectInfo + hashOffset map[plumbing.Hash]int64 + checksum plumbing.Hash + + cache *cache.BufferLRU + // delta content by offset, only used if source is not seekable + deltas map[int64][]byte + + ob []Observer +} + +// NewParser creates a new Parser. The Scanner source must be seekable. +// If it's not, NewParserWithStorage should be used instead. +func NewParser(scanner *Scanner, ob ...Observer) (*Parser, error) { + return NewParserWithStorage(scanner, nil, ob...) +} + +// NewParserWithStorage creates a new Parser. The scanner source must either +// be seekable or a storage must be provided. +func NewParserWithStorage( + scanner *Scanner, + storage storer.EncodedObjectStorer, + ob ...Observer, +) (*Parser, error) { + if !scanner.IsSeekable && storage == nil { + return nil, ErrNotSeekableSource + } + + var deltas map[int64][]byte + if !scanner.IsSeekable { + deltas = make(map[int64][]byte) + } + + return &Parser{ + storage: storage, + scanner: scanner, + ob: ob, + count: 0, + cache: cache.NewBufferLRUDefault(), + deltas: deltas, + }, nil +} + +func (p *Parser) forEachObserver(f func(o Observer) error) error { + for _, o := range p.ob { + if err := f(o); err != nil { + return err + } + } + return nil +} + +func (p *Parser) onHeader(count uint32) error { + return p.forEachObserver(func(o Observer) error { + return o.OnHeader(count) + }) +} + +func (p *Parser) onInflatedObjectHeader( + t plumbing.ObjectType, + objSize int64, + pos int64, +) error { + return p.forEachObserver(func(o Observer) error { + return o.OnInflatedObjectHeader(t, objSize, pos) + }) +} + +func (p *Parser) onInflatedObjectContent( + h plumbing.Hash, + pos int64, + crc uint32, + content []byte, +) error { + return p.forEachObserver(func(o Observer) error { + return o.OnInflatedObjectContent(h, pos, crc, content) + }) +} + +func (p *Parser) onFooter(h plumbing.Hash) error { + return p.forEachObserver(func(o Observer) error { + return o.OnFooter(h) + }) +} + +// Parse start decoding phase of the packfile. +func (p *Parser) Parse() (plumbing.Hash, error) { + if err := p.init(); err != nil { + return plumbing.ZeroHash, err + } + + if err := p.indexObjects(); err != nil { + return plumbing.ZeroHash, err + } + + var err error + p.checksum, err = p.scanner.Checksum() + if err != nil && err != io.EOF { + return plumbing.ZeroHash, err + } + + if err := p.resolveDeltas(); err != nil { + return plumbing.ZeroHash, err + } + + if err := p.onFooter(p.checksum); err != nil { + return plumbing.ZeroHash, err + } + + return p.checksum, nil +} + +func (p *Parser) init() error { + _, c, err := p.scanner.Header() + if err != nil { + return err + } + + if err := p.onHeader(c); err != nil { + return err + } + + p.count = c + p.oiByHash = make(map[plumbing.Hash]*objectInfo, p.count) + p.oiByOffset = make(map[int64]*objectInfo, p.count) + p.oi = make([]*objectInfo, p.count) + + return nil +} + +func (p *Parser) indexObjects() error { + buf := new(bytes.Buffer) + + for i := uint32(0); i < p.count; i++ { + buf.Reset() + + oh, err := p.scanner.NextObjectHeader() + if err != nil { + return err + } + + delta := false + var ota *objectInfo + switch t := oh.Type; t { + case plumbing.OFSDeltaObject: + delta = true + + parent, ok := p.oiByOffset[oh.OffsetReference] + if !ok { + return plumbing.ErrObjectNotFound + } + + ota = newDeltaObject(oh.Offset, oh.Length, t, parent) + parent.Children = append(parent.Children, ota) + case plumbing.REFDeltaObject: + delta = true + parent, ok := p.oiByHash[oh.Reference] + if !ok { + // can't find referenced object in this pack file + // this must be a "thin" pack. + parent = &objectInfo{ //Placeholder parent + SHA1: oh.Reference, + ExternalRef: true, // mark as an external reference that must be resolved + Type: plumbing.AnyObject, + DiskType: plumbing.AnyObject, + } + p.oiByHash[oh.Reference] = parent + } + ota = newDeltaObject(oh.Offset, oh.Length, t, parent) + parent.Children = append(parent.Children, ota) + + default: + ota = newBaseObject(oh.Offset, oh.Length, t) + } + + _, crc, err := p.scanner.NextObject(buf) + if err != nil { + return err + } + + ota.Crc32 = crc + ota.Length = oh.Length + + data := buf.Bytes() + if !delta { + sha1, err := getSHA1(ota.Type, data) + if err != nil { + return err + } + + ota.SHA1 = sha1 + p.oiByHash[ota.SHA1] = ota + } + + if p.storage != nil && !delta { + obj := new(plumbing.MemoryObject) + obj.SetSize(oh.Length) + obj.SetType(oh.Type) + if _, err := obj.Write(data); err != nil { + return err + } + + if _, err := p.storage.SetEncodedObject(obj); err != nil { + return err + } + } + + if delta && !p.scanner.IsSeekable { + p.deltas[oh.Offset] = make([]byte, len(data)) + copy(p.deltas[oh.Offset], data) + } + + p.oiByOffset[oh.Offset] = ota + p.oi[i] = ota + } + + return nil +} + +func (p *Parser) resolveDeltas() error { + buf := &bytes.Buffer{} + for _, obj := range p.oi { + buf.Reset() + err := p.get(obj, buf) + if err != nil { + return err + } + content := buf.Bytes() + + if err := p.onInflatedObjectHeader(obj.Type, obj.Length, obj.Offset); err != nil { + return err + } + + if err := p.onInflatedObjectContent(obj.SHA1, obj.Offset, obj.Crc32, content); err != nil { + return err + } + + if !obj.IsDelta() && len(obj.Children) > 0 { + for _, child := range obj.Children { + if err := p.resolveObject(stdioutil.Discard, child, content); err != nil { + return err + } + } + + // Remove the delta from the cache. + if obj.DiskType.IsDelta() && !p.scanner.IsSeekable { + delete(p.deltas, obj.Offset) + } + } + } + + return nil +} + +func (p *Parser) get(o *objectInfo, buf *bytes.Buffer) (err error) { + if !o.ExternalRef { // skip cache check for placeholder parents + b, ok := p.cache.Get(o.Offset) + if ok { + _, err := buf.Write(b) + return err + } + } + + // If it's not on the cache and is not a delta we can try to find it in the + // storage, if there's one. External refs must enter here. + if p.storage != nil && !o.Type.IsDelta() { + var e plumbing.EncodedObject + e, err = p.storage.EncodedObject(plumbing.AnyObject, o.SHA1) + if err != nil { + return err + } + o.Type = e.Type() + + var r io.ReadCloser + r, err = e.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(r, &err) + + _, err = buf.ReadFrom(io.LimitReader(r, e.Size())) + return err + } + + if o.ExternalRef { + // we were not able to resolve a ref in a thin pack + return ErrReferenceDeltaNotFound + } + + if o.DiskType.IsDelta() { + b := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(b) + b.Reset() + err := p.get(o.Parent, b) + if err != nil { + return err + } + base := b.Bytes() + + err = p.resolveObject(buf, o, base) + if err != nil { + return err + } + } else { + err := p.readData(buf, o) + if err != nil { + return err + } + } + + if len(o.Children) > 0 { + data := make([]byte, buf.Len()) + copy(data, buf.Bytes()) + p.cache.Put(o.Offset, data) + } + return nil +} + +func (p *Parser) resolveObject( + w io.Writer, + o *objectInfo, + base []byte, +) error { + if !o.DiskType.IsDelta() { + return nil + } + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + err := p.readData(buf, o) + if err != nil { + return err + } + data := buf.Bytes() + + data, err = applyPatchBase(o, data, base) + if err != nil { + return err + } + + if p.storage != nil { + obj := new(plumbing.MemoryObject) + obj.SetSize(o.Size()) + obj.SetType(o.Type) + if _, err := obj.Write(data); err != nil { + return err + } + + if _, err := p.storage.SetEncodedObject(obj); err != nil { + return err + } + } + _, err = w.Write(data) + return err +} + +func (p *Parser) readData(w io.Writer, o *objectInfo) error { + if !p.scanner.IsSeekable && o.DiskType.IsDelta() { + data, ok := p.deltas[o.Offset] + if !ok { + return ErrDeltaNotCached + } + _, err := w.Write(data) + return err + } + + if _, err := p.scanner.SeekObjectHeader(o.Offset); err != nil { + return err + } + + if _, _, err := p.scanner.NextObject(w); err != nil { + return err + } + return nil +} + +func applyPatchBase(ota *objectInfo, data, base []byte) ([]byte, error) { + patched, err := PatchDelta(base, data) + if err != nil { + return nil, err + } + + if ota.SHA1 == plumbing.ZeroHash { + ota.Type = ota.Parent.Type + sha1, err := getSHA1(ota.Type, patched) + if err != nil { + return nil, err + } + + ota.SHA1 = sha1 + ota.Length = int64(len(patched)) + } + + return patched, nil +} + +func getSHA1(t plumbing.ObjectType, data []byte) (plumbing.Hash, error) { + hasher := plumbing.NewHasher(t, int64(len(data))) + if _, err := hasher.Write(data); err != nil { + return plumbing.ZeroHash, err + } + + return hasher.Sum(), nil +} + +type objectInfo struct { + Offset int64 + Length int64 + Type plumbing.ObjectType + DiskType plumbing.ObjectType + ExternalRef bool // indicates this is an external reference in a thin pack file + + Crc32 uint32 + + Parent *objectInfo + Children []*objectInfo + SHA1 plumbing.Hash +} + +func newBaseObject(offset, length int64, t plumbing.ObjectType) *objectInfo { + return newDeltaObject(offset, length, t, nil) +} + +func newDeltaObject( + offset, length int64, + t plumbing.ObjectType, + parent *objectInfo, +) *objectInfo { + obj := &objectInfo{ + Offset: offset, + Length: length, + Type: t, + DiskType: t, + Crc32: 0, + Parent: parent, + } + + return obj +} + +func (o *objectInfo) IsDelta() bool { + return o.Type.IsDelta() +} + +func (o *objectInfo) Size() int64 { + return o.Length +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/patch_delta.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/patch_delta.go new file mode 100644 index 0000000000..9e90f30a72 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/patch_delta.go @@ -0,0 +1,252 @@ +package packfile + +import ( + "bytes" + "errors" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// See https://github.com/git/git/blob/49fa3dc76179e04b0833542fa52d0f287a4955ac/delta.h +// https://github.com/git/git/blob/c2c5f6b1e479f2c38e0e01345350620944e3527f/patch-delta.c, +// and https://github.com/tarruda/node-git-core/blob/master/src/js/delta.js +// for details about the delta format. + +const deltaSizeMin = 4 + +// ApplyDelta writes to target the result of applying the modification deltas in delta to base. +func ApplyDelta(target, base plumbing.EncodedObject, delta []byte) (err error) { + r, err := base.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(r, &err) + + w, err := target.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + buf := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(buf) + buf.Reset() + _, err = buf.ReadFrom(r) + if err != nil { + return err + } + src := buf.Bytes() + + dst := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(dst) + dst.Reset() + err = patchDelta(dst, src, delta) + if err != nil { + return err + } + + target.SetSize(int64(dst.Len())) + + b := byteSlicePool.Get().([]byte) + _, err = io.CopyBuffer(w, dst, b) + byteSlicePool.Put(b) + return err +} + +var ( + ErrInvalidDelta = errors.New("invalid delta") + ErrDeltaCmd = errors.New("wrong delta command") +) + +// PatchDelta returns the result of applying the modification deltas in delta to src. +// An error will be returned if delta is corrupted (ErrDeltaLen) or an action command +// is not copy from source or copy from delta (ErrDeltaCmd). +func PatchDelta(src, delta []byte) ([]byte, error) { + b := &bytes.Buffer{} + if err := patchDelta(b, src, delta); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +func patchDelta(dst *bytes.Buffer, src, delta []byte) error { + if len(delta) < deltaSizeMin { + return ErrInvalidDelta + } + + srcSz, delta := decodeLEB128(delta) + if srcSz != uint(len(src)) { + return ErrInvalidDelta + } + + targetSz, delta := decodeLEB128(delta) + remainingTargetSz := targetSz + + var cmd byte + dst.Grow(int(targetSz)) + for { + if len(delta) == 0 { + return ErrInvalidDelta + } + + cmd = delta[0] + delta = delta[1:] + if isCopyFromSrc(cmd) { + var offset, sz uint + var err error + offset, delta, err = decodeOffset(cmd, delta) + if err != nil { + return err + } + + sz, delta, err = decodeSize(cmd, delta) + if err != nil { + return err + } + + if invalidSize(sz, targetSz) || + invalidOffsetSize(offset, sz, srcSz) { + break + } + dst.Write(src[offset : offset+sz]) + remainingTargetSz -= sz + } else if isCopyFromDelta(cmd) { + sz := uint(cmd) // cmd is the size itself + if invalidSize(sz, targetSz) { + return ErrInvalidDelta + } + + if uint(len(delta)) < sz { + return ErrInvalidDelta + } + + dst.Write(delta[0:sz]) + remainingTargetSz -= sz + delta = delta[sz:] + } else { + return ErrDeltaCmd + } + + if remainingTargetSz <= 0 { + break + } + } + + return nil +} + +// Decodes a number encoded as an unsigned LEB128 at the start of some +// binary data and returns the decoded number and the rest of the +// stream. +// +// This must be called twice on the delta data buffer, first to get the +// expected source buffer size, and again to get the target buffer size. +func decodeLEB128(input []byte) (uint, []byte) { + var num, sz uint + var b byte + for { + b = input[sz] + num |= (uint(b) & payload) << (sz * 7) // concats 7 bits chunks + sz++ + + if uint(b)&continuation == 0 || sz == uint(len(input)) { + break + } + } + + return num, input[sz:] +} + +const ( + payload = 0x7f // 0111 1111 + continuation = 0x80 // 1000 0000 +) + +func isCopyFromSrc(cmd byte) bool { + return (cmd & 0x80) != 0 +} + +func isCopyFromDelta(cmd byte) bool { + return (cmd&0x80) == 0 && cmd != 0 +} + +func decodeOffset(cmd byte, delta []byte) (uint, []byte, error) { + var offset uint + if (cmd & 0x01) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + offset = uint(delta[0]) + delta = delta[1:] + } + if (cmd & 0x02) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + offset |= uint(delta[0]) << 8 + delta = delta[1:] + } + if (cmd & 0x04) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + offset |= uint(delta[0]) << 16 + delta = delta[1:] + } + if (cmd & 0x08) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + offset |= uint(delta[0]) << 24 + delta = delta[1:] + } + + return offset, delta, nil +} + +func decodeSize(cmd byte, delta []byte) (uint, []byte, error) { + var sz uint + if (cmd & 0x10) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + sz = uint(delta[0]) + delta = delta[1:] + } + if (cmd & 0x20) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + sz |= uint(delta[0]) << 8 + delta = delta[1:] + } + if (cmd & 0x40) != 0 { + if len(delta) == 0 { + return 0, nil, ErrInvalidDelta + } + sz |= uint(delta[0]) << 16 + delta = delta[1:] + } + if sz == 0 { + sz = 0x10000 + } + + return sz, delta, nil +} + +func invalidSize(sz, targetSz uint) bool { + return sz > targetSz +} + +func invalidOffsetSize(offset, sz, srcSz uint) bool { + return sumOverflows(offset, sz) || + offset+sz > srcSz +} + +func sumOverflows(a, b uint) bool { + return a+b < a +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go new file mode 100644 index 0000000000..6e6a687886 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go @@ -0,0 +1,466 @@ +package packfile + +import ( + "bufio" + "bytes" + "compress/zlib" + "fmt" + "hash" + "hash/crc32" + "io" + stdioutil "io/ioutil" + "sync" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/binary" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var ( + // ErrEmptyPackfile is returned by ReadHeader when no data is found in the packfile + ErrEmptyPackfile = NewError("empty packfile") + // ErrBadSignature is returned by ReadHeader when the signature in the packfile is incorrect. + ErrBadSignature = NewError("malformed pack file signature") + // ErrUnsupportedVersion is returned by ReadHeader when the packfile version is + // different than VersionSupported. + ErrUnsupportedVersion = NewError("unsupported packfile version") + // ErrSeekNotSupported returned if seek is not support + ErrSeekNotSupported = NewError("not seek support") +) + +// ObjectHeader contains the information related to the object, this information +// is collected from the previous bytes to the content of the object. +type ObjectHeader struct { + Type plumbing.ObjectType + Offset int64 + Length int64 + Reference plumbing.Hash + OffsetReference int64 +} + +type Scanner struct { + r *scannerReader + crc hash.Hash32 + + // pendingObject is used to detect if an object has been read, or still + // is waiting to be read + pendingObject *ObjectHeader + version, objects uint32 + + // lsSeekable says if this scanner can do Seek or not, to have a Scanner + // seekable a r implementing io.Seeker is required + IsSeekable bool +} + +// NewScanner returns a new Scanner based on a reader, if the given reader +// implements io.ReadSeeker the Scanner will be also Seekable +func NewScanner(r io.Reader) *Scanner { + _, ok := r.(io.ReadSeeker) + + crc := crc32.NewIEEE() + return &Scanner{ + r: newScannerReader(r, crc), + crc: crc, + IsSeekable: ok, + } +} + +func (s *Scanner) Reset(r io.Reader) { + _, ok := r.(io.ReadSeeker) + + s.r.Reset(r) + s.crc.Reset() + s.IsSeekable = ok + s.pendingObject = nil + s.version = 0 + s.objects = 0 +} + +// Header reads the whole packfile header (signature, version and object count). +// It returns the version and the object count and performs checks on the +// validity of the signature and the version fields. +func (s *Scanner) Header() (version, objects uint32, err error) { + if s.version != 0 { + return s.version, s.objects, nil + } + + sig, err := s.readSignature() + if err != nil { + if err == io.EOF { + err = ErrEmptyPackfile + } + + return + } + + if !s.isValidSignature(sig) { + err = ErrBadSignature + return + } + + version, err = s.readVersion() + s.version = version + if err != nil { + return + } + + if !s.isSupportedVersion(version) { + err = ErrUnsupportedVersion.AddDetails("%d", version) + return + } + + objects, err = s.readCount() + s.objects = objects + return +} + +// readSignature reads an returns the signature field in the packfile. +func (s *Scanner) readSignature() ([]byte, error) { + var sig = make([]byte, 4) + if _, err := io.ReadFull(s.r, sig); err != nil { + return []byte{}, err + } + + return sig, nil +} + +// isValidSignature returns if sig is a valid packfile signature. +func (s *Scanner) isValidSignature(sig []byte) bool { + return bytes.Equal(sig, signature) +} + +// readVersion reads and returns the version field of a packfile. +func (s *Scanner) readVersion() (uint32, error) { + return binary.ReadUint32(s.r) +} + +// isSupportedVersion returns whether version v is supported by the parser. +// The current supported version is VersionSupported, defined above. +func (s *Scanner) isSupportedVersion(v uint32) bool { + return v == VersionSupported +} + +// readCount reads and returns the count of objects field of a packfile. +func (s *Scanner) readCount() (uint32, error) { + return binary.ReadUint32(s.r) +} + +// SeekObjectHeader seeks to specified offset and returns the ObjectHeader +// for the next object in the reader +func (s *Scanner) SeekObjectHeader(offset int64) (*ObjectHeader, error) { + // if seeking we assume that you are not interested in the header + if s.version == 0 { + s.version = VersionSupported + } + + if _, err := s.r.Seek(offset, io.SeekStart); err != nil { + return nil, err + } + + h, err := s.nextObjectHeader() + if err != nil { + return nil, err + } + + h.Offset = offset + return h, nil +} + +// NextObjectHeader returns the ObjectHeader for the next object in the reader +func (s *Scanner) NextObjectHeader() (*ObjectHeader, error) { + if err := s.doPending(); err != nil { + return nil, err + } + + offset, err := s.r.Seek(0, io.SeekCurrent) + if err != nil { + return nil, err + } + + h, err := s.nextObjectHeader() + if err != nil { + return nil, err + } + + h.Offset = offset + return h, nil +} + +// nextObjectHeader returns the ObjectHeader for the next object in the reader +// without the Offset field +func (s *Scanner) nextObjectHeader() (*ObjectHeader, error) { + s.r.Flush() + s.crc.Reset() + + h := &ObjectHeader{} + s.pendingObject = h + + var err error + h.Offset, err = s.r.Seek(0, io.SeekCurrent) + if err != nil { + return nil, err + } + + h.Type, h.Length, err = s.readObjectTypeAndLength() + if err != nil { + return nil, err + } + + switch h.Type { + case plumbing.OFSDeltaObject: + no, err := binary.ReadVariableWidthInt(s.r) + if err != nil { + return nil, err + } + + h.OffsetReference = h.Offset - no + case plumbing.REFDeltaObject: + var err error + h.Reference, err = binary.ReadHash(s.r) + if err != nil { + return nil, err + } + } + + return h, nil +} + +func (s *Scanner) doPending() error { + if s.version == 0 { + var err error + s.version, s.objects, err = s.Header() + if err != nil { + return err + } + } + + return s.discardObjectIfNeeded() +} + +func (s *Scanner) discardObjectIfNeeded() error { + if s.pendingObject == nil { + return nil + } + + h := s.pendingObject + n, _, err := s.NextObject(stdioutil.Discard) + if err != nil { + return err + } + + if n != h.Length { + return fmt.Errorf( + "error discarding object, discarded %d, expected %d", + n, h.Length, + ) + } + + return nil +} + +// ReadObjectTypeAndLength reads and returns the object type and the +// length field from an object entry in a packfile. +func (s *Scanner) readObjectTypeAndLength() (plumbing.ObjectType, int64, error) { + t, c, err := s.readType() + if err != nil { + return t, 0, err + } + + l, err := s.readLength(c) + + return t, l, err +} + +func (s *Scanner) readType() (plumbing.ObjectType, byte, error) { + var c byte + var err error + if c, err = s.r.ReadByte(); err != nil { + return plumbing.ObjectType(0), 0, err + } + + typ := parseType(c) + + return typ, c, nil +} + +func parseType(b byte) plumbing.ObjectType { + return plumbing.ObjectType((b & maskType) >> firstLengthBits) +} + +// the length is codified in the last 4 bits of the first byte and in +// the last 7 bits of subsequent bytes. Last byte has a 0 MSB. +func (s *Scanner) readLength(first byte) (int64, error) { + length := int64(first & maskFirstLength) + + c := first + shift := firstLengthBits + var err error + for c&maskContinue > 0 { + if c, err = s.r.ReadByte(); err != nil { + return 0, err + } + + length += int64(c&maskLength) << shift + shift += lengthBits + } + + return length, nil +} + +// NextObject writes the content of the next object into the reader, returns +// the number of bytes written, the CRC32 of the content and an error, if any +func (s *Scanner) NextObject(w io.Writer) (written int64, crc32 uint32, err error) { + s.pendingObject = nil + written, err = s.copyObject(w) + + s.r.Flush() + crc32 = s.crc.Sum32() + s.crc.Reset() + + return +} + +// ReadRegularObject reads and write a non-deltified object +// from it zlib stream in an object entry in the packfile. +func (s *Scanner) copyObject(w io.Writer) (n int64, err error) { + zr := zlibReaderPool.Get().(io.ReadCloser) + defer zlibReaderPool.Put(zr) + + if err = zr.(zlib.Resetter).Reset(s.r, nil); err != nil { + return 0, fmt.Errorf("zlib reset error: %s", err) + } + + defer ioutil.CheckClose(zr, &err) + buf := byteSlicePool.Get().([]byte) + n, err = io.CopyBuffer(w, zr, buf) + byteSlicePool.Put(buf) + return +} + +var byteSlicePool = sync.Pool{ + New: func() interface{} { + return make([]byte, 32*1024) + }, +} + +// SeekFromStart sets a new offset from start, returns the old position before +// the change. +func (s *Scanner) SeekFromStart(offset int64) (previous int64, err error) { + // if seeking we assume that you are not interested in the header + if s.version == 0 { + s.version = VersionSupported + } + + previous, err = s.r.Seek(0, io.SeekCurrent) + if err != nil { + return -1, err + } + + _, err = s.r.Seek(offset, io.SeekStart) + return previous, err +} + +// Checksum returns the checksum of the packfile +func (s *Scanner) Checksum() (plumbing.Hash, error) { + err := s.discardObjectIfNeeded() + if err != nil { + return plumbing.ZeroHash, err + } + + return binary.ReadHash(s.r) +} + +// Close reads the reader until io.EOF +func (s *Scanner) Close() error { + buf := byteSlicePool.Get().([]byte) + _, err := io.CopyBuffer(stdioutil.Discard, s.r, buf) + byteSlicePool.Put(buf) + return err +} + +// Flush is a no-op (deprecated) +func (s *Scanner) Flush() error { + return nil +} + +// scannerReader has the following characteristics: +// - Provides an io.SeekReader impl for bufio.Reader, when the underlying +// reader supports it. +// - Keeps track of the current read position, for when the underlying reader +// isn't an io.SeekReader, but we still want to know the current offset. +// - Writes to the hash writer what it reads, with the aid of a smaller buffer. +// The buffer helps avoid a performance penality for performing small writes +// to the crc32 hash writer. +type scannerReader struct { + reader io.Reader + crc io.Writer + rbuf *bufio.Reader + wbuf *bufio.Writer + offset int64 +} + +func newScannerReader(r io.Reader, h io.Writer) *scannerReader { + sr := &scannerReader{ + rbuf: bufio.NewReader(nil), + wbuf: bufio.NewWriterSize(nil, 64), + crc: h, + } + sr.Reset(r) + + return sr +} + +func (r *scannerReader) Reset(reader io.Reader) { + r.reader = reader + r.rbuf.Reset(r.reader) + r.wbuf.Reset(r.crc) + + r.offset = 0 + if seeker, ok := r.reader.(io.ReadSeeker); ok { + r.offset, _ = seeker.Seek(0, io.SeekCurrent) + } +} + +func (r *scannerReader) Read(p []byte) (n int, err error) { + n, err = r.rbuf.Read(p) + + r.offset += int64(n) + if _, err := r.wbuf.Write(p[:n]); err != nil { + return n, err + } + return +} + +func (r *scannerReader) ReadByte() (b byte, err error) { + b, err = r.rbuf.ReadByte() + if err == nil { + r.offset++ + return b, r.wbuf.WriteByte(b) + } + return +} + +func (r *scannerReader) Flush() error { + return r.wbuf.Flush() +} + +// Seek seeks to a location. If the underlying reader is not an io.ReadSeeker, +// then only whence=io.SeekCurrent is supported, any other operation fails. +func (r *scannerReader) Seek(offset int64, whence int) (int64, error) { + var err error + + if seeker, ok := r.reader.(io.ReadSeeker); !ok { + if whence != io.SeekCurrent || offset != 0 { + return -1, ErrSeekNotSupported + } + } else { + if whence == io.SeekCurrent && offset == 0 { + return r.offset, nil + } + + r.offset, err = seeker.Seek(offset, whence) + r.rbuf.Reset(r.reader) + } + + return r.offset, err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/encoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/encoder.go new file mode 100644 index 0000000000..6d409795b0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/encoder.go @@ -0,0 +1,122 @@ +// Package pktline implements reading payloads form pkt-lines and encoding +// pkt-lines from payloads. +package pktline + +import ( + "bytes" + "errors" + "fmt" + "io" +) + +// An Encoder writes pkt-lines to an output stream. +type Encoder struct { + w io.Writer +} + +const ( + // MaxPayloadSize is the maximum payload size of a pkt-line in bytes. + MaxPayloadSize = 65516 + + // For compatibility with canonical Git implementation, accept longer pkt-lines + OversizePayloadMax = 65520 +) + +var ( + // FlushPkt are the contents of a flush-pkt pkt-line. + FlushPkt = []byte{'0', '0', '0', '0'} + // Flush is the payload to use with the Encode method to encode a flush-pkt. + Flush = []byte{} + // FlushString is the payload to use with the EncodeString method to encode a flush-pkt. + FlushString = "" + // ErrPayloadTooLong is returned by the Encode methods when any of the + // provided payloads is bigger than MaxPayloadSize. + ErrPayloadTooLong = errors.New("payload is too long") +) + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + w: w, + } +} + +// Flush encodes a flush-pkt to the output stream. +func (e *Encoder) Flush() error { + _, err := e.w.Write(FlushPkt) + return err +} + +// Encode encodes a pkt-line with the payload specified and write it to +// the output stream. If several payloads are specified, each of them +// will get streamed in their own pkt-lines. +func (e *Encoder) Encode(payloads ...[]byte) error { + for _, p := range payloads { + if err := e.encodeLine(p); err != nil { + return err + } + } + + return nil +} + +func (e *Encoder) encodeLine(p []byte) error { + if len(p) > MaxPayloadSize { + return ErrPayloadTooLong + } + + if bytes.Equal(p, Flush) { + return e.Flush() + } + + n := len(p) + 4 + if _, err := e.w.Write(asciiHex16(n)); err != nil { + return err + } + _, err := e.w.Write(p) + return err +} + +// Returns the hexadecimal ascii representation of the 16 less +// significant bits of n. The length of the returned slice will always +// be 4. Example: if n is 1234 (0x4d2), the return value will be +// []byte{'0', '4', 'd', '2'}. +func asciiHex16(n int) []byte { + var ret [4]byte + ret[0] = byteToASCIIHex(byte(n & 0xf000 >> 12)) + ret[1] = byteToASCIIHex(byte(n & 0x0f00 >> 8)) + ret[2] = byteToASCIIHex(byte(n & 0x00f0 >> 4)) + ret[3] = byteToASCIIHex(byte(n & 0x000f)) + + return ret[:] +} + +// turns a byte into its hexadecimal ascii representation. Example: +// from 11 (0xb) to 'b'. +func byteToASCIIHex(n byte) byte { + if n < 10 { + return '0' + n + } + + return 'a' - 10 + n +} + +// EncodeString works similarly as Encode but payloads are specified as strings. +func (e *Encoder) EncodeString(payloads ...string) error { + for _, p := range payloads { + if err := e.Encode([]byte(p)); err != nil { + return err + } + } + + return nil +} + +// Encodef encodes a single pkt-line with the payload formatted as +// the format specifier. The rest of the arguments will be used in +// the format string. +func (e *Encoder) Encodef(format string, a ...interface{}) error { + return e.EncodeString( + fmt.Sprintf(format, a...), + ) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/scanner.go b/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/scanner.go new file mode 100644 index 0000000000..99aab46e88 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/scanner.go @@ -0,0 +1,134 @@ +package pktline + +import ( + "errors" + "io" +) + +const ( + lenSize = 4 +) + +// ErrInvalidPktLen is returned by Err() when an invalid pkt-len is found. +var ErrInvalidPktLen = errors.New("invalid pkt-len found") + +// Scanner provides a convenient interface for reading the payloads of a +// series of pkt-lines. It takes an io.Reader providing the source, +// which then can be tokenized through repeated calls to the Scan +// method. +// +// After each Scan call, the Bytes method will return the payload of the +// corresponding pkt-line on a shared buffer, which will be 65516 bytes +// or smaller. Flush pkt-lines are represented by empty byte slices. +// +// Scanning stops at EOF or the first I/O error. +type Scanner struct { + r io.Reader // The reader provided by the client + err error // Sticky error + payload []byte // Last pkt-payload + len [lenSize]byte // Last pkt-len +} + +// NewScanner returns a new Scanner to read from r. +func NewScanner(r io.Reader) *Scanner { + return &Scanner{ + r: r, + } +} + +// Err returns the first error encountered by the Scanner. +func (s *Scanner) Err() error { + return s.err +} + +// Scan advances the Scanner to the next pkt-line, whose payload will +// then be available through the Bytes method. Scanning stops at EOF +// or the first I/O error. After Scan returns false, the Err method +// will return any error that occurred during scanning, except that if +// it was io.EOF, Err will return nil. +func (s *Scanner) Scan() bool { + var l int + l, s.err = s.readPayloadLen() + if s.err == io.EOF { + s.err = nil + return false + } + if s.err != nil { + return false + } + + if cap(s.payload) < l { + s.payload = make([]byte, 0, l) + } + + if _, s.err = io.ReadFull(s.r, s.payload[:l]); s.err != nil { + return false + } + s.payload = s.payload[:l] + + return true +} + +// Bytes returns the most recent payload generated by a call to Scan. +// The underlying array may point to data that will be overwritten by a +// subsequent call to Scan. It does no allocation. +func (s *Scanner) Bytes() []byte { + return s.payload +} + +// Method readPayloadLen returns the payload length by reading the +// pkt-len and subtracting the pkt-len size. +func (s *Scanner) readPayloadLen() (int, error) { + if _, err := io.ReadFull(s.r, s.len[:]); err != nil { + if err == io.ErrUnexpectedEOF { + return 0, ErrInvalidPktLen + } + + return 0, err + } + + n, err := hexDecode(s.len) + if err != nil { + return 0, err + } + + switch { + case n == 0: + return 0, nil + case n <= lenSize: + return 0, ErrInvalidPktLen + case n > OversizePayloadMax+lenSize: + return 0, ErrInvalidPktLen + default: + return n - lenSize, nil + } +} + +// Turns the hexadecimal representation of a number in a byte slice into +// a number. This function substitute strconv.ParseUint(string(buf), 16, +// 16) and/or hex.Decode, to avoid generating new strings, thus helping the +// GC. +func hexDecode(buf [lenSize]byte) (int, error) { + var ret int + for i := 0; i < lenSize; i++ { + n, err := asciiHexToByte(buf[i]) + if err != nil { + return 0, ErrInvalidPktLen + } + ret = 16*ret + int(n) + } + return ret, nil +} + +// turns the hexadecimal ascii representation of a byte into its +// numerical value. Example: from 'b' to 11 (0xb). +func asciiHexToByte(b byte) (byte, error) { + switch { + case b >= '0' && b <= '9': + return b - '0', nil + case b >= 'a' && b <= 'f': + return b - 'a' + 10, nil + default: + return 0, ErrInvalidPktLen + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/hash.go b/vendor/github.com/go-git/go-git/v5/plumbing/hash.go new file mode 100644 index 0000000000..afc602a9ec --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/hash.go @@ -0,0 +1,83 @@ +package plumbing + +import ( + "bytes" + "crypto/sha1" + "encoding/hex" + "hash" + "sort" + "strconv" +) + +// Hash SHA1 hashed content +type Hash [20]byte + +// ZeroHash is Hash with value zero +var ZeroHash Hash + +// ComputeHash compute the hash for a given ObjectType and content +func ComputeHash(t ObjectType, content []byte) Hash { + h := NewHasher(t, int64(len(content))) + h.Write(content) + return h.Sum() +} + +// NewHash return a new Hash from a hexadecimal hash representation +func NewHash(s string) Hash { + b, _ := hex.DecodeString(s) + + var h Hash + copy(h[:], b) + + return h +} + +func (h Hash) IsZero() bool { + var empty Hash + return h == empty +} + +func (h Hash) String() string { + return hex.EncodeToString(h[:]) +} + +type Hasher struct { + hash.Hash +} + +func NewHasher(t ObjectType, size int64) Hasher { + h := Hasher{sha1.New()} + h.Write(t.Bytes()) + h.Write([]byte(" ")) + h.Write([]byte(strconv.FormatInt(size, 10))) + h.Write([]byte{0}) + return h +} + +func (h Hasher) Sum() (hash Hash) { + copy(hash[:], h.Hash.Sum(nil)) + return +} + +// HashesSort sorts a slice of Hashes in increasing order. +func HashesSort(a []Hash) { + sort.Sort(HashSlice(a)) +} + +// HashSlice attaches the methods of sort.Interface to []Hash, sorting in +// increasing order. +type HashSlice []Hash + +func (p HashSlice) Len() int { return len(p) } +func (p HashSlice) Less(i, j int) bool { return bytes.Compare(p[i][:], p[j][:]) < 0 } +func (p HashSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// IsHash returns true if the given string is a valid hash. +func IsHash(s string) bool { + if len(s) != 40 { + return false + } + + _, err := hex.DecodeString(s) + return err == nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/memory.go b/vendor/github.com/go-git/go-git/v5/plumbing/memory.go new file mode 100644 index 0000000000..21337cc0dd --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/memory.go @@ -0,0 +1,72 @@ +package plumbing + +import ( + "bytes" + "io" +) + +// MemoryObject on memory Object implementation +type MemoryObject struct { + t ObjectType + h Hash + cont []byte + sz int64 +} + +// Hash returns the object Hash, the hash is calculated on-the-fly the first +// time it's called, in all subsequent calls the same Hash is returned even +// if the type or the content have changed. The Hash is only generated if the +// size of the content is exactly the object size. +func (o *MemoryObject) Hash() Hash { + if o.h == ZeroHash && int64(len(o.cont)) == o.sz { + o.h = ComputeHash(o.t, o.cont) + } + + return o.h +} + +// Type return the ObjectType +func (o *MemoryObject) Type() ObjectType { return o.t } + +// SetType sets the ObjectType +func (o *MemoryObject) SetType(t ObjectType) { o.t = t } + +// Size return the size of the object +func (o *MemoryObject) Size() int64 { return o.sz } + +// SetSize set the object size, a content of the given size should be written +// afterwards +func (o *MemoryObject) SetSize(s int64) { o.sz = s } + +// Reader returns an io.ReadCloser used to read the object's content. +// +// For a MemoryObject, this reader is seekable. +func (o *MemoryObject) Reader() (io.ReadCloser, error) { + return nopCloser{bytes.NewReader(o.cont)}, nil +} + +// Writer returns a ObjectWriter used to write the object's content. +func (o *MemoryObject) Writer() (io.WriteCloser, error) { + return o, nil +} + +func (o *MemoryObject) Write(p []byte) (n int, err error) { + o.cont = append(o.cont, p...) + o.sz = int64(len(o.cont)) + + return len(p), nil +} + +// Close releases any resources consumed by the object when it is acting as a +// ObjectWriter. +func (o *MemoryObject) Close() error { return nil } + +// nopCloser exposes the extra methods of bytes.Reader while nopping Close(). +// +// This allows clients to attempt seeking in a cached Blob's Reader. +type nopCloser struct { + *bytes.Reader +} + +// Close does nothing. +func (nc nopCloser) Close() error { return nil } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object.go b/vendor/github.com/go-git/go-git/v5/plumbing/object.go new file mode 100644 index 0000000000..2655dee43e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object.go @@ -0,0 +1,111 @@ +// package plumbing implement the core interfaces and structs used by go-git +package plumbing + +import ( + "errors" + "io" +) + +var ( + ErrObjectNotFound = errors.New("object not found") + // ErrInvalidType is returned when an invalid object type is provided. + ErrInvalidType = errors.New("invalid object type") +) + +// Object is a generic representation of any git object +type EncodedObject interface { + Hash() Hash + Type() ObjectType + SetType(ObjectType) + Size() int64 + SetSize(int64) + Reader() (io.ReadCloser, error) + Writer() (io.WriteCloser, error) +} + +// DeltaObject is an EncodedObject representing a delta. +type DeltaObject interface { + EncodedObject + // BaseHash returns the hash of the object used as base for this delta. + BaseHash() Hash + // ActualHash returns the hash of the object after applying the delta. + ActualHash() Hash + // Size returns the size of the object after applying the delta. + ActualSize() int64 +} + +// ObjectType internal object type +// Integer values from 0 to 7 map to those exposed by git. +// AnyObject is used to represent any from 0 to 7. +type ObjectType int8 + +const ( + InvalidObject ObjectType = 0 + CommitObject ObjectType = 1 + TreeObject ObjectType = 2 + BlobObject ObjectType = 3 + TagObject ObjectType = 4 + // 5 reserved for future expansion + OFSDeltaObject ObjectType = 6 + REFDeltaObject ObjectType = 7 + + AnyObject ObjectType = -127 +) + +func (t ObjectType) String() string { + switch t { + case CommitObject: + return "commit" + case TreeObject: + return "tree" + case BlobObject: + return "blob" + case TagObject: + return "tag" + case OFSDeltaObject: + return "ofs-delta" + case REFDeltaObject: + return "ref-delta" + case AnyObject: + return "any" + default: + return "unknown" + } +} + +func (t ObjectType) Bytes() []byte { + return []byte(t.String()) +} + +// Valid returns true if t is a valid ObjectType. +func (t ObjectType) Valid() bool { + return t >= CommitObject && t <= REFDeltaObject +} + +// IsDelta returns true for any ObjectTyoe that represents a delta (i.e. +// REFDeltaObject or OFSDeltaObject). +func (t ObjectType) IsDelta() bool { + return t == REFDeltaObject || t == OFSDeltaObject +} + +// ParseObjectType parses a string representation of ObjectType. It returns an +// error on parse failure. +func ParseObjectType(value string) (typ ObjectType, err error) { + switch value { + case "commit": + typ = CommitObject + case "tree": + typ = TreeObject + case "blob": + typ = BlobObject + case "tag": + typ = TagObject + case "ofs-delta": + typ = OFSDeltaObject + case "ref-delta": + typ = REFDeltaObject + default: + err = ErrInvalidType + } + return +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/blob.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/blob.go new file mode 100644 index 0000000000..8fb7576fa3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/blob.go @@ -0,0 +1,144 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// Blob is used to store arbitrary data - it is generally a file. +type Blob struct { + // Hash of the blob. + Hash plumbing.Hash + // Size of the (uncompressed) blob. + Size int64 + + obj plumbing.EncodedObject +} + +// GetBlob gets a blob from an object storer and decodes it. +func GetBlob(s storer.EncodedObjectStorer, h plumbing.Hash) (*Blob, error) { + o, err := s.EncodedObject(plumbing.BlobObject, h) + if err != nil { + return nil, err + } + + return DecodeBlob(o) +} + +// DecodeObject decodes an encoded object into a *Blob. +func DecodeBlob(o plumbing.EncodedObject) (*Blob, error) { + b := &Blob{} + if err := b.Decode(o); err != nil { + return nil, err + } + + return b, nil +} + +// ID returns the object ID of the blob. The returned value will always match +// the current value of Blob.Hash. +// +// ID is present to fulfill the Object interface. +func (b *Blob) ID() plumbing.Hash { + return b.Hash +} + +// Type returns the type of object. It always returns plumbing.BlobObject. +// +// Type is present to fulfill the Object interface. +func (b *Blob) Type() plumbing.ObjectType { + return plumbing.BlobObject +} + +// Decode transforms a plumbing.EncodedObject into a Blob struct. +func (b *Blob) Decode(o plumbing.EncodedObject) error { + if o.Type() != plumbing.BlobObject { + return ErrUnsupportedObject + } + + b.Hash = o.Hash() + b.Size = o.Size() + b.obj = o + + return nil +} + +// Encode transforms a Blob into a plumbing.EncodedObject. +func (b *Blob) Encode(o plumbing.EncodedObject) (err error) { + o.SetType(plumbing.BlobObject) + + w, err := o.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + r, err := b.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(r, &err) + + _, err = io.Copy(w, r) + return err +} + +// Reader returns a reader allow the access to the content of the blob +func (b *Blob) Reader() (io.ReadCloser, error) { + return b.obj.Reader() +} + +// BlobIter provides an iterator for a set of blobs. +type BlobIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewBlobIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns a *BlobIter that iterates over all +// blobs contained in the storer.EncodedObjectIter. +// +// Any non-blob object returned by the storer.EncodedObjectIter is skipped. +func NewBlobIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *BlobIter { + return &BlobIter{iter, s} +} + +// Next moves the iterator to the next blob and returns a pointer to it. If +// there are no more blobs, it returns io.EOF. +func (iter *BlobIter) Next() (*Blob, error) { + for { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + if obj.Type() != plumbing.BlobObject { + continue + } + + return DecodeBlob(obj) + } +} + +// ForEach call the cb function for each blob contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *BlobIter) ForEach(cb func(*Blob) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + if obj.Type() != plumbing.BlobObject { + return nil + } + + b, err := DecodeBlob(obj) + if err != nil { + return err + } + + return cb(b) + }) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/change.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/change.go new file mode 100644 index 0000000000..8b119bc9c9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/change.go @@ -0,0 +1,159 @@ +package object + +import ( + "bytes" + "context" + "fmt" + "strings" + + "github.com/go-git/go-git/v5/utils/merkletrie" +) + +// Change values represent a detected change between two git trees. For +// modifications, From is the original status of the node and To is its +// final status. For insertions, From is the zero value and for +// deletions To is the zero value. +type Change struct { + From ChangeEntry + To ChangeEntry +} + +var empty ChangeEntry + +// Action returns the kind of action represented by the change, an +// insertion, a deletion or a modification. +func (c *Change) Action() (merkletrie.Action, error) { + if c.From == empty && c.To == empty { + return merkletrie.Action(0), + fmt.Errorf("malformed change: empty from and to") + } + + if c.From == empty { + return merkletrie.Insert, nil + } + + if c.To == empty { + return merkletrie.Delete, nil + } + + return merkletrie.Modify, nil +} + +// Files return the files before and after a change. +// For insertions from will be nil. For deletions to will be nil. +func (c *Change) Files() (from, to *File, err error) { + action, err := c.Action() + if err != nil { + return + } + + if action == merkletrie.Insert || action == merkletrie.Modify { + to, err = c.To.Tree.TreeEntryFile(&c.To.TreeEntry) + if !c.To.TreeEntry.Mode.IsFile() { + return nil, nil, nil + } + + if err != nil { + return + } + } + + if action == merkletrie.Delete || action == merkletrie.Modify { + from, err = c.From.Tree.TreeEntryFile(&c.From.TreeEntry) + if !c.From.TreeEntry.Mode.IsFile() { + return nil, nil, nil + } + + if err != nil { + return + } + } + + return +} + +func (c *Change) String() string { + action, err := c.Action() + if err != nil { + return "malformed change" + } + + return fmt.Sprintf("", action, c.name()) +} + +// Patch returns a Patch with all the file changes in chunks. This +// representation can be used to create several diff outputs. +func (c *Change) Patch() (*Patch, error) { + return c.PatchContext(context.Background()) +} + +// Patch returns a Patch with all the file changes in chunks. This +// representation can be used to create several diff outputs. +// If context expires, an non-nil error will be returned +// Provided context must be non-nil +func (c *Change) PatchContext(ctx context.Context) (*Patch, error) { + return getPatchContext(ctx, "", c) +} + +func (c *Change) name() string { + if c.From != empty { + return c.From.Name + } + + return c.To.Name +} + +// ChangeEntry values represent a node that has suffered a change. +type ChangeEntry struct { + // Full path of the node using "/" as separator. + Name string + // Parent tree of the node that has changed. + Tree *Tree + // The entry of the node. + TreeEntry TreeEntry +} + +// Changes represents a collection of changes between two git trees. +// Implements sort.Interface lexicographically over the path of the +// changed files. +type Changes []*Change + +func (c Changes) Len() int { + return len(c) +} + +func (c Changes) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +func (c Changes) Less(i, j int) bool { + return strings.Compare(c[i].name(), c[j].name()) < 0 +} + +func (c Changes) String() string { + var buffer bytes.Buffer + buffer.WriteString("[") + comma := "" + for _, v := range c { + buffer.WriteString(comma) + buffer.WriteString(v.String()) + comma = ", " + } + buffer.WriteString("]") + + return buffer.String() +} + +// Patch returns a Patch with all the changes in chunks. This +// representation can be used to create several diff outputs. +func (c Changes) Patch() (*Patch, error) { + return c.PatchContext(context.Background()) +} + +// Patch returns a Patch with all the changes in chunks. This +// representation can be used to create several diff outputs. +// If context expires, an non-nil error will be returned +// Provided context must be non-nil +func (c Changes) PatchContext(ctx context.Context) (*Patch, error) { + return getPatchContext(ctx, "", c...) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/change_adaptor.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/change_adaptor.go new file mode 100644 index 0000000000..f701188288 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/change_adaptor.go @@ -0,0 +1,61 @@ +package object + +import ( + "errors" + "fmt" + + "github.com/go-git/go-git/v5/utils/merkletrie" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// The following functions transform changes types form the merkletrie +// package to changes types from this package. + +func newChange(c merkletrie.Change) (*Change, error) { + ret := &Change{} + + var err error + if ret.From, err = newChangeEntry(c.From); err != nil { + return nil, fmt.Errorf("From field: %s", err) + } + + if ret.To, err = newChangeEntry(c.To); err != nil { + return nil, fmt.Errorf("To field: %s", err) + } + + return ret, nil +} + +func newChangeEntry(p noder.Path) (ChangeEntry, error) { + if p == nil { + return empty, nil + } + + asTreeNoder, ok := p.Last().(*treeNoder) + if !ok { + return ChangeEntry{}, errors.New("cannot transform non-TreeNoders") + } + + return ChangeEntry{ + Name: p.String(), + Tree: asTreeNoder.parent, + TreeEntry: TreeEntry{ + Name: asTreeNoder.name, + Mode: asTreeNoder.mode, + Hash: asTreeNoder.hash, + }, + }, nil +} + +func newChanges(src merkletrie.Changes) (Changes, error) { + ret := make(Changes, len(src)) + var err error + for i, e := range src { + ret[i], err = newChange(e) + if err != nil { + return nil, fmt.Errorf("change #%d: %s", i, err) + } + } + + return ret, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit.go new file mode 100644 index 0000000000..7a1b8e5ae0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit.go @@ -0,0 +1,442 @@ +package object + +import ( + "bufio" + "bytes" + "context" + "errors" + "fmt" + "io" + "strings" + + "github.com/ProtonMail/go-crypto/openpgp" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +const ( + beginpgp string = "-----BEGIN PGP SIGNATURE-----" + endpgp string = "-----END PGP SIGNATURE-----" + headerpgp string = "gpgsig" +) + +// Hash represents the hash of an object +type Hash plumbing.Hash + +// Commit points to a single tree, marking it as what the project looked like +// at a certain point in time. It contains meta-information about that point +// in time, such as a timestamp, the author of the changes since the last +// commit, a pointer to the previous commit(s), etc. +// http://shafiulazam.com/gitbook/1_the_git_object_model.html +type Commit struct { + // Hash of the commit object. + Hash plumbing.Hash + // Author is the original author of the commit. + Author Signature + // Committer is the one performing the commit, might be different from + // Author. + Committer Signature + // PGPSignature is the PGP signature of the commit. + PGPSignature string + // Message is the commit message, contains arbitrary text. + Message string + // TreeHash is the hash of the root tree of the commit. + TreeHash plumbing.Hash + // ParentHashes are the hashes of the parent commits of the commit. + ParentHashes []plumbing.Hash + + s storer.EncodedObjectStorer +} + +// GetCommit gets a commit from an object storer and decodes it. +func GetCommit(s storer.EncodedObjectStorer, h plumbing.Hash) (*Commit, error) { + o, err := s.EncodedObject(plumbing.CommitObject, h) + if err != nil { + return nil, err + } + + return DecodeCommit(s, o) +} + +// DecodeCommit decodes an encoded object into a *Commit and associates it to +// the given object storer. +func DecodeCommit(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (*Commit, error) { + c := &Commit{s: s} + if err := c.Decode(o); err != nil { + return nil, err + } + + return c, nil +} + +// Tree returns the Tree from the commit. +func (c *Commit) Tree() (*Tree, error) { + return GetTree(c.s, c.TreeHash) +} + +// PatchContext returns the Patch between the actual commit and the provided one. +// Error will be return if context expires. Provided context must be non-nil. +// +// NOTE: Since version 5.1.0 the renames are correctly handled, the settings +// used are the recommended options DefaultDiffTreeOptions. +func (c *Commit) PatchContext(ctx context.Context, to *Commit) (*Patch, error) { + fromTree, err := c.Tree() + if err != nil { + return nil, err + } + + var toTree *Tree + if to != nil { + toTree, err = to.Tree() + if err != nil { + return nil, err + } + } + + return fromTree.PatchContext(ctx, toTree) +} + +// Patch returns the Patch between the actual commit and the provided one. +// +// NOTE: Since version 5.1.0 the renames are correctly handled, the settings +// used are the recommended options DefaultDiffTreeOptions. +func (c *Commit) Patch(to *Commit) (*Patch, error) { + return c.PatchContext(context.Background(), to) +} + +// Parents return a CommitIter to the parent Commits. +func (c *Commit) Parents() CommitIter { + return NewCommitIter(c.s, + storer.NewEncodedObjectLookupIter(c.s, plumbing.CommitObject, c.ParentHashes), + ) +} + +// NumParents returns the number of parents in a commit. +func (c *Commit) NumParents() int { + return len(c.ParentHashes) +} + +var ErrParentNotFound = errors.New("commit parent not found") + +// Parent returns the ith parent of a commit. +func (c *Commit) Parent(i int) (*Commit, error) { + if len(c.ParentHashes) == 0 || i > len(c.ParentHashes)-1 { + return nil, ErrParentNotFound + } + + return GetCommit(c.s, c.ParentHashes[i]) +} + +// File returns the file with the specified "path" in the commit and a +// nil error if the file exists. If the file does not exist, it returns +// a nil file and the ErrFileNotFound error. +func (c *Commit) File(path string) (*File, error) { + tree, err := c.Tree() + if err != nil { + return nil, err + } + + return tree.File(path) +} + +// Files returns a FileIter allowing to iterate over the Tree +func (c *Commit) Files() (*FileIter, error) { + tree, err := c.Tree() + if err != nil { + return nil, err + } + + return tree.Files(), nil +} + +// ID returns the object ID of the commit. The returned value will always match +// the current value of Commit.Hash. +// +// ID is present to fulfill the Object interface. +func (c *Commit) ID() plumbing.Hash { + return c.Hash +} + +// Type returns the type of object. It always returns plumbing.CommitObject. +// +// Type is present to fulfill the Object interface. +func (c *Commit) Type() plumbing.ObjectType { + return plumbing.CommitObject +} + +// Decode transforms a plumbing.EncodedObject into a Commit struct. +func (c *Commit) Decode(o plumbing.EncodedObject) (err error) { + if o.Type() != plumbing.CommitObject { + return ErrUnsupportedObject + } + + c.Hash = o.Hash() + + reader, err := o.Reader() + if err != nil { + return err + } + defer ioutil.CheckClose(reader, &err) + + r := bufPool.Get().(*bufio.Reader) + defer bufPool.Put(r) + r.Reset(reader) + + var message bool + var pgpsig bool + var msgbuf bytes.Buffer + for { + line, err := r.ReadBytes('\n') + if err != nil && err != io.EOF { + return err + } + + if pgpsig { + if len(line) > 0 && line[0] == ' ' { + line = bytes.TrimLeft(line, " ") + c.PGPSignature += string(line) + continue + } else { + pgpsig = false + } + } + + if !message { + line = bytes.TrimSpace(line) + if len(line) == 0 { + message = true + continue + } + + split := bytes.SplitN(line, []byte{' '}, 2) + + var data []byte + if len(split) == 2 { + data = split[1] + } + + switch string(split[0]) { + case "tree": + c.TreeHash = plumbing.NewHash(string(data)) + case "parent": + c.ParentHashes = append(c.ParentHashes, plumbing.NewHash(string(data))) + case "author": + c.Author.Decode(data) + case "committer": + c.Committer.Decode(data) + case headerpgp: + c.PGPSignature += string(data) + "\n" + pgpsig = true + } + } else { + msgbuf.Write(line) + } + + if err == io.EOF { + break + } + } + c.Message = msgbuf.String() + return nil +} + +// Encode transforms a Commit into a plumbing.EncodedObject. +func (c *Commit) Encode(o plumbing.EncodedObject) error { + return c.encode(o, true) +} + +// EncodeWithoutSignature export a Commit into a plumbing.EncodedObject without the signature (correspond to the payload of the PGP signature). +func (c *Commit) EncodeWithoutSignature(o plumbing.EncodedObject) error { + return c.encode(o, false) +} + +func (c *Commit) encode(o plumbing.EncodedObject, includeSig bool) (err error) { + o.SetType(plumbing.CommitObject) + w, err := o.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + + if _, err = fmt.Fprintf(w, "tree %s\n", c.TreeHash.String()); err != nil { + return err + } + + for _, parent := range c.ParentHashes { + if _, err = fmt.Fprintf(w, "parent %s\n", parent.String()); err != nil { + return err + } + } + + if _, err = fmt.Fprint(w, "author "); err != nil { + return err + } + + if err = c.Author.Encode(w); err != nil { + return err + } + + if _, err = fmt.Fprint(w, "\ncommitter "); err != nil { + return err + } + + if err = c.Committer.Encode(w); err != nil { + return err + } + + if c.PGPSignature != "" && includeSig { + if _, err = fmt.Fprint(w, "\n"+headerpgp+" "); err != nil { + return err + } + + // Split all the signature lines and re-write with a left padding and + // newline. Use join for this so it's clear that a newline should not be + // added after this section, as it will be added when the message is + // printed. + signature := strings.TrimSuffix(c.PGPSignature, "\n") + lines := strings.Split(signature, "\n") + if _, err = fmt.Fprint(w, strings.Join(lines, "\n ")); err != nil { + return err + } + } + + if _, err = fmt.Fprintf(w, "\n\n%s", c.Message); err != nil { + return err + } + + return err +} + +// Stats returns the stats of a commit. +func (c *Commit) Stats() (FileStats, error) { + return c.StatsContext(context.Background()) +} + +// StatsContext returns the stats of a commit. Error will be return if context +// expires. Provided context must be non-nil. +func (c *Commit) StatsContext(ctx context.Context) (FileStats, error) { + fromTree, err := c.Tree() + if err != nil { + return nil, err + } + + toTree := &Tree{} + if c.NumParents() != 0 { + firstParent, err := c.Parents().Next() + if err != nil { + return nil, err + } + + toTree, err = firstParent.Tree() + if err != nil { + return nil, err + } + } + + patch, err := toTree.PatchContext(ctx, fromTree) + if err != nil { + return nil, err + } + + return getFileStatsFromFilePatches(patch.FilePatches()), nil +} + +func (c *Commit) String() string { + return fmt.Sprintf( + "%s %s\nAuthor: %s\nDate: %s\n\n%s\n", + plumbing.CommitObject, c.Hash, c.Author.String(), + c.Author.When.Format(DateFormat), indent(c.Message), + ) +} + +// Verify performs PGP verification of the commit with a provided armored +// keyring and returns openpgp.Entity associated with verifying key on success. +func (c *Commit) Verify(armoredKeyRing string) (*openpgp.Entity, error) { + keyRingReader := strings.NewReader(armoredKeyRing) + keyring, err := openpgp.ReadArmoredKeyRing(keyRingReader) + if err != nil { + return nil, err + } + + // Extract signature. + signature := strings.NewReader(c.PGPSignature) + + encoded := &plumbing.MemoryObject{} + // Encode commit components, excluding signature and get a reader object. + if err := c.EncodeWithoutSignature(encoded); err != nil { + return nil, err + } + er, err := encoded.Reader() + if err != nil { + return nil, err + } + + return openpgp.CheckArmoredDetachedSignature(keyring, er, signature, nil) +} + +func indent(t string) string { + var output []string + for _, line := range strings.Split(t, "\n") { + if len(line) != 0 { + line = " " + line + } + + output = append(output, line) + } + + return strings.Join(output, "\n") +} + +// CommitIter is a generic closable interface for iterating over commits. +type CommitIter interface { + Next() (*Commit, error) + ForEach(func(*Commit) error) error + Close() +} + +// storerCommitIter provides an iterator from commits in an EncodedObjectStorer. +type storerCommitIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewCommitIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns a CommitIter that iterates over all +// commits contained in the storer.EncodedObjectIter. +// +// Any non-commit object returned by the storer.EncodedObjectIter is skipped. +func NewCommitIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) CommitIter { + return &storerCommitIter{iter, s} +} + +// Next moves the iterator to the next commit and returns a pointer to it. If +// there are no more commits, it returns io.EOF. +func (iter *storerCommitIter) Next() (*Commit, error) { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + return DecodeCommit(iter.s, obj) +} + +// ForEach call the cb function for each commit contained on this iter until +// an error appends or the end of the iter is reached. If ErrStop is sent +// the iteration is stopped but no error is returned. The iterator is closed. +func (iter *storerCommitIter) ForEach(cb func(*Commit) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + c, err := DecodeCommit(iter.s, obj) + if err != nil { + return err + } + + return cb(c) + }) +} + +func (iter *storerCommitIter) Close() { + iter.EncodedObjectIter.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker.go new file mode 100644 index 0000000000..a96b6a4cf0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker.go @@ -0,0 +1,327 @@ +package object + +import ( + "container/list" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage" +) + +type commitPreIterator struct { + seenExternal map[plumbing.Hash]bool + seen map[plumbing.Hash]bool + stack []CommitIter + start *Commit +} + +// NewCommitPreorderIter returns a CommitIter that walks the commit history, +// starting at the given commit and visiting its parents in pre-order. +// The given callback will be called for each visited commit. Each commit will +// be visited only once. If the callback returns an error, walking will stop +// and will return the error. Other errors might be returned if the history +// cannot be traversed (e.g. missing objects). Ignore allows to skip some +// commits from being iterated. +func NewCommitPreorderIter( + c *Commit, + seenExternal map[plumbing.Hash]bool, + ignore []plumbing.Hash, +) CommitIter { + seen := make(map[plumbing.Hash]bool) + for _, h := range ignore { + seen[h] = true + } + + return &commitPreIterator{ + seenExternal: seenExternal, + seen: seen, + stack: make([]CommitIter, 0), + start: c, + } +} + +func (w *commitPreIterator) Next() (*Commit, error) { + var c *Commit + for { + if w.start != nil { + c = w.start + w.start = nil + } else { + current := len(w.stack) - 1 + if current < 0 { + return nil, io.EOF + } + + var err error + c, err = w.stack[current].Next() + if err == io.EOF { + w.stack = w.stack[:current] + continue + } + + if err != nil { + return nil, err + } + } + + if w.seen[c.Hash] || w.seenExternal[c.Hash] { + continue + } + + w.seen[c.Hash] = true + + if c.NumParents() > 0 { + w.stack = append(w.stack, filteredParentIter(c, w.seen)) + } + + return c, nil + } +} + +func filteredParentIter(c *Commit, seen map[plumbing.Hash]bool) CommitIter { + var hashes []plumbing.Hash + for _, h := range c.ParentHashes { + if !seen[h] { + hashes = append(hashes, h) + } + } + + return NewCommitIter(c.s, + storer.NewEncodedObjectLookupIter(c.s, plumbing.CommitObject, hashes), + ) +} + +func (w *commitPreIterator) ForEach(cb func(*Commit) error) error { + for { + c, err := w.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (w *commitPreIterator) Close() {} + +type commitPostIterator struct { + stack []*Commit + seen map[plumbing.Hash]bool +} + +// NewCommitPostorderIter returns a CommitIter that walks the commit +// history like WalkCommitHistory but in post-order. This means that after +// walking a merge commit, the merged commit will be walked before the base +// it was merged on. This can be useful if you wish to see the history in +// chronological order. Ignore allows to skip some commits from being iterated. +func NewCommitPostorderIter(c *Commit, ignore []plumbing.Hash) CommitIter { + seen := make(map[plumbing.Hash]bool) + for _, h := range ignore { + seen[h] = true + } + + return &commitPostIterator{ + stack: []*Commit{c}, + seen: seen, + } +} + +func (w *commitPostIterator) Next() (*Commit, error) { + for { + if len(w.stack) == 0 { + return nil, io.EOF + } + + c := w.stack[len(w.stack)-1] + w.stack = w.stack[:len(w.stack)-1] + + if w.seen[c.Hash] { + continue + } + + w.seen[c.Hash] = true + + return c, c.Parents().ForEach(func(p *Commit) error { + w.stack = append(w.stack, p) + return nil + }) + } +} + +func (w *commitPostIterator) ForEach(cb func(*Commit) error) error { + for { + c, err := w.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (w *commitPostIterator) Close() {} + +// commitAllIterator stands for commit iterator for all refs. +type commitAllIterator struct { + // currCommit points to the current commit. + currCommit *list.Element +} + +// NewCommitAllIter returns a new commit iterator for all refs. +// repoStorer is a repo Storer used to get commits and references. +// commitIterFunc is a commit iterator function, used to iterate through ref commits in chosen order +func NewCommitAllIter(repoStorer storage.Storer, commitIterFunc func(*Commit) CommitIter) (CommitIter, error) { + commitsPath := list.New() + commitsLookup := make(map[plumbing.Hash]*list.Element) + head, err := storer.ResolveReference(repoStorer, plumbing.HEAD) + if err == nil { + err = addReference(repoStorer, commitIterFunc, head, commitsPath, commitsLookup) + } + + if err != nil && err != plumbing.ErrReferenceNotFound { + return nil, err + } + + // add all references along with the HEAD + refIter, err := repoStorer.IterReferences() + if err != nil { + return nil, err + } + defer refIter.Close() + + for { + ref, err := refIter.Next() + if err == io.EOF { + break + } + + if err == plumbing.ErrReferenceNotFound { + continue + } + + if err != nil { + return nil, err + } + + if err = addReference(repoStorer, commitIterFunc, ref, commitsPath, commitsLookup); err != nil { + return nil, err + } + } + + return &commitAllIterator{commitsPath.Front()}, nil +} + +func addReference( + repoStorer storage.Storer, + commitIterFunc func(*Commit) CommitIter, + ref *plumbing.Reference, + commitsPath *list.List, + commitsLookup map[plumbing.Hash]*list.Element) error { + + _, exists := commitsLookup[ref.Hash()] + if exists { + // we already have it - skip the reference. + return nil + } + + refCommit, _ := GetCommit(repoStorer, ref.Hash()) + if refCommit == nil { + // if it's not a commit - skip it. + return nil + } + + var ( + refCommits []*Commit + parent *list.Element + ) + // collect all ref commits to add + commitIter := commitIterFunc(refCommit) + for c, e := commitIter.Next(); e == nil; { + parent, exists = commitsLookup[c.Hash] + if exists { + break + } + refCommits = append(refCommits, c) + c, e = commitIter.Next() + } + commitIter.Close() + + if parent == nil { + // common parent - not found + // add all commits to the path from this ref (maybe it's a HEAD and we don't have anything, yet) + for _, c := range refCommits { + parent = commitsPath.PushBack(c) + commitsLookup[c.Hash] = parent + } + } else { + // add ref's commits to the path in reverse order (from the latest) + for i := len(refCommits) - 1; i >= 0; i-- { + c := refCommits[i] + // insert before found common parent + parent = commitsPath.InsertBefore(c, parent) + commitsLookup[c.Hash] = parent + } + } + + return nil +} + +func (it *commitAllIterator) Next() (*Commit, error) { + if it.currCommit == nil { + return nil, io.EOF + } + + c := it.currCommit.Value.(*Commit) + it.currCommit = it.currCommit.Next() + + return c, nil +} + +func (it *commitAllIterator) ForEach(cb func(*Commit) error) error { + for { + c, err := it.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (it *commitAllIterator) Close() { + it.currCommit = nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs.go new file mode 100644 index 0000000000..8047fa9bc0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs.go @@ -0,0 +1,100 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type bfsCommitIterator struct { + seenExternal map[plumbing.Hash]bool + seen map[plumbing.Hash]bool + queue []*Commit +} + +// NewCommitIterBSF returns a CommitIter that walks the commit history, +// starting at the given commit and visiting its parents in pre-order. +// The given callback will be called for each visited commit. Each commit will +// be visited only once. If the callback returns an error, walking will stop +// and will return the error. Other errors might be returned if the history +// cannot be traversed (e.g. missing objects). Ignore allows to skip some +// commits from being iterated. +func NewCommitIterBSF( + c *Commit, + seenExternal map[plumbing.Hash]bool, + ignore []plumbing.Hash, +) CommitIter { + seen := make(map[plumbing.Hash]bool) + for _, h := range ignore { + seen[h] = true + } + + return &bfsCommitIterator{ + seenExternal: seenExternal, + seen: seen, + queue: []*Commit{c}, + } +} + +func (w *bfsCommitIterator) appendHash(store storer.EncodedObjectStorer, h plumbing.Hash) error { + if w.seen[h] || w.seenExternal[h] { + return nil + } + c, err := GetCommit(store, h) + if err != nil { + return err + } + w.queue = append(w.queue, c) + return nil +} + +func (w *bfsCommitIterator) Next() (*Commit, error) { + var c *Commit + for { + if len(w.queue) == 0 { + return nil, io.EOF + } + c = w.queue[0] + w.queue = w.queue[1:] + + if w.seen[c.Hash] || w.seenExternal[c.Hash] { + continue + } + + w.seen[c.Hash] = true + + for _, h := range c.ParentHashes { + err := w.appendHash(c.s, h) + if err != nil { + return nil, err + } + } + + return c, nil + } +} + +func (w *bfsCommitIterator) ForEach(cb func(*Commit) error) error { + for { + c, err := w.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (w *bfsCommitIterator) Close() {} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs_filtered.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs_filtered.go new file mode 100644 index 0000000000..9d518133e2 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs_filtered.go @@ -0,0 +1,175 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +// NewFilterCommitIter returns a CommitIter that walks the commit history, +// starting at the passed commit and visiting its parents in Breadth-first order. +// The commits returned by the CommitIter will validate the passed CommitFilter. +// The history won't be transversed beyond a commit if isLimit is true for it. +// Each commit will be visited only once. +// If the commit history can not be traversed, or the Close() method is called, +// the CommitIter won't return more commits. +// If no isValid is passed, all ancestors of from commit will be valid. +// If no isLimit is limit, all ancestors of all commits will be visited. +func NewFilterCommitIter( + from *Commit, + isValid *CommitFilter, + isLimit *CommitFilter, +) CommitIter { + var validFilter CommitFilter + if isValid == nil { + validFilter = func(_ *Commit) bool { + return true + } + } else { + validFilter = *isValid + } + + var limitFilter CommitFilter + if isLimit == nil { + limitFilter = func(_ *Commit) bool { + return false + } + } else { + limitFilter = *isLimit + } + + return &filterCommitIter{ + isValid: validFilter, + isLimit: limitFilter, + visited: map[plumbing.Hash]struct{}{}, + queue: []*Commit{from}, + } +} + +// CommitFilter returns a boolean for the passed Commit +type CommitFilter func(*Commit) bool + +// filterCommitIter implements CommitIter +type filterCommitIter struct { + isValid CommitFilter + isLimit CommitFilter + visited map[plumbing.Hash]struct{} + queue []*Commit + lastErr error +} + +// Next returns the next commit of the CommitIter. +// It will return io.EOF if there are no more commits to visit, +// or an error if the history could not be traversed. +func (w *filterCommitIter) Next() (*Commit, error) { + var commit *Commit + var err error + for { + commit, err = w.popNewFromQueue() + if err != nil { + return nil, w.close(err) + } + + w.visited[commit.Hash] = struct{}{} + + if !w.isLimit(commit) { + err = w.addToQueue(commit.s, commit.ParentHashes...) + if err != nil { + return nil, w.close(err) + } + } + + if w.isValid(commit) { + return commit, nil + } + } +} + +// ForEach runs the passed callback over each Commit returned by the CommitIter +// until the callback returns an error or there is no more commits to traverse. +func (w *filterCommitIter) ForEach(cb func(*Commit) error) error { + for { + commit, err := w.Next() + if err == io.EOF { + break + } + + if err != nil { + return err + } + + if err := cb(commit); err == storer.ErrStop { + break + } else if err != nil { + return err + } + } + + return nil +} + +// Error returns the error that caused that the CommitIter is no longer returning commits +func (w *filterCommitIter) Error() error { + return w.lastErr +} + +// Close closes the CommitIter +func (w *filterCommitIter) Close() { + w.visited = map[plumbing.Hash]struct{}{} + w.queue = []*Commit{} + w.isLimit = nil + w.isValid = nil +} + +// close closes the CommitIter with an error +func (w *filterCommitIter) close(err error) error { + w.Close() + w.lastErr = err + return err +} + +// popNewFromQueue returns the first new commit from the internal fifo queue, +// or an io.EOF error if the queue is empty +func (w *filterCommitIter) popNewFromQueue() (*Commit, error) { + var first *Commit + for { + if len(w.queue) == 0 { + if w.lastErr != nil { + return nil, w.lastErr + } + + return nil, io.EOF + } + + first = w.queue[0] + w.queue = w.queue[1:] + if _, ok := w.visited[first.Hash]; ok { + continue + } + + return first, nil + } +} + +// addToQueue adds the passed commits to the internal fifo queue if they weren't seen +// or returns an error if the passed hashes could not be used to get valid commits +func (w *filterCommitIter) addToQueue( + store storer.EncodedObjectStorer, + hashes ...plumbing.Hash, +) error { + for _, hash := range hashes { + if _, ok := w.visited[hash]; ok { + continue + } + + commit, err := GetCommit(store, hash) + if err != nil { + return err + } + + w.queue = append(w.queue, commit) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_ctime.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_ctime.go new file mode 100644 index 0000000000..fbddf1d238 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_ctime.go @@ -0,0 +1,103 @@ +package object + +import ( + "io" + + "github.com/emirpasic/gods/trees/binaryheap" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type commitIteratorByCTime struct { + seenExternal map[plumbing.Hash]bool + seen map[plumbing.Hash]bool + heap *binaryheap.Heap +} + +// NewCommitIterCTime returns a CommitIter that walks the commit history, +// starting at the given commit and visiting its parents while preserving Committer Time order. +// this appears to be the closest order to `git log` +// The given callback will be called for each visited commit. Each commit will +// be visited only once. If the callback returns an error, walking will stop +// and will return the error. Other errors might be returned if the history +// cannot be traversed (e.g. missing objects). Ignore allows to skip some +// commits from being iterated. +func NewCommitIterCTime( + c *Commit, + seenExternal map[plumbing.Hash]bool, + ignore []plumbing.Hash, +) CommitIter { + seen := make(map[plumbing.Hash]bool) + for _, h := range ignore { + seen[h] = true + } + + heap := binaryheap.NewWith(func(a, b interface{}) int { + if a.(*Commit).Committer.When.Before(b.(*Commit).Committer.When) { + return 1 + } + return -1 + }) + heap.Push(c) + + return &commitIteratorByCTime{ + seenExternal: seenExternal, + seen: seen, + heap: heap, + } +} + +func (w *commitIteratorByCTime) Next() (*Commit, error) { + var c *Commit + for { + cIn, ok := w.heap.Pop() + if !ok { + return nil, io.EOF + } + c = cIn.(*Commit) + + if w.seen[c.Hash] || w.seenExternal[c.Hash] { + continue + } + + w.seen[c.Hash] = true + + for _, h := range c.ParentHashes { + if w.seen[h] || w.seenExternal[h] { + continue + } + pc, err := GetCommit(c.s, h) + if err != nil { + return nil, err + } + w.heap.Push(pc) + } + + return c, nil + } +} + +func (w *commitIteratorByCTime) ForEach(cb func(*Commit) error) error { + for { + c, err := w.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + err = cb(c) + if err == storer.ErrStop { + break + } + if err != nil { + return err + } + } + + return nil +} + +func (w *commitIteratorByCTime) Close() {} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_limit.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_limit.go new file mode 100644 index 0000000000..ac56a71c41 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_limit.go @@ -0,0 +1,65 @@ +package object + +import ( + "io" + "time" + + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type commitLimitIter struct { + sourceIter CommitIter + limitOptions LogLimitOptions +} + +type LogLimitOptions struct { + Since *time.Time + Until *time.Time +} + +func NewCommitLimitIterFromIter(commitIter CommitIter, limitOptions LogLimitOptions) CommitIter { + iterator := new(commitLimitIter) + iterator.sourceIter = commitIter + iterator.limitOptions = limitOptions + return iterator +} + +func (c *commitLimitIter) Next() (*Commit, error) { + for { + commit, err := c.sourceIter.Next() + if err != nil { + return nil, err + } + + if c.limitOptions.Since != nil && commit.Committer.When.Before(*c.limitOptions.Since) { + continue + } + if c.limitOptions.Until != nil && commit.Committer.When.After(*c.limitOptions.Until) { + continue + } + return commit, nil + } +} + +func (c *commitLimitIter) ForEach(cb func(*Commit) error) error { + for { + commit, nextErr := c.Next() + if nextErr == io.EOF { + break + } + if nextErr != nil { + return nextErr + } + err := cb(commit) + if err == storer.ErrStop { + return nil + } else if err != nil { + return err + } + } + return nil +} + +func (c *commitLimitIter) Close() { + c.sourceIter.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_path.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_path.go new file mode 100644 index 0000000000..aa0ca15fd0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_path.go @@ -0,0 +1,160 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type commitPathIter struct { + pathFilter func(string) bool + sourceIter CommitIter + currentCommit *Commit + checkParent bool +} + +// NewCommitPathIterFromIter returns a commit iterator which performs diffTree between +// successive trees returned from the commit iterator from the argument. The purpose of this is +// to find the commits that explain how the files that match the path came to be. +// If checkParent is true then the function double checks if potential parent (next commit in a path) +// is one of the parents in the tree (it's used by `git log --all`). +// pathFilter is a function that takes path of file as argument and returns true if we want it +func NewCommitPathIterFromIter(pathFilter func(string) bool, commitIter CommitIter, checkParent bool) CommitIter { + iterator := new(commitPathIter) + iterator.sourceIter = commitIter + iterator.pathFilter = pathFilter + iterator.checkParent = checkParent + return iterator +} + +// NewCommitFileIterFromIter is kept for compatibility, can be replaced with NewCommitPathIterFromIter +func NewCommitFileIterFromIter(fileName string, commitIter CommitIter, checkParent bool) CommitIter { + return NewCommitPathIterFromIter( + func(path string) bool { + return path == fileName + }, + commitIter, + checkParent, + ) +} + +func (c *commitPathIter) Next() (*Commit, error) { + if c.currentCommit == nil { + var err error + c.currentCommit, err = c.sourceIter.Next() + if err != nil { + return nil, err + } + } + commit, commitErr := c.getNextFileCommit() + + // Setting current-commit to nil to prevent unwanted states when errors are raised + if commitErr != nil { + c.currentCommit = nil + } + return commit, commitErr +} + +func (c *commitPathIter) getNextFileCommit() (*Commit, error) { + for { + // Parent-commit can be nil if the current-commit is the initial commit + parentCommit, parentCommitErr := c.sourceIter.Next() + if parentCommitErr != nil { + // If the parent-commit is beyond the initial commit, keep it nil + if parentCommitErr != io.EOF { + return nil, parentCommitErr + } + parentCommit = nil + } + + // Fetch the trees of the current and parent commits + currentTree, currTreeErr := c.currentCommit.Tree() + if currTreeErr != nil { + return nil, currTreeErr + } + + var parentTree *Tree + if parentCommit != nil { + var parentTreeErr error + parentTree, parentTreeErr = parentCommit.Tree() + if parentTreeErr != nil { + return nil, parentTreeErr + } + } + + // Find diff between current and parent trees + changes, diffErr := DiffTree(currentTree, parentTree) + if diffErr != nil { + return nil, diffErr + } + + found := c.hasFileChange(changes, parentCommit) + + // Storing the current-commit in-case a change is found, and + // Updating the current-commit for the next-iteration + prevCommit := c.currentCommit + c.currentCommit = parentCommit + + if found { + return prevCommit, nil + } + + // If not matches found and if parent-commit is beyond the initial commit, then return with EOF + if parentCommit == nil { + return nil, io.EOF + } + } +} + +func (c *commitPathIter) hasFileChange(changes Changes, parent *Commit) bool { + for _, change := range changes { + if !c.pathFilter(change.name()) { + continue + } + + // filename matches, now check if source iterator contains all commits (from all refs) + if c.checkParent { + if parent != nil && isParentHash(parent.Hash, c.currentCommit) { + return true + } + continue + } + + return true + } + + return false +} + +func isParentHash(hash plumbing.Hash, commit *Commit) bool { + for _, h := range commit.ParentHashes { + if h == hash { + return true + } + } + return false +} + +func (c *commitPathIter) ForEach(cb func(*Commit) error) error { + for { + commit, nextErr := c.Next() + if nextErr == io.EOF { + break + } + if nextErr != nil { + return nextErr + } + err := cb(commit) + if err == storer.ErrStop { + return nil + } else if err != nil { + return err + } + } + return nil +} + +func (c *commitPathIter) Close() { + c.sourceIter.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/common.go new file mode 100644 index 0000000000..3591f5f0a6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/common.go @@ -0,0 +1,12 @@ +package object + +import ( + "bufio" + "sync" +) + +var bufPool = sync.Pool{ + New: func() interface{} { + return bufio.NewReader(nil) + }, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/difftree.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/difftree.go new file mode 100644 index 0000000000..7c2222702c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/difftree.go @@ -0,0 +1,98 @@ +package object + +import ( + "bytes" + "context" + + "github.com/go-git/go-git/v5/utils/merkletrie" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// DiffTree compares the content and mode of the blobs found via two +// tree objects. +// DiffTree does not perform rename detection, use DiffTreeWithOptions +// instead to detect renames. +func DiffTree(a, b *Tree) (Changes, error) { + return DiffTreeContext(context.Background(), a, b) +} + +// DiffTreeContext compares the content and mode of the blobs found via two +// tree objects. Provided context must be non-nil. +// An error will be returned if context expires. +func DiffTreeContext(ctx context.Context, a, b *Tree) (Changes, error) { + return DiffTreeWithOptions(ctx, a, b, nil) +} + +// DiffTreeOptions are the configurable options when performing a diff tree. +type DiffTreeOptions struct { + // DetectRenames is whether the diff tree will use rename detection. + DetectRenames bool + // RenameScore is the threshold to of similarity between files to consider + // that a pair of delete and insert are a rename. The number must be + // exactly between 0 and 100. + RenameScore uint + // RenameLimit is the maximum amount of files that can be compared when + // detecting renames. The number of comparisons that have to be performed + // is equal to the number of deleted files * the number of added files. + // That means, that if 100 files were deleted and 50 files were added, 5000 + // file comparisons may be needed. So, if the rename limit is 50, the number + // of both deleted and added needs to be equal or less than 50. + // A value of 0 means no limit. + RenameLimit uint + // OnlyExactRenames performs only detection of exact renames and will not perform + // any detection of renames based on file similarity. + OnlyExactRenames bool +} + +// DefaultDiffTreeOptions are the default and recommended options for the +// diff tree. +var DefaultDiffTreeOptions = &DiffTreeOptions{ + DetectRenames: true, + RenameScore: 60, + RenameLimit: 0, + OnlyExactRenames: false, +} + +// DiffTreeWithOptions compares the content and mode of the blobs found +// via two tree objects with the given options. The provided context +// must be non-nil. +// If no options are passed, no rename detection will be performed. The +// recommended options are DefaultDiffTreeOptions. +// An error will be returned if the context expires. +// This function will be deprecated and removed in v6 so the default +// behaviour of DiffTree is to detect renames. +func DiffTreeWithOptions( + ctx context.Context, + a, b *Tree, + opts *DiffTreeOptions, +) (Changes, error) { + from := NewTreeRootNode(a) + to := NewTreeRootNode(b) + + hashEqual := func(a, b noder.Hasher) bool { + return bytes.Equal(a.Hash(), b.Hash()) + } + + merkletrieChanges, err := merkletrie.DiffTreeContext(ctx, from, to, hashEqual) + if err != nil { + if err == merkletrie.ErrCanceled { + return nil, ErrCanceled + } + return nil, err + } + + changes, err := newChanges(merkletrieChanges) + if err != nil { + return nil, err + } + + if opts == nil { + opts = new(DiffTreeOptions) + } + + if opts.DetectRenames { + return DetectRenames(changes, opts) + } + + return changes, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/file.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/file.go new file mode 100644 index 0000000000..6cc5367d8d --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/file.go @@ -0,0 +1,137 @@ +package object + +import ( + "bytes" + "io" + "strings" + + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/binary" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// File represents git file objects. +type File struct { + // Name is the path of the file. It might be relative to a tree, + // depending of the function that generates it. + Name string + // Mode is the file mode. + Mode filemode.FileMode + // Blob with the contents of the file. + Blob +} + +// NewFile returns a File based on the given blob object +func NewFile(name string, m filemode.FileMode, b *Blob) *File { + return &File{Name: name, Mode: m, Blob: *b} +} + +// Contents returns the contents of a file as a string. +func (f *File) Contents() (content string, err error) { + reader, err := f.Reader() + if err != nil { + return "", err + } + defer ioutil.CheckClose(reader, &err) + + buf := new(bytes.Buffer) + if _, err := buf.ReadFrom(reader); err != nil { + return "", err + } + + return buf.String(), nil +} + +// IsBinary returns if the file is binary or not +func (f *File) IsBinary() (bin bool, err error) { + reader, err := f.Reader() + if err != nil { + return false, err + } + defer ioutil.CheckClose(reader, &err) + + return binary.IsBinary(reader) +} + +// Lines returns a slice of lines from the contents of a file, stripping +// all end of line characters. If the last line is empty (does not end +// in an end of line), it is also stripped. +func (f *File) Lines() ([]string, error) { + content, err := f.Contents() + if err != nil { + return nil, err + } + + splits := strings.Split(content, "\n") + // remove the last line if it is empty + if splits[len(splits)-1] == "" { + return splits[:len(splits)-1], nil + } + + return splits, nil +} + +// FileIter provides an iterator for the files in a tree. +type FileIter struct { + s storer.EncodedObjectStorer + w TreeWalker +} + +// NewFileIter takes a storer.EncodedObjectStorer and a Tree and returns a +// *FileIter that iterates over all files contained in the tree, recursively. +func NewFileIter(s storer.EncodedObjectStorer, t *Tree) *FileIter { + return &FileIter{s: s, w: *NewTreeWalker(t, true, nil)} +} + +// Next moves the iterator to the next file and returns a pointer to it. If +// there are no more files, it returns io.EOF. +func (iter *FileIter) Next() (*File, error) { + for { + name, entry, err := iter.w.Next() + if err != nil { + return nil, err + } + + if entry.Mode == filemode.Dir || entry.Mode == filemode.Submodule { + continue + } + + blob, err := GetBlob(iter.s, entry.Hash) + if err != nil { + return nil, err + } + + return NewFile(name, entry.Mode, blob), nil + } +} + +// ForEach call the cb function for each file contained in this iter until +// an error happens or the end of the iter is reached. If plumbing.ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *FileIter) ForEach(cb func(*File) error) error { + defer iter.Close() + + for { + f, err := iter.Next() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := cb(f); err != nil { + if err == storer.ErrStop { + return nil + } + + return err + } + } +} + +func (iter *FileIter) Close() { + iter.w.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/merge_base.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/merge_base.go new file mode 100644 index 0000000000..b412361d02 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/merge_base.go @@ -0,0 +1,210 @@ +package object + +import ( + "fmt" + "sort" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +// errIsReachable is thrown when first commit is an ancestor of the second +var errIsReachable = fmt.Errorf("first is reachable from second") + +// MergeBase mimics the behavior of `git merge-base actual other`, returning the +// best common ancestor between the actual and the passed one. +// The best common ancestors can not be reached from other common ancestors. +func (c *Commit) MergeBase(other *Commit) ([]*Commit, error) { + // use sortedByCommitDateDesc strategy + sorted := sortByCommitDateDesc(c, other) + newer := sorted[0] + older := sorted[1] + + newerHistory, err := ancestorsIndex(older, newer) + if err == errIsReachable { + return []*Commit{older}, nil + } + + if err != nil { + return nil, err + } + + var res []*Commit + inNewerHistory := isInIndexCommitFilter(newerHistory) + resIter := NewFilterCommitIter(older, &inNewerHistory, &inNewerHistory) + _ = resIter.ForEach(func(commit *Commit) error { + res = append(res, commit) + return nil + }) + + return Independents(res) +} + +// IsAncestor returns true if the actual commit is ancestor of the passed one. +// It returns an error if the history is not transversable +// It mimics the behavior of `git merge --is-ancestor actual other` +func (c *Commit) IsAncestor(other *Commit) (bool, error) { + found := false + iter := NewCommitPreorderIter(other, nil, nil) + err := iter.ForEach(func(comm *Commit) error { + if comm.Hash != c.Hash { + return nil + } + + found = true + return storer.ErrStop + }) + + return found, err +} + +// ancestorsIndex returns a map with the ancestors of the starting commit if the +// excluded one is not one of them. It returns errIsReachable if the excluded commit +// is ancestor of the starting, or another error if the history is not traversable. +func ancestorsIndex(excluded, starting *Commit) (map[plumbing.Hash]struct{}, error) { + if excluded.Hash.String() == starting.Hash.String() { + return nil, errIsReachable + } + + startingHistory := map[plumbing.Hash]struct{}{} + startingIter := NewCommitIterBSF(starting, nil, nil) + err := startingIter.ForEach(func(commit *Commit) error { + if commit.Hash == excluded.Hash { + return errIsReachable + } + + startingHistory[commit.Hash] = struct{}{} + return nil + }) + + if err != nil { + return nil, err + } + + return startingHistory, nil +} + +// Independents returns a subset of the passed commits, that are not reachable the others +// It mimics the behavior of `git merge-base --independent commit...`. +func Independents(commits []*Commit) ([]*Commit, error) { + // use sortedByCommitDateDesc strategy + candidates := sortByCommitDateDesc(commits...) + candidates = removeDuplicated(candidates) + + seen := map[plumbing.Hash]struct{}{} + var isLimit CommitFilter = func(commit *Commit) bool { + _, ok := seen[commit.Hash] + return ok + } + + if len(candidates) < 2 { + return candidates, nil + } + + pos := 0 + for { + from := candidates[pos] + others := remove(candidates, from) + fromHistoryIter := NewFilterCommitIter(from, nil, &isLimit) + err := fromHistoryIter.ForEach(func(fromAncestor *Commit) error { + for _, other := range others { + if fromAncestor.Hash == other.Hash { + candidates = remove(candidates, other) + others = remove(others, other) + } + } + + if len(candidates) == 1 { + return storer.ErrStop + } + + seen[fromAncestor.Hash] = struct{}{} + return nil + }) + + if err != nil { + return nil, err + } + + nextPos := indexOf(candidates, from) + 1 + if nextPos >= len(candidates) { + break + } + + pos = nextPos + } + + return candidates, nil +} + +// sortByCommitDateDesc returns the passed commits, sorted by `committer.When desc` +// +// Following this strategy, it is tried to reduce the time needed when walking +// the history from one commit to reach the others. It is assumed that ancestors +// use to be committed before its descendant; +// That way `Independents(A^, A)` will be processed as being `Independents(A, A^)`; +// so starting by `A` it will be reached `A^` way sooner than walking from `A^` +// to the initial commit, and then from `A` to `A^`. +func sortByCommitDateDesc(commits ...*Commit) []*Commit { + sorted := make([]*Commit, len(commits)) + copy(sorted, commits) + sort.Slice(sorted, func(i, j int) bool { + return sorted[i].Committer.When.After(sorted[j].Committer.When) + }) + + return sorted +} + +// indexOf returns the first position where target was found in the passed commits +func indexOf(commits []*Commit, target *Commit) int { + for i, commit := range commits { + if target.Hash == commit.Hash { + return i + } + } + + return -1 +} + +// remove returns the passed commits excluding the commit toDelete +func remove(commits []*Commit, toDelete *Commit) []*Commit { + res := make([]*Commit, len(commits)) + j := 0 + for _, commit := range commits { + if commit.Hash == toDelete.Hash { + continue + } + + res[j] = commit + j++ + } + + return res[:j] +} + +// removeDuplicated removes duplicated commits from the passed slice of commits +func removeDuplicated(commits []*Commit) []*Commit { + seen := make(map[plumbing.Hash]struct{}, len(commits)) + res := make([]*Commit, len(commits)) + j := 0 + for _, commit := range commits { + if _, ok := seen[commit.Hash]; ok { + continue + } + + seen[commit.Hash] = struct{}{} + res[j] = commit + j++ + } + + return res[:j] +} + +// isInIndexCommitFilter returns a commitFilter that returns true +// if the commit is in the passed index. +func isInIndexCommitFilter(index map[plumbing.Hash]struct{}) CommitFilter { + return func(c *Commit) bool { + _, ok := index[c.Hash] + return ok + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/object.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/object.go new file mode 100644 index 0000000000..13b1e91c9c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/object.go @@ -0,0 +1,239 @@ +// Package object contains implementations of all Git objects and utility +// functions to work with them. +package object + +import ( + "bytes" + "errors" + "fmt" + "io" + "strconv" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +// ErrUnsupportedObject trigger when a non-supported object is being decoded. +var ErrUnsupportedObject = errors.New("unsupported object type") + +// Object is a generic representation of any git object. It is implemented by +// Commit, Tree, Blob, and Tag, and includes the functions that are common to +// them. +// +// Object is returned when an object can be of any type. It is frequently used +// with a type cast to acquire the specific type of object: +// +// func process(obj Object) { +// switch o := obj.(type) { +// case *Commit: +// // o is a Commit +// case *Tree: +// // o is a Tree +// case *Blob: +// // o is a Blob +// case *Tag: +// // o is a Tag +// } +// } +// +// This interface is intentionally different from plumbing.EncodedObject, which +// is a lower level interface used by storage implementations to read and write +// objects in its encoded form. +type Object interface { + ID() plumbing.Hash + Type() plumbing.ObjectType + Decode(plumbing.EncodedObject) error + Encode(plumbing.EncodedObject) error +} + +// GetObject gets an object from an object storer and decodes it. +func GetObject(s storer.EncodedObjectStorer, h plumbing.Hash) (Object, error) { + o, err := s.EncodedObject(plumbing.AnyObject, h) + if err != nil { + return nil, err + } + + return DecodeObject(s, o) +} + +// DecodeObject decodes an encoded object into an Object and associates it to +// the given object storer. +func DecodeObject(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (Object, error) { + switch o.Type() { + case plumbing.CommitObject: + return DecodeCommit(s, o) + case plumbing.TreeObject: + return DecodeTree(s, o) + case plumbing.BlobObject: + return DecodeBlob(o) + case plumbing.TagObject: + return DecodeTag(s, o) + default: + return nil, plumbing.ErrInvalidType + } +} + +// DateFormat is the format being used in the original git implementation +const DateFormat = "Mon Jan 02 15:04:05 2006 -0700" + +// Signature is used to identify who and when created a commit or tag. +type Signature struct { + // Name represents a person name. It is an arbitrary string. + Name string + // Email is an email, but it cannot be assumed to be well-formed. + Email string + // When is the timestamp of the signature. + When time.Time +} + +// Decode decodes a byte slice into a signature +func (s *Signature) Decode(b []byte) { + open := bytes.LastIndexByte(b, '<') + close := bytes.LastIndexByte(b, '>') + if open == -1 || close == -1 { + return + } + + if close < open { + return + } + + s.Name = string(bytes.Trim(b[:open], " ")) + s.Email = string(b[open+1 : close]) + + hasTime := close+2 < len(b) + if hasTime { + s.decodeTimeAndTimeZone(b[close+2:]) + } +} + +// Encode encodes a Signature into a writer. +func (s *Signature) Encode(w io.Writer) error { + if _, err := fmt.Fprintf(w, "%s <%s> ", s.Name, s.Email); err != nil { + return err + } + if err := s.encodeTimeAndTimeZone(w); err != nil { + return err + } + return nil +} + +var timeZoneLength = 5 + +func (s *Signature) decodeTimeAndTimeZone(b []byte) { + space := bytes.IndexByte(b, ' ') + if space == -1 { + space = len(b) + } + + ts, err := strconv.ParseInt(string(b[:space]), 10, 64) + if err != nil { + return + } + + s.When = time.Unix(ts, 0).In(time.UTC) + var tzStart = space + 1 + if tzStart >= len(b) || tzStart+timeZoneLength > len(b) { + return + } + + timezone := string(b[tzStart : tzStart+timeZoneLength]) + tzhours, err1 := strconv.ParseInt(timezone[0:3], 10, 64) + tzmins, err2 := strconv.ParseInt(timezone[3:], 10, 64) + if err1 != nil || err2 != nil { + return + } + if tzhours < 0 { + tzmins *= -1 + } + + tz := time.FixedZone("", int(tzhours*60*60+tzmins*60)) + + s.When = s.When.In(tz) +} + +func (s *Signature) encodeTimeAndTimeZone(w io.Writer) error { + u := s.When.Unix() + if u < 0 { + u = 0 + } + _, err := fmt.Fprintf(w, "%d %s", u, s.When.Format("-0700")) + return err +} + +func (s *Signature) String() string { + return fmt.Sprintf("%s <%s>", s.Name, s.Email) +} + +// ObjectIter provides an iterator for a set of objects. +type ObjectIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewObjectIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns an *ObjectIter that iterates over all +// objects contained in the storer.EncodedObjectIter. +func NewObjectIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *ObjectIter { + return &ObjectIter{iter, s} +} + +// Next moves the iterator to the next object and returns a pointer to it. If +// there are no more objects, it returns io.EOF. +func (iter *ObjectIter) Next() (Object, error) { + for { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + o, err := iter.toObject(obj) + if err == plumbing.ErrInvalidType { + continue + } + + if err != nil { + return nil, err + } + + return o, nil + } +} + +// ForEach call the cb function for each object contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *ObjectIter) ForEach(cb func(Object) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + o, err := iter.toObject(obj) + if err == plumbing.ErrInvalidType { + return nil + } + + if err != nil { + return err + } + + return cb(o) + }) +} + +func (iter *ObjectIter) toObject(obj plumbing.EncodedObject) (Object, error) { + switch obj.Type() { + case plumbing.BlobObject: + blob := &Blob{} + return blob, blob.Decode(obj) + case plumbing.TreeObject: + tree := &Tree{s: iter.s} + return tree, tree.Decode(obj) + case plumbing.CommitObject: + commit := &Commit{} + return commit, commit.Decode(obj) + case plumbing.TagObject: + tag := &Tag{} + return tag, tag.Decode(obj) + default: + return nil, plumbing.ErrInvalidType + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/patch.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/patch.go new file mode 100644 index 0000000000..56b62c191f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/patch.go @@ -0,0 +1,354 @@ +package object + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "math" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + fdiff "github.com/go-git/go-git/v5/plumbing/format/diff" + "github.com/go-git/go-git/v5/utils/diff" + + dmp "github.com/sergi/go-diff/diffmatchpatch" +) + +var ( + ErrCanceled = errors.New("operation canceled") +) + +func getPatch(message string, changes ...*Change) (*Patch, error) { + ctx := context.Background() + return getPatchContext(ctx, message, changes...) +} + +func getPatchContext(ctx context.Context, message string, changes ...*Change) (*Patch, error) { + var filePatches []fdiff.FilePatch + for _, c := range changes { + select { + case <-ctx.Done(): + return nil, ErrCanceled + default: + } + + fp, err := filePatchWithContext(ctx, c) + if err != nil { + return nil, err + } + + filePatches = append(filePatches, fp) + } + + return &Patch{message, filePatches}, nil +} + +func filePatchWithContext(ctx context.Context, c *Change) (fdiff.FilePatch, error) { + from, to, err := c.Files() + if err != nil { + return nil, err + } + fromContent, fIsBinary, err := fileContent(from) + if err != nil { + return nil, err + } + + toContent, tIsBinary, err := fileContent(to) + if err != nil { + return nil, err + } + + if fIsBinary || tIsBinary { + return &textFilePatch{from: c.From, to: c.To}, nil + } + + diffs := diff.Do(fromContent, toContent) + + var chunks []fdiff.Chunk + for _, d := range diffs { + select { + case <-ctx.Done(): + return nil, ErrCanceled + default: + } + + var op fdiff.Operation + switch d.Type { + case dmp.DiffEqual: + op = fdiff.Equal + case dmp.DiffDelete: + op = fdiff.Delete + case dmp.DiffInsert: + op = fdiff.Add + } + + chunks = append(chunks, &textChunk{d.Text, op}) + } + + return &textFilePatch{ + chunks: chunks, + from: c.From, + to: c.To, + }, nil + +} + +func filePatch(c *Change) (fdiff.FilePatch, error) { + return filePatchWithContext(context.Background(), c) +} + +func fileContent(f *File) (content string, isBinary bool, err error) { + if f == nil { + return + } + + isBinary, err = f.IsBinary() + if err != nil || isBinary { + return + } + + content, err = f.Contents() + + return +} + +// Patch is an implementation of fdiff.Patch interface +type Patch struct { + message string + filePatches []fdiff.FilePatch +} + +func (p *Patch) FilePatches() []fdiff.FilePatch { + return p.filePatches +} + +func (p *Patch) Message() string { + return p.message +} + +func (p *Patch) Encode(w io.Writer) error { + ue := fdiff.NewUnifiedEncoder(w, fdiff.DefaultContextLines) + + return ue.Encode(p) +} + +func (p *Patch) Stats() FileStats { + return getFileStatsFromFilePatches(p.FilePatches()) +} + +func (p *Patch) String() string { + buf := bytes.NewBuffer(nil) + err := p.Encode(buf) + if err != nil { + return fmt.Sprintf("malformed patch: %s", err.Error()) + } + + return buf.String() +} + +// changeEntryWrapper is an implementation of fdiff.File interface +type changeEntryWrapper struct { + ce ChangeEntry +} + +func (f *changeEntryWrapper) Hash() plumbing.Hash { + if !f.ce.TreeEntry.Mode.IsFile() { + return plumbing.ZeroHash + } + + return f.ce.TreeEntry.Hash +} + +func (f *changeEntryWrapper) Mode() filemode.FileMode { + return f.ce.TreeEntry.Mode +} +func (f *changeEntryWrapper) Path() string { + if !f.ce.TreeEntry.Mode.IsFile() { + return "" + } + + return f.ce.Name +} + +func (f *changeEntryWrapper) Empty() bool { + return !f.ce.TreeEntry.Mode.IsFile() +} + +// textFilePatch is an implementation of fdiff.FilePatch interface +type textFilePatch struct { + chunks []fdiff.Chunk + from, to ChangeEntry +} + +func (tf *textFilePatch) Files() (from fdiff.File, to fdiff.File) { + f := &changeEntryWrapper{tf.from} + t := &changeEntryWrapper{tf.to} + + if !f.Empty() { + from = f + } + + if !t.Empty() { + to = t + } + + return +} + +func (tf *textFilePatch) IsBinary() bool { + return len(tf.chunks) == 0 +} + +func (tf *textFilePatch) Chunks() []fdiff.Chunk { + return tf.chunks +} + +// textChunk is an implementation of fdiff.Chunk interface +type textChunk struct { + content string + op fdiff.Operation +} + +func (t *textChunk) Content() string { + return t.content +} + +func (t *textChunk) Type() fdiff.Operation { + return t.op +} + +// FileStat stores the status of changes in content of a file. +type FileStat struct { + Name string + Addition int + Deletion int +} + +func (fs FileStat) String() string { + return printStat([]FileStat{fs}) +} + +// FileStats is a collection of FileStat. +type FileStats []FileStat + +func (fileStats FileStats) String() string { + return printStat(fileStats) +} + +func printStat(fileStats []FileStat) string { + padLength := float64(len(" ")) + newlineLength := float64(len("\n")) + separatorLength := float64(len("|")) + // Soft line length limit. The text length calculation below excludes + // length of the change number. Adding that would take it closer to 80, + // but probably not more than 80, until it's a huge number. + lineLength := 72.0 + + // Get the longest filename and longest total change. + var longestLength float64 + var longestTotalChange float64 + for _, fs := range fileStats { + if int(longestLength) < len(fs.Name) { + longestLength = float64(len(fs.Name)) + } + totalChange := fs.Addition + fs.Deletion + if int(longestTotalChange) < totalChange { + longestTotalChange = float64(totalChange) + } + } + + // Parts of the output: + // |<+++/---> + // example: " main.go | 10 +++++++--- " + + // + leftTextLength := padLength + longestLength + padLength + + // <+++++/-----> + // Excluding number length here. + rightTextLength := padLength + padLength + newlineLength + + totalTextArea := leftTextLength + separatorLength + rightTextLength + heightOfHistogram := lineLength - totalTextArea + + // Scale the histogram. + var scaleFactor float64 + if longestTotalChange > heightOfHistogram { + // Scale down to heightOfHistogram. + scaleFactor = longestTotalChange / heightOfHistogram + } else { + scaleFactor = 1.0 + } + + finalOutput := "" + for _, fs := range fileStats { + addn := float64(fs.Addition) + deln := float64(fs.Deletion) + addc := int(math.Floor(addn/scaleFactor)) + delc := int(math.Floor(deln/scaleFactor)) + if addc < 0 { + addc = 0 + } + if delc < 0 { + delc = 0 + } + adds := strings.Repeat("+", addc) + dels := strings.Repeat("-", delc) + finalOutput += fmt.Sprintf(" %s | %d %s%s\n", fs.Name, (fs.Addition + fs.Deletion), adds, dels) + } + + return finalOutput +} + +func getFileStatsFromFilePatches(filePatches []fdiff.FilePatch) FileStats { + var fileStats FileStats + + for _, fp := range filePatches { + // ignore empty patches (binary files, submodule refs updates) + if len(fp.Chunks()) == 0 { + continue + } + + cs := FileStat{} + from, to := fp.Files() + if from == nil { + // New File is created. + cs.Name = to.Path() + } else if to == nil { + // File is deleted. + cs.Name = from.Path() + } else if from.Path() != to.Path() { + // File is renamed. Not supported. + // cs.Name = fmt.Sprintf("%s => %s", from.Path(), to.Path()) + } else { + cs.Name = from.Path() + } + + for _, chunk := range fp.Chunks() { + s := chunk.Content() + if len(s) == 0 { + continue + } + + switch chunk.Type() { + case fdiff.Add: + cs.Addition += strings.Count(s, "\n") + if s[len(s)-1] != '\n' { + cs.Addition++ + } + case fdiff.Delete: + cs.Deletion += strings.Count(s, "\n") + if s[len(s)-1] != '\n' { + cs.Deletion++ + } + } + } + + fileStats = append(fileStats, cs) + } + + return fileStats +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go new file mode 100644 index 0000000000..7fed72c2f5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go @@ -0,0 +1,813 @@ +package object + +import ( + "errors" + "io" + "sort" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/go-git/go-git/v5/utils/merkletrie" +) + +// DetectRenames detects the renames in the given changes on two trees with +// the given options. It will return the given changes grouping additions and +// deletions into modifications when possible. +// If options is nil, the default diff tree options will be used. +func DetectRenames( + changes Changes, + opts *DiffTreeOptions, +) (Changes, error) { + if opts == nil { + opts = DefaultDiffTreeOptions + } + + detector := &renameDetector{ + renameScore: int(opts.RenameScore), + renameLimit: int(opts.RenameLimit), + onlyExact: opts.OnlyExactRenames, + } + + for _, c := range changes { + action, err := c.Action() + if err != nil { + return nil, err + } + + switch action { + case merkletrie.Insert: + detector.added = append(detector.added, c) + case merkletrie.Delete: + detector.deleted = append(detector.deleted, c) + default: + detector.modified = append(detector.modified, c) + } + } + + return detector.detect() +} + +// renameDetector will detect and resolve renames in a set of changes. +// see: https://github.com/eclipse/jgit/blob/master/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java +type renameDetector struct { + added []*Change + deleted []*Change + modified []*Change + + renameScore int + renameLimit int + onlyExact bool +} + +// detectExactRenames detects matches files that were deleted with files that +// were added where the hash is the same on both. If there are multiple targets +// the one with the most similar path will be chosen as the rename and the +// rest as either deletions or additions. +func (d *renameDetector) detectExactRenames() { + added := groupChangesByHash(d.added) + deletes := groupChangesByHash(d.deleted) + var uniqueAdds []*Change + var nonUniqueAdds [][]*Change + var addedLeft []*Change + + for _, cs := range added { + if len(cs) == 1 { + uniqueAdds = append(uniqueAdds, cs[0]) + } else { + nonUniqueAdds = append(nonUniqueAdds, cs) + } + } + + for _, c := range uniqueAdds { + hash := changeHash(c) + deleted := deletes[hash] + + if len(deleted) == 1 { + if sameMode(c, deleted[0]) { + d.modified = append(d.modified, &Change{From: deleted[0].From, To: c.To}) + delete(deletes, hash) + } else { + addedLeft = append(addedLeft, c) + } + } else if len(deleted) > 1 { + bestMatch := bestNameMatch(c, deleted) + if bestMatch != nil && sameMode(c, bestMatch) { + d.modified = append(d.modified, &Change{From: bestMatch.From, To: c.To}) + delete(deletes, hash) + + var newDeletes = make([]*Change, 0, len(deleted)-1) + for _, d := range deleted { + if d != bestMatch { + newDeletes = append(newDeletes, d) + } + } + deletes[hash] = newDeletes + } + } else { + addedLeft = append(addedLeft, c) + } + } + + for _, added := range nonUniqueAdds { + hash := changeHash(added[0]) + deleted := deletes[hash] + + if len(deleted) == 1 { + deleted := deleted[0] + bestMatch := bestNameMatch(deleted, added) + if bestMatch != nil && sameMode(deleted, bestMatch) { + d.modified = append(d.modified, &Change{From: deleted.From, To: bestMatch.To}) + delete(deletes, hash) + + for _, c := range added { + if c != bestMatch { + addedLeft = append(addedLeft, c) + } + } + } else { + addedLeft = append(addedLeft, added...) + } + } else if len(deleted) > 1 { + maxSize := len(deleted) * len(added) + if d.renameLimit > 0 && d.renameLimit < maxSize { + maxSize = d.renameLimit + } + + matrix := make(similarityMatrix, 0, maxSize) + + for delIdx, del := range deleted { + deletedName := changeName(del) + + for addIdx, add := range added { + addedName := changeName(add) + + score := nameSimilarityScore(addedName, deletedName) + matrix = append(matrix, similarityPair{added: addIdx, deleted: delIdx, score: score}) + + if len(matrix) >= maxSize { + break + } + } + + if len(matrix) >= maxSize { + break + } + } + + sort.Stable(matrix) + + usedAdds := make(map[*Change]struct{}) + usedDeletes := make(map[*Change]struct{}) + for i := len(matrix) - 1; i >= 0; i-- { + del := deleted[matrix[i].deleted] + add := added[matrix[i].added] + + if add == nil || del == nil { + // it was already matched + continue + } + + usedAdds[add] = struct{}{} + usedDeletes[del] = struct{}{} + d.modified = append(d.modified, &Change{From: del.From, To: add.To}) + added[matrix[i].added] = nil + deleted[matrix[i].deleted] = nil + } + + for _, c := range added { + if _, ok := usedAdds[c]; !ok && c != nil { + addedLeft = append(addedLeft, c) + } + } + + var newDeletes = make([]*Change, 0, len(deleted)-len(usedDeletes)) + for _, c := range deleted { + if _, ok := usedDeletes[c]; !ok && c != nil { + newDeletes = append(newDeletes, c) + } + } + deletes[hash] = newDeletes + } else { + addedLeft = append(addedLeft, added...) + } + } + + d.added = addedLeft + d.deleted = nil + for _, dels := range deletes { + d.deleted = append(d.deleted, dels...) + } +} + +// detectContentRenames detects renames based on the similarity of the content +// in the files by building a matrix of pairs between sources and destinations +// and matching by the highest score. +// see: https://github.com/eclipse/jgit/blob/master/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityRenameDetector.java +func (d *renameDetector) detectContentRenames() error { + cnt := max(len(d.added), len(d.deleted)) + if d.renameLimit > 0 && cnt > d.renameLimit { + return nil + } + + srcs, dsts := d.deleted, d.added + matrix, err := buildSimilarityMatrix(srcs, dsts, d.renameScore) + if err != nil { + return err + } + renames := make([]*Change, 0, min(len(matrix), len(dsts))) + + // Match rename pairs on a first come, first serve basis until + // we have looked at everything that is above the minimum score. + for i := len(matrix) - 1; i >= 0; i-- { + pair := matrix[i] + src := srcs[pair.deleted] + dst := dsts[pair.added] + + if dst == nil || src == nil { + // It was already matched before + continue + } + + renames = append(renames, &Change{From: src.From, To: dst.To}) + + // Claim destination and source as matched + dsts[pair.added] = nil + srcs[pair.deleted] = nil + } + + d.modified = append(d.modified, renames...) + d.added = compactChanges(dsts) + d.deleted = compactChanges(srcs) + + return nil +} + +func (d *renameDetector) detect() (Changes, error) { + if len(d.added) > 0 && len(d.deleted) > 0 { + d.detectExactRenames() + + if !d.onlyExact { + if err := d.detectContentRenames(); err != nil { + return nil, err + } + } + } + + result := make(Changes, 0, len(d.added)+len(d.deleted)+len(d.modified)) + result = append(result, d.added...) + result = append(result, d.deleted...) + result = append(result, d.modified...) + + sort.Stable(result) + + return result, nil +} + +func bestNameMatch(change *Change, changes []*Change) *Change { + var best *Change + var bestScore int + + cname := changeName(change) + + for _, c := range changes { + score := nameSimilarityScore(cname, changeName(c)) + if score > bestScore { + bestScore = score + best = c + } + } + + return best +} + +func nameSimilarityScore(a, b string) int { + aDirLen := strings.LastIndexByte(a, '/') + 1 + bDirLen := strings.LastIndexByte(b, '/') + 1 + + dirMin := min(aDirLen, bDirLen) + dirMax := max(aDirLen, bDirLen) + + var dirScoreLtr, dirScoreRtl int + if dirMax == 0 { + dirScoreLtr = 100 + dirScoreRtl = 100 + } else { + var dirSim int + + for ; dirSim < dirMin; dirSim++ { + if a[dirSim] != b[dirSim] { + break + } + } + + dirScoreLtr = dirSim * 100 / dirMax + + if dirScoreLtr == 100 { + dirScoreRtl = 100 + } else { + for dirSim = 0; dirSim < dirMin; dirSim++ { + if a[aDirLen-1-dirSim] != b[bDirLen-1-dirSim] { + break + } + } + dirScoreRtl = dirSim * 100 / dirMax + } + } + + fileMin := min(len(a)-aDirLen, len(b)-bDirLen) + fileMax := max(len(a)-aDirLen, len(b)-bDirLen) + + fileSim := 0 + for ; fileSim < fileMin; fileSim++ { + if a[len(a)-1-fileSim] != b[len(b)-1-fileSim] { + break + } + } + fileScore := fileSim * 100 / fileMax + + return (((dirScoreLtr + dirScoreRtl) * 25) + (fileScore * 50)) / 100 +} + +func changeName(c *Change) string { + if c.To != empty { + return c.To.Name + } + return c.From.Name +} + +func changeHash(c *Change) plumbing.Hash { + if c.To != empty { + return c.To.TreeEntry.Hash + } + + return c.From.TreeEntry.Hash +} + +func changeMode(c *Change) filemode.FileMode { + if c.To != empty { + return c.To.TreeEntry.Mode + } + + return c.From.TreeEntry.Mode +} + +func sameMode(a, b *Change) bool { + return changeMode(a) == changeMode(b) +} + +func groupChangesByHash(changes []*Change) map[plumbing.Hash][]*Change { + var result = make(map[plumbing.Hash][]*Change) + for _, c := range changes { + hash := changeHash(c) + result[hash] = append(result[hash], c) + } + return result +} + +type similarityMatrix []similarityPair + +func (m similarityMatrix) Len() int { return len(m) } +func (m similarityMatrix) Swap(i, j int) { m[i], m[j] = m[j], m[i] } +func (m similarityMatrix) Less(i, j int) bool { + if m[i].score == m[j].score { + if m[i].added == m[j].added { + return m[i].deleted < m[j].deleted + } + return m[i].added < m[j].added + } + return m[i].score < m[j].score +} + +type similarityPair struct { + // index of the added file + added int + // index of the deleted file + deleted int + // similarity score + score int +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func buildSimilarityMatrix(srcs, dsts []*Change, renameScore int) (similarityMatrix, error) { + // Allocate for the worst-case scenario where every pair has a score + // that we need to consider. We might not need that many. + matrix := make(similarityMatrix, 0, len(srcs)*len(dsts)) + srcSizes := make([]int64, len(srcs)) + dstSizes := make([]int64, len(dsts)) + dstTooLarge := make(map[int]bool) + + // Consider each pair of files, if the score is above the minimum + // threshold we need to record that scoring in the matrix so we can + // later find the best matches. +outerLoop: + for srcIdx, src := range srcs { + if changeMode(src) != filemode.Regular { + continue + } + + // Declare the from file and the similarity index here to be able to + // reuse it inside the inner loop. The reason to not initialize them + // here is so we can skip the initialization in case they happen to + // not be needed later. They will be initialized inside the inner + // loop if and only if they're needed and reused in subsequent passes. + var from *File + var s *similarityIndex + var err error + for dstIdx, dst := range dsts { + if changeMode(dst) != filemode.Regular { + continue + } + + if dstTooLarge[dstIdx] { + continue + } + + var to *File + srcSize := srcSizes[srcIdx] + if srcSize == 0 { + from, _, err = src.Files() + if err != nil { + return nil, err + } + srcSize = from.Size + 1 + srcSizes[srcIdx] = srcSize + } + + dstSize := dstSizes[dstIdx] + if dstSize == 0 { + _, to, err = dst.Files() + if err != nil { + return nil, err + } + dstSize = to.Size + 1 + dstSizes[dstIdx] = dstSize + } + + min, max := srcSize, dstSize + if dstSize < srcSize { + min = dstSize + max = srcSize + } + + if int(min*100/max) < renameScore { + // File sizes are too different to be a match + continue + } + + if s == nil { + s, err = fileSimilarityIndex(from) + if err != nil { + if err == errIndexFull { + continue outerLoop + } + return nil, err + } + } + + if to == nil { + _, to, err = dst.Files() + if err != nil { + return nil, err + } + } + + di, err := fileSimilarityIndex(to) + if err != nil { + if err == errIndexFull { + dstTooLarge[dstIdx] = true + } + + return nil, err + } + + contentScore := s.score(di, 10000) + // The name score returns a value between 0 and 100, so we need to + // convert it to the same range as the content score. + nameScore := nameSimilarityScore(src.From.Name, dst.To.Name) * 100 + score := (contentScore*99 + nameScore*1) / 10000 + + if score < renameScore { + continue + } + + matrix = append(matrix, similarityPair{added: dstIdx, deleted: srcIdx, score: score}) + } + } + + sort.Stable(matrix) + + return matrix, nil +} + +func compactChanges(changes []*Change) []*Change { + var result []*Change + for _, c := range changes { + if c != nil { + result = append(result, c) + } + } + return result +} + +const ( + keyShift = 32 + maxCountValue = (1 << keyShift) - 1 +) + +var errIndexFull = errors.New("index is full") + +// similarityIndex is an index structure of lines/blocks in one file. +// This structure can be used to compute an approximation of the similarity +// between two files. +// To save space in memory, this index uses a space efficient encoding which +// will not exceed 1MiB per instance. The index starts out at a smaller size +// (closer to 2KiB), but may grow as more distinct blocks within the scanned +// file are discovered. +// see: https://github.com/eclipse/jgit/blob/master/org.eclipse.jgit/src/org/eclipse/jgit/diff/SimilarityIndex.java +type similarityIndex struct { + hashed uint64 + // number of non-zero entries in hashes + numHashes int + growAt int + hashes []keyCountPair + hashBits int +} + +func fileSimilarityIndex(f *File) (*similarityIndex, error) { + idx := newSimilarityIndex() + if err := idx.hash(f); err != nil { + return nil, err + } + + sort.Stable(keyCountPairs(idx.hashes)) + + return idx, nil +} + +func newSimilarityIndex() *similarityIndex { + return &similarityIndex{ + hashBits: 8, + hashes: make([]keyCountPair, 1<<8), + growAt: shouldGrowAt(8), + } +} + +func (i *similarityIndex) hash(f *File) error { + isBin, err := f.IsBinary() + if err != nil { + return err + } + + r, err := f.Reader() + if err != nil { + return err + } + + defer ioutil.CheckClose(r, &err) + + return i.hashContent(r, f.Size, isBin) +} + +func (i *similarityIndex) hashContent(r io.Reader, size int64, isBin bool) error { + var buf = make([]byte, 4096) + var ptr, cnt int + remaining := size + + for 0 < remaining { + hash := 5381 + var blockHashedCnt uint64 + + // Hash one line or block, whatever happens first + n := int64(0) + for { + if ptr == cnt { + ptr = 0 + var err error + cnt, err = io.ReadFull(r, buf) + if err != nil && err != io.ErrUnexpectedEOF { + return err + } + + if cnt == 0 { + return io.EOF + } + } + n++ + c := buf[ptr] & 0xff + ptr++ + + // Ignore CR in CRLF sequence if it's text + if !isBin && c == '\r' && ptr < cnt && buf[ptr] == '\n' { + continue + } + blockHashedCnt++ + + if c == '\n' { + break + } + + hash = (hash << 5) + hash + int(c) + + if n >= 64 || n >= remaining { + break + } + } + i.hashed += blockHashedCnt + if err := i.add(hash, blockHashedCnt); err != nil { + return err + } + remaining -= n + } + + return nil +} + +// score computes the similarity score between this index and another one. +// A region of a file is defined as a line in a text file or a fixed-size +// block in a binary file. To prepare an index, each region in the file is +// hashed; the values and counts of hashes are retained in a sorted table. +// Define the similarity fraction F as the count of matching regions between +// the two files divided between the maximum count of regions in either file. +// The similarity score is F multiplied by the maxScore constant, yielding a +// range [0, maxScore]. It is defined as maxScore for the degenerate case of +// two empty files. +// The similarity score is symmetrical; i.e. a.score(b) == b.score(a). +func (i *similarityIndex) score(other *similarityIndex, maxScore int) int { + var maxHashed = i.hashed + if maxHashed < other.hashed { + maxHashed = other.hashed + } + if maxHashed == 0 { + return maxScore + } + + return int(i.common(other) * uint64(maxScore) / maxHashed) +} + +func (i *similarityIndex) common(dst *similarityIndex) uint64 { + srcIdx, dstIdx := 0, 0 + if i.numHashes == 0 || dst.numHashes == 0 { + return 0 + } + + var common uint64 + srcKey, dstKey := i.hashes[srcIdx].key(), dst.hashes[dstIdx].key() + + for { + if srcKey == dstKey { + srcCnt, dstCnt := i.hashes[srcIdx].count(), dst.hashes[dstIdx].count() + if srcCnt < dstCnt { + common += srcCnt + } else { + common += dstCnt + } + + srcIdx++ + if srcIdx == len(i.hashes) { + break + } + srcKey = i.hashes[srcIdx].key() + + dstIdx++ + if dstIdx == len(dst.hashes) { + break + } + dstKey = dst.hashes[dstIdx].key() + } else if srcKey < dstKey { + // Region of src that is not in dst + srcIdx++ + if srcIdx == len(i.hashes) { + break + } + srcKey = i.hashes[srcIdx].key() + } else { + // Region of dst that is not in src + dstIdx++ + if dstIdx == len(dst.hashes) { + break + } + dstKey = dst.hashes[dstIdx].key() + } + } + + return common +} + +func (i *similarityIndex) add(key int, cnt uint64) error { + key = int(uint32(key) * 0x9e370001 >> 1) + + j := i.slot(key) + for { + v := i.hashes[j] + if v == 0 { + // It's an empty slot, so we can store it here. + if i.growAt <= i.numHashes { + if err := i.grow(); err != nil { + return err + } + j = i.slot(key) + continue + } + + var err error + i.hashes[j], err = newKeyCountPair(key, cnt) + if err != nil { + return err + } + i.numHashes++ + return nil + } else if v.key() == key { + // It's the same key, so increment the counter. + var err error + i.hashes[j], err = newKeyCountPair(key, v.count()+cnt) + if err != nil { + return err + } + return nil + } else if j+1 >= len(i.hashes) { + j = 0 + } else { + j++ + } + } +} + +type keyCountPair uint64 + +func newKeyCountPair(key int, cnt uint64) (keyCountPair, error) { + if cnt > maxCountValue { + return 0, errIndexFull + } + + return keyCountPair((uint64(key) << keyShift) | cnt), nil +} + +func (p keyCountPair) key() int { + return int(p >> keyShift) +} + +func (p keyCountPair) count() uint64 { + return uint64(p) & maxCountValue +} + +func (i *similarityIndex) slot(key int) int { + // We use 31 - hashBits because the upper bit was already forced + // to be 0 and we want the remaining high bits to be used as the + // table slot. + return int(uint32(key) >> uint(31-i.hashBits)) +} + +func shouldGrowAt(hashBits int) int { + return (1 << uint(hashBits)) * (hashBits - 3) / hashBits +} + +func (i *similarityIndex) grow() error { + if i.hashBits == 30 { + return errIndexFull + } + + old := i.hashes + + i.hashBits++ + i.growAt = shouldGrowAt(i.hashBits) + + // TODO(erizocosmico): find a way to check if it will OOM and return + // errIndexFull instead. + i.hashes = make([]keyCountPair, 1<= len(i.hashes) { + j = 0 + } + } + i.hashes[j] = v + } + } + + return nil +} + +type keyCountPairs []keyCountPair + +func (p keyCountPairs) Len() int { return len(p) } +func (p keyCountPairs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p keyCountPairs) Less(i, j int) bool { return p[i] < p[j] } diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/tag.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/tag.go new file mode 100644 index 0000000000..216010d913 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/tag.go @@ -0,0 +1,357 @@ +package object + +import ( + "bufio" + "bytes" + "fmt" + "io" + stdioutil "io/ioutil" + "strings" + + "github.com/ProtonMail/go-crypto/openpgp" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// Tag represents an annotated tag object. It points to a single git object of +// any type, but tags typically are applied to commit or blob objects. It +// provides a reference that associates the target with a tag name. It also +// contains meta-information about the tag, including the tagger, tag date and +// message. +// +// Note that this is not used for lightweight tags. +// +// https://git-scm.com/book/en/v2/Git-Internals-Git-References#Tags +type Tag struct { + // Hash of the tag. + Hash plumbing.Hash + // Name of the tag. + Name string + // Tagger is the one who created the tag. + Tagger Signature + // Message is an arbitrary text message. + Message string + // PGPSignature is the PGP signature of the tag. + PGPSignature string + // TargetType is the object type of the target. + TargetType plumbing.ObjectType + // Target is the hash of the target object. + Target plumbing.Hash + + s storer.EncodedObjectStorer +} + +// GetTag gets a tag from an object storer and decodes it. +func GetTag(s storer.EncodedObjectStorer, h plumbing.Hash) (*Tag, error) { + o, err := s.EncodedObject(plumbing.TagObject, h) + if err != nil { + return nil, err + } + + return DecodeTag(s, o) +} + +// DecodeTag decodes an encoded object into a *Commit and associates it to the +// given object storer. +func DecodeTag(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (*Tag, error) { + t := &Tag{s: s} + if err := t.Decode(o); err != nil { + return nil, err + } + + return t, nil +} + +// ID returns the object ID of the tag, not the object that the tag references. +// The returned value will always match the current value of Tag.Hash. +// +// ID is present to fulfill the Object interface. +func (t *Tag) ID() plumbing.Hash { + return t.Hash +} + +// Type returns the type of object. It always returns plumbing.TagObject. +// +// Type is present to fulfill the Object interface. +func (t *Tag) Type() plumbing.ObjectType { + return plumbing.TagObject +} + +// Decode transforms a plumbing.EncodedObject into a Tag struct. +func (t *Tag) Decode(o plumbing.EncodedObject) (err error) { + if o.Type() != plumbing.TagObject { + return ErrUnsupportedObject + } + + t.Hash = o.Hash() + + reader, err := o.Reader() + if err != nil { + return err + } + defer ioutil.CheckClose(reader, &err) + + r := bufPool.Get().(*bufio.Reader) + defer bufPool.Put(r) + r.Reset(reader) + for { + var line []byte + line, err = r.ReadBytes('\n') + if err != nil && err != io.EOF { + return err + } + + line = bytes.TrimSpace(line) + if len(line) == 0 { + break // Start of message + } + + split := bytes.SplitN(line, []byte{' '}, 2) + switch string(split[0]) { + case "object": + t.Target = plumbing.NewHash(string(split[1])) + case "type": + t.TargetType, err = plumbing.ParseObjectType(string(split[1])) + if err != nil { + return err + } + case "tag": + t.Name = string(split[1]) + case "tagger": + t.Tagger.Decode(split[1]) + } + + if err == io.EOF { + return nil + } + } + + data, err := stdioutil.ReadAll(r) + if err != nil { + return err + } + + var pgpsig bool + // Check if data contains PGP signature. + if bytes.Contains(data, []byte(beginpgp)) { + // Split the lines at newline. + messageAndSig := bytes.Split(data, []byte("\n")) + + for _, l := range messageAndSig { + if pgpsig { + if bytes.Contains(l, []byte(endpgp)) { + t.PGPSignature += endpgp + "\n" + break + } else { + t.PGPSignature += string(l) + "\n" + } + continue + } + + // Check if it's the beginning of a PGP signature. + if bytes.Contains(l, []byte(beginpgp)) { + t.PGPSignature += beginpgp + "\n" + pgpsig = true + continue + } + + t.Message += string(l) + "\n" + } + } else { + t.Message = string(data) + } + + return nil +} + +// Encode transforms a Tag into a plumbing.EncodedObject. +func (t *Tag) Encode(o plumbing.EncodedObject) error { + return t.encode(o, true) +} + +// EncodeWithoutSignature export a Tag into a plumbing.EncodedObject without the signature (correspond to the payload of the PGP signature). +func (t *Tag) EncodeWithoutSignature(o plumbing.EncodedObject) error { + return t.encode(o, false) +} + +func (t *Tag) encode(o plumbing.EncodedObject, includeSig bool) (err error) { + o.SetType(plumbing.TagObject) + w, err := o.Writer() + if err != nil { + return err + } + defer ioutil.CheckClose(w, &err) + + if _, err = fmt.Fprintf(w, + "object %s\ntype %s\ntag %s\ntagger ", + t.Target.String(), t.TargetType.Bytes(), t.Name); err != nil { + return err + } + + if err = t.Tagger.Encode(w); err != nil { + return err + } + + if _, err = fmt.Fprint(w, "\n\n"); err != nil { + return err + } + + if _, err = fmt.Fprint(w, t.Message); err != nil { + return err + } + + // Note that this is highly sensitive to what it sent along in the message. + // Message *always* needs to end with a newline, or else the message and the + // signature will be concatenated into a corrupt object. Since this is a + // lower-level method, we assume you know what you are doing and have already + // done the needful on the message in the caller. + if includeSig { + if _, err = fmt.Fprint(w, t.PGPSignature); err != nil { + return err + } + } + + return err +} + +// Commit returns the commit pointed to by the tag. If the tag points to a +// different type of object ErrUnsupportedObject will be returned. +func (t *Tag) Commit() (*Commit, error) { + if t.TargetType != plumbing.CommitObject { + return nil, ErrUnsupportedObject + } + + o, err := t.s.EncodedObject(plumbing.CommitObject, t.Target) + if err != nil { + return nil, err + } + + return DecodeCommit(t.s, o) +} + +// Tree returns the tree pointed to by the tag. If the tag points to a commit +// object the tree of that commit will be returned. If the tag does not point +// to a commit or tree object ErrUnsupportedObject will be returned. +func (t *Tag) Tree() (*Tree, error) { + switch t.TargetType { + case plumbing.CommitObject: + c, err := t.Commit() + if err != nil { + return nil, err + } + + return c.Tree() + case plumbing.TreeObject: + return GetTree(t.s, t.Target) + default: + return nil, ErrUnsupportedObject + } +} + +// Blob returns the blob pointed to by the tag. If the tag points to a +// different type of object ErrUnsupportedObject will be returned. +func (t *Tag) Blob() (*Blob, error) { + if t.TargetType != plumbing.BlobObject { + return nil, ErrUnsupportedObject + } + + return GetBlob(t.s, t.Target) +} + +// Object returns the object pointed to by the tag. +func (t *Tag) Object() (Object, error) { + o, err := t.s.EncodedObject(t.TargetType, t.Target) + if err != nil { + return nil, err + } + + return DecodeObject(t.s, o) +} + +// String returns the meta information contained in the tag as a formatted +// string. +func (t *Tag) String() string { + obj, _ := t.Object() + + return fmt.Sprintf( + "%s %s\nTagger: %s\nDate: %s\n\n%s\n%s", + plumbing.TagObject, t.Name, t.Tagger.String(), t.Tagger.When.Format(DateFormat), + t.Message, objectAsString(obj), + ) +} + +// Verify performs PGP verification of the tag with a provided armored +// keyring and returns openpgp.Entity associated with verifying key on success. +func (t *Tag) Verify(armoredKeyRing string) (*openpgp.Entity, error) { + keyRingReader := strings.NewReader(armoredKeyRing) + keyring, err := openpgp.ReadArmoredKeyRing(keyRingReader) + if err != nil { + return nil, err + } + + // Extract signature. + signature := strings.NewReader(t.PGPSignature) + + encoded := &plumbing.MemoryObject{} + // Encode tag components, excluding signature and get a reader object. + if err := t.EncodeWithoutSignature(encoded); err != nil { + return nil, err + } + er, err := encoded.Reader() + if err != nil { + return nil, err + } + + return openpgp.CheckArmoredDetachedSignature(keyring, er, signature, nil) +} + +// TagIter provides an iterator for a set of tags. +type TagIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewTagIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns a *TagIter that iterates over all +// tags contained in the storer.EncodedObjectIter. +// +// Any non-tag object returned by the storer.EncodedObjectIter is skipped. +func NewTagIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *TagIter { + return &TagIter{iter, s} +} + +// Next moves the iterator to the next tag and returns a pointer to it. If +// there are no more tags, it returns io.EOF. +func (iter *TagIter) Next() (*Tag, error) { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + return DecodeTag(iter.s, obj) +} + +// ForEach call the cb function for each tag contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *TagIter) ForEach(cb func(*Tag) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + t, err := DecodeTag(iter.s, obj) + if err != nil { + return err + } + + return cb(t) + }) +} + +func objectAsString(obj Object) string { + switch o := obj.(type) { + case *Commit: + return o.String() + default: + return "" + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/tree.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/tree.go new file mode 100644 index 0000000000..5e6378ca49 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/tree.go @@ -0,0 +1,525 @@ +package object + +import ( + "bufio" + "context" + "errors" + "fmt" + "io" + "path" + "path/filepath" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +const ( + maxTreeDepth = 1024 + startingStackSize = 8 +) + +// New errors defined by this package. +var ( + ErrMaxTreeDepth = errors.New("maximum tree depth exceeded") + ErrFileNotFound = errors.New("file not found") + ErrDirectoryNotFound = errors.New("directory not found") + ErrEntryNotFound = errors.New("entry not found") +) + +// Tree is basically like a directory - it references a bunch of other trees +// and/or blobs (i.e. files and sub-directories) +type Tree struct { + Entries []TreeEntry + Hash plumbing.Hash + + s storer.EncodedObjectStorer + m map[string]*TreeEntry + t map[string]*Tree // tree path cache +} + +// GetTree gets a tree from an object storer and decodes it. +func GetTree(s storer.EncodedObjectStorer, h plumbing.Hash) (*Tree, error) { + o, err := s.EncodedObject(plumbing.TreeObject, h) + if err != nil { + return nil, err + } + + return DecodeTree(s, o) +} + +// DecodeTree decodes an encoded object into a *Tree and associates it to the +// given object storer. +func DecodeTree(s storer.EncodedObjectStorer, o plumbing.EncodedObject) (*Tree, error) { + t := &Tree{s: s} + if err := t.Decode(o); err != nil { + return nil, err + } + + return t, nil +} + +// TreeEntry represents a file +type TreeEntry struct { + Name string + Mode filemode.FileMode + Hash plumbing.Hash +} + +// File returns the hash of the file identified by the `path` argument. +// The path is interpreted as relative to the tree receiver. +func (t *Tree) File(path string) (*File, error) { + e, err := t.FindEntry(path) + if err != nil { + return nil, ErrFileNotFound + } + + blob, err := GetBlob(t.s, e.Hash) + if err != nil { + if err == plumbing.ErrObjectNotFound { + return nil, ErrFileNotFound + } + return nil, err + } + + return NewFile(path, e.Mode, blob), nil +} + +// Size returns the plaintext size of an object, without reading it +// into memory. +func (t *Tree) Size(path string) (int64, error) { + e, err := t.FindEntry(path) + if err != nil { + return 0, ErrEntryNotFound + } + + return t.s.EncodedObjectSize(e.Hash) +} + +// Tree returns the tree identified by the `path` argument. +// The path is interpreted as relative to the tree receiver. +func (t *Tree) Tree(path string) (*Tree, error) { + e, err := t.FindEntry(path) + if err != nil { + return nil, ErrDirectoryNotFound + } + + tree, err := GetTree(t.s, e.Hash) + if err == plumbing.ErrObjectNotFound { + return nil, ErrDirectoryNotFound + } + + return tree, err +} + +// TreeEntryFile returns the *File for a given *TreeEntry. +func (t *Tree) TreeEntryFile(e *TreeEntry) (*File, error) { + blob, err := GetBlob(t.s, e.Hash) + if err != nil { + return nil, err + } + + return NewFile(e.Name, e.Mode, blob), nil +} + +// FindEntry search a TreeEntry in this tree or any subtree. +func (t *Tree) FindEntry(path string) (*TreeEntry, error) { + if t.t == nil { + t.t = make(map[string]*Tree) + } + + pathParts := strings.Split(path, "/") + startingTree := t + pathCurrent := "" + + // search for the longest path in the tree path cache + for i := len(pathParts) - 1; i > 1; i-- { + path := filepath.Join(pathParts[:i]...) + + tree, ok := t.t[path] + if ok { + startingTree = tree + pathParts = pathParts[i:] + pathCurrent = path + + break + } + } + + var tree *Tree + var err error + for tree = startingTree; len(pathParts) > 1; pathParts = pathParts[1:] { + if tree, err = tree.dir(pathParts[0]); err != nil { + return nil, err + } + + pathCurrent = filepath.Join(pathCurrent, pathParts[0]) + t.t[pathCurrent] = tree + } + + return tree.entry(pathParts[0]) +} + +func (t *Tree) dir(baseName string) (*Tree, error) { + entry, err := t.entry(baseName) + if err != nil { + return nil, ErrDirectoryNotFound + } + + obj, err := t.s.EncodedObject(plumbing.TreeObject, entry.Hash) + if err != nil { + return nil, err + } + + tree := &Tree{s: t.s} + err = tree.Decode(obj) + + return tree, err +} + +func (t *Tree) entry(baseName string) (*TreeEntry, error) { + if t.m == nil { + t.buildMap() + } + + entry, ok := t.m[baseName] + if !ok { + return nil, ErrEntryNotFound + } + + return entry, nil +} + +// Files returns a FileIter allowing to iterate over the Tree +func (t *Tree) Files() *FileIter { + return NewFileIter(t.s, t) +} + +// ID returns the object ID of the tree. The returned value will always match +// the current value of Tree.Hash. +// +// ID is present to fulfill the Object interface. +func (t *Tree) ID() plumbing.Hash { + return t.Hash +} + +// Type returns the type of object. It always returns plumbing.TreeObject. +func (t *Tree) Type() plumbing.ObjectType { + return plumbing.TreeObject +} + +// Decode transform an plumbing.EncodedObject into a Tree struct +func (t *Tree) Decode(o plumbing.EncodedObject) (err error) { + if o.Type() != plumbing.TreeObject { + return ErrUnsupportedObject + } + + t.Hash = o.Hash() + if o.Size() == 0 { + return nil + } + + t.Entries = nil + t.m = nil + + reader, err := o.Reader() + if err != nil { + return err + } + defer ioutil.CheckClose(reader, &err) + + r := bufPool.Get().(*bufio.Reader) + defer bufPool.Put(r) + r.Reset(reader) + for { + str, err := r.ReadString(' ') + if err != nil { + if err == io.EOF { + break + } + + return err + } + str = str[:len(str)-1] // strip last byte (' ') + + mode, err := filemode.New(str) + if err != nil { + return err + } + + name, err := r.ReadString(0) + if err != nil && err != io.EOF { + return err + } + + var hash plumbing.Hash + if _, err = io.ReadFull(r, hash[:]); err != nil { + return err + } + + baseName := name[:len(name)-1] + t.Entries = append(t.Entries, TreeEntry{ + Hash: hash, + Mode: mode, + Name: baseName, + }) + } + + return nil +} + +// Encode transforms a Tree into a plumbing.EncodedObject. +func (t *Tree) Encode(o plumbing.EncodedObject) (err error) { + o.SetType(plumbing.TreeObject) + w, err := o.Writer() + if err != nil { + return err + } + + defer ioutil.CheckClose(w, &err) + for _, entry := range t.Entries { + if _, err = fmt.Fprintf(w, "%o %s", entry.Mode, entry.Name); err != nil { + return err + } + + if _, err = w.Write([]byte{0x00}); err != nil { + return err + } + + if _, err = w.Write(entry.Hash[:]); err != nil { + return err + } + } + + return err +} + +func (t *Tree) buildMap() { + t.m = make(map[string]*TreeEntry) + for i := 0; i < len(t.Entries); i++ { + t.m[t.Entries[i].Name] = &t.Entries[i] + } +} + +// Diff returns a list of changes between this tree and the provided one +func (t *Tree) Diff(to *Tree) (Changes, error) { + return t.DiffContext(context.Background(), to) +} + +// DiffContext returns a list of changes between this tree and the provided one +// Error will be returned if context expires. Provided context must be non nil. +// +// NOTE: Since version 5.1.0 the renames are correctly handled, the settings +// used are the recommended options DefaultDiffTreeOptions. +func (t *Tree) DiffContext(ctx context.Context, to *Tree) (Changes, error) { + return DiffTreeWithOptions(ctx, t, to, DefaultDiffTreeOptions) +} + +// Patch returns a slice of Patch objects with all the changes between trees +// in chunks. This representation can be used to create several diff outputs. +func (t *Tree) Patch(to *Tree) (*Patch, error) { + return t.PatchContext(context.Background(), to) +} + +// PatchContext returns a slice of Patch objects with all the changes between +// trees in chunks. This representation can be used to create several diff +// outputs. If context expires, an error will be returned. Provided context must +// be non-nil. +// +// NOTE: Since version 5.1.0 the renames are correctly handled, the settings +// used are the recommended options DefaultDiffTreeOptions. +func (t *Tree) PatchContext(ctx context.Context, to *Tree) (*Patch, error) { + changes, err := t.DiffContext(ctx, to) + if err != nil { + return nil, err + } + + return changes.PatchContext(ctx) +} + +// treeEntryIter facilitates iterating through the TreeEntry objects in a Tree. +type treeEntryIter struct { + t *Tree + pos int +} + +func (iter *treeEntryIter) Next() (TreeEntry, error) { + if iter.pos >= len(iter.t.Entries) { + return TreeEntry{}, io.EOF + } + iter.pos++ + return iter.t.Entries[iter.pos-1], nil +} + +// TreeWalker provides a means of walking through all of the entries in a Tree. +type TreeWalker struct { + stack []*treeEntryIter + base string + recursive bool + seen map[plumbing.Hash]bool + + s storer.EncodedObjectStorer + t *Tree +} + +// NewTreeWalker returns a new TreeWalker for the given tree. +// +// It is the caller's responsibility to call Close() when finished with the +// tree walker. +func NewTreeWalker(t *Tree, recursive bool, seen map[plumbing.Hash]bool) *TreeWalker { + stack := make([]*treeEntryIter, 0, startingStackSize) + stack = append(stack, &treeEntryIter{t, 0}) + + return &TreeWalker{ + stack: stack, + recursive: recursive, + seen: seen, + + s: t.s, + t: t, + } +} + +// Next returns the next object from the tree. Objects are returned in order +// and subtrees are included. After the last object has been returned further +// calls to Next() will return io.EOF. +// +// In the current implementation any objects which cannot be found in the +// underlying repository will be skipped automatically. It is possible that this +// may change in future versions. +func (w *TreeWalker) Next() (name string, entry TreeEntry, err error) { + var obj *Tree + for { + current := len(w.stack) - 1 + if current < 0 { + // Nothing left on the stack so we're finished + err = io.EOF + return + } + + if current > maxTreeDepth { + // We're probably following bad data or some self-referencing tree + err = ErrMaxTreeDepth + return + } + + entry, err = w.stack[current].Next() + if err == io.EOF { + // Finished with the current tree, move back up to the parent + w.stack = w.stack[:current] + w.base, _ = path.Split(w.base) + w.base = strings.TrimSuffix(w.base, "/") + continue + } + + if err != nil { + return + } + + if w.seen[entry.Hash] { + continue + } + + if entry.Mode == filemode.Dir { + obj, err = GetTree(w.s, entry.Hash) + } + + name = simpleJoin(w.base, entry.Name) + + if err != nil { + err = io.EOF + return + } + + break + } + + if !w.recursive { + return + } + + if obj != nil { + w.stack = append(w.stack, &treeEntryIter{obj, 0}) + w.base = simpleJoin(w.base, entry.Name) + } + + return +} + +// Tree returns the tree that the tree walker most recently operated on. +func (w *TreeWalker) Tree() *Tree { + current := len(w.stack) - 1 + if w.stack[current].pos == 0 { + current-- + } + + if current < 0 { + return nil + } + + return w.stack[current].t +} + +// Close releases any resources used by the TreeWalker. +func (w *TreeWalker) Close() { + w.stack = nil +} + +// TreeIter provides an iterator for a set of trees. +type TreeIter struct { + storer.EncodedObjectIter + s storer.EncodedObjectStorer +} + +// NewTreeIter takes a storer.EncodedObjectStorer and a +// storer.EncodedObjectIter and returns a *TreeIter that iterates over all +// tree contained in the storer.EncodedObjectIter. +// +// Any non-tree object returned by the storer.EncodedObjectIter is skipped. +func NewTreeIter(s storer.EncodedObjectStorer, iter storer.EncodedObjectIter) *TreeIter { + return &TreeIter{iter, s} +} + +// Next moves the iterator to the next tree and returns a pointer to it. If +// there are no more trees, it returns io.EOF. +func (iter *TreeIter) Next() (*Tree, error) { + for { + obj, err := iter.EncodedObjectIter.Next() + if err != nil { + return nil, err + } + + if obj.Type() != plumbing.TreeObject { + continue + } + + return DecodeTree(iter.s, obj) + } +} + +// ForEach call the cb function for each tree contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *TreeIter) ForEach(cb func(*Tree) error) error { + return iter.EncodedObjectIter.ForEach(func(obj plumbing.EncodedObject) error { + if obj.Type() != plumbing.TreeObject { + return nil + } + + t, err := DecodeTree(iter.s, obj) + if err != nil { + return err + } + + return cb(t) + }) +} + +func simpleJoin(parent, child string) string { + if len(parent) > 0 { + return parent + "/" + child + } + return child +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/object/treenoder.go b/vendor/github.com/go-git/go-git/v5/plumbing/object/treenoder.go new file mode 100644 index 0000000000..b4891b957c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/object/treenoder.go @@ -0,0 +1,136 @@ +package object + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// A treenoder is a helper type that wraps git trees into merkletrie +// noders. +// +// As a merkletrie noder doesn't understand the concept of modes (e.g. +// file permissions), the treenoder includes the mode of the git tree in +// the hash, so changes in the modes will be detected as modifications +// to the file contents by the merkletrie difftree algorithm. This is +// consistent with how the "git diff-tree" command works. +type treeNoder struct { + parent *Tree // the root node is its own parent + name string // empty string for the root node + mode filemode.FileMode + hash plumbing.Hash + children []noder.Noder // memoized +} + +// NewTreeRootNode returns the root node of a Tree +func NewTreeRootNode(t *Tree) noder.Noder { + if t == nil { + return &treeNoder{} + } + + return &treeNoder{ + parent: t, + name: "", + mode: filemode.Dir, + hash: t.Hash, + } +} + +func (t *treeNoder) isRoot() bool { + return t.name == "" +} + +func (t *treeNoder) String() string { + return "treeNoder <" + t.name + ">" +} + +func (t *treeNoder) Hash() []byte { + if t.mode == filemode.Deprecated { + return append(t.hash[:], filemode.Regular.Bytes()...) + } + return append(t.hash[:], t.mode.Bytes()...) +} + +func (t *treeNoder) Name() string { + return t.name +} + +func (t *treeNoder) IsDir() bool { + return t.mode == filemode.Dir +} + +// Children will return the children of a treenoder as treenoders, +// building them from the children of the wrapped git tree. +func (t *treeNoder) Children() ([]noder.Noder, error) { + if t.mode != filemode.Dir { + return noder.NoChildren, nil + } + + // children are memoized for efficiency + if t.children != nil { + return t.children, nil + } + + // the parent of the returned children will be ourself as a tree if + // we are a not the root treenoder. The root is special as it + // is is own parent. + parent := t.parent + if !t.isRoot() { + var err error + if parent, err = t.parent.Tree(t.name); err != nil { + return nil, err + } + } + + return transformChildren(parent) +} + +// Returns the children of a tree as treenoders. +// Efficiency is key here. +func transformChildren(t *Tree) ([]noder.Noder, error) { + var err error + var e TreeEntry + + // there will be more tree entries than children in the tree, + // due to submodules and empty directories, but I think it is still + // worth it to pre-allocate the whole array now, even if sometimes + // is bigger than needed. + ret := make([]noder.Noder, 0, len(t.Entries)) + + walker := NewTreeWalker(t, false, nil) // don't recurse + // don't defer walker.Close() for efficiency reasons. + for { + _, e, err = walker.Next() + if err == io.EOF { + break + } + if err != nil { + walker.Close() + return nil, err + } + + ret = append(ret, &treeNoder{ + parent: t, + name: e.Name, + mode: e.Mode, + hash: e.Hash, + }) + } + walker.Close() + + return ret, nil +} + +// len(t.tree.Entries) != the number of elements walked by treewalker +// for some reason because of empty directories, submodules, etc, so we +// have to walk here. +func (t *treeNoder) NumChildren() (int, error) { + children, err := t.Children() + if err != nil { + return 0, err + } + + return len(children), nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go new file mode 100644 index 0000000000..1bd724cad5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go @@ -0,0 +1,211 @@ +package packp + +import ( + "fmt" + "sort" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage/memory" +) + +// AdvRefs values represent the information transmitted on an +// advertised-refs message. Values from this type are not zero-value +// safe, use the New function instead. +type AdvRefs struct { + // Prefix stores prefix payloads. + // + // When using this message over (smart) HTTP, you have to add a pktline + // before the whole thing with the following payload: + // + // '# service=$servicename" LF + // + // Moreover, some (all) git HTTP smart servers will send a flush-pkt + // just after the first pkt-line. + // + // To accommodate both situations, the Prefix field allow you to store + // any data you want to send before the actual pktlines. It will also + // be filled up with whatever is found on the line. + Prefix [][]byte + // Head stores the resolved HEAD reference if present. + // This can be present with git-upload-pack, not with git-receive-pack. + Head *plumbing.Hash + // Capabilities are the capabilities. + Capabilities *capability.List + // References are the hash references. + References map[string]plumbing.Hash + // Peeled are the peeled hash references. + Peeled map[string]plumbing.Hash + // Shallows are the shallow object ids. + Shallows []plumbing.Hash +} + +// NewAdvRefs returns a pointer to a new AdvRefs value, ready to be used. +func NewAdvRefs() *AdvRefs { + return &AdvRefs{ + Prefix: [][]byte{}, + Capabilities: capability.NewList(), + References: make(map[string]plumbing.Hash), + Peeled: make(map[string]plumbing.Hash), + Shallows: []plumbing.Hash{}, + } +} + +func (a *AdvRefs) AddReference(r *plumbing.Reference) error { + switch r.Type() { + case plumbing.SymbolicReference: + v := fmt.Sprintf("%s:%s", r.Name().String(), r.Target().String()) + a.Capabilities.Add(capability.SymRef, v) + case plumbing.HashReference: + a.References[r.Name().String()] = r.Hash() + default: + return plumbing.ErrInvalidType + } + + return nil +} + +func (a *AdvRefs) AllReferences() (memory.ReferenceStorage, error) { + s := memory.ReferenceStorage{} + if err := a.addRefs(s); err != nil { + return s, plumbing.NewUnexpectedError(err) + } + + return s, nil +} + +func (a *AdvRefs) addRefs(s storer.ReferenceStorer) error { + for name, hash := range a.References { + ref := plumbing.NewReferenceFromStrings(name, hash.String()) + if err := s.SetReference(ref); err != nil { + return err + } + } + + if a.supportSymrefs() { + return a.addSymbolicRefs(s) + } + + return a.resolveHead(s) +} + +// If the server does not support symrefs capability, +// we need to guess the reference where HEAD is pointing to. +// +// Git versions prior to 1.8.4.3 has an special procedure to get +// the reference where is pointing to HEAD: +// - Check if a reference called master exists. If exists and it +// has the same hash as HEAD hash, we can say that HEAD is pointing to master +// - If master does not exists or does not have the same hash as HEAD, +// order references and check in that order if that reference has the same +// hash than HEAD. If yes, set HEAD pointing to that branch hash +// - If no reference is found, throw an error +func (a *AdvRefs) resolveHead(s storer.ReferenceStorer) error { + if a.Head == nil { + return nil + } + + ref, err := s.Reference(plumbing.Master) + + // check first if HEAD is pointing to master + if err == nil { + ok, err := a.createHeadIfCorrectReference(ref, s) + if err != nil { + return err + } + + if ok { + return nil + } + } + + if err != nil && err != plumbing.ErrReferenceNotFound { + return err + } + + // From here we are trying to guess the branch that HEAD is pointing + refIter, err := s.IterReferences() + if err != nil { + return err + } + + var refNames []string + err = refIter.ForEach(func(r *plumbing.Reference) error { + refNames = append(refNames, string(r.Name())) + return nil + }) + if err != nil { + return err + } + + sort.Strings(refNames) + + var headSet bool + for _, refName := range refNames { + ref, err := s.Reference(plumbing.ReferenceName(refName)) + if err != nil { + return err + } + ok, err := a.createHeadIfCorrectReference(ref, s) + if err != nil { + return err + } + if ok { + headSet = true + break + } + } + + if !headSet { + return plumbing.ErrReferenceNotFound + } + + return nil +} + +func (a *AdvRefs) createHeadIfCorrectReference( + reference *plumbing.Reference, + s storer.ReferenceStorer) (bool, error) { + if reference.Hash() == *a.Head { + headRef := plumbing.NewSymbolicReference(plumbing.HEAD, reference.Name()) + if err := s.SetReference(headRef); err != nil { + return false, err + } + + return true, nil + } + + return false, nil +} + +func (a *AdvRefs) addSymbolicRefs(s storer.ReferenceStorer) error { + for _, symref := range a.Capabilities.Get(capability.SymRef) { + chunks := strings.Split(symref, ":") + if len(chunks) != 2 { + err := fmt.Errorf("bad number of `:` in symref value (%q)", symref) + return plumbing.NewUnexpectedError(err) + } + name := plumbing.ReferenceName(chunks[0]) + target := plumbing.ReferenceName(chunks[1]) + ref := plumbing.NewSymbolicReference(name, target) + if err := s.SetReference(ref); err != nil { + return nil + } + } + + return nil +} + +func (a *AdvRefs) supportSymrefs() bool { + return a.Capabilities.Supports(capability.SymRef) +} + +// IsEmpty returns true if doesn't contain any reference. +func (a *AdvRefs) IsEmpty() bool { + return a.Head == nil && + len(a.References) == 0 && + len(a.Peeled) == 0 && + len(a.Shallows) == 0 +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_decode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_decode.go new file mode 100644 index 0000000000..63bbe5ab16 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_decode.go @@ -0,0 +1,288 @@ +package packp + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// Decode reads the next advertised-refs message form its input and +// stores it in the AdvRefs. +func (a *AdvRefs) Decode(r io.Reader) error { + d := newAdvRefsDecoder(r) + return d.Decode(a) +} + +type advRefsDecoder struct { + s *pktline.Scanner // a pkt-line scanner from the input stream + line []byte // current pkt-line contents, use parser.nextLine() to make it advance + nLine int // current pkt-line number for debugging, begins at 1 + hash plumbing.Hash // last hash read + err error // sticky error, use the parser.error() method to fill this out + data *AdvRefs // parsed data is stored here +} + +var ( + // ErrEmptyAdvRefs is returned by Decode if it gets an empty advertised + // references message. + ErrEmptyAdvRefs = errors.New("empty advertised-ref message") + // ErrEmptyInput is returned by Decode if the input is empty. + ErrEmptyInput = errors.New("empty input") +) + +func newAdvRefsDecoder(r io.Reader) *advRefsDecoder { + return &advRefsDecoder{ + s: pktline.NewScanner(r), + } +} + +func (d *advRefsDecoder) Decode(v *AdvRefs) error { + d.data = v + + for state := decodePrefix; state != nil; { + state = state(d) + } + + return d.err +} + +type decoderStateFn func(*advRefsDecoder) decoderStateFn + +// fills out the parser sticky error +func (d *advRefsDecoder) error(format string, a ...interface{}) { + msg := fmt.Sprintf( + "pkt-line %d: %s", d.nLine, + fmt.Sprintf(format, a...), + ) + + d.err = NewErrUnexpectedData(msg, d.line) +} + +// Reads a new pkt-line from the scanner, makes its payload available as +// p.line and increments p.nLine. A successful invocation returns true, +// otherwise, false is returned and the sticky error is filled out +// accordingly. Trims eols at the end of the payloads. +func (d *advRefsDecoder) nextLine() bool { + d.nLine++ + + if !d.s.Scan() { + if d.err = d.s.Err(); d.err != nil { + return false + } + + if d.nLine == 1 { + d.err = ErrEmptyInput + return false + } + + d.error("EOF") + return false + } + + d.line = d.s.Bytes() + d.line = bytes.TrimSuffix(d.line, eol) + + return true +} + +// The HTTP smart prefix is often followed by a flush-pkt. +func decodePrefix(d *advRefsDecoder) decoderStateFn { + if ok := d.nextLine(); !ok { + return nil + } + + if !isPrefix(d.line) { + return decodeFirstHash + } + + tmp := make([]byte, len(d.line)) + copy(tmp, d.line) + d.data.Prefix = append(d.data.Prefix, tmp) + if ok := d.nextLine(); !ok { + return nil + } + + if !isFlush(d.line) { + return decodeFirstHash + } + + d.data.Prefix = append(d.data.Prefix, pktline.Flush) + if ok := d.nextLine(); !ok { + return nil + } + + return decodeFirstHash +} + +func isPrefix(payload []byte) bool { + return len(payload) > 0 && payload[0] == '#' +} + +// If the first hash is zero, then a no-refs is coming. Otherwise, a +// list-of-refs is coming, and the hash will be followed by the first +// advertised ref. +func decodeFirstHash(p *advRefsDecoder) decoderStateFn { + // If the repository is empty, we receive a flush here (HTTP). + if isFlush(p.line) { + p.err = ErrEmptyAdvRefs + return nil + } + + if len(p.line) < hashSize { + p.error("cannot read hash, pkt-line too short") + return nil + } + + if _, err := hex.Decode(p.hash[:], p.line[:hashSize]); err != nil { + p.error("invalid hash text: %s", err) + return nil + } + + p.line = p.line[hashSize:] + + if p.hash.IsZero() { + return decodeSkipNoRefs + } + + return decodeFirstRef +} + +// Skips SP "capabilities^{}" NUL +func decodeSkipNoRefs(p *advRefsDecoder) decoderStateFn { + if len(p.line) < len(noHeadMark) { + p.error("too short zero-id ref") + return nil + } + + if !bytes.HasPrefix(p.line, noHeadMark) { + p.error("malformed zero-id ref") + return nil + } + + p.line = p.line[len(noHeadMark):] + + return decodeCaps +} + +// decode the refname, expects SP refname NULL +func decodeFirstRef(l *advRefsDecoder) decoderStateFn { + if len(l.line) < 3 { + l.error("line too short after hash") + return nil + } + + if !bytes.HasPrefix(l.line, sp) { + l.error("no space after hash") + return nil + } + l.line = l.line[1:] + + chunks := bytes.SplitN(l.line, null, 2) + if len(chunks) < 2 { + l.error("NULL not found") + return nil + } + ref := chunks[0] + l.line = chunks[1] + + if bytes.Equal(ref, []byte(head)) { + l.data.Head = &l.hash + } else { + l.data.References[string(ref)] = l.hash + } + + return decodeCaps +} + +func decodeCaps(p *advRefsDecoder) decoderStateFn { + if err := p.data.Capabilities.Decode(p.line); err != nil { + p.error("invalid capabilities: %s", err) + return nil + } + + return decodeOtherRefs +} + +// The refs are either tips (obj-id SP refname) or a peeled (obj-id SP refname^{}). +// If there are no refs, then there might be a shallow or flush-ptk. +func decodeOtherRefs(p *advRefsDecoder) decoderStateFn { + if ok := p.nextLine(); !ok { + return nil + } + + if bytes.HasPrefix(p.line, shallow) { + return decodeShallow + } + + if len(p.line) == 0 { + return nil + } + + saveTo := p.data.References + if bytes.HasSuffix(p.line, peeled) { + p.line = bytes.TrimSuffix(p.line, peeled) + saveTo = p.data.Peeled + } + + ref, hash, err := readRef(p.line) + if err != nil { + p.error("%s", err) + return nil + } + saveTo[ref] = hash + + return decodeOtherRefs +} + +// Reads a ref-name +func readRef(data []byte) (string, plumbing.Hash, error) { + chunks := bytes.Split(data, sp) + switch { + case len(chunks) == 1: + return "", plumbing.ZeroHash, fmt.Errorf("malformed ref data: no space was found") + case len(chunks) > 2: + return "", plumbing.ZeroHash, fmt.Errorf("malformed ref data: more than one space found") + default: + return string(chunks[1]), plumbing.NewHash(string(chunks[0])), nil + } +} + +// Keeps reading shallows until a flush-pkt is found +func decodeShallow(p *advRefsDecoder) decoderStateFn { + if !bytes.HasPrefix(p.line, shallow) { + p.error("malformed shallow prefix, found %q... instead", p.line[:len(shallow)]) + return nil + } + p.line = bytes.TrimPrefix(p.line, shallow) + + if len(p.line) != hashSize { + p.error(fmt.Sprintf( + "malformed shallow hash: wrong length, expected 40 bytes, read %d bytes", + len(p.line))) + return nil + } + + text := p.line[:hashSize] + var h plumbing.Hash + if _, err := hex.Decode(h[:], text); err != nil { + p.error("invalid hash text: %s", err) + return nil + } + + p.data.Shallows = append(p.data.Shallows, h) + + if ok := p.nextLine(); !ok { + return nil + } + + if len(p.line) == 0 { + return nil // successful parse of the advertised-refs message + } + + return decodeShallow +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_encode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_encode.go new file mode 100644 index 0000000000..fb9bd883fc --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_encode.go @@ -0,0 +1,176 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + "sort" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +// Encode writes the AdvRefs encoding to a writer. +// +// All the payloads will end with a newline character. Capabilities, +// references and shallows are written in alphabetical order, except for +// peeled references that always follow their corresponding references. +func (a *AdvRefs) Encode(w io.Writer) error { + e := newAdvRefsEncoder(w) + return e.Encode(a) +} + +type advRefsEncoder struct { + data *AdvRefs // data to encode + pe *pktline.Encoder // where to write the encoded data + firstRefName string // reference name to encode in the first pkt-line (HEAD if present) + firstRefHash plumbing.Hash // hash referenced to encode in the first pkt-line (HEAD if present) + sortedRefs []string // hash references to encode ordered by increasing order + err error // sticky error + +} + +func newAdvRefsEncoder(w io.Writer) *advRefsEncoder { + return &advRefsEncoder{ + pe: pktline.NewEncoder(w), + } +} + +func (e *advRefsEncoder) Encode(v *AdvRefs) error { + e.data = v + e.sortRefs() + e.setFirstRef() + + for state := encodePrefix; state != nil; { + state = state(e) + } + + return e.err +} + +func (e *advRefsEncoder) sortRefs() { + if len(e.data.References) > 0 { + refs := make([]string, 0, len(e.data.References)) + for refName := range e.data.References { + refs = append(refs, refName) + } + + sort.Strings(refs) + e.sortedRefs = refs + } +} + +func (e *advRefsEncoder) setFirstRef() { + if e.data.Head != nil { + e.firstRefName = head + e.firstRefHash = *e.data.Head + return + } + + if len(e.sortedRefs) > 0 { + refName := e.sortedRefs[0] + e.firstRefName = refName + e.firstRefHash = e.data.References[refName] + } +} + +type encoderStateFn func(*advRefsEncoder) encoderStateFn + +func encodePrefix(e *advRefsEncoder) encoderStateFn { + for _, p := range e.data.Prefix { + if bytes.Equal(p, pktline.Flush) { + if e.err = e.pe.Flush(); e.err != nil { + return nil + } + continue + } + if e.err = e.pe.Encodef("%s\n", string(p)); e.err != nil { + return nil + } + } + + return encodeFirstLine +} + +// Adds the first pkt-line payload: head hash, head ref and capabilities. +// If HEAD ref is not found, the first reference ordered in increasing order will be used. +// If there aren't HEAD neither refs, the first line will be "PKT-LINE(zero-id SP "capabilities^{}" NUL capability-list)". +// See: https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt +// See: https://github.com/git/git/blob/master/Documentation/technical/protocol-common.txt +func encodeFirstLine(e *advRefsEncoder) encoderStateFn { + const formatFirstLine = "%s %s\x00%s\n" + var firstLine string + capabilities := formatCaps(e.data.Capabilities) + + if e.firstRefName == "" { + firstLine = fmt.Sprintf(formatFirstLine, plumbing.ZeroHash.String(), "capabilities^{}", capabilities) + } else { + firstLine = fmt.Sprintf(formatFirstLine, e.firstRefHash.String(), e.firstRefName, capabilities) + + } + + if e.err = e.pe.EncodeString(firstLine); e.err != nil { + return nil + } + + return encodeRefs +} + +func formatCaps(c *capability.List) string { + if c == nil { + return "" + } + + return c.String() +} + +// Adds the (sorted) refs: hash SP refname EOL +// and their peeled refs if any. +func encodeRefs(e *advRefsEncoder) encoderStateFn { + for _, r := range e.sortedRefs { + if r == e.firstRefName { + continue + } + + hash := e.data.References[r] + if e.err = e.pe.Encodef("%s %s\n", hash.String(), r); e.err != nil { + return nil + } + + if hash, ok := e.data.Peeled[r]; ok { + if e.err = e.pe.Encodef("%s %s^{}\n", hash.String(), r); e.err != nil { + return nil + } + } + } + + return encodeShallow +} + +// Adds the (sorted) shallows: "shallow" SP hash EOL +func encodeShallow(e *advRefsEncoder) encoderStateFn { + sorted := sortShallows(e.data.Shallows) + for _, hash := range sorted { + if e.err = e.pe.Encodef("shallow %s\n", hash); e.err != nil { + return nil + } + } + + return encodeFlush +} + +func sortShallows(c []plumbing.Hash) []string { + ret := []string{} + for _, h := range c { + ret = append(ret, h.String()) + } + sort.Strings(ret) + + return ret +} + +func encodeFlush(e *advRefsEncoder) encoderStateFn { + e.err = e.pe.Flush() + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/capability.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/capability.go new file mode 100644 index 0000000000..8d6a56f532 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/capability.go @@ -0,0 +1,259 @@ +// Package capability defines the server and client capabilities. +package capability + +// Capability describes a server or client capability. +type Capability string + +func (n Capability) String() string { + return string(n) +} + +const ( + // MultiACK capability allows the server to return "ACK obj-id continue" as + // soon as it finds a commit that it can use as a common base, between the + // client's wants and the client's have set. + // + // By sending this early, the server can potentially head off the client + // from walking any further down that particular branch of the client's + // repository history. The client may still need to walk down other + // branches, sending have lines for those, until the server has a + // complete cut across the DAG, or the client has said "done". + // + // Without multi_ack, a client sends have lines in --date-order until + // the server has found a common base. That means the client will send + // have lines that are already known by the server to be common, because + // they overlap in time with another branch that the server hasn't found + // a common base on yet. + // + // For example suppose the client has commits in caps that the server + // doesn't and the server has commits in lower case that the client + // doesn't, as in the following diagram: + // + // +---- u ---------------------- x + // / +----- y + // / / + // a -- b -- c -- d -- E -- F + // \ + // +--- Q -- R -- S + // + // If the client wants x,y and starts out by saying have F,S, the server + // doesn't know what F,S is. Eventually the client says "have d" and + // the server sends "ACK d continue" to let the client know to stop + // walking down that line (so don't send c-b-a), but it's not done yet, + // it needs a base for x. The client keeps going with S-R-Q, until a + // gets reached, at which point the server has a clear base and it all + // ends. + // + // Without multi_ack the client would have sent that c-b-a chain anyway, + // interleaved with S-R-Q. + MultiACK Capability = "multi_ack" + // MultiACKDetailed is an extension of multi_ack that permits client to + // better understand the server's in-memory state. + MultiACKDetailed Capability = "multi_ack_detailed" + // NoDone should only be used with the smart HTTP protocol. If + // multi_ack_detailed and no-done are both present, then the sender is + // free to immediately send a pack following its first "ACK obj-id ready" + // message. + // + // Without no-done in the smart HTTP protocol, the server session would + // end and the client has to make another trip to send "done" before + // the server can send the pack. no-done removes the last round and + // thus slightly reduces latency. + NoDone Capability = "no-done" + // ThinPack is one with deltas which reference base objects not + // contained within the pack (but are known to exist at the receiving + // end). This can reduce the network traffic significantly, but it + // requires the receiving end to know how to "thicken" these packs by + // adding the missing bases to the pack. + // + // The upload-pack server advertises 'thin-pack' when it can generate + // and send a thin pack. A client requests the 'thin-pack' capability + // when it understands how to "thicken" it, notifying the server that + // it can receive such a pack. A client MUST NOT request the + // 'thin-pack' capability if it cannot turn a thin pack into a + // self-contained pack. + // + // Receive-pack, on the other hand, is assumed by default to be able to + // handle thin packs, but can ask the client not to use the feature by + // advertising the 'no-thin' capability. A client MUST NOT send a thin + // pack if the server advertises the 'no-thin' capability. + // + // The reasons for this asymmetry are historical. The receive-pack + // program did not exist until after the invention of thin packs, so + // historically the reference implementation of receive-pack always + // understood thin packs. Adding 'no-thin' later allowed receive-pack + // to disable the feature in a backwards-compatible manner. + ThinPack Capability = "thin-pack" + // Sideband means that server can send, and client understand multiplexed + // progress reports and error info interleaved with the packfile itself. + // + // These two options are mutually exclusive. A modern client always + // favors Sideband64k. + // + // Either mode indicates that the packfile data will be streamed broken + // up into packets of up to either 1000 bytes in the case of 'side_band', + // or 65520 bytes in the case of 'side_band_64k'. Each packet is made up + // of a leading 4-byte pkt-line length of how much data is in the packet, + // followed by a 1-byte stream code, followed by the actual data. + // + // The stream code can be one of: + // + // 1 - pack data + // 2 - progress messages + // 3 - fatal error message just before stream aborts + // + // The "side-band-64k" capability came about as a way for newer clients + // that can handle much larger packets to request packets that are + // actually crammed nearly full, while maintaining backward compatibility + // for the older clients. + // + // Further, with side-band and its up to 1000-byte messages, it's actually + // 999 bytes of payload and 1 byte for the stream code. With side-band-64k, + // same deal, you have up to 65519 bytes of data and 1 byte for the stream + // code. + // + // The client MUST send only maximum of one of "side-band" and "side- + // band-64k". Server MUST diagnose it as an error if client requests + // both. + Sideband Capability = "side-band" + Sideband64k Capability = "side-band-64k" + // OFSDelta server can send, and client understand PACKv2 with delta + // referring to its base by position in pack rather than by an obj-id. That + // is, they can send/read OBJ_OFS_DELTA (aka type 6) in a packfile. + OFSDelta Capability = "ofs-delta" + // Agent the server may optionally send this capability to notify the client + // that the server is running version `X`. The client may optionally return + // its own agent string by responding with an `agent=Y` capability (but it + // MUST NOT do so if the server did not mention the agent capability). The + // `X` and `Y` strings may contain any printable ASCII characters except + // space (i.e., the byte range 32 < x < 127), and are typically of the form + // "package/version" (e.g., "git/1.8.3.1"). The agent strings are purely + // informative for statistics and debugging purposes, and MUST NOT be used + // to programmatically assume the presence or absence of particular features. + Agent Capability = "agent" + // Shallow capability adds "deepen", "shallow" and "unshallow" commands to + // the fetch-pack/upload-pack protocol so clients can request shallow + // clones. + Shallow Capability = "shallow" + // DeepenSince adds "deepen-since" command to fetch-pack/upload-pack + // protocol so the client can request shallow clones that are cut at a + // specific time, instead of depth. Internally it's equivalent of doing + // "rev-list --max-age=" on the server side. "deepen-since" + // cannot be used with "deepen". + DeepenSince Capability = "deepen-since" + // DeepenNot adds "deepen-not" command to fetch-pack/upload-pack + // protocol so the client can request shallow clones that are cut at a + // specific revision, instead of depth. Internally it's equivalent of + // doing "rev-list --not " on the server side. "deepen-not" + // cannot be used with "deepen", but can be used with "deepen-since". + DeepenNot Capability = "deepen-not" + // DeepenRelative if this capability is requested by the client, the + // semantics of "deepen" command is changed. The "depth" argument is the + // depth from the current shallow boundary, instead of the depth from + // remote refs. + DeepenRelative Capability = "deepen-relative" + // NoProgress the client was started with "git clone -q" or something, and + // doesn't want that side band 2. Basically the client just says "I do not + // wish to receive stream 2 on sideband, so do not send it to me, and if + // you did, I will drop it on the floor anyway". However, the sideband + // channel 3 is still used for error responses. + NoProgress Capability = "no-progress" + // IncludeTag capability is about sending annotated tags if we are + // sending objects they point to. If we pack an object to the client, and + // a tag object points exactly at that object, we pack the tag object too. + // In general this allows a client to get all new annotated tags when it + // fetches a branch, in a single network connection. + // + // Clients MAY always send include-tag, hardcoding it into a request when + // the server advertises this capability. The decision for a client to + // request include-tag only has to do with the client's desires for tag + // data, whether or not a server had advertised objects in the + // refs/tags/* namespace. + // + // Servers MUST pack the tags if their referrant is packed and the client + // has requested include-tags. + // + // Clients MUST be prepared for the case where a server has ignored + // include-tag and has not actually sent tags in the pack. In such + // cases the client SHOULD issue a subsequent fetch to acquire the tags + // that include-tag would have otherwise given the client. + // + // The server SHOULD send include-tag, if it supports it, regardless + // of whether or not there are tags available. + IncludeTag Capability = "include-tag" + // ReportStatus the receive-pack process can receive a 'report-status' + // capability, which tells it that the client wants a report of what + // happened after a packfile upload and reference update. If the pushing + // client requests this capability, after unpacking and updating references + // the server will respond with whether the packfile unpacked successfully + // and if each reference was updated successfully. If any of those were not + // successful, it will send back an error message. See pack-protocol.txt + // for example messages. + ReportStatus Capability = "report-status" + // DeleteRefs If the server sends back this capability, it means that + // it is capable of accepting a zero-id value as the target + // value of a reference update. It is not sent back by the client, it + // simply informs the client that it can be sent zero-id values + // to delete references + DeleteRefs Capability = "delete-refs" + // Quiet If the receive-pack server advertises this capability, it is + // capable of silencing human-readable progress output which otherwise may + // be shown when processing the received pack. A send-pack client should + // respond with the 'quiet' capability to suppress server-side progress + // reporting if the local progress reporting is also being suppressed + // (e.g., via `push -q`, or if stderr does not go to a tty). + Quiet Capability = "quiet" + // Atomic If the server sends this capability it is capable of accepting + // atomic pushes. If the pushing client requests this capability, the server + // will update the refs in one atomic transaction. Either all refs are + // updated or none. + Atomic Capability = "atomic" + // PushOptions If the server sends this capability it is able to accept + // push options after the update commands have been sent, but before the + // packfile is streamed. If the pushing client requests this capability, + // the server will pass the options to the pre- and post- receive hooks + // that process this push request. + PushOptions Capability = "push-options" + // AllowTipSHA1InWant if the upload-pack server advertises this capability, + // fetch-pack may send "want" lines with SHA-1s that exist at the server but + // are not advertised by upload-pack. + AllowTipSHA1InWant Capability = "allow-tip-sha1-in-want" + // AllowReachableSHA1InWant if the upload-pack server advertises this + // capability, fetch-pack may send "want" lines with SHA-1s that exist at + // the server but are not advertised by upload-pack. + AllowReachableSHA1InWant Capability = "allow-reachable-sha1-in-want" + // PushCert the receive-pack server that advertises this capability is + // willing to accept a signed push certificate, and asks the to be + // included in the push certificate. A send-pack client MUST NOT + // send a push-cert packet unless the receive-pack server advertises + // this capability. + PushCert Capability = "push-cert" + // SymRef symbolic reference support for better negotiation. + SymRef Capability = "symref" + // ObjectFormat takes a hash algorithm as an argument, indicates that the + // server supports the given hash algorithms. + ObjectFormat Capability = "object-format" + // Filter if present, fetch-pack may send "filter" commands to request a + // partial clone or partial fetch and request that the server omit various objects from the packfile + Filter Capability = "filter" +) + +const DefaultAgent = "go-git/4.x" + +var known = map[Capability]bool{ + MultiACK: true, MultiACKDetailed: true, NoDone: true, ThinPack: true, + Sideband: true, Sideband64k: true, OFSDelta: true, Agent: true, + Shallow: true, DeepenSince: true, DeepenNot: true, DeepenRelative: true, + NoProgress: true, IncludeTag: true, ReportStatus: true, DeleteRefs: true, + Quiet: true, Atomic: true, PushOptions: true, AllowTipSHA1InWant: true, + AllowReachableSHA1InWant: true, PushCert: true, SymRef: true, + ObjectFormat: true, Filter: true, +} + +var requiresArgument = map[Capability]bool{ + Agent: true, PushCert: true, SymRef: true, ObjectFormat: true, +} + +var multipleArgument = map[Capability]bool{ + SymRef: true, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/list.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/list.go new file mode 100644 index 0000000000..f41ec799cf --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/list.go @@ -0,0 +1,193 @@ +package capability + +import ( + "bytes" + "errors" + "fmt" + "strings" +) + +var ( + // ErrArgumentsRequired is returned if no arguments are giving with a + // capability that requires arguments + ErrArgumentsRequired = errors.New("arguments required") + // ErrArguments is returned if arguments are given with a capabilities that + // not supports arguments + ErrArguments = errors.New("arguments not allowed") + // ErrEmptyArgument is returned when an empty value is given + ErrEmptyArgument = errors.New("empty argument") + // ErrMultipleArguments multiple argument given to a capabilities that not + // support it + ErrMultipleArguments = errors.New("multiple arguments not allowed") +) + +// List represents a list of capabilities +type List struct { + m map[Capability]*entry + sort []string +} + +type entry struct { + Name Capability + Values []string +} + +// NewList returns a new List of capabilities +func NewList() *List { + return &List{ + m: make(map[Capability]*entry), + } +} + +// IsEmpty returns true if the List is empty +func (l *List) IsEmpty() bool { + return len(l.sort) == 0 +} + +// Decode decodes list of capabilities from raw into the list +func (l *List) Decode(raw []byte) error { + // git 1.x receive pack used to send a leading space on its + // git-receive-pack capabilities announcement. We just trim space to be + // tolerant to space changes in different versions. + raw = bytes.TrimSpace(raw) + + if len(raw) == 0 { + return nil + } + + for _, data := range bytes.Split(raw, []byte{' '}) { + pair := bytes.SplitN(data, []byte{'='}, 2) + + c := Capability(pair[0]) + if len(pair) == 1 { + if err := l.Add(c); err != nil { + return err + } + + continue + } + + if err := l.Add(c, string(pair[1])); err != nil { + return err + } + } + + return nil +} + +// Get returns the values for a capability +func (l *List) Get(capability Capability) []string { + if _, ok := l.m[capability]; !ok { + return nil + } + + return l.m[capability].Values +} + +// Set sets a capability removing the previous values +func (l *List) Set(capability Capability, values ...string) error { + delete(l.m, capability) + return l.Add(capability, values...) +} + +// Add adds a capability, values are optional +func (l *List) Add(c Capability, values ...string) error { + if err := l.validate(c, values); err != nil { + return err + } + + if !l.Supports(c) { + l.m[c] = &entry{Name: c} + l.sort = append(l.sort, c.String()) + } + + if len(values) == 0 { + return nil + } + + if known[c] && !multipleArgument[c] && len(l.m[c].Values) > 0 { + return ErrMultipleArguments + } + + l.m[c].Values = append(l.m[c].Values, values...) + return nil +} + +func (l *List) validateNoEmptyArgs(values []string) error { + for _, v := range values { + if v == "" { + return ErrEmptyArgument + } + } + return nil +} + +func (l *List) validate(c Capability, values []string) error { + if !known[c] { + return l.validateNoEmptyArgs(values) + } + if requiresArgument[c] && len(values) == 0 { + return ErrArgumentsRequired + } + + if !requiresArgument[c] && len(values) != 0 { + return ErrArguments + } + + if !multipleArgument[c] && len(values) > 1 { + return ErrMultipleArguments + } + return l.validateNoEmptyArgs(values) +} + +// Supports returns true if capability is present +func (l *List) Supports(capability Capability) bool { + _, ok := l.m[capability] + return ok +} + +// Delete deletes a capability from the List +func (l *List) Delete(capability Capability) { + if !l.Supports(capability) { + return + } + + delete(l.m, capability) + for i, c := range l.sort { + if c != string(capability) { + continue + } + + l.sort = append(l.sort[:i], l.sort[i+1:]...) + return + } +} + +// All returns a slice with all defined capabilities. +func (l *List) All() []Capability { + var cs []Capability + for _, key := range l.sort { + cs = append(cs, Capability(key)) + } + + return cs +} + +// String generates the capabilities strings, the capabilities are sorted in +// insertion order +func (l *List) String() string { + var o []string + for _, key := range l.sort { + cap := l.m[Capability(key)] + if len(cap.Values) == 0 { + o = append(o, key) + continue + } + + for _, value := range cap.Values { + o = append(o, fmt.Sprintf("%s=%s", key, value)) + } + } + + return strings.Join(o, " ") +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/common.go new file mode 100644 index 0000000000..ab07ac8f74 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/common.go @@ -0,0 +1,70 @@ +package packp + +import ( + "fmt" +) + +type stateFn func() stateFn + +const ( + // common + hashSize = 40 + + // advrefs + head = "HEAD" + noHead = "capabilities^{}" +) + +var ( + // common + sp = []byte(" ") + eol = []byte("\n") + eq = []byte{'='} + + // advertised-refs + null = []byte("\x00") + peeled = []byte("^{}") + noHeadMark = []byte(" capabilities^{}\x00") + + // upload-request + want = []byte("want ") + shallow = []byte("shallow ") + deepen = []byte("deepen") + deepenCommits = []byte("deepen ") + deepenSince = []byte("deepen-since ") + deepenReference = []byte("deepen-not ") + + // shallow-update + unshallow = []byte("unshallow ") + + // server-response + ack = []byte("ACK") + nak = []byte("NAK") + + // updreq + shallowNoSp = []byte("shallow") +) + +func isFlush(payload []byte) bool { + return len(payload) == 0 +} + +// ErrUnexpectedData represents an unexpected data decoding a message +type ErrUnexpectedData struct { + Msg string + Data []byte +} + +// NewErrUnexpectedData returns a new ErrUnexpectedData containing the data and +// the message given +func NewErrUnexpectedData(msg string, data []byte) error { + return &ErrUnexpectedData{Msg: msg, Data: data} +} + +func (err *ErrUnexpectedData) Error() string { + if len(err.Data) == 0 { + return err.Msg + } + + return fmt.Sprintf("%s (%s)", err.Msg, err.Data) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/doc.go new file mode 100644 index 0000000000..4950d1d662 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/doc.go @@ -0,0 +1,724 @@ +package packp + +/* + +A nice way to trace the real data transmitted and received by git, use: + +GIT_TRACE_PACKET=true git ls-remote http://github.com/src-d/go-git +GIT_TRACE_PACKET=true git clone http://github.com/src-d/go-git + +Here follows a copy of the current protocol specification at the time of +this writing. + +(Please notice that most http git servers will add a flush-pkt after the +first pkt-line when using HTTP smart.) + + +Documentation Common to Pack and Http Protocols +=============================================== + +ABNF Notation +------------- + +ABNF notation as described by RFC 5234 is used within the protocol documents, +except the following replacement core rules are used: +---- + HEXDIG = DIGIT / "a" / "b" / "c" / "d" / "e" / "f" +---- + +We also define the following common rules: +---- + NUL = %x00 + zero-id = 40*"0" + obj-id = 40*(HEXDIGIT) + + refname = "HEAD" + refname /= "refs/" +---- + +A refname is a hierarchical octet string beginning with "refs/" and +not violating the 'git-check-ref-format' command's validation rules. +More specifically, they: + +. They can include slash `/` for hierarchical (directory) + grouping, but no slash-separated component can begin with a + dot `.`. + +. They must contain at least one `/`. This enforces the presence of a + category like `heads/`, `tags/` etc. but the actual names are not + restricted. + +. They cannot have two consecutive dots `..` anywhere. + +. They cannot have ASCII control characters (i.e. bytes whose + values are lower than \040, or \177 `DEL`), space, tilde `~`, + caret `^`, colon `:`, question-mark `?`, asterisk `*`, + or open bracket `[` anywhere. + +. They cannot end with a slash `/` or a dot `.`. + +. They cannot end with the sequence `.lock`. + +. They cannot contain a sequence `@{`. + +. They cannot contain a `\\`. + + +pkt-line Format +--------------- + +Much (but not all) of the payload is described around pkt-lines. + +A pkt-line is a variable length binary string. The first four bytes +of the line, the pkt-len, indicates the total length of the line, +in hexadecimal. The pkt-len includes the 4 bytes used to contain +the length's hexadecimal representation. + +A pkt-line MAY contain binary data, so implementors MUST ensure +pkt-line parsing/formatting routines are 8-bit clean. + +A non-binary line SHOULD BE terminated by an LF, which if present +MUST be included in the total length. Receivers MUST treat pkt-lines +with non-binary data the same whether or not they contain the trailing +LF (stripping the LF if present, and not complaining when it is +missing). + +The maximum length of a pkt-line's data component is 65516 bytes. +Implementations MUST NOT send pkt-line whose length exceeds 65520 +(65516 bytes of payload + 4 bytes of length data). + +Implementations SHOULD NOT send an empty pkt-line ("0004"). + +A pkt-line with a length field of 0 ("0000"), called a flush-pkt, +is a special case and MUST be handled differently than an empty +pkt-line ("0004"). + +---- + pkt-line = data-pkt / flush-pkt + + data-pkt = pkt-len pkt-payload + pkt-len = 4*(HEXDIG) + pkt-payload = (pkt-len - 4)*(OCTET) + + flush-pkt = "0000" +---- + +Examples (as C-style strings): + +---- + pkt-line actual value + --------------------------------- + "0006a\n" "a\n" + "0005a" "a" + "000bfoobar\n" "foobar\n" + "0004" "" +---- + +Packfile transfer protocols +=========================== + +Git supports transferring data in packfiles over the ssh://, git://, http:// and +file:// transports. There exist two sets of protocols, one for pushing +data from a client to a server and another for fetching data from a +server to a client. The three transports (ssh, git, file) use the same +protocol to transfer data. http is documented in http-protocol.txt. + +The processes invoked in the canonical Git implementation are 'upload-pack' +on the server side and 'fetch-pack' on the client side for fetching data; +then 'receive-pack' on the server and 'send-pack' on the client for pushing +data. The protocol functions to have a server tell a client what is +currently on the server, then for the two to negotiate the smallest amount +of data to send in order to fully update one or the other. + +pkt-line Format +--------------- + +The descriptions below build on the pkt-line format described in +protocol-common.txt. When the grammar indicate `PKT-LINE(...)`, unless +otherwise noted the usual pkt-line LF rules apply: the sender SHOULD +include a LF, but the receiver MUST NOT complain if it is not present. + +Transports +---------- +There are three transports over which the packfile protocol is +initiated. The Git transport is a simple, unauthenticated server that +takes the command (almost always 'upload-pack', though Git +servers can be configured to be globally writable, in which 'receive- +pack' initiation is also allowed) with which the client wishes to +communicate and executes it and connects it to the requesting +process. + +In the SSH transport, the client just runs the 'upload-pack' +or 'receive-pack' process on the server over the SSH protocol and then +communicates with that invoked process over the SSH connection. + +The file:// transport runs the 'upload-pack' or 'receive-pack' +process locally and communicates with it over a pipe. + +Git Transport +------------- + +The Git transport starts off by sending the command and repository +on the wire using the pkt-line format, followed by a NUL byte and a +hostname parameter, terminated by a NUL byte. + + 0032git-upload-pack /project.git\0host=myserver.com\0 + +-- + git-proto-request = request-command SP pathname NUL [ host-parameter NUL ] + request-command = "git-upload-pack" / "git-receive-pack" / + "git-upload-archive" ; case sensitive + pathname = *( %x01-ff ) ; exclude NUL + host-parameter = "host=" hostname [ ":" port ] +-- + +Only host-parameter is allowed in the git-proto-request. Clients +MUST NOT attempt to send additional parameters. It is used for the +git-daemon name based virtual hosting. See --interpolated-path +option to git daemon, with the %H/%CH format characters. + +Basically what the Git client is doing to connect to an 'upload-pack' +process on the server side over the Git protocol is this: + + $ echo -e -n \ + "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" | + nc -v example.com 9418 + +If the server refuses the request for some reasons, it could abort +gracefully with an error message. + +---- + error-line = PKT-LINE("ERR" SP explanation-text) +---- + + +SSH Transport +------------- + +Initiating the upload-pack or receive-pack processes over SSH is +executing the binary on the server via SSH remote execution. +It is basically equivalent to running this: + + $ ssh git.example.com "git-upload-pack '/project.git'" + +For a server to support Git pushing and pulling for a given user over +SSH, that user needs to be able to execute one or both of those +commands via the SSH shell that they are provided on login. On some +systems, that shell access is limited to only being able to run those +two commands, or even just one of them. + +In an ssh:// format URI, it's absolute in the URI, so the '/' after +the host name (or port number) is sent as an argument, which is then +read by the remote git-upload-pack exactly as is, so it's effectively +an absolute path in the remote filesystem. + + git clone ssh://user@example.com/project.git + | + v + ssh user@example.com "git-upload-pack '/project.git'" + +In a "user@host:path" format URI, its relative to the user's home +directory, because the Git client will run: + + git clone user@example.com:project.git + | + v + ssh user@example.com "git-upload-pack 'project.git'" + +The exception is if a '~' is used, in which case +we execute it without the leading '/'. + + ssh://user@example.com/~alice/project.git, + | + v + ssh user@example.com "git-upload-pack '~alice/project.git'" + +A few things to remember here: + +- The "command name" is spelled with dash (e.g. git-upload-pack), but + this can be overridden by the client; + +- The repository path is always quoted with single quotes. + +Fetching Data From a Server +--------------------------- + +When one Git repository wants to get data that a second repository +has, the first can 'fetch' from the second. This operation determines +what data the server has that the client does not then streams that +data down to the client in packfile format. + + +Reference Discovery +------------------- + +When the client initially connects the server will immediately respond +with a listing of each reference it has (all branches and tags) along +with the object name that each reference currently points to. + + $ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" | + nc -v example.com 9418 + 00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack + side-band side-band-64k ofs-delta shallow no-progress include-tag + 00441d3fcd5ced445d1abc402225c0b8a1299641f497 refs/heads/integration + 003f7217a7c7e582c46cec22a130adf4b9d7d950fba0 refs/heads/master + 003cb88d2441cac0977faf98efc80305012112238d9d refs/tags/v0.9 + 003c525128480b96c89e6418b1e40909bf6c5b2d580f refs/tags/v1.0 + 003fe92df48743b7bc7d26bcaabfddde0a1e20cae47c refs/tags/v1.0^{} + 0000 + +The returned response is a pkt-line stream describing each ref and +its current value. The stream MUST be sorted by name according to +the C locale ordering. + +If HEAD is a valid ref, HEAD MUST appear as the first advertised +ref. If HEAD is not a valid ref, HEAD MUST NOT appear in the +advertisement list at all, but other refs may still appear. + +The stream MUST include capability declarations behind a NUL on the +first ref. The peeled value of a ref (that is "ref^{}") MUST be +immediately after the ref itself, if presented. A conforming server +MUST peel the ref if it's an annotated tag. + +---- + advertised-refs = (no-refs / list-of-refs) + *shallow + flush-pkt + + no-refs = PKT-LINE(zero-id SP "capabilities^{}" + NUL capability-list) + + list-of-refs = first-ref *other-ref + first-ref = PKT-LINE(obj-id SP refname + NUL capability-list) + + other-ref = PKT-LINE(other-tip / other-peeled) + other-tip = obj-id SP refname + other-peeled = obj-id SP refname "^{}" + + shallow = PKT-LINE("shallow" SP obj-id) + + capability-list = capability *(SP capability) + capability = 1*(LC_ALPHA / DIGIT / "-" / "_") + LC_ALPHA = %x61-7A +---- + +Server and client MUST use lowercase for obj-id, both MUST treat obj-id +as case-insensitive. + +See protocol-capabilities.txt for a list of allowed server capabilities +and descriptions. + +Packfile Negotiation +-------------------- +After reference and capabilities discovery, the client can decide to +terminate the connection by sending a flush-pkt, telling the server it can +now gracefully terminate, and disconnect, when it does not need any pack +data. This can happen with the ls-remote command, and also can happen when +the client already is up-to-date. + +Otherwise, it enters the negotiation phase, where the client and +server determine what the minimal packfile necessary for transport is, +by telling the server what objects it wants, its shallow objects +(if any), and the maximum commit depth it wants (if any). The client +will also send a list of the capabilities it wants to be in effect, +out of what the server said it could do with the first 'want' line. + +---- + upload-request = want-list + *shallow-line + *1depth-request + flush-pkt + + want-list = first-want + *additional-want + + shallow-line = PKT-LINE("shallow" SP obj-id) + + depth-request = PKT-LINE("deepen" SP depth) / + PKT-LINE("deepen-since" SP timestamp) / + PKT-LINE("deepen-not" SP ref) + + first-want = PKT-LINE("want" SP obj-id SP capability-list) + additional-want = PKT-LINE("want" SP obj-id) + + depth = 1*DIGIT +---- + +Clients MUST send all the obj-ids it wants from the reference +discovery phase as 'want' lines. Clients MUST send at least one +'want' command in the request body. Clients MUST NOT mention an +obj-id in a 'want' command which did not appear in the response +obtained through ref discovery. + +The client MUST write all obj-ids which it only has shallow copies +of (meaning that it does not have the parents of a commit) as +'shallow' lines so that the server is aware of the limitations of +the client's history. + +The client now sends the maximum commit history depth it wants for +this transaction, which is the number of commits it wants from the +tip of the history, if any, as a 'deepen' line. A depth of 0 is the +same as not making a depth request. The client does not want to receive +any commits beyond this depth, nor does it want objects needed only to +complete those commits. Commits whose parents are not received as a +result are defined as shallow and marked as such in the server. This +information is sent back to the client in the next step. + +Once all the 'want's and 'shallow's (and optional 'deepen') are +transferred, clients MUST send a flush-pkt, to tell the server side +that it is done sending the list. + +Otherwise, if the client sent a positive depth request, the server +will determine which commits will and will not be shallow and +send this information to the client. If the client did not request +a positive depth, this step is skipped. + +---- + shallow-update = *shallow-line + *unshallow-line + flush-pkt + + shallow-line = PKT-LINE("shallow" SP obj-id) + + unshallow-line = PKT-LINE("unshallow" SP obj-id) +---- + +If the client has requested a positive depth, the server will compute +the set of commits which are no deeper than the desired depth. The set +of commits start at the client's wants. + +The server writes 'shallow' lines for each +commit whose parents will not be sent as a result. The server writes +an 'unshallow' line for each commit which the client has indicated is +shallow, but is no longer shallow at the currently requested depth +(that is, its parents will now be sent). The server MUST NOT mark +as unshallow anything which the client has not indicated was shallow. + +Now the client will send a list of the obj-ids it has using 'have' +lines, so the server can make a packfile that only contains the objects +that the client needs. In multi_ack mode, the canonical implementation +will send up to 32 of these at a time, then will send a flush-pkt. The +canonical implementation will skip ahead and send the next 32 immediately, +so that there is always a block of 32 "in-flight on the wire" at a time. + +---- + upload-haves = have-list + compute-end + + have-list = *have-line + have-line = PKT-LINE("have" SP obj-id) + compute-end = flush-pkt / PKT-LINE("done") +---- + +If the server reads 'have' lines, it then will respond by ACKing any +of the obj-ids the client said it had that the server also has. The +server will ACK obj-ids differently depending on which ack mode is +chosen by the client. + +In multi_ack mode: + + * the server will respond with 'ACK obj-id continue' for any common + commits. + + * once the server has found an acceptable common base commit and is + ready to make a packfile, it will blindly ACK all 'have' obj-ids + back to the client. + + * the server will then send a 'NAK' and then wait for another response + from the client - either a 'done' or another list of 'have' lines. + +In multi_ack_detailed mode: + + * the server will differentiate the ACKs where it is signaling + that it is ready to send data with 'ACK obj-id ready' lines, and + signals the identified common commits with 'ACK obj-id common' lines. + +Without either multi_ack or multi_ack_detailed: + + * upload-pack sends "ACK obj-id" on the first common object it finds. + After that it says nothing until the client gives it a "done". + + * upload-pack sends "NAK" on a flush-pkt if no common object + has been found yet. If one has been found, and thus an ACK + was already sent, it's silent on the flush-pkt. + +After the client has gotten enough ACK responses that it can determine +that the server has enough information to send an efficient packfile +(in the canonical implementation, this is determined when it has received +enough ACKs that it can color everything left in the --date-order queue +as common with the server, or the --date-order queue is empty), or the +client determines that it wants to give up (in the canonical implementation, +this is determined when the client sends 256 'have' lines without getting +any of them ACKed by the server - meaning there is nothing in common and +the server should just send all of its objects), then the client will send +a 'done' command. The 'done' command signals to the server that the client +is ready to receive its packfile data. + +However, the 256 limit *only* turns on in the canonical client +implementation if we have received at least one "ACK %s continue" +during a prior round. This helps to ensure that at least one common +ancestor is found before we give up entirely. + +Once the 'done' line is read from the client, the server will either +send a final 'ACK obj-id' or it will send a 'NAK'. 'obj-id' is the object +name of the last commit determined to be common. The server only sends +ACK after 'done' if there is at least one common base and multi_ack or +multi_ack_detailed is enabled. The server always sends NAK after 'done' +if there is no common base found. + +Then the server will start sending its packfile data. + +---- + server-response = *ack_multi ack / nak + ack_multi = PKT-LINE("ACK" SP obj-id ack_status) + ack_status = "continue" / "common" / "ready" + ack = PKT-LINE("ACK" SP obj-id) + nak = PKT-LINE("NAK") +---- + +A simple clone may look like this (with no 'have' lines): + +---- + C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ + side-band-64k ofs-delta\n + C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n + C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n + C: 0032want 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01\n + C: 0032want 74730d410fcb6603ace96f1dc55ea6196122532d\n + C: 0000 + C: 0009done\n + + S: 0008NAK\n + S: [PACKFILE] +---- + +An incremental update (fetch) response might look like this: + +---- + C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ + side-band-64k ofs-delta\n + C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n + C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n + C: 0000 + C: 0032have 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01\n + C: [30 more have lines] + C: 0032have 74730d410fcb6603ace96f1dc55ea6196122532d\n + C: 0000 + + S: 003aACK 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01 continue\n + S: 003aACK 74730d410fcb6603ace96f1dc55ea6196122532d continue\n + S: 0008NAK\n + + C: 0009done\n + + S: 0031ACK 74730d410fcb6603ace96f1dc55ea6196122532d\n + S: [PACKFILE] +---- + + +Packfile Data +------------- + +Now that the client and server have finished negotiation about what +the minimal amount of data that needs to be sent to the client is, the server +will construct and send the required data in packfile format. + +See pack-format.txt for what the packfile itself actually looks like. + +If 'side-band' or 'side-band-64k' capabilities have been specified by +the client, the server will send the packfile data multiplexed. + +Each packet starting with the packet-line length of the amount of data +that follows, followed by a single byte specifying the sideband the +following data is coming in on. + +In 'side-band' mode, it will send up to 999 data bytes plus 1 control +code, for a total of up to 1000 bytes in a pkt-line. In 'side-band-64k' +mode it will send up to 65519 data bytes plus 1 control code, for a +total of up to 65520 bytes in a pkt-line. + +The sideband byte will be a '1', '2' or a '3'. Sideband '1' will contain +packfile data, sideband '2' will be used for progress information that the +client will generally print to stderr and sideband '3' is used for error +information. + +If no 'side-band' capability was specified, the server will stream the +entire packfile without multiplexing. + + +Pushing Data To a Server +------------------------ + +Pushing data to a server will invoke the 'receive-pack' process on the +server, which will allow the client to tell it which references it should +update and then send all the data the server will need for those new +references to be complete. Once all the data is received and validated, +the server will then update its references to what the client specified. + +Authentication +-------------- + +The protocol itself contains no authentication mechanisms. That is to be +handled by the transport, such as SSH, before the 'receive-pack' process is +invoked. If 'receive-pack' is configured over the Git transport, those +repositories will be writable by anyone who can access that port (9418) as +that transport is unauthenticated. + +Reference Discovery +------------------- + +The reference discovery phase is done nearly the same way as it is in the +fetching protocol. Each reference obj-id and name on the server is sent +in packet-line format to the client, followed by a flush-pkt. The only +real difference is that the capability listing is different - the only +possible values are 'report-status', 'delete-refs', 'ofs-delta' and +'push-options'. + +Reference Update Request and Packfile Transfer +---------------------------------------------- + +Once the client knows what references the server is at, it can send a +list of reference update requests. For each reference on the server +that it wants to update, it sends a line listing the obj-id currently on +the server, the obj-id the client would like to update it to and the name +of the reference. + +This list is followed by a flush-pkt. Then the push options are transmitted +one per packet followed by another flush-pkt. After that the packfile that +should contain all the objects that the server will need to complete the new +references will be sent. + +---- + update-request = *shallow ( command-list | push-cert ) [packfile] + + shallow = PKT-LINE("shallow" SP obj-id) + + command-list = PKT-LINE(command NUL capability-list) + *PKT-LINE(command) + flush-pkt + + command = create / delete / update + create = zero-id SP new-id SP name + delete = old-id SP zero-id SP name + update = old-id SP new-id SP name + + old-id = obj-id + new-id = obj-id + + push-cert = PKT-LINE("push-cert" NUL capability-list LF) + PKT-LINE("certificate version 0.1" LF) + PKT-LINE("pusher" SP ident LF) + PKT-LINE("pushee" SP url LF) + PKT-LINE("nonce" SP nonce LF) + PKT-LINE(LF) + *PKT-LINE(command LF) + *PKT-LINE(gpg-signature-lines LF) + PKT-LINE("push-cert-end" LF) + + packfile = "PACK" 28*(OCTET) +---- + +If the receiving end does not support delete-refs, the sending end MUST +NOT ask for delete command. + +If the receiving end does not support push-cert, the sending end +MUST NOT send a push-cert command. When a push-cert command is +sent, command-list MUST NOT be sent; the commands recorded in the +push certificate is used instead. + +The packfile MUST NOT be sent if the only command used is 'delete'. + +A packfile MUST be sent if either create or update command is used, +even if the server already has all the necessary objects. In this +case the client MUST send an empty packfile. The only time this +is likely to happen is if the client is creating +a new branch or a tag that points to an existing obj-id. + +The server will receive the packfile, unpack it, then validate each +reference that is being updated that it hasn't changed while the request +was being processed (the obj-id is still the same as the old-id), and +it will run any update hooks to make sure that the update is acceptable. +If all of that is fine, the server will then update the references. + +Push Certificate +---------------- + +A push certificate begins with a set of header lines. After the +header and an empty line, the protocol commands follow, one per +line. Note that the trailing LF in push-cert PKT-LINEs is _not_ +optional; it must be present. + +Currently, the following header fields are defined: + +`pusher` ident:: + Identify the GPG key in "Human Readable Name " + format. + +`pushee` url:: + The repository URL (anonymized, if the URL contains + authentication material) the user who ran `git push` + intended to push into. + +`nonce` nonce:: + The 'nonce' string the receiving repository asked the + pushing user to include in the certificate, to prevent + replay attacks. + +The GPG signature lines are a detached signature for the contents +recorded in the push certificate before the signature block begins. +The detached signature is used to certify that the commands were +given by the pusher, who must be the signer. + +Report Status +------------- + +After receiving the pack data from the sender, the receiver sends a +report if 'report-status' capability is in effect. +It is a short listing of what happened in that update. It will first +list the status of the packfile unpacking as either 'unpack ok' or +'unpack [error]'. Then it will list the status for each of the references +that it tried to update. Each line is either 'ok [refname]' if the +update was successful, or 'ng [refname] [error]' if the update was not. + +---- + report-status = unpack-status + 1*(command-status) + flush-pkt + + unpack-status = PKT-LINE("unpack" SP unpack-result) + unpack-result = "ok" / error-msg + + command-status = command-ok / command-fail + command-ok = PKT-LINE("ok" SP refname) + command-fail = PKT-LINE("ng" SP refname SP error-msg) + + error-msg = 1*(OCTECT) ; where not "ok" +---- + +Updates can be unsuccessful for a number of reasons. The reference can have +changed since the reference discovery phase was originally sent, meaning +someone pushed in the meantime. The reference being pushed could be a +non-fast-forward reference and the update hooks or configuration could be +set to not allow that, etc. Also, some references can be updated while others +can be rejected. + +An example client/server communication might look like this: + +---- + S: 007c74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/local\0report-status delete-refs ofs-delta\n + S: 003e7d1665144a3a975c05f1f43902ddaf084e784dbe refs/heads/debug\n + S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/master\n + S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/team\n + S: 0000 + + C: 003e7d1665144a3a975c05f1f43902ddaf084e784dbe 74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/debug\n + C: 003e74730d410fcb6603ace96f1dc55ea6196122532d 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a refs/heads/master\n + C: 0000 + C: [PACKDATA] + + S: 000eunpack ok\n + S: 0018ok refs/heads/debug\n + S: 002ang refs/heads/master non-fast-forward\n +---- +*/ diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/report_status.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/report_status.go new file mode 100644 index 0000000000..e2a0a108b2 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/report_status.go @@ -0,0 +1,165 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +const ( + ok = "ok" +) + +// ReportStatus is a report status message, as used in the git-receive-pack +// process whenever the 'report-status' capability is negotiated. +type ReportStatus struct { + UnpackStatus string + CommandStatuses []*CommandStatus +} + +// NewReportStatus creates a new ReportStatus message. +func NewReportStatus() *ReportStatus { + return &ReportStatus{} +} + +// Error returns the first error if any. +func (s *ReportStatus) Error() error { + if s.UnpackStatus != ok { + return fmt.Errorf("unpack error: %s", s.UnpackStatus) + } + + for _, s := range s.CommandStatuses { + if err := s.Error(); err != nil { + return err + } + } + + return nil +} + +// Encode writes the report status to a writer. +func (s *ReportStatus) Encode(w io.Writer) error { + e := pktline.NewEncoder(w) + if err := e.Encodef("unpack %s\n", s.UnpackStatus); err != nil { + return err + } + + for _, cs := range s.CommandStatuses { + if err := cs.encode(w); err != nil { + return err + } + } + + return e.Flush() +} + +// Decode reads from the given reader and decodes a report-status message. It +// does not read more input than what is needed to fill the report status. +func (s *ReportStatus) Decode(r io.Reader) error { + scan := pktline.NewScanner(r) + if err := s.scanFirstLine(scan); err != nil { + return err + } + + if err := s.decodeReportStatus(scan.Bytes()); err != nil { + return err + } + + flushed := false + for scan.Scan() { + b := scan.Bytes() + if isFlush(b) { + flushed = true + break + } + + if err := s.decodeCommandStatus(b); err != nil { + return err + } + } + + if !flushed { + return fmt.Errorf("missing flush") + } + + return scan.Err() +} + +func (s *ReportStatus) scanFirstLine(scan *pktline.Scanner) error { + if scan.Scan() { + return nil + } + + if scan.Err() != nil { + return scan.Err() + } + + return io.ErrUnexpectedEOF +} + +func (s *ReportStatus) decodeReportStatus(b []byte) error { + if isFlush(b) { + return fmt.Errorf("premature flush") + } + + b = bytes.TrimSuffix(b, eol) + + line := string(b) + fields := strings.SplitN(line, " ", 2) + if len(fields) != 2 || fields[0] != "unpack" { + return fmt.Errorf("malformed unpack status: %s", line) + } + + s.UnpackStatus = fields[1] + return nil +} + +func (s *ReportStatus) decodeCommandStatus(b []byte) error { + b = bytes.TrimSuffix(b, eol) + + line := string(b) + fields := strings.SplitN(line, " ", 3) + status := ok + if len(fields) == 3 && fields[0] == "ng" { + status = fields[2] + } else if len(fields) != 2 || fields[0] != "ok" { + return fmt.Errorf("malformed command status: %s", line) + } + + cs := &CommandStatus{ + ReferenceName: plumbing.ReferenceName(fields[1]), + Status: status, + } + s.CommandStatuses = append(s.CommandStatuses, cs) + return nil +} + +// CommandStatus is the status of a reference in a report status. +// See ReportStatus struct. +type CommandStatus struct { + ReferenceName plumbing.ReferenceName + Status string +} + +// Error returns the error, if any. +func (s *CommandStatus) Error() error { + if s.Status == ok { + return nil + } + + return fmt.Errorf("command error on %s: %s", + s.ReferenceName.String(), s.Status) +} + +func (s *CommandStatus) encode(w io.Writer) error { + e := pktline.NewEncoder(w) + if s.Error() == nil { + return e.Encodef("ok %s\n", s.ReferenceName.String()) + } + + return e.Encodef("ng %s %s\n", s.ReferenceName.String(), s.Status) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/shallowupd.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/shallowupd.go new file mode 100644 index 0000000000..fe4fe68879 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/shallowupd.go @@ -0,0 +1,92 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +const ( + shallowLineLen = 48 + unshallowLineLen = 50 +) + +type ShallowUpdate struct { + Shallows []plumbing.Hash + Unshallows []plumbing.Hash +} + +func (r *ShallowUpdate) Decode(reader io.Reader) error { + s := pktline.NewScanner(reader) + + for s.Scan() { + line := s.Bytes() + line = bytes.TrimSpace(line) + + var err error + switch { + case bytes.HasPrefix(line, shallow): + err = r.decodeShallowLine(line) + case bytes.HasPrefix(line, unshallow): + err = r.decodeUnshallowLine(line) + case bytes.Equal(line, pktline.Flush): + return nil + } + + if err != nil { + return err + } + } + + return s.Err() +} + +func (r *ShallowUpdate) decodeShallowLine(line []byte) error { + hash, err := r.decodeLine(line, shallow, shallowLineLen) + if err != nil { + return err + } + + r.Shallows = append(r.Shallows, hash) + return nil +} + +func (r *ShallowUpdate) decodeUnshallowLine(line []byte) error { + hash, err := r.decodeLine(line, unshallow, unshallowLineLen) + if err != nil { + return err + } + + r.Unshallows = append(r.Unshallows, hash) + return nil +} + +func (r *ShallowUpdate) decodeLine(line, prefix []byte, expLen int) (plumbing.Hash, error) { + if len(line) != expLen { + return plumbing.ZeroHash, fmt.Errorf("malformed %s%q", prefix, line) + } + + raw := string(line[expLen-40 : expLen]) + return plumbing.NewHash(raw), nil +} + +func (r *ShallowUpdate) Encode(w io.Writer) error { + e := pktline.NewEncoder(w) + + for _, h := range r.Shallows { + if err := e.Encodef("%s%s\n", shallow, h.String()); err != nil { + return err + } + } + + for _, h := range r.Unshallows { + if err := e.Encodef("%s%s\n", unshallow, h.String()); err != nil { + return err + } + } + + return e.Flush() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/common.go new file mode 100644 index 0000000000..de5001281f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/common.go @@ -0,0 +1,33 @@ +package sideband + +// Type sideband type "side-band" or "side-band-64k" +type Type int8 + +const ( + // Sideband legacy sideband type up to 1000-byte messages + Sideband Type = iota + // Sideband64k sideband type up to 65519-byte messages + Sideband64k Type = iota + + // MaxPackedSize for Sideband type + MaxPackedSize = 1000 + // MaxPackedSize64k for Sideband64k type + MaxPackedSize64k = 65520 +) + +// Channel sideband channel +type Channel byte + +// WithPayload encode the payload as a message +func (ch Channel) WithPayload(payload []byte) []byte { + return append([]byte{byte(ch)}, payload...) +} + +const ( + // PackData packfile content + PackData Channel = 1 + // ProgressMessage progress messages + ProgressMessage Channel = 2 + // ErrorMessage fatal error message just before stream aborts + ErrorMessage Channel = 3 +) diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/demux.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/demux.go new file mode 100644 index 0000000000..0116f962ef --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/demux.go @@ -0,0 +1,148 @@ +package sideband + +import ( + "errors" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// ErrMaxPackedExceeded returned by Read, if the maximum packed size is exceeded +var ErrMaxPackedExceeded = errors.New("max. packed size exceeded") + +// Progress where the progress information is stored +type Progress interface { + io.Writer +} + +// Demuxer demultiplexes the progress reports and error info interleaved with the +// packfile itself. +// +// A sideband has three different channels the main one, called PackData, contains +// the packfile data; the ErrorMessage channel, that contains server errors; and +// the last one, ProgressMessage channel, containing information about the ongoing +// task happening in the server (optional, can be suppressed sending NoProgress +// or Quiet capabilities to the server) +// +// In order to demultiplex the data stream, method `Read` should be called to +// retrieve the PackData channel, the incoming data from the ProgressMessage is +// written at `Progress` (if any), if any message is retrieved from the +// ErrorMessage channel an error is returned and we can assume that the +// connection has been closed. +type Demuxer struct { + t Type + r io.Reader + s *pktline.Scanner + + max int + pending []byte + + // Progress is where the progress messages are stored + Progress Progress +} + +// NewDemuxer returns a new Demuxer for the given t and read from r +func NewDemuxer(t Type, r io.Reader) *Demuxer { + max := MaxPackedSize64k + if t == Sideband { + max = MaxPackedSize + } + + return &Demuxer{ + t: t, + r: r, + max: max, + s: pktline.NewScanner(r), + } +} + +// Read reads up to len(p) bytes from the PackData channel into p, an error can +// be return if an error happens when reading or if a message is sent in the +// ErrorMessage channel. +// +// When a ProgressMessage is read, is not copy to b, instead of this is written +// to the Progress +func (d *Demuxer) Read(b []byte) (n int, err error) { + var read, req int + + req = len(b) + for read < req { + n, err := d.doRead(b[read:req]) + read += n + + if err != nil { + return read, err + } + } + + return read, nil +} + +func (d *Demuxer) doRead(b []byte) (int, error) { + read, err := d.nextPackData() + size := len(read) + wanted := len(b) + + if size > wanted { + d.pending = read[wanted:] + } + + if wanted > size { + wanted = size + } + + size = copy(b, read[:wanted]) + return size, err +} + +func (d *Demuxer) nextPackData() ([]byte, error) { + content := d.getPending() + if len(content) != 0 { + return content, nil + } + + if !d.s.Scan() { + if err := d.s.Err(); err != nil { + return nil, err + } + + return nil, io.EOF + } + + content = d.s.Bytes() + + size := len(content) + if size == 0 { + return nil, nil + } else if size > d.max { + return nil, ErrMaxPackedExceeded + } + + switch Channel(content[0]) { + case PackData: + return content[1:], nil + case ProgressMessage: + if d.Progress != nil { + _, err := d.Progress.Write(content[1:]) + return nil, err + } + case ErrorMessage: + return nil, fmt.Errorf("unexpected error: %s", content[1:]) + default: + return nil, fmt.Errorf("unknown channel %s", content) + } + + return nil, nil +} + +func (d *Demuxer) getPending() (b []byte) { + if len(d.pending) == 0 { + return nil + } + + content := d.pending + d.pending = nil + + return content +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/doc.go new file mode 100644 index 0000000000..c5d2429529 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/doc.go @@ -0,0 +1,31 @@ +// Package sideband implements a sideband mutiplex/demultiplexer +package sideband + +// If 'side-band' or 'side-band-64k' capabilities have been specified by +// the client, the server will send the packfile data multiplexed. +// +// Either mode indicates that the packfile data will be streamed broken +// up into packets of up to either 1000 bytes in the case of 'side_band', +// or 65520 bytes in the case of 'side_band_64k'. Each packet is made up +// of a leading 4-byte pkt-line length of how much data is in the packet, +// followed by a 1-byte stream code, followed by the actual data. +// +// The stream code can be one of: +// +// 1 - pack data +// 2 - progress messages +// 3 - fatal error message just before stream aborts +// +// The "side-band-64k" capability came about as a way for newer clients +// that can handle much larger packets to request packets that are +// actually crammed nearly full, while maintaining backward compatibility +// for the older clients. +// +// Further, with side-band and its up to 1000-byte messages, it's actually +// 999 bytes of payload and 1 byte for the stream code. With side-band-64k, +// same deal, you have up to 65519 bytes of data and 1 byte for the stream +// code. +// +// The client MUST send only maximum of one of "side-band" and "side- +// band-64k". Server MUST diagnose it as an error if client requests +// both. diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/muxer.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/muxer.go new file mode 100644 index 0000000000..d51ac82695 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/muxer.go @@ -0,0 +1,65 @@ +package sideband + +import ( + "io" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// Muxer multiplex the packfile along with the progress messages and the error +// information. The multiplex is perform using pktline format. +type Muxer struct { + max int + e *pktline.Encoder +} + +const chLen = 1 + +// NewMuxer returns a new Muxer for the given t that writes on w. +// +// If t is equal to `Sideband` the max pack size is set to MaxPackedSize, in any +// other value is given, max pack is set to MaxPackedSize64k, that is the +// maximum length of a line in pktline format. +func NewMuxer(t Type, w io.Writer) *Muxer { + max := MaxPackedSize64k + if t == Sideband { + max = MaxPackedSize + } + + return &Muxer{ + max: max - chLen, + e: pktline.NewEncoder(w), + } +} + +// Write writes p in the PackData channel +func (m *Muxer) Write(p []byte) (int, error) { + return m.WriteChannel(PackData, p) +} + +// WriteChannel writes p in the given channel. This method can be used with any +// channel, but is recommend use it only for the ProgressMessage and +// ErrorMessage channels and use Write for the PackData channel +func (m *Muxer) WriteChannel(t Channel, p []byte) (int, error) { + wrote := 0 + size := len(p) + for wrote < size { + n, err := m.doWrite(t, p[wrote:]) + wrote += n + + if err != nil { + return wrote, err + } + } + + return wrote, nil +} + +func (m *Muxer) doWrite(ch Channel, p []byte) (int, error) { + sz := len(p) + if sz > m.max { + sz = m.max + } + + return sz, m.e.Encode(ch.WithPayload(p[:sz])) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/srvresp.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/srvresp.go new file mode 100644 index 0000000000..b3a7ee804c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/srvresp.go @@ -0,0 +1,127 @@ +package packp + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +const ackLineLen = 44 + +// ServerResponse object acknowledgement from upload-pack service +type ServerResponse struct { + ACKs []plumbing.Hash +} + +// Decode decodes the response into the struct, isMultiACK should be true, if +// the request was done with multi_ack or multi_ack_detailed capabilities. +func (r *ServerResponse) Decode(reader *bufio.Reader, isMultiACK bool) error { + // TODO: implement support for multi_ack or multi_ack_detailed responses + if isMultiACK { + return errors.New("multi_ack and multi_ack_detailed are not supported") + } + + s := pktline.NewScanner(reader) + + for s.Scan() { + line := s.Bytes() + + if err := r.decodeLine(line); err != nil { + return err + } + + // we need to detect when the end of a response header and the beginning + // of a packfile header happened, some requests to the git daemon + // produces a duplicate ACK header even when multi_ack is not supported. + stop, err := r.stopReading(reader) + if err != nil { + return err + } + + if stop { + break + } + } + + return s.Err() +} + +// stopReading detects when a valid command such as ACK or NAK is found to be +// read in the buffer without moving the read pointer. +func (r *ServerResponse) stopReading(reader *bufio.Reader) (bool, error) { + ahead, err := reader.Peek(7) + if err == io.EOF { + return true, nil + } + + if err != nil { + return false, err + } + + if len(ahead) > 4 && r.isValidCommand(ahead[0:3]) { + return false, nil + } + + if len(ahead) == 7 && r.isValidCommand(ahead[4:]) { + return false, nil + } + + return true, nil +} + +func (r *ServerResponse) isValidCommand(b []byte) bool { + commands := [][]byte{ack, nak} + for _, c := range commands { + if bytes.Equal(b, c) { + return true + } + } + + return false +} + +func (r *ServerResponse) decodeLine(line []byte) error { + if len(line) == 0 { + return fmt.Errorf("unexpected flush") + } + + if bytes.Equal(line[0:3], ack) { + return r.decodeACKLine(line) + } + + if bytes.Equal(line[0:3], nak) { + return nil + } + + return fmt.Errorf("unexpected content %q", string(line)) +} + +func (r *ServerResponse) decodeACKLine(line []byte) error { + if len(line) < ackLineLen { + return fmt.Errorf("malformed ACK %q", line) + } + + sp := bytes.Index(line, []byte(" ")) + h := plumbing.NewHash(string(line[sp+1 : sp+41])) + r.ACKs = append(r.ACKs, h) + return nil +} + +// Encode encodes the ServerResponse into a writer. +func (r *ServerResponse) Encode(w io.Writer) error { + if len(r.ACKs) > 1 { + return errors.New("multi_ack and multi_ack_detailed are not supported") + } + + e := pktline.NewEncoder(w) + if len(r.ACKs) == 0 { + return e.Encodef("%s\n", nak) + } + + return e.Encodef("%s %s\n", ack, r.ACKs[0].String()) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq.go new file mode 100644 index 0000000000..ddec06e996 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq.go @@ -0,0 +1,168 @@ +package packp + +import ( + "fmt" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +// UploadRequest values represent the information transmitted on a +// upload-request message. Values from this type are not zero-value +// safe, use the New function instead. +// This is a low level type, use UploadPackRequest instead. +type UploadRequest struct { + Capabilities *capability.List + Wants []plumbing.Hash + Shallows []plumbing.Hash + Depth Depth +} + +// Depth values stores the desired depth of the requested packfile: see +// DepthCommit, DepthSince and DepthReference. +type Depth interface { + isDepth() + IsZero() bool +} + +// DepthCommits values stores the maximum number of requested commits in +// the packfile. Zero means infinite. A negative value will have +// undefined consequences. +type DepthCommits int + +func (d DepthCommits) isDepth() {} + +func (d DepthCommits) IsZero() bool { + return d == 0 +} + +// DepthSince values requests only commits newer than the specified time. +type DepthSince time.Time + +func (d DepthSince) isDepth() {} + +func (d DepthSince) IsZero() bool { + return time.Time(d).IsZero() +} + +// DepthReference requests only commits not to found in the specified reference. +type DepthReference string + +func (d DepthReference) isDepth() {} + +func (d DepthReference) IsZero() bool { + return string(d) == "" +} + +// NewUploadRequest returns a pointer to a new UploadRequest value, ready to be +// used. It has no capabilities, wants or shallows and an infinite depth. Please +// note that to encode an upload-request it has to have at least one wanted hash. +func NewUploadRequest() *UploadRequest { + return &UploadRequest{ + Capabilities: capability.NewList(), + Wants: []plumbing.Hash{}, + Shallows: []plumbing.Hash{}, + Depth: DepthCommits(0), + } +} + +// NewUploadRequestFromCapabilities returns a pointer to a new UploadRequest +// value, the request capabilities are filled with the most optimal ones, based +// on the adv value (advertised capabilities), the UploadRequest generated it +// has no wants or shallows and an infinite depth. +func NewUploadRequestFromCapabilities(adv *capability.List) *UploadRequest { + r := NewUploadRequest() + + if adv.Supports(capability.MultiACKDetailed) { + r.Capabilities.Set(capability.MultiACKDetailed) + } else if adv.Supports(capability.MultiACK) { + r.Capabilities.Set(capability.MultiACK) + } + + if adv.Supports(capability.Sideband64k) { + r.Capabilities.Set(capability.Sideband64k) + } else if adv.Supports(capability.Sideband) { + r.Capabilities.Set(capability.Sideband) + } + + if adv.Supports(capability.ThinPack) { + r.Capabilities.Set(capability.ThinPack) + } + + if adv.Supports(capability.OFSDelta) { + r.Capabilities.Set(capability.OFSDelta) + } + + if adv.Supports(capability.Agent) { + r.Capabilities.Set(capability.Agent, capability.DefaultAgent) + } + + return r +} + +// Validate validates the content of UploadRequest, following the next rules: +// - Wants MUST have at least one reference +// - capability.Shallow MUST be present if Shallows is not empty +// - is a non-zero DepthCommits is given capability.Shallow MUST be present +// - is a DepthSince is given capability.Shallow MUST be present +// - is a DepthReference is given capability.DeepenNot MUST be present +// - MUST contain only maximum of one of capability.Sideband and capability.Sideband64k +// - MUST contain only maximum of one of capability.MultiACK and capability.MultiACKDetailed +func (req *UploadRequest) Validate() error { + if len(req.Wants) == 0 { + return fmt.Errorf("want can't be empty") + } + + if err := req.validateRequiredCapabilities(); err != nil { + return err + } + + if err := req.validateConflictCapabilities(); err != nil { + return err + } + + return nil +} + +func (req *UploadRequest) validateRequiredCapabilities() error { + msg := "missing capability %s" + + if len(req.Shallows) != 0 && !req.Capabilities.Supports(capability.Shallow) { + return fmt.Errorf(msg, capability.Shallow) + } + + switch req.Depth.(type) { + case DepthCommits: + if req.Depth != DepthCommits(0) { + if !req.Capabilities.Supports(capability.Shallow) { + return fmt.Errorf(msg, capability.Shallow) + } + } + case DepthSince: + if !req.Capabilities.Supports(capability.DeepenSince) { + return fmt.Errorf(msg, capability.DeepenSince) + } + case DepthReference: + if !req.Capabilities.Supports(capability.DeepenNot) { + return fmt.Errorf(msg, capability.DeepenNot) + } + } + + return nil +} + +func (req *UploadRequest) validateConflictCapabilities() error { + msg := "capabilities %s and %s are mutually exclusive" + if req.Capabilities.Supports(capability.Sideband) && + req.Capabilities.Supports(capability.Sideband64k) { + return fmt.Errorf(msg, capability.Sideband, capability.Sideband64k) + } + + if req.Capabilities.Supports(capability.MultiACK) && + req.Capabilities.Supports(capability.MultiACKDetailed) { + return fmt.Errorf(msg, capability.MultiACK, capability.MultiACKDetailed) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_decode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_decode.go new file mode 100644 index 0000000000..895a3bf6dd --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_decode.go @@ -0,0 +1,257 @@ +package packp + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "strconv" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// Decode reads the next upload-request form its input and +// stores it in the UploadRequest. +func (req *UploadRequest) Decode(r io.Reader) error { + d := newUlReqDecoder(r) + return d.Decode(req) +} + +type ulReqDecoder struct { + s *pktline.Scanner // a pkt-line scanner from the input stream + line []byte // current pkt-line contents, use parser.nextLine() to make it advance + nLine int // current pkt-line number for debugging, begins at 1 + err error // sticky error, use the parser.error() method to fill this out + data *UploadRequest // parsed data is stored here +} + +func newUlReqDecoder(r io.Reader) *ulReqDecoder { + return &ulReqDecoder{ + s: pktline.NewScanner(r), + } +} + +func (d *ulReqDecoder) Decode(v *UploadRequest) error { + d.data = v + + for state := d.decodeFirstWant; state != nil; { + state = state() + } + + return d.err +} + +// fills out the parser stiky error +func (d *ulReqDecoder) error(format string, a ...interface{}) { + msg := fmt.Sprintf( + "pkt-line %d: %s", d.nLine, + fmt.Sprintf(format, a...), + ) + + d.err = NewErrUnexpectedData(msg, d.line) +} + +// Reads a new pkt-line from the scanner, makes its payload available as +// p.line and increments p.nLine. A successful invocation returns true, +// otherwise, false is returned and the sticky error is filled out +// accordingly. Trims eols at the end of the payloads. +func (d *ulReqDecoder) nextLine() bool { + d.nLine++ + + if !d.s.Scan() { + if d.err = d.s.Err(); d.err != nil { + return false + } + + d.error("EOF") + return false + } + + d.line = d.s.Bytes() + d.line = bytes.TrimSuffix(d.line, eol) + + return true +} + +// Expected format: want [ capabilities] +func (d *ulReqDecoder) decodeFirstWant() stateFn { + if ok := d.nextLine(); !ok { + return nil + } + + if !bytes.HasPrefix(d.line, want) { + d.error("missing 'want ' prefix") + return nil + } + d.line = bytes.TrimPrefix(d.line, want) + + hash, ok := d.readHash() + if !ok { + return nil + } + d.data.Wants = append(d.data.Wants, hash) + + return d.decodeCaps +} + +func (d *ulReqDecoder) readHash() (plumbing.Hash, bool) { + if len(d.line) < hashSize { + d.err = fmt.Errorf("malformed hash: %v", d.line) + return plumbing.ZeroHash, false + } + + var hash plumbing.Hash + if _, err := hex.Decode(hash[:], d.line[:hashSize]); err != nil { + d.error("invalid hash text: %s", err) + return plumbing.ZeroHash, false + } + d.line = d.line[hashSize:] + + return hash, true +} + +// Expected format: sp cap1 sp cap2 sp cap3... +func (d *ulReqDecoder) decodeCaps() stateFn { + d.line = bytes.TrimPrefix(d.line, sp) + if err := d.data.Capabilities.Decode(d.line); err != nil { + d.error("invalid capabilities: %s", err) + } + + return d.decodeOtherWants +} + +// Expected format: want +func (d *ulReqDecoder) decodeOtherWants() stateFn { + if ok := d.nextLine(); !ok { + return nil + } + + if bytes.HasPrefix(d.line, shallow) { + return d.decodeShallow + } + + if bytes.HasPrefix(d.line, deepen) { + return d.decodeDeepen + } + + if len(d.line) == 0 { + return nil + } + + if !bytes.HasPrefix(d.line, want) { + d.error("unexpected payload while expecting a want: %q", d.line) + return nil + } + d.line = bytes.TrimPrefix(d.line, want) + + hash, ok := d.readHash() + if !ok { + return nil + } + d.data.Wants = append(d.data.Wants, hash) + + return d.decodeOtherWants +} + +// Expected format: shallow +func (d *ulReqDecoder) decodeShallow() stateFn { + if bytes.HasPrefix(d.line, deepen) { + return d.decodeDeepen + } + + if len(d.line) == 0 { + return nil + } + + if !bytes.HasPrefix(d.line, shallow) { + d.error("unexpected payload while expecting a shallow: %q", d.line) + return nil + } + d.line = bytes.TrimPrefix(d.line, shallow) + + hash, ok := d.readHash() + if !ok { + return nil + } + d.data.Shallows = append(d.data.Shallows, hash) + + if ok := d.nextLine(); !ok { + return nil + } + + return d.decodeShallow +} + +// Expected format: deepen / deepen-since
    / deepen-not +func (d *ulReqDecoder) decodeDeepen() stateFn { + if bytes.HasPrefix(d.line, deepenCommits) { + return d.decodeDeepenCommits + } + + if bytes.HasPrefix(d.line, deepenSince) { + return d.decodeDeepenSince + } + + if bytes.HasPrefix(d.line, deepenReference) { + return d.decodeDeepenReference + } + + if len(d.line) == 0 { + return nil + } + + d.error("unexpected deepen specification: %q", d.line) + return nil +} + +func (d *ulReqDecoder) decodeDeepenCommits() stateFn { + d.line = bytes.TrimPrefix(d.line, deepenCommits) + + var n int + if n, d.err = strconv.Atoi(string(d.line)); d.err != nil { + return nil + } + if n < 0 { + d.err = fmt.Errorf("negative depth") + return nil + } + d.data.Depth = DepthCommits(n) + + return d.decodeFlush +} + +func (d *ulReqDecoder) decodeDeepenSince() stateFn { + d.line = bytes.TrimPrefix(d.line, deepenSince) + + var secs int64 + secs, d.err = strconv.ParseInt(string(d.line), 10, 64) + if d.err != nil { + return nil + } + t := time.Unix(secs, 0).UTC() + d.data.Depth = DepthSince(t) + + return d.decodeFlush +} + +func (d *ulReqDecoder) decodeDeepenReference() stateFn { + d.line = bytes.TrimPrefix(d.line, deepenReference) + + d.data.Depth = DepthReference(string(d.line)) + + return d.decodeFlush +} + +func (d *ulReqDecoder) decodeFlush() stateFn { + if ok := d.nextLine(); !ok { + return nil + } + + if len(d.line) != 0 { + d.err = fmt.Errorf("unexpected payload while expecting a flush-pkt: %q", d.line) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_encode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_encode.go new file mode 100644 index 0000000000..c451e23164 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_encode.go @@ -0,0 +1,145 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +// Encode writes the UlReq encoding of u to the stream. +// +// All the payloads will end with a newline character. Wants and +// shallows are sorted alphabetically. A depth of 0 means no depth +// request is sent. +func (req *UploadRequest) Encode(w io.Writer) error { + e := newUlReqEncoder(w) + return e.Encode(req) +} + +type ulReqEncoder struct { + pe *pktline.Encoder // where to write the encoded data + data *UploadRequest // the data to encode + err error // sticky error +} + +func newUlReqEncoder(w io.Writer) *ulReqEncoder { + return &ulReqEncoder{ + pe: pktline.NewEncoder(w), + } +} + +func (e *ulReqEncoder) Encode(v *UploadRequest) error { + e.data = v + + if len(v.Wants) == 0 { + return fmt.Errorf("empty wants provided") + } + + plumbing.HashesSort(e.data.Wants) + for state := e.encodeFirstWant; state != nil; { + state = state() + } + + return e.err +} + +func (e *ulReqEncoder) encodeFirstWant() stateFn { + var err error + if e.data.Capabilities.IsEmpty() { + err = e.pe.Encodef("want %s\n", e.data.Wants[0]) + } else { + err = e.pe.Encodef( + "want %s %s\n", + e.data.Wants[0], + e.data.Capabilities.String(), + ) + } + + if err != nil { + e.err = fmt.Errorf("encoding first want line: %s", err) + return nil + } + + return e.encodeAdditionalWants +} + +func (e *ulReqEncoder) encodeAdditionalWants() stateFn { + last := e.data.Wants[0] + for _, w := range e.data.Wants[1:] { + if bytes.Equal(last[:], w[:]) { + continue + } + + if err := e.pe.Encodef("want %s\n", w); err != nil { + e.err = fmt.Errorf("encoding want %q: %s", w, err) + return nil + } + + last = w + } + + return e.encodeShallows +} + +func (e *ulReqEncoder) encodeShallows() stateFn { + plumbing.HashesSort(e.data.Shallows) + + var last plumbing.Hash + for _, s := range e.data.Shallows { + if bytes.Equal(last[:], s[:]) { + continue + } + + if err := e.pe.Encodef("shallow %s\n", s); err != nil { + e.err = fmt.Errorf("encoding shallow %q: %s", s, err) + return nil + } + + last = s + } + + return e.encodeDepth +} + +func (e *ulReqEncoder) encodeDepth() stateFn { + switch depth := e.data.Depth.(type) { + case DepthCommits: + if depth != 0 { + commits := int(depth) + if err := e.pe.Encodef("deepen %d\n", commits); err != nil { + e.err = fmt.Errorf("encoding depth %d: %s", depth, err) + return nil + } + } + case DepthSince: + when := time.Time(depth).UTC() + if err := e.pe.Encodef("deepen-since %d\n", when.Unix()); err != nil { + e.err = fmt.Errorf("encoding depth %s: %s", when, err) + return nil + } + case DepthReference: + reference := string(depth) + if err := e.pe.Encodef("deepen-not %s\n", reference); err != nil { + e.err = fmt.Errorf("encoding depth %s: %s", reference, err) + return nil + } + default: + e.err = fmt.Errorf("unsupported depth type") + return nil + } + + return e.encodeFlush +} + +func (e *ulReqEncoder) encodeFlush() stateFn { + if err := e.pe.Flush(); err != nil { + e.err = fmt.Errorf("encoding flush-pkt: %s", err) + return nil + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq.go new file mode 100644 index 0000000000..4d927d8b8e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq.go @@ -0,0 +1,122 @@ +package packp + +import ( + "errors" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" +) + +var ( + ErrEmptyCommands = errors.New("commands cannot be empty") + ErrMalformedCommand = errors.New("malformed command") +) + +// ReferenceUpdateRequest values represent reference upload requests. +// Values from this type are not zero-value safe, use the New function instead. +type ReferenceUpdateRequest struct { + Capabilities *capability.List + Commands []*Command + Shallow *plumbing.Hash + // Packfile contains an optional packfile reader. + Packfile io.ReadCloser + + // Progress receives sideband progress messages from the server + Progress sideband.Progress +} + +// New returns a pointer to a new ReferenceUpdateRequest value. +func NewReferenceUpdateRequest() *ReferenceUpdateRequest { + return &ReferenceUpdateRequest{ + // TODO: Add support for push-cert + Capabilities: capability.NewList(), + Commands: nil, + } +} + +// NewReferenceUpdateRequestFromCapabilities returns a pointer to a new +// ReferenceUpdateRequest value, the request capabilities are filled with the +// most optimal ones, based on the adv value (advertised capabilities), the +// ReferenceUpdateRequest contains no commands +// +// It does set the following capabilities: +// - agent +// - report-status +// - ofs-delta +// - ref-delta +// - delete-refs +// It leaves up to the user to add the following capabilities later: +// - atomic +// - ofs-delta +// - side-band +// - side-band-64k +// - quiet +// - push-cert +func NewReferenceUpdateRequestFromCapabilities(adv *capability.List) *ReferenceUpdateRequest { + r := NewReferenceUpdateRequest() + + if adv.Supports(capability.Agent) { + r.Capabilities.Set(capability.Agent, capability.DefaultAgent) + } + + if adv.Supports(capability.ReportStatus) { + r.Capabilities.Set(capability.ReportStatus) + } + + return r +} + +func (req *ReferenceUpdateRequest) validate() error { + if len(req.Commands) == 0 { + return ErrEmptyCommands + } + + for _, c := range req.Commands { + if err := c.validate(); err != nil { + return err + } + } + + return nil +} + +type Action string + +const ( + Create Action = "create" + Update = "update" + Delete = "delete" + Invalid = "invalid" +) + +type Command struct { + Name plumbing.ReferenceName + Old plumbing.Hash + New plumbing.Hash +} + +func (c *Command) Action() Action { + if c.Old == plumbing.ZeroHash && c.New == plumbing.ZeroHash { + return Invalid + } + + if c.Old == plumbing.ZeroHash { + return Create + } + + if c.New == plumbing.ZeroHash { + return Delete + } + + return Update +} + +func (c *Command) validate() error { + if c.Action() == Invalid { + return ErrMalformedCommand + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go new file mode 100644 index 0000000000..2c9843a566 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go @@ -0,0 +1,250 @@ +package packp + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" +) + +var ( + shallowLineLength = len(shallow) + hashSize + minCommandLength = hashSize*2 + 2 + 1 + minCommandAndCapsLength = minCommandLength + 1 +) + +var ( + ErrEmpty = errors.New("empty update-request message") + errNoCommands = errors.New("unexpected EOF before any command") + errMissingCapabilitiesDelimiter = errors.New("capabilities delimiter not found") +) + +func errMalformedRequest(reason string) error { + return fmt.Errorf("malformed request: %s", reason) +} + +func errInvalidHashSize(got int) error { + return fmt.Errorf("invalid hash size: expected %d, got %d", + hashSize, got) +} + +func errInvalidHash(err error) error { + return fmt.Errorf("invalid hash: %s", err.Error()) +} + +func errInvalidShallowLineLength(got int) error { + return errMalformedRequest(fmt.Sprintf( + "invalid shallow line length: expected %d, got %d", + shallowLineLength, got)) +} + +func errInvalidCommandCapabilitiesLineLength(got int) error { + return errMalformedRequest(fmt.Sprintf( + "invalid command and capabilities line length: expected at least %d, got %d", + minCommandAndCapsLength, got)) +} + +func errInvalidCommandLineLength(got int) error { + return errMalformedRequest(fmt.Sprintf( + "invalid command line length: expected at least %d, got %d", + minCommandLength, got)) +} + +func errInvalidShallowObjId(err error) error { + return errMalformedRequest( + fmt.Sprintf("invalid shallow object id: %s", err.Error())) +} + +func errInvalidOldObjId(err error) error { + return errMalformedRequest( + fmt.Sprintf("invalid old object id: %s", err.Error())) +} + +func errInvalidNewObjId(err error) error { + return errMalformedRequest( + fmt.Sprintf("invalid new object id: %s", err.Error())) +} + +func errMalformedCommand(err error) error { + return errMalformedRequest(fmt.Sprintf( + "malformed command: %s", err.Error())) +} + +// Decode reads the next update-request message form the reader and wr +func (req *ReferenceUpdateRequest) Decode(r io.Reader) error { + var rc io.ReadCloser + var ok bool + rc, ok = r.(io.ReadCloser) + if !ok { + rc = ioutil.NopCloser(r) + } + + d := &updReqDecoder{r: rc, s: pktline.NewScanner(r)} + return d.Decode(req) +} + +type updReqDecoder struct { + r io.ReadCloser + s *pktline.Scanner + req *ReferenceUpdateRequest +} + +func (d *updReqDecoder) Decode(req *ReferenceUpdateRequest) error { + d.req = req + funcs := []func() error{ + d.scanLine, + d.decodeShallow, + d.decodeCommandAndCapabilities, + d.decodeCommands, + d.setPackfile, + req.validate, + } + + for _, f := range funcs { + if err := f(); err != nil { + return err + } + } + + return nil +} + +func (d *updReqDecoder) scanLine() error { + if ok := d.s.Scan(); !ok { + return d.scanErrorOr(ErrEmpty) + } + + return nil +} + +func (d *updReqDecoder) decodeShallow() error { + b := d.s.Bytes() + + if !bytes.HasPrefix(b, shallowNoSp) { + return nil + } + + if len(b) != shallowLineLength { + return errInvalidShallowLineLength(len(b)) + } + + h, err := parseHash(string(b[len(shallow):])) + if err != nil { + return errInvalidShallowObjId(err) + } + + if ok := d.s.Scan(); !ok { + return d.scanErrorOr(errNoCommands) + } + + d.req.Shallow = &h + + return nil +} + +func (d *updReqDecoder) decodeCommands() error { + for { + b := d.s.Bytes() + if bytes.Equal(b, pktline.Flush) { + return nil + } + + c, err := parseCommand(b) + if err != nil { + return err + } + + d.req.Commands = append(d.req.Commands, c) + + if ok := d.s.Scan(); !ok { + return d.s.Err() + } + } +} + +func (d *updReqDecoder) decodeCommandAndCapabilities() error { + b := d.s.Bytes() + i := bytes.IndexByte(b, 0) + if i == -1 { + return errMissingCapabilitiesDelimiter + } + + if len(b) < minCommandAndCapsLength { + return errInvalidCommandCapabilitiesLineLength(len(b)) + } + + cmd, err := parseCommand(b[:i]) + if err != nil { + return err + } + + d.req.Commands = append(d.req.Commands, cmd) + + if err := d.req.Capabilities.Decode(b[i+1:]); err != nil { + return err + } + + if err := d.scanLine(); err != nil { + return err + } + + return nil +} + +func (d *updReqDecoder) setPackfile() error { + d.req.Packfile = d.r + + return nil +} + +func parseCommand(b []byte) (*Command, error) { + if len(b) < minCommandLength { + return nil, errInvalidCommandLineLength(len(b)) + } + + var ( + os, ns string + n plumbing.ReferenceName + ) + if _, err := fmt.Sscanf(string(b), "%s %s %s", &os, &ns, &n); err != nil { + return nil, errMalformedCommand(err) + } + + oh, err := parseHash(os) + if err != nil { + return nil, errInvalidOldObjId(err) + } + + nh, err := parseHash(ns) + if err != nil { + return nil, errInvalidNewObjId(err) + } + + return &Command{Old: oh, New: nh, Name: n}, nil +} + +func parseHash(s string) (plumbing.Hash, error) { + if len(s) != hashSize { + return plumbing.ZeroHash, errInvalidHashSize(len(s)) + } + + if _, err := hex.DecodeString(s); err != nil { + return plumbing.ZeroHash, errInvalidHash(err) + } + + h := plumbing.NewHash(s) + return h, nil +} + +func (d *updReqDecoder) scanErrorOr(origErr error) error { + if err := d.s.Err(); err != nil { + return err + } + + return origErr +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_encode.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_encode.go new file mode 100644 index 0000000000..2545e935e6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_encode.go @@ -0,0 +1,75 @@ +package packp + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +var ( + zeroHashString = plumbing.ZeroHash.String() +) + +// Encode writes the ReferenceUpdateRequest encoding to the stream. +func (req *ReferenceUpdateRequest) Encode(w io.Writer) error { + if err := req.validate(); err != nil { + return err + } + + e := pktline.NewEncoder(w) + + if err := req.encodeShallow(e, req.Shallow); err != nil { + return err + } + + if err := req.encodeCommands(e, req.Commands, req.Capabilities); err != nil { + return err + } + + if req.Packfile != nil { + if _, err := io.Copy(w, req.Packfile); err != nil { + return err + } + + return req.Packfile.Close() + } + + return nil +} + +func (req *ReferenceUpdateRequest) encodeShallow(e *pktline.Encoder, + h *plumbing.Hash) error { + + if h == nil { + return nil + } + + objId := []byte(h.String()) + return e.Encodef("%s%s", shallow, objId) +} + +func (req *ReferenceUpdateRequest) encodeCommands(e *pktline.Encoder, + cmds []*Command, cap *capability.List) error { + + if err := e.Encodef("%s\x00%s", + formatCommand(cmds[0]), cap.String()); err != nil { + return err + } + + for _, cmd := range cmds[1:] { + if err := e.Encodef(formatCommand(cmd)); err != nil { + return err + } + } + + return e.Flush() +} + +func formatCommand(cmd *Command) string { + o := cmd.Old.String() + n := cmd.New.String() + return fmt.Sprintf("%s %s %s", o, n, cmd.Name) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackreq.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackreq.go new file mode 100644 index 0000000000..de2206b3fc --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackreq.go @@ -0,0 +1,98 @@ +package packp + +import ( + "bytes" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +// UploadPackRequest represents a upload-pack request. +// Zero-value is not safe, use NewUploadPackRequest instead. +type UploadPackRequest struct { + UploadRequest + UploadHaves +} + +// NewUploadPackRequest creates a new UploadPackRequest and returns a pointer. +func NewUploadPackRequest() *UploadPackRequest { + ur := NewUploadRequest() + return &UploadPackRequest{ + UploadHaves: UploadHaves{}, + UploadRequest: *ur, + } +} + +// NewUploadPackRequestFromCapabilities creates a new UploadPackRequest and +// returns a pointer. The request capabilities are filled with the most optimal +// ones, based on the adv value (advertised capabilities), the UploadPackRequest +// it has no wants, haves or shallows and an infinite depth +func NewUploadPackRequestFromCapabilities(adv *capability.List) *UploadPackRequest { + ur := NewUploadRequestFromCapabilities(adv) + return &UploadPackRequest{ + UploadHaves: UploadHaves{}, + UploadRequest: *ur, + } +} + +// IsEmpty a request if empty if Haves are contained in the Wants, or if Wants +// length is zero +func (r *UploadPackRequest) IsEmpty() bool { + return isSubset(r.Wants, r.Haves) +} + +func isSubset(needle []plumbing.Hash, haystack []plumbing.Hash) bool { + for _, h := range needle { + found := false + for _, oh := range haystack { + if h == oh { + found = true + break + } + } + + if !found { + return false + } + } + + return true +} + +// UploadHaves is a message to signal the references that a client has in a +// upload-pack. Do not use this directly. Use UploadPackRequest request instead. +type UploadHaves struct { + Haves []plumbing.Hash +} + +// Encode encodes the UploadHaves into the Writer. If flush is true, a flush +// command will be encoded at the end of the writer content. +func (u *UploadHaves) Encode(w io.Writer, flush bool) error { + e := pktline.NewEncoder(w) + + plumbing.HashesSort(u.Haves) + + var last plumbing.Hash + for _, have := range u.Haves { + if bytes.Equal(last[:], have[:]) { + continue + } + + if err := e.Encodef("have %s\n", have); err != nil { + return fmt.Errorf("sending haves for %q: %s", have, err) + } + + last = have + } + + if flush && len(u.Haves) != 0 { + if err := e.Flush(); err != nil { + return fmt.Errorf("sending flush-pkt after haves: %s", err) + } + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackresp.go b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackresp.go new file mode 100644 index 0000000000..a9a7192ea5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackresp.go @@ -0,0 +1,109 @@ +package packp + +import ( + "errors" + "io" + + "bufio" + + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// ErrUploadPackResponseNotDecoded is returned if Read is called without +// decoding first +var ErrUploadPackResponseNotDecoded = errors.New("upload-pack-response should be decoded") + +// UploadPackResponse contains all the information responded by the upload-pack +// service, the response implements io.ReadCloser that allows to read the +// packfile directly from it. +type UploadPackResponse struct { + ShallowUpdate + ServerResponse + + r io.ReadCloser + isShallow bool + isMultiACK bool + isOk bool +} + +// NewUploadPackResponse create a new UploadPackResponse instance, the request +// being responded by the response is required. +func NewUploadPackResponse(req *UploadPackRequest) *UploadPackResponse { + isShallow := !req.Depth.IsZero() + isMultiACK := req.Capabilities.Supports(capability.MultiACK) || + req.Capabilities.Supports(capability.MultiACKDetailed) + + return &UploadPackResponse{ + isShallow: isShallow, + isMultiACK: isMultiACK, + } +} + +// NewUploadPackResponseWithPackfile creates a new UploadPackResponse instance, +// and sets its packfile reader. +func NewUploadPackResponseWithPackfile(req *UploadPackRequest, + pf io.ReadCloser) *UploadPackResponse { + + r := NewUploadPackResponse(req) + r.r = pf + return r +} + +// Decode decodes all the responses sent by upload-pack service into the struct +// and prepares it to read the packfile using the Read method +func (r *UploadPackResponse) Decode(reader io.ReadCloser) error { + buf := bufio.NewReader(reader) + + if r.isShallow { + if err := r.ShallowUpdate.Decode(buf); err != nil { + return err + } + } + + if err := r.ServerResponse.Decode(buf, r.isMultiACK); err != nil { + return err + } + + // now the reader is ready to read the packfile content + r.r = ioutil.NewReadCloser(buf, reader) + + return nil +} + +// Encode encodes an UploadPackResponse. +func (r *UploadPackResponse) Encode(w io.Writer) (err error) { + if r.isShallow { + if err := r.ShallowUpdate.Encode(w); err != nil { + return err + } + } + + if err := r.ServerResponse.Encode(w); err != nil { + return err + } + + defer ioutil.CheckClose(r.r, &err) + _, err = io.Copy(w, r.r) + return err +} + +// Read reads the packfile data, if the request was done with any Sideband +// capability the content read should be demultiplexed. If the methods wasn't +// called before the ErrUploadPackResponseNotDecoded will be return +func (r *UploadPackResponse) Read(p []byte) (int, error) { + if r.r == nil { + return 0, ErrUploadPackResponseNotDecoded + } + + return r.r.Read(p) +} + +// Close the underlying reader, if any +func (r *UploadPackResponse) Close() error { + if r.r == nil { + return nil + } + + return r.r.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/reference.go b/vendor/github.com/go-git/go-git/v5/plumbing/reference.go new file mode 100644 index 0000000000..08e908f1f3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/reference.go @@ -0,0 +1,209 @@ +package plumbing + +import ( + "errors" + "fmt" + "strings" +) + +const ( + refPrefix = "refs/" + refHeadPrefix = refPrefix + "heads/" + refTagPrefix = refPrefix + "tags/" + refRemotePrefix = refPrefix + "remotes/" + refNotePrefix = refPrefix + "notes/" + symrefPrefix = "ref: " +) + +// RefRevParseRules are a set of rules to parse references into short names. +// These are the same rules as used by git in shorten_unambiguous_ref. +// See: https://github.com/git/git/blob/e0aaa1b6532cfce93d87af9bc813fb2e7a7ce9d7/refs.c#L417 +var RefRevParseRules = []string{ + "refs/%s", + "refs/tags/%s", + "refs/heads/%s", + "refs/remotes/%s", + "refs/remotes/%s/HEAD", +} + +var ( + ErrReferenceNotFound = errors.New("reference not found") +) + +// ReferenceType reference type's +type ReferenceType int8 + +const ( + InvalidReference ReferenceType = 0 + HashReference ReferenceType = 1 + SymbolicReference ReferenceType = 2 +) + +func (r ReferenceType) String() string { + switch r { + case InvalidReference: + return "invalid-reference" + case HashReference: + return "hash-reference" + case SymbolicReference: + return "symbolic-reference" + } + + return "" +} + +// ReferenceName reference name's +type ReferenceName string + +// NewBranchReferenceName returns a reference name describing a branch based on +// his short name. +func NewBranchReferenceName(name string) ReferenceName { + return ReferenceName(refHeadPrefix + name) +} + +// NewNoteReferenceName returns a reference name describing a note based on his +// short name. +func NewNoteReferenceName(name string) ReferenceName { + return ReferenceName(refNotePrefix + name) +} + +// NewRemoteReferenceName returns a reference name describing a remote branch +// based on his short name and the remote name. +func NewRemoteReferenceName(remote, name string) ReferenceName { + return ReferenceName(refRemotePrefix + fmt.Sprintf("%s/%s", remote, name)) +} + +// NewRemoteHEADReferenceName returns a reference name describing a the HEAD +// branch of a remote. +func NewRemoteHEADReferenceName(remote string) ReferenceName { + return ReferenceName(refRemotePrefix + fmt.Sprintf("%s/%s", remote, HEAD)) +} + +// NewTagReferenceName returns a reference name describing a tag based on short +// his name. +func NewTagReferenceName(name string) ReferenceName { + return ReferenceName(refTagPrefix + name) +} + +// IsBranch check if a reference is a branch +func (r ReferenceName) IsBranch() bool { + return strings.HasPrefix(string(r), refHeadPrefix) +} + +// IsNote check if a reference is a note +func (r ReferenceName) IsNote() bool { + return strings.HasPrefix(string(r), refNotePrefix) +} + +// IsRemote check if a reference is a remote +func (r ReferenceName) IsRemote() bool { + return strings.HasPrefix(string(r), refRemotePrefix) +} + +// IsTag check if a reference is a tag +func (r ReferenceName) IsTag() bool { + return strings.HasPrefix(string(r), refTagPrefix) +} + +func (r ReferenceName) String() string { + return string(r) +} + +// Short returns the short name of a ReferenceName +func (r ReferenceName) Short() string { + s := string(r) + res := s + for _, format := range RefRevParseRules { + _, err := fmt.Sscanf(s, format, &res) + if err == nil { + continue + } + } + + return res +} + +const ( + HEAD ReferenceName = "HEAD" + Master ReferenceName = "refs/heads/master" +) + +// Reference is a representation of git reference +type Reference struct { + t ReferenceType + n ReferenceName + h Hash + target ReferenceName +} + +// NewReferenceFromStrings creates a reference from name and target as string, +// the resulting reference can be a SymbolicReference or a HashReference base +// on the target provided +func NewReferenceFromStrings(name, target string) *Reference { + n := ReferenceName(name) + + if strings.HasPrefix(target, symrefPrefix) { + target := ReferenceName(target[len(symrefPrefix):]) + return NewSymbolicReference(n, target) + } + + return NewHashReference(n, NewHash(target)) +} + +// NewSymbolicReference creates a new SymbolicReference reference +func NewSymbolicReference(n, target ReferenceName) *Reference { + return &Reference{ + t: SymbolicReference, + n: n, + target: target, + } +} + +// NewHashReference creates a new HashReference reference +func NewHashReference(n ReferenceName, h Hash) *Reference { + return &Reference{ + t: HashReference, + n: n, + h: h, + } +} + +// Type return the type of a reference +func (r *Reference) Type() ReferenceType { + return r.t +} + +// Name return the name of a reference +func (r *Reference) Name() ReferenceName { + return r.n +} + +// Hash return the hash of a hash reference +func (r *Reference) Hash() Hash { + return r.h +} + +// Target return the target of a symbolic reference +func (r *Reference) Target() ReferenceName { + return r.target +} + +// Strings dump a reference as a [2]string +func (r *Reference) Strings() [2]string { + var o [2]string + o[0] = r.Name().String() + + switch r.Type() { + case HashReference: + o[1] = r.Hash().String() + case SymbolicReference: + o[1] = symrefPrefix + r.Target().String() + } + + return o +} + +func (r *Reference) String() string { + s := r.Strings() + return fmt.Sprintf("%s %s", s[1], s[0]) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/revision.go b/vendor/github.com/go-git/go-git/v5/plumbing/revision.go new file mode 100644 index 0000000000..5f053b200c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/revision.go @@ -0,0 +1,11 @@ +package plumbing + +// Revision represents a git revision +// to get more details about git revisions +// please check git manual page : +// https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html +type Revision string + +func (r Revision) String() string { + return string(r) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/revlist/revlist.go b/vendor/github.com/go-git/go-git/v5/plumbing/revlist/revlist.go new file mode 100644 index 0000000000..b9109870f0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/revlist/revlist.go @@ -0,0 +1,230 @@ +// Package revlist provides support to access the ancestors of commits, in a +// similar way as the git-rev-list command. +package revlist + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +// Objects applies a complementary set. It gets all the hashes from all +// the reachable objects from the given objects. Ignore param are object hashes +// that we want to ignore on the result. All that objects must be accessible +// from the object storer. +func Objects( + s storer.EncodedObjectStorer, + objs, + ignore []plumbing.Hash, +) ([]plumbing.Hash, error) { + return ObjectsWithStorageForIgnores(s, s, objs, ignore) +} + +// ObjectsWithStorageForIgnores is the same as Objects, but a +// secondary storage layer can be provided, to be used to finding the +// full set of objects to be ignored while finding the reachable +// objects. This is useful when the main `s` storage layer is slow +// and/or remote, while the ignore list is available somewhere local. +func ObjectsWithStorageForIgnores( + s, ignoreStore storer.EncodedObjectStorer, + objs, + ignore []plumbing.Hash, +) ([]plumbing.Hash, error) { + ignore, err := objects(ignoreStore, ignore, nil, true) + if err != nil { + return nil, err + } + + return objects(s, objs, ignore, false) +} + +func objects( + s storer.EncodedObjectStorer, + objects, + ignore []plumbing.Hash, + allowMissingObjects bool, +) ([]plumbing.Hash, error) { + seen := hashListToSet(ignore) + result := make(map[plumbing.Hash]bool) + visited := make(map[plumbing.Hash]bool) + + walkerFunc := func(h plumbing.Hash) { + if !seen[h] { + result[h] = true + seen[h] = true + } + } + + for _, h := range objects { + if err := processObject(s, h, seen, visited, ignore, walkerFunc); err != nil { + if allowMissingObjects && err == plumbing.ErrObjectNotFound { + continue + } + + return nil, err + } + } + + return hashSetToList(result), nil +} + +// processObject obtains the object using the hash an process it depending of its type +func processObject( + s storer.EncodedObjectStorer, + h plumbing.Hash, + seen map[plumbing.Hash]bool, + visited map[plumbing.Hash]bool, + ignore []plumbing.Hash, + walkerFunc func(h plumbing.Hash), +) error { + if seen[h] { + return nil + } + + o, err := s.EncodedObject(plumbing.AnyObject, h) + if err != nil { + return err + } + + do, err := object.DecodeObject(s, o) + if err != nil { + return err + } + + switch do := do.(type) { + case *object.Commit: + return reachableObjects(do, seen, visited, ignore, walkerFunc) + case *object.Tree: + return iterateCommitTrees(seen, do, walkerFunc) + case *object.Tag: + walkerFunc(do.Hash) + return processObject(s, do.Target, seen, visited, ignore, walkerFunc) + case *object.Blob: + walkerFunc(do.Hash) + default: + return fmt.Errorf("object type not valid: %s. "+ + "Object reference: %s", o.Type(), o.Hash()) + } + + return nil +} + +// reachableObjects returns, using the callback function, all the reachable +// objects from the specified commit. To avoid to iterate over seen commits, +// if a commit hash is into the 'seen' set, we will not iterate all his trees +// and blobs objects. +func reachableObjects( + commit *object.Commit, + seen map[plumbing.Hash]bool, + visited map[plumbing.Hash]bool, + ignore []plumbing.Hash, + cb func(h plumbing.Hash), +) error { + i := object.NewCommitPreorderIter(commit, seen, ignore) + pending := make(map[plumbing.Hash]bool) + addPendingParents(pending, visited, commit) + for { + commit, err := i.Next() + if err == io.EOF { + break + } + + if err != nil { + return err + } + + if pending[commit.Hash] { + delete(pending, commit.Hash) + } + + addPendingParents(pending, visited, commit) + + if visited[commit.Hash] && len(pending) == 0 { + break + } + + if seen[commit.Hash] { + continue + } + + cb(commit.Hash) + + tree, err := commit.Tree() + if err != nil { + return err + } + + if err := iterateCommitTrees(seen, tree, cb); err != nil { + return err + } + } + + return nil +} + +func addPendingParents(pending, visited map[plumbing.Hash]bool, commit *object.Commit) { + for _, p := range commit.ParentHashes { + if !visited[p] { + pending[p] = true + } + } +} + +// iterateCommitTrees iterate all reachable trees from the given commit +func iterateCommitTrees( + seen map[plumbing.Hash]bool, + tree *object.Tree, + cb func(h plumbing.Hash), +) error { + if seen[tree.Hash] { + return nil + } + + cb(tree.Hash) + + treeWalker := object.NewTreeWalker(tree, true, seen) + + for { + _, e, err := treeWalker.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + if e.Mode == filemode.Submodule { + continue + } + + if seen[e.Hash] { + continue + } + + cb(e.Hash) + } + + return nil +} + +func hashSetToList(hashes map[plumbing.Hash]bool) []plumbing.Hash { + var result []plumbing.Hash + for key := range hashes { + result = append(result, key) + } + + return result +} + +func hashListToSet(hashes []plumbing.Hash) map[plumbing.Hash]bool { + result := make(map[plumbing.Hash]bool) + for _, h := range hashes { + result[h] = true + } + + return result +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/doc.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/doc.go new file mode 100644 index 0000000000..4d4f179c61 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/doc.go @@ -0,0 +1,2 @@ +// Package storer defines the interfaces to store objects, references, etc. +package storer diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/index.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/index.go new file mode 100644 index 0000000000..33113949b3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/index.go @@ -0,0 +1,9 @@ +package storer + +import "github.com/go-git/go-git/v5/plumbing/format/index" + +// IndexStorer generic storage of index.Index +type IndexStorer interface { + SetIndex(*index.Index) error + Index() (*index.Index, error) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/object.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/object.go new file mode 100644 index 0000000000..dfe309db16 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/object.go @@ -0,0 +1,288 @@ +package storer + +import ( + "errors" + "io" + "time" + + "github.com/go-git/go-git/v5/plumbing" +) + +var ( + //ErrStop is used to stop a ForEach function in an Iter + ErrStop = errors.New("stop iter") +) + +// EncodedObjectStorer generic storage of objects +type EncodedObjectStorer interface { + // NewEncodedObject returns a new plumbing.EncodedObject, the real type + // of the object can be a custom implementation or the default one, + // plumbing.MemoryObject. + NewEncodedObject() plumbing.EncodedObject + // SetEncodedObject saves an object into the storage, the object should + // be create with the NewEncodedObject, method, and file if the type is + // not supported. + SetEncodedObject(plumbing.EncodedObject) (plumbing.Hash, error) + // EncodedObject gets an object by hash with the given + // plumbing.ObjectType. Implementors should return + // (nil, plumbing.ErrObjectNotFound) if an object doesn't exist with + // both the given hash and object type. + // + // Valid plumbing.ObjectType values are CommitObject, BlobObject, TagObject, + // TreeObject and AnyObject. If plumbing.AnyObject is given, the object must + // be looked up regardless of its type. + EncodedObject(plumbing.ObjectType, plumbing.Hash) (plumbing.EncodedObject, error) + // IterObjects returns a custom EncodedObjectStorer over all the object + // on the storage. + // + // Valid plumbing.ObjectType values are CommitObject, BlobObject, TagObject, + IterEncodedObjects(plumbing.ObjectType) (EncodedObjectIter, error) + // HasEncodedObject returns ErrObjNotFound if the object doesn't + // exist. If the object does exist, it returns nil. + HasEncodedObject(plumbing.Hash) error + // EncodedObjectSize returns the plaintext size of the encoded object. + EncodedObjectSize(plumbing.Hash) (int64, error) +} + +// DeltaObjectStorer is an EncodedObjectStorer that can return delta +// objects. +type DeltaObjectStorer interface { + // DeltaObject is the same as EncodedObject but without resolving deltas. + // Deltas will be returned as plumbing.DeltaObject instances. + DeltaObject(plumbing.ObjectType, plumbing.Hash) (plumbing.EncodedObject, error) +} + +// Transactioner is a optional method for ObjectStorer, it enable transaction +// base write and read operations in the storage +type Transactioner interface { + // Begin starts a transaction. + Begin() Transaction +} + +// LooseObjectStorer is an optional interface for managing "loose" +// objects, i.e. those not in packfiles. +type LooseObjectStorer interface { + // ForEachObjectHash iterates over all the (loose) object hashes + // in the repository without necessarily having to read those objects. + // Objects only inside pack files may be omitted. + // If ErrStop is sent the iteration is stop but no error is returned. + ForEachObjectHash(func(plumbing.Hash) error) error + // LooseObjectTime looks up the (m)time associated with the + // loose object (that is not in a pack file). Some + // implementations (e.g. without loose objects) + // always return an error. + LooseObjectTime(plumbing.Hash) (time.Time, error) + // DeleteLooseObject deletes a loose object if it exists. + DeleteLooseObject(plumbing.Hash) error +} + +// PackedObjectStorer is an optional interface for managing objects in +// packfiles. +type PackedObjectStorer interface { + // ObjectPacks returns hashes of object packs if the underlying + // implementation has pack files. + ObjectPacks() ([]plumbing.Hash, error) + // DeleteOldObjectPackAndIndex deletes an object pack and the corresponding index file if they exist. + // Deletion is only performed if the pack is older than the supplied time (or the time is zero). + DeleteOldObjectPackAndIndex(plumbing.Hash, time.Time) error +} + +// PackfileWriter is a optional method for ObjectStorer, it enable direct write +// of packfile to the storage +type PackfileWriter interface { + // PackfileWriter returns a writer for writing a packfile to the storage + // + // If the Storer not implements PackfileWriter the objects should be written + // using the Set method. + PackfileWriter() (io.WriteCloser, error) +} + +// EncodedObjectIter is a generic closable interface for iterating over objects. +type EncodedObjectIter interface { + Next() (plumbing.EncodedObject, error) + ForEach(func(plumbing.EncodedObject) error) error + Close() +} + +// Transaction is an in-progress storage transaction. A transaction must end +// with a call to Commit or Rollback. +type Transaction interface { + SetEncodedObject(plumbing.EncodedObject) (plumbing.Hash, error) + EncodedObject(plumbing.ObjectType, plumbing.Hash) (plumbing.EncodedObject, error) + Commit() error + Rollback() error +} + +// EncodedObjectLookupIter implements EncodedObjectIter. It iterates over a +// series of object hashes and yields their associated objects by retrieving +// each one from object storage. The retrievals are lazy and only occur when the +// iterator moves forward with a call to Next(). +// +// The EncodedObjectLookupIter must be closed with a call to Close() when it is +// no longer needed. +type EncodedObjectLookupIter struct { + storage EncodedObjectStorer + series []plumbing.Hash + t plumbing.ObjectType + pos int +} + +// NewEncodedObjectLookupIter returns an object iterator given an object storage +// and a slice of object hashes. +func NewEncodedObjectLookupIter( + storage EncodedObjectStorer, t plumbing.ObjectType, series []plumbing.Hash) *EncodedObjectLookupIter { + return &EncodedObjectLookupIter{ + storage: storage, + series: series, + t: t, + } +} + +// Next returns the next object from the iterator. If the iterator has reached +// the end it will return io.EOF as an error. If the object can't be found in +// the object storage, it will return plumbing.ErrObjectNotFound as an error. +// If the object is retrieved successfully error will be nil. +func (iter *EncodedObjectLookupIter) Next() (plumbing.EncodedObject, error) { + if iter.pos >= len(iter.series) { + return nil, io.EOF + } + + hash := iter.series[iter.pos] + obj, err := iter.storage.EncodedObject(iter.t, hash) + if err == nil { + iter.pos++ + } + + return obj, err +} + +// ForEach call the cb function for each object contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *EncodedObjectLookupIter) ForEach(cb func(plumbing.EncodedObject) error) error { + return ForEachIterator(iter, cb) +} + +// Close releases any resources used by the iterator. +func (iter *EncodedObjectLookupIter) Close() { + iter.pos = len(iter.series) +} + +// EncodedObjectSliceIter implements EncodedObjectIter. It iterates over a +// series of objects stored in a slice and yields each one in turn when Next() +// is called. +// +// The EncodedObjectSliceIter must be closed with a call to Close() when it is +// no longer needed. +type EncodedObjectSliceIter struct { + series []plumbing.EncodedObject +} + +// NewEncodedObjectSliceIter returns an object iterator for the given slice of +// objects. +func NewEncodedObjectSliceIter(series []plumbing.EncodedObject) *EncodedObjectSliceIter { + return &EncodedObjectSliceIter{ + series: series, + } +} + +// Next returns the next object from the iterator. If the iterator has reached +// the end it will return io.EOF as an error. If the object is retrieved +// successfully error will be nil. +func (iter *EncodedObjectSliceIter) Next() (plumbing.EncodedObject, error) { + if len(iter.series) == 0 { + return nil, io.EOF + } + + obj := iter.series[0] + iter.series = iter.series[1:] + + return obj, nil +} + +// ForEach call the cb function for each object contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *EncodedObjectSliceIter) ForEach(cb func(plumbing.EncodedObject) error) error { + return ForEachIterator(iter, cb) +} + +// Close releases any resources used by the iterator. +func (iter *EncodedObjectSliceIter) Close() { + iter.series = []plumbing.EncodedObject{} +} + +// MultiEncodedObjectIter implements EncodedObjectIter. It iterates over several +// EncodedObjectIter, +// +// The MultiObjectIter must be closed with a call to Close() when it is no +// longer needed. +type MultiEncodedObjectIter struct { + iters []EncodedObjectIter +} + +// NewMultiEncodedObjectIter returns an object iterator for the given slice of +// EncodedObjectIters. +func NewMultiEncodedObjectIter(iters []EncodedObjectIter) EncodedObjectIter { + return &MultiEncodedObjectIter{iters: iters} +} + +// Next returns the next object from the iterator, if one iterator reach io.EOF +// is removed and the next one is used. +func (iter *MultiEncodedObjectIter) Next() (plumbing.EncodedObject, error) { + if len(iter.iters) == 0 { + return nil, io.EOF + } + + obj, err := iter.iters[0].Next() + if err == io.EOF { + iter.iters[0].Close() + iter.iters = iter.iters[1:] + return iter.Next() + } + + return obj, err +} + +// ForEach call the cb function for each object contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *MultiEncodedObjectIter) ForEach(cb func(plumbing.EncodedObject) error) error { + return ForEachIterator(iter, cb) +} + +// Close releases any resources used by the iterator. +func (iter *MultiEncodedObjectIter) Close() { + for _, i := range iter.iters { + i.Close() + } +} + +type bareIterator interface { + Next() (plumbing.EncodedObject, error) + Close() +} + +// ForEachIterator is a helper function to build iterators without need to +// rewrite the same ForEach function each time. +func ForEachIterator(iter bareIterator, cb func(plumbing.EncodedObject) error) error { + defer iter.Close() + for { + obj, err := iter.Next() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := cb(obj); err != nil { + if err == ErrStop { + return nil + } + + return err + } + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/reference.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/reference.go new file mode 100644 index 0000000000..1d74ef3c6a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/reference.go @@ -0,0 +1,240 @@ +package storer + +import ( + "errors" + "io" + + "github.com/go-git/go-git/v5/plumbing" +) + +const MaxResolveRecursion = 1024 + +// ErrMaxResolveRecursion is returned by ResolveReference is MaxResolveRecursion +// is exceeded +var ErrMaxResolveRecursion = errors.New("max. recursion level reached") + +// ReferenceStorer is a generic storage of references. +type ReferenceStorer interface { + SetReference(*plumbing.Reference) error + // CheckAndSetReference sets the reference `new`, but if `old` is + // not `nil`, it first checks that the current stored value for + // `old.Name()` matches the given reference value in `old`. If + // not, it returns an error and doesn't update `new`. + CheckAndSetReference(new, old *plumbing.Reference) error + Reference(plumbing.ReferenceName) (*plumbing.Reference, error) + IterReferences() (ReferenceIter, error) + RemoveReference(plumbing.ReferenceName) error + CountLooseRefs() (int, error) + PackRefs() error +} + +// ReferenceIter is a generic closable interface for iterating over references. +type ReferenceIter interface { + Next() (*plumbing.Reference, error) + ForEach(func(*plumbing.Reference) error) error + Close() +} + +type referenceFilteredIter struct { + ff func(r *plumbing.Reference) bool + iter ReferenceIter +} + +// NewReferenceFilteredIter returns a reference iterator for the given reference +// Iterator. This iterator will iterate only references that accomplish the +// provided function. +func NewReferenceFilteredIter( + ff func(r *plumbing.Reference) bool, iter ReferenceIter) ReferenceIter { + return &referenceFilteredIter{ff, iter} +} + +// Next returns the next reference from the iterator. If the iterator has reached +// the end it will return io.EOF as an error. +func (iter *referenceFilteredIter) Next() (*plumbing.Reference, error) { + for { + r, err := iter.iter.Next() + if err != nil { + return nil, err + } + + if iter.ff(r) { + return r, nil + } + + continue + } +} + +// ForEach call the cb function for each reference contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stopped but no error is returned. The iterator is closed. +func (iter *referenceFilteredIter) ForEach(cb func(*plumbing.Reference) error) error { + defer iter.Close() + for { + r, err := iter.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + if err := cb(r); err != nil { + if err == ErrStop { + break + } + + return err + } + } + + return nil +} + +// Close releases any resources used by the iterator. +func (iter *referenceFilteredIter) Close() { + iter.iter.Close() +} + +// ReferenceSliceIter implements ReferenceIter. It iterates over a series of +// references stored in a slice and yields each one in turn when Next() is +// called. +// +// The ReferenceSliceIter must be closed with a call to Close() when it is no +// longer needed. +type ReferenceSliceIter struct { + series []*plumbing.Reference + pos int +} + +// NewReferenceSliceIter returns a reference iterator for the given slice of +// objects. +func NewReferenceSliceIter(series []*plumbing.Reference) ReferenceIter { + return &ReferenceSliceIter{ + series: series, + } +} + +// Next returns the next reference from the iterator. If the iterator has +// reached the end it will return io.EOF as an error. +func (iter *ReferenceSliceIter) Next() (*plumbing.Reference, error) { + if iter.pos >= len(iter.series) { + return nil, io.EOF + } + + obj := iter.series[iter.pos] + iter.pos++ + return obj, nil +} + +// ForEach call the cb function for each reference contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *ReferenceSliceIter) ForEach(cb func(*plumbing.Reference) error) error { + return forEachReferenceIter(iter, cb) +} + +type bareReferenceIterator interface { + Next() (*plumbing.Reference, error) + Close() +} + +func forEachReferenceIter(iter bareReferenceIterator, cb func(*plumbing.Reference) error) error { + defer iter.Close() + for { + obj, err := iter.Next() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := cb(obj); err != nil { + if err == ErrStop { + return nil + } + + return err + } + } +} + +// Close releases any resources used by the iterator. +func (iter *ReferenceSliceIter) Close() { + iter.pos = len(iter.series) +} + +// MultiReferenceIter implements ReferenceIter. It iterates over several +// ReferenceIter, +// +// The MultiReferenceIter must be closed with a call to Close() when it is no +// longer needed. +type MultiReferenceIter struct { + iters []ReferenceIter +} + +// NewMultiReferenceIter returns an reference iterator for the given slice of +// EncodedObjectIters. +func NewMultiReferenceIter(iters []ReferenceIter) ReferenceIter { + return &MultiReferenceIter{iters: iters} +} + +// Next returns the next reference from the iterator, if one iterator reach +// io.EOF is removed and the next one is used. +func (iter *MultiReferenceIter) Next() (*plumbing.Reference, error) { + if len(iter.iters) == 0 { + return nil, io.EOF + } + + obj, err := iter.iters[0].Next() + if err == io.EOF { + iter.iters[0].Close() + iter.iters = iter.iters[1:] + return iter.Next() + } + + return obj, err +} + +// ForEach call the cb function for each reference contained on this iter until +// an error happens or the end of the iter is reached. If ErrStop is sent +// the iteration is stop but no error is returned. The iterator is closed. +func (iter *MultiReferenceIter) ForEach(cb func(*plumbing.Reference) error) error { + return forEachReferenceIter(iter, cb) +} + +// Close releases any resources used by the iterator. +func (iter *MultiReferenceIter) Close() { + for _, i := range iter.iters { + i.Close() + } +} + +// ResolveReference resolves a SymbolicReference to a HashReference. +func ResolveReference(s ReferenceStorer, n plumbing.ReferenceName) (*plumbing.Reference, error) { + r, err := s.Reference(n) + if err != nil || r == nil { + return r, err + } + return resolveReference(s, r, 0) +} + +func resolveReference(s ReferenceStorer, r *plumbing.Reference, recursion int) (*plumbing.Reference, error) { + if r.Type() != plumbing.SymbolicReference { + return r, nil + } + + if recursion > MaxResolveRecursion { + return nil, ErrMaxResolveRecursion + } + + t, err := s.Reference(r.Target()) + if err != nil { + return nil, err + } + + recursion++ + return resolveReference(s, t, recursion) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/shallow.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/shallow.go new file mode 100644 index 0000000000..39ef5ea5c6 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/shallow.go @@ -0,0 +1,10 @@ +package storer + +import "github.com/go-git/go-git/v5/plumbing" + +// ShallowStorer is a storage of references to shallow commits by hash, +// meaning that these commits have missing parents because of a shallow fetch. +type ShallowStorer interface { + SetShallow([]plumbing.Hash) error + Shallow() ([]plumbing.Hash, error) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/storer/storer.go b/vendor/github.com/go-git/go-git/v5/plumbing/storer/storer.go new file mode 100644 index 0000000000..c7bc65a0c4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/storer/storer.go @@ -0,0 +1,15 @@ +package storer + +// Storer is a basic storer for encoded objects and references. +type Storer interface { + EncodedObjectStorer + ReferenceStorer +} + +// Initializer should be implemented by storers that require to perform any +// operation when creating a new repository (i.e. git init). +type Initializer interface { + // Init performs initialization of the storer and returns the error, if + // any. + Init() error +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go new file mode 100644 index 0000000000..20c3d0560e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go @@ -0,0 +1,83 @@ +// Package client contains helper function to deal with the different client +// protocols. +package client + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + gohttp "net/http" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/file" + "github.com/go-git/go-git/v5/plumbing/transport/git" + "github.com/go-git/go-git/v5/plumbing/transport/http" + "github.com/go-git/go-git/v5/plumbing/transport/ssh" +) + +// Protocols are the protocols supported by default. +var Protocols = map[string]transport.Transport{ + "http": http.DefaultClient, + "https": http.DefaultClient, + "ssh": ssh.DefaultClient, + "git": git.DefaultClient, + "file": file.DefaultClient, +} + +var insecureClient = http.NewClient(&gohttp.Client{ + Transport: &gohttp.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + }, +}) + +// InstallProtocol adds or modifies an existing protocol. +func InstallProtocol(scheme string, c transport.Transport) { + if c == nil { + delete(Protocols, scheme) + return + } + + Protocols[scheme] = c +} + +// NewClient returns the appropriate client among of the set of known protocols: +// http://, https://, ssh:// and file://. +// See `InstallProtocol` to add or modify protocols. +func NewClient(endpoint *transport.Endpoint) (transport.Transport, error) { + return getTransport(endpoint) +} + +func getTransport(endpoint *transport.Endpoint) (transport.Transport, error) { + if endpoint.Protocol == "https" { + if endpoint.InsecureSkipTLS { + return insecureClient, nil + } + + if len(endpoint.CaBundle) != 0 { + rootCAs, _ := x509.SystemCertPool() + if rootCAs == nil { + rootCAs = x509.NewCertPool() + } + rootCAs.AppendCertsFromPEM(endpoint.CaBundle) + return http.NewClient(&gohttp.Client{ + Transport: &gohttp.Transport{ + TLSClientConfig: &tls.Config{ + RootCAs: rootCAs, + }, + }, + }), nil + } + } + + f, ok := Protocols[endpoint.Protocol] + if !ok { + return nil, fmt.Errorf("unsupported scheme %q", endpoint.Protocol) + } + + if f == nil { + return nil, fmt.Errorf("malformed client for scheme %q, client is defined as nil", endpoint.Protocol) + } + return f, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go new file mode 100644 index 0000000000..a9ee2caee7 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go @@ -0,0 +1,283 @@ +// Package transport includes the implementation for different transport +// protocols. +// +// `Client` can be used to fetch and send packfiles to a git server. +// The `client` package provides higher level functions to instantiate the +// appropriate `Client` based on the repository URL. +// +// go-git supports HTTP and SSH (see `Protocols`), but you can also install +// your own protocols (see the `client` package). +// +// Each protocol has its own implementation of `Client`, but you should +// generally not use them directly, use `client.NewClient` instead. +package transport + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "net/url" + "strconv" + "strings" + + giturl "github.com/go-git/go-git/v5/internal/url" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" +) + +var ( + ErrRepositoryNotFound = errors.New("repository not found") + ErrEmptyRemoteRepository = errors.New("remote repository is empty") + ErrAuthenticationRequired = errors.New("authentication required") + ErrAuthorizationFailed = errors.New("authorization failed") + ErrEmptyUploadPackRequest = errors.New("empty git-upload-pack given") + ErrInvalidAuthMethod = errors.New("invalid auth method") + ErrAlreadyConnected = errors.New("session already established") +) + +const ( + UploadPackServiceName = "git-upload-pack" + ReceivePackServiceName = "git-receive-pack" +) + +// Transport can initiate git-upload-pack and git-receive-pack processes. +// It is implemented both by the client and the server, making this a RPC. +type Transport interface { + // NewUploadPackSession starts a git-upload-pack session for an endpoint. + NewUploadPackSession(*Endpoint, AuthMethod) (UploadPackSession, error) + // NewReceivePackSession starts a git-receive-pack session for an endpoint. + NewReceivePackSession(*Endpoint, AuthMethod) (ReceivePackSession, error) +} + +type Session interface { + // AdvertisedReferences retrieves the advertised references for a + // repository. + // If the repository does not exist, returns ErrRepositoryNotFound. + // If the repository exists, but is empty, returns ErrEmptyRemoteRepository. + AdvertisedReferences() (*packp.AdvRefs, error) + // AdvertisedReferencesContext retrieves the advertised references for a + // repository. + // If the repository does not exist, returns ErrRepositoryNotFound. + // If the repository exists, but is empty, returns ErrEmptyRemoteRepository. + AdvertisedReferencesContext(context.Context) (*packp.AdvRefs, error) + io.Closer +} + +type AuthMethod interface { + fmt.Stringer + Name() string +} + +// UploadPackSession represents a git-upload-pack session. +// A git-upload-pack session has two steps: reference discovery +// (AdvertisedReferences) and uploading pack (UploadPack). +type UploadPackSession interface { + Session + // UploadPack takes a git-upload-pack request and returns a response, + // including a packfile. Don't be confused by terminology, the client + // side of a git-upload-pack is called git-fetch-pack, although here + // the same interface is used to make it RPC-like. + UploadPack(context.Context, *packp.UploadPackRequest) (*packp.UploadPackResponse, error) +} + +// ReceivePackSession represents a git-receive-pack session. +// A git-receive-pack session has two steps: reference discovery +// (AdvertisedReferences) and receiving pack (ReceivePack). +// In that order. +type ReceivePackSession interface { + Session + // ReceivePack sends an update references request and a packfile + // reader and returns a ReportStatus and error. Don't be confused by + // terminology, the client side of a git-receive-pack is called + // git-send-pack, although here the same interface is used to make it + // RPC-like. + ReceivePack(context.Context, *packp.ReferenceUpdateRequest) (*packp.ReportStatus, error) +} + +// Endpoint represents a Git URL in any supported protocol. +type Endpoint struct { + // Protocol is the protocol of the endpoint (e.g. git, https, file). + Protocol string + // User is the user. + User string + // Password is the password. + Password string + // Host is the host. + Host string + // Port is the port to connect, if 0 the default port for the given protocol + // wil be used. + Port int + // Path is the repository path. + Path string + // InsecureSkipTLS skips ssl verify if protocal is https + InsecureSkipTLS bool + // CaBundle specify additional ca bundle with system cert pool + CaBundle []byte +} + +var defaultPorts = map[string]int{ + "http": 80, + "https": 443, + "git": 9418, + "ssh": 22, +} + +// String returns a string representation of the Git URL. +func (u *Endpoint) String() string { + var buf bytes.Buffer + if u.Protocol != "" { + buf.WriteString(u.Protocol) + buf.WriteByte(':') + } + + if u.Protocol != "" || u.Host != "" || u.User != "" || u.Password != "" { + buf.WriteString("//") + + if u.User != "" || u.Password != "" { + buf.WriteString(url.PathEscape(u.User)) + if u.Password != "" { + buf.WriteByte(':') + buf.WriteString(url.PathEscape(u.Password)) + } + + buf.WriteByte('@') + } + + if u.Host != "" { + buf.WriteString(u.Host) + + if u.Port != 0 { + port, ok := defaultPorts[strings.ToLower(u.Protocol)] + if !ok || ok && port != u.Port { + fmt.Fprintf(&buf, ":%d", u.Port) + } + } + } + } + + if u.Path != "" && u.Path[0] != '/' && u.Host != "" { + buf.WriteByte('/') + } + + buf.WriteString(u.Path) + return buf.String() +} + +func NewEndpoint(endpoint string) (*Endpoint, error) { + if e, ok := parseSCPLike(endpoint); ok { + return e, nil + } + + if e, ok := parseFile(endpoint); ok { + return e, nil + } + + return parseURL(endpoint) +} + +func parseURL(endpoint string) (*Endpoint, error) { + u, err := url.Parse(endpoint) + if err != nil { + return nil, err + } + + if !u.IsAbs() { + return nil, plumbing.NewPermanentError(fmt.Errorf( + "invalid endpoint: %s", endpoint, + )) + } + + var user, pass string + if u.User != nil { + user = u.User.Username() + pass, _ = u.User.Password() + } + + return &Endpoint{ + Protocol: u.Scheme, + User: user, + Password: pass, + Host: u.Hostname(), + Port: getPort(u), + Path: getPath(u), + }, nil +} + +func getPort(u *url.URL) int { + p := u.Port() + if p == "" { + return 0 + } + + i, err := strconv.Atoi(p) + if err != nil { + return 0 + } + + return i +} + +func getPath(u *url.URL) string { + var res string = u.Path + if u.RawQuery != "" { + res += "?" + u.RawQuery + } + + if u.Fragment != "" { + res += "#" + u.Fragment + } + + return res +} + +func parseSCPLike(endpoint string) (*Endpoint, bool) { + if giturl.MatchesScheme(endpoint) || !giturl.MatchesScpLike(endpoint) { + return nil, false + } + + user, host, portStr, path := giturl.FindScpLikeComponents(endpoint) + port, err := strconv.Atoi(portStr) + if err != nil { + port = 22 + } + + return &Endpoint{ + Protocol: "ssh", + User: user, + Host: host, + Port: port, + Path: path, + }, true +} + +func parseFile(endpoint string) (*Endpoint, bool) { + if giturl.MatchesScheme(endpoint) { + return nil, false + } + + path := endpoint + return &Endpoint{ + Protocol: "file", + Path: path, + }, true +} + +// UnsupportedCapabilities are the capabilities not supported by any client +// implementation +var UnsupportedCapabilities = []capability.Capability{ + capability.MultiACK, + capability.MultiACKDetailed, + capability.ThinPack, +} + +// FilterUnsupportedCapabilities it filter out all the UnsupportedCapabilities +// from a capability.List, the intended usage is on the client implementation +// to filter the capabilities from an AdvRefs message. +func FilterUnsupportedCapabilities(list *capability.List) { + for _, c := range UnsupportedCapabilities { + list.Delete(c) + } +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/client.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/client.go new file mode 100644 index 0000000000..6f0a38012b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/client.go @@ -0,0 +1,157 @@ +// Package file implements the file transport protocol. +package file + +import ( + "bufio" + "errors" + "io" + "os" + "path/filepath" + "strings" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + "github.com/go-git/go-git/v5/utils/ioutil" + "golang.org/x/sys/execabs" +) + +// DefaultClient is the default local client. +var DefaultClient = NewClient( + transport.UploadPackServiceName, + transport.ReceivePackServiceName, +) + +type runner struct { + UploadPackBin string + ReceivePackBin string +} + +// NewClient returns a new local client using the given git-upload-pack and +// git-receive-pack binaries. +func NewClient(uploadPackBin, receivePackBin string) transport.Transport { + return common.NewClient(&runner{ + UploadPackBin: uploadPackBin, + ReceivePackBin: receivePackBin, + }) +} + +func prefixExecPath(cmd string) (string, error) { + // Use `git --exec-path` to find the exec path. + execCmd := execabs.Command("git", "--exec-path") + + stdout, err := execCmd.StdoutPipe() + if err != nil { + return "", err + } + stdoutBuf := bufio.NewReader(stdout) + + err = execCmd.Start() + if err != nil { + return "", err + } + + execPathBytes, isPrefix, err := stdoutBuf.ReadLine() + if err != nil { + return "", err + } + if isPrefix { + return "", errors.New("couldn't read exec-path line all at once") + } + + err = execCmd.Wait() + if err != nil { + return "", err + } + execPath := string(execPathBytes) + execPath = strings.TrimSpace(execPath) + cmd = filepath.Join(execPath, cmd) + + // Make sure it actually exists. + _, err = execabs.LookPath(cmd) + if err != nil { + return "", err + } + return cmd, nil +} + +func (r *runner) Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod, +) (common.Command, error) { + + switch cmd { + case transport.UploadPackServiceName: + cmd = r.UploadPackBin + case transport.ReceivePackServiceName: + cmd = r.ReceivePackBin + } + + _, err := execabs.LookPath(cmd) + if err != nil { + if e, ok := err.(*execabs.Error); ok && e.Err == execabs.ErrNotFound { + cmd, err = prefixExecPath(cmd) + if err != nil { + return nil, err + } + } else { + return nil, err + } + } + + return &command{cmd: execabs.Command(cmd, ep.Path)}, nil +} + +type command struct { + cmd *execabs.Cmd + stderrCloser io.Closer + closed bool +} + +func (c *command) Start() error { + return c.cmd.Start() +} + +func (c *command) StderrPipe() (io.Reader, error) { + // Pipe returned by Command.StderrPipe has a race with Read + Command.Wait. + // We use an io.Pipe and close it after the command finishes. + r, w := ioutil.Pipe() + c.cmd.Stderr = w + c.stderrCloser = r + return r, nil +} + +func (c *command) StdinPipe() (io.WriteCloser, error) { + return c.cmd.StdinPipe() +} + +func (c *command) StdoutPipe() (io.Reader, error) { + return c.cmd.StdoutPipe() +} + +func (c *command) Kill() error { + c.cmd.Process.Kill() + return c.Close() +} + +// Close waits for the command to exit. +func (c *command) Close() error { + if c.closed { + return nil + } + + defer func() { + c.closed = true + _ = c.stderrCloser.Close() + + }() + + err := c.cmd.Wait() + if _, ok := err.(*os.PathError); ok { + return nil + } + + // When a repository does not exist, the command exits with code 128. + if _, ok := err.(*execabs.ExitError); ok { + return nil + } + + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/server.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/server.go new file mode 100644 index 0000000000..b45d7a71c2 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/file/server.go @@ -0,0 +1,53 @@ +package file + +import ( + "fmt" + "os" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + "github.com/go-git/go-git/v5/plumbing/transport/server" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// ServeUploadPack serves a git-upload-pack request using standard output, input +// and error. This is meant to be used when implementing a git-upload-pack +// command. +func ServeUploadPack(path string) error { + ep, err := transport.NewEndpoint(path) + if err != nil { + return err + } + + // TODO: define and implement a server-side AuthMethod + s, err := server.DefaultServer.NewUploadPackSession(ep, nil) + if err != nil { + return fmt.Errorf("error creating session: %s", err) + } + + return common.ServeUploadPack(srvCmd, s) +} + +// ServeReceivePack serves a git-receive-pack request using standard output, +// input and error. This is meant to be used when implementing a +// git-receive-pack command. +func ServeReceivePack(path string) error { + ep, err := transport.NewEndpoint(path) + if err != nil { + return err + } + + // TODO: define and implement a server-side AuthMethod + s, err := server.DefaultServer.NewReceivePackSession(ep, nil) + if err != nil { + return fmt.Errorf("error creating session: %s", err) + } + + return common.ServeReceivePack(srvCmd, s) +} + +var srvCmd = common.ServerCommand{ + Stdin: os.Stdin, + Stdout: ioutil.WriteNopCloser(os.Stdout), + Stderr: os.Stderr, +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go new file mode 100644 index 0000000000..306aae261f --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go @@ -0,0 +1,109 @@ +// Package git implements the git transport protocol. +package git + +import ( + "fmt" + "io" + "net" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// DefaultClient is the default git client. +var DefaultClient = common.NewClient(&runner{}) + +const DefaultPort = 9418 + +type runner struct{} + +// Command returns a new Command for the given cmd in the given Endpoint +func (r *runner) Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod) (common.Command, error) { + // auth not allowed since git protocol doesn't support authentication + if auth != nil { + return nil, transport.ErrInvalidAuthMethod + } + c := &command{command: cmd, endpoint: ep} + if err := c.connect(); err != nil { + return nil, err + } + return c, nil +} + +type command struct { + conn net.Conn + connected bool + command string + endpoint *transport.Endpoint +} + +// Start executes the command sending the required message to the TCP connection +func (c *command) Start() error { + cmd := endpointToCommand(c.command, c.endpoint) + + e := pktline.NewEncoder(c.conn) + return e.Encode([]byte(cmd)) +} + +func (c *command) connect() error { + if c.connected { + return transport.ErrAlreadyConnected + } + + var err error + c.conn, err = net.Dial("tcp", c.getHostWithPort()) + if err != nil { + return err + } + + c.connected = true + return nil +} + +func (c *command) getHostWithPort() string { + host := c.endpoint.Host + port := c.endpoint.Port + if port <= 0 { + port = DefaultPort + } + + return fmt.Sprintf("%s:%d", host, port) +} + +// StderrPipe git protocol doesn't have any dedicated error channel +func (c *command) StderrPipe() (io.Reader, error) { + return nil, nil +} + +// StdinPipe return the underlying connection as WriteCloser, wrapped to prevent +// call to the Close function from the connection, a command execution in git +// protocol can't be closed or killed +func (c *command) StdinPipe() (io.WriteCloser, error) { + return ioutil.WriteNopCloser(c.conn), nil +} + +// StdoutPipe return the underlying connection as Reader +func (c *command) StdoutPipe() (io.Reader, error) { + return c.conn, nil +} + +func endpointToCommand(cmd string, ep *transport.Endpoint) string { + host := ep.Host + if ep.Port != DefaultPort { + host = fmt.Sprintf("%s:%d", ep.Host, ep.Port) + } + + return fmt.Sprintf("%s %s%chost=%s%c", cmd, ep.Path, 0, host, 0) +} + +// Close closes the TCP connection and connection. +func (c *command) Close() error { + if !c.connected { + return nil + } + + c.connected = false + return c.conn.Close() +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go new file mode 100644 index 0000000000..d57c0feef5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go @@ -0,0 +1,282 @@ +// Package http implements the HTTP transport protocol. +package http + +import ( + "bytes" + "context" + "fmt" + "net" + "net/http" + "strconv" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// it requires a bytes.Buffer, because we need to know the length +func applyHeadersToRequest(req *http.Request, content *bytes.Buffer, host string, requestType string) { + req.Header.Add("User-Agent", "git/1.0") + req.Header.Add("Host", host) // host:port + + if content == nil { + req.Header.Add("Accept", "*/*") + return + } + + req.Header.Add("Accept", fmt.Sprintf("application/x-%s-result", requestType)) + req.Header.Add("Content-Type", fmt.Sprintf("application/x-%s-request", requestType)) + req.Header.Add("Content-Length", strconv.Itoa(content.Len())) +} + +const infoRefsPath = "/info/refs" + +func advertisedReferences(ctx context.Context, s *session, serviceName string) (ref *packp.AdvRefs, err error) { + url := fmt.Sprintf( + "%s%s?service=%s", + s.endpoint.String(), infoRefsPath, serviceName, + ) + + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return nil, err + } + + s.ApplyAuthToRequest(req) + applyHeadersToRequest(req, nil, s.endpoint.Host, serviceName) + res, err := s.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, err + } + + s.ModifyEndpointIfRedirect(res) + defer ioutil.CheckClose(res.Body, &err) + + if err = NewErr(res); err != nil { + return nil, err + } + + ar := packp.NewAdvRefs() + if err = ar.Decode(res.Body); err != nil { + if err == packp.ErrEmptyAdvRefs { + err = transport.ErrEmptyRemoteRepository + } + + return nil, err + } + + transport.FilterUnsupportedCapabilities(ar.Capabilities) + s.advRefs = ar + + return ar, nil +} + +type client struct { + c *http.Client +} + +// DefaultClient is the default HTTP client, which uses `http.DefaultClient`. +var DefaultClient = NewClient(nil) + +// NewClient creates a new client with a custom net/http client. +// See `InstallProtocol` to install and override default http client. +// Unless a properly initialized client is given, it will fall back into +// `http.DefaultClient`. +// +// Note that for HTTP client cannot distinguish between private repositories and +// unexistent repositories on GitHub. So it returns `ErrAuthorizationRequired` +// for both. +func NewClient(c *http.Client) transport.Transport { + if c == nil { + return &client{http.DefaultClient} + } + + return &client{ + c: c, + } +} + +func (c *client) NewUploadPackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( + transport.UploadPackSession, error) { + + return newUploadPackSession(c.c, ep, auth) +} + +func (c *client) NewReceivePackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( + transport.ReceivePackSession, error) { + + return newReceivePackSession(c.c, ep, auth) +} + +type session struct { + auth AuthMethod + client *http.Client + endpoint *transport.Endpoint + advRefs *packp.AdvRefs +} + +func newSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (*session, error) { + s := &session{ + auth: basicAuthFromEndpoint(ep), + client: c, + endpoint: ep, + } + if auth != nil { + a, ok := auth.(AuthMethod) + if !ok { + return nil, transport.ErrInvalidAuthMethod + } + + s.auth = a + } + + return s, nil +} + +func (s *session) ApplyAuthToRequest(req *http.Request) { + if s.auth == nil { + return + } + + s.auth.SetAuth(req) +} + +func (s *session) ModifyEndpointIfRedirect(res *http.Response) { + if res.Request == nil { + return + } + + r := res.Request + if !strings.HasSuffix(r.URL.Path, infoRefsPath) { + return + } + + h, p, err := net.SplitHostPort(r.URL.Host) + if err != nil { + h = r.URL.Host + } + if p != "" { + port, err := strconv.Atoi(p) + if err == nil { + s.endpoint.Port = port + } + } + s.endpoint.Host = h + + s.endpoint.Protocol = r.URL.Scheme + s.endpoint.Path = r.URL.Path[:len(r.URL.Path)-len(infoRefsPath)] +} + +func (*session) Close() error { + return nil +} + +// AuthMethod is concrete implementation of common.AuthMethod for HTTP services +type AuthMethod interface { + transport.AuthMethod + SetAuth(r *http.Request) +} + +func basicAuthFromEndpoint(ep *transport.Endpoint) *BasicAuth { + u := ep.User + if u == "" { + return nil + } + + return &BasicAuth{u, ep.Password} +} + +// BasicAuth represent a HTTP basic auth +type BasicAuth struct { + Username, Password string +} + +func (a *BasicAuth) SetAuth(r *http.Request) { + if a == nil { + return + } + + r.SetBasicAuth(a.Username, a.Password) +} + +// Name is name of the auth +func (a *BasicAuth) Name() string { + return "http-basic-auth" +} + +func (a *BasicAuth) String() string { + masked := "*******" + if a.Password == "" { + masked = "" + } + + return fmt.Sprintf("%s - %s:%s", a.Name(), a.Username, masked) +} + +// TokenAuth implements an http.AuthMethod that can be used with http transport +// to authenticate with HTTP token authentication (also known as bearer +// authentication). +// +// IMPORTANT: If you are looking to use OAuth tokens with popular servers (e.g. +// GitHub, Bitbucket, GitLab) you should use BasicAuth instead. These servers +// use basic HTTP authentication, with the OAuth token as user or password. +// Check the documentation of your git server for details. +type TokenAuth struct { + Token string +} + +func (a *TokenAuth) SetAuth(r *http.Request) { + if a == nil { + return + } + r.Header.Add("Authorization", fmt.Sprintf("Bearer %s", a.Token)) +} + +// Name is name of the auth +func (a *TokenAuth) Name() string { + return "http-token-auth" +} + +func (a *TokenAuth) String() string { + masked := "*******" + if a.Token == "" { + masked = "" + } + return fmt.Sprintf("%s - %s", a.Name(), masked) +} + +// Err is a dedicated error to return errors based on status code +type Err struct { + Response *http.Response +} + +// NewErr returns a new Err based on a http response +func NewErr(r *http.Response) error { + if r.StatusCode >= http.StatusOK && r.StatusCode < http.StatusMultipleChoices { + return nil + } + + switch r.StatusCode { + case http.StatusUnauthorized: + return transport.ErrAuthenticationRequired + case http.StatusForbidden: + return transport.ErrAuthorizationFailed + case http.StatusNotFound: + return transport.ErrRepositoryNotFound + } + + return plumbing.NewUnexpectedError(&Err{r}) +} + +// StatusCode returns the status code of the response +func (e *Err) StatusCode() int { + return e.Response.StatusCode +} + +func (e *Err) Error() string { + return fmt.Sprintf("unexpected requesting %q status code: %d", + e.Response.Request.URL, e.Response.StatusCode, + ) +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go new file mode 100644 index 0000000000..4d14ff21ea --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go @@ -0,0 +1,110 @@ +package http + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +type rpSession struct { + *session +} + +func newReceivePackSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (transport.ReceivePackSession, error) { + s, err := newSession(c, ep, auth) + return &rpSession{s}, err +} + +func (s *rpSession) AdvertisedReferences() (*packp.AdvRefs, error) { + return advertisedReferences(context.TODO(), s.session, transport.ReceivePackServiceName) +} + +func (s *rpSession) AdvertisedReferencesContext(ctx context.Context) (*packp.AdvRefs, error) { + return advertisedReferences(ctx, s.session, transport.ReceivePackServiceName) +} + +func (s *rpSession) ReceivePack(ctx context.Context, req *packp.ReferenceUpdateRequest) ( + *packp.ReportStatus, error) { + url := fmt.Sprintf( + "%s/%s", + s.endpoint.String(), transport.ReceivePackServiceName, + ) + + buf := bytes.NewBuffer(nil) + if err := req.Encode(buf); err != nil { + return nil, err + } + + res, err := s.doRequest(ctx, http.MethodPost, url, buf) + if err != nil { + return nil, err + } + + r, err := ioutil.NonEmptyReader(res.Body) + if err == ioutil.ErrEmptyReader { + return nil, nil + } + + if err != nil { + return nil, err + } + + var d *sideband.Demuxer + if req.Capabilities.Supports(capability.Sideband64k) { + d = sideband.NewDemuxer(sideband.Sideband64k, r) + } else if req.Capabilities.Supports(capability.Sideband) { + d = sideband.NewDemuxer(sideband.Sideband, r) + } + if d != nil { + d.Progress = req.Progress + r = d + } + + rc := ioutil.NewReadCloser(r, res.Body) + + report := packp.NewReportStatus() + if err := report.Decode(rc); err != nil { + return nil, err + } + + return report, report.Error() +} + +func (s *rpSession) doRequest( + ctx context.Context, method, url string, content *bytes.Buffer, +) (*http.Response, error) { + + var body io.Reader + if content != nil { + body = content + } + + req, err := http.NewRequest(method, url, body) + if err != nil { + return nil, plumbing.NewPermanentError(err) + } + + applyHeadersToRequest(req, content, s.endpoint.Host, transport.ReceivePackServiceName) + s.ApplyAuthToRequest(req) + + res, err := s.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, plumbing.NewUnexpectedError(err) + } + + if err := NewErr(res); err != nil { + _ = res.Body.Close() + return nil, err + } + + return res, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go new file mode 100644 index 0000000000..e735b3d7c9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go @@ -0,0 +1,127 @@ +package http + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +type upSession struct { + *session +} + +func newUploadPackSession(c *http.Client, ep *transport.Endpoint, auth transport.AuthMethod) (transport.UploadPackSession, error) { + s, err := newSession(c, ep, auth) + return &upSession{s}, err +} + +func (s *upSession) AdvertisedReferences() (*packp.AdvRefs, error) { + return advertisedReferences(context.TODO(), s.session, transport.UploadPackServiceName) +} + +func (s *upSession) AdvertisedReferencesContext(ctx context.Context) (*packp.AdvRefs, error) { + return advertisedReferences(ctx, s.session, transport.UploadPackServiceName) +} + +func (s *upSession) UploadPack( + ctx context.Context, req *packp.UploadPackRequest, +) (*packp.UploadPackResponse, error) { + + if req.IsEmpty() { + return nil, transport.ErrEmptyUploadPackRequest + } + + if err := req.Validate(); err != nil { + return nil, err + } + + url := fmt.Sprintf( + "%s/%s", + s.endpoint.String(), transport.UploadPackServiceName, + ) + + content, err := uploadPackRequestToReader(req) + if err != nil { + return nil, err + } + + res, err := s.doRequest(ctx, http.MethodPost, url, content) + if err != nil { + return nil, err + } + + r, err := ioutil.NonEmptyReader(res.Body) + if err != nil { + if err == ioutil.ErrEmptyReader || err == io.ErrUnexpectedEOF { + return nil, transport.ErrEmptyUploadPackRequest + } + + return nil, err + } + + rc := ioutil.NewReadCloser(r, res.Body) + return common.DecodeUploadPackResponse(rc, req) +} + +// Close does nothing. +func (s *upSession) Close() error { + return nil +} + +func (s *upSession) doRequest( + ctx context.Context, method, url string, content *bytes.Buffer, +) (*http.Response, error) { + + var body io.Reader + if content != nil { + body = content + } + + req, err := http.NewRequest(method, url, body) + if err != nil { + return nil, plumbing.NewPermanentError(err) + } + + applyHeadersToRequest(req, content, s.endpoint.Host, transport.UploadPackServiceName) + s.ApplyAuthToRequest(req) + + res, err := s.client.Do(req.WithContext(ctx)) + if err != nil { + return nil, plumbing.NewUnexpectedError(err) + } + + if err := NewErr(res); err != nil { + _ = res.Body.Close() + return nil, err + } + + return res, nil +} + +func uploadPackRequestToReader(req *packp.UploadPackRequest) (*bytes.Buffer, error) { + buf := bytes.NewBuffer(nil) + e := pktline.NewEncoder(buf) + + if err := req.UploadRequest.Encode(buf); err != nil { + return nil, fmt.Errorf("sending upload-req message: %s", err) + } + + if err := req.UploadHaves.Encode(buf, false); err != nil { + return nil, fmt.Errorf("sending haves message: %s", err) + } + + if err := e.EncodeString("done\n"); err != nil { + return nil, err + } + + return buf, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go new file mode 100644 index 0000000000..fdb148f599 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go @@ -0,0 +1,478 @@ +// Package common implements the git pack protocol with a pluggable transport. +// This is a low-level package to implement new transports. Use a concrete +// implementation instead (e.g. http, file, ssh). +// +// A simple example of usage can be found in the file package. +package common + +import ( + "bufio" + "context" + "errors" + "fmt" + "io" + stdioutil "io/ioutil" + "strings" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +const ( + readErrorSecondsTimeout = 10 +) + +var ( + ErrTimeoutExceeded = errors.New("timeout exceeded") +) + +// Commander creates Command instances. This is the main entry point for +// transport implementations. +type Commander interface { + // Command creates a new Command for the given git command and + // endpoint. cmd can be git-upload-pack or git-receive-pack. An + // error should be returned if the endpoint is not supported or the + // command cannot be created (e.g. binary does not exist, connection + // cannot be established). + Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod) (Command, error) +} + +// Command is used for a single command execution. +// This interface is modeled after exec.Cmd and ssh.Session in the standard +// library. +type Command interface { + // StderrPipe returns a pipe that will be connected to the command's + // standard error when the command starts. It should not be called after + // Start. + StderrPipe() (io.Reader, error) + // StdinPipe returns a pipe that will be connected to the command's + // standard input when the command starts. It should not be called after + // Start. The pipe should be closed when no more input is expected. + StdinPipe() (io.WriteCloser, error) + // StdoutPipe returns a pipe that will be connected to the command's + // standard output when the command starts. It should not be called after + // Start. + StdoutPipe() (io.Reader, error) + // Start starts the specified command. It does not wait for it to + // complete. + Start() error + // Close closes the command and releases any resources used by it. It + // will block until the command exits. + Close() error +} + +// CommandKiller expands the Command interface, enabling it for being killed. +type CommandKiller interface { + // Kill and close the session whatever the state it is. It will block until + // the command is terminated. + Kill() error +} + +type client struct { + cmdr Commander +} + +// NewClient creates a new client using the given Commander. +func NewClient(runner Commander) transport.Transport { + return &client{runner} +} + +// NewUploadPackSession creates a new UploadPackSession. +func (c *client) NewUploadPackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( + transport.UploadPackSession, error) { + + return c.newSession(transport.UploadPackServiceName, ep, auth) +} + +// NewReceivePackSession creates a new ReceivePackSession. +func (c *client) NewReceivePackSession(ep *transport.Endpoint, auth transport.AuthMethod) ( + transport.ReceivePackSession, error) { + + return c.newSession(transport.ReceivePackServiceName, ep, auth) +} + +type session struct { + Stdin io.WriteCloser + Stdout io.Reader + Command Command + + isReceivePack bool + advRefs *packp.AdvRefs + packRun bool + finished bool + firstErrLine chan string +} + +func (c *client) newSession(s string, ep *transport.Endpoint, auth transport.AuthMethod) (*session, error) { + cmd, err := c.cmdr.Command(s, ep, auth) + if err != nil { + return nil, err + } + + stdin, err := cmd.StdinPipe() + if err != nil { + return nil, err + } + + stdout, err := cmd.StdoutPipe() + if err != nil { + return nil, err + } + + stderr, err := cmd.StderrPipe() + if err != nil { + return nil, err + } + + if err := cmd.Start(); err != nil { + return nil, err + } + + return &session{ + Stdin: stdin, + Stdout: stdout, + Command: cmd, + firstErrLine: c.listenFirstError(stderr), + isReceivePack: s == transport.ReceivePackServiceName, + }, nil +} + +func (c *client) listenFirstError(r io.Reader) chan string { + if r == nil { + return nil + } + + errLine := make(chan string, 1) + go func() { + s := bufio.NewScanner(r) + if s.Scan() { + errLine <- s.Text() + } else { + close(errLine) + } + + _, _ = io.Copy(stdioutil.Discard, r) + }() + + return errLine +} + +func (s *session) AdvertisedReferences() (*packp.AdvRefs, error) { + return s.AdvertisedReferencesContext(context.TODO()) +} + +// AdvertisedReferences retrieves the advertised references from the server. +func (s *session) AdvertisedReferencesContext(ctx context.Context) (*packp.AdvRefs, error) { + if s.advRefs != nil { + return s.advRefs, nil + } + + ar := packp.NewAdvRefs() + if err := ar.Decode(s.StdoutContext(ctx)); err != nil { + if err := s.handleAdvRefDecodeError(err); err != nil { + return nil, err + } + } + + // Some servers like jGit, announce capabilities instead of returning an + // packp message with a flush. This verifies that we received a empty + // adv-refs, even it contains capabilities. + if !s.isReceivePack && ar.IsEmpty() { + return nil, transport.ErrEmptyRemoteRepository + } + + transport.FilterUnsupportedCapabilities(ar.Capabilities) + s.advRefs = ar + return ar, nil +} + +func (s *session) handleAdvRefDecodeError(err error) error { + // If repository is not found, we get empty stdout and server writes an + // error to stderr. + if err == packp.ErrEmptyInput { + s.finished = true + if err := s.checkNotFoundError(); err != nil { + return err + } + + return io.ErrUnexpectedEOF + } + + // For empty (but existing) repositories, we get empty advertised-references + // message. But valid. That is, it includes at least a flush. + if err == packp.ErrEmptyAdvRefs { + // Empty repositories are valid for git-receive-pack. + if s.isReceivePack { + return nil + } + + if err := s.finish(); err != nil { + return err + } + + return transport.ErrEmptyRemoteRepository + } + + // Some server sends the errors as normal content (git protocol), so when + // we try to decode it fails, we need to check the content of it, to detect + // not found errors + if uerr, ok := err.(*packp.ErrUnexpectedData); ok { + if isRepoNotFoundError(string(uerr.Data)) { + return transport.ErrRepositoryNotFound + } + } + + return err +} + +// UploadPack performs a request to the server to fetch a packfile. A reader is +// returned with the packfile content. The reader must be closed after reading. +func (s *session) UploadPack(ctx context.Context, req *packp.UploadPackRequest) (*packp.UploadPackResponse, error) { + if req.IsEmpty() && len(req.Shallows) == 0 { + return nil, transport.ErrEmptyUploadPackRequest + } + + if err := req.Validate(); err != nil { + return nil, err + } + + if _, err := s.AdvertisedReferencesContext(ctx); err != nil { + return nil, err + } + + s.packRun = true + + in := s.StdinContext(ctx) + out := s.StdoutContext(ctx) + + if err := uploadPack(in, out, req); err != nil { + return nil, err + } + + r, err := ioutil.NonEmptyReader(out) + if err == ioutil.ErrEmptyReader { + if c, ok := s.Stdout.(io.Closer); ok { + _ = c.Close() + } + + return nil, transport.ErrEmptyUploadPackRequest + } + + if err != nil { + return nil, err + } + + rc := ioutil.NewReadCloser(r, s) + return DecodeUploadPackResponse(rc, req) +} + +func (s *session) StdinContext(ctx context.Context) io.WriteCloser { + return ioutil.NewWriteCloserOnError( + ioutil.NewContextWriteCloser(ctx, s.Stdin), + s.onError, + ) +} + +func (s *session) StdoutContext(ctx context.Context) io.Reader { + return ioutil.NewReaderOnError( + ioutil.NewContextReader(ctx, s.Stdout), + s.onError, + ) +} + +func (s *session) onError(err error) { + if k, ok := s.Command.(CommandKiller); ok { + _ = k.Kill() + } + + _ = s.Close() +} + +func (s *session) ReceivePack(ctx context.Context, req *packp.ReferenceUpdateRequest) (*packp.ReportStatus, error) { + if _, err := s.AdvertisedReferences(); err != nil { + return nil, err + } + + s.packRun = true + + w := s.StdinContext(ctx) + if err := req.Encode(w); err != nil { + return nil, err + } + + if err := w.Close(); err != nil { + return nil, err + } + + if !req.Capabilities.Supports(capability.ReportStatus) { + // If we don't have report-status, we can only + // check return value error. + return nil, s.Command.Close() + } + + r := s.StdoutContext(ctx) + + var d *sideband.Demuxer + if req.Capabilities.Supports(capability.Sideband64k) { + d = sideband.NewDemuxer(sideband.Sideband64k, r) + } else if req.Capabilities.Supports(capability.Sideband) { + d = sideband.NewDemuxer(sideband.Sideband, r) + } + if d != nil { + d.Progress = req.Progress + r = d + } + + report := packp.NewReportStatus() + if err := report.Decode(r); err != nil { + return nil, err + } + + if err := report.Error(); err != nil { + defer s.Close() + return report, err + } + + return report, s.Command.Close() +} + +func (s *session) finish() error { + if s.finished { + return nil + } + + s.finished = true + + // If we did not run a upload/receive-pack, we close the connection + // gracefully by sending a flush packet to the server. If the server + // operates correctly, it will exit with status 0. + if !s.packRun { + _, err := s.Stdin.Write(pktline.FlushPkt) + return err + } + + return nil +} + +func (s *session) Close() (err error) { + err = s.finish() + + defer ioutil.CheckClose(s.Command, &err) + return +} + +func (s *session) checkNotFoundError() error { + t := time.NewTicker(time.Second * readErrorSecondsTimeout) + defer t.Stop() + + select { + case <-t.C: + return ErrTimeoutExceeded + case line, ok := <-s.firstErrLine: + if !ok { + return nil + } + + if isRepoNotFoundError(line) { + return transport.ErrRepositoryNotFound + } + + return fmt.Errorf("unknown error: %s", line) + } +} + +var ( + githubRepoNotFoundErr = "ERROR: Repository not found." + bitbucketRepoNotFoundErr = "conq: repository does not exist." + localRepoNotFoundErr = "does not appear to be a git repository" + gitProtocolNotFoundErr = "ERR \n Repository not found." + gitProtocolNoSuchErr = "ERR no such repository" + gitProtocolAccessDeniedErr = "ERR access denied" + gogsAccessDeniedErr = "Gogs: Repository does not exist or you do not have access" +) + +func isRepoNotFoundError(s string) bool { + if strings.HasPrefix(s, githubRepoNotFoundErr) { + return true + } + + if strings.HasPrefix(s, bitbucketRepoNotFoundErr) { + return true + } + + if strings.HasSuffix(s, localRepoNotFoundErr) { + return true + } + + if strings.HasPrefix(s, gitProtocolNotFoundErr) { + return true + } + + if strings.HasPrefix(s, gitProtocolNoSuchErr) { + return true + } + + if strings.HasPrefix(s, gitProtocolAccessDeniedErr) { + return true + } + + if strings.HasPrefix(s, gogsAccessDeniedErr) { + return true + } + + return false +} + +var ( + nak = []byte("NAK") + eol = []byte("\n") +) + +// uploadPack implements the git-upload-pack protocol. +func uploadPack(w io.WriteCloser, r io.Reader, req *packp.UploadPackRequest) error { + // TODO support multi_ack mode + // TODO support multi_ack_detailed mode + // TODO support acks for common objects + // TODO build a proper state machine for all these processing options + + if err := req.UploadRequest.Encode(w); err != nil { + return fmt.Errorf("sending upload-req message: %s", err) + } + + if err := req.UploadHaves.Encode(w, true); err != nil { + return fmt.Errorf("sending haves message: %s", err) + } + + if err := sendDone(w); err != nil { + return fmt.Errorf("sending done message: %s", err) + } + + if err := w.Close(); err != nil { + return fmt.Errorf("closing input: %s", err) + } + + return nil +} + +func sendDone(w io.Writer) error { + e := pktline.NewEncoder(w) + + return e.Encodef("done\n") +} + +// DecodeUploadPackResponse decodes r into a new packp.UploadPackResponse +func DecodeUploadPackResponse(r io.ReadCloser, req *packp.UploadPackRequest) ( + *packp.UploadPackResponse, error, +) { + res := packp.NewUploadPackResponse(req) + if err := res.Decode(r); err != nil { + return nil, fmt.Errorf("error decoding upload-pack response: %s", err) + } + + return res, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/server.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/server.go new file mode 100644 index 0000000000..e2480848a4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/server.go @@ -0,0 +1,73 @@ +package common + +import ( + "context" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// ServerCommand is used for a single server command execution. +type ServerCommand struct { + Stderr io.Writer + Stdout io.WriteCloser + Stdin io.Reader +} + +func ServeUploadPack(cmd ServerCommand, s transport.UploadPackSession) (err error) { + ioutil.CheckClose(cmd.Stdout, &err) + + ar, err := s.AdvertisedReferences() + if err != nil { + return err + } + + if err := ar.Encode(cmd.Stdout); err != nil { + return err + } + + req := packp.NewUploadPackRequest() + if err := req.Decode(cmd.Stdin); err != nil { + return err + } + + var resp *packp.UploadPackResponse + resp, err = s.UploadPack(context.TODO(), req) + if err != nil { + return err + } + + return resp.Encode(cmd.Stdout) +} + +func ServeReceivePack(cmd ServerCommand, s transport.ReceivePackSession) error { + ar, err := s.AdvertisedReferences() + if err != nil { + return fmt.Errorf("internal error in advertised references: %s", err) + } + + if err := ar.Encode(cmd.Stdout); err != nil { + return fmt.Errorf("error in advertised references encoding: %s", err) + } + + req := packp.NewReferenceUpdateRequest() + if err := req.Decode(cmd.Stdin); err != nil { + return fmt.Errorf("error decoding: %s", err) + } + + rs, err := s.ReceivePack(context.TODO(), req) + if rs != nil { + if err := rs.Encode(cmd.Stdout); err != nil { + return fmt.Errorf("error in encoding report status %s", err) + } + } + + if err != nil { + return fmt.Errorf("error in receive pack: %s", err) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/loader.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/loader.go new file mode 100644 index 0000000000..e7e2b075e5 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/loader.go @@ -0,0 +1,64 @@ +package server + +import ( + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/storage/filesystem" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/osfs" +) + +// DefaultLoader is a filesystem loader ignoring host and resolving paths to /. +var DefaultLoader = NewFilesystemLoader(osfs.New("")) + +// Loader loads repository's storer.Storer based on an optional host and a path. +type Loader interface { + // Load loads a storer.Storer given a transport.Endpoint. + // Returns transport.ErrRepositoryNotFound if the repository does not + // exist. + Load(ep *transport.Endpoint) (storer.Storer, error) +} + +type fsLoader struct { + base billy.Filesystem +} + +// NewFilesystemLoader creates a Loader that ignores host and resolves paths +// with a given base filesystem. +func NewFilesystemLoader(base billy.Filesystem) Loader { + return &fsLoader{base} +} + +// Load looks up the endpoint's path in the base file system and returns a +// storer for it. Returns transport.ErrRepositoryNotFound if a repository does +// not exist in the given path. +func (l *fsLoader) Load(ep *transport.Endpoint) (storer.Storer, error) { + fs, err := l.base.Chroot(ep.Path) + if err != nil { + return nil, err + } + + if _, err := fs.Stat("config"); err != nil { + return nil, transport.ErrRepositoryNotFound + } + + return filesystem.NewStorage(fs, cache.NewObjectLRUDefault()), nil +} + +// MapLoader is a Loader that uses a lookup map of storer.Storer by +// transport.Endpoint. +type MapLoader map[string]storer.Storer + +// Load returns a storer.Storer for given a transport.Endpoint by looking it up +// in the map. Returns transport.ErrRepositoryNotFound if the endpoint does not +// exist. +func (l MapLoader) Load(ep *transport.Endpoint) (storer.Storer, error) { + s, ok := l[ep.String()] + if !ok { + return nil, transport.ErrRepositoryNotFound + } + + return s, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/server.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/server.go new file mode 100644 index 0000000000..8ab70fe707 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/server/server.go @@ -0,0 +1,432 @@ +// Package server implements the git server protocol. For most use cases, the +// transport-specific implementations should be used. +package server + +import ( + "context" + "errors" + "fmt" + "io" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/revlist" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var DefaultServer = NewServer(DefaultLoader) + +type server struct { + loader Loader + handler *handler +} + +// NewServer returns a transport.Transport implementing a git server, +// independent of transport. Each transport must wrap this. +func NewServer(loader Loader) transport.Transport { + return &server{ + loader, + &handler{asClient: false}, + } +} + +// NewClient returns a transport.Transport implementing a client with an +// embedded server. +func NewClient(loader Loader) transport.Transport { + return &server{ + loader, + &handler{asClient: true}, + } +} + +func (s *server) NewUploadPackSession(ep *transport.Endpoint, auth transport.AuthMethod) (transport.UploadPackSession, error) { + sto, err := s.loader.Load(ep) + if err != nil { + return nil, err + } + + return s.handler.NewUploadPackSession(sto) +} + +func (s *server) NewReceivePackSession(ep *transport.Endpoint, auth transport.AuthMethod) (transport.ReceivePackSession, error) { + sto, err := s.loader.Load(ep) + if err != nil { + return nil, err + } + + return s.handler.NewReceivePackSession(sto) +} + +type handler struct { + asClient bool +} + +func (h *handler) NewUploadPackSession(s storer.Storer) (transport.UploadPackSession, error) { + return &upSession{ + session: session{storer: s, asClient: h.asClient}, + }, nil +} + +func (h *handler) NewReceivePackSession(s storer.Storer) (transport.ReceivePackSession, error) { + return &rpSession{ + session: session{storer: s, asClient: h.asClient}, + cmdStatus: map[plumbing.ReferenceName]error{}, + }, nil +} + +type session struct { + storer storer.Storer + caps *capability.List + asClient bool +} + +func (s *session) Close() error { + return nil +} + +func (s *session) SetAuth(transport.AuthMethod) error { + //TODO: deprecate + return nil +} + +func (s *session) checkSupportedCapabilities(cl *capability.List) error { + for _, c := range cl.All() { + if !s.caps.Supports(c) { + return fmt.Errorf("unsupported capability: %s", c) + } + } + + return nil +} + +type upSession struct { + session +} + +func (s *upSession) AdvertisedReferences() (*packp.AdvRefs, error) { + return s.AdvertisedReferencesContext(context.TODO()) +} + +func (s *upSession) AdvertisedReferencesContext(ctx context.Context) (*packp.AdvRefs, error) { + ar := packp.NewAdvRefs() + + if err := s.setSupportedCapabilities(ar.Capabilities); err != nil { + return nil, err + } + + s.caps = ar.Capabilities + + if err := setReferences(s.storer, ar); err != nil { + return nil, err + } + + if err := setHEAD(s.storer, ar); err != nil { + return nil, err + } + + if s.asClient && len(ar.References) == 0 { + return nil, transport.ErrEmptyRemoteRepository + } + + return ar, nil +} + +func (s *upSession) UploadPack(ctx context.Context, req *packp.UploadPackRequest) (*packp.UploadPackResponse, error) { + if req.IsEmpty() { + return nil, transport.ErrEmptyUploadPackRequest + } + + if err := req.Validate(); err != nil { + return nil, err + } + + if s.caps == nil { + s.caps = capability.NewList() + if err := s.setSupportedCapabilities(s.caps); err != nil { + return nil, err + } + } + + if err := s.checkSupportedCapabilities(req.Capabilities); err != nil { + return nil, err + } + + s.caps = req.Capabilities + + if len(req.Shallows) > 0 { + return nil, fmt.Errorf("shallow not supported") + } + + objs, err := s.objectsToUpload(req) + if err != nil { + return nil, err + } + + pr, pw := ioutil.Pipe() + e := packfile.NewEncoder(pw, s.storer, false) + go func() { + // TODO: plumb through a pack window. + _, err := e.Encode(objs, 10) + pw.CloseWithError(err) + }() + + return packp.NewUploadPackResponseWithPackfile(req, + ioutil.NewContextReadCloser(ctx, pr), + ), nil +} + +func (s *upSession) objectsToUpload(req *packp.UploadPackRequest) ([]plumbing.Hash, error) { + haves, err := revlist.Objects(s.storer, req.Haves, nil) + if err != nil { + return nil, err + } + + return revlist.Objects(s.storer, req.Wants, haves) +} + +func (*upSession) setSupportedCapabilities(c *capability.List) error { + if err := c.Set(capability.Agent, capability.DefaultAgent); err != nil { + return err + } + + if err := c.Set(capability.OFSDelta); err != nil { + return err + } + + return nil +} + +type rpSession struct { + session + cmdStatus map[plumbing.ReferenceName]error + firstErr error + unpackErr error +} + +func (s *rpSession) AdvertisedReferences() (*packp.AdvRefs, error) { + return s.AdvertisedReferencesContext(context.TODO()) +} + +func (s *rpSession) AdvertisedReferencesContext(ctx context.Context) (*packp.AdvRefs, error) { + ar := packp.NewAdvRefs() + + if err := s.setSupportedCapabilities(ar.Capabilities); err != nil { + return nil, err + } + + s.caps = ar.Capabilities + + if err := setReferences(s.storer, ar); err != nil { + return nil, err + } + + if err := setHEAD(s.storer, ar); err != nil { + return nil, err + } + + return ar, nil +} + +var ( + ErrUpdateReference = errors.New("failed to update ref") +) + +func (s *rpSession) ReceivePack(ctx context.Context, req *packp.ReferenceUpdateRequest) (*packp.ReportStatus, error) { + if s.caps == nil { + s.caps = capability.NewList() + if err := s.setSupportedCapabilities(s.caps); err != nil { + return nil, err + } + } + + if err := s.checkSupportedCapabilities(req.Capabilities); err != nil { + return nil, err + } + + s.caps = req.Capabilities + + //TODO: Implement 'atomic' update of references. + + if req.Packfile != nil { + r := ioutil.NewContextReadCloser(ctx, req.Packfile) + if err := s.writePackfile(r); err != nil { + s.unpackErr = err + s.firstErr = err + return s.reportStatus(), err + } + } + + s.updateReferences(req) + return s.reportStatus(), s.firstErr +} + +func (s *rpSession) updateReferences(req *packp.ReferenceUpdateRequest) { + for _, cmd := range req.Commands { + exists, err := referenceExists(s.storer, cmd.Name) + if err != nil { + s.setStatus(cmd.Name, err) + continue + } + + switch cmd.Action() { + case packp.Create: + if exists { + s.setStatus(cmd.Name, ErrUpdateReference) + continue + } + + ref := plumbing.NewHashReference(cmd.Name, cmd.New) + err := s.storer.SetReference(ref) + s.setStatus(cmd.Name, err) + case packp.Delete: + if !exists { + s.setStatus(cmd.Name, ErrUpdateReference) + continue + } + + err := s.storer.RemoveReference(cmd.Name) + s.setStatus(cmd.Name, err) + case packp.Update: + if !exists { + s.setStatus(cmd.Name, ErrUpdateReference) + continue + } + + ref := plumbing.NewHashReference(cmd.Name, cmd.New) + err := s.storer.SetReference(ref) + s.setStatus(cmd.Name, err) + } + } +} + +func (s *rpSession) writePackfile(r io.ReadCloser) error { + if r == nil { + return nil + } + + if err := packfile.UpdateObjectStorage(s.storer, r); err != nil { + _ = r.Close() + return err + } + + return r.Close() +} + +func (s *rpSession) setStatus(ref plumbing.ReferenceName, err error) { + s.cmdStatus[ref] = err + if s.firstErr == nil && err != nil { + s.firstErr = err + } +} + +func (s *rpSession) reportStatus() *packp.ReportStatus { + if !s.caps.Supports(capability.ReportStatus) { + return nil + } + + rs := packp.NewReportStatus() + rs.UnpackStatus = "ok" + + if s.unpackErr != nil { + rs.UnpackStatus = s.unpackErr.Error() + } + + if s.cmdStatus == nil { + return rs + } + + for ref, err := range s.cmdStatus { + msg := "ok" + if err != nil { + msg = err.Error() + } + status := &packp.CommandStatus{ + ReferenceName: ref, + Status: msg, + } + rs.CommandStatuses = append(rs.CommandStatuses, status) + } + + return rs +} + +func (*rpSession) setSupportedCapabilities(c *capability.List) error { + if err := c.Set(capability.Agent, capability.DefaultAgent); err != nil { + return err + } + + if err := c.Set(capability.OFSDelta); err != nil { + return err + } + + if err := c.Set(capability.DeleteRefs); err != nil { + return err + } + + return c.Set(capability.ReportStatus) +} + +func setHEAD(s storer.Storer, ar *packp.AdvRefs) error { + ref, err := s.Reference(plumbing.HEAD) + if err == plumbing.ErrReferenceNotFound { + return nil + } + + if err != nil { + return err + } + + if ref.Type() == plumbing.SymbolicReference { + if err := ar.AddReference(ref); err != nil { + return nil + } + + ref, err = storer.ResolveReference(s, ref.Target()) + if err == plumbing.ErrReferenceNotFound { + return nil + } + + if err != nil { + return err + } + } + + if ref.Type() != plumbing.HashReference { + return plumbing.ErrInvalidType + } + + h := ref.Hash() + ar.Head = &h + + return nil +} + +func setReferences(s storer.Storer, ar *packp.AdvRefs) error { + //TODO: add peeled references. + iter, err := s.IterReferences() + if err != nil { + return err + } + + return iter.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() != plumbing.HashReference { + return nil + } + + ar.References[ref.Name().String()] = ref.Hash() + return nil + }) +} + +func referenceExists(s storer.ReferenceStorer, n plumbing.ReferenceName) (bool, error) { + _, err := s.Reference(n) + if err == plumbing.ErrReferenceNotFound { + return false, nil + } + + return err == nil, err +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go new file mode 100644 index 0000000000..3514669546 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go @@ -0,0 +1,308 @@ +package ssh + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "os/user" + "path/filepath" + + "github.com/go-git/go-git/v5/plumbing/transport" + + "github.com/mitchellh/go-homedir" + sshagent "github.com/xanzy/ssh-agent" + "golang.org/x/crypto/ssh" + "golang.org/x/crypto/ssh/knownhosts" +) + +const DefaultUsername = "git" + +// AuthMethod is the interface all auth methods for the ssh client +// must implement. The clientConfig method returns the ssh client +// configuration needed to establish an ssh connection. +type AuthMethod interface { + transport.AuthMethod + // ClientConfig should return a valid ssh.ClientConfig to be used to create + // a connection to the SSH server. + ClientConfig() (*ssh.ClientConfig, error) +} + +// The names of the AuthMethod implementations. To be returned by the +// Name() method. Most git servers only allow PublicKeysName and +// PublicKeysCallbackName. +const ( + KeyboardInteractiveName = "ssh-keyboard-interactive" + PasswordName = "ssh-password" + PasswordCallbackName = "ssh-password-callback" + PublicKeysName = "ssh-public-keys" + PublicKeysCallbackName = "ssh-public-key-callback" +) + +// KeyboardInteractive implements AuthMethod by using a +// prompt/response sequence controlled by the server. +type KeyboardInteractive struct { + User string + Challenge ssh.KeyboardInteractiveChallenge + HostKeyCallbackHelper +} + +func (a *KeyboardInteractive) Name() string { + return KeyboardInteractiveName +} + +func (a *KeyboardInteractive) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *KeyboardInteractive) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ + a.Challenge, + }, + }) +} + +// Password implements AuthMethod by using the given password. +type Password struct { + User string + Password string + HostKeyCallbackHelper +} + +func (a *Password) Name() string { + return PasswordName +} + +func (a *Password) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *Password) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ssh.Password(a.Password)}, + }) +} + +// PasswordCallback implements AuthMethod by using a callback +// to fetch the password. +type PasswordCallback struct { + User string + Callback func() (pass string, err error) + HostKeyCallbackHelper +} + +func (a *PasswordCallback) Name() string { + return PasswordCallbackName +} + +func (a *PasswordCallback) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *PasswordCallback) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ssh.PasswordCallback(a.Callback)}, + }) +} + +// PublicKeys implements AuthMethod by using the given key pairs. +type PublicKeys struct { + User string + Signer ssh.Signer + HostKeyCallbackHelper +} + +// NewPublicKeys returns a PublicKeys from a PEM encoded private key. An +// encryption password should be given if the pemBytes contains a password +// encrypted PEM block otherwise password should be empty. It supports RSA +// (PKCS#1), PKCS#8, DSA (OpenSSL), and ECDSA private keys. +func NewPublicKeys(user string, pemBytes []byte, password string) (*PublicKeys, error) { + signer, err := ssh.ParsePrivateKey(pemBytes) + if _, ok := err.(*ssh.PassphraseMissingError); ok { + signer, err = ssh.ParsePrivateKeyWithPassphrase(pemBytes, []byte(password)) + } + if err != nil { + return nil, err + } + return &PublicKeys{User: user, Signer: signer}, nil +} + +// NewPublicKeysFromFile returns a PublicKeys from a file containing a PEM +// encoded private key. An encryption password should be given if the pemBytes +// contains a password encrypted PEM block otherwise password should be empty. +func NewPublicKeysFromFile(user, pemFile, password string) (*PublicKeys, error) { + bytes, err := ioutil.ReadFile(pemFile) + if err != nil { + return nil, err + } + + return NewPublicKeys(user, bytes, password) +} + +func (a *PublicKeys) Name() string { + return PublicKeysName +} + +func (a *PublicKeys) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *PublicKeys) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ssh.PublicKeys(a.Signer)}, + }) +} + +func username() (string, error) { + var username string + if user, err := user.Current(); err == nil { + username = user.Username + } else { + username = os.Getenv("USER") + } + + if username == "" { + return "", errors.New("failed to get username") + } + + return username, nil +} + +// PublicKeysCallback implements AuthMethod by asking a +// ssh.agent.Agent to act as a signer. +type PublicKeysCallback struct { + User string + Callback func() (signers []ssh.Signer, err error) + HostKeyCallbackHelper +} + +// NewSSHAgentAuth returns a PublicKeysCallback based on a SSH agent, it opens +// a pipe with the SSH agent and uses the pipe as the implementer of the public +// key callback function. +func NewSSHAgentAuth(u string) (*PublicKeysCallback, error) { + var err error + if u == "" { + u, err = username() + if err != nil { + return nil, err + } + } + + a, _, err := sshagent.New() + if err != nil { + return nil, fmt.Errorf("error creating SSH agent: %q", err) + } + + return &PublicKeysCallback{ + User: u, + Callback: a.Signers, + }, nil +} + +func (a *PublicKeysCallback) Name() string { + return PublicKeysCallbackName +} + +func (a *PublicKeysCallback) String() string { + return fmt.Sprintf("user: %s, name: %s", a.User, a.Name()) +} + +func (a *PublicKeysCallback) ClientConfig() (*ssh.ClientConfig, error) { + return a.SetHostKeyCallback(&ssh.ClientConfig{ + User: a.User, + Auth: []ssh.AuthMethod{ssh.PublicKeysCallback(a.Callback)}, + }) +} + +// NewKnownHostsCallback returns ssh.HostKeyCallback based on a file based on a +// known_hosts file. http://man.openbsd.org/sshd#SSH_KNOWN_HOSTS_FILE_FORMAT +// +// If list of files is empty, then it will be read from the SSH_KNOWN_HOSTS +// environment variable, example: +// /home/foo/custom_known_hosts_file:/etc/custom_known/hosts_file +// +// If SSH_KNOWN_HOSTS is not set the following file locations will be used: +// ~/.ssh/known_hosts +// /etc/ssh/ssh_known_hosts +func NewKnownHostsCallback(files ...string) (ssh.HostKeyCallback, error) { + var err error + + if len(files) == 0 { + if files, err = getDefaultKnownHostsFiles(); err != nil { + return nil, err + } + } + + if files, err = filterKnownHostsFiles(files...); err != nil { + return nil, err + } + + return knownhosts.New(files...) +} + +func getDefaultKnownHostsFiles() ([]string, error) { + files := filepath.SplitList(os.Getenv("SSH_KNOWN_HOSTS")) + if len(files) != 0 { + return files, nil + } + + homeDirPath, err := homedir.Dir() + if err != nil { + return nil, err + } + + return []string{ + filepath.Join(homeDirPath, "/.ssh/known_hosts"), + "/etc/ssh/ssh_known_hosts", + }, nil +} + +func filterKnownHostsFiles(files ...string) ([]string, error) { + var out []string + for _, file := range files { + _, err := os.Stat(file) + if err == nil { + out = append(out, file) + continue + } + + if !os.IsNotExist(err) { + return nil, err + } + } + + if len(out) == 0 { + return nil, fmt.Errorf("unable to find any valid known_hosts file, set SSH_KNOWN_HOSTS env variable") + } + + return out, nil +} + +// HostKeyCallbackHelper is a helper that provides common functionality to +// configure HostKeyCallback into a ssh.ClientConfig. +type HostKeyCallbackHelper struct { + // HostKeyCallback is the function type used for verifying server keys. + // If nil default callback will be create using NewKnownHostsCallback + // without argument. + HostKeyCallback ssh.HostKeyCallback +} + +// SetHostKeyCallback sets the field HostKeyCallback in the given cfg. If +// HostKeyCallback is empty a default callback is created using +// NewKnownHostsCallback. +func (m *HostKeyCallbackHelper) SetHostKeyCallback(cfg *ssh.ClientConfig) (*ssh.ClientConfig, error) { + var err error + if m.HostKeyCallback == nil { + if m.HostKeyCallback, err = NewKnownHostsCallback(); err != nil { + return cfg, err + } + } + + cfg.HostKeyCallback = m.HostKeyCallback + return cfg, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go new file mode 100644 index 0000000000..46e79134c3 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go @@ -0,0 +1,235 @@ +// Package ssh implements the SSH transport protocol. +package ssh + +import ( + "context" + "fmt" + "reflect" + "strconv" + "strings" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/internal/common" + + "github.com/kevinburke/ssh_config" + "golang.org/x/crypto/ssh" + "golang.org/x/net/proxy" +) + +// DefaultClient is the default SSH client. +var DefaultClient = NewClient(nil) + +// DefaultSSHConfig is the reader used to access parameters stored in the +// system's ssh_config files. If nil all the ssh_config are ignored. +var DefaultSSHConfig sshConfig = ssh_config.DefaultUserSettings + +type sshConfig interface { + Get(alias, key string) string +} + +// NewClient creates a new SSH client with an optional *ssh.ClientConfig. +func NewClient(config *ssh.ClientConfig) transport.Transport { + return common.NewClient(&runner{config: config}) +} + +// DefaultAuthBuilder is the function used to create a default AuthMethod, when +// the user doesn't provide any. +var DefaultAuthBuilder = func(user string) (AuthMethod, error) { + return NewSSHAgentAuth(user) +} + +const DefaultPort = 22 + +type runner struct { + config *ssh.ClientConfig +} + +func (r *runner) Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod) (common.Command, error) { + c := &command{command: cmd, endpoint: ep, config: r.config} + if auth != nil { + c.setAuth(auth) + } + + if err := c.connect(); err != nil { + return nil, err + } + return c, nil +} + +type command struct { + *ssh.Session + connected bool + command string + endpoint *transport.Endpoint + client *ssh.Client + auth AuthMethod + config *ssh.ClientConfig +} + +func (c *command) setAuth(auth transport.AuthMethod) error { + a, ok := auth.(AuthMethod) + if !ok { + return transport.ErrInvalidAuthMethod + } + + c.auth = a + return nil +} + +func (c *command) Start() error { + return c.Session.Start(endpointToCommand(c.command, c.endpoint)) +} + +// Close closes the SSH session and connection. +func (c *command) Close() error { + if !c.connected { + return nil + } + + c.connected = false + + //XXX: If did read the full packfile, then the session might be already + // closed. + _ = c.Session.Close() + err := c.client.Close() + + //XXX: in go1.16+ we can use errors.Is(err, net.ErrClosed) + if err != nil && strings.HasSuffix(err.Error(), "use of closed network connection") { + return nil + } + + return err +} + +// connect connects to the SSH server, unless a AuthMethod was set with +// SetAuth method, by default uses an auth method based on PublicKeysCallback, +// it connects to a SSH agent, using the address stored in the SSH_AUTH_SOCK +// environment var. +func (c *command) connect() error { + if c.connected { + return transport.ErrAlreadyConnected + } + + if c.auth == nil { + if err := c.setAuthFromEndpoint(); err != nil { + return err + } + } + + var err error + config, err := c.auth.ClientConfig() + if err != nil { + return err + } + + overrideConfig(c.config, config) + + c.client, err = dial("tcp", c.getHostWithPort(), config) + if err != nil { + return err + } + + c.Session, err = c.client.NewSession() + if err != nil { + _ = c.client.Close() + return err + } + + c.connected = true + return nil +} + +func dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) { + var ( + ctx = context.Background() + cancel context.CancelFunc + ) + if config.Timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, config.Timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + conn, err := proxy.Dial(ctx, network, addr) + if err != nil { + return nil, err + } + c, chans, reqs, err := ssh.NewClientConn(conn, addr, config) + if err != nil { + return nil, err + } + return ssh.NewClient(c, chans, reqs), nil +} + +func (c *command) getHostWithPort() string { + if addr, found := c.doGetHostWithPortFromSSHConfig(); found { + return addr + } + + host := c.endpoint.Host + port := c.endpoint.Port + if port <= 0 { + port = DefaultPort + } + + return fmt.Sprintf("%s:%d", host, port) +} + +func (c *command) doGetHostWithPortFromSSHConfig() (addr string, found bool) { + if DefaultSSHConfig == nil { + return + } + + host := c.endpoint.Host + port := c.endpoint.Port + + configHost := DefaultSSHConfig.Get(c.endpoint.Host, "Hostname") + if configHost != "" { + host = configHost + found = true + } + + if !found { + return + } + + configPort := DefaultSSHConfig.Get(c.endpoint.Host, "Port") + if configPort != "" { + if i, err := strconv.Atoi(configPort); err == nil { + port = i + } + } + + addr = fmt.Sprintf("%s:%d", host, port) + return +} + +func (c *command) setAuthFromEndpoint() error { + var err error + c.auth, err = DefaultAuthBuilder(c.endpoint.User) + return err +} + +func endpointToCommand(cmd string, ep *transport.Endpoint) string { + return fmt.Sprintf("%s '%s'", cmd, ep.Path) +} + +func overrideConfig(overrides *ssh.ClientConfig, c *ssh.ClientConfig) { + if overrides == nil { + return + } + + t := reflect.TypeOf(*c) + vc := reflect.ValueOf(c).Elem() + vo := reflect.ValueOf(overrides).Elem() + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + vcf := vc.FieldByName(f.Name) + vof := vo.FieldByName(f.Name) + vcf.Set(vof) + } + + *c = vc.Interface().(ssh.ClientConfig) +} diff --git a/vendor/github.com/go-git/go-git/v5/prune.go b/vendor/github.com/go-git/go-git/v5/prune.go new file mode 100644 index 0000000000..cc5907a142 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/prune.go @@ -0,0 +1,66 @@ +package git + +import ( + "errors" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +type PruneHandler func(unreferencedObjectHash plumbing.Hash) error +type PruneOptions struct { + // OnlyObjectsOlderThan if set to non-zero value + // selects only objects older than the time provided. + OnlyObjectsOlderThan time.Time + // Handler is called on matching objects + Handler PruneHandler +} + +var ErrLooseObjectsNotSupported = errors.New("Loose objects not supported") + +// DeleteObject deletes an object from a repository. +// The type conveniently matches PruneHandler. +func (r *Repository) DeleteObject(hash plumbing.Hash) error { + los, ok := r.Storer.(storer.LooseObjectStorer) + if !ok { + return ErrLooseObjectsNotSupported + } + + return los.DeleteLooseObject(hash) +} + +func (r *Repository) Prune(opt PruneOptions) error { + los, ok := r.Storer.(storer.LooseObjectStorer) + if !ok { + return ErrLooseObjectsNotSupported + } + + pw := newObjectWalker(r.Storer) + err := pw.walkAllRefs() + if err != nil { + return err + } + // Now walk all (loose) objects in storage. + return los.ForEachObjectHash(func(hash plumbing.Hash) error { + // Get out if we have seen this object. + if pw.isSeen(hash) { + return nil + } + // Otherwise it is a candidate for pruning. + // Check out for too new objects next. + if !opt.OnlyObjectsOlderThan.IsZero() { + // Errors here are non-fatal. The object may be e.g. packed. + // Or concurrently deleted. Skip such objects. + t, err := los.LooseObjectTime(hash) + if err != nil { + return nil + } + // Skip too new objects. + if !t.Before(opt.OnlyObjectsOlderThan) { + return nil + } + } + return opt.Handler(hash) + }) +} diff --git a/vendor/github.com/go-git/go-git/v5/references.go b/vendor/github.com/go-git/go-git/v5/references.go new file mode 100644 index 0000000000..6d96035afa --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/references.go @@ -0,0 +1,264 @@ +package git + +import ( + "io" + "sort" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/utils/diff" + + "github.com/sergi/go-diff/diffmatchpatch" +) + +// References returns a slice of Commits for the file at "path", starting from +// the commit provided that contains the file from the provided path. The last +// commit into the returned slice is the commit where the file was created. +// If the provided commit does not contains the specified path, a nil slice is +// returned. The commits are sorted in commit order, newer to older. +// +// Caveats: +// +// - Moves and copies are not currently supported. +// +// - Cherry-picks are not detected unless there are no commits between them and +// therefore can appear repeated in the list. (see git path-id for hints on how +// to fix this). +func references(c *object.Commit, path string) ([]*object.Commit, error) { + var result []*object.Commit + seen := make(map[plumbing.Hash]struct{}) + if err := walkGraph(&result, &seen, c, path); err != nil { + return nil, err + } + + // TODO result should be returned without ordering + sortCommits(result) + + // for merges of identical cherry-picks + return removeComp(path, result, equivalent) +} + +type commitSorterer struct { + l []*object.Commit +} + +func (s commitSorterer) Len() int { + return len(s.l) +} + +func (s commitSorterer) Less(i, j int) bool { + return s.l[i].Committer.When.Before(s.l[j].Committer.When) || + s.l[i].Committer.When.Equal(s.l[j].Committer.When) && + s.l[i].Author.When.Before(s.l[j].Author.When) +} + +func (s commitSorterer) Swap(i, j int) { + s.l[i], s.l[j] = s.l[j], s.l[i] +} + +// SortCommits sorts a commit list by commit date, from older to newer. +func sortCommits(l []*object.Commit) { + s := &commitSorterer{l} + sort.Sort(s) +} + +// Recursive traversal of the commit graph, generating a linear history of the +// path. +func walkGraph(result *[]*object.Commit, seen *map[plumbing.Hash]struct{}, current *object.Commit, path string) error { + // check and update seen + if _, ok := (*seen)[current.Hash]; ok { + return nil + } + (*seen)[current.Hash] = struct{}{} + + // if the path is not in the current commit, stop searching. + if _, err := current.File(path); err != nil { + return nil + } + + // optimization: don't traverse branches that does not + // contain the path. + parents, err := parentsContainingPath(path, current) + if err != nil { + return err + } + switch len(parents) { + // if the path is not found in any of its parents, the path was + // created by this commit; we must add it to the revisions list and + // stop searching. This includes the case when current is the + // initial commit. + case 0: + *result = append(*result, current) + return nil + case 1: // only one parent contains the path + // if the file contents has change, add the current commit + different, err := differentContents(path, current, parents) + if err != nil { + return err + } + if len(different) == 1 { + *result = append(*result, current) + } + // in any case, walk the parent + return walkGraph(result, seen, parents[0], path) + default: // more than one parent contains the path + // TODO: detect merges that had a conflict, because they must be + // included in the result here. + for _, p := range parents { + err := walkGraph(result, seen, p, path) + if err != nil { + return err + } + } + } + return nil +} + +func parentsContainingPath(path string, c *object.Commit) ([]*object.Commit, error) { + // TODO: benchmark this method making git.object.Commit.parent public instead of using + // an iterator + var result []*object.Commit + iter := c.Parents() + for { + parent, err := iter.Next() + if err == io.EOF { + return result, nil + } + if err != nil { + return nil, err + } + if _, err := parent.File(path); err == nil { + result = append(result, parent) + } + } +} + +// Returns an slice of the commits in "cs" that has the file "path", but with different +// contents than what can be found in "c". +func differentContents(path string, c *object.Commit, cs []*object.Commit) ([]*object.Commit, error) { + result := make([]*object.Commit, 0, len(cs)) + h, found := blobHash(path, c) + if !found { + return nil, object.ErrFileNotFound + } + for _, cx := range cs { + if hx, found := blobHash(path, cx); found && h != hx { + result = append(result, cx) + } + } + return result, nil +} + +// blobHash returns the hash of a path in a commit +func blobHash(path string, commit *object.Commit) (hash plumbing.Hash, found bool) { + file, err := commit.File(path) + if err != nil { + var empty plumbing.Hash + return empty, found + } + return file.Hash, true +} + +type contentsComparatorFn func(path string, a, b *object.Commit) (bool, error) + +// Returns a new slice of commits, with duplicates removed. Expects a +// sorted commit list. Duplication is defined according to "comp". It +// will always keep the first commit of a series of duplicated commits. +func removeComp(path string, cs []*object.Commit, comp contentsComparatorFn) ([]*object.Commit, error) { + result := make([]*object.Commit, 0, len(cs)) + if len(cs) == 0 { + return result, nil + } + result = append(result, cs[0]) + for i := 1; i < len(cs); i++ { + equals, err := comp(path, cs[i], cs[i-1]) + if err != nil { + return nil, err + } + if !equals { + result = append(result, cs[i]) + } + } + return result, nil +} + +// Equivalent commits are commits whose patch is the same. +func equivalent(path string, a, b *object.Commit) (bool, error) { + numParentsA := a.NumParents() + numParentsB := b.NumParents() + + // the first commit is not equivalent to anyone + // and "I think" merges can not be equivalent to anything + if numParentsA != 1 || numParentsB != 1 { + return false, nil + } + + diffsA, err := patch(a, path) + if err != nil { + return false, err + } + diffsB, err := patch(b, path) + if err != nil { + return false, err + } + + return sameDiffs(diffsA, diffsB), nil +} + +func patch(c *object.Commit, path string) ([]diffmatchpatch.Diff, error) { + // get contents of the file in the commit + file, err := c.File(path) + if err != nil { + return nil, err + } + content, err := file.Contents() + if err != nil { + return nil, err + } + + // get contents of the file in the first parent of the commit + var contentParent string + iter := c.Parents() + parent, err := iter.Next() + if err != nil { + return nil, err + } + file, err = parent.File(path) + if err != nil { + contentParent = "" + } else { + contentParent, err = file.Contents() + if err != nil { + return nil, err + } + } + + // compare the contents of parent and child + return diff.Do(content, contentParent), nil +} + +func sameDiffs(a, b []diffmatchpatch.Diff) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if !sameDiff(a[i], b[i]) { + return false + } + } + return true +} + +func sameDiff(a, b diffmatchpatch.Diff) bool { + if a.Type != b.Type { + return false + } + switch a.Type { + case 0: + return countLines(a.Text) == countLines(b.Text) + case 1, -1: + return a.Text == b.Text + default: + panic("unreachable") + } +} diff --git a/vendor/github.com/go-git/go-git/v5/remote.go b/vendor/github.com/go-git/go-git/v5/remote.go new file mode 100644 index 0000000000..4a06106c53 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/remote.go @@ -0,0 +1,1262 @@ +package git + +import ( + "context" + "errors" + "fmt" + "io" + "time" + + "github.com/go-git/go-billy/v5/osfs" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" + "github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband" + "github.com/go-git/go-git/v5/plumbing/revlist" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/client" + "github.com/go-git/go-git/v5/storage" + "github.com/go-git/go-git/v5/storage/filesystem" + "github.com/go-git/go-git/v5/storage/memory" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +var ( + NoErrAlreadyUpToDate = errors.New("already up-to-date") + ErrDeleteRefNotSupported = errors.New("server does not support delete-refs") + ErrForceNeeded = errors.New("some refs were not updated") + ErrExactSHA1NotSupported = errors.New("server does not support exact SHA1 refspec") +) + +type NoMatchingRefSpecError struct { + refSpec config.RefSpec +} + +func (e NoMatchingRefSpecError) Error() string { + return fmt.Sprintf("couldn't find remote ref %q", e.refSpec.Src()) +} + +func (e NoMatchingRefSpecError) Is(target error) bool { + _, ok := target.(NoMatchingRefSpecError) + return ok +} + +const ( + // This describes the maximum number of commits to walk when + // computing the haves to send to a server, for each ref in the + // repo containing this remote, when not using the multi-ack + // protocol. Setting this to 0 means there is no limit. + maxHavesToVisitPerRef = 100 +) + +// Remote represents a connection to a remote repository. +type Remote struct { + c *config.RemoteConfig + s storage.Storer +} + +// NewRemote creates a new Remote. +// The intended purpose is to use the Remote for tasks such as listing remote references (like using git ls-remote). +// Otherwise Remotes should be created via the use of a Repository. +func NewRemote(s storage.Storer, c *config.RemoteConfig) *Remote { + return &Remote{s: s, c: c} +} + +// Config returns the RemoteConfig object used to instantiate this Remote. +func (r *Remote) Config() *config.RemoteConfig { + return r.c +} + +func (r *Remote) String() string { + var fetch, push string + if len(r.c.URLs) > 0 { + fetch = r.c.URLs[0] + push = r.c.URLs[0] + } + + return fmt.Sprintf("%s\t%s (fetch)\n%[1]s\t%[3]s (push)", r.c.Name, fetch, push) +} + +// Push performs a push to the remote. Returns NoErrAlreadyUpToDate if the +// remote was already up-to-date. +func (r *Remote) Push(o *PushOptions) error { + return r.PushContext(context.Background(), o) +} + +// PushContext performs a push to the remote. Returns NoErrAlreadyUpToDate if +// the remote was already up-to-date. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +func (r *Remote) PushContext(ctx context.Context, o *PushOptions) (err error) { + if err := o.Validate(); err != nil { + return err + } + + if o.RemoteName != r.c.Name { + return fmt.Errorf("remote names don't match: %s != %s", o.RemoteName, r.c.Name) + } + + s, err := newSendPackSession(r.c.URLs[0], o.Auth, o.InsecureSkipTLS, o.CABundle) + if err != nil { + return err + } + + defer ioutil.CheckClose(s, &err) + + ar, err := s.AdvertisedReferencesContext(ctx) + if err != nil { + return err + } + + remoteRefs, err := ar.AllReferences() + if err != nil { + return err + } + + if err := r.checkRequireRemoteRefs(o.RequireRemoteRefs, remoteRefs); err != nil { + return err + } + + isDelete := false + allDelete := true + for _, rs := range o.RefSpecs { + if rs.IsDelete() { + isDelete = true + } else { + allDelete = false + } + if isDelete && !allDelete { + break + } + } + + if isDelete && !ar.Capabilities.Supports(capability.DeleteRefs) { + return ErrDeleteRefNotSupported + } + + if o.Force { + for i := 0; i < len(o.RefSpecs); i++ { + rs := &o.RefSpecs[i] + if !rs.IsForceUpdate() && !rs.IsDelete() { + o.RefSpecs[i] = config.RefSpec("+" + rs.String()) + } + } + } + + localRefs, err := r.references() + if err != nil { + return err + } + + req, err := r.newReferenceUpdateRequest(o, localRefs, remoteRefs, ar) + if err != nil { + return err + } + + if len(req.Commands) == 0 { + return NoErrAlreadyUpToDate + } + + objects := objectsToPush(req.Commands) + + haves, err := referencesToHashes(remoteRefs) + if err != nil { + return err + } + + stop, err := r.s.Shallow() + if err != nil { + return err + } + + // if we have shallow we should include this as part of the objects that + // we are aware. + haves = append(haves, stop...) + + var hashesToPush []plumbing.Hash + // Avoid the expensive revlist operation if we're only doing deletes. + if !allDelete { + if r.c.IsFirstURLLocal() { + // If we're are pushing to a local repo, it might be much + // faster to use a local storage layer to get the commits + // to ignore, when calculating the object revlist. + localStorer := filesystem.NewStorage( + osfs.New(r.c.URLs[0]), cache.NewObjectLRUDefault()) + hashesToPush, err = revlist.ObjectsWithStorageForIgnores( + r.s, localStorer, objects, haves) + } else { + hashesToPush, err = revlist.Objects(r.s, objects, haves) + } + if err != nil { + return err + } + } + + if len(hashesToPush) == 0 { + allDelete = true + for _, command := range req.Commands { + if command.Action() != packp.Delete { + allDelete = false + break + } + } + } + + rs, err := pushHashes(ctx, s, r.s, req, hashesToPush, r.useRefDeltas(ar), allDelete) + if err != nil { + return err + } + + if err = rs.Error(); err != nil { + return err + } + + return r.updateRemoteReferenceStorage(req, rs) +} + +func (r *Remote) useRefDeltas(ar *packp.AdvRefs) bool { + return !ar.Capabilities.Supports(capability.OFSDelta) +} + +func (r *Remote) newReferenceUpdateRequest( + o *PushOptions, + localRefs []*plumbing.Reference, + remoteRefs storer.ReferenceStorer, + ar *packp.AdvRefs, +) (*packp.ReferenceUpdateRequest, error) { + req := packp.NewReferenceUpdateRequestFromCapabilities(ar.Capabilities) + + if o.Progress != nil { + req.Progress = o.Progress + if ar.Capabilities.Supports(capability.Sideband64k) { + _ = req.Capabilities.Set(capability.Sideband64k) + } else if ar.Capabilities.Supports(capability.Sideband) { + _ = req.Capabilities.Set(capability.Sideband) + } + } + + if err := r.addReferencesToUpdate(o.RefSpecs, localRefs, remoteRefs, req, o.Prune); err != nil { + return nil, err + } + + return req, nil +} + +func (r *Remote) updateRemoteReferenceStorage( + req *packp.ReferenceUpdateRequest, + result *packp.ReportStatus, +) error { + + for _, spec := range r.c.Fetch { + for _, c := range req.Commands { + if !spec.Match(c.Name) { + continue + } + + local := spec.Dst(c.Name) + ref := plumbing.NewHashReference(local, c.New) + switch c.Action() { + case packp.Create, packp.Update: + if err := r.s.SetReference(ref); err != nil { + return err + } + case packp.Delete: + if err := r.s.RemoveReference(local); err != nil { + return err + } + } + } + } + + return nil +} + +// FetchContext fetches references along with the objects necessary to complete +// their histories. +// +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +func (r *Remote) FetchContext(ctx context.Context, o *FetchOptions) error { + _, err := r.fetch(ctx, o) + return err +} + +// Fetch fetches references along with the objects necessary to complete their +// histories. +// +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +func (r *Remote) Fetch(o *FetchOptions) error { + return r.FetchContext(context.Background(), o) +} + +func (r *Remote) fetch(ctx context.Context, o *FetchOptions) (sto storer.ReferenceStorer, err error) { + if o.RemoteName == "" { + o.RemoteName = r.c.Name + } + + if err = o.Validate(); err != nil { + return nil, err + } + + if len(o.RefSpecs) == 0 { + o.RefSpecs = r.c.Fetch + } + + s, err := newUploadPackSession(r.c.URLs[0], o.Auth, o.InsecureSkipTLS, o.CABundle) + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(s, &err) + + ar, err := s.AdvertisedReferencesContext(ctx) + if err != nil { + return nil, err + } + + req, err := r.newUploadPackRequest(o, ar) + if err != nil { + return nil, err + } + + if err := r.isSupportedRefSpec(o.RefSpecs, ar); err != nil { + return nil, err + } + + remoteRefs, err := ar.AllReferences() + if err != nil { + return nil, err + } + + localRefs, err := r.references() + if err != nil { + return nil, err + } + + refs, err := calculateRefs(o.RefSpecs, remoteRefs, o.Tags) + if err != nil { + return nil, err + } + + if !req.Depth.IsZero() { + req.Shallows, err = r.s.Shallow() + if err != nil { + return nil, fmt.Errorf("existing checkout is not shallow") + } + } + + req.Wants, err = getWants(r.s, refs) + if len(req.Wants) > 0 { + req.Haves, err = getHaves(localRefs, remoteRefs, r.s) + if err != nil { + return nil, err + } + + if err = r.fetchPack(ctx, o, s, req); err != nil { + return nil, err + } + } + + updated, err := r.updateLocalReferenceStorage(o.RefSpecs, refs, remoteRefs, o.Tags, o.Force) + if err != nil { + return nil, err + } + + if !updated { + updated, err = depthChanged(req.Shallows, r.s) + if err != nil { + return nil, fmt.Errorf("error checking depth change: %v", err) + } + } + + if !updated { + return remoteRefs, NoErrAlreadyUpToDate + } + + return remoteRefs, nil +} + +func depthChanged(before []plumbing.Hash, s storage.Storer) (bool, error) { + after, err := s.Shallow() + if err != nil { + return false, err + } + + if len(before) != len(after) { + return true, nil + } + + bm := make(map[plumbing.Hash]bool, len(before)) + for _, b := range before { + bm[b] = true + } + for _, a := range after { + if _, ok := bm[a]; !ok { + return true, nil + } + } + + return false, nil +} + +func newUploadPackSession(url string, auth transport.AuthMethod, insecure bool, cabundle []byte) (transport.UploadPackSession, error) { + c, ep, err := newClient(url, auth, insecure, cabundle) + if err != nil { + return nil, err + } + + return c.NewUploadPackSession(ep, auth) +} + +func newSendPackSession(url string, auth transport.AuthMethod, insecure bool, cabundle []byte) (transport.ReceivePackSession, error) { + c, ep, err := newClient(url, auth, insecure, cabundle) + if err != nil { + return nil, err + } + + return c.NewReceivePackSession(ep, auth) +} + +func newClient(url string, auth transport.AuthMethod, insecure bool, cabundle []byte) (transport.Transport, *transport.Endpoint, error) { + ep, err := transport.NewEndpoint(url) + if err != nil { + return nil, nil, err + } + ep.InsecureSkipTLS = insecure + ep.CaBundle = cabundle + + c, err := client.NewClient(ep) + if err != nil { + return nil, nil, err + } + + return c, ep, err +} + +func (r *Remote) fetchPack(ctx context.Context, o *FetchOptions, s transport.UploadPackSession, + req *packp.UploadPackRequest) (err error) { + + reader, err := s.UploadPack(ctx, req) + if err != nil { + return err + } + + defer ioutil.CheckClose(reader, &err) + + if err = r.updateShallow(o, reader); err != nil { + return err + } + + if err = packfile.UpdateObjectStorage(r.s, + buildSidebandIfSupported(req.Capabilities, reader, o.Progress), + ); err != nil { + return err + } + + return err +} + +func (r *Remote) addReferencesToUpdate( + refspecs []config.RefSpec, + localRefs []*plumbing.Reference, + remoteRefs storer.ReferenceStorer, + req *packp.ReferenceUpdateRequest, + prune bool, +) error { + // This references dictionary will be used to search references by name. + refsDict := make(map[string]*plumbing.Reference) + for _, ref := range localRefs { + refsDict[ref.Name().String()] = ref + } + + for _, rs := range refspecs { + if rs.IsDelete() { + if err := r.deleteReferences(rs, remoteRefs, refsDict, req, false); err != nil { + return err + } + } else { + err := r.addOrUpdateReferences(rs, localRefs, refsDict, remoteRefs, req) + if err != nil { + return err + } + + if prune { + if err := r.deleteReferences(rs, remoteRefs, refsDict, req, true); err != nil { + return err + } + } + } + } + + return nil +} + +func (r *Remote) addOrUpdateReferences( + rs config.RefSpec, + localRefs []*plumbing.Reference, + refsDict map[string]*plumbing.Reference, + remoteRefs storer.ReferenceStorer, + req *packp.ReferenceUpdateRequest, +) error { + // If it is not a wilcard refspec we can directly search for the reference + // in the references dictionary. + if !rs.IsWildcard() { + ref, ok := refsDict[rs.Src()] + if !ok { + return nil + } + + return r.addReferenceIfRefSpecMatches(rs, remoteRefs, ref, req) + } + + for _, ref := range localRefs { + err := r.addReferenceIfRefSpecMatches(rs, remoteRefs, ref, req) + if err != nil { + return err + } + } + + return nil +} + +func (r *Remote) deleteReferences(rs config.RefSpec, + remoteRefs storer.ReferenceStorer, + refsDict map[string]*plumbing.Reference, + req *packp.ReferenceUpdateRequest, + prune bool) error { + iter, err := remoteRefs.IterReferences() + if err != nil { + return err + } + + return iter.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() != plumbing.HashReference { + return nil + } + + if prune { + rs := rs.Reverse() + if !rs.Match(ref.Name()) { + return nil + } + + if _, ok := refsDict[rs.Dst(ref.Name()).String()]; ok { + return nil + } + } else if rs.Dst("") != ref.Name() { + return nil + } + + cmd := &packp.Command{ + Name: ref.Name(), + Old: ref.Hash(), + New: plumbing.ZeroHash, + } + req.Commands = append(req.Commands, cmd) + return nil + }) +} + +func (r *Remote) addReferenceIfRefSpecMatches(rs config.RefSpec, + remoteRefs storer.ReferenceStorer, localRef *plumbing.Reference, + req *packp.ReferenceUpdateRequest) error { + + if localRef.Type() != plumbing.HashReference { + return nil + } + + if !rs.Match(localRef.Name()) { + return nil + } + + cmd := &packp.Command{ + Name: rs.Dst(localRef.Name()), + Old: plumbing.ZeroHash, + New: localRef.Hash(), + } + + remoteRef, err := remoteRefs.Reference(cmd.Name) + if err == nil { + if remoteRef.Type() != plumbing.HashReference { + //TODO: check actual git behavior here + return nil + } + + cmd.Old = remoteRef.Hash() + } else if err != plumbing.ErrReferenceNotFound { + return err + } + + if cmd.Old == cmd.New { + return nil + } + + if !rs.IsForceUpdate() { + if err := checkFastForwardUpdate(r.s, remoteRefs, cmd); err != nil { + return err + } + } + + req.Commands = append(req.Commands, cmd) + return nil +} + +func (r *Remote) references() ([]*plumbing.Reference, error) { + var localRefs []*plumbing.Reference + + iter, err := r.s.IterReferences() + if err != nil { + return nil, err + } + + for { + ref, err := iter.Next() + if err == io.EOF { + break + } + + if err != nil { + return nil, err + } + + localRefs = append(localRefs, ref) + } + + return localRefs, nil +} + +func getRemoteRefsFromStorer(remoteRefStorer storer.ReferenceStorer) ( + map[plumbing.Hash]bool, error) { + remoteRefs := map[plumbing.Hash]bool{} + iter, err := remoteRefStorer.IterReferences() + if err != nil { + return nil, err + } + err = iter.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() != plumbing.HashReference { + return nil + } + remoteRefs[ref.Hash()] = true + return nil + }) + if err != nil { + return nil, err + } + return remoteRefs, nil +} + +// getHavesFromRef populates the given `haves` map with the given +// reference, and up to `maxHavesToVisitPerRef` ancestor commits. +func getHavesFromRef( + ref *plumbing.Reference, + remoteRefs map[plumbing.Hash]bool, + s storage.Storer, + haves map[plumbing.Hash]bool, +) error { + h := ref.Hash() + if haves[h] { + return nil + } + + // No need to load the commit if we know the remote already + // has this hash. + if remoteRefs[h] { + haves[h] = true + return nil + } + + commit, err := object.GetCommit(s, h) + if err != nil { + // Ignore the error if this isn't a commit. + haves[ref.Hash()] = true + return nil + } + + // Until go-git supports proper commit negotiation during an + // upload pack request, include up to `maxHavesToVisitPerRef` + // commits from the history of each ref. + walker := object.NewCommitPreorderIter(commit, haves, nil) + toVisit := maxHavesToVisitPerRef + return walker.ForEach(func(c *object.Commit) error { + haves[c.Hash] = true + toVisit-- + // If toVisit starts out at 0 (indicating there is no + // max), then it will be negative here and we won't stop + // early. + if toVisit == 0 || remoteRefs[c.Hash] { + return storer.ErrStop + } + return nil + }) +} + +func getHaves( + localRefs []*plumbing.Reference, + remoteRefStorer storer.ReferenceStorer, + s storage.Storer, +) ([]plumbing.Hash, error) { + haves := map[plumbing.Hash]bool{} + + // Build a map of all the remote references, to avoid loading too + // many parent commits for references we know don't need to be + // transferred. + remoteRefs, err := getRemoteRefsFromStorer(remoteRefStorer) + if err != nil { + return nil, err + } + + for _, ref := range localRefs { + if haves[ref.Hash()] { + continue + } + + if ref.Type() != plumbing.HashReference { + continue + } + + err = getHavesFromRef(ref, remoteRefs, s, haves) + if err != nil { + return nil, err + } + } + + var result []plumbing.Hash + for h := range haves { + result = append(result, h) + } + + return result, nil +} + +const refspecAllTags = "+refs/tags/*:refs/tags/*" + +func calculateRefs( + spec []config.RefSpec, + remoteRefs storer.ReferenceStorer, + tagMode TagMode, +) (memory.ReferenceStorage, error) { + if tagMode == AllTags { + spec = append(spec, refspecAllTags) + } + + refs := make(memory.ReferenceStorage) + for _, s := range spec { + if err := doCalculateRefs(s, remoteRefs, refs); err != nil { + return nil, err + } + } + + return refs, nil +} + +func doCalculateRefs( + s config.RefSpec, + remoteRefs storer.ReferenceStorer, + refs memory.ReferenceStorage, +) error { + iter, err := remoteRefs.IterReferences() + if err != nil { + return err + } + + if s.IsExactSHA1() { + ref := plumbing.NewHashReference(s.Dst(""), plumbing.NewHash(s.Src())) + return refs.SetReference(ref) + } + + var matched bool + err = iter.ForEach(func(ref *plumbing.Reference) error { + if !s.Match(ref.Name()) { + return nil + } + + if ref.Type() == plumbing.SymbolicReference { + target, err := storer.ResolveReference(remoteRefs, ref.Name()) + if err != nil { + return err + } + + ref = plumbing.NewHashReference(ref.Name(), target.Hash()) + } + + if ref.Type() != plumbing.HashReference { + return nil + } + + matched = true + if err := refs.SetReference(ref); err != nil { + return err + } + + if !s.IsWildcard() { + return storer.ErrStop + } + + return nil + }) + + if !matched && !s.IsWildcard() { + return NoMatchingRefSpecError{refSpec: s} + } + + return err +} + +func getWants(localStorer storage.Storer, refs memory.ReferenceStorage) ([]plumbing.Hash, error) { + shallow := false + if s, _ := localStorer.Shallow(); len(s) > 0 { + shallow = true + } + + wants := map[plumbing.Hash]bool{} + for _, ref := range refs { + hash := ref.Hash() + exists, err := objectExists(localStorer, ref.Hash()) + if err != nil { + return nil, err + } + + if !exists || shallow { + wants[hash] = true + } + } + + var result []plumbing.Hash + for h := range wants { + result = append(result, h) + } + + return result, nil +} + +func objectExists(s storer.EncodedObjectStorer, h plumbing.Hash) (bool, error) { + _, err := s.EncodedObject(plumbing.AnyObject, h) + if err == plumbing.ErrObjectNotFound { + return false, nil + } + + return true, err +} + +func checkFastForwardUpdate(s storer.EncodedObjectStorer, remoteRefs storer.ReferenceStorer, cmd *packp.Command) error { + if cmd.Old == plumbing.ZeroHash { + _, err := remoteRefs.Reference(cmd.Name) + if err == plumbing.ErrReferenceNotFound { + return nil + } + + if err != nil { + return err + } + + return fmt.Errorf("non-fast-forward update: %s", cmd.Name.String()) + } + + ff, err := isFastForward(s, cmd.Old, cmd.New) + if err != nil { + return err + } + + if !ff { + return fmt.Errorf("non-fast-forward update: %s", cmd.Name.String()) + } + + return nil +} + +func isFastForward(s storer.EncodedObjectStorer, old, new plumbing.Hash) (bool, error) { + c, err := object.GetCommit(s, new) + if err != nil { + return false, err + } + + found := false + iter := object.NewCommitPreorderIter(c, nil, nil) + err = iter.ForEach(func(c *object.Commit) error { + if c.Hash != old { + return nil + } + + found = true + return storer.ErrStop + }) + return found, err +} + +func (r *Remote) newUploadPackRequest(o *FetchOptions, + ar *packp.AdvRefs) (*packp.UploadPackRequest, error) { + + req := packp.NewUploadPackRequestFromCapabilities(ar.Capabilities) + + if o.Depth != 0 { + req.Depth = packp.DepthCommits(o.Depth) + if err := req.Capabilities.Set(capability.Shallow); err != nil { + return nil, err + } + } + + if o.Progress == nil && ar.Capabilities.Supports(capability.NoProgress) { + if err := req.Capabilities.Set(capability.NoProgress); err != nil { + return nil, err + } + } + + isWildcard := true + for _, s := range o.RefSpecs { + if !s.IsWildcard() { + isWildcard = false + break + } + } + + if isWildcard && o.Tags == TagFollowing && ar.Capabilities.Supports(capability.IncludeTag) { + if err := req.Capabilities.Set(capability.IncludeTag); err != nil { + return nil, err + } + } + + return req, nil +} + +func (r *Remote) isSupportedRefSpec(refs []config.RefSpec, ar *packp.AdvRefs) error { + var containsIsExact bool + for _, ref := range refs { + if ref.IsExactSHA1() { + containsIsExact = true + } + } + + if !containsIsExact { + return nil + } + + if ar.Capabilities.Supports(capability.AllowReachableSHA1InWant) || + ar.Capabilities.Supports(capability.AllowTipSHA1InWant) { + return nil + } + + return ErrExactSHA1NotSupported +} + +func buildSidebandIfSupported(l *capability.List, reader io.Reader, p sideband.Progress) io.Reader { + var t sideband.Type + + switch { + case l.Supports(capability.Sideband): + t = sideband.Sideband + case l.Supports(capability.Sideband64k): + t = sideband.Sideband64k + default: + return reader + } + + d := sideband.NewDemuxer(t, reader) + d.Progress = p + + return d +} + +func (r *Remote) updateLocalReferenceStorage( + specs []config.RefSpec, + fetchedRefs, remoteRefs memory.ReferenceStorage, + tagMode TagMode, + force bool, +) (updated bool, err error) { + isWildcard := true + forceNeeded := false + + for _, spec := range specs { + if !spec.IsWildcard() { + isWildcard = false + } + + for _, ref := range fetchedRefs { + if !spec.Match(ref.Name()) && !spec.IsExactSHA1() { + continue + } + + if ref.Type() != plumbing.HashReference { + continue + } + + localName := spec.Dst(ref.Name()) + old, _ := storer.ResolveReference(r.s, localName) + new := plumbing.NewHashReference(localName, ref.Hash()) + + // If the ref exists locally as a branch and force is not specified, + // only update if the new ref is an ancestor of the old + if old != nil && old.Name().IsBranch() && !force && !spec.IsForceUpdate() { + ff, err := isFastForward(r.s, old.Hash(), new.Hash()) + if err != nil { + return updated, err + } + + if !ff { + forceNeeded = true + continue + } + } + + refUpdated, err := checkAndUpdateReferenceStorerIfNeeded(r.s, new, old) + if err != nil { + return updated, err + } + + if refUpdated { + updated = true + } + } + } + + if tagMode == NoTags { + return updated, nil + } + + tags := fetchedRefs + if isWildcard { + tags = remoteRefs + } + tagUpdated, err := r.buildFetchedTags(tags) + if err != nil { + return updated, err + } + + if tagUpdated { + updated = true + } + + if forceNeeded { + err = ErrForceNeeded + } + + return +} + +func (r *Remote) buildFetchedTags(refs memory.ReferenceStorage) (updated bool, err error) { + for _, ref := range refs { + if !ref.Name().IsTag() { + continue + } + + _, err := r.s.EncodedObject(plumbing.AnyObject, ref.Hash()) + if err == plumbing.ErrObjectNotFound { + continue + } + + if err != nil { + return false, err + } + + refUpdated, err := updateReferenceStorerIfNeeded(r.s, ref) + if err != nil { + return updated, err + } + + if refUpdated { + updated = true + } + } + + return +} + +// List the references on the remote repository. +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects to the +// transport operations. +func (r *Remote) ListContext(ctx context.Context, o *ListOptions) (rfs []*plumbing.Reference, err error) { + refs, err := r.list(ctx, o) + if err != nil { + return refs, err + } + return refs, nil +} + +func (r *Remote) List(o *ListOptions) (rfs []*plumbing.Reference, err error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + return r.ListContext(ctx, o) +} + +func (r *Remote) list(ctx context.Context, o *ListOptions) (rfs []*plumbing.Reference, err error) { + s, err := newUploadPackSession(r.c.URLs[0], o.Auth, o.InsecureSkipTLS, o.CABundle) + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(s, &err) + + ar, err := s.AdvertisedReferencesContext(ctx) + if err != nil { + return nil, err + } + + allRefs, err := ar.AllReferences() + if err != nil { + return nil, err + } + + refs, err := allRefs.IterReferences() + if err != nil { + return nil, err + } + + var resultRefs []*plumbing.Reference + err = refs.ForEach(func(ref *plumbing.Reference) error { + resultRefs = append(resultRefs, ref) + return nil + }) + if err != nil { + return nil, err + } + return resultRefs, nil +} + +func objectsToPush(commands []*packp.Command) []plumbing.Hash { + objects := make([]plumbing.Hash, 0, len(commands)) + for _, cmd := range commands { + if cmd.New == plumbing.ZeroHash { + continue + } + objects = append(objects, cmd.New) + } + return objects +} + +func referencesToHashes(refs storer.ReferenceStorer) ([]plumbing.Hash, error) { + iter, err := refs.IterReferences() + if err != nil { + return nil, err + } + + var hs []plumbing.Hash + err = iter.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() != plumbing.HashReference { + return nil + } + + hs = append(hs, ref.Hash()) + return nil + }) + if err != nil { + return nil, err + } + + return hs, nil +} + +func pushHashes( + ctx context.Context, + sess transport.ReceivePackSession, + s storage.Storer, + req *packp.ReferenceUpdateRequest, + hs []plumbing.Hash, + useRefDeltas bool, + allDelete bool, +) (*packp.ReportStatus, error) { + + rd, wr := ioutil.Pipe() + + config, err := s.Config() + if err != nil { + return nil, err + } + + // Set buffer size to 1 so the error message can be written when + // ReceivePack fails. Otherwise the goroutine will be blocked writing + // to the channel. + done := make(chan error, 1) + + if !allDelete { + req.Packfile = rd + go func() { + e := packfile.NewEncoder(wr, s, useRefDeltas) + if _, err := e.Encode(hs, config.Pack.Window); err != nil { + done <- wr.CloseWithError(err) + return + } + + done <- wr.Close() + }() + } else { + close(done) + } + + rs, err := sess.ReceivePack(ctx, req) + if err != nil { + // close the pipe to unlock encode write + _ = rd.Close() + return nil, err + } + + if err := <-done; err != nil { + return nil, err + } + + return rs, nil +} + +func (r *Remote) updateShallow(o *FetchOptions, resp *packp.UploadPackResponse) error { + if o.Depth == 0 || len(resp.Shallows) == 0 { + return nil + } + + shallows, err := r.s.Shallow() + if err != nil { + return err + } + +outer: + for _, s := range resp.Shallows { + for _, oldS := range shallows { + if s == oldS { + continue outer + } + } + shallows = append(shallows, s) + } + + return r.s.SetShallow(shallows) +} + +func (r *Remote) checkRequireRemoteRefs(requires []config.RefSpec, remoteRefs storer.ReferenceStorer) error { + for _, require := range requires { + if require.IsWildcard() { + return fmt.Errorf("wildcards not supported in RequireRemoteRefs, got %s", require.String()) + } + + name := require.Dst("") + remote, err := remoteRefs.Reference(name) + if err != nil { + return fmt.Errorf("remote ref %s required to be %s but is absent", name.String(), require.Src()) + } + + var requireHash string + if require.IsExactSHA1() { + requireHash = require.Src() + } else { + target, err := storer.ResolveReference(remoteRefs, plumbing.ReferenceName(require.Src())) + if err != nil { + return fmt.Errorf("could not resolve ref %s in RequireRemoteRefs", require.Src()) + } + requireHash = target.Hash().String() + } + + if remote.Hash().String() != requireHash { + return fmt.Errorf("remote ref %s required to be %s but is %s", name.String(), requireHash, remote.Hash().String()) + } + } + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/repository.go b/vendor/github.com/go-git/go-git/v5/repository.go new file mode 100644 index 0000000000..d3fbf97593 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/repository.go @@ -0,0 +1,1722 @@ +package git + +import ( + "bytes" + "context" + "encoding/hex" + "errors" + "fmt" + stdioutil "io/ioutil" + "os" + "path" + "path/filepath" + "strings" + "time" + + "github.com/ProtonMail/go-crypto/openpgp" + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/osfs" + "github.com/go-git/go-billy/v5/util" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/internal/revision" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage" + "github.com/go-git/go-git/v5/storage/filesystem" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/imdario/mergo" +) + +// GitDirName this is a special folder where all the git stuff is. +const GitDirName = ".git" + +var ( + // ErrBranchExists an error stating the specified branch already exists + ErrBranchExists = errors.New("branch already exists") + // ErrBranchNotFound an error stating the specified branch does not exist + ErrBranchNotFound = errors.New("branch not found") + // ErrTagExists an error stating the specified tag already exists + ErrTagExists = errors.New("tag already exists") + // ErrTagNotFound an error stating the specified tag does not exist + ErrTagNotFound = errors.New("tag not found") + // ErrFetching is returned when the packfile could not be downloaded + ErrFetching = errors.New("unable to fetch packfile") + + ErrInvalidReference = errors.New("invalid reference, should be a tag or a branch") + ErrRepositoryNotExists = errors.New("repository does not exist") + ErrRepositoryIncomplete = errors.New("repository's commondir path does not exist") + ErrRepositoryAlreadyExists = errors.New("repository already exists") + ErrRemoteNotFound = errors.New("remote not found") + ErrRemoteExists = errors.New("remote already exists") + ErrAnonymousRemoteName = errors.New("anonymous remote name must be 'anonymous'") + ErrWorktreeNotProvided = errors.New("worktree should be provided") + ErrIsBareRepository = errors.New("worktree not available in a bare repository") + ErrUnableToResolveCommit = errors.New("unable to resolve commit") + ErrPackedObjectsNotSupported = errors.New("Packed objects not supported") +) + +// Repository represents a git repository +type Repository struct { + Storer storage.Storer + + r map[string]*Remote + wt billy.Filesystem +} + +// Init creates an empty git repository, based on the given Storer and worktree. +// The worktree Filesystem is optional, if nil a bare repository is created. If +// the given storer is not empty ErrRepositoryAlreadyExists is returned +func Init(s storage.Storer, worktree billy.Filesystem) (*Repository, error) { + if err := initStorer(s); err != nil { + return nil, err + } + + r := newRepository(s, worktree) + _, err := r.Reference(plumbing.HEAD, false) + switch err { + case plumbing.ErrReferenceNotFound: + case nil: + return nil, ErrRepositoryAlreadyExists + default: + return nil, err + } + + h := plumbing.NewSymbolicReference(plumbing.HEAD, plumbing.Master) + if err := s.SetReference(h); err != nil { + return nil, err + } + + if worktree == nil { + _ = r.setIsBare(true) + return r, nil + } + + return r, setWorktreeAndStoragePaths(r, worktree) +} + +func initStorer(s storer.Storer) error { + i, ok := s.(storer.Initializer) + if !ok { + return nil + } + + return i.Init() +} + +func setWorktreeAndStoragePaths(r *Repository, worktree billy.Filesystem) error { + type fsBased interface { + Filesystem() billy.Filesystem + } + + // .git file is only created if the storage is file based and the file + // system is osfs.OS + fs, isFSBased := r.Storer.(fsBased) + if !isFSBased { + return nil + } + + if err := createDotGitFile(worktree, fs.Filesystem()); err != nil { + return err + } + + return setConfigWorktree(r, worktree, fs.Filesystem()) +} + +func createDotGitFile(worktree, storage billy.Filesystem) error { + path, err := filepath.Rel(worktree.Root(), storage.Root()) + if err != nil { + path = storage.Root() + } + + if path == GitDirName { + // not needed, since the folder is the default place + return nil + } + + f, err := worktree.Create(GitDirName) + if err != nil { + return err + } + + defer f.Close() + _, err = fmt.Fprintf(f, "gitdir: %s\n", path) + return err +} + +func setConfigWorktree(r *Repository, worktree, storage billy.Filesystem) error { + path, err := filepath.Rel(storage.Root(), worktree.Root()) + if err != nil { + path = worktree.Root() + } + + if path == ".." { + // not needed, since the folder is the default place + return nil + } + + cfg, err := r.Config() + if err != nil { + return err + } + + cfg.Core.Worktree = path + return r.Storer.SetConfig(cfg) +} + +// Open opens a git repository using the given Storer and worktree filesystem, +// if the given storer is complete empty ErrRepositoryNotExists is returned. +// The worktree can be nil when the repository being opened is bare, if the +// repository is a normal one (not bare) and worktree is nil the err +// ErrWorktreeNotProvided is returned +func Open(s storage.Storer, worktree billy.Filesystem) (*Repository, error) { + _, err := s.Reference(plumbing.HEAD) + if err == plumbing.ErrReferenceNotFound { + return nil, ErrRepositoryNotExists + } + + if err != nil { + return nil, err + } + + return newRepository(s, worktree), nil +} + +// Clone a repository into the given Storer and worktree Filesystem with the +// given options, if worktree is nil a bare repository is created. If the given +// storer is not empty ErrRepositoryAlreadyExists is returned. +func Clone(s storage.Storer, worktree billy.Filesystem, o *CloneOptions) (*Repository, error) { + return CloneContext(context.Background(), s, worktree, o) +} + +// CloneContext a repository into the given Storer and worktree Filesystem with +// the given options, if worktree is nil a bare repository is created. If the +// given storer is not empty ErrRepositoryAlreadyExists is returned. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +func CloneContext( + ctx context.Context, s storage.Storer, worktree billy.Filesystem, o *CloneOptions, +) (*Repository, error) { + r, err := Init(s, worktree) + if err != nil { + return nil, err + } + + return r, r.clone(ctx, o) +} + +// PlainInit create an empty git repository at the given path. isBare defines +// if the repository will have worktree (non-bare) or not (bare), if the path +// is not empty ErrRepositoryAlreadyExists is returned. +func PlainInit(path string, isBare bool) (*Repository, error) { + var wt, dot billy.Filesystem + + if isBare { + dot = osfs.New(path) + } else { + wt = osfs.New(path) + dot, _ = wt.Chroot(GitDirName) + } + + s := filesystem.NewStorage(dot, cache.NewObjectLRUDefault()) + + return Init(s, wt) +} + +// PlainOpen opens a git repository from the given path. It detects if the +// repository is bare or a normal one. If the path doesn't contain a valid +// repository ErrRepositoryNotExists is returned +func PlainOpen(path string) (*Repository, error) { + return PlainOpenWithOptions(path, &PlainOpenOptions{}) +} + +// PlainOpenWithOptions opens a git repository from the given path with specific +// options. See PlainOpen for more info. +func PlainOpenWithOptions(path string, o *PlainOpenOptions) (*Repository, error) { + dot, wt, err := dotGitToOSFilesystems(path, o.DetectDotGit) + if err != nil { + return nil, err + } + + if _, err := dot.Stat(""); err != nil { + if os.IsNotExist(err) { + return nil, ErrRepositoryNotExists + } + + return nil, err + } + + var repositoryFs billy.Filesystem + + if o.EnableDotGitCommonDir { + dotGitCommon, err := dotGitCommonDirectory(dot) + if err != nil { + return nil, err + } + repositoryFs = dotgit.NewRepositoryFilesystem(dot, dotGitCommon) + } else { + repositoryFs = dot + } + + s := filesystem.NewStorage(repositoryFs, cache.NewObjectLRUDefault()) + + return Open(s, wt) +} + +func dotGitToOSFilesystems(path string, detect bool) (dot, wt billy.Filesystem, err error) { + if path, err = filepath.Abs(path); err != nil { + return nil, nil, err + } + + var fs billy.Filesystem + var fi os.FileInfo + for { + fs = osfs.New(path) + + pathinfo, err := fs.Stat("/") + if !os.IsNotExist(err) { + if !pathinfo.IsDir() && detect { + fs = osfs.New(filepath.Dir(path)) + } + } + + fi, err = fs.Stat(GitDirName) + if err == nil { + // no error; stop + break + } + if !os.IsNotExist(err) { + // unknown error; stop + return nil, nil, err + } + if detect { + // try its parent as long as we haven't reached + // the root dir + if dir := filepath.Dir(path); dir != path { + path = dir + continue + } + } + // not detecting via parent dirs and the dir does not exist; + // stop + return fs, nil, nil + } + + if fi.IsDir() { + dot, err = fs.Chroot(GitDirName) + return dot, fs, err + } + + dot, err = dotGitFileToOSFilesystem(path, fs) + if err != nil { + return nil, nil, err + } + + return dot, fs, nil +} + +func dotGitFileToOSFilesystem(path string, fs billy.Filesystem) (bfs billy.Filesystem, err error) { + f, err := fs.Open(GitDirName) + if err != nil { + return nil, err + } + defer ioutil.CheckClose(f, &err) + + b, err := stdioutil.ReadAll(f) + if err != nil { + return nil, err + } + + line := string(b) + const prefix = "gitdir: " + if !strings.HasPrefix(line, prefix) { + return nil, fmt.Errorf(".git file has no %s prefix", prefix) + } + + gitdir := strings.Split(line[len(prefix):], "\n")[0] + gitdir = strings.TrimSpace(gitdir) + if filepath.IsAbs(gitdir) { + return osfs.New(gitdir), nil + } + + return osfs.New(fs.Join(path, gitdir)), nil +} + +func dotGitCommonDirectory(fs billy.Filesystem) (commonDir billy.Filesystem, err error) { + f, err := fs.Open("commondir") + if os.IsNotExist(err) { + return nil, nil + } + if err != nil { + return nil, err + } + + b, err := stdioutil.ReadAll(f) + if err != nil { + return nil, err + } + if len(b) > 0 { + path := strings.TrimSpace(string(b)) + if filepath.IsAbs(path) { + commonDir = osfs.New(path) + } else { + commonDir = osfs.New(filepath.Join(fs.Root(), path)) + } + if _, err := commonDir.Stat(""); err != nil { + if os.IsNotExist(err) { + return nil, ErrRepositoryIncomplete + } + + return nil, err + } + } + + return commonDir, nil +} + +// PlainClone a repository into the path with the given options, isBare defines +// if the new repository will be bare or normal. If the path is not empty +// ErrRepositoryAlreadyExists is returned. +// +// TODO(mcuadros): move isBare to CloneOptions in v5 +func PlainClone(path string, isBare bool, o *CloneOptions) (*Repository, error) { + return PlainCloneContext(context.Background(), path, isBare, o) +} + +// PlainCloneContext a repository into the path with the given options, isBare +// defines if the new repository will be bare or normal. If the path is not empty +// ErrRepositoryAlreadyExists is returned. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +// +// TODO(mcuadros): move isBare to CloneOptions in v5 +// TODO(smola): refuse upfront to clone on a non-empty directory in v5, see #1027 +func PlainCloneContext(ctx context.Context, path string, isBare bool, o *CloneOptions) (*Repository, error) { + cleanup, cleanupParent, err := checkIfCleanupIsNeeded(path) + if err != nil { + return nil, err + } + + r, err := PlainInit(path, isBare) + if err != nil { + return nil, err + } + + err = r.clone(ctx, o) + if err != nil && err != ErrRepositoryAlreadyExists { + if cleanup { + _ = cleanUpDir(path, cleanupParent) + } + } + + return r, err +} + +func newRepository(s storage.Storer, worktree billy.Filesystem) *Repository { + return &Repository{ + Storer: s, + wt: worktree, + r: make(map[string]*Remote), + } +} + +func checkIfCleanupIsNeeded(path string) (cleanup bool, cleanParent bool, err error) { + fi, err := osfs.Default.Stat(path) + if err != nil { + if os.IsNotExist(err) { + return true, true, nil + } + + return false, false, err + } + + if !fi.IsDir() { + return false, false, fmt.Errorf("path is not a directory: %s", path) + } + + files, err := osfs.Default.ReadDir(path) + if err != nil { + return false, false, err + } + + if len(files) == 0 { + return true, false, nil + } + + return false, false, nil +} + +func cleanUpDir(path string, all bool) error { + if all { + return util.RemoveAll(osfs.Default, path) + } + + files, err := osfs.Default.ReadDir(path) + if err != nil { + return err + } + + for _, fi := range files { + if err := util.RemoveAll(osfs.Default, osfs.Default.Join(path, fi.Name())); err != nil { + return err + } + } + + return err +} + +// Config return the repository config. In a filesystem backed repository this +// means read the `.git/config`. +func (r *Repository) Config() (*config.Config, error) { + return r.Storer.Config() +} + +// SetConfig marshall and writes the repository config. In a filesystem backed +// repository this means write the `.git/config`. This function should be called +// with the result of `Repository.Config` and never with the output of +// `Repository.ConfigScoped`. +func (r *Repository) SetConfig(cfg *config.Config) error { + return r.Storer.SetConfig(cfg) +} + +// ConfigScoped returns the repository config, merged with requested scope and +// lower. For example if, config.GlobalScope is given the local and global config +// are returned merged in one config value. +func (r *Repository) ConfigScoped(scope config.Scope) (*config.Config, error) { + // TODO(mcuadros): v6, add this as ConfigOptions.Scoped + + var err error + system := config.NewConfig() + if scope >= config.SystemScope { + system, err = config.LoadConfig(config.SystemScope) + if err != nil { + return nil, err + } + } + + global := config.NewConfig() + if scope >= config.GlobalScope { + global, err = config.LoadConfig(config.GlobalScope) + if err != nil { + return nil, err + } + } + + local, err := r.Storer.Config() + if err != nil { + return nil, err + } + + _ = mergo.Merge(global, system) + _ = mergo.Merge(local, global) + return local, nil +} + +// Remote return a remote if exists +func (r *Repository) Remote(name string) (*Remote, error) { + cfg, err := r.Config() + if err != nil { + return nil, err + } + + c, ok := cfg.Remotes[name] + if !ok { + return nil, ErrRemoteNotFound + } + + return NewRemote(r.Storer, c), nil +} + +// Remotes returns a list with all the remotes +func (r *Repository) Remotes() ([]*Remote, error) { + cfg, err := r.Config() + if err != nil { + return nil, err + } + + remotes := make([]*Remote, len(cfg.Remotes)) + + var i int + for _, c := range cfg.Remotes { + remotes[i] = NewRemote(r.Storer, c) + i++ + } + + return remotes, nil +} + +// CreateRemote creates a new remote +func (r *Repository) CreateRemote(c *config.RemoteConfig) (*Remote, error) { + if err := c.Validate(); err != nil { + return nil, err + } + + remote := NewRemote(r.Storer, c) + + cfg, err := r.Config() + if err != nil { + return nil, err + } + + if _, ok := cfg.Remotes[c.Name]; ok { + return nil, ErrRemoteExists + } + + cfg.Remotes[c.Name] = c + return remote, r.Storer.SetConfig(cfg) +} + +// CreateRemoteAnonymous creates a new anonymous remote. c.Name must be "anonymous". +// It's used like 'git fetch git@github.com:src-d/go-git.git master:master'. +func (r *Repository) CreateRemoteAnonymous(c *config.RemoteConfig) (*Remote, error) { + if err := c.Validate(); err != nil { + return nil, err + } + + if c.Name != "anonymous" { + return nil, ErrAnonymousRemoteName + } + + remote := NewRemote(r.Storer, c) + + return remote, nil +} + +// DeleteRemote delete a remote from the repository and delete the config +func (r *Repository) DeleteRemote(name string) error { + cfg, err := r.Config() + if err != nil { + return err + } + + if _, ok := cfg.Remotes[name]; !ok { + return ErrRemoteNotFound + } + + delete(cfg.Remotes, name) + return r.Storer.SetConfig(cfg) +} + +// Branch return a Branch if exists +func (r *Repository) Branch(name string) (*config.Branch, error) { + cfg, err := r.Config() + if err != nil { + return nil, err + } + + b, ok := cfg.Branches[name] + if !ok { + return nil, ErrBranchNotFound + } + + return b, nil +} + +// CreateBranch creates a new Branch +func (r *Repository) CreateBranch(c *config.Branch) error { + if err := c.Validate(); err != nil { + return err + } + + cfg, err := r.Config() + if err != nil { + return err + } + + if _, ok := cfg.Branches[c.Name]; ok { + return ErrBranchExists + } + + cfg.Branches[c.Name] = c + return r.Storer.SetConfig(cfg) +} + +// DeleteBranch delete a Branch from the repository and delete the config +func (r *Repository) DeleteBranch(name string) error { + cfg, err := r.Config() + if err != nil { + return err + } + + if _, ok := cfg.Branches[name]; !ok { + return ErrBranchNotFound + } + + delete(cfg.Branches, name) + return r.Storer.SetConfig(cfg) +} + +// CreateTag creates a tag. If opts is included, the tag is an annotated tag, +// otherwise a lightweight tag is created. +func (r *Repository) CreateTag(name string, hash plumbing.Hash, opts *CreateTagOptions) (*plumbing.Reference, error) { + rname := plumbing.ReferenceName(path.Join("refs", "tags", name)) + + _, err := r.Storer.Reference(rname) + switch err { + case nil: + // Tag exists, this is an error + return nil, ErrTagExists + case plumbing.ErrReferenceNotFound: + // Tag missing, available for creation, pass this + default: + // Some other error + return nil, err + } + + var target plumbing.Hash + if opts != nil { + target, err = r.createTagObject(name, hash, opts) + if err != nil { + return nil, err + } + } else { + target = hash + } + + ref := plumbing.NewHashReference(rname, target) + if err = r.Storer.SetReference(ref); err != nil { + return nil, err + } + + return ref, nil +} + +func (r *Repository) createTagObject(name string, hash plumbing.Hash, opts *CreateTagOptions) (plumbing.Hash, error) { + if err := opts.Validate(r, hash); err != nil { + return plumbing.ZeroHash, err + } + + rawobj, err := object.GetObject(r.Storer, hash) + if err != nil { + return plumbing.ZeroHash, err + } + + tag := &object.Tag{ + Name: name, + Tagger: *opts.Tagger, + Message: opts.Message, + TargetType: rawobj.Type(), + Target: hash, + } + + if opts.SignKey != nil { + sig, err := r.buildTagSignature(tag, opts.SignKey) + if err != nil { + return plumbing.ZeroHash, err + } + + tag.PGPSignature = sig + } + + obj := r.Storer.NewEncodedObject() + if err := tag.Encode(obj); err != nil { + return plumbing.ZeroHash, err + } + + return r.Storer.SetEncodedObject(obj) +} + +func (r *Repository) buildTagSignature(tag *object.Tag, signKey *openpgp.Entity) (string, error) { + encoded := &plumbing.MemoryObject{} + if err := tag.Encode(encoded); err != nil { + return "", err + } + + rdr, err := encoded.Reader() + if err != nil { + return "", err + } + + var b bytes.Buffer + if err := openpgp.ArmoredDetachSign(&b, signKey, rdr, nil); err != nil { + return "", err + } + + return b.String(), nil +} + +// Tag returns a tag from the repository. +// +// If you want to check to see if the tag is an annotated tag, you can call +// TagObject on the hash of the reference in ForEach: +// +// ref, err := r.Tag("v0.1.0") +// if err != nil { +// // Handle error +// } +// +// obj, err := r.TagObject(ref.Hash()) +// switch err { +// case nil: +// // Tag object present +// case plumbing.ErrObjectNotFound: +// // Not a tag object +// default: +// // Some other error +// } +// +func (r *Repository) Tag(name string) (*plumbing.Reference, error) { + ref, err := r.Reference(plumbing.ReferenceName(path.Join("refs", "tags", name)), false) + if err != nil { + if err == plumbing.ErrReferenceNotFound { + // Return a friendly error for this one, versus just ReferenceNotFound. + return nil, ErrTagNotFound + } + + return nil, err + } + + return ref, nil +} + +// DeleteTag deletes a tag from the repository. +func (r *Repository) DeleteTag(name string) error { + _, err := r.Tag(name) + if err != nil { + return err + } + + return r.Storer.RemoveReference(plumbing.ReferenceName(path.Join("refs", "tags", name))) +} + +func (r *Repository) resolveToCommitHash(h plumbing.Hash) (plumbing.Hash, error) { + obj, err := r.Storer.EncodedObject(plumbing.AnyObject, h) + if err != nil { + return plumbing.ZeroHash, err + } + switch obj.Type() { + case plumbing.TagObject: + t, err := object.DecodeTag(r.Storer, obj) + if err != nil { + return plumbing.ZeroHash, err + } + return r.resolveToCommitHash(t.Target) + case plumbing.CommitObject: + return h, nil + default: + return plumbing.ZeroHash, ErrUnableToResolveCommit + } +} + +// Clone clones a remote repository +func (r *Repository) clone(ctx context.Context, o *CloneOptions) error { + if err := o.Validate(); err != nil { + return err + } + + c := &config.RemoteConfig{ + Name: o.RemoteName, + URLs: []string{o.URL}, + Fetch: r.cloneRefSpec(o), + } + + if _, err := r.CreateRemote(c); err != nil { + return err + } + + ref, err := r.fetchAndUpdateReferences(ctx, &FetchOptions{ + RefSpecs: c.Fetch, + Depth: o.Depth, + Auth: o.Auth, + Progress: o.Progress, + Tags: o.Tags, + RemoteName: o.RemoteName, + InsecureSkipTLS: o.InsecureSkipTLS, + CABundle: o.CABundle, + }, o.ReferenceName) + if err != nil { + return err + } + + if r.wt != nil && !o.NoCheckout { + w, err := r.Worktree() + if err != nil { + return err + } + + head, err := r.Head() + if err != nil { + return err + } + + if err := w.Reset(&ResetOptions{ + Mode: MergeReset, + Commit: head.Hash(), + }); err != nil { + return err + } + + if o.RecurseSubmodules != NoRecurseSubmodules { + if err := w.updateSubmodules(&SubmoduleUpdateOptions{ + RecurseSubmodules: o.RecurseSubmodules, + Auth: o.Auth, + }); err != nil { + return err + } + } + } + + if err := r.updateRemoteConfigIfNeeded(o, c, ref); err != nil { + return err + } + + if ref.Name().IsBranch() { + branchRef := ref.Name() + branchName := strings.Split(string(branchRef), "refs/heads/")[1] + + b := &config.Branch{ + Name: branchName, + Merge: branchRef, + } + + if o.RemoteName == "" { + b.Remote = "origin" + } else { + b.Remote = o.RemoteName + } + + if err := r.CreateBranch(b); err != nil { + return err + } + } + + return nil +} + +const ( + refspecTag = "+refs/tags/%s:refs/tags/%[1]s" + refspecSingleBranch = "+refs/heads/%s:refs/remotes/%s/%[1]s" + refspecSingleBranchHEAD = "+HEAD:refs/remotes/%s/HEAD" +) + +func (r *Repository) cloneRefSpec(o *CloneOptions) []config.RefSpec { + switch { + case o.ReferenceName.IsTag(): + return []config.RefSpec{ + config.RefSpec(fmt.Sprintf(refspecTag, o.ReferenceName.Short())), + } + case o.SingleBranch && o.ReferenceName == plumbing.HEAD: + return []config.RefSpec{ + config.RefSpec(fmt.Sprintf(refspecSingleBranchHEAD, o.RemoteName)), + config.RefSpec(fmt.Sprintf(refspecSingleBranch, plumbing.Master.Short(), o.RemoteName)), + } + case o.SingleBranch: + return []config.RefSpec{ + config.RefSpec(fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), o.RemoteName)), + } + default: + return []config.RefSpec{ + config.RefSpec(fmt.Sprintf(config.DefaultFetchRefSpec, o.RemoteName)), + } + } +} + +func (r *Repository) setIsBare(isBare bool) error { + cfg, err := r.Config() + if err != nil { + return err + } + + cfg.Core.IsBare = isBare + return r.Storer.SetConfig(cfg) +} + +func (r *Repository) updateRemoteConfigIfNeeded(o *CloneOptions, c *config.RemoteConfig, head *plumbing.Reference) error { + if !o.SingleBranch { + return nil + } + + c.Fetch = r.cloneRefSpec(o) + + cfg, err := r.Config() + if err != nil { + return err + } + + cfg.Remotes[c.Name] = c + return r.Storer.SetConfig(cfg) +} + +func (r *Repository) fetchAndUpdateReferences( + ctx context.Context, o *FetchOptions, ref plumbing.ReferenceName, +) (*plumbing.Reference, error) { + + if err := o.Validate(); err != nil { + return nil, err + } + + remote, err := r.Remote(o.RemoteName) + if err != nil { + return nil, err + } + + objsUpdated := true + remoteRefs, err := remote.fetch(ctx, o) + if err == NoErrAlreadyUpToDate { + objsUpdated = false + } else if err == packfile.ErrEmptyPackfile { + return nil, ErrFetching + } else if err != nil { + return nil, err + } + + resolvedRef, err := storer.ResolveReference(remoteRefs, ref) + if err != nil { + return nil, err + } + + refsUpdated, err := r.updateReferences(remote.c.Fetch, resolvedRef) + if err != nil { + return nil, err + } + + if !objsUpdated && !refsUpdated { + return nil, NoErrAlreadyUpToDate + } + + return resolvedRef, nil +} + +func (r *Repository) updateReferences(spec []config.RefSpec, + resolvedRef *plumbing.Reference) (updated bool, err error) { + + if !resolvedRef.Name().IsBranch() { + // Detached HEAD mode + h, err := r.resolveToCommitHash(resolvedRef.Hash()) + if err != nil { + return false, err + } + head := plumbing.NewHashReference(plumbing.HEAD, h) + return updateReferenceStorerIfNeeded(r.Storer, head) + } + + refs := []*plumbing.Reference{ + // Create local reference for the resolved ref + resolvedRef, + // Create local symbolic HEAD + plumbing.NewSymbolicReference(plumbing.HEAD, resolvedRef.Name()), + } + + refs = append(refs, r.calculateRemoteHeadReference(spec, resolvedRef)...) + + for _, ref := range refs { + u, err := updateReferenceStorerIfNeeded(r.Storer, ref) + if err != nil { + return updated, err + } + + if u { + updated = true + } + } + + return +} + +func (r *Repository) calculateRemoteHeadReference(spec []config.RefSpec, + resolvedHead *plumbing.Reference) []*plumbing.Reference { + + var refs []*plumbing.Reference + + // Create resolved HEAD reference with remote prefix if it does not + // exist. This is needed when using single branch and HEAD. + for _, rs := range spec { + name := resolvedHead.Name() + if !rs.Match(name) { + continue + } + + name = rs.Dst(name) + _, err := r.Storer.Reference(name) + if err == plumbing.ErrReferenceNotFound { + refs = append(refs, plumbing.NewHashReference(name, resolvedHead.Hash())) + } + } + + return refs +} + +func checkAndUpdateReferenceStorerIfNeeded( + s storer.ReferenceStorer, r, old *plumbing.Reference) ( + updated bool, err error) { + p, err := s.Reference(r.Name()) + if err != nil && err != plumbing.ErrReferenceNotFound { + return false, err + } + + // we use the string method to compare references, is the easiest way + if err == plumbing.ErrReferenceNotFound || r.String() != p.String() { + if err := s.CheckAndSetReference(r, old); err != nil { + return false, err + } + + return true, nil + } + + return false, nil +} + +func updateReferenceStorerIfNeeded( + s storer.ReferenceStorer, r *plumbing.Reference) (updated bool, err error) { + return checkAndUpdateReferenceStorerIfNeeded(s, r, nil) +} + +// Fetch fetches references along with the objects necessary to complete +// their histories, from the remote named as FetchOptions.RemoteName. +// +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +func (r *Repository) Fetch(o *FetchOptions) error { + return r.FetchContext(context.Background(), o) +} + +// FetchContext fetches references along with the objects necessary to complete +// their histories, from the remote named as FetchOptions.RemoteName. +// +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +func (r *Repository) FetchContext(ctx context.Context, o *FetchOptions) error { + if err := o.Validate(); err != nil { + return err + } + + remote, err := r.Remote(o.RemoteName) + if err != nil { + return err + } + + return remote.FetchContext(ctx, o) +} + +// Push performs a push to the remote. Returns NoErrAlreadyUpToDate if +// the remote was already up-to-date, from the remote named as +// FetchOptions.RemoteName. +func (r *Repository) Push(o *PushOptions) error { + return r.PushContext(context.Background(), o) +} + +// PushContext performs a push to the remote. Returns NoErrAlreadyUpToDate if +// the remote was already up-to-date, from the remote named as +// FetchOptions.RemoteName. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +func (r *Repository) PushContext(ctx context.Context, o *PushOptions) error { + if err := o.Validate(); err != nil { + return err + } + + remote, err := r.Remote(o.RemoteName) + if err != nil { + return err + } + + return remote.PushContext(ctx, o) +} + +// Log returns the commit history from the given LogOptions. +func (r *Repository) Log(o *LogOptions) (object.CommitIter, error) { + fn := commitIterFunc(o.Order) + if fn == nil { + return nil, fmt.Errorf("invalid Order=%v", o.Order) + } + + var ( + it object.CommitIter + err error + ) + if o.All { + it, err = r.logAll(fn) + } else { + it, err = r.log(o.From, fn) + } + + if err != nil { + return nil, err + } + + if o.FileName != nil { + // for `git log --all` also check parent (if the next commit comes from the real parent) + it = r.logWithFile(*o.FileName, it, o.All) + } + if o.PathFilter != nil { + it = r.logWithPathFilter(o.PathFilter, it, o.All) + } + + if o.Since != nil || o.Until != nil { + limitOptions := object.LogLimitOptions{Since: o.Since, Until: o.Until} + it = r.logWithLimit(it, limitOptions) + } + + return it, nil +} + +func (r *Repository) log(from plumbing.Hash, commitIterFunc func(*object.Commit) object.CommitIter) (object.CommitIter, error) { + h := from + if from == plumbing.ZeroHash { + head, err := r.Head() + if err != nil { + return nil, err + } + + h = head.Hash() + } + + commit, err := r.CommitObject(h) + if err != nil { + return nil, err + } + return commitIterFunc(commit), nil +} + +func (r *Repository) logAll(commitIterFunc func(*object.Commit) object.CommitIter) (object.CommitIter, error) { + return object.NewCommitAllIter(r.Storer, commitIterFunc) +} + +func (*Repository) logWithFile(fileName string, commitIter object.CommitIter, checkParent bool) object.CommitIter { + return object.NewCommitPathIterFromIter( + func(path string) bool { + return path == fileName + }, + commitIter, + checkParent, + ) +} + +func (*Repository) logWithPathFilter(pathFilter func(string) bool, commitIter object.CommitIter, checkParent bool) object.CommitIter { + return object.NewCommitPathIterFromIter( + pathFilter, + commitIter, + checkParent, + ) +} + +func (*Repository) logWithLimit(commitIter object.CommitIter, limitOptions object.LogLimitOptions) object.CommitIter { + return object.NewCommitLimitIterFromIter(commitIter, limitOptions) +} + +func commitIterFunc(order LogOrder) func(c *object.Commit) object.CommitIter { + switch order { + case LogOrderDefault: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitPreorderIter(c, nil, nil) + } + case LogOrderDFS: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitPreorderIter(c, nil, nil) + } + case LogOrderDFSPost: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitPostorderIter(c, nil) + } + case LogOrderBSF: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitIterBSF(c, nil, nil) + } + case LogOrderCommitterTime: + return func(c *object.Commit) object.CommitIter { + return object.NewCommitIterCTime(c, nil, nil) + } + } + return nil +} + +// Tags returns all the tag References in a repository. +// +// If you want to check to see if the tag is an annotated tag, you can call +// TagObject on the hash Reference passed in through ForEach: +// +// iter, err := r.Tags() +// if err != nil { +// // Handle error +// } +// +// if err := iter.ForEach(func (ref *plumbing.Reference) error { +// obj, err := r.TagObject(ref.Hash()) +// switch err { +// case nil: +// // Tag object present +// case plumbing.ErrObjectNotFound: +// // Not a tag object +// default: +// // Some other error +// return err +// } +// }); err != nil { +// // Handle outer iterator error +// } +// +func (r *Repository) Tags() (storer.ReferenceIter, error) { + refIter, err := r.Storer.IterReferences() + if err != nil { + return nil, err + } + + return storer.NewReferenceFilteredIter( + func(r *plumbing.Reference) bool { + return r.Name().IsTag() + }, refIter), nil +} + +// Branches returns all the References that are Branches. +func (r *Repository) Branches() (storer.ReferenceIter, error) { + refIter, err := r.Storer.IterReferences() + if err != nil { + return nil, err + } + + return storer.NewReferenceFilteredIter( + func(r *plumbing.Reference) bool { + return r.Name().IsBranch() + }, refIter), nil +} + +// Notes returns all the References that are notes. For more information: +// https://git-scm.com/docs/git-notes +func (r *Repository) Notes() (storer.ReferenceIter, error) { + refIter, err := r.Storer.IterReferences() + if err != nil { + return nil, err + } + + return storer.NewReferenceFilteredIter( + func(r *plumbing.Reference) bool { + return r.Name().IsNote() + }, refIter), nil +} + +// TreeObject return a Tree with the given hash. If not found +// plumbing.ErrObjectNotFound is returned +func (r *Repository) TreeObject(h plumbing.Hash) (*object.Tree, error) { + return object.GetTree(r.Storer, h) +} + +// TreeObjects returns an unsorted TreeIter with all the trees in the repository +func (r *Repository) TreeObjects() (*object.TreeIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.TreeObject) + if err != nil { + return nil, err + } + + return object.NewTreeIter(r.Storer, iter), nil +} + +// CommitObject return a Commit with the given hash. If not found +// plumbing.ErrObjectNotFound is returned. +func (r *Repository) CommitObject(h plumbing.Hash) (*object.Commit, error) { + return object.GetCommit(r.Storer, h) +} + +// CommitObjects returns an unsorted CommitIter with all the commits in the repository. +func (r *Repository) CommitObjects() (object.CommitIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.CommitObject) + if err != nil { + return nil, err + } + + return object.NewCommitIter(r.Storer, iter), nil +} + +// BlobObject returns a Blob with the given hash. If not found +// plumbing.ErrObjectNotFound is returned. +func (r *Repository) BlobObject(h plumbing.Hash) (*object.Blob, error) { + return object.GetBlob(r.Storer, h) +} + +// BlobObjects returns an unsorted BlobIter with all the blobs in the repository. +func (r *Repository) BlobObjects() (*object.BlobIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.BlobObject) + if err != nil { + return nil, err + } + + return object.NewBlobIter(r.Storer, iter), nil +} + +// TagObject returns a Tag with the given hash. If not found +// plumbing.ErrObjectNotFound is returned. This method only returns +// annotated Tags, no lightweight Tags. +func (r *Repository) TagObject(h plumbing.Hash) (*object.Tag, error) { + return object.GetTag(r.Storer, h) +} + +// TagObjects returns a unsorted TagIter that can step through all of the annotated +// tags in the repository. +func (r *Repository) TagObjects() (*object.TagIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.TagObject) + if err != nil { + return nil, err + } + + return object.NewTagIter(r.Storer, iter), nil +} + +// Object returns an Object with the given hash. If not found +// plumbing.ErrObjectNotFound is returned. +func (r *Repository) Object(t plumbing.ObjectType, h plumbing.Hash) (object.Object, error) { + obj, err := r.Storer.EncodedObject(t, h) + if err != nil { + return nil, err + } + + return object.DecodeObject(r.Storer, obj) +} + +// Objects returns an unsorted ObjectIter with all the objects in the repository. +func (r *Repository) Objects() (*object.ObjectIter, error) { + iter, err := r.Storer.IterEncodedObjects(plumbing.AnyObject) + if err != nil { + return nil, err + } + + return object.NewObjectIter(r.Storer, iter), nil +} + +// Head returns the reference where HEAD is pointing to. +func (r *Repository) Head() (*plumbing.Reference, error) { + return storer.ResolveReference(r.Storer, plumbing.HEAD) +} + +// Reference returns the reference for a given reference name. If resolved is +// true, any symbolic reference will be resolved. +func (r *Repository) Reference(name plumbing.ReferenceName, resolved bool) ( + *plumbing.Reference, error) { + + if resolved { + return storer.ResolveReference(r.Storer, name) + } + + return r.Storer.Reference(name) +} + +// References returns an unsorted ReferenceIter for all references. +func (r *Repository) References() (storer.ReferenceIter, error) { + return r.Storer.IterReferences() +} + +// Worktree returns a worktree based on the given fs, if nil the default +// worktree will be used. +func (r *Repository) Worktree() (*Worktree, error) { + if r.wt == nil { + return nil, ErrIsBareRepository + } + + return &Worktree{r: r, Filesystem: r.wt}, nil +} + +// ResolveRevision resolves revision to corresponding hash. It will always +// resolve to a commit hash, not a tree or annotated tag. +// +// Implemented resolvers : HEAD, branch, tag, heads/branch, refs/heads/branch, +// refs/tags/tag, refs/remotes/origin/branch, refs/remotes/origin/HEAD, tilde and caret (HEAD~1, master~^, tag~2, ref/heads/master~1, ...), selection by text (HEAD^{/fix nasty bug}), hash (prefix and full) +func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, error) { + p := revision.NewParserFromString(string(rev)) + + items, err := p.Parse() + + if err != nil { + return nil, err + } + + var commit *object.Commit + + for _, item := range items { + switch item := item.(type) { + case revision.Ref: + revisionRef := item + + var tryHashes []plumbing.Hash + + tryHashes = append(tryHashes, r.resolveHashPrefix(string(revisionRef))...) + + for _, rule := range append([]string{"%s"}, plumbing.RefRevParseRules...) { + ref, err := storer.ResolveReference(r.Storer, plumbing.ReferenceName(fmt.Sprintf(rule, revisionRef))) + + if err == nil { + tryHashes = append(tryHashes, ref.Hash()) + break + } + } + + // in ambiguous cases, `git rev-parse` will emit a warning, but + // will always return the oid in preference to a ref; we don't have + // the ability to emit a warning here, so (for speed purposes) + // don't bother to detect the ambiguity either, just return in the + // priority that git would. + gotOne := false + for _, hash := range tryHashes { + commitObj, err := r.CommitObject(hash) + if err == nil { + commit = commitObj + gotOne = true + break + } + + tagObj, err := r.TagObject(hash) + if err == nil { + // If the tag target lookup fails here, this most likely + // represents some sort of repo corruption, so let the + // error bubble up. + tagCommit, err := tagObj.Commit() + if err != nil { + return &plumbing.ZeroHash, err + } + commit = tagCommit + gotOne = true + break + } + } + + if !gotOne { + return &plumbing.ZeroHash, plumbing.ErrReferenceNotFound + } + + case revision.CaretPath: + depth := item.Depth + + if depth == 0 { + break + } + + iter := commit.Parents() + + c, err := iter.Next() + + if err != nil { + return &plumbing.ZeroHash, err + } + + if depth == 1 { + commit = c + + break + } + + c, err = iter.Next() + + if err != nil { + return &plumbing.ZeroHash, err + } + + commit = c + case revision.TildePath: + for i := 0; i < item.Depth; i++ { + c, err := commit.Parents().Next() + + if err != nil { + return &plumbing.ZeroHash, err + } + + commit = c + } + case revision.CaretReg: + history := object.NewCommitPreorderIter(commit, nil, nil) + + re := item.Regexp + negate := item.Negate + + var c *object.Commit + + err := history.ForEach(func(hc *object.Commit) error { + if !negate && re.MatchString(hc.Message) { + c = hc + return storer.ErrStop + } + + if negate && !re.MatchString(hc.Message) { + c = hc + return storer.ErrStop + } + + return nil + }) + if err != nil { + return &plumbing.ZeroHash, err + } + + if c == nil { + return &plumbing.ZeroHash, fmt.Errorf(`No commit message match regexp : "%s"`, re.String()) + } + + commit = c + } + } + + return &commit.Hash, nil +} + +// resolveHashPrefix returns a list of potential hashes that the given string +// is a prefix of. It quietly swallows errors, returning nil. +func (r *Repository) resolveHashPrefix(hashStr string) []plumbing.Hash { + // Handle complete and partial hashes. + // plumbing.NewHash forces args into a full 20 byte hash, which isn't suitable + // for partial hashes since they will become zero-filled. + + if hashStr == "" { + return nil + } + if len(hashStr) == len(plumbing.ZeroHash)*2 { + // Only a full hash is possible. + hexb, err := hex.DecodeString(hashStr) + if err != nil { + return nil + } + var h plumbing.Hash + copy(h[:], hexb) + return []plumbing.Hash{h} + } + + // Partial hash. + // hex.DecodeString only decodes to complete bytes, so only works with pairs of hex digits. + evenHex := hashStr[:len(hashStr)&^1] + hexb, err := hex.DecodeString(evenHex) + if err != nil { + return nil + } + candidates := expandPartialHash(r.Storer, hexb) + if len(evenHex) == len(hashStr) { + // The prefix was an exact number of bytes. + return candidates + } + // Do another prefix check to ensure the dangling nybble is correct. + var hashes []plumbing.Hash + for _, h := range candidates { + if strings.HasPrefix(h.String(), hashStr) { + hashes = append(hashes, h) + } + } + return hashes +} + +type RepackConfig struct { + // UseRefDeltas configures whether packfile encoder will use reference deltas. + // By default OFSDeltaObject is used. + UseRefDeltas bool + // OnlyDeletePacksOlderThan if set to non-zero value + // selects only objects older than the time provided. + OnlyDeletePacksOlderThan time.Time +} + +func (r *Repository) RepackObjects(cfg *RepackConfig) (err error) { + pos, ok := r.Storer.(storer.PackedObjectStorer) + if !ok { + return ErrPackedObjectsNotSupported + } + + // Get the existing object packs. + hs, err := pos.ObjectPacks() + if err != nil { + return err + } + + // Create a new pack. + nh, err := r.createNewObjectPack(cfg) + if err != nil { + return err + } + + // Delete old packs. + for _, h := range hs { + // Skip if new hash is the same as an old one. + if h == nh { + continue + } + err = pos.DeleteOldObjectPackAndIndex(h, cfg.OnlyDeletePacksOlderThan) + if err != nil { + return err + } + } + + return nil +} + +// createNewObjectPack is a helper for RepackObjects taking care +// of creating a new pack. It is used so the the PackfileWriter +// deferred close has the right scope. +func (r *Repository) createNewObjectPack(cfg *RepackConfig) (h plumbing.Hash, err error) { + ow := newObjectWalker(r.Storer) + err = ow.walkAllRefs() + if err != nil { + return h, err + } + objs := make([]plumbing.Hash, 0, len(ow.seen)) + for h := range ow.seen { + objs = append(objs, h) + } + pfw, ok := r.Storer.(storer.PackfileWriter) + if !ok { + return h, fmt.Errorf("Repository storer is not a storer.PackfileWriter") + } + wc, err := pfw.PackfileWriter() + if err != nil { + return h, err + } + defer ioutil.CheckClose(wc, &err) + scfg, err := r.Config() + if err != nil { + return h, err + } + enc := packfile.NewEncoder(wc, r.Storer, cfg.UseRefDeltas) + h, err = enc.Encode(objs, scfg.Pack.Window) + if err != nil { + return h, err + } + + // Delete the packed, loose objects. + if los, ok := r.Storer.(storer.LooseObjectStorer); ok { + err = los.ForEachObjectHash(func(hash plumbing.Hash) error { + if ow.isSeen(hash) { + err = los.DeleteLooseObject(hash) + if err != nil { + return err + } + } + return nil + }) + if err != nil { + return h, err + } + } + + return h, err +} + +func expandPartialHash(st storer.EncodedObjectStorer, prefix []byte) (hashes []plumbing.Hash) { + // The fast version is implemented by storage/filesystem.ObjectStorage. + type fastIter interface { + HashesWithPrefix(prefix []byte) ([]plumbing.Hash, error) + } + if fi, ok := st.(fastIter); ok { + h, err := fi.HashesWithPrefix(prefix) + if err != nil { + return nil + } + return h + } + + // Slow path. + iter, err := st.IterEncodedObjects(plumbing.AnyObject) + if err != nil { + return nil + } + iter.ForEach(func(obj plumbing.EncodedObject) error { + h := obj.Hash() + if bytes.HasPrefix(h[:], prefix) { + hashes = append(hashes, h) + } + return nil + }) + return +} diff --git a/vendor/github.com/go-git/go-git/v5/status.go b/vendor/github.com/go-git/go-git/v5/status.go new file mode 100644 index 0000000000..7f18e02278 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/status.go @@ -0,0 +1,79 @@ +package git + +import ( + "bytes" + "fmt" + "path/filepath" +) + +// Status represents the current status of a Worktree. +// The key of the map is the path of the file. +type Status map[string]*FileStatus + +// File returns the FileStatus for a given path, if the FileStatus doesn't +// exists a new FileStatus is added to the map using the path as key. +func (s Status) File(path string) *FileStatus { + if _, ok := (s)[path]; !ok { + s[path] = &FileStatus{Worktree: Untracked, Staging: Untracked} + } + + return s[path] +} + +// IsUntracked checks if file for given path is 'Untracked' +func (s Status) IsUntracked(path string) bool { + stat, ok := (s)[filepath.ToSlash(path)] + return ok && stat.Worktree == Untracked +} + +// IsClean returns true if all the files are in Unmodified status. +func (s Status) IsClean() bool { + for _, status := range s { + if status.Worktree != Unmodified || status.Staging != Unmodified { + return false + } + } + + return true +} + +func (s Status) String() string { + buf := bytes.NewBuffer(nil) + for path, status := range s { + if status.Staging == Unmodified && status.Worktree == Unmodified { + continue + } + + if status.Staging == Renamed { + path = fmt.Sprintf("%s -> %s", path, status.Extra) + } + + fmt.Fprintf(buf, "%c%c %s\n", status.Staging, status.Worktree, path) + } + + return buf.String() +} + +// FileStatus contains the status of a file in the worktree +type FileStatus struct { + // Staging is the status of a file in the staging area + Staging StatusCode + // Worktree is the status of a file in the worktree + Worktree StatusCode + // Extra contains extra information, such as the previous name in a rename + Extra string +} + +// StatusCode status code of a file in the Worktree +type StatusCode byte + +const ( + Unmodified StatusCode = ' ' + Untracked StatusCode = '?' + Modified StatusCode = 'M' + Added StatusCode = 'A' + Deleted StatusCode = 'D' + Renamed StatusCode = 'R' + Copied StatusCode = 'C' + UpdatedButUnmerged StatusCode = 'U' +) diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/config.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/config.go new file mode 100644 index 0000000000..78a646465a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/config.go @@ -0,0 +1,48 @@ +package filesystem + +import ( + "os" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +type ConfigStorage struct { + dir *dotgit.DotGit +} + +func (c *ConfigStorage) Config() (conf *config.Config, err error) { + f, err := c.dir.Config() + if err != nil { + if os.IsNotExist(err) { + return config.NewConfig(), nil + } + + return nil, err + } + + defer ioutil.CheckClose(f, &err) + return config.ReadConfig(f) +} + +func (c *ConfigStorage) SetConfig(cfg *config.Config) (err error) { + if err = cfg.Validate(); err != nil { + return err + } + + f, err := c.dir.ConfigWriter() + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + + b, err := cfg.Marshal() + if err != nil { + return err + } + + _, err = f.Write(b) + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/deltaobject.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/deltaobject.go new file mode 100644 index 0000000000..6ab2cdf38a --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/deltaobject.go @@ -0,0 +1,37 @@ +package filesystem + +import ( + "github.com/go-git/go-git/v5/plumbing" +) + +type deltaObject struct { + plumbing.EncodedObject + base plumbing.Hash + hash plumbing.Hash + size int64 +} + +func newDeltaObject( + obj plumbing.EncodedObject, + hash plumbing.Hash, + base plumbing.Hash, + size int64) plumbing.DeltaObject { + return &deltaObject{ + EncodedObject: obj, + hash: hash, + base: base, + size: size, + } +} + +func (o *deltaObject) BaseHash() plumbing.Hash { + return o.base +} + +func (o *deltaObject) ActualSize() int64 { + return o.size +} + +func (o *deltaObject) ActualHash() plumbing.Hash { + return o.hash +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go new file mode 100644 index 0000000000..6c386f7992 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go @@ -0,0 +1,1188 @@ +// https://github.com/git/git/blob/master/Documentation/gitrepository-layout.txt +package dotgit + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + stdioutil "io/ioutil" + "os" + "path/filepath" + "sort" + "strings" + "time" + + "github.com/go-git/go-billy/v5/osfs" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/storage" + "github.com/go-git/go-git/v5/utils/ioutil" + + "github.com/go-git/go-billy/v5" +) + +const ( + suffix = ".git" + packedRefsPath = "packed-refs" + configPath = "config" + indexPath = "index" + shallowPath = "shallow" + modulePath = "modules" + objectsPath = "objects" + packPath = "pack" + refsPath = "refs" + branchesPath = "branches" + hooksPath = "hooks" + infoPath = "info" + remotesPath = "remotes" + logsPath = "logs" + worktreesPath = "worktrees" + + tmpPackedRefsPrefix = "._packed-refs" + + packPrefix = "pack-" + packExt = ".pack" + idxExt = ".idx" +) + +var ( + // ErrNotFound is returned by New when the path is not found. + ErrNotFound = errors.New("path not found") + // ErrIdxNotFound is returned by Idxfile when the idx file is not found + ErrIdxNotFound = errors.New("idx file not found") + // ErrPackfileNotFound is returned by Packfile when the packfile is not found + ErrPackfileNotFound = errors.New("packfile not found") + // ErrConfigNotFound is returned by Config when the config is not found + ErrConfigNotFound = errors.New("config file not found") + // ErrPackedRefsDuplicatedRef is returned when a duplicated reference is + // found in the packed-ref file. This is usually the case for corrupted git + // repositories. + ErrPackedRefsDuplicatedRef = errors.New("duplicated ref found in packed-ref file") + // ErrPackedRefsBadFormat is returned when the packed-ref file corrupt. + ErrPackedRefsBadFormat = errors.New("malformed packed-ref") + // ErrSymRefTargetNotFound is returned when a symbolic reference is + // targeting a non-existing object. This usually means the repository + // is corrupt. + ErrSymRefTargetNotFound = errors.New("symbolic reference target not found") + // ErrIsDir is returned when a reference file is attempting to be read, + // but the path specified is a directory. + ErrIsDir = errors.New("reference path is a directory") +) + +// Options holds configuration for the storage. +type Options struct { + // ExclusiveAccess means that the filesystem is not modified externally + // while the repo is open. + ExclusiveAccess bool + // KeepDescriptors makes the file descriptors to be reused but they will + // need to be manually closed calling Close(). + KeepDescriptors bool +} + +// The DotGit type represents a local git repository on disk. This +// type is not zero-value-safe, use the New function to initialize it. +type DotGit struct { + options Options + fs billy.Filesystem + + // incoming object directory information + incomingChecked bool + incomingDirName string + + objectList []plumbing.Hash // sorted + objectMap map[plumbing.Hash]struct{} + packList []plumbing.Hash + packMap map[plumbing.Hash]struct{} + + files map[plumbing.Hash]billy.File +} + +// New returns a DotGit value ready to be used. The path argument must +// be the absolute path of a git repository directory (e.g. +// "/foo/bar/.git"). +func New(fs billy.Filesystem) *DotGit { + return NewWithOptions(fs, Options{}) +} + +// NewWithOptions sets non default configuration options. +// See New for complete help. +func NewWithOptions(fs billy.Filesystem, o Options) *DotGit { + return &DotGit{ + options: o, + fs: fs, + } +} + +// Initialize creates all the folder scaffolding. +func (d *DotGit) Initialize() error { + mustExists := []string{ + d.fs.Join("objects", "info"), + d.fs.Join("objects", "pack"), + d.fs.Join("refs", "heads"), + d.fs.Join("refs", "tags"), + } + + for _, path := range mustExists { + _, err := d.fs.Stat(path) + if err == nil { + continue + } + + if !os.IsNotExist(err) { + return err + } + + if err := d.fs.MkdirAll(path, os.ModeDir|os.ModePerm); err != nil { + return err + } + } + + return nil +} + +// Close closes all opened files. +func (d *DotGit) Close() error { + var firstError error + if d.files != nil { + for _, f := range d.files { + err := f.Close() + if err != nil && firstError == nil { + firstError = err + continue + } + } + + d.files = nil + } + + if firstError != nil { + return firstError + } + + return nil +} + +// ConfigWriter returns a file pointer for write to the config file +func (d *DotGit) ConfigWriter() (billy.File, error) { + return d.fs.Create(configPath) +} + +// Config returns a file pointer for read to the config file +func (d *DotGit) Config() (billy.File, error) { + return d.fs.Open(configPath) +} + +// IndexWriter returns a file pointer for write to the index file +func (d *DotGit) IndexWriter() (billy.File, error) { + return d.fs.Create(indexPath) +} + +// Index returns a file pointer for read to the index file +func (d *DotGit) Index() (billy.File, error) { + return d.fs.Open(indexPath) +} + +// ShallowWriter returns a file pointer for write to the shallow file +func (d *DotGit) ShallowWriter() (billy.File, error) { + return d.fs.Create(shallowPath) +} + +// Shallow returns a file pointer for read to the shallow file +func (d *DotGit) Shallow() (billy.File, error) { + f, err := d.fs.Open(shallowPath) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + + return nil, err + } + + return f, nil +} + +// NewObjectPack return a writer for a new packfile, it saves the packfile to +// disk and also generates and save the index for the given packfile. +func (d *DotGit) NewObjectPack() (*PackWriter, error) { + d.cleanPackList() + return newPackWrite(d.fs) +} + +// ObjectPacks returns the list of availables packfiles +func (d *DotGit) ObjectPacks() ([]plumbing.Hash, error) { + if !d.options.ExclusiveAccess { + return d.objectPacks() + } + + err := d.genPackList() + if err != nil { + return nil, err + } + + return d.packList, nil +} + +func (d *DotGit) objectPacks() ([]plumbing.Hash, error) { + packDir := d.fs.Join(objectsPath, packPath) + files, err := d.fs.ReadDir(packDir) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + + return nil, err + } + + var packs []plumbing.Hash + for _, f := range files { + n := f.Name() + if !strings.HasSuffix(n, packExt) || !strings.HasPrefix(n, packPrefix) { + continue + } + + h := plumbing.NewHash(n[5 : len(n)-5]) //pack-(hash).pack + if h.IsZero() { + // Ignore files with badly-formatted names. + continue + } + packs = append(packs, h) + } + + return packs, nil +} + +func (d *DotGit) objectPackPath(hash plumbing.Hash, extension string) string { + return d.fs.Join(objectsPath, packPath, fmt.Sprintf("pack-%s.%s", hash.String(), extension)) +} + +func (d *DotGit) objectPackOpen(hash plumbing.Hash, extension string) (billy.File, error) { + if d.options.KeepDescriptors && extension == "pack" { + if d.files == nil { + d.files = make(map[plumbing.Hash]billy.File) + } + + f, ok := d.files[hash] + if ok { + return f, nil + } + } + + err := d.hasPack(hash) + if err != nil { + return nil, err + } + + path := d.objectPackPath(hash, extension) + pack, err := d.fs.Open(path) + if err != nil { + if os.IsNotExist(err) { + return nil, ErrPackfileNotFound + } + + return nil, err + } + + if d.options.KeepDescriptors && extension == "pack" { + d.files[hash] = pack + } + + return pack, nil +} + +// ObjectPack returns a fs.File of the given packfile +func (d *DotGit) ObjectPack(hash plumbing.Hash) (billy.File, error) { + err := d.hasPack(hash) + if err != nil { + return nil, err + } + + return d.objectPackOpen(hash, `pack`) +} + +// ObjectPackIdx returns a fs.File of the index file for a given packfile +func (d *DotGit) ObjectPackIdx(hash plumbing.Hash) (billy.File, error) { + err := d.hasPack(hash) + if err != nil { + return nil, err + } + + return d.objectPackOpen(hash, `idx`) +} + +func (d *DotGit) DeleteOldObjectPackAndIndex(hash plumbing.Hash, t time.Time) error { + d.cleanPackList() + + path := d.objectPackPath(hash, `pack`) + if !t.IsZero() { + fi, err := d.fs.Stat(path) + if err != nil { + return err + } + // too new, skip deletion. + if !fi.ModTime().Before(t) { + return nil + } + } + err := d.fs.Remove(path) + if err != nil { + return err + } + return d.fs.Remove(d.objectPackPath(hash, `idx`)) +} + +// NewObject return a writer for a new object file. +func (d *DotGit) NewObject() (*ObjectWriter, error) { + d.cleanObjectList() + + return newObjectWriter(d.fs) +} + +// ObjectsWithPrefix returns the hashes of objects that have the given prefix. +func (d *DotGit) ObjectsWithPrefix(prefix []byte) ([]plumbing.Hash, error) { + // Handle edge cases. + if len(prefix) < 1 { + return d.Objects() + } else if len(prefix) > len(plumbing.ZeroHash) { + return nil, nil + } + + if d.options.ExclusiveAccess { + err := d.genObjectList() + if err != nil { + return nil, err + } + + // Rely on d.objectList being sorted. + // Figure out the half-open interval defined by the prefix. + first := sort.Search(len(d.objectList), func(i int) bool { + // Same as plumbing.HashSlice.Less. + return bytes.Compare(d.objectList[i][:], prefix) >= 0 + }) + lim := len(d.objectList) + if limPrefix, overflow := incBytes(prefix); !overflow { + lim = sort.Search(len(d.objectList), func(i int) bool { + // Same as plumbing.HashSlice.Less. + return bytes.Compare(d.objectList[i][:], limPrefix) >= 0 + }) + } + return d.objectList[first:lim], nil + } + + // This is the slow path. + var objects []plumbing.Hash + var n int + err := d.ForEachObjectHash(func(hash plumbing.Hash) error { + n++ + if bytes.HasPrefix(hash[:], prefix) { + objects = append(objects, hash) + } + return nil + }) + if err != nil { + return nil, err + } + return objects, nil +} + +// Objects returns a slice with the hashes of objects found under the +// .git/objects/ directory. +func (d *DotGit) Objects() ([]plumbing.Hash, error) { + if d.options.ExclusiveAccess { + err := d.genObjectList() + if err != nil { + return nil, err + } + + return d.objectList, nil + } + + var objects []plumbing.Hash + err := d.ForEachObjectHash(func(hash plumbing.Hash) error { + objects = append(objects, hash) + return nil + }) + if err != nil { + return nil, err + } + return objects, nil +} + +// ForEachObjectHash iterates over the hashes of objects found under the +// .git/objects/ directory and executes the provided function. +func (d *DotGit) ForEachObjectHash(fun func(plumbing.Hash) error) error { + if !d.options.ExclusiveAccess { + return d.forEachObjectHash(fun) + } + + err := d.genObjectList() + if err != nil { + return err + } + + for _, h := range d.objectList { + err := fun(h) + if err != nil { + return err + } + } + + return nil +} + +func (d *DotGit) forEachObjectHash(fun func(plumbing.Hash) error) error { + files, err := d.fs.ReadDir(objectsPath) + if err != nil { + if os.IsNotExist(err) { + return nil + } + + return err + } + + for _, f := range files { + if f.IsDir() && len(f.Name()) == 2 && isHex(f.Name()) { + base := f.Name() + d, err := d.fs.ReadDir(d.fs.Join(objectsPath, base)) + if err != nil { + return err + } + + for _, o := range d { + h := plumbing.NewHash(base + o.Name()) + if h.IsZero() { + // Ignore files with badly-formatted names. + continue + } + err = fun(h) + if err != nil { + return err + } + } + } + } + + return nil +} + +func (d *DotGit) cleanObjectList() { + d.objectMap = nil + d.objectList = nil +} + +func (d *DotGit) genObjectList() error { + if d.objectMap != nil { + return nil + } + + d.objectMap = make(map[plumbing.Hash]struct{}) + populate := func(h plumbing.Hash) error { + d.objectList = append(d.objectList, h) + d.objectMap[h] = struct{}{} + + return nil + } + if err := d.forEachObjectHash(populate); err != nil { + return err + } + plumbing.HashesSort(d.objectList) + return nil +} + +func (d *DotGit) hasObject(h plumbing.Hash) error { + if !d.options.ExclusiveAccess { + return nil + } + + err := d.genObjectList() + if err != nil { + return err + } + + _, ok := d.objectMap[h] + if !ok { + return plumbing.ErrObjectNotFound + } + + return nil +} + +func (d *DotGit) cleanPackList() { + d.packMap = nil + d.packList = nil +} + +func (d *DotGit) genPackList() error { + if d.packMap != nil { + return nil + } + + op, err := d.objectPacks() + if err != nil { + return err + } + + d.packMap = make(map[plumbing.Hash]struct{}) + d.packList = nil + + for _, h := range op { + d.packList = append(d.packList, h) + d.packMap[h] = struct{}{} + } + + return nil +} + +func (d *DotGit) hasPack(h plumbing.Hash) error { + if !d.options.ExclusiveAccess { + return nil + } + + err := d.genPackList() + if err != nil { + return err + } + + _, ok := d.packMap[h] + if !ok { + return ErrPackfileNotFound + } + + return nil +} + +func (d *DotGit) objectPath(h plumbing.Hash) string { + hash := h.String() + return d.fs.Join(objectsPath, hash[0:2], hash[2:40]) +} + +// incomingObjectPath is intended to add support for a git pre-receive hook +// to be written it adds support for go-git to find objects in an "incoming" +// directory, so that the library can be used to write a pre-receive hook +// that deals with the incoming objects. +// +// More on git hooks found here : https://git-scm.com/docs/githooks +// More on 'quarantine'/incoming directory here: +// https://git-scm.com/docs/git-receive-pack +func (d *DotGit) incomingObjectPath(h plumbing.Hash) string { + hString := h.String() + + if d.incomingDirName == "" { + return d.fs.Join(objectsPath, hString[0:2], hString[2:40]) + } + + return d.fs.Join(objectsPath, d.incomingDirName, hString[0:2], hString[2:40]) +} + +// hasIncomingObjects searches for an incoming directory and keeps its name +// so it doesn't have to be found each time an object is accessed. +func (d *DotGit) hasIncomingObjects() bool { + if !d.incomingChecked { + directoryContents, err := d.fs.ReadDir(objectsPath) + if err == nil { + for _, file := range directoryContents { + if strings.HasPrefix(file.Name(), "incoming-") && file.IsDir() { + d.incomingDirName = file.Name() + } + } + } + + d.incomingChecked = true + } + + return d.incomingDirName != "" +} + +// Object returns a fs.File pointing the object file, if exists +func (d *DotGit) Object(h plumbing.Hash) (billy.File, error) { + err := d.hasObject(h) + if err != nil { + return nil, err + } + + obj1, err1 := d.fs.Open(d.objectPath(h)) + if os.IsNotExist(err1) && d.hasIncomingObjects() { + obj2, err2 := d.fs.Open(d.incomingObjectPath(h)) + if err2 != nil { + return obj1, err1 + } + return obj2, err2 + } + return obj1, err1 +} + +// ObjectStat returns a os.FileInfo pointing the object file, if exists +func (d *DotGit) ObjectStat(h plumbing.Hash) (os.FileInfo, error) { + err := d.hasObject(h) + if err != nil { + return nil, err + } + + obj1, err1 := d.fs.Stat(d.objectPath(h)) + if os.IsNotExist(err1) && d.hasIncomingObjects() { + obj2, err2 := d.fs.Stat(d.incomingObjectPath(h)) + if err2 != nil { + return obj1, err1 + } + return obj2, err2 + } + return obj1, err1 +} + +// ObjectDelete removes the object file, if exists +func (d *DotGit) ObjectDelete(h plumbing.Hash) error { + d.cleanObjectList() + + err1 := d.fs.Remove(d.objectPath(h)) + if os.IsNotExist(err1) && d.hasIncomingObjects() { + err2 := d.fs.Remove(d.incomingObjectPath(h)) + if err2 != nil { + return err1 + } + return err2 + } + return err1 +} + +func (d *DotGit) readReferenceFrom(rd io.Reader, name string) (ref *plumbing.Reference, err error) { + b, err := stdioutil.ReadAll(rd) + if err != nil { + return nil, err + } + + line := strings.TrimSpace(string(b)) + return plumbing.NewReferenceFromStrings(name, line), nil +} + +func (d *DotGit) checkReferenceAndTruncate(f billy.File, old *plumbing.Reference) error { + if old == nil { + return nil + } + ref, err := d.readReferenceFrom(f, old.Name().String()) + if err != nil { + return err + } + if ref.Hash() != old.Hash() { + return storage.ErrReferenceHasChanged + } + _, err = f.Seek(0, io.SeekStart) + if err != nil { + return err + } + return f.Truncate(0) +} + +func (d *DotGit) SetRef(r, old *plumbing.Reference) error { + var content string + switch r.Type() { + case plumbing.SymbolicReference: + content = fmt.Sprintf("ref: %s\n", r.Target()) + case plumbing.HashReference: + content = fmt.Sprintln(r.Hash().String()) + } + + fileName := r.Name().String() + + return d.setRef(fileName, content, old) +} + +// Refs scans the git directory collecting references, which it returns. +// Symbolic references are resolved and included in the output. +func (d *DotGit) Refs() ([]*plumbing.Reference, error) { + var refs []*plumbing.Reference + var seen = make(map[plumbing.ReferenceName]bool) + if err := d.addRefsFromRefDir(&refs, seen); err != nil { + return nil, err + } + + if err := d.addRefsFromPackedRefs(&refs, seen); err != nil { + return nil, err + } + + if err := d.addRefFromHEAD(&refs); err != nil { + return nil, err + } + + return refs, nil +} + +// Ref returns the reference for a given reference name. +func (d *DotGit) Ref(name plumbing.ReferenceName) (*plumbing.Reference, error) { + ref, err := d.readReferenceFile(".", name.String()) + if err == nil { + return ref, nil + } + + return d.packedRef(name) +} + +func (d *DotGit) findPackedRefsInFile(f billy.File) ([]*plumbing.Reference, error) { + s := bufio.NewScanner(f) + var refs []*plumbing.Reference + for s.Scan() { + ref, err := d.processLine(s.Text()) + if err != nil { + return nil, err + } + + if ref != nil { + refs = append(refs, ref) + } + } + + return refs, s.Err() +} + +func (d *DotGit) findPackedRefs() (r []*plumbing.Reference, err error) { + f, err := d.fs.Open(packedRefsPath) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + + defer ioutil.CheckClose(f, &err) + return d.findPackedRefsInFile(f) +} + +func (d *DotGit) packedRef(name plumbing.ReferenceName) (*plumbing.Reference, error) { + refs, err := d.findPackedRefs() + if err != nil { + return nil, err + } + + for _, ref := range refs { + if ref.Name() == name { + return ref, nil + } + } + + return nil, plumbing.ErrReferenceNotFound +} + +// RemoveRef removes a reference by name. +func (d *DotGit) RemoveRef(name plumbing.ReferenceName) error { + path := d.fs.Join(".", name.String()) + _, err := d.fs.Stat(path) + if err == nil { + err = d.fs.Remove(path) + // Drop down to remove it from the packed refs file, too. + } + + if err != nil && !os.IsNotExist(err) { + return err + } + + return d.rewritePackedRefsWithoutRef(name) +} + +func (d *DotGit) addRefsFromPackedRefs(refs *[]*plumbing.Reference, seen map[plumbing.ReferenceName]bool) (err error) { + packedRefs, err := d.findPackedRefs() + if err != nil { + return err + } + + for _, ref := range packedRefs { + if !seen[ref.Name()] { + *refs = append(*refs, ref) + seen[ref.Name()] = true + } + } + return nil +} + +func (d *DotGit) addRefsFromPackedRefsFile(refs *[]*plumbing.Reference, f billy.File, seen map[plumbing.ReferenceName]bool) (err error) { + packedRefs, err := d.findPackedRefsInFile(f) + if err != nil { + return err + } + + for _, ref := range packedRefs { + if !seen[ref.Name()] { + *refs = append(*refs, ref) + seen[ref.Name()] = true + } + } + return nil +} + +func (d *DotGit) openAndLockPackedRefs(doCreate bool) ( + pr billy.File, err error) { + var f billy.File + defer func() { + if err != nil && f != nil { + ioutil.CheckClose(f, &err) + } + }() + + // File mode is retrieved from a constant defined in the target specific + // files (dotgit_rewrite_packed_refs_*). Some modes are not available + // in all filesystems. + openFlags := d.openAndLockPackedRefsMode() + if doCreate { + openFlags |= os.O_CREATE + } + + // Keep trying to open and lock the file until we're sure the file + // didn't change between the open and the lock. + for { + f, err = d.fs.OpenFile(packedRefsPath, openFlags, 0600) + if err != nil { + if os.IsNotExist(err) && !doCreate { + return nil, nil + } + + return nil, err + } + fi, err := d.fs.Stat(packedRefsPath) + if err != nil { + return nil, err + } + mtime := fi.ModTime() + + err = f.Lock() + if err != nil { + return nil, err + } + + fi, err = d.fs.Stat(packedRefsPath) + if err != nil { + return nil, err + } + if mtime.Equal(fi.ModTime()) { + break + } + // The file has changed since we opened it. Close and retry. + err = f.Close() + if err != nil { + return nil, err + } + } + return f, nil +} + +func (d *DotGit) rewritePackedRefsWithoutRef(name plumbing.ReferenceName) (err error) { + pr, err := d.openAndLockPackedRefs(false) + if err != nil { + return err + } + if pr == nil { + return nil + } + defer ioutil.CheckClose(pr, &err) + + // Creating the temp file in the same directory as the target file + // improves our chances for rename operation to be atomic. + tmp, err := d.fs.TempFile("", tmpPackedRefsPrefix) + if err != nil { + return err + } + tmpName := tmp.Name() + defer func() { + ioutil.CheckClose(tmp, &err) + _ = d.fs.Remove(tmpName) // don't check err, we might have renamed it + }() + + s := bufio.NewScanner(pr) + found := false + for s.Scan() { + line := s.Text() + ref, err := d.processLine(line) + if err != nil { + return err + } + + if ref != nil && ref.Name() == name { + found = true + continue + } + + if _, err := fmt.Fprintln(tmp, line); err != nil { + return err + } + } + + if err := s.Err(); err != nil { + return err + } + + if !found { + return nil + } + + return d.rewritePackedRefsWhileLocked(tmp, pr) +} + +// process lines from a packed-refs file +func (d *DotGit) processLine(line string) (*plumbing.Reference, error) { + if len(line) == 0 { + return nil, nil + } + + switch line[0] { + case '#': // comment - ignore + return nil, nil + case '^': // annotated tag commit of the previous line - ignore + return nil, nil + default: + ws := strings.Split(line, " ") // hash then ref + if len(ws) != 2 { + return nil, ErrPackedRefsBadFormat + } + + return plumbing.NewReferenceFromStrings(ws[1], ws[0]), nil + } +} + +func (d *DotGit) addRefsFromRefDir(refs *[]*plumbing.Reference, seen map[plumbing.ReferenceName]bool) error { + return d.walkReferencesTree(refs, []string{refsPath}, seen) +} + +func (d *DotGit) walkReferencesTree(refs *[]*plumbing.Reference, relPath []string, seen map[plumbing.ReferenceName]bool) error { + files, err := d.fs.ReadDir(d.fs.Join(relPath...)) + if err != nil { + if os.IsNotExist(err) { + return nil + } + + return err + } + + for _, f := range files { + newRelPath := append(append([]string(nil), relPath...), f.Name()) + if f.IsDir() { + if err = d.walkReferencesTree(refs, newRelPath, seen); err != nil { + return err + } + + continue + } + + ref, err := d.readReferenceFile(".", strings.Join(newRelPath, "/")) + if err != nil { + return err + } + + if ref != nil && !seen[ref.Name()] { + *refs = append(*refs, ref) + seen[ref.Name()] = true + } + } + + return nil +} + +func (d *DotGit) addRefFromHEAD(refs *[]*plumbing.Reference) error { + ref, err := d.readReferenceFile(".", "HEAD") + if err != nil { + if os.IsNotExist(err) { + return nil + } + + return err + } + + *refs = append(*refs, ref) + return nil +} + +func (d *DotGit) readReferenceFile(path, name string) (ref *plumbing.Reference, err error) { + path = d.fs.Join(path, d.fs.Join(strings.Split(name, "/")...)) + st, err := d.fs.Stat(path) + if err != nil { + return nil, err + } + if st.IsDir() { + return nil, ErrIsDir + } + + f, err := d.fs.Open(path) + if err != nil { + return nil, err + } + defer ioutil.CheckClose(f, &err) + + return d.readReferenceFrom(f, name) +} + +func (d *DotGit) CountLooseRefs() (int, error) { + var refs []*plumbing.Reference + var seen = make(map[plumbing.ReferenceName]bool) + if err := d.addRefsFromRefDir(&refs, seen); err != nil { + return 0, err + } + + return len(refs), nil +} + +// PackRefs packs all loose refs into the packed-refs file. +// +// This implementation only works under the assumption that the view +// of the file system won't be updated during this operation. This +// strategy would not work on a general file system though, without +// locking each loose reference and checking it again before deleting +// the file, because otherwise an updated reference could sneak in and +// then be deleted by the packed-refs process. Alternatively, every +// ref update could also lock packed-refs, so only one lock is +// required during ref-packing. But that would worsen performance in +// the common case. +// +// TODO: add an "all" boolean like the `git pack-refs --all` flag. +// When `all` is false, it would only pack refs that have already been +// packed, plus all tags. +func (d *DotGit) PackRefs() (err error) { + // Lock packed-refs, and create it if it doesn't exist yet. + f, err := d.openAndLockPackedRefs(true) + if err != nil { + return err + } + defer ioutil.CheckClose(f, &err) + + // Gather all refs using addRefsFromRefDir and addRefsFromPackedRefs. + var refs []*plumbing.Reference + seen := make(map[plumbing.ReferenceName]bool) + if err = d.addRefsFromRefDir(&refs, seen); err != nil { + return err + } + if len(refs) == 0 { + // Nothing to do! + return nil + } + numLooseRefs := len(refs) + if err = d.addRefsFromPackedRefsFile(&refs, f, seen); err != nil { + return err + } + + // Write them all to a new temp packed-refs file. + tmp, err := d.fs.TempFile("", tmpPackedRefsPrefix) + if err != nil { + return err + } + tmpName := tmp.Name() + defer func() { + ioutil.CheckClose(tmp, &err) + _ = d.fs.Remove(tmpName) // don't check err, we might have renamed it + }() + + w := bufio.NewWriter(tmp) + for _, ref := range refs { + _, err = w.WriteString(ref.String() + "\n") + if err != nil { + return err + } + } + err = w.Flush() + if err != nil { + return err + } + + // Rename the temp packed-refs file. + err = d.rewritePackedRefsWhileLocked(tmp, f) + if err != nil { + return err + } + + // Delete all the loose refs, while still holding the packed-refs + // lock. + for _, ref := range refs[:numLooseRefs] { + path := d.fs.Join(".", ref.Name().String()) + err = d.fs.Remove(path) + if err != nil && !os.IsNotExist(err) { + return err + } + } + + return nil +} + +// Module return a billy.Filesystem pointing to the module folder +func (d *DotGit) Module(name string) (billy.Filesystem, error) { + return d.fs.Chroot(d.fs.Join(modulePath, name)) +} + +// Alternates returns DotGit(s) based off paths in objects/info/alternates if +// available. This can be used to checks if it's a shared repository. +func (d *DotGit) Alternates() ([]*DotGit, error) { + altpath := d.fs.Join("objects", "info", "alternates") + f, err := d.fs.Open(altpath) + if err != nil { + return nil, err + } + defer f.Close() + + var alternates []*DotGit + + // Read alternate paths line-by-line and create DotGit objects. + scanner := bufio.NewScanner(f) + for scanner.Scan() { + path := scanner.Text() + if !filepath.IsAbs(path) { + // For relative paths, we can perform an internal conversion to + // slash so that they work cross-platform. + slashPath := filepath.ToSlash(path) + // If the path is not absolute, it must be relative to object + // database (.git/objects/info). + // https://www.kernel.org/pub/software/scm/git/docs/gitrepository-layout.html + // Hence, derive a path relative to DotGit's root. + // "../../../reponame/.git/" -> "../../reponame/.git" + // Remove the first ../ + relpath := filepath.Join(strings.Split(slashPath, "/")[1:]...) + normalPath := filepath.FromSlash(relpath) + path = filepath.Join(d.fs.Root(), normalPath) + } + fs := osfs.New(filepath.Dir(path)) + alternates = append(alternates, New(fs)) + } + + if err = scanner.Err(); err != nil { + return nil, err + } + + return alternates, nil +} + +// Fs returns the underlying filesystem of the DotGit folder. +func (d *DotGit) Fs() billy.Filesystem { + return d.fs +} + +func isHex(s string) bool { + for _, b := range []byte(s) { + if isNum(b) { + continue + } + if isHexAlpha(b) { + continue + } + + return false + } + + return true +} + +func isNum(b byte) bool { + return b >= '0' && b <= '9' +} + +func isHexAlpha(b byte) bool { + return b >= 'a' && b <= 'f' || b >= 'A' && b <= 'F' +} + +// incBytes increments a byte slice, which involves incrementing the +// right-most byte, and following carry leftward. +// It makes a copy so that the provided slice's underlying array is not modified. +// If the overall operation overflows (e.g. incBytes(0xff, 0xff)), the second return parameter indicates that. +func incBytes(in []byte) (out []byte, overflow bool) { + out = make([]byte, len(in)) + copy(out, in) + for i := len(out) - 1; i >= 0; i-- { + out[i]++ + if out[i] != 0 { + return // Didn't overflow. + } + } + overflow = true + return +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go new file mode 100644 index 0000000000..43263eadfa --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go @@ -0,0 +1,81 @@ +package dotgit + +import ( + "io" + "os" + "runtime" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +func (d *DotGit) openAndLockPackedRefsMode() int { + if billy.CapabilityCheck(d.fs, billy.ReadAndWriteCapability) { + return os.O_RDWR + } + + return os.O_RDONLY +} + +func (d *DotGit) rewritePackedRefsWhileLocked( + tmp billy.File, pr billy.File) error { + // Try plain rename. If we aren't using the bare Windows filesystem as the + // storage layer, we might be able to get away with a rename over a locked + // file. + err := d.fs.Rename(tmp.Name(), pr.Name()) + if err == nil { + return nil + } + + // If we are in a filesystem that does not support rename (e.g. sivafs) + // a full copy is done. + if err == billy.ErrNotSupported { + return d.copyNewFile(tmp, pr) + } + + if runtime.GOOS != "windows" { + return err + } + + // Otherwise, Windows doesn't let us rename over a locked file, so + // we have to do a straight copy. Unfortunately this could result + // in a partially-written file if the process fails before the + // copy completes. + return d.copyToExistingFile(tmp, pr) +} + +func (d *DotGit) copyToExistingFile(tmp, pr billy.File) error { + _, err := pr.Seek(0, io.SeekStart) + if err != nil { + return err + } + err = pr.Truncate(0) + if err != nil { + return err + } + _, err = tmp.Seek(0, io.SeekStart) + if err != nil { + return err + } + _, err = io.Copy(pr, tmp) + + return err +} + +func (d *DotGit) copyNewFile(tmp billy.File, pr billy.File) (err error) { + prWrite, err := d.fs.Create(pr.Name()) + if err != nil { + return err + } + + defer ioutil.CheckClose(prWrite, &err) + + _, err = tmp.Seek(0, io.SeekStart) + if err != nil { + return err + } + + _, err = io.Copy(prWrite, tmp) + + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_setref.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_setref.go new file mode 100644 index 0000000000..c057f5c486 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_setref.go @@ -0,0 +1,90 @@ +package dotgit + +import ( + "fmt" + "os" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/utils/ioutil" + + "github.com/go-git/go-billy/v5" +) + +func (d *DotGit) setRef(fileName, content string, old *plumbing.Reference) (err error) { + if billy.CapabilityCheck(d.fs, billy.ReadAndWriteCapability) { + return d.setRefRwfs(fileName, content, old) + } + + return d.setRefNorwfs(fileName, content, old) +} + +func (d *DotGit) setRefRwfs(fileName, content string, old *plumbing.Reference) (err error) { + // If we are not checking an old ref, just truncate the file. + mode := os.O_RDWR | os.O_CREATE + if old == nil { + mode |= os.O_TRUNC + } + + f, err := d.fs.OpenFile(fileName, mode, 0666) + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + + // Lock is unlocked by the deferred Close above. This is because Unlock + // does not imply a fsync and thus there would be a race between + // Unlock+Close and other concurrent writers. Adding Sync to go-billy + // could work, but this is better (and avoids superfluous syncs). + err = f.Lock() + if err != nil { + return err + } + + // this is a no-op to call even when old is nil. + err = d.checkReferenceAndTruncate(f, old) + if err != nil { + return err + } + + _, err = f.Write([]byte(content)) + return err +} + +// There are some filesystems that don't support opening files in RDWD mode. +// In these filesystems the standard SetRef function can not be used as it +// reads the reference file to check that it's not modified before updating it. +// +// This version of the function writes the reference without extra checks +// making it compatible with these simple filesystems. This is usually not +// a problem as they should be accessed by only one process at a time. +func (d *DotGit) setRefNorwfs(fileName, content string, old *plumbing.Reference) error { + _, err := d.fs.Stat(fileName) + if err == nil && old != nil { + fRead, err := d.fs.Open(fileName) + if err != nil { + return err + } + + ref, err := d.readReferenceFrom(fRead, old.Name().String()) + fRead.Close() + + if err != nil { + return err + } + + if ref.Hash() != old.Hash() { + return fmt.Errorf("reference has changed concurrently") + } + } + + f, err := d.fs.Create(fileName) + if err != nil { + return err + } + + defer f.Close() + + _, err = f.Write([]byte(content)) + return err +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/repository_filesystem.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/repository_filesystem.go new file mode 100644 index 0000000000..8d243efea1 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/repository_filesystem.go @@ -0,0 +1,111 @@ +package dotgit + +import ( + "os" + "path/filepath" + "strings" + + "github.com/go-git/go-billy/v5" +) + +// RepositoryFilesystem is a billy.Filesystem compatible object wrapper +// which handles dot-git filesystem operations and supports commondir according to git scm layout: +// https://github.com/git/git/blob/master/Documentation/gitrepository-layout.txt +type RepositoryFilesystem struct { + dotGitFs billy.Filesystem + commonDotGitFs billy.Filesystem +} + +func NewRepositoryFilesystem(dotGitFs, commonDotGitFs billy.Filesystem) *RepositoryFilesystem { + return &RepositoryFilesystem{ + dotGitFs: dotGitFs, + commonDotGitFs: commonDotGitFs, + } +} + +func (fs *RepositoryFilesystem) mapToRepositoryFsByPath(path string) billy.Filesystem { + // Nothing to decide if commondir not defined + if fs.commonDotGitFs == nil { + return fs.dotGitFs + } + + cleanPath := filepath.Clean(path) + + // Check exceptions for commondir (https://git-scm.com/docs/gitrepository-layout#Documentation/gitrepository-layout.txt) + switch cleanPath { + case fs.dotGitFs.Join(logsPath, "HEAD"): + return fs.dotGitFs + case fs.dotGitFs.Join(refsPath, "bisect"), fs.dotGitFs.Join(refsPath, "rewritten"), fs.dotGitFs.Join(refsPath, "worktree"): + return fs.dotGitFs + } + + // Determine dot-git root by first path element. + // There are some elements which should always use commondir when commondir defined. + // Usual dot-git root will be used for the rest of files. + switch strings.Split(cleanPath, string(filepath.Separator))[0] { + case objectsPath, refsPath, packedRefsPath, configPath, branchesPath, hooksPath, infoPath, remotesPath, logsPath, shallowPath, worktreesPath: + return fs.commonDotGitFs + default: + return fs.dotGitFs + } +} + +func (fs *RepositoryFilesystem) Create(filename string) (billy.File, error) { + return fs.mapToRepositoryFsByPath(filename).Create(filename) +} + +func (fs *RepositoryFilesystem) Open(filename string) (billy.File, error) { + return fs.mapToRepositoryFsByPath(filename).Open(filename) +} + +func (fs *RepositoryFilesystem) OpenFile(filename string, flag int, perm os.FileMode) (billy.File, error) { + return fs.mapToRepositoryFsByPath(filename).OpenFile(filename, flag, perm) +} + +func (fs *RepositoryFilesystem) Stat(filename string) (os.FileInfo, error) { + return fs.mapToRepositoryFsByPath(filename).Stat(filename) +} + +func (fs *RepositoryFilesystem) Rename(oldpath, newpath string) error { + return fs.mapToRepositoryFsByPath(oldpath).Rename(oldpath, newpath) +} + +func (fs *RepositoryFilesystem) Remove(filename string) error { + return fs.mapToRepositoryFsByPath(filename).Remove(filename) +} + +func (fs *RepositoryFilesystem) Join(elem ...string) string { + return fs.dotGitFs.Join(elem...) +} + +func (fs *RepositoryFilesystem) TempFile(dir, prefix string) (billy.File, error) { + return fs.mapToRepositoryFsByPath(dir).TempFile(dir, prefix) +} + +func (fs *RepositoryFilesystem) ReadDir(path string) ([]os.FileInfo, error) { + return fs.mapToRepositoryFsByPath(path).ReadDir(path) +} + +func (fs *RepositoryFilesystem) MkdirAll(filename string, perm os.FileMode) error { + return fs.mapToRepositoryFsByPath(filename).MkdirAll(filename, perm) +} + +func (fs *RepositoryFilesystem) Lstat(filename string) (os.FileInfo, error) { + return fs.mapToRepositoryFsByPath(filename).Lstat(filename) +} + +func (fs *RepositoryFilesystem) Symlink(target, link string) error { + return fs.mapToRepositoryFsByPath(target).Symlink(target, link) +} + +func (fs *RepositoryFilesystem) Readlink(link string) (string, error) { + return fs.mapToRepositoryFsByPath(link).Readlink(link) +} + +func (fs *RepositoryFilesystem) Chroot(path string) (billy.Filesystem, error) { + return fs.mapToRepositoryFsByPath(path).Chroot(path) +} + +func (fs *RepositoryFilesystem) Root() string { + return fs.dotGitFs.Root() +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go new file mode 100644 index 0000000000..e2ede938cc --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go @@ -0,0 +1,284 @@ +package dotgit + +import ( + "fmt" + "io" + "sync/atomic" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/idxfile" + "github.com/go-git/go-git/v5/plumbing/format/objfile" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + + "github.com/go-git/go-billy/v5" +) + +// PackWriter is a io.Writer that generates the packfile index simultaneously, +// a packfile.Decoder is used with a file reader to read the file being written +// this operation is synchronized with the write operations. +// The packfile is written in a temp file, when Close is called this file +// is renamed/moved (depends on the Filesystem implementation) to the final +// location, if the PackWriter is not used, nothing is written +type PackWriter struct { + Notify func(plumbing.Hash, *idxfile.Writer) + + fs billy.Filesystem + fr, fw billy.File + synced *syncedReader + checksum plumbing.Hash + parser *packfile.Parser + writer *idxfile.Writer + result chan error +} + +func newPackWrite(fs billy.Filesystem) (*PackWriter, error) { + fw, err := fs.TempFile(fs.Join(objectsPath, packPath), "tmp_pack_") + if err != nil { + return nil, err + } + + fr, err := fs.Open(fw.Name()) + if err != nil { + return nil, err + } + + writer := &PackWriter{ + fs: fs, + fw: fw, + fr: fr, + synced: newSyncedReader(fw, fr), + result: make(chan error), + } + + go writer.buildIndex() + return writer, nil +} + +func (w *PackWriter) buildIndex() { + s := packfile.NewScanner(w.synced) + w.writer = new(idxfile.Writer) + var err error + w.parser, err = packfile.NewParser(s, w.writer) + if err != nil { + w.result <- err + return + } + + checksum, err := w.parser.Parse() + if err != nil { + w.result <- err + return + } + + w.checksum = checksum + w.result <- err +} + +// waitBuildIndex waits until buildIndex function finishes, this can terminate +// with a packfile.ErrEmptyPackfile, this means that nothing was written so we +// ignore the error +func (w *PackWriter) waitBuildIndex() error { + err := <-w.result + if err == packfile.ErrEmptyPackfile { + return nil + } + + return err +} + +func (w *PackWriter) Write(p []byte) (int, error) { + return w.synced.Write(p) +} + +// Close closes all the file descriptors and save the final packfile, if nothing +// was written, the tempfiles are deleted without writing a packfile. +func (w *PackWriter) Close() error { + defer func() { + if w.Notify != nil && w.writer != nil && w.writer.Finished() { + w.Notify(w.checksum, w.writer) + } + + close(w.result) + }() + + if err := w.synced.Close(); err != nil { + return err + } + + if err := w.waitBuildIndex(); err != nil { + return err + } + + if err := w.fr.Close(); err != nil { + return err + } + + if err := w.fw.Close(); err != nil { + return err + } + + if w.writer == nil || !w.writer.Finished() { + return w.clean() + } + + return w.save() +} + +func (w *PackWriter) clean() error { + return w.fs.Remove(w.fw.Name()) +} + +func (w *PackWriter) save() error { + base := w.fs.Join(objectsPath, packPath, fmt.Sprintf("pack-%s", w.checksum)) + idx, err := w.fs.Create(fmt.Sprintf("%s.idx", base)) + if err != nil { + return err + } + + if err := w.encodeIdx(idx); err != nil { + return err + } + + if err := idx.Close(); err != nil { + return err + } + + return w.fs.Rename(w.fw.Name(), fmt.Sprintf("%s.pack", base)) +} + +func (w *PackWriter) encodeIdx(writer io.Writer) error { + idx, err := w.writer.Index() + if err != nil { + return err + } + + e := idxfile.NewEncoder(writer) + _, err = e.Encode(idx) + return err +} + +type syncedReader struct { + w io.Writer + r io.ReadSeeker + + blocked, done uint32 + written, read uint64 + news chan bool +} + +func newSyncedReader(w io.Writer, r io.ReadSeeker) *syncedReader { + return &syncedReader{ + w: w, + r: r, + news: make(chan bool), + } +} + +func (s *syncedReader) Write(p []byte) (n int, err error) { + defer func() { + written := atomic.AddUint64(&s.written, uint64(n)) + read := atomic.LoadUint64(&s.read) + if written > read { + s.wake() + } + }() + + n, err = s.w.Write(p) + return +} + +func (s *syncedReader) Read(p []byte) (n int, err error) { + defer func() { atomic.AddUint64(&s.read, uint64(n)) }() + + for { + s.sleep() + n, err = s.r.Read(p) + if err == io.EOF && !s.isDone() && n == 0 { + continue + } + + break + } + + return +} + +func (s *syncedReader) isDone() bool { + return atomic.LoadUint32(&s.done) == 1 +} + +func (s *syncedReader) isBlocked() bool { + return atomic.LoadUint32(&s.blocked) == 1 +} + +func (s *syncedReader) wake() { + if s.isBlocked() { + atomic.StoreUint32(&s.blocked, 0) + s.news <- true + } +} + +func (s *syncedReader) sleep() { + read := atomic.LoadUint64(&s.read) + written := atomic.LoadUint64(&s.written) + if read >= written { + atomic.StoreUint32(&s.blocked, 1) + <-s.news + } + +} + +func (s *syncedReader) Seek(offset int64, whence int) (int64, error) { + if whence == io.SeekCurrent { + return s.r.Seek(offset, whence) + } + + p, err := s.r.Seek(offset, whence) + atomic.StoreUint64(&s.read, uint64(p)) + + return p, err +} + +func (s *syncedReader) Close() error { + atomic.StoreUint32(&s.done, 1) + close(s.news) + return nil +} + +type ObjectWriter struct { + objfile.Writer + fs billy.Filesystem + f billy.File +} + +func newObjectWriter(fs billy.Filesystem) (*ObjectWriter, error) { + f, err := fs.TempFile(fs.Join(objectsPath, packPath), "tmp_obj_") + if err != nil { + return nil, err + } + + return &ObjectWriter{ + Writer: (*objfile.NewWriter(f)), + fs: fs, + f: f, + }, nil +} + +func (w *ObjectWriter) Close() error { + if err := w.Writer.Close(); err != nil { + return err + } + + if err := w.f.Close(); err != nil { + return err + } + + return w.save() +} + +func (w *ObjectWriter) save() error { + hash := w.Hash().String() + file := w.fs.Join(objectsPath, hash[0:2], hash[2:40]) + + return w.fs.Rename(w.f.Name(), file) +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/index.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/index.go new file mode 100644 index 0000000000..a19176f83d --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/index.go @@ -0,0 +1,54 @@ +package filesystem + +import ( + "bufio" + "os" + + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +type IndexStorage struct { + dir *dotgit.DotGit +} + +func (s *IndexStorage) SetIndex(idx *index.Index) (err error) { + f, err := s.dir.IndexWriter() + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + bw := bufio.NewWriter(f) + defer func() { + if e := bw.Flush(); err == nil && e != nil { + err = e + } + }() + + e := index.NewEncoder(bw) + err = e.Encode(idx) + return err +} + +func (s *IndexStorage) Index() (i *index.Index, err error) { + idx := &index.Index{ + Version: 2, + } + + f, err := s.dir.Index() + if err != nil { + if os.IsNotExist(err) { + return idx, nil + } + + return nil, err + } + + defer ioutil.CheckClose(f, &err) + + d := index.NewDecoder(bufio.NewReader(f)) + err = d.Decode(idx) + return idx, err +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/module.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/module.go new file mode 100644 index 0000000000..20336c1184 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/module.go @@ -0,0 +1,20 @@ +package filesystem + +import ( + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/storage" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" +) + +type ModuleStorage struct { + dir *dotgit.DotGit +} + +func (s *ModuleStorage) Module(name string) (storage.Storer, error) { + fs, err := s.dir.Module(name) + if err != nil { + return nil, err + } + + return NewStorage(fs, cache.NewObjectLRUDefault()), nil +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go new file mode 100644 index 0000000000..0c25dad613 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go @@ -0,0 +1,848 @@ +package filesystem + +import ( + "bytes" + "io" + "os" + "time" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/plumbing/format/idxfile" + "github.com/go-git/go-git/v5/plumbing/format/objfile" + "github.com/go-git/go-git/v5/plumbing/format/packfile" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" + + "github.com/go-git/go-billy/v5" +) + +type ObjectStorage struct { + options Options + + // objectCache is an object cache uses to cache delta's bases and also recently + // loaded loose objects + objectCache cache.Object + + dir *dotgit.DotGit + index map[plumbing.Hash]idxfile.Index + + packList []plumbing.Hash + packListIdx int + packfiles map[plumbing.Hash]*packfile.Packfile +} + +// NewObjectStorage creates a new ObjectStorage with the given .git directory and cache. +func NewObjectStorage(dir *dotgit.DotGit, objectCache cache.Object) *ObjectStorage { + return NewObjectStorageWithOptions(dir, objectCache, Options{}) +} + +// NewObjectStorageWithOptions creates a new ObjectStorage with the given .git directory, cache and extra options +func NewObjectStorageWithOptions(dir *dotgit.DotGit, objectCache cache.Object, ops Options) *ObjectStorage { + return &ObjectStorage{ + options: ops, + objectCache: objectCache, + dir: dir, + } +} + +func (s *ObjectStorage) requireIndex() error { + if s.index != nil { + return nil + } + + s.index = make(map[plumbing.Hash]idxfile.Index) + packs, err := s.dir.ObjectPacks() + if err != nil { + return err + } + + for _, h := range packs { + if err := s.loadIdxFile(h); err != nil { + return err + } + } + + return nil +} + +// Reindex indexes again all packfiles. Useful if git changed packfiles externally +func (s *ObjectStorage) Reindex() { + s.index = nil +} + +func (s *ObjectStorage) loadIdxFile(h plumbing.Hash) (err error) { + f, err := s.dir.ObjectPackIdx(h) + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + + idxf := idxfile.NewMemoryIndex() + d := idxfile.NewDecoder(f) + if err = d.Decode(idxf); err != nil { + return err + } + + s.index[h] = idxf + return err +} + +func (s *ObjectStorage) NewEncodedObject() plumbing.EncodedObject { + return &plumbing.MemoryObject{} +} + +func (s *ObjectStorage) PackfileWriter() (io.WriteCloser, error) { + if err := s.requireIndex(); err != nil { + return nil, err + } + + w, err := s.dir.NewObjectPack() + if err != nil { + return nil, err + } + + w.Notify = func(h plumbing.Hash, writer *idxfile.Writer) { + index, err := writer.Index() + if err == nil { + s.index[h] = index + } + } + + return w, nil +} + +// SetEncodedObject adds a new object to the storage. +func (s *ObjectStorage) SetEncodedObject(o plumbing.EncodedObject) (h plumbing.Hash, err error) { + if o.Type() == plumbing.OFSDeltaObject || o.Type() == plumbing.REFDeltaObject { + return plumbing.ZeroHash, plumbing.ErrInvalidType + } + + ow, err := s.dir.NewObject() + if err != nil { + return plumbing.ZeroHash, err + } + + defer ioutil.CheckClose(ow, &err) + + or, err := o.Reader() + if err != nil { + return plumbing.ZeroHash, err + } + + defer ioutil.CheckClose(or, &err) + + if err = ow.WriteHeader(o.Type(), o.Size()); err != nil { + return plumbing.ZeroHash, err + } + + if _, err = io.Copy(ow, or); err != nil { + return plumbing.ZeroHash, err + } + + return o.Hash(), err +} + +// HasEncodedObject returns nil if the object exists, without actually +// reading the object data from storage. +func (s *ObjectStorage) HasEncodedObject(h plumbing.Hash) (err error) { + // Check unpacked objects + f, err := s.dir.Object(h) + if err != nil { + if !os.IsNotExist(err) { + return err + } + // Fall through to check packed objects. + } else { + defer ioutil.CheckClose(f, &err) + return nil + } + + // Check packed objects. + if err := s.requireIndex(); err != nil { + return err + } + _, _, offset := s.findObjectInPackfile(h) + if offset == -1 { + return plumbing.ErrObjectNotFound + } + return nil +} + +func (s *ObjectStorage) encodedObjectSizeFromUnpacked(h plumbing.Hash) ( + size int64, err error) { + f, err := s.dir.Object(h) + if err != nil { + if os.IsNotExist(err) { + return 0, plumbing.ErrObjectNotFound + } + + return 0, err + } + + r, err := objfile.NewReader(f) + if err != nil { + return 0, err + } + defer ioutil.CheckClose(r, &err) + + _, size, err = r.Header() + return size, err +} + +func (s *ObjectStorage) packfile(idx idxfile.Index, pack plumbing.Hash) (*packfile.Packfile, error) { + if p := s.packfileFromCache(pack); p != nil { + return p, nil + } + + f, err := s.dir.ObjectPack(pack) + if err != nil { + return nil, err + } + + var p *packfile.Packfile + if s.objectCache != nil { + p = packfile.NewPackfileWithCache(idx, s.dir.Fs(), f, s.objectCache) + } else { + p = packfile.NewPackfile(idx, s.dir.Fs(), f) + } + + return p, s.storePackfileInCache(pack, p) +} + +func (s *ObjectStorage) packfileFromCache(hash plumbing.Hash) *packfile.Packfile { + if s.packfiles == nil { + if s.options.KeepDescriptors { + s.packfiles = make(map[plumbing.Hash]*packfile.Packfile) + } else if s.options.MaxOpenDescriptors > 0 { + s.packList = make([]plumbing.Hash, s.options.MaxOpenDescriptors) + s.packfiles = make(map[plumbing.Hash]*packfile.Packfile, s.options.MaxOpenDescriptors) + } + } + + return s.packfiles[hash] +} + +func (s *ObjectStorage) storePackfileInCache(hash plumbing.Hash, p *packfile.Packfile) error { + if s.options.KeepDescriptors { + s.packfiles[hash] = p + return nil + } + + if s.options.MaxOpenDescriptors <= 0 { + return nil + } + + // start over as the limit of packList is hit + if s.packListIdx >= len(s.packList) { + s.packListIdx = 0 + } + + // close the existing packfile if open + if next := s.packList[s.packListIdx]; !next.IsZero() { + open := s.packfiles[next] + delete(s.packfiles, next) + if open != nil { + if err := open.Close(); err != nil { + return err + } + } + } + + // cache newly open packfile + s.packList[s.packListIdx] = hash + s.packfiles[hash] = p + s.packListIdx++ + + return nil +} + +func (s *ObjectStorage) encodedObjectSizeFromPackfile(h plumbing.Hash) ( + size int64, err error) { + if err := s.requireIndex(); err != nil { + return 0, err + } + + pack, _, offset := s.findObjectInPackfile(h) + if offset == -1 { + return 0, plumbing.ErrObjectNotFound + } + + idx := s.index[pack] + hash, err := idx.FindHash(offset) + if err == nil { + obj, ok := s.objectCache.Get(hash) + if ok { + return obj.Size(), nil + } + } else if err != nil && err != plumbing.ErrObjectNotFound { + return 0, err + } + + p, err := s.packfile(idx, pack) + if err != nil { + return 0, err + } + + if !s.options.KeepDescriptors && s.options.MaxOpenDescriptors == 0 { + defer ioutil.CheckClose(p, &err) + } + + return p.GetSizeByOffset(offset) +} + +// EncodedObjectSize returns the plaintext size of the given object, +// without actually reading the full object data from storage. +func (s *ObjectStorage) EncodedObjectSize(h plumbing.Hash) ( + size int64, err error) { + size, err = s.encodedObjectSizeFromUnpacked(h) + if err != nil && err != plumbing.ErrObjectNotFound { + return 0, err + } else if err == nil { + return size, nil + } + + return s.encodedObjectSizeFromPackfile(h) +} + +// EncodedObject returns the object with the given hash, by searching for it in +// the packfile and the git object directories. +func (s *ObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) { + var obj plumbing.EncodedObject + var err error + + if s.index != nil { + obj, err = s.getFromPackfile(h, false) + if err == plumbing.ErrObjectNotFound { + obj, err = s.getFromUnpacked(h) + } + } else { + obj, err = s.getFromUnpacked(h) + if err == plumbing.ErrObjectNotFound { + obj, err = s.getFromPackfile(h, false) + } + } + + // If the error is still object not found, check if it's a shared object + // repository. + if err == plumbing.ErrObjectNotFound { + dotgits, e := s.dir.Alternates() + if e == nil { + // Create a new object storage with the DotGit(s) and check for the + // required hash object. Skip when not found. + for _, dg := range dotgits { + o := NewObjectStorage(dg, s.objectCache) + enobj, enerr := o.EncodedObject(t, h) + if enerr != nil { + continue + } + return enobj, nil + } + } + } + + if err != nil { + return nil, err + } + + if plumbing.AnyObject != t && obj.Type() != t { + return nil, plumbing.ErrObjectNotFound + } + + return obj, nil +} + +// DeltaObject returns the object with the given hash, by searching for +// it in the packfile and the git object directories. +func (s *ObjectStorage) DeltaObject(t plumbing.ObjectType, + h plumbing.Hash) (plumbing.EncodedObject, error) { + obj, err := s.getFromUnpacked(h) + if err == plumbing.ErrObjectNotFound { + obj, err = s.getFromPackfile(h, true) + } + + if err != nil { + return nil, err + } + + if plumbing.AnyObject != t && obj.Type() != t { + return nil, plumbing.ErrObjectNotFound + } + + return obj, nil +} + +func (s *ObjectStorage) getFromUnpacked(h plumbing.Hash) (obj plumbing.EncodedObject, err error) { + f, err := s.dir.Object(h) + if err != nil { + if os.IsNotExist(err) { + return nil, plumbing.ErrObjectNotFound + } + + return nil, err + } + defer ioutil.CheckClose(f, &err) + + if cacheObj, found := s.objectCache.Get(h); found { + return cacheObj, nil + } + + obj = s.NewEncodedObject() + r, err := objfile.NewReader(f) + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(r, &err) + + t, size, err := r.Header() + if err != nil { + return nil, err + } + + obj.SetType(t) + obj.SetSize(size) + w, err := obj.Writer() + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(w, &err) + + s.objectCache.Put(obj) + + _, err = io.Copy(w, r) + return obj, err +} + +// Get returns the object with the given hash, by searching for it in +// the packfile. +func (s *ObjectStorage) getFromPackfile(h plumbing.Hash, canBeDelta bool) ( + plumbing.EncodedObject, error) { + + if err := s.requireIndex(); err != nil { + return nil, err + } + + pack, hash, offset := s.findObjectInPackfile(h) + if offset == -1 { + return nil, plumbing.ErrObjectNotFound + } + + idx := s.index[pack] + p, err := s.packfile(idx, pack) + if err != nil { + return nil, err + } + + if !s.options.KeepDescriptors && s.options.MaxOpenDescriptors == 0 { + defer ioutil.CheckClose(p, &err) + } + + if canBeDelta { + return s.decodeDeltaObjectAt(p, offset, hash) + } + + return s.decodeObjectAt(p, offset) +} + +func (s *ObjectStorage) decodeObjectAt( + p *packfile.Packfile, + offset int64, +) (plumbing.EncodedObject, error) { + hash, err := p.FindHash(offset) + if err == nil { + obj, ok := s.objectCache.Get(hash) + if ok { + return obj, nil + } + } + + if err != nil && err != plumbing.ErrObjectNotFound { + return nil, err + } + + return p.GetByOffset(offset) +} + +func (s *ObjectStorage) decodeDeltaObjectAt( + p *packfile.Packfile, + offset int64, + hash plumbing.Hash, +) (plumbing.EncodedObject, error) { + scan := p.Scanner() + header, err := scan.SeekObjectHeader(offset) + if err != nil { + return nil, err + } + + var ( + base plumbing.Hash + ) + + switch header.Type { + case plumbing.REFDeltaObject: + base = header.Reference + case plumbing.OFSDeltaObject: + base, err = p.FindHash(header.OffsetReference) + if err != nil { + return nil, err + } + default: + return s.decodeObjectAt(p, offset) + } + + obj := &plumbing.MemoryObject{} + obj.SetType(header.Type) + w, err := obj.Writer() + if err != nil { + return nil, err + } + + if _, _, err := scan.NextObject(w); err != nil { + return nil, err + } + + return newDeltaObject(obj, hash, base, header.Length), nil +} + +func (s *ObjectStorage) findObjectInPackfile(h plumbing.Hash) (plumbing.Hash, plumbing.Hash, int64) { + for packfile, index := range s.index { + offset, err := index.FindOffset(h) + if err == nil { + return packfile, h, offset + } + } + + return plumbing.ZeroHash, plumbing.ZeroHash, -1 +} + +func (s *ObjectStorage) HashesWithPrefix(prefix []byte) ([]plumbing.Hash, error) { + hashes, err := s.dir.ObjectsWithPrefix(prefix) + if err != nil { + return nil, err + } + + // TODO: This could be faster with some idxfile changes, + // or diving into the packfile. + for _, index := range s.index { + ei, err := index.Entries() + if err != nil { + return nil, err + } + for { + e, err := ei.Next() + if err == io.EOF { + break + } else if err != nil { + return nil, err + } + if bytes.HasPrefix(e.Hash[:], prefix) { + hashes = append(hashes, e.Hash) + } + } + ei.Close() + } + + return hashes, nil +} + +// IterEncodedObjects returns an iterator for all the objects in the packfile +// with the given type. +func (s *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.EncodedObjectIter, error) { + objects, err := s.dir.Objects() + if err != nil { + return nil, err + } + + seen := make(map[plumbing.Hash]struct{}) + var iters []storer.EncodedObjectIter + if len(objects) != 0 { + iters = append(iters, &objectsIter{s: s, t: t, h: objects}) + seen = hashListAsMap(objects) + } + + packi, err := s.buildPackfileIters(t, seen) + if err != nil { + return nil, err + } + + iters = append(iters, packi) + return storer.NewMultiEncodedObjectIter(iters), nil +} + +func (s *ObjectStorage) buildPackfileIters( + t plumbing.ObjectType, + seen map[plumbing.Hash]struct{}, +) (storer.EncodedObjectIter, error) { + if err := s.requireIndex(); err != nil { + return nil, err + } + + packs, err := s.dir.ObjectPacks() + if err != nil { + return nil, err + } + return &lazyPackfilesIter{ + hashes: packs, + open: func(h plumbing.Hash) (storer.EncodedObjectIter, error) { + pack, err := s.dir.ObjectPack(h) + if err != nil { + return nil, err + } + return newPackfileIter( + s.dir.Fs(), pack, t, seen, s.index[h], + s.objectCache, s.options.KeepDescriptors, + ) + }, + }, nil +} + +// Close closes all opened files. +func (s *ObjectStorage) Close() error { + var firstError error + if s.options.KeepDescriptors || s.options.MaxOpenDescriptors > 0 { + for _, packfile := range s.packfiles { + err := packfile.Close() + if firstError == nil && err != nil { + firstError = err + } + } + } + + s.packfiles = nil + s.dir.Close() + + return firstError +} + +type lazyPackfilesIter struct { + hashes []plumbing.Hash + open func(h plumbing.Hash) (storer.EncodedObjectIter, error) + cur storer.EncodedObjectIter +} + +func (it *lazyPackfilesIter) Next() (plumbing.EncodedObject, error) { + for { + if it.cur == nil { + if len(it.hashes) == 0 { + return nil, io.EOF + } + h := it.hashes[0] + it.hashes = it.hashes[1:] + + sub, err := it.open(h) + if err == io.EOF { + continue + } else if err != nil { + return nil, err + } + it.cur = sub + } + ob, err := it.cur.Next() + if err == io.EOF { + it.cur.Close() + it.cur = nil + continue + } else if err != nil { + return nil, err + } + return ob, nil + } +} + +func (it *lazyPackfilesIter) ForEach(cb func(plumbing.EncodedObject) error) error { + return storer.ForEachIterator(it, cb) +} + +func (it *lazyPackfilesIter) Close() { + if it.cur != nil { + it.cur.Close() + it.cur = nil + } + it.hashes = nil +} + +type packfileIter struct { + pack billy.File + iter storer.EncodedObjectIter + seen map[plumbing.Hash]struct{} + + // tells whether the pack file should be left open after iteration or not + keepPack bool +} + +// NewPackfileIter returns a new EncodedObjectIter for the provided packfile +// and object type. Packfile and index file will be closed after they're +// used. If keepPack is true the packfile won't be closed after the iteration +// finished. +func NewPackfileIter( + fs billy.Filesystem, + f billy.File, + idxFile billy.File, + t plumbing.ObjectType, + keepPack bool, +) (storer.EncodedObjectIter, error) { + idx := idxfile.NewMemoryIndex() + if err := idxfile.NewDecoder(idxFile).Decode(idx); err != nil { + return nil, err + } + + if err := idxFile.Close(); err != nil { + return nil, err + } + + seen := make(map[plumbing.Hash]struct{}) + return newPackfileIter(fs, f, t, seen, idx, nil, keepPack) +} + +func newPackfileIter( + fs billy.Filesystem, + f billy.File, + t plumbing.ObjectType, + seen map[plumbing.Hash]struct{}, + index idxfile.Index, + cache cache.Object, + keepPack bool, +) (storer.EncodedObjectIter, error) { + var p *packfile.Packfile + if cache != nil { + p = packfile.NewPackfileWithCache(index, fs, f, cache) + } else { + p = packfile.NewPackfile(index, fs, f) + } + + iter, err := p.GetByType(t) + if err != nil { + return nil, err + } + + return &packfileIter{ + pack: f, + iter: iter, + seen: seen, + keepPack: keepPack, + }, nil +} + +func (iter *packfileIter) Next() (plumbing.EncodedObject, error) { + for { + obj, err := iter.iter.Next() + if err != nil { + return nil, err + } + + if _, ok := iter.seen[obj.Hash()]; ok { + continue + } + + return obj, nil + } +} + +func (iter *packfileIter) ForEach(cb func(plumbing.EncodedObject) error) error { + for { + o, err := iter.Next() + if err != nil { + if err == io.EOF { + iter.Close() + return nil + } + return err + } + + if err := cb(o); err != nil { + return err + } + } +} + +func (iter *packfileIter) Close() { + iter.iter.Close() + if !iter.keepPack { + _ = iter.pack.Close() + } +} + +type objectsIter struct { + s *ObjectStorage + t plumbing.ObjectType + h []plumbing.Hash +} + +func (iter *objectsIter) Next() (plumbing.EncodedObject, error) { + if len(iter.h) == 0 { + return nil, io.EOF + } + + obj, err := iter.s.getFromUnpacked(iter.h[0]) + iter.h = iter.h[1:] + + if err != nil { + return nil, err + } + + if iter.t != plumbing.AnyObject && iter.t != obj.Type() { + return iter.Next() + } + + return obj, err +} + +func (iter *objectsIter) ForEach(cb func(plumbing.EncodedObject) error) error { + for { + o, err := iter.Next() + if err != nil { + if err == io.EOF { + return nil + } + return err + } + + if err := cb(o); err != nil { + return err + } + } +} + +func (iter *objectsIter) Close() { + iter.h = []plumbing.Hash{} +} + +func hashListAsMap(l []plumbing.Hash) map[plumbing.Hash]struct{} { + m := make(map[plumbing.Hash]struct{}, len(l)) + for _, h := range l { + m[h] = struct{}{} + } + return m +} + +func (s *ObjectStorage) ForEachObjectHash(fun func(plumbing.Hash) error) error { + err := s.dir.ForEachObjectHash(fun) + if err == storer.ErrStop { + return nil + } + return err +} + +func (s *ObjectStorage) LooseObjectTime(hash plumbing.Hash) (time.Time, error) { + fi, err := s.dir.ObjectStat(hash) + if err != nil { + return time.Time{}, err + } + return fi.ModTime(), nil +} + +func (s *ObjectStorage) DeleteLooseObject(hash plumbing.Hash) error { + return s.dir.ObjectDelete(hash) +} + +func (s *ObjectStorage) ObjectPacks() ([]plumbing.Hash, error) { + return s.dir.ObjectPacks() +} + +func (s *ObjectStorage) DeleteOldObjectPackAndIndex(h plumbing.Hash, t time.Time) error { + return s.dir.DeleteOldObjectPackAndIndex(h, t) +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/reference.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/reference.go new file mode 100644 index 0000000000..aabcd7308d --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/reference.go @@ -0,0 +1,44 @@ +package filesystem + +import ( + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" +) + +type ReferenceStorage struct { + dir *dotgit.DotGit +} + +func (r *ReferenceStorage) SetReference(ref *plumbing.Reference) error { + return r.dir.SetRef(ref, nil) +} + +func (r *ReferenceStorage) CheckAndSetReference(ref, old *plumbing.Reference) error { + return r.dir.SetRef(ref, old) +} + +func (r *ReferenceStorage) Reference(n plumbing.ReferenceName) (*plumbing.Reference, error) { + return r.dir.Ref(n) +} + +func (r *ReferenceStorage) IterReferences() (storer.ReferenceIter, error) { + refs, err := r.dir.Refs() + if err != nil { + return nil, err + } + + return storer.NewReferenceSliceIter(refs), nil +} + +func (r *ReferenceStorage) RemoveReference(n plumbing.ReferenceName) error { + return r.dir.RemoveRef(n) +} + +func (r *ReferenceStorage) CountLooseRefs() (int, error) { + return r.dir.CountLooseRefs() +} + +func (r *ReferenceStorage) PackRefs() error { + return r.dir.PackRefs() +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/shallow.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/shallow.go new file mode 100644 index 0000000000..afb600cf2d --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/shallow.go @@ -0,0 +1,54 @@ +package filesystem + +import ( + "bufio" + "fmt" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + "github.com/go-git/go-git/v5/utils/ioutil" +) + +// ShallowStorage where the shallow commits are stored, an internal to +// manipulate the shallow file +type ShallowStorage struct { + dir *dotgit.DotGit +} + +// SetShallow save the shallows in the shallow file in the .git folder as one +// commit per line represented by 40-byte hexadecimal object terminated by a +// newline. +func (s *ShallowStorage) SetShallow(commits []plumbing.Hash) error { + f, err := s.dir.ShallowWriter() + if err != nil { + return err + } + + defer ioutil.CheckClose(f, &err) + for _, h := range commits { + if _, err := fmt.Fprintf(f, "%s\n", h); err != nil { + return err + } + } + + return err +} + +// Shallow return the shallow commits reading from shallo file from .git +func (s *ShallowStorage) Shallow() ([]plumbing.Hash, error) { + f, err := s.dir.Shallow() + if f == nil || err != nil { + return nil, err + } + + defer ioutil.CheckClose(f, &err) + + var hash []plumbing.Hash + + scn := bufio.NewScanner(f) + for scn.Scan() { + hash = append(hash, plumbing.NewHash(scn.Text())) + } + + return hash, scn.Err() +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/filesystem/storage.go b/vendor/github.com/go-git/go-git/v5/storage/filesystem/storage.go new file mode 100644 index 0000000000..8b69b27b00 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/filesystem/storage.go @@ -0,0 +1,73 @@ +// Package filesystem is a storage backend base on filesystems +package filesystem + +import ( + "github.com/go-git/go-git/v5/plumbing/cache" + "github.com/go-git/go-git/v5/storage/filesystem/dotgit" + + "github.com/go-git/go-billy/v5" +) + +// Storage is an implementation of git.Storer that stores data on disk in the +// standard git format (this is, the .git directory). Zero values of this type +// are not safe to use, see the NewStorage function below. +type Storage struct { + fs billy.Filesystem + dir *dotgit.DotGit + + ObjectStorage + ReferenceStorage + IndexStorage + ShallowStorage + ConfigStorage + ModuleStorage +} + +// Options holds configuration for the storage. +type Options struct { + // ExclusiveAccess means that the filesystem is not modified externally + // while the repo is open. + ExclusiveAccess bool + // KeepDescriptors makes the file descriptors to be reused but they will + // need to be manually closed calling Close(). + KeepDescriptors bool + // MaxOpenDescriptors is the max number of file descriptors to keep + // open. If KeepDescriptors is true, all file descriptors will remain open. + MaxOpenDescriptors int +} + +// NewStorage returns a new Storage backed by a given `fs.Filesystem` and cache. +func NewStorage(fs billy.Filesystem, cache cache.Object) *Storage { + return NewStorageWithOptions(fs, cache, Options{}) +} + +// NewStorageWithOptions returns a new Storage with extra options, +// backed by a given `fs.Filesystem` and cache. +func NewStorageWithOptions(fs billy.Filesystem, cache cache.Object, ops Options) *Storage { + dirOps := dotgit.Options{ + ExclusiveAccess: ops.ExclusiveAccess, + } + dir := dotgit.NewWithOptions(fs, dirOps) + + return &Storage{ + fs: fs, + dir: dir, + + ObjectStorage: *NewObjectStorageWithOptions(dir, cache, ops), + ReferenceStorage: ReferenceStorage{dir: dir}, + IndexStorage: IndexStorage{dir: dir}, + ShallowStorage: ShallowStorage{dir: dir}, + ConfigStorage: ConfigStorage{dir: dir}, + ModuleStorage: ModuleStorage{dir: dir}, + } +} + +// Filesystem returns the underlying filesystem +func (s *Storage) Filesystem() billy.Filesystem { + return s.fs +} + +// Init initializes .git directory +func (s *Storage) Init() error { + return s.dir.Initialize() +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/memory/storage.go b/vendor/github.com/go-git/go-git/v5/storage/memory/storage.go new file mode 100644 index 0000000000..a8e56697b9 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/memory/storage.go @@ -0,0 +1,320 @@ +// Package memory is a storage backend base on memory +package memory + +import ( + "fmt" + "time" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/storage" +) + +var ErrUnsupportedObjectType = fmt.Errorf("unsupported object type") + +// Storage is an implementation of git.Storer that stores data on memory, being +// ephemeral. The use of this storage should be done in controlled environments, +// since the representation in memory of some repository can fill the machine +// memory. in the other hand this storage has the best performance. +type Storage struct { + ConfigStorage + ObjectStorage + ShallowStorage + IndexStorage + ReferenceStorage + ModuleStorage +} + +// NewStorage returns a new Storage base on memory +func NewStorage() *Storage { + return &Storage{ + ReferenceStorage: make(ReferenceStorage), + ConfigStorage: ConfigStorage{}, + ShallowStorage: ShallowStorage{}, + ObjectStorage: ObjectStorage{ + Objects: make(map[plumbing.Hash]plumbing.EncodedObject), + Commits: make(map[plumbing.Hash]plumbing.EncodedObject), + Trees: make(map[plumbing.Hash]plumbing.EncodedObject), + Blobs: make(map[plumbing.Hash]plumbing.EncodedObject), + Tags: make(map[plumbing.Hash]plumbing.EncodedObject), + }, + ModuleStorage: make(ModuleStorage), + } +} + +type ConfigStorage struct { + config *config.Config +} + +func (c *ConfigStorage) SetConfig(cfg *config.Config) error { + if err := cfg.Validate(); err != nil { + return err + } + + c.config = cfg + return nil +} + +func (c *ConfigStorage) Config() (*config.Config, error) { + if c.config == nil { + c.config = config.NewConfig() + } + + return c.config, nil +} + +type IndexStorage struct { + index *index.Index +} + +func (c *IndexStorage) SetIndex(idx *index.Index) error { + c.index = idx + return nil +} + +func (c *IndexStorage) Index() (*index.Index, error) { + if c.index == nil { + c.index = &index.Index{Version: 2} + } + + return c.index, nil +} + +type ObjectStorage struct { + Objects map[plumbing.Hash]plumbing.EncodedObject + Commits map[plumbing.Hash]plumbing.EncodedObject + Trees map[plumbing.Hash]plumbing.EncodedObject + Blobs map[plumbing.Hash]plumbing.EncodedObject + Tags map[plumbing.Hash]plumbing.EncodedObject +} + +func (o *ObjectStorage) NewEncodedObject() plumbing.EncodedObject { + return &plumbing.MemoryObject{} +} + +func (o *ObjectStorage) SetEncodedObject(obj plumbing.EncodedObject) (plumbing.Hash, error) { + h := obj.Hash() + o.Objects[h] = obj + + switch obj.Type() { + case plumbing.CommitObject: + o.Commits[h] = o.Objects[h] + case plumbing.TreeObject: + o.Trees[h] = o.Objects[h] + case plumbing.BlobObject: + o.Blobs[h] = o.Objects[h] + case plumbing.TagObject: + o.Tags[h] = o.Objects[h] + default: + return h, ErrUnsupportedObjectType + } + + return h, nil +} + +func (o *ObjectStorage) HasEncodedObject(h plumbing.Hash) (err error) { + if _, ok := o.Objects[h]; !ok { + return plumbing.ErrObjectNotFound + } + return nil +} + +func (o *ObjectStorage) EncodedObjectSize(h plumbing.Hash) ( + size int64, err error) { + obj, ok := o.Objects[h] + if !ok { + return 0, plumbing.ErrObjectNotFound + } + + return obj.Size(), nil +} + +func (o *ObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) { + obj, ok := o.Objects[h] + if !ok || (plumbing.AnyObject != t && obj.Type() != t) { + return nil, plumbing.ErrObjectNotFound + } + + return obj, nil +} + +func (o *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.EncodedObjectIter, error) { + var series []plumbing.EncodedObject + switch t { + case plumbing.AnyObject: + series = flattenObjectMap(o.Objects) + case plumbing.CommitObject: + series = flattenObjectMap(o.Commits) + case plumbing.TreeObject: + series = flattenObjectMap(o.Trees) + case plumbing.BlobObject: + series = flattenObjectMap(o.Blobs) + case plumbing.TagObject: + series = flattenObjectMap(o.Tags) + } + + return storer.NewEncodedObjectSliceIter(series), nil +} + +func flattenObjectMap(m map[plumbing.Hash]plumbing.EncodedObject) []plumbing.EncodedObject { + objects := make([]plumbing.EncodedObject, 0, len(m)) + for _, obj := range m { + objects = append(objects, obj) + } + return objects +} + +func (o *ObjectStorage) Begin() storer.Transaction { + return &TxObjectStorage{ + Storage: o, + Objects: make(map[plumbing.Hash]plumbing.EncodedObject), + } +} + +func (o *ObjectStorage) ForEachObjectHash(fun func(plumbing.Hash) error) error { + for h := range o.Objects { + err := fun(h) + if err != nil { + if err == storer.ErrStop { + return nil + } + return err + } + } + return nil +} + +func (o *ObjectStorage) ObjectPacks() ([]plumbing.Hash, error) { + return nil, nil +} +func (o *ObjectStorage) DeleteOldObjectPackAndIndex(plumbing.Hash, time.Time) error { + return nil +} + +var errNotSupported = fmt.Errorf("Not supported") + +func (o *ObjectStorage) LooseObjectTime(hash plumbing.Hash) (time.Time, error) { + return time.Time{}, errNotSupported +} +func (o *ObjectStorage) DeleteLooseObject(plumbing.Hash) error { + return errNotSupported +} + +type TxObjectStorage struct { + Storage *ObjectStorage + Objects map[plumbing.Hash]plumbing.EncodedObject +} + +func (tx *TxObjectStorage) SetEncodedObject(obj plumbing.EncodedObject) (plumbing.Hash, error) { + h := obj.Hash() + tx.Objects[h] = obj + + return h, nil +} + +func (tx *TxObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) { + obj, ok := tx.Objects[h] + if !ok || (plumbing.AnyObject != t && obj.Type() != t) { + return nil, plumbing.ErrObjectNotFound + } + + return obj, nil +} + +func (tx *TxObjectStorage) Commit() error { + for h, obj := range tx.Objects { + delete(tx.Objects, h) + if _, err := tx.Storage.SetEncodedObject(obj); err != nil { + return err + } + } + + return nil +} + +func (tx *TxObjectStorage) Rollback() error { + tx.Objects = make(map[plumbing.Hash]plumbing.EncodedObject) + return nil +} + +type ReferenceStorage map[plumbing.ReferenceName]*plumbing.Reference + +func (r ReferenceStorage) SetReference(ref *plumbing.Reference) error { + if ref != nil { + r[ref.Name()] = ref + } + + return nil +} + +func (r ReferenceStorage) CheckAndSetReference(ref, old *plumbing.Reference) error { + if ref == nil { + return nil + } + + if old != nil { + tmp := r[ref.Name()] + if tmp != nil && tmp.Hash() != old.Hash() { + return storage.ErrReferenceHasChanged + } + } + r[ref.Name()] = ref + return nil +} + +func (r ReferenceStorage) Reference(n plumbing.ReferenceName) (*plumbing.Reference, error) { + ref, ok := r[n] + if !ok { + return nil, plumbing.ErrReferenceNotFound + } + + return ref, nil +} + +func (r ReferenceStorage) IterReferences() (storer.ReferenceIter, error) { + var refs []*plumbing.Reference + for _, ref := range r { + refs = append(refs, ref) + } + + return storer.NewReferenceSliceIter(refs), nil +} + +func (r ReferenceStorage) CountLooseRefs() (int, error) { + return len(r), nil +} + +func (r ReferenceStorage) PackRefs() error { + return nil +} + +func (r ReferenceStorage) RemoveReference(n plumbing.ReferenceName) error { + delete(r, n) + return nil +} + +type ShallowStorage []plumbing.Hash + +func (s *ShallowStorage) SetShallow(commits []plumbing.Hash) error { + *s = commits + return nil +} + +func (s ShallowStorage) Shallow() ([]plumbing.Hash, error) { + return s, nil +} + +type ModuleStorage map[string]*Storage + +func (s ModuleStorage) Module(name string) (storage.Storer, error) { + if m, ok := s[name]; ok { + return m, nil + } + + m := NewStorage() + s[name] = m + + return m, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/storage/storer.go b/vendor/github.com/go-git/go-git/v5/storage/storer.go new file mode 100644 index 0000000000..4800ac7ba0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/storage/storer.go @@ -0,0 +1,30 @@ +package storage + +import ( + "errors" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing/storer" +) + +var ErrReferenceHasChanged = errors.New("reference has changed concurrently") + +// Storer is a generic storage of objects, references and any information +// related to a particular repository. The package github.com/go-git/go-git/v5/storage +// contains two implementation a filesystem base implementation (such as `.git`) +// and a memory implementations being ephemeral +type Storer interface { + storer.EncodedObjectStorer + storer.ReferenceStorer + storer.ShallowStorer + storer.IndexStorer + config.ConfigStorer + ModuleStorer +} + +// ModuleStorer allows interact with the modules' Storers +type ModuleStorer interface { + // Module returns a Storer representing a submodule, if not exists returns a + // new empty Storer is returned + Module(name string) (Storer, error) +} diff --git a/vendor/github.com/go-git/go-git/v5/submodule.go b/vendor/github.com/go-git/go-git/v5/submodule.go new file mode 100644 index 0000000000..a202a9b600 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/submodule.go @@ -0,0 +1,397 @@ +package git + +import ( + "bytes" + "context" + "errors" + "fmt" + "net/url" + "path" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +var ( + ErrSubmoduleAlreadyInitialized = errors.New("submodule already initialized") + ErrSubmoduleNotInitialized = errors.New("submodule not initialized") +) + +// Submodule a submodule allows you to keep another Git repository in a +// subdirectory of your repository. +type Submodule struct { + // initialized defines if a submodule was already initialized. + initialized bool + + c *config.Submodule + w *Worktree +} + +// Config returns the submodule config +func (s *Submodule) Config() *config.Submodule { + return s.c +} + +// Init initialize the submodule reading the recorded Entry in the index for +// the given submodule +func (s *Submodule) Init() error { + cfg, err := s.w.r.Config() + if err != nil { + return err + } + + _, ok := cfg.Submodules[s.c.Name] + if ok { + return ErrSubmoduleAlreadyInitialized + } + + s.initialized = true + + cfg.Submodules[s.c.Name] = s.c + return s.w.r.Storer.SetConfig(cfg) +} + +// Status returns the status of the submodule. +func (s *Submodule) Status() (*SubmoduleStatus, error) { + idx, err := s.w.r.Storer.Index() + if err != nil { + return nil, err + } + + return s.status(idx) +} + +func (s *Submodule) status(idx *index.Index) (*SubmoduleStatus, error) { + status := &SubmoduleStatus{ + Path: s.c.Path, + } + + e, err := idx.Entry(s.c.Path) + if err != nil && err != index.ErrEntryNotFound { + return nil, err + } + + if e != nil { + status.Expected = e.Hash + } + + if !s.initialized { + return status, nil + } + + r, err := s.Repository() + if err != nil { + return nil, err + } + + head, err := r.Head() + if err == nil { + status.Current = head.Hash() + } + + if err != nil && err == plumbing.ErrReferenceNotFound { + err = nil + } + + return status, err +} + +// Repository returns the Repository represented by this submodule +func (s *Submodule) Repository() (*Repository, error) { + if !s.initialized { + return nil, ErrSubmoduleNotInitialized + } + + storer, err := s.w.r.Storer.Module(s.c.Name) + if err != nil { + return nil, err + } + + _, err = storer.Reference(plumbing.HEAD) + if err != nil && err != plumbing.ErrReferenceNotFound { + return nil, err + } + + var exists bool + if err == nil { + exists = true + } + + var worktree billy.Filesystem + if worktree, err = s.w.Filesystem.Chroot(s.c.Path); err != nil { + return nil, err + } + + if exists { + return Open(storer, worktree) + } + + r, err := Init(storer, worktree) + if err != nil { + return nil, err + } + + moduleURL, err := url.Parse(s.c.URL) + if err != nil { + return nil, err + } + + if !path.IsAbs(moduleURL.Path) { + remotes, err := s.w.r.Remotes() + if err != nil { + return nil, err + } + + rootURL, err := url.Parse(remotes[0].c.URLs[0]) + if err != nil { + return nil, err + } + + rootURL.Path = path.Join(rootURL.Path, moduleURL.Path) + *moduleURL = *rootURL + } + + _, err = r.CreateRemote(&config.RemoteConfig{ + Name: DefaultRemoteName, + URLs: []string{moduleURL.String()}, + }) + + return r, err +} + +// Update the registered submodule to match what the superproject expects, the +// submodule should be initialized first calling the Init method or setting in +// the options SubmoduleUpdateOptions.Init equals true +func (s *Submodule) Update(o *SubmoduleUpdateOptions) error { + return s.UpdateContext(context.Background(), o) +} + +// UpdateContext the registered submodule to match what the superproject +// expects, the submodule should be initialized first calling the Init method or +// setting in the options SubmoduleUpdateOptions.Init equals true. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +func (s *Submodule) UpdateContext(ctx context.Context, o *SubmoduleUpdateOptions) error { + return s.update(ctx, o, plumbing.ZeroHash) +} + +func (s *Submodule) update(ctx context.Context, o *SubmoduleUpdateOptions, forceHash plumbing.Hash) error { + if !s.initialized && !o.Init { + return ErrSubmoduleNotInitialized + } + + if !s.initialized && o.Init { + if err := s.Init(); err != nil { + return err + } + } + + idx, err := s.w.r.Storer.Index() + if err != nil { + return err + } + + hash := forceHash + if hash.IsZero() { + e, err := idx.Entry(s.c.Path) + if err != nil { + return err + } + + hash = e.Hash + } + + r, err := s.Repository() + if err != nil { + return err + } + + if err := s.fetchAndCheckout(ctx, r, o, hash); err != nil { + return err + } + + return s.doRecursiveUpdate(r, o) +} + +func (s *Submodule) doRecursiveUpdate(r *Repository, o *SubmoduleUpdateOptions) error { + if o.RecurseSubmodules == NoRecurseSubmodules { + return nil + } + + w, err := r.Worktree() + if err != nil { + return err + } + + l, err := w.Submodules() + if err != nil { + return err + } + + new := &SubmoduleUpdateOptions{} + *new = *o + + new.RecurseSubmodules-- + return l.Update(new) +} + +func (s *Submodule) fetchAndCheckout( + ctx context.Context, r *Repository, o *SubmoduleUpdateOptions, hash plumbing.Hash, +) error { + if !o.NoFetch { + err := r.FetchContext(ctx, &FetchOptions{Auth: o.Auth}) + if err != nil && err != NoErrAlreadyUpToDate { + return err + } + } + + w, err := r.Worktree() + if err != nil { + return err + } + + // Handle a case when submodule refers to an orphaned commit that's still reachable + // through Git server using a special protocol capability[1]. + // + // [1]: https://git-scm.com/docs/protocol-capabilities#_allow_reachable_sha1_in_want + if !o.NoFetch { + if _, err := w.r.Object(plumbing.AnyObject, hash); err != nil { + refSpec := config.RefSpec("+" + hash.String() + ":" + hash.String()) + + err := r.FetchContext(ctx, &FetchOptions{ + Auth: o.Auth, + RefSpecs: []config.RefSpec{refSpec}, + }) + if err != nil && err != NoErrAlreadyUpToDate && err != ErrExactSHA1NotSupported { + return err + } + } + } + + if err := w.Checkout(&CheckoutOptions{Hash: hash}); err != nil { + return err + } + + head := plumbing.NewHashReference(plumbing.HEAD, hash) + return r.Storer.SetReference(head) +} + +// Submodules list of several submodules from the same repository. +type Submodules []*Submodule + +// Init initializes the submodules in this list. +func (s Submodules) Init() error { + for _, sub := range s { + if err := sub.Init(); err != nil { + return err + } + } + + return nil +} + +// Update updates all the submodules in this list. +func (s Submodules) Update(o *SubmoduleUpdateOptions) error { + return s.UpdateContext(context.Background(), o) +} + +// UpdateContext updates all the submodules in this list. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +func (s Submodules) UpdateContext(ctx context.Context, o *SubmoduleUpdateOptions) error { + for _, sub := range s { + if err := sub.UpdateContext(ctx, o); err != nil { + return err + } + } + + return nil +} + +// Status returns the status of the submodules. +func (s Submodules) Status() (SubmodulesStatus, error) { + var list SubmodulesStatus + + var r *Repository + for _, sub := range s { + if r == nil { + r = sub.w.r + } + + idx, err := r.Storer.Index() + if err != nil { + return nil, err + } + + status, err := sub.status(idx) + if err != nil { + return nil, err + } + + list = append(list, status) + } + + return list, nil +} + +// SubmodulesStatus contains the status for all submodiles in the worktree +type SubmodulesStatus []*SubmoduleStatus + +// String is equivalent to `git submodule status` +func (s SubmodulesStatus) String() string { + buf := bytes.NewBuffer(nil) + for _, sub := range s { + fmt.Fprintln(buf, sub) + } + + return buf.String() +} + +// SubmoduleStatus contains the status for a submodule in the worktree +type SubmoduleStatus struct { + Path string + Current plumbing.Hash + Expected plumbing.Hash + Branch plumbing.ReferenceName +} + +// IsClean is the HEAD of the submodule is equals to the expected commit +func (s *SubmoduleStatus) IsClean() bool { + return s.Current == s.Expected +} + +// String is equivalent to `git submodule status ` +// +// This will print the SHA-1 of the currently checked out commit for a +// submodule, along with the submodule path and the output of git describe fo +// the SHA-1. Each SHA-1 will be prefixed with - if the submodule is not +// initialized, + if the currently checked out submodule commit does not match +// the SHA-1 found in the index of the containing repository. +func (s *SubmoduleStatus) String() string { + var extra string + var status = ' ' + + if s.Current.IsZero() { + status = '-' + } else if !s.IsClean() { + status = '+' + } + + if len(s.Branch) != 0 { + extra = string(s.Branch[5:]) + } else if !s.Current.IsZero() { + extra = s.Current.String()[:7] + } + + if extra != "" { + extra = fmt.Sprintf(" (%s)", extra) + } + + return fmt.Sprintf("%c%s %s%s", status, s.Expected, s.Path, extra) +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/binary/read.go b/vendor/github.com/go-git/go-git/v5/utils/binary/read.go new file mode 100644 index 0000000000..a14d48db9c --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/binary/read.go @@ -0,0 +1,180 @@ +// Package binary implements sintax-sugar functions on top of the standard +// library binary package +package binary + +import ( + "bufio" + "encoding/binary" + "io" + + "github.com/go-git/go-git/v5/plumbing" +) + +// Read reads structured binary data from r into data. Bytes are read and +// decoded in BigEndian order +// https://golang.org/pkg/encoding/binary/#Read +func Read(r io.Reader, data ...interface{}) error { + for _, v := range data { + if err := binary.Read(r, binary.BigEndian, v); err != nil { + return err + } + } + + return nil +} + +// ReadUntil reads from r untin delim is found +func ReadUntil(r io.Reader, delim byte) ([]byte, error) { + if bufr, ok := r.(*bufio.Reader); ok { + return ReadUntilFromBufioReader(bufr, delim) + } + + var buf [1]byte + value := make([]byte, 0, 16) + for { + if _, err := io.ReadFull(r, buf[:]); err != nil { + if err == io.EOF { + return nil, err + } + + return nil, err + } + + if buf[0] == delim { + return value, nil + } + + value = append(value, buf[0]) + } +} + +// ReadUntilFromBufioReader is like bufio.ReadBytes but drops the delimiter +// from the result. +func ReadUntilFromBufioReader(r *bufio.Reader, delim byte) ([]byte, error) { + value, err := r.ReadBytes(delim) + if err != nil || len(value) == 0 { + return nil, err + } + + return value[:len(value)-1], nil +} + +// ReadVariableWidthInt reads and returns an int in Git VLQ special format: +// +// Ordinary VLQ has some redundancies, example: the number 358 can be +// encoded as the 2-octet VLQ 0x8166 or the 3-octet VLQ 0x808166 or the +// 4-octet VLQ 0x80808166 and so forth. +// +// To avoid these redundancies, the VLQ format used in Git removes this +// prepending redundancy and extends the representable range of shorter +// VLQs by adding an offset to VLQs of 2 or more octets in such a way +// that the lowest possible value for such an (N+1)-octet VLQ becomes +// exactly one more than the maximum possible value for an N-octet VLQ. +// In particular, since a 1-octet VLQ can store a maximum value of 127, +// the minimum 2-octet VLQ (0x8000) is assigned the value 128 instead of +// 0. Conversely, the maximum value of such a 2-octet VLQ (0xff7f) is +// 16511 instead of just 16383. Similarly, the minimum 3-octet VLQ +// (0x808000) has a value of 16512 instead of zero, which means +// that the maximum 3-octet VLQ (0xffff7f) is 2113663 instead of +// just 2097151. And so forth. +// +// This is how the offset is saved in C: +// +// dheader[pos] = ofs & 127; +// while (ofs >>= 7) +// dheader[--pos] = 128 | (--ofs & 127); +// +func ReadVariableWidthInt(r io.Reader) (int64, error) { + var c byte + if err := Read(r, &c); err != nil { + return 0, err + } + + var v = int64(c & maskLength) + for c&maskContinue > 0 { + v++ + if err := Read(r, &c); err != nil { + return 0, err + } + + v = (v << lengthBits) + int64(c&maskLength) + } + + return v, nil +} + +const ( + maskContinue = uint8(128) // 1000 000 + maskLength = uint8(127) // 0111 1111 + lengthBits = uint8(7) // subsequent bytes has 7 bits to store the length +) + +// ReadUint64 reads 8 bytes and returns them as a BigEndian uint32 +func ReadUint64(r io.Reader) (uint64, error) { + var v uint64 + if err := binary.Read(r, binary.BigEndian, &v); err != nil { + return 0, err + } + + return v, nil +} + +// ReadUint32 reads 4 bytes and returns them as a BigEndian uint32 +func ReadUint32(r io.Reader) (uint32, error) { + var v uint32 + if err := binary.Read(r, binary.BigEndian, &v); err != nil { + return 0, err + } + + return v, nil +} + +// ReadUint16 reads 2 bytes and returns them as a BigEndian uint16 +func ReadUint16(r io.Reader) (uint16, error) { + var v uint16 + if err := binary.Read(r, binary.BigEndian, &v); err != nil { + return 0, err + } + + return v, nil +} + +// ReadHash reads a plumbing.Hash from r +func ReadHash(r io.Reader) (plumbing.Hash, error) { + var h plumbing.Hash + if err := binary.Read(r, binary.BigEndian, h[:]); err != nil { + return plumbing.ZeroHash, err + } + + return h, nil +} + +const sniffLen = 8000 + +// IsBinary detects if data is a binary value based on: +// http://git.kernel.org/cgit/git/git.git/tree/xdiff-interface.c?id=HEAD#n198 +func IsBinary(r io.Reader) (bool, error) { + reader := bufio.NewReader(r) + c := 0 + for { + if c == sniffLen { + break + } + + b, err := reader.ReadByte() + if err == io.EOF { + break + } + if err != nil { + return false, err + } + + if b == byte(0) { + return true, nil + } + + c++ + } + + return false, nil +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/binary/write.go b/vendor/github.com/go-git/go-git/v5/utils/binary/write.go new file mode 100644 index 0000000000..c08c73a06b --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/binary/write.go @@ -0,0 +1,50 @@ +package binary + +import ( + "encoding/binary" + "io" +) + +// Write writes the binary representation of data into w, using BigEndian order +// https://golang.org/pkg/encoding/binary/#Write +func Write(w io.Writer, data ...interface{}) error { + for _, v := range data { + if err := binary.Write(w, binary.BigEndian, v); err != nil { + return err + } + } + + return nil +} + +func WriteVariableWidthInt(w io.Writer, n int64) error { + buf := []byte{byte(n & 0x7f)} + n >>= 7 + for n != 0 { + n-- + buf = append([]byte{0x80 | (byte(n & 0x7f))}, buf...) + n >>= 7 + } + + _, err := w.Write(buf) + + return err +} + +// WriteUint64 writes the binary representation of a uint64 into w, in BigEndian +// order +func WriteUint64(w io.Writer, value uint64) error { + return binary.Write(w, binary.BigEndian, value) +} + +// WriteUint32 writes the binary representation of a uint32 into w, in BigEndian +// order +func WriteUint32(w io.Writer, value uint32) error { + return binary.Write(w, binary.BigEndian, value) +} + +// WriteUint16 writes the binary representation of a uint16 into w, in BigEndian +// order +func WriteUint16(w io.Writer, value uint16) error { + return binary.Write(w, binary.BigEndian, value) +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/diff/diff.go b/vendor/github.com/go-git/go-git/v5/utils/diff/diff.go new file mode 100644 index 0000000000..70054949fd --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/diff/diff.go @@ -0,0 +1,61 @@ +// Package diff implements line oriented diffs, similar to the ancient +// Unix diff command. +// +// The current implementation is just a wrapper around Sergi's +// go-diff/diffmatchpatch library, which is a go port of Neil +// Fraser's google-diff-match-patch code +package diff + +import ( + "bytes" + "time" + + "github.com/sergi/go-diff/diffmatchpatch" +) + +// Do computes the (line oriented) modifications needed to turn the src +// string into the dst string. The underlying algorithm is Meyers, +// its complexity is O(N*d) where N is min(lines(src), lines(dst)) and d +// is the size of the diff. +func Do(src, dst string) (diffs []diffmatchpatch.Diff) { + // the default timeout is time.Second which may be too small under heavy load + return DoWithTimeout(src, dst, time.Hour) +} + +// DoWithTimeout computes the (line oriented) modifications needed to turn the src +// string into the dst string. The `timeout` argument specifies the maximum +// amount of time it is allowed to spend in this function. If the timeout +// is exceeded, the parts of the strings which were not considered are turned into +// a bulk delete+insert and the half-baked suboptimal result is returned at once. +// The underlying algorithm is Meyers, its complexity is O(N*d) where N is +// min(lines(src), lines(dst)) and d is the size of the diff. +func DoWithTimeout(src, dst string, timeout time.Duration) (diffs []diffmatchpatch.Diff) { + dmp := diffmatchpatch.New() + dmp.DiffTimeout = timeout + wSrc, wDst, warray := dmp.DiffLinesToRunes(src, dst) + diffs = dmp.DiffMainRunes(wSrc, wDst, false) + diffs = dmp.DiffCharsToLines(diffs, warray) + return diffs +} + +// Dst computes and returns the destination text. +func Dst(diffs []diffmatchpatch.Diff) string { + var text bytes.Buffer + for _, d := range diffs { + if d.Type != diffmatchpatch.DiffDelete { + text.WriteString(d.Text) + } + } + return text.String() +} + +// Src computes and returns the source text +func Src(diffs []diffmatchpatch.Diff) string { + var text bytes.Buffer + for _, d := range diffs { + if d.Type != diffmatchpatch.DiffInsert { + text.WriteString(d.Text) + } + } + return text.String() +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go b/vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go new file mode 100644 index 0000000000..b52e85a380 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go @@ -0,0 +1,180 @@ +// Package ioutil implements some I/O utility functions. +package ioutil + +import ( + "bufio" + "context" + "errors" + "io" + + ctxio "github.com/jbenet/go-context/io" +) + +type readPeeker interface { + io.Reader + Peek(int) ([]byte, error) +} + +var ( + ErrEmptyReader = errors.New("reader is empty") +) + +// NonEmptyReader takes a reader and returns it if it is not empty, or +// `ErrEmptyReader` if it is empty. If there is an error when reading the first +// byte of the given reader, it will be propagated. +func NonEmptyReader(r io.Reader) (io.Reader, error) { + pr, ok := r.(readPeeker) + if !ok { + pr = bufio.NewReader(r) + } + + _, err := pr.Peek(1) + if err == io.EOF { + return nil, ErrEmptyReader + } + + if err != nil { + return nil, err + } + + return pr, nil +} + +type readCloser struct { + io.Reader + closer io.Closer +} + +func (r *readCloser) Close() error { + return r.closer.Close() +} + +// NewReadCloser creates an `io.ReadCloser` with the given `io.Reader` and +// `io.Closer`. +func NewReadCloser(r io.Reader, c io.Closer) io.ReadCloser { + return &readCloser{Reader: r, closer: c} +} + +type writeCloser struct { + io.Writer + closer io.Closer +} + +func (r *writeCloser) Close() error { + return r.closer.Close() +} + +// NewWriteCloser creates an `io.WriteCloser` with the given `io.Writer` and +// `io.Closer`. +func NewWriteCloser(w io.Writer, c io.Closer) io.WriteCloser { + return &writeCloser{Writer: w, closer: c} +} + +type writeNopCloser struct { + io.Writer +} + +func (writeNopCloser) Close() error { return nil } + +// WriteNopCloser returns a WriteCloser with a no-op Close method wrapping +// the provided Writer w. +func WriteNopCloser(w io.Writer) io.WriteCloser { + return writeNopCloser{w} +} + +// CheckClose calls Close on the given io.Closer. If the given *error points to +// nil, it will be assigned the error returned by Close. Otherwise, any error +// returned by Close will be ignored. CheckClose is usually called with defer. +func CheckClose(c io.Closer, err *error) { + if cerr := c.Close(); cerr != nil && *err == nil { + *err = cerr + } +} + +// NewContextWriter wraps a writer to make it respect given Context. +// If there is a blocking write, the returned Writer will return whenever the +// context is cancelled (the return values are n=0 and err=ctx.Err()). +func NewContextWriter(ctx context.Context, w io.Writer) io.Writer { + return ctxio.NewWriter(ctx, w) +} + +// NewContextReader wraps a reader to make it respect given Context. +// If there is a blocking read, the returned Reader will return whenever the +// context is cancelled (the return values are n=0 and err=ctx.Err()). +func NewContextReader(ctx context.Context, r io.Reader) io.Reader { + return ctxio.NewReader(ctx, r) +} + +// NewContextWriteCloser as NewContextWriter but with io.Closer interface. +func NewContextWriteCloser(ctx context.Context, w io.WriteCloser) io.WriteCloser { + ctxw := ctxio.NewWriter(ctx, w) + return NewWriteCloser(ctxw, w) +} + +// NewContextReadCloser as NewContextReader but with io.Closer interface. +func NewContextReadCloser(ctx context.Context, r io.ReadCloser) io.ReadCloser { + ctxr := ctxio.NewReader(ctx, r) + return NewReadCloser(ctxr, r) +} + +type readerOnError struct { + io.Reader + notify func(error) +} + +// NewReaderOnError returns a io.Reader that call the notify function when an +// unexpected (!io.EOF) error happens, after call Read function. +func NewReaderOnError(r io.Reader, notify func(error)) io.Reader { + return &readerOnError{r, notify} +} + +// NewReadCloserOnError returns a io.ReadCloser that call the notify function +// when an unexpected (!io.EOF) error happens, after call Read function. +func NewReadCloserOnError(r io.ReadCloser, notify func(error)) io.ReadCloser { + return NewReadCloser(NewReaderOnError(r, notify), r) +} + +func (r *readerOnError) Read(buf []byte) (n int, err error) { + n, err = r.Reader.Read(buf) + if err != nil && err != io.EOF { + r.notify(err) + } + + return +} + +type writerOnError struct { + io.Writer + notify func(error) +} + +// NewWriterOnError returns a io.Writer that call the notify function when an +// unexpected (!io.EOF) error happens, after call Write function. +func NewWriterOnError(w io.Writer, notify func(error)) io.Writer { + return &writerOnError{w, notify} +} + +// NewWriteCloserOnError returns a io.WriteCloser that call the notify function +//when an unexpected (!io.EOF) error happens, after call Write function. +func NewWriteCloserOnError(w io.WriteCloser, notify func(error)) io.WriteCloser { + return NewWriteCloser(NewWriterOnError(w, notify), w) +} + +func (r *writerOnError) Write(p []byte) (n int, err error) { + n, err = r.Writer.Write(p) + if err != nil && err != io.EOF { + r.notify(err) + } + + return +} + +type PipeReader interface { + io.ReadCloser + CloseWithError(err error) error +} + +type PipeWriter interface { + io.WriteCloser + CloseWithError(err error) error +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/ioutil/pipe.go b/vendor/github.com/go-git/go-git/v5/utils/ioutil/pipe.go new file mode 100644 index 0000000000..f30c452fa4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/ioutil/pipe.go @@ -0,0 +1,9 @@ +// +build !js + +package ioutil + +import "io" + +func Pipe() (PipeReader, PipeWriter) { + return io.Pipe() +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/ioutil/pipe_js.go b/vendor/github.com/go-git/go-git/v5/utils/ioutil/pipe_js.go new file mode 100644 index 0000000000..cf102e6ef8 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/ioutil/pipe_js.go @@ -0,0 +1,9 @@ +// +build js + +package ioutil + +import "github.com/acomagu/bufpipe" + +func Pipe() (PipeReader, PipeWriter) { + return bufpipe.New(nil) +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/change.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/change.go new file mode 100644 index 0000000000..cc6dc89071 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/change.go @@ -0,0 +1,149 @@ +package merkletrie + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// Action values represent the kind of things a Change can represent: +// insertion, deletions or modifications of files. +type Action int + +// The set of possible actions in a change. +const ( + _ Action = iota + Insert + Delete + Modify +) + +// String returns the action as a human readable text. +func (a Action) String() string { + switch a { + case Insert: + return "Insert" + case Delete: + return "Delete" + case Modify: + return "Modify" + default: + panic(fmt.Sprintf("unsupported action: %d", a)) + } +} + +// A Change value represent how a noder has change between to merkletries. +type Change struct { + // The noder before the change or nil if it was inserted. + From noder.Path + // The noder after the change or nil if it was deleted. + To noder.Path +} + +// Action is convenience method that returns what Action c represents. +func (c *Change) Action() (Action, error) { + if c.From == nil && c.To == nil { + return Action(0), fmt.Errorf("malformed change: nil from and to") + } + if c.From == nil { + return Insert, nil + } + if c.To == nil { + return Delete, nil + } + + return Modify, nil +} + +// NewInsert returns a new Change representing the insertion of n. +func NewInsert(n noder.Path) Change { return Change{To: n} } + +// NewDelete returns a new Change representing the deletion of n. +func NewDelete(n noder.Path) Change { return Change{From: n} } + +// NewModify returns a new Change representing that a has been modified and +// it is now b. +func NewModify(a, b noder.Path) Change { + return Change{ + From: a, + To: b, + } +} + +// String returns a single change in human readable form, using the +// format: '<' + action + space + path + '>'. The contents of the file +// before or after the change are not included in this format. +// +// Example: inserting a file at the path a/b/c.txt will return "". +func (c Change) String() string { + action, err := c.Action() + if err != nil { + panic(err) + } + + var path string + if action == Delete { + path = c.From.String() + } else { + path = c.To.String() + } + + return fmt.Sprintf("<%s %s>", action, path) +} + +// Changes is a list of changes between to merkletries. +type Changes []Change + +// NewChanges returns an empty list of changes. +func NewChanges() Changes { + return Changes{} +} + +// Add adds the change c to the list of changes. +func (l *Changes) Add(c Change) { + *l = append(*l, c) +} + +// AddRecursiveInsert adds the required changes to insert all the +// file-like noders found in root, recursively. +func (l *Changes) AddRecursiveInsert(root noder.Path) error { + return l.addRecursive(root, NewInsert) +} + +// AddRecursiveDelete adds the required changes to delete all the +// file-like noders found in root, recursively. +func (l *Changes) AddRecursiveDelete(root noder.Path) error { + return l.addRecursive(root, NewDelete) +} + +type noderToChangeFn func(noder.Path) Change // NewInsert or NewDelete + +func (l *Changes) addRecursive(root noder.Path, ctor noderToChangeFn) error { + if !root.IsDir() { + l.Add(ctor(root)) + return nil + } + + i, err := NewIterFromPath(root) + if err != nil { + return err + } + + var current noder.Path + for { + if current, err = i.Step(); err != nil { + if err == io.EOF { + break + } + return err + } + if current.IsDir() { + continue + } + l.Add(ctor(current)) + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/difftree.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/difftree.go new file mode 100644 index 0000000000..bd084b2ab0 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/difftree.go @@ -0,0 +1,428 @@ +package merkletrie + +// The focus of this difftree implementation is to save time by +// skipping whole directories if their hash is the same in both +// trees. +// +// The diff algorithm implemented here is based on the doubleiter +// type defined in this same package; we will iterate over both +// trees at the same time, while comparing the current noders in +// each iterator. Depending on how they differ we will output the +// corresponding changes and move the iterators further over both +// trees. +// +// The table bellow show all the possible comparison results, along +// with what changes should we produce and how to advance the +// iterators. +// +// The table is implemented by the switches in this function, +// diffTwoNodes, diffTwoNodesSameName and diffTwoDirs. +// +// Many Bothans died to bring us this information, make sure you +// understand the table before modifying this code. + +// # Cases +// +// When comparing noders in both trees you will find yourself in +// one of 169 possible cases, but if we ignore moves, we can +// simplify a lot the search space into the following table: +// +// - "-": nothing, no file or directory +// - a<>: an empty file named "a". +// - a<1>: a file named "a", with "1" as its contents. +// - a<2>: a file named "a", with "2" as its contents. +// - a(): an empty dir named "a". +// - a(...): a dir named "a", with some files and/or dirs inside (possibly +// empty). +// - a(;;;): a dir named "a", with some other files and/or dirs inside +// (possibly empty), which different from the ones in "a(...)". +// +// \ to - a<> a<1> a<2> a() a(...) a(;;;) +// from \ +// - 00 01 02 03 04 05 06 +// a<> 10 11 12 13 14 15 16 +// a<1> 20 21 22 23 24 25 26 +// a<2> 30 31 32 33 34 35 36 +// a() 40 41 42 43 44 45 46 +// a(...) 50 51 52 53 54 55 56 +// a(;;;) 60 61 62 63 64 65 66 +// +// Every (from, to) combination in the table is a special case, but +// some of them can be merged into some more general cases, for +// instance 11 and 22 can be merged into the general case: both +// noders are equal. +// +// Here is a full list of all the cases that are similar and how to +// merge them together into more general cases. Each general case +// is labeled with an uppercase letter for further reference, and it +// is followed by the pseudocode of the checks you have to perfrom +// on both noders to see if you are in such a case, the actions to +// perform (i.e. what changes to output) and how to advance the +// iterators of each tree to continue the comparison process. +// +// ## A. Impossible: 00 +// +// ## B. Same thing on both sides: 11, 22, 33, 44, 55, 66 +// - check: `SameName() && SameHash()` +// - action: do nothing. +// - advance: `FromNext(); ToNext()` +// +// ### C. To was created: 01, 02, 03, 04, 05, 06 +// - check: `DifferentName() && ToBeforeFrom()` +// - action: insertRecursively(to) +// - advance: `ToNext()` +// +// ### D. From was deleted: 10, 20, 30, 40, 50, 60 +// - check: `DifferentName() && FromBeforeTo()` +// - action: `DeleteRecursively(from)` +// - advance: `FromNext()` +// +// ### E. Empty file to file with contents: 12, 13 +// - check: `SameName() && DifferentHash() && FromIsFile() && +// ToIsFile() && FromIsEmpty()` +// - action: `modifyFile(from, to)` +// - advance: `FromNext()` or `FromStep()` +// +// ### E'. file with contents to empty file: 21, 31 +// - check: `SameName() && DifferentHash() && FromIsFile() && +// ToIsFile() && ToIsEmpty()` +// - action: `modifyFile(from, to)` +// - advance: `FromNext()` or `FromStep()` +// +// ### F. empty file to empty dir with the same name: 14 +// - check: `SameName() && FromIsFile() && FromIsEmpty() && +// ToIsDir() && ToIsEmpty()` +// - action: `DeleteFile(from); InsertEmptyDir(to)` +// - advance: `FromNext(); ToNext()` +// +// ### F'. empty dir to empty file of the same name: 41 +// - check: `SameName() && FromIsDir() && FromIsEmpty && +// ToIsFile() && ToIsEmpty()` +// - action: `DeleteEmptyDir(from); InsertFile(to)` +// - advance: `FromNext(); ToNext()` or step for any of them. +// +// ### G. empty file to non-empty dir of the same name: 15, 16 +// - check: `SameName() && FromIsFile() && ToIsDir() && +// FromIsEmpty() && ToIsNotEmpty()` +// - action: `DeleteFile(from); InsertDirRecursively(to)` +// - advance: `FromNext(); ToNext()` +// +// ### G'. non-empty dir to empty file of the same name: 51, 61 +// - check: `SameName() && FromIsDir() && FromIsNotEmpty() && +// ToIsFile() && FromIsEmpty()` +// - action: `DeleteDirRecursively(from); InsertFile(to)` +// - advance: `FromNext(); ToNext()` +// +// ### H. modify file contents: 23, 32 +// - check: `SameName() && FromIsFile() && ToIsFile() && +// FromIsNotEmpty() && ToIsNotEmpty()` +// - action: `ModifyFile(from, to)` +// - advance: `FromNext(); ToNext()` +// +// ### I. file with contents to empty dir: 24, 34 +// - check: `SameName() && DifferentHash() && FromIsFile() && +// FromIsNotEmpty() && ToIsDir() && ToIsEmpty()` +// - action: `DeleteFile(from); InsertEmptyDir(to)` +// - advance: `FromNext(); ToNext()` +// +// ### I'. empty dir to file with contents: 42, 43 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsEmpty() && ToIsFile() && ToIsEmpty()` +// - action: `DeleteDir(from); InsertFile(to)` +// - advance: `FromNext(); ToNext()` +// +// ### J. file with contents to dir with contents: 25, 26, 35, 36 +// - check: `SameName() && DifferentHash() && FromIsFile() && +// FromIsNotEmpty() && ToIsDir() && ToIsNotEmpty()` +// - action: `DeleteFile(from); InsertDirRecursively(to)` +// - advance: `FromNext(); ToNext()` +// +// ### J'. dir with contents to file with contents: 52, 62, 53, 63 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsNotEmpty() && ToIsFile() && ToIsNotEmpty()` +// - action: `DeleteDirRecursively(from); InsertFile(to)` +// - advance: `FromNext(); ToNext()` +// +// ### K. empty dir to dir with contents: 45, 46 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsEmpty() && ToIsDir() && ToIsNotEmpty()` +// - action: `InsertChildrenRecursively(to)` +// - advance: `FromNext(); ToNext()` +// +// ### K'. dir with contents to empty dir: 54, 64 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsEmpty() && ToIsDir() && ToIsNotEmpty()` +// - action: `DeleteChildrenRecursively(from)` +// - advance: `FromNext(); ToNext()` +// +// ### L. dir with contents to dir with different contents: 56, 65 +// - check: `SameName() && DifferentHash() && FromIsDir() && +// FromIsNotEmpty() && ToIsDir() && ToIsNotEmpty()` +// - action: nothing +// - advance: `FromStep(); ToStep()` +// +// + +// All these cases can be further simplified by a truth table +// reduction process, in which we gather similar checks together to +// make the final code easier to read and understand. +// +// The first 6 columns are the outputs of the checks to perform on +// both noders. I have labeled them 1 to 6, this is what they mean: +// +// 1: SameName() +// 2: SameHash() +// 3: FromIsDir() +// 4: ToIsDir() +// 5: FromIsEmpty() +// 6: ToIsEmpty() +// +// The from and to columns are a fsnoder example of the elements +// that you will find on each tree under the specified comparison +// results (columns 1 to 6). +// +// The type column identifies the case we are into, from the list above. +// +// The type' column identifies the new set of reduced cases, using +// lowercase letters, and they are explained after the table. +// +// The last column is the set of actions and advances for each case. +// +// "---" means impossible except in case of hash collision. +// +// advance meaning: +// - NN: from.Next(); to.Next() +// - SS: from.Step(); to.Step() +// +// 1 2 3 4 5 6 | from | to |type|type'|action ; advance +// ------------+--------+--------+----+------------------------------------ +// 0 0 0 0 0 0 | | | | | if !SameName() { +// . | | | | | if FromBeforeTo() { +// . | | | D | d | delete(from); from.Next() +// . | | | | | } else { +// . | | | C | c | insert(to); to.Next() +// . | | | | | } +// 0 1 1 1 1 1 | | | | | } +// 1 0 0 0 0 0 | a<1> | a<2> | H | e | modify(from, to); NN +// 1 0 0 0 0 1 | a<1> | a<> | E' | e | modify(from, to); NN +// 1 0 0 0 1 0 | a<> | a<1> | E | e | modify(from, to); NN +// 1 0 0 0 1 1 | ---- | ---- | | e | +// 1 0 0 1 0 0 | a<1> | a(...) | J | f | delete(from); insert(to); NN +// 1 0 0 1 0 1 | a<1> | a() | I | f | delete(from); insert(to); NN +// 1 0 0 1 1 0 | a<> | a(...) | G | f | delete(from); insert(to); NN +// 1 0 0 1 1 1 | a<> | a() | F | f | delete(from); insert(to); NN +// 1 0 1 0 0 0 | a(...) | a<1> | J' | f | delete(from); insert(to); NN +// 1 0 1 0 0 1 | a(...) | a<> | G' | f | delete(from); insert(to); NN +// 1 0 1 0 1 0 | a() | a<1> | I' | f | delete(from); insert(to); NN +// 1 0 1 0 1 1 | a() | a<> | F' | f | delete(from); insert(to); NN +// 1 0 1 1 0 0 | a(...) | a(;;;) | L | g | nothing; SS +// 1 0 1 1 0 1 | a(...) | a() | K' | h | deleteChildren(from); NN +// 1 0 1 1 1 0 | a() | a(...) | K | i | insertChildren(to); NN +// 1 0 1 1 1 1 | ---- | ---- | | | +// 1 1 0 0 0 0 | a<1> | a<1> | B | b | nothing; NN +// 1 1 0 0 0 1 | ---- | ---- | | b | +// 1 1 0 0 1 0 | ---- | ---- | | b | +// 1 1 0 0 1 1 | a<> | a<> | B | b | nothing; NN +// 1 1 0 1 0 0 | ---- | ---- | | b | +// 1 1 0 1 0 1 | ---- | ---- | | b | +// 1 1 0 1 1 0 | ---- | ---- | | b | +// 1 1 0 1 1 1 | ---- | ---- | | b | +// 1 1 1 0 0 0 | ---- | ---- | | b | +// 1 1 1 0 0 1 | ---- | ---- | | b | +// 1 1 1 0 1 0 | ---- | ---- | | b | +// 1 1 1 0 1 1 | ---- | ---- | | b | +// 1 1 1 1 0 0 | a(...) | a(...) | B | b | nothing; NN +// 1 1 1 1 0 1 | ---- | ---- | | b | +// 1 1 1 1 1 0 | ---- | ---- | | b | +// 1 1 1 1 1 1 | a() | a() | B | b | nothing; NN +// +// c and d: +// if !SameName() +// d if FromBeforeTo() +// c else +// b: SameName) && sameHash() +// e: SameName() && !sameHash() && BothAreFiles() +// f: SameName() && !sameHash() && FileAndDir() +// g: SameName() && !sameHash() && BothAreDirs() && NoneIsEmpty +// i: SameName() && !sameHash() && BothAreDirs() && FromIsEmpty +// h: else of i + +import ( + "context" + "errors" + "fmt" + + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +var ( + // ErrCanceled is returned whenever the operation is canceled. + ErrCanceled = errors.New("operation canceled") +) + +// DiffTree calculates the list of changes between two merkletries. It +// uses the provided hashEqual callback to compare noders. +func DiffTree( + fromTree, + toTree noder.Noder, + hashEqual noder.Equal, +) (Changes, error) { + return DiffTreeContext(context.Background(), fromTree, toTree, hashEqual) +} + +// DiffTreeContext calculates the list of changes between two merkletries. It +// uses the provided hashEqual callback to compare noders. +// Error will be returned if context expires +// Provided context must be non nil +func DiffTreeContext(ctx context.Context, fromTree, toTree noder.Noder, + hashEqual noder.Equal) (Changes, error) { + ret := NewChanges() + + ii, err := newDoubleIter(fromTree, toTree, hashEqual) + if err != nil { + return nil, err + } + + for { + select { + case <-ctx.Done(): + return nil, ErrCanceled + default: + } + + from := ii.from.current + to := ii.to.current + + switch r := ii.remaining(); r { + case noMoreNoders: + return ret, nil + case onlyFromRemains: + if err = ret.AddRecursiveDelete(from); err != nil { + return nil, err + } + if err = ii.nextFrom(); err != nil { + return nil, err + } + case onlyToRemains: + if err = ret.AddRecursiveInsert(to); err != nil { + return nil, err + } + if err = ii.nextTo(); err != nil { + return nil, err + } + case bothHaveNodes: + if err = diffNodes(&ret, ii); err != nil { + return nil, err + } + default: + panic(fmt.Sprintf("unknown remaining value: %d", r)) + } + } +} + +func diffNodes(changes *Changes, ii *doubleIter) error { + from := ii.from.current + to := ii.to.current + var err error + + // compare their full paths as strings + switch from.Compare(to) { + case -1: + if err = changes.AddRecursiveDelete(from); err != nil { + return err + } + if err = ii.nextFrom(); err != nil { + return err + } + case 1: + if err = changes.AddRecursiveInsert(to); err != nil { + return err + } + if err = ii.nextTo(); err != nil { + return err + } + default: + if err := diffNodesSameName(changes, ii); err != nil { + return err + } + } + + return nil +} + +func diffNodesSameName(changes *Changes, ii *doubleIter) error { + from := ii.from.current + to := ii.to.current + + status, err := ii.compare() + if err != nil { + return err + } + + switch { + case status.sameHash: + // do nothing + if err = ii.nextBoth(); err != nil { + return err + } + case status.bothAreFiles: + changes.Add(NewModify(from, to)) + if err = ii.nextBoth(); err != nil { + return err + } + case status.fileAndDir: + if err = changes.AddRecursiveDelete(from); err != nil { + return err + } + if err = changes.AddRecursiveInsert(to); err != nil { + return err + } + if err = ii.nextBoth(); err != nil { + return err + } + case status.bothAreDirs: + if err = diffDirs(changes, ii); err != nil { + return err + } + default: + return fmt.Errorf("bad status from double iterator") + } + + return nil +} + +func diffDirs(changes *Changes, ii *doubleIter) error { + from := ii.from.current + to := ii.to.current + + status, err := ii.compare() + if err != nil { + return err + } + + switch { + case status.fromIsEmptyDir: + if err = changes.AddRecursiveInsert(to); err != nil { + return err + } + if err = ii.nextBoth(); err != nil { + return err + } + case status.toIsEmptyDir: + if err = changes.AddRecursiveDelete(from); err != nil { + return err + } + if err = ii.nextBoth(); err != nil { + return err + } + case !status.fromIsEmptyDir && !status.toIsEmptyDir: + // do nothing + if err = ii.stepBoth(); err != nil { + return err + } + default: + return fmt.Errorf("both dirs are empty but has different hash") + } + + return nil +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doc.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doc.go new file mode 100644 index 0000000000..5204024ad4 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doc.go @@ -0,0 +1,34 @@ +/* +Package merkletrie provides support for n-ary trees that are at the same +time Merkle trees and Radix trees (tries). + +Git trees are Radix n-ary trees in virtue of the names of their +tree entries. At the same time, git trees are Merkle trees thanks to +their hashes. + +This package defines Merkle tries as nodes that should have: + +- a hash: the Merkle part of the Merkle trie + +- a key: the Radix part of the Merkle trie + +The Merkle hash condition is not enforced by this package though. This +means that the hash of a node doesn't have to take into account the hashes of +their children, which is good for testing purposes. + +Nodes in the Merkle trie are abstracted by the Noder interface. The +intended use is that git trees implements this interface, either +directly or using a simple wrapper. + +This package provides an iterator for merkletries that can skip whole +directory-like noders and an efficient merkletrie comparison algorithm. + +When comparing git trees, the simple approach of alphabetically sorting +their elements and comparing the resulting lists is too slow as it +depends linearly on the number of files in the trees: When a directory +has lots of files but none of them has been modified, this approach is +very expensive. We can do better by prunning whole directories that +have not change, just by looking at their hashes. This package provides +the tools to do exactly that. +*/ +package merkletrie diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doubleiter.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doubleiter.go new file mode 100644 index 0000000000..4a4341b387 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/doubleiter.go @@ -0,0 +1,187 @@ +package merkletrie + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// A doubleIter is a convenience type to keep track of the current +// noders in two merkletries that are going to be iterated in parallel. +// It has methods for: +// +// - iterating over the merkletries, both at the same time or +// individually: nextFrom, nextTo, nextBoth, stepBoth +// +// - checking if there are noders left in one or both of them with the +// remaining method and its associated returned type. +// +// - comparing the current noders of both merkletries in several ways, +// with the compare method and its associated returned type. +type doubleIter struct { + from struct { + iter *Iter + current noder.Path // nil if no more nodes + } + to struct { + iter *Iter + current noder.Path // nil if no more nodes + } + hashEqual noder.Equal +} + +// NewdoubleIter returns a new doubleIter for the merkletries "from" and +// "to". The hashEqual callback function will be used by the doubleIter +// to compare the hash of the noders in the merkletries. The doubleIter +// will be initialized to the first elements in each merkletrie if any. +func newDoubleIter(from, to noder.Noder, hashEqual noder.Equal) ( + *doubleIter, error) { + var ii doubleIter + var err error + + if ii.from.iter, err = NewIter(from); err != nil { + return nil, fmt.Errorf("from: %s", err) + } + if ii.from.current, err = ii.from.iter.Next(); turnEOFIntoNil(err) != nil { + return nil, fmt.Errorf("from: %s", err) + } + + if ii.to.iter, err = NewIter(to); err != nil { + return nil, fmt.Errorf("to: %s", err) + } + if ii.to.current, err = ii.to.iter.Next(); turnEOFIntoNil(err) != nil { + return nil, fmt.Errorf("to: %s", err) + } + + ii.hashEqual = hashEqual + + return &ii, nil +} + +func turnEOFIntoNil(e error) error { + if e != nil && e != io.EOF { + return e + } + return nil +} + +// NextBoth makes d advance to the next noder in both merkletries. If +// any of them is a directory, it skips its contents. +func (d *doubleIter) nextBoth() error { + if err := d.nextFrom(); err != nil { + return err + } + if err := d.nextTo(); err != nil { + return err + } + + return nil +} + +// NextFrom makes d advance to the next noder in the "from" merkletrie, +// skipping its contents if it is a directory. +func (d *doubleIter) nextFrom() (err error) { + d.from.current, err = d.from.iter.Next() + return turnEOFIntoNil(err) +} + +// NextTo makes d advance to the next noder in the "to" merkletrie, +// skipping its contents if it is a directory. +func (d *doubleIter) nextTo() (err error) { + d.to.current, err = d.to.iter.Next() + return turnEOFIntoNil(err) +} + +// StepBoth makes d advance to the next noder in both merkletries, +// getting deeper into directories if that is the case. +func (d *doubleIter) stepBoth() (err error) { + if d.from.current, err = d.from.iter.Step(); turnEOFIntoNil(err) != nil { + return err + } + if d.to.current, err = d.to.iter.Step(); turnEOFIntoNil(err) != nil { + return err + } + return nil +} + +// Remaining returns if there are no more noders in the tree, if both +// have noders or if one of them doesn't. +func (d *doubleIter) remaining() remaining { + if d.from.current == nil && d.to.current == nil { + return noMoreNoders + } + + if d.from.current == nil && d.to.current != nil { + return onlyToRemains + } + + if d.from.current != nil && d.to.current == nil { + return onlyFromRemains + } + + return bothHaveNodes +} + +// Remaining values tells you whether both trees still have noders, or +// only one of them or none of them. +type remaining int + +const ( + noMoreNoders remaining = iota + onlyToRemains + onlyFromRemains + bothHaveNodes +) + +// Compare returns the comparison between the current elements in the +// merkletries. +func (d *doubleIter) compare() (s comparison, err error) { + s.sameHash = d.hashEqual(d.from.current, d.to.current) + + fromIsDir := d.from.current.IsDir() + toIsDir := d.to.current.IsDir() + + s.bothAreDirs = fromIsDir && toIsDir + s.bothAreFiles = !fromIsDir && !toIsDir + s.fileAndDir = !s.bothAreDirs && !s.bothAreFiles + + fromNumChildren, err := d.from.current.NumChildren() + if err != nil { + return comparison{}, fmt.Errorf("from: %s", err) + } + + toNumChildren, err := d.to.current.NumChildren() + if err != nil { + return comparison{}, fmt.Errorf("to: %s", err) + } + + s.fromIsEmptyDir = fromIsDir && fromNumChildren == 0 + s.toIsEmptyDir = toIsDir && toNumChildren == 0 + + return +} + +// Answers to a lot of questions you can ask about how to noders are +// equal or different. +type comparison struct { + // the following are only valid if both nodes have the same name + // (i.e. nameComparison == 0) + + // Do both nodes have the same hash? + sameHash bool + // Are both nodes files? + bothAreFiles bool + + // the following are only valid if any of the noders are dirs, + // this is, if !bothAreFiles + + // Is one a file and the other a dir? + fileAndDir bool + // Are both nodes dirs? + bothAreDirs bool + // Is the from node an empty dir? + fromIsEmptyDir bool + // Is the to Node an empty dir? + toIsEmptyDir bool +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/filesystem/node.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/filesystem/node.go new file mode 100644 index 0000000000..2fc3d7a638 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/filesystem/node.go @@ -0,0 +1,195 @@ +package filesystem + +import ( + "io" + "os" + "path" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" + + "github.com/go-git/go-billy/v5" +) + +var ignore = map[string]bool{ + ".git": true, +} + +// The node represents a file or a directory in a billy.Filesystem. It +// implements the interface noder.Noder of merkletrie package. +// +// This implementation implements a "standard" hash method being able to be +// compared with any other noder.Noder implementation inside of go-git. +type node struct { + fs billy.Filesystem + submodules map[string]plumbing.Hash + + path string + hash []byte + children []noder.Noder + isDir bool +} + +// NewRootNode returns the root node based on a given billy.Filesystem. +// +// In order to provide the submodule hash status, a map[string]plumbing.Hash +// should be provided where the key is the path of the submodule and the commit +// of the submodule HEAD +func NewRootNode( + fs billy.Filesystem, + submodules map[string]plumbing.Hash, +) noder.Noder { + return &node{fs: fs, submodules: submodules, isDir: true} +} + +// Hash the hash of a filesystem is the result of concatenating the computed +// plumbing.Hash of the file as a Blob and its plumbing.FileMode; that way the +// difftree algorithm will detect changes in the contents of files and also in +// their mode. +// +// The hash of a directory is always a 24-bytes slice of zero values +func (n *node) Hash() []byte { + return n.hash +} + +func (n *node) Name() string { + return path.Base(n.path) +} + +func (n *node) IsDir() bool { + return n.isDir +} + +func (n *node) Children() ([]noder.Noder, error) { + if err := n.calculateChildren(); err != nil { + return nil, err + } + + return n.children, nil +} + +func (n *node) NumChildren() (int, error) { + if err := n.calculateChildren(); err != nil { + return -1, err + } + + return len(n.children), nil +} + +func (n *node) calculateChildren() error { + if !n.IsDir() { + return nil + } + + if len(n.children) != 0 { + return nil + } + + files, err := n.fs.ReadDir(n.path) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + + for _, file := range files { + if _, ok := ignore[file.Name()]; ok { + continue + } + + c, err := n.newChildNode(file) + if err != nil { + return err + } + + n.children = append(n.children, c) + } + + return nil +} + +func (n *node) newChildNode(file os.FileInfo) (*node, error) { + path := path.Join(n.path, file.Name()) + + hash, err := n.calculateHash(path, file) + if err != nil { + return nil, err + } + + node := &node{ + fs: n.fs, + submodules: n.submodules, + + path: path, + hash: hash, + isDir: file.IsDir(), + } + + if hash, isSubmodule := n.submodules[path]; isSubmodule { + node.hash = append(hash[:], filemode.Submodule.Bytes()...) + node.isDir = false + } + + return node, nil +} + +func (n *node) calculateHash(path string, file os.FileInfo) ([]byte, error) { + if file.IsDir() { + return make([]byte, 24), nil + } + + var hash plumbing.Hash + var err error + if file.Mode()&os.ModeSymlink != 0 { + hash, err = n.doCalculateHashForSymlink(path, file) + } else { + hash, err = n.doCalculateHashForRegular(path, file) + } + + if err != nil { + return nil, err + } + + mode, err := filemode.NewFromOSFileMode(file.Mode()) + if err != nil { + return nil, err + } + + return append(hash[:], mode.Bytes()...), nil +} + +func (n *node) doCalculateHashForRegular(path string, file os.FileInfo) (plumbing.Hash, error) { + f, err := n.fs.Open(path) + if err != nil { + return plumbing.ZeroHash, err + } + + defer f.Close() + + h := plumbing.NewHasher(plumbing.BlobObject, file.Size()) + if _, err := io.Copy(h, f); err != nil { + return plumbing.ZeroHash, err + } + + return h.Sum(), nil +} + +func (n *node) doCalculateHashForSymlink(path string, file os.FileInfo) (plumbing.Hash, error) { + target, err := n.fs.Readlink(path) + if err != nil { + return plumbing.ZeroHash, err + } + + h := plumbing.NewHasher(plumbing.BlobObject, file.Size()) + if _, err := h.Write([]byte(target)); err != nil { + return plumbing.ZeroHash, err + } + + return h.Sum(), nil +} + +func (n *node) String() string { + return n.path +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/index/node.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/index/node.go new file mode 100644 index 0000000000..d05b0c694d --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/index/node.go @@ -0,0 +1,90 @@ +package index + +import ( + "path" + "strings" + + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// The node represents a index.Entry or a directory inferred from the path +// of all entries. It implements the interface noder.Noder of merkletrie +// package. +// +// This implementation implements a "standard" hash method being able to be +// compared with any other noder.Noder implementation inside of go-git +type node struct { + path string + entry *index.Entry + children []noder.Noder + isDir bool +} + +// NewRootNode returns the root node of a computed tree from a index.Index, +func NewRootNode(idx *index.Index) noder.Noder { + const rootNode = "" + + m := map[string]*node{rootNode: {isDir: true}} + + for _, e := range idx.Entries { + parts := strings.Split(e.Name, string("/")) + + var fullpath string + for _, part := range parts { + parent := fullpath + fullpath = path.Join(fullpath, part) + + if _, ok := m[fullpath]; ok { + continue + } + + n := &node{path: fullpath} + if fullpath == e.Name { + n.entry = e + } else { + n.isDir = true + } + + m[n.path] = n + m[parent].children = append(m[parent].children, n) + } + } + + return m[rootNode] +} + +func (n *node) String() string { + return n.path +} + +// Hash the hash of a filesystem is a 24-byte slice, is the result of +// concatenating the computed plumbing.Hash of the file as a Blob and its +// plumbing.FileMode; that way the difftree algorithm will detect changes in the +// contents of files and also in their mode. +// +// If the node is computed and not based on a index.Entry the hash is equals +// to a 24-bytes slices of zero values. +func (n *node) Hash() []byte { + if n.entry == nil { + return make([]byte, 24) + } + + return append(n.entry.Hash[:], n.entry.Mode.Bytes()...) +} + +func (n *node) Name() string { + return path.Base(n.path) +} + +func (n *node) IsDir() bool { + return n.isDir +} + +func (n *node) Children() ([]noder.Noder, error) { + return n.children, nil +} + +func (n *node) NumChildren() (int, error) { + return len(n.children), nil +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame/frame.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame/frame.go new file mode 100644 index 0000000000..131878a1c7 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame/frame.go @@ -0,0 +1,91 @@ +package frame + +import ( + "bytes" + "fmt" + "sort" + "strings" + + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// A Frame is a collection of siblings in a trie, sorted alphabetically +// by name. +type Frame struct { + // siblings, sorted in reverse alphabetical order by name + stack []noder.Noder +} + +type byName []noder.Noder + +func (a byName) Len() int { return len(a) } +func (a byName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byName) Less(i, j int) bool { + return strings.Compare(a[i].Name(), a[j].Name()) < 0 +} + +// New returns a frame with the children of the provided node. +func New(n noder.Noder) (*Frame, error) { + children, err := n.Children() + if err != nil { + return nil, err + } + + sort.Sort(sort.Reverse(byName(children))) + return &Frame{ + stack: children, + }, nil +} + +// String returns the quoted names of the noders in the frame sorted in +// alphabetical order by name, surrounded by square brackets and +// separated by comas. +// +// Examples: +// [] +// ["a", "b"] +func (f *Frame) String() string { + var buf bytes.Buffer + _ = buf.WriteByte('[') + + sep := "" + for i := f.Len() - 1; i >= 0; i-- { + _, _ = buf.WriteString(sep) + sep = ", " + _, _ = buf.WriteString(fmt.Sprintf("%q", f.stack[i].Name())) + } + + _ = buf.WriteByte(']') + + return buf.String() +} + +// First returns, but dont extract, the noder with the alphabetically +// smaller name in the frame and true if the frame was not empty. +// Otherwise it returns nil and false. +func (f *Frame) First() (noder.Noder, bool) { + if f.Len() == 0 { + return nil, false + } + + top := f.Len() - 1 + + return f.stack[top], true +} + +// Drop extracts the noder with the alphabetically smaller name in the +// frame or does nothing if the frame was empty. +func (f *Frame) Drop() { + if f.Len() == 0 { + return + } + + top := f.Len() - 1 + f.stack[top] = nil + f.stack = f.stack[:top] +} + +// Len returns the number of noders in the frame. +func (f *Frame) Len() int { + return len(f.stack) +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/iter.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/iter.go new file mode 100644 index 0000000000..d75afec464 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/iter.go @@ -0,0 +1,216 @@ +package merkletrie + +import ( + "fmt" + "io" + + "github.com/go-git/go-git/v5/utils/merkletrie/internal/frame" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +// Iter is an iterator for merkletries (only the trie part of the +// merkletrie is relevant here, it does not use the Hasher interface). +// +// The iteration is performed in depth-first pre-order. Entries at each +// depth are traversed in (case-sensitive) alphabetical order. +// +// This is the kind of traversal you will expect when listing ordinary +// files and directories recursively, for example: +// +// Trie Traversal order +// ---- --------------- +// . +// / | \ c +// / | \ d/ +// d c z ===> d/a +// / \ d/b +// b a z +// +// +// This iterator is somewhat especial as you can chose to skip whole +// "directories" when iterating: +// +// - The Step method will iterate normally. +// +// - the Next method will not descend deeper into the tree. +// +// For example, if the iterator is at `d/`, the Step method will return +// `d/a` while the Next would have returned `z` instead (skipping `d/` +// and its descendants). The name of the these two methods are based on +// the well known "next" and "step" operations, quite common in +// debuggers, like gdb. +// +// The paths returned by the iterator will be relative, if the iterator +// was created from a single node, or absolute, if the iterator was +// created from the path to the node (the path will be prefixed to all +// returned paths). +type Iter struct { + // Tells if the iteration has started. + hasStarted bool + // The top of this stack has the current node and its siblings. The + // rest of the stack keeps the ancestors of the current node and + // their corresponding siblings. The current element is always the + // top element of the top frame. + // + // When "step"ping into a node, its children are pushed as a new + // frame. + // + // When "next"ing pass a node, the current element is dropped by + // popping the top frame. + frameStack []*frame.Frame + // The base path used to turn the relative paths used internally by + // the iterator into absolute paths used by external applications. + // For relative iterator this will be nil. + base noder.Path +} + +// NewIter returns a new relative iterator using the provider noder as +// its unnamed root. When iterating, all returned paths will be +// relative to node. +func NewIter(n noder.Noder) (*Iter, error) { + return newIter(n, nil) +} + +// NewIterFromPath returns a new absolute iterator from the noder at the +// end of the path p. When iterating, all returned paths will be +// absolute, using the root of the path p as their root. +func NewIterFromPath(p noder.Path) (*Iter, error) { + return newIter(p, p) // Path implements Noder +} + +func newIter(root noder.Noder, base noder.Path) (*Iter, error) { + ret := &Iter{ + base: base, + } + + if root == nil { + return ret, nil + } + + frame, err := frame.New(root) + if err != nil { + return nil, err + } + ret.push(frame) + + return ret, nil +} + +func (iter *Iter) top() (*frame.Frame, bool) { + if len(iter.frameStack) == 0 { + return nil, false + } + top := len(iter.frameStack) - 1 + + return iter.frameStack[top], true +} + +func (iter *Iter) push(f *frame.Frame) { + iter.frameStack = append(iter.frameStack, f) +} + +const ( + doDescend = true + dontDescend = false +) + +// Next returns the path of the next node without descending deeper into +// the trie and nil. If there are no more entries in the trie it +// returns nil and io.EOF. In case of error, it will return nil and the +// error. +func (iter *Iter) Next() (noder.Path, error) { + return iter.advance(dontDescend) +} + +// Step returns the path to the next node in the trie, descending deeper +// into it if needed, and nil. If there are no more nodes in the trie, +// it returns nil and io.EOF. In case of error, it will return nil and +// the error. +func (iter *Iter) Step() (noder.Path, error) { + return iter.advance(doDescend) +} + +// Advances the iterator in the desired direction: descend or +// dontDescend. +// +// Returns the new current element and a nil error on success. If there +// are no more elements in the trie below the base, it returns nil, and +// io.EOF. Returns nil and an error in case of errors. +func (iter *Iter) advance(wantDescend bool) (noder.Path, error) { + current, err := iter.current() + if err != nil { + return nil, err + } + + // The first time we just return the current node. + if !iter.hasStarted { + iter.hasStarted = true + return current, nil + } + + // Advances means getting a next current node, either its first child or + // its next sibling, depending if we must descend or not. + numChildren, err := current.NumChildren() + if err != nil { + return nil, err + } + + mustDescend := numChildren != 0 && wantDescend + if mustDescend { + // descend: add a new frame with the current's children. + frame, err := frame.New(current) + if err != nil { + return nil, err + } + iter.push(frame) + } else { + // don't descend: just drop the current node + iter.drop() + } + + return iter.current() +} + +// Returns the path to the current node, adding the base if there was +// one, and a nil error. If there were no noders left, it returns nil +// and io.EOF. If an error occurred, it returns nil and the error. +func (iter *Iter) current() (noder.Path, error) { + if topFrame, ok := iter.top(); !ok { + return nil, io.EOF + } else if _, ok := topFrame.First(); !ok { + return nil, io.EOF + } + + ret := make(noder.Path, 0, len(iter.base)+len(iter.frameStack)) + + // concat the base... + ret = append(ret, iter.base...) + // ... and the current node and all its ancestors + for i, f := range iter.frameStack { + t, ok := f.First() + if !ok { + panic(fmt.Sprintf("frame %d is empty", i)) + } + ret = append(ret, t) + } + + return ret, nil +} + +// removes the current node if any, and all the frames that become empty as a +// consequence of this action. +func (iter *Iter) drop() { + frame, ok := iter.top() + if !ok { + return + } + + frame.Drop() + // if the frame is empty, remove it and its parent, recursively + if frame.Len() == 0 { + top := len(iter.frameStack) - 1 + iter.frameStack[top] = nil + iter.frameStack = iter.frameStack[:top] + iter.drop() + } +} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/noder.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/noder.go new file mode 100644 index 0000000000..d6b3de4ada --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/noder.go @@ -0,0 +1,59 @@ +// Package noder provide an interface for defining nodes in a +// merkletrie, their hashes and their paths (a noders and its +// ancestors). +// +// The hasher interface is easy to implement naively by elements that +// already have a hash, like git blobs and trees. More sophisticated +// implementations can implement the Equal function in exotic ways +// though: for instance, comparing the modification time of directories +// in a filesystem. +package noder + +import "fmt" + +// Hasher interface is implemented by types that can tell you +// their hash. +type Hasher interface { + Hash() []byte +} + +// Equal functions take two hashers and return if they are equal. +// +// These functions are expected to be faster than reflect.Equal or +// reflect.DeepEqual because they can compare just the hash of the +// objects, instead of their contents, so they are expected to be O(1). +type Equal func(a, b Hasher) bool + +// The Noder interface is implemented by the elements of a Merkle Trie. +// +// There are two types of elements in a Merkle Trie: +// +// - file-like nodes: they cannot have children. +// +// - directory-like nodes: they can have 0 or more children and their +// hash is calculated by combining their children hashes. +type Noder interface { + Hasher + fmt.Stringer // for testing purposes + // Name returns the name of an element (relative, not its full + // path). + Name() string + // IsDir returns true if the element is a directory-like node or + // false if it is a file-like node. + IsDir() bool + // Children returns the children of the element. Note that empty + // directory-like noders and file-like noders will both return + // NoChildren. + Children() ([]Noder, error) + // NumChildren returns the number of children this element has. + // + // This method is an optimization: the number of children is easily + // calculated as the length of the value returned by the Children + // method (above); yet, some implementations will be able to + // implement NumChildren in O(1) while Children is usually more + // complex. + NumChildren() (int, error) +} + +// NoChildren represents the children of a noder without children. +var NoChildren = []Noder{} diff --git a/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/path.go b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/path.go new file mode 100644 index 0000000000..1c7ef54eeb --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/path.go @@ -0,0 +1,90 @@ +package noder + +import ( + "bytes" + "strings" +) + +// Path values represent a noder and its ancestors. The root goes first +// and the actual final noder the path is referring to will be the last. +// +// A path implements the Noder interface, redirecting all the interface +// calls to its final noder. +// +// Paths build from an empty Noder slice are not valid paths and should +// not be used. +type Path []Noder + +// String returns the full path of the final noder as a string, using +// "/" as the separator. +func (p Path) String() string { + var buf bytes.Buffer + sep := "" + for _, e := range p { + _, _ = buf.WriteString(sep) + sep = "/" + _, _ = buf.WriteString(e.Name()) + } + + return buf.String() +} + +// Last returns the final noder in the path. +func (p Path) Last() Noder { + return p[len(p)-1] +} + +// Hash returns the hash of the final noder of the path. +func (p Path) Hash() []byte { + return p.Last().Hash() +} + +// Name returns the name of the final noder of the path. +func (p Path) Name() string { + return p.Last().Name() +} + +// IsDir returns if the final noder of the path is a directory-like +// noder. +func (p Path) IsDir() bool { + return p.Last().IsDir() +} + +// Children returns the children of the final noder in the path. +func (p Path) Children() ([]Noder, error) { + return p.Last().Children() +} + +// NumChildren returns the number of children the final noder of the +// path has. +func (p Path) NumChildren() (int, error) { + return p.Last().NumChildren() +} + +// Compare returns -1, 0 or 1 if the path p is smaller, equal or bigger +// than other, in "directory order"; for example: +// +// "a" < "b" +// "a/b/c/d/z" < "b" +// "a/b/a" > "a/b" +func (p Path) Compare(other Path) int { + i := 0 + for { + switch { + case len(other) == len(p) && i == len(p): + return 0 + case i == len(other): + return 1 + case i == len(p): + return -1 + default: + // We do *not* normalize Unicode here. CGit doesn't. + // https://github.com/src-d/go-git/issues/1057 + cmp := strings.Compare(p[i].Name(), other[i].Name()) + if cmp != 0 { + return cmp + } + } + i++ + } +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree.go b/vendor/github.com/go-git/go-git/v5/worktree.go new file mode 100644 index 0000000000..f23d9f1703 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree.go @@ -0,0 +1,965 @@ +package git + +import ( + "context" + "errors" + "fmt" + "io" + stdioutil "io/ioutil" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/format/gitignore" + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/go-git/go-git/v5/utils/merkletrie" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/util" +) + +var ( + ErrWorktreeNotClean = errors.New("worktree is not clean") + ErrSubmoduleNotFound = errors.New("submodule not found") + ErrUnstagedChanges = errors.New("worktree contains unstaged changes") + ErrGitModulesSymlink = errors.New(gitmodulesFile + " is a symlink") + ErrNonFastForwardUpdate = errors.New("non-fast-forward update") +) + +// Worktree represents a git worktree. +type Worktree struct { + // Filesystem underlying filesystem. + Filesystem billy.Filesystem + // External excludes not found in the repository .gitignore + Excludes []gitignore.Pattern + + r *Repository +} + +// Pull incorporates changes from a remote repository into the current branch. +// Returns nil if the operation is successful, NoErrAlreadyUpToDate if there are +// no changes to be fetched, or an error. +// +// Pull only supports merges where the can be resolved as a fast-forward. +func (w *Worktree) Pull(o *PullOptions) error { + return w.PullContext(context.Background(), o) +} + +// PullContext incorporates changes from a remote repository into the current +// branch. Returns nil if the operation is successful, NoErrAlreadyUpToDate if +// there are no changes to be fetched, or an error. +// +// Pull only supports merges where the can be resolved as a fast-forward. +// +// The provided Context must be non-nil. If the context expires before the +// operation is complete, an error is returned. The context only affects the +// transport operations. +func (w *Worktree) PullContext(ctx context.Context, o *PullOptions) error { + if err := o.Validate(); err != nil { + return err + } + + remote, err := w.r.Remote(o.RemoteName) + if err != nil { + return err + } + + fetchHead, err := remote.fetch(ctx, &FetchOptions{ + RemoteName: o.RemoteName, + Depth: o.Depth, + Auth: o.Auth, + Progress: o.Progress, + Force: o.Force, + InsecureSkipTLS: o.InsecureSkipTLS, + CABundle: o.CABundle, + }) + + updated := true + if err == NoErrAlreadyUpToDate { + updated = false + } else if err != nil { + return err + } + + ref, err := storer.ResolveReference(fetchHead, o.ReferenceName) + if err != nil { + return err + } + + head, err := w.r.Head() + if err == nil { + headAheadOfRef, err := isFastForward(w.r.Storer, ref.Hash(), head.Hash()) + if err != nil { + return err + } + + if !updated && headAheadOfRef { + return NoErrAlreadyUpToDate + } + + ff, err := isFastForward(w.r.Storer, head.Hash(), ref.Hash()) + if err != nil { + return err + } + + if !ff { + return ErrNonFastForwardUpdate + } + } + + if err != nil && err != plumbing.ErrReferenceNotFound { + return err + } + + if err := w.updateHEAD(ref.Hash()); err != nil { + return err + } + + if err := w.Reset(&ResetOptions{ + Mode: MergeReset, + Commit: ref.Hash(), + }); err != nil { + return err + } + + if o.RecurseSubmodules != NoRecurseSubmodules { + return w.updateSubmodules(&SubmoduleUpdateOptions{ + RecurseSubmodules: o.RecurseSubmodules, + Auth: o.Auth, + }) + } + + return nil +} + +func (w *Worktree) updateSubmodules(o *SubmoduleUpdateOptions) error { + s, err := w.Submodules() + if err != nil { + return err + } + o.Init = true + return s.Update(o) +} + +// Checkout switch branches or restore working tree files. +func (w *Worktree) Checkout(opts *CheckoutOptions) error { + if err := opts.Validate(); err != nil { + return err + } + + if opts.Create { + if err := w.createBranch(opts); err != nil { + return err + } + } + + c, err := w.getCommitFromCheckoutOptions(opts) + if err != nil { + return err + } + + ro := &ResetOptions{Commit: c, Mode: MergeReset} + if opts.Force { + ro.Mode = HardReset + } else if opts.Keep { + ro.Mode = SoftReset + } + + if !opts.Hash.IsZero() && !opts.Create { + err = w.setHEADToCommit(opts.Hash) + } else { + err = w.setHEADToBranch(opts.Branch, c) + } + + if err != nil { + return err + } + + return w.Reset(ro) +} +func (w *Worktree) createBranch(opts *CheckoutOptions) error { + _, err := w.r.Storer.Reference(opts.Branch) + if err == nil { + return fmt.Errorf("a branch named %q already exists", opts.Branch) + } + + if err != plumbing.ErrReferenceNotFound { + return err + } + + if opts.Hash.IsZero() { + ref, err := w.r.Head() + if err != nil { + return err + } + + opts.Hash = ref.Hash() + } + + return w.r.Storer.SetReference( + plumbing.NewHashReference(opts.Branch, opts.Hash), + ) +} + +func (w *Worktree) getCommitFromCheckoutOptions(opts *CheckoutOptions) (plumbing.Hash, error) { + if !opts.Hash.IsZero() { + return opts.Hash, nil + } + + b, err := w.r.Reference(opts.Branch, true) + if err != nil { + return plumbing.ZeroHash, err + } + + if !b.Name().IsTag() { + return b.Hash(), nil + } + + o, err := w.r.Object(plumbing.AnyObject, b.Hash()) + if err != nil { + return plumbing.ZeroHash, err + } + + switch o := o.(type) { + case *object.Tag: + if o.TargetType != plumbing.CommitObject { + return plumbing.ZeroHash, fmt.Errorf("unsupported tag object target %q", o.TargetType) + } + + return o.Target, nil + case *object.Commit: + return o.Hash, nil + } + + return plumbing.ZeroHash, fmt.Errorf("unsupported tag target %q", o.Type()) +} + +func (w *Worktree) setHEADToCommit(commit plumbing.Hash) error { + head := plumbing.NewHashReference(plumbing.HEAD, commit) + return w.r.Storer.SetReference(head) +} + +func (w *Worktree) setHEADToBranch(branch plumbing.ReferenceName, commit plumbing.Hash) error { + target, err := w.r.Storer.Reference(branch) + if err != nil { + return err + } + + var head *plumbing.Reference + if target.Name().IsBranch() { + head = plumbing.NewSymbolicReference(plumbing.HEAD, target.Name()) + } else { + head = plumbing.NewHashReference(plumbing.HEAD, commit) + } + + return w.r.Storer.SetReference(head) +} + +// Reset the worktree to a specified state. +func (w *Worktree) Reset(opts *ResetOptions) error { + if err := opts.Validate(w.r); err != nil { + return err + } + + if opts.Mode == MergeReset { + unstaged, err := w.containsUnstagedChanges() + if err != nil { + return err + } + + if unstaged { + return ErrUnstagedChanges + } + } + + if err := w.setHEADCommit(opts.Commit); err != nil { + return err + } + + if opts.Mode == SoftReset { + return nil + } + + t, err := w.getTreeFromCommitHash(opts.Commit) + if err != nil { + return err + } + + if opts.Mode == MixedReset || opts.Mode == MergeReset || opts.Mode == HardReset { + if err := w.resetIndex(t); err != nil { + return err + } + } + + if opts.Mode == MergeReset || opts.Mode == HardReset { + if err := w.resetWorktree(t); err != nil { + return err + } + } + + return nil +} + +func (w *Worktree) resetIndex(t *object.Tree) error { + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + b := newIndexBuilder(idx) + + changes, err := w.diffTreeWithStaging(t, true) + if err != nil { + return err + } + + for _, ch := range changes { + a, err := ch.Action() + if err != nil { + return err + } + + var name string + var e *object.TreeEntry + + switch a { + case merkletrie.Modify, merkletrie.Insert: + name = ch.To.String() + e, err = t.FindEntry(name) + if err != nil { + return err + } + case merkletrie.Delete: + name = ch.From.String() + } + + b.Remove(name) + if e == nil { + continue + } + + b.Add(&index.Entry{ + Name: name, + Hash: e.Hash, + Mode: e.Mode, + }) + + } + + b.Write(idx) + return w.r.Storer.SetIndex(idx) +} + +func (w *Worktree) resetWorktree(t *object.Tree) error { + changes, err := w.diffStagingWithWorktree(true) + if err != nil { + return err + } + + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + b := newIndexBuilder(idx) + + for _, ch := range changes { + if err := w.checkoutChange(ch, t, b); err != nil { + return err + } + } + + b.Write(idx) + return w.r.Storer.SetIndex(idx) +} + +func (w *Worktree) checkoutChange(ch merkletrie.Change, t *object.Tree, idx *indexBuilder) error { + a, err := ch.Action() + if err != nil { + return err + } + + var e *object.TreeEntry + var name string + var isSubmodule bool + + switch a { + case merkletrie.Modify, merkletrie.Insert: + name = ch.To.String() + e, err = t.FindEntry(name) + if err != nil { + return err + } + + isSubmodule = e.Mode == filemode.Submodule + case merkletrie.Delete: + return rmFileAndDirIfEmpty(w.Filesystem, ch.From.String()) + } + + if isSubmodule { + return w.checkoutChangeSubmodule(name, a, e, idx) + } + + return w.checkoutChangeRegularFile(name, a, t, e, idx) +} + +func (w *Worktree) containsUnstagedChanges() (bool, error) { + ch, err := w.diffStagingWithWorktree(false) + if err != nil { + return false, err + } + + for _, c := range ch { + a, err := c.Action() + if err != nil { + return false, err + } + + if a == merkletrie.Insert { + continue + } + + return true, nil + } + + return false, nil +} + +func (w *Worktree) setHEADCommit(commit plumbing.Hash) error { + head, err := w.r.Reference(plumbing.HEAD, false) + if err != nil { + return err + } + + if head.Type() == plumbing.HashReference { + head = plumbing.NewHashReference(plumbing.HEAD, commit) + return w.r.Storer.SetReference(head) + } + + branch, err := w.r.Reference(head.Target(), false) + if err != nil { + return err + } + + if !branch.Name().IsBranch() { + return fmt.Errorf("invalid HEAD target should be a branch, found %s", branch.Type()) + } + + branch = plumbing.NewHashReference(branch.Name(), commit) + return w.r.Storer.SetReference(branch) +} + +func (w *Worktree) checkoutChangeSubmodule(name string, + a merkletrie.Action, + e *object.TreeEntry, + idx *indexBuilder, +) error { + switch a { + case merkletrie.Modify: + sub, err := w.Submodule(name) + if err != nil { + return err + } + + if !sub.initialized { + return nil + } + + return w.addIndexFromTreeEntry(name, e, idx) + case merkletrie.Insert: + mode, err := e.Mode.ToOSFileMode() + if err != nil { + return err + } + + if err := w.Filesystem.MkdirAll(name, mode); err != nil { + return err + } + + return w.addIndexFromTreeEntry(name, e, idx) + } + + return nil +} + +func (w *Worktree) checkoutChangeRegularFile(name string, + a merkletrie.Action, + t *object.Tree, + e *object.TreeEntry, + idx *indexBuilder, +) error { + switch a { + case merkletrie.Modify: + idx.Remove(name) + + // to apply perm changes the file is deleted, billy doesn't implement + // chmod + if err := w.Filesystem.Remove(name); err != nil { + return err + } + + fallthrough + case merkletrie.Insert: + f, err := t.File(name) + if err != nil { + return err + } + + if err := w.checkoutFile(f); err != nil { + return err + } + + return w.addIndexFromFile(name, e.Hash, idx) + } + + return nil +} + +var copyBufferPool = sync.Pool{ + New: func() interface{} { + return make([]byte, 32*1024) + }, +} + +func (w *Worktree) checkoutFile(f *object.File) (err error) { + mode, err := f.Mode.ToOSFileMode() + if err != nil { + return + } + + if mode&os.ModeSymlink != 0 { + return w.checkoutFileSymlink(f) + } + + from, err := f.Reader() + if err != nil { + return + } + + defer ioutil.CheckClose(from, &err) + + to, err := w.Filesystem.OpenFile(f.Name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode.Perm()) + if err != nil { + return + } + + defer ioutil.CheckClose(to, &err) + buf := copyBufferPool.Get().([]byte) + _, err = io.CopyBuffer(to, from, buf) + copyBufferPool.Put(buf) + return +} + +func (w *Worktree) checkoutFileSymlink(f *object.File) (err error) { + from, err := f.Reader() + if err != nil { + return + } + + defer ioutil.CheckClose(from, &err) + + bytes, err := stdioutil.ReadAll(from) + if err != nil { + return + } + + err = w.Filesystem.Symlink(string(bytes), f.Name) + + // On windows, this might fail. + // Follow Git on Windows behavior by writing the link as it is. + if err != nil && isSymlinkWindowsNonAdmin(err) { + mode, _ := f.Mode.ToOSFileMode() + + to, err := w.Filesystem.OpenFile(f.Name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode.Perm()) + if err != nil { + return err + } + + defer ioutil.CheckClose(to, &err) + + _, err = to.Write(bytes) + return err + } + return +} + +func (w *Worktree) addIndexFromTreeEntry(name string, f *object.TreeEntry, idx *indexBuilder) error { + idx.Remove(name) + idx.Add(&index.Entry{ + Hash: f.Hash, + Name: name, + Mode: filemode.Submodule, + }) + return nil +} + +func (w *Worktree) addIndexFromFile(name string, h plumbing.Hash, idx *indexBuilder) error { + idx.Remove(name) + fi, err := w.Filesystem.Lstat(name) + if err != nil { + return err + } + + mode, err := filemode.NewFromOSFileMode(fi.Mode()) + if err != nil { + return err + } + + e := &index.Entry{ + Hash: h, + Name: name, + Mode: mode, + ModifiedAt: fi.ModTime(), + Size: uint32(fi.Size()), + } + + // if the FileInfo.Sys() comes from os the ctime, dev, inode, uid and gid + // can be retrieved, otherwise this doesn't apply + if fillSystemInfo != nil { + fillSystemInfo(e, fi.Sys()) + } + idx.Add(e) + return nil +} + +func (w *Worktree) getTreeFromCommitHash(commit plumbing.Hash) (*object.Tree, error) { + c, err := w.r.CommitObject(commit) + if err != nil { + return nil, err + } + + return c.Tree() +} + +var fillSystemInfo func(e *index.Entry, sys interface{}) + +const gitmodulesFile = ".gitmodules" + +// Submodule returns the submodule with the given name +func (w *Worktree) Submodule(name string) (*Submodule, error) { + l, err := w.Submodules() + if err != nil { + return nil, err + } + + for _, m := range l { + if m.Config().Name == name { + return m, nil + } + } + + return nil, ErrSubmoduleNotFound +} + +// Submodules returns all the available submodules +func (w *Worktree) Submodules() (Submodules, error) { + l := make(Submodules, 0) + m, err := w.readGitmodulesFile() + if err != nil || m == nil { + return l, err + } + + c, err := w.r.Config() + if err != nil { + return nil, err + } + + for _, s := range m.Submodules { + l = append(l, w.newSubmodule(s, c.Submodules[s.Name])) + } + + return l, nil +} + +func (w *Worktree) newSubmodule(fromModules, fromConfig *config.Submodule) *Submodule { + m := &Submodule{w: w} + m.initialized = fromConfig != nil + + if !m.initialized { + m.c = fromModules + return m + } + + m.c = fromConfig + m.c.Path = fromModules.Path + return m +} + +func (w *Worktree) isSymlink(path string) bool { + if s, err := w.Filesystem.Lstat(path); err == nil { + return s.Mode()&os.ModeSymlink != 0 + } + return false +} + +func (w *Worktree) readGitmodulesFile() (*config.Modules, error) { + if w.isSymlink(gitmodulesFile) { + return nil, ErrGitModulesSymlink + } + + f, err := w.Filesystem.Open(gitmodulesFile) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + + return nil, err + } + + defer f.Close() + input, err := stdioutil.ReadAll(f) + if err != nil { + return nil, err + } + + m := config.NewModules() + if err := m.Unmarshal(input); err != nil { + return m, err + } + + return m, nil +} + +// Clean the worktree by removing untracked files. +// An empty dir could be removed - this is what `git clean -f -d .` does. +func (w *Worktree) Clean(opts *CleanOptions) error { + s, err := w.Status() + if err != nil { + return err + } + + root := "" + files, err := w.Filesystem.ReadDir(root) + if err != nil { + return err + } + return w.doClean(s, opts, root, files) +} + +func (w *Worktree) doClean(status Status, opts *CleanOptions, dir string, files []os.FileInfo) error { + for _, fi := range files { + if fi.Name() == GitDirName { + continue + } + + // relative path under the root + path := filepath.Join(dir, fi.Name()) + if fi.IsDir() { + if !opts.Dir { + continue + } + + subfiles, err := w.Filesystem.ReadDir(path) + if err != nil { + return err + } + err = w.doClean(status, opts, path, subfiles) + if err != nil { + return err + } + } else { + if status.IsUntracked(path) { + if err := w.Filesystem.Remove(path); err != nil { + return err + } + } + } + } + + if opts.Dir && dir != "" { + return doCleanDirectories(w.Filesystem, dir) + } + return nil +} + +// GrepResult is structure of a grep result. +type GrepResult struct { + // FileName is the name of file which contains match. + FileName string + // LineNumber is the line number of a file at which a match was found. + LineNumber int + // Content is the content of the file at the matching line. + Content string + // TreeName is the name of the tree (reference name/commit hash) at + // which the match was performed. + TreeName string +} + +func (gr GrepResult) String() string { + return fmt.Sprintf("%s:%s:%d:%s", gr.TreeName, gr.FileName, gr.LineNumber, gr.Content) +} + +// Grep performs grep on a worktree. +func (w *Worktree) Grep(opts *GrepOptions) ([]GrepResult, error) { + if err := opts.Validate(w); err != nil { + return nil, err + } + + // Obtain commit hash from options (CommitHash or ReferenceName). + var commitHash plumbing.Hash + // treeName contains the value of TreeName in GrepResult. + var treeName string + + if opts.ReferenceName != "" { + ref, err := w.r.Reference(opts.ReferenceName, true) + if err != nil { + return nil, err + } + commitHash = ref.Hash() + treeName = opts.ReferenceName.String() + } else if !opts.CommitHash.IsZero() { + commitHash = opts.CommitHash + treeName = opts.CommitHash.String() + } + + // Obtain a tree from the commit hash and get a tracked files iterator from + // the tree. + tree, err := w.getTreeFromCommitHash(commitHash) + if err != nil { + return nil, err + } + fileiter := tree.Files() + + return findMatchInFiles(fileiter, treeName, opts) +} + +// findMatchInFiles takes a FileIter, worktree name and GrepOptions, and +// returns a slice of GrepResult containing the result of regex pattern matching +// in content of all the files. +func findMatchInFiles(fileiter *object.FileIter, treeName string, opts *GrepOptions) ([]GrepResult, error) { + var results []GrepResult + + err := fileiter.ForEach(func(file *object.File) error { + var fileInPathSpec bool + + // When no pathspecs are provided, search all the files. + if len(opts.PathSpecs) == 0 { + fileInPathSpec = true + } + + // Check if the file name matches with the pathspec. Break out of the + // loop once a match is found. + for _, pathSpec := range opts.PathSpecs { + if pathSpec != nil && pathSpec.MatchString(file.Name) { + fileInPathSpec = true + break + } + } + + // If the file does not match with any of the pathspec, skip it. + if !fileInPathSpec { + return nil + } + + grepResults, err := findMatchInFile(file, treeName, opts) + if err != nil { + return err + } + results = append(results, grepResults...) + + return nil + }) + + return results, err +} + +// findMatchInFile takes a single File, worktree name and GrepOptions, +// and returns a slice of GrepResult containing the result of regex pattern +// matching in the given file. +func findMatchInFile(file *object.File, treeName string, opts *GrepOptions) ([]GrepResult, error) { + var grepResults []GrepResult + + content, err := file.Contents() + if err != nil { + return grepResults, err + } + + // Split the file content and parse line-by-line. + contentByLine := strings.Split(content, "\n") + for lineNum, cnt := range contentByLine { + addToResult := false + + // Match the patterns and content. Break out of the loop once a + // match is found. + for _, pattern := range opts.Patterns { + if pattern != nil && pattern.MatchString(cnt) { + // Add to result only if invert match is not enabled. + if !opts.InvertMatch { + addToResult = true + break + } + } else if opts.InvertMatch { + // If matching fails, and invert match is enabled, add to + // results. + addToResult = true + break + } + } + + if addToResult { + grepResults = append(grepResults, GrepResult{ + FileName: file.Name, + LineNumber: lineNum + 1, + Content: cnt, + TreeName: treeName, + }) + } + } + + return grepResults, nil +} + +func rmFileAndDirIfEmpty(fs billy.Filesystem, name string) error { + if err := util.RemoveAll(fs, name); err != nil { + return err + } + + dir := filepath.Dir(name) + return doCleanDirectories(fs, dir) +} + +// doCleanDirectories removes empty subdirs (without files) +func doCleanDirectories(fs billy.Filesystem, dir string) error { + files, err := fs.ReadDir(dir) + if err != nil { + return err + } + if len(files) == 0 { + return fs.Remove(dir) + } + return nil +} + +type indexBuilder struct { + entries map[string]*index.Entry +} + +func newIndexBuilder(idx *index.Index) *indexBuilder { + entries := make(map[string]*index.Entry, len(idx.Entries)) + for _, e := range idx.Entries { + entries[e.Name] = e + } + return &indexBuilder{ + entries: entries, + } +} + +func (b *indexBuilder) Write(idx *index.Index) { + idx.Entries = idx.Entries[:0] + for _, e := range b.entries { + idx.Entries = append(idx.Entries, e) + } +} + +func (b *indexBuilder) Add(e *index.Entry) { + b.entries[e.Name] = e +} + +func (b *indexBuilder) Remove(name string) { + delete(b.entries, filepath.ToSlash(name)) +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_bsd.go b/vendor/github.com/go-git/go-git/v5/worktree_bsd.go new file mode 100644 index 0000000000..d4ea327588 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_bsd.go @@ -0,0 +1,26 @@ +// +build darwin freebsd netbsd + +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Stat_t); ok { + e.CreatedAt = time.Unix(int64(os.Atimespec.Sec), int64(os.Atimespec.Nsec)) + e.Dev = uint32(os.Dev) + e.Inode = uint32(os.Ino) + e.GID = os.Gid + e.UID = os.Uid + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_commit.go b/vendor/github.com/go-git/go-git/v5/worktree_commit.go new file mode 100644 index 0000000000..dc7956909e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_commit.go @@ -0,0 +1,238 @@ +package git + +import ( + "bytes" + "path" + "sort" + "strings" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/storage" + + "github.com/ProtonMail/go-crypto/openpgp" + "github.com/go-git/go-billy/v5" +) + +// Commit stores the current contents of the index in a new commit along with +// a log message from the user describing the changes. +func (w *Worktree) Commit(msg string, opts *CommitOptions) (plumbing.Hash, error) { + if err := opts.Validate(w.r); err != nil { + return plumbing.ZeroHash, err + } + + if opts.All { + if err := w.autoAddModifiedAndDeleted(); err != nil { + return plumbing.ZeroHash, err + } + } + + idx, err := w.r.Storer.Index() + if err != nil { + return plumbing.ZeroHash, err + } + + h := &buildTreeHelper{ + fs: w.Filesystem, + s: w.r.Storer, + } + + tree, err := h.BuildTree(idx) + if err != nil { + return plumbing.ZeroHash, err + } + + commit, err := w.buildCommitObject(msg, opts, tree) + if err != nil { + return plumbing.ZeroHash, err + } + + return commit, w.updateHEAD(commit) +} + +func (w *Worktree) autoAddModifiedAndDeleted() error { + s, err := w.Status() + if err != nil { + return err + } + + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + + for path, fs := range s { + if fs.Worktree != Modified && fs.Worktree != Deleted { + continue + } + + if _, _, err := w.doAddFile(idx, s, path, nil); err != nil { + return err + } + + } + + return w.r.Storer.SetIndex(idx) +} + +func (w *Worktree) updateHEAD(commit plumbing.Hash) error { + head, err := w.r.Storer.Reference(plumbing.HEAD) + if err != nil { + return err + } + + name := plumbing.HEAD + if head.Type() != plumbing.HashReference { + name = head.Target() + } + + ref := plumbing.NewHashReference(name, commit) + return w.r.Storer.SetReference(ref) +} + +func (w *Worktree) buildCommitObject(msg string, opts *CommitOptions, tree plumbing.Hash) (plumbing.Hash, error) { + commit := &object.Commit{ + Author: *opts.Author, + Committer: *opts.Committer, + Message: msg, + TreeHash: tree, + ParentHashes: opts.Parents, + } + + if opts.SignKey != nil { + sig, err := w.buildCommitSignature(commit, opts.SignKey) + if err != nil { + return plumbing.ZeroHash, err + } + commit.PGPSignature = sig + } + + obj := w.r.Storer.NewEncodedObject() + if err := commit.Encode(obj); err != nil { + return plumbing.ZeroHash, err + } + return w.r.Storer.SetEncodedObject(obj) +} + +func (w *Worktree) buildCommitSignature(commit *object.Commit, signKey *openpgp.Entity) (string, error) { + encoded := &plumbing.MemoryObject{} + if err := commit.Encode(encoded); err != nil { + return "", err + } + r, err := encoded.Reader() + if err != nil { + return "", err + } + var b bytes.Buffer + if err := openpgp.ArmoredDetachSign(&b, signKey, r, nil); err != nil { + return "", err + } + return b.String(), nil +} + +// buildTreeHelper converts a given index.Index file into multiple git objects +// reading the blobs from the given filesystem and creating the trees from the +// index structure. The created objects are pushed to a given Storer. +type buildTreeHelper struct { + fs billy.Filesystem + s storage.Storer + + trees map[string]*object.Tree + entries map[string]*object.TreeEntry +} + +// BuildTree builds the tree objects and push its to the storer, the hash +// of the root tree is returned. +func (h *buildTreeHelper) BuildTree(idx *index.Index) (plumbing.Hash, error) { + const rootNode = "" + h.trees = map[string]*object.Tree{rootNode: {}} + h.entries = map[string]*object.TreeEntry{} + + for _, e := range idx.Entries { + if err := h.commitIndexEntry(e); err != nil { + return plumbing.ZeroHash, err + } + } + + return h.copyTreeToStorageRecursive(rootNode, h.trees[rootNode]) +} + +func (h *buildTreeHelper) commitIndexEntry(e *index.Entry) error { + parts := strings.Split(e.Name, "/") + + var fullpath string + for _, part := range parts { + parent := fullpath + fullpath = path.Join(fullpath, part) + + h.doBuildTree(e, parent, fullpath) + } + + return nil +} + +func (h *buildTreeHelper) doBuildTree(e *index.Entry, parent, fullpath string) { + if _, ok := h.trees[fullpath]; ok { + return + } + + if _, ok := h.entries[fullpath]; ok { + return + } + + te := object.TreeEntry{Name: path.Base(fullpath)} + + if fullpath == e.Name { + te.Mode = e.Mode + te.Hash = e.Hash + } else { + te.Mode = filemode.Dir + h.trees[fullpath] = &object.Tree{} + } + + h.trees[parent].Entries = append(h.trees[parent].Entries, te) +} + +type sortableEntries []object.TreeEntry + +func (sortableEntries) sortName(te object.TreeEntry) string { + if te.Mode == filemode.Dir { + return te.Name + "/" + } + return te.Name +} +func (se sortableEntries) Len() int { return len(se) } +func (se sortableEntries) Less(i int, j int) bool { return se.sortName(se[i]) < se.sortName(se[j]) } +func (se sortableEntries) Swap(i int, j int) { se[i], se[j] = se[j], se[i] } + +func (h *buildTreeHelper) copyTreeToStorageRecursive(parent string, t *object.Tree) (plumbing.Hash, error) { + sort.Sort(sortableEntries(t.Entries)) + for i, e := range t.Entries { + if e.Mode != filemode.Dir && !e.Hash.IsZero() { + continue + } + + path := path.Join(parent, e.Name) + + var err error + e.Hash, err = h.copyTreeToStorageRecursive(path, h.trees[path]) + if err != nil { + return plumbing.ZeroHash, err + } + + t.Entries[i] = e + } + + o := h.s.NewEncodedObject() + if err := t.Encode(o); err != nil { + return plumbing.ZeroHash, err + } + + hash := o.Hash() + if h.s.HasEncodedObject(hash) == nil { + return hash, nil + } + return h.s.SetEncodedObject(o) +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_js.go b/vendor/github.com/go-git/go-git/v5/worktree_js.go new file mode 100644 index 0000000000..7267d055e7 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_js.go @@ -0,0 +1,26 @@ +// +build js + +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Stat_t); ok { + e.CreatedAt = time.Unix(int64(os.Ctime), int64(os.CtimeNsec)) + e.Dev = uint32(os.Dev) + e.Inode = uint32(os.Ino) + e.GID = os.Gid + e.UID = os.Uid + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_linux.go b/vendor/github.com/go-git/go-git/v5/worktree_linux.go new file mode 100644 index 0000000000..cf0db25242 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_linux.go @@ -0,0 +1,26 @@ +// +build linux + +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Stat_t); ok { + e.CreatedAt = time.Unix(int64(os.Ctim.Sec), int64(os.Ctim.Nsec)) + e.Dev = uint32(os.Dev) + e.Inode = uint32(os.Ino) + e.GID = os.Gid + e.UID = os.Uid + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_plan9.go b/vendor/github.com/go-git/go-git/v5/worktree_plan9.go new file mode 100644 index 0000000000..8cedf71a32 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_plan9.go @@ -0,0 +1,31 @@ +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Dir); ok { + // Plan 9 doesn't have a CreatedAt field. + e.CreatedAt = time.Unix(int64(os.Mtime), 0) + + e.Dev = uint32(os.Dev) + + // Plan 9 has no Inode. + // ext2srv(4) appears to store Inode in Qid.Path. + e.Inode = uint32(os.Qid.Path) + + // Plan 9 has string UID/GID + e.GID = 0 + e.UID = 0 + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return true +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_status.go b/vendor/github.com/go-git/go-git/v5/worktree_status.go new file mode 100644 index 0000000000..c639f13208 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_status.go @@ -0,0 +1,708 @@ +package git + +import ( + "bytes" + "errors" + "io" + "os" + "path" + "path/filepath" + "strings" + + "github.com/go-git/go-billy/v5/util" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/format/gitignore" + "github.com/go-git/go-git/v5/plumbing/format/index" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/utils/ioutil" + "github.com/go-git/go-git/v5/utils/merkletrie" + "github.com/go-git/go-git/v5/utils/merkletrie/filesystem" + mindex "github.com/go-git/go-git/v5/utils/merkletrie/index" + "github.com/go-git/go-git/v5/utils/merkletrie/noder" +) + +var ( + // ErrDestinationExists in an Move operation means that the target exists on + // the worktree. + ErrDestinationExists = errors.New("destination exists") + // ErrGlobNoMatches in an AddGlob if the glob pattern does not match any + // files in the worktree. + ErrGlobNoMatches = errors.New("glob pattern did not match any files") +) + +// Status returns the working tree status. +func (w *Worktree) Status() (Status, error) { + var hash plumbing.Hash + + ref, err := w.r.Head() + if err != nil && err != plumbing.ErrReferenceNotFound { + return nil, err + } + + if err == nil { + hash = ref.Hash() + } + + return w.status(hash) +} + +func (w *Worktree) status(commit plumbing.Hash) (Status, error) { + s := make(Status) + + left, err := w.diffCommitWithStaging(commit, false) + if err != nil { + return nil, err + } + + for _, ch := range left { + a, err := ch.Action() + if err != nil { + return nil, err + } + + fs := s.File(nameFromAction(&ch)) + fs.Worktree = Unmodified + + switch a { + case merkletrie.Delete: + s.File(ch.From.String()).Staging = Deleted + case merkletrie.Insert: + s.File(ch.To.String()).Staging = Added + case merkletrie.Modify: + s.File(ch.To.String()).Staging = Modified + } + } + + right, err := w.diffStagingWithWorktree(false) + if err != nil { + return nil, err + } + + for _, ch := range right { + a, err := ch.Action() + if err != nil { + return nil, err + } + + fs := s.File(nameFromAction(&ch)) + if fs.Staging == Untracked { + fs.Staging = Unmodified + } + + switch a { + case merkletrie.Delete: + fs.Worktree = Deleted + case merkletrie.Insert: + fs.Worktree = Untracked + fs.Staging = Untracked + case merkletrie.Modify: + fs.Worktree = Modified + } + } + + return s, nil +} + +func nameFromAction(ch *merkletrie.Change) string { + name := ch.To.String() + if name == "" { + return ch.From.String() + } + + return name +} + +func (w *Worktree) diffStagingWithWorktree(reverse bool) (merkletrie.Changes, error) { + idx, err := w.r.Storer.Index() + if err != nil { + return nil, err + } + + from := mindex.NewRootNode(idx) + submodules, err := w.getSubmodulesStatus() + if err != nil { + return nil, err + } + + to := filesystem.NewRootNode(w.Filesystem, submodules) + + var c merkletrie.Changes + if reverse { + c, err = merkletrie.DiffTree(to, from, diffTreeIsEquals) + } else { + c, err = merkletrie.DiffTree(from, to, diffTreeIsEquals) + } + + if err != nil { + return nil, err + } + + return w.excludeIgnoredChanges(c), nil +} + +func (w *Worktree) excludeIgnoredChanges(changes merkletrie.Changes) merkletrie.Changes { + patterns, err := gitignore.ReadPatterns(w.Filesystem, nil) + if err != nil { + return changes + } + + patterns = append(patterns, w.Excludes...) + + if len(patterns) == 0 { + return changes + } + + m := gitignore.NewMatcher(patterns) + + var res merkletrie.Changes + for _, ch := range changes { + var path []string + for _, n := range ch.To { + path = append(path, n.Name()) + } + if len(path) == 0 { + for _, n := range ch.From { + path = append(path, n.Name()) + } + } + if len(path) != 0 { + isDir := (len(ch.To) > 0 && ch.To.IsDir()) || (len(ch.From) > 0 && ch.From.IsDir()) + if m.Match(path, isDir) { + continue + } + } + res = append(res, ch) + } + return res +} + +func (w *Worktree) getSubmodulesStatus() (map[string]plumbing.Hash, error) { + o := map[string]plumbing.Hash{} + + sub, err := w.Submodules() + if err != nil { + return nil, err + } + + status, err := sub.Status() + if err != nil { + return nil, err + } + + for _, s := range status { + if s.Current.IsZero() { + o[s.Path] = s.Expected + continue + } + + o[s.Path] = s.Current + } + + return o, nil +} + +func (w *Worktree) diffCommitWithStaging(commit plumbing.Hash, reverse bool) (merkletrie.Changes, error) { + var t *object.Tree + if !commit.IsZero() { + c, err := w.r.CommitObject(commit) + if err != nil { + return nil, err + } + + t, err = c.Tree() + if err != nil { + return nil, err + } + } + + return w.diffTreeWithStaging(t, reverse) +} + +func (w *Worktree) diffTreeWithStaging(t *object.Tree, reverse bool) (merkletrie.Changes, error) { + var from noder.Noder + if t != nil { + from = object.NewTreeRootNode(t) + } + + idx, err := w.r.Storer.Index() + if err != nil { + return nil, err + } + + to := mindex.NewRootNode(idx) + + if reverse { + return merkletrie.DiffTree(to, from, diffTreeIsEquals) + } + + return merkletrie.DiffTree(from, to, diffTreeIsEquals) +} + +var emptyNoderHash = make([]byte, 24) + +// diffTreeIsEquals is a implementation of noder.Equals, used to compare +// noder.Noder, it compare the content and the length of the hashes. +// +// Since some of the noder.Noder implementations doesn't compute a hash for +// some directories, if any of the hashes is a 24-byte slice of zero values +// the comparison is not done and the hashes are take as different. +func diffTreeIsEquals(a, b noder.Hasher) bool { + hashA := a.Hash() + hashB := b.Hash() + + if bytes.Equal(hashA, emptyNoderHash) || bytes.Equal(hashB, emptyNoderHash) { + return false + } + + return bytes.Equal(hashA, hashB) +} + +// Add adds the file contents of a file in the worktree to the index. if the +// file is already staged in the index no error is returned. If a file deleted +// from the Workspace is given, the file is removed from the index. If a +// directory given, adds the files and all his sub-directories recursively in +// the worktree to the index. If any of the files is already staged in the index +// no error is returned. When path is a file, the blob.Hash is returned. +func (w *Worktree) Add(path string) (plumbing.Hash, error) { + // TODO(mcuadros): deprecate in favor of AddWithOption in v6. + return w.doAdd(path, make([]gitignore.Pattern, 0)) +} + +func (w *Worktree) doAddDirectory(idx *index.Index, s Status, directory string, ignorePattern []gitignore.Pattern) (added bool, err error) { + files, err := w.Filesystem.ReadDir(directory) + if err != nil { + return false, err + } + if len(ignorePattern) > 0 { + m := gitignore.NewMatcher(ignorePattern) + matchPath := strings.Split(directory, string(os.PathSeparator)) + if m.Match(matchPath, true) { + // ignore + return false, nil + } + } + + for _, file := range files { + name := path.Join(directory, file.Name()) + + var a bool + if file.IsDir() { + if file.Name() == GitDirName { + // ignore special git directory + continue + } + a, err = w.doAddDirectory(idx, s, name, ignorePattern) + } else { + a, _, err = w.doAddFile(idx, s, name, ignorePattern) + } + + if err != nil { + return + } + + if !added && a { + added = true + } + } + + return +} + +// AddWithOptions file contents to the index, updates the index using the +// current content found in the working tree, to prepare the content staged for +// the next commit. +// +// It typically adds the current content of existing paths as a whole, but with +// some options it can also be used to add content with only part of the changes +// made to the working tree files applied, or remove paths that do not exist in +// the working tree anymore. +func (w *Worktree) AddWithOptions(opts *AddOptions) error { + if err := opts.Validate(w.r); err != nil { + return err + } + + if opts.All { + _, err := w.doAdd(".", w.Excludes) + return err + } + + if opts.Glob != "" { + return w.AddGlob(opts.Glob) + } + + _, err := w.Add(opts.Path) + return err +} + +func (w *Worktree) doAdd(path string, ignorePattern []gitignore.Pattern) (plumbing.Hash, error) { + s, err := w.Status() + if err != nil { + return plumbing.ZeroHash, err + } + + idx, err := w.r.Storer.Index() + if err != nil { + return plumbing.ZeroHash, err + } + + var h plumbing.Hash + var added bool + + fi, err := w.Filesystem.Lstat(path) + if err != nil || !fi.IsDir() { + added, h, err = w.doAddFile(idx, s, path, ignorePattern) + } else { + added, err = w.doAddDirectory(idx, s, path, ignorePattern) + } + + if err != nil { + return h, err + } + + if !added { + return h, nil + } + + return h, w.r.Storer.SetIndex(idx) +} + +// AddGlob adds all paths, matching pattern, to the index. If pattern matches a +// directory path, all directory contents are added to the index recursively. No +// error is returned if all matching paths are already staged in index. +func (w *Worktree) AddGlob(pattern string) error { + // TODO(mcuadros): deprecate in favor of AddWithOption in v6. + files, err := util.Glob(w.Filesystem, pattern) + if err != nil { + return err + } + + if len(files) == 0 { + return ErrGlobNoMatches + } + + s, err := w.Status() + if err != nil { + return err + } + + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + + var saveIndex bool + for _, file := range files { + fi, err := w.Filesystem.Lstat(file) + if err != nil { + return err + } + + var added bool + if fi.IsDir() { + added, err = w.doAddDirectory(idx, s, file, make([]gitignore.Pattern, 0)) + } else { + added, _, err = w.doAddFile(idx, s, file, make([]gitignore.Pattern, 0)) + } + + if err != nil { + return err + } + + if !saveIndex && added { + saveIndex = true + } + } + + if saveIndex { + return w.r.Storer.SetIndex(idx) + } + + return nil +} + +// doAddFile create a new blob from path and update the index, added is true if +// the file added is different from the index. +func (w *Worktree) doAddFile(idx *index.Index, s Status, path string, ignorePattern []gitignore.Pattern) (added bool, h plumbing.Hash, err error) { + if s.File(path).Worktree == Unmodified { + return false, h, nil + } + if len(ignorePattern) > 0 { + m := gitignore.NewMatcher(ignorePattern) + matchPath := strings.Split(path, string(os.PathSeparator)) + if m.Match(matchPath, true) { + // ignore + return false, h, nil + } + } + + h, err = w.copyFileToStorage(path) + if err != nil { + if os.IsNotExist(err) { + added = true + h, err = w.deleteFromIndex(idx, path) + } + + return + } + + if err := w.addOrUpdateFileToIndex(idx, path, h); err != nil { + return false, h, err + } + + return true, h, err +} + +func (w *Worktree) copyFileToStorage(path string) (hash plumbing.Hash, err error) { + fi, err := w.Filesystem.Lstat(path) + if err != nil { + return plumbing.ZeroHash, err + } + + obj := w.r.Storer.NewEncodedObject() + obj.SetType(plumbing.BlobObject) + obj.SetSize(fi.Size()) + + writer, err := obj.Writer() + if err != nil { + return plumbing.ZeroHash, err + } + + defer ioutil.CheckClose(writer, &err) + + if fi.Mode()&os.ModeSymlink != 0 { + err = w.fillEncodedObjectFromSymlink(writer, path, fi) + } else { + err = w.fillEncodedObjectFromFile(writer, path, fi) + } + + if err != nil { + return plumbing.ZeroHash, err + } + + return w.r.Storer.SetEncodedObject(obj) +} + +func (w *Worktree) fillEncodedObjectFromFile(dst io.Writer, path string, fi os.FileInfo) (err error) { + src, err := w.Filesystem.Open(path) + if err != nil { + return err + } + + defer ioutil.CheckClose(src, &err) + + if _, err := io.Copy(dst, src); err != nil { + return err + } + + return err +} + +func (w *Worktree) fillEncodedObjectFromSymlink(dst io.Writer, path string, fi os.FileInfo) error { + target, err := w.Filesystem.Readlink(path) + if err != nil { + return err + } + + _, err = dst.Write([]byte(target)) + return err +} + +func (w *Worktree) addOrUpdateFileToIndex(idx *index.Index, filename string, h plumbing.Hash) error { + e, err := idx.Entry(filename) + if err != nil && err != index.ErrEntryNotFound { + return err + } + + if err == index.ErrEntryNotFound { + return w.doAddFileToIndex(idx, filename, h) + } + + return w.doUpdateFileToIndex(e, filename, h) +} + +func (w *Worktree) doAddFileToIndex(idx *index.Index, filename string, h plumbing.Hash) error { + return w.doUpdateFileToIndex(idx.Add(filename), filename, h) +} + +func (w *Worktree) doUpdateFileToIndex(e *index.Entry, filename string, h plumbing.Hash) error { + info, err := w.Filesystem.Lstat(filename) + if err != nil { + return err + } + + e.Hash = h + e.ModifiedAt = info.ModTime() + e.Mode, err = filemode.NewFromOSFileMode(info.Mode()) + if err != nil { + return err + } + + if e.Mode.IsRegular() { + e.Size = uint32(info.Size()) + } + + fillSystemInfo(e, info.Sys()) + return nil +} + +// Remove removes files from the working tree and from the index. +func (w *Worktree) Remove(path string) (plumbing.Hash, error) { + // TODO(mcuadros): remove plumbing.Hash from signature at v5. + idx, err := w.r.Storer.Index() + if err != nil { + return plumbing.ZeroHash, err + } + + var h plumbing.Hash + + fi, err := w.Filesystem.Lstat(path) + if err != nil || !fi.IsDir() { + h, err = w.doRemoveFile(idx, path) + } else { + _, err = w.doRemoveDirectory(idx, path) + } + if err != nil { + return h, err + } + + return h, w.r.Storer.SetIndex(idx) +} + +func (w *Worktree) doRemoveDirectory(idx *index.Index, directory string) (removed bool, err error) { + files, err := w.Filesystem.ReadDir(directory) + if err != nil { + return false, err + } + + for _, file := range files { + name := path.Join(directory, file.Name()) + + var r bool + if file.IsDir() { + r, err = w.doRemoveDirectory(idx, name) + } else { + _, err = w.doRemoveFile(idx, name) + if err == index.ErrEntryNotFound { + err = nil + } + } + + if err != nil { + return + } + + if !removed && r { + removed = true + } + } + + err = w.removeEmptyDirectory(directory) + return +} + +func (w *Worktree) removeEmptyDirectory(path string) error { + files, err := w.Filesystem.ReadDir(path) + if err != nil { + return err + } + + if len(files) != 0 { + return nil + } + + return w.Filesystem.Remove(path) +} + +func (w *Worktree) doRemoveFile(idx *index.Index, path string) (plumbing.Hash, error) { + hash, err := w.deleteFromIndex(idx, path) + if err != nil { + return plumbing.ZeroHash, err + } + + return hash, w.deleteFromFilesystem(path) +} + +func (w *Worktree) deleteFromIndex(idx *index.Index, path string) (plumbing.Hash, error) { + e, err := idx.Remove(path) + if err != nil { + return plumbing.ZeroHash, err + } + + return e.Hash, nil +} + +func (w *Worktree) deleteFromFilesystem(path string) error { + err := w.Filesystem.Remove(path) + if os.IsNotExist(err) { + return nil + } + + return err +} + +// RemoveGlob removes all paths, matching pattern, from the index. If pattern +// matches a directory path, all directory contents are removed from the index +// recursively. +func (w *Worktree) RemoveGlob(pattern string) error { + idx, err := w.r.Storer.Index() + if err != nil { + return err + } + + entries, err := idx.Glob(pattern) + if err != nil { + return err + } + + for _, e := range entries { + file := filepath.FromSlash(e.Name) + if _, err := w.Filesystem.Lstat(file); err != nil && !os.IsNotExist(err) { + return err + } + + if _, err := w.doRemoveFile(idx, file); err != nil { + return err + } + + dir, _ := filepath.Split(file) + if err := w.removeEmptyDirectory(dir); err != nil { + return err + } + } + + return w.r.Storer.SetIndex(idx) +} + +// Move moves or rename a file in the worktree and the index, directories are +// not supported. +func (w *Worktree) Move(from, to string) (plumbing.Hash, error) { + // TODO(mcuadros): support directories and/or implement support for glob + if _, err := w.Filesystem.Lstat(from); err != nil { + return plumbing.ZeroHash, err + } + + if _, err := w.Filesystem.Lstat(to); err == nil { + return plumbing.ZeroHash, ErrDestinationExists + } + + idx, err := w.r.Storer.Index() + if err != nil { + return plumbing.ZeroHash, err + } + + hash, err := w.deleteFromIndex(idx, from) + if err != nil { + return plumbing.ZeroHash, err + } + + if err := w.Filesystem.Rename(from, to); err != nil { + return hash, err + } + + if err := w.addOrUpdateFileToIndex(idx, to, hash); err != nil { + return hash, err + } + + return hash, w.r.Storer.SetIndex(idx) +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_unix_other.go b/vendor/github.com/go-git/go-git/v5/worktree_unix_other.go new file mode 100644 index 0000000000..f45966be96 --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_unix_other.go @@ -0,0 +1,26 @@ +// +build openbsd dragonfly solaris + +package git + +import ( + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Stat_t); ok { + e.CreatedAt = time.Unix(int64(os.Atim.Sec), int64(os.Atim.Nsec)) + e.Dev = uint32(os.Dev) + e.Inode = uint32(os.Ino) + e.GID = os.Gid + e.UID = os.Uid + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + return false +} diff --git a/vendor/github.com/go-git/go-git/v5/worktree_windows.go b/vendor/github.com/go-git/go-git/v5/worktree_windows.go new file mode 100644 index 0000000000..1928f9712e --- /dev/null +++ b/vendor/github.com/go-git/go-git/v5/worktree_windows.go @@ -0,0 +1,35 @@ +// +build windows + +package git + +import ( + "os" + "syscall" + "time" + + "github.com/go-git/go-git/v5/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Win32FileAttributeData); ok { + seconds := os.CreationTime.Nanoseconds() / 1000000000 + nanoseconds := os.CreationTime.Nanoseconds() - seconds*1000000000 + e.CreatedAt = time.Unix(seconds, nanoseconds) + } + } +} + +func isSymlinkWindowsNonAdmin(err error) bool { + const ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314 + + if err != nil { + if errLink, ok := err.(*os.LinkError); ok { + if errNo, ok := errLink.Err.(syscall.Errno); ok { + return errNo == ERROR_PRIVILEGE_NOT_HELD + } + } + } + + return false +} diff --git a/vendor/github.com/go-openapi/jsonreference/go.mod b/vendor/github.com/go-openapi/jsonreference/go.mod index e6c2ec4d92..94727ab3ee 100644 --- a/vendor/github.com/go-openapi/jsonreference/go.mod +++ b/vendor/github.com/go-openapi/jsonreference/go.mod @@ -5,8 +5,7 @@ require ( github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/go-openapi/jsonpointer v0.19.3 github.com/stretchr/testify v1.3.0 - golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - golang.org/x/text v0.3.3 // indirect + golang.org/x/net v0.0.0-20210421230115-4e50805a0758 // indirect ) go 1.13 diff --git a/vendor/github.com/go-openapi/jsonreference/go.sum b/vendor/github.com/go-openapi/jsonreference/go.sum index b37f873e55..61714872d1 100644 --- a/vendor/github.com/go-openapi/jsonreference/go.sum +++ b/vendor/github.com/go-openapi/jsonreference/go.sum @@ -14,7 +14,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -23,13 +22,13 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758 h1:aEpZnXcAmXkd6AvLb2OPt+EN1Zu/8Ne3pCqPjja5PXY= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= diff --git a/vendor/github.com/golang-jwt/jwt/v4/README.md b/vendor/github.com/golang-jwt/jwt/v4/README.md index 3072d24a9d..01b21646e0 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/README.md +++ b/vendor/github.com/golang-jwt/jwt/v4/README.md @@ -46,9 +46,16 @@ See [the project documentation](https://pkg.go.dev/github.com/golang-jwt/jwt) fo ## Extensions -This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. +This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. -Here's an example of an extension that integrates with multiple Google Cloud Platform signing tools (AppEngine, IAM API, Cloud KMS): https://github.com/someone1/gcp-jwt-go +A common use case would be integrating with different 3rd party signature providers, like key management services from various cloud providers or Hardware Security Modules (HSMs). + +| Extension | Purpose | Repo | +|-----------|----------------------------------------------------------------------------------------------|--------------------------------------------| +| GCP | Integrates with multiple Google Cloud Platform signing tools (AppEngine, IAM API, Cloud KMS) | https://github.com/someone1/gcp-jwt-go | +| AWS | Integrates with AWS Key Management Service, KMS | https://github.com/matelang/jwt-go-aws-kms | + +*Disclaimer*: Unless otherwise specified, these integrations are maintained by third parties and should not be considered as a primary offer by any of the mentioned cloud providers ## Compliance @@ -112,3 +119,5 @@ This library uses descriptive error messages whenever possible. If you are not g Documentation can be found [on pkg.go.dev](https://pkg.go.dev/github.com/golang-jwt/jwt). The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in the documentation. + +[golang-jwt](https://github.com/orgs/golang-jwt) incorporates a modified version of the JWT logo, which is distributed under the terms of the [MIT License](https://github.com/jsonwebtoken/jsonwebtoken.github.io/blob/master/LICENSE.txt). diff --git a/vendor/github.com/golang-jwt/jwt/v4/claims.go b/vendor/github.com/golang-jwt/jwt/v4/claims.go index 41cc826563..4f00db2fb8 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/claims.go +++ b/vendor/github.com/golang-jwt/jwt/v4/claims.go @@ -56,17 +56,17 @@ func (c RegisteredClaims) Valid() error { // default value in Go, let's not fail the verification for them. if !c.VerifyExpiresAt(now, false) { delta := now.Sub(c.ExpiresAt.Time) - vErr.Inner = fmt.Errorf("token is expired by %v", delta) + vErr.Inner = fmt.Errorf("%s by %v", delta, ErrTokenExpired) vErr.Errors |= ValidationErrorExpired } if !c.VerifyIssuedAt(now, false) { - vErr.Inner = fmt.Errorf("token used before issued") + vErr.Inner = ErrTokenUsedBeforeIssued vErr.Errors |= ValidationErrorIssuedAt } if !c.VerifyNotBefore(now, false) { - vErr.Inner = fmt.Errorf("token is not valid yet") + vErr.Inner = ErrTokenNotValidYet vErr.Errors |= ValidationErrorNotValidYet } @@ -149,17 +149,17 @@ func (c StandardClaims) Valid() error { // default value in Go, let's not fail the verification for them. if !c.VerifyExpiresAt(now, false) { delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0)) - vErr.Inner = fmt.Errorf("token is expired by %v", delta) + vErr.Inner = fmt.Errorf("%s by %v", delta, ErrTokenExpired) vErr.Errors |= ValidationErrorExpired } if !c.VerifyIssuedAt(now, false) { - vErr.Inner = fmt.Errorf("token used before issued") + vErr.Inner = ErrTokenUsedBeforeIssued vErr.Errors |= ValidationErrorIssuedAt } if !c.VerifyNotBefore(now, false) { - vErr.Inner = fmt.Errorf("token is not valid yet") + vErr.Inner = ErrTokenNotValidYet vErr.Errors |= ValidationErrorNotValidYet } diff --git a/vendor/github.com/golang-jwt/jwt/v4/errors.go b/vendor/github.com/golang-jwt/jwt/v4/errors.go index b9d18e498e..10ac8835cc 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/errors.go +++ b/vendor/github.com/golang-jwt/jwt/v4/errors.go @@ -9,6 +9,18 @@ var ( ErrInvalidKey = errors.New("key is invalid") ErrInvalidKeyType = errors.New("key is of invalid type") ErrHashUnavailable = errors.New("the requested hash function is unavailable") + + ErrTokenMalformed = errors.New("token is malformed") + ErrTokenUnverifiable = errors.New("token is unverifiable") + ErrTokenSignatureInvalid = errors.New("token signature is invalid") + + ErrTokenInvalidAudience = errors.New("token has invalid audience") + ErrTokenExpired = errors.New("token is expired") + ErrTokenUsedBeforeIssued = errors.New("token used before issued") + ErrTokenInvalidIssuer = errors.New("token has invalid issuer") + ErrTokenNotValidYet = errors.New("token is not valid yet") + ErrTokenInvalidId = errors.New("token has invalid id") + ErrTokenInvalidClaims = errors.New("token has invalid claims") ) // The errors that might occur when parsing and validating a token @@ -62,3 +74,39 @@ func (e *ValidationError) Unwrap() error { func (e *ValidationError) valid() bool { return e.Errors == 0 } + +// Is checks if this ValidationError is of the supplied error. We are first checking for the exact error message +// by comparing the inner error message. If that fails, we compare using the error flags. This way we can use +// custom error messages (mainly for backwards compatability) and still leverage errors.Is using the global error variables. +func (e *ValidationError) Is(err error) bool { + // Check, if our inner error is a direct match + if errors.Is(errors.Unwrap(e), err) { + return true + } + + // Otherwise, we need to match using our error flags + switch err { + case ErrTokenMalformed: + return e.Errors&ValidationErrorMalformed != 0 + case ErrTokenUnverifiable: + return e.Errors&ValidationErrorUnverifiable != 0 + case ErrTokenSignatureInvalid: + return e.Errors&ValidationErrorSignatureInvalid != 0 + case ErrTokenInvalidAudience: + return e.Errors&ValidationErrorAudience != 0 + case ErrTokenExpired: + return e.Errors&ValidationErrorExpired != 0 + case ErrTokenUsedBeforeIssued: + return e.Errors&ValidationErrorIssuedAt != 0 + case ErrTokenInvalidIssuer: + return e.Errors&ValidationErrorIssuer != 0 + case ErrTokenNotValidYet: + return e.Errors&ValidationErrorNotValidYet != 0 + case ErrTokenInvalidId: + return e.Errors&ValidationErrorId != 0 + case ErrTokenInvalidClaims: + return e.Errors&ValidationErrorClaimsInvalid != 0 + } + + return false +} diff --git a/vendor/github.com/golang-jwt/jwt/v4/map_claims.go b/vendor/github.com/golang-jwt/jwt/v4/map_claims.go index e7da633b93..2700d64a0d 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/map_claims.go +++ b/vendor/github.com/golang-jwt/jwt/v4/map_claims.go @@ -126,16 +126,19 @@ func (m MapClaims) Valid() error { now := TimeFunc().Unix() if !m.VerifyExpiresAt(now, false) { + // TODO(oxisto): this should be replaced with ErrTokenExpired vErr.Inner = errors.New("Token is expired") vErr.Errors |= ValidationErrorExpired } if !m.VerifyIssuedAt(now, false) { + // TODO(oxisto): this should be replaced with ErrTokenUsedBeforeIssued vErr.Inner = errors.New("Token used before issued") vErr.Errors |= ValidationErrorIssuedAt } if !m.VerifyNotBefore(now, false) { + // TODO(oxisto): this should be replaced with ErrTokenNotValidYet vErr.Inner = errors.New("Token is not valid yet") vErr.Errors |= ValidationErrorNotValidYet } diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser_option.go b/vendor/github.com/golang-jwt/jwt/v4/parser_option.go index 0fede4f15c..6ea6f9527d 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/parser_option.go +++ b/vendor/github.com/golang-jwt/jwt/v4/parser_option.go @@ -1,6 +1,6 @@ package jwt -// ParserOption is used to implement functional-style options that modify the behaviour of the parser. To add +// ParserOption is used to implement functional-style options that modify the behavior of the parser. To add // new options, just create a function (ideally beginning with With or Without) that returns an anonymous function that // takes a *Parser type as input and manipulates its configuration accordingly. type ParserOption func(*Parser) @@ -13,7 +13,7 @@ func WithValidMethods(methods []string) ParserOption { } } -// WithJSONNumber is an option to configure the underyling JSON parser with UseNumber +// WithJSONNumber is an option to configure the underlying JSON parser with UseNumber func WithJSONNumber() ParserOption { return func(p *Parser) { p.UseJSONNumber = true diff --git a/vendor/github.com/golang-jwt/jwt/v4/token.go b/vendor/github.com/golang-jwt/jwt/v4/token.go index 12344138be..09b4cde5ae 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/token.go +++ b/vendor/github.com/golang-jwt/jwt/v4/token.go @@ -74,22 +74,19 @@ func (t *Token) SignedString(key interface{}) (string, error) { // the SignedString. func (t *Token) SigningString() (string, error) { var err error - parts := make([]string, 2) - for i := range parts { - var jsonValue []byte - if i == 0 { - if jsonValue, err = json.Marshal(t.Header); err != nil { - return "", err - } - } else { - if jsonValue, err = json.Marshal(t.Claims); err != nil { - return "", err - } - } + var jsonValue []byte + + if jsonValue, err = json.Marshal(t.Header); err != nil { + return "", err + } + header := EncodeSegment(jsonValue) - parts[i] = EncodeSegment(jsonValue) + if jsonValue, err = json.Marshal(t.Claims); err != nil { + return "", err } - return strings.Join(parts, "."), nil + claim := EncodeSegment(jsonValue) + + return strings.Join([]string{header, claim}, "."), nil } // Parse parses, validates, verifies the signature and returns the parsed token. diff --git a/vendor/github.com/golang-jwt/jwt/v4/types.go b/vendor/github.com/golang-jwt/jwt/v4/types.go index 80b1b96948..2c647fd2e6 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/types.go +++ b/vendor/github.com/golang-jwt/jwt/v4/types.go @@ -49,9 +49,13 @@ func newNumericDateFromSeconds(f float64) *NumericDate { // MarshalJSON is an implementation of the json.RawMessage interface and serializes the UNIX epoch // represented in NumericDate to a byte array, using the precision specified in TimePrecision. func (date NumericDate) MarshalJSON() (b []byte, err error) { + var prec int + if TimePrecision < time.Second { + prec = int(math.Log10(float64(time.Second) / float64(TimePrecision))) + } f := float64(date.Truncate(TimePrecision).UnixNano()) / float64(time.Second) - return []byte(strconv.FormatFloat(f, 'f', -1, 64)), nil + return []byte(strconv.FormatFloat(f, 'f', prec, 64)), nil } // UnmarshalJSON is an implementation of the json.RawMessage interface and deserializses a diff --git a/vendor/github.com/jbenet/go-context/LICENSE b/vendor/github.com/jbenet/go-context/LICENSE new file mode 100644 index 0000000000..c7386b3c94 --- /dev/null +++ b/vendor/github.com/jbenet/go-context/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Juan Batiz-Benet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/jbenet/go-context/io/ctxio.go b/vendor/github.com/jbenet/go-context/io/ctxio.go new file mode 100644 index 0000000000..b4f2454235 --- /dev/null +++ b/vendor/github.com/jbenet/go-context/io/ctxio.go @@ -0,0 +1,120 @@ +// Package ctxio provides io.Reader and io.Writer wrappers that +// respect context.Contexts. Use these at the interface between +// your context code and your io. +// +// WARNING: read the code. see how writes and reads will continue +// until you cancel the io. Maybe this package should provide +// versions of io.ReadCloser and io.WriteCloser that automatically +// call .Close when the context expires. But for now -- since in my +// use cases I have long-lived connections with ephemeral io wrappers +// -- this has yet to be a need. +package ctxio + +import ( + "io" + + context "golang.org/x/net/context" +) + +type ioret struct { + n int + err error +} + +type Writer interface { + io.Writer +} + +type ctxWriter struct { + w io.Writer + ctx context.Context +} + +// NewWriter wraps a writer to make it respect given Context. +// If there is a blocking write, the returned Writer will return +// whenever the context is cancelled (the return values are n=0 +// and err=ctx.Err().) +// +// Note well: this wrapper DOES NOT ACTUALLY cancel the underlying +// write-- there is no way to do that with the standard go io +// interface. So the read and write _will_ happen or hang. So, use +// this sparingly, make sure to cancel the read or write as necesary +// (e.g. closing a connection whose context is up, etc.) +// +// Furthermore, in order to protect your memory from being read +// _after_ you've cancelled the context, this io.Writer will +// first make a **copy** of the buffer. +func NewWriter(ctx context.Context, w io.Writer) *ctxWriter { + if ctx == nil { + ctx = context.Background() + } + return &ctxWriter{ctx: ctx, w: w} +} + +func (w *ctxWriter) Write(buf []byte) (int, error) { + buf2 := make([]byte, len(buf)) + copy(buf2, buf) + + c := make(chan ioret, 1) + + go func() { + n, err := w.w.Write(buf2) + c <- ioret{n, err} + close(c) + }() + + select { + case r := <-c: + return r.n, r.err + case <-w.ctx.Done(): + return 0, w.ctx.Err() + } +} + +type Reader interface { + io.Reader +} + +type ctxReader struct { + r io.Reader + ctx context.Context +} + +// NewReader wraps a reader to make it respect given Context. +// If there is a blocking read, the returned Reader will return +// whenever the context is cancelled (the return values are n=0 +// and err=ctx.Err().) +// +// Note well: this wrapper DOES NOT ACTUALLY cancel the underlying +// write-- there is no way to do that with the standard go io +// interface. So the read and write _will_ happen or hang. So, use +// this sparingly, make sure to cancel the read or write as necesary +// (e.g. closing a connection whose context is up, etc.) +// +// Furthermore, in order to protect your memory from being read +// _before_ you've cancelled the context, this io.Reader will +// allocate a buffer of the same size, and **copy** into the client's +// if the read succeeds in time. +func NewReader(ctx context.Context, r io.Reader) *ctxReader { + return &ctxReader{ctx: ctx, r: r} +} + +func (r *ctxReader) Read(buf []byte) (int, error) { + buf2 := make([]byte, len(buf)) + + c := make(chan ioret, 1) + + go func() { + n, err := r.r.Read(buf2) + c <- ioret{n, err} + close(c) + }() + + select { + case ret := <-c: + copy(buf, buf2) + return ret.n, ret.err + case <-r.ctx.Done(): + return 0, r.ctx.Err() + } +} diff --git a/vendor/github.com/kevinburke/ssh_config/.gitattributes b/vendor/github.com/kevinburke/ssh_config/.gitattributes new file mode 100644 index 0000000000..44db581889 --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/.gitattributes @@ -0,0 +1 @@ +testdata/dos-lines eol=crlf diff --git a/vendor/github.com/kevinburke/ssh_config/.gitignore b/vendor/github.com/kevinburke/ssh_config/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/github.com/kevinburke/ssh_config/.mailmap b/vendor/github.com/kevinburke/ssh_config/.mailmap new file mode 100644 index 0000000000..253406b1cc --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/.mailmap @@ -0,0 +1 @@ +Kevin Burke Kevin Burke diff --git a/vendor/github.com/kevinburke/ssh_config/AUTHORS.txt b/vendor/github.com/kevinburke/ssh_config/AUTHORS.txt new file mode 100644 index 0000000000..9dc410104b --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/AUTHORS.txt @@ -0,0 +1,6 @@ +Eugene Terentev +Kevin Burke +Mark Nevill +Sergey Lukjanov +Wayne Ashley Berry +santosh653 <70637961+santosh653@users.noreply.github.com> diff --git a/vendor/github.com/kevinburke/ssh_config/LICENSE b/vendor/github.com/kevinburke/ssh_config/LICENSE new file mode 100644 index 0000000000..b9a770ac2a --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/LICENSE @@ -0,0 +1,49 @@ +Copyright (c) 2017 Kevin Burke. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +=================== + +The lexer and parser borrow heavily from github.com/pelletier/go-toml. The +license for that project is copied below. + +The MIT License (MIT) + +Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/kevinburke/ssh_config/Makefile b/vendor/github.com/kevinburke/ssh_config/Makefile new file mode 100644 index 0000000000..a1880d18e1 --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/Makefile @@ -0,0 +1,30 @@ +BUMP_VERSION := $(GOPATH)/bin/bump_version +STATICCHECK := $(GOPATH)/bin/staticcheck +WRITE_MAILMAP := $(GOPATH)/bin/write_mailmap + +$(STATICCHECK): + go get honnef.co/go/tools/cmd/staticcheck + +lint: $(STATICCHECK) + go vet ./... + $(STATICCHECK) + +test: lint + @# the timeout helps guard against infinite recursion + go test -timeout=250ms ./... + +race-test: lint + go test -timeout=500ms -race ./... + +$(BUMP_VERSION): + go get -u github.com/kevinburke/bump_version + +release: test | $(BUMP_VERSION) + $(BUMP_VERSION) minor config.go + +force: ; + +AUTHORS.txt: force | $(WRITE_MAILMAP) + $(WRITE_MAILMAP) > AUTHORS.txt + +authors: AUTHORS.txt diff --git a/vendor/github.com/kevinburke/ssh_config/README.md b/vendor/github.com/kevinburke/ssh_config/README.md new file mode 100644 index 0000000000..d1adfed7c6 --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/README.md @@ -0,0 +1,89 @@ +# ssh_config + +This is a Go parser for `ssh_config` files. Importantly, this parser attempts +to preserve comments in a given file, so you can manipulate a `ssh_config` file +from a program, if your heart desires. + +It's designed to be used with the excellent +[x/crypto/ssh](https://golang.org/x/crypto/ssh) package, which handles SSH +negotiation but isn't very easy to configure. + +The `ssh_config` `Get()` and `GetStrict()` functions will attempt to read values +from `$HOME/.ssh/config` and fall back to `/etc/ssh/ssh_config`. The first +argument is the host name to match on, and the second argument is the key you +want to retrieve. + +```go +port := ssh_config.Get("myhost", "Port") +``` + +Certain directives can occur multiple times for a host (such as `IdentityFile`), +so you should use the `GetAll` or `GetAllStrict` directive to retrieve those +instead. + +```go +files := ssh_config.GetAll("myhost", "IdentityFile") +``` + +You can also load a config file and read values from it. + +```go +var config = ` +Host *.test + Compression yes +` + +cfg, err := ssh_config.Decode(strings.NewReader(config)) +fmt.Println(cfg.Get("example.test", "Port")) +``` + +Some SSH arguments have default values - for example, the default value for +`KeyboardAuthentication` is `"yes"`. If you call Get(), and no value for the +given Host/keyword pair exists in the config, we'll return a default for the +keyword if one exists. + +### Manipulating SSH config files + +Here's how you can manipulate an SSH config file, and then write it back to +disk. + +```go +f, _ := os.Open(filepath.Join(os.Getenv("HOME"), ".ssh", "config")) +cfg, _ := ssh_config.Decode(f) +for _, host := range cfg.Hosts { + fmt.Println("patterns:", host.Patterns) + for _, node := range host.Nodes { + // Manipulate the nodes as you see fit, or use a type switch to + // distinguish between Empty, KV, and Include nodes. + fmt.Println(node.String()) + } +} + +// Print the config to stdout: +fmt.Println(cfg.String()) +``` + +## Spec compliance + +Wherever possible we try to implement the specification as documented in +the `ssh_config` manpage. Unimplemented features should be present in the +[issues][issues] list. + +Notably, the `Match` directive is currently unsupported. + +[issues]: https://github.com/kevinburke/ssh_config/issues + +## Errata + +This is the second [comment-preserving configuration parser][blog] I've written, after +[an /etc/hosts parser][hostsfile]. Eventually, I will write one for every Linux +file format. + +[blog]: https://kev.inburke.com/kevin/more-comment-preserving-configuration-parsers/ +[hostsfile]: https://github.com/kevinburke/hostsfile + +## Donating + +Donations free up time to make improvements to the library, and respond to +bug reports. You can send donations via Paypal's "Send Money" feature to +kev@inburke.com. Donations are not tax deductible in the USA. diff --git a/vendor/github.com/kevinburke/ssh_config/config.go b/vendor/github.com/kevinburke/ssh_config/config.go new file mode 100644 index 0000000000..7c2c8b679c --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/config.go @@ -0,0 +1,793 @@ +// Package ssh_config provides tools for manipulating SSH config files. +// +// Importantly, this parser attempts to preserve comments in a given file, so +// you can manipulate a `ssh_config` file from a program, if your heart desires. +// +// The Get() and GetStrict() functions will attempt to read values from +// $HOME/.ssh/config, falling back to /etc/ssh/ssh_config. The first argument is +// the host name to match on ("example.com"), and the second argument is the key +// you want to retrieve ("Port"). The keywords are case insensitive. +// +// port := ssh_config.Get("myhost", "Port") +// +// You can also manipulate an SSH config file and then print it or write it back +// to disk. +// +// f, _ := os.Open(filepath.Join(os.Getenv("HOME"), ".ssh", "config")) +// cfg, _ := ssh_config.Decode(f) +// for _, host := range cfg.Hosts { +// fmt.Println("patterns:", host.Patterns) +// for _, node := range host.Nodes { +// fmt.Println(node.String()) +// } +// } +// +// // Write the cfg back to disk: +// fmt.Println(cfg.String()) +// +// BUG: the Match directive is currently unsupported; parsing a config with +// a Match directive will trigger an error. +package ssh_config + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + osuser "os/user" + "path/filepath" + "regexp" + "runtime" + "strings" + "sync" +) + +const version = "1.0" + +var _ = version + +type configFinder func() string + +// UserSettings checks ~/.ssh and /etc/ssh for configuration files. The config +// files are parsed and cached the first time Get() or GetStrict() is called. +type UserSettings struct { + IgnoreErrors bool + systemConfig *Config + systemConfigFinder configFinder + userConfig *Config + userConfigFinder configFinder + loadConfigs sync.Once + onceErr error +} + +func homedir() string { + user, err := osuser.Current() + if err == nil { + return user.HomeDir + } else { + return os.Getenv("HOME") + } +} + +func userConfigFinder() string { + return filepath.Join(homedir(), ".ssh", "config") +} + +// DefaultUserSettings is the default UserSettings and is used by Get and +// GetStrict. It checks both $HOME/.ssh/config and /etc/ssh/ssh_config for keys, +// and it will return parse errors (if any) instead of swallowing them. +var DefaultUserSettings = &UserSettings{ + IgnoreErrors: false, + systemConfigFinder: systemConfigFinder, + userConfigFinder: userConfigFinder, +} + +func systemConfigFinder() string { + return filepath.Join("/", "etc", "ssh", "ssh_config") +} + +func findVal(c *Config, alias, key string) (string, error) { + if c == nil { + return "", nil + } + val, err := c.Get(alias, key) + if err != nil || val == "" { + return "", err + } + if err := validate(key, val); err != nil { + return "", err + } + return val, nil +} + +func findAll(c *Config, alias, key string) ([]string, error) { + if c == nil { + return nil, nil + } + return c.GetAll(alias, key) +} + +// Get finds the first value for key within a declaration that matches the +// alias. Get returns the empty string if no value was found, or if IgnoreErrors +// is false and we could not parse the configuration file. Use GetStrict to +// disambiguate the latter cases. +// +// The match for key is case insensitive. +// +// Get is a wrapper around DefaultUserSettings.Get. +func Get(alias, key string) string { + return DefaultUserSettings.Get(alias, key) +} + +// GetAll retrieves zero or more directives for key for the given alias. GetAll +// returns nil if no value was found, or if IgnoreErrors is false and we could +// not parse the configuration file. Use GetAllStrict to disambiguate the +// latter cases. +// +// In most cases you want to use Get or GetStrict, which returns a single value. +// However, a subset of ssh configuration values (IdentityFile, for example) +// allow you to specify multiple directives. +// +// The match for key is case insensitive. +// +// GetAll is a wrapper around DefaultUserSettings.GetAll. +func GetAll(alias, key string) []string { + return DefaultUserSettings.GetAll(alias, key) +} + +// GetStrict finds the first value for key within a declaration that matches the +// alias. If key has a default value and no matching configuration is found, the +// default will be returned. For more information on default values and the way +// patterns are matched, see the manpage for ssh_config. +// +// The returned error will be non-nil if and only if a user's configuration file +// or the system configuration file could not be parsed, and u.IgnoreErrors is +// false. +// +// GetStrict is a wrapper around DefaultUserSettings.GetStrict. +func GetStrict(alias, key string) (string, error) { + return DefaultUserSettings.GetStrict(alias, key) +} + +// GetAllStrict retrieves zero or more directives for key for the given alias. +// +// In most cases you want to use Get or GetStrict, which returns a single value. +// However, a subset of ssh configuration values (IdentityFile, for example) +// allow you to specify multiple directives. +// +// The returned error will be non-nil if and only if a user's configuration file +// or the system configuration file could not be parsed, and u.IgnoreErrors is +// false. +// +// GetAllStrict is a wrapper around DefaultUserSettings.GetAllStrict. +func GetAllStrict(alias, key string) ([]string, error) { + return DefaultUserSettings.GetAllStrict(alias, key) +} + +// Get finds the first value for key within a declaration that matches the +// alias. Get returns the empty string if no value was found, or if IgnoreErrors +// is false and we could not parse the configuration file. Use GetStrict to +// disambiguate the latter cases. +// +// The match for key is case insensitive. +func (u *UserSettings) Get(alias, key string) string { + val, err := u.GetStrict(alias, key) + if err != nil { + return "" + } + return val +} + +// GetAll retrieves zero or more directives for key for the given alias. GetAll +// returns nil if no value was found, or if IgnoreErrors is false and we could +// not parse the configuration file. Use GetStrict to disambiguate the latter +// cases. +// +// The match for key is case insensitive. +func (u *UserSettings) GetAll(alias, key string) []string { + val, _ := u.GetAllStrict(alias, key) + return val +} + +// GetStrict finds the first value for key within a declaration that matches the +// alias. If key has a default value and no matching configuration is found, the +// default will be returned. For more information on default values and the way +// patterns are matched, see the manpage for ssh_config. +// +// error will be non-nil if and only if a user's configuration file or the +// system configuration file could not be parsed, and u.IgnoreErrors is false. +func (u *UserSettings) GetStrict(alias, key string) (string, error) { + u.doLoadConfigs() + //lint:ignore S1002 I prefer it this way + if u.onceErr != nil && u.IgnoreErrors == false { + return "", u.onceErr + } + val, err := findVal(u.userConfig, alias, key) + if err != nil || val != "" { + return val, err + } + val2, err2 := findVal(u.systemConfig, alias, key) + if err2 != nil || val2 != "" { + return val2, err2 + } + return Default(key), nil +} + +// GetAllStrict retrieves zero or more directives for key for the given alias. +// If key has a default value and no matching configuration is found, the +// default will be returned. For more information on default values and the way +// patterns are matched, see the manpage for ssh_config. +// +// The returned error will be non-nil if and only if a user's configuration file +// or the system configuration file could not be parsed, and u.IgnoreErrors is +// false. +func (u *UserSettings) GetAllStrict(alias, key string) ([]string, error) { + u.doLoadConfigs() + //lint:ignore S1002 I prefer it this way + if u.onceErr != nil && u.IgnoreErrors == false { + return nil, u.onceErr + } + val, err := findAll(u.userConfig, alias, key) + if err != nil || val != nil { + return val, err + } + val2, err2 := findAll(u.systemConfig, alias, key) + if err2 != nil || val2 != nil { + return val2, err2 + } + // TODO: IdentityFile has multiple default values that we should return. + if def := Default(key); def != "" { + return []string{def}, nil + } + return []string{}, nil +} + +func (u *UserSettings) doLoadConfigs() { + u.loadConfigs.Do(func() { + // can't parse user file, that's ok. + var filename string + if u.userConfigFinder == nil { + filename = userConfigFinder() + } else { + filename = u.userConfigFinder() + } + var err error + u.userConfig, err = parseFile(filename) + //lint:ignore S1002 I prefer it this way + if err != nil && os.IsNotExist(err) == false { + u.onceErr = err + return + } + if u.systemConfigFinder == nil { + filename = systemConfigFinder() + } else { + filename = u.systemConfigFinder() + } + u.systemConfig, err = parseFile(filename) + //lint:ignore S1002 I prefer it this way + if err != nil && os.IsNotExist(err) == false { + u.onceErr = err + return + } + }) +} + +func parseFile(filename string) (*Config, error) { + return parseWithDepth(filename, 0) +} + +func parseWithDepth(filename string, depth uint8) (*Config, error) { + b, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + return decodeBytes(b, isSystem(filename), depth) +} + +func isSystem(filename string) bool { + // TODO: not sure this is the best way to detect a system repo + return strings.HasPrefix(filepath.Clean(filename), "/etc/ssh") +} + +// Decode reads r into a Config, or returns an error if r could not be parsed as +// an SSH config file. +func Decode(r io.Reader) (*Config, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + return decodeBytes(b, false, 0) +} + +func decodeBytes(b []byte, system bool, depth uint8) (c *Config, err error) { + defer func() { + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } + if e, ok := r.(error); ok && e == ErrDepthExceeded { + err = e + return + } + err = errors.New(r.(string)) + } + }() + + c = parseSSH(lexSSH(b), system, depth) + return c, err +} + +// Config represents an SSH config file. +type Config struct { + // A list of hosts to match against. The file begins with an implicit + // "Host *" declaration matching all hosts. + Hosts []*Host + depth uint8 + position Position +} + +// Get finds the first value in the configuration that matches the alias and +// contains key. Get returns the empty string if no value was found, or if the +// Config contains an invalid conditional Include value. +// +// The match for key is case insensitive. +func (c *Config) Get(alias, key string) (string, error) { + lowerKey := strings.ToLower(key) + for _, host := range c.Hosts { + if !host.Matches(alias) { + continue + } + for _, node := range host.Nodes { + switch t := node.(type) { + case *Empty: + continue + case *KV: + // "keys are case insensitive" per the spec + lkey := strings.ToLower(t.Key) + if lkey == "match" { + panic("can't handle Match directives") + } + if lkey == lowerKey { + return t.Value, nil + } + case *Include: + val := t.Get(alias, key) + if val != "" { + return val, nil + } + default: + return "", fmt.Errorf("unknown Node type %v", t) + } + } + } + return "", nil +} + +// GetAll returns all values in the configuration that match the alias and +// contains key, or nil if none are present. +func (c *Config) GetAll(alias, key string) ([]string, error) { + lowerKey := strings.ToLower(key) + all := []string(nil) + for _, host := range c.Hosts { + if !host.Matches(alias) { + continue + } + for _, node := range host.Nodes { + switch t := node.(type) { + case *Empty: + continue + case *KV: + // "keys are case insensitive" per the spec + lkey := strings.ToLower(t.Key) + if lkey == "match" { + panic("can't handle Match directives") + } + if lkey == lowerKey { + all = append(all, t.Value) + } + case *Include: + val, _ := t.GetAll(alias, key) + if len(val) > 0 { + all = append(all, val...) + } + default: + return nil, fmt.Errorf("unknown Node type %v", t) + } + } + } + + return all, nil +} + +// String returns a string representation of the Config file. +func (c Config) String() string { + return marshal(c).String() +} + +func (c Config) MarshalText() ([]byte, error) { + return marshal(c).Bytes(), nil +} + +func marshal(c Config) *bytes.Buffer { + var buf bytes.Buffer + for i := range c.Hosts { + buf.WriteString(c.Hosts[i].String()) + } + return &buf +} + +// Pattern is a pattern in a Host declaration. Patterns are read-only values; +// create a new one with NewPattern(). +type Pattern struct { + str string // Its appearance in the file, not the value that gets compiled. + regex *regexp.Regexp + not bool // True if this is a negated match +} + +// String prints the string representation of the pattern. +func (p Pattern) String() string { + return p.str +} + +// Copied from regexp.go with * and ? removed. +var specialBytes = []byte(`\.+()|[]{}^$`) + +func special(b byte) bool { + return bytes.IndexByte(specialBytes, b) >= 0 +} + +// NewPattern creates a new Pattern for matching hosts. NewPattern("*") creates +// a Pattern that matches all hosts. +// +// From the manpage, a pattern consists of zero or more non-whitespace +// characters, `*' (a wildcard that matches zero or more characters), or `?' (a +// wildcard that matches exactly one character). For example, to specify a set +// of declarations for any host in the ".co.uk" set of domains, the following +// pattern could be used: +// +// Host *.co.uk +// +// The following pattern would match any host in the 192.168.0.[0-9] network range: +// +// Host 192.168.0.? +func NewPattern(s string) (*Pattern, error) { + if s == "" { + return nil, errors.New("ssh_config: empty pattern") + } + negated := false + if s[0] == '!' { + negated = true + s = s[1:] + } + var buf bytes.Buffer + buf.WriteByte('^') + for i := 0; i < len(s); i++ { + // A byte loop is correct because all metacharacters are ASCII. + switch b := s[i]; b { + case '*': + buf.WriteString(".*") + case '?': + buf.WriteString(".?") + default: + // borrowing from QuoteMeta here. + if special(b) { + buf.WriteByte('\\') + } + buf.WriteByte(b) + } + } + buf.WriteByte('$') + r, err := regexp.Compile(buf.String()) + if err != nil { + return nil, err + } + return &Pattern{str: s, regex: r, not: negated}, nil +} + +// Host describes a Host directive and the keywords that follow it. +type Host struct { + // A list of host patterns that should match this host. + Patterns []*Pattern + // A Node is either a key/value pair or a comment line. + Nodes []Node + // EOLComment is the comment (if any) terminating the Host line. + EOLComment string + hasEquals bool + leadingSpace int // TODO: handle spaces vs tabs here. + // The file starts with an implicit "Host *" declaration. + implicit bool +} + +// Matches returns true if the Host matches for the given alias. For +// a description of the rules that provide a match, see the manpage for +// ssh_config. +func (h *Host) Matches(alias string) bool { + found := false + for i := range h.Patterns { + if h.Patterns[i].regex.MatchString(alias) { + if h.Patterns[i].not { + // Negated match. "A pattern entry may be negated by prefixing + // it with an exclamation mark (`!'). If a negated entry is + // matched, then the Host entry is ignored, regardless of + // whether any other patterns on the line match. Negated matches + // are therefore useful to provide exceptions for wildcard + // matches." + return false + } + found = true + } + } + return found +} + +// String prints h as it would appear in a config file. Minor tweaks may be +// present in the whitespace in the printed file. +func (h *Host) String() string { + var buf bytes.Buffer + //lint:ignore S1002 I prefer to write it this way + if h.implicit == false { + buf.WriteString(strings.Repeat(" ", int(h.leadingSpace))) + buf.WriteString("Host") + if h.hasEquals { + buf.WriteString(" = ") + } else { + buf.WriteString(" ") + } + for i, pat := range h.Patterns { + buf.WriteString(pat.String()) + if i < len(h.Patterns)-1 { + buf.WriteString(" ") + } + } + if h.EOLComment != "" { + buf.WriteString(" #") + buf.WriteString(h.EOLComment) + } + buf.WriteByte('\n') + } + for i := range h.Nodes { + buf.WriteString(h.Nodes[i].String()) + buf.WriteByte('\n') + } + return buf.String() +} + +// Node represents a line in a Config. +type Node interface { + Pos() Position + String() string +} + +// KV is a line in the config file that contains a key, a value, and possibly +// a comment. +type KV struct { + Key string + Value string + Comment string + hasEquals bool + leadingSpace int // Space before the key. TODO handle spaces vs tabs. + position Position +} + +// Pos returns k's Position. +func (k *KV) Pos() Position { + return k.position +} + +// String prints k as it was parsed in the config file. There may be slight +// changes to the whitespace between values. +func (k *KV) String() string { + if k == nil { + return "" + } + equals := " " + if k.hasEquals { + equals = " = " + } + line := fmt.Sprintf("%s%s%s%s", strings.Repeat(" ", int(k.leadingSpace)), k.Key, equals, k.Value) + if k.Comment != "" { + line += " #" + k.Comment + } + return line +} + +// Empty is a line in the config file that contains only whitespace or comments. +type Empty struct { + Comment string + leadingSpace int // TODO handle spaces vs tabs. + position Position +} + +// Pos returns e's Position. +func (e *Empty) Pos() Position { + return e.position +} + +// String prints e as it was parsed in the config file. +func (e *Empty) String() string { + if e == nil { + return "" + } + if e.Comment == "" { + return "" + } + return fmt.Sprintf("%s#%s", strings.Repeat(" ", int(e.leadingSpace)), e.Comment) +} + +// Include holds the result of an Include directive, including the config files +// that have been parsed as part of that directive. At most 5 levels of Include +// statements will be parsed. +type Include struct { + // Comment is the contents of any comment at the end of the Include + // statement. + Comment string + // an include directive can include several different files, and wildcards + directives []string + + mu sync.Mutex + // 1:1 mapping between matches and keys in files array; matches preserves + // ordering + matches []string + // actual filenames are listed here + files map[string]*Config + leadingSpace int + position Position + depth uint8 + hasEquals bool +} + +const maxRecurseDepth = 5 + +// ErrDepthExceeded is returned if too many Include directives are parsed. +// Usually this indicates a recursive loop (an Include directive pointing to the +// file it contains). +var ErrDepthExceeded = errors.New("ssh_config: max recurse depth exceeded") + +func removeDups(arr []string) []string { + // Use map to record duplicates as we find them. + encountered := make(map[string]bool, len(arr)) + result := make([]string, 0) + + for v := range arr { + //lint:ignore S1002 I prefer it this way + if encountered[arr[v]] == false { + encountered[arr[v]] = true + result = append(result, arr[v]) + } + } + return result +} + +// NewInclude creates a new Include with a list of file globs to include. +// Configuration files are parsed greedily (e.g. as soon as this function runs). +// Any error encountered while parsing nested configuration files will be +// returned. +func NewInclude(directives []string, hasEquals bool, pos Position, comment string, system bool, depth uint8) (*Include, error) { + if depth > maxRecurseDepth { + return nil, ErrDepthExceeded + } + inc := &Include{ + Comment: comment, + directives: directives, + files: make(map[string]*Config), + position: pos, + leadingSpace: pos.Col - 1, + depth: depth, + hasEquals: hasEquals, + } + // no need for inc.mu.Lock() since nothing else can access this inc + matches := make([]string, 0) + for i := range directives { + var path string + if filepath.IsAbs(directives[i]) { + path = directives[i] + } else if system { + path = filepath.Join("/etc/ssh", directives[i]) + } else { + path = filepath.Join(homedir(), ".ssh", directives[i]) + } + theseMatches, err := filepath.Glob(path) + if err != nil { + return nil, err + } + matches = append(matches, theseMatches...) + } + matches = removeDups(matches) + inc.matches = matches + for i := range matches { + config, err := parseWithDepth(matches[i], depth) + if err != nil { + return nil, err + } + inc.files[matches[i]] = config + } + return inc, nil +} + +// Pos returns the position of the Include directive in the larger file. +func (i *Include) Pos() Position { + return i.position +} + +// Get finds the first value in the Include statement matching the alias and the +// given key. +func (inc *Include) Get(alias, key string) string { + inc.mu.Lock() + defer inc.mu.Unlock() + // TODO: we search files in any order which is not correct + for i := range inc.matches { + cfg := inc.files[inc.matches[i]] + if cfg == nil { + panic("nil cfg") + } + val, err := cfg.Get(alias, key) + if err == nil && val != "" { + return val + } + } + return "" +} + +// GetAll finds all values in the Include statement matching the alias and the +// given key. +func (inc *Include) GetAll(alias, key string) ([]string, error) { + inc.mu.Lock() + defer inc.mu.Unlock() + var vals []string + + // TODO: we search files in any order which is not correct + for i := range inc.matches { + cfg := inc.files[inc.matches[i]] + if cfg == nil { + panic("nil cfg") + } + val, err := cfg.GetAll(alias, key) + if err == nil && len(val) != 0 { + // In theory if SupportsMultiple was false for this key we could + // stop looking here. But the caller has asked us to find all + // instances of the keyword (and could use Get() if they wanted) so + // let's keep looking. + vals = append(vals, val...) + } + } + return vals, nil +} + +// String prints out a string representation of this Include directive. Note +// included Config files are not printed as part of this representation. +func (inc *Include) String() string { + equals := " " + if inc.hasEquals { + equals = " = " + } + line := fmt.Sprintf("%sInclude%s%s", strings.Repeat(" ", int(inc.leadingSpace)), equals, strings.Join(inc.directives, " ")) + if inc.Comment != "" { + line += " #" + inc.Comment + } + return line +} + +var matchAll *Pattern + +func init() { + var err error + matchAll, err = NewPattern("*") + if err != nil { + panic(err) + } +} + +func newConfig() *Config { + return &Config{ + Hosts: []*Host{ + &Host{ + implicit: true, + Patterns: []*Pattern{matchAll}, + Nodes: make([]Node, 0), + }, + }, + depth: 0, + } +} diff --git a/vendor/github.com/kevinburke/ssh_config/lexer.go b/vendor/github.com/kevinburke/ssh_config/lexer.go new file mode 100644 index 0000000000..11680b4c74 --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/lexer.go @@ -0,0 +1,240 @@ +package ssh_config + +import ( + "bytes" +) + +// Define state functions +type sshLexStateFn func() sshLexStateFn + +type sshLexer struct { + inputIdx int + input []rune // Textual source + + buffer []rune // Runes composing the current token + tokens chan token + line int + col int + endbufferLine int + endbufferCol int +} + +func (s *sshLexer) lexComment(previousState sshLexStateFn) sshLexStateFn { + return func() sshLexStateFn { + growingString := "" + for next := s.peek(); next != '\n' && next != eof; next = s.peek() { + if next == '\r' && s.follow("\r\n") { + break + } + growingString += string(next) + s.next() + } + s.emitWithValue(tokenComment, growingString) + s.skip() + return previousState + } +} + +// lex the space after an equals sign in a function +func (s *sshLexer) lexRspace() sshLexStateFn { + for { + next := s.peek() + if !isSpace(next) { + break + } + s.skip() + } + return s.lexRvalue +} + +func (s *sshLexer) lexEquals() sshLexStateFn { + for { + next := s.peek() + if next == '=' { + s.emit(tokenEquals) + s.skip() + return s.lexRspace + } + // TODO error handling here; newline eof etc. + if !isSpace(next) { + break + } + s.skip() + } + return s.lexRvalue +} + +func (s *sshLexer) lexKey() sshLexStateFn { + growingString := "" + + for r := s.peek(); isKeyChar(r); r = s.peek() { + // simplified a lot here + if isSpace(r) || r == '=' { + s.emitWithValue(tokenKey, growingString) + s.skip() + return s.lexEquals + } + growingString += string(r) + s.next() + } + s.emitWithValue(tokenKey, growingString) + return s.lexEquals +} + +func (s *sshLexer) lexRvalue() sshLexStateFn { + growingString := "" + for { + next := s.peek() + switch next { + case '\r': + if s.follow("\r\n") { + s.emitWithValue(tokenString, growingString) + s.skip() + return s.lexVoid + } + case '\n': + s.emitWithValue(tokenString, growingString) + s.skip() + return s.lexVoid + case '#': + s.emitWithValue(tokenString, growingString) + s.skip() + return s.lexComment(s.lexVoid) + case eof: + s.next() + } + if next == eof { + break + } + growingString += string(next) + s.next() + } + s.emit(tokenEOF) + return nil +} + +func (s *sshLexer) read() rune { + r := s.peek() + if r == '\n' { + s.endbufferLine++ + s.endbufferCol = 1 + } else { + s.endbufferCol++ + } + s.inputIdx++ + return r +} + +func (s *sshLexer) next() rune { + r := s.read() + + if r != eof { + s.buffer = append(s.buffer, r) + } + return r +} + +func (s *sshLexer) lexVoid() sshLexStateFn { + for { + next := s.peek() + switch next { + case '#': + s.skip() + return s.lexComment(s.lexVoid) + case '\r': + fallthrough + case '\n': + s.emit(tokenEmptyLine) + s.skip() + continue + } + + if isSpace(next) { + s.skip() + } + + if isKeyStartChar(next) { + return s.lexKey + } + + // removed IsKeyStartChar and lexKey. probably will need to readd + + if next == eof { + s.next() + break + } + } + + s.emit(tokenEOF) + return nil +} + +func (s *sshLexer) ignore() { + s.buffer = make([]rune, 0) + s.line = s.endbufferLine + s.col = s.endbufferCol +} + +func (s *sshLexer) skip() { + s.next() + s.ignore() +} + +func (s *sshLexer) emit(t tokenType) { + s.emitWithValue(t, string(s.buffer)) +} + +func (s *sshLexer) emitWithValue(t tokenType, value string) { + tok := token{ + Position: Position{s.line, s.col}, + typ: t, + val: value, + } + s.tokens <- tok + s.ignore() +} + +func (s *sshLexer) peek() rune { + if s.inputIdx >= len(s.input) { + return eof + } + + r := s.input[s.inputIdx] + return r +} + +func (s *sshLexer) follow(next string) bool { + inputIdx := s.inputIdx + for _, expectedRune := range next { + if inputIdx >= len(s.input) { + return false + } + r := s.input[inputIdx] + inputIdx++ + if expectedRune != r { + return false + } + } + return true +} + +func (s *sshLexer) run() { + for state := s.lexVoid; state != nil; { + state = state() + } + close(s.tokens) +} + +func lexSSH(input []byte) chan token { + runes := bytes.Runes(input) + l := &sshLexer{ + input: runes, + tokens: make(chan token), + line: 1, + col: 1, + endbufferLine: 1, + endbufferCol: 1, + } + go l.run() + return l.tokens +} diff --git a/vendor/github.com/kevinburke/ssh_config/parser.go b/vendor/github.com/kevinburke/ssh_config/parser.go new file mode 100644 index 0000000000..36c42055f5 --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/parser.go @@ -0,0 +1,191 @@ +package ssh_config + +import ( + "fmt" + "strings" +) + +type sshParser struct { + flow chan token + config *Config + tokensBuffer []token + currentTable []string + seenTableKeys []string + // /etc/ssh parser or local parser - used to find the default for relative + // filepaths in the Include directive + system bool + depth uint8 +} + +type sshParserStateFn func() sshParserStateFn + +// Formats and panics an error message based on a token +func (p *sshParser) raiseErrorf(tok *token, msg string, args ...interface{}) { + // TODO this format is ugly + panic(tok.Position.String() + ": " + fmt.Sprintf(msg, args...)) +} + +func (p *sshParser) raiseError(tok *token, err error) { + if err == ErrDepthExceeded { + panic(err) + } + // TODO this format is ugly + panic(tok.Position.String() + ": " + err.Error()) +} + +func (p *sshParser) run() { + for state := p.parseStart; state != nil; { + state = state() + } +} + +func (p *sshParser) peek() *token { + if len(p.tokensBuffer) != 0 { + return &(p.tokensBuffer[0]) + } + + tok, ok := <-p.flow + if !ok { + return nil + } + p.tokensBuffer = append(p.tokensBuffer, tok) + return &tok +} + +func (p *sshParser) getToken() *token { + if len(p.tokensBuffer) != 0 { + tok := p.tokensBuffer[0] + p.tokensBuffer = p.tokensBuffer[1:] + return &tok + } + tok, ok := <-p.flow + if !ok { + return nil + } + return &tok +} + +func (p *sshParser) parseStart() sshParserStateFn { + tok := p.peek() + + // end of stream, parsing is finished + if tok == nil { + return nil + } + + switch tok.typ { + case tokenComment, tokenEmptyLine: + return p.parseComment + case tokenKey: + return p.parseKV + case tokenEOF: + return nil + default: + p.raiseErrorf(tok, fmt.Sprintf("unexpected token %q\n", tok)) + } + return nil +} + +func (p *sshParser) parseKV() sshParserStateFn { + key := p.getToken() + hasEquals := false + val := p.getToken() + if val.typ == tokenEquals { + hasEquals = true + val = p.getToken() + } + comment := "" + tok := p.peek() + if tok == nil { + tok = &token{typ: tokenEOF} + } + if tok.typ == tokenComment && tok.Position.Line == val.Position.Line { + tok = p.getToken() + comment = tok.val + } + if strings.ToLower(key.val) == "match" { + // https://github.com/kevinburke/ssh_config/issues/6 + p.raiseErrorf(val, "ssh_config: Match directive parsing is unsupported") + return nil + } + if strings.ToLower(key.val) == "host" { + strPatterns := strings.Split(val.val, " ") + patterns := make([]*Pattern, 0) + for i := range strPatterns { + if strPatterns[i] == "" { + continue + } + pat, err := NewPattern(strPatterns[i]) + if err != nil { + p.raiseErrorf(val, "Invalid host pattern: %v", err) + return nil + } + patterns = append(patterns, pat) + } + p.config.Hosts = append(p.config.Hosts, &Host{ + Patterns: patterns, + Nodes: make([]Node, 0), + EOLComment: comment, + hasEquals: hasEquals, + }) + return p.parseStart + } + lastHost := p.config.Hosts[len(p.config.Hosts)-1] + if strings.ToLower(key.val) == "include" { + inc, err := NewInclude(strings.Split(val.val, " "), hasEquals, key.Position, comment, p.system, p.depth+1) + if err == ErrDepthExceeded { + p.raiseError(val, err) + return nil + } + if err != nil { + p.raiseErrorf(val, "Error parsing Include directive: %v", err) + return nil + } + lastHost.Nodes = append(lastHost.Nodes, inc) + return p.parseStart + } + kv := &KV{ + Key: key.val, + Value: val.val, + Comment: comment, + hasEquals: hasEquals, + leadingSpace: key.Position.Col - 1, + position: key.Position, + } + lastHost.Nodes = append(lastHost.Nodes, kv) + return p.parseStart +} + +func (p *sshParser) parseComment() sshParserStateFn { + comment := p.getToken() + lastHost := p.config.Hosts[len(p.config.Hosts)-1] + lastHost.Nodes = append(lastHost.Nodes, &Empty{ + Comment: comment.val, + // account for the "#" as well + leadingSpace: comment.Position.Col - 2, + position: comment.Position, + }) + return p.parseStart +} + +func parseSSH(flow chan token, system bool, depth uint8) *Config { + // Ensure we consume tokens to completion even if parser exits early + defer func() { + for range flow { + } + }() + + result := newConfig() + result.position = Position{1, 1} + parser := &sshParser{ + flow: flow, + config: result, + tokensBuffer: make([]token, 0), + currentTable: make([]string, 0), + seenTableKeys: make([]string, 0), + system: system, + depth: depth, + } + parser.run() + return result +} diff --git a/vendor/github.com/kevinburke/ssh_config/position.go b/vendor/github.com/kevinburke/ssh_config/position.go new file mode 100644 index 0000000000..e0b5e3fb33 --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/position.go @@ -0,0 +1,25 @@ +package ssh_config + +import "fmt" + +// Position of a document element within a SSH document. +// +// Line and Col are both 1-indexed positions for the element's line number and +// column number, respectively. Values of zero or less will cause Invalid(), +// to return true. +type Position struct { + Line int // line within the document + Col int // column within the line +} + +// String representation of the position. +// Displays 1-indexed line and column numbers. +func (p Position) String() string { + return fmt.Sprintf("(%d, %d)", p.Line, p.Col) +} + +// Invalid returns whether or not the position is valid (i.e. with negative or +// null values) +func (p Position) Invalid() bool { + return p.Line <= 0 || p.Col <= 0 +} diff --git a/vendor/github.com/kevinburke/ssh_config/token.go b/vendor/github.com/kevinburke/ssh_config/token.go new file mode 100644 index 0000000000..a0ecbb2bb7 --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/token.go @@ -0,0 +1,49 @@ +package ssh_config + +import "fmt" + +type token struct { + Position + typ tokenType + val string +} + +func (t token) String() string { + switch t.typ { + case tokenEOF: + return "EOF" + } + return fmt.Sprintf("%q", t.val) +} + +type tokenType int + +const ( + eof = -(iota + 1) +) + +const ( + tokenError tokenType = iota + tokenEOF + tokenEmptyLine + tokenComment + tokenKey + tokenEquals + tokenString +) + +func isSpace(r rune) bool { + return r == ' ' || r == '\t' +} + +func isKeyStartChar(r rune) bool { + return !(isSpace(r) || r == '\r' || r == '\n' || r == eof) +} + +// I'm not sure that this is correct +func isKeyChar(r rune) bool { + // Keys start with the first character that isn't whitespace or [ and end + // with the last non-whitespace character before the equals sign. Keys + // cannot contain a # character." + return !(r == '\r' || r == '\n' || r == eof || r == '=') +} diff --git a/vendor/github.com/kevinburke/ssh_config/validators.go b/vendor/github.com/kevinburke/ssh_config/validators.go new file mode 100644 index 0000000000..5977f90960 --- /dev/null +++ b/vendor/github.com/kevinburke/ssh_config/validators.go @@ -0,0 +1,186 @@ +package ssh_config + +import ( + "fmt" + "strconv" + "strings" +) + +// Default returns the default value for the given keyword, for example "22" if +// the keyword is "Port". Default returns the empty string if the keyword has no +// default, or if the keyword is unknown. Keyword matching is case-insensitive. +// +// Default values are provided by OpenSSH_7.4p1 on a Mac. +func Default(keyword string) string { + return defaults[strings.ToLower(keyword)] +} + +// Arguments where the value must be "yes" or "no" and *only* yes or no. +var yesnos = map[string]bool{ + strings.ToLower("BatchMode"): true, + strings.ToLower("CanonicalizeFallbackLocal"): true, + strings.ToLower("ChallengeResponseAuthentication"): true, + strings.ToLower("CheckHostIP"): true, + strings.ToLower("ClearAllForwardings"): true, + strings.ToLower("Compression"): true, + strings.ToLower("EnableSSHKeysign"): true, + strings.ToLower("ExitOnForwardFailure"): true, + strings.ToLower("ForwardAgent"): true, + strings.ToLower("ForwardX11"): true, + strings.ToLower("ForwardX11Trusted"): true, + strings.ToLower("GatewayPorts"): true, + strings.ToLower("GSSAPIAuthentication"): true, + strings.ToLower("GSSAPIDelegateCredentials"): true, + strings.ToLower("HostbasedAuthentication"): true, + strings.ToLower("IdentitiesOnly"): true, + strings.ToLower("KbdInteractiveAuthentication"): true, + strings.ToLower("NoHostAuthenticationForLocalhost"): true, + strings.ToLower("PasswordAuthentication"): true, + strings.ToLower("PermitLocalCommand"): true, + strings.ToLower("PubkeyAuthentication"): true, + strings.ToLower("RhostsRSAAuthentication"): true, + strings.ToLower("RSAAuthentication"): true, + strings.ToLower("StreamLocalBindUnlink"): true, + strings.ToLower("TCPKeepAlive"): true, + strings.ToLower("UseKeychain"): true, + strings.ToLower("UsePrivilegedPort"): true, + strings.ToLower("VisualHostKey"): true, +} + +var uints = map[string]bool{ + strings.ToLower("CanonicalizeMaxDots"): true, + strings.ToLower("CompressionLevel"): true, // 1 to 9 + strings.ToLower("ConnectionAttempts"): true, + strings.ToLower("ConnectTimeout"): true, + strings.ToLower("NumberOfPasswordPrompts"): true, + strings.ToLower("Port"): true, + strings.ToLower("ServerAliveCountMax"): true, + strings.ToLower("ServerAliveInterval"): true, +} + +func mustBeYesOrNo(lkey string) bool { + return yesnos[lkey] +} + +func mustBeUint(lkey string) bool { + return uints[lkey] +} + +func validate(key, val string) error { + lkey := strings.ToLower(key) + if mustBeYesOrNo(lkey) && (val != "yes" && val != "no") { + return fmt.Errorf("ssh_config: value for key %q must be 'yes' or 'no', got %q", key, val) + } + if mustBeUint(lkey) { + _, err := strconv.ParseUint(val, 10, 64) + if err != nil { + return fmt.Errorf("ssh_config: %v", err) + } + } + return nil +} + +var defaults = map[string]string{ + strings.ToLower("AddKeysToAgent"): "no", + strings.ToLower("AddressFamily"): "any", + strings.ToLower("BatchMode"): "no", + strings.ToLower("CanonicalizeFallbackLocal"): "yes", + strings.ToLower("CanonicalizeHostname"): "no", + strings.ToLower("CanonicalizeMaxDots"): "1", + strings.ToLower("ChallengeResponseAuthentication"): "yes", + strings.ToLower("CheckHostIP"): "yes", + // TODO is this still the correct cipher + strings.ToLower("Cipher"): "3des", + strings.ToLower("Ciphers"): "chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,aes192-cbc,aes256-cbc", + strings.ToLower("ClearAllForwardings"): "no", + strings.ToLower("Compression"): "no", + strings.ToLower("CompressionLevel"): "6", + strings.ToLower("ConnectionAttempts"): "1", + strings.ToLower("ControlMaster"): "no", + strings.ToLower("EnableSSHKeysign"): "no", + strings.ToLower("EscapeChar"): "~", + strings.ToLower("ExitOnForwardFailure"): "no", + strings.ToLower("FingerprintHash"): "sha256", + strings.ToLower("ForwardAgent"): "no", + strings.ToLower("ForwardX11"): "no", + strings.ToLower("ForwardX11Timeout"): "20m", + strings.ToLower("ForwardX11Trusted"): "no", + strings.ToLower("GatewayPorts"): "no", + strings.ToLower("GlobalKnownHostsFile"): "/etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2", + strings.ToLower("GSSAPIAuthentication"): "no", + strings.ToLower("GSSAPIDelegateCredentials"): "no", + strings.ToLower("HashKnownHosts"): "no", + strings.ToLower("HostbasedAuthentication"): "no", + + strings.ToLower("HostbasedKeyTypes"): "ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa", + strings.ToLower("HostKeyAlgorithms"): "ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa", + // HostName has a dynamic default (the value passed at the command line). + + strings.ToLower("IdentitiesOnly"): "no", + strings.ToLower("IdentityFile"): "~/.ssh/identity", + + // IPQoS has a dynamic default based on interactive or non-interactive + // sessions. + + strings.ToLower("KbdInteractiveAuthentication"): "yes", + + strings.ToLower("KexAlgorithms"): "curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1", + strings.ToLower("LogLevel"): "INFO", + strings.ToLower("MACs"): "umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1", + + strings.ToLower("NoHostAuthenticationForLocalhost"): "no", + strings.ToLower("NumberOfPasswordPrompts"): "3", + strings.ToLower("PasswordAuthentication"): "yes", + strings.ToLower("PermitLocalCommand"): "no", + strings.ToLower("Port"): "22", + + strings.ToLower("PreferredAuthentications"): "gssapi-with-mic,hostbased,publickey,keyboard-interactive,password", + strings.ToLower("Protocol"): "2", + strings.ToLower("ProxyUseFdpass"): "no", + strings.ToLower("PubkeyAcceptedKeyTypes"): "ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa", + strings.ToLower("PubkeyAuthentication"): "yes", + strings.ToLower("RekeyLimit"): "default none", + strings.ToLower("RhostsRSAAuthentication"): "no", + strings.ToLower("RSAAuthentication"): "yes", + + strings.ToLower("ServerAliveCountMax"): "3", + strings.ToLower("ServerAliveInterval"): "0", + strings.ToLower("StreamLocalBindMask"): "0177", + strings.ToLower("StreamLocalBindUnlink"): "no", + strings.ToLower("StrictHostKeyChecking"): "ask", + strings.ToLower("TCPKeepAlive"): "yes", + strings.ToLower("Tunnel"): "no", + strings.ToLower("TunnelDevice"): "any:any", + strings.ToLower("UpdateHostKeys"): "no", + strings.ToLower("UseKeychain"): "no", + strings.ToLower("UsePrivilegedPort"): "no", + + strings.ToLower("UserKnownHostsFile"): "~/.ssh/known_hosts ~/.ssh/known_hosts2", + strings.ToLower("VerifyHostKeyDNS"): "no", + strings.ToLower("VisualHostKey"): "no", + strings.ToLower("XAuthLocation"): "/usr/X11R6/bin/xauth", +} + +// these identities are used for SSH protocol 2 +var defaultProtocol2Identities = []string{ + "~/.ssh/id_dsa", + "~/.ssh/id_ecdsa", + "~/.ssh/id_ed25519", + "~/.ssh/id_rsa", +} + +// these directives support multiple items that can be collected +// across multiple files +var pluralDirectives = map[string]bool{ + "CertificateFile": true, + "IdentityFile": true, + "DynamicForward": true, + "RemoteForward": true, + "SendEnv": true, + "SetEnv": true, +} + +// SupportsMultiple reports whether a directive can be specified multiple times. +func SupportsMultiple(key string) bool { + return pluralDirectives[strings.ToLower(key)] +} diff --git a/vendor/github.com/klauspost/compress/README.md b/vendor/github.com/klauspost/compress/README.md index e8ff994f8b..f7f74c1537 100644 --- a/vendor/github.com/klauspost/compress/README.md +++ b/vendor/github.com/klauspost/compress/README.md @@ -17,6 +17,19 @@ This package provides various compression algorithms. # changelog +* Feb 17, 2022 (v1.14.3) + * flate: Improve fastest levels compression speed ~10% more throughput. [#482](https://github.com/klauspost/compress/pull/482) [#489](https://github.com/klauspost/compress/pull/489) [#490](https://github.com/klauspost/compress/pull/490) [#491](https://github.com/klauspost/compress/pull/491) [#494](https://github.com/klauspost/compress/pull/494) [#478](https://github.com/klauspost/compress/pull/478) + * flate: Faster decompression speed, ~5-10%. [#483](https://github.com/klauspost/compress/pull/483) + * s2: Faster compression with Go v1.18 and amd64 microarch level 3+. [#484](https://github.com/klauspost/compress/pull/484) [#486](https://github.com/klauspost/compress/pull/486) + +* Jan 25, 2022 (v1.14.2) + * zstd: improve header decoder by @dsnet [#476](https://github.com/klauspost/compress/pull/476) + * zstd: Add bigger default blocks [#469](https://github.com/klauspost/compress/pull/469) + * zstd: Remove unused decompression buffer [#470](https://github.com/klauspost/compress/pull/470) + * zstd: Fix logically dead code by @ningmingxiao [#472](https://github.com/klauspost/compress/pull/472) + * flate: Improve level 7-9 [#471](https://github.com/klauspost/compress/pull/471) [#473](https://github.com/klauspost/compress/pull/473) + * zstd: Add noasm tag for xxhash [#475](https://github.com/klauspost/compress/pull/475) + * Jan 11, 2022 (v1.14.1) * s2: Add stream index in [#462](https://github.com/klauspost/compress/pull/462) * flate: Speed and efficiency improvements in [#439](https://github.com/klauspost/compress/pull/439) [#461](https://github.com/klauspost/compress/pull/461) [#455](https://github.com/klauspost/compress/pull/455) [#452](https://github.com/klauspost/compress/pull/452) [#458](https://github.com/klauspost/compress/pull/458) @@ -53,6 +66,9 @@ This package provides various compression algorithms. * zstd: Detect short invalid signatures [#382](https://github.com/klauspost/compress/pull/382) * zstd: Spawn decoder goroutine only if needed. [#380](https://github.com/klauspost/compress/pull/380) +
    + See changes to v1.12.x + * May 25, 2021 (v1.12.3) * deflate: Better/faster Huffman encoding [#374](https://github.com/klauspost/compress/pull/374) * deflate: Allocate less for history. [#375](https://github.com/klauspost/compress/pull/375) @@ -74,9 +90,10 @@ This package provides various compression algorithms. * s2c/s2d/s2sx: Always truncate when writing files [#352](https://github.com/klauspost/compress/pull/352) * zstd: Reduce memory usage further when using [WithLowerEncoderMem](https://pkg.go.dev/github.com/klauspost/compress/zstd#WithLowerEncoderMem) [#346](https://github.com/klauspost/compress/pull/346) * s2: Fix potential problem with amd64 assembly and profilers [#349](https://github.com/klauspost/compress/pull/349) +
    - See changes prior to v1.12.1 + See changes to v1.11.x * Mar 26, 2021 (v1.11.13) * zstd: Big speedup on small dictionary encodes [#344](https://github.com/klauspost/compress/pull/344) [#345](https://github.com/klauspost/compress/pull/345) @@ -135,7 +152,7 @@ This package provides various compression algorithms.
    - See changes prior to v1.11.0 + See changes to v1.10.x * July 8, 2020 (v1.10.11) * zstd: Fix extra block when compressing with ReadFrom. [#278](https://github.com/klauspost/compress/pull/278) @@ -297,11 +314,6 @@ This package provides various compression algorithms. # deflate usage -* [High Throughput Benchmark](http://blog.klauspost.com/go-gzipdeflate-benchmarks/). -* [Small Payload/Webserver Benchmarks](http://blog.klauspost.com/gzip-performance-for-go-webservers/). -* [Linear Time Compression](http://blog.klauspost.com/constant-time-gzipzip-compression/). -* [Re-balancing Deflate Compression Levels](https://blog.klauspost.com/rebalancing-deflate-compression-levels/) - The packages are drop-in replacements for standard libraries. Simply replace the import path to use them: | old import | new import | Documentation @@ -323,6 +335,8 @@ Memory usage is typically 1MB for a Writer. stdlib is in the same range. If you expect to have a lot of concurrently allocated Writers consider using the stateless compress described below. +For compression performance, see: [this spreadsheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing). + # Stateless compression This package offers stateless compression as a special option for gzip/deflate. diff --git a/vendor/github.com/klauspost/compress/huff0/decompress.go b/vendor/github.com/klauspost/compress/huff0/decompress.go index 2a06bd1a7e..2668b64d37 100644 --- a/vendor/github.com/klauspost/compress/huff0/decompress.go +++ b/vendor/github.com/klauspost/compress/huff0/decompress.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io" + "sync" "github.com/klauspost/compress/fse" ) @@ -216,6 +217,7 @@ func (s *Scratch) Decoder() *Decoder { return &Decoder{ dt: s.dt, actualTableLog: s.actualTableLog, + bufs: &s.decPool, } } @@ -223,6 +225,15 @@ func (s *Scratch) Decoder() *Decoder { type Decoder struct { dt dTable actualTableLog uint8 + bufs *sync.Pool +} + +func (d *Decoder) buffer() *[4][256]byte { + buf, ok := d.bufs.Get().(*[4][256]byte) + if ok { + return buf + } + return &[4][256]byte{} } // Decompress1X will decompress a 1X encoded stream. @@ -249,7 +260,8 @@ func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { dt := d.dt.single[:tlSize] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + bufs := d.buffer() + buf := &bufs[0] var off uint8 for br.off >= 8 { @@ -277,6 +289,7 @@ func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { if off == 0 { if len(dst)+256 > maxDecodedSize { br.close() + d.bufs.Put(bufs) return nil, ErrMaxDecodedSizeExceeded } dst = append(dst, buf[:]...) @@ -284,6 +297,7 @@ func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { } if len(dst)+int(off) > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -310,6 +324,7 @@ func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { } } if len(dst) >= maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -319,6 +334,7 @@ func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { bitsLeft -= nBits dst = append(dst, uint8(v.entry>>8)) } + d.bufs.Put(bufs) return dst, br.close() } @@ -341,7 +357,8 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { dt := d.dt.single[:256] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + bufs := d.buffer() + buf := &bufs[0] var off uint8 switch d.actualTableLog { @@ -369,6 +386,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { if off == 0 { if len(dst)+256 > maxDecodedSize { br.close() + d.bufs.Put(bufs) return nil, ErrMaxDecodedSizeExceeded } dst = append(dst, buf[:]...) @@ -398,6 +416,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { if off == 0 { if len(dst)+256 > maxDecodedSize { br.close() + d.bufs.Put(bufs) return nil, ErrMaxDecodedSizeExceeded } dst = append(dst, buf[:]...) @@ -426,6 +445,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -455,6 +475,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -484,6 +505,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -513,6 +535,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -542,6 +565,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -571,6 +595,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -578,10 +603,12 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { } } default: + d.bufs.Put(bufs) return nil, fmt.Errorf("invalid tablelog: %d", d.actualTableLog) } if len(dst)+int(off) > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -601,6 +628,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { } if len(dst) >= maxDecodedSize { br.close() + d.bufs.Put(bufs) return nil, ErrMaxDecodedSizeExceeded } v := dt[br.peekByteFast()>>shift] @@ -609,6 +637,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { bitsLeft -= int8(nBits) dst = append(dst, uint8(v.entry>>8)) } + d.bufs.Put(bufs) return dst, br.close() } @@ -628,7 +657,8 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { dt := d.dt.single[:256] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + bufs := d.buffer() + buf := &bufs[0] var off uint8 const shift = 56 @@ -655,6 +685,7 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { off += 4 if off == 0 { if len(dst)+256 > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -663,6 +694,7 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { } if len(dst)+int(off) > maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -679,6 +711,7 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { } } if len(dst) >= maxDecodedSize { + d.bufs.Put(bufs) br.close() return nil, ErrMaxDecodedSizeExceeded } @@ -688,6 +721,7 @@ func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { bitsLeft -= int8(nBits) dst = append(dst, uint8(v.entry>>8)) } + d.bufs.Put(bufs) return dst, br.close() } @@ -735,12 +769,12 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { single := d.dt.single[:tlSize] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + buf := d.buffer() var off uint8 var decoded int // Decode 2 values from each decoder/loop. - const bufoff = 256 / 4 + const bufoff = 256 for { if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { break @@ -758,8 +792,8 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { v2 := single[val2&tlMask] br[stream].advance(uint8(v.entry)) br[stream2].advance(uint8(v2.entry)) - buf[off+bufoff*stream] = uint8(v.entry >> 8) - buf[off+bufoff*stream2] = uint8(v2.entry >> 8) + buf[stream][off] = uint8(v.entry >> 8) + buf[stream2][off] = uint8(v2.entry >> 8) val = br[stream].peekBitsFast(d.actualTableLog) val2 = br[stream2].peekBitsFast(d.actualTableLog) @@ -767,8 +801,8 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { v2 = single[val2&tlMask] br[stream].advance(uint8(v.entry)) br[stream2].advance(uint8(v2.entry)) - buf[off+bufoff*stream+1] = uint8(v.entry >> 8) - buf[off+bufoff*stream2+1] = uint8(v2.entry >> 8) + buf[stream][off+1] = uint8(v.entry >> 8) + buf[stream2][off+1] = uint8(v2.entry >> 8) } { @@ -783,8 +817,8 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { v2 := single[val2&tlMask] br[stream].advance(uint8(v.entry)) br[stream2].advance(uint8(v2.entry)) - buf[off+bufoff*stream] = uint8(v.entry >> 8) - buf[off+bufoff*stream2] = uint8(v2.entry >> 8) + buf[stream][off] = uint8(v.entry >> 8) + buf[stream2][off] = uint8(v2.entry >> 8) val = br[stream].peekBitsFast(d.actualTableLog) val2 = br[stream2].peekBitsFast(d.actualTableLog) @@ -792,25 +826,26 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { v2 = single[val2&tlMask] br[stream].advance(uint8(v.entry)) br[stream2].advance(uint8(v2.entry)) - buf[off+bufoff*stream+1] = uint8(v.entry >> 8) - buf[off+bufoff*stream2+1] = uint8(v2.entry >> 8) + buf[stream][off+1] = uint8(v.entry >> 8) + buf[stream2][off+1] = uint8(v2.entry >> 8) } off += 2 - if off == bufoff { + if off == 0 { if bufoff > dstEvery { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 1") } - copy(out, buf[:bufoff]) - copy(out[dstEvery:], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:], buf[bufoff*3:bufoff*4]) - off = 0 + copy(out, buf[0][:]) + copy(out[dstEvery:], buf[1][:]) + copy(out[dstEvery*2:], buf[2][:]) + copy(out[dstEvery*3:], buf[3][:]) out = out[bufoff:] - decoded += 256 + decoded += bufoff * 4 // There must at least be 3 buffers left. if len(out) < dstEvery*3 { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 2") } } @@ -818,12 +853,13 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { if off > 0 { ioff := int(off) if len(out) < dstEvery*3+ioff { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 3") } - copy(out, buf[:off]) - copy(out[dstEvery:dstEvery+ioff], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:dstEvery*2+ioff], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:dstEvery*3+ioff], buf[bufoff*3:bufoff*4]) + copy(out, buf[0][:off]) + copy(out[dstEvery:], buf[1][:off]) + copy(out[dstEvery*2:], buf[2][:off]) + copy(out[dstEvery*3:], buf[3][:off]) decoded += int(off) * 4 out = out[off:] } @@ -853,6 +889,7 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { } // end inline... if offset >= len(out) { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 4") } @@ -871,6 +908,7 @@ func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { return nil, err } } + d.bufs.Put(buf) if dstSize != decoded { return nil, errors.New("corruption detected: short output block") } @@ -916,12 +954,12 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { single := d.dt.single[:tlSize] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + buf := d.buffer() var off uint8 var decoded int // Decode 4 values from each decoder/loop. - const bufoff = 256 / 4 + const bufoff = 256 for { if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { break @@ -942,8 +980,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream] = uint8(v >> 8) - buf[off+bufoff*stream2] = uint8(v2 >> 8) + buf[stream][off] = uint8(v >> 8) + buf[stream2][off] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -951,8 +989,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream+1] = uint8(v >> 8) - buf[off+bufoff*stream2+1] = uint8(v2 >> 8) + buf[stream][off+1] = uint8(v >> 8) + buf[stream2][off+1] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -960,8 +998,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream+2] = uint8(v >> 8) - buf[off+bufoff*stream2+2] = uint8(v2 >> 8) + buf[stream][off+2] = uint8(v >> 8) + buf[stream2][off+2] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -969,8 +1007,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream2+3] = uint8(v2 >> 8) - buf[off+bufoff*stream+3] = uint8(v >> 8) + buf[stream][off+3] = uint8(v >> 8) + buf[stream2][off+3] = uint8(v2 >> 8) } { @@ -987,8 +1025,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream] = uint8(v >> 8) - buf[off+bufoff*stream2] = uint8(v2 >> 8) + buf[stream][off] = uint8(v >> 8) + buf[stream2][off] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -996,8 +1034,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream+1] = uint8(v >> 8) - buf[off+bufoff*stream2+1] = uint8(v2 >> 8) + buf[stream][off+1] = uint8(v >> 8) + buf[stream2][off+1] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -1005,8 +1043,8 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream+2] = uint8(v >> 8) - buf[off+bufoff*stream2+2] = uint8(v2 >> 8) + buf[stream][off+2] = uint8(v >> 8) + buf[stream2][off+2] = uint8(v2 >> 8) v = single[uint8(br1.value>>shift)].entry v2 = single[uint8(br2.value>>shift)].entry @@ -1014,25 +1052,26 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { br1.value <<= v & 63 br2.bitsRead += uint8(v2) br2.value <<= v2 & 63 - buf[off+bufoff*stream2+3] = uint8(v2 >> 8) - buf[off+bufoff*stream+3] = uint8(v >> 8) + buf[stream][off+3] = uint8(v >> 8) + buf[stream2][off+3] = uint8(v2 >> 8) } off += 4 - if off == bufoff { + if off == 0 { if bufoff > dstEvery { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 1") } - copy(out, buf[:bufoff]) - copy(out[dstEvery:], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:], buf[bufoff*3:bufoff*4]) - off = 0 + copy(out, buf[0][:]) + copy(out[dstEvery:], buf[1][:]) + copy(out[dstEvery*2:], buf[2][:]) + copy(out[dstEvery*3:], buf[3][:]) out = out[bufoff:] - decoded += 256 + decoded += bufoff * 4 // There must at least be 3 buffers left. if len(out) < dstEvery*3 { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 2") } } @@ -1040,12 +1079,13 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { if off > 0 { ioff := int(off) if len(out) < dstEvery*3+ioff { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 3") } - copy(out, buf[:off]) - copy(out[dstEvery:dstEvery+ioff], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:dstEvery*2+ioff], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:dstEvery*3+ioff], buf[bufoff*3:bufoff*4]) + copy(out, buf[0][:off]) + copy(out[dstEvery:], buf[1][:off]) + copy(out[dstEvery*2:], buf[2][:off]) + copy(out[dstEvery*3:], buf[3][:off]) decoded += int(off) * 4 out = out[off:] } @@ -1057,6 +1097,7 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { bitsLeft := int(br.off*8) + int(64-br.bitsRead) for bitsLeft > 0 { if br.finished() { + d.bufs.Put(buf) return nil, io.ErrUnexpectedEOF } if br.bitsRead >= 56 { @@ -1077,6 +1118,7 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { } // end inline... if offset >= len(out) { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 4") } @@ -1091,9 +1133,11 @@ func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { decoded += offset - dstEvery*i err = br.close() if err != nil { + d.bufs.Put(buf) return nil, err } } + d.bufs.Put(buf) if dstSize != decoded { return nil, errors.New("corruption detected: short output block") } @@ -1135,12 +1179,12 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { single := d.dt.single[:tlSize] // Use temp table to avoid bound checks/append penalty. - var buf [256]byte + buf := d.buffer() var off uint8 var decoded int // Decode 4 values from each decoder/loop. - const bufoff = 256 / 4 + const bufoff = 256 for { if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { break @@ -1150,104 +1194,109 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { // Interleave 2 decodes. const stream = 0 const stream2 = 1 - br[stream].fillFast() - br[stream2].fillFast() + br1 := &br[stream] + br2 := &br[stream2] + br1.fillFast() + br2.fillFast() + + v := single[uint8(br1.value>>shift)].entry + v2 := single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off] = uint8(v >> 8) + buf[stream2][off] = uint8(v2 >> 8) - v := single[uint8(br[stream].value>>shift)].entry - v2 := single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream] = uint8(v >> 8) - buf[off+bufoff*stream2] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+1] = uint8(v >> 8) - buf[off+bufoff*stream2+1] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+2] = uint8(v >> 8) - buf[off+bufoff*stream2+2] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+3] = uint8(v >> 8) - buf[off+bufoff*stream2+3] = uint8(v2 >> 8) + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+1] = uint8(v >> 8) + buf[stream2][off+1] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+2] = uint8(v >> 8) + buf[stream2][off+2] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+3] = uint8(v >> 8) + buf[stream2][off+3] = uint8(v2 >> 8) } { const stream = 2 const stream2 = 3 - br[stream].fillFast() - br[stream2].fillFast() + br1 := &br[stream] + br2 := &br[stream2] + br1.fillFast() + br2.fillFast() + + v := single[uint8(br1.value>>shift)].entry + v2 := single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off] = uint8(v >> 8) + buf[stream2][off] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+1] = uint8(v >> 8) + buf[stream2][off+1] = uint8(v2 >> 8) + + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+2] = uint8(v >> 8) + buf[stream2][off+2] = uint8(v2 >> 8) - v := single[uint8(br[stream].value>>shift)].entry - v2 := single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream] = uint8(v >> 8) - buf[off+bufoff*stream2] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+1] = uint8(v >> 8) - buf[off+bufoff*stream2+1] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+2] = uint8(v >> 8) - buf[off+bufoff*stream2+2] = uint8(v2 >> 8) - - v = single[uint8(br[stream].value>>shift)].entry - v2 = single[uint8(br[stream2].value>>shift)].entry - br[stream].bitsRead += uint8(v) - br[stream].value <<= v & 63 - br[stream2].bitsRead += uint8(v2) - br[stream2].value <<= v2 & 63 - buf[off+bufoff*stream+3] = uint8(v >> 8) - buf[off+bufoff*stream2+3] = uint8(v2 >> 8) + v = single[uint8(br1.value>>shift)].entry + v2 = single[uint8(br2.value>>shift)].entry + br1.bitsRead += uint8(v) + br1.value <<= v & 63 + br2.bitsRead += uint8(v2) + br2.value <<= v2 & 63 + buf[stream][off+3] = uint8(v >> 8) + buf[stream2][off+3] = uint8(v2 >> 8) } off += 4 - if off == bufoff { + if off == 0 { if bufoff > dstEvery { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 1") } - copy(out, buf[:bufoff]) - copy(out[dstEvery:], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:], buf[bufoff*3:bufoff*4]) - off = 0 + copy(out, buf[0][:]) + copy(out[dstEvery:], buf[1][:]) + copy(out[dstEvery*2:], buf[2][:]) + copy(out[dstEvery*3:], buf[3][:]) out = out[bufoff:] - decoded += 256 + decoded += bufoff * 4 // There must at least be 3 buffers left. if len(out) < dstEvery*3 { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 2") } } @@ -1257,10 +1306,10 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { if len(out) < dstEvery*3+ioff { return nil, errors.New("corruption detected: stream overrun 3") } - copy(out, buf[:off]) - copy(out[dstEvery:dstEvery+ioff], buf[bufoff:bufoff*2]) - copy(out[dstEvery*2:dstEvery*2+ioff], buf[bufoff*2:bufoff*3]) - copy(out[dstEvery*3:dstEvery*3+ioff], buf[bufoff*3:bufoff*4]) + copy(out, buf[0][:off]) + copy(out[dstEvery:], buf[1][:off]) + copy(out[dstEvery*2:], buf[2][:off]) + copy(out[dstEvery*3:], buf[3][:off]) decoded += int(off) * 4 out = out[off:] } @@ -1272,6 +1321,7 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { bitsLeft := int(br.off*8) + int(64-br.bitsRead) for bitsLeft > 0 { if br.finished() { + d.bufs.Put(buf) return nil, io.ErrUnexpectedEOF } if br.bitsRead >= 56 { @@ -1292,6 +1342,7 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { } // end inline... if offset >= len(out) { + d.bufs.Put(buf) return nil, errors.New("corruption detected: stream overrun 4") } @@ -1306,9 +1357,11 @@ func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { decoded += offset - dstEvery*i err = br.close() if err != nil { + d.bufs.Put(buf) return nil, err } } + d.bufs.Put(buf) if dstSize != decoded { return nil, errors.New("corruption detected: short output block") } diff --git a/vendor/github.com/klauspost/compress/huff0/huff0.go b/vendor/github.com/klauspost/compress/huff0/huff0.go index 3ee00ecb47..e8ad17ad08 100644 --- a/vendor/github.com/klauspost/compress/huff0/huff0.go +++ b/vendor/github.com/klauspost/compress/huff0/huff0.go @@ -8,6 +8,7 @@ import ( "fmt" "math" "math/bits" + "sync" "github.com/klauspost/compress/fse" ) @@ -116,6 +117,7 @@ type Scratch struct { nodes []nodeElt tmpOut [4][]byte fse *fse.Scratch + decPool sync.Pool // *[4][256]byte buffers. huffWeight [maxSymbolValue + 1]byte } diff --git a/vendor/github.com/klauspost/compress/zstd/enc_fast.go b/vendor/github.com/klauspost/compress/zstd/enc_fast.go index 5f08a28302..f51ab529a0 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_fast.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_fast.go @@ -85,7 +85,7 @@ func (e *fastEncoder) Encode(blk *blockEnc, src []byte) { // TEMPLATE const hashLog = tableBits // seems global, but would be nice to tweak. - const kSearchStrength = 7 + const kSearchStrength = 6 // nextEmit is where in src the next emitLiteral should start from. nextEmit := s @@ -334,7 +334,7 @@ func (e *fastEncoder) EncodeNoHist(blk *blockEnc, src []byte) { // TEMPLATE const hashLog = tableBits // seems global, but would be nice to tweak. - const kSearchStrength = 8 + const kSearchStrength = 6 // nextEmit is where in src the next emitLiteral should start from. nextEmit := s diff --git a/vendor/github.com/prometheus/procfs/Makefile b/vendor/github.com/prometheus/procfs/Makefile index 616a0d25eb..fa2bd5b528 100644 --- a/vendor/github.com/prometheus/procfs/Makefile +++ b/vendor/github.com/prometheus/procfs/Makefile @@ -18,6 +18,8 @@ include Makefile.common ./ttar -C $(dir $*) -x -f $*.ttar touch $@ +fixtures: fixtures/.unpacked + update_fixtures: rm -vf fixtures/.unpacked ./ttar -c -f fixtures.ttar fixtures/ diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common index 3ac29c636c..a1b1ca40f4 100644 --- a/vendor/github.com/prometheus/procfs/Makefile.common +++ b/vendor/github.com/prometheus/procfs/Makefile.common @@ -78,12 +78,12 @@ ifneq ($(shell which gotestsum),) endif endif -PROMU_VERSION ?= 0.7.0 +PROMU_VERSION ?= 0.12.0 PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.18.0 +GOLANGCI_LINT_VERSION ?= v1.39.0 # golangci-lint only supports linux, darwin and windows platforms on i386/amd64. # windows isn't included here because of the path separator being different. ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) @@ -118,7 +118,7 @@ endif %: common-% ; .PHONY: common-all -common-all: precheck style check_license lint unused build test +common-all: precheck style check_license lint yamllint unused build test .PHONY: common-style common-style: @@ -198,6 +198,15 @@ else endif endif +.PHONY: common-yamllint +common-yamllint: + @echo ">> running yamllint on all YAML files in the repository" +ifeq (, $(shell which yamllint)) + @echo "yamllint not installed so skipping" +else + yamllint . +endif + # For backward-compatibility. .PHONY: common-staticcheck common-staticcheck: lint diff --git a/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/prometheus/procfs/README.md index 55d1e3261c..43c37735a7 100644 --- a/vendor/github.com/prometheus/procfs/README.md +++ b/vendor/github.com/prometheus/procfs/README.md @@ -6,8 +6,8 @@ metrics from the pseudo-filesystems /proc and /sys. *WARNING*: This package is a work in progress. Its API may still break in backwards-incompatible ways without warnings. Use it at your own risk. -[![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) -[![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) +[![Go Reference](https://pkg.go.dev/badge/github.com/prometheus/procfs.svg)](https://pkg.go.dev/github.com/prometheus/procfs) +[![CircleCI](https://circleci.com/gh/prometheus/procfs/tree/master.svg?style=svg)](https://circleci.com/gh/prometheus/procfs/tree/master) [![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) ## Usage diff --git a/vendor/github.com/prometheus/procfs/cmdline.go b/vendor/github.com/prometheus/procfs/cmdline.go new file mode 100644 index 0000000000..bf4f3b48c0 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/cmdline.go @@ -0,0 +1,30 @@ +// Copyright 2021 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// CmdLine returns the command line of the kernel. +func (fs FS) CmdLine() ([]string, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("cmdline")) + if err != nil { + return nil, err + } + + return strings.Fields(string(data)), nil +} diff --git a/vendor/github.com/prometheus/procfs/doc.go b/vendor/github.com/prometheus/procfs/doc.go index e2acd6d40a..d31a82600f 100644 --- a/vendor/github.com/prometheus/procfs/doc.go +++ b/vendor/github.com/prometheus/procfs/doc.go @@ -31,7 +31,7 @@ // log.Fatalf("could not get process: %s", err) // } // -// stat, err := p.NewStat() +// stat, err := p.Stat() // if err != nil { // log.Fatalf("could not get process stat: %s", err) // } diff --git a/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/prometheus/procfs/fixtures.ttar index 1e76173da0..5e7eeef4a5 100644 --- a/vendor/github.com/prometheus/procfs/fixtures.ttar +++ b/vendor/github.com/prometheus/procfs/fixtures.ttar @@ -644,6 +644,11 @@ Node 0, zone DMA32 759 572 791 475 194 45 12 0 Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/cmdline +Lines: 1 +BOOT_IMAGE=/vmlinuz-5.11.0-22-generic root=UUID=456a0345-450d-4f7b-b7c9-43e3241d99ad ro quiet splash vt.handoff=7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/cpuinfo Lines: 216 processor : 0 @@ -2204,6 +2209,23 @@ Lines: 1 00015c73 00020e76 F0000769 00000000 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/net/stat +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/stat/arp_cache +Lines: 3 +entries allocs destroys hash_grows lookups hits res_failed rcv_probes_mcast rcv_probes_ucast periodic_gc_runs forced_gc_runs unresolved_discards table_fulls +00000014 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000a 0000000b 0000000c +00000014 0000000d 0000000e 0000000f 00000010 00000011 00000012 00000013 00000014 00000015 00000016 00000017 00000018 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/stat/ndisc_cache +Lines: 3 +entries allocs destroys hash_grows lookups hits res_failed rcv_probes_mcast rcv_probes_ucast periodic_gc_runs forced_gc_runs unresolved_discards table_fulls +00000024 000000f0 000000f1 000000f2 000000f3 000000f4 000000f5 000000f6 000000f7 000000f8 000000f9 000000fa 000000fb +00000024 000000fc 000000fd 000000fe 000000ff 00000100 00000101 00000102 00000103 00000104 00000105 00000106 00000107 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/net/tcp Lines: 4 sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode @@ -3455,6 +3477,460 @@ Mode: 664 Directory: fixtures/sys/class Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/drm +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/drm/card0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/drm/card0/device +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/aer_dev_correctable +Lines: 9 +RxErr 0 +BadTLP 0 +BadDLLP 0 +Rollover 0 +Timeout 0 +NonFatalErr 0 +CorrIntErr 0 +HeaderOF 0 +TOTAL_ERR_COR 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/aer_dev_fatal +Lines: 19 +Undefined 0 +DLP 0 +SDES 0 +TLP 0 +FCP 0 +CmpltTO 0 +CmpltAbrt 0 +UnxCmplt 0 +RxOF 0 +MalfTLP 0 +ECRC 0 +UnsupReq 0 +ACSViol 0 +UncorrIntErr 0 +BlockedTLP 0 +AtomicOpBlocked 0 +TLPBlockedErr 0 +PoisonTLPBlocked 0 +TOTAL_ERR_FATAL 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/aer_dev_nonfatal +Lines: 19 +Undefined 0 +DLP 0 +SDES 0 +TLP 0 +FCP 0 +CmpltTO 0 +CmpltAbrt 0 +UnxCmplt 0 +RxOF 0 +MalfTLP 0 +ECRC 0 +UnsupReq 0 +ACSViol 0 +UncorrIntErr 0 +BlockedTLP 0 +AtomicOpBlocked 0 +TLPBlockedErr 0 +PoisonTLPBlocked 0 +TOTAL_ERR_NONFATAL 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/ari_enabled +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/boot_vga +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/broken_parity_status +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/class +Lines: 1 +0x030000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/consistent_dma_mask_bits +Lines: 1 +44 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/current_link_speed +Lines: 1 +8.0 GT/s PCIe +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/current_link_width +Lines: 1 +16 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/d3cold_allowed +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/device +Lines: 1 +0x687f +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/dma_mask_bits +Lines: 1 +44 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/driver_override +Lines: 1 +(null) +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/gpu_busy_percent +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/irq +Lines: 1 +95 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/local_cpulist +Lines: 1 +0-15 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/local_cpus +Lines: 1 +0000ffff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/max_link_speed +Lines: 1 +8.0 GT/s PCIe +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/max_link_width +Lines: 1 +16 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/mem_info_gtt_total +Lines: 1 +8573157376 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/mem_info_gtt_used +Lines: 1 +144560128 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/mem_info_vis_vram_total +Lines: 1 +8573157376 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/mem_info_vis_vram_used +Lines: 1 +1490378752 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/mem_info_vram_total +Lines: 1 +8573157376 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/mem_info_vram_used +Lines: 1 +1490378752 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/mem_info_vram_vendor +Lines: 1 +samsung +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/modalias +Lines: 1 +pci:v00001002d0000687Fsv00001043sd000004C4bc03sc00i00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/msi_bus +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/numa_node +Lines: 1 +-1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pcie_bw +Lines: 1 +6641 815 256 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pcie_replay_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/power_dpm_force_performance_level +Lines: 1 +manual +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/power_dpm_state +Lines: 1 +performance +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/power_state +Lines: 1 +D0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_cur_state +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_dpm_dcefclk +Lines: 5 +0: 600Mhz * +1: 720Mhz +2: 800Mhz +3: 847Mhz +4: 900Mhz +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_dpm_mclk +Lines: 4 +0: 167Mhz * +1: 500Mhz +2: 800Mhz +3: 945Mhz +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_dpm_pcie +Lines: 2 +0: 8.0GT/s, x16 +1: 8.0GT/s, x16 * +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_dpm_sclk +Lines: 8 +0: 852Mhz * +1: 991Mhz +2: 1084Mhz +3: 1138Mhz +4: 1200Mhz +5: 1401Mhz +6: 1536Mhz +7: 1630Mhz +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_dpm_socclk +Lines: 8 +0: 600Mhz +1: 720Mhz * +2: 800Mhz +3: 847Mhz +4: 900Mhz +5: 960Mhz +6: 1028Mhz +7: 1107Mhz +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_features +Lines: 32 +Current ppfeatures: 0x0000000019a1ff4f +FEATURES BITMASK ENABLEMENT +DPM_PREFETCHER 0x0000000000000001 Y +GFXCLK_DPM 0x0000000000000002 Y +UCLK_DPM 0x0000000000000004 Y +SOCCLK_DPM 0x0000000000000008 Y +UVD_DPM 0x0000000000000010 N +VCE_DPM 0x0000000000000020 N +ULV 0x0000000000000040 Y +MP0CLK_DPM 0x0000000000000080 N +LINK_DPM 0x0000000000000100 Y +DCEFCLK_DPM 0x0000000000000200 Y +AVFS 0x0000000000000400 Y +GFXCLK_DS 0x0000000000000800 Y +SOCCLK_DS 0x0000000000001000 Y +LCLK_DS 0x0000000000002000 Y +PPT 0x0000000000004000 Y +TDC 0x0000000000008000 Y +THERMAL 0x0000000000010000 Y +GFX_PER_CU_CG 0x0000000000020000 N +RM 0x0000000000040000 N +DCEFCLK_DS 0x0000000000080000 N +ACDC 0x0000000000100000 N +VR0HOT 0x0000000000200000 Y +VR1HOT 0x0000000000400000 N +FW_CTF 0x0000000000800000 Y +LED_DISPLAY 0x0000000001000000 Y +FAN_CONTROL 0x0000000002000000 N +FAST_PPT 0x0000000004000000 N +DIDT 0x0000000008000000 Y +ACG 0x0000000010000000 Y +PCC_LIMIT 0x0000000020000000 N +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_force_state +Lines: 1 + +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_mclk_od +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_num_states +Lines: 3 +states: 2 +0 boot +1 performance +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_od_clk_voltage +Lines: 18 +OD_SCLK: +0: 852Mhz 800mV +1: 991Mhz 900mV +2: 1084Mhz 950mV +3: 1138Mhz 1000mV +4: 1200Mhz 1050mV +5: 1401Mhz 1100mV +6: 1536Mhz 1150mV +7: 1630Mhz 1200mV +OD_MCLK: +0: 167Mhz 800mV +1: 500Mhz 800mV +2: 800Mhz 950mV +3: 945Mhz 1100mV +OD_RANGE: +SCLK: 852MHz 2400MHz +MCLK: 167MHz 1500MHz +VDDC: 800mV 1200mV +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_power_profile_mode +Lines: 8 +NUM MODE_NAME BUSY_SET_POINT FPS USE_RLC_BUSY MIN_ACTIVE_LEVEL + 0 BOOTUP_DEFAULT : 70 60 0 0 + 1 3D_FULL_SCREEN*: 70 60 1 3 + 2 POWER_SAVING : 90 60 0 0 + 3 VIDEO : 70 60 0 0 + 4 VR : 70 90 0 0 + 5 COMPUTE : 30 60 0 6 + 6 CUSTOM : 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/pp_sclk_od +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/product_name +Lines: 1 + +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/product_number +Lines: 1 + +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/resource +Lines: 13 +0x0000007c00000000 0x0000007dffffffff 0x000000000014220c +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000007e00000000 0x0000007e0fffffff 0x000000000014220c +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x000000000000d000 0x000000000000d0ff 0x0000000000040101 +0x00000000fcd00000 0x00000000fcd7ffff 0x0000000000040200 +0x00000000fcd80000 0x00000000fcd9ffff 0x0000000000046200 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/revision +Lines: 1 +0xc1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/serial_number +Lines: 1 + +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/subsystem_device +Lines: 1 +0x04c4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/subsystem_vendor +Lines: 1 +0x1043 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/thermal_throttling_logging +Lines: 1 +0000:09:00.0: thermal throttling logging enabled, with interval 60 seconds +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/uevent +Lines: 6 +DRIVER=amdgpu +PCI_CLASS=30000 +PCI_ID=1002:687F +PCI_SUBSYS_ID=1043:04C4 +PCI_SLOT_NAME=0000:09:00.0 +MODALIAS=pci:v00001002d0000687Fsv00001043sd000004C4bc03sc00i00 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/unique_id +Lines: 1 +0123456789abcdef +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/vbios_version +Lines: 1 +115-D050PIL-100 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/vendor +Lines: 1 +0x1002 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/fc_host Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3592,140 +4068,262 @@ Mode: 644 Directory: fixtures/sys/class/infiniband Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0 +Directory: fixtures/sys/class/infiniband/hfi1_0 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/board_id -Lines: 1 -SM_1141000001000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/fw_ver +Path: fixtures/sys/class/infiniband/hfi1_0/board_id Lines: 1 -2.31.5050 +HPE 100Gb 1-port OP101 QSFP28 x16 PCIe Gen3 with Intel Omni-Path Adapter Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/hca_type +Path: fixtures/sys/class/infiniband/hfi1_0/fw_ver Lines: 1 -MT4099 +1.27.0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports +Directory: fixtures/sys/class/infiniband/hfi1_0/ports Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1 +Directory: fixtures/sys/class/infiniband/hfi1_0/ports/1 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters +Directory: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/VL15_dropped +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/VL15_dropped Lines: 1 0 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/excessive_buffer_overrun_errors +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/excessive_buffer_overrun_errors Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_downed +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/link_downed Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_error_recovery +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/link_error_recovery Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/local_link_integrity_errors +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/local_link_integrity_errors Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_constraint_errors +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_constraint_errors Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_data +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_data Lines: 1 -2221223609 +345091702026 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_errors +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_errors Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_packets +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_packets Lines: 1 -87169372 +638036947 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_remote_physical_errors +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_remote_physical_errors Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_switch_relay_errors +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_switch_relay_errors Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_constraint_errors +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_constraint_errors Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_data +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_data Lines: 1 -26509113295 +273558326543 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_discards +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_discards Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_packets +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_packets Lines: 1 -85734114 +568318856 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_wait +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_wait Lines: 1 -3599 +0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/symbol_error +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/symbol_error Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/phys_state +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/phys_state Lines: 1 5: LinkUp Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/rate +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/rate Lines: 1 -40 Gb/sec (4X QDR) +100 Gb/sec (4X EDR) Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/state +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/state Lines: 1 4: ACTIVE Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2 +Directory: fixtures/sys/class/infiniband/mlx4_0 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters -Mode: 755 +Path: fixtures/sys/class/infiniband/mlx4_0/board_id +Lines: 1 +SM_1141000001000 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/VL15_dropped +Path: fixtures/sys/class/infiniband/mlx4_0/fw_ver +Lines: 1 +2.31.5050 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/hca_type +Lines: 1 +MT4099 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/VL15_dropped +Lines: 1 +0 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/excessive_buffer_overrun_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_downed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_error_recovery +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/local_link_integrity_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_data +Lines: 1 +2221223609 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_packets +Lines: 1 +87169372 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_remote_physical_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_switch_relay_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_data +Lines: 1 +26509113295 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_discards +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_packets +Lines: 1 +85734114 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_wait +Lines: 1 +3599 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/symbol_error +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/phys_state +Lines: 1 +5: LinkUp +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/rate +Lines: 1 +40 Gb/sec (4X QDR) +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/state +Lines: 1 +4: ACTIVE +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/VL15_dropped Lines: 1 0 Mode: 664 @@ -3960,6 +4558,32 @@ Lines: 1 1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/nvme +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/nvme/nvme0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/nvme/nvme0/firmware_rev +Lines: 1 +1B2QEXP7 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/nvme/nvme0/model +Lines: 1 +Samsung SSD 970 PRO 512GB +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/nvme/nvme0/serial +Lines: 1 +S680HF8N190894I +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/nvme/nvme0/state +Lines: 1 +live +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/power_supply Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -4164,6 +4788,33 @@ Path: fixtures/sys/class/powercap/intel-rapl:a/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/scsi_tape +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/scsi_tape/nst0 +SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/scsi_tape/nst0a +SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/scsi_tape/nst0l +SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/scsi_tape/nst0m +SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/scsi_tape/st0 +SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/scsi_tape/st0a +SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/scsi_tape/st0l +SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/scsi_tape/st0m +SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/thermal Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -4575,6 +5226,475 @@ Mode: 444 Directory: fixtures/sys/devices/pci0000:00 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/in_flight +Lines: 1 +1EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/io_ns +Lines: 1 +9247011087720EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/other_cnt +Lines: 1 +1409EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/read_byte_cnt +Lines: 1 +979383912EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/read_cnt +Lines: 1 +3741EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/read_ns +Lines: 1 +33788355744EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/resid_cnt +Lines: 1 +19EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/write_byte_cnt +Lines: 1 +1496246784000EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/write_cnt +Lines: 1 +53772916EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/write_ns +Lines: 1 +5233597394395EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/in_flight +Lines: 1 +1EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/io_ns +Lines: 1 +9247011087720EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/other_cnt +Lines: 1 +1409EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/read_byte_cnt +Lines: 1 +979383912EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/read_cnt +Lines: 1 +3741EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/read_ns +Lines: 1 +33788355744EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/resid_cnt +Lines: 1 +19EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/write_byte_cnt +Lines: 1 +1496246784000EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/write_cnt +Lines: 1 +53772916EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/write_ns +Lines: 1 +5233597394395EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/in_flight +Lines: 1 +1EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/io_ns +Lines: 1 +9247011087720EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/other_cnt +Lines: 1 +1409EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/read_byte_cnt +Lines: 1 +979383912EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/read_cnt +Lines: 1 +3741EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/read_ns +Lines: 1 +33788355744EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/resid_cnt +Lines: 1 +19EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/write_byte_cnt +Lines: 1 +1496246784000EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/write_cnt +Lines: 1 +53772916EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/write_ns +Lines: 1 +5233597394395EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/in_flight +Lines: 1 +1EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/io_ns +Lines: 1 +9247011087720EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/other_cnt +Lines: 1 +1409EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/read_byte_cnt +Lines: 1 +979383912EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/read_cnt +Lines: 1 +3741EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/read_ns +Lines: 1 +33788355744EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/resid_cnt +Lines: 1 +19EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/write_byte_cnt +Lines: 1 +1496246784000EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/write_cnt +Lines: 1 +53772916EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/write_ns +Lines: 1 +5233597394395EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/in_flight +Lines: 1 +1EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/io_ns +Lines: 1 +9247011087720EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/other_cnt +Lines: 1 +1409EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/read_byte_cnt +Lines: 1 +979383912EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/read_cnt +Lines: 1 +3741EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/read_ns +Lines: 1 +33788355744EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/resid_cnt +Lines: 1 +19EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/write_byte_cnt +Lines: 1 +1496246784000EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/write_cnt +Lines: 1 +53772916EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/write_ns +Lines: 1 +5233597394395EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/in_flight +Lines: 1 +1EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/io_ns +Lines: 1 +9247011087720EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/other_cnt +Lines: 1 +1409EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/read_byte_cnt +Lines: 1 +979383912EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/read_cnt +Lines: 1 +3741EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/read_ns +Lines: 1 +33788355744EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/resid_cnt +Lines: 1 +19EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/write_byte_cnt +Lines: 1 +1496246784000EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/write_cnt +Lines: 1 +53772916EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/write_ns +Lines: 1 +5233597394395EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/in_flight +Lines: 1 +1EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/io_ns +Lines: 1 +9247011087720EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/other_cnt +Lines: 1 +1409EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/read_byte_cnt +Lines: 1 +979383912EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/read_cnt +Lines: 1 +3741EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/read_ns +Lines: 1 +33788355744EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/resid_cnt +Lines: 1 +19EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/write_byte_cnt +Lines: 1 +1496246784000EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/write_cnt +Lines: 1 +53772916EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/write_ns +Lines: 1 +5233597394395EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/in_flight +Lines: 1 +1EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/io_ns +Lines: 1 +9247011087720EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/other_cnt +Lines: 1 +1409EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/read_byte_cnt +Lines: 1 +979383912EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/read_cnt +Lines: 1 +3741EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/read_ns +Lines: 1 +33788355744EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/resid_cnt +Lines: 1 +19EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/write_byte_cnt +Lines: 1 +1496246784000EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/write_cnt +Lines: 1 +53772916EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/write_ns +Lines: 1 +5233597394395EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -4978,35 +6098,6 @@ Mode: 644 Directory: fixtures/sys/devices/system Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/node -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/node/node1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/node/node1/vmstat -Lines: 6 -nr_free_pages 1 -nr_zone_inactive_anon 2 -nr_zone_active_anon 3 -nr_zone_inactive_file 4 -nr_zone_active_file 5 -nr_zone_unevictable 6 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/node/node2 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/node/node2/vmstat -Lines: 6 -nr_free_pages 7 -nr_zone_inactive_anon 8 -nr_zone_active_anon 9 -nr_zone_inactive_file 10 -nr_zone_active_file 11 -nr_zone_unevictable 12 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/devices/system/clocksource Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5254,6 +6345,35 @@ Mode: 644 Directory: fixtures/sys/devices/system/cpu/cpufreq/policy1 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/node +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/node/node1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/node/node1/vmstat +Lines: 6 +nr_free_pages 1 +nr_zone_inactive_anon 2 +nr_zone_active_anon 3 +nr_zone_inactive_file 4 +nr_zone_active_file 5 +nr_zone_unevictable 6 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/node/node2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/node/node2/vmstat +Lines: 6 +nr_free_pages 7 +nr_zone_inactive_anon 8 +nr_zone_active_anon 9 +nr_zone_inactive_file 10 +nr_zone_active_file 11 +nr_zone_unevictable 12 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/fs Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/prometheus/procfs/mdstat.go index 4c4493bfa5..f0b9e5f75a 100644 --- a/vendor/github.com/prometheus/procfs/mdstat.go +++ b/vendor/github.com/prometheus/procfs/mdstat.go @@ -22,9 +22,12 @@ import ( ) var ( - statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) - recoveryLineRE = regexp.MustCompile(`\((\d+)/\d+\)`) - componentDeviceRE = regexp.MustCompile(`(.*)\[\d+\]`) + statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[([U_]+)\]`) + recoveryLineBlocksRE = regexp.MustCompile(`\((\d+)/\d+\)`) + recoveryLinePctRE = regexp.MustCompile(`= (.+)%`) + recoveryLineFinishRE = regexp.MustCompile(`finish=(.+)min`) + recoveryLineSpeedRE = regexp.MustCompile(`speed=(.+)[A-Z]`) + componentDeviceRE = regexp.MustCompile(`(.*)\[\d+\]`) ) // MDStat holds info parsed from /proc/mdstat. @@ -39,12 +42,20 @@ type MDStat struct { DisksTotal int64 // Number of failed disks. DisksFailed int64 + // Number of "down" disks. (the _ indicator in the status line) + DisksDown int64 // Spare disks in the device. DisksSpare int64 // Number of blocks the device holds. BlocksTotal int64 // Number of blocks on the device that are in sync. BlocksSynced int64 + // progress percentage of current sync + BlocksSyncedPct float64 + // estimated finishing time for current sync (in minutes) + BlocksSyncedFinishTime float64 + // current sync speed (in Kilobytes/sec) + BlocksSyncedSpeed float64 // Name of md component devices Devices []string } @@ -91,7 +102,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { // Failed disks have the suffix (F) & Spare disks have the suffix (S). fail := int64(strings.Count(line, "(F)")) spare := int64(strings.Count(line, "(S)")) - active, total, size, err := evalStatusLine(lines[i], lines[i+1]) + active, total, down, size, err := evalStatusLine(lines[i], lines[i+1]) if err != nil { return nil, fmt.Errorf("error parsing md device lines: %w", err) @@ -105,6 +116,9 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { // If device is syncing at the moment, get the number of currently // synced bytes, otherwise that number equals the size of the device. syncedBlocks := size + speed := float64(0) + finish := float64(0) + pct := float64(0) recovering := strings.Contains(lines[syncLineIdx], "recovery") resyncing := strings.Contains(lines[syncLineIdx], "resync") checking := strings.Contains(lines[syncLineIdx], "check") @@ -124,7 +138,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { strings.Contains(lines[syncLineIdx], "DELAYED") { syncedBlocks = 0 } else { - syncedBlocks, err = evalRecoveryLine(lines[syncLineIdx]) + syncedBlocks, pct, finish, speed, err = evalRecoveryLine(lines[syncLineIdx]) if err != nil { return nil, fmt.Errorf("error parsing sync line in md device %q: %w", mdName, err) } @@ -132,69 +146,104 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { } mdStats = append(mdStats, MDStat{ - Name: mdName, - ActivityState: state, - DisksActive: active, - DisksFailed: fail, - DisksSpare: spare, - DisksTotal: total, - BlocksTotal: size, - BlocksSynced: syncedBlocks, - Devices: evalComponentDevices(deviceFields), + Name: mdName, + ActivityState: state, + DisksActive: active, + DisksFailed: fail, + DisksDown: down, + DisksSpare: spare, + DisksTotal: total, + BlocksTotal: size, + BlocksSynced: syncedBlocks, + BlocksSyncedPct: pct, + BlocksSyncedFinishTime: finish, + BlocksSyncedSpeed: speed, + Devices: evalComponentDevices(deviceFields), }) } return mdStats, nil } -func evalStatusLine(deviceLine, statusLine string) (active, total, size int64, err error) { +func evalStatusLine(deviceLine, statusLine string) (active, total, down, size int64, err error) { sizeStr := strings.Fields(statusLine)[0] size, err = strconv.ParseInt(sizeStr, 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) + return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) } if strings.Contains(deviceLine, "raid0") || strings.Contains(deviceLine, "linear") { // In the device deviceLine, only disks have a number associated with them in []. total = int64(strings.Count(deviceLine, "[")) - return total, total, size, nil + return total, total, 0, size, nil } if strings.Contains(deviceLine, "inactive") { - return 0, 0, size, nil + return 0, 0, 0, size, nil } matches := statusLineRE.FindStringSubmatch(statusLine) - if len(matches) != 4 { - return 0, 0, 0, fmt.Errorf("couldn't find all the substring matches: %s", statusLine) + if len(matches) != 5 { + return 0, 0, 0, 0, fmt.Errorf("couldn't find all the substring matches: %s", statusLine) } total, err = strconv.ParseInt(matches[2], 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) + return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) } active, err = strconv.ParseInt(matches[3], 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) + return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) } + down = int64(strings.Count(matches[4], "_")) - return active, total, size, nil + return active, total, down, size, nil } -func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, err error) { - matches := recoveryLineRE.FindStringSubmatch(recoveryLine) +func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, pct float64, finish float64, speed float64, err error) { + matches := recoveryLineBlocksRE.FindStringSubmatch(recoveryLine) if len(matches) != 2 { - return 0, fmt.Errorf("unexpected recoveryLine: %s", recoveryLine) + return 0, 0, 0, 0, fmt.Errorf("unexpected recoveryLine: %s", recoveryLine) } syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) if err != nil { - return 0, fmt.Errorf("error parsing int from recoveryLine %q: %w", recoveryLine, err) + return 0, 0, 0, 0, fmt.Errorf("error parsing int from recoveryLine %q: %w", recoveryLine, err) } - return syncedBlocks, nil + // Get percentage complete + matches = recoveryLinePctRE.FindStringSubmatch(recoveryLine) + if len(matches) != 2 { + return syncedBlocks, 0, 0, 0, fmt.Errorf("unexpected recoveryLine matching percentage: %s", recoveryLine) + } + pct, err = strconv.ParseFloat(strings.TrimSpace(matches[1]), 64) + if err != nil { + return syncedBlocks, 0, 0, 0, fmt.Errorf("error parsing float from recoveryLine %q: %w", recoveryLine, err) + } + + // Get time expected left to complete + matches = recoveryLineFinishRE.FindStringSubmatch(recoveryLine) + if len(matches) != 2 { + return syncedBlocks, pct, 0, 0, fmt.Errorf("unexpected recoveryLine matching est. finish time: %s", recoveryLine) + } + finish, err = strconv.ParseFloat(matches[1], 64) + if err != nil { + return syncedBlocks, pct, 0, 0, fmt.Errorf("error parsing float from recoveryLine %q: %w", recoveryLine, err) + } + + // Get recovery speed + matches = recoveryLineSpeedRE.FindStringSubmatch(recoveryLine) + if len(matches) != 2 { + return syncedBlocks, pct, finish, 0, fmt.Errorf("unexpected recoveryLine matching speed: %s", recoveryLine) + } + speed, err = strconv.ParseFloat(matches[1], 64) + if err != nil { + return syncedBlocks, pct, finish, 0, fmt.Errorf("error parsing float from recoveryLine %q: %w", recoveryLine, err) + } + + return syncedBlocks, pct, finish, speed, nil } func evalComponentDevices(deviceFields []string) []string { diff --git a/vendor/github.com/prometheus/procfs/net_ip_socket.go b/vendor/github.com/prometheus/procfs/net_ip_socket.go index ac01dd8475..8c9ee3de87 100644 --- a/vendor/github.com/prometheus/procfs/net_ip_socket.go +++ b/vendor/github.com/prometheus/procfs/net_ip_socket.go @@ -65,6 +65,7 @@ type ( TxQueue uint64 RxQueue uint64 UID uint64 + Inode uint64 } ) @@ -150,9 +151,9 @@ func parseIP(hexIP string) (net.IP, error) { // parseNetIPSocketLine parses a single line, represented by a list of fields. func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) { line := &netIPSocketLine{} - if len(fields) < 8 { + if len(fields) < 10 { return nil, fmt.Errorf( - "cannot parse net socket line as it has less then 8 columns %q", + "cannot parse net socket line as it has less then 10 columns %q", strings.Join(fields, " "), ) } @@ -216,5 +217,10 @@ func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) { return nil, fmt.Errorf("cannot parse uid value in socket line: %w", err) } + // inode + if line.Inode, err = strconv.ParseUint(fields[9], 0, 64); err != nil { + return nil, fmt.Errorf("cannot parse inode value in socket line: %w", err) + } + return line, nil } diff --git a/vendor/github.com/prometheus/procfs/netstat.go b/vendor/github.com/prometheus/procfs/netstat.go new file mode 100644 index 0000000000..94d892f113 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/netstat.go @@ -0,0 +1,68 @@ +// Copyright 2020 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "os" + "path/filepath" + "strconv" + "strings" +) + +// NetStat contains statistics for all the counters from one file +type NetStat struct { + Filename string + Stats map[string][]uint64 +} + +// NetStat retrieves stats from /proc/net/stat/ +func (fs FS) NetStat() ([]NetStat, error) { + statFiles, err := filepath.Glob(fs.proc.Path("net/stat/*")) + if err != nil { + return nil, err + } + + var netStatsTotal []NetStat + + for _, filePath := range statFiles { + file, err := os.Open(filePath) + if err != nil { + return nil, err + } + + netStatFile := NetStat{ + Filename: filepath.Base(filePath), + Stats: make(map[string][]uint64), + } + scanner := bufio.NewScanner(file) + scanner.Scan() + // First string is always a header for stats + var headers []string + headers = append(headers, strings.Fields(scanner.Text())...) + + // Other strings represent per-CPU counters + for scanner.Scan() { + for num, counter := range strings.Fields(scanner.Text()) { + value, err := strconv.ParseUint(counter, 16, 32) + if err != nil { + return nil, err + } + netStatFile.Stats[headers[num]] = append(netStatFile.Stats[headers[num]], value) + } + } + netStatsTotal = append(netStatsTotal, netStatFile) + } + return netStatsTotal, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_cgroup.go b/vendor/github.com/prometheus/procfs/proc_cgroup.go index 0094a13c05..be45b79873 100644 --- a/vendor/github.com/prometheus/procfs/proc_cgroup.go +++ b/vendor/github.com/prometheus/procfs/proc_cgroup.go @@ -90,7 +90,7 @@ func parseCgroups(data []byte) ([]Cgroup, error) { // control hierarchy running on this system. On every system (v1 and v2), all hierarchies contain all processes, // so the len of the returned struct is equal to the number of active hierarchies on this system func (p Proc) Cgroups() ([]Cgroup, error) { - data, err := util.ReadFileNoStat(fmt.Sprintf("/proc/%d/cgroup", p.PID)) + data, err := util.ReadFileNoStat(p.path("cgroup")) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go index 67ca0e9fbc..8c7b6e80a3 100644 --- a/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -100,6 +100,15 @@ type ProcStat struct { VSize uint // Resident set size in pages. RSS int + // Soft limit in bytes on the rss of the process. + RSSLimit uint64 + // Real-time scheduling priority, a number in the range 1 to 99 for processes + // scheduled under a real-time policy, or 0, for non-real-time processes. + RTPriority uint + // Scheduling policy. + Policy uint + // Aggregated block I/O delays, measured in clock ticks (centiseconds). + DelayAcctBlkIOTicks uint64 proc fs.FS } @@ -119,7 +128,8 @@ func (p Proc) Stat() (ProcStat, error) { } var ( - ignore int + ignoreInt64 int64 + ignoreUint64 uint64 s = ProcStat{PID: p.PID, proc: p.fs} l = bytes.Index(data, []byte("(")) @@ -151,10 +161,28 @@ func (p Proc) Stat() (ProcStat, error) { &s.Priority, &s.Nice, &s.NumThreads, - &ignore, + &ignoreInt64, &s.Starttime, &s.VSize, &s.RSS, + &s.RSSLimit, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreUint64, + &ignoreInt64, + &ignoreInt64, + &s.RTPriority, + &s.Policy, + &s.DelayAcctBlkIOTicks, ) if err != nil { return ProcStat{}, err diff --git a/vendor/github.com/prometheus/procfs/zoneinfo.go b/vendor/github.com/prometheus/procfs/zoneinfo.go index 0b9bb6796b..209e2ac987 100644 --- a/vendor/github.com/prometheus/procfs/zoneinfo.go +++ b/vendor/github.com/prometheus/procfs/zoneinfo.go @@ -99,7 +99,6 @@ func parseZoneinfo(zoneinfoData []byte) ([]Zoneinfo, error) { continue } if strings.HasPrefix(strings.TrimSpace(line), "per-node stats") { - zoneinfoElement.Zone = "" continue } parts := strings.Fields(strings.TrimSpace(line)) diff --git a/vendor/github.com/sergi/go-diff/AUTHORS b/vendor/github.com/sergi/go-diff/AUTHORS new file mode 100644 index 0000000000..2d7bb2bf57 --- /dev/null +++ b/vendor/github.com/sergi/go-diff/AUTHORS @@ -0,0 +1,25 @@ +# This is the official list of go-diff authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. + +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# Please keep the list sorted. + +Danny Yoo +James Kolb +Jonathan Amsterdam +Markus Zimmermann +Matt Kovars +Örjan Persson +Osman Masood +Robert Carlsen +Rory Flynn +Sergi Mansilla +Shatrugna Sadhu +Shawn Smith +Stas Maksimov +Tor Arvid Lund +Zac Bergquist diff --git a/vendor/github.com/sergi/go-diff/CONTRIBUTORS b/vendor/github.com/sergi/go-diff/CONTRIBUTORS new file mode 100644 index 0000000000..369e3d5519 --- /dev/null +++ b/vendor/github.com/sergi/go-diff/CONTRIBUTORS @@ -0,0 +1,32 @@ +# This is the official list of people who can contribute +# (and typically have contributed) code to the go-diff +# repository. +# +# The AUTHORS file lists the copyright holders; this file +# lists people. For example, ACME Inc. employees would be listed here +# but not in AUTHORS, because ACME Inc. would hold the copyright. +# +# When adding J Random Contributor's name to this file, +# either J's name or J's organization's name should be +# added to the AUTHORS file. +# +# Names should be added to this file like so: +# Name +# +# Please keep the list sorted. + +Danny Yoo +James Kolb +Jonathan Amsterdam +Markus Zimmermann +Matt Kovars +Örjan Persson +Osman Masood +Robert Carlsen +Rory Flynn +Sergi Mansilla +Shatrugna Sadhu +Shawn Smith +Stas Maksimov +Tor Arvid Lund +Zac Bergquist diff --git a/vendor/github.com/sergi/go-diff/LICENSE b/vendor/github.com/sergi/go-diff/LICENSE new file mode 100644 index 0000000000..937942c2b2 --- /dev/null +++ b/vendor/github.com/sergi/go-diff/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-2016 The go-diff Authors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go new file mode 100644 index 0000000000..2a9f2dc3b9 --- /dev/null +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go @@ -0,0 +1,1352 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +package diffmatchpatch + +import ( + "bytes" + "errors" + "fmt" + "html" + "math" + "net/url" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +// Operation defines the operation of a diff item. +type Operation int8 + +//go:generate stringer -type=Operation -trimprefix=Diff + +const ( + // DiffDelete item represents a delete diff. + DiffDelete Operation = -1 + // DiffInsert item represents an insert diff. + DiffInsert Operation = 1 + // DiffEqual item represents an equal diff. + DiffEqual Operation = 0 + //IndexSeparator is used to seperate the array indexes in an index string + IndexSeparator = "," +) + +// Diff represents one diff operation +type Diff struct { + Type Operation + Text string +} + +// splice removes amount elements from slice at index index, replacing them with elements. +func splice(slice []Diff, index int, amount int, elements ...Diff) []Diff { + if len(elements) == amount { + // Easy case: overwrite the relevant items. + copy(slice[index:], elements) + return slice + } + if len(elements) < amount { + // Fewer new items than old. + // Copy in the new items. + copy(slice[index:], elements) + // Shift the remaining items left. + copy(slice[index+len(elements):], slice[index+amount:]) + // Calculate the new end of the slice. + end := len(slice) - amount + len(elements) + // Zero stranded elements at end so that they can be garbage collected. + tail := slice[end:] + for i := range tail { + tail[i] = Diff{} + } + return slice[:end] + } + // More new items than old. + // Make room in slice for new elements. + // There's probably an even more efficient way to do this, + // but this is simple and clear. + need := len(slice) - amount + len(elements) + for len(slice) < need { + slice = append(slice, Diff{}) + } + // Shift slice elements right to make room for new elements. + copy(slice[index+len(elements):], slice[index+amount:]) + // Copy in new elements. + copy(slice[index:], elements) + return slice +} + +// DiffMain finds the differences between two texts. +// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. +func (dmp *DiffMatchPatch) DiffMain(text1, text2 string, checklines bool) []Diff { + return dmp.DiffMainRunes([]rune(text1), []rune(text2), checklines) +} + +// DiffMainRunes finds the differences between two rune sequences. +// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. +func (dmp *DiffMatchPatch) DiffMainRunes(text1, text2 []rune, checklines bool) []Diff { + var deadline time.Time + if dmp.DiffTimeout > 0 { + deadline = time.Now().Add(dmp.DiffTimeout) + } + return dmp.diffMainRunes(text1, text2, checklines, deadline) +} + +func (dmp *DiffMatchPatch) diffMainRunes(text1, text2 []rune, checklines bool, deadline time.Time) []Diff { + if runesEqual(text1, text2) { + var diffs []Diff + if len(text1) > 0 { + diffs = append(diffs, Diff{DiffEqual, string(text1)}) + } + return diffs + } + // Trim off common prefix (speedup). + commonlength := commonPrefixLength(text1, text2) + commonprefix := text1[:commonlength] + text1 = text1[commonlength:] + text2 = text2[commonlength:] + + // Trim off common suffix (speedup). + commonlength = commonSuffixLength(text1, text2) + commonsuffix := text1[len(text1)-commonlength:] + text1 = text1[:len(text1)-commonlength] + text2 = text2[:len(text2)-commonlength] + + // Compute the diff on the middle block. + diffs := dmp.diffCompute(text1, text2, checklines, deadline) + + // Restore the prefix and suffix. + if len(commonprefix) != 0 { + diffs = append([]Diff{{DiffEqual, string(commonprefix)}}, diffs...) + } + if len(commonsuffix) != 0 { + diffs = append(diffs, Diff{DiffEqual, string(commonsuffix)}) + } + + return dmp.DiffCleanupMerge(diffs) +} + +// diffCompute finds the differences between two rune slices. Assumes that the texts do not have any common prefix or suffix. +func (dmp *DiffMatchPatch) diffCompute(text1, text2 []rune, checklines bool, deadline time.Time) []Diff { + diffs := []Diff{} + if len(text1) == 0 { + // Just add some text (speedup). + return append(diffs, Diff{DiffInsert, string(text2)}) + } else if len(text2) == 0 { + // Just delete some text (speedup). + return append(diffs, Diff{DiffDelete, string(text1)}) + } + + var longtext, shorttext []rune + if len(text1) > len(text2) { + longtext = text1 + shorttext = text2 + } else { + longtext = text2 + shorttext = text1 + } + + if i := runesIndex(longtext, shorttext); i != -1 { + op := DiffInsert + // Swap insertions for deletions if diff is reversed. + if len(text1) > len(text2) { + op = DiffDelete + } + // Shorter text is inside the longer text (speedup). + return []Diff{ + Diff{op, string(longtext[:i])}, + Diff{DiffEqual, string(shorttext)}, + Diff{op, string(longtext[i+len(shorttext):])}, + } + } else if len(shorttext) == 1 { + // Single character string. + // After the previous speedup, the character can't be an equality. + return []Diff{ + {DiffDelete, string(text1)}, + {DiffInsert, string(text2)}, + } + // Check to see if the problem can be split in two. + } else if hm := dmp.diffHalfMatch(text1, text2); hm != nil { + // A half-match was found, sort out the return data. + text1A := hm[0] + text1B := hm[1] + text2A := hm[2] + text2B := hm[3] + midCommon := hm[4] + // Send both pairs off for separate processing. + diffsA := dmp.diffMainRunes(text1A, text2A, checklines, deadline) + diffsB := dmp.diffMainRunes(text1B, text2B, checklines, deadline) + // Merge the results. + diffs := diffsA + diffs = append(diffs, Diff{DiffEqual, string(midCommon)}) + diffs = append(diffs, diffsB...) + return diffs + } else if checklines && len(text1) > 100 && len(text2) > 100 { + return dmp.diffLineMode(text1, text2, deadline) + } + return dmp.diffBisect(text1, text2, deadline) +} + +// diffLineMode does a quick line-level diff on both []runes, then rediff the parts for greater accuracy. This speedup can produce non-minimal diffs. +func (dmp *DiffMatchPatch) diffLineMode(text1, text2 []rune, deadline time.Time) []Diff { + // Scan the text on a line-by-line basis first. + text1, text2, linearray := dmp.DiffLinesToRunes(string(text1), string(text2)) + + diffs := dmp.diffMainRunes(text1, text2, false, deadline) + + // Convert the diff back to original text. + diffs = dmp.DiffCharsToLines(diffs, linearray) + // Eliminate freak matches (e.g. blank lines) + diffs = dmp.DiffCleanupSemantic(diffs) + + // Rediff any replacement blocks, this time character-by-character. + // Add a dummy entry at the end. + diffs = append(diffs, Diff{DiffEqual, ""}) + + pointer := 0 + countDelete := 0 + countInsert := 0 + + // NOTE: Rune slices are slower than using strings in this case. + textDelete := "" + textInsert := "" + + for pointer < len(diffs) { + switch diffs[pointer].Type { + case DiffInsert: + countInsert++ + textInsert += diffs[pointer].Text + case DiffDelete: + countDelete++ + textDelete += diffs[pointer].Text + case DiffEqual: + // Upon reaching an equality, check for prior redundancies. + if countDelete >= 1 && countInsert >= 1 { + // Delete the offending records and add the merged ones. + diffs = splice(diffs, pointer-countDelete-countInsert, + countDelete+countInsert) + + pointer = pointer - countDelete - countInsert + a := dmp.diffMainRunes([]rune(textDelete), []rune(textInsert), false, deadline) + for j := len(a) - 1; j >= 0; j-- { + diffs = splice(diffs, pointer, 0, a[j]) + } + pointer = pointer + len(a) + } + + countInsert = 0 + countDelete = 0 + textDelete = "" + textInsert = "" + } + pointer++ + } + + return diffs[:len(diffs)-1] // Remove the dummy entry at the end. +} + +// DiffBisect finds the 'middle snake' of a diff, split the problem in two and return the recursively constructed diff. +// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. +// See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. +func (dmp *DiffMatchPatch) DiffBisect(text1, text2 string, deadline time.Time) []Diff { + // Unused in this code, but retained for interface compatibility. + return dmp.diffBisect([]rune(text1), []rune(text2), deadline) +} + +// diffBisect finds the 'middle snake' of a diff, splits the problem in two and returns the recursively constructed diff. +// See Myers's 1986 paper: An O(ND) Difference Algorithm and Its Variations. +func (dmp *DiffMatchPatch) diffBisect(runes1, runes2 []rune, deadline time.Time) []Diff { + // Cache the text lengths to prevent multiple calls. + runes1Len, runes2Len := len(runes1), len(runes2) + + maxD := (runes1Len + runes2Len + 1) / 2 + vOffset := maxD + vLength := 2 * maxD + + v1 := make([]int, vLength) + v2 := make([]int, vLength) + for i := range v1 { + v1[i] = -1 + v2[i] = -1 + } + v1[vOffset+1] = 0 + v2[vOffset+1] = 0 + + delta := runes1Len - runes2Len + // If the total number of characters is odd, then the front path will collide with the reverse path. + front := (delta%2 != 0) + // Offsets for start and end of k loop. Prevents mapping of space beyond the grid. + k1start := 0 + k1end := 0 + k2start := 0 + k2end := 0 + for d := 0; d < maxD; d++ { + // Bail out if deadline is reached. + if !deadline.IsZero() && d%16 == 0 && time.Now().After(deadline) { + break + } + + // Walk the front path one step. + for k1 := -d + k1start; k1 <= d-k1end; k1 += 2 { + k1Offset := vOffset + k1 + var x1 int + + if k1 == -d || (k1 != d && v1[k1Offset-1] < v1[k1Offset+1]) { + x1 = v1[k1Offset+1] + } else { + x1 = v1[k1Offset-1] + 1 + } + + y1 := x1 - k1 + for x1 < runes1Len && y1 < runes2Len { + if runes1[x1] != runes2[y1] { + break + } + x1++ + y1++ + } + v1[k1Offset] = x1 + if x1 > runes1Len { + // Ran off the right of the graph. + k1end += 2 + } else if y1 > runes2Len { + // Ran off the bottom of the graph. + k1start += 2 + } else if front { + k2Offset := vOffset + delta - k1 + if k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] != -1 { + // Mirror x2 onto top-left coordinate system. + x2 := runes1Len - v2[k2Offset] + if x1 >= x2 { + // Overlap detected. + return dmp.diffBisectSplit(runes1, runes2, x1, y1, deadline) + } + } + } + } + // Walk the reverse path one step. + for k2 := -d + k2start; k2 <= d-k2end; k2 += 2 { + k2Offset := vOffset + k2 + var x2 int + if k2 == -d || (k2 != d && v2[k2Offset-1] < v2[k2Offset+1]) { + x2 = v2[k2Offset+1] + } else { + x2 = v2[k2Offset-1] + 1 + } + var y2 = x2 - k2 + for x2 < runes1Len && y2 < runes2Len { + if runes1[runes1Len-x2-1] != runes2[runes2Len-y2-1] { + break + } + x2++ + y2++ + } + v2[k2Offset] = x2 + if x2 > runes1Len { + // Ran off the left of the graph. + k2end += 2 + } else if y2 > runes2Len { + // Ran off the top of the graph. + k2start += 2 + } else if !front { + k1Offset := vOffset + delta - k2 + if k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] != -1 { + x1 := v1[k1Offset] + y1 := vOffset + x1 - k1Offset + // Mirror x2 onto top-left coordinate system. + x2 = runes1Len - x2 + if x1 >= x2 { + // Overlap detected. + return dmp.diffBisectSplit(runes1, runes2, x1, y1, deadline) + } + } + } + } + } + // Diff took too long and hit the deadline or number of diffs equals number of characters, no commonality at all. + return []Diff{ + {DiffDelete, string(runes1)}, + {DiffInsert, string(runes2)}, + } +} + +func (dmp *DiffMatchPatch) diffBisectSplit(runes1, runes2 []rune, x, y int, + deadline time.Time) []Diff { + runes1a := runes1[:x] + runes2a := runes2[:y] + runes1b := runes1[x:] + runes2b := runes2[y:] + + // Compute both diffs serially. + diffs := dmp.diffMainRunes(runes1a, runes2a, false, deadline) + diffsb := dmp.diffMainRunes(runes1b, runes2b, false, deadline) + + return append(diffs, diffsb...) +} + +// DiffLinesToChars splits two texts into a list of strings, and educes the texts to a string of hashes where each Unicode character represents one line. +// It's slightly faster to call DiffLinesToRunes first, followed by DiffMainRunes. +func (dmp *DiffMatchPatch) DiffLinesToChars(text1, text2 string) (string, string, []string) { + chars1, chars2, lineArray := dmp.diffLinesToStrings(text1, text2) + return chars1, chars2, lineArray +} + +// DiffLinesToRunes splits two texts into a list of runes. +func (dmp *DiffMatchPatch) DiffLinesToRunes(text1, text2 string) ([]rune, []rune, []string) { + chars1, chars2, lineArray := dmp.diffLinesToStrings(text1, text2) + return []rune(chars1), []rune(chars2), lineArray +} + +// DiffCharsToLines rehydrates the text in a diff from a string of line hashes to real lines of text. +func (dmp *DiffMatchPatch) DiffCharsToLines(diffs []Diff, lineArray []string) []Diff { + hydrated := make([]Diff, 0, len(diffs)) + for _, aDiff := range diffs { + chars := strings.Split(aDiff.Text, IndexSeparator) + text := make([]string, len(chars)) + + for i, r := range chars { + i1, err := strconv.Atoi(r) + if err == nil { + text[i] = lineArray[i1] + } + } + + aDiff.Text = strings.Join(text, "") + hydrated = append(hydrated, aDiff) + } + return hydrated +} + +// DiffCommonPrefix determines the common prefix length of two strings. +func (dmp *DiffMatchPatch) DiffCommonPrefix(text1, text2 string) int { + // Unused in this code, but retained for interface compatibility. + return commonPrefixLength([]rune(text1), []rune(text2)) +} + +// DiffCommonSuffix determines the common suffix length of two strings. +func (dmp *DiffMatchPatch) DiffCommonSuffix(text1, text2 string) int { + // Unused in this code, but retained for interface compatibility. + return commonSuffixLength([]rune(text1), []rune(text2)) +} + +// commonPrefixLength returns the length of the common prefix of two rune slices. +func commonPrefixLength(text1, text2 []rune) int { + // Linear search. See comment in commonSuffixLength. + n := 0 + for ; n < len(text1) && n < len(text2); n++ { + if text1[n] != text2[n] { + return n + } + } + return n +} + +// commonSuffixLength returns the length of the common suffix of two rune slices. +func commonSuffixLength(text1, text2 []rune) int { + // Use linear search rather than the binary search discussed at https://neil.fraser.name/news/2007/10/09/. + // See discussion at https://github.com/sergi/go-diff/issues/54. + i1 := len(text1) + i2 := len(text2) + for n := 0; ; n++ { + i1-- + i2-- + if i1 < 0 || i2 < 0 || text1[i1] != text2[i2] { + return n + } + } +} + +// DiffCommonOverlap determines if the suffix of one string is the prefix of another. +func (dmp *DiffMatchPatch) DiffCommonOverlap(text1 string, text2 string) int { + // Cache the text lengths to prevent multiple calls. + text1Length := len(text1) + text2Length := len(text2) + // Eliminate the null case. + if text1Length == 0 || text2Length == 0 { + return 0 + } + // Truncate the longer string. + if text1Length > text2Length { + text1 = text1[text1Length-text2Length:] + } else if text1Length < text2Length { + text2 = text2[0:text1Length] + } + textLength := int(math.Min(float64(text1Length), float64(text2Length))) + // Quick check for the worst case. + if text1 == text2 { + return textLength + } + + // Start by looking for a single character match and increase length until no match is found. Performance analysis: http://neil.fraser.name/news/2010/11/04/ + best := 0 + length := 1 + for { + pattern := text1[textLength-length:] + found := strings.Index(text2, pattern) + if found == -1 { + break + } + length += found + if found == 0 || text1[textLength-length:] == text2[0:length] { + best = length + length++ + } + } + + return best +} + +// DiffHalfMatch checks whether the two texts share a substring which is at least half the length of the longer text. This speedup can produce non-minimal diffs. +func (dmp *DiffMatchPatch) DiffHalfMatch(text1, text2 string) []string { + // Unused in this code, but retained for interface compatibility. + runeSlices := dmp.diffHalfMatch([]rune(text1), []rune(text2)) + if runeSlices == nil { + return nil + } + + result := make([]string, len(runeSlices)) + for i, r := range runeSlices { + result[i] = string(r) + } + return result +} + +func (dmp *DiffMatchPatch) diffHalfMatch(text1, text2 []rune) [][]rune { + if dmp.DiffTimeout <= 0 { + // Don't risk returning a non-optimal diff if we have unlimited time. + return nil + } + + var longtext, shorttext []rune + if len(text1) > len(text2) { + longtext = text1 + shorttext = text2 + } else { + longtext = text2 + shorttext = text1 + } + + if len(longtext) < 4 || len(shorttext)*2 < len(longtext) { + return nil // Pointless. + } + + // First check if the second quarter is the seed for a half-match. + hm1 := dmp.diffHalfMatchI(longtext, shorttext, int(float64(len(longtext)+3)/4)) + + // Check again based on the third quarter. + hm2 := dmp.diffHalfMatchI(longtext, shorttext, int(float64(len(longtext)+1)/2)) + + hm := [][]rune{} + if hm1 == nil && hm2 == nil { + return nil + } else if hm2 == nil { + hm = hm1 + } else if hm1 == nil { + hm = hm2 + } else { + // Both matched. Select the longest. + if len(hm1[4]) > len(hm2[4]) { + hm = hm1 + } else { + hm = hm2 + } + } + + // A half-match was found, sort out the return data. + if len(text1) > len(text2) { + return hm + } + + return [][]rune{hm[2], hm[3], hm[0], hm[1], hm[4]} +} + +// diffHalfMatchI checks if a substring of shorttext exist within longtext such that the substring is at least half the length of longtext? +// Returns a slice containing the prefix of longtext, the suffix of longtext, the prefix of shorttext, the suffix of shorttext and the common middle, or null if there was no match. +func (dmp *DiffMatchPatch) diffHalfMatchI(l, s []rune, i int) [][]rune { + var bestCommonA []rune + var bestCommonB []rune + var bestCommonLen int + var bestLongtextA []rune + var bestLongtextB []rune + var bestShorttextA []rune + var bestShorttextB []rune + + // Start with a 1/4 length substring at position i as a seed. + seed := l[i : i+len(l)/4] + + for j := runesIndexOf(s, seed, 0); j != -1; j = runesIndexOf(s, seed, j+1) { + prefixLength := commonPrefixLength(l[i:], s[j:]) + suffixLength := commonSuffixLength(l[:i], s[:j]) + + if bestCommonLen < suffixLength+prefixLength { + bestCommonA = s[j-suffixLength : j] + bestCommonB = s[j : j+prefixLength] + bestCommonLen = len(bestCommonA) + len(bestCommonB) + bestLongtextA = l[:i-suffixLength] + bestLongtextB = l[i+prefixLength:] + bestShorttextA = s[:j-suffixLength] + bestShorttextB = s[j+prefixLength:] + } + } + + if bestCommonLen*2 < len(l) { + return nil + } + + return [][]rune{ + bestLongtextA, + bestLongtextB, + bestShorttextA, + bestShorttextB, + append(bestCommonA, bestCommonB...), + } +} + +// DiffCleanupSemantic reduces the number of edits by eliminating semantically trivial equalities. +func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { + changes := false + // Stack of indices where equalities are found. + equalities := make([]int, 0, len(diffs)) + + var lastequality string + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + var pointer int // Index of current position. + // Number of characters that changed prior to the equality. + var lengthInsertions1, lengthDeletions1 int + // Number of characters that changed after the equality. + var lengthInsertions2, lengthDeletions2 int + + for pointer < len(diffs) { + if diffs[pointer].Type == DiffEqual { + // Equality found. + equalities = append(equalities, pointer) + lengthInsertions1 = lengthInsertions2 + lengthDeletions1 = lengthDeletions2 + lengthInsertions2 = 0 + lengthDeletions2 = 0 + lastequality = diffs[pointer].Text + } else { + // An insertion or deletion. + + if diffs[pointer].Type == DiffInsert { + lengthInsertions2 += utf8.RuneCountInString(diffs[pointer].Text) + } else { + lengthDeletions2 += utf8.RuneCountInString(diffs[pointer].Text) + } + // Eliminate an equality that is smaller or equal to the edits on both sides of it. + difference1 := int(math.Max(float64(lengthInsertions1), float64(lengthDeletions1))) + difference2 := int(math.Max(float64(lengthInsertions2), float64(lengthDeletions2))) + if utf8.RuneCountInString(lastequality) > 0 && + (utf8.RuneCountInString(lastequality) <= difference1) && + (utf8.RuneCountInString(lastequality) <= difference2) { + // Duplicate record. + insPoint := equalities[len(equalities)-1] + diffs = splice(diffs, insPoint, 0, Diff{DiffDelete, lastequality}) + + // Change second copy to insert. + diffs[insPoint+1].Type = DiffInsert + // Throw away the equality we just deleted. + equalities = equalities[:len(equalities)-1] + + if len(equalities) > 0 { + equalities = equalities[:len(equalities)-1] + } + pointer = -1 + if len(equalities) > 0 { + pointer = equalities[len(equalities)-1] + } + + lengthInsertions1 = 0 // Reset the counters. + lengthDeletions1 = 0 + lengthInsertions2 = 0 + lengthDeletions2 = 0 + lastequality = "" + changes = true + } + } + pointer++ + } + + // Normalize the diff. + if changes { + diffs = dmp.DiffCleanupMerge(diffs) + } + diffs = dmp.DiffCleanupSemanticLossless(diffs) + // Find any overlaps between deletions and insertions. + // e.g: abcxxxxxxdef + // -> abcxxxdef + // e.g: xxxabcdefxxx + // -> defxxxabc + // Only extract an overlap if it is as big as the edit ahead or behind it. + pointer = 1 + for pointer < len(diffs) { + if diffs[pointer-1].Type == DiffDelete && + diffs[pointer].Type == DiffInsert { + deletion := diffs[pointer-1].Text + insertion := diffs[pointer].Text + overlapLength1 := dmp.DiffCommonOverlap(deletion, insertion) + overlapLength2 := dmp.DiffCommonOverlap(insertion, deletion) + if overlapLength1 >= overlapLength2 { + if float64(overlapLength1) >= float64(utf8.RuneCountInString(deletion))/2 || + float64(overlapLength1) >= float64(utf8.RuneCountInString(insertion))/2 { + + // Overlap found. Insert an equality and trim the surrounding edits. + diffs = splice(diffs, pointer, 0, Diff{DiffEqual, insertion[:overlapLength1]}) + diffs[pointer-1].Text = + deletion[0 : len(deletion)-overlapLength1] + diffs[pointer+1].Text = insertion[overlapLength1:] + pointer++ + } + } else { + if float64(overlapLength2) >= float64(utf8.RuneCountInString(deletion))/2 || + float64(overlapLength2) >= float64(utf8.RuneCountInString(insertion))/2 { + // Reverse overlap found. Insert an equality and swap and trim the surrounding edits. + overlap := Diff{DiffEqual, deletion[:overlapLength2]} + diffs = splice(diffs, pointer, 0, overlap) + diffs[pointer-1].Type = DiffInsert + diffs[pointer-1].Text = insertion[0 : len(insertion)-overlapLength2] + diffs[pointer+1].Type = DiffDelete + diffs[pointer+1].Text = deletion[overlapLength2:] + pointer++ + } + } + pointer++ + } + pointer++ + } + + return diffs +} + +// Define some regex patterns for matching boundaries. +var ( + nonAlphaNumericRegex = regexp.MustCompile(`[^a-zA-Z0-9]`) + whitespaceRegex = regexp.MustCompile(`\s`) + linebreakRegex = regexp.MustCompile(`[\r\n]`) + blanklineEndRegex = regexp.MustCompile(`\n\r?\n$`) + blanklineStartRegex = regexp.MustCompile(`^\r?\n\r?\n`) +) + +// diffCleanupSemanticScore computes a score representing whether the internal boundary falls on logical boundaries. +// Scores range from 6 (best) to 0 (worst). Closure, but does not reference any external variables. +func diffCleanupSemanticScore(one, two string) int { + if len(one) == 0 || len(two) == 0 { + // Edges are the best. + return 6 + } + + // Each port of this function behaves slightly differently due to subtle differences in each language's definition of things like 'whitespace'. Since this function's purpose is largely cosmetic, the choice has been made to use each language's native features rather than force total conformity. + rune1, _ := utf8.DecodeLastRuneInString(one) + rune2, _ := utf8.DecodeRuneInString(two) + char1 := string(rune1) + char2 := string(rune2) + + nonAlphaNumeric1 := nonAlphaNumericRegex.MatchString(char1) + nonAlphaNumeric2 := nonAlphaNumericRegex.MatchString(char2) + whitespace1 := nonAlphaNumeric1 && whitespaceRegex.MatchString(char1) + whitespace2 := nonAlphaNumeric2 && whitespaceRegex.MatchString(char2) + lineBreak1 := whitespace1 && linebreakRegex.MatchString(char1) + lineBreak2 := whitespace2 && linebreakRegex.MatchString(char2) + blankLine1 := lineBreak1 && blanklineEndRegex.MatchString(one) + blankLine2 := lineBreak2 && blanklineEndRegex.MatchString(two) + + if blankLine1 || blankLine2 { + // Five points for blank lines. + return 5 + } else if lineBreak1 || lineBreak2 { + // Four points for line breaks. + return 4 + } else if nonAlphaNumeric1 && !whitespace1 && whitespace2 { + // Three points for end of sentences. + return 3 + } else if whitespace1 || whitespace2 { + // Two points for whitespace. + return 2 + } else if nonAlphaNumeric1 || nonAlphaNumeric2 { + // One point for non-alphanumeric. + return 1 + } + return 0 +} + +// DiffCleanupSemanticLossless looks for single edits surrounded on both sides by equalities which can be shifted sideways to align the edit to a word boundary. +// E.g: The cat came. -> The cat came. +func (dmp *DiffMatchPatch) DiffCleanupSemanticLossless(diffs []Diff) []Diff { + pointer := 1 + + // Intentionally ignore the first and last element (don't need checking). + for pointer < len(diffs)-1 { + if diffs[pointer-1].Type == DiffEqual && + diffs[pointer+1].Type == DiffEqual { + + // This is a single edit surrounded by equalities. + equality1 := diffs[pointer-1].Text + edit := diffs[pointer].Text + equality2 := diffs[pointer+1].Text + + // First, shift the edit as far left as possible. + commonOffset := dmp.DiffCommonSuffix(equality1, edit) + if commonOffset > 0 { + commonString := edit[len(edit)-commonOffset:] + equality1 = equality1[0 : len(equality1)-commonOffset] + edit = commonString + edit[:len(edit)-commonOffset] + equality2 = commonString + equality2 + } + + // Second, step character by character right, looking for the best fit. + bestEquality1 := equality1 + bestEdit := edit + bestEquality2 := equality2 + bestScore := diffCleanupSemanticScore(equality1, edit) + + diffCleanupSemanticScore(edit, equality2) + + for len(edit) != 0 && len(equality2) != 0 { + _, sz := utf8.DecodeRuneInString(edit) + if len(equality2) < sz || edit[:sz] != equality2[:sz] { + break + } + equality1 += edit[:sz] + edit = edit[sz:] + equality2[:sz] + equality2 = equality2[sz:] + score := diffCleanupSemanticScore(equality1, edit) + + diffCleanupSemanticScore(edit, equality2) + // The >= encourages trailing rather than leading whitespace on edits. + if score >= bestScore { + bestScore = score + bestEquality1 = equality1 + bestEdit = edit + bestEquality2 = equality2 + } + } + + if diffs[pointer-1].Text != bestEquality1 { + // We have an improvement, save it back to the diff. + if len(bestEquality1) != 0 { + diffs[pointer-1].Text = bestEquality1 + } else { + diffs = splice(diffs, pointer-1, 1) + pointer-- + } + + diffs[pointer].Text = bestEdit + if len(bestEquality2) != 0 { + diffs[pointer+1].Text = bestEquality2 + } else { + diffs = append(diffs[:pointer+1], diffs[pointer+2:]...) + pointer-- + } + } + } + pointer++ + } + + return diffs +} + +// DiffCleanupEfficiency reduces the number of edits by eliminating operationally trivial equalities. +func (dmp *DiffMatchPatch) DiffCleanupEfficiency(diffs []Diff) []Diff { + changes := false + // Stack of indices where equalities are found. + type equality struct { + data int + next *equality + } + var equalities *equality + // Always equal to equalities[equalitiesLength-1][1] + lastequality := "" + pointer := 0 // Index of current position. + // Is there an insertion operation before the last equality. + preIns := false + // Is there a deletion operation before the last equality. + preDel := false + // Is there an insertion operation after the last equality. + postIns := false + // Is there a deletion operation after the last equality. + postDel := false + for pointer < len(diffs) { + if diffs[pointer].Type == DiffEqual { // Equality found. + if len(diffs[pointer].Text) < dmp.DiffEditCost && + (postIns || postDel) { + // Candidate found. + equalities = &equality{ + data: pointer, + next: equalities, + } + preIns = postIns + preDel = postDel + lastequality = diffs[pointer].Text + } else { + // Not a candidate, and can never become one. + equalities = nil + lastequality = "" + } + postIns = false + postDel = false + } else { // An insertion or deletion. + if diffs[pointer].Type == DiffDelete { + postDel = true + } else { + postIns = true + } + + // Five types to be split: + // ABXYCD + // AXCD + // ABXC + // AXCD + // ABXC + var sumPres int + if preIns { + sumPres++ + } + if preDel { + sumPres++ + } + if postIns { + sumPres++ + } + if postDel { + sumPres++ + } + if len(lastequality) > 0 && + ((preIns && preDel && postIns && postDel) || + ((len(lastequality) < dmp.DiffEditCost/2) && sumPres == 3)) { + + insPoint := equalities.data + + // Duplicate record. + diffs = splice(diffs, insPoint, 0, Diff{DiffDelete, lastequality}) + + // Change second copy to insert. + diffs[insPoint+1].Type = DiffInsert + // Throw away the equality we just deleted. + equalities = equalities.next + lastequality = "" + + if preIns && preDel { + // No changes made which could affect previous entry, keep going. + postIns = true + postDel = true + equalities = nil + } else { + if equalities != nil { + equalities = equalities.next + } + if equalities != nil { + pointer = equalities.data + } else { + pointer = -1 + } + postIns = false + postDel = false + } + changes = true + } + } + pointer++ + } + + if changes { + diffs = dmp.DiffCleanupMerge(diffs) + } + + return diffs +} + +// DiffCleanupMerge reorders and merges like edit sections. Merge equalities. +// Any edit section can move as long as it doesn't cross an equality. +func (dmp *DiffMatchPatch) DiffCleanupMerge(diffs []Diff) []Diff { + // Add a dummy entry at the end. + diffs = append(diffs, Diff{DiffEqual, ""}) + pointer := 0 + countDelete := 0 + countInsert := 0 + commonlength := 0 + textDelete := []rune(nil) + textInsert := []rune(nil) + + for pointer < len(diffs) { + switch diffs[pointer].Type { + case DiffInsert: + countInsert++ + textInsert = append(textInsert, []rune(diffs[pointer].Text)...) + pointer++ + break + case DiffDelete: + countDelete++ + textDelete = append(textDelete, []rune(diffs[pointer].Text)...) + pointer++ + break + case DiffEqual: + // Upon reaching an equality, check for prior redundancies. + if countDelete+countInsert > 1 { + if countDelete != 0 && countInsert != 0 { + // Factor out any common prefixies. + commonlength = commonPrefixLength(textInsert, textDelete) + if commonlength != 0 { + x := pointer - countDelete - countInsert + if x > 0 && diffs[x-1].Type == DiffEqual { + diffs[x-1].Text += string(textInsert[:commonlength]) + } else { + diffs = append([]Diff{{DiffEqual, string(textInsert[:commonlength])}}, diffs...) + pointer++ + } + textInsert = textInsert[commonlength:] + textDelete = textDelete[commonlength:] + } + // Factor out any common suffixies. + commonlength = commonSuffixLength(textInsert, textDelete) + if commonlength != 0 { + insertIndex := len(textInsert) - commonlength + deleteIndex := len(textDelete) - commonlength + diffs[pointer].Text = string(textInsert[insertIndex:]) + diffs[pointer].Text + textInsert = textInsert[:insertIndex] + textDelete = textDelete[:deleteIndex] + } + } + // Delete the offending records and add the merged ones. + if countDelete == 0 { + diffs = splice(diffs, pointer-countInsert, + countDelete+countInsert, + Diff{DiffInsert, string(textInsert)}) + } else if countInsert == 0 { + diffs = splice(diffs, pointer-countDelete, + countDelete+countInsert, + Diff{DiffDelete, string(textDelete)}) + } else { + diffs = splice(diffs, pointer-countDelete-countInsert, + countDelete+countInsert, + Diff{DiffDelete, string(textDelete)}, + Diff{DiffInsert, string(textInsert)}) + } + + pointer = pointer - countDelete - countInsert + 1 + if countDelete != 0 { + pointer++ + } + if countInsert != 0 { + pointer++ + } + } else if pointer != 0 && diffs[pointer-1].Type == DiffEqual { + // Merge this equality with the previous one. + diffs[pointer-1].Text += diffs[pointer].Text + diffs = append(diffs[:pointer], diffs[pointer+1:]...) + } else { + pointer++ + } + countInsert = 0 + countDelete = 0 + textDelete = nil + textInsert = nil + break + } + } + + if len(diffs[len(diffs)-1].Text) == 0 { + diffs = diffs[0 : len(diffs)-1] // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities which can be shifted sideways to eliminate an equality. E.g: ABAC -> ABAC + changes := false + pointer = 1 + // Intentionally ignore the first and last element (don't need checking). + for pointer < (len(diffs) - 1) { + if diffs[pointer-1].Type == DiffEqual && + diffs[pointer+1].Type == DiffEqual { + // This is a single edit surrounded by equalities. + if strings.HasSuffix(diffs[pointer].Text, diffs[pointer-1].Text) { + // Shift the edit over the previous equality. + diffs[pointer].Text = diffs[pointer-1].Text + + diffs[pointer].Text[:len(diffs[pointer].Text)-len(diffs[pointer-1].Text)] + diffs[pointer+1].Text = diffs[pointer-1].Text + diffs[pointer+1].Text + diffs = splice(diffs, pointer-1, 1) + changes = true + } else if strings.HasPrefix(diffs[pointer].Text, diffs[pointer+1].Text) { + // Shift the edit over the next equality. + diffs[pointer-1].Text += diffs[pointer+1].Text + diffs[pointer].Text = + diffs[pointer].Text[len(diffs[pointer+1].Text):] + diffs[pointer+1].Text + diffs = splice(diffs, pointer+1, 1) + changes = true + } + } + pointer++ + } + + // If shifts were made, the diff needs reordering and another shift sweep. + if changes { + diffs = dmp.DiffCleanupMerge(diffs) + } + + return diffs +} + +// DiffXIndex returns the equivalent location in s2. +func (dmp *DiffMatchPatch) DiffXIndex(diffs []Diff, loc int) int { + chars1 := 0 + chars2 := 0 + lastChars1 := 0 + lastChars2 := 0 + lastDiff := Diff{} + for i := 0; i < len(diffs); i++ { + aDiff := diffs[i] + if aDiff.Type != DiffInsert { + // Equality or deletion. + chars1 += len(aDiff.Text) + } + if aDiff.Type != DiffDelete { + // Equality or insertion. + chars2 += len(aDiff.Text) + } + if chars1 > loc { + // Overshot the location. + lastDiff = aDiff + break + } + lastChars1 = chars1 + lastChars2 = chars2 + } + if lastDiff.Type == DiffDelete { + // The location was deleted. + return lastChars2 + } + // Add the remaining character length. + return lastChars2 + (loc - lastChars1) +} + +// DiffPrettyHtml converts a []Diff into a pretty HTML report. +// It is intended as an example from which to write one's own display functions. +func (dmp *DiffMatchPatch) DiffPrettyHtml(diffs []Diff) string { + var buff bytes.Buffer + for _, diff := range diffs { + text := strings.Replace(html.EscapeString(diff.Text), "\n", "¶
    ", -1) + switch diff.Type { + case DiffInsert: + _, _ = buff.WriteString("") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("") + case DiffDelete: + _, _ = buff.WriteString("") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("") + case DiffEqual: + _, _ = buff.WriteString("") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("") + } + } + return buff.String() +} + +// DiffPrettyText converts a []Diff into a colored text report. +func (dmp *DiffMatchPatch) DiffPrettyText(diffs []Diff) string { + var buff bytes.Buffer + for _, diff := range diffs { + text := diff.Text + + switch diff.Type { + case DiffInsert: + _, _ = buff.WriteString("\x1b[32m") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("\x1b[0m") + case DiffDelete: + _, _ = buff.WriteString("\x1b[31m") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("\x1b[0m") + case DiffEqual: + _, _ = buff.WriteString(text) + } + } + + return buff.String() +} + +// DiffText1 computes and returns the source text (all equalities and deletions). +func (dmp *DiffMatchPatch) DiffText1(diffs []Diff) string { + //StringBuilder text = new StringBuilder() + var text bytes.Buffer + + for _, aDiff := range diffs { + if aDiff.Type != DiffInsert { + _, _ = text.WriteString(aDiff.Text) + } + } + return text.String() +} + +// DiffText2 computes and returns the destination text (all equalities and insertions). +func (dmp *DiffMatchPatch) DiffText2(diffs []Diff) string { + var text bytes.Buffer + + for _, aDiff := range diffs { + if aDiff.Type != DiffDelete { + _, _ = text.WriteString(aDiff.Text) + } + } + return text.String() +} + +// DiffLevenshtein computes the Levenshtein distance that is the number of inserted, deleted or substituted characters. +func (dmp *DiffMatchPatch) DiffLevenshtein(diffs []Diff) int { + levenshtein := 0 + insertions := 0 + deletions := 0 + + for _, aDiff := range diffs { + switch aDiff.Type { + case DiffInsert: + insertions += utf8.RuneCountInString(aDiff.Text) + case DiffDelete: + deletions += utf8.RuneCountInString(aDiff.Text) + case DiffEqual: + // A deletion and an insertion is one substitution. + levenshtein += max(insertions, deletions) + insertions = 0 + deletions = 0 + } + } + + levenshtein += max(insertions, deletions) + return levenshtein +} + +// DiffToDelta crushes the diff into an encoded string which describes the operations required to transform text1 into text2. +// E.g. =3\t-2\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'. Operations are tab-separated. Inserted text is escaped using %xx notation. +func (dmp *DiffMatchPatch) DiffToDelta(diffs []Diff) string { + var text bytes.Buffer + for _, aDiff := range diffs { + switch aDiff.Type { + case DiffInsert: + _, _ = text.WriteString("+") + _, _ = text.WriteString(strings.Replace(url.QueryEscape(aDiff.Text), "+", " ", -1)) + _, _ = text.WriteString("\t") + break + case DiffDelete: + _, _ = text.WriteString("-") + _, _ = text.WriteString(strconv.Itoa(utf8.RuneCountInString(aDiff.Text))) + _, _ = text.WriteString("\t") + break + case DiffEqual: + _, _ = text.WriteString("=") + _, _ = text.WriteString(strconv.Itoa(utf8.RuneCountInString(aDiff.Text))) + _, _ = text.WriteString("\t") + break + } + } + delta := text.String() + if len(delta) != 0 { + // Strip off trailing tab character. + delta = delta[0 : utf8.RuneCountInString(delta)-1] + delta = unescaper.Replace(delta) + } + return delta +} + +// DiffFromDelta given the original text1, and an encoded string which describes the operations required to transform text1 into text2, comAdde the full diff. +func (dmp *DiffMatchPatch) DiffFromDelta(text1 string, delta string) (diffs []Diff, err error) { + i := 0 + runes := []rune(text1) + + for _, token := range strings.Split(delta, "\t") { + if len(token) == 0 { + // Blank tokens are ok (from a trailing \t). + continue + } + + // Each token begins with a one character parameter which specifies the operation of this token (delete, insert, equality). + param := token[1:] + + switch op := token[0]; op { + case '+': + // Decode would Diff all "+" to " " + param = strings.Replace(param, "+", "%2b", -1) + param, err = url.QueryUnescape(param) + if err != nil { + return nil, err + } + if !utf8.ValidString(param) { + return nil, fmt.Errorf("invalid UTF-8 token: %q", param) + } + + diffs = append(diffs, Diff{DiffInsert, param}) + case '=', '-': + n, err := strconv.ParseInt(param, 10, 0) + if err != nil { + return nil, err + } else if n < 0 { + return nil, errors.New("Negative number in DiffFromDelta: " + param) + } + + i += int(n) + // Break out if we are out of bounds, go1.6 can't handle this very well + if i > len(runes) { + break + } + // Remember that string slicing is by byte - we want by rune here. + text := string(runes[i-int(n) : i]) + + if op == '=' { + diffs = append(diffs, Diff{DiffEqual, text}) + } else { + diffs = append(diffs, Diff{DiffDelete, text}) + } + default: + // Anything else is an error. + return nil, errors.New("Invalid diff operation in DiffFromDelta: " + string(token[0])) + } + } + + if i != len(runes) { + return nil, fmt.Errorf("Delta length (%v) is different from source text length (%v)", i, len(text1)) + } + + return diffs, nil +} + +// diffLinesToStrings splits two texts into a list of strings. Each string represents one line. +func (dmp *DiffMatchPatch) diffLinesToStrings(text1, text2 string) (string, string, []string) { + // '\x00' is a valid character, but various debuggers don't like it. So we'll insert a junk entry to avoid generating a null character. + lineArray := []string{""} // e.g. lineArray[4] == 'Hello\n' + + //Each string has the index of lineArray which it points to + strIndexArray1 := dmp.diffLinesToStringsMunge(text1, &lineArray) + strIndexArray2 := dmp.diffLinesToStringsMunge(text2, &lineArray) + + return intArrayToString(strIndexArray1), intArrayToString(strIndexArray2), lineArray +} + +// diffLinesToStringsMunge splits a text into an array of strings, and reduces the texts to a []string. +func (dmp *DiffMatchPatch) diffLinesToStringsMunge(text string, lineArray *[]string) []uint32 { + // Walk the text, pulling out a substring for each line. text.split('\n') would would temporarily double our memory footprint. Modifying text would create many large strings to garbage collect. + lineHash := map[string]int{} // e.g. lineHash['Hello\n'] == 4 + lineStart := 0 + lineEnd := -1 + strs := []uint32{} + + for lineEnd < len(text)-1 { + lineEnd = indexOf(text, "\n", lineStart) + + if lineEnd == -1 { + lineEnd = len(text) - 1 + } + + line := text[lineStart : lineEnd+1] + lineStart = lineEnd + 1 + lineValue, ok := lineHash[line] + + if ok { + strs = append(strs, uint32(lineValue)) + } else { + *lineArray = append(*lineArray, line) + lineHash[line] = len(*lineArray) - 1 + strs = append(strs, uint32(len(*lineArray)-1)) + } + } + + return strs +} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go new file mode 100644 index 0000000000..d3acc32ce1 --- /dev/null +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go @@ -0,0 +1,46 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +// Package diffmatchpatch offers robust algorithms to perform the operations required for synchronizing plain text. +package diffmatchpatch + +import ( + "time" +) + +// DiffMatchPatch holds the configuration for diff-match-patch operations. +type DiffMatchPatch struct { + // Number of seconds to map a diff before giving up (0 for infinity). + DiffTimeout time.Duration + // Cost of an empty edit operation in terms of edit characters. + DiffEditCost int + // How far to search for a match (0 = exact location, 1000+ = broad match). A match this many characters away from the expected location will add 1.0 to the score (0.0 is a perfect match). + MatchDistance int + // When deleting a large block of text (over ~64 characters), how close do the contents have to be to match the expected contents. (0.0 = perfection, 1.0 = very loose). Note that MatchThreshold controls how closely the end points of a delete need to match. + PatchDeleteThreshold float64 + // Chunk size for context length. + PatchMargin int + // The number of bits in an int. + MatchMaxBits int + // At what point is no match declared (0.0 = perfection, 1.0 = very loose). + MatchThreshold float64 +} + +// New creates a new DiffMatchPatch object with default parameters. +func New() *DiffMatchPatch { + // Defaults. + return &DiffMatchPatch{ + DiffTimeout: time.Second, + DiffEditCost: 4, + MatchThreshold: 0.5, + MatchDistance: 1000, + PatchDeleteThreshold: 0.5, + PatchMargin: 4, + MatchMaxBits: 32, + } +} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go new file mode 100644 index 0000000000..17374e109f --- /dev/null +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go @@ -0,0 +1,160 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +package diffmatchpatch + +import ( + "math" +) + +// MatchMain locates the best instance of 'pattern' in 'text' near 'loc'. +// Returns -1 if no match found. +func (dmp *DiffMatchPatch) MatchMain(text, pattern string, loc int) int { + // Check for null inputs not needed since null can't be passed in C#. + + loc = int(math.Max(0, math.Min(float64(loc), float64(len(text))))) + if text == pattern { + // Shortcut (potentially not guaranteed by the algorithm) + return 0 + } else if len(text) == 0 { + // Nothing to match. + return -1 + } else if loc+len(pattern) <= len(text) && text[loc:loc+len(pattern)] == pattern { + // Perfect match at the perfect spot! (Includes case of null pattern) + return loc + } + // Do a fuzzy compare. + return dmp.MatchBitap(text, pattern, loc) +} + +// MatchBitap locates the best instance of 'pattern' in 'text' near 'loc' using the Bitap algorithm. +// Returns -1 if no match was found. +func (dmp *DiffMatchPatch) MatchBitap(text, pattern string, loc int) int { + // Initialise the alphabet. + s := dmp.MatchAlphabet(pattern) + + // Highest score beyond which we give up. + scoreThreshold := dmp.MatchThreshold + // Is there a nearby exact match? (speedup) + bestLoc := indexOf(text, pattern, loc) + if bestLoc != -1 { + scoreThreshold = math.Min(dmp.matchBitapScore(0, bestLoc, loc, + pattern), scoreThreshold) + // What about in the other direction? (speedup) + bestLoc = lastIndexOf(text, pattern, loc+len(pattern)) + if bestLoc != -1 { + scoreThreshold = math.Min(dmp.matchBitapScore(0, bestLoc, loc, + pattern), scoreThreshold) + } + } + + // Initialise the bit arrays. + matchmask := 1 << uint((len(pattern) - 1)) + bestLoc = -1 + + var binMin, binMid int + binMax := len(pattern) + len(text) + lastRd := []int{} + for d := 0; d < len(pattern); d++ { + // Scan for the best match; each iteration allows for one more error. Run a binary search to determine how far from 'loc' we can stray at this error level. + binMin = 0 + binMid = binMax + for binMin < binMid { + if dmp.matchBitapScore(d, loc+binMid, loc, pattern) <= scoreThreshold { + binMin = binMid + } else { + binMax = binMid + } + binMid = (binMax-binMin)/2 + binMin + } + // Use the result from this iteration as the maximum for the next. + binMax = binMid + start := int(math.Max(1, float64(loc-binMid+1))) + finish := int(math.Min(float64(loc+binMid), float64(len(text))) + float64(len(pattern))) + + rd := make([]int, finish+2) + rd[finish+1] = (1 << uint(d)) - 1 + + for j := finish; j >= start; j-- { + var charMatch int + if len(text) <= j-1 { + // Out of range. + charMatch = 0 + } else if _, ok := s[text[j-1]]; !ok { + charMatch = 0 + } else { + charMatch = s[text[j-1]] + } + + if d == 0 { + // First pass: exact match. + rd[j] = ((rd[j+1] << 1) | 1) & charMatch + } else { + // Subsequent passes: fuzzy match. + rd[j] = ((rd[j+1]<<1)|1)&charMatch | (((lastRd[j+1] | lastRd[j]) << 1) | 1) | lastRd[j+1] + } + if (rd[j] & matchmask) != 0 { + score := dmp.matchBitapScore(d, j-1, loc, pattern) + // This match will almost certainly be better than any existing match. But check anyway. + if score <= scoreThreshold { + // Told you so. + scoreThreshold = score + bestLoc = j - 1 + if bestLoc > loc { + // When passing loc, don't exceed our current distance from loc. + start = int(math.Max(1, float64(2*loc-bestLoc))) + } else { + // Already passed loc, downhill from here on in. + break + } + } + } + } + if dmp.matchBitapScore(d+1, loc, loc, pattern) > scoreThreshold { + // No hope for a (better) match at greater error levels. + break + } + lastRd = rd + } + return bestLoc +} + +// matchBitapScore computes and returns the score for a match with e errors and x location. +func (dmp *DiffMatchPatch) matchBitapScore(e, x, loc int, pattern string) float64 { + accuracy := float64(e) / float64(len(pattern)) + proximity := math.Abs(float64(loc - x)) + if dmp.MatchDistance == 0 { + // Dodge divide by zero error. + if proximity == 0 { + return accuracy + } + + return 1.0 + } + return accuracy + (proximity / float64(dmp.MatchDistance)) +} + +// MatchAlphabet initialises the alphabet for the Bitap algorithm. +func (dmp *DiffMatchPatch) MatchAlphabet(pattern string) map[byte]int { + s := map[byte]int{} + charPattern := []byte(pattern) + for _, c := range charPattern { + _, ok := s[c] + if !ok { + s[c] = 0 + } + } + i := 0 + + for _, c := range charPattern { + value := s[c] | int(uint(1)< y { + return x + } + return y +} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go new file mode 100644 index 0000000000..533ec0da7b --- /dev/null +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go @@ -0,0 +1,17 @@ +// Code generated by "stringer -type=Operation -trimprefix=Diff"; DO NOT EDIT. + +package diffmatchpatch + +import "fmt" + +const _Operation_name = "DeleteEqualInsert" + +var _Operation_index = [...]uint8{0, 6, 11, 17} + +func (i Operation) String() string { + i -= -1 + if i < 0 || i >= Operation(len(_Operation_index)-1) { + return fmt.Sprintf("Operation(%d)", i+-1) + } + return _Operation_name[_Operation_index[i]:_Operation_index[i+1]] +} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go new file mode 100644 index 0000000000..0dbe3bdd7d --- /dev/null +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go @@ -0,0 +1,556 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +package diffmatchpatch + +import ( + "bytes" + "errors" + "math" + "net/url" + "regexp" + "strconv" + "strings" +) + +// Patch represents one patch operation. +type Patch struct { + diffs []Diff + Start1 int + Start2 int + Length1 int + Length2 int +} + +// String emulates GNU diff's format. +// Header: @@ -382,8 +481,9 @@ +// Indices are printed as 1-based, not 0-based. +func (p *Patch) String() string { + var coords1, coords2 string + + if p.Length1 == 0 { + coords1 = strconv.Itoa(p.Start1) + ",0" + } else if p.Length1 == 1 { + coords1 = strconv.Itoa(p.Start1 + 1) + } else { + coords1 = strconv.Itoa(p.Start1+1) + "," + strconv.Itoa(p.Length1) + } + + if p.Length2 == 0 { + coords2 = strconv.Itoa(p.Start2) + ",0" + } else if p.Length2 == 1 { + coords2 = strconv.Itoa(p.Start2 + 1) + } else { + coords2 = strconv.Itoa(p.Start2+1) + "," + strconv.Itoa(p.Length2) + } + + var text bytes.Buffer + _, _ = text.WriteString("@@ -" + coords1 + " +" + coords2 + " @@\n") + + // Escape the body of the patch with %xx notation. + for _, aDiff := range p.diffs { + switch aDiff.Type { + case DiffInsert: + _, _ = text.WriteString("+") + case DiffDelete: + _, _ = text.WriteString("-") + case DiffEqual: + _, _ = text.WriteString(" ") + } + + _, _ = text.WriteString(strings.Replace(url.QueryEscape(aDiff.Text), "+", " ", -1)) + _, _ = text.WriteString("\n") + } + + return unescaper.Replace(text.String()) +} + +// PatchAddContext increases the context until it is unique, but doesn't let the pattern expand beyond MatchMaxBits. +func (dmp *DiffMatchPatch) PatchAddContext(patch Patch, text string) Patch { + if len(text) == 0 { + return patch + } + + pattern := text[patch.Start2 : patch.Start2+patch.Length1] + padding := 0 + + // Look for the first and last matches of pattern in text. If two different matches are found, increase the pattern length. + for strings.Index(text, pattern) != strings.LastIndex(text, pattern) && + len(pattern) < dmp.MatchMaxBits-2*dmp.PatchMargin { + padding += dmp.PatchMargin + maxStart := max(0, patch.Start2-padding) + minEnd := min(len(text), patch.Start2+patch.Length1+padding) + pattern = text[maxStart:minEnd] + } + // Add one chunk for good luck. + padding += dmp.PatchMargin + + // Add the prefix. + prefix := text[max(0, patch.Start2-padding):patch.Start2] + if len(prefix) != 0 { + patch.diffs = append([]Diff{Diff{DiffEqual, prefix}}, patch.diffs...) + } + // Add the suffix. + suffix := text[patch.Start2+patch.Length1 : min(len(text), patch.Start2+patch.Length1+padding)] + if len(suffix) != 0 { + patch.diffs = append(patch.diffs, Diff{DiffEqual, suffix}) + } + + // Roll back the start points. + patch.Start1 -= len(prefix) + patch.Start2 -= len(prefix) + // Extend the lengths. + patch.Length1 += len(prefix) + len(suffix) + patch.Length2 += len(prefix) + len(suffix) + + return patch +} + +// PatchMake computes a list of patches. +func (dmp *DiffMatchPatch) PatchMake(opt ...interface{}) []Patch { + if len(opt) == 1 { + diffs, _ := opt[0].([]Diff) + text1 := dmp.DiffText1(diffs) + return dmp.PatchMake(text1, diffs) + } else if len(opt) == 2 { + text1 := opt[0].(string) + switch t := opt[1].(type) { + case string: + diffs := dmp.DiffMain(text1, t, true) + if len(diffs) > 2 { + diffs = dmp.DiffCleanupSemantic(diffs) + diffs = dmp.DiffCleanupEfficiency(diffs) + } + return dmp.PatchMake(text1, diffs) + case []Diff: + return dmp.patchMake2(text1, t) + } + } else if len(opt) == 3 { + return dmp.PatchMake(opt[0], opt[2]) + } + return []Patch{} +} + +// patchMake2 computes a list of patches to turn text1 into text2. +// text2 is not provided, diffs are the delta between text1 and text2. +func (dmp *DiffMatchPatch) patchMake2(text1 string, diffs []Diff) []Patch { + // Check for null inputs not needed since null can't be passed in C#. + patches := []Patch{} + if len(diffs) == 0 { + return patches // Get rid of the null case. + } + + patch := Patch{} + charCount1 := 0 // Number of characters into the text1 string. + charCount2 := 0 // Number of characters into the text2 string. + // Start with text1 (prepatchText) and apply the diffs until we arrive at text2 (postpatchText). We recreate the patches one by one to determine context info. + prepatchText := text1 + postpatchText := text1 + + for i, aDiff := range diffs { + if len(patch.diffs) == 0 && aDiff.Type != DiffEqual { + // A new patch starts here. + patch.Start1 = charCount1 + patch.Start2 = charCount2 + } + + switch aDiff.Type { + case DiffInsert: + patch.diffs = append(patch.diffs, aDiff) + patch.Length2 += len(aDiff.Text) + postpatchText = postpatchText[:charCount2] + + aDiff.Text + postpatchText[charCount2:] + case DiffDelete: + patch.Length1 += len(aDiff.Text) + patch.diffs = append(patch.diffs, aDiff) + postpatchText = postpatchText[:charCount2] + postpatchText[charCount2+len(aDiff.Text):] + case DiffEqual: + if len(aDiff.Text) <= 2*dmp.PatchMargin && + len(patch.diffs) != 0 && i != len(diffs)-1 { + // Small equality inside a patch. + patch.diffs = append(patch.diffs, aDiff) + patch.Length1 += len(aDiff.Text) + patch.Length2 += len(aDiff.Text) + } + if len(aDiff.Text) >= 2*dmp.PatchMargin { + // Time for a new patch. + if len(patch.diffs) != 0 { + patch = dmp.PatchAddContext(patch, prepatchText) + patches = append(patches, patch) + patch = Patch{} + // Unlike Unidiff, our patch lists have a rolling context. http://code.google.com/p/google-diff-match-patch/wiki/Unidiff Update prepatch text & pos to reflect the application of the just completed patch. + prepatchText = postpatchText + charCount1 = charCount2 + } + } + } + + // Update the current character count. + if aDiff.Type != DiffInsert { + charCount1 += len(aDiff.Text) + } + if aDiff.Type != DiffDelete { + charCount2 += len(aDiff.Text) + } + } + + // Pick up the leftover patch if not empty. + if len(patch.diffs) != 0 { + patch = dmp.PatchAddContext(patch, prepatchText) + patches = append(patches, patch) + } + + return patches +} + +// PatchDeepCopy returns an array that is identical to a given an array of patches. +func (dmp *DiffMatchPatch) PatchDeepCopy(patches []Patch) []Patch { + patchesCopy := []Patch{} + for _, aPatch := range patches { + patchCopy := Patch{} + for _, aDiff := range aPatch.diffs { + patchCopy.diffs = append(patchCopy.diffs, Diff{ + aDiff.Type, + aDiff.Text, + }) + } + patchCopy.Start1 = aPatch.Start1 + patchCopy.Start2 = aPatch.Start2 + patchCopy.Length1 = aPatch.Length1 + patchCopy.Length2 = aPatch.Length2 + patchesCopy = append(patchesCopy, patchCopy) + } + return patchesCopy +} + +// PatchApply merges a set of patches onto the text. Returns a patched text, as well as an array of true/false values indicating which patches were applied. +func (dmp *DiffMatchPatch) PatchApply(patches []Patch, text string) (string, []bool) { + if len(patches) == 0 { + return text, []bool{} + } + + // Deep copy the patches so that no changes are made to originals. + patches = dmp.PatchDeepCopy(patches) + + nullPadding := dmp.PatchAddPadding(patches) + text = nullPadding + text + nullPadding + patches = dmp.PatchSplitMax(patches) + + x := 0 + // delta keeps track of the offset between the expected and actual location of the previous patch. If there are patches expected at positions 10 and 20, but the first patch was found at 12, delta is 2 and the second patch has an effective expected position of 22. + delta := 0 + results := make([]bool, len(patches)) + for _, aPatch := range patches { + expectedLoc := aPatch.Start2 + delta + text1 := dmp.DiffText1(aPatch.diffs) + var startLoc int + endLoc := -1 + if len(text1) > dmp.MatchMaxBits { + // PatchSplitMax will only provide an oversized pattern in the case of a monster delete. + startLoc = dmp.MatchMain(text, text1[:dmp.MatchMaxBits], expectedLoc) + if startLoc != -1 { + endLoc = dmp.MatchMain(text, + text1[len(text1)-dmp.MatchMaxBits:], expectedLoc+len(text1)-dmp.MatchMaxBits) + if endLoc == -1 || startLoc >= endLoc { + // Can't find valid trailing context. Drop this patch. + startLoc = -1 + } + } + } else { + startLoc = dmp.MatchMain(text, text1, expectedLoc) + } + if startLoc == -1 { + // No match found. :( + results[x] = false + // Subtract the delta for this failed patch from subsequent patches. + delta -= aPatch.Length2 - aPatch.Length1 + } else { + // Found a match. :) + results[x] = true + delta = startLoc - expectedLoc + var text2 string + if endLoc == -1 { + text2 = text[startLoc:int(math.Min(float64(startLoc+len(text1)), float64(len(text))))] + } else { + text2 = text[startLoc:int(math.Min(float64(endLoc+dmp.MatchMaxBits), float64(len(text))))] + } + if text1 == text2 { + // Perfect match, just shove the Replacement text in. + text = text[:startLoc] + dmp.DiffText2(aPatch.diffs) + text[startLoc+len(text1):] + } else { + // Imperfect match. Run a diff to get a framework of equivalent indices. + diffs := dmp.DiffMain(text1, text2, false) + if len(text1) > dmp.MatchMaxBits && float64(dmp.DiffLevenshtein(diffs))/float64(len(text1)) > dmp.PatchDeleteThreshold { + // The end points match, but the content is unacceptably bad. + results[x] = false + } else { + diffs = dmp.DiffCleanupSemanticLossless(diffs) + index1 := 0 + for _, aDiff := range aPatch.diffs { + if aDiff.Type != DiffEqual { + index2 := dmp.DiffXIndex(diffs, index1) + if aDiff.Type == DiffInsert { + // Insertion + text = text[:startLoc+index2] + aDiff.Text + text[startLoc+index2:] + } else if aDiff.Type == DiffDelete { + // Deletion + startIndex := startLoc + index2 + text = text[:startIndex] + + text[startIndex+dmp.DiffXIndex(diffs, index1+len(aDiff.Text))-index2:] + } + } + if aDiff.Type != DiffDelete { + index1 += len(aDiff.Text) + } + } + } + } + } + x++ + } + // Strip the padding off. + text = text[len(nullPadding) : len(nullPadding)+(len(text)-2*len(nullPadding))] + return text, results +} + +// PatchAddPadding adds some padding on text start and end so that edges can match something. +// Intended to be called only from within patchApply. +func (dmp *DiffMatchPatch) PatchAddPadding(patches []Patch) string { + paddingLength := dmp.PatchMargin + nullPadding := "" + for x := 1; x <= paddingLength; x++ { + nullPadding += string(rune(x)) + } + + // Bump all the patches forward. + for i := range patches { + patches[i].Start1 += paddingLength + patches[i].Start2 += paddingLength + } + + // Add some padding on start of first diff. + if len(patches[0].diffs) == 0 || patches[0].diffs[0].Type != DiffEqual { + // Add nullPadding equality. + patches[0].diffs = append([]Diff{Diff{DiffEqual, nullPadding}}, patches[0].diffs...) + patches[0].Start1 -= paddingLength // Should be 0. + patches[0].Start2 -= paddingLength // Should be 0. + patches[0].Length1 += paddingLength + patches[0].Length2 += paddingLength + } else if paddingLength > len(patches[0].diffs[0].Text) { + // Grow first equality. + extraLength := paddingLength - len(patches[0].diffs[0].Text) + patches[0].diffs[0].Text = nullPadding[len(patches[0].diffs[0].Text):] + patches[0].diffs[0].Text + patches[0].Start1 -= extraLength + patches[0].Start2 -= extraLength + patches[0].Length1 += extraLength + patches[0].Length2 += extraLength + } + + // Add some padding on end of last diff. + last := len(patches) - 1 + if len(patches[last].diffs) == 0 || patches[last].diffs[len(patches[last].diffs)-1].Type != DiffEqual { + // Add nullPadding equality. + patches[last].diffs = append(patches[last].diffs, Diff{DiffEqual, nullPadding}) + patches[last].Length1 += paddingLength + patches[last].Length2 += paddingLength + } else if paddingLength > len(patches[last].diffs[len(patches[last].diffs)-1].Text) { + // Grow last equality. + lastDiff := patches[last].diffs[len(patches[last].diffs)-1] + extraLength := paddingLength - len(lastDiff.Text) + patches[last].diffs[len(patches[last].diffs)-1].Text += nullPadding[:extraLength] + patches[last].Length1 += extraLength + patches[last].Length2 += extraLength + } + + return nullPadding +} + +// PatchSplitMax looks through the patches and breaks up any which are longer than the maximum limit of the match algorithm. +// Intended to be called only from within patchApply. +func (dmp *DiffMatchPatch) PatchSplitMax(patches []Patch) []Patch { + patchSize := dmp.MatchMaxBits + for x := 0; x < len(patches); x++ { + if patches[x].Length1 <= patchSize { + continue + } + bigpatch := patches[x] + // Remove the big old patch. + patches = append(patches[:x], patches[x+1:]...) + x-- + + Start1 := bigpatch.Start1 + Start2 := bigpatch.Start2 + precontext := "" + for len(bigpatch.diffs) != 0 { + // Create one of several smaller patches. + patch := Patch{} + empty := true + patch.Start1 = Start1 - len(precontext) + patch.Start2 = Start2 - len(precontext) + if len(precontext) != 0 { + patch.Length1 = len(precontext) + patch.Length2 = len(precontext) + patch.diffs = append(patch.diffs, Diff{DiffEqual, precontext}) + } + for len(bigpatch.diffs) != 0 && patch.Length1 < patchSize-dmp.PatchMargin { + diffType := bigpatch.diffs[0].Type + diffText := bigpatch.diffs[0].Text + if diffType == DiffInsert { + // Insertions are harmless. + patch.Length2 += len(diffText) + Start2 += len(diffText) + patch.diffs = append(patch.diffs, bigpatch.diffs[0]) + bigpatch.diffs = bigpatch.diffs[1:] + empty = false + } else if diffType == DiffDelete && len(patch.diffs) == 1 && patch.diffs[0].Type == DiffEqual && len(diffText) > 2*patchSize { + // This is a large deletion. Let it pass in one chunk. + patch.Length1 += len(diffText) + Start1 += len(diffText) + empty = false + patch.diffs = append(patch.diffs, Diff{diffType, diffText}) + bigpatch.diffs = bigpatch.diffs[1:] + } else { + // Deletion or equality. Only take as much as we can stomach. + diffText = diffText[:min(len(diffText), patchSize-patch.Length1-dmp.PatchMargin)] + + patch.Length1 += len(diffText) + Start1 += len(diffText) + if diffType == DiffEqual { + patch.Length2 += len(diffText) + Start2 += len(diffText) + } else { + empty = false + } + patch.diffs = append(patch.diffs, Diff{diffType, diffText}) + if diffText == bigpatch.diffs[0].Text { + bigpatch.diffs = bigpatch.diffs[1:] + } else { + bigpatch.diffs[0].Text = + bigpatch.diffs[0].Text[len(diffText):] + } + } + } + // Compute the head context for the next patch. + precontext = dmp.DiffText2(patch.diffs) + precontext = precontext[max(0, len(precontext)-dmp.PatchMargin):] + + postcontext := "" + // Append the end context for this patch. + if len(dmp.DiffText1(bigpatch.diffs)) > dmp.PatchMargin { + postcontext = dmp.DiffText1(bigpatch.diffs)[:dmp.PatchMargin] + } else { + postcontext = dmp.DiffText1(bigpatch.diffs) + } + + if len(postcontext) != 0 { + patch.Length1 += len(postcontext) + patch.Length2 += len(postcontext) + if len(patch.diffs) != 0 && patch.diffs[len(patch.diffs)-1].Type == DiffEqual { + patch.diffs[len(patch.diffs)-1].Text += postcontext + } else { + patch.diffs = append(patch.diffs, Diff{DiffEqual, postcontext}) + } + } + if !empty { + x++ + patches = append(patches[:x], append([]Patch{patch}, patches[x:]...)...) + } + } + } + return patches +} + +// PatchToText takes a list of patches and returns a textual representation. +func (dmp *DiffMatchPatch) PatchToText(patches []Patch) string { + var text bytes.Buffer + for _, aPatch := range patches { + _, _ = text.WriteString(aPatch.String()) + } + return text.String() +} + +// PatchFromText parses a textual representation of patches and returns a List of Patch objects. +func (dmp *DiffMatchPatch) PatchFromText(textline string) ([]Patch, error) { + patches := []Patch{} + if len(textline) == 0 { + return patches, nil + } + text := strings.Split(textline, "\n") + textPointer := 0 + patchHeader := regexp.MustCompile("^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$") + + var patch Patch + var sign uint8 + var line string + for textPointer < len(text) { + + if !patchHeader.MatchString(text[textPointer]) { + return patches, errors.New("Invalid patch string: " + text[textPointer]) + } + + patch = Patch{} + m := patchHeader.FindStringSubmatch(text[textPointer]) + + patch.Start1, _ = strconv.Atoi(m[1]) + if len(m[2]) == 0 { + patch.Start1-- + patch.Length1 = 1 + } else if m[2] == "0" { + patch.Length1 = 0 + } else { + patch.Start1-- + patch.Length1, _ = strconv.Atoi(m[2]) + } + + patch.Start2, _ = strconv.Atoi(m[3]) + + if len(m[4]) == 0 { + patch.Start2-- + patch.Length2 = 1 + } else if m[4] == "0" { + patch.Length2 = 0 + } else { + patch.Start2-- + patch.Length2, _ = strconv.Atoi(m[4]) + } + textPointer++ + + for textPointer < len(text) { + if len(text[textPointer]) > 0 { + sign = text[textPointer][0] + } else { + textPointer++ + continue + } + + line = text[textPointer][1:] + line = strings.Replace(line, "+", "%2b", -1) + line, _ = url.QueryUnescape(line) + if sign == '-' { + // Deletion. + patch.diffs = append(patch.diffs, Diff{DiffDelete, line}) + } else if sign == '+' { + // Insertion. + patch.diffs = append(patch.diffs, Diff{DiffInsert, line}) + } else if sign == ' ' { + // Minor equality. + patch.diffs = append(patch.diffs, Diff{DiffEqual, line}) + } else if sign == '@' { + // Start of next patch. + break + } else { + // WTF? + return patches, errors.New("Invalid patch mode '" + string(sign) + "' in: " + string(line)) + } + textPointer++ + } + + patches = append(patches, patch) + } + return patches, nil +} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go new file mode 100644 index 0000000000..44c4359547 --- /dev/null +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go @@ -0,0 +1,106 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +package diffmatchpatch + +import ( + "strconv" + "strings" + "unicode/utf8" +) + +// unescaper unescapes selected chars for compatibility with JavaScript's encodeURI. +// In speed critical applications this could be dropped since the receiving application will certainly decode these fine. Note that this function is case-sensitive. Thus "%3F" would not be unescaped. But this is ok because it is only called with the output of HttpUtility.UrlEncode which returns lowercase hex. Example: "%3f" -> "?", "%24" -> "$", etc. +var unescaper = strings.NewReplacer( + "%21", "!", "%7E", "~", "%27", "'", + "%28", "(", "%29", ")", "%3B", ";", + "%2F", "/", "%3F", "?", "%3A", ":", + "%40", "@", "%26", "&", "%3D", "=", + "%2B", "+", "%24", "$", "%2C", ",", "%23", "#", "%2A", "*") + +// indexOf returns the first index of pattern in str, starting at str[i]. +func indexOf(str string, pattern string, i int) int { + if i > len(str)-1 { + return -1 + } + if i <= 0 { + return strings.Index(str, pattern) + } + ind := strings.Index(str[i:], pattern) + if ind == -1 { + return -1 + } + return ind + i +} + +// lastIndexOf returns the last index of pattern in str, starting at str[i]. +func lastIndexOf(str string, pattern string, i int) int { + if i < 0 { + return -1 + } + if i >= len(str) { + return strings.LastIndex(str, pattern) + } + _, size := utf8.DecodeRuneInString(str[i:]) + return strings.LastIndex(str[:i+size], pattern) +} + +// runesIndexOf returns the index of pattern in target, starting at target[i]. +func runesIndexOf(target, pattern []rune, i int) int { + if i > len(target)-1 { + return -1 + } + if i <= 0 { + return runesIndex(target, pattern) + } + ind := runesIndex(target[i:], pattern) + if ind == -1 { + return -1 + } + return ind + i +} + +func runesEqual(r1, r2 []rune) bool { + if len(r1) != len(r2) { + return false + } + for i, c := range r1 { + if c != r2[i] { + return false + } + } + return true +} + +// runesIndex is the equivalent of strings.Index for rune slices. +func runesIndex(r1, r2 []rune) int { + last := len(r1) - len(r2) + for i := 0; i <= last; i++ { + if runesEqual(r1[i:i+len(r2)], r2) { + return i + } + } + return -1 +} + +func intArrayToString(ns []uint32) string { + if len(ns) == 0 { + return "" + } + + indexSeparator := IndexSeparator[0] + + // Appr. 3 chars per num plus the comma. + b := []byte{} + for _, n := range ns { + b = strconv.AppendInt(b, int64(n), 10) + b = append(b, indexSeparator) + } + b = b[:len(b)-1] + return string(b) +} diff --git a/vendor/github.com/whilp/git-urls/.travis.yml b/vendor/github.com/whilp/git-urls/.travis.yml new file mode 100644 index 0000000000..2f050db09e --- /dev/null +++ b/vendor/github.com/whilp/git-urls/.travis.yml @@ -0,0 +1,7 @@ +language: go + +go: + - 1.11 + +install: + - make deps install lint test diff --git a/vendor/github.com/whilp/git-urls/LICENSE b/vendor/github.com/whilp/git-urls/LICENSE new file mode 100644 index 0000000000..2aa848db5f --- /dev/null +++ b/vendor/github.com/whilp/git-urls/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Will Maier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/whilp/git-urls/Makefile b/vendor/github.com/whilp/git-urls/Makefile new file mode 100644 index 0000000000..7d6c569eb3 --- /dev/null +++ b/vendor/github.com/whilp/git-urls/Makefile @@ -0,0 +1,16 @@ +default: test lint + +test: + go test -v ./... + go test -covermode=count -coverprofile=profile.cov . + +lint: + gometalinter ./... + +install: + go get -d -v ./... && go build -v ./... + gometalinter --install --update + +deps: + go get github.com/alecthomas/gometalinter + go get golang.org/x/tools/cmd/cover diff --git a/vendor/github.com/whilp/git-urls/README.md b/vendor/github.com/whilp/git-urls/README.md new file mode 100644 index 0000000000..3acacc5998 --- /dev/null +++ b/vendor/github.com/whilp/git-urls/README.md @@ -0,0 +1,3 @@ +# git-urls + +Docs: https://pkg.go.dev/github.com/whilp/git-urls?tab=overview diff --git a/vendor/github.com/whilp/git-urls/go.mod b/vendor/github.com/whilp/git-urls/go.mod new file mode 100644 index 0000000000..59ec93f19d --- /dev/null +++ b/vendor/github.com/whilp/git-urls/go.mod @@ -0,0 +1,3 @@ +module github.com/whilp/git-urls + +go 1.13 diff --git a/vendor/github.com/whilp/git-urls/urls.go b/vendor/github.com/whilp/git-urls/urls.go new file mode 100644 index 0000000000..02341030a3 --- /dev/null +++ b/vendor/github.com/whilp/git-urls/urls.go @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2014 Will Maier + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* +Package giturls parses Git URLs. + +These URLs include standard RFC 3986 URLs as well as special formats that +are specific to Git. Examples are provided in the Git documentation at +https://www.kernel.org/pub/software/scm/git/docs/git-clone.html. +*/ +package giturls + +import ( + "fmt" + "net/url" + "regexp" + "strings" +) + +var ( + // scpSyntax was modified from https://golang.org/src/cmd/go/vcs.go. + scpSyntax = regexp.MustCompile(`^([a-zA-Z0-9_]+@)?([a-zA-Z0-9._-]+):([a-zA-Z0-9./._-]+)(?:\?||$)(.*)$`) + + // Transports is a set of known Git URL schemes. + Transports = NewTransportSet( + "ssh", + "git", + "git+ssh", + "http", + "https", + "ftp", + "ftps", + "rsync", + "file", + ) +) + +// Parser converts a string into a URL. +type Parser func(string) (*url.URL, error) + +// Parse parses rawurl into a URL structure. Parse first attempts to +// find a standard URL with a valid Git transport as its scheme. If +// that cannot be found, it then attempts to find a SCP-like URL. And +// if that cannot be found, it assumes rawurl is a local path. If none +// of these rules apply, Parse returns an error. +func Parse(rawurl string) (u *url.URL, err error) { + parsers := []Parser{ + ParseTransport, + ParseScp, + ParseLocal, + } + + // Apply each parser in turn; if the parser succeeds, accept its + // result and return. + for _, p := range parsers { + u, err = p(rawurl) + if err == nil { + return u, err + } + } + + // It's unlikely that none of the parsers will succeed, since + // ParseLocal is very forgiving. + return new(url.URL), fmt.Errorf("failed to parse %q", rawurl) +} + +// ParseTransport parses rawurl into a URL object. Unless the URL's +// scheme is a known Git transport, ParseTransport returns an error. +func ParseTransport(rawurl string) (*url.URL, error) { + u, err := url.Parse(rawurl) + if err == nil && !Transports.Valid(u.Scheme) { + err = fmt.Errorf("scheme %q is not a valid transport", u.Scheme) + } + return u, err +} + +// ParseScp parses rawurl into a URL object. The rawurl must be +// an SCP-like URL, otherwise ParseScp returns an error. +func ParseScp(rawurl string) (*url.URL, error) { + match := scpSyntax.FindAllStringSubmatch(rawurl, -1) + if len(match) == 0 { + return nil, fmt.Errorf("no scp URL found in %q", rawurl) + } + m := match[0] + user := strings.TrimRight(m[1], "@") + var userinfo *url.Userinfo + if user != "" { + userinfo = url.User(user) + } + rawquery := "" + if len(m) > 3 { + rawquery = m[4] + } + return &url.URL{ + Scheme: "ssh", + User: userinfo, + Host: m[2], + Path: m[3], + RawQuery: rawquery, + }, nil +} + +// ParseLocal parses rawurl into a URL object with a "file" +// scheme. This will effectively never return an error. +func ParseLocal(rawurl string) (*url.URL, error) { + return &url.URL{ + Scheme: "file", + Host: "", + Path: rawurl, + }, nil +} + +// TransportSet represents a set of valid Git transport schemes. It +// maps these schemes to empty structs, providing a set-like +// interface. +type TransportSet struct { + Transports map[string]struct{} +} + +// NewTransportSet returns a TransportSet with the items keys mapped +// to empty struct values. +func NewTransportSet(items ...string) *TransportSet { + t := &TransportSet{ + Transports: map[string]struct{}{}, + } + for _, i := range items { + t.Transports[i] = struct{}{} + } + return t +} + +// Valid returns true if transport is a known Git URL scheme and false +// if not. +func (t *TransportSet) Valid(transport string) bool { + _, ok := t.Transports[transport] + return ok +} diff --git a/vendor/github.com/xanzy/ssh-agent/.gitignore b/vendor/github.com/xanzy/ssh-agent/.gitignore new file mode 100644 index 0000000000..daf913b1b3 --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/xanzy/ssh-agent/LICENSE b/vendor/github.com/xanzy/ssh-agent/LICENSE new file mode 100644 index 0000000000..8f71f43fee --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/vendor/github.com/xanzy/ssh-agent/README.md b/vendor/github.com/xanzy/ssh-agent/README.md new file mode 100644 index 0000000000..e2dfcedca9 --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/README.md @@ -0,0 +1,23 @@ +# ssh-agent + +Create a new [agent.Agent](https://godoc.org/golang.org/x/crypto/ssh/agent#Agent) on any type of OS (so including Windows) from any [Go](https://golang.org) application. + +## Limitations + +When compiled for Windows, it will only support [Pageant](http://the.earth.li/~sgtatham/putty/0.66/htmldoc/Chapter9.html#pageant) as the SSH authentication agent. + +## Credits + +Big thanks to [Давид Мзареулян (David Mzareulyan)](https://github.com/davidmz) for creating the [go-pageant](https://github.com/davidmz/go-pageant) package! + +## Issues + +If you have an issue: report it on the [issue tracker](https://github.com/xanzy/ssh-agent/issues) + +## Author + +Sander van Harmelen () + +## License + +The files `pageant_windows.go` and `sshagent_windows.go` have their own license (see file headers). The rest of this package is licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/vendor/github.com/xanzy/ssh-agent/go.mod b/vendor/github.com/xanzy/ssh-agent/go.mod new file mode 100644 index 0000000000..bd47fb98ed --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/go.mod @@ -0,0 +1,9 @@ +module github.com/xanzy/ssh-agent + +go 1.16 + +require ( + github.com/Microsoft/go-winio v0.5.0 + golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect +) diff --git a/vendor/github.com/xanzy/ssh-agent/go.sum b/vendor/github.com/xanzy/ssh-agent/go.sum new file mode 100644 index 0000000000..3f1606595f --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/go.sum @@ -0,0 +1,20 @@ +github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/xanzy/ssh-agent/pageant_windows.go b/vendor/github.com/xanzy/ssh-agent/pageant_windows.go new file mode 100644 index 0000000000..21d3cba2a5 --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/pageant_windows.go @@ -0,0 +1,143 @@ +// +// Copyright (c) 2014 David Mzareulyan +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software +// and associated documentation files (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial +// portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +// +build windows + +package sshagent + +// see https://github.com/Yasushi/putty/blob/master/windows/winpgntc.c#L155 +// see https://github.com/paramiko/paramiko/blob/master/paramiko/win_pageant.py + +import ( + "encoding/binary" + "errors" + "fmt" + "sync" + "syscall" + "unsafe" +) + +// Maximum size of message can be sent to pageant +const MaxMessageLen = 8192 + +var ( + ErrPageantNotFound = errors.New("pageant process not found") + ErrSendMessage = errors.New("error sending message") + + ErrMessageTooLong = errors.New("message too long") + ErrInvalidMessageFormat = errors.New("invalid message format") + ErrResponseTooLong = errors.New("response too long") +) + +const ( + agentCopydataID = 0x804e50ba + wmCopydata = 74 +) + +type copyData struct { + dwData uintptr + cbData uint32 + lpData unsafe.Pointer +} + +var ( + lock sync.Mutex + + winFindWindow = winAPI("user32.dll", "FindWindowW") + winGetCurrentThreadID = winAPI("kernel32.dll", "GetCurrentThreadId") + winSendMessage = winAPI("user32.dll", "SendMessageW") +) + +func winAPI(dllName, funcName string) func(...uintptr) (uintptr, uintptr, error) { + proc := syscall.MustLoadDLL(dllName).MustFindProc(funcName) + return func(a ...uintptr) (uintptr, uintptr, error) { return proc.Call(a...) } +} + +// Query sends message msg to Pageant and returns response or error. +// 'msg' is raw agent request with length prefix +// Response is raw agent response with length prefix +func query(msg []byte) ([]byte, error) { + if len(msg) > MaxMessageLen { + return nil, ErrMessageTooLong + } + + msgLen := binary.BigEndian.Uint32(msg[:4]) + if len(msg) != int(msgLen)+4 { + return nil, ErrInvalidMessageFormat + } + + lock.Lock() + defer lock.Unlock() + + paWin := pageantWindow() + + if paWin == 0 { + return nil, ErrPageantNotFound + } + + thID, _, _ := winGetCurrentThreadID() + mapName := fmt.Sprintf("PageantRequest%08x", thID) + pMapName, _ := syscall.UTF16PtrFromString(mapName) + + mmap, err := syscall.CreateFileMapping(syscall.InvalidHandle, nil, syscall.PAGE_READWRITE, 0, MaxMessageLen+4, pMapName) + if err != nil { + return nil, err + } + defer syscall.CloseHandle(mmap) + + ptr, err := syscall.MapViewOfFile(mmap, syscall.FILE_MAP_WRITE, 0, 0, 0) + if err != nil { + return nil, err + } + defer syscall.UnmapViewOfFile(ptr) + + mmSlice := (*(*[MaxMessageLen]byte)(unsafe.Pointer(ptr)))[:] + + copy(mmSlice, msg) + + mapNameBytesZ := append([]byte(mapName), 0) + + cds := copyData{ + dwData: agentCopydataID, + cbData: uint32(len(mapNameBytesZ)), + lpData: unsafe.Pointer(&(mapNameBytesZ[0])), + } + + resp, _, _ := winSendMessage(paWin, wmCopydata, 0, uintptr(unsafe.Pointer(&cds))) + + if resp == 0 { + return nil, ErrSendMessage + } + + respLen := binary.BigEndian.Uint32(mmSlice[:4]) + if respLen > MaxMessageLen-4 { + return nil, ErrResponseTooLong + } + + respData := make([]byte, respLen+4) + copy(respData, mmSlice) + + return respData, nil +} + +func pageantWindow() uintptr { + nameP, _ := syscall.UTF16PtrFromString("Pageant") + h, _, _ := winFindWindow(uintptr(unsafe.Pointer(nameP)), uintptr(unsafe.Pointer(nameP))) + return h +} diff --git a/vendor/github.com/xanzy/ssh-agent/sshagent.go b/vendor/github.com/xanzy/ssh-agent/sshagent.go new file mode 100644 index 0000000000..259fea2b63 --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/sshagent.go @@ -0,0 +1,49 @@ +// +// Copyright 2015, Sander van Harmelen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +build !windows + +package sshagent + +import ( + "errors" + "fmt" + "net" + "os" + + "golang.org/x/crypto/ssh/agent" +) + +// New returns a new agent.Agent that uses a unix socket +func New() (agent.Agent, net.Conn, error) { + if !Available() { + return nil, nil, errors.New("SSH agent requested but SSH_AUTH_SOCK not-specified") + } + + sshAuthSock := os.Getenv("SSH_AUTH_SOCK") + + conn, err := net.Dial("unix", sshAuthSock) + if err != nil { + return nil, nil, fmt.Errorf("Error connecting to SSH_AUTH_SOCK: %v", err) + } + + return agent.NewClient(conn), conn, nil +} + +// Available returns true is a auth socket is defined +func Available() bool { + return os.Getenv("SSH_AUTH_SOCK") != "" +} diff --git a/vendor/github.com/xanzy/ssh-agent/sshagent_windows.go b/vendor/github.com/xanzy/ssh-agent/sshagent_windows.go new file mode 100644 index 0000000000..ca77e6a965 --- /dev/null +++ b/vendor/github.com/xanzy/ssh-agent/sshagent_windows.go @@ -0,0 +1,103 @@ +// +// Copyright (c) 2014 David Mzareulyan +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software +// and associated documentation files (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial +// portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +// +build windows + +package sshagent + +import ( + "errors" + "io" + "net" + "sync" + + "github.com/Microsoft/go-winio" + "golang.org/x/crypto/ssh/agent" +) + +const ( + sshAgentPipe = `\\.\pipe\openssh-ssh-agent` +) + +// Available returns true if Pageant is running +func Available() bool { + if pageantWindow() != 0 { + return true + } + conn, err := winio.DialPipe(sshAgentPipe, nil) + if err != nil { + return false + } + conn.Close() + return true +} + +// New returns a new agent.Agent and the (custom) connection it uses +// to communicate with a running pagent.exe instance (see README.md) +func New() (agent.Agent, net.Conn, error) { + if pageantWindow() != 0 { + return agent.NewClient(&conn{}), nil, nil + } + conn, err := winio.DialPipe(sshAgentPipe, nil) + if err != nil { + return nil, nil, errors.New( + "SSH agent requested, but could not detect Pageant or Windows native SSH agent", + ) + } + return agent.NewClient(conn), nil, nil +} + +type conn struct { + sync.Mutex + buf []byte +} + +func (c *conn) Close() { + c.Lock() + defer c.Unlock() + c.buf = nil +} + +func (c *conn) Write(p []byte) (int, error) { + c.Lock() + defer c.Unlock() + + resp, err := query(p) + if err != nil { + return 0, err + } + + c.buf = append(c.buf, resp...) + + return len(p), nil +} + +func (c *conn) Read(p []byte) (int, error) { + c.Lock() + defer c.Unlock() + + if len(c.buf) == 0 { + return 0, io.EOF + } + + n := copy(p, c.buf) + c.buf = c.buf[n:] + + return n, nil +} diff --git a/vendor/go.uber.org/multierr/.travis.yml b/vendor/go.uber.org/multierr/.travis.yml deleted file mode 100644 index 8636ab42ad..0000000000 --- a/vendor/go.uber.org/multierr/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false -language: go -go_import_path: go.uber.org/multierr - -env: - global: - - GO111MODULE=on - -go: - - oldstable - - stable - -before_install: -- go version - -script: -- | - set -e - make lint - make cover - -after_success: -- bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/multierr/CHANGELOG.md b/vendor/go.uber.org/multierr/CHANGELOG.md index 6f1db9ef4a..b0814e7c9b 100644 --- a/vendor/go.uber.org/multierr/CHANGELOG.md +++ b/vendor/go.uber.org/multierr/CHANGELOG.md @@ -1,6 +1,12 @@ Releases ======== +v1.7.0 (2021-05-06) +=================== + +- Add `AppendInvoke` to append into errors from `defer` blocks. + + v1.6.0 (2020-09-14) =================== diff --git a/vendor/go.uber.org/multierr/LICENSE.txt b/vendor/go.uber.org/multierr/LICENSE.txt index 858e02475f..413e30f7ce 100644 --- a/vendor/go.uber.org/multierr/LICENSE.txt +++ b/vendor/go.uber.org/multierr/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2017 Uber Technologies, Inc. +Copyright (c) 2017-2021 Uber Technologies, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/go.uber.org/multierr/Makefile b/vendor/go.uber.org/multierr/Makefile index 316004400b..dcb6fe723c 100644 --- a/vendor/go.uber.org/multierr/Makefile +++ b/vendor/go.uber.org/multierr/Makefile @@ -34,9 +34,5 @@ lint: gofmt golint staticcheck .PHONY: cover cover: - go test -coverprofile=cover.out -coverpkg=./... -v ./... + go test -race -coverprofile=cover.out -coverpkg=./... -v ./... go tool cover -html=cover.out -o cover.html - -update-license: - @cd tools && go install go.uber.org/tools/update-license - @$(GOBIN)/update-license $(GO_FILES) diff --git a/vendor/go.uber.org/multierr/README.md b/vendor/go.uber.org/multierr/README.md index 751bd65e58..70aacecd71 100644 --- a/vendor/go.uber.org/multierr/README.md +++ b/vendor/go.uber.org/multierr/README.md @@ -15,9 +15,9 @@ Stable: No breaking changes will be made before 2.0. Released under the [MIT License]. [MIT License]: LICENSE.txt -[doc-img]: https://godoc.org/go.uber.org/multierr?status.svg -[doc]: https://godoc.org/go.uber.org/multierr -[ci-img]: https://travis-ci.com/uber-go/multierr.svg?branch=master +[doc-img]: https://pkg.go.dev/badge/go.uber.org/multierr +[doc]: https://pkg.go.dev/go.uber.org/multierr +[ci-img]: https://github.com/uber-go/multierr/actions/workflows/go.yml/badge.svg [cov-img]: https://codecov.io/gh/uber-go/multierr/branch/master/graph/badge.svg -[ci]: https://travis-ci.com/uber-go/multierr +[ci]: https://github.com/uber-go/multierr/actions/workflows/go.yml [cov]: https://codecov.io/gh/uber-go/multierr diff --git a/vendor/go.uber.org/multierr/error.go b/vendor/go.uber.org/multierr/error.go index 5c9b67d537..faa0a05946 100644 --- a/vendor/go.uber.org/multierr/error.go +++ b/vendor/go.uber.org/multierr/error.go @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Uber Technologies, Inc. +// Copyright (c) 2017-2021 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -35,8 +35,53 @@ // // err = multierr.Append(reader.Close(), writer.Close()) // -// This makes it possible to record resource cleanup failures from deferred -// blocks with the help of named return values. +// The underlying list of errors for a returned error object may be retrieved +// with the Errors function. +// +// errors := multierr.Errors(err) +// if len(errors) > 0 { +// fmt.Println("The following errors occurred:", errors) +// } +// +// Appending from a loop +// +// You sometimes need to append into an error from a loop. +// +// var err error +// for _, item := range items { +// err = multierr.Append(err, process(item)) +// } +// +// Cases like this may require knowledge of whether an individual instance +// failed. This usually requires introduction of a new variable. +// +// var err error +// for _, item := range items { +// if perr := process(item); perr != nil { +// log.Warn("skipping item", item) +// err = multierr.Append(err, perr) +// } +// } +// +// multierr includes AppendInto to simplify cases like this. +// +// var err error +// for _, item := range items { +// if multierr.AppendInto(&err, process(item)) { +// log.Warn("skipping item", item) +// } +// } +// +// This will append the error into the err variable, and return true if that +// individual error was non-nil. +// +// See AppendInto for more information. +// +// Deferred Functions +// +// Go makes it possible to modify the return value of a function in a defer +// block if the function was using named returns. This makes it possible to +// record resource cleanup failures from deferred blocks. // // func sendRequest(req Request) (err error) { // conn, err := openConnection() @@ -49,14 +94,21 @@ // // ... // } // -// The underlying list of errors for a returned error object may be retrieved -// with the Errors function. +// multierr provides the Invoker type and AppendInvoke function to make cases +// like the above simpler and obviate the need for a closure. The following is +// roughly equivalent to the example above. // -// errors := multierr.Errors(err) -// if len(errors) > 0 { -// fmt.Println("The following errors occurred:", errors) +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer multierr.AppendInvoke(err, multierr.Close(conn)) +// // ... // } // +// See AppendInvoke and Invoker for more information. +// // Advanced Usage // // Errors returned by Combine and Append MAY implement the following @@ -87,6 +139,7 @@ package multierr // import "go.uber.org/multierr" import ( "bytes" + "errors" "fmt" "io" "strings" @@ -186,6 +239,33 @@ func (merr *multiError) Errors() []error { return merr.errors } +// As attempts to find the first error in the error list that matches the type +// of the value that target points to. +// +// This function allows errors.As to traverse the values stored on the +// multierr error. +func (merr *multiError) As(target interface{}) bool { + for _, err := range merr.Errors() { + if errors.As(err, target) { + return true + } + } + return false +} + +// Is attempts to match the provided error against errors in the error list. +// +// This function allows errors.Is to traverse the values stored on the +// multierr error. +func (merr *multiError) Is(target error) bool { + for _, err := range merr.Errors() { + if errors.Is(err, target) { + return true + } + } + return false +} + func (merr *multiError) Error() string { if merr == nil { return "" @@ -421,7 +501,7 @@ func Append(left error, right error) error { // items = append(items, item) // } // -// Compare this with a verison that relies solely on Append: +// Compare this with a version that relies solely on Append: // // var err error // for line := range lines { @@ -447,3 +527,113 @@ func AppendInto(into *error, err error) (errored bool) { *into = Append(*into, err) return true } + +// Invoker is an operation that may fail with an error. Use it with +// AppendInvoke to append the result of calling the function into an error. +// This allows you to conveniently defer capture of failing operations. +// +// See also, Close and Invoke. +type Invoker interface { + Invoke() error +} + +// Invoke wraps a function which may fail with an error to match the Invoker +// interface. Use it to supply functions matching this signature to +// AppendInvoke. +// +// For example, +// +// func processReader(r io.Reader) (err error) { +// scanner := bufio.NewScanner(r) +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// for scanner.Scan() { +// // ... +// } +// // ... +// } +// +// In this example, the following line will construct the Invoker right away, +// but defer the invocation of scanner.Err() until the function returns. +// +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +type Invoke func() error + +// Invoke calls the supplied function and returns its result. +func (i Invoke) Invoke() error { return i() } + +// Close builds an Invoker that closes the provided io.Closer. Use it with +// AppendInvoke to close io.Closers and append their results into an error. +// +// For example, +// +// func processFile(path string) (err error) { +// f, err := os.Open(path) +// if err != nil { +// return err +// } +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// return processReader(f) +// } +// +// In this example, multierr.Close will construct the Invoker right away, but +// defer the invocation of f.Close until the function returns. +// +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +func Close(closer io.Closer) Invoker { + return Invoke(closer.Close) +} + +// AppendInvoke appends the result of calling the given Invoker into the +// provided error pointer. Use it with named returns to safely defer +// invocation of fallible operations until a function returns, and capture the +// resulting errors. +// +// func doSomething(...) (err error) { +// // ... +// f, err := openFile(..) +// if err != nil { +// return err +// } +// +// // multierr will call f.Close() when this function returns and +// // if the operation fails, its append its error into the +// // returned error. +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// +// scanner := bufio.NewScanner(f) +// // Similarly, this scheduled scanner.Err to be called and +// // inspected when the function returns and append its error +// // into the returned error. +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// +// // ... +// } +// +// Without defer, AppendInvoke behaves exactly like AppendInto. +// +// err := // ... +// multierr.AppendInvoke(&err, mutltierr.Invoke(foo)) +// +// // ...is roughly equivalent to... +// +// err := // ... +// multierr.AppendInto(&err, foo()) +// +// The advantage of the indirection introduced by Invoker is to make it easy +// to defer the invocation of a function. Without this indirection, the +// invoked function will be evaluated at the time of the defer block rather +// than when the function returns. +// +// // BAD: This is likely not what the caller intended. This will evaluate +// // foo() right away and append its result into the error when the +// // function returns. +// defer multierr.AppendInto(&err, foo()) +// +// // GOOD: This will defer invocation of foo unutil the function returns. +// defer multierr.AppendInvoke(&err, multierr.Invoke(foo)) +// +// multierr provides a few Invoker implementations out of the box for +// convenience. See Invoker for more information. +func AppendInvoke(into *error, invoker Invoker) { + AppendInto(into, invoker.Invoke()) +} diff --git a/vendor/go.uber.org/multierr/go.mod b/vendor/go.uber.org/multierr/go.mod index ff8bdf95fc..398d6c99e7 100644 --- a/vendor/go.uber.org/multierr/go.mod +++ b/vendor/go.uber.org/multierr/go.mod @@ -1,8 +1,9 @@ module go.uber.org/multierr -go 1.12 +go 1.14 require ( - github.com/stretchr/testify v1.3.0 + github.com/stretchr/testify v1.7.0 go.uber.org/atomic v1.7.0 + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/vendor/go.uber.org/multierr/go.sum b/vendor/go.uber.org/multierr/go.sum index ecfc286578..75edd735e0 100644 --- a/vendor/go.uber.org/multierr/go.sum +++ b/vendor/go.uber.org/multierr/go.sum @@ -1,11 +1,16 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/go.uber.org/multierr/go113.go b/vendor/go.uber.org/multierr/go113.go deleted file mode 100644 index 264b0eac0d..0000000000 --- a/vendor/go.uber.org/multierr/go113.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2019 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -// +build go1.13 - -package multierr - -import "errors" - -// As attempts to find the first error in the error list that matches the type -// of the value that target points to. -// -// This function allows errors.As to traverse the values stored on the -// multierr error. -func (merr *multiError) As(target interface{}) bool { - for _, err := range merr.Errors() { - if errors.As(err, target) { - return true - } - } - return false -} - -// Is attempts to match the provided error against errors in the error list. -// -// This function allows errors.Is to traverse the values stored on the -// multierr error. -func (merr *multiError) Is(target error) bool { - for _, err := range merr.Errors() { - if errors.Is(err, target) { - return true - } - } - return false -} diff --git a/vendor/go.uber.org/zap/.readme.tmpl b/vendor/go.uber.org/zap/.readme.tmpl index 3154a1e64c..92aa65d660 100644 --- a/vendor/go.uber.org/zap/.readme.tmpl +++ b/vendor/go.uber.org/zap/.readme.tmpl @@ -96,14 +96,14 @@ Released under the [MIT License](LICENSE.txt). 1 In particular, keep in mind that we may be benchmarking against slightly older versions of other packages. Versions are -pinned in zap's [glide.lock][] file. [↩](#anchor-versions) +pinned in the [benchmarks/go.mod][] file. [↩](#anchor-versions) -[doc-img]: https://godoc.org/go.uber.org/zap?status.svg -[doc]: https://godoc.org/go.uber.org/zap -[ci-img]: https://travis-ci.com/uber-go/zap.svg?branch=master -[ci]: https://travis-ci.com/uber-go/zap +[doc-img]: https://pkg.go.dev/badge/go.uber.org/zap +[doc]: https://pkg.go.dev/go.uber.org/zap +[ci-img]: https://github.com/uber-go/zap/actions/workflows/go.yml/badge.svg +[ci]: https://github.com/uber-go/zap/actions/workflows/go.yml [cov-img]: https://codecov.io/gh/uber-go/zap/branch/master/graph/badge.svg [cov]: https://codecov.io/gh/uber-go/zap [benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks -[glide.lock]: https://github.com/uber-go/zap/blob/master/glide.lock +[benchmarks/go.mod]: https://github.com/uber-go/zap/blob/master/benchmarks/go.mod diff --git a/vendor/go.uber.org/zap/CHANGELOG.md b/vendor/go.uber.org/zap/CHANGELOG.md index 794ee303e1..bfc493c80e 100644 --- a/vendor/go.uber.org/zap/CHANGELOG.md +++ b/vendor/go.uber.org/zap/CHANGELOG.md @@ -3,9 +3,36 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 1.20.0 (4 Jan 2022) + +Enhancements: +* [#989][]: Add `EncoderConfig.SkipLineEnding` flag to disable adding newline + characters between log statements. +* [#1039][]: Add `EncoderConfig.NewReflectedEncoder` field to customize JSON + encoding of reflected log fields. + +Bugfixes: +* [#1011][]: Fix inaccurate precision when encoding complex64 as JSON. +* [#554][], [#1017][]: Close JSON namespaces opened in `MarshalLogObject` + methods when the methods return. +* [#1033][]: Avoid panicking in Sampler core if `thereafter` is zero. + +Other changes: +* [#1028][]: Drop support for Go < 1.15. + +[#554]: https://github.com/uber-go/zap/pull/554 +[#989]: https://github.com/uber-go/zap/pull/989 +[#1011]: https://github.com/uber-go/zap/pull/1011 +[#1017]: https://github.com/uber-go/zap/pull/1017 +[#1028]: https://github.com/uber-go/zap/pull/1028 +[#1033]: https://github.com/uber-go/zap/pull/1033 +[#1039]: https://github.com/uber-go/zap/pull/1039 + +Thanks to @psrajat, @lruggieri, @sammyrnycreal for their contributions to this release. + ## 1.19.1 (8 Sep 2021) -### Fixed +Bugfixes: * [#1001][]: JSON: Fix complex number encoding with negative imaginary part. Thanks to @hemantjadon. * [#1003][]: JSON: Fix inaccurate precision when encoding float32. diff --git a/vendor/go.uber.org/zap/README.md b/vendor/go.uber.org/zap/README.md index 1e64d6cffc..9c9dfe1ed7 100644 --- a/vendor/go.uber.org/zap/README.md +++ b/vendor/go.uber.org/zap/README.md @@ -66,38 +66,38 @@ Log a message and 10 fields: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 862 ns/op | +0% | 5 allocs/op -| :zap: zap (sugared) | 1250 ns/op | +45% | 11 allocs/op -| zerolog | 4021 ns/op | +366% | 76 allocs/op -| go-kit | 4542 ns/op | +427% | 105 allocs/op -| apex/log | 26785 ns/op | +3007% | 115 allocs/op -| logrus | 29501 ns/op | +3322% | 125 allocs/op -| log15 | 29906 ns/op | +3369% | 122 allocs/op +| :zap: zap | 2900 ns/op | +0% | 5 allocs/op +| :zap: zap (sugared) | 3475 ns/op | +20% | 10 allocs/op +| zerolog | 10639 ns/op | +267% | 32 allocs/op +| go-kit | 14434 ns/op | +398% | 59 allocs/op +| logrus | 17104 ns/op | +490% | 81 allocs/op +| apex/log | 32424 ns/op | +1018% | 66 allocs/op +| log15 | 33579 ns/op | +1058% | 76 allocs/op Log a message with a logger that already has 10 fields of context: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 126 ns/op | +0% | 0 allocs/op -| :zap: zap (sugared) | 187 ns/op | +48% | 2 allocs/op -| zerolog | 88 ns/op | -30% | 0 allocs/op -| go-kit | 5087 ns/op | +3937% | 103 allocs/op -| log15 | 18548 ns/op | +14621% | 73 allocs/op -| apex/log | 26012 ns/op | +20544% | 104 allocs/op -| logrus | 27236 ns/op | +21516% | 113 allocs/op +| :zap: zap | 373 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 452 ns/op | +21% | 1 allocs/op +| zerolog | 288 ns/op | -23% | 0 allocs/op +| go-kit | 11785 ns/op | +3060% | 58 allocs/op +| logrus | 19629 ns/op | +5162% | 70 allocs/op +| log15 | 21866 ns/op | +5762% | 72 allocs/op +| apex/log | 30890 ns/op | +8182% | 55 allocs/op Log a static string, without any context or `printf`-style templating: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 118 ns/op | +0% | 0 allocs/op -| :zap: zap (sugared) | 191 ns/op | +62% | 2 allocs/op -| zerolog | 93 ns/op | -21% | 0 allocs/op -| go-kit | 280 ns/op | +137% | 11 allocs/op -| standard library | 499 ns/op | +323% | 2 allocs/op -| apex/log | 1990 ns/op | +1586% | 10 allocs/op -| logrus | 3129 ns/op | +2552% | 24 allocs/op -| log15 | 3887 ns/op | +3194% | 23 allocs/op +| :zap: zap | 381 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 410 ns/op | +8% | 1 allocs/op +| zerolog | 369 ns/op | -3% | 0 allocs/op +| standard library | 385 ns/op | +1% | 2 allocs/op +| go-kit | 606 ns/op | +59% | 11 allocs/op +| logrus | 1730 ns/op | +354% | 25 allocs/op +| apex/log | 1998 ns/op | +424% | 7 allocs/op +| log15 | 4546 ns/op | +1093% | 22 allocs/op ## Development Status: Stable diff --git a/vendor/go.uber.org/zap/global.go b/vendor/go.uber.org/zap/global.go index c1ac0507cd..3cb46c9e0a 100644 --- a/vendor/go.uber.org/zap/global.go +++ b/vendor/go.uber.org/zap/global.go @@ -31,6 +31,7 @@ import ( ) const ( + _stdLogDefaultDepth = 1 _loggerWriterDepth = 2 _programmerErrorTemplate = "You've found a bug in zap! Please file a bug at " + "https://github.com/uber-go/zap/issues/new and reference this error: %v" diff --git a/vendor/go.uber.org/zap/global_prego112.go b/vendor/go.uber.org/zap/global_prego112.go deleted file mode 100644 index d3ab9af933..0000000000 --- a/vendor/go.uber.org/zap/global_prego112.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2019 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -// See #682 for more information. -// +build !go1.12 - -package zap - -const _stdLogDefaultDepth = 2 diff --git a/vendor/go.uber.org/zap/go.mod b/vendor/go.uber.org/zap/go.mod index 3480ab4e14..51cd3367ed 100644 --- a/vendor/go.uber.org/zap/go.mod +++ b/vendor/go.uber.org/zap/go.mod @@ -7,7 +7,7 @@ require ( github.com/pkg/errors v0.8.1 github.com/stretchr/testify v1.7.0 go.uber.org/atomic v1.7.0 - go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 + go.uber.org/goleak v1.1.11 go.uber.org/multierr v1.6.0 gopkg.in/yaml.v2 v2.2.8 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect diff --git a/vendor/go.uber.org/zap/go.sum b/vendor/go.uber.org/zap/go.sum index 1658da4354..509a0e4e82 100644 --- a/vendor/go.uber.org/zap/go.sum +++ b/vendor/go.uber.org/zap/go.sum @@ -19,8 +19,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/vendor/go.uber.org/zap/zapcore/clock.go b/vendor/go.uber.org/zap/zapcore/clock.go index d2ea95b394..422fd82a6b 100644 --- a/vendor/go.uber.org/zap/zapcore/clock.go +++ b/vendor/go.uber.org/zap/zapcore/clock.go @@ -20,9 +20,7 @@ package zapcore -import ( - "time" -) +import "time" // DefaultClock is the default clock used by Zap in operations that require // time. This clock uses the system clock for all operations. diff --git a/vendor/go.uber.org/zap/zapcore/console_encoder.go b/vendor/go.uber.org/zap/zapcore/console_encoder.go index 2307af404c..1aa5dc3646 100644 --- a/vendor/go.uber.org/zap/zapcore/console_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/console_encoder.go @@ -125,11 +125,7 @@ func (c consoleEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, line.AppendString(ent.Stack) } - if c.LineEnding != "" { - line.AppendString(c.LineEnding) - } else { - line.AppendString(DefaultLineEnding) - } + line.AppendString(c.LineEnding) return line, nil } diff --git a/vendor/go.uber.org/zap/zapcore/encoder.go b/vendor/go.uber.org/zap/zapcore/encoder.go index 6601ca166c..6e5fd56511 100644 --- a/vendor/go.uber.org/zap/zapcore/encoder.go +++ b/vendor/go.uber.org/zap/zapcore/encoder.go @@ -22,6 +22,7 @@ package zapcore import ( "encoding/json" + "io" "time" "go.uber.org/zap/buffer" @@ -312,14 +313,15 @@ func (e *NameEncoder) UnmarshalText(text []byte) error { type EncoderConfig struct { // Set the keys used for each log entry. If any key is empty, that portion // of the entry is omitted. - MessageKey string `json:"messageKey" yaml:"messageKey"` - LevelKey string `json:"levelKey" yaml:"levelKey"` - TimeKey string `json:"timeKey" yaml:"timeKey"` - NameKey string `json:"nameKey" yaml:"nameKey"` - CallerKey string `json:"callerKey" yaml:"callerKey"` - FunctionKey string `json:"functionKey" yaml:"functionKey"` - StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` - LineEnding string `json:"lineEnding" yaml:"lineEnding"` + MessageKey string `json:"messageKey" yaml:"messageKey"` + LevelKey string `json:"levelKey" yaml:"levelKey"` + TimeKey string `json:"timeKey" yaml:"timeKey"` + NameKey string `json:"nameKey" yaml:"nameKey"` + CallerKey string `json:"callerKey" yaml:"callerKey"` + FunctionKey string `json:"functionKey" yaml:"functionKey"` + StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` + SkipLineEnding bool `json:"skipLineEnding" yaml:"skipLineEnding"` + LineEnding string `json:"lineEnding" yaml:"lineEnding"` // Configure the primitive representations of common complex types. For // example, some users may want all time.Times serialized as floating-point // seconds since epoch, while others may prefer ISO8601 strings. @@ -330,6 +332,9 @@ type EncoderConfig struct { // Unlike the other primitive type encoders, EncodeName is optional. The // zero value falls back to FullNameEncoder. EncodeName NameEncoder `json:"nameEncoder" yaml:"nameEncoder"` + // Configure the encoder for interface{} type objects. + // If not provided, objects are encoded using json.Encoder + NewReflectedEncoder func(io.Writer) ReflectedEncoder `json:"-" yaml:"-"` // Configures the field separator used by the console encoder. Defaults // to tab. ConsoleSeparator string `json:"consoleSeparator" yaml:"consoleSeparator"` diff --git a/vendor/go.uber.org/zap/zapcore/json_encoder.go b/vendor/go.uber.org/zap/zapcore/json_encoder.go index af220d9b4d..505c714ac4 100644 --- a/vendor/go.uber.org/zap/zapcore/json_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -22,7 +22,6 @@ package zapcore import ( "encoding/base64" - "encoding/json" "math" "sync" "time" @@ -64,7 +63,7 @@ type jsonEncoder struct { // for encoding generic values by reflection reflectBuf *buffer.Buffer - reflectEnc *json.Encoder + reflectEnc ReflectedEncoder } // NewJSONEncoder creates a fast, low-allocation JSON encoder. The encoder @@ -82,6 +81,17 @@ func NewJSONEncoder(cfg EncoderConfig) Encoder { } func newJSONEncoder(cfg EncoderConfig, spaced bool) *jsonEncoder { + if cfg.SkipLineEnding { + cfg.LineEnding = "" + } else if cfg.LineEnding == "" { + cfg.LineEnding = DefaultLineEnding + } + + // If no EncoderConfig.NewReflectedEncoder is provided by the user, then use default + if cfg.NewReflectedEncoder == nil { + cfg.NewReflectedEncoder = defaultReflectedEncoder + } + return &jsonEncoder{ EncoderConfig: &cfg, buf: bufferpool.Get(), @@ -118,6 +128,11 @@ func (enc *jsonEncoder) AddComplex128(key string, val complex128) { enc.AppendComplex128(val) } +func (enc *jsonEncoder) AddComplex64(key string, val complex64) { + enc.addKey(key) + enc.AppendComplex64(val) +} + func (enc *jsonEncoder) AddDuration(key string, val time.Duration) { enc.addKey(key) enc.AppendDuration(val) @@ -141,10 +156,7 @@ func (enc *jsonEncoder) AddInt64(key string, val int64) { func (enc *jsonEncoder) resetReflectBuf() { if enc.reflectBuf == nil { enc.reflectBuf = bufferpool.Get() - enc.reflectEnc = json.NewEncoder(enc.reflectBuf) - - // For consistency with our custom JSON encoder. - enc.reflectEnc.SetEscapeHTML(false) + enc.reflectEnc = enc.NewReflectedEncoder(enc.reflectBuf) } else { enc.reflectBuf.Reset() } @@ -206,10 +218,16 @@ func (enc *jsonEncoder) AppendArray(arr ArrayMarshaler) error { } func (enc *jsonEncoder) AppendObject(obj ObjectMarshaler) error { + // Close ONLY new openNamespaces that are created during + // AppendObject(). + old := enc.openNamespaces + enc.openNamespaces = 0 enc.addElementSeparator() enc.buf.AppendByte('{') err := obj.MarshalLogObject(enc) enc.buf.AppendByte('}') + enc.closeOpenNamespaces() + enc.openNamespaces = old return err } @@ -225,20 +243,23 @@ func (enc *jsonEncoder) AppendByteString(val []byte) { enc.buf.AppendByte('"') } -func (enc *jsonEncoder) AppendComplex128(val complex128) { +// appendComplex appends the encoded form of the provided complex128 value. +// precision specifies the encoding precision for the real and imaginary +// components of the complex number. +func (enc *jsonEncoder) appendComplex(val complex128, precision int) { enc.addElementSeparator() // Cast to a platform-independent, fixed-size type. r, i := float64(real(val)), float64(imag(val)) enc.buf.AppendByte('"') // Because we're always in a quoted string, we can use strconv without // special-casing NaN and +/-Inf. - enc.buf.AppendFloat(r, 64) + enc.buf.AppendFloat(r, precision) // If imaginary part is less than 0, minus (-) sign is added by default // by AppendFloat. if i >= 0 { enc.buf.AppendByte('+') } - enc.buf.AppendFloat(i, 64) + enc.buf.AppendFloat(i, precision) enc.buf.AppendByte('i') enc.buf.AppendByte('"') } @@ -301,28 +322,28 @@ func (enc *jsonEncoder) AppendUint64(val uint64) { enc.buf.AppendUint(val) } -func (enc *jsonEncoder) AddComplex64(k string, v complex64) { enc.AddComplex128(k, complex128(v)) } -func (enc *jsonEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt32(k string, v int32) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt16(k string, v int16) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt8(k string, v int8) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddUint(k string, v uint) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint32(k string, v uint32) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint16(k string, v uint16) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint8(k string, v uint8) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AppendComplex64(v complex64) { enc.AppendComplex128(complex128(v)) } -func (enc *jsonEncoder) AppendFloat64(v float64) { enc.appendFloat(v, 64) } -func (enc *jsonEncoder) AppendFloat32(v float32) { enc.appendFloat(float64(v), 32) } -func (enc *jsonEncoder) AppendInt(v int) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt32(v int32) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt16(v int16) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt8(v int8) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendUint(v uint) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint32(v uint32) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint16(v uint16) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint8(v uint8) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUintptr(v uintptr) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt32(k string, v int32) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt16(k string, v int16) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt8(k string, v int8) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddUint(k string, v uint) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint32(k string, v uint32) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint16(k string, v uint16) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint8(k string, v uint8) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AppendComplex64(v complex64) { enc.appendComplex(complex128(v), 32) } +func (enc *jsonEncoder) AppendComplex128(v complex128) { enc.appendComplex(complex128(v), 64) } +func (enc *jsonEncoder) AppendFloat64(v float64) { enc.appendFloat(v, 64) } +func (enc *jsonEncoder) AppendFloat32(v float32) { enc.appendFloat(float64(v), 32) } +func (enc *jsonEncoder) AppendInt(v int) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt32(v int32) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt16(v int16) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt8(v int8) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendUint(v uint) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint32(v uint32) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint16(v uint16) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint8(v uint8) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUintptr(v uintptr) { enc.AppendUint64(uint64(v)) } func (enc *jsonEncoder) Clone() Encoder { clone := enc.clone() @@ -404,11 +425,7 @@ func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, final.AddString(final.StacktraceKey, ent.Stack) } final.buf.AppendByte('}') - if final.LineEnding != "" { - final.buf.AppendString(final.LineEnding) - } else { - final.buf.AppendString(DefaultLineEnding) - } + final.buf.AppendString(final.LineEnding) ret := final.buf putJSONEncoder(final) @@ -423,6 +440,7 @@ func (enc *jsonEncoder) closeOpenNamespaces() { for i := 0; i < enc.openNamespaces; i++ { enc.buf.AppendByte('}') } + enc.openNamespaces = 0 } func (enc *jsonEncoder) addKey(key string) { diff --git a/vendor/go.uber.org/zap/global_go112.go b/vendor/go.uber.org/zap/zapcore/reflected_encoder.go similarity index 64% rename from vendor/go.uber.org/zap/global_go112.go rename to vendor/go.uber.org/zap/zapcore/reflected_encoder.go index 6b5dbda807..8746360eca 100644 --- a/vendor/go.uber.org/zap/global_go112.go +++ b/vendor/go.uber.org/zap/zapcore/reflected_encoder.go @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Uber Technologies, Inc. +// Copyright (c) 2016 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,9 +18,24 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -// See #682 for more information. -// +build go1.12 +package zapcore -package zap +import ( + "encoding/json" + "io" +) -const _stdLogDefaultDepth = 1 +// ReflectedEncoder serializes log fields that can't be serialized with Zap's +// JSON encoder. These have the ReflectType field type. +// Use EncoderConfig.NewReflectedEncoder to set this. +type ReflectedEncoder interface { + // Encode encodes and writes to the underlying data stream. + Encode(interface{}) error +} + +func defaultReflectedEncoder(w io.Writer) ReflectedEncoder { + enc := json.NewEncoder(w) + // For consistency with our custom JSON encoder. + enc.SetEscapeHTML(false) + return enc +} diff --git a/vendor/go.uber.org/zap/zapcore/sampler.go b/vendor/go.uber.org/zap/zapcore/sampler.go index 31ed96e129..8c116049d3 100644 --- a/vendor/go.uber.org/zap/zapcore/sampler.go +++ b/vendor/go.uber.org/zap/zapcore/sampler.go @@ -133,10 +133,21 @@ func SamplerHook(hook func(entry Entry, dec SamplingDecision)) SamplerOption { // each tick. If more Entries with the same level and message are seen during // the same interval, every Mth message is logged and the rest are dropped. // +// For example, +// +// core = NewSamplerWithOptions(core, time.Second, 10, 5) +// +// This will log the first 10 log entries with the same level and message +// in a one second interval as-is. Following that, it will allow through +// every 5th log entry with the same level and message in that interval. +// +// If thereafter is zero, the Core will drop all log entries after the first N +// in that interval. +// // Sampler can be configured to report sampling decisions with the SamplerHook // option. // -// Keep in mind that zap's sampling implementation is optimized for speed over +// Keep in mind that Zap's sampling implementation is optimized for speed over // absolute precision; under load, each tick may be slightly over- or // under-sampled. func NewSamplerWithOptions(core Core, tick time.Duration, first, thereafter int, opts ...SamplerOption) Core { @@ -200,7 +211,7 @@ func (s *sampler) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { if ent.Level >= _minLevel && ent.Level <= _maxLevel { counter := s.counts.get(ent.Level, ent.Message) n := counter.IncCheckReset(ent.Time, s.tick) - if n > s.first && (n-s.first)%s.thereafter != 0 { + if n > s.first && (s.thereafter == 0 || (n-s.first)%s.thereafter != 0) { s.hook(ent, LogDropped) return ce } diff --git a/vendor/golang.org/x/crypto/blowfish/block.go b/vendor/golang.org/x/crypto/blowfish/block.go new file mode 100644 index 0000000000..9d80f19521 --- /dev/null +++ b/vendor/golang.org/x/crypto/blowfish/block.go @@ -0,0 +1,159 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package blowfish + +// getNextWord returns the next big-endian uint32 value from the byte slice +// at the given position in a circular manner, updating the position. +func getNextWord(b []byte, pos *int) uint32 { + var w uint32 + j := *pos + for i := 0; i < 4; i++ { + w = w<<8 | uint32(b[j]) + j++ + if j >= len(b) { + j = 0 + } + } + *pos = j + return w +} + +// ExpandKey performs a key expansion on the given *Cipher. Specifically, it +// performs the Blowfish algorithm's key schedule which sets up the *Cipher's +// pi and substitution tables for calls to Encrypt. This is used, primarily, +// by the bcrypt package to reuse the Blowfish key schedule during its +// set up. It's unlikely that you need to use this directly. +func ExpandKey(key []byte, c *Cipher) { + j := 0 + for i := 0; i < 18; i++ { + // Using inlined getNextWord for performance. + var d uint32 + for k := 0; k < 4; k++ { + d = d<<8 | uint32(key[j]) + j++ + if j >= len(key) { + j = 0 + } + } + c.p[i] ^= d + } + + var l, r uint32 + for i := 0; i < 18; i += 2 { + l, r = encryptBlock(l, r, c) + c.p[i], c.p[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l, r = encryptBlock(l, r, c) + c.s0[i], c.s0[i+1] = l, r + } + for i := 0; i < 256; i += 2 { + l, r = encryptBlock(l, r, c) + c.s1[i], c.s1[i+1] = l, r + } + for i := 0; i < 256; i += 2 { + l, r = encryptBlock(l, r, c) + c.s2[i], c.s2[i+1] = l, r + } + for i := 0; i < 256; i += 2 { + l, r = encryptBlock(l, r, c) + c.s3[i], c.s3[i+1] = l, r + } +} + +// This is similar to ExpandKey, but folds the salt during the key +// schedule. While ExpandKey is essentially expandKeyWithSalt with an all-zero +// salt passed in, reusing ExpandKey turns out to be a place of inefficiency +// and specializing it here is useful. +func expandKeyWithSalt(key []byte, salt []byte, c *Cipher) { + j := 0 + for i := 0; i < 18; i++ { + c.p[i] ^= getNextWord(key, &j) + } + + j = 0 + var l, r uint32 + for i := 0; i < 18; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.p[i], c.p[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.s0[i], c.s0[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.s1[i], c.s1[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.s2[i], c.s2[i+1] = l, r + } + + for i := 0; i < 256; i += 2 { + l ^= getNextWord(salt, &j) + r ^= getNextWord(salt, &j) + l, r = encryptBlock(l, r, c) + c.s3[i], c.s3[i+1] = l, r + } +} + +func encryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { + xl, xr := l, r + xl ^= c.p[0] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[1] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[2] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[3] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[4] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[5] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[6] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[7] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[8] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[9] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[10] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[11] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[12] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[13] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[14] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[15] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[16] + xr ^= c.p[17] + return xr, xl +} + +func decryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { + xl, xr := l, r + xl ^= c.p[17] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[16] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[15] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[14] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[13] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[12] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[11] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[10] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[9] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[8] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[7] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[6] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[5] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[4] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[3] + xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[2] + xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[1] + xr ^= c.p[0] + return xr, xl +} diff --git a/vendor/golang.org/x/crypto/blowfish/cipher.go b/vendor/golang.org/x/crypto/blowfish/cipher.go new file mode 100644 index 0000000000..213bf204af --- /dev/null +++ b/vendor/golang.org/x/crypto/blowfish/cipher.go @@ -0,0 +1,99 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package blowfish implements Bruce Schneier's Blowfish encryption algorithm. +// +// Blowfish is a legacy cipher and its short block size makes it vulnerable to +// birthday bound attacks (see https://sweet32.info). It should only be used +// where compatibility with legacy systems, not security, is the goal. +// +// Deprecated: any new system should use AES (from crypto/aes, if necessary in +// an AEAD mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from +// golang.org/x/crypto/chacha20poly1305). +package blowfish // import "golang.org/x/crypto/blowfish" + +// The code is a port of Bruce Schneier's C implementation. +// See https://www.schneier.com/blowfish.html. + +import "strconv" + +// The Blowfish block size in bytes. +const BlockSize = 8 + +// A Cipher is an instance of Blowfish encryption using a particular key. +type Cipher struct { + p [18]uint32 + s0, s1, s2, s3 [256]uint32 +} + +type KeySizeError int + +func (k KeySizeError) Error() string { + return "crypto/blowfish: invalid key size " + strconv.Itoa(int(k)) +} + +// NewCipher creates and returns a Cipher. +// The key argument should be the Blowfish key, from 1 to 56 bytes. +func NewCipher(key []byte) (*Cipher, error) { + var result Cipher + if k := len(key); k < 1 || k > 56 { + return nil, KeySizeError(k) + } + initCipher(&result) + ExpandKey(key, &result) + return &result, nil +} + +// NewSaltedCipher creates a returns a Cipher that folds a salt into its key +// schedule. For most purposes, NewCipher, instead of NewSaltedCipher, is +// sufficient and desirable. For bcrypt compatibility, the key can be over 56 +// bytes. +func NewSaltedCipher(key, salt []byte) (*Cipher, error) { + if len(salt) == 0 { + return NewCipher(key) + } + var result Cipher + if k := len(key); k < 1 { + return nil, KeySizeError(k) + } + initCipher(&result) + expandKeyWithSalt(key, salt, &result) + return &result, nil +} + +// BlockSize returns the Blowfish block size, 8 bytes. +// It is necessary to satisfy the Block interface in the +// package "crypto/cipher". +func (c *Cipher) BlockSize() int { return BlockSize } + +// Encrypt encrypts the 8-byte buffer src using the key k +// and stores the result in dst. +// Note that for amounts of data larger than a block, +// it is not safe to just call Encrypt on successive blocks; +// instead, use an encryption mode like CBC (see crypto/cipher/cbc.go). +func (c *Cipher) Encrypt(dst, src []byte) { + l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) + r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) + l, r = encryptBlock(l, r, c) + dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) + dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r) +} + +// Decrypt decrypts the 8-byte buffer src using the key k +// and stores the result in dst. +func (c *Cipher) Decrypt(dst, src []byte) { + l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) + r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) + l, r = decryptBlock(l, r, c) + dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) + dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r) +} + +func initCipher(c *Cipher) { + copy(c.p[0:], p[0:]) + copy(c.s0[0:], s0[0:]) + copy(c.s1[0:], s1[0:]) + copy(c.s2[0:], s2[0:]) + copy(c.s3[0:], s3[0:]) +} diff --git a/vendor/golang.org/x/crypto/blowfish/const.go b/vendor/golang.org/x/crypto/blowfish/const.go new file mode 100644 index 0000000000..d04077595a --- /dev/null +++ b/vendor/golang.org/x/crypto/blowfish/const.go @@ -0,0 +1,199 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The startup permutation array and substitution boxes. +// They are the hexadecimal digits of PI; see: +// https://www.schneier.com/code/constants.txt. + +package blowfish + +var s0 = [256]uint32{ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, + 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, + 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, + 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, + 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, + 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, + 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, + 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, + 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, + 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, + 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, + 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, + 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, + 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, + 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, + 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, + 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, + 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, + 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, + 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, + 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, + 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, +} + +var s1 = [256]uint32{ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, + 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, + 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, + 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, + 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, + 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, + 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, + 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, + 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, + 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, + 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, + 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, + 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, + 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, + 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, + 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, + 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, + 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, + 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, + 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, + 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, + 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, +} + +var s2 = [256]uint32{ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, + 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, + 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, + 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, + 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, + 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, + 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, + 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, + 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, + 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, + 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, + 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, + 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, + 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, + 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, + 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, + 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, + 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, + 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, + 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, + 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, + 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, +} + +var s3 = [256]uint32{ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, + 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, + 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, + 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, + 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, + 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, + 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, + 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, + 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, + 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, + 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, + 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, + 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, + 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, + 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, + 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, + 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, + 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, + 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, + 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, + 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, + 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, +} + +var p = [18]uint32{ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b, +} diff --git a/vendor/golang.org/x/crypto/cast5/cast5.go b/vendor/golang.org/x/crypto/cast5/cast5.go new file mode 100644 index 0000000000..ddcbeb6f2a --- /dev/null +++ b/vendor/golang.org/x/crypto/cast5/cast5.go @@ -0,0 +1,533 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package cast5 implements CAST5, as defined in RFC 2144. +// +// CAST5 is a legacy cipher and its short block size makes it vulnerable to +// birthday bound attacks (see https://sweet32.info). It should only be used +// where compatibility with legacy systems, not security, is the goal. +// +// Deprecated: any new system should use AES (from crypto/aes, if necessary in +// an AEAD mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from +// golang.org/x/crypto/chacha20poly1305). +package cast5 // import "golang.org/x/crypto/cast5" + +import "errors" + +const BlockSize = 8 +const KeySize = 16 + +type Cipher struct { + masking [16]uint32 + rotate [16]uint8 +} + +func NewCipher(key []byte) (c *Cipher, err error) { + if len(key) != KeySize { + return nil, errors.New("CAST5: keys must be 16 bytes") + } + + c = new(Cipher) + c.keySchedule(key) + return +} + +func (c *Cipher) BlockSize() int { + return BlockSize +} + +func (c *Cipher) Encrypt(dst, src []byte) { + l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) + r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) + + l, r = r, l^f1(r, c.masking[0], c.rotate[0]) + l, r = r, l^f2(r, c.masking[1], c.rotate[1]) + l, r = r, l^f3(r, c.masking[2], c.rotate[2]) + l, r = r, l^f1(r, c.masking[3], c.rotate[3]) + + l, r = r, l^f2(r, c.masking[4], c.rotate[4]) + l, r = r, l^f3(r, c.masking[5], c.rotate[5]) + l, r = r, l^f1(r, c.masking[6], c.rotate[6]) + l, r = r, l^f2(r, c.masking[7], c.rotate[7]) + + l, r = r, l^f3(r, c.masking[8], c.rotate[8]) + l, r = r, l^f1(r, c.masking[9], c.rotate[9]) + l, r = r, l^f2(r, c.masking[10], c.rotate[10]) + l, r = r, l^f3(r, c.masking[11], c.rotate[11]) + + l, r = r, l^f1(r, c.masking[12], c.rotate[12]) + l, r = r, l^f2(r, c.masking[13], c.rotate[13]) + l, r = r, l^f3(r, c.masking[14], c.rotate[14]) + l, r = r, l^f1(r, c.masking[15], c.rotate[15]) + + dst[0] = uint8(r >> 24) + dst[1] = uint8(r >> 16) + dst[2] = uint8(r >> 8) + dst[3] = uint8(r) + dst[4] = uint8(l >> 24) + dst[5] = uint8(l >> 16) + dst[6] = uint8(l >> 8) + dst[7] = uint8(l) +} + +func (c *Cipher) Decrypt(dst, src []byte) { + l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) + r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) + + l, r = r, l^f1(r, c.masking[15], c.rotate[15]) + l, r = r, l^f3(r, c.masking[14], c.rotate[14]) + l, r = r, l^f2(r, c.masking[13], c.rotate[13]) + l, r = r, l^f1(r, c.masking[12], c.rotate[12]) + + l, r = r, l^f3(r, c.masking[11], c.rotate[11]) + l, r = r, l^f2(r, c.masking[10], c.rotate[10]) + l, r = r, l^f1(r, c.masking[9], c.rotate[9]) + l, r = r, l^f3(r, c.masking[8], c.rotate[8]) + + l, r = r, l^f2(r, c.masking[7], c.rotate[7]) + l, r = r, l^f1(r, c.masking[6], c.rotate[6]) + l, r = r, l^f3(r, c.masking[5], c.rotate[5]) + l, r = r, l^f2(r, c.masking[4], c.rotate[4]) + + l, r = r, l^f1(r, c.masking[3], c.rotate[3]) + l, r = r, l^f3(r, c.masking[2], c.rotate[2]) + l, r = r, l^f2(r, c.masking[1], c.rotate[1]) + l, r = r, l^f1(r, c.masking[0], c.rotate[0]) + + dst[0] = uint8(r >> 24) + dst[1] = uint8(r >> 16) + dst[2] = uint8(r >> 8) + dst[3] = uint8(r) + dst[4] = uint8(l >> 24) + dst[5] = uint8(l >> 16) + dst[6] = uint8(l >> 8) + dst[7] = uint8(l) +} + +type keyScheduleA [4][7]uint8 +type keyScheduleB [4][5]uint8 + +// keyScheduleRound contains the magic values for a round of the key schedule. +// The keyScheduleA deals with the lines like: +// z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8] +// Conceptually, both x and z are in the same array, x first. The first +// element describes which word of this array gets written to and the +// second, which word gets read. So, for the line above, it's "4, 0", because +// it's writing to the first word of z, which, being after x, is word 4, and +// reading from the first word of x: word 0. +// +// Next are the indexes into the S-boxes. Now the array is treated as bytes. So +// "xD" is 0xd. The first byte of z is written as "16 + 0", just to be clear +// that it's z that we're indexing. +// +// keyScheduleB deals with lines like: +// K1 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2] +// "K1" is ignored because key words are always written in order. So the five +// elements are the S-box indexes. They use the same form as in keyScheduleA, +// above. + +type keyScheduleRound struct{} +type keySchedule []keyScheduleRound + +var schedule = []struct { + a keyScheduleA + b keyScheduleB +}{ + { + keyScheduleA{ + {4, 0, 0xd, 0xf, 0xc, 0xe, 0x8}, + {5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa}, + {6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9}, + {7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb}, + }, + keyScheduleB{ + {16 + 8, 16 + 9, 16 + 7, 16 + 6, 16 + 2}, + {16 + 0xa, 16 + 0xb, 16 + 5, 16 + 4, 16 + 6}, + {16 + 0xc, 16 + 0xd, 16 + 3, 16 + 2, 16 + 9}, + {16 + 0xe, 16 + 0xf, 16 + 1, 16 + 0, 16 + 0xc}, + }, + }, + { + keyScheduleA{ + {0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0}, + {1, 4, 0, 2, 1, 3, 16 + 2}, + {2, 5, 7, 6, 5, 4, 16 + 1}, + {3, 7, 0xa, 9, 0xb, 8, 16 + 3}, + }, + keyScheduleB{ + {3, 2, 0xc, 0xd, 8}, + {1, 0, 0xe, 0xf, 0xd}, + {7, 6, 8, 9, 3}, + {5, 4, 0xa, 0xb, 7}, + }, + }, + { + keyScheduleA{ + {4, 0, 0xd, 0xf, 0xc, 0xe, 8}, + {5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa}, + {6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9}, + {7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb}, + }, + keyScheduleB{ + {16 + 3, 16 + 2, 16 + 0xc, 16 + 0xd, 16 + 9}, + {16 + 1, 16 + 0, 16 + 0xe, 16 + 0xf, 16 + 0xc}, + {16 + 7, 16 + 6, 16 + 8, 16 + 9, 16 + 2}, + {16 + 5, 16 + 4, 16 + 0xa, 16 + 0xb, 16 + 6}, + }, + }, + { + keyScheduleA{ + {0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0}, + {1, 4, 0, 2, 1, 3, 16 + 2}, + {2, 5, 7, 6, 5, 4, 16 + 1}, + {3, 7, 0xa, 9, 0xb, 8, 16 + 3}, + }, + keyScheduleB{ + {8, 9, 7, 6, 3}, + {0xa, 0xb, 5, 4, 7}, + {0xc, 0xd, 3, 2, 8}, + {0xe, 0xf, 1, 0, 0xd}, + }, + }, +} + +func (c *Cipher) keySchedule(in []byte) { + var t [8]uint32 + var k [32]uint32 + + for i := 0; i < 4; i++ { + j := i * 4 + t[i] = uint32(in[j])<<24 | uint32(in[j+1])<<16 | uint32(in[j+2])<<8 | uint32(in[j+3]) + } + + x := []byte{6, 7, 4, 5} + ki := 0 + + for half := 0; half < 2; half++ { + for _, round := range schedule { + for j := 0; j < 4; j++ { + var a [7]uint8 + copy(a[:], round.a[j][:]) + w := t[a[1]] + w ^= sBox[4][(t[a[2]>>2]>>(24-8*(a[2]&3)))&0xff] + w ^= sBox[5][(t[a[3]>>2]>>(24-8*(a[3]&3)))&0xff] + w ^= sBox[6][(t[a[4]>>2]>>(24-8*(a[4]&3)))&0xff] + w ^= sBox[7][(t[a[5]>>2]>>(24-8*(a[5]&3)))&0xff] + w ^= sBox[x[j]][(t[a[6]>>2]>>(24-8*(a[6]&3)))&0xff] + t[a[0]] = w + } + + for j := 0; j < 4; j++ { + var b [5]uint8 + copy(b[:], round.b[j][:]) + w := sBox[4][(t[b[0]>>2]>>(24-8*(b[0]&3)))&0xff] + w ^= sBox[5][(t[b[1]>>2]>>(24-8*(b[1]&3)))&0xff] + w ^= sBox[6][(t[b[2]>>2]>>(24-8*(b[2]&3)))&0xff] + w ^= sBox[7][(t[b[3]>>2]>>(24-8*(b[3]&3)))&0xff] + w ^= sBox[4+j][(t[b[4]>>2]>>(24-8*(b[4]&3)))&0xff] + k[ki] = w + ki++ + } + } + } + + for i := 0; i < 16; i++ { + c.masking[i] = k[i] + c.rotate[i] = uint8(k[16+i] & 0x1f) + } +} + +// These are the three 'f' functions. See RFC 2144, section 2.2. +func f1(d, m uint32, r uint8) uint32 { + t := m + d + I := (t << r) | (t >> (32 - r)) + return ((sBox[0][I>>24] ^ sBox[1][(I>>16)&0xff]) - sBox[2][(I>>8)&0xff]) + sBox[3][I&0xff] +} + +func f2(d, m uint32, r uint8) uint32 { + t := m ^ d + I := (t << r) | (t >> (32 - r)) + return ((sBox[0][I>>24] - sBox[1][(I>>16)&0xff]) + sBox[2][(I>>8)&0xff]) ^ sBox[3][I&0xff] +} + +func f3(d, m uint32, r uint8) uint32 { + t := m - d + I := (t << r) | (t >> (32 - r)) + return ((sBox[0][I>>24] + sBox[1][(I>>16)&0xff]) ^ sBox[2][(I>>8)&0xff]) - sBox[3][I&0xff] +} + +var sBox = [8][256]uint32{ + { + 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, + 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, + 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, + 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, + 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, + 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, + 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, + 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, + 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, + 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, + 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, + 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, + 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, + 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, + 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, + 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, + 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, + 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, + 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, + 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, + 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, + 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, + 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, + 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, + 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, + 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, + 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, + 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, + 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, + 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, + 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, + 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf, + }, + { + 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, + 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, + 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, + 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, + 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, + 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, + 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, + 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, + 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, + 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, + 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, + 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, + 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, + 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, + 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, + 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, + 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, + 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, + 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, + 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, + 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, + 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, + 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, + 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, + 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, + 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, + 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, + 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, + 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, + 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, + 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, + 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1, + }, + { + 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, + 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, + 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, + 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, + 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, + 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, + 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, + 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, + 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, + 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, + 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, + 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, + 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, + 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, + 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, + 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, + 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, + 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, + 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, + 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, + 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, + 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, + 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, + 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, + 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, + 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, + 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, + 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, + 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, + 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, + 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, + 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783, + }, + { + 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, + 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, + 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, + 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, + 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, + 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, + 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, + 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, + 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, + 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, + 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, + 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, + 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, + 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, + 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, + 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, + 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, + 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, + 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, + 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, + 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, + 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, + 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, + 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, + 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, + 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, + 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, + 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, + 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, + 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, + 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, + 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2, + }, + { + 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, + 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, + 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, + 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, + 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, + 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, + 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, + 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, + 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, + 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, + 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, + 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, + 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, + 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, + 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, + 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, + 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, + 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, + 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, + 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, + 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, + 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, + 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, + 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, + 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, + 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, + 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, + 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, + 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, + 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, + 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, + 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4, + }, + { + 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, + 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, + 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, + 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, + 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, + 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, + 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, + 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, + 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, + 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, + 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, + 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, + 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, + 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, + 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, + 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, + 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, + 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, + 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, + 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, + 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, + 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, + 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, + 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, + 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, + 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, + 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, + 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, + 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, + 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, + 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, + 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f, + }, + { + 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, + 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, + 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, + 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, + 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, + 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, + 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, + 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, + 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, + 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, + 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, + 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, + 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, + 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, + 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, + 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, + 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, + 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, + 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, + 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, + 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, + 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, + 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, + 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, + 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, + 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, + 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, + 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, + 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, + 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, + 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, + 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3, + }, + { + 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, + 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, + 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, + 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, + 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, + 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, + 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, + 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, + 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, + 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, + 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, + 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, + 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, + 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, + 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, + 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, + 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, + 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, + 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, + 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, + 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, + 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, + 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, + 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, + 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, + 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, + 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, + 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, + 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, + 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, + 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, + 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e, + }, +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go new file mode 100644 index 0000000000..94c71ac1ac --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go @@ -0,0 +1,17 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.11 && gc && !purego +// +build go1.11,gc,!purego + +package chacha20 + +const bufSize = 256 + +//go:noescape +func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s new file mode 100644 index 0000000000..63cae9e6f0 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s @@ -0,0 +1,308 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.11 && gc && !purego +// +build go1.11,gc,!purego + +#include "textflag.h" + +#define NUM_ROUNDS 10 + +// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) +TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 + MOVD dst+0(FP), R1 + MOVD src+24(FP), R2 + MOVD src_len+32(FP), R3 + MOVD key+48(FP), R4 + MOVD nonce+56(FP), R6 + MOVD counter+64(FP), R7 + + MOVD $·constants(SB), R10 + MOVD $·incRotMatrix(SB), R11 + + MOVW (R7), R20 + + AND $~255, R3, R13 + ADD R2, R13, R12 // R12 for block end + AND $255, R3, R13 +loop: + MOVD $NUM_ROUNDS, R21 + VLD1 (R11), [V30.S4, V31.S4] + + // load contants + // VLD4R (R10), [V0.S4, V1.S4, V2.S4, V3.S4] + WORD $0x4D60E940 + + // load keys + // VLD4R 16(R4), [V4.S4, V5.S4, V6.S4, V7.S4] + WORD $0x4DFFE884 + // VLD4R 16(R4), [V8.S4, V9.S4, V10.S4, V11.S4] + WORD $0x4DFFE888 + SUB $32, R4 + + // load counter + nonce + // VLD1R (R7), [V12.S4] + WORD $0x4D40C8EC + + // VLD3R (R6), [V13.S4, V14.S4, V15.S4] + WORD $0x4D40E8CD + + // update counter + VADD V30.S4, V12.S4, V12.S4 + +chacha: + // V0..V3 += V4..V7 + // V12..V15 <<<= ((V12..V15 XOR V0..V3), 16) + VADD V0.S4, V4.S4, V0.S4 + VADD V1.S4, V5.S4, V1.S4 + VADD V2.S4, V6.S4, V2.S4 + VADD V3.S4, V7.S4, V3.S4 + VEOR V12.B16, V0.B16, V12.B16 + VEOR V13.B16, V1.B16, V13.B16 + VEOR V14.B16, V2.B16, V14.B16 + VEOR V15.B16, V3.B16, V15.B16 + VREV32 V12.H8, V12.H8 + VREV32 V13.H8, V13.H8 + VREV32 V14.H8, V14.H8 + VREV32 V15.H8, V15.H8 + // V8..V11 += V12..V15 + // V4..V7 <<<= ((V4..V7 XOR V8..V11), 12) + VADD V8.S4, V12.S4, V8.S4 + VADD V9.S4, V13.S4, V9.S4 + VADD V10.S4, V14.S4, V10.S4 + VADD V11.S4, V15.S4, V11.S4 + VEOR V8.B16, V4.B16, V16.B16 + VEOR V9.B16, V5.B16, V17.B16 + VEOR V10.B16, V6.B16, V18.B16 + VEOR V11.B16, V7.B16, V19.B16 + VSHL $12, V16.S4, V4.S4 + VSHL $12, V17.S4, V5.S4 + VSHL $12, V18.S4, V6.S4 + VSHL $12, V19.S4, V7.S4 + VSRI $20, V16.S4, V4.S4 + VSRI $20, V17.S4, V5.S4 + VSRI $20, V18.S4, V6.S4 + VSRI $20, V19.S4, V7.S4 + + // V0..V3 += V4..V7 + // V12..V15 <<<= ((V12..V15 XOR V0..V3), 8) + VADD V0.S4, V4.S4, V0.S4 + VADD V1.S4, V5.S4, V1.S4 + VADD V2.S4, V6.S4, V2.S4 + VADD V3.S4, V7.S4, V3.S4 + VEOR V12.B16, V0.B16, V12.B16 + VEOR V13.B16, V1.B16, V13.B16 + VEOR V14.B16, V2.B16, V14.B16 + VEOR V15.B16, V3.B16, V15.B16 + VTBL V31.B16, [V12.B16], V12.B16 + VTBL V31.B16, [V13.B16], V13.B16 + VTBL V31.B16, [V14.B16], V14.B16 + VTBL V31.B16, [V15.B16], V15.B16 + + // V8..V11 += V12..V15 + // V4..V7 <<<= ((V4..V7 XOR V8..V11), 7) + VADD V12.S4, V8.S4, V8.S4 + VADD V13.S4, V9.S4, V9.S4 + VADD V14.S4, V10.S4, V10.S4 + VADD V15.S4, V11.S4, V11.S4 + VEOR V8.B16, V4.B16, V16.B16 + VEOR V9.B16, V5.B16, V17.B16 + VEOR V10.B16, V6.B16, V18.B16 + VEOR V11.B16, V7.B16, V19.B16 + VSHL $7, V16.S4, V4.S4 + VSHL $7, V17.S4, V5.S4 + VSHL $7, V18.S4, V6.S4 + VSHL $7, V19.S4, V7.S4 + VSRI $25, V16.S4, V4.S4 + VSRI $25, V17.S4, V5.S4 + VSRI $25, V18.S4, V6.S4 + VSRI $25, V19.S4, V7.S4 + + // V0..V3 += V5..V7, V4 + // V15,V12-V14 <<<= ((V15,V12-V14 XOR V0..V3), 16) + VADD V0.S4, V5.S4, V0.S4 + VADD V1.S4, V6.S4, V1.S4 + VADD V2.S4, V7.S4, V2.S4 + VADD V3.S4, V4.S4, V3.S4 + VEOR V15.B16, V0.B16, V15.B16 + VEOR V12.B16, V1.B16, V12.B16 + VEOR V13.B16, V2.B16, V13.B16 + VEOR V14.B16, V3.B16, V14.B16 + VREV32 V12.H8, V12.H8 + VREV32 V13.H8, V13.H8 + VREV32 V14.H8, V14.H8 + VREV32 V15.H8, V15.H8 + + // V10 += V15; V5 <<<= ((V10 XOR V5), 12) + // ... + VADD V15.S4, V10.S4, V10.S4 + VADD V12.S4, V11.S4, V11.S4 + VADD V13.S4, V8.S4, V8.S4 + VADD V14.S4, V9.S4, V9.S4 + VEOR V10.B16, V5.B16, V16.B16 + VEOR V11.B16, V6.B16, V17.B16 + VEOR V8.B16, V7.B16, V18.B16 + VEOR V9.B16, V4.B16, V19.B16 + VSHL $12, V16.S4, V5.S4 + VSHL $12, V17.S4, V6.S4 + VSHL $12, V18.S4, V7.S4 + VSHL $12, V19.S4, V4.S4 + VSRI $20, V16.S4, V5.S4 + VSRI $20, V17.S4, V6.S4 + VSRI $20, V18.S4, V7.S4 + VSRI $20, V19.S4, V4.S4 + + // V0 += V5; V15 <<<= ((V0 XOR V15), 8) + // ... + VADD V5.S4, V0.S4, V0.S4 + VADD V6.S4, V1.S4, V1.S4 + VADD V7.S4, V2.S4, V2.S4 + VADD V4.S4, V3.S4, V3.S4 + VEOR V0.B16, V15.B16, V15.B16 + VEOR V1.B16, V12.B16, V12.B16 + VEOR V2.B16, V13.B16, V13.B16 + VEOR V3.B16, V14.B16, V14.B16 + VTBL V31.B16, [V12.B16], V12.B16 + VTBL V31.B16, [V13.B16], V13.B16 + VTBL V31.B16, [V14.B16], V14.B16 + VTBL V31.B16, [V15.B16], V15.B16 + + // V10 += V15; V5 <<<= ((V10 XOR V5), 7) + // ... + VADD V15.S4, V10.S4, V10.S4 + VADD V12.S4, V11.S4, V11.S4 + VADD V13.S4, V8.S4, V8.S4 + VADD V14.S4, V9.S4, V9.S4 + VEOR V10.B16, V5.B16, V16.B16 + VEOR V11.B16, V6.B16, V17.B16 + VEOR V8.B16, V7.B16, V18.B16 + VEOR V9.B16, V4.B16, V19.B16 + VSHL $7, V16.S4, V5.S4 + VSHL $7, V17.S4, V6.S4 + VSHL $7, V18.S4, V7.S4 + VSHL $7, V19.S4, V4.S4 + VSRI $25, V16.S4, V5.S4 + VSRI $25, V17.S4, V6.S4 + VSRI $25, V18.S4, V7.S4 + VSRI $25, V19.S4, V4.S4 + + SUB $1, R21 + CBNZ R21, chacha + + // VLD4R (R10), [V16.S4, V17.S4, V18.S4, V19.S4] + WORD $0x4D60E950 + + // VLD4R 16(R4), [V20.S4, V21.S4, V22.S4, V23.S4] + WORD $0x4DFFE894 + VADD V30.S4, V12.S4, V12.S4 + VADD V16.S4, V0.S4, V0.S4 + VADD V17.S4, V1.S4, V1.S4 + VADD V18.S4, V2.S4, V2.S4 + VADD V19.S4, V3.S4, V3.S4 + // VLD4R 16(R4), [V24.S4, V25.S4, V26.S4, V27.S4] + WORD $0x4DFFE898 + // restore R4 + SUB $32, R4 + + // load counter + nonce + // VLD1R (R7), [V28.S4] + WORD $0x4D40C8FC + // VLD3R (R6), [V29.S4, V30.S4, V31.S4] + WORD $0x4D40E8DD + + VADD V20.S4, V4.S4, V4.S4 + VADD V21.S4, V5.S4, V5.S4 + VADD V22.S4, V6.S4, V6.S4 + VADD V23.S4, V7.S4, V7.S4 + VADD V24.S4, V8.S4, V8.S4 + VADD V25.S4, V9.S4, V9.S4 + VADD V26.S4, V10.S4, V10.S4 + VADD V27.S4, V11.S4, V11.S4 + VADD V28.S4, V12.S4, V12.S4 + VADD V29.S4, V13.S4, V13.S4 + VADD V30.S4, V14.S4, V14.S4 + VADD V31.S4, V15.S4, V15.S4 + + VZIP1 V1.S4, V0.S4, V16.S4 + VZIP2 V1.S4, V0.S4, V17.S4 + VZIP1 V3.S4, V2.S4, V18.S4 + VZIP2 V3.S4, V2.S4, V19.S4 + VZIP1 V5.S4, V4.S4, V20.S4 + VZIP2 V5.S4, V4.S4, V21.S4 + VZIP1 V7.S4, V6.S4, V22.S4 + VZIP2 V7.S4, V6.S4, V23.S4 + VZIP1 V9.S4, V8.S4, V24.S4 + VZIP2 V9.S4, V8.S4, V25.S4 + VZIP1 V11.S4, V10.S4, V26.S4 + VZIP2 V11.S4, V10.S4, V27.S4 + VZIP1 V13.S4, V12.S4, V28.S4 + VZIP2 V13.S4, V12.S4, V29.S4 + VZIP1 V15.S4, V14.S4, V30.S4 + VZIP2 V15.S4, V14.S4, V31.S4 + VZIP1 V18.D2, V16.D2, V0.D2 + VZIP2 V18.D2, V16.D2, V4.D2 + VZIP1 V19.D2, V17.D2, V8.D2 + VZIP2 V19.D2, V17.D2, V12.D2 + VLD1.P 64(R2), [V16.B16, V17.B16, V18.B16, V19.B16] + + VZIP1 V22.D2, V20.D2, V1.D2 + VZIP2 V22.D2, V20.D2, V5.D2 + VZIP1 V23.D2, V21.D2, V9.D2 + VZIP2 V23.D2, V21.D2, V13.D2 + VLD1.P 64(R2), [V20.B16, V21.B16, V22.B16, V23.B16] + VZIP1 V26.D2, V24.D2, V2.D2 + VZIP2 V26.D2, V24.D2, V6.D2 + VZIP1 V27.D2, V25.D2, V10.D2 + VZIP2 V27.D2, V25.D2, V14.D2 + VLD1.P 64(R2), [V24.B16, V25.B16, V26.B16, V27.B16] + VZIP1 V30.D2, V28.D2, V3.D2 + VZIP2 V30.D2, V28.D2, V7.D2 + VZIP1 V31.D2, V29.D2, V11.D2 + VZIP2 V31.D2, V29.D2, V15.D2 + VLD1.P 64(R2), [V28.B16, V29.B16, V30.B16, V31.B16] + VEOR V0.B16, V16.B16, V16.B16 + VEOR V1.B16, V17.B16, V17.B16 + VEOR V2.B16, V18.B16, V18.B16 + VEOR V3.B16, V19.B16, V19.B16 + VST1.P [V16.B16, V17.B16, V18.B16, V19.B16], 64(R1) + VEOR V4.B16, V20.B16, V20.B16 + VEOR V5.B16, V21.B16, V21.B16 + VEOR V6.B16, V22.B16, V22.B16 + VEOR V7.B16, V23.B16, V23.B16 + VST1.P [V20.B16, V21.B16, V22.B16, V23.B16], 64(R1) + VEOR V8.B16, V24.B16, V24.B16 + VEOR V9.B16, V25.B16, V25.B16 + VEOR V10.B16, V26.B16, V26.B16 + VEOR V11.B16, V27.B16, V27.B16 + VST1.P [V24.B16, V25.B16, V26.B16, V27.B16], 64(R1) + VEOR V12.B16, V28.B16, V28.B16 + VEOR V13.B16, V29.B16, V29.B16 + VEOR V14.B16, V30.B16, V30.B16 + VEOR V15.B16, V31.B16, V31.B16 + VST1.P [V28.B16, V29.B16, V30.B16, V31.B16], 64(R1) + + ADD $4, R20 + MOVW R20, (R7) // update counter + + CMP R2, R12 + BGT loop + + RET + + +DATA ·constants+0x00(SB)/4, $0x61707865 +DATA ·constants+0x04(SB)/4, $0x3320646e +DATA ·constants+0x08(SB)/4, $0x79622d32 +DATA ·constants+0x0c(SB)/4, $0x6b206574 +GLOBL ·constants(SB), NOPTR|RODATA, $32 + +DATA ·incRotMatrix+0x00(SB)/4, $0x00000000 +DATA ·incRotMatrix+0x04(SB)/4, $0x00000001 +DATA ·incRotMatrix+0x08(SB)/4, $0x00000002 +DATA ·incRotMatrix+0x0c(SB)/4, $0x00000003 +DATA ·incRotMatrix+0x10(SB)/4, $0x02010003 +DATA ·incRotMatrix+0x14(SB)/4, $0x06050407 +DATA ·incRotMatrix+0x18(SB)/4, $0x0A09080B +DATA ·incRotMatrix+0x1c(SB)/4, $0x0E0D0C0F +GLOBL ·incRotMatrix(SB), NOPTR|RODATA, $32 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/chacha20/chacha_generic.go new file mode 100644 index 0000000000..a2ecf5c325 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_generic.go @@ -0,0 +1,398 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package chacha20 implements the ChaCha20 and XChaCha20 encryption algorithms +// as specified in RFC 8439 and draft-irtf-cfrg-xchacha-01. +package chacha20 + +import ( + "crypto/cipher" + "encoding/binary" + "errors" + "math/bits" + + "golang.org/x/crypto/internal/subtle" +) + +const ( + // KeySize is the size of the key used by this cipher, in bytes. + KeySize = 32 + + // NonceSize is the size of the nonce used with the standard variant of this + // cipher, in bytes. + // + // Note that this is too short to be safely generated at random if the same + // key is reused more than 2³² times. + NonceSize = 12 + + // NonceSizeX is the size of the nonce used with the XChaCha20 variant of + // this cipher, in bytes. + NonceSizeX = 24 +) + +// Cipher is a stateful instance of ChaCha20 or XChaCha20 using a particular key +// and nonce. A *Cipher implements the cipher.Stream interface. +type Cipher struct { + // The ChaCha20 state is 16 words: 4 constant, 8 of key, 1 of counter + // (incremented after each block), and 3 of nonce. + key [8]uint32 + counter uint32 + nonce [3]uint32 + + // The last len bytes of buf are leftover key stream bytes from the previous + // XORKeyStream invocation. The size of buf depends on how many blocks are + // computed at a time by xorKeyStreamBlocks. + buf [bufSize]byte + len int + + // overflow is set when the counter overflowed, no more blocks can be + // generated, and the next XORKeyStream call should panic. + overflow bool + + // The counter-independent results of the first round are cached after they + // are computed the first time. + precompDone bool + p1, p5, p9, p13 uint32 + p2, p6, p10, p14 uint32 + p3, p7, p11, p15 uint32 +} + +var _ cipher.Stream = (*Cipher)(nil) + +// NewUnauthenticatedCipher creates a new ChaCha20 stream cipher with the given +// 32 bytes key and a 12 or 24 bytes nonce. If a nonce of 24 bytes is provided, +// the XChaCha20 construction will be used. It returns an error if key or nonce +// have any other length. +// +// Note that ChaCha20, like all stream ciphers, is not authenticated and allows +// attackers to silently tamper with the plaintext. For this reason, it is more +// appropriate as a building block than as a standalone encryption mechanism. +// Instead, consider using package golang.org/x/crypto/chacha20poly1305. +func NewUnauthenticatedCipher(key, nonce []byte) (*Cipher, error) { + // This function is split into a wrapper so that the Cipher allocation will + // be inlined, and depending on how the caller uses the return value, won't + // escape to the heap. + c := &Cipher{} + return newUnauthenticatedCipher(c, key, nonce) +} + +func newUnauthenticatedCipher(c *Cipher, key, nonce []byte) (*Cipher, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20: wrong key size") + } + if len(nonce) == NonceSizeX { + // XChaCha20 uses the ChaCha20 core to mix 16 bytes of the nonce into a + // derived key, allowing it to operate on a nonce of 24 bytes. See + // draft-irtf-cfrg-xchacha-01, Section 2.3. + key, _ = HChaCha20(key, nonce[0:16]) + cNonce := make([]byte, NonceSize) + copy(cNonce[4:12], nonce[16:24]) + nonce = cNonce + } else if len(nonce) != NonceSize { + return nil, errors.New("chacha20: wrong nonce size") + } + + key, nonce = key[:KeySize], nonce[:NonceSize] // bounds check elimination hint + c.key = [8]uint32{ + binary.LittleEndian.Uint32(key[0:4]), + binary.LittleEndian.Uint32(key[4:8]), + binary.LittleEndian.Uint32(key[8:12]), + binary.LittleEndian.Uint32(key[12:16]), + binary.LittleEndian.Uint32(key[16:20]), + binary.LittleEndian.Uint32(key[20:24]), + binary.LittleEndian.Uint32(key[24:28]), + binary.LittleEndian.Uint32(key[28:32]), + } + c.nonce = [3]uint32{ + binary.LittleEndian.Uint32(nonce[0:4]), + binary.LittleEndian.Uint32(nonce[4:8]), + binary.LittleEndian.Uint32(nonce[8:12]), + } + return c, nil +} + +// The constant first 4 words of the ChaCha20 state. +const ( + j0 uint32 = 0x61707865 // expa + j1 uint32 = 0x3320646e // nd 3 + j2 uint32 = 0x79622d32 // 2-by + j3 uint32 = 0x6b206574 // te k +) + +const blockSize = 64 + +// quarterRound is the core of ChaCha20. It shuffles the bits of 4 state words. +// It's executed 4 times for each of the 20 ChaCha20 rounds, operating on all 16 +// words each round, in columnar or diagonal groups of 4 at a time. +func quarterRound(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { + a += b + d ^= a + d = bits.RotateLeft32(d, 16) + c += d + b ^= c + b = bits.RotateLeft32(b, 12) + a += b + d ^= a + d = bits.RotateLeft32(d, 8) + c += d + b ^= c + b = bits.RotateLeft32(b, 7) + return a, b, c, d +} + +// SetCounter sets the Cipher counter. The next invocation of XORKeyStream will +// behave as if (64 * counter) bytes had been encrypted so far. +// +// To prevent accidental counter reuse, SetCounter panics if counter is less +// than the current value. +// +// Note that the execution time of XORKeyStream is not independent of the +// counter value. +func (s *Cipher) SetCounter(counter uint32) { + // Internally, s may buffer multiple blocks, which complicates this + // implementation slightly. When checking whether the counter has rolled + // back, we must use both s.counter and s.len to determine how many blocks + // we have already output. + outputCounter := s.counter - uint32(s.len)/blockSize + if s.overflow || counter < outputCounter { + panic("chacha20: SetCounter attempted to rollback counter") + } + + // In the general case, we set the new counter value and reset s.len to 0, + // causing the next call to XORKeyStream to refill the buffer. However, if + // we're advancing within the existing buffer, we can save work by simply + // setting s.len. + if counter < s.counter { + s.len = int(s.counter-counter) * blockSize + } else { + s.counter = counter + s.len = 0 + } +} + +// XORKeyStream XORs each byte in the given slice with a byte from the +// cipher's key stream. Dst and src must overlap entirely or not at all. +// +// If len(dst) < len(src), XORKeyStream will panic. It is acceptable +// to pass a dst bigger than src, and in that case, XORKeyStream will +// only update dst[:len(src)] and will not touch the rest of dst. +// +// Multiple calls to XORKeyStream behave as if the concatenation of +// the src buffers was passed in a single run. That is, Cipher +// maintains state and does not reset at each XORKeyStream call. +func (s *Cipher) XORKeyStream(dst, src []byte) { + if len(src) == 0 { + return + } + if len(dst) < len(src) { + panic("chacha20: output smaller than input") + } + dst = dst[:len(src)] + if subtle.InexactOverlap(dst, src) { + panic("chacha20: invalid buffer overlap") + } + + // First, drain any remaining key stream from a previous XORKeyStream. + if s.len != 0 { + keyStream := s.buf[bufSize-s.len:] + if len(src) < len(keyStream) { + keyStream = keyStream[:len(src)] + } + _ = src[len(keyStream)-1] // bounds check elimination hint + for i, b := range keyStream { + dst[i] = src[i] ^ b + } + s.len -= len(keyStream) + dst, src = dst[len(keyStream):], src[len(keyStream):] + } + if len(src) == 0 { + return + } + + // If we'd need to let the counter overflow and keep generating output, + // panic immediately. If instead we'd only reach the last block, remember + // not to generate any more output after the buffer is drained. + numBlocks := (uint64(len(src)) + blockSize - 1) / blockSize + if s.overflow || uint64(s.counter)+numBlocks > 1<<32 { + panic("chacha20: counter overflow") + } else if uint64(s.counter)+numBlocks == 1<<32 { + s.overflow = true + } + + // xorKeyStreamBlocks implementations expect input lengths that are a + // multiple of bufSize. Platform-specific ones process multiple blocks at a + // time, so have bufSizes that are a multiple of blockSize. + + full := len(src) - len(src)%bufSize + if full > 0 { + s.xorKeyStreamBlocks(dst[:full], src[:full]) + } + dst, src = dst[full:], src[full:] + + // If using a multi-block xorKeyStreamBlocks would overflow, use the generic + // one that does one block at a time. + const blocksPerBuf = bufSize / blockSize + if uint64(s.counter)+blocksPerBuf > 1<<32 { + s.buf = [bufSize]byte{} + numBlocks := (len(src) + blockSize - 1) / blockSize + buf := s.buf[bufSize-numBlocks*blockSize:] + copy(buf, src) + s.xorKeyStreamBlocksGeneric(buf, buf) + s.len = len(buf) - copy(dst, buf) + return + } + + // If we have a partial (multi-)block, pad it for xorKeyStreamBlocks, and + // keep the leftover keystream for the next XORKeyStream invocation. + if len(src) > 0 { + s.buf = [bufSize]byte{} + copy(s.buf[:], src) + s.xorKeyStreamBlocks(s.buf[:], s.buf[:]) + s.len = bufSize - copy(dst, s.buf[:]) + } +} + +func (s *Cipher) xorKeyStreamBlocksGeneric(dst, src []byte) { + if len(dst) != len(src) || len(dst)%blockSize != 0 { + panic("chacha20: internal error: wrong dst and/or src length") + } + + // To generate each block of key stream, the initial cipher state + // (represented below) is passed through 20 rounds of shuffling, + // alternatively applying quarterRounds by columns (like 1, 5, 9, 13) + // or by diagonals (like 1, 6, 11, 12). + // + // 0:cccccccc 1:cccccccc 2:cccccccc 3:cccccccc + // 4:kkkkkkkk 5:kkkkkkkk 6:kkkkkkkk 7:kkkkkkkk + // 8:kkkkkkkk 9:kkkkkkkk 10:kkkkkkkk 11:kkkkkkkk + // 12:bbbbbbbb 13:nnnnnnnn 14:nnnnnnnn 15:nnnnnnnn + // + // c=constant k=key b=blockcount n=nonce + var ( + c0, c1, c2, c3 = j0, j1, j2, j3 + c4, c5, c6, c7 = s.key[0], s.key[1], s.key[2], s.key[3] + c8, c9, c10, c11 = s.key[4], s.key[5], s.key[6], s.key[7] + _, c13, c14, c15 = s.counter, s.nonce[0], s.nonce[1], s.nonce[2] + ) + + // Three quarters of the first round don't depend on the counter, so we can + // calculate them here, and reuse them for multiple blocks in the loop, and + // for future XORKeyStream invocations. + if !s.precompDone { + s.p1, s.p5, s.p9, s.p13 = quarterRound(c1, c5, c9, c13) + s.p2, s.p6, s.p10, s.p14 = quarterRound(c2, c6, c10, c14) + s.p3, s.p7, s.p11, s.p15 = quarterRound(c3, c7, c11, c15) + s.precompDone = true + } + + // A condition of len(src) > 0 would be sufficient, but this also + // acts as a bounds check elimination hint. + for len(src) >= 64 && len(dst) >= 64 { + // The remainder of the first column round. + fcr0, fcr4, fcr8, fcr12 := quarterRound(c0, c4, c8, s.counter) + + // The second diagonal round. + x0, x5, x10, x15 := quarterRound(fcr0, s.p5, s.p10, s.p15) + x1, x6, x11, x12 := quarterRound(s.p1, s.p6, s.p11, fcr12) + x2, x7, x8, x13 := quarterRound(s.p2, s.p7, fcr8, s.p13) + x3, x4, x9, x14 := quarterRound(s.p3, fcr4, s.p9, s.p14) + + // The remaining 18 rounds. + for i := 0; i < 9; i++ { + // Column round. + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + // Diagonal round. + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + // Add back the initial state to generate the key stream, then + // XOR the key stream with the source and write out the result. + addXor(dst[0:4], src[0:4], x0, c0) + addXor(dst[4:8], src[4:8], x1, c1) + addXor(dst[8:12], src[8:12], x2, c2) + addXor(dst[12:16], src[12:16], x3, c3) + addXor(dst[16:20], src[16:20], x4, c4) + addXor(dst[20:24], src[20:24], x5, c5) + addXor(dst[24:28], src[24:28], x6, c6) + addXor(dst[28:32], src[28:32], x7, c7) + addXor(dst[32:36], src[32:36], x8, c8) + addXor(dst[36:40], src[36:40], x9, c9) + addXor(dst[40:44], src[40:44], x10, c10) + addXor(dst[44:48], src[44:48], x11, c11) + addXor(dst[48:52], src[48:52], x12, s.counter) + addXor(dst[52:56], src[52:56], x13, c13) + addXor(dst[56:60], src[56:60], x14, c14) + addXor(dst[60:64], src[60:64], x15, c15) + + s.counter += 1 + + src, dst = src[blockSize:], dst[blockSize:] + } +} + +// HChaCha20 uses the ChaCha20 core to generate a derived key from a 32 bytes +// key and a 16 bytes nonce. It returns an error if key or nonce have any other +// length. It is used as part of the XChaCha20 construction. +func HChaCha20(key, nonce []byte) ([]byte, error) { + // This function is split into a wrapper so that the slice allocation will + // be inlined, and depending on how the caller uses the return value, won't + // escape to the heap. + out := make([]byte, 32) + return hChaCha20(out, key, nonce) +} + +func hChaCha20(out, key, nonce []byte) ([]byte, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20: wrong HChaCha20 key size") + } + if len(nonce) != 16 { + return nil, errors.New("chacha20: wrong HChaCha20 nonce size") + } + + x0, x1, x2, x3 := j0, j1, j2, j3 + x4 := binary.LittleEndian.Uint32(key[0:4]) + x5 := binary.LittleEndian.Uint32(key[4:8]) + x6 := binary.LittleEndian.Uint32(key[8:12]) + x7 := binary.LittleEndian.Uint32(key[12:16]) + x8 := binary.LittleEndian.Uint32(key[16:20]) + x9 := binary.LittleEndian.Uint32(key[20:24]) + x10 := binary.LittleEndian.Uint32(key[24:28]) + x11 := binary.LittleEndian.Uint32(key[28:32]) + x12 := binary.LittleEndian.Uint32(nonce[0:4]) + x13 := binary.LittleEndian.Uint32(nonce[4:8]) + x14 := binary.LittleEndian.Uint32(nonce[8:12]) + x15 := binary.LittleEndian.Uint32(nonce[12:16]) + + for i := 0; i < 10; i++ { + // Diagonal round. + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + // Column round. + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + _ = out[31] // bounds check elimination hint + binary.LittleEndian.PutUint32(out[0:4], x0) + binary.LittleEndian.PutUint32(out[4:8], x1) + binary.LittleEndian.PutUint32(out[8:12], x2) + binary.LittleEndian.PutUint32(out[12:16], x3) + binary.LittleEndian.PutUint32(out[16:20], x12) + binary.LittleEndian.PutUint32(out[20:24], x13) + binary.LittleEndian.PutUint32(out[24:28], x14) + binary.LittleEndian.PutUint32(out[28:32], x15) + return out, nil +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go new file mode 100644 index 0000000000..025b49897e --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go @@ -0,0 +1,14 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (!arm64 && !s390x && !ppc64le) || (arm64 && !go1.11) || !gc || purego +// +build !arm64,!s390x,!ppc64le arm64,!go1.11 !gc purego + +package chacha20 + +const bufSize = blockSize + +func (s *Cipher) xorKeyStreamBlocks(dst, src []byte) { + s.xorKeyStreamBlocksGeneric(dst, src) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go new file mode 100644 index 0000000000..da420b2e97 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go @@ -0,0 +1,17 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +package chacha20 + +const bufSize = 256 + +//go:noescape +func chaCha20_ctr32_vsx(out, inp *byte, len int, key *[8]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + chaCha20_ctr32_vsx(&dst[0], &src[0], len(src), &c.key, &c.counter) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s new file mode 100644 index 0000000000..5c0fed26f8 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s @@ -0,0 +1,450 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Based on CRYPTOGAMS code with the following comment: +// # ==================================================================== +// # Written by Andy Polyakov for the OpenSSL +// # project. The module is, however, dual licensed under OpenSSL and +// # CRYPTOGAMS licenses depending on where you obtain it. For further +// # details see http://www.openssl.org/~appro/cryptogams/. +// # ==================================================================== + +// Code for the perl script that generates the ppc64 assembler +// can be found in the cryptogams repository at the link below. It is based on +// the original from openssl. + +// https://github.com/dot-asm/cryptogams/commit/a60f5b50ed908e91 + +// The differences in this and the original implementation are +// due to the calling conventions and initialization of constants. + +//go:build gc && !purego +// +build gc,!purego + +#include "textflag.h" + +#define OUT R3 +#define INP R4 +#define LEN R5 +#define KEY R6 +#define CNT R7 +#define TMP R15 + +#define CONSTBASE R16 +#define BLOCKS R17 + +DATA consts<>+0x00(SB)/8, $0x3320646e61707865 +DATA consts<>+0x08(SB)/8, $0x6b20657479622d32 +DATA consts<>+0x10(SB)/8, $0x0000000000000001 +DATA consts<>+0x18(SB)/8, $0x0000000000000000 +DATA consts<>+0x20(SB)/8, $0x0000000000000004 +DATA consts<>+0x28(SB)/8, $0x0000000000000000 +DATA consts<>+0x30(SB)/8, $0x0a0b08090e0f0c0d +DATA consts<>+0x38(SB)/8, $0x0203000106070405 +DATA consts<>+0x40(SB)/8, $0x090a0b080d0e0f0c +DATA consts<>+0x48(SB)/8, $0x0102030005060704 +DATA consts<>+0x50(SB)/8, $0x6170786561707865 +DATA consts<>+0x58(SB)/8, $0x6170786561707865 +DATA consts<>+0x60(SB)/8, $0x3320646e3320646e +DATA consts<>+0x68(SB)/8, $0x3320646e3320646e +DATA consts<>+0x70(SB)/8, $0x79622d3279622d32 +DATA consts<>+0x78(SB)/8, $0x79622d3279622d32 +DATA consts<>+0x80(SB)/8, $0x6b2065746b206574 +DATA consts<>+0x88(SB)/8, $0x6b2065746b206574 +DATA consts<>+0x90(SB)/8, $0x0000000100000000 +DATA consts<>+0x98(SB)/8, $0x0000000300000002 +GLOBL consts<>(SB), RODATA, $0xa0 + +//func chaCha20_ctr32_vsx(out, inp *byte, len int, key *[8]uint32, counter *uint32) +TEXT ·chaCha20_ctr32_vsx(SB),NOSPLIT,$64-40 + MOVD out+0(FP), OUT + MOVD inp+8(FP), INP + MOVD len+16(FP), LEN + MOVD key+24(FP), KEY + MOVD counter+32(FP), CNT + + // Addressing for constants + MOVD $consts<>+0x00(SB), CONSTBASE + MOVD $16, R8 + MOVD $32, R9 + MOVD $48, R10 + MOVD $64, R11 + SRD $6, LEN, BLOCKS + // V16 + LXVW4X (CONSTBASE)(R0), VS48 + ADD $80,CONSTBASE + + // Load key into V17,V18 + LXVW4X (KEY)(R0), VS49 + LXVW4X (KEY)(R8), VS50 + + // Load CNT, NONCE into V19 + LXVW4X (CNT)(R0), VS51 + + // Clear V27 + VXOR V27, V27, V27 + + // V28 + LXVW4X (CONSTBASE)(R11), VS60 + + // splat slot from V19 -> V26 + VSPLTW $0, V19, V26 + + VSLDOI $4, V19, V27, V19 + VSLDOI $12, V27, V19, V19 + + VADDUWM V26, V28, V26 + + MOVD $10, R14 + MOVD R14, CTR + +loop_outer_vsx: + // V0, V1, V2, V3 + LXVW4X (R0)(CONSTBASE), VS32 + LXVW4X (R8)(CONSTBASE), VS33 + LXVW4X (R9)(CONSTBASE), VS34 + LXVW4X (R10)(CONSTBASE), VS35 + + // splat values from V17, V18 into V4-V11 + VSPLTW $0, V17, V4 + VSPLTW $1, V17, V5 + VSPLTW $2, V17, V6 + VSPLTW $3, V17, V7 + VSPLTW $0, V18, V8 + VSPLTW $1, V18, V9 + VSPLTW $2, V18, V10 + VSPLTW $3, V18, V11 + + // VOR + VOR V26, V26, V12 + + // splat values from V19 -> V13, V14, V15 + VSPLTW $1, V19, V13 + VSPLTW $2, V19, V14 + VSPLTW $3, V19, V15 + + // splat const values + VSPLTISW $-16, V27 + VSPLTISW $12, V28 + VSPLTISW $8, V29 + VSPLTISW $7, V30 + +loop_vsx: + VADDUWM V0, V4, V0 + VADDUWM V1, V5, V1 + VADDUWM V2, V6, V2 + VADDUWM V3, V7, V3 + + VXOR V12, V0, V12 + VXOR V13, V1, V13 + VXOR V14, V2, V14 + VXOR V15, V3, V15 + + VRLW V12, V27, V12 + VRLW V13, V27, V13 + VRLW V14, V27, V14 + VRLW V15, V27, V15 + + VADDUWM V8, V12, V8 + VADDUWM V9, V13, V9 + VADDUWM V10, V14, V10 + VADDUWM V11, V15, V11 + + VXOR V4, V8, V4 + VXOR V5, V9, V5 + VXOR V6, V10, V6 + VXOR V7, V11, V7 + + VRLW V4, V28, V4 + VRLW V5, V28, V5 + VRLW V6, V28, V6 + VRLW V7, V28, V7 + + VADDUWM V0, V4, V0 + VADDUWM V1, V5, V1 + VADDUWM V2, V6, V2 + VADDUWM V3, V7, V3 + + VXOR V12, V0, V12 + VXOR V13, V1, V13 + VXOR V14, V2, V14 + VXOR V15, V3, V15 + + VRLW V12, V29, V12 + VRLW V13, V29, V13 + VRLW V14, V29, V14 + VRLW V15, V29, V15 + + VADDUWM V8, V12, V8 + VADDUWM V9, V13, V9 + VADDUWM V10, V14, V10 + VADDUWM V11, V15, V11 + + VXOR V4, V8, V4 + VXOR V5, V9, V5 + VXOR V6, V10, V6 + VXOR V7, V11, V7 + + VRLW V4, V30, V4 + VRLW V5, V30, V5 + VRLW V6, V30, V6 + VRLW V7, V30, V7 + + VADDUWM V0, V5, V0 + VADDUWM V1, V6, V1 + VADDUWM V2, V7, V2 + VADDUWM V3, V4, V3 + + VXOR V15, V0, V15 + VXOR V12, V1, V12 + VXOR V13, V2, V13 + VXOR V14, V3, V14 + + VRLW V15, V27, V15 + VRLW V12, V27, V12 + VRLW V13, V27, V13 + VRLW V14, V27, V14 + + VADDUWM V10, V15, V10 + VADDUWM V11, V12, V11 + VADDUWM V8, V13, V8 + VADDUWM V9, V14, V9 + + VXOR V5, V10, V5 + VXOR V6, V11, V6 + VXOR V7, V8, V7 + VXOR V4, V9, V4 + + VRLW V5, V28, V5 + VRLW V6, V28, V6 + VRLW V7, V28, V7 + VRLW V4, V28, V4 + + VADDUWM V0, V5, V0 + VADDUWM V1, V6, V1 + VADDUWM V2, V7, V2 + VADDUWM V3, V4, V3 + + VXOR V15, V0, V15 + VXOR V12, V1, V12 + VXOR V13, V2, V13 + VXOR V14, V3, V14 + + VRLW V15, V29, V15 + VRLW V12, V29, V12 + VRLW V13, V29, V13 + VRLW V14, V29, V14 + + VADDUWM V10, V15, V10 + VADDUWM V11, V12, V11 + VADDUWM V8, V13, V8 + VADDUWM V9, V14, V9 + + VXOR V5, V10, V5 + VXOR V6, V11, V6 + VXOR V7, V8, V7 + VXOR V4, V9, V4 + + VRLW V5, V30, V5 + VRLW V6, V30, V6 + VRLW V7, V30, V7 + VRLW V4, V30, V4 + BC 16, LT, loop_vsx + + VADDUWM V12, V26, V12 + + WORD $0x13600F8C // VMRGEW V0, V1, V27 + WORD $0x13821F8C // VMRGEW V2, V3, V28 + + WORD $0x10000E8C // VMRGOW V0, V1, V0 + WORD $0x10421E8C // VMRGOW V2, V3, V2 + + WORD $0x13A42F8C // VMRGEW V4, V5, V29 + WORD $0x13C63F8C // VMRGEW V6, V7, V30 + + XXPERMDI VS32, VS34, $0, VS33 + XXPERMDI VS32, VS34, $3, VS35 + XXPERMDI VS59, VS60, $0, VS32 + XXPERMDI VS59, VS60, $3, VS34 + + WORD $0x10842E8C // VMRGOW V4, V5, V4 + WORD $0x10C63E8C // VMRGOW V6, V7, V6 + + WORD $0x13684F8C // VMRGEW V8, V9, V27 + WORD $0x138A5F8C // VMRGEW V10, V11, V28 + + XXPERMDI VS36, VS38, $0, VS37 + XXPERMDI VS36, VS38, $3, VS39 + XXPERMDI VS61, VS62, $0, VS36 + XXPERMDI VS61, VS62, $3, VS38 + + WORD $0x11084E8C // VMRGOW V8, V9, V8 + WORD $0x114A5E8C // VMRGOW V10, V11, V10 + + WORD $0x13AC6F8C // VMRGEW V12, V13, V29 + WORD $0x13CE7F8C // VMRGEW V14, V15, V30 + + XXPERMDI VS40, VS42, $0, VS41 + XXPERMDI VS40, VS42, $3, VS43 + XXPERMDI VS59, VS60, $0, VS40 + XXPERMDI VS59, VS60, $3, VS42 + + WORD $0x118C6E8C // VMRGOW V12, V13, V12 + WORD $0x11CE7E8C // VMRGOW V14, V15, V14 + + VSPLTISW $4, V27 + VADDUWM V26, V27, V26 + + XXPERMDI VS44, VS46, $0, VS45 + XXPERMDI VS44, VS46, $3, VS47 + XXPERMDI VS61, VS62, $0, VS44 + XXPERMDI VS61, VS62, $3, VS46 + + VADDUWM V0, V16, V0 + VADDUWM V4, V17, V4 + VADDUWM V8, V18, V8 + VADDUWM V12, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + // Bottom of loop + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V1, V16, V0 + VADDUWM V5, V17, V4 + VADDUWM V9, V18, V8 + VADDUWM V13, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + VXOR V27, V0, V27 + + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(V10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V2, V16, V0 + VADDUWM V6, V17, V4 + VADDUWM V10, V18, V8 + VADDUWM V14, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V3, V16, V0 + VADDUWM V7, V17, V4 + VADDUWM V11, V18, V8 + VADDUWM V15, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + + MOVD $10, R14 + MOVD R14, CTR + BNE loop_outer_vsx + +done_vsx: + // Increment counter by number of 64 byte blocks + MOVD (CNT), R14 + ADD BLOCKS, R14 + MOVD R14, (CNT) + RET + +tail_vsx: + ADD $32, R1, R11 + MOVD LEN, CTR + + // Save values on stack to copy from + STXVW4X VS32, (R11)(R0) + STXVW4X VS36, (R11)(R8) + STXVW4X VS40, (R11)(R9) + STXVW4X VS44, (R11)(R10) + ADD $-1, R11, R12 + ADD $-1, INP + ADD $-1, OUT + +looptail_vsx: + // Copying the result to OUT + // in bytes. + MOVBZU 1(R12), KEY + MOVBZU 1(INP), TMP + XOR KEY, TMP, KEY + MOVBU KEY, 1(OUT) + BC 16, LT, looptail_vsx + + // Clear the stack values + STXVW4X VS48, (R11)(R0) + STXVW4X VS48, (R11)(R8) + STXVW4X VS48, (R11)(R9) + STXVW4X VS48, (R11)(R10) + BR done_vsx diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go new file mode 100644 index 0000000000..c5898db465 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go @@ -0,0 +1,27 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +package chacha20 + +import "golang.org/x/sys/cpu" + +var haveAsm = cpu.S390X.HasVX + +const bufSize = 256 + +// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only +// be called when the vector facility is available. Implementation in asm_s390x.s. +//go:noescape +func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + if cpu.S390X.HasVX { + xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter) + } else { + c.xorKeyStreamBlocksGeneric(dst, src) + } +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s new file mode 100644 index 0000000000..f3ef5a019d --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s @@ -0,0 +1,225 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +#include "go_asm.h" +#include "textflag.h" + +// This is an implementation of the ChaCha20 encryption algorithm as +// specified in RFC 7539. It uses vector instructions to compute +// 4 keystream blocks in parallel (256 bytes) which are then XORed +// with the bytes in the input slice. + +GLOBL ·constants<>(SB), RODATA|NOPTR, $32 +// BSWAP: swap bytes in each 4-byte element +DATA ·constants<>+0x00(SB)/4, $0x03020100 +DATA ·constants<>+0x04(SB)/4, $0x07060504 +DATA ·constants<>+0x08(SB)/4, $0x0b0a0908 +DATA ·constants<>+0x0c(SB)/4, $0x0f0e0d0c +// J0: [j0, j1, j2, j3] +DATA ·constants<>+0x10(SB)/4, $0x61707865 +DATA ·constants<>+0x14(SB)/4, $0x3320646e +DATA ·constants<>+0x18(SB)/4, $0x79622d32 +DATA ·constants<>+0x1c(SB)/4, $0x6b206574 + +#define BSWAP V5 +#define J0 V6 +#define KEY0 V7 +#define KEY1 V8 +#define NONCE V9 +#define CTR V10 +#define M0 V11 +#define M1 V12 +#define M2 V13 +#define M3 V14 +#define INC V15 +#define X0 V16 +#define X1 V17 +#define X2 V18 +#define X3 V19 +#define X4 V20 +#define X5 V21 +#define X6 V22 +#define X7 V23 +#define X8 V24 +#define X9 V25 +#define X10 V26 +#define X11 V27 +#define X12 V28 +#define X13 V29 +#define X14 V30 +#define X15 V31 + +#define NUM_ROUNDS 20 + +#define ROUND4(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3) \ + VAF a1, a0, a0 \ + VAF b1, b0, b0 \ + VAF c1, c0, c0 \ + VAF d1, d0, d0 \ + VX a0, a2, a2 \ + VX b0, b2, b2 \ + VX c0, c2, c2 \ + VX d0, d2, d2 \ + VERLLF $16, a2, a2 \ + VERLLF $16, b2, b2 \ + VERLLF $16, c2, c2 \ + VERLLF $16, d2, d2 \ + VAF a2, a3, a3 \ + VAF b2, b3, b3 \ + VAF c2, c3, c3 \ + VAF d2, d3, d3 \ + VX a3, a1, a1 \ + VX b3, b1, b1 \ + VX c3, c1, c1 \ + VX d3, d1, d1 \ + VERLLF $12, a1, a1 \ + VERLLF $12, b1, b1 \ + VERLLF $12, c1, c1 \ + VERLLF $12, d1, d1 \ + VAF a1, a0, a0 \ + VAF b1, b0, b0 \ + VAF c1, c0, c0 \ + VAF d1, d0, d0 \ + VX a0, a2, a2 \ + VX b0, b2, b2 \ + VX c0, c2, c2 \ + VX d0, d2, d2 \ + VERLLF $8, a2, a2 \ + VERLLF $8, b2, b2 \ + VERLLF $8, c2, c2 \ + VERLLF $8, d2, d2 \ + VAF a2, a3, a3 \ + VAF b2, b3, b3 \ + VAF c2, c3, c3 \ + VAF d2, d3, d3 \ + VX a3, a1, a1 \ + VX b3, b1, b1 \ + VX c3, c1, c1 \ + VX d3, d1, d1 \ + VERLLF $7, a1, a1 \ + VERLLF $7, b1, b1 \ + VERLLF $7, c1, c1 \ + VERLLF $7, d1, d1 + +#define PERMUTE(mask, v0, v1, v2, v3) \ + VPERM v0, v0, mask, v0 \ + VPERM v1, v1, mask, v1 \ + VPERM v2, v2, mask, v2 \ + VPERM v3, v3, mask, v3 + +#define ADDV(x, v0, v1, v2, v3) \ + VAF x, v0, v0 \ + VAF x, v1, v1 \ + VAF x, v2, v2 \ + VAF x, v3, v3 + +#define XORV(off, dst, src, v0, v1, v2, v3) \ + VLM off(src), M0, M3 \ + PERMUTE(BSWAP, v0, v1, v2, v3) \ + VX v0, M0, M0 \ + VX v1, M1, M1 \ + VX v2, M2, M2 \ + VX v3, M3, M3 \ + VSTM M0, M3, off(dst) + +#define SHUFFLE(a, b, c, d, t, u, v, w) \ + VMRHF a, c, t \ // t = {a[0], c[0], a[1], c[1]} + VMRHF b, d, u \ // u = {b[0], d[0], b[1], d[1]} + VMRLF a, c, v \ // v = {a[2], c[2], a[3], c[3]} + VMRLF b, d, w \ // w = {b[2], d[2], b[3], d[3]} + VMRHF t, u, a \ // a = {a[0], b[0], c[0], d[0]} + VMRLF t, u, b \ // b = {a[1], b[1], c[1], d[1]} + VMRHF v, w, c \ // c = {a[2], b[2], c[2], d[2]} + VMRLF v, w, d // d = {a[3], b[3], c[3], d[3]} + +// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) +TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 + MOVD $·constants<>(SB), R1 + MOVD dst+0(FP), R2 // R2=&dst[0] + LMG src+24(FP), R3, R4 // R3=&src[0] R4=len(src) + MOVD key+48(FP), R5 // R5=key + MOVD nonce+56(FP), R6 // R6=nonce + MOVD counter+64(FP), R7 // R7=counter + + // load BSWAP and J0 + VLM (R1), BSWAP, J0 + + // setup + MOVD $95, R0 + VLM (R5), KEY0, KEY1 + VLL R0, (R6), NONCE + VZERO M0 + VLEIB $7, $32, M0 + VSRLB M0, NONCE, NONCE + + // initialize counter values + VLREPF (R7), CTR + VZERO INC + VLEIF $1, $1, INC + VLEIF $2, $2, INC + VLEIF $3, $3, INC + VAF INC, CTR, CTR + VREPIF $4, INC + +chacha: + VREPF $0, J0, X0 + VREPF $1, J0, X1 + VREPF $2, J0, X2 + VREPF $3, J0, X3 + VREPF $0, KEY0, X4 + VREPF $1, KEY0, X5 + VREPF $2, KEY0, X6 + VREPF $3, KEY0, X7 + VREPF $0, KEY1, X8 + VREPF $1, KEY1, X9 + VREPF $2, KEY1, X10 + VREPF $3, KEY1, X11 + VLR CTR, X12 + VREPF $1, NONCE, X13 + VREPF $2, NONCE, X14 + VREPF $3, NONCE, X15 + + MOVD $(NUM_ROUNDS/2), R1 + +loop: + ROUND4(X0, X4, X12, X8, X1, X5, X13, X9, X2, X6, X14, X10, X3, X7, X15, X11) + ROUND4(X0, X5, X15, X10, X1, X6, X12, X11, X2, X7, X13, X8, X3, X4, X14, X9) + + ADD $-1, R1 + BNE loop + + // decrement length + ADD $-256, R4 + + // rearrange vectors + SHUFFLE(X0, X1, X2, X3, M0, M1, M2, M3) + ADDV(J0, X0, X1, X2, X3) + SHUFFLE(X4, X5, X6, X7, M0, M1, M2, M3) + ADDV(KEY0, X4, X5, X6, X7) + SHUFFLE(X8, X9, X10, X11, M0, M1, M2, M3) + ADDV(KEY1, X8, X9, X10, X11) + VAF CTR, X12, X12 + SHUFFLE(X12, X13, X14, X15, M0, M1, M2, M3) + ADDV(NONCE, X12, X13, X14, X15) + + // increment counters + VAF INC, CTR, CTR + + // xor keystream with plaintext + XORV(0*64, R2, R3, X0, X4, X8, X12) + XORV(1*64, R2, R3, X1, X5, X9, X13) + XORV(2*64, R2, R3, X2, X6, X10, X14) + XORV(3*64, R2, R3, X3, X7, X11, X15) + + // increment pointers + MOVD $256(R2), R2 + MOVD $256(R3), R3 + + CMPBNE R4, $0, chacha + + VSTEF $0, CTR, (R7) + RET diff --git a/vendor/golang.org/x/crypto/chacha20/xor.go b/vendor/golang.org/x/crypto/chacha20/xor.go new file mode 100644 index 0000000000..c2d04851e0 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/xor.go @@ -0,0 +1,42 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found src the LICENSE file. + +package chacha20 + +import "runtime" + +// Platforms that have fast unaligned 32-bit little endian accesses. +const unaligned = runtime.GOARCH == "386" || + runtime.GOARCH == "amd64" || + runtime.GOARCH == "arm64" || + runtime.GOARCH == "ppc64le" || + runtime.GOARCH == "s390x" + +// addXor reads a little endian uint32 from src, XORs it with (a + b) and +// places the result in little endian byte order in dst. +func addXor(dst, src []byte, a, b uint32) { + _, _ = src[3], dst[3] // bounds check elimination hint + if unaligned { + // The compiler should optimize this code into + // 32-bit unaligned little endian loads and stores. + // TODO: delete once the compiler does a reliably + // good job with the generic code below. + // See issue #25111 for more details. + v := uint32(src[0]) + v |= uint32(src[1]) << 8 + v |= uint32(src[2]) << 16 + v |= uint32(src[3]) << 24 + v ^= a + b + dst[0] = byte(v) + dst[1] = byte(v >> 8) + dst[2] = byte(v >> 16) + dst[3] = byte(v >> 24) + } else { + a += b + dst[0] = src[0] ^ byte(a) + dst[1] = src[1] ^ byte(a>>8) + dst[2] = src[2] ^ byte(a>>16) + dst[3] = src[3] ^ byte(a>>24) + } +} diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519.go b/vendor/golang.org/x/crypto/curve25519/curve25519.go new file mode 100644 index 0000000000..cda3fdd354 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/curve25519.go @@ -0,0 +1,145 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package curve25519 provides an implementation of the X25519 function, which +// performs scalar multiplication on the elliptic curve known as Curve25519. +// See RFC 7748. +package curve25519 // import "golang.org/x/crypto/curve25519" + +import ( + "crypto/subtle" + "fmt" + + "golang.org/x/crypto/curve25519/internal/field" +) + +// ScalarMult sets dst to the product scalar * point. +// +// Deprecated: when provided a low-order point, ScalarMult will set dst to all +// zeroes, irrespective of the scalar. Instead, use the X25519 function, which +// will return an error. +func ScalarMult(dst, scalar, point *[32]byte) { + var e [32]byte + + copy(e[:], scalar[:]) + e[0] &= 248 + e[31] &= 127 + e[31] |= 64 + + var x1, x2, z2, x3, z3, tmp0, tmp1 field.Element + x1.SetBytes(point[:]) + x2.One() + x3.Set(&x1) + z3.One() + + swap := 0 + for pos := 254; pos >= 0; pos-- { + b := e[pos/8] >> uint(pos&7) + b &= 1 + swap ^= int(b) + x2.Swap(&x3, swap) + z2.Swap(&z3, swap) + swap = int(b) + + tmp0.Subtract(&x3, &z3) + tmp1.Subtract(&x2, &z2) + x2.Add(&x2, &z2) + z2.Add(&x3, &z3) + z3.Multiply(&tmp0, &x2) + z2.Multiply(&z2, &tmp1) + tmp0.Square(&tmp1) + tmp1.Square(&x2) + x3.Add(&z3, &z2) + z2.Subtract(&z3, &z2) + x2.Multiply(&tmp1, &tmp0) + tmp1.Subtract(&tmp1, &tmp0) + z2.Square(&z2) + + z3.Mult32(&tmp1, 121666) + x3.Square(&x3) + tmp0.Add(&tmp0, &z3) + z3.Multiply(&x1, &z2) + z2.Multiply(&tmp1, &tmp0) + } + + x2.Swap(&x3, swap) + z2.Swap(&z3, swap) + + z2.Invert(&z2) + x2.Multiply(&x2, &z2) + copy(dst[:], x2.Bytes()) +} + +// ScalarBaseMult sets dst to the product scalar * base where base is the +// standard generator. +// +// It is recommended to use the X25519 function with Basepoint instead, as +// copying into fixed size arrays can lead to unexpected bugs. +func ScalarBaseMult(dst, scalar *[32]byte) { + ScalarMult(dst, scalar, &basePoint) +} + +const ( + // ScalarSize is the size of the scalar input to X25519. + ScalarSize = 32 + // PointSize is the size of the point input to X25519. + PointSize = 32 +) + +// Basepoint is the canonical Curve25519 generator. +var Basepoint []byte + +var basePoint = [32]byte{9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +func init() { Basepoint = basePoint[:] } + +func checkBasepoint() { + if subtle.ConstantTimeCompare(Basepoint, []byte{ + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }) != 1 { + panic("curve25519: global Basepoint value was modified") + } +} + +// X25519 returns the result of the scalar multiplication (scalar * point), +// according to RFC 7748, Section 5. scalar, point and the return value are +// slices of 32 bytes. +// +// scalar can be generated at random, for example with crypto/rand. point should +// be either Basepoint or the output of another X25519 call. +// +// If point is Basepoint (but not if it's a different slice with the same +// contents) a precomputed implementation might be used for performance. +func X25519(scalar, point []byte) ([]byte, error) { + // Outline the body of function, to let the allocation be inlined in the + // caller, and possibly avoid escaping to the heap. + var dst [32]byte + return x25519(&dst, scalar, point) +} + +func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) { + var in [32]byte + if l := len(scalar); l != 32 { + return nil, fmt.Errorf("bad scalar length: %d, expected %d", l, 32) + } + if l := len(point); l != 32 { + return nil, fmt.Errorf("bad point length: %d, expected %d", l, 32) + } + copy(in[:], scalar) + if &point[0] == &Basepoint[0] { + checkBasepoint() + ScalarBaseMult(dst, &in) + } else { + var base, zero [32]byte + copy(base[:], point) + ScalarMult(dst, &in, &base) + if subtle.ConstantTimeCompare(dst[:], zero[:]) == 1 { + return nil, fmt.Errorf("bad input point: low order point") + } + } + return dst[:], nil +} diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/README b/vendor/golang.org/x/crypto/curve25519/internal/field/README new file mode 100644 index 0000000000..e25bca7dc8 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/README @@ -0,0 +1,7 @@ +This package is kept in sync with crypto/ed25519/internal/edwards25519/field in +the standard library. + +If there are any changes in the standard library that need to be synced to this +package, run sync.sh. It will not overwrite any local changes made since the +previous sync, so it's ok to land changes in this package first, and then sync +to the standard library later. diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe.go new file mode 100644 index 0000000000..ca841ad99e --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe.go @@ -0,0 +1,416 @@ +// Copyright (c) 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package field implements fast arithmetic modulo 2^255-19. +package field + +import ( + "crypto/subtle" + "encoding/binary" + "math/bits" +) + +// Element represents an element of the field GF(2^255-19). Note that this +// is not a cryptographically secure group, and should only be used to interact +// with edwards25519.Point coordinates. +// +// This type works similarly to math/big.Int, and all arguments and receivers +// are allowed to alias. +// +// The zero value is a valid zero element. +type Element struct { + // An element t represents the integer + // t.l0 + t.l1*2^51 + t.l2*2^102 + t.l3*2^153 + t.l4*2^204 + // + // Between operations, all limbs are expected to be lower than 2^52. + l0 uint64 + l1 uint64 + l2 uint64 + l3 uint64 + l4 uint64 +} + +const maskLow51Bits uint64 = (1 << 51) - 1 + +var feZero = &Element{0, 0, 0, 0, 0} + +// Zero sets v = 0, and returns v. +func (v *Element) Zero() *Element { + *v = *feZero + return v +} + +var feOne = &Element{1, 0, 0, 0, 0} + +// One sets v = 1, and returns v. +func (v *Element) One() *Element { + *v = *feOne + return v +} + +// reduce reduces v modulo 2^255 - 19 and returns it. +func (v *Element) reduce() *Element { + v.carryPropagate() + + // After the light reduction we now have a field element representation + // v < 2^255 + 2^13 * 19, but need v < 2^255 - 19. + + // If v >= 2^255 - 19, then v + 19 >= 2^255, which would overflow 2^255 - 1, + // generating a carry. That is, c will be 0 if v < 2^255 - 19, and 1 otherwise. + c := (v.l0 + 19) >> 51 + c = (v.l1 + c) >> 51 + c = (v.l2 + c) >> 51 + c = (v.l3 + c) >> 51 + c = (v.l4 + c) >> 51 + + // If v < 2^255 - 19 and c = 0, this will be a no-op. Otherwise, it's + // effectively applying the reduction identity to the carry. + v.l0 += 19 * c + + v.l1 += v.l0 >> 51 + v.l0 = v.l0 & maskLow51Bits + v.l2 += v.l1 >> 51 + v.l1 = v.l1 & maskLow51Bits + v.l3 += v.l2 >> 51 + v.l2 = v.l2 & maskLow51Bits + v.l4 += v.l3 >> 51 + v.l3 = v.l3 & maskLow51Bits + // no additional carry + v.l4 = v.l4 & maskLow51Bits + + return v +} + +// Add sets v = a + b, and returns v. +func (v *Element) Add(a, b *Element) *Element { + v.l0 = a.l0 + b.l0 + v.l1 = a.l1 + b.l1 + v.l2 = a.l2 + b.l2 + v.l3 = a.l3 + b.l3 + v.l4 = a.l4 + b.l4 + // Using the generic implementation here is actually faster than the + // assembly. Probably because the body of this function is so simple that + // the compiler can figure out better optimizations by inlining the carry + // propagation. TODO + return v.carryPropagateGeneric() +} + +// Subtract sets v = a - b, and returns v. +func (v *Element) Subtract(a, b *Element) *Element { + // We first add 2 * p, to guarantee the subtraction won't underflow, and + // then subtract b (which can be up to 2^255 + 2^13 * 19). + v.l0 = (a.l0 + 0xFFFFFFFFFFFDA) - b.l0 + v.l1 = (a.l1 + 0xFFFFFFFFFFFFE) - b.l1 + v.l2 = (a.l2 + 0xFFFFFFFFFFFFE) - b.l2 + v.l3 = (a.l3 + 0xFFFFFFFFFFFFE) - b.l3 + v.l4 = (a.l4 + 0xFFFFFFFFFFFFE) - b.l4 + return v.carryPropagate() +} + +// Negate sets v = -a, and returns v. +func (v *Element) Negate(a *Element) *Element { + return v.Subtract(feZero, a) +} + +// Invert sets v = 1/z mod p, and returns v. +// +// If z == 0, Invert returns v = 0. +func (v *Element) Invert(z *Element) *Element { + // Inversion is implemented as exponentiation with exponent p − 2. It uses the + // same sequence of 255 squarings and 11 multiplications as [Curve25519]. + var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t Element + + z2.Square(z) // 2 + t.Square(&z2) // 4 + t.Square(&t) // 8 + z9.Multiply(&t, z) // 9 + z11.Multiply(&z9, &z2) // 11 + t.Square(&z11) // 22 + z2_5_0.Multiply(&t, &z9) // 31 = 2^5 - 2^0 + + t.Square(&z2_5_0) // 2^6 - 2^1 + for i := 0; i < 4; i++ { + t.Square(&t) // 2^10 - 2^5 + } + z2_10_0.Multiply(&t, &z2_5_0) // 2^10 - 2^0 + + t.Square(&z2_10_0) // 2^11 - 2^1 + for i := 0; i < 9; i++ { + t.Square(&t) // 2^20 - 2^10 + } + z2_20_0.Multiply(&t, &z2_10_0) // 2^20 - 2^0 + + t.Square(&z2_20_0) // 2^21 - 2^1 + for i := 0; i < 19; i++ { + t.Square(&t) // 2^40 - 2^20 + } + t.Multiply(&t, &z2_20_0) // 2^40 - 2^0 + + t.Square(&t) // 2^41 - 2^1 + for i := 0; i < 9; i++ { + t.Square(&t) // 2^50 - 2^10 + } + z2_50_0.Multiply(&t, &z2_10_0) // 2^50 - 2^0 + + t.Square(&z2_50_0) // 2^51 - 2^1 + for i := 0; i < 49; i++ { + t.Square(&t) // 2^100 - 2^50 + } + z2_100_0.Multiply(&t, &z2_50_0) // 2^100 - 2^0 + + t.Square(&z2_100_0) // 2^101 - 2^1 + for i := 0; i < 99; i++ { + t.Square(&t) // 2^200 - 2^100 + } + t.Multiply(&t, &z2_100_0) // 2^200 - 2^0 + + t.Square(&t) // 2^201 - 2^1 + for i := 0; i < 49; i++ { + t.Square(&t) // 2^250 - 2^50 + } + t.Multiply(&t, &z2_50_0) // 2^250 - 2^0 + + t.Square(&t) // 2^251 - 2^1 + t.Square(&t) // 2^252 - 2^2 + t.Square(&t) // 2^253 - 2^3 + t.Square(&t) // 2^254 - 2^4 + t.Square(&t) // 2^255 - 2^5 + + return v.Multiply(&t, &z11) // 2^255 - 21 +} + +// Set sets v = a, and returns v. +func (v *Element) Set(a *Element) *Element { + *v = *a + return v +} + +// SetBytes sets v to x, which must be a 32-byte little-endian encoding. +// +// Consistent with RFC 7748, the most significant bit (the high bit of the +// last byte) is ignored, and non-canonical values (2^255-19 through 2^255-1) +// are accepted. Note that this is laxer than specified by RFC 8032. +func (v *Element) SetBytes(x []byte) *Element { + if len(x) != 32 { + panic("edwards25519: invalid field element input size") + } + + // Bits 0:51 (bytes 0:8, bits 0:64, shift 0, mask 51). + v.l0 = binary.LittleEndian.Uint64(x[0:8]) + v.l0 &= maskLow51Bits + // Bits 51:102 (bytes 6:14, bits 48:112, shift 3, mask 51). + v.l1 = binary.LittleEndian.Uint64(x[6:14]) >> 3 + v.l1 &= maskLow51Bits + // Bits 102:153 (bytes 12:20, bits 96:160, shift 6, mask 51). + v.l2 = binary.LittleEndian.Uint64(x[12:20]) >> 6 + v.l2 &= maskLow51Bits + // Bits 153:204 (bytes 19:27, bits 152:216, shift 1, mask 51). + v.l3 = binary.LittleEndian.Uint64(x[19:27]) >> 1 + v.l3 &= maskLow51Bits + // Bits 204:251 (bytes 24:32, bits 192:256, shift 12, mask 51). + // Note: not bytes 25:33, shift 4, to avoid overread. + v.l4 = binary.LittleEndian.Uint64(x[24:32]) >> 12 + v.l4 &= maskLow51Bits + + return v +} + +// Bytes returns the canonical 32-byte little-endian encoding of v. +func (v *Element) Bytes() []byte { + // This function is outlined to make the allocations inline in the caller + // rather than happen on the heap. + var out [32]byte + return v.bytes(&out) +} + +func (v *Element) bytes(out *[32]byte) []byte { + t := *v + t.reduce() + + var buf [8]byte + for i, l := range [5]uint64{t.l0, t.l1, t.l2, t.l3, t.l4} { + bitsOffset := i * 51 + binary.LittleEndian.PutUint64(buf[:], l<= len(out) { + break + } + out[off] |= bb + } + } + + return out[:] +} + +// Equal returns 1 if v and u are equal, and 0 otherwise. +func (v *Element) Equal(u *Element) int { + sa, sv := u.Bytes(), v.Bytes() + return subtle.ConstantTimeCompare(sa, sv) +} + +// mask64Bits returns 0xffffffff if cond is 1, and 0 otherwise. +func mask64Bits(cond int) uint64 { return ^(uint64(cond) - 1) } + +// Select sets v to a if cond == 1, and to b if cond == 0. +func (v *Element) Select(a, b *Element, cond int) *Element { + m := mask64Bits(cond) + v.l0 = (m & a.l0) | (^m & b.l0) + v.l1 = (m & a.l1) | (^m & b.l1) + v.l2 = (m & a.l2) | (^m & b.l2) + v.l3 = (m & a.l3) | (^m & b.l3) + v.l4 = (m & a.l4) | (^m & b.l4) + return v +} + +// Swap swaps v and u if cond == 1 or leaves them unchanged if cond == 0, and returns v. +func (v *Element) Swap(u *Element, cond int) { + m := mask64Bits(cond) + t := m & (v.l0 ^ u.l0) + v.l0 ^= t + u.l0 ^= t + t = m & (v.l1 ^ u.l1) + v.l1 ^= t + u.l1 ^= t + t = m & (v.l2 ^ u.l2) + v.l2 ^= t + u.l2 ^= t + t = m & (v.l3 ^ u.l3) + v.l3 ^= t + u.l3 ^= t + t = m & (v.l4 ^ u.l4) + v.l4 ^= t + u.l4 ^= t +} + +// IsNegative returns 1 if v is negative, and 0 otherwise. +func (v *Element) IsNegative() int { + return int(v.Bytes()[0] & 1) +} + +// Absolute sets v to |u|, and returns v. +func (v *Element) Absolute(u *Element) *Element { + return v.Select(new(Element).Negate(u), u, u.IsNegative()) +} + +// Multiply sets v = x * y, and returns v. +func (v *Element) Multiply(x, y *Element) *Element { + feMul(v, x, y) + return v +} + +// Square sets v = x * x, and returns v. +func (v *Element) Square(x *Element) *Element { + feSquare(v, x) + return v +} + +// Mult32 sets v = x * y, and returns v. +func (v *Element) Mult32(x *Element, y uint32) *Element { + x0lo, x0hi := mul51(x.l0, y) + x1lo, x1hi := mul51(x.l1, y) + x2lo, x2hi := mul51(x.l2, y) + x3lo, x3hi := mul51(x.l3, y) + x4lo, x4hi := mul51(x.l4, y) + v.l0 = x0lo + 19*x4hi // carried over per the reduction identity + v.l1 = x1lo + x0hi + v.l2 = x2lo + x1hi + v.l3 = x3lo + x2hi + v.l4 = x4lo + x3hi + // The hi portions are going to be only 32 bits, plus any previous excess, + // so we can skip the carry propagation. + return v +} + +// mul51 returns lo + hi * 2⁵¹ = a * b. +func mul51(a uint64, b uint32) (lo uint64, hi uint64) { + mh, ml := bits.Mul64(a, uint64(b)) + lo = ml & maskLow51Bits + hi = (mh << 13) | (ml >> 51) + return +} + +// Pow22523 set v = x^((p-5)/8), and returns v. (p-5)/8 is 2^252-3. +func (v *Element) Pow22523(x *Element) *Element { + var t0, t1, t2 Element + + t0.Square(x) // x^2 + t1.Square(&t0) // x^4 + t1.Square(&t1) // x^8 + t1.Multiply(x, &t1) // x^9 + t0.Multiply(&t0, &t1) // x^11 + t0.Square(&t0) // x^22 + t0.Multiply(&t1, &t0) // x^31 + t1.Square(&t0) // x^62 + for i := 1; i < 5; i++ { // x^992 + t1.Square(&t1) + } + t0.Multiply(&t1, &t0) // x^1023 -> 1023 = 2^10 - 1 + t1.Square(&t0) // 2^11 - 2 + for i := 1; i < 10; i++ { // 2^20 - 2^10 + t1.Square(&t1) + } + t1.Multiply(&t1, &t0) // 2^20 - 1 + t2.Square(&t1) // 2^21 - 2 + for i := 1; i < 20; i++ { // 2^40 - 2^20 + t2.Square(&t2) + } + t1.Multiply(&t2, &t1) // 2^40 - 1 + t1.Square(&t1) // 2^41 - 2 + for i := 1; i < 10; i++ { // 2^50 - 2^10 + t1.Square(&t1) + } + t0.Multiply(&t1, &t0) // 2^50 - 1 + t1.Square(&t0) // 2^51 - 2 + for i := 1; i < 50; i++ { // 2^100 - 2^50 + t1.Square(&t1) + } + t1.Multiply(&t1, &t0) // 2^100 - 1 + t2.Square(&t1) // 2^101 - 2 + for i := 1; i < 100; i++ { // 2^200 - 2^100 + t2.Square(&t2) + } + t1.Multiply(&t2, &t1) // 2^200 - 1 + t1.Square(&t1) // 2^201 - 2 + for i := 1; i < 50; i++ { // 2^250 - 2^50 + t1.Square(&t1) + } + t0.Multiply(&t1, &t0) // 2^250 - 1 + t0.Square(&t0) // 2^251 - 2 + t0.Square(&t0) // 2^252 - 4 + return v.Multiply(&t0, x) // 2^252 - 3 -> x^(2^252-3) +} + +// sqrtM1 is 2^((p-1)/4), which squared is equal to -1 by Euler's Criterion. +var sqrtM1 = &Element{1718705420411056, 234908883556509, + 2233514472574048, 2117202627021982, 765476049583133} + +// SqrtRatio sets r to the non-negative square root of the ratio of u and v. +// +// If u/v is square, SqrtRatio returns r and 1. If u/v is not square, SqrtRatio +// sets r according to Section 4.3 of draft-irtf-cfrg-ristretto255-decaf448-00, +// and returns r and 0. +func (r *Element) SqrtRatio(u, v *Element) (rr *Element, wasSquare int) { + var a, b Element + + // r = (u * v3) * (u * v7)^((p-5)/8) + v2 := a.Square(v) + uv3 := b.Multiply(u, b.Multiply(v2, v)) + uv7 := a.Multiply(uv3, a.Square(v2)) + r.Multiply(uv3, r.Pow22523(uv7)) + + check := a.Multiply(v, a.Square(r)) // check = v * r^2 + + uNeg := b.Negate(u) + correctSignSqrt := check.Equal(u) + flippedSignSqrt := check.Equal(uNeg) + flippedSignSqrtI := check.Equal(uNeg.Multiply(uNeg, sqrtM1)) + + rPrime := b.Multiply(r, sqrtM1) // r_prime = SQRT_M1 * r + // r = CT_SELECT(r_prime IF flipped_sign_sqrt | flipped_sign_sqrt_i ELSE r) + r.Select(rPrime, r, flippedSignSqrt|flippedSignSqrtI) + + r.Absolute(r) // Choose the nonnegative square root. + return r, correctSignSqrt | flippedSignSqrt +} diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go new file mode 100644 index 0000000000..44dc8e8caf --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go @@ -0,0 +1,13 @@ +// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT. + +// +build amd64,gc,!purego + +package field + +// feMul sets out = a * b. It works like feMulGeneric. +//go:noescape +func feMul(out *Element, a *Element, b *Element) + +// feSquare sets out = a * a. It works like feSquareGeneric. +//go:noescape +func feSquare(out *Element, a *Element) diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s new file mode 100644 index 0000000000..293f013c94 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s @@ -0,0 +1,379 @@ +// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT. + +//go:build amd64 && gc && !purego +// +build amd64,gc,!purego + +#include "textflag.h" + +// func feMul(out *Element, a *Element, b *Element) +TEXT ·feMul(SB), NOSPLIT, $0-24 + MOVQ a+8(FP), CX + MOVQ b+16(FP), BX + + // r0 = a0×b0 + MOVQ (CX), AX + MULQ (BX) + MOVQ AX, DI + MOVQ DX, SI + + // r0 += 19×a1×b4 + MOVQ 8(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(BX) + ADDQ AX, DI + ADCQ DX, SI + + // r0 += 19×a2×b3 + MOVQ 16(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 24(BX) + ADDQ AX, DI + ADCQ DX, SI + + // r0 += 19×a3×b2 + MOVQ 24(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 16(BX) + ADDQ AX, DI + ADCQ DX, SI + + // r0 += 19×a4×b1 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 8(BX) + ADDQ AX, DI + ADCQ DX, SI + + // r1 = a0×b1 + MOVQ (CX), AX + MULQ 8(BX) + MOVQ AX, R9 + MOVQ DX, R8 + + // r1 += a1×b0 + MOVQ 8(CX), AX + MULQ (BX) + ADDQ AX, R9 + ADCQ DX, R8 + + // r1 += 19×a2×b4 + MOVQ 16(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(BX) + ADDQ AX, R9 + ADCQ DX, R8 + + // r1 += 19×a3×b3 + MOVQ 24(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 24(BX) + ADDQ AX, R9 + ADCQ DX, R8 + + // r1 += 19×a4×b2 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 16(BX) + ADDQ AX, R9 + ADCQ DX, R8 + + // r2 = a0×b2 + MOVQ (CX), AX + MULQ 16(BX) + MOVQ AX, R11 + MOVQ DX, R10 + + // r2 += a1×b1 + MOVQ 8(CX), AX + MULQ 8(BX) + ADDQ AX, R11 + ADCQ DX, R10 + + // r2 += a2×b0 + MOVQ 16(CX), AX + MULQ (BX) + ADDQ AX, R11 + ADCQ DX, R10 + + // r2 += 19×a3×b4 + MOVQ 24(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(BX) + ADDQ AX, R11 + ADCQ DX, R10 + + // r2 += 19×a4×b3 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 24(BX) + ADDQ AX, R11 + ADCQ DX, R10 + + // r3 = a0×b3 + MOVQ (CX), AX + MULQ 24(BX) + MOVQ AX, R13 + MOVQ DX, R12 + + // r3 += a1×b2 + MOVQ 8(CX), AX + MULQ 16(BX) + ADDQ AX, R13 + ADCQ DX, R12 + + // r3 += a2×b1 + MOVQ 16(CX), AX + MULQ 8(BX) + ADDQ AX, R13 + ADCQ DX, R12 + + // r3 += a3×b0 + MOVQ 24(CX), AX + MULQ (BX) + ADDQ AX, R13 + ADCQ DX, R12 + + // r3 += 19×a4×b4 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(BX) + ADDQ AX, R13 + ADCQ DX, R12 + + // r4 = a0×b4 + MOVQ (CX), AX + MULQ 32(BX) + MOVQ AX, R15 + MOVQ DX, R14 + + // r4 += a1×b3 + MOVQ 8(CX), AX + MULQ 24(BX) + ADDQ AX, R15 + ADCQ DX, R14 + + // r4 += a2×b2 + MOVQ 16(CX), AX + MULQ 16(BX) + ADDQ AX, R15 + ADCQ DX, R14 + + // r4 += a3×b1 + MOVQ 24(CX), AX + MULQ 8(BX) + ADDQ AX, R15 + ADCQ DX, R14 + + // r4 += a4×b0 + MOVQ 32(CX), AX + MULQ (BX) + ADDQ AX, R15 + ADCQ DX, R14 + + // First reduction chain + MOVQ $0x0007ffffffffffff, AX + SHLQ $0x0d, DI, SI + SHLQ $0x0d, R9, R8 + SHLQ $0x0d, R11, R10 + SHLQ $0x0d, R13, R12 + SHLQ $0x0d, R15, R14 + ANDQ AX, DI + IMUL3Q $0x13, R14, R14 + ADDQ R14, DI + ANDQ AX, R9 + ADDQ SI, R9 + ANDQ AX, R11 + ADDQ R8, R11 + ANDQ AX, R13 + ADDQ R10, R13 + ANDQ AX, R15 + ADDQ R12, R15 + + // Second reduction chain (carryPropagate) + MOVQ DI, SI + SHRQ $0x33, SI + MOVQ R9, R8 + SHRQ $0x33, R8 + MOVQ R11, R10 + SHRQ $0x33, R10 + MOVQ R13, R12 + SHRQ $0x33, R12 + MOVQ R15, R14 + SHRQ $0x33, R14 + ANDQ AX, DI + IMUL3Q $0x13, R14, R14 + ADDQ R14, DI + ANDQ AX, R9 + ADDQ SI, R9 + ANDQ AX, R11 + ADDQ R8, R11 + ANDQ AX, R13 + ADDQ R10, R13 + ANDQ AX, R15 + ADDQ R12, R15 + + // Store output + MOVQ out+0(FP), AX + MOVQ DI, (AX) + MOVQ R9, 8(AX) + MOVQ R11, 16(AX) + MOVQ R13, 24(AX) + MOVQ R15, 32(AX) + RET + +// func feSquare(out *Element, a *Element) +TEXT ·feSquare(SB), NOSPLIT, $0-16 + MOVQ a+8(FP), CX + + // r0 = l0×l0 + MOVQ (CX), AX + MULQ (CX) + MOVQ AX, SI + MOVQ DX, BX + + // r0 += 38×l1×l4 + MOVQ 8(CX), AX + IMUL3Q $0x26, AX, AX + MULQ 32(CX) + ADDQ AX, SI + ADCQ DX, BX + + // r0 += 38×l2×l3 + MOVQ 16(CX), AX + IMUL3Q $0x26, AX, AX + MULQ 24(CX) + ADDQ AX, SI + ADCQ DX, BX + + // r1 = 2×l0×l1 + MOVQ (CX), AX + SHLQ $0x01, AX + MULQ 8(CX) + MOVQ AX, R8 + MOVQ DX, DI + + // r1 += 38×l2×l4 + MOVQ 16(CX), AX + IMUL3Q $0x26, AX, AX + MULQ 32(CX) + ADDQ AX, R8 + ADCQ DX, DI + + // r1 += 19×l3×l3 + MOVQ 24(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 24(CX) + ADDQ AX, R8 + ADCQ DX, DI + + // r2 = 2×l0×l2 + MOVQ (CX), AX + SHLQ $0x01, AX + MULQ 16(CX) + MOVQ AX, R10 + MOVQ DX, R9 + + // r2 += l1×l1 + MOVQ 8(CX), AX + MULQ 8(CX) + ADDQ AX, R10 + ADCQ DX, R9 + + // r2 += 38×l3×l4 + MOVQ 24(CX), AX + IMUL3Q $0x26, AX, AX + MULQ 32(CX) + ADDQ AX, R10 + ADCQ DX, R9 + + // r3 = 2×l0×l3 + MOVQ (CX), AX + SHLQ $0x01, AX + MULQ 24(CX) + MOVQ AX, R12 + MOVQ DX, R11 + + // r3 += 2×l1×l2 + MOVQ 8(CX), AX + IMUL3Q $0x02, AX, AX + MULQ 16(CX) + ADDQ AX, R12 + ADCQ DX, R11 + + // r3 += 19×l4×l4 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(CX) + ADDQ AX, R12 + ADCQ DX, R11 + + // r4 = 2×l0×l4 + MOVQ (CX), AX + SHLQ $0x01, AX + MULQ 32(CX) + MOVQ AX, R14 + MOVQ DX, R13 + + // r4 += 2×l1×l3 + MOVQ 8(CX), AX + IMUL3Q $0x02, AX, AX + MULQ 24(CX) + ADDQ AX, R14 + ADCQ DX, R13 + + // r4 += l2×l2 + MOVQ 16(CX), AX + MULQ 16(CX) + ADDQ AX, R14 + ADCQ DX, R13 + + // First reduction chain + MOVQ $0x0007ffffffffffff, AX + SHLQ $0x0d, SI, BX + SHLQ $0x0d, R8, DI + SHLQ $0x0d, R10, R9 + SHLQ $0x0d, R12, R11 + SHLQ $0x0d, R14, R13 + ANDQ AX, SI + IMUL3Q $0x13, R13, R13 + ADDQ R13, SI + ANDQ AX, R8 + ADDQ BX, R8 + ANDQ AX, R10 + ADDQ DI, R10 + ANDQ AX, R12 + ADDQ R9, R12 + ANDQ AX, R14 + ADDQ R11, R14 + + // Second reduction chain (carryPropagate) + MOVQ SI, BX + SHRQ $0x33, BX + MOVQ R8, DI + SHRQ $0x33, DI + MOVQ R10, R9 + SHRQ $0x33, R9 + MOVQ R12, R11 + SHRQ $0x33, R11 + MOVQ R14, R13 + SHRQ $0x33, R13 + ANDQ AX, SI + IMUL3Q $0x13, R13, R13 + ADDQ R13, SI + ANDQ AX, R8 + ADDQ BX, R8 + ANDQ AX, R10 + ADDQ DI, R10 + ANDQ AX, R12 + ADDQ R9, R12 + ANDQ AX, R14 + ADDQ R11, R14 + + // Store output + MOVQ out+0(FP), AX + MOVQ SI, (AX) + MOVQ R8, 8(AX) + MOVQ R10, 16(AX) + MOVQ R12, 24(AX) + MOVQ R14, 32(AX) + RET diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64_noasm.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64_noasm.go new file mode 100644 index 0000000000..ddb6c9b8f7 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64_noasm.go @@ -0,0 +1,12 @@ +// Copyright (c) 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !amd64 || !gc || purego +// +build !amd64 !gc purego + +package field + +func feMul(v, x, y *Element) { feMulGeneric(v, x, y) } + +func feSquare(v, x *Element) { feSquareGeneric(v, x) } diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.go new file mode 100644 index 0000000000..af459ef515 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.go @@ -0,0 +1,16 @@ +// Copyright (c) 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build arm64 && gc && !purego +// +build arm64,gc,!purego + +package field + +//go:noescape +func carryPropagate(v *Element) + +func (v *Element) carryPropagate() *Element { + carryPropagate(v) + return v +} diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.s b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.s new file mode 100644 index 0000000000..5c91e45892 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.s @@ -0,0 +1,43 @@ +// Copyright (c) 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build arm64 && gc && !purego +// +build arm64,gc,!purego + +#include "textflag.h" + +// carryPropagate works exactly like carryPropagateGeneric and uses the +// same AND, ADD, and LSR+MADD instructions emitted by the compiler, but +// avoids loading R0-R4 twice and uses LDP and STP. +// +// See https://golang.org/issues/43145 for the main compiler issue. +// +// func carryPropagate(v *Element) +TEXT ·carryPropagate(SB),NOFRAME|NOSPLIT,$0-8 + MOVD v+0(FP), R20 + + LDP 0(R20), (R0, R1) + LDP 16(R20), (R2, R3) + MOVD 32(R20), R4 + + AND $0x7ffffffffffff, R0, R10 + AND $0x7ffffffffffff, R1, R11 + AND $0x7ffffffffffff, R2, R12 + AND $0x7ffffffffffff, R3, R13 + AND $0x7ffffffffffff, R4, R14 + + ADD R0>>51, R11, R11 + ADD R1>>51, R12, R12 + ADD R2>>51, R13, R13 + ADD R3>>51, R14, R14 + // R4>>51 * 19 + R10 -> R10 + LSR $51, R4, R21 + MOVD $19, R22 + MADD R22, R10, R21, R10 + + STP (R10, R11), 0(R20) + STP (R12, R13), 16(R20) + MOVD R14, 32(R20) + + RET diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64_noasm.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64_noasm.go new file mode 100644 index 0000000000..234a5b2e5d --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64_noasm.go @@ -0,0 +1,12 @@ +// Copyright (c) 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !arm64 || !gc || purego +// +build !arm64 !gc purego + +package field + +func (v *Element) carryPropagate() *Element { + return v.carryPropagateGeneric() +} diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_generic.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_generic.go new file mode 100644 index 0000000000..7b5b78cbd6 --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_generic.go @@ -0,0 +1,264 @@ +// Copyright (c) 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package field + +import "math/bits" + +// uint128 holds a 128-bit number as two 64-bit limbs, for use with the +// bits.Mul64 and bits.Add64 intrinsics. +type uint128 struct { + lo, hi uint64 +} + +// mul64 returns a * b. +func mul64(a, b uint64) uint128 { + hi, lo := bits.Mul64(a, b) + return uint128{lo, hi} +} + +// addMul64 returns v + a * b. +func addMul64(v uint128, a, b uint64) uint128 { + hi, lo := bits.Mul64(a, b) + lo, c := bits.Add64(lo, v.lo, 0) + hi, _ = bits.Add64(hi, v.hi, c) + return uint128{lo, hi} +} + +// shiftRightBy51 returns a >> 51. a is assumed to be at most 115 bits. +func shiftRightBy51(a uint128) uint64 { + return (a.hi << (64 - 51)) | (a.lo >> 51) +} + +func feMulGeneric(v, a, b *Element) { + a0 := a.l0 + a1 := a.l1 + a2 := a.l2 + a3 := a.l3 + a4 := a.l4 + + b0 := b.l0 + b1 := b.l1 + b2 := b.l2 + b3 := b.l3 + b4 := b.l4 + + // Limb multiplication works like pen-and-paper columnar multiplication, but + // with 51-bit limbs instead of digits. + // + // a4 a3 a2 a1 a0 x + // b4 b3 b2 b1 b0 = + // ------------------------ + // a4b0 a3b0 a2b0 a1b0 a0b0 + + // a4b1 a3b1 a2b1 a1b1 a0b1 + + // a4b2 a3b2 a2b2 a1b2 a0b2 + + // a4b3 a3b3 a2b3 a1b3 a0b3 + + // a4b4 a3b4 a2b4 a1b4 a0b4 = + // ---------------------------------------------- + // r8 r7 r6 r5 r4 r3 r2 r1 r0 + // + // We can then use the reduction identity (a * 2²⁵⁵ + b = a * 19 + b) to + // reduce the limbs that would overflow 255 bits. r5 * 2²⁵⁵ becomes 19 * r5, + // r6 * 2³⁰⁶ becomes 19 * r6 * 2⁵¹, etc. + // + // Reduction can be carried out simultaneously to multiplication. For + // example, we do not compute r5: whenever the result of a multiplication + // belongs to r5, like a1b4, we multiply it by 19 and add the result to r0. + // + // a4b0 a3b0 a2b0 a1b0 a0b0 + + // a3b1 a2b1 a1b1 a0b1 19×a4b1 + + // a2b2 a1b2 a0b2 19×a4b2 19×a3b2 + + // a1b3 a0b3 19×a4b3 19×a3b3 19×a2b3 + + // a0b4 19×a4b4 19×a3b4 19×a2b4 19×a1b4 = + // -------------------------------------- + // r4 r3 r2 r1 r0 + // + // Finally we add up the columns into wide, overlapping limbs. + + a1_19 := a1 * 19 + a2_19 := a2 * 19 + a3_19 := a3 * 19 + a4_19 := a4 * 19 + + // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1) + r0 := mul64(a0, b0) + r0 = addMul64(r0, a1_19, b4) + r0 = addMul64(r0, a2_19, b3) + r0 = addMul64(r0, a3_19, b2) + r0 = addMul64(r0, a4_19, b1) + + // r1 = a0×b1 + a1×b0 + 19×(a2×b4 + a3×b3 + a4×b2) + r1 := mul64(a0, b1) + r1 = addMul64(r1, a1, b0) + r1 = addMul64(r1, a2_19, b4) + r1 = addMul64(r1, a3_19, b3) + r1 = addMul64(r1, a4_19, b2) + + // r2 = a0×b2 + a1×b1 + a2×b0 + 19×(a3×b4 + a4×b3) + r2 := mul64(a0, b2) + r2 = addMul64(r2, a1, b1) + r2 = addMul64(r2, a2, b0) + r2 = addMul64(r2, a3_19, b4) + r2 = addMul64(r2, a4_19, b3) + + // r3 = a0×b3 + a1×b2 + a2×b1 + a3×b0 + 19×a4×b4 + r3 := mul64(a0, b3) + r3 = addMul64(r3, a1, b2) + r3 = addMul64(r3, a2, b1) + r3 = addMul64(r3, a3, b0) + r3 = addMul64(r3, a4_19, b4) + + // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0 + r4 := mul64(a0, b4) + r4 = addMul64(r4, a1, b3) + r4 = addMul64(r4, a2, b2) + r4 = addMul64(r4, a3, b1) + r4 = addMul64(r4, a4, b0) + + // After the multiplication, we need to reduce (carry) the five coefficients + // to obtain a result with limbs that are at most slightly larger than 2⁵¹, + // to respect the Element invariant. + // + // Overall, the reduction works the same as carryPropagate, except with + // wider inputs: we take the carry for each coefficient by shifting it right + // by 51, and add it to the limb above it. The top carry is multiplied by 19 + // according to the reduction identity and added to the lowest limb. + // + // The largest coefficient (r0) will be at most 111 bits, which guarantees + // that all carries are at most 111 - 51 = 60 bits, which fits in a uint64. + // + // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1) + // r0 < 2⁵²×2⁵² + 19×(2⁵²×2⁵² + 2⁵²×2⁵² + 2⁵²×2⁵² + 2⁵²×2⁵²) + // r0 < (1 + 19 × 4) × 2⁵² × 2⁵² + // r0 < 2⁷ × 2⁵² × 2⁵² + // r0 < 2¹¹¹ + // + // Moreover, the top coefficient (r4) is at most 107 bits, so c4 is at most + // 56 bits, and c4 * 19 is at most 61 bits, which again fits in a uint64 and + // allows us to easily apply the reduction identity. + // + // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0 + // r4 < 5 × 2⁵² × 2⁵² + // r4 < 2¹⁰⁷ + // + + c0 := shiftRightBy51(r0) + c1 := shiftRightBy51(r1) + c2 := shiftRightBy51(r2) + c3 := shiftRightBy51(r3) + c4 := shiftRightBy51(r4) + + rr0 := r0.lo&maskLow51Bits + c4*19 + rr1 := r1.lo&maskLow51Bits + c0 + rr2 := r2.lo&maskLow51Bits + c1 + rr3 := r3.lo&maskLow51Bits + c2 + rr4 := r4.lo&maskLow51Bits + c3 + + // Now all coefficients fit into 64-bit registers but are still too large to + // be passed around as a Element. We therefore do one last carry chain, + // where the carries will be small enough to fit in the wiggle room above 2⁵¹. + *v = Element{rr0, rr1, rr2, rr3, rr4} + v.carryPropagate() +} + +func feSquareGeneric(v, a *Element) { + l0 := a.l0 + l1 := a.l1 + l2 := a.l2 + l3 := a.l3 + l4 := a.l4 + + // Squaring works precisely like multiplication above, but thanks to its + // symmetry we get to group a few terms together. + // + // l4 l3 l2 l1 l0 x + // l4 l3 l2 l1 l0 = + // ------------------------ + // l4l0 l3l0 l2l0 l1l0 l0l0 + + // l4l1 l3l1 l2l1 l1l1 l0l1 + + // l4l2 l3l2 l2l2 l1l2 l0l2 + + // l4l3 l3l3 l2l3 l1l3 l0l3 + + // l4l4 l3l4 l2l4 l1l4 l0l4 = + // ---------------------------------------------- + // r8 r7 r6 r5 r4 r3 r2 r1 r0 + // + // l4l0 l3l0 l2l0 l1l0 l0l0 + + // l3l1 l2l1 l1l1 l0l1 19×l4l1 + + // l2l2 l1l2 l0l2 19×l4l2 19×l3l2 + + // l1l3 l0l3 19×l4l3 19×l3l3 19×l2l3 + + // l0l4 19×l4l4 19×l3l4 19×l2l4 19×l1l4 = + // -------------------------------------- + // r4 r3 r2 r1 r0 + // + // With precomputed 2×, 19×, and 2×19× terms, we can compute each limb with + // only three Mul64 and four Add64, instead of five and eight. + + l0_2 := l0 * 2 + l1_2 := l1 * 2 + + l1_38 := l1 * 38 + l2_38 := l2 * 38 + l3_38 := l3 * 38 + + l3_19 := l3 * 19 + l4_19 := l4 * 19 + + // r0 = l0×l0 + 19×(l1×l4 + l2×l3 + l3×l2 + l4×l1) = l0×l0 + 19×2×(l1×l4 + l2×l3) + r0 := mul64(l0, l0) + r0 = addMul64(r0, l1_38, l4) + r0 = addMul64(r0, l2_38, l3) + + // r1 = l0×l1 + l1×l0 + 19×(l2×l4 + l3×l3 + l4×l2) = 2×l0×l1 + 19×2×l2×l4 + 19×l3×l3 + r1 := mul64(l0_2, l1) + r1 = addMul64(r1, l2_38, l4) + r1 = addMul64(r1, l3_19, l3) + + // r2 = l0×l2 + l1×l1 + l2×l0 + 19×(l3×l4 + l4×l3) = 2×l0×l2 + l1×l1 + 19×2×l3×l4 + r2 := mul64(l0_2, l2) + r2 = addMul64(r2, l1, l1) + r2 = addMul64(r2, l3_38, l4) + + // r3 = l0×l3 + l1×l2 + l2×l1 + l3×l0 + 19×l4×l4 = 2×l0×l3 + 2×l1×l2 + 19×l4×l4 + r3 := mul64(l0_2, l3) + r3 = addMul64(r3, l1_2, l2) + r3 = addMul64(r3, l4_19, l4) + + // r4 = l0×l4 + l1×l3 + l2×l2 + l3×l1 + l4×l0 = 2×l0×l4 + 2×l1×l3 + l2×l2 + r4 := mul64(l0_2, l4) + r4 = addMul64(r4, l1_2, l3) + r4 = addMul64(r4, l2, l2) + + c0 := shiftRightBy51(r0) + c1 := shiftRightBy51(r1) + c2 := shiftRightBy51(r2) + c3 := shiftRightBy51(r3) + c4 := shiftRightBy51(r4) + + rr0 := r0.lo&maskLow51Bits + c4*19 + rr1 := r1.lo&maskLow51Bits + c0 + rr2 := r2.lo&maskLow51Bits + c1 + rr3 := r3.lo&maskLow51Bits + c2 + rr4 := r4.lo&maskLow51Bits + c3 + + *v = Element{rr0, rr1, rr2, rr3, rr4} + v.carryPropagate() +} + +// carryPropagate brings the limbs below 52 bits by applying the reduction +// identity (a * 2²⁵⁵ + b = a * 19 + b) to the l4 carry. TODO inline +func (v *Element) carryPropagateGeneric() *Element { + c0 := v.l0 >> 51 + c1 := v.l1 >> 51 + c2 := v.l2 >> 51 + c3 := v.l3 >> 51 + c4 := v.l4 >> 51 + + v.l0 = v.l0&maskLow51Bits + c4*19 + v.l1 = v.l1&maskLow51Bits + c0 + v.l2 = v.l2&maskLow51Bits + c1 + v.l3 = v.l3&maskLow51Bits + c2 + v.l4 = v.l4&maskLow51Bits + c3 + + return v +} diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/sync.checkpoint b/vendor/golang.org/x/crypto/curve25519/internal/field/sync.checkpoint new file mode 100644 index 0000000000..e3685f95ca --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/sync.checkpoint @@ -0,0 +1 @@ +b0c49ae9f59d233526f8934262c5bbbe14d4358d diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/sync.sh b/vendor/golang.org/x/crypto/curve25519/internal/field/sync.sh new file mode 100644 index 0000000000..1ba22a8b4c --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/sync.sh @@ -0,0 +1,19 @@ +#! /bin/bash +set -euo pipefail + +cd "$(git rev-parse --show-toplevel)" + +STD_PATH=src/crypto/ed25519/internal/edwards25519/field +LOCAL_PATH=curve25519/internal/field +LAST_SYNC_REF=$(cat $LOCAL_PATH/sync.checkpoint) + +git fetch https://go.googlesource.com/go master + +if git diff --quiet $LAST_SYNC_REF:$STD_PATH FETCH_HEAD:$STD_PATH; then + echo "No changes." +else + NEW_REF=$(git rev-parse FETCH_HEAD | tee $LOCAL_PATH/sync.checkpoint) + echo "Applying changes from $LAST_SYNC_REF to $NEW_REF..." + git diff $LAST_SYNC_REF:$STD_PATH FETCH_HEAD:$STD_PATH | \ + git apply -3 --directory=$LOCAL_PATH +fi diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go new file mode 100644 index 0000000000..a7828345fc --- /dev/null +++ b/vendor/golang.org/x/crypto/ed25519/ed25519.go @@ -0,0 +1,71 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ed25519 implements the Ed25519 signature algorithm. See +// https://ed25519.cr.yp.to/. +// +// These functions are also compatible with the “Ed25519” function defined in +// RFC 8032. However, unlike RFC 8032's formulation, this package's private key +// representation includes a public key suffix to make multiple signing +// operations with the same key more efficient. This package refers to the RFC +// 8032 private key as the “seed”. +// +// Beginning with Go 1.13, the functionality of this package was moved to the +// standard library as crypto/ed25519. This package only acts as a compatibility +// wrapper. +package ed25519 + +import ( + "crypto/ed25519" + "io" +) + +const ( + // PublicKeySize is the size, in bytes, of public keys as used in this package. + PublicKeySize = 32 + // PrivateKeySize is the size, in bytes, of private keys as used in this package. + PrivateKeySize = 64 + // SignatureSize is the size, in bytes, of signatures generated and verified by this package. + SignatureSize = 64 + // SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032. + SeedSize = 32 +) + +// PublicKey is the type of Ed25519 public keys. +// +// This type is an alias for crypto/ed25519's PublicKey type. +// See the crypto/ed25519 package for the methods on this type. +type PublicKey = ed25519.PublicKey + +// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer. +// +// This type is an alias for crypto/ed25519's PrivateKey type. +// See the crypto/ed25519 package for the methods on this type. +type PrivateKey = ed25519.PrivateKey + +// GenerateKey generates a public/private key pair using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { + return ed25519.GenerateKey(rand) +} + +// NewKeyFromSeed calculates a private key from a seed. It will panic if +// len(seed) is not SeedSize. This function is provided for interoperability +// with RFC 8032. RFC 8032's private keys correspond to seeds in this +// package. +func NewKeyFromSeed(seed []byte) PrivateKey { + return ed25519.NewKeyFromSeed(seed) +} + +// Sign signs the message with privateKey and returns a signature. It will +// panic if len(privateKey) is not PrivateKeySize. +func Sign(privateKey PrivateKey, message []byte) []byte { + return ed25519.Sign(privateKey, message) +} + +// Verify reports whether sig is a valid signature of message by publicKey. It +// will panic if len(publicKey) is not PublicKeySize. +func Verify(publicKey PublicKey, message, sig []byte) bool { + return ed25519.Verify(publicKey, message, sig) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go b/vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go new file mode 100644 index 0000000000..45b5c966b2 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go @@ -0,0 +1,40 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.13 +// +build !go1.13 + +package poly1305 + +// Generic fallbacks for the math/bits intrinsics, copied from +// src/math/bits/bits.go. They were added in Go 1.12, but Add64 and Sum64 had +// variable time fallbacks until Go 1.13. + +func bitsAdd64(x, y, carry uint64) (sum, carryOut uint64) { + sum = x + y + carry + carryOut = ((x & y) | ((x | y) &^ sum)) >> 63 + return +} + +func bitsSub64(x, y, borrow uint64) (diff, borrowOut uint64) { + diff = x - y - borrow + borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 63 + return +} + +func bitsMul64(x, y uint64) (hi, lo uint64) { + const mask32 = 1<<32 - 1 + x0 := x & mask32 + x1 := x >> 32 + y0 := y & mask32 + y1 := y >> 32 + w0 := x0 * y0 + t := x1*y0 + w0>>32 + w1 := t & mask32 + w2 := t >> 32 + w1 += x0 * y1 + hi = x1*y1 + w2 + w1>>32 + lo = x * y + return +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go b/vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go new file mode 100644 index 0000000000..ed52b3418a --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.13 +// +build go1.13 + +package poly1305 + +import "math/bits" + +func bitsAdd64(x, y, carry uint64) (sum, carryOut uint64) { + return bits.Add64(x, y, carry) +} + +func bitsSub64(x, y, borrow uint64) (diff, borrowOut uint64) { + return bits.Sub64(x, y, borrow) +} + +func bitsMul64(x, y uint64) (hi, lo uint64) { + return bits.Mul64(x, y) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go b/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go new file mode 100644 index 0000000000..f184b67d98 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go @@ -0,0 +1,10 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (!amd64 && !ppc64le && !s390x) || !gc || purego +// +build !amd64,!ppc64le,!s390x !gc purego + +package poly1305 + +type mac struct{ macGeneric } diff --git a/vendor/golang.org/x/crypto/internal/poly1305/poly1305.go b/vendor/golang.org/x/crypto/internal/poly1305/poly1305.go new file mode 100644 index 0000000000..4aaea810a2 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/poly1305.go @@ -0,0 +1,99 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package poly1305 implements Poly1305 one-time message authentication code as +// specified in https://cr.yp.to/mac/poly1305-20050329.pdf. +// +// Poly1305 is a fast, one-time authentication function. It is infeasible for an +// attacker to generate an authenticator for a message without the key. However, a +// key must only be used for a single message. Authenticating two different +// messages with the same key allows an attacker to forge authenticators for other +// messages with the same key. +// +// Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was +// used with a fixed key in order to generate one-time keys from an nonce. +// However, in this package AES isn't used and the one-time key is specified +// directly. +package poly1305 + +import "crypto/subtle" + +// TagSize is the size, in bytes, of a poly1305 authenticator. +const TagSize = 16 + +// Sum generates an authenticator for msg using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + h := New(key) + h.Write(m) + h.Sum(out[:0]) +} + +// Verify returns true if mac is a valid authenticator for m with the given key. +func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { + var tmp [16]byte + Sum(&tmp, m, key) + return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 +} + +// New returns a new MAC computing an authentication +// tag of all data written to it with the given key. +// This allows writing the message progressively instead +// of passing it as a single slice. Common users should use +// the Sum function instead. +// +// The key must be unique for each message, as authenticating +// two different messages with the same key allows an attacker +// to forge messages at will. +func New(key *[32]byte) *MAC { + m := &MAC{} + initialize(key, &m.macState) + return m +} + +// MAC is an io.Writer computing an authentication tag +// of the data written to it. +// +// MAC cannot be used like common hash.Hash implementations, +// because using a poly1305 key twice breaks its security. +// Therefore writing data to a running MAC after calling +// Sum or Verify causes it to panic. +type MAC struct { + mac // platform-dependent implementation + + finalized bool +} + +// Size returns the number of bytes Sum will return. +func (h *MAC) Size() int { return TagSize } + +// Write adds more data to the running message authentication code. +// It never returns an error. +// +// It must not be called after the first call of Sum or Verify. +func (h *MAC) Write(p []byte) (n int, err error) { + if h.finalized { + panic("poly1305: write to MAC after Sum or Verify") + } + return h.mac.Write(p) +} + +// Sum computes the authenticator of all data written to the +// message authentication code. +func (h *MAC) Sum(b []byte) []byte { + var mac [TagSize]byte + h.mac.Sum(&mac) + h.finalized = true + return append(b, mac[:]...) +} + +// Verify returns whether the authenticator of all data written to +// the message authentication code matches the expected value. +func (h *MAC) Verify(expected []byte) bool { + var mac [TagSize]byte + h.mac.Sum(&mac) + h.finalized = true + return subtle.ConstantTimeCompare(expected, mac[:]) == 1 +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go new file mode 100644 index 0000000000..6d522333f2 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go @@ -0,0 +1,48 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +package poly1305 + +//go:noescape +func update(state *macState, msg []byte) + +// mac is a wrapper for macGeneric that redirects calls that would have gone to +// updateGeneric to update. +// +// Its Write and Sum methods are otherwise identical to the macGeneric ones, but +// using function pointers would carry a major performance cost. +type mac struct{ macGeneric } + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + update(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + update(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +func (h *mac) Sum(out *[16]byte) { + state := h.macState + if h.offset > 0 { + update(&state, h.buffer[:h.offset]) + } + finalize(out, &state.h, &state.s) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s new file mode 100644 index 0000000000..1d74f0f881 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s @@ -0,0 +1,109 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +#include "textflag.h" + +#define POLY1305_ADD(msg, h0, h1, h2) \ + ADDQ 0(msg), h0; \ + ADCQ 8(msg), h1; \ + ADCQ $1, h2; \ + LEAQ 16(msg), msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ + MOVQ r0, AX; \ + MULQ h0; \ + MOVQ AX, t0; \ + MOVQ DX, t1; \ + MOVQ r0, AX; \ + MULQ h1; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ r0, t2; \ + IMULQ h2, t2; \ + ADDQ DX, t2; \ + \ + MOVQ r1, AX; \ + MULQ h0; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ DX, h0; \ + MOVQ r1, t3; \ + IMULQ h2, t3; \ + MOVQ r1, AX; \ + MULQ h1; \ + ADDQ AX, t2; \ + ADCQ DX, t3; \ + ADDQ h0, t2; \ + ADCQ $0, t3; \ + \ + MOVQ t0, h0; \ + MOVQ t1, h1; \ + MOVQ t2, h2; \ + ANDQ $3, h2; \ + MOVQ t2, t0; \ + ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ + ADDQ t0, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2; \ + SHRQ $2, t3, t2; \ + SHRQ $2, t3; \ + ADDQ t2, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2 + +// func update(state *[7]uint64, msg []byte) +TEXT ·update(SB), $0-32 + MOVQ state+0(FP), DI + MOVQ msg_base+8(FP), SI + MOVQ msg_len+16(FP), R15 + + MOVQ 0(DI), R8 // h0 + MOVQ 8(DI), R9 // h1 + MOVQ 16(DI), R10 // h2 + MOVQ 24(DI), R11 // r0 + MOVQ 32(DI), R12 // r1 + + CMPQ R15, $16 + JB bytes_between_0_and_15 + +loop: + POLY1305_ADD(SI, R8, R9, R10) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) + SUBQ $16, R15 + CMPQ R15, $16 + JAE loop + +bytes_between_0_and_15: + TESTQ R15, R15 + JZ done + MOVQ $1, BX + XORQ CX, CX + XORQ R13, R13 + ADDQ R15, SI + +flush_buffer: + SHLQ $8, BX, CX + SHLQ $8, BX + MOVB -1(SI), R13 + XORQ R13, BX + DECQ SI + DECQ R15 + JNZ flush_buffer + + ADDQ BX, R8 + ADCQ CX, R9 + ADCQ $0, R10 + MOVQ $16, R15 + JMP multiply + +done: + MOVQ R8, 0(DI) + MOVQ R9, 8(DI) + MOVQ R10, 16(DI) + RET diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go new file mode 100644 index 0000000000..c942a65904 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go @@ -0,0 +1,310 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file provides the generic implementation of Sum and MAC. Other files +// might provide optimized assembly implementations of some of this code. + +package poly1305 + +import "encoding/binary" + +// Poly1305 [RFC 7539] is a relatively simple algorithm: the authentication tag +// for a 64 bytes message is approximately +// +// s + m[0:16] * r⁴ + m[16:32] * r³ + m[32:48] * r² + m[48:64] * r mod 2¹³⁰ - 5 +// +// for some secret r and s. It can be computed sequentially like +// +// for len(msg) > 0: +// h += read(msg, 16) +// h *= r +// h %= 2¹³⁰ - 5 +// return h + s +// +// All the complexity is about doing performant constant-time math on numbers +// larger than any available numeric type. + +func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) { + h := newMACGeneric(key) + h.Write(msg) + h.Sum(out) +} + +func newMACGeneric(key *[32]byte) macGeneric { + m := macGeneric{} + initialize(key, &m.macState) + return m +} + +// macState holds numbers in saturated 64-bit little-endian limbs. That is, +// the value of [x0, x1, x2] is x[0] + x[1] * 2⁶⁴ + x[2] * 2¹²⁸. +type macState struct { + // h is the main accumulator. It is to be interpreted modulo 2¹³⁰ - 5, but + // can grow larger during and after rounds. It must, however, remain below + // 2 * (2¹³⁰ - 5). + h [3]uint64 + // r and s are the private key components. + r [2]uint64 + s [2]uint64 +} + +type macGeneric struct { + macState + + buffer [TagSize]byte + offset int +} + +// Write splits the incoming message into TagSize chunks, and passes them to +// update. It buffers incomplete chunks. +func (h *macGeneric) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + updateGeneric(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + updateGeneric(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +// Sum flushes the last incomplete chunk from the buffer, if any, and generates +// the MAC output. It does not modify its state, in order to allow for multiple +// calls to Sum, even if no Write is allowed after Sum. +func (h *macGeneric) Sum(out *[TagSize]byte) { + state := h.macState + if h.offset > 0 { + updateGeneric(&state, h.buffer[:h.offset]) + } + finalize(out, &state.h, &state.s) +} + +// [rMask0, rMask1] is the specified Poly1305 clamping mask in little-endian. It +// clears some bits of the secret coefficient to make it possible to implement +// multiplication more efficiently. +const ( + rMask0 = 0x0FFFFFFC0FFFFFFF + rMask1 = 0x0FFFFFFC0FFFFFFC +) + +// initialize loads the 256-bit key into the two 128-bit secret values r and s. +func initialize(key *[32]byte, m *macState) { + m.r[0] = binary.LittleEndian.Uint64(key[0:8]) & rMask0 + m.r[1] = binary.LittleEndian.Uint64(key[8:16]) & rMask1 + m.s[0] = binary.LittleEndian.Uint64(key[16:24]) + m.s[1] = binary.LittleEndian.Uint64(key[24:32]) +} + +// uint128 holds a 128-bit number as two 64-bit limbs, for use with the +// bits.Mul64 and bits.Add64 intrinsics. +type uint128 struct { + lo, hi uint64 +} + +func mul64(a, b uint64) uint128 { + hi, lo := bitsMul64(a, b) + return uint128{lo, hi} +} + +func add128(a, b uint128) uint128 { + lo, c := bitsAdd64(a.lo, b.lo, 0) + hi, c := bitsAdd64(a.hi, b.hi, c) + if c != 0 { + panic("poly1305: unexpected overflow") + } + return uint128{lo, hi} +} + +func shiftRightBy2(a uint128) uint128 { + a.lo = a.lo>>2 | (a.hi&3)<<62 + a.hi = a.hi >> 2 + return a +} + +// updateGeneric absorbs msg into the state.h accumulator. For each chunk m of +// 128 bits of message, it computes +// +// h₊ = (h + m) * r mod 2¹³⁰ - 5 +// +// If the msg length is not a multiple of TagSize, it assumes the last +// incomplete chunk is the final one. +func updateGeneric(state *macState, msg []byte) { + h0, h1, h2 := state.h[0], state.h[1], state.h[2] + r0, r1 := state.r[0], state.r[1] + + for len(msg) > 0 { + var c uint64 + + // For the first step, h + m, we use a chain of bits.Add64 intrinsics. + // The resulting value of h might exceed 2¹³⁰ - 5, but will be partially + // reduced at the end of the multiplication below. + // + // The spec requires us to set a bit just above the message size, not to + // hide leading zeroes. For full chunks, that's 1 << 128, so we can just + // add 1 to the most significant (2¹²⁸) limb, h2. + if len(msg) >= TagSize { + h0, c = bitsAdd64(h0, binary.LittleEndian.Uint64(msg[0:8]), 0) + h1, c = bitsAdd64(h1, binary.LittleEndian.Uint64(msg[8:16]), c) + h2 += c + 1 + + msg = msg[TagSize:] + } else { + var buf [TagSize]byte + copy(buf[:], msg) + buf[len(msg)] = 1 + + h0, c = bitsAdd64(h0, binary.LittleEndian.Uint64(buf[0:8]), 0) + h1, c = bitsAdd64(h1, binary.LittleEndian.Uint64(buf[8:16]), c) + h2 += c + + msg = nil + } + + // Multiplication of big number limbs is similar to elementary school + // columnar multiplication. Instead of digits, there are 64-bit limbs. + // + // We are multiplying a 3 limbs number, h, by a 2 limbs number, r. + // + // h2 h1 h0 x + // r1 r0 = + // ---------------- + // h2r0 h1r0 h0r0 <-- individual 128-bit products + // + h2r1 h1r1 h0r1 + // ------------------------ + // m3 m2 m1 m0 <-- result in 128-bit overlapping limbs + // ------------------------ + // m3.hi m2.hi m1.hi m0.hi <-- carry propagation + // + m3.lo m2.lo m1.lo m0.lo + // ------------------------------- + // t4 t3 t2 t1 t0 <-- final result in 64-bit limbs + // + // The main difference from pen-and-paper multiplication is that we do + // carry propagation in a separate step, as if we wrote two digit sums + // at first (the 128-bit limbs), and then carried the tens all at once. + + h0r0 := mul64(h0, r0) + h1r0 := mul64(h1, r0) + h2r0 := mul64(h2, r0) + h0r1 := mul64(h0, r1) + h1r1 := mul64(h1, r1) + h2r1 := mul64(h2, r1) + + // Since h2 is known to be at most 7 (5 + 1 + 1), and r0 and r1 have their + // top 4 bits cleared by rMask{0,1}, we know that their product is not going + // to overflow 64 bits, so we can ignore the high part of the products. + // + // This also means that the product doesn't have a fifth limb (t4). + if h2r0.hi != 0 { + panic("poly1305: unexpected overflow") + } + if h2r1.hi != 0 { + panic("poly1305: unexpected overflow") + } + + m0 := h0r0 + m1 := add128(h1r0, h0r1) // These two additions don't overflow thanks again + m2 := add128(h2r0, h1r1) // to the 4 masked bits at the top of r0 and r1. + m3 := h2r1 + + t0 := m0.lo + t1, c := bitsAdd64(m1.lo, m0.hi, 0) + t2, c := bitsAdd64(m2.lo, m1.hi, c) + t3, _ := bitsAdd64(m3.lo, m2.hi, c) + + // Now we have the result as 4 64-bit limbs, and we need to reduce it + // modulo 2¹³⁰ - 5. The special shape of this Crandall prime lets us do + // a cheap partial reduction according to the reduction identity + // + // c * 2¹³⁰ + n = c * 5 + n mod 2¹³⁰ - 5 + // + // because 2¹³⁰ = 5 mod 2¹³⁰ - 5. Partial reduction since the result is + // likely to be larger than 2¹³⁰ - 5, but still small enough to fit the + // assumptions we make about h in the rest of the code. + // + // See also https://speakerdeck.com/gtank/engineering-prime-numbers?slide=23 + + // We split the final result at the 2¹³⁰ mark into h and cc, the carry. + // Note that the carry bits are effectively shifted left by 2, in other + // words, cc = c * 4 for the c in the reduction identity. + h0, h1, h2 = t0, t1, t2&maskLow2Bits + cc := uint128{t2 & maskNotLow2Bits, t3} + + // To add c * 5 to h, we first add cc = c * 4, and then add (cc >> 2) = c. + + h0, c = bitsAdd64(h0, cc.lo, 0) + h1, c = bitsAdd64(h1, cc.hi, c) + h2 += c + + cc = shiftRightBy2(cc) + + h0, c = bitsAdd64(h0, cc.lo, 0) + h1, c = bitsAdd64(h1, cc.hi, c) + h2 += c + + // h2 is at most 3 + 1 + 1 = 5, making the whole of h at most + // + // 5 * 2¹²⁸ + (2¹²⁸ - 1) = 6 * 2¹²⁸ - 1 + } + + state.h[0], state.h[1], state.h[2] = h0, h1, h2 +} + +const ( + maskLow2Bits uint64 = 0x0000000000000003 + maskNotLow2Bits uint64 = ^maskLow2Bits +) + +// select64 returns x if v == 1 and y if v == 0, in constant time. +func select64(v, x, y uint64) uint64 { return ^(v-1)&x | (v-1)&y } + +// [p0, p1, p2] is 2¹³⁰ - 5 in little endian order. +const ( + p0 = 0xFFFFFFFFFFFFFFFB + p1 = 0xFFFFFFFFFFFFFFFF + p2 = 0x0000000000000003 +) + +// finalize completes the modular reduction of h and computes +// +// out = h + s mod 2¹²⁸ +// +func finalize(out *[TagSize]byte, h *[3]uint64, s *[2]uint64) { + h0, h1, h2 := h[0], h[1], h[2] + + // After the partial reduction in updateGeneric, h might be more than + // 2¹³⁰ - 5, but will be less than 2 * (2¹³⁰ - 5). To complete the reduction + // in constant time, we compute t = h - (2¹³⁰ - 5), and select h as the + // result if the subtraction underflows, and t otherwise. + + hMinusP0, b := bitsSub64(h0, p0, 0) + hMinusP1, b := bitsSub64(h1, p1, b) + _, b = bitsSub64(h2, p2, b) + + // h = h if h < p else h - p + h0 = select64(b, h0, hMinusP0) + h1 = select64(b, h1, hMinusP1) + + // Finally, we compute the last Poly1305 step + // + // tag = h + s mod 2¹²⁸ + // + // by just doing a wide addition with the 128 low bits of h and discarding + // the overflow. + h0, c := bitsAdd64(h0, s[0], 0) + h1, _ = bitsAdd64(h1, s[1], c) + + binary.LittleEndian.PutUint64(out[0:8], h0) + binary.LittleEndian.PutUint64(out[8:16], h1) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go new file mode 100644 index 0000000000..4a069941a6 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go @@ -0,0 +1,48 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +package poly1305 + +//go:noescape +func update(state *macState, msg []byte) + +// mac is a wrapper for macGeneric that redirects calls that would have gone to +// updateGeneric to update. +// +// Its Write and Sum methods are otherwise identical to the macGeneric ones, but +// using function pointers would carry a major performance cost. +type mac struct{ macGeneric } + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + update(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + update(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +func (h *mac) Sum(out *[16]byte) { + state := h.macState + if h.offset > 0 { + update(&state, h.buffer[:h.offset]) + } + finalize(out, &state.h, &state.s) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s new file mode 100644 index 0000000000..58422aad23 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s @@ -0,0 +1,182 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +#include "textflag.h" + +// This was ported from the amd64 implementation. + +#define POLY1305_ADD(msg, h0, h1, h2, t0, t1, t2) \ + MOVD (msg), t0; \ + MOVD 8(msg), t1; \ + MOVD $1, t2; \ + ADDC t0, h0, h0; \ + ADDE t1, h1, h1; \ + ADDE t2, h2; \ + ADD $16, msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3, t4, t5) \ + MULLD r0, h0, t0; \ + MULLD r0, h1, t4; \ + MULHDU r0, h0, t1; \ + MULHDU r0, h1, t5; \ + ADDC t4, t1, t1; \ + MULLD r0, h2, t2; \ + ADDZE t5; \ + MULHDU r1, h0, t4; \ + MULLD r1, h0, h0; \ + ADD t5, t2, t2; \ + ADDC h0, t1, t1; \ + MULLD h2, r1, t3; \ + ADDZE t4, h0; \ + MULHDU r1, h1, t5; \ + MULLD r1, h1, t4; \ + ADDC t4, t2, t2; \ + ADDE t5, t3, t3; \ + ADDC h0, t2, t2; \ + MOVD $-4, t4; \ + MOVD t0, h0; \ + MOVD t1, h1; \ + ADDZE t3; \ + ANDCC $3, t2, h2; \ + AND t2, t4, t0; \ + ADDC t0, h0, h0; \ + ADDE t3, h1, h1; \ + SLD $62, t3, t4; \ + SRD $2, t2; \ + ADDZE h2; \ + OR t4, t2, t2; \ + SRD $2, t3; \ + ADDC t2, h0, h0; \ + ADDE t3, h1, h1; \ + ADDZE h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func update(state *[7]uint64, msg []byte) +TEXT ·update(SB), $0-32 + MOVD state+0(FP), R3 + MOVD msg_base+8(FP), R4 + MOVD msg_len+16(FP), R5 + + MOVD 0(R3), R8 // h0 + MOVD 8(R3), R9 // h1 + MOVD 16(R3), R10 // h2 + MOVD 24(R3), R11 // r0 + MOVD 32(R3), R12 // r1 + + CMP R5, $16 + BLT bytes_between_0_and_15 + +loop: + POLY1305_ADD(R4, R8, R9, R10, R20, R21, R22) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, R16, R17, R18, R14, R20, R21) + ADD $-16, R5 + CMP R5, $16 + BGE loop + +bytes_between_0_and_15: + CMP R5, $0 + BEQ done + MOVD $0, R16 // h0 + MOVD $0, R17 // h1 + +flush_buffer: + CMP R5, $8 + BLE just1 + + MOVD $8, R21 + SUB R21, R5, R21 + + // Greater than 8 -- load the rightmost remaining bytes in msg + // and put into R17 (h1) + MOVD (R4)(R21), R17 + MOVD $16, R22 + + // Find the offset to those bytes + SUB R5, R22, R22 + SLD $3, R22 + + // Shift to get only the bytes in msg + SRD R22, R17, R17 + + // Put 1 at high end + MOVD $1, R23 + SLD $3, R21 + SLD R21, R23, R23 + OR R23, R17, R17 + + // Remainder is 8 + MOVD $8, R5 + +just1: + CMP R5, $8 + BLT less8 + + // Exactly 8 + MOVD (R4), R16 + + CMP R17, $0 + + // Check if we've already set R17; if not + // set 1 to indicate end of msg. + BNE carry + MOVD $1, R17 + BR carry + +less8: + MOVD $0, R16 // h0 + MOVD $0, R22 // shift count + CMP R5, $4 + BLT less4 + MOVWZ (R4), R16 + ADD $4, R4 + ADD $-4, R5 + MOVD $32, R22 + +less4: + CMP R5, $2 + BLT less2 + MOVHZ (R4), R21 + SLD R22, R21, R21 + OR R16, R21, R16 + ADD $16, R22 + ADD $-2, R5 + ADD $2, R4 + +less2: + CMP R5, $0 + BEQ insert1 + MOVBZ (R4), R21 + SLD R22, R21, R21 + OR R16, R21, R16 + ADD $8, R22 + +insert1: + // Insert 1 at end of msg + MOVD $1, R21 + SLD R22, R21, R21 + OR R16, R21, R16 + +carry: + // Add new values to h0, h1, h2 + ADDC R16, R8 + ADDE R17, R9 + ADDZE R10, R10 + MOVD $16, R5 + ADD R5, R4 + BR multiply + +done: + // Save h0, h1, h2 in state + MOVD R8, 0(R3) + MOVD R9, 8(R3) + MOVD R10, 16(R3) + RET diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go new file mode 100644 index 0000000000..62cc9f8470 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go @@ -0,0 +1,76 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +package poly1305 + +import ( + "golang.org/x/sys/cpu" +) + +// updateVX is an assembly implementation of Poly1305 that uses vector +// instructions. It must only be called if the vector facility (vx) is +// available. +//go:noescape +func updateVX(state *macState, msg []byte) + +// mac is a replacement for macGeneric that uses a larger buffer and redirects +// calls that would have gone to updateGeneric to updateVX if the vector +// facility is installed. +// +// A larger buffer is required for good performance because the vector +// implementation has a higher fixed cost per call than the generic +// implementation. +type mac struct { + macState + + buffer [16 * TagSize]byte // size must be a multiple of block size (16) + offset int +} + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < len(h.buffer) { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + if cpu.S390X.HasVX { + updateVX(&h.macState, h.buffer[:]) + } else { + updateGeneric(&h.macState, h.buffer[:]) + } + } + + tail := len(p) % len(h.buffer) // number of bytes to copy into buffer + body := len(p) - tail // number of bytes to process now + if body > 0 { + if cpu.S390X.HasVX { + updateVX(&h.macState, p[:body]) + } else { + updateGeneric(&h.macState, p[:body]) + } + } + h.offset = copy(h.buffer[:], p[body:]) // copy tail bytes - can be 0 + return nn, nil +} + +func (h *mac) Sum(out *[TagSize]byte) { + state := h.macState + remainder := h.buffer[:h.offset] + + // Use the generic implementation if we have 2 or fewer blocks left + // to sum. The vector implementation has a higher startup time. + if cpu.S390X.HasVX && len(remainder) > 2*TagSize { + updateVX(&state, remainder) + } else if len(remainder) > 0 { + updateGeneric(&state, remainder) + } + finalize(out, &state.h, &state.s) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s new file mode 100644 index 0000000000..aa9e0494c9 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s @@ -0,0 +1,504 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc && !purego +// +build gc,!purego + +#include "textflag.h" + +// This implementation of Poly1305 uses the vector facility (vx) +// to process up to 2 blocks (32 bytes) per iteration using an +// algorithm based on the one described in: +// +// NEON crypto, Daniel J. Bernstein & Peter Schwabe +// https://cryptojedi.org/papers/neoncrypto-20120320.pdf +// +// This algorithm uses 5 26-bit limbs to represent a 130-bit +// value. These limbs are, for the most part, zero extended and +// placed into 64-bit vector register elements. Each vector +// register is 128-bits wide and so holds 2 of these elements. +// Using 26-bit limbs allows us plenty of headroom to accommodate +// accumulations before and after multiplication without +// overflowing either 32-bits (before multiplication) or 64-bits +// (after multiplication). +// +// In order to parallelise the operations required to calculate +// the sum we use two separate accumulators and then sum those +// in an extra final step. For compatibility with the generic +// implementation we perform this summation at the end of every +// updateVX call. +// +// To use two accumulators we must multiply the message blocks +// by r² rather than r. Only the final message block should be +// multiplied by r. +// +// Example: +// +// We want to calculate the sum (h) for a 64 byte message (m): +// +// h = m[0:16]r⁴ + m[16:32]r³ + m[32:48]r² + m[48:64]r +// +// To do this we split the calculation into the even indices +// and odd indices of the message. These form our SIMD 'lanes': +// +// h = m[ 0:16]r⁴ + m[32:48]r² + <- lane 0 +// m[16:32]r³ + m[48:64]r <- lane 1 +// +// To calculate this iteratively we refactor so that both lanes +// are written in terms of r² and r: +// +// h = (m[ 0:16]r² + m[32:48])r² + <- lane 0 +// (m[16:32]r² + m[48:64])r <- lane 1 +// ^ ^ +// | coefficients for second iteration +// coefficients for first iteration +// +// So in this case we would have two iterations. In the first +// both lanes are multiplied by r². In the second only the +// first lane is multiplied by r² and the second lane is +// instead multiplied by r. This gives use the odd and even +// powers of r that we need from the original equation. +// +// Notation: +// +// h - accumulator +// r - key +// m - message +// +// [a, b] - SIMD register holding two 64-bit values +// [a, b, c, d] - SIMD register holding four 32-bit values +// xᵢ[n] - limb n of variable x with bit width i +// +// Limbs are expressed in little endian order, so for 26-bit +// limbs x₂₆[4] will be the most significant limb and x₂₆[0] +// will be the least significant limb. + +// masking constants +#define MOD24 V0 // [0x0000000000ffffff, 0x0000000000ffffff] - mask low 24-bits +#define MOD26 V1 // [0x0000000003ffffff, 0x0000000003ffffff] - mask low 26-bits + +// expansion constants (see EXPAND macro) +#define EX0 V2 +#define EX1 V3 +#define EX2 V4 + +// key (r², r or 1 depending on context) +#define R_0 V5 +#define R_1 V6 +#define R_2 V7 +#define R_3 V8 +#define R_4 V9 + +// precalculated coefficients (5r², 5r or 0 depending on context) +#define R5_1 V10 +#define R5_2 V11 +#define R5_3 V12 +#define R5_4 V13 + +// message block (m) +#define M_0 V14 +#define M_1 V15 +#define M_2 V16 +#define M_3 V17 +#define M_4 V18 + +// accumulator (h) +#define H_0 V19 +#define H_1 V20 +#define H_2 V21 +#define H_3 V22 +#define H_4 V23 + +// temporary registers (for short-lived values) +#define T_0 V24 +#define T_1 V25 +#define T_2 V26 +#define T_3 V27 +#define T_4 V28 + +GLOBL ·constants<>(SB), RODATA, $0x30 +// EX0 +DATA ·constants<>+0x00(SB)/8, $0x0006050403020100 +DATA ·constants<>+0x08(SB)/8, $0x1016151413121110 +// EX1 +DATA ·constants<>+0x10(SB)/8, $0x060c0b0a09080706 +DATA ·constants<>+0x18(SB)/8, $0x161c1b1a19181716 +// EX2 +DATA ·constants<>+0x20(SB)/8, $0x0d0d0d0d0d0f0e0d +DATA ·constants<>+0x28(SB)/8, $0x1d1d1d1d1d1f1e1d + +// MULTIPLY multiplies each lane of f and g, partially reduced +// modulo 2¹³⁰ - 5. The result, h, consists of partial products +// in each lane that need to be reduced further to produce the +// final result. +// +// h₁₃₀ = (f₁₃₀g₁₃₀) % 2¹³⁰ + (5f₁₃₀g₁₃₀) / 2¹³⁰ +// +// Note that the multiplication by 5 of the high bits is +// achieved by precalculating the multiplication of four of the +// g coefficients by 5. These are g51-g54. +#define MULTIPLY(f0, f1, f2, f3, f4, g0, g1, g2, g3, g4, g51, g52, g53, g54, h0, h1, h2, h3, h4) \ + VMLOF f0, g0, h0 \ + VMLOF f0, g3, h3 \ + VMLOF f0, g1, h1 \ + VMLOF f0, g4, h4 \ + VMLOF f0, g2, h2 \ + VMLOF f1, g54, T_0 \ + VMLOF f1, g2, T_3 \ + VMLOF f1, g0, T_1 \ + VMLOF f1, g3, T_4 \ + VMLOF f1, g1, T_2 \ + VMALOF f2, g53, h0, h0 \ + VMALOF f2, g1, h3, h3 \ + VMALOF f2, g54, h1, h1 \ + VMALOF f2, g2, h4, h4 \ + VMALOF f2, g0, h2, h2 \ + VMALOF f3, g52, T_0, T_0 \ + VMALOF f3, g0, T_3, T_3 \ + VMALOF f3, g53, T_1, T_1 \ + VMALOF f3, g1, T_4, T_4 \ + VMALOF f3, g54, T_2, T_2 \ + VMALOF f4, g51, h0, h0 \ + VMALOF f4, g54, h3, h3 \ + VMALOF f4, g52, h1, h1 \ + VMALOF f4, g0, h4, h4 \ + VMALOF f4, g53, h2, h2 \ + VAG T_0, h0, h0 \ + VAG T_3, h3, h3 \ + VAG T_1, h1, h1 \ + VAG T_4, h4, h4 \ + VAG T_2, h2, h2 + +// REDUCE performs the following carry operations in four +// stages, as specified in Bernstein & Schwabe: +// +// 1: h₂₆[0]->h₂₆[1] h₂₆[3]->h₂₆[4] +// 2: h₂₆[1]->h₂₆[2] h₂₆[4]->h₂₆[0] +// 3: h₂₆[0]->h₂₆[1] h₂₆[2]->h₂₆[3] +// 4: h₂₆[3]->h₂₆[4] +// +// The result is that all of the limbs are limited to 26-bits +// except for h₂₆[1] and h₂₆[4] which are limited to 27-bits. +// +// Note that although each limb is aligned at 26-bit intervals +// they may contain values that exceed 2²⁶ - 1, hence the need +// to carry the excess bits in each limb. +#define REDUCE(h0, h1, h2, h3, h4) \ + VESRLG $26, h0, T_0 \ + VESRLG $26, h3, T_1 \ + VN MOD26, h0, h0 \ + VN MOD26, h3, h3 \ + VAG T_0, h1, h1 \ + VAG T_1, h4, h4 \ + VESRLG $26, h1, T_2 \ + VESRLG $26, h4, T_3 \ + VN MOD26, h1, h1 \ + VN MOD26, h4, h4 \ + VESLG $2, T_3, T_4 \ + VAG T_3, T_4, T_4 \ + VAG T_2, h2, h2 \ + VAG T_4, h0, h0 \ + VESRLG $26, h2, T_0 \ + VESRLG $26, h0, T_1 \ + VN MOD26, h2, h2 \ + VN MOD26, h0, h0 \ + VAG T_0, h3, h3 \ + VAG T_1, h1, h1 \ + VESRLG $26, h3, T_2 \ + VN MOD26, h3, h3 \ + VAG T_2, h4, h4 + +// EXPAND splits the 128-bit little-endian values in0 and in1 +// into 26-bit big-endian limbs and places the results into +// the first and second lane of d₂₆[0:4] respectively. +// +// The EX0, EX1 and EX2 constants are arrays of byte indices +// for permutation. The permutation both reverses the bytes +// in the input and ensures the bytes are copied into the +// destination limb ready to be shifted into their final +// position. +#define EXPAND(in0, in1, d0, d1, d2, d3, d4) \ + VPERM in0, in1, EX0, d0 \ + VPERM in0, in1, EX1, d2 \ + VPERM in0, in1, EX2, d4 \ + VESRLG $26, d0, d1 \ + VESRLG $30, d2, d3 \ + VESRLG $4, d2, d2 \ + VN MOD26, d0, d0 \ // [in0₂₆[0], in1₂₆[0]] + VN MOD26, d3, d3 \ // [in0₂₆[3], in1₂₆[3]] + VN MOD26, d1, d1 \ // [in0₂₆[1], in1₂₆[1]] + VN MOD24, d4, d4 \ // [in0₂₆[4], in1₂₆[4]] + VN MOD26, d2, d2 // [in0₂₆[2], in1₂₆[2]] + +// func updateVX(state *macState, msg []byte) +TEXT ·updateVX(SB), NOSPLIT, $0 + MOVD state+0(FP), R1 + LMG msg+8(FP), R2, R3 // R2=msg_base, R3=msg_len + + // load EX0, EX1 and EX2 + MOVD $·constants<>(SB), R5 + VLM (R5), EX0, EX2 + + // generate masks + VGMG $(64-24), $63, MOD24 // [0x00ffffff, 0x00ffffff] + VGMG $(64-26), $63, MOD26 // [0x03ffffff, 0x03ffffff] + + // load h (accumulator) and r (key) from state + VZERO T_1 // [0, 0] + VL 0(R1), T_0 // [h₆₄[0], h₆₄[1]] + VLEG $0, 16(R1), T_1 // [h₆₄[2], 0] + VL 24(R1), T_2 // [r₆₄[0], r₆₄[1]] + VPDI $0, T_0, T_2, T_3 // [h₆₄[0], r₆₄[0]] + VPDI $5, T_0, T_2, T_4 // [h₆₄[1], r₆₄[1]] + + // unpack h and r into 26-bit limbs + // note: h₆₄[2] may have the low 3 bits set, so h₂₆[4] is a 27-bit value + VN MOD26, T_3, H_0 // [h₂₆[0], r₂₆[0]] + VZERO H_1 // [0, 0] + VZERO H_3 // [0, 0] + VGMG $(64-12-14), $(63-12), T_0 // [0x03fff000, 0x03fff000] - 26-bit mask with low 12 bits masked out + VESLG $24, T_1, T_1 // [h₆₄[2]<<24, 0] + VERIMG $-26&63, T_3, MOD26, H_1 // [h₂₆[1], r₂₆[1]] + VESRLG $+52&63, T_3, H_2 // [h₂₆[2], r₂₆[2]] - low 12 bits only + VERIMG $-14&63, T_4, MOD26, H_3 // [h₂₆[1], r₂₆[1]] + VESRLG $40, T_4, H_4 // [h₂₆[4], r₂₆[4]] - low 24 bits only + VERIMG $+12&63, T_4, T_0, H_2 // [h₂₆[2], r₂₆[2]] - complete + VO T_1, H_4, H_4 // [h₂₆[4], r₂₆[4]] - complete + + // replicate r across all 4 vector elements + VREPF $3, H_0, R_0 // [r₂₆[0], r₂₆[0], r₂₆[0], r₂₆[0]] + VREPF $3, H_1, R_1 // [r₂₆[1], r₂₆[1], r₂₆[1], r₂₆[1]] + VREPF $3, H_2, R_2 // [r₂₆[2], r₂₆[2], r₂₆[2], r₂₆[2]] + VREPF $3, H_3, R_3 // [r₂₆[3], r₂₆[3], r₂₆[3], r₂₆[3]] + VREPF $3, H_4, R_4 // [r₂₆[4], r₂₆[4], r₂₆[4], r₂₆[4]] + + // zero out lane 1 of h + VLEIG $1, $0, H_0 // [h₂₆[0], 0] + VLEIG $1, $0, H_1 // [h₂₆[1], 0] + VLEIG $1, $0, H_2 // [h₂₆[2], 0] + VLEIG $1, $0, H_3 // [h₂₆[3], 0] + VLEIG $1, $0, H_4 // [h₂₆[4], 0] + + // calculate 5r (ignore least significant limb) + VREPIF $5, T_0 + VMLF T_0, R_1, R5_1 // [5r₂₆[1], 5r₂₆[1], 5r₂₆[1], 5r₂₆[1]] + VMLF T_0, R_2, R5_2 // [5r₂₆[2], 5r₂₆[2], 5r₂₆[2], 5r₂₆[2]] + VMLF T_0, R_3, R5_3 // [5r₂₆[3], 5r₂₆[3], 5r₂₆[3], 5r₂₆[3]] + VMLF T_0, R_4, R5_4 // [5r₂₆[4], 5r₂₆[4], 5r₂₆[4], 5r₂₆[4]] + + // skip r² calculation if we are only calculating one block + CMPBLE R3, $16, skip + + // calculate r² + MULTIPLY(R_0, R_1, R_2, R_3, R_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, M_0, M_1, M_2, M_3, M_4) + REDUCE(M_0, M_1, M_2, M_3, M_4) + VGBM $0x0f0f, T_0 + VERIMG $0, M_0, T_0, R_0 // [r₂₆[0], r²₂₆[0], r₂₆[0], r²₂₆[0]] + VERIMG $0, M_1, T_0, R_1 // [r₂₆[1], r²₂₆[1], r₂₆[1], r²₂₆[1]] + VERIMG $0, M_2, T_0, R_2 // [r₂₆[2], r²₂₆[2], r₂₆[2], r²₂₆[2]] + VERIMG $0, M_3, T_0, R_3 // [r₂₆[3], r²₂₆[3], r₂₆[3], r²₂₆[3]] + VERIMG $0, M_4, T_0, R_4 // [r₂₆[4], r²₂₆[4], r₂₆[4], r²₂₆[4]] + + // calculate 5r² (ignore least significant limb) + VREPIF $5, T_0 + VMLF T_0, R_1, R5_1 // [5r₂₆[1], 5r²₂₆[1], 5r₂₆[1], 5r²₂₆[1]] + VMLF T_0, R_2, R5_2 // [5r₂₆[2], 5r²₂₆[2], 5r₂₆[2], 5r²₂₆[2]] + VMLF T_0, R_3, R5_3 // [5r₂₆[3], 5r²₂₆[3], 5r₂₆[3], 5r²₂₆[3]] + VMLF T_0, R_4, R5_4 // [5r₂₆[4], 5r²₂₆[4], 5r₂₆[4], 5r²₂₆[4]] + +loop: + CMPBLE R3, $32, b2 // 2 or fewer blocks remaining, need to change key coefficients + + // load next 2 blocks from message + VLM (R2), T_0, T_1 + + // update message slice + SUB $32, R3 + MOVD $32(R2), R2 + + // unpack message blocks into 26-bit big-endian limbs + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // add 2¹²⁸ to each message block value + VLEIB $4, $1, M_4 + VLEIB $12, $1, M_4 + +multiply: + // accumulate the incoming message + VAG H_0, M_0, M_0 + VAG H_3, M_3, M_3 + VAG H_1, M_1, M_1 + VAG H_4, M_4, M_4 + VAG H_2, M_2, M_2 + + // multiply the accumulator by the key coefficient + MULTIPLY(M_0, M_1, M_2, M_3, M_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, H_0, H_1, H_2, H_3, H_4) + + // carry and partially reduce the partial products + REDUCE(H_0, H_1, H_2, H_3, H_4) + + CMPBNE R3, $0, loop + +finish: + // sum lane 0 and lane 1 and put the result in lane 1 + VZERO T_0 + VSUMQG H_0, T_0, H_0 + VSUMQG H_3, T_0, H_3 + VSUMQG H_1, T_0, H_1 + VSUMQG H_4, T_0, H_4 + VSUMQG H_2, T_0, H_2 + + // reduce again after summation + // TODO(mundaym): there might be a more efficient way to do this + // now that we only have 1 active lane. For example, we could + // simultaneously pack the values as we reduce them. + REDUCE(H_0, H_1, H_2, H_3, H_4) + + // carry h[1] through to h[4] so that only h[4] can exceed 2²⁶ - 1 + // TODO(mundaym): in testing this final carry was unnecessary. + // Needs a proof before it can be removed though. + VESRLG $26, H_1, T_1 + VN MOD26, H_1, H_1 + VAQ T_1, H_2, H_2 + VESRLG $26, H_2, T_2 + VN MOD26, H_2, H_2 + VAQ T_2, H_3, H_3 + VESRLG $26, H_3, T_3 + VN MOD26, H_3, H_3 + VAQ T_3, H_4, H_4 + + // h is now < 2(2¹³⁰ - 5) + // Pack each lane in h₂₆[0:4] into h₁₂₈[0:1]. + VESLG $26, H_1, H_1 + VESLG $26, H_3, H_3 + VO H_0, H_1, H_0 + VO H_2, H_3, H_2 + VESLG $4, H_2, H_2 + VLEIB $7, $48, H_1 + VSLB H_1, H_2, H_2 + VO H_0, H_2, H_0 + VLEIB $7, $104, H_1 + VSLB H_1, H_4, H_3 + VO H_3, H_0, H_0 + VLEIB $7, $24, H_1 + VSRLB H_1, H_4, H_1 + + // update state + VSTEG $1, H_0, 0(R1) + VSTEG $0, H_0, 8(R1) + VSTEG $1, H_1, 16(R1) + RET + +b2: // 2 or fewer blocks remaining + CMPBLE R3, $16, b1 + + // Load the 2 remaining blocks (17-32 bytes remaining). + MOVD $-17(R3), R0 // index of final byte to load modulo 16 + VL (R2), T_0 // load full 16 byte block + VLL R0, 16(R2), T_1 // load final (possibly partial) block and pad with zeros to 16 bytes + + // The Poly1305 algorithm requires that a 1 bit be appended to + // each message block. If the final block is less than 16 bytes + // long then it is easiest to insert the 1 before the message + // block is split into 26-bit limbs. If, on the other hand, the + // final message block is 16 bytes long then we append the 1 bit + // after expansion as normal. + MOVBZ $1, R0 + MOVD $-16(R3), R3 // index of byte in last block to insert 1 at (could be 16) + CMPBEQ R3, $16, 2(PC) // skip the insertion if the final block is 16 bytes long + VLVGB R3, R0, T_1 // insert 1 into the byte at index R3 + + // Split both blocks into 26-bit limbs in the appropriate lanes. + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // Append a 1 byte to the end of the second to last block. + VLEIB $4, $1, M_4 + + // Append a 1 byte to the end of the last block only if it is a + // full 16 byte block. + CMPBNE R3, $16, 2(PC) + VLEIB $12, $1, M_4 + + // Finally, set up the coefficients for the final multiplication. + // We have previously saved r and 5r in the 32-bit even indexes + // of the R_[0-4] and R5_[1-4] coefficient registers. + // + // We want lane 0 to be multiplied by r² so that can be kept the + // same. We want lane 1 to be multiplied by r so we need to move + // the saved r value into the 32-bit odd index in lane 1 by + // rotating the 64-bit lane by 32. + VGBM $0x00ff, T_0 // [0, 0xffffffffffffffff] - mask lane 1 only + VERIMG $32, R_0, T_0, R_0 // [_, r²₂₆[0], _, r₂₆[0]] + VERIMG $32, R_1, T_0, R_1 // [_, r²₂₆[1], _, r₂₆[1]] + VERIMG $32, R_2, T_0, R_2 // [_, r²₂₆[2], _, r₂₆[2]] + VERIMG $32, R_3, T_0, R_3 // [_, r²₂₆[3], _, r₂₆[3]] + VERIMG $32, R_4, T_0, R_4 // [_, r²₂₆[4], _, r₂₆[4]] + VERIMG $32, R5_1, T_0, R5_1 // [_, 5r²₂₆[1], _, 5r₂₆[1]] + VERIMG $32, R5_2, T_0, R5_2 // [_, 5r²₂₆[2], _, 5r₂₆[2]] + VERIMG $32, R5_3, T_0, R5_3 // [_, 5r²₂₆[3], _, 5r₂₆[3]] + VERIMG $32, R5_4, T_0, R5_4 // [_, 5r²₂₆[4], _, 5r₂₆[4]] + + MOVD $0, R3 + BR multiply + +skip: + CMPBEQ R3, $0, finish + +b1: // 1 block remaining + + // Load the final block (1-16 bytes). This will be placed into + // lane 0. + MOVD $-1(R3), R0 + VLL R0, (R2), T_0 // pad to 16 bytes with zeros + + // The Poly1305 algorithm requires that a 1 bit be appended to + // each message block. If the final block is less than 16 bytes + // long then it is easiest to insert the 1 before the message + // block is split into 26-bit limbs. If, on the other hand, the + // final message block is 16 bytes long then we append the 1 bit + // after expansion as normal. + MOVBZ $1, R0 + CMPBEQ R3, $16, 2(PC) + VLVGB R3, R0, T_0 + + // Set the message block in lane 1 to the value 0 so that it + // can be accumulated without affecting the final result. + VZERO T_1 + + // Split the final message block into 26-bit limbs in lane 0. + // Lane 1 will be contain 0. + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // Append a 1 byte to the end of the last block only if it is a + // full 16 byte block. + CMPBNE R3, $16, 2(PC) + VLEIB $4, $1, M_4 + + // We have previously saved r and 5r in the 32-bit even indexes + // of the R_[0-4] and R5_[1-4] coefficient registers. + // + // We want lane 0 to be multiplied by r so we need to move the + // saved r value into the 32-bit odd index in lane 0. We want + // lane 1 to be set to the value 1. This makes multiplication + // a no-op. We do this by setting lane 1 in every register to 0 + // and then just setting the 32-bit index 3 in R_0 to 1. + VZERO T_0 + MOVD $0, R0 + MOVD $0x10111213, R12 + VLVGP R12, R0, T_1 // [_, 0x10111213, _, 0x00000000] + VPERM T_0, R_0, T_1, R_0 // [_, r₂₆[0], _, 0] + VPERM T_0, R_1, T_1, R_1 // [_, r₂₆[1], _, 0] + VPERM T_0, R_2, T_1, R_2 // [_, r₂₆[2], _, 0] + VPERM T_0, R_3, T_1, R_3 // [_, r₂₆[3], _, 0] + VPERM T_0, R_4, T_1, R_4 // [_, r₂₆[4], _, 0] + VPERM T_0, R5_1, T_1, R5_1 // [_, 5r₂₆[1], _, 0] + VPERM T_0, R5_2, T_1, R5_2 // [_, 5r₂₆[2], _, 0] + VPERM T_0, R5_3, T_1, R5_3 // [_, 5r₂₆[3], _, 0] + VPERM T_0, R5_4, T_1, R5_4 // [_, 5r₂₆[4], _, 0] + + // Set the value of lane 1 to be 1. + VLEIF $3, $1, R_0 // [_, r₂₆[0], _, 1] + + MOVD $0, R3 + BR multiply diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing.go new file mode 100644 index 0000000000..4fad24f8dc --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/subtle/aliasing.go @@ -0,0 +1,33 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !purego +// +build !purego + +// Package subtle implements functions that are often useful in cryptographic +// code but require careful thought to use correctly. +package subtle // import "golang.org/x/crypto/internal/subtle" + +import "unsafe" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) && + uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1])) +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go new file mode 100644 index 0000000000..80ccbed2c0 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go @@ -0,0 +1,36 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build purego +// +build purego + +// Package subtle implements functions that are often useful in cryptographic +// code but require careful thought to use correctly. +package subtle // import "golang.org/x/crypto/internal/subtle" + +// This is the Google App Engine standard variant based on reflect +// because the unsafe package and cgo are disallowed. + +import "reflect" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && + reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/vendor/golang.org/x/crypto/ssh/agent/client.go b/vendor/golang.org/x/crypto/ssh/agent/client.go new file mode 100644 index 0000000000..b909471cc0 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/agent/client.go @@ -0,0 +1,813 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package agent implements the ssh-agent protocol, and provides both +// a client and a server. The client can talk to a standard ssh-agent +// that uses UNIX sockets, and one could implement an alternative +// ssh-agent process using the sample server. +// +// References: +// [PROTOCOL.agent]: https://tools.ietf.org/html/draft-miller-ssh-agent-00 +package agent // import "golang.org/x/crypto/ssh/agent" + +import ( + "bytes" + "crypto/dsa" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rsa" + "encoding/base64" + "encoding/binary" + "errors" + "fmt" + "io" + "math/big" + "sync" + + "crypto" + "golang.org/x/crypto/ed25519" + "golang.org/x/crypto/ssh" +) + +// SignatureFlags represent additional flags that can be passed to the signature +// requests an defined in [PROTOCOL.agent] section 4.5.1. +type SignatureFlags uint32 + +// SignatureFlag values as defined in [PROTOCOL.agent] section 5.3. +const ( + SignatureFlagReserved SignatureFlags = 1 << iota + SignatureFlagRsaSha256 + SignatureFlagRsaSha512 +) + +// Agent represents the capabilities of an ssh-agent. +type Agent interface { + // List returns the identities known to the agent. + List() ([]*Key, error) + + // Sign has the agent sign the data using a protocol 2 key as defined + // in [PROTOCOL.agent] section 2.6.2. + Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) + + // Add adds a private key to the agent. + Add(key AddedKey) error + + // Remove removes all identities with the given public key. + Remove(key ssh.PublicKey) error + + // RemoveAll removes all identities. + RemoveAll() error + + // Lock locks the agent. Sign and Remove will fail, and List will empty an empty list. + Lock(passphrase []byte) error + + // Unlock undoes the effect of Lock + Unlock(passphrase []byte) error + + // Signers returns signers for all the known keys. + Signers() ([]ssh.Signer, error) +} + +type ExtendedAgent interface { + Agent + + // SignWithFlags signs like Sign, but allows for additional flags to be sent/received + SignWithFlags(key ssh.PublicKey, data []byte, flags SignatureFlags) (*ssh.Signature, error) + + // Extension processes a custom extension request. Standard-compliant agents are not + // required to support any extensions, but this method allows agents to implement + // vendor-specific methods or add experimental features. See [PROTOCOL.agent] section 4.7. + // If agent extensions are unsupported entirely this method MUST return an + // ErrExtensionUnsupported error. Similarly, if just the specific extensionType in + // the request is unsupported by the agent then ErrExtensionUnsupported MUST be + // returned. + // + // In the case of success, since [PROTOCOL.agent] section 4.7 specifies that the contents + // of the response are unspecified (including the type of the message), the complete + // response will be returned as a []byte slice, including the "type" byte of the message. + Extension(extensionType string, contents []byte) ([]byte, error) +} + +// ConstraintExtension describes an optional constraint defined by users. +type ConstraintExtension struct { + // ExtensionName consist of a UTF-8 string suffixed by the + // implementation domain following the naming scheme defined + // in Section 4.2 of [RFC4251], e.g. "foo@example.com". + ExtensionName string + // ExtensionDetails contains the actual content of the extended + // constraint. + ExtensionDetails []byte +} + +// AddedKey describes an SSH key to be added to an Agent. +type AddedKey struct { + // PrivateKey must be a *rsa.PrivateKey, *dsa.PrivateKey, + // ed25519.PrivateKey or *ecdsa.PrivateKey, which will be inserted into the + // agent. + PrivateKey interface{} + // Certificate, if not nil, is communicated to the agent and will be + // stored with the key. + Certificate *ssh.Certificate + // Comment is an optional, free-form string. + Comment string + // LifetimeSecs, if not zero, is the number of seconds that the + // agent will store the key for. + LifetimeSecs uint32 + // ConfirmBeforeUse, if true, requests that the agent confirm with the + // user before each use of this key. + ConfirmBeforeUse bool + // ConstraintExtensions are the experimental or private-use constraints + // defined by users. + ConstraintExtensions []ConstraintExtension +} + +// See [PROTOCOL.agent], section 3. +const ( + agentRequestV1Identities = 1 + agentRemoveAllV1Identities = 9 + + // 3.2 Requests from client to agent for protocol 2 key operations + agentAddIdentity = 17 + agentRemoveIdentity = 18 + agentRemoveAllIdentities = 19 + agentAddIDConstrained = 25 + + // 3.3 Key-type independent requests from client to agent + agentAddSmartcardKey = 20 + agentRemoveSmartcardKey = 21 + agentLock = 22 + agentUnlock = 23 + agentAddSmartcardKeyConstrained = 26 + + // 3.7 Key constraint identifiers + agentConstrainLifetime = 1 + agentConstrainConfirm = 2 + agentConstrainExtension = 3 +) + +// maxAgentResponseBytes is the maximum agent reply size that is accepted. This +// is a sanity check, not a limit in the spec. +const maxAgentResponseBytes = 16 << 20 + +// Agent messages: +// These structures mirror the wire format of the corresponding ssh agent +// messages found in [PROTOCOL.agent]. + +// 3.4 Generic replies from agent to client +const agentFailure = 5 + +type failureAgentMsg struct{} + +const agentSuccess = 6 + +type successAgentMsg struct{} + +// See [PROTOCOL.agent], section 2.5.2. +const agentRequestIdentities = 11 + +type requestIdentitiesAgentMsg struct{} + +// See [PROTOCOL.agent], section 2.5.2. +const agentIdentitiesAnswer = 12 + +type identitiesAnswerAgentMsg struct { + NumKeys uint32 `sshtype:"12"` + Keys []byte `ssh:"rest"` +} + +// See [PROTOCOL.agent], section 2.6.2. +const agentSignRequest = 13 + +type signRequestAgentMsg struct { + KeyBlob []byte `sshtype:"13"` + Data []byte + Flags uint32 +} + +// See [PROTOCOL.agent], section 2.6.2. + +// 3.6 Replies from agent to client for protocol 2 key operations +const agentSignResponse = 14 + +type signResponseAgentMsg struct { + SigBlob []byte `sshtype:"14"` +} + +type publicKey struct { + Format string + Rest []byte `ssh:"rest"` +} + +// 3.7 Key constraint identifiers +type constrainLifetimeAgentMsg struct { + LifetimeSecs uint32 `sshtype:"1"` +} + +type constrainExtensionAgentMsg struct { + ExtensionName string `sshtype:"3"` + ExtensionDetails []byte + + // Rest is a field used for parsing, not part of message + Rest []byte `ssh:"rest"` +} + +// See [PROTOCOL.agent], section 4.7 +const agentExtension = 27 +const agentExtensionFailure = 28 + +// ErrExtensionUnsupported indicates that an extension defined in +// [PROTOCOL.agent] section 4.7 is unsupported by the agent. Specifically this +// error indicates that the agent returned a standard SSH_AGENT_FAILURE message +// as the result of a SSH_AGENTC_EXTENSION request. Note that the protocol +// specification (and therefore this error) does not distinguish between a +// specific extension being unsupported and extensions being unsupported entirely. +var ErrExtensionUnsupported = errors.New("agent: extension unsupported") + +type extensionAgentMsg struct { + ExtensionType string `sshtype:"27"` + Contents []byte +} + +// Key represents a protocol 2 public key as defined in +// [PROTOCOL.agent], section 2.5.2. +type Key struct { + Format string + Blob []byte + Comment string +} + +func clientErr(err error) error { + return fmt.Errorf("agent: client error: %v", err) +} + +// String returns the storage form of an agent key with the format, base64 +// encoded serialized key, and the comment if it is not empty. +func (k *Key) String() string { + s := string(k.Format) + " " + base64.StdEncoding.EncodeToString(k.Blob) + + if k.Comment != "" { + s += " " + k.Comment + } + + return s +} + +// Type returns the public key type. +func (k *Key) Type() string { + return k.Format +} + +// Marshal returns key blob to satisfy the ssh.PublicKey interface. +func (k *Key) Marshal() []byte { + return k.Blob +} + +// Verify satisfies the ssh.PublicKey interface. +func (k *Key) Verify(data []byte, sig *ssh.Signature) error { + pubKey, err := ssh.ParsePublicKey(k.Blob) + if err != nil { + return fmt.Errorf("agent: bad public key: %v", err) + } + return pubKey.Verify(data, sig) +} + +type wireKey struct { + Format string + Rest []byte `ssh:"rest"` +} + +func parseKey(in []byte) (out *Key, rest []byte, err error) { + var record struct { + Blob []byte + Comment string + Rest []byte `ssh:"rest"` + } + + if err := ssh.Unmarshal(in, &record); err != nil { + return nil, nil, err + } + + var wk wireKey + if err := ssh.Unmarshal(record.Blob, &wk); err != nil { + return nil, nil, err + } + + return &Key{ + Format: wk.Format, + Blob: record.Blob, + Comment: record.Comment, + }, record.Rest, nil +} + +// client is a client for an ssh-agent process. +type client struct { + // conn is typically a *net.UnixConn + conn io.ReadWriter + // mu is used to prevent concurrent access to the agent + mu sync.Mutex +} + +// NewClient returns an Agent that talks to an ssh-agent process over +// the given connection. +func NewClient(rw io.ReadWriter) ExtendedAgent { + return &client{conn: rw} +} + +// call sends an RPC to the agent. On success, the reply is +// unmarshaled into reply and replyType is set to the first byte of +// the reply, which contains the type of the message. +func (c *client) call(req []byte) (reply interface{}, err error) { + buf, err := c.callRaw(req) + if err != nil { + return nil, err + } + reply, err = unmarshal(buf) + if err != nil { + return nil, clientErr(err) + } + return reply, nil +} + +// callRaw sends an RPC to the agent. On success, the raw +// bytes of the response are returned; no unmarshalling is +// performed on the response. +func (c *client) callRaw(req []byte) (reply []byte, err error) { + c.mu.Lock() + defer c.mu.Unlock() + + msg := make([]byte, 4+len(req)) + binary.BigEndian.PutUint32(msg, uint32(len(req))) + copy(msg[4:], req) + if _, err = c.conn.Write(msg); err != nil { + return nil, clientErr(err) + } + + var respSizeBuf [4]byte + if _, err = io.ReadFull(c.conn, respSizeBuf[:]); err != nil { + return nil, clientErr(err) + } + respSize := binary.BigEndian.Uint32(respSizeBuf[:]) + if respSize > maxAgentResponseBytes { + return nil, clientErr(errors.New("response too large")) + } + + buf := make([]byte, respSize) + if _, err = io.ReadFull(c.conn, buf); err != nil { + return nil, clientErr(err) + } + return buf, nil +} + +func (c *client) simpleCall(req []byte) error { + resp, err := c.call(req) + if err != nil { + return err + } + if _, ok := resp.(*successAgentMsg); ok { + return nil + } + return errors.New("agent: failure") +} + +func (c *client) RemoveAll() error { + return c.simpleCall([]byte{agentRemoveAllIdentities}) +} + +func (c *client) Remove(key ssh.PublicKey) error { + req := ssh.Marshal(&agentRemoveIdentityMsg{ + KeyBlob: key.Marshal(), + }) + return c.simpleCall(req) +} + +func (c *client) Lock(passphrase []byte) error { + req := ssh.Marshal(&agentLockMsg{ + Passphrase: passphrase, + }) + return c.simpleCall(req) +} + +func (c *client) Unlock(passphrase []byte) error { + req := ssh.Marshal(&agentUnlockMsg{ + Passphrase: passphrase, + }) + return c.simpleCall(req) +} + +// List returns the identities known to the agent. +func (c *client) List() ([]*Key, error) { + // see [PROTOCOL.agent] section 2.5.2. + req := []byte{agentRequestIdentities} + + msg, err := c.call(req) + if err != nil { + return nil, err + } + + switch msg := msg.(type) { + case *identitiesAnswerAgentMsg: + if msg.NumKeys > maxAgentResponseBytes/8 { + return nil, errors.New("agent: too many keys in agent reply") + } + keys := make([]*Key, msg.NumKeys) + data := msg.Keys + for i := uint32(0); i < msg.NumKeys; i++ { + var key *Key + var err error + if key, data, err = parseKey(data); err != nil { + return nil, err + } + keys[i] = key + } + return keys, nil + case *failureAgentMsg: + return nil, errors.New("agent: failed to list keys") + } + panic("unreachable") +} + +// Sign has the agent sign the data using a protocol 2 key as defined +// in [PROTOCOL.agent] section 2.6.2. +func (c *client) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) { + return c.SignWithFlags(key, data, 0) +} + +func (c *client) SignWithFlags(key ssh.PublicKey, data []byte, flags SignatureFlags) (*ssh.Signature, error) { + req := ssh.Marshal(signRequestAgentMsg{ + KeyBlob: key.Marshal(), + Data: data, + Flags: uint32(flags), + }) + + msg, err := c.call(req) + if err != nil { + return nil, err + } + + switch msg := msg.(type) { + case *signResponseAgentMsg: + var sig ssh.Signature + if err := ssh.Unmarshal(msg.SigBlob, &sig); err != nil { + return nil, err + } + + return &sig, nil + case *failureAgentMsg: + return nil, errors.New("agent: failed to sign challenge") + } + panic("unreachable") +} + +// unmarshal parses an agent message in packet, returning the parsed +// form and the message type of packet. +func unmarshal(packet []byte) (interface{}, error) { + if len(packet) < 1 { + return nil, errors.New("agent: empty packet") + } + var msg interface{} + switch packet[0] { + case agentFailure: + return new(failureAgentMsg), nil + case agentSuccess: + return new(successAgentMsg), nil + case agentIdentitiesAnswer: + msg = new(identitiesAnswerAgentMsg) + case agentSignResponse: + msg = new(signResponseAgentMsg) + case agentV1IdentitiesAnswer: + msg = new(agentV1IdentityMsg) + default: + return nil, fmt.Errorf("agent: unknown type tag %d", packet[0]) + } + if err := ssh.Unmarshal(packet, msg); err != nil { + return nil, err + } + return msg, nil +} + +type rsaKeyMsg struct { + Type string `sshtype:"17|25"` + N *big.Int + E *big.Int + D *big.Int + Iqmp *big.Int // IQMP = Inverse Q Mod P + P *big.Int + Q *big.Int + Comments string + Constraints []byte `ssh:"rest"` +} + +type dsaKeyMsg struct { + Type string `sshtype:"17|25"` + P *big.Int + Q *big.Int + G *big.Int + Y *big.Int + X *big.Int + Comments string + Constraints []byte `ssh:"rest"` +} + +type ecdsaKeyMsg struct { + Type string `sshtype:"17|25"` + Curve string + KeyBytes []byte + D *big.Int + Comments string + Constraints []byte `ssh:"rest"` +} + +type ed25519KeyMsg struct { + Type string `sshtype:"17|25"` + Pub []byte + Priv []byte + Comments string + Constraints []byte `ssh:"rest"` +} + +// Insert adds a private key to the agent. +func (c *client) insertKey(s interface{}, comment string, constraints []byte) error { + var req []byte + switch k := s.(type) { + case *rsa.PrivateKey: + if len(k.Primes) != 2 { + return fmt.Errorf("agent: unsupported RSA key with %d primes", len(k.Primes)) + } + k.Precompute() + req = ssh.Marshal(rsaKeyMsg{ + Type: ssh.KeyAlgoRSA, + N: k.N, + E: big.NewInt(int64(k.E)), + D: k.D, + Iqmp: k.Precomputed.Qinv, + P: k.Primes[0], + Q: k.Primes[1], + Comments: comment, + Constraints: constraints, + }) + case *dsa.PrivateKey: + req = ssh.Marshal(dsaKeyMsg{ + Type: ssh.KeyAlgoDSA, + P: k.P, + Q: k.Q, + G: k.G, + Y: k.Y, + X: k.X, + Comments: comment, + Constraints: constraints, + }) + case *ecdsa.PrivateKey: + nistID := fmt.Sprintf("nistp%d", k.Params().BitSize) + req = ssh.Marshal(ecdsaKeyMsg{ + Type: "ecdsa-sha2-" + nistID, + Curve: nistID, + KeyBytes: elliptic.Marshal(k.Curve, k.X, k.Y), + D: k.D, + Comments: comment, + Constraints: constraints, + }) + case ed25519.PrivateKey: + req = ssh.Marshal(ed25519KeyMsg{ + Type: ssh.KeyAlgoED25519, + Pub: []byte(k)[32:], + Priv: []byte(k), + Comments: comment, + Constraints: constraints, + }) + // This function originally supported only *ed25519.PrivateKey, however the + // general idiom is to pass ed25519.PrivateKey by value, not by pointer. + // We still support the pointer variant for backwards compatibility. + case *ed25519.PrivateKey: + req = ssh.Marshal(ed25519KeyMsg{ + Type: ssh.KeyAlgoED25519, + Pub: []byte(*k)[32:], + Priv: []byte(*k), + Comments: comment, + Constraints: constraints, + }) + default: + return fmt.Errorf("agent: unsupported key type %T", s) + } + + // if constraints are present then the message type needs to be changed. + if len(constraints) != 0 { + req[0] = agentAddIDConstrained + } + + resp, err := c.call(req) + if err != nil { + return err + } + if _, ok := resp.(*successAgentMsg); ok { + return nil + } + return errors.New("agent: failure") +} + +type rsaCertMsg struct { + Type string `sshtype:"17|25"` + CertBytes []byte + D *big.Int + Iqmp *big.Int // IQMP = Inverse Q Mod P + P *big.Int + Q *big.Int + Comments string + Constraints []byte `ssh:"rest"` +} + +type dsaCertMsg struct { + Type string `sshtype:"17|25"` + CertBytes []byte + X *big.Int + Comments string + Constraints []byte `ssh:"rest"` +} + +type ecdsaCertMsg struct { + Type string `sshtype:"17|25"` + CertBytes []byte + D *big.Int + Comments string + Constraints []byte `ssh:"rest"` +} + +type ed25519CertMsg struct { + Type string `sshtype:"17|25"` + CertBytes []byte + Pub []byte + Priv []byte + Comments string + Constraints []byte `ssh:"rest"` +} + +// Add adds a private key to the agent. If a certificate is given, +// that certificate is added instead as public key. +func (c *client) Add(key AddedKey) error { + var constraints []byte + + if secs := key.LifetimeSecs; secs != 0 { + constraints = append(constraints, ssh.Marshal(constrainLifetimeAgentMsg{secs})...) + } + + if key.ConfirmBeforeUse { + constraints = append(constraints, agentConstrainConfirm) + } + + cert := key.Certificate + if cert == nil { + return c.insertKey(key.PrivateKey, key.Comment, constraints) + } + return c.insertCert(key.PrivateKey, cert, key.Comment, constraints) +} + +func (c *client) insertCert(s interface{}, cert *ssh.Certificate, comment string, constraints []byte) error { + var req []byte + switch k := s.(type) { + case *rsa.PrivateKey: + if len(k.Primes) != 2 { + return fmt.Errorf("agent: unsupported RSA key with %d primes", len(k.Primes)) + } + k.Precompute() + req = ssh.Marshal(rsaCertMsg{ + Type: cert.Type(), + CertBytes: cert.Marshal(), + D: k.D, + Iqmp: k.Precomputed.Qinv, + P: k.Primes[0], + Q: k.Primes[1], + Comments: comment, + Constraints: constraints, + }) + case *dsa.PrivateKey: + req = ssh.Marshal(dsaCertMsg{ + Type: cert.Type(), + CertBytes: cert.Marshal(), + X: k.X, + Comments: comment, + Constraints: constraints, + }) + case *ecdsa.PrivateKey: + req = ssh.Marshal(ecdsaCertMsg{ + Type: cert.Type(), + CertBytes: cert.Marshal(), + D: k.D, + Comments: comment, + Constraints: constraints, + }) + case ed25519.PrivateKey: + req = ssh.Marshal(ed25519CertMsg{ + Type: cert.Type(), + CertBytes: cert.Marshal(), + Pub: []byte(k)[32:], + Priv: []byte(k), + Comments: comment, + Constraints: constraints, + }) + // This function originally supported only *ed25519.PrivateKey, however the + // general idiom is to pass ed25519.PrivateKey by value, not by pointer. + // We still support the pointer variant for backwards compatibility. + case *ed25519.PrivateKey: + req = ssh.Marshal(ed25519CertMsg{ + Type: cert.Type(), + CertBytes: cert.Marshal(), + Pub: []byte(*k)[32:], + Priv: []byte(*k), + Comments: comment, + Constraints: constraints, + }) + default: + return fmt.Errorf("agent: unsupported key type %T", s) + } + + // if constraints are present then the message type needs to be changed. + if len(constraints) != 0 { + req[0] = agentAddIDConstrained + } + + signer, err := ssh.NewSignerFromKey(s) + if err != nil { + return err + } + if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 { + return errors.New("agent: signer and cert have different public key") + } + + resp, err := c.call(req) + if err != nil { + return err + } + if _, ok := resp.(*successAgentMsg); ok { + return nil + } + return errors.New("agent: failure") +} + +// Signers provides a callback for client authentication. +func (c *client) Signers() ([]ssh.Signer, error) { + keys, err := c.List() + if err != nil { + return nil, err + } + + var result []ssh.Signer + for _, k := range keys { + result = append(result, &agentKeyringSigner{c, k}) + } + return result, nil +} + +type agentKeyringSigner struct { + agent *client + pub ssh.PublicKey +} + +func (s *agentKeyringSigner) PublicKey() ssh.PublicKey { + return s.pub +} + +func (s *agentKeyringSigner) Sign(rand io.Reader, data []byte) (*ssh.Signature, error) { + // The agent has its own entropy source, so the rand argument is ignored. + return s.agent.Sign(s.pub, data) +} + +func (s *agentKeyringSigner) SignWithOpts(rand io.Reader, data []byte, opts crypto.SignerOpts) (*ssh.Signature, error) { + var flags SignatureFlags + if opts != nil { + switch opts.HashFunc() { + case crypto.SHA256: + flags = SignatureFlagRsaSha256 + case crypto.SHA512: + flags = SignatureFlagRsaSha512 + } + } + return s.agent.SignWithFlags(s.pub, data, flags) +} + +// Calls an extension method. It is up to the agent implementation as to whether or not +// any particular extension is supported and may always return an error. Because the +// type of the response is up to the implementation, this returns the bytes of the +// response and does not attempt any type of unmarshalling. +func (c *client) Extension(extensionType string, contents []byte) ([]byte, error) { + req := ssh.Marshal(extensionAgentMsg{ + ExtensionType: extensionType, + Contents: contents, + }) + buf, err := c.callRaw(req) + if err != nil { + return nil, err + } + if len(buf) == 0 { + return nil, errors.New("agent: failure; empty response") + } + // [PROTOCOL.agent] section 4.7 indicates that an SSH_AGENT_FAILURE message + // represents an agent that does not support the extension + if buf[0] == agentFailure { + return nil, ErrExtensionUnsupported + } + if buf[0] == agentExtensionFailure { + return nil, errors.New("agent: generic extension failure") + } + + return buf, nil +} diff --git a/vendor/golang.org/x/crypto/ssh/agent/forward.go b/vendor/golang.org/x/crypto/ssh/agent/forward.go new file mode 100644 index 0000000000..fd24ba900d --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/agent/forward.go @@ -0,0 +1,103 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package agent + +import ( + "errors" + "io" + "net" + "sync" + + "golang.org/x/crypto/ssh" +) + +// RequestAgentForwarding sets up agent forwarding for the session. +// ForwardToAgent or ForwardToRemote should be called to route +// the authentication requests. +func RequestAgentForwarding(session *ssh.Session) error { + ok, err := session.SendRequest("auth-agent-req@openssh.com", true, nil) + if err != nil { + return err + } + if !ok { + return errors.New("forwarding request denied") + } + return nil +} + +// ForwardToAgent routes authentication requests to the given keyring. +func ForwardToAgent(client *ssh.Client, keyring Agent) error { + channels := client.HandleChannelOpen(channelType) + if channels == nil { + return errors.New("agent: already have handler for " + channelType) + } + + go func() { + for ch := range channels { + channel, reqs, err := ch.Accept() + if err != nil { + continue + } + go ssh.DiscardRequests(reqs) + go func() { + ServeAgent(keyring, channel) + channel.Close() + }() + } + }() + return nil +} + +const channelType = "auth-agent@openssh.com" + +// ForwardToRemote routes authentication requests to the ssh-agent +// process serving on the given unix socket. +func ForwardToRemote(client *ssh.Client, addr string) error { + channels := client.HandleChannelOpen(channelType) + if channels == nil { + return errors.New("agent: already have handler for " + channelType) + } + conn, err := net.Dial("unix", addr) + if err != nil { + return err + } + conn.Close() + + go func() { + for ch := range channels { + channel, reqs, err := ch.Accept() + if err != nil { + continue + } + go ssh.DiscardRequests(reqs) + go forwardUnixSocket(channel, addr) + } + }() + return nil +} + +func forwardUnixSocket(channel ssh.Channel, addr string) { + conn, err := net.Dial("unix", addr) + if err != nil { + return + } + + var wg sync.WaitGroup + wg.Add(2) + go func() { + io.Copy(conn, channel) + conn.(*net.UnixConn).CloseWrite() + wg.Done() + }() + go func() { + io.Copy(channel, conn) + channel.CloseWrite() + wg.Done() + }() + + wg.Wait() + conn.Close() + channel.Close() +} diff --git a/vendor/golang.org/x/crypto/ssh/agent/keyring.go b/vendor/golang.org/x/crypto/ssh/agent/keyring.go new file mode 100644 index 0000000000..c6eb56dd50 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/agent/keyring.go @@ -0,0 +1,241 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package agent + +import ( + "bytes" + "crypto/rand" + "crypto/subtle" + "errors" + "fmt" + "sync" + "time" + + "golang.org/x/crypto/ssh" +) + +type privKey struct { + signer ssh.Signer + comment string + expire *time.Time +} + +type keyring struct { + mu sync.Mutex + keys []privKey + + locked bool + passphrase []byte +} + +var errLocked = errors.New("agent: locked") + +// NewKeyring returns an Agent that holds keys in memory. It is safe +// for concurrent use by multiple goroutines. +func NewKeyring() Agent { + return &keyring{} +} + +// RemoveAll removes all identities. +func (r *keyring) RemoveAll() error { + r.mu.Lock() + defer r.mu.Unlock() + if r.locked { + return errLocked + } + + r.keys = nil + return nil +} + +// removeLocked does the actual key removal. The caller must already be holding the +// keyring mutex. +func (r *keyring) removeLocked(want []byte) error { + found := false + for i := 0; i < len(r.keys); { + if bytes.Equal(r.keys[i].signer.PublicKey().Marshal(), want) { + found = true + r.keys[i] = r.keys[len(r.keys)-1] + r.keys = r.keys[:len(r.keys)-1] + continue + } else { + i++ + } + } + + if !found { + return errors.New("agent: key not found") + } + return nil +} + +// Remove removes all identities with the given public key. +func (r *keyring) Remove(key ssh.PublicKey) error { + r.mu.Lock() + defer r.mu.Unlock() + if r.locked { + return errLocked + } + + return r.removeLocked(key.Marshal()) +} + +// Lock locks the agent. Sign and Remove will fail, and List will return an empty list. +func (r *keyring) Lock(passphrase []byte) error { + r.mu.Lock() + defer r.mu.Unlock() + if r.locked { + return errLocked + } + + r.locked = true + r.passphrase = passphrase + return nil +} + +// Unlock undoes the effect of Lock +func (r *keyring) Unlock(passphrase []byte) error { + r.mu.Lock() + defer r.mu.Unlock() + if !r.locked { + return errors.New("agent: not locked") + } + if 1 != subtle.ConstantTimeCompare(passphrase, r.passphrase) { + return fmt.Errorf("agent: incorrect passphrase") + } + + r.locked = false + r.passphrase = nil + return nil +} + +// expireKeysLocked removes expired keys from the keyring. If a key was added +// with a lifetimesecs contraint and seconds >= lifetimesecs seconds have +// elapsed, it is removed. The caller *must* be holding the keyring mutex. +func (r *keyring) expireKeysLocked() { + for _, k := range r.keys { + if k.expire != nil && time.Now().After(*k.expire) { + r.removeLocked(k.signer.PublicKey().Marshal()) + } + } +} + +// List returns the identities known to the agent. +func (r *keyring) List() ([]*Key, error) { + r.mu.Lock() + defer r.mu.Unlock() + if r.locked { + // section 2.7: locked agents return empty. + return nil, nil + } + + r.expireKeysLocked() + var ids []*Key + for _, k := range r.keys { + pub := k.signer.PublicKey() + ids = append(ids, &Key{ + Format: pub.Type(), + Blob: pub.Marshal(), + Comment: k.comment}) + } + return ids, nil +} + +// Insert adds a private key to the keyring. If a certificate +// is given, that certificate is added as public key. Note that +// any constraints given are ignored. +func (r *keyring) Add(key AddedKey) error { + r.mu.Lock() + defer r.mu.Unlock() + if r.locked { + return errLocked + } + signer, err := ssh.NewSignerFromKey(key.PrivateKey) + + if err != nil { + return err + } + + if cert := key.Certificate; cert != nil { + signer, err = ssh.NewCertSigner(cert, signer) + if err != nil { + return err + } + } + + p := privKey{ + signer: signer, + comment: key.Comment, + } + + if key.LifetimeSecs > 0 { + t := time.Now().Add(time.Duration(key.LifetimeSecs) * time.Second) + p.expire = &t + } + + r.keys = append(r.keys, p) + + return nil +} + +// Sign returns a signature for the data. +func (r *keyring) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) { + return r.SignWithFlags(key, data, 0) +} + +func (r *keyring) SignWithFlags(key ssh.PublicKey, data []byte, flags SignatureFlags) (*ssh.Signature, error) { + r.mu.Lock() + defer r.mu.Unlock() + if r.locked { + return nil, errLocked + } + + r.expireKeysLocked() + wanted := key.Marshal() + for _, k := range r.keys { + if bytes.Equal(k.signer.PublicKey().Marshal(), wanted) { + if flags == 0 { + return k.signer.Sign(rand.Reader, data) + } else { + if algorithmSigner, ok := k.signer.(ssh.AlgorithmSigner); !ok { + return nil, fmt.Errorf("agent: signature does not support non-default signature algorithm: %T", k.signer) + } else { + var algorithm string + switch flags { + case SignatureFlagRsaSha256: + algorithm = ssh.SigAlgoRSASHA2256 + case SignatureFlagRsaSha512: + algorithm = ssh.SigAlgoRSASHA2512 + default: + return nil, fmt.Errorf("agent: unsupported signature flags: %d", flags) + } + return algorithmSigner.SignWithAlgorithm(rand.Reader, data, algorithm) + } + } + } + } + return nil, errors.New("not found") +} + +// Signers returns signers for all the known keys. +func (r *keyring) Signers() ([]ssh.Signer, error) { + r.mu.Lock() + defer r.mu.Unlock() + if r.locked { + return nil, errLocked + } + + r.expireKeysLocked() + s := make([]ssh.Signer, 0, len(r.keys)) + for _, k := range r.keys { + s = append(s, k.signer) + } + return s, nil +} + +// The keyring does not support any extensions +func (r *keyring) Extension(extensionType string, contents []byte) ([]byte, error) { + return nil, ErrExtensionUnsupported +} diff --git a/vendor/golang.org/x/crypto/ssh/agent/server.go b/vendor/golang.org/x/crypto/ssh/agent/server.go new file mode 100644 index 0000000000..6e7a1e02f2 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/agent/server.go @@ -0,0 +1,570 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package agent + +import ( + "crypto/dsa" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rsa" + "encoding/binary" + "errors" + "fmt" + "io" + "log" + "math/big" + + "golang.org/x/crypto/ed25519" + "golang.org/x/crypto/ssh" +) + +// Server wraps an Agent and uses it to implement the agent side of +// the SSH-agent, wire protocol. +type server struct { + agent Agent +} + +func (s *server) processRequestBytes(reqData []byte) []byte { + rep, err := s.processRequest(reqData) + if err != nil { + if err != errLocked { + // TODO(hanwen): provide better logging interface? + log.Printf("agent %d: %v", reqData[0], err) + } + return []byte{agentFailure} + } + + if err == nil && rep == nil { + return []byte{agentSuccess} + } + + return ssh.Marshal(rep) +} + +func marshalKey(k *Key) []byte { + var record struct { + Blob []byte + Comment string + } + record.Blob = k.Marshal() + record.Comment = k.Comment + + return ssh.Marshal(&record) +} + +// See [PROTOCOL.agent], section 2.5.1. +const agentV1IdentitiesAnswer = 2 + +type agentV1IdentityMsg struct { + Numkeys uint32 `sshtype:"2"` +} + +type agentRemoveIdentityMsg struct { + KeyBlob []byte `sshtype:"18"` +} + +type agentLockMsg struct { + Passphrase []byte `sshtype:"22"` +} + +type agentUnlockMsg struct { + Passphrase []byte `sshtype:"23"` +} + +func (s *server) processRequest(data []byte) (interface{}, error) { + switch data[0] { + case agentRequestV1Identities: + return &agentV1IdentityMsg{0}, nil + + case agentRemoveAllV1Identities: + return nil, nil + + case agentRemoveIdentity: + var req agentRemoveIdentityMsg + if err := ssh.Unmarshal(data, &req); err != nil { + return nil, err + } + + var wk wireKey + if err := ssh.Unmarshal(req.KeyBlob, &wk); err != nil { + return nil, err + } + + return nil, s.agent.Remove(&Key{Format: wk.Format, Blob: req.KeyBlob}) + + case agentRemoveAllIdentities: + return nil, s.agent.RemoveAll() + + case agentLock: + var req agentLockMsg + if err := ssh.Unmarshal(data, &req); err != nil { + return nil, err + } + + return nil, s.agent.Lock(req.Passphrase) + + case agentUnlock: + var req agentUnlockMsg + if err := ssh.Unmarshal(data, &req); err != nil { + return nil, err + } + return nil, s.agent.Unlock(req.Passphrase) + + case agentSignRequest: + var req signRequestAgentMsg + if err := ssh.Unmarshal(data, &req); err != nil { + return nil, err + } + + var wk wireKey + if err := ssh.Unmarshal(req.KeyBlob, &wk); err != nil { + return nil, err + } + + k := &Key{ + Format: wk.Format, + Blob: req.KeyBlob, + } + + var sig *ssh.Signature + var err error + if extendedAgent, ok := s.agent.(ExtendedAgent); ok { + sig, err = extendedAgent.SignWithFlags(k, req.Data, SignatureFlags(req.Flags)) + } else { + sig, err = s.agent.Sign(k, req.Data) + } + + if err != nil { + return nil, err + } + return &signResponseAgentMsg{SigBlob: ssh.Marshal(sig)}, nil + + case agentRequestIdentities: + keys, err := s.agent.List() + if err != nil { + return nil, err + } + + rep := identitiesAnswerAgentMsg{ + NumKeys: uint32(len(keys)), + } + for _, k := range keys { + rep.Keys = append(rep.Keys, marshalKey(k)...) + } + return rep, nil + + case agentAddIDConstrained, agentAddIdentity: + return nil, s.insertIdentity(data) + + case agentExtension: + // Return a stub object where the whole contents of the response gets marshaled. + var responseStub struct { + Rest []byte `ssh:"rest"` + } + + if extendedAgent, ok := s.agent.(ExtendedAgent); !ok { + // If this agent doesn't implement extensions, [PROTOCOL.agent] section 4.7 + // requires that we return a standard SSH_AGENT_FAILURE message. + responseStub.Rest = []byte{agentFailure} + } else { + var req extensionAgentMsg + if err := ssh.Unmarshal(data, &req); err != nil { + return nil, err + } + res, err := extendedAgent.Extension(req.ExtensionType, req.Contents) + if err != nil { + // If agent extensions are unsupported, return a standard SSH_AGENT_FAILURE + // message as required by [PROTOCOL.agent] section 4.7. + if err == ErrExtensionUnsupported { + responseStub.Rest = []byte{agentFailure} + } else { + // As the result of any other error processing an extension request, + // [PROTOCOL.agent] section 4.7 requires that we return a + // SSH_AGENT_EXTENSION_FAILURE code. + responseStub.Rest = []byte{agentExtensionFailure} + } + } else { + if len(res) == 0 { + return nil, nil + } + responseStub.Rest = res + } + } + + return responseStub, nil + } + + return nil, fmt.Errorf("unknown opcode %d", data[0]) +} + +func parseConstraints(constraints []byte) (lifetimeSecs uint32, confirmBeforeUse bool, extensions []ConstraintExtension, err error) { + for len(constraints) != 0 { + switch constraints[0] { + case agentConstrainLifetime: + lifetimeSecs = binary.BigEndian.Uint32(constraints[1:5]) + constraints = constraints[5:] + case agentConstrainConfirm: + confirmBeforeUse = true + constraints = constraints[1:] + case agentConstrainExtension: + var msg constrainExtensionAgentMsg + if err = ssh.Unmarshal(constraints, &msg); err != nil { + return 0, false, nil, err + } + extensions = append(extensions, ConstraintExtension{ + ExtensionName: msg.ExtensionName, + ExtensionDetails: msg.ExtensionDetails, + }) + constraints = msg.Rest + default: + return 0, false, nil, fmt.Errorf("unknown constraint type: %d", constraints[0]) + } + } + return +} + +func setConstraints(key *AddedKey, constraintBytes []byte) error { + lifetimeSecs, confirmBeforeUse, constraintExtensions, err := parseConstraints(constraintBytes) + if err != nil { + return err + } + + key.LifetimeSecs = lifetimeSecs + key.ConfirmBeforeUse = confirmBeforeUse + key.ConstraintExtensions = constraintExtensions + return nil +} + +func parseRSAKey(req []byte) (*AddedKey, error) { + var k rsaKeyMsg + if err := ssh.Unmarshal(req, &k); err != nil { + return nil, err + } + if k.E.BitLen() > 30 { + return nil, errors.New("agent: RSA public exponent too large") + } + priv := &rsa.PrivateKey{ + PublicKey: rsa.PublicKey{ + E: int(k.E.Int64()), + N: k.N, + }, + D: k.D, + Primes: []*big.Int{k.P, k.Q}, + } + priv.Precompute() + + addedKey := &AddedKey{PrivateKey: priv, Comment: k.Comments} + if err := setConstraints(addedKey, k.Constraints); err != nil { + return nil, err + } + return addedKey, nil +} + +func parseEd25519Key(req []byte) (*AddedKey, error) { + var k ed25519KeyMsg + if err := ssh.Unmarshal(req, &k); err != nil { + return nil, err + } + priv := ed25519.PrivateKey(k.Priv) + + addedKey := &AddedKey{PrivateKey: &priv, Comment: k.Comments} + if err := setConstraints(addedKey, k.Constraints); err != nil { + return nil, err + } + return addedKey, nil +} + +func parseDSAKey(req []byte) (*AddedKey, error) { + var k dsaKeyMsg + if err := ssh.Unmarshal(req, &k); err != nil { + return nil, err + } + priv := &dsa.PrivateKey{ + PublicKey: dsa.PublicKey{ + Parameters: dsa.Parameters{ + P: k.P, + Q: k.Q, + G: k.G, + }, + Y: k.Y, + }, + X: k.X, + } + + addedKey := &AddedKey{PrivateKey: priv, Comment: k.Comments} + if err := setConstraints(addedKey, k.Constraints); err != nil { + return nil, err + } + return addedKey, nil +} + +func unmarshalECDSA(curveName string, keyBytes []byte, privScalar *big.Int) (priv *ecdsa.PrivateKey, err error) { + priv = &ecdsa.PrivateKey{ + D: privScalar, + } + + switch curveName { + case "nistp256": + priv.Curve = elliptic.P256() + case "nistp384": + priv.Curve = elliptic.P384() + case "nistp521": + priv.Curve = elliptic.P521() + default: + return nil, fmt.Errorf("agent: unknown curve %q", curveName) + } + + priv.X, priv.Y = elliptic.Unmarshal(priv.Curve, keyBytes) + if priv.X == nil || priv.Y == nil { + return nil, errors.New("agent: point not on curve") + } + + return priv, nil +} + +func parseEd25519Cert(req []byte) (*AddedKey, error) { + var k ed25519CertMsg + if err := ssh.Unmarshal(req, &k); err != nil { + return nil, err + } + pubKey, err := ssh.ParsePublicKey(k.CertBytes) + if err != nil { + return nil, err + } + priv := ed25519.PrivateKey(k.Priv) + cert, ok := pubKey.(*ssh.Certificate) + if !ok { + return nil, errors.New("agent: bad ED25519 certificate") + } + + addedKey := &AddedKey{PrivateKey: &priv, Certificate: cert, Comment: k.Comments} + if err := setConstraints(addedKey, k.Constraints); err != nil { + return nil, err + } + return addedKey, nil +} + +func parseECDSAKey(req []byte) (*AddedKey, error) { + var k ecdsaKeyMsg + if err := ssh.Unmarshal(req, &k); err != nil { + return nil, err + } + + priv, err := unmarshalECDSA(k.Curve, k.KeyBytes, k.D) + if err != nil { + return nil, err + } + + addedKey := &AddedKey{PrivateKey: priv, Comment: k.Comments} + if err := setConstraints(addedKey, k.Constraints); err != nil { + return nil, err + } + return addedKey, nil +} + +func parseRSACert(req []byte) (*AddedKey, error) { + var k rsaCertMsg + if err := ssh.Unmarshal(req, &k); err != nil { + return nil, err + } + + pubKey, err := ssh.ParsePublicKey(k.CertBytes) + if err != nil { + return nil, err + } + + cert, ok := pubKey.(*ssh.Certificate) + if !ok { + return nil, errors.New("agent: bad RSA certificate") + } + + // An RSA publickey as marshaled by rsaPublicKey.Marshal() in keys.go + var rsaPub struct { + Name string + E *big.Int + N *big.Int + } + if err := ssh.Unmarshal(cert.Key.Marshal(), &rsaPub); err != nil { + return nil, fmt.Errorf("agent: Unmarshal failed to parse public key: %v", err) + } + + if rsaPub.E.BitLen() > 30 { + return nil, errors.New("agent: RSA public exponent too large") + } + + priv := rsa.PrivateKey{ + PublicKey: rsa.PublicKey{ + E: int(rsaPub.E.Int64()), + N: rsaPub.N, + }, + D: k.D, + Primes: []*big.Int{k.Q, k.P}, + } + priv.Precompute() + + addedKey := &AddedKey{PrivateKey: &priv, Certificate: cert, Comment: k.Comments} + if err := setConstraints(addedKey, k.Constraints); err != nil { + return nil, err + } + return addedKey, nil +} + +func parseDSACert(req []byte) (*AddedKey, error) { + var k dsaCertMsg + if err := ssh.Unmarshal(req, &k); err != nil { + return nil, err + } + pubKey, err := ssh.ParsePublicKey(k.CertBytes) + if err != nil { + return nil, err + } + cert, ok := pubKey.(*ssh.Certificate) + if !ok { + return nil, errors.New("agent: bad DSA certificate") + } + + // A DSA publickey as marshaled by dsaPublicKey.Marshal() in keys.go + var w struct { + Name string + P, Q, G, Y *big.Int + } + if err := ssh.Unmarshal(cert.Key.Marshal(), &w); err != nil { + return nil, fmt.Errorf("agent: Unmarshal failed to parse public key: %v", err) + } + + priv := &dsa.PrivateKey{ + PublicKey: dsa.PublicKey{ + Parameters: dsa.Parameters{ + P: w.P, + Q: w.Q, + G: w.G, + }, + Y: w.Y, + }, + X: k.X, + } + + addedKey := &AddedKey{PrivateKey: priv, Certificate: cert, Comment: k.Comments} + if err := setConstraints(addedKey, k.Constraints); err != nil { + return nil, err + } + return addedKey, nil +} + +func parseECDSACert(req []byte) (*AddedKey, error) { + var k ecdsaCertMsg + if err := ssh.Unmarshal(req, &k); err != nil { + return nil, err + } + + pubKey, err := ssh.ParsePublicKey(k.CertBytes) + if err != nil { + return nil, err + } + cert, ok := pubKey.(*ssh.Certificate) + if !ok { + return nil, errors.New("agent: bad ECDSA certificate") + } + + // An ECDSA publickey as marshaled by ecdsaPublicKey.Marshal() in keys.go + var ecdsaPub struct { + Name string + ID string + Key []byte + } + if err := ssh.Unmarshal(cert.Key.Marshal(), &ecdsaPub); err != nil { + return nil, err + } + + priv, err := unmarshalECDSA(ecdsaPub.ID, ecdsaPub.Key, k.D) + if err != nil { + return nil, err + } + + addedKey := &AddedKey{PrivateKey: priv, Certificate: cert, Comment: k.Comments} + if err := setConstraints(addedKey, k.Constraints); err != nil { + return nil, err + } + return addedKey, nil +} + +func (s *server) insertIdentity(req []byte) error { + var record struct { + Type string `sshtype:"17|25"` + Rest []byte `ssh:"rest"` + } + + if err := ssh.Unmarshal(req, &record); err != nil { + return err + } + + var addedKey *AddedKey + var err error + + switch record.Type { + case ssh.KeyAlgoRSA: + addedKey, err = parseRSAKey(req) + case ssh.KeyAlgoDSA: + addedKey, err = parseDSAKey(req) + case ssh.KeyAlgoECDSA256, ssh.KeyAlgoECDSA384, ssh.KeyAlgoECDSA521: + addedKey, err = parseECDSAKey(req) + case ssh.KeyAlgoED25519: + addedKey, err = parseEd25519Key(req) + case ssh.CertAlgoRSAv01: + addedKey, err = parseRSACert(req) + case ssh.CertAlgoDSAv01: + addedKey, err = parseDSACert(req) + case ssh.CertAlgoECDSA256v01, ssh.CertAlgoECDSA384v01, ssh.CertAlgoECDSA521v01: + addedKey, err = parseECDSACert(req) + case ssh.CertAlgoED25519v01: + addedKey, err = parseEd25519Cert(req) + default: + return fmt.Errorf("agent: not implemented: %q", record.Type) + } + + if err != nil { + return err + } + return s.agent.Add(*addedKey) +} + +// ServeAgent serves the agent protocol on the given connection. It +// returns when an I/O error occurs. +func ServeAgent(agent Agent, c io.ReadWriter) error { + s := &server{agent} + + var length [4]byte + for { + if _, err := io.ReadFull(c, length[:]); err != nil { + return err + } + l := binary.BigEndian.Uint32(length[:]) + if l == 0 { + return fmt.Errorf("agent: request size is 0") + } + if l > maxAgentResponseBytes { + // We also cap requests. + return fmt.Errorf("agent: request too large: %d", l) + } + + req := make([]byte, l) + if _, err := io.ReadFull(c, req); err != nil { + return err + } + + repData := s.processRequestBytes(req) + if len(repData) > maxAgentResponseBytes { + return fmt.Errorf("agent: reply too large: %d bytes", len(repData)) + } + + binary.BigEndian.PutUint32(length[:], uint32(len(repData))) + if _, err := c.Write(length[:]); err != nil { + return err + } + if _, err := c.Write(repData); err != nil { + return err + } + } +} diff --git a/vendor/golang.org/x/crypto/ssh/buffer.go b/vendor/golang.org/x/crypto/ssh/buffer.go new file mode 100644 index 0000000000..1ab07d078d --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/buffer.go @@ -0,0 +1,97 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "io" + "sync" +) + +// buffer provides a linked list buffer for data exchange +// between producer and consumer. Theoretically the buffer is +// of unlimited capacity as it does no allocation of its own. +type buffer struct { + // protects concurrent access to head, tail and closed + *sync.Cond + + head *element // the buffer that will be read first + tail *element // the buffer that will be read last + + closed bool +} + +// An element represents a single link in a linked list. +type element struct { + buf []byte + next *element +} + +// newBuffer returns an empty buffer that is not closed. +func newBuffer() *buffer { + e := new(element) + b := &buffer{ + Cond: newCond(), + head: e, + tail: e, + } + return b +} + +// write makes buf available for Read to receive. +// buf must not be modified after the call to write. +func (b *buffer) write(buf []byte) { + b.Cond.L.Lock() + e := &element{buf: buf} + b.tail.next = e + b.tail = e + b.Cond.Signal() + b.Cond.L.Unlock() +} + +// eof closes the buffer. Reads from the buffer once all +// the data has been consumed will receive io.EOF. +func (b *buffer) eof() { + b.Cond.L.Lock() + b.closed = true + b.Cond.Signal() + b.Cond.L.Unlock() +} + +// Read reads data from the internal buffer in buf. Reads will block +// if no data is available, or until the buffer is closed. +func (b *buffer) Read(buf []byte) (n int, err error) { + b.Cond.L.Lock() + defer b.Cond.L.Unlock() + + for len(buf) > 0 { + // if there is data in b.head, copy it + if len(b.head.buf) > 0 { + r := copy(buf, b.head.buf) + buf, b.head.buf = buf[r:], b.head.buf[r:] + n += r + continue + } + // if there is a next buffer, make it the head + if len(b.head.buf) == 0 && b.head != b.tail { + b.head = b.head.next + continue + } + + // if at least one byte has been copied, return + if n > 0 { + break + } + + // if nothing was read, and there is nothing outstanding + // check to see if the buffer is closed. + if b.closed { + err = io.EOF + break + } + // out of buffers, wait for producer + b.Cond.Wait() + } + return +} diff --git a/vendor/golang.org/x/crypto/ssh/certs.go b/vendor/golang.org/x/crypto/ssh/certs.go new file mode 100644 index 0000000000..6605bf6449 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/certs.go @@ -0,0 +1,566 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "errors" + "fmt" + "io" + "net" + "sort" + "time" +) + +// These constants from [PROTOCOL.certkeys] represent the key algorithm names +// for certificate types supported by this package. +const ( + CertAlgoRSAv01 = "ssh-rsa-cert-v01@openssh.com" + CertAlgoDSAv01 = "ssh-dss-cert-v01@openssh.com" + CertAlgoECDSA256v01 = "ecdsa-sha2-nistp256-cert-v01@openssh.com" + CertAlgoECDSA384v01 = "ecdsa-sha2-nistp384-cert-v01@openssh.com" + CertAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com" + CertAlgoSKECDSA256v01 = "sk-ecdsa-sha2-nistp256-cert-v01@openssh.com" + CertAlgoED25519v01 = "ssh-ed25519-cert-v01@openssh.com" + CertAlgoSKED25519v01 = "sk-ssh-ed25519-cert-v01@openssh.com" +) + +// These constants from [PROTOCOL.certkeys] represent additional signature +// algorithm names for certificate types supported by this package. +const ( + CertSigAlgoRSAv01 = "ssh-rsa-cert-v01@openssh.com" + CertSigAlgoRSASHA2256v01 = "rsa-sha2-256-cert-v01@openssh.com" + CertSigAlgoRSASHA2512v01 = "rsa-sha2-512-cert-v01@openssh.com" +) + +// Certificate types distinguish between host and user +// certificates. The values can be set in the CertType field of +// Certificate. +const ( + UserCert = 1 + HostCert = 2 +) + +// Signature represents a cryptographic signature. +type Signature struct { + Format string + Blob []byte + Rest []byte `ssh:"rest"` +} + +// CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that +// a certificate does not expire. +const CertTimeInfinity = 1<<64 - 1 + +// An Certificate represents an OpenSSH certificate as defined in +// [PROTOCOL.certkeys]?rev=1.8. The Certificate type implements the +// PublicKey interface, so it can be unmarshaled using +// ParsePublicKey. +type Certificate struct { + Nonce []byte + Key PublicKey + Serial uint64 + CertType uint32 + KeyId string + ValidPrincipals []string + ValidAfter uint64 + ValidBefore uint64 + Permissions + Reserved []byte + SignatureKey PublicKey + Signature *Signature +} + +// genericCertData holds the key-independent part of the certificate data. +// Overall, certificates contain an nonce, public key fields and +// key-independent fields. +type genericCertData struct { + Serial uint64 + CertType uint32 + KeyId string + ValidPrincipals []byte + ValidAfter uint64 + ValidBefore uint64 + CriticalOptions []byte + Extensions []byte + Reserved []byte + SignatureKey []byte + Signature []byte +} + +func marshalStringList(namelist []string) []byte { + var to []byte + for _, name := range namelist { + s := struct{ N string }{name} + to = append(to, Marshal(&s)...) + } + return to +} + +type optionsTuple struct { + Key string + Value []byte +} + +type optionsTupleValue struct { + Value string +} + +// serialize a map of critical options or extensions +// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation, +// we need two length prefixes for a non-empty string value +func marshalTuples(tups map[string]string) []byte { + keys := make([]string, 0, len(tups)) + for key := range tups { + keys = append(keys, key) + } + sort.Strings(keys) + + var ret []byte + for _, key := range keys { + s := optionsTuple{Key: key} + if value := tups[key]; len(value) > 0 { + s.Value = Marshal(&optionsTupleValue{value}) + } + ret = append(ret, Marshal(&s)...) + } + return ret +} + +// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation, +// we need two length prefixes for a non-empty option value +func parseTuples(in []byte) (map[string]string, error) { + tups := map[string]string{} + var lastKey string + var haveLastKey bool + + for len(in) > 0 { + var key, val, extra []byte + var ok bool + + if key, in, ok = parseString(in); !ok { + return nil, errShortRead + } + keyStr := string(key) + // according to [PROTOCOL.certkeys], the names must be in + // lexical order. + if haveLastKey && keyStr <= lastKey { + return nil, fmt.Errorf("ssh: certificate options are not in lexical order") + } + lastKey, haveLastKey = keyStr, true + // the next field is a data field, which if non-empty has a string embedded + if val, in, ok = parseString(in); !ok { + return nil, errShortRead + } + if len(val) > 0 { + val, extra, ok = parseString(val) + if !ok { + return nil, errShortRead + } + if len(extra) > 0 { + return nil, fmt.Errorf("ssh: unexpected trailing data after certificate option value") + } + tups[keyStr] = string(val) + } else { + tups[keyStr] = "" + } + } + return tups, nil +} + +func parseCert(in []byte, privAlgo string) (*Certificate, error) { + nonce, rest, ok := parseString(in) + if !ok { + return nil, errShortRead + } + + key, rest, err := parsePubKey(rest, privAlgo) + if err != nil { + return nil, err + } + + var g genericCertData + if err := Unmarshal(rest, &g); err != nil { + return nil, err + } + + c := &Certificate{ + Nonce: nonce, + Key: key, + Serial: g.Serial, + CertType: g.CertType, + KeyId: g.KeyId, + ValidAfter: g.ValidAfter, + ValidBefore: g.ValidBefore, + } + + for principals := g.ValidPrincipals; len(principals) > 0; { + principal, rest, ok := parseString(principals) + if !ok { + return nil, errShortRead + } + c.ValidPrincipals = append(c.ValidPrincipals, string(principal)) + principals = rest + } + + c.CriticalOptions, err = parseTuples(g.CriticalOptions) + if err != nil { + return nil, err + } + c.Extensions, err = parseTuples(g.Extensions) + if err != nil { + return nil, err + } + c.Reserved = g.Reserved + k, err := ParsePublicKey(g.SignatureKey) + if err != nil { + return nil, err + } + + c.SignatureKey = k + c.Signature, rest, ok = parseSignatureBody(g.Signature) + if !ok || len(rest) > 0 { + return nil, errors.New("ssh: signature parse error") + } + + return c, nil +} + +type openSSHCertSigner struct { + pub *Certificate + signer Signer +} + +type algorithmOpenSSHCertSigner struct { + *openSSHCertSigner + algorithmSigner AlgorithmSigner +} + +// NewCertSigner returns a Signer that signs with the given Certificate, whose +// private key is held by signer. It returns an error if the public key in cert +// doesn't match the key used by signer. +func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { + if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 { + return nil, errors.New("ssh: signer and cert have different public key") + } + + if algorithmSigner, ok := signer.(AlgorithmSigner); ok { + return &algorithmOpenSSHCertSigner{ + &openSSHCertSigner{cert, signer}, algorithmSigner}, nil + } else { + return &openSSHCertSigner{cert, signer}, nil + } +} + +func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { + return s.signer.Sign(rand, data) +} + +func (s *openSSHCertSigner) PublicKey() PublicKey { + return s.pub +} + +func (s *algorithmOpenSSHCertSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { + return s.algorithmSigner.SignWithAlgorithm(rand, data, algorithm) +} + +const sourceAddressCriticalOption = "source-address" + +// CertChecker does the work of verifying a certificate. Its methods +// can be plugged into ClientConfig.HostKeyCallback and +// ServerConfig.PublicKeyCallback. For the CertChecker to work, +// minimally, the IsAuthority callback should be set. +type CertChecker struct { + // SupportedCriticalOptions lists the CriticalOptions that the + // server application layer understands. These are only used + // for user certificates. + SupportedCriticalOptions []string + + // IsUserAuthority should return true if the key is recognized as an + // authority for the given user certificate. This allows for + // certificates to be signed by other certificates. This must be set + // if this CertChecker will be checking user certificates. + IsUserAuthority func(auth PublicKey) bool + + // IsHostAuthority should report whether the key is recognized as + // an authority for this host. This allows for certificates to be + // signed by other keys, and for those other keys to only be valid + // signers for particular hostnames. This must be set if this + // CertChecker will be checking host certificates. + IsHostAuthority func(auth PublicKey, address string) bool + + // Clock is used for verifying time stamps. If nil, time.Now + // is used. + Clock func() time.Time + + // UserKeyFallback is called when CertChecker.Authenticate encounters a + // public key that is not a certificate. It must implement validation + // of user keys or else, if nil, all such keys are rejected. + UserKeyFallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) + + // HostKeyFallback is called when CertChecker.CheckHostKey encounters a + // public key that is not a certificate. It must implement host key + // validation or else, if nil, all such keys are rejected. + HostKeyFallback HostKeyCallback + + // IsRevoked is called for each certificate so that revocation checking + // can be implemented. It should return true if the given certificate + // is revoked and false otherwise. If nil, no certificates are + // considered to have been revoked. + IsRevoked func(cert *Certificate) bool +} + +// CheckHostKey checks a host key certificate. This method can be +// plugged into ClientConfig.HostKeyCallback. +func (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) error { + cert, ok := key.(*Certificate) + if !ok { + if c.HostKeyFallback != nil { + return c.HostKeyFallback(addr, remote, key) + } + return errors.New("ssh: non-certificate host key") + } + if cert.CertType != HostCert { + return fmt.Errorf("ssh: certificate presented as a host key has type %d", cert.CertType) + } + if !c.IsHostAuthority(cert.SignatureKey, addr) { + return fmt.Errorf("ssh: no authorities for hostname: %v", addr) + } + + hostname, _, err := net.SplitHostPort(addr) + if err != nil { + return err + } + + // Pass hostname only as principal for host certificates (consistent with OpenSSH) + return c.CheckCert(hostname, cert) +} + +// Authenticate checks a user certificate. Authenticate can be used as +// a value for ServerConfig.PublicKeyCallback. +func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permissions, error) { + cert, ok := pubKey.(*Certificate) + if !ok { + if c.UserKeyFallback != nil { + return c.UserKeyFallback(conn, pubKey) + } + return nil, errors.New("ssh: normal key pairs not accepted") + } + + if cert.CertType != UserCert { + return nil, fmt.Errorf("ssh: cert has type %d", cert.CertType) + } + if !c.IsUserAuthority(cert.SignatureKey) { + return nil, fmt.Errorf("ssh: certificate signed by unrecognized authority") + } + + if err := c.CheckCert(conn.User(), cert); err != nil { + return nil, err + } + + return &cert.Permissions, nil +} + +// CheckCert checks CriticalOptions, ValidPrincipals, revocation, timestamp and +// the signature of the certificate. +func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { + if c.IsRevoked != nil && c.IsRevoked(cert) { + return fmt.Errorf("ssh: certificate serial %d revoked", cert.Serial) + } + + for opt := range cert.CriticalOptions { + // sourceAddressCriticalOption will be enforced by + // serverAuthenticate + if opt == sourceAddressCriticalOption { + continue + } + + found := false + for _, supp := range c.SupportedCriticalOptions { + if supp == opt { + found = true + break + } + } + if !found { + return fmt.Errorf("ssh: unsupported critical option %q in certificate", opt) + } + } + + if len(cert.ValidPrincipals) > 0 { + // By default, certs are valid for all users/hosts. + found := false + for _, p := range cert.ValidPrincipals { + if p == principal { + found = true + break + } + } + if !found { + return fmt.Errorf("ssh: principal %q not in the set of valid principals for given certificate: %q", principal, cert.ValidPrincipals) + } + } + + clock := c.Clock + if clock == nil { + clock = time.Now + } + + unixNow := clock().Unix() + if after := int64(cert.ValidAfter); after < 0 || unixNow < int64(cert.ValidAfter) { + return fmt.Errorf("ssh: cert is not yet valid") + } + if before := int64(cert.ValidBefore); cert.ValidBefore != uint64(CertTimeInfinity) && (unixNow >= before || before < 0) { + return fmt.Errorf("ssh: cert has expired") + } + if err := cert.SignatureKey.Verify(cert.bytesForSigning(), cert.Signature); err != nil { + return fmt.Errorf("ssh: certificate signature does not verify") + } + + return nil +} + +// SignCert signs the certificate with an authority, setting the Nonce, +// SignatureKey, and Signature fields. +func (c *Certificate) SignCert(rand io.Reader, authority Signer) error { + c.Nonce = make([]byte, 32) + if _, err := io.ReadFull(rand, c.Nonce); err != nil { + return err + } + c.SignatureKey = authority.PublicKey() + + if v, ok := authority.(AlgorithmSigner); ok { + if v.PublicKey().Type() == KeyAlgoRSA { + authority = &rsaSigner{v, SigAlgoRSASHA2512} + } + } + + sig, err := authority.Sign(rand, c.bytesForSigning()) + if err != nil { + return err + } + c.Signature = sig + return nil +} + +// certAlgoNames includes a mapping from signature algorithms to the +// corresponding certificate signature algorithm. When a key type (such +// as ED25516) is associated with only one algorithm, the KeyAlgo +// constant is used instead of the SigAlgo. +var certAlgoNames = map[string]string{ + SigAlgoRSA: CertSigAlgoRSAv01, + SigAlgoRSASHA2256: CertSigAlgoRSASHA2256v01, + SigAlgoRSASHA2512: CertSigAlgoRSASHA2512v01, + KeyAlgoDSA: CertAlgoDSAv01, + KeyAlgoECDSA256: CertAlgoECDSA256v01, + KeyAlgoECDSA384: CertAlgoECDSA384v01, + KeyAlgoECDSA521: CertAlgoECDSA521v01, + KeyAlgoSKECDSA256: CertAlgoSKECDSA256v01, + KeyAlgoED25519: CertAlgoED25519v01, + KeyAlgoSKED25519: CertAlgoSKED25519v01, +} + +// certToPrivAlgo returns the underlying algorithm for a certificate algorithm. +// Panics if a non-certificate algorithm is passed. +func certToPrivAlgo(algo string) string { + for privAlgo, pubAlgo := range certAlgoNames { + if pubAlgo == algo { + return privAlgo + } + } + panic("unknown cert algorithm") +} + +func (cert *Certificate) bytesForSigning() []byte { + c2 := *cert + c2.Signature = nil + out := c2.Marshal() + // Drop trailing signature length. + return out[:len(out)-4] +} + +// Marshal serializes c into OpenSSH's wire format. It is part of the +// PublicKey interface. +func (c *Certificate) Marshal() []byte { + generic := genericCertData{ + Serial: c.Serial, + CertType: c.CertType, + KeyId: c.KeyId, + ValidPrincipals: marshalStringList(c.ValidPrincipals), + ValidAfter: uint64(c.ValidAfter), + ValidBefore: uint64(c.ValidBefore), + CriticalOptions: marshalTuples(c.CriticalOptions), + Extensions: marshalTuples(c.Extensions), + Reserved: c.Reserved, + SignatureKey: c.SignatureKey.Marshal(), + } + if c.Signature != nil { + generic.Signature = Marshal(c.Signature) + } + genericBytes := Marshal(&generic) + keyBytes := c.Key.Marshal() + _, keyBytes, _ = parseString(keyBytes) + prefix := Marshal(&struct { + Name string + Nonce []byte + Key []byte `ssh:"rest"` + }{c.Type(), c.Nonce, keyBytes}) + + result := make([]byte, 0, len(prefix)+len(genericBytes)) + result = append(result, prefix...) + result = append(result, genericBytes...) + return result +} + +// Type returns the key name. It is part of the PublicKey interface. +func (c *Certificate) Type() string { + algo, ok := certAlgoNames[c.Key.Type()] + if !ok { + panic("unknown cert key type " + c.Key.Type()) + } + return algo +} + +// Verify verifies a signature against the certificate's public +// key. It is part of the PublicKey interface. +func (c *Certificate) Verify(data []byte, sig *Signature) error { + return c.Key.Verify(data, sig) +} + +func parseSignatureBody(in []byte) (out *Signature, rest []byte, ok bool) { + format, in, ok := parseString(in) + if !ok { + return + } + + out = &Signature{ + Format: string(format), + } + + if out.Blob, in, ok = parseString(in); !ok { + return + } + + switch out.Format { + case KeyAlgoSKECDSA256, CertAlgoSKECDSA256v01, KeyAlgoSKED25519, CertAlgoSKED25519v01: + out.Rest = in + return out, nil, ok + } + + return out, in, ok +} + +func parseSignature(in []byte) (out *Signature, rest []byte, ok bool) { + sigBytes, rest, ok := parseString(in) + if !ok { + return + } + + out, trailing, ok := parseSignatureBody(sigBytes) + if !ok || len(trailing) > 0 { + return nil, nil, false + } + return +} diff --git a/vendor/golang.org/x/crypto/ssh/channel.go b/vendor/golang.org/x/crypto/ssh/channel.go new file mode 100644 index 0000000000..c0834c00df --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/channel.go @@ -0,0 +1,633 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "log" + "sync" +) + +const ( + minPacketLength = 9 + // channelMaxPacket contains the maximum number of bytes that will be + // sent in a single packet. As per RFC 4253, section 6.1, 32k is also + // the minimum. + channelMaxPacket = 1 << 15 + // We follow OpenSSH here. + channelWindowSize = 64 * channelMaxPacket +) + +// NewChannel represents an incoming request to a channel. It must either be +// accepted for use by calling Accept, or rejected by calling Reject. +type NewChannel interface { + // Accept accepts the channel creation request. It returns the Channel + // and a Go channel containing SSH requests. The Go channel must be + // serviced otherwise the Channel will hang. + Accept() (Channel, <-chan *Request, error) + + // Reject rejects the channel creation request. After calling + // this, no other methods on the Channel may be called. + Reject(reason RejectionReason, message string) error + + // ChannelType returns the type of the channel, as supplied by the + // client. + ChannelType() string + + // ExtraData returns the arbitrary payload for this channel, as supplied + // by the client. This data is specific to the channel type. + ExtraData() []byte +} + +// A Channel is an ordered, reliable, flow-controlled, duplex stream +// that is multiplexed over an SSH connection. +type Channel interface { + // Read reads up to len(data) bytes from the channel. + Read(data []byte) (int, error) + + // Write writes len(data) bytes to the channel. + Write(data []byte) (int, error) + + // Close signals end of channel use. No data may be sent after this + // call. + Close() error + + // CloseWrite signals the end of sending in-band + // data. Requests may still be sent, and the other side may + // still send data + CloseWrite() error + + // SendRequest sends a channel request. If wantReply is true, + // it will wait for a reply and return the result as a + // boolean, otherwise the return value will be false. Channel + // requests are out-of-band messages so they may be sent even + // if the data stream is closed or blocked by flow control. + // If the channel is closed before a reply is returned, io.EOF + // is returned. + SendRequest(name string, wantReply bool, payload []byte) (bool, error) + + // Stderr returns an io.ReadWriter that writes to this channel + // with the extended data type set to stderr. Stderr may + // safely be read and written from a different goroutine than + // Read and Write respectively. + Stderr() io.ReadWriter +} + +// Request is a request sent outside of the normal stream of +// data. Requests can either be specific to an SSH channel, or they +// can be global. +type Request struct { + Type string + WantReply bool + Payload []byte + + ch *channel + mux *mux +} + +// Reply sends a response to a request. It must be called for all requests +// where WantReply is true and is a no-op otherwise. The payload argument is +// ignored for replies to channel-specific requests. +func (r *Request) Reply(ok bool, payload []byte) error { + if !r.WantReply { + return nil + } + + if r.ch == nil { + return r.mux.ackRequest(ok, payload) + } + + return r.ch.ackRequest(ok) +} + +// RejectionReason is an enumeration used when rejecting channel creation +// requests. See RFC 4254, section 5.1. +type RejectionReason uint32 + +const ( + Prohibited RejectionReason = iota + 1 + ConnectionFailed + UnknownChannelType + ResourceShortage +) + +// String converts the rejection reason to human readable form. +func (r RejectionReason) String() string { + switch r { + case Prohibited: + return "administratively prohibited" + case ConnectionFailed: + return "connect failed" + case UnknownChannelType: + return "unknown channel type" + case ResourceShortage: + return "resource shortage" + } + return fmt.Sprintf("unknown reason %d", int(r)) +} + +func min(a uint32, b int) uint32 { + if a < uint32(b) { + return a + } + return uint32(b) +} + +type channelDirection uint8 + +const ( + channelInbound channelDirection = iota + channelOutbound +) + +// channel is an implementation of the Channel interface that works +// with the mux class. +type channel struct { + // R/O after creation + chanType string + extraData []byte + localId, remoteId uint32 + + // maxIncomingPayload and maxRemotePayload are the maximum + // payload sizes of normal and extended data packets for + // receiving and sending, respectively. The wire packet will + // be 9 or 13 bytes larger (excluding encryption overhead). + maxIncomingPayload uint32 + maxRemotePayload uint32 + + mux *mux + + // decided is set to true if an accept or reject message has been sent + // (for outbound channels) or received (for inbound channels). + decided bool + + // direction contains either channelOutbound, for channels created + // locally, or channelInbound, for channels created by the peer. + direction channelDirection + + // Pending internal channel messages. + msg chan interface{} + + // Since requests have no ID, there can be only one request + // with WantReply=true outstanding. This lock is held by a + // goroutine that has such an outgoing request pending. + sentRequestMu sync.Mutex + + incomingRequests chan *Request + + sentEOF bool + + // thread-safe data + remoteWin window + pending *buffer + extPending *buffer + + // windowMu protects myWindow, the flow-control window. + windowMu sync.Mutex + myWindow uint32 + + // writeMu serializes calls to mux.conn.writePacket() and + // protects sentClose and packetPool. This mutex must be + // different from windowMu, as writePacket can block if there + // is a key exchange pending. + writeMu sync.Mutex + sentClose bool + + // packetPool has a buffer for each extended channel ID to + // save allocations during writes. + packetPool map[uint32][]byte +} + +// writePacket sends a packet. If the packet is a channel close, it updates +// sentClose. This method takes the lock c.writeMu. +func (ch *channel) writePacket(packet []byte) error { + ch.writeMu.Lock() + if ch.sentClose { + ch.writeMu.Unlock() + return io.EOF + } + ch.sentClose = (packet[0] == msgChannelClose) + err := ch.mux.conn.writePacket(packet) + ch.writeMu.Unlock() + return err +} + +func (ch *channel) sendMessage(msg interface{}) error { + if debugMux { + log.Printf("send(%d): %#v", ch.mux.chanList.offset, msg) + } + + p := Marshal(msg) + binary.BigEndian.PutUint32(p[1:], ch.remoteId) + return ch.writePacket(p) +} + +// WriteExtended writes data to a specific extended stream. These streams are +// used, for example, for stderr. +func (ch *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { + if ch.sentEOF { + return 0, io.EOF + } + // 1 byte message type, 4 bytes remoteId, 4 bytes data length + opCode := byte(msgChannelData) + headerLength := uint32(9) + if extendedCode > 0 { + headerLength += 4 + opCode = msgChannelExtendedData + } + + ch.writeMu.Lock() + packet := ch.packetPool[extendedCode] + // We don't remove the buffer from packetPool, so + // WriteExtended calls from different goroutines will be + // flagged as errors by the race detector. + ch.writeMu.Unlock() + + for len(data) > 0 { + space := min(ch.maxRemotePayload, len(data)) + if space, err = ch.remoteWin.reserve(space); err != nil { + return n, err + } + if want := headerLength + space; uint32(cap(packet)) < want { + packet = make([]byte, want) + } else { + packet = packet[:want] + } + + todo := data[:space] + + packet[0] = opCode + binary.BigEndian.PutUint32(packet[1:], ch.remoteId) + if extendedCode > 0 { + binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode)) + } + binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo))) + copy(packet[headerLength:], todo) + if err = ch.writePacket(packet); err != nil { + return n, err + } + + n += len(todo) + data = data[len(todo):] + } + + ch.writeMu.Lock() + ch.packetPool[extendedCode] = packet + ch.writeMu.Unlock() + + return n, err +} + +func (ch *channel) handleData(packet []byte) error { + headerLen := 9 + isExtendedData := packet[0] == msgChannelExtendedData + if isExtendedData { + headerLen = 13 + } + if len(packet) < headerLen { + // malformed data packet + return parseError(packet[0]) + } + + var extended uint32 + if isExtendedData { + extended = binary.BigEndian.Uint32(packet[5:]) + } + + length := binary.BigEndian.Uint32(packet[headerLen-4 : headerLen]) + if length == 0 { + return nil + } + if length > ch.maxIncomingPayload { + // TODO(hanwen): should send Disconnect? + return errors.New("ssh: incoming packet exceeds maximum payload size") + } + + data := packet[headerLen:] + if length != uint32(len(data)) { + return errors.New("ssh: wrong packet length") + } + + ch.windowMu.Lock() + if ch.myWindow < length { + ch.windowMu.Unlock() + // TODO(hanwen): should send Disconnect with reason? + return errors.New("ssh: remote side wrote too much") + } + ch.myWindow -= length + ch.windowMu.Unlock() + + if extended == 1 { + ch.extPending.write(data) + } else if extended > 0 { + // discard other extended data. + } else { + ch.pending.write(data) + } + return nil +} + +func (c *channel) adjustWindow(n uint32) error { + c.windowMu.Lock() + // Since myWindow is managed on our side, and can never exceed + // the initial window setting, we don't worry about overflow. + c.myWindow += uint32(n) + c.windowMu.Unlock() + return c.sendMessage(windowAdjustMsg{ + AdditionalBytes: uint32(n), + }) +} + +func (c *channel) ReadExtended(data []byte, extended uint32) (n int, err error) { + switch extended { + case 1: + n, err = c.extPending.Read(data) + case 0: + n, err = c.pending.Read(data) + default: + return 0, fmt.Errorf("ssh: extended code %d unimplemented", extended) + } + + if n > 0 { + err = c.adjustWindow(uint32(n)) + // sendWindowAdjust can return io.EOF if the remote + // peer has closed the connection, however we want to + // defer forwarding io.EOF to the caller of Read until + // the buffer has been drained. + if n > 0 && err == io.EOF { + err = nil + } + } + + return n, err +} + +func (c *channel) close() { + c.pending.eof() + c.extPending.eof() + close(c.msg) + close(c.incomingRequests) + c.writeMu.Lock() + // This is not necessary for a normal channel teardown, but if + // there was another error, it is. + c.sentClose = true + c.writeMu.Unlock() + // Unblock writers. + c.remoteWin.close() +} + +// responseMessageReceived is called when a success or failure message is +// received on a channel to check that such a message is reasonable for the +// given channel. +func (ch *channel) responseMessageReceived() error { + if ch.direction == channelInbound { + return errors.New("ssh: channel response message received on inbound channel") + } + if ch.decided { + return errors.New("ssh: duplicate response received for channel") + } + ch.decided = true + return nil +} + +func (ch *channel) handlePacket(packet []byte) error { + switch packet[0] { + case msgChannelData, msgChannelExtendedData: + return ch.handleData(packet) + case msgChannelClose: + ch.sendMessage(channelCloseMsg{PeersID: ch.remoteId}) + ch.mux.chanList.remove(ch.localId) + ch.close() + return nil + case msgChannelEOF: + // RFC 4254 is mute on how EOF affects dataExt messages but + // it is logical to signal EOF at the same time. + ch.extPending.eof() + ch.pending.eof() + return nil + } + + decoded, err := decode(packet) + if err != nil { + return err + } + + switch msg := decoded.(type) { + case *channelOpenFailureMsg: + if err := ch.responseMessageReceived(); err != nil { + return err + } + ch.mux.chanList.remove(msg.PeersID) + ch.msg <- msg + case *channelOpenConfirmMsg: + if err := ch.responseMessageReceived(); err != nil { + return err + } + if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { + return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize) + } + ch.remoteId = msg.MyID + ch.maxRemotePayload = msg.MaxPacketSize + ch.remoteWin.add(msg.MyWindow) + ch.msg <- msg + case *windowAdjustMsg: + if !ch.remoteWin.add(msg.AdditionalBytes) { + return fmt.Errorf("ssh: invalid window update for %d bytes", msg.AdditionalBytes) + } + case *channelRequestMsg: + req := Request{ + Type: msg.Request, + WantReply: msg.WantReply, + Payload: msg.RequestSpecificData, + ch: ch, + } + + ch.incomingRequests <- &req + default: + ch.msg <- msg + } + return nil +} + +func (m *mux) newChannel(chanType string, direction channelDirection, extraData []byte) *channel { + ch := &channel{ + remoteWin: window{Cond: newCond()}, + myWindow: channelWindowSize, + pending: newBuffer(), + extPending: newBuffer(), + direction: direction, + incomingRequests: make(chan *Request, chanSize), + msg: make(chan interface{}, chanSize), + chanType: chanType, + extraData: extraData, + mux: m, + packetPool: make(map[uint32][]byte), + } + ch.localId = m.chanList.add(ch) + return ch +} + +var errUndecided = errors.New("ssh: must Accept or Reject channel") +var errDecidedAlready = errors.New("ssh: can call Accept or Reject only once") + +type extChannel struct { + code uint32 + ch *channel +} + +func (e *extChannel) Write(data []byte) (n int, err error) { + return e.ch.WriteExtended(data, e.code) +} + +func (e *extChannel) Read(data []byte) (n int, err error) { + return e.ch.ReadExtended(data, e.code) +} + +func (ch *channel) Accept() (Channel, <-chan *Request, error) { + if ch.decided { + return nil, nil, errDecidedAlready + } + ch.maxIncomingPayload = channelMaxPacket + confirm := channelOpenConfirmMsg{ + PeersID: ch.remoteId, + MyID: ch.localId, + MyWindow: ch.myWindow, + MaxPacketSize: ch.maxIncomingPayload, + } + ch.decided = true + if err := ch.sendMessage(confirm); err != nil { + return nil, nil, err + } + + return ch, ch.incomingRequests, nil +} + +func (ch *channel) Reject(reason RejectionReason, message string) error { + if ch.decided { + return errDecidedAlready + } + reject := channelOpenFailureMsg{ + PeersID: ch.remoteId, + Reason: reason, + Message: message, + Language: "en", + } + ch.decided = true + return ch.sendMessage(reject) +} + +func (ch *channel) Read(data []byte) (int, error) { + if !ch.decided { + return 0, errUndecided + } + return ch.ReadExtended(data, 0) +} + +func (ch *channel) Write(data []byte) (int, error) { + if !ch.decided { + return 0, errUndecided + } + return ch.WriteExtended(data, 0) +} + +func (ch *channel) CloseWrite() error { + if !ch.decided { + return errUndecided + } + ch.sentEOF = true + return ch.sendMessage(channelEOFMsg{ + PeersID: ch.remoteId}) +} + +func (ch *channel) Close() error { + if !ch.decided { + return errUndecided + } + + return ch.sendMessage(channelCloseMsg{ + PeersID: ch.remoteId}) +} + +// Extended returns an io.ReadWriter that sends and receives data on the given, +// SSH extended stream. Such streams are used, for example, for stderr. +func (ch *channel) Extended(code uint32) io.ReadWriter { + if !ch.decided { + return nil + } + return &extChannel{code, ch} +} + +func (ch *channel) Stderr() io.ReadWriter { + return ch.Extended(1) +} + +func (ch *channel) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { + if !ch.decided { + return false, errUndecided + } + + if wantReply { + ch.sentRequestMu.Lock() + defer ch.sentRequestMu.Unlock() + } + + msg := channelRequestMsg{ + PeersID: ch.remoteId, + Request: name, + WantReply: wantReply, + RequestSpecificData: payload, + } + + if err := ch.sendMessage(msg); err != nil { + return false, err + } + + if wantReply { + m, ok := (<-ch.msg) + if !ok { + return false, io.EOF + } + switch m.(type) { + case *channelRequestFailureMsg: + return false, nil + case *channelRequestSuccessMsg: + return true, nil + default: + return false, fmt.Errorf("ssh: unexpected response to channel request: %#v", m) + } + } + + return false, nil +} + +// ackRequest either sends an ack or nack to the channel request. +func (ch *channel) ackRequest(ok bool) error { + if !ch.decided { + return errUndecided + } + + var msg interface{} + if !ok { + msg = channelRequestFailureMsg{ + PeersID: ch.remoteId, + } + } else { + msg = channelRequestSuccessMsg{ + PeersID: ch.remoteId, + } + } + return ch.sendMessage(msg) +} + +func (ch *channel) ChannelType() string { + return ch.chanType +} + +func (ch *channel) ExtraData() []byte { + return ch.extraData +} diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go new file mode 100644 index 0000000000..f8bdf4984c --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/cipher.go @@ -0,0 +1,789 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/des" + "crypto/rc4" + "crypto/subtle" + "encoding/binary" + "errors" + "fmt" + "hash" + "io" + "io/ioutil" + + "golang.org/x/crypto/chacha20" + "golang.org/x/crypto/internal/poly1305" +) + +const ( + packetSizeMultiple = 16 // TODO(huin) this should be determined by the cipher. + + // RFC 4253 section 6.1 defines a minimum packet size of 32768 that implementations + // MUST be able to process (plus a few more kilobytes for padding and mac). The RFC + // indicates implementations SHOULD be able to handle larger packet sizes, but then + // waffles on about reasonable limits. + // + // OpenSSH caps their maxPacket at 256kB so we choose to do + // the same. maxPacket is also used to ensure that uint32 + // length fields do not overflow, so it should remain well + // below 4G. + maxPacket = 256 * 1024 +) + +// noneCipher implements cipher.Stream and provides no encryption. It is used +// by the transport before the first key-exchange. +type noneCipher struct{} + +func (c noneCipher) XORKeyStream(dst, src []byte) { + copy(dst, src) +} + +func newAESCTR(key, iv []byte) (cipher.Stream, error) { + c, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + return cipher.NewCTR(c, iv), nil +} + +func newRC4(key, iv []byte) (cipher.Stream, error) { + return rc4.NewCipher(key) +} + +type cipherMode struct { + keySize int + ivSize int + create func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) +} + +func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream, error)) func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + return func(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + stream, err := createFunc(key, iv) + if err != nil { + return nil, err + } + + var streamDump []byte + if skip > 0 { + streamDump = make([]byte, 512) + } + + for remainingToDump := skip; remainingToDump > 0; { + dumpThisTime := remainingToDump + if dumpThisTime > len(streamDump) { + dumpThisTime = len(streamDump) + } + stream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime]) + remainingToDump -= dumpThisTime + } + + mac := macModes[algs.MAC].new(macKey) + return &streamPacketCipher{ + mac: mac, + etm: macModes[algs.MAC].etm, + macResult: make([]byte, mac.Size()), + cipher: stream, + }, nil + } +} + +// cipherModes documents properties of supported ciphers. Ciphers not included +// are not supported and will not be negotiated, even if explicitly requested in +// ClientConfig.Crypto.Ciphers. +var cipherModes = map[string]*cipherMode{ + // Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms + // are defined in the order specified in the RFC. + "aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)}, + "aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)}, + "aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)}, + + // Ciphers from RFC4345, which introduces security-improved arcfour ciphers. + // They are defined in the order specified in the RFC. + "arcfour128": {16, 0, streamCipherMode(1536, newRC4)}, + "arcfour256": {32, 0, streamCipherMode(1536, newRC4)}, + + // Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol. + // Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and + // RC4) has problems with weak keys, and should be used with caution." + // RFC4345 introduces improved versions of Arcfour. + "arcfour": {16, 0, streamCipherMode(0, newRC4)}, + + // AEAD ciphers + gcmCipherID: {16, 12, newGCMCipher}, + chacha20Poly1305ID: {64, 0, newChaCha20Cipher}, + + // CBC mode is insecure and so is not included in the default config. + // (See https://www.ieee-security.org/TC/SP2013/papers/4977a526.pdf). If absolutely + // needed, it's possible to specify a custom Config to enable it. + // You should expect that an active attacker can recover plaintext if + // you do. + aes128cbcID: {16, aes.BlockSize, newAESCBCCipher}, + + // 3des-cbc is insecure and is not included in the default + // config. + tripledescbcID: {24, des.BlockSize, newTripleDESCBCCipher}, +} + +// prefixLen is the length of the packet prefix that contains the packet length +// and number of padding bytes. +const prefixLen = 5 + +// streamPacketCipher is a packetCipher using a stream cipher. +type streamPacketCipher struct { + mac hash.Hash + cipher cipher.Stream + etm bool + + // The following members are to avoid per-packet allocations. + prefix [prefixLen]byte + seqNumBytes [4]byte + padding [2 * packetSizeMultiple]byte + packetData []byte + macResult []byte +} + +// readCipherPacket reads and decrypt a single packet from the reader argument. +func (s *streamPacketCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) { + if _, err := io.ReadFull(r, s.prefix[:]); err != nil { + return nil, err + } + + var encryptedPaddingLength [1]byte + if s.mac != nil && s.etm { + copy(encryptedPaddingLength[:], s.prefix[4:5]) + s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) + } else { + s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) + } + + length := binary.BigEndian.Uint32(s.prefix[0:4]) + paddingLength := uint32(s.prefix[4]) + + var macSize uint32 + if s.mac != nil { + s.mac.Reset() + binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) + s.mac.Write(s.seqNumBytes[:]) + if s.etm { + s.mac.Write(s.prefix[:4]) + s.mac.Write(encryptedPaddingLength[:]) + } else { + s.mac.Write(s.prefix[:]) + } + macSize = uint32(s.mac.Size()) + } + + if length <= paddingLength+1 { + return nil, errors.New("ssh: invalid packet length, packet too small") + } + + if length > maxPacket { + return nil, errors.New("ssh: invalid packet length, packet too large") + } + + // the maxPacket check above ensures that length-1+macSize + // does not overflow. + if uint32(cap(s.packetData)) < length-1+macSize { + s.packetData = make([]byte, length-1+macSize) + } else { + s.packetData = s.packetData[:length-1+macSize] + } + + if _, err := io.ReadFull(r, s.packetData); err != nil { + return nil, err + } + mac := s.packetData[length-1:] + data := s.packetData[:length-1] + + if s.mac != nil && s.etm { + s.mac.Write(data) + } + + s.cipher.XORKeyStream(data, data) + + if s.mac != nil { + if !s.etm { + s.mac.Write(data) + } + s.macResult = s.mac.Sum(s.macResult[:0]) + if subtle.ConstantTimeCompare(s.macResult, mac) != 1 { + return nil, errors.New("ssh: MAC failure") + } + } + + return s.packetData[:length-paddingLength-1], nil +} + +// writeCipherPacket encrypts and sends a packet of data to the writer argument +func (s *streamPacketCipher) writeCipherPacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { + if len(packet) > maxPacket { + return errors.New("ssh: packet too large") + } + + aadlen := 0 + if s.mac != nil && s.etm { + // packet length is not encrypted for EtM modes + aadlen = 4 + } + + paddingLength := packetSizeMultiple - (prefixLen+len(packet)-aadlen)%packetSizeMultiple + if paddingLength < 4 { + paddingLength += packetSizeMultiple + } + + length := len(packet) + 1 + paddingLength + binary.BigEndian.PutUint32(s.prefix[:], uint32(length)) + s.prefix[4] = byte(paddingLength) + padding := s.padding[:paddingLength] + if _, err := io.ReadFull(rand, padding); err != nil { + return err + } + + if s.mac != nil { + s.mac.Reset() + binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) + s.mac.Write(s.seqNumBytes[:]) + + if s.etm { + // For EtM algorithms, the packet length must stay unencrypted, + // but the following data (padding length) must be encrypted + s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) + } + + s.mac.Write(s.prefix[:]) + + if !s.etm { + // For non-EtM algorithms, the algorithm is applied on unencrypted data + s.mac.Write(packet) + s.mac.Write(padding) + } + } + + if !(s.mac != nil && s.etm) { + // For EtM algorithms, the padding length has already been encrypted + // and the packet length must remain unencrypted + s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) + } + + s.cipher.XORKeyStream(packet, packet) + s.cipher.XORKeyStream(padding, padding) + + if s.mac != nil && s.etm { + // For EtM algorithms, packet and padding must be encrypted + s.mac.Write(packet) + s.mac.Write(padding) + } + + if _, err := w.Write(s.prefix[:]); err != nil { + return err + } + if _, err := w.Write(packet); err != nil { + return err + } + if _, err := w.Write(padding); err != nil { + return err + } + + if s.mac != nil { + s.macResult = s.mac.Sum(s.macResult[:0]) + if _, err := w.Write(s.macResult); err != nil { + return err + } + } + + return nil +} + +type gcmCipher struct { + aead cipher.AEAD + prefix [4]byte + iv []byte + buf []byte +} + +func newGCMCipher(key, iv, unusedMacKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { + c, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + aead, err := cipher.NewGCM(c) + if err != nil { + return nil, err + } + + return &gcmCipher{ + aead: aead, + iv: iv, + }, nil +} + +const gcmTagSize = 16 + +func (c *gcmCipher) writeCipherPacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { + // Pad out to multiple of 16 bytes. This is different from the + // stream cipher because that encrypts the length too. + padding := byte(packetSizeMultiple - (1+len(packet))%packetSizeMultiple) + if padding < 4 { + padding += packetSizeMultiple + } + + length := uint32(len(packet) + int(padding) + 1) + binary.BigEndian.PutUint32(c.prefix[:], length) + if _, err := w.Write(c.prefix[:]); err != nil { + return err + } + + if cap(c.buf) < int(length) { + c.buf = make([]byte, length) + } else { + c.buf = c.buf[:length] + } + + c.buf[0] = padding + copy(c.buf[1:], packet) + if _, err := io.ReadFull(rand, c.buf[1+len(packet):]); err != nil { + return err + } + c.buf = c.aead.Seal(c.buf[:0], c.iv, c.buf, c.prefix[:]) + if _, err := w.Write(c.buf); err != nil { + return err + } + c.incIV() + + return nil +} + +func (c *gcmCipher) incIV() { + for i := 4 + 7; i >= 4; i-- { + c.iv[i]++ + if c.iv[i] != 0 { + break + } + } +} + +func (c *gcmCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) { + if _, err := io.ReadFull(r, c.prefix[:]); err != nil { + return nil, err + } + length := binary.BigEndian.Uint32(c.prefix[:]) + if length > maxPacket { + return nil, errors.New("ssh: max packet length exceeded") + } + + if cap(c.buf) < int(length+gcmTagSize) { + c.buf = make([]byte, length+gcmTagSize) + } else { + c.buf = c.buf[:length+gcmTagSize] + } + + if _, err := io.ReadFull(r, c.buf); err != nil { + return nil, err + } + + plain, err := c.aead.Open(c.buf[:0], c.iv, c.buf, c.prefix[:]) + if err != nil { + return nil, err + } + c.incIV() + + if len(plain) == 0 { + return nil, errors.New("ssh: empty packet") + } + + padding := plain[0] + if padding < 4 { + // padding is a byte, so it automatically satisfies + // the maximum size, which is 255. + return nil, fmt.Errorf("ssh: illegal padding %d", padding) + } + + if int(padding+1) >= len(plain) { + return nil, fmt.Errorf("ssh: padding %d too large", padding) + } + plain = plain[1 : length-uint32(padding)] + return plain, nil +} + +// cbcCipher implements aes128-cbc cipher defined in RFC 4253 section 6.1 +type cbcCipher struct { + mac hash.Hash + macSize uint32 + decrypter cipher.BlockMode + encrypter cipher.BlockMode + + // The following members are to avoid per-packet allocations. + seqNumBytes [4]byte + packetData []byte + macResult []byte + + // Amount of data we should still read to hide which + // verification error triggered. + oracleCamouflage uint32 +} + +func newCBCCipher(c cipher.Block, key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + cbc := &cbcCipher{ + mac: macModes[algs.MAC].new(macKey), + decrypter: cipher.NewCBCDecrypter(c, iv), + encrypter: cipher.NewCBCEncrypter(c, iv), + packetData: make([]byte, 1024), + } + if cbc.mac != nil { + cbc.macSize = uint32(cbc.mac.Size()) + } + + return cbc, nil +} + +func newAESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + c, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + cbc, err := newCBCCipher(c, key, iv, macKey, algs) + if err != nil { + return nil, err + } + + return cbc, nil +} + +func newTripleDESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + c, err := des.NewTripleDESCipher(key) + if err != nil { + return nil, err + } + + cbc, err := newCBCCipher(c, key, iv, macKey, algs) + if err != nil { + return nil, err + } + + return cbc, nil +} + +func maxUInt32(a, b int) uint32 { + if a > b { + return uint32(a) + } + return uint32(b) +} + +const ( + cbcMinPacketSizeMultiple = 8 + cbcMinPacketSize = 16 + cbcMinPaddingSize = 4 +) + +// cbcError represents a verification error that may leak information. +type cbcError string + +func (e cbcError) Error() string { return string(e) } + +func (c *cbcCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) { + p, err := c.readCipherPacketLeaky(seqNum, r) + if err != nil { + if _, ok := err.(cbcError); ok { + // Verification error: read a fixed amount of + // data, to make distinguishing between + // failing MAC and failing length check more + // difficult. + io.CopyN(ioutil.Discard, r, int64(c.oracleCamouflage)) + } + } + return p, err +} + +func (c *cbcCipher) readCipherPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) { + blockSize := c.decrypter.BlockSize() + + // Read the header, which will include some of the subsequent data in the + // case of block ciphers - this is copied back to the payload later. + // How many bytes of payload/padding will be read with this first read. + firstBlockLength := uint32((prefixLen + blockSize - 1) / blockSize * blockSize) + firstBlock := c.packetData[:firstBlockLength] + if _, err := io.ReadFull(r, firstBlock); err != nil { + return nil, err + } + + c.oracleCamouflage = maxPacket + 4 + c.macSize - firstBlockLength + + c.decrypter.CryptBlocks(firstBlock, firstBlock) + length := binary.BigEndian.Uint32(firstBlock[:4]) + if length > maxPacket { + return nil, cbcError("ssh: packet too large") + } + if length+4 < maxUInt32(cbcMinPacketSize, blockSize) { + // The minimum size of a packet is 16 (or the cipher block size, whichever + // is larger) bytes. + return nil, cbcError("ssh: packet too small") + } + // The length of the packet (including the length field but not the MAC) must + // be a multiple of the block size or 8, whichever is larger. + if (length+4)%maxUInt32(cbcMinPacketSizeMultiple, blockSize) != 0 { + return nil, cbcError("ssh: invalid packet length multiple") + } + + paddingLength := uint32(firstBlock[4]) + if paddingLength < cbcMinPaddingSize || length <= paddingLength+1 { + return nil, cbcError("ssh: invalid packet length") + } + + // Positions within the c.packetData buffer: + macStart := 4 + length + paddingStart := macStart - paddingLength + + // Entire packet size, starting before length, ending at end of mac. + entirePacketSize := macStart + c.macSize + + // Ensure c.packetData is large enough for the entire packet data. + if uint32(cap(c.packetData)) < entirePacketSize { + // Still need to upsize and copy, but this should be rare at runtime, only + // on upsizing the packetData buffer. + c.packetData = make([]byte, entirePacketSize) + copy(c.packetData, firstBlock) + } else { + c.packetData = c.packetData[:entirePacketSize] + } + + n, err := io.ReadFull(r, c.packetData[firstBlockLength:]) + if err != nil { + return nil, err + } + c.oracleCamouflage -= uint32(n) + + remainingCrypted := c.packetData[firstBlockLength:macStart] + c.decrypter.CryptBlocks(remainingCrypted, remainingCrypted) + + mac := c.packetData[macStart:] + if c.mac != nil { + c.mac.Reset() + binary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum) + c.mac.Write(c.seqNumBytes[:]) + c.mac.Write(c.packetData[:macStart]) + c.macResult = c.mac.Sum(c.macResult[:0]) + if subtle.ConstantTimeCompare(c.macResult, mac) != 1 { + return nil, cbcError("ssh: MAC failure") + } + } + + return c.packetData[prefixLen:paddingStart], nil +} + +func (c *cbcCipher) writeCipherPacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { + effectiveBlockSize := maxUInt32(cbcMinPacketSizeMultiple, c.encrypter.BlockSize()) + + // Length of encrypted portion of the packet (header, payload, padding). + // Enforce minimum padding and packet size. + encLength := maxUInt32(prefixLen+len(packet)+cbcMinPaddingSize, cbcMinPaddingSize) + // Enforce block size. + encLength = (encLength + effectiveBlockSize - 1) / effectiveBlockSize * effectiveBlockSize + + length := encLength - 4 + paddingLength := int(length) - (1 + len(packet)) + + // Overall buffer contains: header, payload, padding, mac. + // Space for the MAC is reserved in the capacity but not the slice length. + bufferSize := encLength + c.macSize + if uint32(cap(c.packetData)) < bufferSize { + c.packetData = make([]byte, encLength, bufferSize) + } else { + c.packetData = c.packetData[:encLength] + } + + p := c.packetData + + // Packet header. + binary.BigEndian.PutUint32(p, length) + p = p[4:] + p[0] = byte(paddingLength) + + // Payload. + p = p[1:] + copy(p, packet) + + // Padding. + p = p[len(packet):] + if _, err := io.ReadFull(rand, p); err != nil { + return err + } + + if c.mac != nil { + c.mac.Reset() + binary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum) + c.mac.Write(c.seqNumBytes[:]) + c.mac.Write(c.packetData) + // The MAC is now appended into the capacity reserved for it earlier. + c.packetData = c.mac.Sum(c.packetData) + } + + c.encrypter.CryptBlocks(c.packetData[:encLength], c.packetData[:encLength]) + + if _, err := w.Write(c.packetData); err != nil { + return err + } + + return nil +} + +const chacha20Poly1305ID = "chacha20-poly1305@openssh.com" + +// chacha20Poly1305Cipher implements the chacha20-poly1305@openssh.com +// AEAD, which is described here: +// +// https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00 +// +// the methods here also implement padding, which RFC4253 Section 6 +// also requires of stream ciphers. +type chacha20Poly1305Cipher struct { + lengthKey [32]byte + contentKey [32]byte + buf []byte +} + +func newChaCha20Cipher(key, unusedIV, unusedMACKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { + if len(key) != 64 { + panic(len(key)) + } + + c := &chacha20Poly1305Cipher{ + buf: make([]byte, 256), + } + + copy(c.contentKey[:], key[:32]) + copy(c.lengthKey[:], key[32:]) + return c, nil +} + +func (c *chacha20Poly1305Cipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) { + nonce := make([]byte, 12) + binary.BigEndian.PutUint32(nonce[8:], seqNum) + s, err := chacha20.NewUnauthenticatedCipher(c.contentKey[:], nonce) + if err != nil { + return nil, err + } + var polyKey, discardBuf [32]byte + s.XORKeyStream(polyKey[:], polyKey[:]) + s.XORKeyStream(discardBuf[:], discardBuf[:]) // skip the next 32 bytes + + encryptedLength := c.buf[:4] + if _, err := io.ReadFull(r, encryptedLength); err != nil { + return nil, err + } + + var lenBytes [4]byte + ls, err := chacha20.NewUnauthenticatedCipher(c.lengthKey[:], nonce) + if err != nil { + return nil, err + } + ls.XORKeyStream(lenBytes[:], encryptedLength) + + length := binary.BigEndian.Uint32(lenBytes[:]) + if length > maxPacket { + return nil, errors.New("ssh: invalid packet length, packet too large") + } + + contentEnd := 4 + length + packetEnd := contentEnd + poly1305.TagSize + if uint32(cap(c.buf)) < packetEnd { + c.buf = make([]byte, packetEnd) + copy(c.buf[:], encryptedLength) + } else { + c.buf = c.buf[:packetEnd] + } + + if _, err := io.ReadFull(r, c.buf[4:packetEnd]); err != nil { + return nil, err + } + + var mac [poly1305.TagSize]byte + copy(mac[:], c.buf[contentEnd:packetEnd]) + if !poly1305.Verify(&mac, c.buf[:contentEnd], &polyKey) { + return nil, errors.New("ssh: MAC failure") + } + + plain := c.buf[4:contentEnd] + s.XORKeyStream(plain, plain) + + if len(plain) == 0 { + return nil, errors.New("ssh: empty packet") + } + + padding := plain[0] + if padding < 4 { + // padding is a byte, so it automatically satisfies + // the maximum size, which is 255. + return nil, fmt.Errorf("ssh: illegal padding %d", padding) + } + + if int(padding)+1 >= len(plain) { + return nil, fmt.Errorf("ssh: padding %d too large", padding) + } + + plain = plain[1 : len(plain)-int(padding)] + + return plain, nil +} + +func (c *chacha20Poly1305Cipher) writeCipherPacket(seqNum uint32, w io.Writer, rand io.Reader, payload []byte) error { + nonce := make([]byte, 12) + binary.BigEndian.PutUint32(nonce[8:], seqNum) + s, err := chacha20.NewUnauthenticatedCipher(c.contentKey[:], nonce) + if err != nil { + return err + } + var polyKey, discardBuf [32]byte + s.XORKeyStream(polyKey[:], polyKey[:]) + s.XORKeyStream(discardBuf[:], discardBuf[:]) // skip the next 32 bytes + + // There is no blocksize, so fall back to multiple of 8 byte + // padding, as described in RFC 4253, Sec 6. + const packetSizeMultiple = 8 + + padding := packetSizeMultiple - (1+len(payload))%packetSizeMultiple + if padding < 4 { + padding += packetSizeMultiple + } + + // size (4 bytes), padding (1), payload, padding, tag. + totalLength := 4 + 1 + len(payload) + padding + poly1305.TagSize + if cap(c.buf) < totalLength { + c.buf = make([]byte, totalLength) + } else { + c.buf = c.buf[:totalLength] + } + + binary.BigEndian.PutUint32(c.buf, uint32(1+len(payload)+padding)) + ls, err := chacha20.NewUnauthenticatedCipher(c.lengthKey[:], nonce) + if err != nil { + return err + } + ls.XORKeyStream(c.buf, c.buf[:4]) + c.buf[4] = byte(padding) + copy(c.buf[5:], payload) + packetEnd := 5 + len(payload) + padding + if _, err := io.ReadFull(rand, c.buf[5+len(payload):packetEnd]); err != nil { + return err + } + + s.XORKeyStream(c.buf[4:], c.buf[4:packetEnd]) + + var mac [poly1305.TagSize]byte + poly1305.Sum(&mac, c.buf[:packetEnd], &polyKey) + + copy(c.buf[packetEnd:], mac[:]) + + if _, err := w.Write(c.buf); err != nil { + return err + } + return nil +} diff --git a/vendor/golang.org/x/crypto/ssh/client.go b/vendor/golang.org/x/crypto/ssh/client.go new file mode 100644 index 0000000000..ba8621a891 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/client.go @@ -0,0 +1,291 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "errors" + "fmt" + "net" + "os" + "sync" + "time" +) + +// Client implements a traditional SSH client that supports shells, +// subprocesses, TCP port/streamlocal forwarding and tunneled dialing. +type Client struct { + Conn + + handleForwardsOnce sync.Once // guards calling (*Client).handleForwards + + forwards forwardList // forwarded tcpip connections from the remote side + mu sync.Mutex + channelHandlers map[string]chan NewChannel +} + +// HandleChannelOpen returns a channel on which NewChannel requests +// for the given type are sent. If the type already is being handled, +// nil is returned. The channel is closed when the connection is closed. +func (c *Client) HandleChannelOpen(channelType string) <-chan NewChannel { + c.mu.Lock() + defer c.mu.Unlock() + if c.channelHandlers == nil { + // The SSH channel has been closed. + c := make(chan NewChannel) + close(c) + return c + } + + ch := c.channelHandlers[channelType] + if ch != nil { + return nil + } + + ch = make(chan NewChannel, chanSize) + c.channelHandlers[channelType] = ch + return ch +} + +// NewClient creates a Client on top of the given connection. +func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client { + conn := &Client{ + Conn: c, + channelHandlers: make(map[string]chan NewChannel, 1), + } + + go conn.handleGlobalRequests(reqs) + go conn.handleChannelOpens(chans) + go func() { + conn.Wait() + conn.forwards.closeAll() + }() + return conn +} + +// NewClientConn establishes an authenticated SSH connection using c +// as the underlying transport. The Request and NewChannel channels +// must be serviced or the connection will hang. +func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan NewChannel, <-chan *Request, error) { + fullConf := *config + fullConf.SetDefaults() + if fullConf.HostKeyCallback == nil { + c.Close() + return nil, nil, nil, errors.New("ssh: must specify HostKeyCallback") + } + + conn := &connection{ + sshConn: sshConn{conn: c, user: fullConf.User}, + } + + if err := conn.clientHandshake(addr, &fullConf); err != nil { + c.Close() + return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %v", err) + } + conn.mux = newMux(conn.transport) + return conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil +} + +// clientHandshake performs the client side key exchange. See RFC 4253 Section +// 7. +func (c *connection) clientHandshake(dialAddress string, config *ClientConfig) error { + if config.ClientVersion != "" { + c.clientVersion = []byte(config.ClientVersion) + } else { + c.clientVersion = []byte(packageVersion) + } + var err error + c.serverVersion, err = exchangeVersions(c.sshConn.conn, c.clientVersion) + if err != nil { + return err + } + + c.transport = newClientTransport( + newTransport(c.sshConn.conn, config.Rand, true /* is client */), + c.clientVersion, c.serverVersion, config, dialAddress, c.sshConn.RemoteAddr()) + if err := c.transport.waitSession(); err != nil { + return err + } + + c.sessionID = c.transport.getSessionID() + return c.clientAuthenticate(config) +} + +// verifyHostKeySignature verifies the host key obtained in the key +// exchange. +func verifyHostKeySignature(hostKey PublicKey, algo string, result *kexResult) error { + sig, rest, ok := parseSignatureBody(result.Signature) + if len(rest) > 0 || !ok { + return errors.New("ssh: signature parse error") + } + + // For keys, underlyingAlgo is exactly algo. For certificates, + // we have to look up the underlying key algorithm that SSH + // uses to evaluate signatures. + underlyingAlgo := algo + for sigAlgo, certAlgo := range certAlgoNames { + if certAlgo == algo { + underlyingAlgo = sigAlgo + } + } + if sig.Format != underlyingAlgo { + return fmt.Errorf("ssh: invalid signature algorithm %q, expected %q", sig.Format, underlyingAlgo) + } + + return hostKey.Verify(result.H, sig) +} + +// NewSession opens a new Session for this client. (A session is a remote +// execution of a program.) +func (c *Client) NewSession() (*Session, error) { + ch, in, err := c.OpenChannel("session", nil) + if err != nil { + return nil, err + } + return newSession(ch, in) +} + +func (c *Client) handleGlobalRequests(incoming <-chan *Request) { + for r := range incoming { + // This handles keepalive messages and matches + // the behaviour of OpenSSH. + r.Reply(false, nil) + } +} + +// handleChannelOpens channel open messages from the remote side. +func (c *Client) handleChannelOpens(in <-chan NewChannel) { + for ch := range in { + c.mu.Lock() + handler := c.channelHandlers[ch.ChannelType()] + c.mu.Unlock() + + if handler != nil { + handler <- ch + } else { + ch.Reject(UnknownChannelType, fmt.Sprintf("unknown channel type: %v", ch.ChannelType())) + } + } + + c.mu.Lock() + for _, ch := range c.channelHandlers { + close(ch) + } + c.channelHandlers = nil + c.mu.Unlock() +} + +// Dial starts a client connection to the given SSH server. It is a +// convenience function that connects to the given network address, +// initiates the SSH handshake, and then sets up a Client. For access +// to incoming channels and requests, use net.Dial with NewClientConn +// instead. +func Dial(network, addr string, config *ClientConfig) (*Client, error) { + conn, err := net.DialTimeout(network, addr, config.Timeout) + if err != nil { + return nil, err + } + c, chans, reqs, err := NewClientConn(conn, addr, config) + if err != nil { + return nil, err + } + return NewClient(c, chans, reqs), nil +} + +// HostKeyCallback is the function type used for verifying server +// keys. A HostKeyCallback must return nil if the host key is OK, or +// an error to reject it. It receives the hostname as passed to Dial +// or NewClientConn. The remote address is the RemoteAddr of the +// net.Conn underlying the SSH connection. +type HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error + +// BannerCallback is the function type used for treat the banner sent by +// the server. A BannerCallback receives the message sent by the remote server. +type BannerCallback func(message string) error + +// A ClientConfig structure is used to configure a Client. It must not be +// modified after having been passed to an SSH function. +type ClientConfig struct { + // Config contains configuration that is shared between clients and + // servers. + Config + + // User contains the username to authenticate as. + User string + + // Auth contains possible authentication methods to use with the + // server. Only the first instance of a particular RFC 4252 method will + // be used during authentication. + Auth []AuthMethod + + // HostKeyCallback is called during the cryptographic + // handshake to validate the server's host key. The client + // configuration must supply this callback for the connection + // to succeed. The functions InsecureIgnoreHostKey or + // FixedHostKey can be used for simplistic host key checks. + HostKeyCallback HostKeyCallback + + // BannerCallback is called during the SSH dance to display a custom + // server's message. The client configuration can supply this callback to + // handle it as wished. The function BannerDisplayStderr can be used for + // simplistic display on Stderr. + BannerCallback BannerCallback + + // ClientVersion contains the version identification string that will + // be used for the connection. If empty, a reasonable default is used. + ClientVersion string + + // HostKeyAlgorithms lists the key types that the client will + // accept from the server as host key, in order of + // preference. If empty, a reasonable default is used. Any + // string returned from PublicKey.Type method may be used, or + // any of the CertAlgoXxxx and KeyAlgoXxxx constants. + HostKeyAlgorithms []string + + // Timeout is the maximum amount of time for the TCP connection to establish. + // + // A Timeout of zero means no timeout. + Timeout time.Duration +} + +// InsecureIgnoreHostKey returns a function that can be used for +// ClientConfig.HostKeyCallback to accept any host key. It should +// not be used for production code. +func InsecureIgnoreHostKey() HostKeyCallback { + return func(hostname string, remote net.Addr, key PublicKey) error { + return nil + } +} + +type fixedHostKey struct { + key PublicKey +} + +func (f *fixedHostKey) check(hostname string, remote net.Addr, key PublicKey) error { + if f.key == nil { + return fmt.Errorf("ssh: required host key was nil") + } + if !bytes.Equal(key.Marshal(), f.key.Marshal()) { + return fmt.Errorf("ssh: host key mismatch") + } + return nil +} + +// FixedHostKey returns a function for use in +// ClientConfig.HostKeyCallback to accept only a specific host key. +func FixedHostKey(key PublicKey) HostKeyCallback { + hk := &fixedHostKey{key} + return hk.check +} + +// BannerDisplayStderr returns a function that can be used for +// ClientConfig.BannerCallback to display banners on os.Stderr. +func BannerDisplayStderr() BannerCallback { + return func(banner string) error { + _, err := os.Stderr.WriteString(banner) + + return err + } +} diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go new file mode 100644 index 0000000000..c611aeb684 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/client_auth.go @@ -0,0 +1,641 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "errors" + "fmt" + "io" +) + +type authResult int + +const ( + authFailure authResult = iota + authPartialSuccess + authSuccess +) + +// clientAuthenticate authenticates with the remote server. See RFC 4252. +func (c *connection) clientAuthenticate(config *ClientConfig) error { + // initiate user auth session + if err := c.transport.writePacket(Marshal(&serviceRequestMsg{serviceUserAuth})); err != nil { + return err + } + packet, err := c.transport.readPacket() + if err != nil { + return err + } + var serviceAccept serviceAcceptMsg + if err := Unmarshal(packet, &serviceAccept); err != nil { + return err + } + + // during the authentication phase the client first attempts the "none" method + // then any untried methods suggested by the server. + var tried []string + var lastMethods []string + + sessionID := c.transport.getSessionID() + for auth := AuthMethod(new(noneAuth)); auth != nil; { + ok, methods, err := auth.auth(sessionID, config.User, c.transport, config.Rand) + if err != nil { + return err + } + if ok == authSuccess { + // success + return nil + } else if ok == authFailure { + if m := auth.method(); !contains(tried, m) { + tried = append(tried, m) + } + } + if methods == nil { + methods = lastMethods + } + lastMethods = methods + + auth = nil + + findNext: + for _, a := range config.Auth { + candidateMethod := a.method() + if contains(tried, candidateMethod) { + continue + } + for _, meth := range methods { + if meth == candidateMethod { + auth = a + break findNext + } + } + } + } + return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", tried) +} + +func contains(list []string, e string) bool { + for _, s := range list { + if s == e { + return true + } + } + return false +} + +// An AuthMethod represents an instance of an RFC 4252 authentication method. +type AuthMethod interface { + // auth authenticates user over transport t. + // Returns true if authentication is successful. + // If authentication is not successful, a []string of alternative + // method names is returned. If the slice is nil, it will be ignored + // and the previous set of possible methods will be reused. + auth(session []byte, user string, p packetConn, rand io.Reader) (authResult, []string, error) + + // method returns the RFC 4252 method name. + method() string +} + +// "none" authentication, RFC 4252 section 5.2. +type noneAuth int + +func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + if err := c.writePacket(Marshal(&userAuthRequestMsg{ + User: user, + Service: serviceSSH, + Method: "none", + })); err != nil { + return authFailure, nil, err + } + + return handleAuthResponse(c) +} + +func (n *noneAuth) method() string { + return "none" +} + +// passwordCallback is an AuthMethod that fetches the password through +// a function call, e.g. by prompting the user. +type passwordCallback func() (password string, err error) + +func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + type passwordAuthMsg struct { + User string `sshtype:"50"` + Service string + Method string + Reply bool + Password string + } + + pw, err := cb() + // REVIEW NOTE: is there a need to support skipping a password attempt? + // The program may only find out that the user doesn't have a password + // when prompting. + if err != nil { + return authFailure, nil, err + } + + if err := c.writePacket(Marshal(&passwordAuthMsg{ + User: user, + Service: serviceSSH, + Method: cb.method(), + Reply: false, + Password: pw, + })); err != nil { + return authFailure, nil, err + } + + return handleAuthResponse(c) +} + +func (cb passwordCallback) method() string { + return "password" +} + +// Password returns an AuthMethod using the given password. +func Password(secret string) AuthMethod { + return passwordCallback(func() (string, error) { return secret, nil }) +} + +// PasswordCallback returns an AuthMethod that uses a callback for +// fetching a password. +func PasswordCallback(prompt func() (secret string, err error)) AuthMethod { + return passwordCallback(prompt) +} + +type publickeyAuthMsg struct { + User string `sshtype:"50"` + Service string + Method string + // HasSig indicates to the receiver packet that the auth request is signed and + // should be used for authentication of the request. + HasSig bool + Algoname string + PubKey []byte + // Sig is tagged with "rest" so Marshal will exclude it during + // validateKey + Sig []byte `ssh:"rest"` +} + +// publicKeyCallback is an AuthMethod that uses a set of key +// pairs for authentication. +type publicKeyCallback func() ([]Signer, error) + +func (cb publicKeyCallback) method() string { + return "publickey" +} + +func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + // Authentication is performed by sending an enquiry to test if a key is + // acceptable to the remote. If the key is acceptable, the client will + // attempt to authenticate with the valid key. If not the client will repeat + // the process with the remaining keys. + + signers, err := cb() + if err != nil { + return authFailure, nil, err + } + var methods []string + for _, signer := range signers { + ok, err := validateKey(signer.PublicKey(), user, c) + if err != nil { + return authFailure, nil, err + } + if !ok { + continue + } + + pub := signer.PublicKey() + pubKey := pub.Marshal() + sign, err := signer.Sign(rand, buildDataSignedForAuth(session, userAuthRequestMsg{ + User: user, + Service: serviceSSH, + Method: cb.method(), + }, []byte(pub.Type()), pubKey)) + if err != nil { + return authFailure, nil, err + } + + // manually wrap the serialized signature in a string + s := Marshal(sign) + sig := make([]byte, stringLength(len(s))) + marshalString(sig, s) + msg := publickeyAuthMsg{ + User: user, + Service: serviceSSH, + Method: cb.method(), + HasSig: true, + Algoname: pub.Type(), + PubKey: pubKey, + Sig: sig, + } + p := Marshal(&msg) + if err := c.writePacket(p); err != nil { + return authFailure, nil, err + } + var success authResult + success, methods, err = handleAuthResponse(c) + if err != nil { + return authFailure, nil, err + } + + // If authentication succeeds or the list of available methods does not + // contain the "publickey" method, do not attempt to authenticate with any + // other keys. According to RFC 4252 Section 7, the latter can occur when + // additional authentication methods are required. + if success == authSuccess || !containsMethod(methods, cb.method()) { + return success, methods, err + } + } + + return authFailure, methods, nil +} + +func containsMethod(methods []string, method string) bool { + for _, m := range methods { + if m == method { + return true + } + } + + return false +} + +// validateKey validates the key provided is acceptable to the server. +func validateKey(key PublicKey, user string, c packetConn) (bool, error) { + pubKey := key.Marshal() + msg := publickeyAuthMsg{ + User: user, + Service: serviceSSH, + Method: "publickey", + HasSig: false, + Algoname: key.Type(), + PubKey: pubKey, + } + if err := c.writePacket(Marshal(&msg)); err != nil { + return false, err + } + + return confirmKeyAck(key, c) +} + +func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { + pubKey := key.Marshal() + algoname := key.Type() + + for { + packet, err := c.readPacket() + if err != nil { + return false, err + } + switch packet[0] { + case msgUserAuthBanner: + if err := handleBannerResponse(c, packet); err != nil { + return false, err + } + case msgUserAuthPubKeyOk: + var msg userAuthPubKeyOkMsg + if err := Unmarshal(packet, &msg); err != nil { + return false, err + } + if msg.Algo != algoname || !bytes.Equal(msg.PubKey, pubKey) { + return false, nil + } + return true, nil + case msgUserAuthFailure: + return false, nil + default: + return false, unexpectedMessageError(msgUserAuthSuccess, packet[0]) + } + } +} + +// PublicKeys returns an AuthMethod that uses the given key +// pairs. +func PublicKeys(signers ...Signer) AuthMethod { + return publicKeyCallback(func() ([]Signer, error) { return signers, nil }) +} + +// PublicKeysCallback returns an AuthMethod that runs the given +// function to obtain a list of key pairs. +func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMethod { + return publicKeyCallback(getSigners) +} + +// handleAuthResponse returns whether the preceding authentication request succeeded +// along with a list of remaining authentication methods to try next and +// an error if an unexpected response was received. +func handleAuthResponse(c packetConn) (authResult, []string, error) { + for { + packet, err := c.readPacket() + if err != nil { + return authFailure, nil, err + } + + switch packet[0] { + case msgUserAuthBanner: + if err := handleBannerResponse(c, packet); err != nil { + return authFailure, nil, err + } + case msgUserAuthFailure: + var msg userAuthFailureMsg + if err := Unmarshal(packet, &msg); err != nil { + return authFailure, nil, err + } + if msg.PartialSuccess { + return authPartialSuccess, msg.Methods, nil + } + return authFailure, msg.Methods, nil + case msgUserAuthSuccess: + return authSuccess, nil, nil + default: + return authFailure, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) + } + } +} + +func handleBannerResponse(c packetConn, packet []byte) error { + var msg userAuthBannerMsg + if err := Unmarshal(packet, &msg); err != nil { + return err + } + + transport, ok := c.(*handshakeTransport) + if !ok { + return nil + } + + if transport.bannerCallback != nil { + return transport.bannerCallback(msg.Message) + } + + return nil +} + +// KeyboardInteractiveChallenge should print questions, optionally +// disabling echoing (e.g. for passwords), and return all the answers. +// Challenge may be called multiple times in a single session. After +// successful authentication, the server may send a challenge with no +// questions, for which the user and instruction messages should be +// printed. RFC 4256 section 3.3 details how the UI should behave for +// both CLI and GUI environments. +type KeyboardInteractiveChallenge func(user, instruction string, questions []string, echos []bool) (answers []string, err error) + +// KeyboardInteractive returns an AuthMethod using a prompt/response +// sequence controlled by the server. +func KeyboardInteractive(challenge KeyboardInteractiveChallenge) AuthMethod { + return challenge +} + +func (cb KeyboardInteractiveChallenge) method() string { + return "keyboard-interactive" +} + +func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + type initiateMsg struct { + User string `sshtype:"50"` + Service string + Method string + Language string + Submethods string + } + + if err := c.writePacket(Marshal(&initiateMsg{ + User: user, + Service: serviceSSH, + Method: "keyboard-interactive", + })); err != nil { + return authFailure, nil, err + } + + for { + packet, err := c.readPacket() + if err != nil { + return authFailure, nil, err + } + + // like handleAuthResponse, but with less options. + switch packet[0] { + case msgUserAuthBanner: + if err := handleBannerResponse(c, packet); err != nil { + return authFailure, nil, err + } + continue + case msgUserAuthInfoRequest: + // OK + case msgUserAuthFailure: + var msg userAuthFailureMsg + if err := Unmarshal(packet, &msg); err != nil { + return authFailure, nil, err + } + if msg.PartialSuccess { + return authPartialSuccess, msg.Methods, nil + } + return authFailure, msg.Methods, nil + case msgUserAuthSuccess: + return authSuccess, nil, nil + default: + return authFailure, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) + } + + var msg userAuthInfoRequestMsg + if err := Unmarshal(packet, &msg); err != nil { + return authFailure, nil, err + } + + // Manually unpack the prompt/echo pairs. + rest := msg.Prompts + var prompts []string + var echos []bool + for i := 0; i < int(msg.NumPrompts); i++ { + prompt, r, ok := parseString(rest) + if !ok || len(r) == 0 { + return authFailure, nil, errors.New("ssh: prompt format error") + } + prompts = append(prompts, string(prompt)) + echos = append(echos, r[0] != 0) + rest = r[1:] + } + + if len(rest) != 0 { + return authFailure, nil, errors.New("ssh: extra data following keyboard-interactive pairs") + } + + answers, err := cb(msg.User, msg.Instruction, prompts, echos) + if err != nil { + return authFailure, nil, err + } + + if len(answers) != len(prompts) { + return authFailure, nil, fmt.Errorf("ssh: incorrect number of answers from keyboard-interactive callback %d (expected %d)", len(answers), len(prompts)) + } + responseLength := 1 + 4 + for _, a := range answers { + responseLength += stringLength(len(a)) + } + serialized := make([]byte, responseLength) + p := serialized + p[0] = msgUserAuthInfoResponse + p = p[1:] + p = marshalUint32(p, uint32(len(answers))) + for _, a := range answers { + p = marshalString(p, []byte(a)) + } + + if err := c.writePacket(serialized); err != nil { + return authFailure, nil, err + } + } +} + +type retryableAuthMethod struct { + authMethod AuthMethod + maxTries int +} + +func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok authResult, methods []string, err error) { + for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ { + ok, methods, err = r.authMethod.auth(session, user, c, rand) + if ok != authFailure || err != nil { // either success, partial success or error terminate + return ok, methods, err + } + } + return ok, methods, err +} + +func (r *retryableAuthMethod) method() string { + return r.authMethod.method() +} + +// RetryableAuthMethod is a decorator for other auth methods enabling them to +// be retried up to maxTries before considering that AuthMethod itself failed. +// If maxTries is <= 0, will retry indefinitely +// +// This is useful for interactive clients using challenge/response type +// authentication (e.g. Keyboard-Interactive, Password, etc) where the user +// could mistype their response resulting in the server issuing a +// SSH_MSG_USERAUTH_FAILURE (rfc4252 #8 [password] and rfc4256 #3.4 +// [keyboard-interactive]); Without this decorator, the non-retryable +// AuthMethod would be removed from future consideration, and never tried again +// (and so the user would never be able to retry their entry). +func RetryableAuthMethod(auth AuthMethod, maxTries int) AuthMethod { + return &retryableAuthMethod{authMethod: auth, maxTries: maxTries} +} + +// GSSAPIWithMICAuthMethod is an AuthMethod with "gssapi-with-mic" authentication. +// See RFC 4462 section 3 +// gssAPIClient is implementation of the GSSAPIClient interface, see the definition of the interface for details. +// target is the server host you want to log in to. +func GSSAPIWithMICAuthMethod(gssAPIClient GSSAPIClient, target string) AuthMethod { + if gssAPIClient == nil { + panic("gss-api client must be not nil with enable gssapi-with-mic") + } + return &gssAPIWithMICCallback{gssAPIClient: gssAPIClient, target: target} +} + +type gssAPIWithMICCallback struct { + gssAPIClient GSSAPIClient + target string +} + +func (g *gssAPIWithMICCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + m := &userAuthRequestMsg{ + User: user, + Service: serviceSSH, + Method: g.method(), + } + // The GSS-API authentication method is initiated when the client sends an SSH_MSG_USERAUTH_REQUEST. + // See RFC 4462 section 3.2. + m.Payload = appendU32(m.Payload, 1) + m.Payload = appendString(m.Payload, string(krb5OID)) + if err := c.writePacket(Marshal(m)); err != nil { + return authFailure, nil, err + } + // The server responds to the SSH_MSG_USERAUTH_REQUEST with either an + // SSH_MSG_USERAUTH_FAILURE if none of the mechanisms are supported or + // with an SSH_MSG_USERAUTH_GSSAPI_RESPONSE. + // See RFC 4462 section 3.3. + // OpenSSH supports Kerberos V5 mechanism only for GSS-API authentication,so I don't want to check + // selected mech if it is valid. + packet, err := c.readPacket() + if err != nil { + return authFailure, nil, err + } + userAuthGSSAPIResp := &userAuthGSSAPIResponse{} + if err := Unmarshal(packet, userAuthGSSAPIResp); err != nil { + return authFailure, nil, err + } + // Start the loop into the exchange token. + // See RFC 4462 section 3.4. + var token []byte + defer g.gssAPIClient.DeleteSecContext() + for { + // Initiates the establishment of a security context between the application and a remote peer. + nextToken, needContinue, err := g.gssAPIClient.InitSecContext("host@"+g.target, token, false) + if err != nil { + return authFailure, nil, err + } + if len(nextToken) > 0 { + if err := c.writePacket(Marshal(&userAuthGSSAPIToken{ + Token: nextToken, + })); err != nil { + return authFailure, nil, err + } + } + if !needContinue { + break + } + packet, err = c.readPacket() + if err != nil { + return authFailure, nil, err + } + switch packet[0] { + case msgUserAuthFailure: + var msg userAuthFailureMsg + if err := Unmarshal(packet, &msg); err != nil { + return authFailure, nil, err + } + if msg.PartialSuccess { + return authPartialSuccess, msg.Methods, nil + } + return authFailure, msg.Methods, nil + case msgUserAuthGSSAPIError: + userAuthGSSAPIErrorResp := &userAuthGSSAPIError{} + if err := Unmarshal(packet, userAuthGSSAPIErrorResp); err != nil { + return authFailure, nil, err + } + return authFailure, nil, fmt.Errorf("GSS-API Error:\n"+ + "Major Status: %d\n"+ + "Minor Status: %d\n"+ + "Error Message: %s\n", userAuthGSSAPIErrorResp.MajorStatus, userAuthGSSAPIErrorResp.MinorStatus, + userAuthGSSAPIErrorResp.Message) + case msgUserAuthGSSAPIToken: + userAuthGSSAPITokenReq := &userAuthGSSAPIToken{} + if err := Unmarshal(packet, userAuthGSSAPITokenReq); err != nil { + return authFailure, nil, err + } + token = userAuthGSSAPITokenReq.Token + } + } + // Binding Encryption Keys. + // See RFC 4462 section 3.5. + micField := buildMIC(string(session), user, "ssh-connection", "gssapi-with-mic") + micToken, err := g.gssAPIClient.GetMIC(micField) + if err != nil { + return authFailure, nil, err + } + if err := c.writePacket(Marshal(&userAuthGSSAPIMIC{ + MIC: micToken, + })); err != nil { + return authFailure, nil, err + } + return handleAuthResponse(c) +} + +func (g *gssAPIWithMICCallback) method() string { + return "gssapi-with-mic" +} diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go new file mode 100644 index 0000000000..5ae2275744 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/common.go @@ -0,0 +1,410 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "crypto" + "crypto/rand" + "fmt" + "io" + "math" + "sync" + + _ "crypto/sha1" + _ "crypto/sha256" + _ "crypto/sha512" +) + +// These are string constants in the SSH protocol. +const ( + compressionNone = "none" + serviceUserAuth = "ssh-userauth" + serviceSSH = "ssh-connection" +) + +// supportedCiphers lists ciphers we support but might not recommend. +var supportedCiphers = []string{ + "aes128-ctr", "aes192-ctr", "aes256-ctr", + "aes128-gcm@openssh.com", + chacha20Poly1305ID, + "arcfour256", "arcfour128", "arcfour", + aes128cbcID, + tripledescbcID, +} + +// preferredCiphers specifies the default preference for ciphers. +var preferredCiphers = []string{ + "aes128-gcm@openssh.com", + chacha20Poly1305ID, + "aes128-ctr", "aes192-ctr", "aes256-ctr", +} + +// supportedKexAlgos specifies the supported key-exchange algorithms in +// preference order. +var supportedKexAlgos = []string{ + kexAlgoCurve25519SHA256, + // P384 and P521 are not constant-time yet, but since we don't + // reuse ephemeral keys, using them for ECDH should be OK. + kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521, + kexAlgoDH14SHA1, kexAlgoDH1SHA1, +} + +// serverForbiddenKexAlgos contains key exchange algorithms, that are forbidden +// for the server half. +var serverForbiddenKexAlgos = map[string]struct{}{ + kexAlgoDHGEXSHA1: {}, // server half implementation is only minimal to satisfy the automated tests + kexAlgoDHGEXSHA256: {}, // server half implementation is only minimal to satisfy the automated tests +} + +// preferredKexAlgos specifies the default preference for key-exchange algorithms +// in preference order. +var preferredKexAlgos = []string{ + kexAlgoCurve25519SHA256, + kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521, + kexAlgoDH14SHA1, +} + +// supportedHostKeyAlgos specifies the supported host-key algorithms (i.e. methods +// of authenticating servers) in preference order. +var supportedHostKeyAlgos = []string{ + CertSigAlgoRSASHA2512v01, CertSigAlgoRSASHA2256v01, + CertSigAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, + CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01, + + KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, + SigAlgoRSASHA2512, SigAlgoRSASHA2256, + SigAlgoRSA, KeyAlgoDSA, + + KeyAlgoED25519, +} + +// supportedMACs specifies a default set of MAC algorithms in preference order. +// This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed +// because they have reached the end of their useful life. +var supportedMACs = []string{ + "hmac-sha2-256-etm@openssh.com", "hmac-sha2-256", "hmac-sha1", "hmac-sha1-96", +} + +var supportedCompressions = []string{compressionNone} + +// hashFuncs keeps the mapping of supported algorithms to their respective +// hashes needed for signature verification. +var hashFuncs = map[string]crypto.Hash{ + SigAlgoRSA: crypto.SHA1, + SigAlgoRSASHA2256: crypto.SHA256, + SigAlgoRSASHA2512: crypto.SHA512, + KeyAlgoDSA: crypto.SHA1, + KeyAlgoECDSA256: crypto.SHA256, + KeyAlgoECDSA384: crypto.SHA384, + KeyAlgoECDSA521: crypto.SHA512, + CertSigAlgoRSAv01: crypto.SHA1, + CertSigAlgoRSASHA2256v01: crypto.SHA256, + CertSigAlgoRSASHA2512v01: crypto.SHA512, + CertAlgoDSAv01: crypto.SHA1, + CertAlgoECDSA256v01: crypto.SHA256, + CertAlgoECDSA384v01: crypto.SHA384, + CertAlgoECDSA521v01: crypto.SHA512, +} + +// unexpectedMessageError results when the SSH message that we received didn't +// match what we wanted. +func unexpectedMessageError(expected, got uint8) error { + return fmt.Errorf("ssh: unexpected message type %d (expected %d)", got, expected) +} + +// parseError results from a malformed SSH message. +func parseError(tag uint8) error { + return fmt.Errorf("ssh: parse error in message type %d", tag) +} + +func findCommon(what string, client []string, server []string) (common string, err error) { + for _, c := range client { + for _, s := range server { + if c == s { + return c, nil + } + } + } + return "", fmt.Errorf("ssh: no common algorithm for %s; client offered: %v, server offered: %v", what, client, server) +} + +// directionAlgorithms records algorithm choices in one direction (either read or write) +type directionAlgorithms struct { + Cipher string + MAC string + Compression string +} + +// rekeyBytes returns a rekeying intervals in bytes. +func (a *directionAlgorithms) rekeyBytes() int64 { + // According to RFC4344 block ciphers should rekey after + // 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is + // 128. + switch a.Cipher { + case "aes128-ctr", "aes192-ctr", "aes256-ctr", gcmCipherID, aes128cbcID: + return 16 * (1 << 32) + + } + + // For others, stick with RFC4253 recommendation to rekey after 1 Gb of data. + return 1 << 30 +} + +type algorithms struct { + kex string + hostKey string + w directionAlgorithms + r directionAlgorithms +} + +func findAgreedAlgorithms(isClient bool, clientKexInit, serverKexInit *kexInitMsg) (algs *algorithms, err error) { + result := &algorithms{} + + result.kex, err = findCommon("key exchange", clientKexInit.KexAlgos, serverKexInit.KexAlgos) + if err != nil { + return + } + + result.hostKey, err = findCommon("host key", clientKexInit.ServerHostKeyAlgos, serverKexInit.ServerHostKeyAlgos) + if err != nil { + return + } + + stoc, ctos := &result.w, &result.r + if isClient { + ctos, stoc = stoc, ctos + } + + ctos.Cipher, err = findCommon("client to server cipher", clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer) + if err != nil { + return + } + + stoc.Cipher, err = findCommon("server to client cipher", clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient) + if err != nil { + return + } + + ctos.MAC, err = findCommon("client to server MAC", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer) + if err != nil { + return + } + + stoc.MAC, err = findCommon("server to client MAC", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient) + if err != nil { + return + } + + ctos.Compression, err = findCommon("client to server compression", clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer) + if err != nil { + return + } + + stoc.Compression, err = findCommon("server to client compression", clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient) + if err != nil { + return + } + + return result, nil +} + +// If rekeythreshold is too small, we can't make any progress sending +// stuff. +const minRekeyThreshold uint64 = 256 + +// Config contains configuration data common to both ServerConfig and +// ClientConfig. +type Config struct { + // Rand provides the source of entropy for cryptographic + // primitives. If Rand is nil, the cryptographic random reader + // in package crypto/rand will be used. + Rand io.Reader + + // The maximum number of bytes sent or received after which a + // new key is negotiated. It must be at least 256. If + // unspecified, a size suitable for the chosen cipher is used. + RekeyThreshold uint64 + + // The allowed key exchanges algorithms. If unspecified then a + // default set of algorithms is used. + KeyExchanges []string + + // The allowed cipher algorithms. If unspecified then a sensible + // default is used. + Ciphers []string + + // The allowed MAC algorithms. If unspecified then a sensible default + // is used. + MACs []string +} + +// SetDefaults sets sensible values for unset fields in config. This is +// exported for testing: Configs passed to SSH functions are copied and have +// default values set automatically. +func (c *Config) SetDefaults() { + if c.Rand == nil { + c.Rand = rand.Reader + } + if c.Ciphers == nil { + c.Ciphers = preferredCiphers + } + var ciphers []string + for _, c := range c.Ciphers { + if cipherModes[c] != nil { + // reject the cipher if we have no cipherModes definition + ciphers = append(ciphers, c) + } + } + c.Ciphers = ciphers + + if c.KeyExchanges == nil { + c.KeyExchanges = preferredKexAlgos + } + + if c.MACs == nil { + c.MACs = supportedMACs + } + + if c.RekeyThreshold == 0 { + // cipher specific default + } else if c.RekeyThreshold < minRekeyThreshold { + c.RekeyThreshold = minRekeyThreshold + } else if c.RekeyThreshold >= math.MaxInt64 { + // Avoid weirdness if somebody uses -1 as a threshold. + c.RekeyThreshold = math.MaxInt64 + } +} + +// buildDataSignedForAuth returns the data that is signed in order to prove +// possession of a private key. See RFC 4252, section 7. +func buildDataSignedForAuth(sessionID []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { + data := struct { + Session []byte + Type byte + User string + Service string + Method string + Sign bool + Algo []byte + PubKey []byte + }{ + sessionID, + msgUserAuthRequest, + req.User, + req.Service, + req.Method, + true, + algo, + pubKey, + } + return Marshal(data) +} + +func appendU16(buf []byte, n uint16) []byte { + return append(buf, byte(n>>8), byte(n)) +} + +func appendU32(buf []byte, n uint32) []byte { + return append(buf, byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) +} + +func appendU64(buf []byte, n uint64) []byte { + return append(buf, + byte(n>>56), byte(n>>48), byte(n>>40), byte(n>>32), + byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) +} + +func appendInt(buf []byte, n int) []byte { + return appendU32(buf, uint32(n)) +} + +func appendString(buf []byte, s string) []byte { + buf = appendU32(buf, uint32(len(s))) + buf = append(buf, s...) + return buf +} + +func appendBool(buf []byte, b bool) []byte { + if b { + return append(buf, 1) + } + return append(buf, 0) +} + +// newCond is a helper to hide the fact that there is no usable zero +// value for sync.Cond. +func newCond() *sync.Cond { return sync.NewCond(new(sync.Mutex)) } + +// window represents the buffer available to clients +// wishing to write to a channel. +type window struct { + *sync.Cond + win uint32 // RFC 4254 5.2 says the window size can grow to 2^32-1 + writeWaiters int + closed bool +} + +// add adds win to the amount of window available +// for consumers. +func (w *window) add(win uint32) bool { + // a zero sized window adjust is a noop. + if win == 0 { + return true + } + w.L.Lock() + if w.win+win < win { + w.L.Unlock() + return false + } + w.win += win + // It is unusual that multiple goroutines would be attempting to reserve + // window space, but not guaranteed. Use broadcast to notify all waiters + // that additional window is available. + w.Broadcast() + w.L.Unlock() + return true +} + +// close sets the window to closed, so all reservations fail +// immediately. +func (w *window) close() { + w.L.Lock() + w.closed = true + w.Broadcast() + w.L.Unlock() +} + +// reserve reserves win from the available window capacity. +// If no capacity remains, reserve will block. reserve may +// return less than requested. +func (w *window) reserve(win uint32) (uint32, error) { + var err error + w.L.Lock() + w.writeWaiters++ + w.Broadcast() + for w.win == 0 && !w.closed { + w.Wait() + } + w.writeWaiters-- + if w.win < win { + win = w.win + } + w.win -= win + if w.closed { + err = io.EOF + } + w.L.Unlock() + return win, err +} + +// waitWriterBlocked waits until some goroutine is blocked for further +// writes. It is used in tests only. +func (w *window) waitWriterBlocked() { + w.Cond.L.Lock() + for w.writeWaiters == 0 { + w.Cond.Wait() + } + w.Cond.L.Unlock() +} diff --git a/vendor/golang.org/x/crypto/ssh/connection.go b/vendor/golang.org/x/crypto/ssh/connection.go new file mode 100644 index 0000000000..fd6b0681b5 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/connection.go @@ -0,0 +1,143 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "fmt" + "net" +) + +// OpenChannelError is returned if the other side rejects an +// OpenChannel request. +type OpenChannelError struct { + Reason RejectionReason + Message string +} + +func (e *OpenChannelError) Error() string { + return fmt.Sprintf("ssh: rejected: %s (%s)", e.Reason, e.Message) +} + +// ConnMetadata holds metadata for the connection. +type ConnMetadata interface { + // User returns the user ID for this connection. + User() string + + // SessionID returns the session hash, also denoted by H. + SessionID() []byte + + // ClientVersion returns the client's version string as hashed + // into the session ID. + ClientVersion() []byte + + // ServerVersion returns the server's version string as hashed + // into the session ID. + ServerVersion() []byte + + // RemoteAddr returns the remote address for this connection. + RemoteAddr() net.Addr + + // LocalAddr returns the local address for this connection. + LocalAddr() net.Addr +} + +// Conn represents an SSH connection for both server and client roles. +// Conn is the basis for implementing an application layer, such +// as ClientConn, which implements the traditional shell access for +// clients. +type Conn interface { + ConnMetadata + + // SendRequest sends a global request, and returns the + // reply. If wantReply is true, it returns the response status + // and payload. See also RFC4254, section 4. + SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) + + // OpenChannel tries to open an channel. If the request is + // rejected, it returns *OpenChannelError. On success it returns + // the SSH Channel and a Go channel for incoming, out-of-band + // requests. The Go channel must be serviced, or the + // connection will hang. + OpenChannel(name string, data []byte) (Channel, <-chan *Request, error) + + // Close closes the underlying network connection + Close() error + + // Wait blocks until the connection has shut down, and returns the + // error causing the shutdown. + Wait() error + + // TODO(hanwen): consider exposing: + // RequestKeyChange + // Disconnect +} + +// DiscardRequests consumes and rejects all requests from the +// passed-in channel. +func DiscardRequests(in <-chan *Request) { + for req := range in { + if req.WantReply { + req.Reply(false, nil) + } + } +} + +// A connection represents an incoming connection. +type connection struct { + transport *handshakeTransport + sshConn + + // The connection protocol. + *mux +} + +func (c *connection) Close() error { + return c.sshConn.conn.Close() +} + +// sshconn provides net.Conn metadata, but disallows direct reads and +// writes. +type sshConn struct { + conn net.Conn + + user string + sessionID []byte + clientVersion []byte + serverVersion []byte +} + +func dup(src []byte) []byte { + dst := make([]byte, len(src)) + copy(dst, src) + return dst +} + +func (c *sshConn) User() string { + return c.user +} + +func (c *sshConn) RemoteAddr() net.Addr { + return c.conn.RemoteAddr() +} + +func (c *sshConn) Close() error { + return c.conn.Close() +} + +func (c *sshConn) LocalAddr() net.Addr { + return c.conn.LocalAddr() +} + +func (c *sshConn) SessionID() []byte { + return dup(c.sessionID) +} + +func (c *sshConn) ClientVersion() []byte { + return dup(c.clientVersion) +} + +func (c *sshConn) ServerVersion() []byte { + return dup(c.serverVersion) +} diff --git a/vendor/golang.org/x/crypto/ssh/doc.go b/vendor/golang.org/x/crypto/ssh/doc.go new file mode 100644 index 0000000000..67b7322c05 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/doc.go @@ -0,0 +1,21 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package ssh implements an SSH client and server. + +SSH is a transport security protocol, an authentication protocol and a +family of application protocols. The most typical application level +protocol is a remote shell and this is specifically implemented. However, +the multiplexed nature of SSH is exposed to users that wish to support +others. + +References: + [PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD + [SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1 + +This package does not fall under the stability promise of the Go language itself, +so its API may be changed when pressing needs arise. +*/ +package ssh // import "golang.org/x/crypto/ssh" diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go new file mode 100644 index 0000000000..05ad49c364 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/handshake.go @@ -0,0 +1,668 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "crypto/rand" + "errors" + "fmt" + "io" + "log" + "net" + "sync" +) + +// debugHandshake, if set, prints messages sent and received. Key +// exchange messages are printed as if DH were used, so the debug +// messages are wrong when using ECDH. +const debugHandshake = false + +// chanSize sets the amount of buffering SSH connections. This is +// primarily for testing: setting chanSize=0 uncovers deadlocks more +// quickly. +const chanSize = 16 + +// keyingTransport is a packet based transport that supports key +// changes. It need not be thread-safe. It should pass through +// msgNewKeys in both directions. +type keyingTransport interface { + packetConn + + // prepareKeyChange sets up a key change. The key change for a + // direction will be effected if a msgNewKeys message is sent + // or received. + prepareKeyChange(*algorithms, *kexResult) error +} + +// handshakeTransport implements rekeying on top of a keyingTransport +// and offers a thread-safe writePacket() interface. +type handshakeTransport struct { + conn keyingTransport + config *Config + + serverVersion []byte + clientVersion []byte + + // hostKeys is non-empty if we are the server. In that case, + // it contains all host keys that can be used to sign the + // connection. + hostKeys []Signer + + // hostKeyAlgorithms is non-empty if we are the client. In that case, + // we accept these key types from the server as host key. + hostKeyAlgorithms []string + + // On read error, incoming is closed, and readError is set. + incoming chan []byte + readError error + + mu sync.Mutex + writeError error + sentInitPacket []byte + sentInitMsg *kexInitMsg + pendingPackets [][]byte // Used when a key exchange is in progress. + + // If the read loop wants to schedule a kex, it pings this + // channel, and the write loop will send out a kex + // message. + requestKex chan struct{} + + // If the other side requests or confirms a kex, its kexInit + // packet is sent here for the write loop to find it. + startKex chan *pendingKex + + // data for host key checking + hostKeyCallback HostKeyCallback + dialAddress string + remoteAddr net.Addr + + // bannerCallback is non-empty if we are the client and it has been set in + // ClientConfig. In that case it is called during the user authentication + // dance to handle a custom server's message. + bannerCallback BannerCallback + + // Algorithms agreed in the last key exchange. + algorithms *algorithms + + readPacketsLeft uint32 + readBytesLeft int64 + + writePacketsLeft uint32 + writeBytesLeft int64 + + // The session ID or nil if first kex did not complete yet. + sessionID []byte +} + +type pendingKex struct { + otherInit []byte + done chan error +} + +func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, serverVersion []byte) *handshakeTransport { + t := &handshakeTransport{ + conn: conn, + serverVersion: serverVersion, + clientVersion: clientVersion, + incoming: make(chan []byte, chanSize), + requestKex: make(chan struct{}, 1), + startKex: make(chan *pendingKex, 1), + + config: config, + } + t.resetReadThresholds() + t.resetWriteThresholds() + + // We always start with a mandatory key exchange. + t.requestKex <- struct{}{} + return t +} + +func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ClientConfig, dialAddr string, addr net.Addr) *handshakeTransport { + t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion) + t.dialAddress = dialAddr + t.remoteAddr = addr + t.hostKeyCallback = config.HostKeyCallback + t.bannerCallback = config.BannerCallback + if config.HostKeyAlgorithms != nil { + t.hostKeyAlgorithms = config.HostKeyAlgorithms + } else { + t.hostKeyAlgorithms = supportedHostKeyAlgos + } + go t.readLoop() + go t.kexLoop() + return t +} + +func newServerTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ServerConfig) *handshakeTransport { + t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion) + t.hostKeys = config.hostKeys + go t.readLoop() + go t.kexLoop() + return t +} + +func (t *handshakeTransport) getSessionID() []byte { + return t.sessionID +} + +// waitSession waits for the session to be established. This should be +// the first thing to call after instantiating handshakeTransport. +func (t *handshakeTransport) waitSession() error { + p, err := t.readPacket() + if err != nil { + return err + } + if p[0] != msgNewKeys { + return fmt.Errorf("ssh: first packet should be msgNewKeys") + } + + return nil +} + +func (t *handshakeTransport) id() string { + if len(t.hostKeys) > 0 { + return "server" + } + return "client" +} + +func (t *handshakeTransport) printPacket(p []byte, write bool) { + action := "got" + if write { + action = "sent" + } + + if p[0] == msgChannelData || p[0] == msgChannelExtendedData { + log.Printf("%s %s data (packet %d bytes)", t.id(), action, len(p)) + } else { + msg, err := decode(p) + log.Printf("%s %s %T %v (%v)", t.id(), action, msg, msg, err) + } +} + +func (t *handshakeTransport) readPacket() ([]byte, error) { + p, ok := <-t.incoming + if !ok { + return nil, t.readError + } + return p, nil +} + +func (t *handshakeTransport) readLoop() { + first := true + for { + p, err := t.readOnePacket(first) + first = false + if err != nil { + t.readError = err + close(t.incoming) + break + } + if p[0] == msgIgnore || p[0] == msgDebug { + continue + } + t.incoming <- p + } + + // Stop writers too. + t.recordWriteError(t.readError) + + // Unblock the writer should it wait for this. + close(t.startKex) + + // Don't close t.requestKex; it's also written to from writePacket. +} + +func (t *handshakeTransport) pushPacket(p []byte) error { + if debugHandshake { + t.printPacket(p, true) + } + return t.conn.writePacket(p) +} + +func (t *handshakeTransport) getWriteError() error { + t.mu.Lock() + defer t.mu.Unlock() + return t.writeError +} + +func (t *handshakeTransport) recordWriteError(err error) { + t.mu.Lock() + defer t.mu.Unlock() + if t.writeError == nil && err != nil { + t.writeError = err + } +} + +func (t *handshakeTransport) requestKeyExchange() { + select { + case t.requestKex <- struct{}{}: + default: + // something already requested a kex, so do nothing. + } +} + +func (t *handshakeTransport) resetWriteThresholds() { + t.writePacketsLeft = packetRekeyThreshold + if t.config.RekeyThreshold > 0 { + t.writeBytesLeft = int64(t.config.RekeyThreshold) + } else if t.algorithms != nil { + t.writeBytesLeft = t.algorithms.w.rekeyBytes() + } else { + t.writeBytesLeft = 1 << 30 + } +} + +func (t *handshakeTransport) kexLoop() { + +write: + for t.getWriteError() == nil { + var request *pendingKex + var sent bool + + for request == nil || !sent { + var ok bool + select { + case request, ok = <-t.startKex: + if !ok { + break write + } + case <-t.requestKex: + break + } + + if !sent { + if err := t.sendKexInit(); err != nil { + t.recordWriteError(err) + break + } + sent = true + } + } + + if err := t.getWriteError(); err != nil { + if request != nil { + request.done <- err + } + break + } + + // We're not servicing t.requestKex, but that is OK: + // we never block on sending to t.requestKex. + + // We're not servicing t.startKex, but the remote end + // has just sent us a kexInitMsg, so it can't send + // another key change request, until we close the done + // channel on the pendingKex request. + + err := t.enterKeyExchange(request.otherInit) + + t.mu.Lock() + t.writeError = err + t.sentInitPacket = nil + t.sentInitMsg = nil + + t.resetWriteThresholds() + + // we have completed the key exchange. Since the + // reader is still blocked, it is safe to clear out + // the requestKex channel. This avoids the situation + // where: 1) we consumed our own request for the + // initial kex, and 2) the kex from the remote side + // caused another send on the requestKex channel, + clear: + for { + select { + case <-t.requestKex: + // + default: + break clear + } + } + + request.done <- t.writeError + + // kex finished. Push packets that we received while + // the kex was in progress. Don't look at t.startKex + // and don't increment writtenSinceKex: if we trigger + // another kex while we are still busy with the last + // one, things will become very confusing. + for _, p := range t.pendingPackets { + t.writeError = t.pushPacket(p) + if t.writeError != nil { + break + } + } + t.pendingPackets = t.pendingPackets[:0] + t.mu.Unlock() + } + + // drain startKex channel. We don't service t.requestKex + // because nobody does blocking sends there. + go func() { + for init := range t.startKex { + init.done <- t.writeError + } + }() + + // Unblock reader. + t.conn.Close() +} + +// The protocol uses uint32 for packet counters, so we can't let them +// reach 1<<32. We will actually read and write more packets than +// this, though: the other side may send more packets, and after we +// hit this limit on writing we will send a few more packets for the +// key exchange itself. +const packetRekeyThreshold = (1 << 31) + +func (t *handshakeTransport) resetReadThresholds() { + t.readPacketsLeft = packetRekeyThreshold + if t.config.RekeyThreshold > 0 { + t.readBytesLeft = int64(t.config.RekeyThreshold) + } else if t.algorithms != nil { + t.readBytesLeft = t.algorithms.r.rekeyBytes() + } else { + t.readBytesLeft = 1 << 30 + } +} + +func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) { + p, err := t.conn.readPacket() + if err != nil { + return nil, err + } + + if t.readPacketsLeft > 0 { + t.readPacketsLeft-- + } else { + t.requestKeyExchange() + } + + if t.readBytesLeft > 0 { + t.readBytesLeft -= int64(len(p)) + } else { + t.requestKeyExchange() + } + + if debugHandshake { + t.printPacket(p, false) + } + + if first && p[0] != msgKexInit { + return nil, fmt.Errorf("ssh: first packet should be msgKexInit") + } + + if p[0] != msgKexInit { + return p, nil + } + + firstKex := t.sessionID == nil + + kex := pendingKex{ + done: make(chan error, 1), + otherInit: p, + } + t.startKex <- &kex + err = <-kex.done + + if debugHandshake { + log.Printf("%s exited key exchange (first %v), err %v", t.id(), firstKex, err) + } + + if err != nil { + return nil, err + } + + t.resetReadThresholds() + + // By default, a key exchange is hidden from higher layers by + // translating it into msgIgnore. + successPacket := []byte{msgIgnore} + if firstKex { + // sendKexInit() for the first kex waits for + // msgNewKeys so the authentication process is + // guaranteed to happen over an encrypted transport. + successPacket = []byte{msgNewKeys} + } + + return successPacket, nil +} + +// sendKexInit sends a key change message. +func (t *handshakeTransport) sendKexInit() error { + t.mu.Lock() + defer t.mu.Unlock() + if t.sentInitMsg != nil { + // kexInits may be sent either in response to the other side, + // or because our side wants to initiate a key change, so we + // may have already sent a kexInit. In that case, don't send a + // second kexInit. + return nil + } + + msg := &kexInitMsg{ + KexAlgos: t.config.KeyExchanges, + CiphersClientServer: t.config.Ciphers, + CiphersServerClient: t.config.Ciphers, + MACsClientServer: t.config.MACs, + MACsServerClient: t.config.MACs, + CompressionClientServer: supportedCompressions, + CompressionServerClient: supportedCompressions, + } + io.ReadFull(rand.Reader, msg.Cookie[:]) + + if len(t.hostKeys) > 0 { + for _, k := range t.hostKeys { + algo := k.PublicKey().Type() + switch algo { + case KeyAlgoRSA: + msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, []string{SigAlgoRSASHA2512, SigAlgoRSASHA2256, SigAlgoRSA}...) + case CertAlgoRSAv01: + msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, []string{CertSigAlgoRSASHA2512v01, CertSigAlgoRSASHA2256v01, CertSigAlgoRSAv01}...) + default: + msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, algo) + } + } + } else { + msg.ServerHostKeyAlgos = t.hostKeyAlgorithms + } + packet := Marshal(msg) + + // writePacket destroys the contents, so save a copy. + packetCopy := make([]byte, len(packet)) + copy(packetCopy, packet) + + if err := t.pushPacket(packetCopy); err != nil { + return err + } + + t.sentInitMsg = msg + t.sentInitPacket = packet + + return nil +} + +func (t *handshakeTransport) writePacket(p []byte) error { + switch p[0] { + case msgKexInit: + return errors.New("ssh: only handshakeTransport can send kexInit") + case msgNewKeys: + return errors.New("ssh: only handshakeTransport can send newKeys") + } + + t.mu.Lock() + defer t.mu.Unlock() + if t.writeError != nil { + return t.writeError + } + + if t.sentInitMsg != nil { + // Copy the packet so the writer can reuse the buffer. + cp := make([]byte, len(p)) + copy(cp, p) + t.pendingPackets = append(t.pendingPackets, cp) + return nil + } + + if t.writeBytesLeft > 0 { + t.writeBytesLeft -= int64(len(p)) + } else { + t.requestKeyExchange() + } + + if t.writePacketsLeft > 0 { + t.writePacketsLeft-- + } else { + t.requestKeyExchange() + } + + if err := t.pushPacket(p); err != nil { + t.writeError = err + } + + return nil +} + +func (t *handshakeTransport) Close() error { + return t.conn.Close() +} + +func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { + if debugHandshake { + log.Printf("%s entered key exchange", t.id()) + } + + otherInit := &kexInitMsg{} + if err := Unmarshal(otherInitPacket, otherInit); err != nil { + return err + } + + magics := handshakeMagics{ + clientVersion: t.clientVersion, + serverVersion: t.serverVersion, + clientKexInit: otherInitPacket, + serverKexInit: t.sentInitPacket, + } + + clientInit := otherInit + serverInit := t.sentInitMsg + isClient := len(t.hostKeys) == 0 + if isClient { + clientInit, serverInit = serverInit, clientInit + + magics.clientKexInit = t.sentInitPacket + magics.serverKexInit = otherInitPacket + } + + var err error + t.algorithms, err = findAgreedAlgorithms(isClient, clientInit, serverInit) + if err != nil { + return err + } + + // We don't send FirstKexFollows, but we handle receiving it. + // + // RFC 4253 section 7 defines the kex and the agreement method for + // first_kex_packet_follows. It states that the guessed packet + // should be ignored if the "kex algorithm and/or the host + // key algorithm is guessed wrong (server and client have + // different preferred algorithm), or if any of the other + // algorithms cannot be agreed upon". The other algorithms have + // already been checked above so the kex algorithm and host key + // algorithm are checked here. + if otherInit.FirstKexFollows && (clientInit.KexAlgos[0] != serverInit.KexAlgos[0] || clientInit.ServerHostKeyAlgos[0] != serverInit.ServerHostKeyAlgos[0]) { + // other side sent a kex message for the wrong algorithm, + // which we have to ignore. + if _, err := t.conn.readPacket(); err != nil { + return err + } + } + + kex, ok := kexAlgoMap[t.algorithms.kex] + if !ok { + return fmt.Errorf("ssh: unexpected key exchange algorithm %v", t.algorithms.kex) + } + + var result *kexResult + if len(t.hostKeys) > 0 { + result, err = t.server(kex, t.algorithms, &magics) + } else { + result, err = t.client(kex, t.algorithms, &magics) + } + + if err != nil { + return err + } + + if t.sessionID == nil { + t.sessionID = result.H + } + result.SessionID = t.sessionID + + if err := t.conn.prepareKeyChange(t.algorithms, result); err != nil { + return err + } + if err = t.conn.writePacket([]byte{msgNewKeys}); err != nil { + return err + } + if packet, err := t.conn.readPacket(); err != nil { + return err + } else if packet[0] != msgNewKeys { + return unexpectedMessageError(msgNewKeys, packet[0]) + } + + return nil +} + +func (t *handshakeTransport) server(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { + var hostKey Signer + for _, k := range t.hostKeys { + kt := k.PublicKey().Type() + if kt == algs.hostKey { + hostKey = k + } else if signer, ok := k.(AlgorithmSigner); ok { + // Some signature algorithms don't show up as key types + // so we have to manually check for a compatible host key. + switch kt { + case KeyAlgoRSA: + if algs.hostKey == SigAlgoRSASHA2256 || algs.hostKey == SigAlgoRSASHA2512 { + hostKey = &rsaSigner{signer, algs.hostKey} + } + case CertAlgoRSAv01: + if algs.hostKey == CertSigAlgoRSASHA2256v01 || algs.hostKey == CertSigAlgoRSASHA2512v01 { + hostKey = &rsaSigner{signer, certToPrivAlgo(algs.hostKey)} + } + } + } + } + + r, err := kex.Server(t.conn, t.config.Rand, magics, hostKey) + return r, err +} + +func (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { + result, err := kex.Client(t.conn, t.config.Rand, magics) + if err != nil { + return nil, err + } + + hostKey, err := ParsePublicKey(result.HostKey) + if err != nil { + return nil, err + } + + if err := verifyHostKeySignature(hostKey, algs.hostKey, result); err != nil { + return nil, err + } + + err = t.hostKeyCallback(t.dialAddress, t.remoteAddr, hostKey) + if err != nil { + return nil, err + } + + return result, nil +} diff --git a/vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go b/vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go new file mode 100644 index 0000000000..af81d26654 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go @@ -0,0 +1,93 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package bcrypt_pbkdf implements bcrypt_pbkdf(3) from OpenBSD. +// +// See https://flak.tedunangst.com/post/bcrypt-pbkdf and +// https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libutil/bcrypt_pbkdf.c. +package bcrypt_pbkdf + +import ( + "crypto/sha512" + "errors" + "golang.org/x/crypto/blowfish" +) + +const blockSize = 32 + +// Key derives a key from the password, salt and rounds count, returning a +// []byte of length keyLen that can be used as cryptographic key. +func Key(password, salt []byte, rounds, keyLen int) ([]byte, error) { + if rounds < 1 { + return nil, errors.New("bcrypt_pbkdf: number of rounds is too small") + } + if len(password) == 0 { + return nil, errors.New("bcrypt_pbkdf: empty password") + } + if len(salt) == 0 || len(salt) > 1<<20 { + return nil, errors.New("bcrypt_pbkdf: bad salt length") + } + if keyLen > 1024 { + return nil, errors.New("bcrypt_pbkdf: keyLen is too large") + } + + numBlocks := (keyLen + blockSize - 1) / blockSize + key := make([]byte, numBlocks*blockSize) + + h := sha512.New() + h.Write(password) + shapass := h.Sum(nil) + + shasalt := make([]byte, 0, sha512.Size) + cnt, tmp := make([]byte, 4), make([]byte, blockSize) + for block := 1; block <= numBlocks; block++ { + h.Reset() + h.Write(salt) + cnt[0] = byte(block >> 24) + cnt[1] = byte(block >> 16) + cnt[2] = byte(block >> 8) + cnt[3] = byte(block) + h.Write(cnt) + bcryptHash(tmp, shapass, h.Sum(shasalt)) + + out := make([]byte, blockSize) + copy(out, tmp) + for i := 2; i <= rounds; i++ { + h.Reset() + h.Write(tmp) + bcryptHash(tmp, shapass, h.Sum(shasalt)) + for j := 0; j < len(out); j++ { + out[j] ^= tmp[j] + } + } + + for i, v := range out { + key[i*numBlocks+(block-1)] = v + } + } + return key[:keyLen], nil +} + +var magic = []byte("OxychromaticBlowfishSwatDynamite") + +func bcryptHash(out, shapass, shasalt []byte) { + c, err := blowfish.NewSaltedCipher(shapass, shasalt) + if err != nil { + panic(err) + } + for i := 0; i < 64; i++ { + blowfish.ExpandKey(shasalt, c) + blowfish.ExpandKey(shapass, c) + } + copy(out, magic) + for i := 0; i < 32; i += 8 { + for j := 0; j < 64; j++ { + c.Encrypt(out[i:i+8], out[i:i+8]) + } + } + // Swap bytes due to different endianness. + for i := 0; i < 32; i += 4 { + out[i+3], out[i+2], out[i+1], out[i] = out[i], out[i+1], out[i+2], out[i+3] + } +} diff --git a/vendor/golang.org/x/crypto/ssh/kex.go b/vendor/golang.org/x/crypto/ssh/kex.go new file mode 100644 index 0000000000..766e929397 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/kex.go @@ -0,0 +1,782 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "crypto" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/subtle" + "encoding/binary" + "errors" + "fmt" + "io" + "math/big" + + "golang.org/x/crypto/curve25519" +) + +const ( + kexAlgoDH1SHA1 = "diffie-hellman-group1-sha1" + kexAlgoDH14SHA1 = "diffie-hellman-group14-sha1" + kexAlgoECDH256 = "ecdh-sha2-nistp256" + kexAlgoECDH384 = "ecdh-sha2-nistp384" + kexAlgoECDH521 = "ecdh-sha2-nistp521" + kexAlgoCurve25519SHA256 = "curve25519-sha256@libssh.org" + + // For the following kex only the client half contains a production + // ready implementation. The server half only consists of a minimal + // implementation to satisfy the automated tests. + kexAlgoDHGEXSHA1 = "diffie-hellman-group-exchange-sha1" + kexAlgoDHGEXSHA256 = "diffie-hellman-group-exchange-sha256" +) + +// kexResult captures the outcome of a key exchange. +type kexResult struct { + // Session hash. See also RFC 4253, section 8. + H []byte + + // Shared secret. See also RFC 4253, section 8. + K []byte + + // Host key as hashed into H. + HostKey []byte + + // Signature of H. + Signature []byte + + // A cryptographic hash function that matches the security + // level of the key exchange algorithm. It is used for + // calculating H, and for deriving keys from H and K. + Hash crypto.Hash + + // The session ID, which is the first H computed. This is used + // to derive key material inside the transport. + SessionID []byte +} + +// handshakeMagics contains data that is always included in the +// session hash. +type handshakeMagics struct { + clientVersion, serverVersion []byte + clientKexInit, serverKexInit []byte +} + +func (m *handshakeMagics) write(w io.Writer) { + writeString(w, m.clientVersion) + writeString(w, m.serverVersion) + writeString(w, m.clientKexInit) + writeString(w, m.serverKexInit) +} + +// kexAlgorithm abstracts different key exchange algorithms. +type kexAlgorithm interface { + // Server runs server-side key agreement, signing the result + // with a hostkey. + Server(p packetConn, rand io.Reader, magics *handshakeMagics, s Signer) (*kexResult, error) + + // Client runs the client-side key agreement. Caller is + // responsible for verifying the host key signature. + Client(p packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) +} + +// dhGroup is a multiplicative group suitable for implementing Diffie-Hellman key agreement. +type dhGroup struct { + g, p, pMinus1 *big.Int +} + +func (group *dhGroup) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) { + if theirPublic.Cmp(bigOne) <= 0 || theirPublic.Cmp(group.pMinus1) >= 0 { + return nil, errors.New("ssh: DH parameter out of bounds") + } + return new(big.Int).Exp(theirPublic, myPrivate, group.p), nil +} + +func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { + hashFunc := crypto.SHA1 + + var x *big.Int + for { + var err error + if x, err = rand.Int(randSource, group.pMinus1); err != nil { + return nil, err + } + if x.Sign() > 0 { + break + } + } + + X := new(big.Int).Exp(group.g, x, group.p) + kexDHInit := kexDHInitMsg{ + X: X, + } + if err := c.writePacket(Marshal(&kexDHInit)); err != nil { + return nil, err + } + + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var kexDHReply kexDHReplyMsg + if err = Unmarshal(packet, &kexDHReply); err != nil { + return nil, err + } + + ki, err := group.diffieHellman(kexDHReply.Y, x) + if err != nil { + return nil, err + } + + h := hashFunc.New() + magics.write(h) + writeString(h, kexDHReply.HostKey) + writeInt(h, X) + writeInt(h, kexDHReply.Y) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) + h.Write(K) + + return &kexResult{ + H: h.Sum(nil), + K: K, + HostKey: kexDHReply.HostKey, + Signature: kexDHReply.Signature, + Hash: crypto.SHA1, + }, nil +} + +func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { + hashFunc := crypto.SHA1 + packet, err := c.readPacket() + if err != nil { + return + } + var kexDHInit kexDHInitMsg + if err = Unmarshal(packet, &kexDHInit); err != nil { + return + } + + var y *big.Int + for { + if y, err = rand.Int(randSource, group.pMinus1); err != nil { + return + } + if y.Sign() > 0 { + break + } + } + + Y := new(big.Int).Exp(group.g, y, group.p) + ki, err := group.diffieHellman(kexDHInit.X, y) + if err != nil { + return nil, err + } + + hostKeyBytes := priv.PublicKey().Marshal() + + h := hashFunc.New() + magics.write(h) + writeString(h, hostKeyBytes) + writeInt(h, kexDHInit.X) + writeInt(h, Y) + + K := make([]byte, intLength(ki)) + marshalInt(K, ki) + h.Write(K) + + H := h.Sum(nil) + + // H is already a hash, but the hostkey signing will apply its + // own key-specific hash algorithm. + sig, err := signAndMarshal(priv, randSource, H) + if err != nil { + return nil, err + } + + kexDHReply := kexDHReplyMsg{ + HostKey: hostKeyBytes, + Y: Y, + Signature: sig, + } + packet = Marshal(&kexDHReply) + + err = c.writePacket(packet) + return &kexResult{ + H: H, + K: K, + HostKey: hostKeyBytes, + Signature: sig, + Hash: crypto.SHA1, + }, err +} + +// ecdh performs Elliptic Curve Diffie-Hellman key exchange as +// described in RFC 5656, section 4. +type ecdh struct { + curve elliptic.Curve +} + +func (kex *ecdh) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) { + ephKey, err := ecdsa.GenerateKey(kex.curve, rand) + if err != nil { + return nil, err + } + + kexInit := kexECDHInitMsg{ + ClientPubKey: elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y), + } + + serialized := Marshal(&kexInit) + if err := c.writePacket(serialized); err != nil { + return nil, err + } + + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var reply kexECDHReplyMsg + if err = Unmarshal(packet, &reply); err != nil { + return nil, err + } + + x, y, err := unmarshalECKey(kex.curve, reply.EphemeralPubKey) + if err != nil { + return nil, err + } + + // generate shared secret + secret, _ := kex.curve.ScalarMult(x, y, ephKey.D.Bytes()) + + h := ecHash(kex.curve).New() + magics.write(h) + writeString(h, reply.HostKey) + writeString(h, kexInit.ClientPubKey) + writeString(h, reply.EphemeralPubKey) + K := make([]byte, intLength(secret)) + marshalInt(K, secret) + h.Write(K) + + return &kexResult{ + H: h.Sum(nil), + K: K, + HostKey: reply.HostKey, + Signature: reply.Signature, + Hash: ecHash(kex.curve), + }, nil +} + +// unmarshalECKey parses and checks an EC key. +func unmarshalECKey(curve elliptic.Curve, pubkey []byte) (x, y *big.Int, err error) { + x, y = elliptic.Unmarshal(curve, pubkey) + if x == nil { + return nil, nil, errors.New("ssh: elliptic.Unmarshal failure") + } + if !validateECPublicKey(curve, x, y) { + return nil, nil, errors.New("ssh: public key not on curve") + } + return x, y, nil +} + +// validateECPublicKey checks that the point is a valid public key for +// the given curve. See [SEC1], 3.2.2 +func validateECPublicKey(curve elliptic.Curve, x, y *big.Int) bool { + if x.Sign() == 0 && y.Sign() == 0 { + return false + } + + if x.Cmp(curve.Params().P) >= 0 { + return false + } + + if y.Cmp(curve.Params().P) >= 0 { + return false + } + + if !curve.IsOnCurve(x, y) { + return false + } + + // We don't check if N * PubKey == 0, since + // + // - the NIST curves have cofactor = 1, so this is implicit. + // (We don't foresee an implementation that supports non NIST + // curves) + // + // - for ephemeral keys, we don't need to worry about small + // subgroup attacks. + return true +} + +func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var kexECDHInit kexECDHInitMsg + if err = Unmarshal(packet, &kexECDHInit); err != nil { + return nil, err + } + + clientX, clientY, err := unmarshalECKey(kex.curve, kexECDHInit.ClientPubKey) + if err != nil { + return nil, err + } + + // We could cache this key across multiple users/multiple + // connection attempts, but the benefit is small. OpenSSH + // generates a new key for each incoming connection. + ephKey, err := ecdsa.GenerateKey(kex.curve, rand) + if err != nil { + return nil, err + } + + hostKeyBytes := priv.PublicKey().Marshal() + + serializedEphKey := elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y) + + // generate shared secret + secret, _ := kex.curve.ScalarMult(clientX, clientY, ephKey.D.Bytes()) + + h := ecHash(kex.curve).New() + magics.write(h) + writeString(h, hostKeyBytes) + writeString(h, kexECDHInit.ClientPubKey) + writeString(h, serializedEphKey) + + K := make([]byte, intLength(secret)) + marshalInt(K, secret) + h.Write(K) + + H := h.Sum(nil) + + // H is already a hash, but the hostkey signing will apply its + // own key-specific hash algorithm. + sig, err := signAndMarshal(priv, rand, H) + if err != nil { + return nil, err + } + + reply := kexECDHReplyMsg{ + EphemeralPubKey: serializedEphKey, + HostKey: hostKeyBytes, + Signature: sig, + } + + serialized := Marshal(&reply) + if err := c.writePacket(serialized); err != nil { + return nil, err + } + + return &kexResult{ + H: H, + K: K, + HostKey: reply.HostKey, + Signature: sig, + Hash: ecHash(kex.curve), + }, nil +} + +var kexAlgoMap = map[string]kexAlgorithm{} + +func init() { + // This is the group called diffie-hellman-group1-sha1 in RFC + // 4253 and Oakley Group 2 in RFC 2409. + p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF", 16) + kexAlgoMap[kexAlgoDH1SHA1] = &dhGroup{ + g: new(big.Int).SetInt64(2), + p: p, + pMinus1: new(big.Int).Sub(p, bigOne), + } + + // This is the group called diffie-hellman-group14-sha1 in RFC + // 4253 and Oakley Group 14 in RFC 3526. + p, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) + + kexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{ + g: new(big.Int).SetInt64(2), + p: p, + pMinus1: new(big.Int).Sub(p, bigOne), + } + + kexAlgoMap[kexAlgoECDH521] = &ecdh{elliptic.P521()} + kexAlgoMap[kexAlgoECDH384] = &ecdh{elliptic.P384()} + kexAlgoMap[kexAlgoECDH256] = &ecdh{elliptic.P256()} + kexAlgoMap[kexAlgoCurve25519SHA256] = &curve25519sha256{} + kexAlgoMap[kexAlgoDHGEXSHA1] = &dhGEXSHA{hashFunc: crypto.SHA1} + kexAlgoMap[kexAlgoDHGEXSHA256] = &dhGEXSHA{hashFunc: crypto.SHA256} +} + +// curve25519sha256 implements the curve25519-sha256@libssh.org key +// agreement protocol, as described in +// https://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt +type curve25519sha256 struct{} + +type curve25519KeyPair struct { + priv [32]byte + pub [32]byte +} + +func (kp *curve25519KeyPair) generate(rand io.Reader) error { + if _, err := io.ReadFull(rand, kp.priv[:]); err != nil { + return err + } + curve25519.ScalarBaseMult(&kp.pub, &kp.priv) + return nil +} + +// curve25519Zeros is just an array of 32 zero bytes so that we have something +// convenient to compare against in order to reject curve25519 points with the +// wrong order. +var curve25519Zeros [32]byte + +func (kex *curve25519sha256) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) { + var kp curve25519KeyPair + if err := kp.generate(rand); err != nil { + return nil, err + } + if err := c.writePacket(Marshal(&kexECDHInitMsg{kp.pub[:]})); err != nil { + return nil, err + } + + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var reply kexECDHReplyMsg + if err = Unmarshal(packet, &reply); err != nil { + return nil, err + } + if len(reply.EphemeralPubKey) != 32 { + return nil, errors.New("ssh: peer's curve25519 public value has wrong length") + } + + var servPub, secret [32]byte + copy(servPub[:], reply.EphemeralPubKey) + curve25519.ScalarMult(&secret, &kp.priv, &servPub) + if subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 { + return nil, errors.New("ssh: peer's curve25519 public value has wrong order") + } + + h := crypto.SHA256.New() + magics.write(h) + writeString(h, reply.HostKey) + writeString(h, kp.pub[:]) + writeString(h, reply.EphemeralPubKey) + + ki := new(big.Int).SetBytes(secret[:]) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) + h.Write(K) + + return &kexResult{ + H: h.Sum(nil), + K: K, + HostKey: reply.HostKey, + Signature: reply.Signature, + Hash: crypto.SHA256, + }, nil +} + +func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { + packet, err := c.readPacket() + if err != nil { + return + } + var kexInit kexECDHInitMsg + if err = Unmarshal(packet, &kexInit); err != nil { + return + } + + if len(kexInit.ClientPubKey) != 32 { + return nil, errors.New("ssh: peer's curve25519 public value has wrong length") + } + + var kp curve25519KeyPair + if err := kp.generate(rand); err != nil { + return nil, err + } + + var clientPub, secret [32]byte + copy(clientPub[:], kexInit.ClientPubKey) + curve25519.ScalarMult(&secret, &kp.priv, &clientPub) + if subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 { + return nil, errors.New("ssh: peer's curve25519 public value has wrong order") + } + + hostKeyBytes := priv.PublicKey().Marshal() + + h := crypto.SHA256.New() + magics.write(h) + writeString(h, hostKeyBytes) + writeString(h, kexInit.ClientPubKey) + writeString(h, kp.pub[:]) + + ki := new(big.Int).SetBytes(secret[:]) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) + h.Write(K) + + H := h.Sum(nil) + + sig, err := signAndMarshal(priv, rand, H) + if err != nil { + return nil, err + } + + reply := kexECDHReplyMsg{ + EphemeralPubKey: kp.pub[:], + HostKey: hostKeyBytes, + Signature: sig, + } + if err := c.writePacket(Marshal(&reply)); err != nil { + return nil, err + } + return &kexResult{ + H: H, + K: K, + HostKey: hostKeyBytes, + Signature: sig, + Hash: crypto.SHA256, + }, nil +} + +// dhGEXSHA implements the diffie-hellman-group-exchange-sha1 and +// diffie-hellman-group-exchange-sha256 key agreement protocols, +// as described in RFC 4419 +type dhGEXSHA struct { + g, p *big.Int + hashFunc crypto.Hash +} + +const ( + dhGroupExchangeMinimumBits = 2048 + dhGroupExchangePreferredBits = 2048 + dhGroupExchangeMaximumBits = 8192 +) + +func (gex *dhGEXSHA) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) { + if theirPublic.Sign() <= 0 || theirPublic.Cmp(gex.p) >= 0 { + return nil, fmt.Errorf("ssh: DH parameter out of bounds") + } + return new(big.Int).Exp(theirPublic, myPrivate, gex.p), nil +} + +func (gex dhGEXSHA) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { + // Send GexRequest + kexDHGexRequest := kexDHGexRequestMsg{ + MinBits: dhGroupExchangeMinimumBits, + PreferedBits: dhGroupExchangePreferredBits, + MaxBits: dhGroupExchangeMaximumBits, + } + if err := c.writePacket(Marshal(&kexDHGexRequest)); err != nil { + return nil, err + } + + // Receive GexGroup + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var kexDHGexGroup kexDHGexGroupMsg + if err = Unmarshal(packet, &kexDHGexGroup); err != nil { + return nil, err + } + + // reject if p's bit length < dhGroupExchangeMinimumBits or > dhGroupExchangeMaximumBits + if kexDHGexGroup.P.BitLen() < dhGroupExchangeMinimumBits || kexDHGexGroup.P.BitLen() > dhGroupExchangeMaximumBits { + return nil, fmt.Errorf("ssh: server-generated gex p is out of range (%d bits)", kexDHGexGroup.P.BitLen()) + } + + gex.p = kexDHGexGroup.P + gex.g = kexDHGexGroup.G + + // Check if g is safe by verifing that g > 1 and g < p - 1 + one := big.NewInt(1) + var pMinusOne = &big.Int{} + pMinusOne.Sub(gex.p, one) + if gex.g.Cmp(one) != 1 && gex.g.Cmp(pMinusOne) != -1 { + return nil, fmt.Errorf("ssh: server provided gex g is not safe") + } + + // Send GexInit + var pHalf = &big.Int{} + pHalf.Rsh(gex.p, 1) + x, err := rand.Int(randSource, pHalf) + if err != nil { + return nil, err + } + X := new(big.Int).Exp(gex.g, x, gex.p) + kexDHGexInit := kexDHGexInitMsg{ + X: X, + } + if err := c.writePacket(Marshal(&kexDHGexInit)); err != nil { + return nil, err + } + + // Receive GexReply + packet, err = c.readPacket() + if err != nil { + return nil, err + } + + var kexDHGexReply kexDHGexReplyMsg + if err = Unmarshal(packet, &kexDHGexReply); err != nil { + return nil, err + } + + kInt, err := gex.diffieHellman(kexDHGexReply.Y, x) + if err != nil { + return nil, err + } + + // Check if k is safe by verifing that k > 1 and k < p - 1 + if kInt.Cmp(one) != 1 && kInt.Cmp(pMinusOne) != -1 { + return nil, fmt.Errorf("ssh: derived k is not safe") + } + + h := gex.hashFunc.New() + magics.write(h) + writeString(h, kexDHGexReply.HostKey) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMinimumBits)) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangePreferredBits)) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMaximumBits)) + writeInt(h, gex.p) + writeInt(h, gex.g) + writeInt(h, X) + writeInt(h, kexDHGexReply.Y) + K := make([]byte, intLength(kInt)) + marshalInt(K, kInt) + h.Write(K) + + return &kexResult{ + H: h.Sum(nil), + K: K, + HostKey: kexDHGexReply.HostKey, + Signature: kexDHGexReply.Signature, + Hash: gex.hashFunc, + }, nil +} + +// Server half implementation of the Diffie Hellman Key Exchange with SHA1 and SHA256. +// +// This is a minimal implementation to satisfy the automated tests. +func (gex dhGEXSHA) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { + // Receive GexRequest + packet, err := c.readPacket() + if err != nil { + return + } + var kexDHGexRequest kexDHGexRequestMsg + if err = Unmarshal(packet, &kexDHGexRequest); err != nil { + return + } + + // smoosh the user's preferred size into our own limits + if kexDHGexRequest.PreferedBits > dhGroupExchangeMaximumBits { + kexDHGexRequest.PreferedBits = dhGroupExchangeMaximumBits + } + if kexDHGexRequest.PreferedBits < dhGroupExchangeMinimumBits { + kexDHGexRequest.PreferedBits = dhGroupExchangeMinimumBits + } + // fix min/max if they're inconsistent. technically, we could just pout + // and hang up, but there's no harm in giving them the benefit of the + // doubt and just picking a bitsize for them. + if kexDHGexRequest.MinBits > kexDHGexRequest.PreferedBits { + kexDHGexRequest.MinBits = kexDHGexRequest.PreferedBits + } + if kexDHGexRequest.MaxBits < kexDHGexRequest.PreferedBits { + kexDHGexRequest.MaxBits = kexDHGexRequest.PreferedBits + } + + // Send GexGroup + // This is the group called diffie-hellman-group14-sha1 in RFC + // 4253 and Oakley Group 14 in RFC 3526. + p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) + gex.p = p + gex.g = big.NewInt(2) + + kexDHGexGroup := kexDHGexGroupMsg{ + P: gex.p, + G: gex.g, + } + if err := c.writePacket(Marshal(&kexDHGexGroup)); err != nil { + return nil, err + } + + // Receive GexInit + packet, err = c.readPacket() + if err != nil { + return + } + var kexDHGexInit kexDHGexInitMsg + if err = Unmarshal(packet, &kexDHGexInit); err != nil { + return + } + + var pHalf = &big.Int{} + pHalf.Rsh(gex.p, 1) + + y, err := rand.Int(randSource, pHalf) + if err != nil { + return + } + + Y := new(big.Int).Exp(gex.g, y, gex.p) + kInt, err := gex.diffieHellman(kexDHGexInit.X, y) + if err != nil { + return nil, err + } + + hostKeyBytes := priv.PublicKey().Marshal() + + h := gex.hashFunc.New() + magics.write(h) + writeString(h, hostKeyBytes) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMinimumBits)) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangePreferredBits)) + binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMaximumBits)) + writeInt(h, gex.p) + writeInt(h, gex.g) + writeInt(h, kexDHGexInit.X) + writeInt(h, Y) + + K := make([]byte, intLength(kInt)) + marshalInt(K, kInt) + h.Write(K) + + H := h.Sum(nil) + + // H is already a hash, but the hostkey signing will apply its + // own key-specific hash algorithm. + sig, err := signAndMarshal(priv, randSource, H) + if err != nil { + return nil, err + } + + kexDHGexReply := kexDHGexReplyMsg{ + HostKey: hostKeyBytes, + Y: Y, + Signature: sig, + } + packet = Marshal(&kexDHGexReply) + + err = c.writePacket(packet) + + return &kexResult{ + H: H, + K: K, + HostKey: hostKeyBytes, + Signature: sig, + Hash: gex.hashFunc, + }, err +} diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go new file mode 100644 index 0000000000..c67d3a31cb --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -0,0 +1,1483 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "crypto" + "crypto/aes" + "crypto/cipher" + "crypto/dsa" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/md5" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/asn1" + "encoding/base64" + "encoding/hex" + "encoding/pem" + "errors" + "fmt" + "io" + "math/big" + "strings" + + "golang.org/x/crypto/ed25519" + "golang.org/x/crypto/ssh/internal/bcrypt_pbkdf" +) + +// These constants represent the algorithm names for key types supported by this +// package. +const ( + KeyAlgoRSA = "ssh-rsa" + KeyAlgoDSA = "ssh-dss" + KeyAlgoECDSA256 = "ecdsa-sha2-nistp256" + KeyAlgoSKECDSA256 = "sk-ecdsa-sha2-nistp256@openssh.com" + KeyAlgoECDSA384 = "ecdsa-sha2-nistp384" + KeyAlgoECDSA521 = "ecdsa-sha2-nistp521" + KeyAlgoED25519 = "ssh-ed25519" + KeyAlgoSKED25519 = "sk-ssh-ed25519@openssh.com" +) + +// These constants represent non-default signature algorithms that are supported +// as algorithm parameters to AlgorithmSigner.SignWithAlgorithm methods. See +// [PROTOCOL.agent] section 4.5.1 and +// https://tools.ietf.org/html/draft-ietf-curdle-rsa-sha2-10 +const ( + SigAlgoRSA = "ssh-rsa" + SigAlgoRSASHA2256 = "rsa-sha2-256" + SigAlgoRSASHA2512 = "rsa-sha2-512" +) + +// parsePubKey parses a public key of the given algorithm. +// Use ParsePublicKey for keys with prepended algorithm. +func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) { + switch algo { + case KeyAlgoRSA: + return parseRSA(in) + case KeyAlgoDSA: + return parseDSA(in) + case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521: + return parseECDSA(in) + case KeyAlgoSKECDSA256: + return parseSKECDSA(in) + case KeyAlgoED25519: + return parseED25519(in) + case KeyAlgoSKED25519: + return parseSKEd25519(in) + case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoSKECDSA256v01, CertAlgoED25519v01, CertAlgoSKED25519v01: + cert, err := parseCert(in, certToPrivAlgo(algo)) + if err != nil { + return nil, nil, err + } + return cert, nil, nil + } + return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", algo) +} + +// parseAuthorizedKey parses a public key in OpenSSH authorized_keys format +// (see sshd(8) manual page) once the options and key type fields have been +// removed. +func parseAuthorizedKey(in []byte) (out PublicKey, comment string, err error) { + in = bytes.TrimSpace(in) + + i := bytes.IndexAny(in, " \t") + if i == -1 { + i = len(in) + } + base64Key := in[:i] + + key := make([]byte, base64.StdEncoding.DecodedLen(len(base64Key))) + n, err := base64.StdEncoding.Decode(key, base64Key) + if err != nil { + return nil, "", err + } + key = key[:n] + out, err = ParsePublicKey(key) + if err != nil { + return nil, "", err + } + comment = string(bytes.TrimSpace(in[i:])) + return out, comment, nil +} + +// ParseKnownHosts parses an entry in the format of the known_hosts file. +// +// The known_hosts format is documented in the sshd(8) manual page. This +// function will parse a single entry from in. On successful return, marker +// will contain the optional marker value (i.e. "cert-authority" or "revoked") +// or else be empty, hosts will contain the hosts that this entry matches, +// pubKey will contain the public key and comment will contain any trailing +// comment at the end of the line. See the sshd(8) manual page for the various +// forms that a host string can take. +// +// The unparsed remainder of the input will be returned in rest. This function +// can be called repeatedly to parse multiple entries. +// +// If no entries were found in the input then err will be io.EOF. Otherwise a +// non-nil err value indicates a parse error. +func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey, comment string, rest []byte, err error) { + for len(in) > 0 { + end := bytes.IndexByte(in, '\n') + if end != -1 { + rest = in[end+1:] + in = in[:end] + } else { + rest = nil + } + + end = bytes.IndexByte(in, '\r') + if end != -1 { + in = in[:end] + } + + in = bytes.TrimSpace(in) + if len(in) == 0 || in[0] == '#' { + in = rest + continue + } + + i := bytes.IndexAny(in, " \t") + if i == -1 { + in = rest + continue + } + + // Strip out the beginning of the known_host key. + // This is either an optional marker or a (set of) hostname(s). + keyFields := bytes.Fields(in) + if len(keyFields) < 3 || len(keyFields) > 5 { + return "", nil, nil, "", nil, errors.New("ssh: invalid entry in known_hosts data") + } + + // keyFields[0] is either "@cert-authority", "@revoked" or a comma separated + // list of hosts + marker := "" + if keyFields[0][0] == '@' { + marker = string(keyFields[0][1:]) + keyFields = keyFields[1:] + } + + hosts := string(keyFields[0]) + // keyFields[1] contains the key type (e.g. “ssh-rsa”). + // However, that information is duplicated inside the + // base64-encoded key and so is ignored here. + + key := bytes.Join(keyFields[2:], []byte(" ")) + if pubKey, comment, err = parseAuthorizedKey(key); err != nil { + return "", nil, nil, "", nil, err + } + + return marker, strings.Split(hosts, ","), pubKey, comment, rest, nil + } + + return "", nil, nil, "", nil, io.EOF +} + +// ParseAuthorizedKeys parses a public key from an authorized_keys +// file used in OpenSSH according to the sshd(8) manual page. +func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) { + for len(in) > 0 { + end := bytes.IndexByte(in, '\n') + if end != -1 { + rest = in[end+1:] + in = in[:end] + } else { + rest = nil + } + + end = bytes.IndexByte(in, '\r') + if end != -1 { + in = in[:end] + } + + in = bytes.TrimSpace(in) + if len(in) == 0 || in[0] == '#' { + in = rest + continue + } + + i := bytes.IndexAny(in, " \t") + if i == -1 { + in = rest + continue + } + + if out, comment, err = parseAuthorizedKey(in[i:]); err == nil { + return out, comment, options, rest, nil + } + + // No key type recognised. Maybe there's an options field at + // the beginning. + var b byte + inQuote := false + var candidateOptions []string + optionStart := 0 + for i, b = range in { + isEnd := !inQuote && (b == ' ' || b == '\t') + if (b == ',' && !inQuote) || isEnd { + if i-optionStart > 0 { + candidateOptions = append(candidateOptions, string(in[optionStart:i])) + } + optionStart = i + 1 + } + if isEnd { + break + } + if b == '"' && (i == 0 || (i > 0 && in[i-1] != '\\')) { + inQuote = !inQuote + } + } + for i < len(in) && (in[i] == ' ' || in[i] == '\t') { + i++ + } + if i == len(in) { + // Invalid line: unmatched quote + in = rest + continue + } + + in = in[i:] + i = bytes.IndexAny(in, " \t") + if i == -1 { + in = rest + continue + } + + if out, comment, err = parseAuthorizedKey(in[i:]); err == nil { + options = candidateOptions + return out, comment, options, rest, nil + } + + in = rest + continue + } + + return nil, "", nil, nil, errors.New("ssh: no key found") +} + +// ParsePublicKey parses an SSH public key formatted for use in +// the SSH wire protocol according to RFC 4253, section 6.6. +func ParsePublicKey(in []byte) (out PublicKey, err error) { + algo, in, ok := parseString(in) + if !ok { + return nil, errShortRead + } + var rest []byte + out, rest, err = parsePubKey(in, string(algo)) + if len(rest) > 0 { + return nil, errors.New("ssh: trailing junk in public key") + } + + return out, err +} + +// MarshalAuthorizedKey serializes key for inclusion in an OpenSSH +// authorized_keys file. The return value ends with newline. +func MarshalAuthorizedKey(key PublicKey) []byte { + b := &bytes.Buffer{} + b.WriteString(key.Type()) + b.WriteByte(' ') + e := base64.NewEncoder(base64.StdEncoding, b) + e.Write(key.Marshal()) + e.Close() + b.WriteByte('\n') + return b.Bytes() +} + +// PublicKey is an abstraction of different types of public keys. +type PublicKey interface { + // Type returns the key's type, e.g. "ssh-rsa". + Type() string + + // Marshal returns the serialized key data in SSH wire format, + // with the name prefix. To unmarshal the returned data, use + // the ParsePublicKey function. + Marshal() []byte + + // Verify that sig is a signature on the given data using this + // key. This function will hash the data appropriately first. + Verify(data []byte, sig *Signature) error +} + +// CryptoPublicKey, if implemented by a PublicKey, +// returns the underlying crypto.PublicKey form of the key. +type CryptoPublicKey interface { + CryptoPublicKey() crypto.PublicKey +} + +// A Signer can create signatures that verify against a public key. +type Signer interface { + // PublicKey returns an associated PublicKey instance. + PublicKey() PublicKey + + // Sign returns raw signature for the given data. This method + // will apply the hash specified for the keytype to the data. + Sign(rand io.Reader, data []byte) (*Signature, error) +} + +// A AlgorithmSigner is a Signer that also supports specifying a specific +// algorithm to use for signing. +type AlgorithmSigner interface { + Signer + + // SignWithAlgorithm is like Signer.Sign, but allows specification of a + // non-default signing algorithm. See the SigAlgo* constants in this + // package for signature algorithms supported by this package. Callers may + // pass an empty string for the algorithm in which case the AlgorithmSigner + // will use its default algorithm. + SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) +} + +type rsaPublicKey rsa.PublicKey + +func (r *rsaPublicKey) Type() string { + return "ssh-rsa" +} + +// parseRSA parses an RSA key according to RFC 4253, section 6.6. +func parseRSA(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + E *big.Int + N *big.Int + Rest []byte `ssh:"rest"` + } + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + if w.E.BitLen() > 24 { + return nil, nil, errors.New("ssh: exponent too large") + } + e := w.E.Int64() + if e < 3 || e&1 == 0 { + return nil, nil, errors.New("ssh: incorrect exponent") + } + + var key rsa.PublicKey + key.E = int(e) + key.N = w.N + return (*rsaPublicKey)(&key), w.Rest, nil +} + +func (r *rsaPublicKey) Marshal() []byte { + e := new(big.Int).SetInt64(int64(r.E)) + // RSA publickey struct layout should match the struct used by + // parseRSACert in the x/crypto/ssh/agent package. + wirekey := struct { + Name string + E *big.Int + N *big.Int + }{ + KeyAlgoRSA, + e, + r.N, + } + return Marshal(&wirekey) +} + +func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { + var hash crypto.Hash + switch sig.Format { + case SigAlgoRSA: + hash = crypto.SHA1 + case SigAlgoRSASHA2256: + hash = crypto.SHA256 + case SigAlgoRSASHA2512: + hash = crypto.SHA512 + default: + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) + } + h := hash.New() + h.Write(data) + digest := h.Sum(nil) + return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), hash, digest, sig.Blob) +} + +func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { + return (*rsa.PublicKey)(r) +} + +type dsaPublicKey dsa.PublicKey + +func (k *dsaPublicKey) Type() string { + return "ssh-dss" +} + +func checkDSAParams(param *dsa.Parameters) error { + // SSH specifies FIPS 186-2, which only provided a single size + // (1024 bits) DSA key. FIPS 186-3 allows for larger key + // sizes, which would confuse SSH. + if l := param.P.BitLen(); l != 1024 { + return fmt.Errorf("ssh: unsupported DSA key size %d", l) + } + + return nil +} + +// parseDSA parses an DSA key according to RFC 4253, section 6.6. +func parseDSA(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + P, Q, G, Y *big.Int + Rest []byte `ssh:"rest"` + } + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + param := dsa.Parameters{ + P: w.P, + Q: w.Q, + G: w.G, + } + if err := checkDSAParams(¶m); err != nil { + return nil, nil, err + } + + key := &dsaPublicKey{ + Parameters: param, + Y: w.Y, + } + return key, w.Rest, nil +} + +func (k *dsaPublicKey) Marshal() []byte { + // DSA publickey struct layout should match the struct used by + // parseDSACert in the x/crypto/ssh/agent package. + w := struct { + Name string + P, Q, G, Y *big.Int + }{ + k.Type(), + k.P, + k.Q, + k.G, + k.Y, + } + + return Marshal(&w) +} + +func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + h := crypto.SHA1.New() + h.Write(data) + digest := h.Sum(nil) + + // Per RFC 4253, section 6.6, + // The value for 'dss_signature_blob' is encoded as a string containing + // r, followed by s (which are 160-bit integers, without lengths or + // padding, unsigned, and in network byte order). + // For DSS purposes, sig.Blob should be exactly 40 bytes in length. + if len(sig.Blob) != 40 { + return errors.New("ssh: DSA signature parse error") + } + r := new(big.Int).SetBytes(sig.Blob[:20]) + s := new(big.Int).SetBytes(sig.Blob[20:]) + if dsa.Verify((*dsa.PublicKey)(k), digest, r, s) { + return nil + } + return errors.New("ssh: signature did not verify") +} + +func (k *dsaPublicKey) CryptoPublicKey() crypto.PublicKey { + return (*dsa.PublicKey)(k) +} + +type dsaPrivateKey struct { + *dsa.PrivateKey +} + +func (k *dsaPrivateKey) PublicKey() PublicKey { + return (*dsaPublicKey)(&k.PrivateKey.PublicKey) +} + +func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { + return k.SignWithAlgorithm(rand, data, "") +} + +func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { + if algorithm != "" && algorithm != k.PublicKey().Type() { + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + + h := crypto.SHA1.New() + h.Write(data) + digest := h.Sum(nil) + r, s, err := dsa.Sign(rand, k.PrivateKey, digest) + if err != nil { + return nil, err + } + + sig := make([]byte, 40) + rb := r.Bytes() + sb := s.Bytes() + + copy(sig[20-len(rb):20], rb) + copy(sig[40-len(sb):], sb) + + return &Signature{ + Format: k.PublicKey().Type(), + Blob: sig, + }, nil +} + +type ecdsaPublicKey ecdsa.PublicKey + +func (k *ecdsaPublicKey) Type() string { + return "ecdsa-sha2-" + k.nistID() +} + +func (k *ecdsaPublicKey) nistID() string { + switch k.Params().BitSize { + case 256: + return "nistp256" + case 384: + return "nistp384" + case 521: + return "nistp521" + } + panic("ssh: unsupported ecdsa key size") +} + +type ed25519PublicKey ed25519.PublicKey + +func (k ed25519PublicKey) Type() string { + return KeyAlgoED25519 +} + +func parseED25519(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + KeyBytes []byte + Rest []byte `ssh:"rest"` + } + + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + if l := len(w.KeyBytes); l != ed25519.PublicKeySize { + return nil, nil, fmt.Errorf("invalid size %d for Ed25519 public key", l) + } + + return ed25519PublicKey(w.KeyBytes), w.Rest, nil +} + +func (k ed25519PublicKey) Marshal() []byte { + w := struct { + Name string + KeyBytes []byte + }{ + KeyAlgoED25519, + []byte(k), + } + return Marshal(&w) +} + +func (k ed25519PublicKey) Verify(b []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + if l := len(k); l != ed25519.PublicKeySize { + return fmt.Errorf("ssh: invalid size %d for Ed25519 public key", l) + } + + if ok := ed25519.Verify(ed25519.PublicKey(k), b, sig.Blob); !ok { + return errors.New("ssh: signature did not verify") + } + + return nil +} + +func (k ed25519PublicKey) CryptoPublicKey() crypto.PublicKey { + return ed25519.PublicKey(k) +} + +func supportedEllipticCurve(curve elliptic.Curve) bool { + return curve == elliptic.P256() || curve == elliptic.P384() || curve == elliptic.P521() +} + +// ecHash returns the hash to match the given elliptic curve, see RFC +// 5656, section 6.2.1 +func ecHash(curve elliptic.Curve) crypto.Hash { + bitSize := curve.Params().BitSize + switch { + case bitSize <= 256: + return crypto.SHA256 + case bitSize <= 384: + return crypto.SHA384 + } + return crypto.SHA512 +} + +// parseECDSA parses an ECDSA key according to RFC 5656, section 3.1. +func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + Curve string + KeyBytes []byte + Rest []byte `ssh:"rest"` + } + + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + key := new(ecdsa.PublicKey) + + switch w.Curve { + case "nistp256": + key.Curve = elliptic.P256() + case "nistp384": + key.Curve = elliptic.P384() + case "nistp521": + key.Curve = elliptic.P521() + default: + return nil, nil, errors.New("ssh: unsupported curve") + } + + key.X, key.Y = elliptic.Unmarshal(key.Curve, w.KeyBytes) + if key.X == nil || key.Y == nil { + return nil, nil, errors.New("ssh: invalid curve point") + } + return (*ecdsaPublicKey)(key), w.Rest, nil +} + +func (k *ecdsaPublicKey) Marshal() []byte { + // See RFC 5656, section 3.1. + keyBytes := elliptic.Marshal(k.Curve, k.X, k.Y) + // ECDSA publickey struct layout should match the struct used by + // parseECDSACert in the x/crypto/ssh/agent package. + w := struct { + Name string + ID string + Key []byte + }{ + k.Type(), + k.nistID(), + keyBytes, + } + + return Marshal(&w) +} + +func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + + h := ecHash(k.Curve).New() + h.Write(data) + digest := h.Sum(nil) + + // Per RFC 5656, section 3.1.2, + // The ecdsa_signature_blob value has the following specific encoding: + // mpint r + // mpint s + var ecSig struct { + R *big.Int + S *big.Int + } + + if err := Unmarshal(sig.Blob, &ecSig); err != nil { + return err + } + + if ecdsa.Verify((*ecdsa.PublicKey)(k), digest, ecSig.R, ecSig.S) { + return nil + } + return errors.New("ssh: signature did not verify") +} + +func (k *ecdsaPublicKey) CryptoPublicKey() crypto.PublicKey { + return (*ecdsa.PublicKey)(k) +} + +// skFields holds the additional fields present in U2F/FIDO2 signatures. +// See openssh/PROTOCOL.u2f 'SSH U2F Signatures' for details. +type skFields struct { + // Flags contains U2F/FIDO2 flags such as 'user present' + Flags byte + // Counter is a monotonic signature counter which can be + // used to detect concurrent use of a private key, should + // it be extracted from hardware. + Counter uint32 +} + +type skECDSAPublicKey struct { + // application is a URL-like string, typically "ssh:" for SSH. + // see openssh/PROTOCOL.u2f for details. + application string + ecdsa.PublicKey +} + +func (k *skECDSAPublicKey) Type() string { + return KeyAlgoSKECDSA256 +} + +func (k *skECDSAPublicKey) nistID() string { + return "nistp256" +} + +func parseSKECDSA(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + Curve string + KeyBytes []byte + Application string + Rest []byte `ssh:"rest"` + } + + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + key := new(skECDSAPublicKey) + key.application = w.Application + + if w.Curve != "nistp256" { + return nil, nil, errors.New("ssh: unsupported curve") + } + key.Curve = elliptic.P256() + + key.X, key.Y = elliptic.Unmarshal(key.Curve, w.KeyBytes) + if key.X == nil || key.Y == nil { + return nil, nil, errors.New("ssh: invalid curve point") + } + + return key, w.Rest, nil +} + +func (k *skECDSAPublicKey) Marshal() []byte { + // See RFC 5656, section 3.1. + keyBytes := elliptic.Marshal(k.Curve, k.X, k.Y) + w := struct { + Name string + ID string + Key []byte + Application string + }{ + k.Type(), + k.nistID(), + keyBytes, + k.application, + } + + return Marshal(&w) +} + +func (k *skECDSAPublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + + h := ecHash(k.Curve).New() + h.Write([]byte(k.application)) + appDigest := h.Sum(nil) + + h.Reset() + h.Write(data) + dataDigest := h.Sum(nil) + + var ecSig struct { + R *big.Int + S *big.Int + } + if err := Unmarshal(sig.Blob, &ecSig); err != nil { + return err + } + + var skf skFields + if err := Unmarshal(sig.Rest, &skf); err != nil { + return err + } + + blob := struct { + ApplicationDigest []byte `ssh:"rest"` + Flags byte + Counter uint32 + MessageDigest []byte `ssh:"rest"` + }{ + appDigest, + skf.Flags, + skf.Counter, + dataDigest, + } + + original := Marshal(blob) + + h.Reset() + h.Write(original) + digest := h.Sum(nil) + + if ecdsa.Verify((*ecdsa.PublicKey)(&k.PublicKey), digest, ecSig.R, ecSig.S) { + return nil + } + return errors.New("ssh: signature did not verify") +} + +type skEd25519PublicKey struct { + // application is a URL-like string, typically "ssh:" for SSH. + // see openssh/PROTOCOL.u2f for details. + application string + ed25519.PublicKey +} + +func (k *skEd25519PublicKey) Type() string { + return KeyAlgoSKED25519 +} + +func parseSKEd25519(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + KeyBytes []byte + Application string + Rest []byte `ssh:"rest"` + } + + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + if l := len(w.KeyBytes); l != ed25519.PublicKeySize { + return nil, nil, fmt.Errorf("invalid size %d for Ed25519 public key", l) + } + + key := new(skEd25519PublicKey) + key.application = w.Application + key.PublicKey = ed25519.PublicKey(w.KeyBytes) + + return key, w.Rest, nil +} + +func (k *skEd25519PublicKey) Marshal() []byte { + w := struct { + Name string + KeyBytes []byte + Application string + }{ + KeyAlgoSKED25519, + []byte(k.PublicKey), + k.application, + } + return Marshal(&w) +} + +func (k *skEd25519PublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + if l := len(k.PublicKey); l != ed25519.PublicKeySize { + return fmt.Errorf("invalid size %d for Ed25519 public key", l) + } + + h := sha256.New() + h.Write([]byte(k.application)) + appDigest := h.Sum(nil) + + h.Reset() + h.Write(data) + dataDigest := h.Sum(nil) + + var edSig struct { + Signature []byte `ssh:"rest"` + } + + if err := Unmarshal(sig.Blob, &edSig); err != nil { + return err + } + + var skf skFields + if err := Unmarshal(sig.Rest, &skf); err != nil { + return err + } + + blob := struct { + ApplicationDigest []byte `ssh:"rest"` + Flags byte + Counter uint32 + MessageDigest []byte `ssh:"rest"` + }{ + appDigest, + skf.Flags, + skf.Counter, + dataDigest, + } + + original := Marshal(blob) + + if ok := ed25519.Verify(k.PublicKey, original, edSig.Signature); !ok { + return errors.New("ssh: signature did not verify") + } + + return nil +} + +// NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey, +// *ecdsa.PrivateKey or any other crypto.Signer and returns a +// corresponding Signer instance. ECDSA keys must use P-256, P-384 or +// P-521. DSA keys must use parameter size L1024N160. +func NewSignerFromKey(key interface{}) (Signer, error) { + switch key := key.(type) { + case crypto.Signer: + return NewSignerFromSigner(key) + case *dsa.PrivateKey: + return newDSAPrivateKey(key) + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } +} + +func newDSAPrivateKey(key *dsa.PrivateKey) (Signer, error) { + if err := checkDSAParams(&key.PublicKey.Parameters); err != nil { + return nil, err + } + + return &dsaPrivateKey{key}, nil +} + +type rsaSigner struct { + AlgorithmSigner + defaultAlgorithm string +} + +func (s *rsaSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { + return s.AlgorithmSigner.SignWithAlgorithm(rand, data, s.defaultAlgorithm) +} + +type wrappedSigner struct { + signer crypto.Signer + pubKey PublicKey +} + +// NewSignerFromSigner takes any crypto.Signer implementation and +// returns a corresponding Signer interface. This can be used, for +// example, with keys kept in hardware modules. +func NewSignerFromSigner(signer crypto.Signer) (Signer, error) { + pubKey, err := NewPublicKey(signer.Public()) + if err != nil { + return nil, err + } + + return &wrappedSigner{signer, pubKey}, nil +} + +func (s *wrappedSigner) PublicKey() PublicKey { + return s.pubKey +} + +func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { + return s.SignWithAlgorithm(rand, data, "") +} + +func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { + var hashFunc crypto.Hash + + if _, ok := s.pubKey.(*rsaPublicKey); ok { + // RSA keys support a few hash functions determined by the requested signature algorithm + switch algorithm { + case "", SigAlgoRSA: + algorithm = SigAlgoRSA + hashFunc = crypto.SHA1 + case SigAlgoRSASHA2256: + hashFunc = crypto.SHA256 + case SigAlgoRSASHA2512: + hashFunc = crypto.SHA512 + default: + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + } else { + // The only supported algorithm for all other key types is the same as the type of the key + if algorithm == "" { + algorithm = s.pubKey.Type() + } else if algorithm != s.pubKey.Type() { + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + + switch key := s.pubKey.(type) { + case *dsaPublicKey: + hashFunc = crypto.SHA1 + case *ecdsaPublicKey: + hashFunc = ecHash(key.Curve) + case ed25519PublicKey: + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } + } + + var digest []byte + if hashFunc != 0 { + h := hashFunc.New() + h.Write(data) + digest = h.Sum(nil) + } else { + digest = data + } + + signature, err := s.signer.Sign(rand, digest, hashFunc) + if err != nil { + return nil, err + } + + // crypto.Signer.Sign is expected to return an ASN.1-encoded signature + // for ECDSA and DSA, but that's not the encoding expected by SSH, so + // re-encode. + switch s.pubKey.(type) { + case *ecdsaPublicKey, *dsaPublicKey: + type asn1Signature struct { + R, S *big.Int + } + asn1Sig := new(asn1Signature) + _, err := asn1.Unmarshal(signature, asn1Sig) + if err != nil { + return nil, err + } + + switch s.pubKey.(type) { + case *ecdsaPublicKey: + signature = Marshal(asn1Sig) + + case *dsaPublicKey: + signature = make([]byte, 40) + r := asn1Sig.R.Bytes() + s := asn1Sig.S.Bytes() + copy(signature[20-len(r):20], r) + copy(signature[40-len(s):40], s) + } + } + + return &Signature{ + Format: algorithm, + Blob: signature, + }, nil +} + +// NewPublicKey takes an *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey, +// or ed25519.PublicKey returns a corresponding PublicKey instance. +// ECDSA keys must use P-256, P-384 or P-521. +func NewPublicKey(key interface{}) (PublicKey, error) { + switch key := key.(type) { + case *rsa.PublicKey: + return (*rsaPublicKey)(key), nil + case *ecdsa.PublicKey: + if !supportedEllipticCurve(key.Curve) { + return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported") + } + return (*ecdsaPublicKey)(key), nil + case *dsa.PublicKey: + return (*dsaPublicKey)(key), nil + case ed25519.PublicKey: + if l := len(key); l != ed25519.PublicKeySize { + return nil, fmt.Errorf("ssh: invalid size %d for Ed25519 public key", l) + } + return ed25519PublicKey(key), nil + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } +} + +// ParsePrivateKey returns a Signer from a PEM encoded private key. It supports +// the same keys as ParseRawPrivateKey. If the private key is encrypted, it +// will return a PassphraseMissingError. +func ParsePrivateKey(pemBytes []byte) (Signer, error) { + key, err := ParseRawPrivateKey(pemBytes) + if err != nil { + return nil, err + } + + return NewSignerFromKey(key) +} + +// ParsePrivateKeyWithPassphrase returns a Signer from a PEM encoded private +// key and passphrase. It supports the same keys as +// ParseRawPrivateKeyWithPassphrase. +func ParsePrivateKeyWithPassphrase(pemBytes, passphrase []byte) (Signer, error) { + key, err := ParseRawPrivateKeyWithPassphrase(pemBytes, passphrase) + if err != nil { + return nil, err + } + + return NewSignerFromKey(key) +} + +// encryptedBlock tells whether a private key is +// encrypted by examining its Proc-Type header +// for a mention of ENCRYPTED +// according to RFC 1421 Section 4.6.1.1. +func encryptedBlock(block *pem.Block) bool { + return strings.Contains(block.Headers["Proc-Type"], "ENCRYPTED") +} + +// A PassphraseMissingError indicates that parsing this private key requires a +// passphrase. Use ParsePrivateKeyWithPassphrase. +type PassphraseMissingError struct { + // PublicKey will be set if the private key format includes an unencrypted + // public key along with the encrypted private key. + PublicKey PublicKey +} + +func (*PassphraseMissingError) Error() string { + return "ssh: this private key is passphrase protected" +} + +// ParseRawPrivateKey returns a private key from a PEM encoded private key. It +// supports RSA (PKCS#1), PKCS#8, DSA (OpenSSL), and ECDSA private keys. If the +// private key is encrypted, it will return a PassphraseMissingError. +func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { + block, _ := pem.Decode(pemBytes) + if block == nil { + return nil, errors.New("ssh: no key found") + } + + if encryptedBlock(block) { + return nil, &PassphraseMissingError{} + } + + switch block.Type { + case "RSA PRIVATE KEY": + return x509.ParsePKCS1PrivateKey(block.Bytes) + // RFC5208 - https://tools.ietf.org/html/rfc5208 + case "PRIVATE KEY": + return x509.ParsePKCS8PrivateKey(block.Bytes) + case "EC PRIVATE KEY": + return x509.ParseECPrivateKey(block.Bytes) + case "DSA PRIVATE KEY": + return ParseDSAPrivateKey(block.Bytes) + case "OPENSSH PRIVATE KEY": + return parseOpenSSHPrivateKey(block.Bytes, unencryptedOpenSSHKey) + default: + return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) + } +} + +// ParseRawPrivateKeyWithPassphrase returns a private key decrypted with +// passphrase from a PEM encoded private key. If the passphrase is wrong, it +// will return x509.IncorrectPasswordError. +func ParseRawPrivateKeyWithPassphrase(pemBytes, passphrase []byte) (interface{}, error) { + block, _ := pem.Decode(pemBytes) + if block == nil { + return nil, errors.New("ssh: no key found") + } + + if block.Type == "OPENSSH PRIVATE KEY" { + return parseOpenSSHPrivateKey(block.Bytes, passphraseProtectedOpenSSHKey(passphrase)) + } + + if !encryptedBlock(block) || !x509.IsEncryptedPEMBlock(block) { + return nil, errors.New("ssh: not an encrypted key") + } + + buf, err := x509.DecryptPEMBlock(block, passphrase) + if err != nil { + if err == x509.IncorrectPasswordError { + return nil, err + } + return nil, fmt.Errorf("ssh: cannot decode encrypted private keys: %v", err) + } + + switch block.Type { + case "RSA PRIVATE KEY": + return x509.ParsePKCS1PrivateKey(buf) + case "EC PRIVATE KEY": + return x509.ParseECPrivateKey(buf) + case "DSA PRIVATE KEY": + return ParseDSAPrivateKey(buf) + default: + return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) + } +} + +// ParseDSAPrivateKey returns a DSA private key from its ASN.1 DER encoding, as +// specified by the OpenSSL DSA man page. +func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) { + var k struct { + Version int + P *big.Int + Q *big.Int + G *big.Int + Pub *big.Int + Priv *big.Int + } + rest, err := asn1.Unmarshal(der, &k) + if err != nil { + return nil, errors.New("ssh: failed to parse DSA key: " + err.Error()) + } + if len(rest) > 0 { + return nil, errors.New("ssh: garbage after DSA key") + } + + return &dsa.PrivateKey{ + PublicKey: dsa.PublicKey{ + Parameters: dsa.Parameters{ + P: k.P, + Q: k.Q, + G: k.G, + }, + Y: k.Pub, + }, + X: k.Priv, + }, nil +} + +func unencryptedOpenSSHKey(cipherName, kdfName, kdfOpts string, privKeyBlock []byte) ([]byte, error) { + if kdfName != "none" || cipherName != "none" { + return nil, &PassphraseMissingError{} + } + if kdfOpts != "" { + return nil, errors.New("ssh: invalid openssh private key") + } + return privKeyBlock, nil +} + +func passphraseProtectedOpenSSHKey(passphrase []byte) openSSHDecryptFunc { + return func(cipherName, kdfName, kdfOpts string, privKeyBlock []byte) ([]byte, error) { + if kdfName == "none" || cipherName == "none" { + return nil, errors.New("ssh: key is not password protected") + } + if kdfName != "bcrypt" { + return nil, fmt.Errorf("ssh: unknown KDF %q, only supports %q", kdfName, "bcrypt") + } + + var opts struct { + Salt string + Rounds uint32 + } + if err := Unmarshal([]byte(kdfOpts), &opts); err != nil { + return nil, err + } + + k, err := bcrypt_pbkdf.Key(passphrase, []byte(opts.Salt), int(opts.Rounds), 32+16) + if err != nil { + return nil, err + } + key, iv := k[:32], k[32:] + + c, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + switch cipherName { + case "aes256-ctr": + ctr := cipher.NewCTR(c, iv) + ctr.XORKeyStream(privKeyBlock, privKeyBlock) + case "aes256-cbc": + if len(privKeyBlock)%c.BlockSize() != 0 { + return nil, fmt.Errorf("ssh: invalid encrypted private key length, not a multiple of the block size") + } + cbc := cipher.NewCBCDecrypter(c, iv) + cbc.CryptBlocks(privKeyBlock, privKeyBlock) + default: + return nil, fmt.Errorf("ssh: unknown cipher %q, only supports %q or %q", cipherName, "aes256-ctr", "aes256-cbc") + } + + return privKeyBlock, nil + } +} + +type openSSHDecryptFunc func(CipherName, KdfName, KdfOpts string, PrivKeyBlock []byte) ([]byte, error) + +// parseOpenSSHPrivateKey parses an OpenSSH private key, using the decrypt +// function to unwrap the encrypted portion. unencryptedOpenSSHKey can be used +// as the decrypt function to parse an unencrypted private key. See +// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key. +func parseOpenSSHPrivateKey(key []byte, decrypt openSSHDecryptFunc) (crypto.PrivateKey, error) { + const magic = "openssh-key-v1\x00" + if len(key) < len(magic) || string(key[:len(magic)]) != magic { + return nil, errors.New("ssh: invalid openssh private key format") + } + remaining := key[len(magic):] + + var w struct { + CipherName string + KdfName string + KdfOpts string + NumKeys uint32 + PubKey []byte + PrivKeyBlock []byte + } + + if err := Unmarshal(remaining, &w); err != nil { + return nil, err + } + if w.NumKeys != 1 { + // We only support single key files, and so does OpenSSH. + // https://github.com/openssh/openssh-portable/blob/4103a3ec7/sshkey.c#L4171 + return nil, errors.New("ssh: multi-key files are not supported") + } + + privKeyBlock, err := decrypt(w.CipherName, w.KdfName, w.KdfOpts, w.PrivKeyBlock) + if err != nil { + if err, ok := err.(*PassphraseMissingError); ok { + pub, errPub := ParsePublicKey(w.PubKey) + if errPub != nil { + return nil, fmt.Errorf("ssh: failed to parse embedded public key: %v", errPub) + } + err.PublicKey = pub + } + return nil, err + } + + pk1 := struct { + Check1 uint32 + Check2 uint32 + Keytype string + Rest []byte `ssh:"rest"` + }{} + + if err := Unmarshal(privKeyBlock, &pk1); err != nil || pk1.Check1 != pk1.Check2 { + if w.CipherName != "none" { + return nil, x509.IncorrectPasswordError + } + return nil, errors.New("ssh: malformed OpenSSH key") + } + + switch pk1.Keytype { + case KeyAlgoRSA: + // https://github.com/openssh/openssh-portable/blob/master/sshkey.c#L2760-L2773 + key := struct { + N *big.Int + E *big.Int + D *big.Int + Iqmp *big.Int + P *big.Int + Q *big.Int + Comment string + Pad []byte `ssh:"rest"` + }{} + + if err := Unmarshal(pk1.Rest, &key); err != nil { + return nil, err + } + + if err := checkOpenSSHKeyPadding(key.Pad); err != nil { + return nil, err + } + + pk := &rsa.PrivateKey{ + PublicKey: rsa.PublicKey{ + N: key.N, + E: int(key.E.Int64()), + }, + D: key.D, + Primes: []*big.Int{key.P, key.Q}, + } + + if err := pk.Validate(); err != nil { + return nil, err + } + + pk.Precompute() + + return pk, nil + case KeyAlgoED25519: + key := struct { + Pub []byte + Priv []byte + Comment string + Pad []byte `ssh:"rest"` + }{} + + if err := Unmarshal(pk1.Rest, &key); err != nil { + return nil, err + } + + if len(key.Priv) != ed25519.PrivateKeySize { + return nil, errors.New("ssh: private key unexpected length") + } + + if err := checkOpenSSHKeyPadding(key.Pad); err != nil { + return nil, err + } + + pk := ed25519.PrivateKey(make([]byte, ed25519.PrivateKeySize)) + copy(pk, key.Priv) + return &pk, nil + case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521: + key := struct { + Curve string + Pub []byte + D *big.Int + Comment string + Pad []byte `ssh:"rest"` + }{} + + if err := Unmarshal(pk1.Rest, &key); err != nil { + return nil, err + } + + if err := checkOpenSSHKeyPadding(key.Pad); err != nil { + return nil, err + } + + var curve elliptic.Curve + switch key.Curve { + case "nistp256": + curve = elliptic.P256() + case "nistp384": + curve = elliptic.P384() + case "nistp521": + curve = elliptic.P521() + default: + return nil, errors.New("ssh: unhandled elliptic curve: " + key.Curve) + } + + X, Y := elliptic.Unmarshal(curve, key.Pub) + if X == nil || Y == nil { + return nil, errors.New("ssh: failed to unmarshal public key") + } + + if key.D.Cmp(curve.Params().N) >= 0 { + return nil, errors.New("ssh: scalar is out of range") + } + + x, y := curve.ScalarBaseMult(key.D.Bytes()) + if x.Cmp(X) != 0 || y.Cmp(Y) != 0 { + return nil, errors.New("ssh: public key does not match private key") + } + + return &ecdsa.PrivateKey{ + PublicKey: ecdsa.PublicKey{ + Curve: curve, + X: X, + Y: Y, + }, + D: key.D, + }, nil + default: + return nil, errors.New("ssh: unhandled key type") + } +} + +func checkOpenSSHKeyPadding(pad []byte) error { + for i, b := range pad { + if int(b) != i+1 { + return errors.New("ssh: padding not as expected") + } + } + return nil +} + +// FingerprintLegacyMD5 returns the user presentation of the key's +// fingerprint as described by RFC 4716 section 4. +func FingerprintLegacyMD5(pubKey PublicKey) string { + md5sum := md5.Sum(pubKey.Marshal()) + hexarray := make([]string, len(md5sum)) + for i, c := range md5sum { + hexarray[i] = hex.EncodeToString([]byte{c}) + } + return strings.Join(hexarray, ":") +} + +// FingerprintSHA256 returns the user presentation of the key's +// fingerprint as unpadded base64 encoded sha256 hash. +// This format was introduced from OpenSSH 6.8. +// https://www.openssh.com/txt/release-6.8 +// https://tools.ietf.org/html/rfc4648#section-3.2 (unpadded base64 encoding) +func FingerprintSHA256(pubKey PublicKey) string { + sha256sum := sha256.Sum256(pubKey.Marshal()) + hash := base64.RawStdEncoding.EncodeToString(sha256sum[:]) + return "SHA256:" + hash +} diff --git a/vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go b/vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go new file mode 100644 index 0000000000..260cfe58c6 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go @@ -0,0 +1,540 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package knownhosts implements a parser for the OpenSSH known_hosts +// host key database, and provides utility functions for writing +// OpenSSH compliant known_hosts files. +package knownhosts + +import ( + "bufio" + "bytes" + "crypto/hmac" + "crypto/rand" + "crypto/sha1" + "encoding/base64" + "errors" + "fmt" + "io" + "net" + "os" + "strings" + + "golang.org/x/crypto/ssh" +) + +// See the sshd manpage +// (http://man.openbsd.org/sshd#SSH_KNOWN_HOSTS_FILE_FORMAT) for +// background. + +type addr struct{ host, port string } + +func (a *addr) String() string { + h := a.host + if strings.Contains(h, ":") { + h = "[" + h + "]" + } + return h + ":" + a.port +} + +type matcher interface { + match(addr) bool +} + +type hostPattern struct { + negate bool + addr addr +} + +func (p *hostPattern) String() string { + n := "" + if p.negate { + n = "!" + } + + return n + p.addr.String() +} + +type hostPatterns []hostPattern + +func (ps hostPatterns) match(a addr) bool { + matched := false + for _, p := range ps { + if !p.match(a) { + continue + } + if p.negate { + return false + } + matched = true + } + return matched +} + +// See +// https://android.googlesource.com/platform/external/openssh/+/ab28f5495c85297e7a597c1ba62e996416da7c7e/addrmatch.c +// The matching of * has no regard for separators, unlike filesystem globs +func wildcardMatch(pat []byte, str []byte) bool { + for { + if len(pat) == 0 { + return len(str) == 0 + } + if len(str) == 0 { + return false + } + + if pat[0] == '*' { + if len(pat) == 1 { + return true + } + + for j := range str { + if wildcardMatch(pat[1:], str[j:]) { + return true + } + } + return false + } + + if pat[0] == '?' || pat[0] == str[0] { + pat = pat[1:] + str = str[1:] + } else { + return false + } + } +} + +func (p *hostPattern) match(a addr) bool { + return wildcardMatch([]byte(p.addr.host), []byte(a.host)) && p.addr.port == a.port +} + +type keyDBLine struct { + cert bool + matcher matcher + knownKey KnownKey +} + +func serialize(k ssh.PublicKey) string { + return k.Type() + " " + base64.StdEncoding.EncodeToString(k.Marshal()) +} + +func (l *keyDBLine) match(a addr) bool { + return l.matcher.match(a) +} + +type hostKeyDB struct { + // Serialized version of revoked keys + revoked map[string]*KnownKey + lines []keyDBLine +} + +func newHostKeyDB() *hostKeyDB { + db := &hostKeyDB{ + revoked: make(map[string]*KnownKey), + } + + return db +} + +func keyEq(a, b ssh.PublicKey) bool { + return bytes.Equal(a.Marshal(), b.Marshal()) +} + +// IsAuthorityForHost can be used as a callback in ssh.CertChecker +func (db *hostKeyDB) IsHostAuthority(remote ssh.PublicKey, address string) bool { + h, p, err := net.SplitHostPort(address) + if err != nil { + return false + } + a := addr{host: h, port: p} + + for _, l := range db.lines { + if l.cert && keyEq(l.knownKey.Key, remote) && l.match(a) { + return true + } + } + return false +} + +// IsRevoked can be used as a callback in ssh.CertChecker +func (db *hostKeyDB) IsRevoked(key *ssh.Certificate) bool { + _, ok := db.revoked[string(key.Marshal())] + return ok +} + +const markerCert = "@cert-authority" +const markerRevoked = "@revoked" + +func nextWord(line []byte) (string, []byte) { + i := bytes.IndexAny(line, "\t ") + if i == -1 { + return string(line), nil + } + + return string(line[:i]), bytes.TrimSpace(line[i:]) +} + +func parseLine(line []byte) (marker, host string, key ssh.PublicKey, err error) { + if w, next := nextWord(line); w == markerCert || w == markerRevoked { + marker = w + line = next + } + + host, line = nextWord(line) + if len(line) == 0 { + return "", "", nil, errors.New("knownhosts: missing host pattern") + } + + // ignore the keytype as it's in the key blob anyway. + _, line = nextWord(line) + if len(line) == 0 { + return "", "", nil, errors.New("knownhosts: missing key type pattern") + } + + keyBlob, _ := nextWord(line) + + keyBytes, err := base64.StdEncoding.DecodeString(keyBlob) + if err != nil { + return "", "", nil, err + } + key, err = ssh.ParsePublicKey(keyBytes) + if err != nil { + return "", "", nil, err + } + + return marker, host, key, nil +} + +func (db *hostKeyDB) parseLine(line []byte, filename string, linenum int) error { + marker, pattern, key, err := parseLine(line) + if err != nil { + return err + } + + if marker == markerRevoked { + db.revoked[string(key.Marshal())] = &KnownKey{ + Key: key, + Filename: filename, + Line: linenum, + } + + return nil + } + + entry := keyDBLine{ + cert: marker == markerCert, + knownKey: KnownKey{ + Filename: filename, + Line: linenum, + Key: key, + }, + } + + if pattern[0] == '|' { + entry.matcher, err = newHashedHost(pattern) + } else { + entry.matcher, err = newHostnameMatcher(pattern) + } + + if err != nil { + return err + } + + db.lines = append(db.lines, entry) + return nil +} + +func newHostnameMatcher(pattern string) (matcher, error) { + var hps hostPatterns + for _, p := range strings.Split(pattern, ",") { + if len(p) == 0 { + continue + } + + var a addr + var negate bool + if p[0] == '!' { + negate = true + p = p[1:] + } + + if len(p) == 0 { + return nil, errors.New("knownhosts: negation without following hostname") + } + + var err error + if p[0] == '[' { + a.host, a.port, err = net.SplitHostPort(p) + if err != nil { + return nil, err + } + } else { + a.host, a.port, err = net.SplitHostPort(p) + if err != nil { + a.host = p + a.port = "22" + } + } + hps = append(hps, hostPattern{ + negate: negate, + addr: a, + }) + } + return hps, nil +} + +// KnownKey represents a key declared in a known_hosts file. +type KnownKey struct { + Key ssh.PublicKey + Filename string + Line int +} + +func (k *KnownKey) String() string { + return fmt.Sprintf("%s:%d: %s", k.Filename, k.Line, serialize(k.Key)) +} + +// KeyError is returned if we did not find the key in the host key +// database, or there was a mismatch. Typically, in batch +// applications, this should be interpreted as failure. Interactive +// applications can offer an interactive prompt to the user. +type KeyError struct { + // Want holds the accepted host keys. For each key algorithm, + // there can be one hostkey. If Want is empty, the host is + // unknown. If Want is non-empty, there was a mismatch, which + // can signify a MITM attack. + Want []KnownKey +} + +func (u *KeyError) Error() string { + if len(u.Want) == 0 { + return "knownhosts: key is unknown" + } + return "knownhosts: key mismatch" +} + +// RevokedError is returned if we found a key that was revoked. +type RevokedError struct { + Revoked KnownKey +} + +func (r *RevokedError) Error() string { + return "knownhosts: key is revoked" +} + +// check checks a key against the host database. This should not be +// used for verifying certificates. +func (db *hostKeyDB) check(address string, remote net.Addr, remoteKey ssh.PublicKey) error { + if revoked := db.revoked[string(remoteKey.Marshal())]; revoked != nil { + return &RevokedError{Revoked: *revoked} + } + + host, port, err := net.SplitHostPort(remote.String()) + if err != nil { + return fmt.Errorf("knownhosts: SplitHostPort(%s): %v", remote, err) + } + + hostToCheck := addr{host, port} + if address != "" { + // Give preference to the hostname if available. + host, port, err := net.SplitHostPort(address) + if err != nil { + return fmt.Errorf("knownhosts: SplitHostPort(%s): %v", address, err) + } + + hostToCheck = addr{host, port} + } + + return db.checkAddr(hostToCheck, remoteKey) +} + +// checkAddr checks if we can find the given public key for the +// given address. If we only find an entry for the IP address, +// or only the hostname, then this still succeeds. +func (db *hostKeyDB) checkAddr(a addr, remoteKey ssh.PublicKey) error { + // TODO(hanwen): are these the right semantics? What if there + // is just a key for the IP address, but not for the + // hostname? + + // Algorithm => key. + knownKeys := map[string]KnownKey{} + for _, l := range db.lines { + if l.match(a) { + typ := l.knownKey.Key.Type() + if _, ok := knownKeys[typ]; !ok { + knownKeys[typ] = l.knownKey + } + } + } + + keyErr := &KeyError{} + for _, v := range knownKeys { + keyErr.Want = append(keyErr.Want, v) + } + + // Unknown remote host. + if len(knownKeys) == 0 { + return keyErr + } + + // If the remote host starts using a different, unknown key type, we + // also interpret that as a mismatch. + if known, ok := knownKeys[remoteKey.Type()]; !ok || !keyEq(known.Key, remoteKey) { + return keyErr + } + + return nil +} + +// The Read function parses file contents. +func (db *hostKeyDB) Read(r io.Reader, filename string) error { + scanner := bufio.NewScanner(r) + + lineNum := 0 + for scanner.Scan() { + lineNum++ + line := scanner.Bytes() + line = bytes.TrimSpace(line) + if len(line) == 0 || line[0] == '#' { + continue + } + + if err := db.parseLine(line, filename, lineNum); err != nil { + return fmt.Errorf("knownhosts: %s:%d: %v", filename, lineNum, err) + } + } + return scanner.Err() +} + +// New creates a host key callback from the given OpenSSH host key +// files. The returned callback is for use in +// ssh.ClientConfig.HostKeyCallback. By preference, the key check +// operates on the hostname if available, i.e. if a server changes its +// IP address, the host key check will still succeed, even though a +// record of the new IP address is not available. +func New(files ...string) (ssh.HostKeyCallback, error) { + db := newHostKeyDB() + for _, fn := range files { + f, err := os.Open(fn) + if err != nil { + return nil, err + } + defer f.Close() + if err := db.Read(f, fn); err != nil { + return nil, err + } + } + + var certChecker ssh.CertChecker + certChecker.IsHostAuthority = db.IsHostAuthority + certChecker.IsRevoked = db.IsRevoked + certChecker.HostKeyFallback = db.check + + return certChecker.CheckHostKey, nil +} + +// Normalize normalizes an address into the form used in known_hosts +func Normalize(address string) string { + host, port, err := net.SplitHostPort(address) + if err != nil { + host = address + port = "22" + } + entry := host + if port != "22" { + entry = "[" + entry + "]:" + port + } else if strings.Contains(host, ":") && !strings.HasPrefix(host, "[") { + entry = "[" + entry + "]" + } + return entry +} + +// Line returns a line to add append to the known_hosts files. +func Line(addresses []string, key ssh.PublicKey) string { + var trimmed []string + for _, a := range addresses { + trimmed = append(trimmed, Normalize(a)) + } + + return strings.Join(trimmed, ",") + " " + serialize(key) +} + +// HashHostname hashes the given hostname. The hostname is not +// normalized before hashing. +func HashHostname(hostname string) string { + // TODO(hanwen): check if we can safely normalize this always. + salt := make([]byte, sha1.Size) + + _, err := rand.Read(salt) + if err != nil { + panic(fmt.Sprintf("crypto/rand failure %v", err)) + } + + hash := hashHost(hostname, salt) + return encodeHash(sha1HashType, salt, hash) +} + +func decodeHash(encoded string) (hashType string, salt, hash []byte, err error) { + if len(encoded) == 0 || encoded[0] != '|' { + err = errors.New("knownhosts: hashed host must start with '|'") + return + } + components := strings.Split(encoded, "|") + if len(components) != 4 { + err = fmt.Errorf("knownhosts: got %d components, want 3", len(components)) + return + } + + hashType = components[1] + if salt, err = base64.StdEncoding.DecodeString(components[2]); err != nil { + return + } + if hash, err = base64.StdEncoding.DecodeString(components[3]); err != nil { + return + } + return +} + +func encodeHash(typ string, salt []byte, hash []byte) string { + return strings.Join([]string{"", + typ, + base64.StdEncoding.EncodeToString(salt), + base64.StdEncoding.EncodeToString(hash), + }, "|") +} + +// See https://android.googlesource.com/platform/external/openssh/+/ab28f5495c85297e7a597c1ba62e996416da7c7e/hostfile.c#120 +func hashHost(hostname string, salt []byte) []byte { + mac := hmac.New(sha1.New, salt) + mac.Write([]byte(hostname)) + return mac.Sum(nil) +} + +type hashedHost struct { + salt []byte + hash []byte +} + +const sha1HashType = "1" + +func newHashedHost(encoded string) (*hashedHost, error) { + typ, salt, hash, err := decodeHash(encoded) + if err != nil { + return nil, err + } + + // The type field seems for future algorithm agility, but it's + // actually hardcoded in openssh currently, see + // https://android.googlesource.com/platform/external/openssh/+/ab28f5495c85297e7a597c1ba62e996416da7c7e/hostfile.c#120 + if typ != sha1HashType { + return nil, fmt.Errorf("knownhosts: got hash type %s, must be '1'", typ) + } + + return &hashedHost{salt: salt, hash: hash}, nil +} + +func (h *hashedHost) match(a addr) bool { + return bytes.Equal(hashHost(Normalize(a.String()), h.salt), h.hash) +} diff --git a/vendor/golang.org/x/crypto/ssh/mac.go b/vendor/golang.org/x/crypto/ssh/mac.go new file mode 100644 index 0000000000..c07a06285e --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/mac.go @@ -0,0 +1,61 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +// Message authentication support + +import ( + "crypto/hmac" + "crypto/sha1" + "crypto/sha256" + "hash" +) + +type macMode struct { + keySize int + etm bool + new func(key []byte) hash.Hash +} + +// truncatingMAC wraps around a hash.Hash and truncates the output digest to +// a given size. +type truncatingMAC struct { + length int + hmac hash.Hash +} + +func (t truncatingMAC) Write(data []byte) (int, error) { + return t.hmac.Write(data) +} + +func (t truncatingMAC) Sum(in []byte) []byte { + out := t.hmac.Sum(in) + return out[:len(in)+t.length] +} + +func (t truncatingMAC) Reset() { + t.hmac.Reset() +} + +func (t truncatingMAC) Size() int { + return t.length +} + +func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() } + +var macModes = map[string]*macMode{ + "hmac-sha2-256-etm@openssh.com": {32, true, func(key []byte) hash.Hash { + return hmac.New(sha256.New, key) + }}, + "hmac-sha2-256": {32, false, func(key []byte) hash.Hash { + return hmac.New(sha256.New, key) + }}, + "hmac-sha1": {20, false, func(key []byte) hash.Hash { + return hmac.New(sha1.New, key) + }}, + "hmac-sha1-96": {20, false, func(key []byte) hash.Hash { + return truncatingMAC{12, hmac.New(sha1.New, key)} + }}, +} diff --git a/vendor/golang.org/x/crypto/ssh/messages.go b/vendor/golang.org/x/crypto/ssh/messages.go new file mode 100644 index 0000000000..ac41a4168b --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/messages.go @@ -0,0 +1,866 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "math/big" + "reflect" + "strconv" + "strings" +) + +// These are SSH message type numbers. They are scattered around several +// documents but many were taken from [SSH-PARAMETERS]. +const ( + msgIgnore = 2 + msgUnimplemented = 3 + msgDebug = 4 + msgNewKeys = 21 +) + +// SSH messages: +// +// These structures mirror the wire format of the corresponding SSH messages. +// They are marshaled using reflection with the marshal and unmarshal functions +// in this file. The only wrinkle is that a final member of type []byte with a +// ssh tag of "rest" receives the remainder of a packet when unmarshaling. + +// See RFC 4253, section 11.1. +const msgDisconnect = 1 + +// disconnectMsg is the message that signals a disconnect. It is also +// the error type returned from mux.Wait() +type disconnectMsg struct { + Reason uint32 `sshtype:"1"` + Message string + Language string +} + +func (d *disconnectMsg) Error() string { + return fmt.Sprintf("ssh: disconnect, reason %d: %s", d.Reason, d.Message) +} + +// See RFC 4253, section 7.1. +const msgKexInit = 20 + +type kexInitMsg struct { + Cookie [16]byte `sshtype:"20"` + KexAlgos []string + ServerHostKeyAlgos []string + CiphersClientServer []string + CiphersServerClient []string + MACsClientServer []string + MACsServerClient []string + CompressionClientServer []string + CompressionServerClient []string + LanguagesClientServer []string + LanguagesServerClient []string + FirstKexFollows bool + Reserved uint32 +} + +// See RFC 4253, section 8. + +// Diffie-Helman +const msgKexDHInit = 30 + +type kexDHInitMsg struct { + X *big.Int `sshtype:"30"` +} + +const msgKexECDHInit = 30 + +type kexECDHInitMsg struct { + ClientPubKey []byte `sshtype:"30"` +} + +const msgKexECDHReply = 31 + +type kexECDHReplyMsg struct { + HostKey []byte `sshtype:"31"` + EphemeralPubKey []byte + Signature []byte +} + +const msgKexDHReply = 31 + +type kexDHReplyMsg struct { + HostKey []byte `sshtype:"31"` + Y *big.Int + Signature []byte +} + +// See RFC 4419, section 5. +const msgKexDHGexGroup = 31 + +type kexDHGexGroupMsg struct { + P *big.Int `sshtype:"31"` + G *big.Int +} + +const msgKexDHGexInit = 32 + +type kexDHGexInitMsg struct { + X *big.Int `sshtype:"32"` +} + +const msgKexDHGexReply = 33 + +type kexDHGexReplyMsg struct { + HostKey []byte `sshtype:"33"` + Y *big.Int + Signature []byte +} + +const msgKexDHGexRequest = 34 + +type kexDHGexRequestMsg struct { + MinBits uint32 `sshtype:"34"` + PreferedBits uint32 + MaxBits uint32 +} + +// See RFC 4253, section 10. +const msgServiceRequest = 5 + +type serviceRequestMsg struct { + Service string `sshtype:"5"` +} + +// See RFC 4253, section 10. +const msgServiceAccept = 6 + +type serviceAcceptMsg struct { + Service string `sshtype:"6"` +} + +// See RFC 4252, section 5. +const msgUserAuthRequest = 50 + +type userAuthRequestMsg struct { + User string `sshtype:"50"` + Service string + Method string + Payload []byte `ssh:"rest"` +} + +// Used for debug printouts of packets. +type userAuthSuccessMsg struct { +} + +// See RFC 4252, section 5.1 +const msgUserAuthFailure = 51 + +type userAuthFailureMsg struct { + Methods []string `sshtype:"51"` + PartialSuccess bool +} + +// See RFC 4252, section 5.1 +const msgUserAuthSuccess = 52 + +// See RFC 4252, section 5.4 +const msgUserAuthBanner = 53 + +type userAuthBannerMsg struct { + Message string `sshtype:"53"` + // unused, but required to allow message parsing + Language string +} + +// See RFC 4256, section 3.2 +const msgUserAuthInfoRequest = 60 +const msgUserAuthInfoResponse = 61 + +type userAuthInfoRequestMsg struct { + User string `sshtype:"60"` + Instruction string + DeprecatedLanguage string + NumPrompts uint32 + Prompts []byte `ssh:"rest"` +} + +// See RFC 4254, section 5.1. +const msgChannelOpen = 90 + +type channelOpenMsg struct { + ChanType string `sshtype:"90"` + PeersID uint32 + PeersWindow uint32 + MaxPacketSize uint32 + TypeSpecificData []byte `ssh:"rest"` +} + +const msgChannelExtendedData = 95 +const msgChannelData = 94 + +// Used for debug print outs of packets. +type channelDataMsg struct { + PeersID uint32 `sshtype:"94"` + Length uint32 + Rest []byte `ssh:"rest"` +} + +// See RFC 4254, section 5.1. +const msgChannelOpenConfirm = 91 + +type channelOpenConfirmMsg struct { + PeersID uint32 `sshtype:"91"` + MyID uint32 + MyWindow uint32 + MaxPacketSize uint32 + TypeSpecificData []byte `ssh:"rest"` +} + +// See RFC 4254, section 5.1. +const msgChannelOpenFailure = 92 + +type channelOpenFailureMsg struct { + PeersID uint32 `sshtype:"92"` + Reason RejectionReason + Message string + Language string +} + +const msgChannelRequest = 98 + +type channelRequestMsg struct { + PeersID uint32 `sshtype:"98"` + Request string + WantReply bool + RequestSpecificData []byte `ssh:"rest"` +} + +// See RFC 4254, section 5.4. +const msgChannelSuccess = 99 + +type channelRequestSuccessMsg struct { + PeersID uint32 `sshtype:"99"` +} + +// See RFC 4254, section 5.4. +const msgChannelFailure = 100 + +type channelRequestFailureMsg struct { + PeersID uint32 `sshtype:"100"` +} + +// See RFC 4254, section 5.3 +const msgChannelClose = 97 + +type channelCloseMsg struct { + PeersID uint32 `sshtype:"97"` +} + +// See RFC 4254, section 5.3 +const msgChannelEOF = 96 + +type channelEOFMsg struct { + PeersID uint32 `sshtype:"96"` +} + +// See RFC 4254, section 4 +const msgGlobalRequest = 80 + +type globalRequestMsg struct { + Type string `sshtype:"80"` + WantReply bool + Data []byte `ssh:"rest"` +} + +// See RFC 4254, section 4 +const msgRequestSuccess = 81 + +type globalRequestSuccessMsg struct { + Data []byte `ssh:"rest" sshtype:"81"` +} + +// See RFC 4254, section 4 +const msgRequestFailure = 82 + +type globalRequestFailureMsg struct { + Data []byte `ssh:"rest" sshtype:"82"` +} + +// See RFC 4254, section 5.2 +const msgChannelWindowAdjust = 93 + +type windowAdjustMsg struct { + PeersID uint32 `sshtype:"93"` + AdditionalBytes uint32 +} + +// See RFC 4252, section 7 +const msgUserAuthPubKeyOk = 60 + +type userAuthPubKeyOkMsg struct { + Algo string `sshtype:"60"` + PubKey []byte +} + +// See RFC 4462, section 3 +const msgUserAuthGSSAPIResponse = 60 + +type userAuthGSSAPIResponse struct { + SupportMech []byte `sshtype:"60"` +} + +const msgUserAuthGSSAPIToken = 61 + +type userAuthGSSAPIToken struct { + Token []byte `sshtype:"61"` +} + +const msgUserAuthGSSAPIMIC = 66 + +type userAuthGSSAPIMIC struct { + MIC []byte `sshtype:"66"` +} + +// See RFC 4462, section 3.9 +const msgUserAuthGSSAPIErrTok = 64 + +type userAuthGSSAPIErrTok struct { + ErrorToken []byte `sshtype:"64"` +} + +// See RFC 4462, section 3.8 +const msgUserAuthGSSAPIError = 65 + +type userAuthGSSAPIError struct { + MajorStatus uint32 `sshtype:"65"` + MinorStatus uint32 + Message string + LanguageTag string +} + +// typeTags returns the possible type bytes for the given reflect.Type, which +// should be a struct. The possible values are separated by a '|' character. +func typeTags(structType reflect.Type) (tags []byte) { + tagStr := structType.Field(0).Tag.Get("sshtype") + + for _, tag := range strings.Split(tagStr, "|") { + i, err := strconv.Atoi(tag) + if err == nil { + tags = append(tags, byte(i)) + } + } + + return tags +} + +func fieldError(t reflect.Type, field int, problem string) error { + if problem != "" { + problem = ": " + problem + } + return fmt.Errorf("ssh: unmarshal error for field %s of type %s%s", t.Field(field).Name, t.Name(), problem) +} + +var errShortRead = errors.New("ssh: short read") + +// Unmarshal parses data in SSH wire format into a structure. The out +// argument should be a pointer to struct. If the first member of the +// struct has the "sshtype" tag set to a '|'-separated set of numbers +// in decimal, the packet must start with one of those numbers. In +// case of error, Unmarshal returns a ParseError or +// UnexpectedMessageError. +func Unmarshal(data []byte, out interface{}) error { + v := reflect.ValueOf(out).Elem() + structType := v.Type() + expectedTypes := typeTags(structType) + + var expectedType byte + if len(expectedTypes) > 0 { + expectedType = expectedTypes[0] + } + + if len(data) == 0 { + return parseError(expectedType) + } + + if len(expectedTypes) > 0 { + goodType := false + for _, e := range expectedTypes { + if e > 0 && data[0] == e { + goodType = true + break + } + } + if !goodType { + return fmt.Errorf("ssh: unexpected message type %d (expected one of %v)", data[0], expectedTypes) + } + data = data[1:] + } + + var ok bool + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + t := field.Type() + switch t.Kind() { + case reflect.Bool: + if len(data) < 1 { + return errShortRead + } + field.SetBool(data[0] != 0) + data = data[1:] + case reflect.Array: + if t.Elem().Kind() != reflect.Uint8 { + return fieldError(structType, i, "array of unsupported type") + } + if len(data) < t.Len() { + return errShortRead + } + for j, n := 0, t.Len(); j < n; j++ { + field.Index(j).Set(reflect.ValueOf(data[j])) + } + data = data[t.Len():] + case reflect.Uint64: + var u64 uint64 + if u64, data, ok = parseUint64(data); !ok { + return errShortRead + } + field.SetUint(u64) + case reflect.Uint32: + var u32 uint32 + if u32, data, ok = parseUint32(data); !ok { + return errShortRead + } + field.SetUint(uint64(u32)) + case reflect.Uint8: + if len(data) < 1 { + return errShortRead + } + field.SetUint(uint64(data[0])) + data = data[1:] + case reflect.String: + var s []byte + if s, data, ok = parseString(data); !ok { + return fieldError(structType, i, "") + } + field.SetString(string(s)) + case reflect.Slice: + switch t.Elem().Kind() { + case reflect.Uint8: + if structType.Field(i).Tag.Get("ssh") == "rest" { + field.Set(reflect.ValueOf(data)) + data = nil + } else { + var s []byte + if s, data, ok = parseString(data); !ok { + return errShortRead + } + field.Set(reflect.ValueOf(s)) + } + case reflect.String: + var nl []string + if nl, data, ok = parseNameList(data); !ok { + return errShortRead + } + field.Set(reflect.ValueOf(nl)) + default: + return fieldError(structType, i, "slice of unsupported type") + } + case reflect.Ptr: + if t == bigIntType { + var n *big.Int + if n, data, ok = parseInt(data); !ok { + return errShortRead + } + field.Set(reflect.ValueOf(n)) + } else { + return fieldError(structType, i, "pointer to unsupported type") + } + default: + return fieldError(structType, i, fmt.Sprintf("unsupported type: %v", t)) + } + } + + if len(data) != 0 { + return parseError(expectedType) + } + + return nil +} + +// Marshal serializes the message in msg to SSH wire format. The msg +// argument should be a struct or pointer to struct. If the first +// member has the "sshtype" tag set to a number in decimal, that +// number is prepended to the result. If the last of member has the +// "ssh" tag set to "rest", its contents are appended to the output. +func Marshal(msg interface{}) []byte { + out := make([]byte, 0, 64) + return marshalStruct(out, msg) +} + +func marshalStruct(out []byte, msg interface{}) []byte { + v := reflect.Indirect(reflect.ValueOf(msg)) + msgTypes := typeTags(v.Type()) + if len(msgTypes) > 0 { + out = append(out, msgTypes[0]) + } + + for i, n := 0, v.NumField(); i < n; i++ { + field := v.Field(i) + switch t := field.Type(); t.Kind() { + case reflect.Bool: + var v uint8 + if field.Bool() { + v = 1 + } + out = append(out, v) + case reflect.Array: + if t.Elem().Kind() != reflect.Uint8 { + panic(fmt.Sprintf("array of non-uint8 in field %d: %T", i, field.Interface())) + } + for j, l := 0, t.Len(); j < l; j++ { + out = append(out, uint8(field.Index(j).Uint())) + } + case reflect.Uint32: + out = appendU32(out, uint32(field.Uint())) + case reflect.Uint64: + out = appendU64(out, uint64(field.Uint())) + case reflect.Uint8: + out = append(out, uint8(field.Uint())) + case reflect.String: + s := field.String() + out = appendInt(out, len(s)) + out = append(out, s...) + case reflect.Slice: + switch t.Elem().Kind() { + case reflect.Uint8: + if v.Type().Field(i).Tag.Get("ssh") != "rest" { + out = appendInt(out, field.Len()) + } + out = append(out, field.Bytes()...) + case reflect.String: + offset := len(out) + out = appendU32(out, 0) + if n := field.Len(); n > 0 { + for j := 0; j < n; j++ { + f := field.Index(j) + if j != 0 { + out = append(out, ',') + } + out = append(out, f.String()...) + } + // overwrite length value + binary.BigEndian.PutUint32(out[offset:], uint32(len(out)-offset-4)) + } + default: + panic(fmt.Sprintf("slice of unknown type in field %d: %T", i, field.Interface())) + } + case reflect.Ptr: + if t == bigIntType { + var n *big.Int + nValue := reflect.ValueOf(&n) + nValue.Elem().Set(field) + needed := intLength(n) + oldLength := len(out) + + if cap(out)-len(out) < needed { + newOut := make([]byte, len(out), 2*(len(out)+needed)) + copy(newOut, out) + out = newOut + } + out = out[:oldLength+needed] + marshalInt(out[oldLength:], n) + } else { + panic(fmt.Sprintf("pointer to unknown type in field %d: %T", i, field.Interface())) + } + } + } + + return out +} + +var bigOne = big.NewInt(1) + +func parseString(in []byte) (out, rest []byte, ok bool) { + if len(in) < 4 { + return + } + length := binary.BigEndian.Uint32(in) + in = in[4:] + if uint32(len(in)) < length { + return + } + out = in[:length] + rest = in[length:] + ok = true + return +} + +var ( + comma = []byte{','} + emptyNameList = []string{} +) + +func parseNameList(in []byte) (out []string, rest []byte, ok bool) { + contents, rest, ok := parseString(in) + if !ok { + return + } + if len(contents) == 0 { + out = emptyNameList + return + } + parts := bytes.Split(contents, comma) + out = make([]string, len(parts)) + for i, part := range parts { + out[i] = string(part) + } + return +} + +func parseInt(in []byte) (out *big.Int, rest []byte, ok bool) { + contents, rest, ok := parseString(in) + if !ok { + return + } + out = new(big.Int) + + if len(contents) > 0 && contents[0]&0x80 == 0x80 { + // This is a negative number + notBytes := make([]byte, len(contents)) + for i := range notBytes { + notBytes[i] = ^contents[i] + } + out.SetBytes(notBytes) + out.Add(out, bigOne) + out.Neg(out) + } else { + // Positive number + out.SetBytes(contents) + } + ok = true + return +} + +func parseUint32(in []byte) (uint32, []byte, bool) { + if len(in) < 4 { + return 0, nil, false + } + return binary.BigEndian.Uint32(in), in[4:], true +} + +func parseUint64(in []byte) (uint64, []byte, bool) { + if len(in) < 8 { + return 0, nil, false + } + return binary.BigEndian.Uint64(in), in[8:], true +} + +func intLength(n *big.Int) int { + length := 4 /* length bytes */ + if n.Sign() < 0 { + nMinus1 := new(big.Int).Neg(n) + nMinus1.Sub(nMinus1, bigOne) + bitLen := nMinus1.BitLen() + if bitLen%8 == 0 { + // The number will need 0xff padding + length++ + } + length += (bitLen + 7) / 8 + } else if n.Sign() == 0 { + // A zero is the zero length string + } else { + bitLen := n.BitLen() + if bitLen%8 == 0 { + // The number will need 0x00 padding + length++ + } + length += (bitLen + 7) / 8 + } + + return length +} + +func marshalUint32(to []byte, n uint32) []byte { + binary.BigEndian.PutUint32(to, n) + return to[4:] +} + +func marshalUint64(to []byte, n uint64) []byte { + binary.BigEndian.PutUint64(to, n) + return to[8:] +} + +func marshalInt(to []byte, n *big.Int) []byte { + lengthBytes := to + to = to[4:] + length := 0 + + if n.Sign() < 0 { + // A negative number has to be converted to two's-complement + // form. So we'll subtract 1 and invert. If the + // most-significant-bit isn't set then we'll need to pad the + // beginning with 0xff in order to keep the number negative. + nMinus1 := new(big.Int).Neg(n) + nMinus1.Sub(nMinus1, bigOne) + bytes := nMinus1.Bytes() + for i := range bytes { + bytes[i] ^= 0xff + } + if len(bytes) == 0 || bytes[0]&0x80 == 0 { + to[0] = 0xff + to = to[1:] + length++ + } + nBytes := copy(to, bytes) + to = to[nBytes:] + length += nBytes + } else if n.Sign() == 0 { + // A zero is the zero length string + } else { + bytes := n.Bytes() + if len(bytes) > 0 && bytes[0]&0x80 != 0 { + // We'll have to pad this with a 0x00 in order to + // stop it looking like a negative number. + to[0] = 0 + to = to[1:] + length++ + } + nBytes := copy(to, bytes) + to = to[nBytes:] + length += nBytes + } + + lengthBytes[0] = byte(length >> 24) + lengthBytes[1] = byte(length >> 16) + lengthBytes[2] = byte(length >> 8) + lengthBytes[3] = byte(length) + return to +} + +func writeInt(w io.Writer, n *big.Int) { + length := intLength(n) + buf := make([]byte, length) + marshalInt(buf, n) + w.Write(buf) +} + +func writeString(w io.Writer, s []byte) { + var lengthBytes [4]byte + lengthBytes[0] = byte(len(s) >> 24) + lengthBytes[1] = byte(len(s) >> 16) + lengthBytes[2] = byte(len(s) >> 8) + lengthBytes[3] = byte(len(s)) + w.Write(lengthBytes[:]) + w.Write(s) +} + +func stringLength(n int) int { + return 4 + n +} + +func marshalString(to []byte, s []byte) []byte { + to[0] = byte(len(s) >> 24) + to[1] = byte(len(s) >> 16) + to[2] = byte(len(s) >> 8) + to[3] = byte(len(s)) + to = to[4:] + copy(to, s) + return to[len(s):] +} + +var bigIntType = reflect.TypeOf((*big.Int)(nil)) + +// Decode a packet into its corresponding message. +func decode(packet []byte) (interface{}, error) { + var msg interface{} + switch packet[0] { + case msgDisconnect: + msg = new(disconnectMsg) + case msgServiceRequest: + msg = new(serviceRequestMsg) + case msgServiceAccept: + msg = new(serviceAcceptMsg) + case msgKexInit: + msg = new(kexInitMsg) + case msgKexDHInit: + msg = new(kexDHInitMsg) + case msgKexDHReply: + msg = new(kexDHReplyMsg) + case msgUserAuthRequest: + msg = new(userAuthRequestMsg) + case msgUserAuthSuccess: + return new(userAuthSuccessMsg), nil + case msgUserAuthFailure: + msg = new(userAuthFailureMsg) + case msgUserAuthPubKeyOk: + msg = new(userAuthPubKeyOkMsg) + case msgGlobalRequest: + msg = new(globalRequestMsg) + case msgRequestSuccess: + msg = new(globalRequestSuccessMsg) + case msgRequestFailure: + msg = new(globalRequestFailureMsg) + case msgChannelOpen: + msg = new(channelOpenMsg) + case msgChannelData: + msg = new(channelDataMsg) + case msgChannelOpenConfirm: + msg = new(channelOpenConfirmMsg) + case msgChannelOpenFailure: + msg = new(channelOpenFailureMsg) + case msgChannelWindowAdjust: + msg = new(windowAdjustMsg) + case msgChannelEOF: + msg = new(channelEOFMsg) + case msgChannelClose: + msg = new(channelCloseMsg) + case msgChannelRequest: + msg = new(channelRequestMsg) + case msgChannelSuccess: + msg = new(channelRequestSuccessMsg) + case msgChannelFailure: + msg = new(channelRequestFailureMsg) + case msgUserAuthGSSAPIToken: + msg = new(userAuthGSSAPIToken) + case msgUserAuthGSSAPIMIC: + msg = new(userAuthGSSAPIMIC) + case msgUserAuthGSSAPIErrTok: + msg = new(userAuthGSSAPIErrTok) + case msgUserAuthGSSAPIError: + msg = new(userAuthGSSAPIError) + default: + return nil, unexpectedMessageError(0, packet[0]) + } + if err := Unmarshal(packet, msg); err != nil { + return nil, err + } + return msg, nil +} + +var packetTypeNames = map[byte]string{ + msgDisconnect: "disconnectMsg", + msgServiceRequest: "serviceRequestMsg", + msgServiceAccept: "serviceAcceptMsg", + msgKexInit: "kexInitMsg", + msgKexDHInit: "kexDHInitMsg", + msgKexDHReply: "kexDHReplyMsg", + msgUserAuthRequest: "userAuthRequestMsg", + msgUserAuthSuccess: "userAuthSuccessMsg", + msgUserAuthFailure: "userAuthFailureMsg", + msgUserAuthPubKeyOk: "userAuthPubKeyOkMsg", + msgGlobalRequest: "globalRequestMsg", + msgRequestSuccess: "globalRequestSuccessMsg", + msgRequestFailure: "globalRequestFailureMsg", + msgChannelOpen: "channelOpenMsg", + msgChannelData: "channelDataMsg", + msgChannelOpenConfirm: "channelOpenConfirmMsg", + msgChannelOpenFailure: "channelOpenFailureMsg", + msgChannelWindowAdjust: "windowAdjustMsg", + msgChannelEOF: "channelEOFMsg", + msgChannelClose: "channelCloseMsg", + msgChannelRequest: "channelRequestMsg", + msgChannelSuccess: "channelRequestSuccessMsg", + msgChannelFailure: "channelRequestFailureMsg", +} diff --git a/vendor/golang.org/x/crypto/ssh/mux.go b/vendor/golang.org/x/crypto/ssh/mux.go new file mode 100644 index 0000000000..9654c01869 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/mux.go @@ -0,0 +1,351 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "encoding/binary" + "fmt" + "io" + "log" + "sync" + "sync/atomic" +) + +// debugMux, if set, causes messages in the connection protocol to be +// logged. +const debugMux = false + +// chanList is a thread safe channel list. +type chanList struct { + // protects concurrent access to chans + sync.Mutex + + // chans are indexed by the local id of the channel, which the + // other side should send in the PeersId field. + chans []*channel + + // This is a debugging aid: it offsets all IDs by this + // amount. This helps distinguish otherwise identical + // server/client muxes + offset uint32 +} + +// Assigns a channel ID to the given channel. +func (c *chanList) add(ch *channel) uint32 { + c.Lock() + defer c.Unlock() + for i := range c.chans { + if c.chans[i] == nil { + c.chans[i] = ch + return uint32(i) + c.offset + } + } + c.chans = append(c.chans, ch) + return uint32(len(c.chans)-1) + c.offset +} + +// getChan returns the channel for the given ID. +func (c *chanList) getChan(id uint32) *channel { + id -= c.offset + + c.Lock() + defer c.Unlock() + if id < uint32(len(c.chans)) { + return c.chans[id] + } + return nil +} + +func (c *chanList) remove(id uint32) { + id -= c.offset + c.Lock() + if id < uint32(len(c.chans)) { + c.chans[id] = nil + } + c.Unlock() +} + +// dropAll forgets all channels it knows, returning them in a slice. +func (c *chanList) dropAll() []*channel { + c.Lock() + defer c.Unlock() + var r []*channel + + for _, ch := range c.chans { + if ch == nil { + continue + } + r = append(r, ch) + } + c.chans = nil + return r +} + +// mux represents the state for the SSH connection protocol, which +// multiplexes many channels onto a single packet transport. +type mux struct { + conn packetConn + chanList chanList + + incomingChannels chan NewChannel + + globalSentMu sync.Mutex + globalResponses chan interface{} + incomingRequests chan *Request + + errCond *sync.Cond + err error +} + +// When debugging, each new chanList instantiation has a different +// offset. +var globalOff uint32 + +func (m *mux) Wait() error { + m.errCond.L.Lock() + defer m.errCond.L.Unlock() + for m.err == nil { + m.errCond.Wait() + } + return m.err +} + +// newMux returns a mux that runs over the given connection. +func newMux(p packetConn) *mux { + m := &mux{ + conn: p, + incomingChannels: make(chan NewChannel, chanSize), + globalResponses: make(chan interface{}, 1), + incomingRequests: make(chan *Request, chanSize), + errCond: newCond(), + } + if debugMux { + m.chanList.offset = atomic.AddUint32(&globalOff, 1) + } + + go m.loop() + return m +} + +func (m *mux) sendMessage(msg interface{}) error { + p := Marshal(msg) + if debugMux { + log.Printf("send global(%d): %#v", m.chanList.offset, msg) + } + return m.conn.writePacket(p) +} + +func (m *mux) SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) { + if wantReply { + m.globalSentMu.Lock() + defer m.globalSentMu.Unlock() + } + + if err := m.sendMessage(globalRequestMsg{ + Type: name, + WantReply: wantReply, + Data: payload, + }); err != nil { + return false, nil, err + } + + if !wantReply { + return false, nil, nil + } + + msg, ok := <-m.globalResponses + if !ok { + return false, nil, io.EOF + } + switch msg := msg.(type) { + case *globalRequestFailureMsg: + return false, msg.Data, nil + case *globalRequestSuccessMsg: + return true, msg.Data, nil + default: + return false, nil, fmt.Errorf("ssh: unexpected response to request: %#v", msg) + } +} + +// ackRequest must be called after processing a global request that +// has WantReply set. +func (m *mux) ackRequest(ok bool, data []byte) error { + if ok { + return m.sendMessage(globalRequestSuccessMsg{Data: data}) + } + return m.sendMessage(globalRequestFailureMsg{Data: data}) +} + +func (m *mux) Close() error { + return m.conn.Close() +} + +// loop runs the connection machine. It will process packets until an +// error is encountered. To synchronize on loop exit, use mux.Wait. +func (m *mux) loop() { + var err error + for err == nil { + err = m.onePacket() + } + + for _, ch := range m.chanList.dropAll() { + ch.close() + } + + close(m.incomingChannels) + close(m.incomingRequests) + close(m.globalResponses) + + m.conn.Close() + + m.errCond.L.Lock() + m.err = err + m.errCond.Broadcast() + m.errCond.L.Unlock() + + if debugMux { + log.Println("loop exit", err) + } +} + +// onePacket reads and processes one packet. +func (m *mux) onePacket() error { + packet, err := m.conn.readPacket() + if err != nil { + return err + } + + if debugMux { + if packet[0] == msgChannelData || packet[0] == msgChannelExtendedData { + log.Printf("decoding(%d): data packet - %d bytes", m.chanList.offset, len(packet)) + } else { + p, _ := decode(packet) + log.Printf("decoding(%d): %d %#v - %d bytes", m.chanList.offset, packet[0], p, len(packet)) + } + } + + switch packet[0] { + case msgChannelOpen: + return m.handleChannelOpen(packet) + case msgGlobalRequest, msgRequestSuccess, msgRequestFailure: + return m.handleGlobalPacket(packet) + } + + // assume a channel packet. + if len(packet) < 5 { + return parseError(packet[0]) + } + id := binary.BigEndian.Uint32(packet[1:]) + ch := m.chanList.getChan(id) + if ch == nil { + return m.handleUnknownChannelPacket(id, packet) + } + + return ch.handlePacket(packet) +} + +func (m *mux) handleGlobalPacket(packet []byte) error { + msg, err := decode(packet) + if err != nil { + return err + } + + switch msg := msg.(type) { + case *globalRequestMsg: + m.incomingRequests <- &Request{ + Type: msg.Type, + WantReply: msg.WantReply, + Payload: msg.Data, + mux: m, + } + case *globalRequestSuccessMsg, *globalRequestFailureMsg: + m.globalResponses <- msg + default: + panic(fmt.Sprintf("not a global message %#v", msg)) + } + + return nil +} + +// handleChannelOpen schedules a channel to be Accept()ed. +func (m *mux) handleChannelOpen(packet []byte) error { + var msg channelOpenMsg + if err := Unmarshal(packet, &msg); err != nil { + return err + } + + if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { + failMsg := channelOpenFailureMsg{ + PeersID: msg.PeersID, + Reason: ConnectionFailed, + Message: "invalid request", + Language: "en_US.UTF-8", + } + return m.sendMessage(failMsg) + } + + c := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData) + c.remoteId = msg.PeersID + c.maxRemotePayload = msg.MaxPacketSize + c.remoteWin.add(msg.PeersWindow) + m.incomingChannels <- c + return nil +} + +func (m *mux) OpenChannel(chanType string, extra []byte) (Channel, <-chan *Request, error) { + ch, err := m.openChannel(chanType, extra) + if err != nil { + return nil, nil, err + } + + return ch, ch.incomingRequests, nil +} + +func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) { + ch := m.newChannel(chanType, channelOutbound, extra) + + ch.maxIncomingPayload = channelMaxPacket + + open := channelOpenMsg{ + ChanType: chanType, + PeersWindow: ch.myWindow, + MaxPacketSize: ch.maxIncomingPayload, + TypeSpecificData: extra, + PeersID: ch.localId, + } + if err := m.sendMessage(open); err != nil { + return nil, err + } + + switch msg := (<-ch.msg).(type) { + case *channelOpenConfirmMsg: + return ch, nil + case *channelOpenFailureMsg: + return nil, &OpenChannelError{msg.Reason, msg.Message} + default: + return nil, fmt.Errorf("ssh: unexpected packet in response to channel open: %T", msg) + } +} + +func (m *mux) handleUnknownChannelPacket(id uint32, packet []byte) error { + msg, err := decode(packet) + if err != nil { + return err + } + + switch msg := msg.(type) { + // RFC 4254 section 5.4 says unrecognized channel requests should + // receive a failure response. + case *channelRequestMsg: + if msg.WantReply { + return m.sendMessage(channelRequestFailureMsg{ + PeersID: msg.PeersID, + }) + } + return nil + default: + return fmt.Errorf("ssh: invalid channel %d", id) + } +} diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go new file mode 100644 index 0000000000..8e013651cb --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -0,0 +1,744 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "errors" + "fmt" + "io" + "net" + "strings" +) + +// The Permissions type holds fine-grained permissions that are +// specific to a user or a specific authentication method for a user. +// The Permissions value for a successful authentication attempt is +// available in ServerConn, so it can be used to pass information from +// the user-authentication phase to the application layer. +type Permissions struct { + // CriticalOptions indicate restrictions to the default + // permissions, and are typically used in conjunction with + // user certificates. The standard for SSH certificates + // defines "force-command" (only allow the given command to + // execute) and "source-address" (only allow connections from + // the given address). The SSH package currently only enforces + // the "source-address" critical option. It is up to server + // implementations to enforce other critical options, such as + // "force-command", by checking them after the SSH handshake + // is successful. In general, SSH servers should reject + // connections that specify critical options that are unknown + // or not supported. + CriticalOptions map[string]string + + // Extensions are extra functionality that the server may + // offer on authenticated connections. Lack of support for an + // extension does not preclude authenticating a user. Common + // extensions are "permit-agent-forwarding", + // "permit-X11-forwarding". The Go SSH library currently does + // not act on any extension, and it is up to server + // implementations to honor them. Extensions can be used to + // pass data from the authentication callbacks to the server + // application layer. + Extensions map[string]string +} + +type GSSAPIWithMICConfig struct { + // AllowLogin, must be set, is called when gssapi-with-mic + // authentication is selected (RFC 4462 section 3). The srcName is from the + // results of the GSS-API authentication. The format is username@DOMAIN. + // GSSAPI just guarantees to the server who the user is, but not if they can log in, and with what permissions. + // This callback is called after the user identity is established with GSSAPI to decide if the user can login with + // which permissions. If the user is allowed to login, it should return a nil error. + AllowLogin func(conn ConnMetadata, srcName string) (*Permissions, error) + + // Server must be set. It's the implementation + // of the GSSAPIServer interface. See GSSAPIServer interface for details. + Server GSSAPIServer +} + +// ServerConfig holds server specific configuration data. +type ServerConfig struct { + // Config contains configuration shared between client and server. + Config + + hostKeys []Signer + + // NoClientAuth is true if clients are allowed to connect without + // authenticating. + NoClientAuth bool + + // MaxAuthTries specifies the maximum number of authentication attempts + // permitted per connection. If set to a negative number, the number of + // attempts are unlimited. If set to zero, the number of attempts are limited + // to 6. + MaxAuthTries int + + // PasswordCallback, if non-nil, is called when a user + // attempts to authenticate using a password. + PasswordCallback func(conn ConnMetadata, password []byte) (*Permissions, error) + + // PublicKeyCallback, if non-nil, is called when a client + // offers a public key for authentication. It must return a nil error + // if the given public key can be used to authenticate the + // given user. For example, see CertChecker.Authenticate. A + // call to this function does not guarantee that the key + // offered is in fact used to authenticate. To record any data + // depending on the public key, store it inside a + // Permissions.Extensions entry. + PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) + + // KeyboardInteractiveCallback, if non-nil, is called when + // keyboard-interactive authentication is selected (RFC + // 4256). The client object's Challenge function should be + // used to query the user. The callback may offer multiple + // Challenge rounds. To avoid information leaks, the client + // should be presented a challenge even if the user is + // unknown. + KeyboardInteractiveCallback func(conn ConnMetadata, client KeyboardInteractiveChallenge) (*Permissions, error) + + // AuthLogCallback, if non-nil, is called to log all authentication + // attempts. + AuthLogCallback func(conn ConnMetadata, method string, err error) + + // ServerVersion is the version identification string to announce in + // the public handshake. + // If empty, a reasonable default is used. + // Note that RFC 4253 section 4.2 requires that this string start with + // "SSH-2.0-". + ServerVersion string + + // BannerCallback, if present, is called and the return string is sent to + // the client after key exchange completed but before authentication. + BannerCallback func(conn ConnMetadata) string + + // GSSAPIWithMICConfig includes gssapi server and callback, which if both non-nil, is used + // when gssapi-with-mic authentication is selected (RFC 4462 section 3). + GSSAPIWithMICConfig *GSSAPIWithMICConfig +} + +// AddHostKey adds a private key as a host key. If an existing host +// key exists with the same algorithm, it is overwritten. Each server +// config must have at least one host key. +func (s *ServerConfig) AddHostKey(key Signer) { + for i, k := range s.hostKeys { + if k.PublicKey().Type() == key.PublicKey().Type() { + s.hostKeys[i] = key + return + } + } + + s.hostKeys = append(s.hostKeys, key) +} + +// cachedPubKey contains the results of querying whether a public key is +// acceptable for a user. +type cachedPubKey struct { + user string + pubKeyData []byte + result error + perms *Permissions +} + +const maxCachedPubKeys = 16 + +// pubKeyCache caches tests for public keys. Since SSH clients +// will query whether a public key is acceptable before attempting to +// authenticate with it, we end up with duplicate queries for public +// key validity. The cache only applies to a single ServerConn. +type pubKeyCache struct { + keys []cachedPubKey +} + +// get returns the result for a given user/algo/key tuple. +func (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) { + for _, k := range c.keys { + if k.user == user && bytes.Equal(k.pubKeyData, pubKeyData) { + return k, true + } + } + return cachedPubKey{}, false +} + +// add adds the given tuple to the cache. +func (c *pubKeyCache) add(candidate cachedPubKey) { + if len(c.keys) < maxCachedPubKeys { + c.keys = append(c.keys, candidate) + } +} + +// ServerConn is an authenticated SSH connection, as seen from the +// server +type ServerConn struct { + Conn + + // If the succeeding authentication callback returned a + // non-nil Permissions pointer, it is stored here. + Permissions *Permissions +} + +// NewServerConn starts a new SSH server with c as the underlying +// transport. It starts with a handshake and, if the handshake is +// unsuccessful, it closes the connection and returns an error. The +// Request and NewChannel channels must be serviced, or the connection +// will hang. +// +// The returned error may be of type *ServerAuthError for +// authentication errors. +func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) { + fullConf := *config + fullConf.SetDefaults() + if fullConf.MaxAuthTries == 0 { + fullConf.MaxAuthTries = 6 + } + // Check if the config contains any unsupported key exchanges + for _, kex := range fullConf.KeyExchanges { + if _, ok := serverForbiddenKexAlgos[kex]; ok { + return nil, nil, nil, fmt.Errorf("ssh: unsupported key exchange %s for server", kex) + } + } + + s := &connection{ + sshConn: sshConn{conn: c}, + } + perms, err := s.serverHandshake(&fullConf) + if err != nil { + c.Close() + return nil, nil, nil, err + } + return &ServerConn{s, perms}, s.mux.incomingChannels, s.mux.incomingRequests, nil +} + +// signAndMarshal signs the data with the appropriate algorithm, +// and serializes the result in SSH wire format. +func signAndMarshal(k Signer, rand io.Reader, data []byte) ([]byte, error) { + sig, err := k.Sign(rand, data) + if err != nil { + return nil, err + } + + return Marshal(sig), nil +} + +// handshake performs key exchange and user authentication. +func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) { + if len(config.hostKeys) == 0 { + return nil, errors.New("ssh: server has no host keys") + } + + if !config.NoClientAuth && config.PasswordCallback == nil && config.PublicKeyCallback == nil && + config.KeyboardInteractiveCallback == nil && (config.GSSAPIWithMICConfig == nil || + config.GSSAPIWithMICConfig.AllowLogin == nil || config.GSSAPIWithMICConfig.Server == nil) { + return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") + } + + if config.ServerVersion != "" { + s.serverVersion = []byte(config.ServerVersion) + } else { + s.serverVersion = []byte(packageVersion) + } + var err error + s.clientVersion, err = exchangeVersions(s.sshConn.conn, s.serverVersion) + if err != nil { + return nil, err + } + + tr := newTransport(s.sshConn.conn, config.Rand, false /* not client */) + s.transport = newServerTransport(tr, s.clientVersion, s.serverVersion, config) + + if err := s.transport.waitSession(); err != nil { + return nil, err + } + + // We just did the key change, so the session ID is established. + s.sessionID = s.transport.getSessionID() + + var packet []byte + if packet, err = s.transport.readPacket(); err != nil { + return nil, err + } + + var serviceRequest serviceRequestMsg + if err = Unmarshal(packet, &serviceRequest); err != nil { + return nil, err + } + if serviceRequest.Service != serviceUserAuth { + return nil, errors.New("ssh: requested service '" + serviceRequest.Service + "' before authenticating") + } + serviceAccept := serviceAcceptMsg{ + Service: serviceUserAuth, + } + if err := s.transport.writePacket(Marshal(&serviceAccept)); err != nil { + return nil, err + } + + perms, err := s.serverAuthenticate(config) + if err != nil { + return nil, err + } + s.mux = newMux(s.transport) + return perms, err +} + +func isAcceptableAlgo(algo string) bool { + switch algo { + case SigAlgoRSA, SigAlgoRSASHA2256, SigAlgoRSASHA2512, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoSKECDSA256, KeyAlgoED25519, KeyAlgoSKED25519, + CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoSKECDSA256v01, CertAlgoED25519v01, CertAlgoSKED25519v01: + return true + } + return false +} + +func checkSourceAddress(addr net.Addr, sourceAddrs string) error { + if addr == nil { + return errors.New("ssh: no address known for client, but source-address match required") + } + + tcpAddr, ok := addr.(*net.TCPAddr) + if !ok { + return fmt.Errorf("ssh: remote address %v is not an TCP address when checking source-address match", addr) + } + + for _, sourceAddr := range strings.Split(sourceAddrs, ",") { + if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil { + if allowedIP.Equal(tcpAddr.IP) { + return nil + } + } else { + _, ipNet, err := net.ParseCIDR(sourceAddr) + if err != nil { + return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err) + } + + if ipNet.Contains(tcpAddr.IP) { + return nil + } + } + } + + return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) +} + +func gssExchangeToken(gssapiConfig *GSSAPIWithMICConfig, firstToken []byte, s *connection, + sessionID []byte, userAuthReq userAuthRequestMsg) (authErr error, perms *Permissions, err error) { + gssAPIServer := gssapiConfig.Server + defer gssAPIServer.DeleteSecContext() + var srcName string + for { + var ( + outToken []byte + needContinue bool + ) + outToken, srcName, needContinue, err = gssAPIServer.AcceptSecContext(firstToken) + if err != nil { + return err, nil, nil + } + if len(outToken) != 0 { + if err := s.transport.writePacket(Marshal(&userAuthGSSAPIToken{ + Token: outToken, + })); err != nil { + return nil, nil, err + } + } + if !needContinue { + break + } + packet, err := s.transport.readPacket() + if err != nil { + return nil, nil, err + } + userAuthGSSAPITokenReq := &userAuthGSSAPIToken{} + if err := Unmarshal(packet, userAuthGSSAPITokenReq); err != nil { + return nil, nil, err + } + } + packet, err := s.transport.readPacket() + if err != nil { + return nil, nil, err + } + userAuthGSSAPIMICReq := &userAuthGSSAPIMIC{} + if err := Unmarshal(packet, userAuthGSSAPIMICReq); err != nil { + return nil, nil, err + } + mic := buildMIC(string(sessionID), userAuthReq.User, userAuthReq.Service, userAuthReq.Method) + if err := gssAPIServer.VerifyMIC(mic, userAuthGSSAPIMICReq.MIC); err != nil { + return err, nil, nil + } + perms, authErr = gssapiConfig.AllowLogin(s, srcName) + return authErr, perms, nil +} + +// ServerAuthError represents server authentication errors and is +// sometimes returned by NewServerConn. It appends any authentication +// errors that may occur, and is returned if all of the authentication +// methods provided by the user failed to authenticate. +type ServerAuthError struct { + // Errors contains authentication errors returned by the authentication + // callback methods. The first entry is typically ErrNoAuth. + Errors []error +} + +func (l ServerAuthError) Error() string { + var errs []string + for _, err := range l.Errors { + errs = append(errs, err.Error()) + } + return "[" + strings.Join(errs, ", ") + "]" +} + +// ErrNoAuth is the error value returned if no +// authentication method has been passed yet. This happens as a normal +// part of the authentication loop, since the client first tries +// 'none' authentication to discover available methods. +// It is returned in ServerAuthError.Errors from NewServerConn. +var ErrNoAuth = errors.New("ssh: no auth passed yet") + +func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) { + sessionID := s.transport.getSessionID() + var cache pubKeyCache + var perms *Permissions + + authFailures := 0 + var authErrs []error + var displayedBanner bool + +userAuthLoop: + for { + if authFailures >= config.MaxAuthTries && config.MaxAuthTries > 0 { + discMsg := &disconnectMsg{ + Reason: 2, + Message: "too many authentication failures", + } + + if err := s.transport.writePacket(Marshal(discMsg)); err != nil { + return nil, err + } + + return nil, discMsg + } + + var userAuthReq userAuthRequestMsg + if packet, err := s.transport.readPacket(); err != nil { + if err == io.EOF { + return nil, &ServerAuthError{Errors: authErrs} + } + return nil, err + } else if err = Unmarshal(packet, &userAuthReq); err != nil { + return nil, err + } + + if userAuthReq.Service != serviceSSH { + return nil, errors.New("ssh: client attempted to negotiate for unknown service: " + userAuthReq.Service) + } + + s.user = userAuthReq.User + + if !displayedBanner && config.BannerCallback != nil { + displayedBanner = true + msg := config.BannerCallback(s) + if msg != "" { + bannerMsg := &userAuthBannerMsg{ + Message: msg, + } + if err := s.transport.writePacket(Marshal(bannerMsg)); err != nil { + return nil, err + } + } + } + + perms = nil + authErr := ErrNoAuth + + switch userAuthReq.Method { + case "none": + if config.NoClientAuth { + authErr = nil + } + + // allow initial attempt of 'none' without penalty + if authFailures == 0 { + authFailures-- + } + case "password": + if config.PasswordCallback == nil { + authErr = errors.New("ssh: password auth not configured") + break + } + payload := userAuthReq.Payload + if len(payload) < 1 || payload[0] != 0 { + return nil, parseError(msgUserAuthRequest) + } + payload = payload[1:] + password, payload, ok := parseString(payload) + if !ok || len(payload) > 0 { + return nil, parseError(msgUserAuthRequest) + } + + perms, authErr = config.PasswordCallback(s, password) + case "keyboard-interactive": + if config.KeyboardInteractiveCallback == nil { + authErr = errors.New("ssh: keyboard-interactive auth not configured") + break + } + + prompter := &sshClientKeyboardInteractive{s} + perms, authErr = config.KeyboardInteractiveCallback(s, prompter.Challenge) + case "publickey": + if config.PublicKeyCallback == nil { + authErr = errors.New("ssh: publickey auth not configured") + break + } + payload := userAuthReq.Payload + if len(payload) < 1 { + return nil, parseError(msgUserAuthRequest) + } + isQuery := payload[0] == 0 + payload = payload[1:] + algoBytes, payload, ok := parseString(payload) + if !ok { + return nil, parseError(msgUserAuthRequest) + } + algo := string(algoBytes) + if !isAcceptableAlgo(algo) { + authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo) + break + } + + pubKeyData, payload, ok := parseString(payload) + if !ok { + return nil, parseError(msgUserAuthRequest) + } + + pubKey, err := ParsePublicKey(pubKeyData) + if err != nil { + return nil, err + } + + candidate, ok := cache.get(s.user, pubKeyData) + if !ok { + candidate.user = s.user + candidate.pubKeyData = pubKeyData + candidate.perms, candidate.result = config.PublicKeyCallback(s, pubKey) + if candidate.result == nil && candidate.perms != nil && candidate.perms.CriticalOptions != nil && candidate.perms.CriticalOptions[sourceAddressCriticalOption] != "" { + candidate.result = checkSourceAddress( + s.RemoteAddr(), + candidate.perms.CriticalOptions[sourceAddressCriticalOption]) + } + cache.add(candidate) + } + + if isQuery { + // The client can query if the given public key + // would be okay. + + if len(payload) > 0 { + return nil, parseError(msgUserAuthRequest) + } + + if candidate.result == nil { + okMsg := userAuthPubKeyOkMsg{ + Algo: algo, + PubKey: pubKeyData, + } + if err = s.transport.writePacket(Marshal(&okMsg)); err != nil { + return nil, err + } + continue userAuthLoop + } + authErr = candidate.result + } else { + sig, payload, ok := parseSignature(payload) + if !ok || len(payload) > 0 { + return nil, parseError(msgUserAuthRequest) + } + // Ensure the public key algo and signature algo + // are supported. Compare the private key + // algorithm name that corresponds to algo with + // sig.Format. This is usually the same, but + // for certs, the names differ. + if !isAcceptableAlgo(sig.Format) { + authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format) + break + } + signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) + + if err := pubKey.Verify(signedData, sig); err != nil { + return nil, err + } + + authErr = candidate.result + perms = candidate.perms + } + case "gssapi-with-mic": + if config.GSSAPIWithMICConfig == nil { + authErr = errors.New("ssh: gssapi-with-mic auth not configured") + break + } + gssapiConfig := config.GSSAPIWithMICConfig + userAuthRequestGSSAPI, err := parseGSSAPIPayload(userAuthReq.Payload) + if err != nil { + return nil, parseError(msgUserAuthRequest) + } + // OpenSSH supports Kerberos V5 mechanism only for GSS-API authentication. + if userAuthRequestGSSAPI.N == 0 { + authErr = fmt.Errorf("ssh: Mechanism negotiation is not supported") + break + } + var i uint32 + present := false + for i = 0; i < userAuthRequestGSSAPI.N; i++ { + if userAuthRequestGSSAPI.OIDS[i].Equal(krb5Mesh) { + present = true + break + } + } + if !present { + authErr = fmt.Errorf("ssh: GSSAPI authentication must use the Kerberos V5 mechanism") + break + } + // Initial server response, see RFC 4462 section 3.3. + if err := s.transport.writePacket(Marshal(&userAuthGSSAPIResponse{ + SupportMech: krb5OID, + })); err != nil { + return nil, err + } + // Exchange token, see RFC 4462 section 3.4. + packet, err := s.transport.readPacket() + if err != nil { + return nil, err + } + userAuthGSSAPITokenReq := &userAuthGSSAPIToken{} + if err := Unmarshal(packet, userAuthGSSAPITokenReq); err != nil { + return nil, err + } + authErr, perms, err = gssExchangeToken(gssapiConfig, userAuthGSSAPITokenReq.Token, s, sessionID, + userAuthReq) + if err != nil { + return nil, err + } + default: + authErr = fmt.Errorf("ssh: unknown method %q", userAuthReq.Method) + } + + authErrs = append(authErrs, authErr) + + if config.AuthLogCallback != nil { + config.AuthLogCallback(s, userAuthReq.Method, authErr) + } + + if authErr == nil { + break userAuthLoop + } + + authFailures++ + if config.MaxAuthTries > 0 && authFailures >= config.MaxAuthTries { + // If we have hit the max attemps, don't bother sending the + // final SSH_MSG_USERAUTH_FAILURE message, since there are + // no more authentication methods which can be attempted, + // and this message may cause the client to re-attempt + // authentication while we send the disconnect message. + // Continue, and trigger the disconnect at the start of + // the loop. + // + // The SSH specification is somewhat confusing about this, + // RFC 4252 Section 5.1 requires each authentication failure + // be responded to with a respective SSH_MSG_USERAUTH_FAILURE + // message, but Section 4 says the server should disconnect + // after some number of attempts, but it isn't explicit which + // message should take precedence (i.e. should there be a failure + // message than a disconnect message, or if we are going to + // disconnect, should we only send that message.) + // + // Either way, OpenSSH disconnects immediately after the last + // failed authnetication attempt, and given they are typically + // considered the golden implementation it seems reasonable + // to match that behavior. + continue + } + + var failureMsg userAuthFailureMsg + if config.PasswordCallback != nil { + failureMsg.Methods = append(failureMsg.Methods, "password") + } + if config.PublicKeyCallback != nil { + failureMsg.Methods = append(failureMsg.Methods, "publickey") + } + if config.KeyboardInteractiveCallback != nil { + failureMsg.Methods = append(failureMsg.Methods, "keyboard-interactive") + } + if config.GSSAPIWithMICConfig != nil && config.GSSAPIWithMICConfig.Server != nil && + config.GSSAPIWithMICConfig.AllowLogin != nil { + failureMsg.Methods = append(failureMsg.Methods, "gssapi-with-mic") + } + + if len(failureMsg.Methods) == 0 { + return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") + } + + if err := s.transport.writePacket(Marshal(&failureMsg)); err != nil { + return nil, err + } + } + + if err := s.transport.writePacket([]byte{msgUserAuthSuccess}); err != nil { + return nil, err + } + return perms, nil +} + +// sshClientKeyboardInteractive implements a ClientKeyboardInteractive by +// asking the client on the other side of a ServerConn. +type sshClientKeyboardInteractive struct { + *connection +} + +func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, questions []string, echos []bool) (answers []string, err error) { + if len(questions) != len(echos) { + return nil, errors.New("ssh: echos and questions must have equal length") + } + + var prompts []byte + for i := range questions { + prompts = appendString(prompts, questions[i]) + prompts = appendBool(prompts, echos[i]) + } + + if err := c.transport.writePacket(Marshal(&userAuthInfoRequestMsg{ + Instruction: instruction, + NumPrompts: uint32(len(questions)), + Prompts: prompts, + })); err != nil { + return nil, err + } + + packet, err := c.transport.readPacket() + if err != nil { + return nil, err + } + if packet[0] != msgUserAuthInfoResponse { + return nil, unexpectedMessageError(msgUserAuthInfoResponse, packet[0]) + } + packet = packet[1:] + + n, packet, ok := parseUint32(packet) + if !ok || int(n) != len(questions) { + return nil, parseError(msgUserAuthInfoResponse) + } + + for i := uint32(0); i < n; i++ { + ans, rest, ok := parseString(packet) + if !ok { + return nil, parseError(msgUserAuthInfoResponse) + } + + answers = append(answers, string(ans)) + packet = rest + } + if len(packet) != 0 { + return nil, errors.New("ssh: junk at end of message") + } + + return answers, nil +} diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go new file mode 100644 index 0000000000..d3321f6b78 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/session.go @@ -0,0 +1,647 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +// Session implements an interactive session described in +// "RFC 4254, section 6". + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "io/ioutil" + "sync" +) + +type Signal string + +// POSIX signals as listed in RFC 4254 Section 6.10. +const ( + SIGABRT Signal = "ABRT" + SIGALRM Signal = "ALRM" + SIGFPE Signal = "FPE" + SIGHUP Signal = "HUP" + SIGILL Signal = "ILL" + SIGINT Signal = "INT" + SIGKILL Signal = "KILL" + SIGPIPE Signal = "PIPE" + SIGQUIT Signal = "QUIT" + SIGSEGV Signal = "SEGV" + SIGTERM Signal = "TERM" + SIGUSR1 Signal = "USR1" + SIGUSR2 Signal = "USR2" +) + +var signals = map[Signal]int{ + SIGABRT: 6, + SIGALRM: 14, + SIGFPE: 8, + SIGHUP: 1, + SIGILL: 4, + SIGINT: 2, + SIGKILL: 9, + SIGPIPE: 13, + SIGQUIT: 3, + SIGSEGV: 11, + SIGTERM: 15, +} + +type TerminalModes map[uint8]uint32 + +// POSIX terminal mode flags as listed in RFC 4254 Section 8. +const ( + tty_OP_END = 0 + VINTR = 1 + VQUIT = 2 + VERASE = 3 + VKILL = 4 + VEOF = 5 + VEOL = 6 + VEOL2 = 7 + VSTART = 8 + VSTOP = 9 + VSUSP = 10 + VDSUSP = 11 + VREPRINT = 12 + VWERASE = 13 + VLNEXT = 14 + VFLUSH = 15 + VSWTCH = 16 + VSTATUS = 17 + VDISCARD = 18 + IGNPAR = 30 + PARMRK = 31 + INPCK = 32 + ISTRIP = 33 + INLCR = 34 + IGNCR = 35 + ICRNL = 36 + IUCLC = 37 + IXON = 38 + IXANY = 39 + IXOFF = 40 + IMAXBEL = 41 + ISIG = 50 + ICANON = 51 + XCASE = 52 + ECHO = 53 + ECHOE = 54 + ECHOK = 55 + ECHONL = 56 + NOFLSH = 57 + TOSTOP = 58 + IEXTEN = 59 + ECHOCTL = 60 + ECHOKE = 61 + PENDIN = 62 + OPOST = 70 + OLCUC = 71 + ONLCR = 72 + OCRNL = 73 + ONOCR = 74 + ONLRET = 75 + CS7 = 90 + CS8 = 91 + PARENB = 92 + PARODD = 93 + TTY_OP_ISPEED = 128 + TTY_OP_OSPEED = 129 +) + +// A Session represents a connection to a remote command or shell. +type Session struct { + // Stdin specifies the remote process's standard input. + // If Stdin is nil, the remote process reads from an empty + // bytes.Buffer. + Stdin io.Reader + + // Stdout and Stderr specify the remote process's standard + // output and error. + // + // If either is nil, Run connects the corresponding file + // descriptor to an instance of ioutil.Discard. There is a + // fixed amount of buffering that is shared for the two streams. + // If either blocks it may eventually cause the remote + // command to block. + Stdout io.Writer + Stderr io.Writer + + ch Channel // the channel backing this session + started bool // true once Start, Run or Shell is invoked. + copyFuncs []func() error + errors chan error // one send per copyFunc + + // true if pipe method is active + stdinpipe, stdoutpipe, stderrpipe bool + + // stdinPipeWriter is non-nil if StdinPipe has not been called + // and Stdin was specified by the user; it is the write end of + // a pipe connecting Session.Stdin to the stdin channel. + stdinPipeWriter io.WriteCloser + + exitStatus chan error +} + +// SendRequest sends an out-of-band channel request on the SSH channel +// underlying the session. +func (s *Session) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { + return s.ch.SendRequest(name, wantReply, payload) +} + +func (s *Session) Close() error { + return s.ch.Close() +} + +// RFC 4254 Section 6.4. +type setenvRequest struct { + Name string + Value string +} + +// Setenv sets an environment variable that will be applied to any +// command executed by Shell or Run. +func (s *Session) Setenv(name, value string) error { + msg := setenvRequest{ + Name: name, + Value: value, + } + ok, err := s.ch.SendRequest("env", true, Marshal(&msg)) + if err == nil && !ok { + err = errors.New("ssh: setenv failed") + } + return err +} + +// RFC 4254 Section 6.2. +type ptyRequestMsg struct { + Term string + Columns uint32 + Rows uint32 + Width uint32 + Height uint32 + Modelist string +} + +// RequestPty requests the association of a pty with the session on the remote host. +func (s *Session) RequestPty(term string, h, w int, termmodes TerminalModes) error { + var tm []byte + for k, v := range termmodes { + kv := struct { + Key byte + Val uint32 + }{k, v} + + tm = append(tm, Marshal(&kv)...) + } + tm = append(tm, tty_OP_END) + req := ptyRequestMsg{ + Term: term, + Columns: uint32(w), + Rows: uint32(h), + Width: uint32(w * 8), + Height: uint32(h * 8), + Modelist: string(tm), + } + ok, err := s.ch.SendRequest("pty-req", true, Marshal(&req)) + if err == nil && !ok { + err = errors.New("ssh: pty-req failed") + } + return err +} + +// RFC 4254 Section 6.5. +type subsystemRequestMsg struct { + Subsystem string +} + +// RequestSubsystem requests the association of a subsystem with the session on the remote host. +// A subsystem is a predefined command that runs in the background when the ssh session is initiated +func (s *Session) RequestSubsystem(subsystem string) error { + msg := subsystemRequestMsg{ + Subsystem: subsystem, + } + ok, err := s.ch.SendRequest("subsystem", true, Marshal(&msg)) + if err == nil && !ok { + err = errors.New("ssh: subsystem request failed") + } + return err +} + +// RFC 4254 Section 6.7. +type ptyWindowChangeMsg struct { + Columns uint32 + Rows uint32 + Width uint32 + Height uint32 +} + +// WindowChange informs the remote host about a terminal window dimension change to h rows and w columns. +func (s *Session) WindowChange(h, w int) error { + req := ptyWindowChangeMsg{ + Columns: uint32(w), + Rows: uint32(h), + Width: uint32(w * 8), + Height: uint32(h * 8), + } + _, err := s.ch.SendRequest("window-change", false, Marshal(&req)) + return err +} + +// RFC 4254 Section 6.9. +type signalMsg struct { + Signal string +} + +// Signal sends the given signal to the remote process. +// sig is one of the SIG* constants. +func (s *Session) Signal(sig Signal) error { + msg := signalMsg{ + Signal: string(sig), + } + + _, err := s.ch.SendRequest("signal", false, Marshal(&msg)) + return err +} + +// RFC 4254 Section 6.5. +type execMsg struct { + Command string +} + +// Start runs cmd on the remote host. Typically, the remote +// server passes cmd to the shell for interpretation. +// A Session only accepts one call to Run, Start or Shell. +func (s *Session) Start(cmd string) error { + if s.started { + return errors.New("ssh: session already started") + } + req := execMsg{ + Command: cmd, + } + + ok, err := s.ch.SendRequest("exec", true, Marshal(&req)) + if err == nil && !ok { + err = fmt.Errorf("ssh: command %v failed", cmd) + } + if err != nil { + return err + } + return s.start() +} + +// Run runs cmd on the remote host. Typically, the remote +// server passes cmd to the shell for interpretation. +// A Session only accepts one call to Run, Start, Shell, Output, +// or CombinedOutput. +// +// The returned error is nil if the command runs, has no problems +// copying stdin, stdout, and stderr, and exits with a zero exit +// status. +// +// If the remote server does not send an exit status, an error of type +// *ExitMissingError is returned. If the command completes +// unsuccessfully or is interrupted by a signal, the error is of type +// *ExitError. Other error types may be returned for I/O problems. +func (s *Session) Run(cmd string) error { + err := s.Start(cmd) + if err != nil { + return err + } + return s.Wait() +} + +// Output runs cmd on the remote host and returns its standard output. +func (s *Session) Output(cmd string) ([]byte, error) { + if s.Stdout != nil { + return nil, errors.New("ssh: Stdout already set") + } + var b bytes.Buffer + s.Stdout = &b + err := s.Run(cmd) + return b.Bytes(), err +} + +type singleWriter struct { + b bytes.Buffer + mu sync.Mutex +} + +func (w *singleWriter) Write(p []byte) (int, error) { + w.mu.Lock() + defer w.mu.Unlock() + return w.b.Write(p) +} + +// CombinedOutput runs cmd on the remote host and returns its combined +// standard output and standard error. +func (s *Session) CombinedOutput(cmd string) ([]byte, error) { + if s.Stdout != nil { + return nil, errors.New("ssh: Stdout already set") + } + if s.Stderr != nil { + return nil, errors.New("ssh: Stderr already set") + } + var b singleWriter + s.Stdout = &b + s.Stderr = &b + err := s.Run(cmd) + return b.b.Bytes(), err +} + +// Shell starts a login shell on the remote host. A Session only +// accepts one call to Run, Start, Shell, Output, or CombinedOutput. +func (s *Session) Shell() error { + if s.started { + return errors.New("ssh: session already started") + } + + ok, err := s.ch.SendRequest("shell", true, nil) + if err == nil && !ok { + return errors.New("ssh: could not start shell") + } + if err != nil { + return err + } + return s.start() +} + +func (s *Session) start() error { + s.started = true + + type F func(*Session) + for _, setupFd := range []F{(*Session).stdin, (*Session).stdout, (*Session).stderr} { + setupFd(s) + } + + s.errors = make(chan error, len(s.copyFuncs)) + for _, fn := range s.copyFuncs { + go func(fn func() error) { + s.errors <- fn() + }(fn) + } + return nil +} + +// Wait waits for the remote command to exit. +// +// The returned error is nil if the command runs, has no problems +// copying stdin, stdout, and stderr, and exits with a zero exit +// status. +// +// If the remote server does not send an exit status, an error of type +// *ExitMissingError is returned. If the command completes +// unsuccessfully or is interrupted by a signal, the error is of type +// *ExitError. Other error types may be returned for I/O problems. +func (s *Session) Wait() error { + if !s.started { + return errors.New("ssh: session not started") + } + waitErr := <-s.exitStatus + + if s.stdinPipeWriter != nil { + s.stdinPipeWriter.Close() + } + var copyError error + for range s.copyFuncs { + if err := <-s.errors; err != nil && copyError == nil { + copyError = err + } + } + if waitErr != nil { + return waitErr + } + return copyError +} + +func (s *Session) wait(reqs <-chan *Request) error { + wm := Waitmsg{status: -1} + // Wait for msg channel to be closed before returning. + for msg := range reqs { + switch msg.Type { + case "exit-status": + wm.status = int(binary.BigEndian.Uint32(msg.Payload)) + case "exit-signal": + var sigval struct { + Signal string + CoreDumped bool + Error string + Lang string + } + if err := Unmarshal(msg.Payload, &sigval); err != nil { + return err + } + + // Must sanitize strings? + wm.signal = sigval.Signal + wm.msg = sigval.Error + wm.lang = sigval.Lang + default: + // This handles keepalives and matches + // OpenSSH's behaviour. + if msg.WantReply { + msg.Reply(false, nil) + } + } + } + if wm.status == 0 { + return nil + } + if wm.status == -1 { + // exit-status was never sent from server + if wm.signal == "" { + // signal was not sent either. RFC 4254 + // section 6.10 recommends against this + // behavior, but it is allowed, so we let + // clients handle it. + return &ExitMissingError{} + } + wm.status = 128 + if _, ok := signals[Signal(wm.signal)]; ok { + wm.status += signals[Signal(wm.signal)] + } + } + + return &ExitError{wm} +} + +// ExitMissingError is returned if a session is torn down cleanly, but +// the server sends no confirmation of the exit status. +type ExitMissingError struct{} + +func (e *ExitMissingError) Error() string { + return "wait: remote command exited without exit status or exit signal" +} + +func (s *Session) stdin() { + if s.stdinpipe { + return + } + var stdin io.Reader + if s.Stdin == nil { + stdin = new(bytes.Buffer) + } else { + r, w := io.Pipe() + go func() { + _, err := io.Copy(w, s.Stdin) + w.CloseWithError(err) + }() + stdin, s.stdinPipeWriter = r, w + } + s.copyFuncs = append(s.copyFuncs, func() error { + _, err := io.Copy(s.ch, stdin) + if err1 := s.ch.CloseWrite(); err == nil && err1 != io.EOF { + err = err1 + } + return err + }) +} + +func (s *Session) stdout() { + if s.stdoutpipe { + return + } + if s.Stdout == nil { + s.Stdout = ioutil.Discard + } + s.copyFuncs = append(s.copyFuncs, func() error { + _, err := io.Copy(s.Stdout, s.ch) + return err + }) +} + +func (s *Session) stderr() { + if s.stderrpipe { + return + } + if s.Stderr == nil { + s.Stderr = ioutil.Discard + } + s.copyFuncs = append(s.copyFuncs, func() error { + _, err := io.Copy(s.Stderr, s.ch.Stderr()) + return err + }) +} + +// sessionStdin reroutes Close to CloseWrite. +type sessionStdin struct { + io.Writer + ch Channel +} + +func (s *sessionStdin) Close() error { + return s.ch.CloseWrite() +} + +// StdinPipe returns a pipe that will be connected to the +// remote command's standard input when the command starts. +func (s *Session) StdinPipe() (io.WriteCloser, error) { + if s.Stdin != nil { + return nil, errors.New("ssh: Stdin already set") + } + if s.started { + return nil, errors.New("ssh: StdinPipe after process started") + } + s.stdinpipe = true + return &sessionStdin{s.ch, s.ch}, nil +} + +// StdoutPipe returns a pipe that will be connected to the +// remote command's standard output when the command starts. +// There is a fixed amount of buffering that is shared between +// stdout and stderr streams. If the StdoutPipe reader is +// not serviced fast enough it may eventually cause the +// remote command to block. +func (s *Session) StdoutPipe() (io.Reader, error) { + if s.Stdout != nil { + return nil, errors.New("ssh: Stdout already set") + } + if s.started { + return nil, errors.New("ssh: StdoutPipe after process started") + } + s.stdoutpipe = true + return s.ch, nil +} + +// StderrPipe returns a pipe that will be connected to the +// remote command's standard error when the command starts. +// There is a fixed amount of buffering that is shared between +// stdout and stderr streams. If the StderrPipe reader is +// not serviced fast enough it may eventually cause the +// remote command to block. +func (s *Session) StderrPipe() (io.Reader, error) { + if s.Stderr != nil { + return nil, errors.New("ssh: Stderr already set") + } + if s.started { + return nil, errors.New("ssh: StderrPipe after process started") + } + s.stderrpipe = true + return s.ch.Stderr(), nil +} + +// newSession returns a new interactive session on the remote host. +func newSession(ch Channel, reqs <-chan *Request) (*Session, error) { + s := &Session{ + ch: ch, + } + s.exitStatus = make(chan error, 1) + go func() { + s.exitStatus <- s.wait(reqs) + }() + + return s, nil +} + +// An ExitError reports unsuccessful completion of a remote command. +type ExitError struct { + Waitmsg +} + +func (e *ExitError) Error() string { + return e.Waitmsg.String() +} + +// Waitmsg stores the information about an exited remote command +// as reported by Wait. +type Waitmsg struct { + status int + signal string + msg string + lang string +} + +// ExitStatus returns the exit status of the remote command. +func (w Waitmsg) ExitStatus() int { + return w.status +} + +// Signal returns the exit signal of the remote command if +// it was terminated violently. +func (w Waitmsg) Signal() string { + return w.signal +} + +// Msg returns the exit message given by the remote command +func (w Waitmsg) Msg() string { + return w.msg +} + +// Lang returns the language tag. See RFC 3066 +func (w Waitmsg) Lang() string { + return w.lang +} + +func (w Waitmsg) String() string { + str := fmt.Sprintf("Process exited with status %v", w.status) + if w.signal != "" { + str += fmt.Sprintf(" from signal %v", w.signal) + } + if w.msg != "" { + str += fmt.Sprintf(". Reason was: %v", w.msg) + } + return str +} diff --git a/vendor/golang.org/x/crypto/ssh/ssh_gss.go b/vendor/golang.org/x/crypto/ssh/ssh_gss.go new file mode 100644 index 0000000000..24bd7c8e83 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/ssh_gss.go @@ -0,0 +1,139 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "encoding/asn1" + "errors" +) + +var krb5OID []byte + +func init() { + krb5OID, _ = asn1.Marshal(krb5Mesh) +} + +// GSSAPIClient provides the API to plug-in GSSAPI authentication for client logins. +type GSSAPIClient interface { + // InitSecContext initiates the establishment of a security context for GSS-API between the + // ssh client and ssh server. Initially the token parameter should be specified as nil. + // The routine may return a outputToken which should be transferred to + // the ssh server, where the ssh server will present it to + // AcceptSecContext. If no token need be sent, InitSecContext will indicate this by setting + // needContinue to false. To complete the context + // establishment, one or more reply tokens may be required from the ssh + // server;if so, InitSecContext will return a needContinue which is true. + // In this case, InitSecContext should be called again when the + // reply token is received from the ssh server, passing the reply + // token to InitSecContext via the token parameters. + // See RFC 2743 section 2.2.1 and RFC 4462 section 3.4. + InitSecContext(target string, token []byte, isGSSDelegCreds bool) (outputToken []byte, needContinue bool, err error) + // GetMIC generates a cryptographic MIC for the SSH2 message, and places + // the MIC in a token for transfer to the ssh server. + // The contents of the MIC field are obtained by calling GSS_GetMIC() + // over the following, using the GSS-API context that was just + // established: + // string session identifier + // byte SSH_MSG_USERAUTH_REQUEST + // string user name + // string service + // string "gssapi-with-mic" + // See RFC 2743 section 2.3.1 and RFC 4462 3.5. + GetMIC(micFiled []byte) ([]byte, error) + // Whenever possible, it should be possible for + // DeleteSecContext() calls to be successfully processed even + // if other calls cannot succeed, thereby enabling context-related + // resources to be released. + // In addition to deleting established security contexts, + // gss_delete_sec_context must also be able to delete "half-built" + // security contexts resulting from an incomplete sequence of + // InitSecContext()/AcceptSecContext() calls. + // See RFC 2743 section 2.2.3. + DeleteSecContext() error +} + +// GSSAPIServer provides the API to plug in GSSAPI authentication for server logins. +type GSSAPIServer interface { + // AcceptSecContext allows a remotely initiated security context between the application + // and a remote peer to be established by the ssh client. The routine may return a + // outputToken which should be transferred to the ssh client, + // where the ssh client will present it to InitSecContext. + // If no token need be sent, AcceptSecContext will indicate this + // by setting the needContinue to false. To + // complete the context establishment, one or more reply tokens may be + // required from the ssh client. if so, AcceptSecContext + // will return a needContinue which is true, in which case it + // should be called again when the reply token is received from the ssh + // client, passing the token to AcceptSecContext via the + // token parameters. + // The srcName return value is the authenticated username. + // See RFC 2743 section 2.2.2 and RFC 4462 section 3.4. + AcceptSecContext(token []byte) (outputToken []byte, srcName string, needContinue bool, err error) + // VerifyMIC verifies that a cryptographic MIC, contained in the token parameter, + // fits the supplied message is received from the ssh client. + // See RFC 2743 section 2.3.2. + VerifyMIC(micField []byte, micToken []byte) error + // Whenever possible, it should be possible for + // DeleteSecContext() calls to be successfully processed even + // if other calls cannot succeed, thereby enabling context-related + // resources to be released. + // In addition to deleting established security contexts, + // gss_delete_sec_context must also be able to delete "half-built" + // security contexts resulting from an incomplete sequence of + // InitSecContext()/AcceptSecContext() calls. + // See RFC 2743 section 2.2.3. + DeleteSecContext() error +} + +var ( + // OpenSSH supports Kerberos V5 mechanism only for GSS-API authentication, + // so we also support the krb5 mechanism only. + // See RFC 1964 section 1. + krb5Mesh = asn1.ObjectIdentifier{1, 2, 840, 113554, 1, 2, 2} +) + +// The GSS-API authentication method is initiated when the client sends an SSH_MSG_USERAUTH_REQUEST +// See RFC 4462 section 3.2. +type userAuthRequestGSSAPI struct { + N uint32 + OIDS []asn1.ObjectIdentifier +} + +func parseGSSAPIPayload(payload []byte) (*userAuthRequestGSSAPI, error) { + n, rest, ok := parseUint32(payload) + if !ok { + return nil, errors.New("parse uint32 failed") + } + s := &userAuthRequestGSSAPI{ + N: n, + OIDS: make([]asn1.ObjectIdentifier, n), + } + for i := 0; i < int(n); i++ { + var ( + desiredMech []byte + err error + ) + desiredMech, rest, ok = parseString(rest) + if !ok { + return nil, errors.New("parse string failed") + } + if rest, err = asn1.Unmarshal(desiredMech, &s.OIDS[i]); err != nil { + return nil, err + } + + } + return s, nil +} + +// See RFC 4462 section 3.6. +func buildMIC(sessionID string, username string, service string, authMethod string) []byte { + out := make([]byte, 0, 0) + out = appendString(out, sessionID) + out = append(out, msgUserAuthRequest) + out = appendString(out, username) + out = appendString(out, service) + out = appendString(out, authMethod) + return out +} diff --git a/vendor/golang.org/x/crypto/ssh/streamlocal.go b/vendor/golang.org/x/crypto/ssh/streamlocal.go new file mode 100644 index 0000000000..b171b330bc --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/streamlocal.go @@ -0,0 +1,116 @@ +package ssh + +import ( + "errors" + "io" + "net" +) + +// streamLocalChannelOpenDirectMsg is a struct used for SSH_MSG_CHANNEL_OPEN message +// with "direct-streamlocal@openssh.com" string. +// +// See openssh-portable/PROTOCOL, section 2.4. connection: Unix domain socket forwarding +// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL#L235 +type streamLocalChannelOpenDirectMsg struct { + socketPath string + reserved0 string + reserved1 uint32 +} + +// forwardedStreamLocalPayload is a struct used for SSH_MSG_CHANNEL_OPEN message +// with "forwarded-streamlocal@openssh.com" string. +type forwardedStreamLocalPayload struct { + SocketPath string + Reserved0 string +} + +// streamLocalChannelForwardMsg is a struct used for SSH2_MSG_GLOBAL_REQUEST message +// with "streamlocal-forward@openssh.com"/"cancel-streamlocal-forward@openssh.com" string. +type streamLocalChannelForwardMsg struct { + socketPath string +} + +// ListenUnix is similar to ListenTCP but uses a Unix domain socket. +func (c *Client) ListenUnix(socketPath string) (net.Listener, error) { + c.handleForwardsOnce.Do(c.handleForwards) + m := streamLocalChannelForwardMsg{ + socketPath, + } + // send message + ok, _, err := c.SendRequest("streamlocal-forward@openssh.com", true, Marshal(&m)) + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("ssh: streamlocal-forward@openssh.com request denied by peer") + } + ch := c.forwards.add(&net.UnixAddr{Name: socketPath, Net: "unix"}) + + return &unixListener{socketPath, c, ch}, nil +} + +func (c *Client) dialStreamLocal(socketPath string) (Channel, error) { + msg := streamLocalChannelOpenDirectMsg{ + socketPath: socketPath, + } + ch, in, err := c.OpenChannel("direct-streamlocal@openssh.com", Marshal(&msg)) + if err != nil { + return nil, err + } + go DiscardRequests(in) + return ch, err +} + +type unixListener struct { + socketPath string + + conn *Client + in <-chan forward +} + +// Accept waits for and returns the next connection to the listener. +func (l *unixListener) Accept() (net.Conn, error) { + s, ok := <-l.in + if !ok { + return nil, io.EOF + } + ch, incoming, err := s.newCh.Accept() + if err != nil { + return nil, err + } + go DiscardRequests(incoming) + + return &chanConn{ + Channel: ch, + laddr: &net.UnixAddr{ + Name: l.socketPath, + Net: "unix", + }, + raddr: &net.UnixAddr{ + Name: "@", + Net: "unix", + }, + }, nil +} + +// Close closes the listener. +func (l *unixListener) Close() error { + // this also closes the listener. + l.conn.forwards.remove(&net.UnixAddr{Name: l.socketPath, Net: "unix"}) + m := streamLocalChannelForwardMsg{ + l.socketPath, + } + ok, _, err := l.conn.SendRequest("cancel-streamlocal-forward@openssh.com", true, Marshal(&m)) + if err == nil && !ok { + err = errors.New("ssh: cancel-streamlocal-forward@openssh.com failed") + } + return err +} + +// Addr returns the listener's network address. +func (l *unixListener) Addr() net.Addr { + return &net.UnixAddr{ + Name: l.socketPath, + Net: "unix", + } +} diff --git a/vendor/golang.org/x/crypto/ssh/tcpip.go b/vendor/golang.org/x/crypto/ssh/tcpip.go new file mode 100644 index 0000000000..80d35f5ec1 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/tcpip.go @@ -0,0 +1,474 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "errors" + "fmt" + "io" + "math/rand" + "net" + "strconv" + "strings" + "sync" + "time" +) + +// Listen requests the remote peer open a listening socket on +// addr. Incoming connections will be available by calling Accept on +// the returned net.Listener. The listener must be serviced, or the +// SSH connection may hang. +// N must be "tcp", "tcp4", "tcp6", or "unix". +func (c *Client) Listen(n, addr string) (net.Listener, error) { + switch n { + case "tcp", "tcp4", "tcp6": + laddr, err := net.ResolveTCPAddr(n, addr) + if err != nil { + return nil, err + } + return c.ListenTCP(laddr) + case "unix": + return c.ListenUnix(addr) + default: + return nil, fmt.Errorf("ssh: unsupported protocol: %s", n) + } +} + +// Automatic port allocation is broken with OpenSSH before 6.0. See +// also https://bugzilla.mindrot.org/show_bug.cgi?id=2017. In +// particular, OpenSSH 5.9 sends a channelOpenMsg with port number 0, +// rather than the actual port number. This means you can never open +// two different listeners with auto allocated ports. We work around +// this by trying explicit ports until we succeed. + +const openSSHPrefix = "OpenSSH_" + +var portRandomizer = rand.New(rand.NewSource(time.Now().UnixNano())) + +// isBrokenOpenSSHVersion returns true if the given version string +// specifies a version of OpenSSH that is known to have a bug in port +// forwarding. +func isBrokenOpenSSHVersion(versionStr string) bool { + i := strings.Index(versionStr, openSSHPrefix) + if i < 0 { + return false + } + i += len(openSSHPrefix) + j := i + for ; j < len(versionStr); j++ { + if versionStr[j] < '0' || versionStr[j] > '9' { + break + } + } + version, _ := strconv.Atoi(versionStr[i:j]) + return version < 6 +} + +// autoPortListenWorkaround simulates automatic port allocation by +// trying random ports repeatedly. +func (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) { + var sshListener net.Listener + var err error + const tries = 10 + for i := 0; i < tries; i++ { + addr := *laddr + addr.Port = 1024 + portRandomizer.Intn(60000) + sshListener, err = c.ListenTCP(&addr) + if err == nil { + laddr.Port = addr.Port + return sshListener, err + } + } + return nil, fmt.Errorf("ssh: listen on random port failed after %d tries: %v", tries, err) +} + +// RFC 4254 7.1 +type channelForwardMsg struct { + addr string + rport uint32 +} + +// handleForwards starts goroutines handling forwarded connections. +// It's called on first use by (*Client).ListenTCP to not launch +// goroutines until needed. +func (c *Client) handleForwards() { + go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-tcpip")) + go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-streamlocal@openssh.com")) +} + +// ListenTCP requests the remote peer open a listening socket +// on laddr. Incoming connections will be available by calling +// Accept on the returned net.Listener. +func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) { + c.handleForwardsOnce.Do(c.handleForwards) + if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) { + return c.autoPortListenWorkaround(laddr) + } + + m := channelForwardMsg{ + laddr.IP.String(), + uint32(laddr.Port), + } + // send message + ok, resp, err := c.SendRequest("tcpip-forward", true, Marshal(&m)) + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("ssh: tcpip-forward request denied by peer") + } + + // If the original port was 0, then the remote side will + // supply a real port number in the response. + if laddr.Port == 0 { + var p struct { + Port uint32 + } + if err := Unmarshal(resp, &p); err != nil { + return nil, err + } + laddr.Port = int(p.Port) + } + + // Register this forward, using the port number we obtained. + ch := c.forwards.add(laddr) + + return &tcpListener{laddr, c, ch}, nil +} + +// forwardList stores a mapping between remote +// forward requests and the tcpListeners. +type forwardList struct { + sync.Mutex + entries []forwardEntry +} + +// forwardEntry represents an established mapping of a laddr on a +// remote ssh server to a channel connected to a tcpListener. +type forwardEntry struct { + laddr net.Addr + c chan forward +} + +// forward represents an incoming forwarded tcpip connection. The +// arguments to add/remove/lookup should be address as specified in +// the original forward-request. +type forward struct { + newCh NewChannel // the ssh client channel underlying this forward + raddr net.Addr // the raddr of the incoming connection +} + +func (l *forwardList) add(addr net.Addr) chan forward { + l.Lock() + defer l.Unlock() + f := forwardEntry{ + laddr: addr, + c: make(chan forward, 1), + } + l.entries = append(l.entries, f) + return f.c +} + +// See RFC 4254, section 7.2 +type forwardedTCPPayload struct { + Addr string + Port uint32 + OriginAddr string + OriginPort uint32 +} + +// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr. +func parseTCPAddr(addr string, port uint32) (*net.TCPAddr, error) { + if port == 0 || port > 65535 { + return nil, fmt.Errorf("ssh: port number out of range: %d", port) + } + ip := net.ParseIP(string(addr)) + if ip == nil { + return nil, fmt.Errorf("ssh: cannot parse IP address %q", addr) + } + return &net.TCPAddr{IP: ip, Port: int(port)}, nil +} + +func (l *forwardList) handleChannels(in <-chan NewChannel) { + for ch := range in { + var ( + laddr net.Addr + raddr net.Addr + err error + ) + switch channelType := ch.ChannelType(); channelType { + case "forwarded-tcpip": + var payload forwardedTCPPayload + if err = Unmarshal(ch.ExtraData(), &payload); err != nil { + ch.Reject(ConnectionFailed, "could not parse forwarded-tcpip payload: "+err.Error()) + continue + } + + // RFC 4254 section 7.2 specifies that incoming + // addresses should list the address, in string + // format. It is implied that this should be an IP + // address, as it would be impossible to connect to it + // otherwise. + laddr, err = parseTCPAddr(payload.Addr, payload.Port) + if err != nil { + ch.Reject(ConnectionFailed, err.Error()) + continue + } + raddr, err = parseTCPAddr(payload.OriginAddr, payload.OriginPort) + if err != nil { + ch.Reject(ConnectionFailed, err.Error()) + continue + } + + case "forwarded-streamlocal@openssh.com": + var payload forwardedStreamLocalPayload + if err = Unmarshal(ch.ExtraData(), &payload); err != nil { + ch.Reject(ConnectionFailed, "could not parse forwarded-streamlocal@openssh.com payload: "+err.Error()) + continue + } + laddr = &net.UnixAddr{ + Name: payload.SocketPath, + Net: "unix", + } + raddr = &net.UnixAddr{ + Name: "@", + Net: "unix", + } + default: + panic(fmt.Errorf("ssh: unknown channel type %s", channelType)) + } + if ok := l.forward(laddr, raddr, ch); !ok { + // Section 7.2, implementations MUST reject spurious incoming + // connections. + ch.Reject(Prohibited, "no forward for address") + continue + } + + } +} + +// remove removes the forward entry, and the channel feeding its +// listener. +func (l *forwardList) remove(addr net.Addr) { + l.Lock() + defer l.Unlock() + for i, f := range l.entries { + if addr.Network() == f.laddr.Network() && addr.String() == f.laddr.String() { + l.entries = append(l.entries[:i], l.entries[i+1:]...) + close(f.c) + return + } + } +} + +// closeAll closes and clears all forwards. +func (l *forwardList) closeAll() { + l.Lock() + defer l.Unlock() + for _, f := range l.entries { + close(f.c) + } + l.entries = nil +} + +func (l *forwardList) forward(laddr, raddr net.Addr, ch NewChannel) bool { + l.Lock() + defer l.Unlock() + for _, f := range l.entries { + if laddr.Network() == f.laddr.Network() && laddr.String() == f.laddr.String() { + f.c <- forward{newCh: ch, raddr: raddr} + return true + } + } + return false +} + +type tcpListener struct { + laddr *net.TCPAddr + + conn *Client + in <-chan forward +} + +// Accept waits for and returns the next connection to the listener. +func (l *tcpListener) Accept() (net.Conn, error) { + s, ok := <-l.in + if !ok { + return nil, io.EOF + } + ch, incoming, err := s.newCh.Accept() + if err != nil { + return nil, err + } + go DiscardRequests(incoming) + + return &chanConn{ + Channel: ch, + laddr: l.laddr, + raddr: s.raddr, + }, nil +} + +// Close closes the listener. +func (l *tcpListener) Close() error { + m := channelForwardMsg{ + l.laddr.IP.String(), + uint32(l.laddr.Port), + } + + // this also closes the listener. + l.conn.forwards.remove(l.laddr) + ok, _, err := l.conn.SendRequest("cancel-tcpip-forward", true, Marshal(&m)) + if err == nil && !ok { + err = errors.New("ssh: cancel-tcpip-forward failed") + } + return err +} + +// Addr returns the listener's network address. +func (l *tcpListener) Addr() net.Addr { + return l.laddr +} + +// Dial initiates a connection to the addr from the remote host. +// The resulting connection has a zero LocalAddr() and RemoteAddr(). +func (c *Client) Dial(n, addr string) (net.Conn, error) { + var ch Channel + switch n { + case "tcp", "tcp4", "tcp6": + // Parse the address into host and numeric port. + host, portString, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + port, err := strconv.ParseUint(portString, 10, 16) + if err != nil { + return nil, err + } + ch, err = c.dial(net.IPv4zero.String(), 0, host, int(port)) + if err != nil { + return nil, err + } + // Use a zero address for local and remote address. + zeroAddr := &net.TCPAddr{ + IP: net.IPv4zero, + Port: 0, + } + return &chanConn{ + Channel: ch, + laddr: zeroAddr, + raddr: zeroAddr, + }, nil + case "unix": + var err error + ch, err = c.dialStreamLocal(addr) + if err != nil { + return nil, err + } + return &chanConn{ + Channel: ch, + laddr: &net.UnixAddr{ + Name: "@", + Net: "unix", + }, + raddr: &net.UnixAddr{ + Name: addr, + Net: "unix", + }, + }, nil + default: + return nil, fmt.Errorf("ssh: unsupported protocol: %s", n) + } +} + +// DialTCP connects to the remote address raddr on the network net, +// which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used +// as the local address for the connection. +func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) { + if laddr == nil { + laddr = &net.TCPAddr{ + IP: net.IPv4zero, + Port: 0, + } + } + ch, err := c.dial(laddr.IP.String(), laddr.Port, raddr.IP.String(), raddr.Port) + if err != nil { + return nil, err + } + return &chanConn{ + Channel: ch, + laddr: laddr, + raddr: raddr, + }, nil +} + +// RFC 4254 7.2 +type channelOpenDirectMsg struct { + raddr string + rport uint32 + laddr string + lport uint32 +} + +func (c *Client) dial(laddr string, lport int, raddr string, rport int) (Channel, error) { + msg := channelOpenDirectMsg{ + raddr: raddr, + rport: uint32(rport), + laddr: laddr, + lport: uint32(lport), + } + ch, in, err := c.OpenChannel("direct-tcpip", Marshal(&msg)) + if err != nil { + return nil, err + } + go DiscardRequests(in) + return ch, err +} + +type tcpChan struct { + Channel // the backing channel +} + +// chanConn fulfills the net.Conn interface without +// the tcpChan having to hold laddr or raddr directly. +type chanConn struct { + Channel + laddr, raddr net.Addr +} + +// LocalAddr returns the local network address. +func (t *chanConn) LocalAddr() net.Addr { + return t.laddr +} + +// RemoteAddr returns the remote network address. +func (t *chanConn) RemoteAddr() net.Addr { + return t.raddr +} + +// SetDeadline sets the read and write deadlines associated +// with the connection. +func (t *chanConn) SetDeadline(deadline time.Time) error { + if err := t.SetReadDeadline(deadline); err != nil { + return err + } + return t.SetWriteDeadline(deadline) +} + +// SetReadDeadline sets the read deadline. +// A zero value for t means Read will not time out. +// After the deadline, the error from Read will implement net.Error +// with Timeout() == true. +func (t *chanConn) SetReadDeadline(deadline time.Time) error { + // for compatibility with previous version, + // the error message contains "tcpChan" + return errors.New("ssh: tcpChan: deadline not supported") +} + +// SetWriteDeadline exists to satisfy the net.Conn interface +// but is not implemented by this type. It always returns an error. +func (t *chanConn) SetWriteDeadline(deadline time.Time) error { + return errors.New("ssh: tcpChan: deadline not supported") +} diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go new file mode 100644 index 0000000000..49ddc2e7de --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/transport.go @@ -0,0 +1,353 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bufio" + "bytes" + "errors" + "io" + "log" +) + +// debugTransport if set, will print packet types as they go over the +// wire. No message decoding is done, to minimize the impact on timing. +const debugTransport = false + +const ( + gcmCipherID = "aes128-gcm@openssh.com" + aes128cbcID = "aes128-cbc" + tripledescbcID = "3des-cbc" +) + +// packetConn represents a transport that implements packet based +// operations. +type packetConn interface { + // Encrypt and send a packet of data to the remote peer. + writePacket(packet []byte) error + + // Read a packet from the connection. The read is blocking, + // i.e. if error is nil, then the returned byte slice is + // always non-empty. + readPacket() ([]byte, error) + + // Close closes the write-side of the connection. + Close() error +} + +// transport is the keyingTransport that implements the SSH packet +// protocol. +type transport struct { + reader connectionState + writer connectionState + + bufReader *bufio.Reader + bufWriter *bufio.Writer + rand io.Reader + isClient bool + io.Closer +} + +// packetCipher represents a combination of SSH encryption/MAC +// protocol. A single instance should be used for one direction only. +type packetCipher interface { + // writeCipherPacket encrypts the packet and writes it to w. The + // contents of the packet are generally scrambled. + writeCipherPacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error + + // readCipherPacket reads and decrypts a packet of data. The + // returned packet may be overwritten by future calls of + // readPacket. + readCipherPacket(seqnum uint32, r io.Reader) ([]byte, error) +} + +// connectionState represents one side (read or write) of the +// connection. This is necessary because each direction has its own +// keys, and can even have its own algorithms +type connectionState struct { + packetCipher + seqNum uint32 + dir direction + pendingKeyChange chan packetCipher +} + +// prepareKeyChange sets up key material for a keychange. The key changes in +// both directions are triggered by reading and writing a msgNewKey packet +// respectively. +func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error { + ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult) + if err != nil { + return err + } + t.reader.pendingKeyChange <- ciph + + ciph, err = newPacketCipher(t.writer.dir, algs.w, kexResult) + if err != nil { + return err + } + t.writer.pendingKeyChange <- ciph + + return nil +} + +func (t *transport) printPacket(p []byte, write bool) { + if len(p) == 0 { + return + } + who := "server" + if t.isClient { + who = "client" + } + what := "read" + if write { + what = "write" + } + + log.Println(what, who, p[0]) +} + +// Read and decrypt next packet. +func (t *transport) readPacket() (p []byte, err error) { + for { + p, err = t.reader.readPacket(t.bufReader) + if err != nil { + break + } + if len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) { + break + } + } + if debugTransport { + t.printPacket(p, false) + } + + return p, err +} + +func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { + packet, err := s.packetCipher.readCipherPacket(s.seqNum, r) + s.seqNum++ + if err == nil && len(packet) == 0 { + err = errors.New("ssh: zero length packet") + } + + if len(packet) > 0 { + switch packet[0] { + case msgNewKeys: + select { + case cipher := <-s.pendingKeyChange: + s.packetCipher = cipher + default: + return nil, errors.New("ssh: got bogus newkeys message") + } + + case msgDisconnect: + // Transform a disconnect message into an + // error. Since this is lowest level at which + // we interpret message types, doing it here + // ensures that we don't have to handle it + // elsewhere. + var msg disconnectMsg + if err := Unmarshal(packet, &msg); err != nil { + return nil, err + } + return nil, &msg + } + } + + // The packet may point to an internal buffer, so copy the + // packet out here. + fresh := make([]byte, len(packet)) + copy(fresh, packet) + + return fresh, err +} + +func (t *transport) writePacket(packet []byte) error { + if debugTransport { + t.printPacket(packet, true) + } + return t.writer.writePacket(t.bufWriter, t.rand, packet) +} + +func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error { + changeKeys := len(packet) > 0 && packet[0] == msgNewKeys + + err := s.packetCipher.writeCipherPacket(s.seqNum, w, rand, packet) + if err != nil { + return err + } + if err = w.Flush(); err != nil { + return err + } + s.seqNum++ + if changeKeys { + select { + case cipher := <-s.pendingKeyChange: + s.packetCipher = cipher + default: + panic("ssh: no key material for msgNewKeys") + } + } + return err +} + +func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transport { + t := &transport{ + bufReader: bufio.NewReader(rwc), + bufWriter: bufio.NewWriter(rwc), + rand: rand, + reader: connectionState{ + packetCipher: &streamPacketCipher{cipher: noneCipher{}}, + pendingKeyChange: make(chan packetCipher, 1), + }, + writer: connectionState{ + packetCipher: &streamPacketCipher{cipher: noneCipher{}}, + pendingKeyChange: make(chan packetCipher, 1), + }, + Closer: rwc, + } + t.isClient = isClient + + if isClient { + t.reader.dir = serverKeys + t.writer.dir = clientKeys + } else { + t.reader.dir = clientKeys + t.writer.dir = serverKeys + } + + return t +} + +type direction struct { + ivTag []byte + keyTag []byte + macKeyTag []byte +} + +var ( + serverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}} + clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}} +) + +// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as +// described in RFC 4253, section 6.4. direction should either be serverKeys +// (to setup server->client keys) or clientKeys (for client->server keys). +func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { + cipherMode := cipherModes[algs.Cipher] + macMode := macModes[algs.MAC] + + iv := make([]byte, cipherMode.ivSize) + key := make([]byte, cipherMode.keySize) + macKey := make([]byte, macMode.keySize) + + generateKeyMaterial(iv, d.ivTag, kex) + generateKeyMaterial(key, d.keyTag, kex) + generateKeyMaterial(macKey, d.macKeyTag, kex) + + return cipherModes[algs.Cipher].create(key, iv, macKey, algs) +} + +// generateKeyMaterial fills out with key material generated from tag, K, H +// and sessionId, as specified in RFC 4253, section 7.2. +func generateKeyMaterial(out, tag []byte, r *kexResult) { + var digestsSoFar []byte + + h := r.Hash.New() + for len(out) > 0 { + h.Reset() + h.Write(r.K) + h.Write(r.H) + + if len(digestsSoFar) == 0 { + h.Write(tag) + h.Write(r.SessionID) + } else { + h.Write(digestsSoFar) + } + + digest := h.Sum(nil) + n := copy(out, digest) + out = out[n:] + if len(out) > 0 { + digestsSoFar = append(digestsSoFar, digest...) + } + } +} + +const packageVersion = "SSH-2.0-Go" + +// Sends and receives a version line. The versionLine string should +// be US ASCII, start with "SSH-2.0-", and should not include a +// newline. exchangeVersions returns the other side's version line. +func exchangeVersions(rw io.ReadWriter, versionLine []byte) (them []byte, err error) { + // Contrary to the RFC, we do not ignore lines that don't + // start with "SSH-2.0-" to make the library usable with + // nonconforming servers. + for _, c := range versionLine { + // The spec disallows non US-ASCII chars, and + // specifically forbids null chars. + if c < 32 { + return nil, errors.New("ssh: junk character in version line") + } + } + if _, err = rw.Write(append(versionLine, '\r', '\n')); err != nil { + return + } + + them, err = readVersion(rw) + return them, err +} + +// maxVersionStringBytes is the maximum number of bytes that we'll +// accept as a version string. RFC 4253 section 4.2 limits this at 255 +// chars +const maxVersionStringBytes = 255 + +// Read version string as specified by RFC 4253, section 4.2. +func readVersion(r io.Reader) ([]byte, error) { + versionString := make([]byte, 0, 64) + var ok bool + var buf [1]byte + + for length := 0; length < maxVersionStringBytes; length++ { + _, err := io.ReadFull(r, buf[:]) + if err != nil { + return nil, err + } + // The RFC says that the version should be terminated with \r\n + // but several SSH servers actually only send a \n. + if buf[0] == '\n' { + if !bytes.HasPrefix(versionString, []byte("SSH-")) { + // RFC 4253 says we need to ignore all version string lines + // except the one containing the SSH version (provided that + // all the lines do not exceed 255 bytes in total). + versionString = versionString[:0] + continue + } + ok = true + break + } + + // non ASCII chars are disallowed, but we are lenient, + // since Go doesn't use null-terminated strings. + + // The RFC allows a comment after a space, however, + // all of it (version and comments) goes into the + // session hash. + versionString = append(versionString, buf[0]) + } + + if !ok { + return nil, errors.New("ssh: overflow reading version string") + } + + // There might be a '\r' on the end which we should remove. + if len(versionString) > 0 && versionString[len(versionString)-1] == '\r' { + versionString = versionString[:len(versionString)-1] + } + return versionString, nil +} diff --git a/vendor/golang.org/x/net/http2/go118.go b/vendor/golang.org/x/net/http2/go118.go new file mode 100644 index 0000000000..aca4b2b31a --- /dev/null +++ b/vendor/golang.org/x/net/http2/go118.go @@ -0,0 +1,17 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.18 +// +build go1.18 + +package http2 + +import ( + "crypto/tls" + "net" +) + +func tlsUnderlyingConn(tc *tls.Conn) net.Conn { + return tc.NetConn() +} diff --git a/vendor/golang.org/x/net/http2/not_go118.go b/vendor/golang.org/x/net/http2/not_go118.go new file mode 100644 index 0000000000..eab532c96b --- /dev/null +++ b/vendor/golang.org/x/net/http2/not_go118.go @@ -0,0 +1,17 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.18 +// +build !go1.18 + +package http2 + +import ( + "crypto/tls" + "net" +) + +func tlsUnderlyingConn(tc *tls.Conn) net.Conn { + return nil +} diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index f135b0f751..4f09897637 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -735,7 +735,6 @@ func (cc *ClientConn) healthCheck() { err := cc.Ping(ctx) if err != nil { cc.closeForLostPing() - cc.t.connPool().MarkDead(cc) return } } @@ -907,6 +906,24 @@ func (cc *ClientConn) onIdleTimeout() { cc.closeIfIdle() } +func (cc *ClientConn) closeConn() error { + t := time.AfterFunc(250*time.Millisecond, cc.forceCloseConn) + defer t.Stop() + return cc.tconn.Close() +} + +// A tls.Conn.Close can hang for a long time if the peer is unresponsive. +// Try to shut it down more aggressively. +func (cc *ClientConn) forceCloseConn() { + tc, ok := cc.tconn.(*tls.Conn) + if !ok { + return + } + if nc := tlsUnderlyingConn(tc); nc != nil { + nc.Close() + } +} + func (cc *ClientConn) closeIfIdle() { cc.mu.Lock() if len(cc.streams) > 0 || cc.streamsReserved > 0 { @@ -921,7 +938,7 @@ func (cc *ClientConn) closeIfIdle() { if VerboseLogs { cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, nextID-2) } - cc.tconn.Close() + cc.closeConn() } func (cc *ClientConn) isDoNotReuseAndIdle() bool { @@ -938,7 +955,7 @@ func (cc *ClientConn) Shutdown(ctx context.Context) error { return err } // Wait for all in-flight streams to complete or connection to close - done := make(chan error, 1) + done := make(chan struct{}) cancelled := false // guarded by cc.mu go func() { cc.mu.Lock() @@ -946,7 +963,7 @@ func (cc *ClientConn) Shutdown(ctx context.Context) error { for { if len(cc.streams) == 0 || cc.closed { cc.closed = true - done <- cc.tconn.Close() + close(done) break } if cancelled { @@ -957,8 +974,8 @@ func (cc *ClientConn) Shutdown(ctx context.Context) error { }() shutdownEnterWaitStateHook() select { - case err := <-done: - return err + case <-done: + return cc.closeConn() case <-ctx.Done(): cc.mu.Lock() // Free the goroutine above @@ -1001,9 +1018,9 @@ func (cc *ClientConn) closeForError(err error) error { for _, cs := range cc.streams { cs.abortStreamLocked(err) } - defer cc.cond.Broadcast() - defer cc.mu.Unlock() - return cc.tconn.Close() + cc.cond.Broadcast() + cc.mu.Unlock() + return cc.closeConn() } // Close closes the client connection immediately. @@ -1978,7 +1995,7 @@ func (cc *ClientConn) forgetStreamID(id uint32) { cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, cc.nextStreamID-2) } cc.closed = true - defer cc.tconn.Close() + defer cc.closeConn() } cc.mu.Unlock() @@ -2025,8 +2042,8 @@ func isEOFOrNetReadError(err error) bool { func (rl *clientConnReadLoop) cleanup() { cc := rl.cc - defer cc.tconn.Close() - defer cc.t.connPool().MarkDead(cc) + cc.t.connPool().MarkDead(cc) + defer cc.closeConn() defer close(cc.readerDone) if cc.idleTimer != nil { diff --git a/vendor/golang.org/x/oauth2/go.mod b/vendor/golang.org/x/oauth2/go.mod index 2b13f0b34c..468b626791 100644 --- a/vendor/golang.org/x/oauth2/go.mod +++ b/vendor/golang.org/x/oauth2/go.mod @@ -4,6 +4,6 @@ go 1.11 require ( cloud.google.com/go v0.65.0 - golang.org/x/net v0.0.0-20200822124328-c89045814202 + golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd google.golang.org/appengine v1.6.6 ) diff --git a/vendor/golang.org/x/oauth2/go.sum b/vendor/golang.org/x/oauth2/go.sum index eab5833c42..bdceef99ea 100644 --- a/vendor/golang.org/x/oauth2/go.sum +++ b/vendor/golang.org/x/oauth2/go.sum @@ -177,8 +177,9 @@ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -217,11 +218,15 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s new file mode 100644 index 0000000000..db9171c2e4 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s @@ -0,0 +1,18 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc +// +build gc + +#include "textflag.h" + +// +// System calls for ppc64, AIX are implemented in runtime/syscall_aix.go +// + +TEXT ·syscall6(SB),NOSPLIT,$0-88 + JMP syscall·syscall6(SB) + +TEXT ·rawSyscall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/cpu/byteorder.go b/vendor/golang.org/x/sys/cpu/byteorder.go new file mode 100644 index 0000000000..dcbb14ef35 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/byteorder.go @@ -0,0 +1,65 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +import ( + "runtime" +) + +// byteOrder is a subset of encoding/binary.ByteOrder. +type byteOrder interface { + Uint32([]byte) uint32 + Uint64([]byte) uint64 +} + +type littleEndian struct{} +type bigEndian struct{} + +func (littleEndian) Uint32(b []byte) uint32 { + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func (littleEndian) Uint64(b []byte) uint64 { + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func (bigEndian) Uint32(b []byte) uint32 { + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 +} + +func (bigEndian) Uint64(b []byte) uint64 { + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | + uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 +} + +// hostByteOrder returns littleEndian on little-endian machines and +// bigEndian on big-endian machines. +func hostByteOrder() byteOrder { + switch runtime.GOARCH { + case "386", "amd64", "amd64p32", + "alpha", + "arm", "arm64", + "mipsle", "mips64le", "mips64p32le", + "nios2", + "ppc64le", + "riscv", "riscv64", + "sh": + return littleEndian{} + case "armbe", "arm64be", + "m68k", + "mips", "mips64", "mips64p32", + "ppc", "ppc64", + "s390", "s390x", + "shbe", + "sparc", "sparc64": + return bigEndian{} + } + panic("unknown architecture") +} diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go new file mode 100644 index 0000000000..b56886f261 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu.go @@ -0,0 +1,287 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package cpu implements processor feature detection for +// various CPU architectures. +package cpu + +import ( + "os" + "strings" +) + +// Initialized reports whether the CPU features were initialized. +// +// For some GOOS/GOARCH combinations initialization of the CPU features depends +// on reading an operating specific file, e.g. /proc/self/auxv on linux/arm +// Initialized will report false if reading the file fails. +var Initialized bool + +// CacheLinePad is used to pad structs to avoid false sharing. +type CacheLinePad struct{ _ [cacheLineSize]byte } + +// X86 contains the supported CPU features of the +// current X86/AMD64 platform. If the current platform +// is not X86/AMD64 then all feature flags are false. +// +// X86 is padded to avoid false sharing. Further the HasAVX +// and HasAVX2 are only set if the OS supports XMM and YMM +// registers in addition to the CPUID feature bit being set. +var X86 struct { + _ CacheLinePad + HasAES bool // AES hardware implementation (AES NI) + HasADX bool // Multi-precision add-carry instruction extensions + HasAVX bool // Advanced vector extension + HasAVX2 bool // Advanced vector extension 2 + HasAVX512 bool // Advanced vector extension 512 + HasAVX512F bool // Advanced vector extension 512 Foundation Instructions + HasAVX512CD bool // Advanced vector extension 512 Conflict Detection Instructions + HasAVX512ER bool // Advanced vector extension 512 Exponential and Reciprocal Instructions + HasAVX512PF bool // Advanced vector extension 512 Prefetch Instructions Instructions + HasAVX512VL bool // Advanced vector extension 512 Vector Length Extensions + HasAVX512BW bool // Advanced vector extension 512 Byte and Word Instructions + HasAVX512DQ bool // Advanced vector extension 512 Doubleword and Quadword Instructions + HasAVX512IFMA bool // Advanced vector extension 512 Integer Fused Multiply Add + HasAVX512VBMI bool // Advanced vector extension 512 Vector Byte Manipulation Instructions + HasAVX5124VNNIW bool // Advanced vector extension 512 Vector Neural Network Instructions Word variable precision + HasAVX5124FMAPS bool // Advanced vector extension 512 Fused Multiply Accumulation Packed Single precision + HasAVX512VPOPCNTDQ bool // Advanced vector extension 512 Double and quad word population count instructions + HasAVX512VPCLMULQDQ bool // Advanced vector extension 512 Vector carry-less multiply operations + HasAVX512VNNI bool // Advanced vector extension 512 Vector Neural Network Instructions + HasAVX512GFNI bool // Advanced vector extension 512 Galois field New Instructions + HasAVX512VAES bool // Advanced vector extension 512 Vector AES instructions + HasAVX512VBMI2 bool // Advanced vector extension 512 Vector Byte Manipulation Instructions 2 + HasAVX512BITALG bool // Advanced vector extension 512 Bit Algorithms + HasAVX512BF16 bool // Advanced vector extension 512 BFloat16 Instructions + HasBMI1 bool // Bit manipulation instruction set 1 + HasBMI2 bool // Bit manipulation instruction set 2 + HasCX16 bool // Compare and exchange 16 Bytes + HasERMS bool // Enhanced REP for MOVSB and STOSB + HasFMA bool // Fused-multiply-add instructions + HasOSXSAVE bool // OS supports XSAVE/XRESTOR for saving/restoring XMM registers. + HasPCLMULQDQ bool // PCLMULQDQ instruction - most often used for AES-GCM + HasPOPCNT bool // Hamming weight instruction POPCNT. + HasRDRAND bool // RDRAND instruction (on-chip random number generator) + HasRDSEED bool // RDSEED instruction (on-chip random number generator) + HasSSE2 bool // Streaming SIMD extension 2 (always available on amd64) + HasSSE3 bool // Streaming SIMD extension 3 + HasSSSE3 bool // Supplemental streaming SIMD extension 3 + HasSSE41 bool // Streaming SIMD extension 4 and 4.1 + HasSSE42 bool // Streaming SIMD extension 4 and 4.2 + _ CacheLinePad +} + +// ARM64 contains the supported CPU features of the +// current ARMv8(aarch64) platform. If the current platform +// is not arm64 then all feature flags are false. +var ARM64 struct { + _ CacheLinePad + HasFP bool // Floating-point instruction set (always available) + HasASIMD bool // Advanced SIMD (always available) + HasEVTSTRM bool // Event stream support + HasAES bool // AES hardware implementation + HasPMULL bool // Polynomial multiplication instruction set + HasSHA1 bool // SHA1 hardware implementation + HasSHA2 bool // SHA2 hardware implementation + HasCRC32 bool // CRC32 hardware implementation + HasATOMICS bool // Atomic memory operation instruction set + HasFPHP bool // Half precision floating-point instruction set + HasASIMDHP bool // Advanced SIMD half precision instruction set + HasCPUID bool // CPUID identification scheme registers + HasASIMDRDM bool // Rounding double multiply add/subtract instruction set + HasJSCVT bool // Javascript conversion from floating-point to integer + HasFCMA bool // Floating-point multiplication and addition of complex numbers + HasLRCPC bool // Release Consistent processor consistent support + HasDCPOP bool // Persistent memory support + HasSHA3 bool // SHA3 hardware implementation + HasSM3 bool // SM3 hardware implementation + HasSM4 bool // SM4 hardware implementation + HasASIMDDP bool // Advanced SIMD double precision instruction set + HasSHA512 bool // SHA512 hardware implementation + HasSVE bool // Scalable Vector Extensions + HasASIMDFHM bool // Advanced SIMD multiplication FP16 to FP32 + _ CacheLinePad +} + +// ARM contains the supported CPU features of the current ARM (32-bit) platform. +// All feature flags are false if: +// 1. the current platform is not arm, or +// 2. the current operating system is not Linux. +var ARM struct { + _ CacheLinePad + HasSWP bool // SWP instruction support + HasHALF bool // Half-word load and store support + HasTHUMB bool // ARM Thumb instruction set + Has26BIT bool // Address space limited to 26-bits + HasFASTMUL bool // 32-bit operand, 64-bit result multiplication support + HasFPA bool // Floating point arithmetic support + HasVFP bool // Vector floating point support + HasEDSP bool // DSP Extensions support + HasJAVA bool // Java instruction set + HasIWMMXT bool // Intel Wireless MMX technology support + HasCRUNCH bool // MaverickCrunch context switching and handling + HasTHUMBEE bool // Thumb EE instruction set + HasNEON bool // NEON instruction set + HasVFPv3 bool // Vector floating point version 3 support + HasVFPv3D16 bool // Vector floating point version 3 D8-D15 + HasTLS bool // Thread local storage support + HasVFPv4 bool // Vector floating point version 4 support + HasIDIVA bool // Integer divide instruction support in ARM mode + HasIDIVT bool // Integer divide instruction support in Thumb mode + HasVFPD32 bool // Vector floating point version 3 D15-D31 + HasLPAE bool // Large Physical Address Extensions + HasEVTSTRM bool // Event stream support + HasAES bool // AES hardware implementation + HasPMULL bool // Polynomial multiplication instruction set + HasSHA1 bool // SHA1 hardware implementation + HasSHA2 bool // SHA2 hardware implementation + HasCRC32 bool // CRC32 hardware implementation + _ CacheLinePad +} + +// MIPS64X contains the supported CPU features of the current mips64/mips64le +// platforms. If the current platform is not mips64/mips64le or the current +// operating system is not Linux then all feature flags are false. +var MIPS64X struct { + _ CacheLinePad + HasMSA bool // MIPS SIMD architecture + _ CacheLinePad +} + +// PPC64 contains the supported CPU features of the current ppc64/ppc64le platforms. +// If the current platform is not ppc64/ppc64le then all feature flags are false. +// +// For ppc64/ppc64le, it is safe to check only for ISA level starting on ISA v3.00, +// since there are no optional categories. There are some exceptions that also +// require kernel support to work (DARN, SCV), so there are feature bits for +// those as well. The struct is padded to avoid false sharing. +var PPC64 struct { + _ CacheLinePad + HasDARN bool // Hardware random number generator (requires kernel enablement) + HasSCV bool // Syscall vectored (requires kernel enablement) + IsPOWER8 bool // ISA v2.07 (POWER8) + IsPOWER9 bool // ISA v3.00 (POWER9), implies IsPOWER8 + _ CacheLinePad +} + +// S390X contains the supported CPU features of the current IBM Z +// (s390x) platform. If the current platform is not IBM Z then all +// feature flags are false. +// +// S390X is padded to avoid false sharing. Further HasVX is only set +// if the OS supports vector registers in addition to the STFLE +// feature bit being set. +var S390X struct { + _ CacheLinePad + HasZARCH bool // z/Architecture mode is active [mandatory] + HasSTFLE bool // store facility list extended + HasLDISP bool // long (20-bit) displacements + HasEIMM bool // 32-bit immediates + HasDFP bool // decimal floating point + HasETF3EH bool // ETF-3 enhanced + HasMSA bool // message security assist (CPACF) + HasAES bool // KM-AES{128,192,256} functions + HasAESCBC bool // KMC-AES{128,192,256} functions + HasAESCTR bool // KMCTR-AES{128,192,256} functions + HasAESGCM bool // KMA-GCM-AES{128,192,256} functions + HasGHASH bool // KIMD-GHASH function + HasSHA1 bool // K{I,L}MD-SHA-1 functions + HasSHA256 bool // K{I,L}MD-SHA-256 functions + HasSHA512 bool // K{I,L}MD-SHA-512 functions + HasSHA3 bool // K{I,L}MD-SHA3-{224,256,384,512} and K{I,L}MD-SHAKE-{128,256} functions + HasVX bool // vector facility + HasVXE bool // vector-enhancements facility 1 + _ CacheLinePad +} + +func init() { + archInit() + initOptions() + processOptions() +} + +// options contains the cpu debug options that can be used in GODEBUG. +// Options are arch dependent and are added by the arch specific initOptions functions. +// Features that are mandatory for the specific GOARCH should have the Required field set +// (e.g. SSE2 on amd64). +var options []option + +// Option names should be lower case. e.g. avx instead of AVX. +type option struct { + Name string + Feature *bool + Specified bool // whether feature value was specified in GODEBUG + Enable bool // whether feature should be enabled + Required bool // whether feature is mandatory and can not be disabled +} + +func processOptions() { + env := os.Getenv("GODEBUG") +field: + for env != "" { + field := "" + i := strings.IndexByte(env, ',') + if i < 0 { + field, env = env, "" + } else { + field, env = env[:i], env[i+1:] + } + if len(field) < 4 || field[:4] != "cpu." { + continue + } + i = strings.IndexByte(field, '=') + if i < 0 { + print("GODEBUG sys/cpu: no value specified for \"", field, "\"\n") + continue + } + key, value := field[4:i], field[i+1:] // e.g. "SSE2", "on" + + var enable bool + switch value { + case "on": + enable = true + case "off": + enable = false + default: + print("GODEBUG sys/cpu: value \"", value, "\" not supported for cpu option \"", key, "\"\n") + continue field + } + + if key == "all" { + for i := range options { + options[i].Specified = true + options[i].Enable = enable || options[i].Required + } + continue field + } + + for i := range options { + if options[i].Name == key { + options[i].Specified = true + options[i].Enable = enable + continue field + } + } + + print("GODEBUG sys/cpu: unknown cpu feature \"", key, "\"\n") + } + + for _, o := range options { + if !o.Specified { + continue + } + + if o.Enable && !*o.Feature { + print("GODEBUG sys/cpu: can not enable \"", o.Name, "\", missing CPU support\n") + continue + } + + if !o.Enable && o.Required { + print("GODEBUG sys/cpu: can not disable \"", o.Name, "\", required CPU feature\n") + continue + } + + *o.Feature = o.Enable + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_aix.go b/vendor/golang.org/x/sys/cpu/cpu_aix.go new file mode 100644 index 0000000000..8aaeef545a --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_aix.go @@ -0,0 +1,34 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix +// +build aix + +package cpu + +const ( + // getsystemcfg constants + _SC_IMPL = 2 + _IMPL_POWER8 = 0x10000 + _IMPL_POWER9 = 0x20000 +) + +func archInit() { + impl := getsystemcfg(_SC_IMPL) + if impl&_IMPL_POWER8 != 0 { + PPC64.IsPOWER8 = true + } + if impl&_IMPL_POWER9 != 0 { + PPC64.IsPOWER8 = true + PPC64.IsPOWER9 = true + } + + Initialized = true +} + +func getsystemcfg(label int) (n uint64) { + r0, _ := callgetsystemcfg(label) + n = uint64(r0) + return +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm.go b/vendor/golang.org/x/sys/cpu/cpu_arm.go new file mode 100644 index 0000000000..301b752e9c --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm.go @@ -0,0 +1,73 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const cacheLineSize = 32 + +// HWCAP/HWCAP2 bits. +// These are specific to Linux. +const ( + hwcap_SWP = 1 << 0 + hwcap_HALF = 1 << 1 + hwcap_THUMB = 1 << 2 + hwcap_26BIT = 1 << 3 + hwcap_FAST_MULT = 1 << 4 + hwcap_FPA = 1 << 5 + hwcap_VFP = 1 << 6 + hwcap_EDSP = 1 << 7 + hwcap_JAVA = 1 << 8 + hwcap_IWMMXT = 1 << 9 + hwcap_CRUNCH = 1 << 10 + hwcap_THUMBEE = 1 << 11 + hwcap_NEON = 1 << 12 + hwcap_VFPv3 = 1 << 13 + hwcap_VFPv3D16 = 1 << 14 + hwcap_TLS = 1 << 15 + hwcap_VFPv4 = 1 << 16 + hwcap_IDIVA = 1 << 17 + hwcap_IDIVT = 1 << 18 + hwcap_VFPD32 = 1 << 19 + hwcap_LPAE = 1 << 20 + hwcap_EVTSTRM = 1 << 21 + + hwcap2_AES = 1 << 0 + hwcap2_PMULL = 1 << 1 + hwcap2_SHA1 = 1 << 2 + hwcap2_SHA2 = 1 << 3 + hwcap2_CRC32 = 1 << 4 +) + +func initOptions() { + options = []option{ + {Name: "pmull", Feature: &ARM.HasPMULL}, + {Name: "sha1", Feature: &ARM.HasSHA1}, + {Name: "sha2", Feature: &ARM.HasSHA2}, + {Name: "swp", Feature: &ARM.HasSWP}, + {Name: "thumb", Feature: &ARM.HasTHUMB}, + {Name: "thumbee", Feature: &ARM.HasTHUMBEE}, + {Name: "tls", Feature: &ARM.HasTLS}, + {Name: "vfp", Feature: &ARM.HasVFP}, + {Name: "vfpd32", Feature: &ARM.HasVFPD32}, + {Name: "vfpv3", Feature: &ARM.HasVFPv3}, + {Name: "vfpv3d16", Feature: &ARM.HasVFPv3D16}, + {Name: "vfpv4", Feature: &ARM.HasVFPv4}, + {Name: "half", Feature: &ARM.HasHALF}, + {Name: "26bit", Feature: &ARM.Has26BIT}, + {Name: "fastmul", Feature: &ARM.HasFASTMUL}, + {Name: "fpa", Feature: &ARM.HasFPA}, + {Name: "edsp", Feature: &ARM.HasEDSP}, + {Name: "java", Feature: &ARM.HasJAVA}, + {Name: "iwmmxt", Feature: &ARM.HasIWMMXT}, + {Name: "crunch", Feature: &ARM.HasCRUNCH}, + {Name: "neon", Feature: &ARM.HasNEON}, + {Name: "idivt", Feature: &ARM.HasIDIVT}, + {Name: "idiva", Feature: &ARM.HasIDIVA}, + {Name: "lpae", Feature: &ARM.HasLPAE}, + {Name: "evtstrm", Feature: &ARM.HasEVTSTRM}, + {Name: "aes", Feature: &ARM.HasAES}, + {Name: "crc32", Feature: &ARM.HasCRC32}, + } + +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go new file mode 100644 index 0000000000..87dd5e3021 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -0,0 +1,172 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +import "runtime" + +const cacheLineSize = 64 + +func initOptions() { + options = []option{ + {Name: "fp", Feature: &ARM64.HasFP}, + {Name: "asimd", Feature: &ARM64.HasASIMD}, + {Name: "evstrm", Feature: &ARM64.HasEVTSTRM}, + {Name: "aes", Feature: &ARM64.HasAES}, + {Name: "fphp", Feature: &ARM64.HasFPHP}, + {Name: "jscvt", Feature: &ARM64.HasJSCVT}, + {Name: "lrcpc", Feature: &ARM64.HasLRCPC}, + {Name: "pmull", Feature: &ARM64.HasPMULL}, + {Name: "sha1", Feature: &ARM64.HasSHA1}, + {Name: "sha2", Feature: &ARM64.HasSHA2}, + {Name: "sha3", Feature: &ARM64.HasSHA3}, + {Name: "sha512", Feature: &ARM64.HasSHA512}, + {Name: "sm3", Feature: &ARM64.HasSM3}, + {Name: "sm4", Feature: &ARM64.HasSM4}, + {Name: "sve", Feature: &ARM64.HasSVE}, + {Name: "crc32", Feature: &ARM64.HasCRC32}, + {Name: "atomics", Feature: &ARM64.HasATOMICS}, + {Name: "asimdhp", Feature: &ARM64.HasASIMDHP}, + {Name: "cpuid", Feature: &ARM64.HasCPUID}, + {Name: "asimrdm", Feature: &ARM64.HasASIMDRDM}, + {Name: "fcma", Feature: &ARM64.HasFCMA}, + {Name: "dcpop", Feature: &ARM64.HasDCPOP}, + {Name: "asimddp", Feature: &ARM64.HasASIMDDP}, + {Name: "asimdfhm", Feature: &ARM64.HasASIMDFHM}, + } +} + +func archInit() { + switch runtime.GOOS { + case "freebsd": + readARM64Registers() + case "linux", "netbsd": + doinit() + default: + // Most platforms don't seem to allow reading these registers. + // + // OpenBSD: + // See https://golang.org/issue/31746 + setMinimalFeatures() + } +} + +// setMinimalFeatures fakes the minimal ARM64 features expected by +// TestARM64minimalFeatures. +func setMinimalFeatures() { + ARM64.HasASIMD = true + ARM64.HasFP = true +} + +func readARM64Registers() { + Initialized = true + + parseARM64SystemRegisters(getisar0(), getisar1(), getpfr0()) +} + +func parseARM64SystemRegisters(isar0, isar1, pfr0 uint64) { + // ID_AA64ISAR0_EL1 + switch extractBits(isar0, 4, 7) { + case 1: + ARM64.HasAES = true + case 2: + ARM64.HasAES = true + ARM64.HasPMULL = true + } + + switch extractBits(isar0, 8, 11) { + case 1: + ARM64.HasSHA1 = true + } + + switch extractBits(isar0, 12, 15) { + case 1: + ARM64.HasSHA2 = true + case 2: + ARM64.HasSHA2 = true + ARM64.HasSHA512 = true + } + + switch extractBits(isar0, 16, 19) { + case 1: + ARM64.HasCRC32 = true + } + + switch extractBits(isar0, 20, 23) { + case 2: + ARM64.HasATOMICS = true + } + + switch extractBits(isar0, 28, 31) { + case 1: + ARM64.HasASIMDRDM = true + } + + switch extractBits(isar0, 32, 35) { + case 1: + ARM64.HasSHA3 = true + } + + switch extractBits(isar0, 36, 39) { + case 1: + ARM64.HasSM3 = true + } + + switch extractBits(isar0, 40, 43) { + case 1: + ARM64.HasSM4 = true + } + + switch extractBits(isar0, 44, 47) { + case 1: + ARM64.HasASIMDDP = true + } + + // ID_AA64ISAR1_EL1 + switch extractBits(isar1, 0, 3) { + case 1: + ARM64.HasDCPOP = true + } + + switch extractBits(isar1, 12, 15) { + case 1: + ARM64.HasJSCVT = true + } + + switch extractBits(isar1, 16, 19) { + case 1: + ARM64.HasFCMA = true + } + + switch extractBits(isar1, 20, 23) { + case 1: + ARM64.HasLRCPC = true + } + + // ID_AA64PFR0_EL1 + switch extractBits(pfr0, 16, 19) { + case 0: + ARM64.HasFP = true + case 1: + ARM64.HasFP = true + ARM64.HasFPHP = true + } + + switch extractBits(pfr0, 20, 23) { + case 0: + ARM64.HasASIMD = true + case 1: + ARM64.HasASIMD = true + ARM64.HasASIMDHP = true + } + + switch extractBits(pfr0, 32, 35) { + case 1: + ARM64.HasSVE = true + } +} + +func extractBits(data uint64, start, end uint) uint { + return (uint)(data>>start) & ((1 << (end - start + 1)) - 1) +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.s b/vendor/golang.org/x/sys/cpu/cpu_arm64.s new file mode 100644 index 0000000000..c61f95a05a --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.s @@ -0,0 +1,32 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc +// +build gc + +#include "textflag.h" + +// func getisar0() uint64 +TEXT ·getisar0(SB),NOSPLIT,$0-8 + // get Instruction Set Attributes 0 into x0 + // mrs x0, ID_AA64ISAR0_EL1 = d5380600 + WORD $0xd5380600 + MOVD R0, ret+0(FP) + RET + +// func getisar1() uint64 +TEXT ·getisar1(SB),NOSPLIT,$0-8 + // get Instruction Set Attributes 1 into x0 + // mrs x0, ID_AA64ISAR1_EL1 = d5380620 + WORD $0xd5380620 + MOVD R0, ret+0(FP) + RET + +// func getpfr0() uint64 +TEXT ·getpfr0(SB),NOSPLIT,$0-8 + // get Processor Feature Register 0 into x0 + // mrs x0, ID_AA64PFR0_EL1 = d5380400 + WORD $0xd5380400 + MOVD R0, ret+0(FP) + RET diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go new file mode 100644 index 0000000000..ccf542a73d --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go @@ -0,0 +1,12 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc +// +build gc + +package cpu + +func getisar0() uint64 +func getisar1() uint64 +func getpfr0() uint64 diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go new file mode 100644 index 0000000000..0af2f24841 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc +// +build gc + +package cpu + +// haveAsmFunctions reports whether the other functions in this file can +// be safely called. +func haveAsmFunctions() bool { return true } + +// The following feature detection functions are defined in cpu_s390x.s. +// They are likely to be expensive to call so the results should be cached. +func stfle() facilityList +func kmQuery() queryResult +func kmcQuery() queryResult +func kmctrQuery() queryResult +func kmaQuery() queryResult +func kimdQuery() queryResult +func klmdQuery() queryResult diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go new file mode 100644 index 0000000000..fa7cdb9bcd --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go @@ -0,0 +1,17 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (386 || amd64 || amd64p32) && gc +// +build 386 amd64 amd64p32 +// +build gc + +package cpu + +// cpuid is implemented in cpu_x86.s for gc compiler +// and in cpu_gccgo.c for gccgo. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler +// and in cpu_gccgo.c for gccgo. +func xgetbv() (eax, edx uint32) diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go new file mode 100644 index 0000000000..2aff318911 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go @@ -0,0 +1,12 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gccgo +// +build gccgo + +package cpu + +func getisar0() uint64 { return 0 } +func getisar1() uint64 { return 0 } +func getpfr0() uint64 { return 0 } diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go new file mode 100644 index 0000000000..4bfbda6199 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go @@ -0,0 +1,23 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gccgo +// +build gccgo + +package cpu + +// haveAsmFunctions reports whether the other functions in this file can +// be safely called. +func haveAsmFunctions() bool { return false } + +// TODO(mundaym): the following feature detection functions are currently +// stubs. See https://golang.org/cl/162887 for how to fix this. +// They are likely to be expensive to call so the results should be cached. +func stfle() facilityList { panic("not implemented for gccgo") } +func kmQuery() queryResult { panic("not implemented for gccgo") } +func kmcQuery() queryResult { panic("not implemented for gccgo") } +func kmctrQuery() queryResult { panic("not implemented for gccgo") } +func kmaQuery() queryResult { panic("not implemented for gccgo") } +func kimdQuery() queryResult { panic("not implemented for gccgo") } +func klmdQuery() queryResult { panic("not implemented for gccgo") } diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c new file mode 100644 index 0000000000..e363c7d131 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c @@ -0,0 +1,43 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386 amd64 amd64p32 +// +build gccgo + +#include +#include + +// Need to wrap __get_cpuid_count because it's declared as static. +int +gccgoGetCpuidCount(uint32_t leaf, uint32_t subleaf, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + return __get_cpuid_count(leaf, subleaf, eax, ebx, ecx, edx); +} + +// xgetbv reads the contents of an XCR (Extended Control Register) +// specified in the ECX register into registers EDX:EAX. +// Currently, the only supported value for XCR is 0. +// +// TODO: Replace with a better alternative: +// +// #include +// +// #pragma GCC target("xsave") +// +// void gccgoXgetbv(uint32_t *eax, uint32_t *edx) { +// unsigned long long x = _xgetbv(0); +// *eax = x & 0xffffffff; +// *edx = (x >> 32) & 0xffffffff; +// } +// +// Note that _xgetbv is defined starting with GCC 8. +void +gccgoXgetbv(uint32_t *eax, uint32_t *edx) +{ + __asm(" xorl %%ecx, %%ecx\n" + " xgetbv" + : "=a"(*eax), "=d"(*edx)); +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go new file mode 100644 index 0000000000..863d415ab4 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go @@ -0,0 +1,33 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (386 || amd64 || amd64p32) && gccgo +// +build 386 amd64 amd64p32 +// +build gccgo + +package cpu + +//extern gccgoGetCpuidCount +func gccgoGetCpuidCount(eaxArg, ecxArg uint32, eax, ebx, ecx, edx *uint32) + +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) { + var a, b, c, d uint32 + gccgoGetCpuidCount(eaxArg, ecxArg, &a, &b, &c, &d) + return a, b, c, d +} + +//extern gccgoXgetbv +func gccgoXgetbv(eax, edx *uint32) + +func xgetbv() (eax, edx uint32) { + var a, d uint32 + gccgoXgetbv(&a, &d) + return a, d +} + +// gccgo doesn't build on Darwin, per: +// https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/gcc.rb#L76 +func darwinSupportsAVX512() bool { + return false +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux.go b/vendor/golang.org/x/sys/cpu/cpu_linux.go new file mode 100644 index 0000000000..159a686f6f --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux.go @@ -0,0 +1,16 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !386 && !amd64 && !amd64p32 && !arm64 +// +build !386,!amd64,!amd64p32,!arm64 + +package cpu + +func archInit() { + if err := readHWCAP(); err != nil { + return + } + doinit() + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go new file mode 100644 index 0000000000..2057006dce --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go @@ -0,0 +1,39 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +func doinit() { + ARM.HasSWP = isSet(hwCap, hwcap_SWP) + ARM.HasHALF = isSet(hwCap, hwcap_HALF) + ARM.HasTHUMB = isSet(hwCap, hwcap_THUMB) + ARM.Has26BIT = isSet(hwCap, hwcap_26BIT) + ARM.HasFASTMUL = isSet(hwCap, hwcap_FAST_MULT) + ARM.HasFPA = isSet(hwCap, hwcap_FPA) + ARM.HasVFP = isSet(hwCap, hwcap_VFP) + ARM.HasEDSP = isSet(hwCap, hwcap_EDSP) + ARM.HasJAVA = isSet(hwCap, hwcap_JAVA) + ARM.HasIWMMXT = isSet(hwCap, hwcap_IWMMXT) + ARM.HasCRUNCH = isSet(hwCap, hwcap_CRUNCH) + ARM.HasTHUMBEE = isSet(hwCap, hwcap_THUMBEE) + ARM.HasNEON = isSet(hwCap, hwcap_NEON) + ARM.HasVFPv3 = isSet(hwCap, hwcap_VFPv3) + ARM.HasVFPv3D16 = isSet(hwCap, hwcap_VFPv3D16) + ARM.HasTLS = isSet(hwCap, hwcap_TLS) + ARM.HasVFPv4 = isSet(hwCap, hwcap_VFPv4) + ARM.HasIDIVA = isSet(hwCap, hwcap_IDIVA) + ARM.HasIDIVT = isSet(hwCap, hwcap_IDIVT) + ARM.HasVFPD32 = isSet(hwCap, hwcap_VFPD32) + ARM.HasLPAE = isSet(hwCap, hwcap_LPAE) + ARM.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM) + ARM.HasAES = isSet(hwCap2, hwcap2_AES) + ARM.HasPMULL = isSet(hwCap2, hwcap2_PMULL) + ARM.HasSHA1 = isSet(hwCap2, hwcap2_SHA1) + ARM.HasSHA2 = isSet(hwCap2, hwcap2_SHA2) + ARM.HasCRC32 = isSet(hwCap2, hwcap2_CRC32) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go new file mode 100644 index 0000000000..79a38a0b9b --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go @@ -0,0 +1,71 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +// HWCAP/HWCAP2 bits. These are exposed by Linux. +const ( + hwcap_FP = 1 << 0 + hwcap_ASIMD = 1 << 1 + hwcap_EVTSTRM = 1 << 2 + hwcap_AES = 1 << 3 + hwcap_PMULL = 1 << 4 + hwcap_SHA1 = 1 << 5 + hwcap_SHA2 = 1 << 6 + hwcap_CRC32 = 1 << 7 + hwcap_ATOMICS = 1 << 8 + hwcap_FPHP = 1 << 9 + hwcap_ASIMDHP = 1 << 10 + hwcap_CPUID = 1 << 11 + hwcap_ASIMDRDM = 1 << 12 + hwcap_JSCVT = 1 << 13 + hwcap_FCMA = 1 << 14 + hwcap_LRCPC = 1 << 15 + hwcap_DCPOP = 1 << 16 + hwcap_SHA3 = 1 << 17 + hwcap_SM3 = 1 << 18 + hwcap_SM4 = 1 << 19 + hwcap_ASIMDDP = 1 << 20 + hwcap_SHA512 = 1 << 21 + hwcap_SVE = 1 << 22 + hwcap_ASIMDFHM = 1 << 23 +) + +func doinit() { + if err := readHWCAP(); err != nil { + // failed to read /proc/self/auxv, try reading registers directly + readARM64Registers() + return + } + + // HWCAP feature bits + ARM64.HasFP = isSet(hwCap, hwcap_FP) + ARM64.HasASIMD = isSet(hwCap, hwcap_ASIMD) + ARM64.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM) + ARM64.HasAES = isSet(hwCap, hwcap_AES) + ARM64.HasPMULL = isSet(hwCap, hwcap_PMULL) + ARM64.HasSHA1 = isSet(hwCap, hwcap_SHA1) + ARM64.HasSHA2 = isSet(hwCap, hwcap_SHA2) + ARM64.HasCRC32 = isSet(hwCap, hwcap_CRC32) + ARM64.HasATOMICS = isSet(hwCap, hwcap_ATOMICS) + ARM64.HasFPHP = isSet(hwCap, hwcap_FPHP) + ARM64.HasASIMDHP = isSet(hwCap, hwcap_ASIMDHP) + ARM64.HasCPUID = isSet(hwCap, hwcap_CPUID) + ARM64.HasASIMDRDM = isSet(hwCap, hwcap_ASIMDRDM) + ARM64.HasJSCVT = isSet(hwCap, hwcap_JSCVT) + ARM64.HasFCMA = isSet(hwCap, hwcap_FCMA) + ARM64.HasLRCPC = isSet(hwCap, hwcap_LRCPC) + ARM64.HasDCPOP = isSet(hwCap, hwcap_DCPOP) + ARM64.HasSHA3 = isSet(hwCap, hwcap_SHA3) + ARM64.HasSM3 = isSet(hwCap, hwcap_SM3) + ARM64.HasSM4 = isSet(hwCap, hwcap_SM4) + ARM64.HasASIMDDP = isSet(hwCap, hwcap_ASIMDDP) + ARM64.HasSHA512 = isSet(hwCap, hwcap_SHA512) + ARM64.HasSVE = isSet(hwCap, hwcap_SVE) + ARM64.HasASIMDFHM = isSet(hwCap, hwcap_ASIMDFHM) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go new file mode 100644 index 0000000000..6000db4cdd --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go @@ -0,0 +1,24 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux && (mips64 || mips64le) +// +build linux +// +build mips64 mips64le + +package cpu + +// HWCAP bits. These are exposed by the Linux kernel 5.4. +const ( + // CPU features + hwcap_MIPS_MSA = 1 << 1 +) + +func doinit() { + // HWCAP feature bits + MIPS64X.HasMSA = isSet(hwCap, hwcap_MIPS_MSA) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go new file mode 100644 index 0000000000..f4992b1a59 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go @@ -0,0 +1,10 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x +// +build linux,!arm,!arm64,!mips64,!mips64le,!ppc64,!ppc64le,!s390x + +package cpu + +func doinit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go new file mode 100644 index 0000000000..021356d6de --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go @@ -0,0 +1,32 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux && (ppc64 || ppc64le) +// +build linux +// +build ppc64 ppc64le + +package cpu + +// HWCAP/HWCAP2 bits. These are exposed by the kernel. +const ( + // ISA Level + _PPC_FEATURE2_ARCH_2_07 = 0x80000000 + _PPC_FEATURE2_ARCH_3_00 = 0x00800000 + + // CPU features + _PPC_FEATURE2_DARN = 0x00200000 + _PPC_FEATURE2_SCV = 0x00100000 +) + +func doinit() { + // HWCAP2 feature bits + PPC64.IsPOWER8 = isSet(hwCap2, _PPC_FEATURE2_ARCH_2_07) + PPC64.IsPOWER9 = isSet(hwCap2, _PPC_FEATURE2_ARCH_3_00) + PPC64.HasDARN = isSet(hwCap2, _PPC_FEATURE2_DARN) + PPC64.HasSCV = isSet(hwCap2, _PPC_FEATURE2_SCV) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go new file mode 100644 index 0000000000..1517ac61d3 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go @@ -0,0 +1,40 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const ( + // bit mask values from /usr/include/bits/hwcap.h + hwcap_ZARCH = 2 + hwcap_STFLE = 4 + hwcap_MSA = 8 + hwcap_LDISP = 16 + hwcap_EIMM = 32 + hwcap_DFP = 64 + hwcap_ETF3EH = 256 + hwcap_VX = 2048 + hwcap_VXE = 8192 +) + +func initS390Xbase() { + // test HWCAP bit vector + has := func(featureMask uint) bool { + return hwCap&featureMask == featureMask + } + + // mandatory + S390X.HasZARCH = has(hwcap_ZARCH) + + // optional + S390X.HasSTFLE = has(hwcap_STFLE) + S390X.HasLDISP = has(hwcap_LDISP) + S390X.HasEIMM = has(hwcap_EIMM) + S390X.HasETF3EH = has(hwcap_ETF3EH) + S390X.HasDFP = has(hwcap_DFP) + S390X.HasMSA = has(hwcap_MSA) + S390X.HasVX = has(hwcap_VX) + if S390X.HasVX { + S390X.HasVXE = has(hwcap_VXE) + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go new file mode 100644 index 0000000000..f4063c6642 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go @@ -0,0 +1,16 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build mips64 || mips64le +// +build mips64 mips64le + +package cpu + +const cacheLineSize = 32 + +func initOptions() { + options = []option{ + {Name: "msa", Feature: &MIPS64X.HasMSA}, + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go new file mode 100644 index 0000000000..07c4e36d8f --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go @@ -0,0 +1,12 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build mips || mipsle +// +build mips mipsle + +package cpu + +const cacheLineSize = 32 + +func initOptions() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go new file mode 100644 index 0000000000..ebfb3fc8e7 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go @@ -0,0 +1,173 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +import ( + "syscall" + "unsafe" +) + +// Minimal copy of functionality from x/sys/unix so the cpu package can call +// sysctl without depending on x/sys/unix. + +const ( + _CTL_QUERY = -2 + + _SYSCTL_VERS_1 = 0x1000000 +) + +var _zero uintptr + +func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, errno := syscall.Syscall6( + syscall.SYS___SYSCTL, + uintptr(_p0), + uintptr(len(mib)), + uintptr(unsafe.Pointer(old)), + uintptr(unsafe.Pointer(oldlen)), + uintptr(unsafe.Pointer(new)), + uintptr(newlen)) + if errno != 0 { + return errno + } + return nil +} + +type sysctlNode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + __rsvd uint32 + Un [16]byte + _sysctl_size [8]byte + _sysctl_func [8]byte + _sysctl_parent [8]byte + _sysctl_desc [8]byte +} + +func sysctlNodes(mib []int32) ([]sysctlNode, error) { + var olen uintptr + + // Get a list of all sysctl nodes below the given MIB by performing + // a sysctl for the given MIB with CTL_QUERY appended. + mib = append(mib, _CTL_QUERY) + qnode := sysctlNode{Flags: _SYSCTL_VERS_1} + qp := (*byte)(unsafe.Pointer(&qnode)) + sz := unsafe.Sizeof(qnode) + if err := sysctl(mib, nil, &olen, qp, sz); err != nil { + return nil, err + } + + // Now that we know the size, get the actual nodes. + nodes := make([]sysctlNode, olen/sz) + np := (*byte)(unsafe.Pointer(&nodes[0])) + if err := sysctl(mib, np, &olen, qp, sz); err != nil { + return nil, err + } + + return nodes, nil +} + +func nametomib(name string) ([]int32, error) { + // Split name into components. + var parts []string + last := 0 + for i := 0; i < len(name); i++ { + if name[i] == '.' { + parts = append(parts, name[last:i]) + last = i + 1 + } + } + parts = append(parts, name[last:]) + + mib := []int32{} + // Discover the nodes and construct the MIB OID. + for partno, part := range parts { + nodes, err := sysctlNodes(mib) + if err != nil { + return nil, err + } + for _, node := range nodes { + n := make([]byte, 0) + for i := range node.Name { + if node.Name[i] != 0 { + n = append(n, byte(node.Name[i])) + } + } + if string(n) == part { + mib = append(mib, int32(node.Num)) + break + } + } + if len(mib) != partno+1 { + return nil, err + } + } + + return mib, nil +} + +// aarch64SysctlCPUID is struct aarch64_sysctl_cpu_id from NetBSD's +type aarch64SysctlCPUID struct { + midr uint64 /* Main ID Register */ + revidr uint64 /* Revision ID Register */ + mpidr uint64 /* Multiprocessor Affinity Register */ + aa64dfr0 uint64 /* A64 Debug Feature Register 0 */ + aa64dfr1 uint64 /* A64 Debug Feature Register 1 */ + aa64isar0 uint64 /* A64 Instruction Set Attribute Register 0 */ + aa64isar1 uint64 /* A64 Instruction Set Attribute Register 1 */ + aa64mmfr0 uint64 /* A64 Memory Model Feature Register 0 */ + aa64mmfr1 uint64 /* A64 Memory Model Feature Register 1 */ + aa64mmfr2 uint64 /* A64 Memory Model Feature Register 2 */ + aa64pfr0 uint64 /* A64 Processor Feature Register 0 */ + aa64pfr1 uint64 /* A64 Processor Feature Register 1 */ + aa64zfr0 uint64 /* A64 SVE Feature ID Register 0 */ + mvfr0 uint32 /* Media and VFP Feature Register 0 */ + mvfr1 uint32 /* Media and VFP Feature Register 1 */ + mvfr2 uint32 /* Media and VFP Feature Register 2 */ + pad uint32 + clidr uint64 /* Cache Level ID Register */ + ctr uint64 /* Cache Type Register */ +} + +func sysctlCPUID(name string) (*aarch64SysctlCPUID, error) { + mib, err := nametomib(name) + if err != nil { + return nil, err + } + + out := aarch64SysctlCPUID{} + n := unsafe.Sizeof(out) + _, _, errno := syscall.Syscall6( + syscall.SYS___SYSCTL, + uintptr(unsafe.Pointer(&mib[0])), + uintptr(len(mib)), + uintptr(unsafe.Pointer(&out)), + uintptr(unsafe.Pointer(&n)), + uintptr(0), + uintptr(0)) + if errno != 0 { + return nil, errno + } + return &out, nil +} + +func doinit() { + cpuid, err := sysctlCPUID("machdep.cpu0.cpu_id") + if err != nil { + setMinimalFeatures() + return + } + parseARM64SystemRegisters(cpuid.aa64isar0, cpuid.aa64isar1, cpuid.aa64pfr0) + + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go new file mode 100644 index 0000000000..d7b4fb4ccc --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go @@ -0,0 +1,10 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !linux && arm +// +build !linux,arm + +package cpu + +func archInit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go new file mode 100644 index 0000000000..f8c484f589 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go @@ -0,0 +1,10 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !linux && !netbsd && arm64 +// +build !linux,!netbsd,arm64 + +package cpu + +func doinit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go new file mode 100644 index 0000000000..0dafe9644a --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go @@ -0,0 +1,13 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !linux && (mips64 || mips64le) +// +build !linux +// +build mips64 mips64le + +package cpu + +func archInit() { + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go new file mode 100644 index 0000000000..4e8acd1658 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go @@ -0,0 +1,17 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ppc64 || ppc64le +// +build ppc64 ppc64le + +package cpu + +const cacheLineSize = 128 + +func initOptions() { + options = []option{ + {Name: "darn", Feature: &PPC64.HasDARN}, + {Name: "scv", Feature: &PPC64.HasSCV}, + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go new file mode 100644 index 0000000000..bd6c128af9 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go @@ -0,0 +1,12 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build riscv64 +// +build riscv64 + +package cpu + +const cacheLineSize = 32 + +func initOptions() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_s390x.go new file mode 100644 index 0000000000..5881b8833f --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.go @@ -0,0 +1,172 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const cacheLineSize = 256 + +func initOptions() { + options = []option{ + {Name: "zarch", Feature: &S390X.HasZARCH, Required: true}, + {Name: "stfle", Feature: &S390X.HasSTFLE, Required: true}, + {Name: "ldisp", Feature: &S390X.HasLDISP, Required: true}, + {Name: "eimm", Feature: &S390X.HasEIMM, Required: true}, + {Name: "dfp", Feature: &S390X.HasDFP}, + {Name: "etf3eh", Feature: &S390X.HasETF3EH}, + {Name: "msa", Feature: &S390X.HasMSA}, + {Name: "aes", Feature: &S390X.HasAES}, + {Name: "aescbc", Feature: &S390X.HasAESCBC}, + {Name: "aesctr", Feature: &S390X.HasAESCTR}, + {Name: "aesgcm", Feature: &S390X.HasAESGCM}, + {Name: "ghash", Feature: &S390X.HasGHASH}, + {Name: "sha1", Feature: &S390X.HasSHA1}, + {Name: "sha256", Feature: &S390X.HasSHA256}, + {Name: "sha3", Feature: &S390X.HasSHA3}, + {Name: "sha512", Feature: &S390X.HasSHA512}, + {Name: "vx", Feature: &S390X.HasVX}, + {Name: "vxe", Feature: &S390X.HasVXE}, + } +} + +// bitIsSet reports whether the bit at index is set. The bit index +// is in big endian order, so bit index 0 is the leftmost bit. +func bitIsSet(bits []uint64, index uint) bool { + return bits[index/64]&((1<<63)>>(index%64)) != 0 +} + +// facility is a bit index for the named facility. +type facility uint8 + +const ( + // mandatory facilities + zarch facility = 1 // z architecture mode is active + stflef facility = 7 // store-facility-list-extended + ldisp facility = 18 // long-displacement + eimm facility = 21 // extended-immediate + + // miscellaneous facilities + dfp facility = 42 // decimal-floating-point + etf3eh facility = 30 // extended-translation 3 enhancement + + // cryptography facilities + msa facility = 17 // message-security-assist + msa3 facility = 76 // message-security-assist extension 3 + msa4 facility = 77 // message-security-assist extension 4 + msa5 facility = 57 // message-security-assist extension 5 + msa8 facility = 146 // message-security-assist extension 8 + msa9 facility = 155 // message-security-assist extension 9 + + // vector facilities + vx facility = 129 // vector facility + vxe facility = 135 // vector-enhancements 1 + vxe2 facility = 148 // vector-enhancements 2 +) + +// facilityList contains the result of an STFLE call. +// Bits are numbered in big endian order so the +// leftmost bit (the MSB) is at index 0. +type facilityList struct { + bits [4]uint64 +} + +// Has reports whether the given facilities are present. +func (s *facilityList) Has(fs ...facility) bool { + if len(fs) == 0 { + panic("no facility bits provided") + } + for _, f := range fs { + if !bitIsSet(s.bits[:], uint(f)) { + return false + } + } + return true +} + +// function is the code for the named cryptographic function. +type function uint8 + +const ( + // KM{,A,C,CTR} function codes + aes128 function = 18 // AES-128 + aes192 function = 19 // AES-192 + aes256 function = 20 // AES-256 + + // K{I,L}MD function codes + sha1 function = 1 // SHA-1 + sha256 function = 2 // SHA-256 + sha512 function = 3 // SHA-512 + sha3_224 function = 32 // SHA3-224 + sha3_256 function = 33 // SHA3-256 + sha3_384 function = 34 // SHA3-384 + sha3_512 function = 35 // SHA3-512 + shake128 function = 36 // SHAKE-128 + shake256 function = 37 // SHAKE-256 + + // KLMD function codes + ghash function = 65 // GHASH +) + +// queryResult contains the result of a Query function +// call. Bits are numbered in big endian order so the +// leftmost bit (the MSB) is at index 0. +type queryResult struct { + bits [2]uint64 +} + +// Has reports whether the given functions are present. +func (q *queryResult) Has(fns ...function) bool { + if len(fns) == 0 { + panic("no function codes provided") + } + for _, f := range fns { + if !bitIsSet(q.bits[:], uint(f)) { + return false + } + } + return true +} + +func doinit() { + initS390Xbase() + + // We need implementations of stfle, km and so on + // to detect cryptographic features. + if !haveAsmFunctions() { + return + } + + // optional cryptographic functions + if S390X.HasMSA { + aes := []function{aes128, aes192, aes256} + + // cipher message + km, kmc := kmQuery(), kmcQuery() + S390X.HasAES = km.Has(aes...) + S390X.HasAESCBC = kmc.Has(aes...) + if S390X.HasSTFLE { + facilities := stfle() + if facilities.Has(msa4) { + kmctr := kmctrQuery() + S390X.HasAESCTR = kmctr.Has(aes...) + } + if facilities.Has(msa8) { + kma := kmaQuery() + S390X.HasAESGCM = kma.Has(aes...) + } + } + + // compute message digest + kimd := kimdQuery() // intermediate (no padding) + klmd := klmdQuery() // last (padding) + S390X.HasSHA1 = kimd.Has(sha1) && klmd.Has(sha1) + S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256) + S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512) + S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist + sha3 := []function{ + sha3_224, sha3_256, sha3_384, sha3_512, + shake128, shake256, + } + S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...) + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.s b/vendor/golang.org/x/sys/cpu/cpu_s390x.s new file mode 100644 index 0000000000..96f81e2097 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.s @@ -0,0 +1,58 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build gc +// +build gc + +#include "textflag.h" + +// func stfle() facilityList +TEXT ·stfle(SB), NOSPLIT|NOFRAME, $0-32 + MOVD $ret+0(FP), R1 + MOVD $3, R0 // last doubleword index to store + XC $32, (R1), (R1) // clear 4 doublewords (32 bytes) + WORD $0xb2b01000 // store facility list extended (STFLE) + RET + +// func kmQuery() queryResult +TEXT ·kmQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KM-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92E0024 // cipher message (KM) + RET + +// func kmcQuery() queryResult +TEXT ·kmcQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMC-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92F0024 // cipher message with chaining (KMC) + RET + +// func kmctrQuery() queryResult +TEXT ·kmctrQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMCTR-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92D4024 // cipher message with counter (KMCTR) + RET + +// func kmaQuery() queryResult +TEXT ·kmaQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMA-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xb9296024 // cipher message with authentication (KMA) + RET + +// func kimdQuery() queryResult +TEXT ·kimdQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KIMD-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB93E0024 // compute intermediate message digest (KIMD) + RET + +// func klmdQuery() queryResult +TEXT ·klmdQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KLMD-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB93F0024 // compute last message digest (KLMD) + RET diff --git a/vendor/golang.org/x/sys/cpu/cpu_wasm.go b/vendor/golang.org/x/sys/cpu/cpu_wasm.go new file mode 100644 index 0000000000..7747d888a6 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_wasm.go @@ -0,0 +1,18 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build wasm +// +build wasm + +package cpu + +// We're compiling the cpu package for an unknown (software-abstracted) CPU. +// Make CacheLinePad an empty struct and hope that the usual struct alignment +// rules are good enough. + +const cacheLineSize = 0 + +func initOptions() {} + +func archInit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go new file mode 100644 index 0000000000..f5aacfc825 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -0,0 +1,145 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build 386 || amd64 || amd64p32 +// +build 386 amd64 amd64p32 + +package cpu + +import "runtime" + +const cacheLineSize = 64 + +func initOptions() { + options = []option{ + {Name: "adx", Feature: &X86.HasADX}, + {Name: "aes", Feature: &X86.HasAES}, + {Name: "avx", Feature: &X86.HasAVX}, + {Name: "avx2", Feature: &X86.HasAVX2}, + {Name: "avx512", Feature: &X86.HasAVX512}, + {Name: "avx512f", Feature: &X86.HasAVX512F}, + {Name: "avx512cd", Feature: &X86.HasAVX512CD}, + {Name: "avx512er", Feature: &X86.HasAVX512ER}, + {Name: "avx512pf", Feature: &X86.HasAVX512PF}, + {Name: "avx512vl", Feature: &X86.HasAVX512VL}, + {Name: "avx512bw", Feature: &X86.HasAVX512BW}, + {Name: "avx512dq", Feature: &X86.HasAVX512DQ}, + {Name: "avx512ifma", Feature: &X86.HasAVX512IFMA}, + {Name: "avx512vbmi", Feature: &X86.HasAVX512VBMI}, + {Name: "avx512vnniw", Feature: &X86.HasAVX5124VNNIW}, + {Name: "avx5124fmaps", Feature: &X86.HasAVX5124FMAPS}, + {Name: "avx512vpopcntdq", Feature: &X86.HasAVX512VPOPCNTDQ}, + {Name: "avx512vpclmulqdq", Feature: &X86.HasAVX512VPCLMULQDQ}, + {Name: "avx512vnni", Feature: &X86.HasAVX512VNNI}, + {Name: "avx512gfni", Feature: &X86.HasAVX512GFNI}, + {Name: "avx512vaes", Feature: &X86.HasAVX512VAES}, + {Name: "avx512vbmi2", Feature: &X86.HasAVX512VBMI2}, + {Name: "avx512bitalg", Feature: &X86.HasAVX512BITALG}, + {Name: "avx512bf16", Feature: &X86.HasAVX512BF16}, + {Name: "bmi1", Feature: &X86.HasBMI1}, + {Name: "bmi2", Feature: &X86.HasBMI2}, + {Name: "cx16", Feature: &X86.HasCX16}, + {Name: "erms", Feature: &X86.HasERMS}, + {Name: "fma", Feature: &X86.HasFMA}, + {Name: "osxsave", Feature: &X86.HasOSXSAVE}, + {Name: "pclmulqdq", Feature: &X86.HasPCLMULQDQ}, + {Name: "popcnt", Feature: &X86.HasPOPCNT}, + {Name: "rdrand", Feature: &X86.HasRDRAND}, + {Name: "rdseed", Feature: &X86.HasRDSEED}, + {Name: "sse3", Feature: &X86.HasSSE3}, + {Name: "sse41", Feature: &X86.HasSSE41}, + {Name: "sse42", Feature: &X86.HasSSE42}, + {Name: "ssse3", Feature: &X86.HasSSSE3}, + + // These capabilities should always be enabled on amd64: + {Name: "sse2", Feature: &X86.HasSSE2, Required: runtime.GOARCH == "amd64"}, + } +} + +func archInit() { + + Initialized = true + + maxID, _, _, _ := cpuid(0, 0) + + if maxID < 1 { + return + } + + _, _, ecx1, edx1 := cpuid(1, 0) + X86.HasSSE2 = isSet(26, edx1) + + X86.HasSSE3 = isSet(0, ecx1) + X86.HasPCLMULQDQ = isSet(1, ecx1) + X86.HasSSSE3 = isSet(9, ecx1) + X86.HasFMA = isSet(12, ecx1) + X86.HasCX16 = isSet(13, ecx1) + X86.HasSSE41 = isSet(19, ecx1) + X86.HasSSE42 = isSet(20, ecx1) + X86.HasPOPCNT = isSet(23, ecx1) + X86.HasAES = isSet(25, ecx1) + X86.HasOSXSAVE = isSet(27, ecx1) + X86.HasRDRAND = isSet(30, ecx1) + + var osSupportsAVX, osSupportsAVX512 bool + // For XGETBV, OSXSAVE bit is required and sufficient. + if X86.HasOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + + if runtime.GOOS == "darwin" { + // Darwin doesn't save/restore AVX-512 mask registers correctly across signal handlers. + // Since users can't rely on mask register contents, let's not advertise AVX-512 support. + // See issue 49233. + osSupportsAVX512 = false + } else { + // Check if OPMASK and ZMM registers have OS support. + osSupportsAVX512 = osSupportsAVX && isSet(5, eax) && isSet(6, eax) && isSet(7, eax) + } + } + + X86.HasAVX = isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, ecx7, edx7 := cpuid(7, 0) + X86.HasBMI1 = isSet(3, ebx7) + X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX + X86.HasBMI2 = isSet(8, ebx7) + X86.HasERMS = isSet(9, ebx7) + X86.HasRDSEED = isSet(18, ebx7) + X86.HasADX = isSet(19, ebx7) + + X86.HasAVX512 = isSet(16, ebx7) && osSupportsAVX512 // Because avx-512 foundation is the core required extension + if X86.HasAVX512 { + X86.HasAVX512F = true + X86.HasAVX512CD = isSet(28, ebx7) + X86.HasAVX512ER = isSet(27, ebx7) + X86.HasAVX512PF = isSet(26, ebx7) + X86.HasAVX512VL = isSet(31, ebx7) + X86.HasAVX512BW = isSet(30, ebx7) + X86.HasAVX512DQ = isSet(17, ebx7) + X86.HasAVX512IFMA = isSet(21, ebx7) + X86.HasAVX512VBMI = isSet(1, ecx7) + X86.HasAVX5124VNNIW = isSet(2, edx7) + X86.HasAVX5124FMAPS = isSet(3, edx7) + X86.HasAVX512VPOPCNTDQ = isSet(14, ecx7) + X86.HasAVX512VPCLMULQDQ = isSet(10, ecx7) + X86.HasAVX512VNNI = isSet(11, ecx7) + X86.HasAVX512GFNI = isSet(8, ecx7) + X86.HasAVX512VAES = isSet(9, ecx7) + X86.HasAVX512VBMI2 = isSet(6, ecx7) + X86.HasAVX512BITALG = isSet(12, ecx7) + + eax71, _, _, _ := cpuid(7, 1) + X86.HasAVX512BF16 = isSet(5, eax71) + } +} + +func isSet(bitpos uint, value uint32) bool { + return value&(1<> 63)) +) + +// For those platforms don't have a 'cpuid' equivalent we use HWCAP/HWCAP2 +// These are initialized in cpu_$GOARCH.go +// and should not be changed after they are initialized. +var hwCap uint +var hwCap2 uint + +func readHWCAP() error { + buf, err := ioutil.ReadFile(procAuxv) + if err != nil { + // e.g. on android /proc/self/auxv is not accessible, so silently + // ignore the error and leave Initialized = false. On some + // architectures (e.g. arm64) doinit() implements a fallback + // readout and will set Initialized = true again. + return err + } + bo := hostByteOrder() + for len(buf) >= 2*(uintSize/8) { + var tag, val uint + switch uintSize { + case 32: + tag = uint(bo.Uint32(buf[0:])) + val = uint(bo.Uint32(buf[4:])) + buf = buf[8:] + case 64: + tag = uint(bo.Uint64(buf[0:])) + val = uint(bo.Uint64(buf[8:])) + buf = buf[16:] + } + switch tag { + case _AT_HWCAP: + hwCap = val + case _AT_HWCAP2: + hwCap2 = val + } + } + return nil +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go new file mode 100644 index 0000000000..a864f24d75 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go @@ -0,0 +1,27 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Recreate a getsystemcfg syscall handler instead of +// using the one provided by x/sys/unix to avoid having +// the dependency between them. (See golang.org/issue/32102) +// Morever, this file will be used during the building of +// gccgo's libgo and thus must not used a CGo method. + +//go:build aix && gccgo +// +build aix,gccgo + +package cpu + +import ( + "syscall" +) + +//extern getsystemcfg +func gccgoGetsystemcfg(label uint32) (r uint64) + +func callgetsystemcfg(label int) (r1 uintptr, e1 syscall.Errno) { + r1 = uintptr(gccgoGetsystemcfg(uint32(label))) + e1 = syscall.GetErrno() + return +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go new file mode 100644 index 0000000000..904be42ffd --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go @@ -0,0 +1,36 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Minimal copy of x/sys/unix so the cpu package can make a +// system call on AIX without depending on x/sys/unix. +// (See golang.org/issue/32102) + +//go:build aix && ppc64 && gc +// +build aix,ppc64,gc + +package cpu + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o" + +//go:linkname libc_getsystemcfg libc_getsystemcfg + +type syscallFunc uintptr + +var libc_getsystemcfg syscallFunc + +type errno = syscall.Errno + +// Implemented in runtime/syscall_aix.go. +func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno) +func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno) + +func callgetsystemcfg(label int) (r1 uintptr, e1 errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0) + return +} diff --git a/vendor/golang.org/x/sys/unix/ioctl_linux.go b/vendor/golang.org/x/sys/unix/ioctl_linux.go index 1dadead21e..884430b810 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_linux.go +++ b/vendor/golang.org/x/sys/unix/ioctl_linux.go @@ -194,3 +194,26 @@ func ioctlIfreqData(fd int, req uint, value *ifreqData) error { // identical so pass *IfreqData directly. return ioctlPtr(fd, req, unsafe.Pointer(value)) } + +// IoctlKCMClone attaches a new file descriptor to a multiplexor by cloning an +// existing KCM socket, returning a structure containing the file descriptor of +// the new socket. +func IoctlKCMClone(fd int) (*KCMClone, error) { + var info KCMClone + if err := ioctlPtr(fd, SIOCKCMCLONE, unsafe.Pointer(&info)); err != nil { + return nil, err + } + + return &info, nil +} + +// IoctlKCMAttach attaches a TCP socket and associated BPF program file +// descriptor to a multiplexor. +func IoctlKCMAttach(fd int, info KCMAttach) error { + return ioctlPtr(fd, SIOCKCMATTACH, unsafe.Pointer(&info)) +} + +// IoctlKCMUnattach unattaches a TCP socket file descriptor from a multiplexor. +func IoctlKCMUnattach(fd int, info KCMUnattach) error { + return ioctlPtr(fd, SIOCKCMUNATTACH, unsafe.Pointer(&info)) +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index e92ddea00b..a037087481 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -205,6 +205,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -231,6 +232,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -503,6 +505,7 @@ ccflags="$@" $2 ~ /^O?XTABS$/ || $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || + $2 ~ /^KCM/ || $2 ~ /^LANDLOCK_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index f5915e2342..5f28f8fded 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -250,6 +250,13 @@ func Getwd() (wd string, err error) { if n < 1 || n > len(buf) || buf[n-1] != 0 { return "", EINVAL } + // In some cases, Linux can return a path that starts with the + // "(unreachable)" prefix, which can potentially be a valid relative + // path. To work around that, return ENOENT if path is not absolute. + if buf[0] != '/' { + return "", ENOENT + } + return string(buf[0 : n-1]), nil } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index 5f757e8aa7..d44b8ad533 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -173,14 +173,6 @@ const ( _SENDMMSG = 20 ) -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) - if e != 0 { - err = e - } - return -} - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) if e != 0 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 4299125aa7..bd21d93bf8 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -62,7 +62,6 @@ func Stat(path string, stat *Stat_t) (err error) { //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 79edeb9cb1..343c91f6b3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -27,7 +27,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return newoffset, nil } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 862890de29..8c56286848 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -66,7 +66,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { return ENOSYS } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 8932e34ad2..f0b138002c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -48,7 +48,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 7821c25d9f..e6163c30fe 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -41,7 +41,6 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go index c5053a0f03..4740e80a8e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go @@ -43,7 +43,6 @@ import ( //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 25786c4216..78bc9166ef 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -45,7 +45,6 @@ package unix //sys Statfs(path string, buf *Statfs_t) (err error) //sys Truncate(path string, length int64) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 6f9f710414..3d6c4eb068 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -65,7 +65,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { return ENOSYS } -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index 6aa59cb270..89ce84a416 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -145,15 +145,6 @@ const ( netSendMMsg = 20 ) -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) { - args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} - fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0) - if err != 0 { - return 0, err - } - return int(fd), nil -} - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) { args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)} fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index bbe8d174f8..35bdb098c5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -42,7 +42,6 @@ package unix //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) -//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index 664db640ae..bc7c9d0755 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -260,6 +260,17 @@ const ( BUS_USB = 0x3 BUS_VIRTUAL = 0x6 CAN_BCM = 0x2 + CAN_CTRLMODE_3_SAMPLES = 0x4 + CAN_CTRLMODE_BERR_REPORTING = 0x10 + CAN_CTRLMODE_CC_LEN8_DLC = 0x100 + CAN_CTRLMODE_FD = 0x20 + CAN_CTRLMODE_FD_NON_ISO = 0x80 + CAN_CTRLMODE_LISTENONLY = 0x2 + CAN_CTRLMODE_LOOPBACK = 0x1 + CAN_CTRLMODE_ONE_SHOT = 0x8 + CAN_CTRLMODE_PRESUME_ACK = 0x40 + CAN_CTRLMODE_TDC_AUTO = 0x200 + CAN_CTRLMODE_TDC_MANUAL = 0x400 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff @@ -337,6 +348,7 @@ const ( CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff + CAN_TERMINATION_DISABLED = 0x0 CAN_TP16 = 0x3 CAN_TP20 = 0x4 CAP_AUDIT_CONTROL = 0x1e @@ -1274,6 +1286,8 @@ const ( IUTF8 = 0x4000 IXANY = 0x800 JFFS2_SUPER_MAGIC = 0x72b6 + KCMPROTO_CONNECTED = 0x0 + KCM_RECV_DISABLE = 0x1 KEXEC_ARCH_386 = 0x30000 KEXEC_ARCH_68K = 0x40000 KEXEC_ARCH_AARCH64 = 0xb70000 @@ -2446,6 +2460,9 @@ const ( SIOCGSTAMPNS = 0x8907 SIOCGSTAMPNS_OLD = 0x8907 SIOCGSTAMP_OLD = 0x8906 + SIOCKCMATTACH = 0x89e0 + SIOCKCMCLONE = 0x89e2 + SIOCKCMUNATTACH = 0x89e1 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 21fb850797..43d9f01281 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -444,17 +444,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 654f91530f..7df0cb1795 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -46,17 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index e893f987f9..076e8f1c5b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -389,17 +389,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index eab7ab9a4f..7b3c847467 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -344,17 +344,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index dc3f47f1ca..0d3c45fbdd 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -399,17 +399,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 82b5e2d9ed..cb46b2aaa2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -399,17 +399,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 691f3de428..21c9baa6ab 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -344,17 +344,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go index 5ce957c567..02b8f08871 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go @@ -409,17 +409,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 82c5b6336e..ac8cb09ba3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -475,17 +475,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 178847e35a..bd08d887a1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -475,17 +475,6 @@ func Ustat(dev int, ubuf *Ustat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 63b393b802..a834d21730 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -369,17 +369,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index ea7d7c29ee..96d340242c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -455,17 +455,6 @@ func Truncate(path string, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 824cadb419..cbf32f7189 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -3771,6 +3771,8 @@ const ( ETHTOOL_A_TUNNEL_INFO_MAX = 0x2 ) +const SPEED_UNKNOWN = -0x1 + type EthtoolDrvinfo struct { Cmd uint32 Driver [32]byte @@ -4070,3 +4072,91 @@ const ( NL_POLICY_TYPE_ATTR_MASK = 0xc NL_POLICY_TYPE_ATTR_MAX = 0xc ) + +type CANBitTiming struct { + Bitrate uint32 + Sample_point uint32 + Tq uint32 + Prop_seg uint32 + Phase_seg1 uint32 + Phase_seg2 uint32 + Sjw uint32 + Brp uint32 +} + +type CANBitTimingConst struct { + Name [16]uint8 + Tseg1_min uint32 + Tseg1_max uint32 + Tseg2_min uint32 + Tseg2_max uint32 + Sjw_max uint32 + Brp_min uint32 + Brp_max uint32 + Brp_inc uint32 +} + +type CANClock struct { + Freq uint32 +} + +type CANBusErrorCounters struct { + Txerr uint16 + Rxerr uint16 +} + +type CANCtrlMode struct { + Mask uint32 + Flags uint32 +} + +type CANDeviceStats struct { + Bus_error uint32 + Error_warning uint32 + Error_passive uint32 + Bus_off uint32 + Arbitration_lost uint32 + Restarts uint32 +} + +const ( + CAN_STATE_ERROR_ACTIVE = 0x0 + CAN_STATE_ERROR_WARNING = 0x1 + CAN_STATE_ERROR_PASSIVE = 0x2 + CAN_STATE_BUS_OFF = 0x3 + CAN_STATE_STOPPED = 0x4 + CAN_STATE_SLEEPING = 0x5 + CAN_STATE_MAX = 0x6 +) + +const ( + IFLA_CAN_UNSPEC = 0x0 + IFLA_CAN_BITTIMING = 0x1 + IFLA_CAN_BITTIMING_CONST = 0x2 + IFLA_CAN_CLOCK = 0x3 + IFLA_CAN_STATE = 0x4 + IFLA_CAN_CTRLMODE = 0x5 + IFLA_CAN_RESTART_MS = 0x6 + IFLA_CAN_RESTART = 0x7 + IFLA_CAN_BERR_COUNTER = 0x8 + IFLA_CAN_DATA_BITTIMING = 0x9 + IFLA_CAN_DATA_BITTIMING_CONST = 0xa + IFLA_CAN_TERMINATION = 0xb + IFLA_CAN_TERMINATION_CONST = 0xc + IFLA_CAN_BITRATE_CONST = 0xd + IFLA_CAN_DATA_BITRATE_CONST = 0xe + IFLA_CAN_BITRATE_MAX = 0xf +) + +type KCMAttach struct { + Fd int32 + Bpf_fd int32 +} + +type KCMUnattach struct { + Fd int32 +} + +type KCMClone struct { + Fd int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 6358806106..c426c35763 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -210,8 +210,8 @@ type PtraceFpregs struct { } type PtracePer struct { - _ [0]uint64 - _ [32]byte + Control_regs [3]uint64 + _ [8]byte Starting_addr uint64 Ending_addr uint64 Perc_atmid uint16 diff --git a/vendor/gopkg.in/warnings.v0/LICENSE b/vendor/gopkg.in/warnings.v0/LICENSE new file mode 100644 index 0000000000..d65f7e9d8c --- /dev/null +++ b/vendor/gopkg.in/warnings.v0/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2016 Péter Surányi. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/gopkg.in/warnings.v0/README b/vendor/gopkg.in/warnings.v0/README new file mode 100644 index 0000000000..974212ba1b --- /dev/null +++ b/vendor/gopkg.in/warnings.v0/README @@ -0,0 +1,77 @@ +Package warnings implements error handling with non-fatal errors (warnings). + +import path: "gopkg.in/warnings.v0" +package docs: https://godoc.org/gopkg.in/warnings.v0 +issues: https://github.com/go-warnings/warnings/issues +pull requests: https://github.com/go-warnings/warnings/pulls + +A recurring pattern in Go programming is the following: + + func myfunc(params) error { + if err := doSomething(...); err != nil { + return err + } + if err := doSomethingElse(...); err != nil { + return err + } + if ok := doAnotherThing(...); !ok { + return errors.New("my error") + } + ... + return nil + } + +This pattern allows interrupting the flow on any received error. But what if +there are errors that should be noted but still not fatal, for which the flow +should not be interrupted? Implementing such logic at each if statement would +make the code complex and the flow much harder to follow. + +Package warnings provides the Collector type and a clean and simple pattern +for achieving such logic. The Collector takes care of deciding when to break +the flow and when to continue, collecting any non-fatal errors (warnings) +along the way. The only requirement is that fatal and non-fatal errors can be +distinguished programmatically; that is a function such as + + IsFatal(error) bool + +must be implemented. The following is an example of what the above snippet +could look like using the warnings package: + + import "gopkg.in/warnings.v0" + + func isFatal(err error) bool { + _, ok := err.(WarningType) + return !ok + } + + func myfunc(params) error { + c := warnings.NewCollector(isFatal) + c.FatalWithWarnings = true + if err := c.Collect(doSomething()); err != nil { + return err + } + if err := c.Collect(doSomethingElse(...)); err != nil { + return err + } + if ok := doAnotherThing(...); !ok { + if err := c.Collect(errors.New("my error")); err != nil { + return err + } + } + ... + return c.Done() + } + +For an example of a non-trivial code base using this library, see +gopkg.in/gcfg.v1 + +Rules for using warnings + + - ensure that warnings are programmatically distinguishable from fatal + errors (i.e. implement an isFatal function and any necessary error types) + - ensure that there is a single Collector instance for a call of each + exported function + - ensure that all errors (fatal or warning) are fed through Collect + - ensure that every time an error is returned, it is one returned by a + Collector (from Collect or Done) + - ensure that Collect is never called after Done diff --git a/vendor/gopkg.in/warnings.v0/warnings.go b/vendor/gopkg.in/warnings.v0/warnings.go new file mode 100644 index 0000000000..b849d1e3d9 --- /dev/null +++ b/vendor/gopkg.in/warnings.v0/warnings.go @@ -0,0 +1,194 @@ +// Package warnings implements error handling with non-fatal errors (warnings). +// +// A recurring pattern in Go programming is the following: +// +// func myfunc(params) error { +// if err := doSomething(...); err != nil { +// return err +// } +// if err := doSomethingElse(...); err != nil { +// return err +// } +// if ok := doAnotherThing(...); !ok { +// return errors.New("my error") +// } +// ... +// return nil +// } +// +// This pattern allows interrupting the flow on any received error. But what if +// there are errors that should be noted but still not fatal, for which the flow +// should not be interrupted? Implementing such logic at each if statement would +// make the code complex and the flow much harder to follow. +// +// Package warnings provides the Collector type and a clean and simple pattern +// for achieving such logic. The Collector takes care of deciding when to break +// the flow and when to continue, collecting any non-fatal errors (warnings) +// along the way. The only requirement is that fatal and non-fatal errors can be +// distinguished programmatically; that is a function such as +// +// IsFatal(error) bool +// +// must be implemented. The following is an example of what the above snippet +// could look like using the warnings package: +// +// import "gopkg.in/warnings.v0" +// +// func isFatal(err error) bool { +// _, ok := err.(WarningType) +// return !ok +// } +// +// func myfunc(params) error { +// c := warnings.NewCollector(isFatal) +// c.FatalWithWarnings = true +// if err := c.Collect(doSomething()); err != nil { +// return err +// } +// if err := c.Collect(doSomethingElse(...)); err != nil { +// return err +// } +// if ok := doAnotherThing(...); !ok { +// if err := c.Collect(errors.New("my error")); err != nil { +// return err +// } +// } +// ... +// return c.Done() +// } +// +// For an example of a non-trivial code base using this library, see +// gopkg.in/gcfg.v1 +// +// Rules for using warnings +// +// - ensure that warnings are programmatically distinguishable from fatal +// errors (i.e. implement an isFatal function and any necessary error types) +// - ensure that there is a single Collector instance for a call of each +// exported function +// - ensure that all errors (fatal or warning) are fed through Collect +// - ensure that every time an error is returned, it is one returned by a +// Collector (from Collect or Done) +// - ensure that Collect is never called after Done +// +// TODO +// +// - optionally limit the number of warnings (e.g. stop after 20 warnings) (?) +// - consider interaction with contexts +// - go vet-style invocations verifier +// - semi-automatic code converter +// +package warnings // import "gopkg.in/warnings.v0" + +import ( + "bytes" + "fmt" +) + +// List holds a collection of warnings and optionally one fatal error. +type List struct { + Warnings []error + Fatal error +} + +// Error implements the error interface. +func (l List) Error() string { + b := bytes.NewBuffer(nil) + if l.Fatal != nil { + fmt.Fprintln(b, "fatal:") + fmt.Fprintln(b, l.Fatal) + } + switch len(l.Warnings) { + case 0: + // nop + case 1: + fmt.Fprintln(b, "warning:") + default: + fmt.Fprintln(b, "warnings:") + } + for _, err := range l.Warnings { + fmt.Fprintln(b, err) + } + return b.String() +} + +// A Collector collects errors up to the first fatal error. +type Collector struct { + // IsFatal distinguishes between warnings and fatal errors. + IsFatal func(error) bool + // FatalWithWarnings set to true means that a fatal error is returned as + // a List together with all warnings so far. The default behavior is to + // only return the fatal error and discard any warnings that have been + // collected. + FatalWithWarnings bool + + l List + done bool +} + +// NewCollector returns a new Collector; it uses isFatal to distinguish between +// warnings and fatal errors. +func NewCollector(isFatal func(error) bool) *Collector { + return &Collector{IsFatal: isFatal} +} + +// Collect collects a single error (warning or fatal). It returns nil if +// collection can continue (only warnings so far), or otherwise the errors +// collected. Collect mustn't be called after the first fatal error or after +// Done has been called. +func (c *Collector) Collect(err error) error { + if c.done { + panic("warnings.Collector already done") + } + if err == nil { + return nil + } + if c.IsFatal(err) { + c.done = true + c.l.Fatal = err + } else { + c.l.Warnings = append(c.l.Warnings, err) + } + if c.l.Fatal != nil { + return c.erorr() + } + return nil +} + +// Done ends collection and returns the collected error(s). +func (c *Collector) Done() error { + c.done = true + return c.erorr() +} + +func (c *Collector) erorr() error { + if !c.FatalWithWarnings && c.l.Fatal != nil { + return c.l.Fatal + } + if c.l.Fatal == nil && len(c.l.Warnings) == 0 { + return nil + } + // Note that a single warning is also returned as a List. This is to make it + // easier to determine fatal-ness of the returned error. + return c.l +} + +// FatalOnly returns the fatal error, if any, **in an error returned by a +// Collector**. It returns nil if and only if err is nil or err is a List +// with err.Fatal == nil. +func FatalOnly(err error) error { + l, ok := err.(List) + if !ok { + return err + } + return l.Fatal +} + +// WarningsOnly returns the warnings **in an error returned by a Collector**. +func WarningsOnly(err error) []error { + l, ok := err.(List) + if !ok { + return nil + } + return l.Warnings +} diff --git a/vendor/gotest.tools/v3/assert/assert_go113.go b/vendor/gotest.tools/v3/assert/assert_go113.go new file mode 100644 index 0000000000..1e3cede48a --- /dev/null +++ b/vendor/gotest.tools/v3/assert/assert_go113.go @@ -0,0 +1,20 @@ +// +build go1.13 + +package assert + +import ( + "gotest.tools/v3/assert/cmp" + "gotest.tools/v3/internal/assert" +) + +// ErrorIs fails the test if err is nil, or the error does not match expected +// when compared using errors.Is. See https://golang.org/pkg/errors/#Is for +// accepted argument values. +func ErrorIs(t TestingT, err error, expected error, msgAndArgs ...interface{}) { + if ht, ok := t.(helperT); ok { + ht.Helper() + } + if !assert.Eval(t, assert.ArgsAfterT, cmp.ErrorIs(err, expected), msgAndArgs...) { + t.FailNow() + } +} diff --git a/vendor/gotest.tools/v3/assert/cmp/compare_go113.go b/vendor/gotest.tools/v3/assert/cmp/compare_go113.go new file mode 100644 index 0000000000..58af74450d --- /dev/null +++ b/vendor/gotest.tools/v3/assert/cmp/compare_go113.go @@ -0,0 +1,29 @@ +// +build go1.13 + +package cmp + +import ( + "errors" +) + +// ErrorIs succeeds if errors.Is(actual, expected) returns true. See +// https://golang.org/pkg/errors/#Is for accepted argument values. +func ErrorIs(actual error, expected error) Comparison { + return func() Result { + if errors.Is(actual, expected) { + return ResultSuccess + } + + return ResultFailureTemplate(`error is + {{- if not .Data.a }} nil,{{ else }} + {{- printf " \"%v\"" .Data.a}} ( + {{- with callArg 0 }}{{ formatNode . }} {{end -}} + {{- printf "%T" .Data.a -}} + ), + {{- end }} not {{ printf "\"%v\"" .Data.x}} ( + {{- with callArg 1 }}{{ formatNode . }} {{end -}} + {{- printf "%T" .Data.x -}} + )`, + map[string]interface{}{"a": actual, "x": expected}) + } +} diff --git a/vendor/k8s.io/kube-openapi/pkg/common/common.go b/vendor/k8s.io/kube-openapi/pkg/common/common.go index cf1d01f903..4956b3a794 100644 --- a/vendor/k8s.io/kube-openapi/pkg/common/common.go +++ b/vendor/k8s.io/kube-openapi/pkg/common/common.go @@ -21,6 +21,7 @@ import ( "strings" "github.com/emicklei/go-restful" + "k8s.io/kube-openapi/pkg/validation/spec" ) @@ -92,8 +93,14 @@ type Config struct { GetDefinitions GetOpenAPIDefinitions // GetOperationIDAndTags returns operation id and tags for a restful route. It is an optional function to customize operation IDs. + // + // Deprecated: GetOperationIDAndTagsFromRoute should be used instead. This cannot be specified if using the new Route + // interface set of funcs. GetOperationIDAndTags func(r *restful.Route) (string, []string, error) + // GetOperationIDAndTagsFromRoute returns operation id and tags for a Route. It is an optional function to customize operation IDs. + GetOperationIDAndTagsFromRoute func(r Route) (string, []string, error) + // GetDefinitionName returns a friendly name for a definition base on the serving path. parameter `name` is the full name of the definition. // It is an optional function to customize model names. GetDefinitionName func(name string) (string, spec.Extensions) diff --git a/vendor/k8s.io/kube-openapi/pkg/common/interfaces.go b/vendor/k8s.io/kube-openapi/pkg/common/interfaces.go new file mode 100644 index 0000000000..059fc551b2 --- /dev/null +++ b/vendor/k8s.io/kube-openapi/pkg/common/interfaces.go @@ -0,0 +1,88 @@ +package common + +// RouteContainer is the entrypoint for a service, which may contain multiple +// routes under a common path with a common set of path parameters. +type RouteContainer interface { + // RootPath is the path that all contained routes are nested under. + RootPath() string + // PathParameters are common parameters defined in the root path. + PathParameters() []Parameter + // Routes are all routes exposed under the root path. + Routes() []Route +} + +// Route is a logical endpoint of a service. +type Route interface { + // Method defines the HTTP Method. + Method() string + // Path defines the route's endpoint. + Path() string + // OperationName defines a machine-readable ID for the route. + OperationName() string + // Parameters defines the list of accepted parameters. + Parameters() []Parameter + // Description is a human-readable route description. + Description() string + // Consumes defines the consumed content-types. + Consumes() []string + // Produces defines the produced content-types. + Produces() []string + // Metadata allows adding extensions to the generated spec. + Metadata() map[string]interface{} + // RequestPayloadSample defines an example request payload. Can return nil. + RequestPayloadSample() interface{} + // ResponsePayloadSample defines an example response payload. Can return nil. + ResponsePayloadSample() interface{} + // StatusCodeResponses defines a mapping of HTTP Status Codes to the specific response(s). + // Multiple responses with the same HTTP Status Code are acceptable. + StatusCodeResponses() []StatusCodeResponse +} + +// StatusCodeResponse is an explicit response type with an HTTP Status Code. +type StatusCodeResponse interface { + // Code defines the HTTP Status Code. + Code() int + // Message returns the human-readable message. + Message() string + // Model defines an example payload for this response. + Model() interface{} +} + +// Parameter is a Route parameter. +type Parameter interface { + // Name defines the unique-per-route identifier. + Name() string + // Description is the human-readable description of the param. + Description() string + // Required defines if this parameter must be provided. + Required() bool + // Kind defines the type of the parameter itself. + Kind() ParameterKind + // DataType defines the type of data the parameter carries. + DataType() string + // AllowMultiple defines if more than one value can be supplied for the parameter. + AllowMultiple() bool +} + +// ParameterKind is an enum of route parameter types. +type ParameterKind int + +const ( + // PathParameterKind indicates the request parameter type is "path". + PathParameterKind = ParameterKind(iota) + + // QueryParameterKind indicates the request parameter type is "query". + QueryParameterKind + + // BodyParameterKind indicates the request parameter type is "body". + BodyParameterKind + + // HeaderParameterKind indicates the request parameter type is "header". + HeaderParameterKind + + // FormParameterKind indicates the request parameter type is "form". + FormParameterKind + + // UnknownParameterKind indicates the request parameter type has not been specified. + UnknownParameterKind +) diff --git a/vendor/k8s.io/utils/pointer/pointer.go b/vendor/k8s.io/utils/pointer/pointer.go index 2cab2c5800..f5802d2e81 100644 --- a/vendor/k8s.io/utils/pointer/pointer.go +++ b/vendor/k8s.io/utils/pointer/pointer.go @@ -19,6 +19,7 @@ package pointer import ( "fmt" "reflect" + "time" ) // AllPtrFieldsNil tests whether all pointer fields in a struct are nil. This is useful when, @@ -184,7 +185,7 @@ func StringEqual(a, b *string) bool { return *a == *b } -// Float32 returns a pointer to the a float32. +// Float32 returns a pointer to a float32. func Float32(i float32) *float32 { return &i } @@ -214,7 +215,7 @@ func Float32Equal(a, b *float32) bool { return *a == *b } -// Float64 returns a pointer to the a float64. +// Float64 returns a pointer to a float64. func Float64(i float64) *float64 { return &i } @@ -243,3 +244,29 @@ func Float64Equal(a, b *float64) bool { } return *a == *b } + +// Duration returns a pointer to a time.Duration. +func Duration(d time.Duration) *time.Duration { + return &d +} + +// DurationDeref dereferences the time.Duration ptr and returns it if not nil, or else +// returns def. +func DurationDeref(ptr *time.Duration, def time.Duration) time.Duration { + if ptr != nil { + return *ptr + } + return def +} + +// DurationEqual returns true if both arguments are nil or both arguments +// dereference to the same value. +func DurationEqual(a, b *time.Duration) bool { + if (a == nil) != (b == nil) { + return false + } + if a == nil { + return true + } + return *a == *b +} diff --git a/vendor/knative.dev/hack/README.md b/vendor/knative.dev/hack/README.md index a6a98c7840..570f370977 100644 --- a/vendor/knative.dev/hack/README.md +++ b/vendor/knative.dev/hack/README.md @@ -167,6 +167,11 @@ This is a helper script for Knative E2E test scripts. To use it: 1. By default Istio is installed on the cluster via Addon, use `--skip-istio-addon` if you choose not to have it preinstalled. +1. By default Google Kubernetes Engine telemetry to Cloud Logging and Monitoring is disabled. + This can be enabled by setting `ENABLE_GKE_TELEMETRY` to `true`. + +1. By default Spot Worker nodes are disabled. This can be enabled by setting `ENABLE_PREEMPTIBLE_NODES` + to `true`. ### Sample end-to-end test script This script will test that the latest Knative Serving nightly release works. It diff --git a/vendor/knative.dev/hack/e2e-tests.sh b/vendor/knative.dev/hack/e2e-tests.sh index 537b3867e2..9178eac2cc 100644 --- a/vendor/knative.dev/hack/e2e-tests.sh +++ b/vendor/knative.dev/hack/e2e-tests.sh @@ -73,9 +73,6 @@ function setup_test_cluster() { is_protected_cluster "${k8s_cluster}" && \ abort "kubeconfig context set to ${k8s_cluster}, which is forbidden" - # Acquire cluster admin role for the current user. - acquire_cluster_admin_role "${k8s_cluster}" - # Setup KO_DOCKER_REPO if it is a GKE cluster. Incorporate an element of # randomness to ensure that each run properly publishes images. Don't # owerwrite KO_DOCKER_REPO if already set. diff --git a/vendor/knative.dev/hack/infra-library.sh b/vendor/knative.dev/hack/infra-library.sh index f87c259d1d..a96210e2e1 100644 --- a/vendor/knative.dev/hack/infra-library.sh +++ b/vendor/knative.dev/hack/infra-library.sh @@ -77,20 +77,6 @@ function dump_cluster_state() { echo "***************************************" } -# Sets the current user as cluster admin for the given cluster. -# Parameters: $1 - cluster context name -function acquire_cluster_admin_role() { - if [[ -z "$(kubectl get clusterrolebinding cluster-admin-binding 2> /dev/null)" ]]; then - if [[ "$1" =~ ^gke_.* ]]; then - kubectl create clusterrolebinding cluster-admin-binding \ - --clusterrole=cluster-admin --user="$(gcloud config get-value core/account)" - else - kubectl create clusterrolebinding cluster-admin-binding \ - --clusterrole=cluster-admin --user="prow" - fi - fi -} - # Create a test cluster and run the tests if provided. # Parameters: $1 - cluster provider name, e.g. gke # $2 - custom flags supported by kntest @@ -137,5 +123,15 @@ function create_gke_test_cluster() { local -n _custom_flags=$1 local -n _test_command=$2 - run_kntest kubetest2 gke "${_custom_flags[@]}" --test-command="${_test_command[*]}" + # We are disabling logs and metrics on Boskos Clusters by default as they are not used. Manually set ENABLE_GKE_TELEMETRY to true to enable telemetry + # and ENABLE_PREEMPTIBLE_NODES to true to create preemptible/spot VMs. VM Preemption is a rare event and shouldn't be distruptive given the fault tolerant nature of our tests. + local extra_gcloud_flags="" + if [[ "$ENABLE_GKE_TELEMETRY" != "true" ]]; then + extra_gcloud_flags="${extra_gcloud_flags} --logging=NONE --monitoring=NONE" + fi + + if [[ "$ENABLE_PREEMPTIBLE_NODES" == "true" ]]; then + extra_gcloud_flags="${extra_gcloud_flags} --preemptible" + fi + run_kntest kubetest2 gke "${_custom_flags[@]}" --test-command="${_test_command[*]}" --extra-gcloud-flags="${extra_gcloud_flags}" } diff --git a/vendor/knative.dev/hack/presubmit-tests.sh b/vendor/knative.dev/hack/presubmit-tests.sh index 70a399c8e3..08bd85d4a1 100644 --- a/vendor/knative.dev/hack/presubmit-tests.sh +++ b/vendor/knative.dev/hack/presubmit-tests.sh @@ -266,8 +266,6 @@ function main() { git version echo ">> ko version" [[ -f /ko_version ]] && cat /ko_version || echo "unknown" - echo ">> bazel version" - [[ -f /bazel_version ]] && cat /bazel_version || echo "unknown" if [[ "${DOCKER_IN_DOCKER_ENABLED}" == "true" ]]; then echo ">> docker version" docker version @@ -281,6 +279,8 @@ function main() { echo ">> maven version" mvn --version fi + echo ">> prow-tests image version" + [[ -f /commit_hash ]] && echo "Prow test image was built from $(cat /commit_hash) commit which is viewable at https://github.com/knative/test-infra/tree/$(cat /commit_hash) " || echo "unknown" fi [[ -z ${1:-} ]] && set -- "--all-tests" diff --git a/vendor/knative.dev/kn-plugin-func/.codecov.yaml b/vendor/knative.dev/kn-plugin-func/.codecov.yaml new file mode 100644 index 0000000000..16733ebf01 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/.codecov.yaml @@ -0,0 +1,4 @@ +ignore: + - third_party + - vendor + - testdata diff --git a/vendor/knative.dev/kn-plugin-func/.gitattributes b/vendor/knative.dev/kn-plugin-func/.gitattributes new file mode 100644 index 0000000000..788d0c2fd6 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/.gitattributes @@ -0,0 +1,4 @@ +testdata/repository-a.git/objects/*/* ignore-lint=true +testdata/repository.git/objects/*/* ignore-lint=true +version.txt linguist-generated=true +zz_filesystem_generated.go linguist-generated=true diff --git a/vendor/knative.dev/kn-plugin-func/.gitignore b/vendor/knative.dev/kn-plugin-func/.gitignore new file mode 100644 index 0000000000..b2aa0fe9e3 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/.gitignore @@ -0,0 +1,18 @@ +/func +/func_* +/templates/go/cloudevents/go.sum +/templates/go/http/go.sum +/templates/typescript/cloudevents/build +/templates/typescript/http/build +/coverage.out +/bin +/target +.DS_Store +node_modules +__pycache__ +/coverage.out +/bin + +.vscode +.idea +.DS_Store diff --git a/vendor/knative.dev/kn-plugin-func/.golangci.yaml b/vendor/knative.dev/kn-plugin-func/.golangci.yaml new file mode 100644 index 0000000000..7b33e61e9d --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/.golangci.yaml @@ -0,0 +1,31 @@ +# +# golangci-lint +# +# For defaults, see: +# https://github.com/golangci/golangci-lint/blob/master/.golangci.example.yml +# +# +# +run: + timeout: 5m + +linters: + enable: + - unconvert + - prealloc + - bodyclose + +issues: + exclude-rules: + - linters: + - staticcheck + # Error Text: + # "SA9004: only the first constant in this group has an explicit type" + # Efect: + # Allows short-hand first constant type declarations: + # Example: + # const ( + # Name Type = "value" + # Name2 = "value2" + # ) + text: "SA9004:" diff --git a/vendor/knative.dev/kn-plugin-func/.ko.yaml b/vendor/knative.dev/kn-plugin-func/.ko.yaml new file mode 100644 index 0000000000..3736d2d8cc --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/.ko.yaml @@ -0,0 +1,3 @@ +defaultBaseImage: gcr.io/distroless/static:nonroot +baseImageOverrides: + knative.dev/kn-plugin-func/cmd/func: docker.io/library/alpine:latest diff --git a/vendor/knative.dev/kn-plugin-func/.unicode-control-characters.config.py b/vendor/knative.dev/kn-plugin-func/.unicode-control-characters.config.py new file mode 100644 index 0000000000..aefe0342a2 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/.unicode-control-characters.config.py @@ -0,0 +1,3 @@ +scan_exclude = [ + # Readme in vendor dir line=17,title=unicode control characters ['\u200d'] + r'vendor/github\.com/rivo/uniseg/README\.md'] diff --git a/vendor/knative.dev/kn-plugin-func/.versionrc b/vendor/knative.dev/kn-plugin-func/.versionrc new file mode 100644 index 0000000000..e04abef494 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/.versionrc @@ -0,0 +1,16 @@ +{ + "bumpFiles": [{ + "filename": "version.txt", + "type": "plain-text" + }], + "types": [ + {"type":"feat","section":"Features"}, + {"type":"fix","section":"Bug Fixes"}, + {"type":"chore","section":"Miscellaneous"}, + {"type":"docs","section":"Documentation"}, + {"type":"refactor","section":"Miscellaneous"} + ], + "skip": { + "tag": true + } +} diff --git a/vendor/knative.dev/kn-plugin-func/AUTHORS b/vendor/knative.dev/kn-plugin-func/AUTHORS new file mode 100644 index 0000000000..8c6ae0568c --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/AUTHORS @@ -0,0 +1,7 @@ +# This is the list of func authors for copyright purposes. +# +# This does not necessarily list everyone who has contributed code, since in +# some cases, their employer may be the copyright holder. To see the full list +# of contributors, see the revision history in source control. +Red Hat, Inc. + diff --git a/vendor/knative.dev/kn-plugin-func/CHANGELOG.md b/vendor/knative.dev/kn-plugin-func/CHANGELOG.md new file mode 100644 index 0000000000..43736a90da --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/CHANGELOG.md @@ -0,0 +1,691 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [0.24.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.23.0...v0.24.0) (2022-06-01) + + +### Features + +* configurable s2i builder images ([#1024](https://github.com/knative-sandbox/kn-plugin-func/issues/1024)) ([096085d](https://github.com/knative-sandbox/kn-plugin-func/commit/096085d751f105b5592a09c849fef364b84145b3)) +* enable Paketo builders for Python functions ([#979](https://github.com/knative-sandbox/kn-plugin-func/issues/979)) ([5af934b](https://github.com/knative-sandbox/kn-plugin-func/commit/5af934be8d97b0de676fb7d81e07f7b07a33a9e3)) +* expose default builder image logic for in-cluster builds ([#1021](https://github.com/knative-sandbox/kn-plugin-func/issues/1021)) ([dc8abf1](https://github.com/knative-sandbox/kn-plugin-func/commit/dc8abf179c63582d197e5a9add2006ad0c026ff6)) +* improved invoke verbosity ([#1007](https://github.com/knative-sandbox/kn-plugin-func/issues/1007)) ([867d4c2](https://github.com/knative-sandbox/kn-plugin-func/commit/867d4c26d6dd0b4d06cf6428dc932004e20ca981)) +* invoke verbose metadata ([#944](https://github.com/knative-sandbox/kn-plugin-func/issues/944)) ([c3c1456](https://github.com/knative-sandbox/kn-plugin-func/commit/c3c1456ede7b471a271d0680107657ac0e4f0568)) +* make templates consistent across runtimes ([#948](https://github.com/knative-sandbox/kn-plugin-func/issues/948)) ([13d4222](https://github.com/knative-sandbox/kn-plugin-func/commit/13d4222461c553d5da1c8448713cba9e4a3e828a)) +* s2i builder env var interpolation ([#991](https://github.com/knative-sandbox/kn-plugin-func/issues/991)) ([1424831](https://github.com/knative-sandbox/kn-plugin-func/commit/14248311b1254fe8601b394f064e2fdd92dd4ced)) +* s2i builder quarkus support ([#993](https://github.com/knative-sandbox/kn-plugin-func/issues/993)) ([397ce65](https://github.com/knative-sandbox/kn-plugin-func/commit/397ce65598c1f61d2312c62016ed78453e1299a3)) +* s2i builder typescript support ([#957](https://github.com/knative-sandbox/kn-plugin-func/issues/957)) ([3be1a77](https://github.com/knative-sandbox/kn-plugin-func/commit/3be1a77388647055dc67e3901da323c240dc77f4)) + + +### Bug Fixes + +* ignore `is forbidden` errors when deleting function and resources ([#988](https://github.com/knative-sandbox/kn-plugin-func/issues/988)) ([ce26a23](https://github.com/knative-sandbox/kn-plugin-func/commit/ce26a23352513747cad25b7668def43edff6f0fe)) +* ignore node_modules for s2i builds ([#1019](https://github.com/knative-sandbox/kn-plugin-func/issues/1019)) ([1d367c6](https://github.com/knative-sandbox/kn-plugin-func/commit/1d367c6be50d36e045b475c7ff173001b1eaa3d0)) +* read pwd from non-tty input ([#996](https://github.com/knative-sandbox/kn-plugin-func/issues/996)) ([e9932cd](https://github.com/knative-sandbox/kn-plugin-func/commit/e9932cdf43eb560ff496a98f83766d1c3e1fdc96)) +* update various doc links ([#980](https://github.com/knative-sandbox/kn-plugin-func/issues/980)) ([bc6383e](https://github.com/knative-sandbox/kn-plugin-func/commit/bc6383e55c89349e8e25a79e0f90be1760818e50)) + + +### Documentation + +* add a language pack "contract" document ([#918](https://github.com/knative-sandbox/kn-plugin-func/issues/918)) ([76c647a](https://github.com/knative-sandbox/kn-plugin-func/commit/76c647a1c72f57efa8fad89c6802796d02254bd0)) + + +### Miscellaneous + +* add release process and func_darwin_arm64 to the release artifacts ([#945](https://github.com/knative-sandbox/kn-plugin-func/issues/945)) ([4e369a0](https://github.com/knative-sandbox/kn-plugin-func/commit/4e369a013ac3109bfea06dc730082b22f6d1cf36)) +* add version.txt to .gitattributes for style ([#966](https://github.com/knative-sandbox/kn-plugin-func/issues/966)) ([23d1188](https://github.com/knative-sandbox/kn-plugin-func/commit/23d118831923bf798c5d839c276382f48c048a32)) +* clean Repository and Runtimes structs ([#973](https://github.com/knative-sandbox/kn-plugin-func/issues/973)) ([e502d55](https://github.com/knative-sandbox/kn-plugin-func/commit/e502d554c8aafacc0f4d75bb7f6e1aef57e218fa)) +* **deps:** bump faas-js-runtime version ([#1000](https://github.com/knative-sandbox/kn-plugin-func/issues/1000)) ([83c081d](https://github.com/knative-sandbox/kn-plugin-func/commit/83c081d34a08b4775787c61eb00f9ca39cfcd33d)) +* templates ([#961](https://github.com/knative-sandbox/kn-plugin-func/issues/961)) ([34cb893](https://github.com/knative-sandbox/kn-plugin-func/commit/34cb893545a5f74a120783f66bb3a37d2b283d64)) +* update allocate script with latest knative ([#965](https://github.com/knative-sandbox/kn-plugin-func/issues/965)) ([4ffb1f9](https://github.com/knative-sandbox/kn-plugin-func/commit/4ffb1f9cba3ee1bac248a033ece6e8473965f7a7)) +* use paketo builders for all runtimes ([#1001](https://github.com/knative-sandbox/kn-plugin-func/issues/1001)) ([31c1d66](https://github.com/knative-sandbox/kn-plugin-func/commit/31c1d66eb3f0089541f8219f07722c75c8a82692)) + + + + +--- +### [0.23.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.23.0...v0.22.0) (2022-04-06) + + +### Features + +* command help text template preprocessing ([#875](https://github.com/knative-sandbox/kn-plugin-func/issues/875)) ([2bd5254](https://github.com/knative-sandbox/kn-plugin-func/commit/2bd5254f19a14d6aae9bd4a4b59971ef36e96fad)) +* invoke verbose metadata ([#944](https://github.com/knative-sandbox/kn-plugin-func/issues/944)) ([c3c1456](https://github.com/knative-sandbox/kn-plugin-func/commit/c3c1456ede7b471a271d0680107657ac0e4f0568)) +* on cluster build doens't require privileged cluster permissions ([#934](https://github.com/knative-sandbox/kn-plugin-func/issues/934)) ([e9251f5](https://github.com/knative-sandbox/kn-plugin-func/commit/e9251f518cc806768f0221f11e39f04fa4619537)) +* s2i builder with preliminary node support ([#923](https://github.com/knative-sandbox/kn-plugin-func/issues/923)) ([a91bcc5](https://github.com/knative-sandbox/kn-plugin-func/commit/a91bcc5fcfe66948c86ce3e33cf0d28230536f1c)), closes [#921](https://github.com/knative-sandbox/kn-plugin-func/issues/921) + + +### Bug Fixes + +* apply updated spring-boot-function dependency ([#936](https://github.com/knative-sandbox/kn-plugin-func/issues/936)) ([4a4cebb](https://github.com/knative-sandbox/kn-plugin-func/commit/4a4cebb1ea7226e7d7c1dbfb9e3fa8e5ec22c31d)) +* bind verbose flag to root ([#884](https://github.com/knative-sandbox/kn-plugin-func/issues/884)) ([25524a1](https://github.com/knative-sandbox/kn-plugin-func/commit/25524a1f8435cd310b45f283e987eee7a8736ceb)) +* full clone of template repos on add ([#904](https://github.com/knative-sandbox/kn-plugin-func/issues/904)) ([564a34b](https://github.com/knative-sandbox/kn-plugin-func/commit/564a34b3f53381bdd59262dcb78d2953f973c8bb)) +* minor typos in docs ([#862](https://github.com/knative-sandbox/kn-plugin-func/issues/862)) ([efc3b20](https://github.com/knative-sandbox/kn-plugin-func/commit/efc3b208cb5ab76f1eb73801501bcbfc23f16928)) +* use full root name for cmd help prefixes ([#873](https://github.com/knative-sandbox/kn-plugin-func/issues/873)) ([3f30c91](https://github.com/knative-sandbox/kn-plugin-func/commit/3f30c91116344b592bf392e92b63cb845b25428a)) + + +### Miscellaneous + +* add Apple M1 build in cross-platform target ([#932](https://github.com/knative-sandbox/kn-plugin-func/issues/932)) ([00d5a82](https://github.com/knative-sandbox/kn-plugin-func/commit/00d5a8272284ea40ebeefa4f22f12c2d375aadae)) +--- +## [0.22.0](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.21.2...v0.22.0) (2022-02-22) + +### Chore + +- Bump Node.js builder image to the latest paketo builder, removing a non-fatal warning that was issued at function startup. (#[8](https://github.com/knative-sandbox/kn-plugin-func/runs/5297690460?check_suite_focus=true#step:6:8)26, @lance) +- Update boson builder images to most recent versions (#8[10](https://github.com/knative-sandbox/kn-plugin-func/runs/5297690460?check_suite_focus=true#step:6:10), @matejvasek) + +### Enhancement + +- Adds the --build flag for 'func deploy' to the shell completions (#802, @matejvasek) + +### Documentation + +- Clarify podman requirements on Linux vs. MacOS and Linux in podman.md guide (#836, @matejvasek) + +### Bug or Regression + +- Fix a bug where interactive prompt defaults were not being used (#821, @lkingland) +- Fixes a bug during func create when confirm option is used with the go language runtime (#8[15](https://github.com/knative-sandbox/kn-plugin-func/runs/5297690460?check_suite_focus=true#step:6:15), @senthilnathan) +- Fixes a bug where the invoke and describe commands could fail if Knative Eventing is not installed on the cluster. (#8[23](https://github.com/knative-sandbox/kn-plugin-func/runs/5297690460?check_suite_focus=true#step:6:23), @lance) +- Fixes missing `cloudevent` invocation format for Node.js, SpringBoot and Rust CloudEvent templates (#846, @lance) + +### Uncategorized + +- Detects when deploying to OpenShift and use internal registry (#8[25](https://github.com/knative-sandbox/kn-plugin-func/runs/5297690460?check_suite_focus=true#step:6:25), @matejvasek) + +--- +## [0.21.2](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.21.1...v0.21.2) (2022-01-28) + +## What's Changed +* backport: bug fixes for 0.21 by @lance in https://github.com/knative-sandbox/kn-plugin-func/pull/793 + + +**Full Changelog**: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.21.1...v0.21.2 + +--- +## [0.21.1](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.21.0...v0.21.1) (2022-01-27) + +### Enhancement + +- Adds a label `function.knative.dev/name: functionName` to every resouce created for a Function ([#757](https://github.com/knative-sandbox/kn-plugin-func/pull/757), [@zroubalik](https://github.com/zroubalik)) +- Adds the ability to build a Function on the cluster using Tekton Pipelines. The build on the cluster is enabled by fetching Function source code from a remote Git repository. ([#743](https://github.com/knative-sandbox/kn-plugin-func/pull/743), [@zroubalik](https://github.com/zroubalik)) + +### Bug or Regression + +- Changes the springboot function templates to use the base builder instead of the tiny builder. ([#792](https://github.com/knative-sandbox/kn-plugin-func/pull/792), [@lance](https://github.com/lance)) + + +**Full Changelog**: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.21.0...v0.21.1 + +--- +## [0.21.0](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.20.0...v0.21.0) (2022-01-12) + + +### Features + +* add possibility to disable pushing of image in `deploy` command ([#736](https://www.github.com/knative-sandbox/kn-plugin-func/issues/736)) ([4e5a5e8](https://www.github.com/knative-sandbox/kn-plugin-func/commit/4e5a5e830799b73f65aba8ee248a52bf1c643acb)) +* add possibility to disable pushing of image in `deploy` command ([#739](https://www.github.com/knative-sandbox/kn-plugin-func/issues/739)) ([64ba17b](https://www.github.com/knative-sandbox/kn-plugin-func/commit/64ba17b4fbe9033e8279fa34aeebdb12edcee25d)) + +## [0.20.0](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.19.0...v0.20.0) (2021-12-20) + + +### ⚠ BREAKING CHANGES + +* use `function.knative.dev` for Functions related labels (#717) + +### Features + +* add flag to push image at the end of a successful build ([#681](https://www.github.com/knative-sandbox/kn-plugin-func/issues/681)) ([2f24182](https://www.github.com/knative-sandbox/kn-plugin-func/commit/2f241824ff3a2664a987fe742aed2f0b56aeb9ab)) +* add POD_NAME as an environment variable ([#660](https://www.github.com/knative-sandbox/kn-plugin-func/issues/660)) ([64473b7](https://www.github.com/knative-sandbox/kn-plugin-func/commit/64473b7197bb5a821b6724a8b914784891b1a828)) +* add telemetry to Node.js and TypeScript function templates ([#719](https://www.github.com/knative-sandbox/kn-plugin-func/issues/719)) ([d7cfe6e](https://www.github.com/knative-sandbox/kn-plugin-func/commit/d7cfe6ead76f15c4bcd34a132d0c17c02a149548)) +* allow build to be triggered from run when fn.Image is missing ([#644](https://www.github.com/knative-sandbox/kn-plugin-func/issues/644)) ([b190b52](https://www.github.com/knative-sandbox/kn-plugin-func/commit/b190b527542bf659f06bf931d94d09542d012c36)) +* allow push to cluster internal registries ([#718](https://www.github.com/knative-sandbox/kn-plugin-func/issues/718)) ([8d51393](https://www.github.com/knative-sandbox/kn-plugin-func/commit/8d51393181adca0c74a4b08cfb2dc2da390f983b)) +* automatically start podman service ([#648](https://www.github.com/knative-sandbox/kn-plugin-func/issues/648)) ([bfdfb76](https://www.github.com/knative-sandbox/kn-plugin-func/commit/bfdfb760cff575146764f9b841a0cafcb31bcd58)) +* custom default HTTP transport ([#711](https://www.github.com/knative-sandbox/kn-plugin-func/issues/711)) ([a13f897](https://www.github.com/knative-sandbox/kn-plugin-func/commit/a13f897fbb996dbfcb2120965745477321087a9c)) +* ensure config and repos path exists ([#683](https://www.github.com/knative-sandbox/kn-plugin-func/issues/683)) ([db9ad07](https://www.github.com/knative-sandbox/kn-plugin-func/commit/db9ad07c7048361946a8c7d45c549323eee44a58)) +* function creation timestamp ([#651](https://www.github.com/knative-sandbox/kn-plugin-func/issues/651)) ([1bf17ec](https://www.github.com/knative-sandbox/kn-plugin-func/commit/1bf17ec976130551da366e75b38f5169b3daed4e)) +* function version migrations ([#664](https://www.github.com/knative-sandbox/kn-plugin-func/issues/664)) ([ccf0015](https://www.github.com/knative-sandbox/kn-plugin-func/commit/ccf00152be0ceba1794267f8e03a09cb32fee514)) +* In cluster dialer to proxy TCP connections to unexposed services ([#688](https://www.github.com/knative-sandbox/kn-plugin-func/issues/688)) ([98ef5a0](https://www.github.com/knative-sandbox/kn-plugin-func/commit/98ef5a00356a5b93ef1a6c581ae8d5ba86ee09e4)) +* make SpringBoot template SpringNative by default ([#649](https://www.github.com/knative-sandbox/kn-plugin-func/issues/649)) ([c70a21e](https://www.github.com/knative-sandbox/kn-plugin-func/commit/c70a21e9a459d726a4118e177835082323698f83)) +* use `function.knative.dev` for Functions related labels ([#717](https://www.github.com/knative-sandbox/kn-plugin-func/issues/717)) ([feaf8f9](https://www.github.com/knative-sandbox/kn-plugin-func/commit/feaf8f91091afc21bcc3e99ed3098c9ff0679883)) + + +### Bug Fixes + +* make registry validation work again ([#690](https://www.github.com/knative-sandbox/kn-plugin-func/issues/690)) ([10f2cf4](https://www.github.com/knative-sandbox/kn-plugin-func/commit/10f2cf44c74884b4585114affd3c05cfba4f7613)) +* move integration port to unregistered range ([#701](https://www.github.com/knative-sandbox/kn-plugin-func/issues/701)) ([f63af0d](https://www.github.com/knative-sandbox/kn-plugin-func/commit/f63af0d34e97a549df51c47f12e22a7558504278)) +* remove stray manifest.yaml files ([#628](https://www.github.com/knative-sandbox/kn-plugin-func/issues/628)) ([c810efc](https://www.github.com/knative-sandbox/kn-plugin-func/commit/c810efc7a4eb0d87f37f3acfafc46c1e4639fdc4)) +* remove template manifest from final Function ([#703](https://www.github.com/knative-sandbox/kn-plugin-func/issues/703)) ([79ad65d](https://www.github.com/knative-sandbox/kn-plugin-func/commit/79ad65ddf42b1bfffacd3f6fe4d606885b1a3766)) +* revert hostname alias ([#712](https://www.github.com/knative-sandbox/kn-plugin-func/issues/712)) ([07062c1](https://www.github.com/knative-sandbox/kn-plugin-func/commit/07062c144aa19e4eb4c4ef27d5c5cb1ebb8eb185)) +* schema-generate should point to `function.go` ([#677](https://www.github.com/knative-sandbox/kn-plugin-func/issues/677)) ([c7d18c8](https://www.github.com/knative-sandbox/kn-plugin-func/commit/c7d18c89edaf0a4fcb5c7b684e5e151c217430c2)) +* use default socket path for TCP connections ([#669](https://www.github.com/knative-sandbox/kn-plugin-func/issues/669)) ([ee96bef](https://www.github.com/knative-sandbox/kn-plugin-func/commit/ee96bef9aea34c9370cf1f871bc4c558ed449a13)) +* use specific version of paketo builder ([#670](https://www.github.com/knative-sandbox/kn-plugin-func/issues/670)) ([834e8ae](https://www.github.com/knative-sandbox/kn-plugin-func/commit/834e8ae46c833d2052171dc8dde23648a1da5112)) + +## [0.19.0](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.18.0...v0.19.0) (2021-11-03) + + +### ⚠ BREAKING CHANGES + +* rename event templates to 'cloudevents' (#584) + +### Features + +* add support for manifest.yaml at repo/language/template levels ([#558](https://www.github.com/knative-sandbox/kn-plugin-func/issues/558)) ([e319ea3](https://www.github.com/knative-sandbox/kn-plugin-func/commit/e319ea3b62150ea2939876cb078ce150b7580bdf)) +* allow developers to provide Build Envs to buildpacks in `func.yaml` ([#571](https://www.github.com/knative-sandbox/kn-plugin-func/issues/571)) ([114a5fa](https://www.github.com/knative-sandbox/kn-plugin-func/commit/114a5faee3ab9ae1ec37ae5c4375c6218405c3b7)) +* create cli ([#547](https://www.github.com/knative-sandbox/kn-plugin-func/issues/547)) ([4fe9fdc](https://www.github.com/knative-sandbox/kn-plugin-func/commit/4fe9fdcab08552814c86d85194c552b591f52cd7)) +* Improve build performance ([#569](https://www.github.com/knative-sandbox/kn-plugin-func/issues/569)) ([ef7b986](https://www.github.com/knative-sandbox/kn-plugin-func/commit/ef7b986900e1eb6afd4203067aeac3dc99a4ede5)) +* periodically update progress during build ([#537](https://www.github.com/knative-sandbox/kn-plugin-func/issues/537)) ([01689e7](https://www.github.com/knative-sandbox/kn-plugin-func/commit/01689e7c131dd79db1e469c3ce54bd011464a6ef)) +* rename event templates to 'cloudevents' ([#584](https://www.github.com/knative-sandbox/kn-plugin-func/issues/584)) ([68b0904](https://www.github.com/knative-sandbox/kn-plugin-func/commit/68b0904b17dee5bc6a5ec71132d35c45d52f4b71)) +* Save password after user input ([#560](https://www.github.com/knative-sandbox/kn-plugin-func/issues/560)) ([e85a4aa](https://www.github.com/knative-sandbox/kn-plugin-func/commit/e85a4aa7f38681eb7554cac818eab7b1ca3bded1)) +* ssh connection to remote docker daemon ([#594](https://www.github.com/knative-sandbox/kn-plugin-func/issues/594)) ([e1f164d](https://www.github.com/knative-sandbox/kn-plugin-func/commit/e1f164d2ca6b0e720ebcf881b8d5fd123dfd0d82)) +* validation for registry/namespace to not contain image name ([#601](https://www.github.com/knative-sandbox/kn-plugin-func/issues/601)) ([cf9596c](https://www.github.com/knative-sandbox/kn-plugin-func/commit/cf9596c83e6eae8229ca61a18fafb5ba4df31d6b)) + + +### Bug Fixes + +* ConfigMap/Secret key validation ([#623](https://www.github.com/knative-sandbox/kn-plugin-func/issues/623)) ([0ed1e81](https://www.github.com/knative-sandbox/kn-plugin-func/commit/0ed1e816920b3e750c0aa0ed25fd1e0308e80a2e)) +* Environment values -> Environment variables ([#622](https://www.github.com/knative-sandbox/kn-plugin-func/issues/622)) ([ac9de9d](https://www.github.com/knative-sandbox/kn-plugin-func/commit/ac9de9dfc68969ecb825c9ee2a92aa9918ae5ea7)) +* hide a fmt.Println behind verbose flag ([#538](https://www.github.com/knative-sandbox/kn-plugin-func/issues/538)) ([ad4607b](https://www.github.com/knative-sandbox/kn-plugin-func/commit/ad4607bd50ae0c41ba0792d46318757089239de4)) +* improve error message when invalid function name is used ([#567](https://www.github.com/knative-sandbox/kn-plugin-func/issues/567)) ([0e3c676](https://www.github.com/knative-sandbox/kn-plugin-func/commit/0e3c6764ef716cf24a3f60676e139d0c61161693)) +* registry URL comparison ([#549](https://www.github.com/knative-sandbox/kn-plugin-func/issues/549)) ([b10c484](https://www.github.com/knative-sandbox/kn-plugin-func/commit/b10c48453cc5817c4c28077be13fc03baee5d818)) +* stop the progress ticker after build completes ([#544](https://www.github.com/knative-sandbox/kn-plugin-func/issues/544)) ([4f3e5fd](https://www.github.com/knative-sandbox/kn-plugin-func/commit/4f3e5fdb7a40a3419d8d731d5a0c916b81af069b)) +* update-pkger.sh sed error on osX ([#541](https://www.github.com/knative-sandbox/kn-plugin-func/issues/541)) ([25f8b4d](https://www.github.com/knative-sandbox/kn-plugin-func/commit/25f8b4d6ead2f47c3ab6541e2bdb5016b4a423aa)) + +## [0.18.0](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.17.1...v0.18.0) (2021-09-16) + + +### ⚠ BREAKING CHANGES + +* change `describe` command to `info` (#474) +* use key&value for Labels (#472) + +### Features + +* allow language packs to set function metadata ([#465](https://www.github.com/knative-sandbox/kn-plugin-func/issues/465)) ([48f40c3](https://www.github.com/knative-sandbox/kn-plugin-func/commit/48f40c35e3a239d09d6a87fc4603ad21db46bc37)) +* builders/buildpacks configured in client ([#495](https://www.github.com/knative-sandbox/kn-plugin-func/issues/495)) ([668804e](https://www.github.com/knative-sandbox/kn-plugin-func/commit/668804e53e76ce153a887289efb2b05f88203a1f)) +* change `describe` command to `info` ([#474](https://www.github.com/knative-sandbox/kn-plugin-func/issues/474)) ([10a0757](https://www.github.com/knative-sandbox/kn-plugin-func/commit/10a07578e9f6ab6bbbb8028633b37e3400fd22bb)) +* client effective runtimes list ([#490](https://www.github.com/knative-sandbox/kn-plugin-func/issues/490)) ([e0aad6f](https://www.github.com/knative-sandbox/kn-plugin-func/commit/e0aad6f936067892e04a463f85ca46689714716c)) +* generate json schema for func.yaml ([#460](https://www.github.com/knative-sandbox/kn-plugin-func/issues/460)) ([8939f89](https://www.github.com/knative-sandbox/kn-plugin-func/commit/8939f89beae7d5b2f66bc18b921ca3059f89e629)) +* make func schema if config updated ([#468](https://www.github.com/knative-sandbox/kn-plugin-func/issues/468)) ([6ae2157](https://www.github.com/knative-sandbox/kn-plugin-func/commit/6ae215754930c8a1e1dc4b5cd0b8ef3d99bb2893)) +* move go, typescript and nodejs to paketo builders ([#485](https://www.github.com/knative-sandbox/kn-plugin-func/issues/485)) ([a4b15ad](https://www.github.com/knative-sandbox/kn-plugin-func/commit/a4b15ad9926112910251a8d74747e2db368c86e9)) +* repository and templates client api ([#475](https://www.github.com/knative-sandbox/kn-plugin-func/issues/475)) ([3f56a8f](https://www.github.com/knative-sandbox/kn-plugin-func/commit/3f56a8fd7a66b923294043bcaa68ad59b1228831)) +* repository management cli ([#514](https://www.github.com/knative-sandbox/kn-plugin-func/issues/514)) ([ae638c3](https://www.github.com/knative-sandbox/kn-plugin-func/commit/ae638c349c46c035bad74645bfc612380c871a85)) +* repository management client api ([#467](https://www.github.com/knative-sandbox/kn-plugin-func/issues/467)) ([9fd2475](https://www.github.com/knative-sandbox/kn-plugin-func/commit/9fd247557ae8ee30cc7c5f0107d80fa72fbe8086)) +* use key&value for Labels ([#472](https://www.github.com/knative-sandbox/kn-plugin-func/issues/472)) ([5569681](https://www.github.com/knative-sandbox/kn-plugin-func/commit/55696811e317a51767e09acab3d4d4e2abc6e982)) + + +### Bug Fixes + +* `build` should honor registry specified in `-r` ([#510](https://www.github.com/knative-sandbox/kn-plugin-func/issues/510)) ([8aba038](https://www.github.com/knative-sandbox/kn-plugin-func/commit/8aba038073f5584133eb3d08ba85289800e2e770)) +* `config labels` panic ([#493](https://www.github.com/knative-sandbox/kn-plugin-func/issues/493)) ([f2efbe5](https://www.github.com/knative-sandbox/kn-plugin-func/commit/f2efbe5b42a6e0af36ecc6be429a630312e0c6e5)) +* better cleanup before pkger run ([#479](https://www.github.com/knative-sandbox/kn-plugin-func/issues/479)) ([25b1d63](https://www.github.com/knative-sandbox/kn-plugin-func/commit/25b1d63b9c1b332e1d59e494af83bdc3a1f576e9)) +* control chars on progress listener for Windows OS ([#498](https://www.github.com/knative-sandbox/kn-plugin-func/issues/498)) ([1172a85](https://www.github.com/knative-sandbox/kn-plugin-func/commit/1172a85c80f834ff3958073bc36ff4a5173c9de6)) +* enable healt checks for Quarkus ([#477](https://www.github.com/knative-sandbox/kn-plugin-func/issues/477)) ([72a1cf8](https://www.github.com/knative-sandbox/kn-plugin-func/commit/72a1cf885e092340295cc6ace3580e7420640cda)) +* fast-fail on create if Function already exists ([#496](https://www.github.com/knative-sandbox/kn-plugin-func/issues/496)) ([25f7007](https://www.github.com/knative-sandbox/kn-plugin-func/commit/25f7007300c020b5a1d336740a2bbc2f546bf3da)) +* regenerate pkged.go ([#478](https://www.github.com/knative-sandbox/kn-plugin-func/issues/478)) ([c7b3af4](https://www.github.com/knative-sandbox/kn-plugin-func/commit/c7b3af41b8cac0b9edfb96d3a01230d2606e320a)) +* removal of repositories ([#524](https://www.github.com/knative-sandbox/kn-plugin-func/issues/524)) ([90c60b6](https://www.github.com/knative-sandbox/kn-plugin-func/commit/90c60b693d6b2dbb2c8edee27a7cf7b6e8d1c399)) +* support nested subdirs in remote templates ([#482](https://www.github.com/knative-sandbox/kn-plugin-func/issues/482)) ([fcf9e77](https://www.github.com/knative-sandbox/kn-plugin-func/commit/fcf9e77cb93808d28d0c60f3a0959fac605771fb)) +* use full image names ([#535](https://www.github.com/knative-sandbox/kn-plugin-func/issues/535)) ([16ee28c](https://www.github.com/knative-sandbox/kn-plugin-func/commit/16ee28c83debcc19092abb250ef20354eca09710)) + +### [0.17.1](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.17.0...v0.17.1) (2021-08-05) + + +### Bug Fixes + +* hide progress indicator if asking for creds ([#458](https://www.github.com/knative-sandbox/kn-plugin-func/issues/458)) ([79e2234](https://www.github.com/knative-sandbox/kn-plugin-func/commit/79e2234cbc62319f35b18a9b2a39ca4dffe89d4d)) +* use ascii chars in progress indicator on win ([#459](https://www.github.com/knative-sandbox/kn-plugin-func/issues/459)) ([6fd42a4](https://www.github.com/knative-sandbox/kn-plugin-func/commit/6fd42a421ea58a4e9e1b6b6bff3f97d1da99d349)) + +## [0.17.0](https://www.github.com/knative-sandbox/kn-plugin-func/compare/v0.16.0...v0.17.0) (2021-08-03) + + +### Features + +* Add proper example of configuring Rust functions. ([#436](https://www.github.com/knative-sandbox/kn-plugin-func/issues/436)) ([7656c40](https://www.github.com/knative-sandbox/kn-plugin-func/commit/7656c4097283ed54b9e5f0472947cff931973365)) +* add support for labels in func.yaml ([#373](https://www.github.com/knative-sandbox/kn-plugin-func/issues/373)) ([0dba677](https://www.github.com/knative-sandbox/kn-plugin-func/commit/0dba67751e5a4c594701d674b44b101a043e9a2c)) +* Configure Rust functions ([#430](https://www.github.com/knative-sandbox/kn-plugin-func/issues/430)) ([a08b843](https://www.github.com/knative-sandbox/kn-plugin-func/commit/a08b843a9c2639d6b237f4248341b35f3bd8b954)) +* print emit response output if it's a cloudevent ([#444](https://www.github.com/knative-sandbox/kn-plugin-func/issues/444)) ([a25b723](https://www.github.com/knative-sandbox/kn-plugin-func/commit/a25b723dbcd50d544566a385441cbdd883017947)) +* remote template repositories ([#437](https://www.github.com/knative-sandbox/kn-plugin-func/issues/437)) ([9db1a3d](https://www.github.com/knative-sandbox/kn-plugin-func/commit/9db1a3d902016d59e60b732de43bdf4be198334f)) + + +### Bug Fixes + +* closing stdout ([6f40b29](https://www.github.com/knative-sandbox/kn-plugin-func/commit/6f40b29d3e02193c51317a29737c20dc11730c5a)) +* do not trust builder when using podman ([#420](https://www.github.com/knative-sandbox/kn-plugin-func/issues/420)) ([894f4fe](https://www.github.com/knative-sandbox/kn-plugin-func/commit/894f4febda1d7da5d3f47e1003b29b339b1f8cd4)) +* fix unit tests for Node.js event templates ([#438](https://www.github.com/knative-sandbox/kn-plugin-func/issues/438)) ([d71532a](https://www.github.com/knative-sandbox/kn-plugin-func/commit/d71532a070b24ec70dd5b77221e11b53bd300e8d)) +* unnecessary template repackaging ([#449](https://www.github.com/knative-sandbox/kn-plugin-func/issues/449)) ([435d1ac](https://www.github.com/knative-sandbox/kn-plugin-func/commit/435d1ac2a39c4e3abf1a6518b05be3151d132a57)) +* update builders version ([#421](https://www.github.com/knative-sandbox/kn-plugin-func/issues/421)) ([771a230](https://www.github.com/knative-sandbox/kn-plugin-func/commit/771a2307a13d105a188a0fd2c2fa843f3a535277)) + +## [0.16.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.15.1...v0.16.0) (2021-06-23) + + +### ⚠ BREAKING CHANGES + +* change --trigger and --templates flags +* function signatures implied from trigger + +### Features + +* `func config envs` - interactive prompt ([#396](https://github.com/knative-sandbox/kn-plugin-func/issues/396)) ([83a9ca6](https://github.com/knative-sandbox/kn-plugin-func/commit/83a9ca684f1b74458b4804fe0e0efe5e95507077)) +* `func config volumes` - interactive prompt ([#391](https://github.com/knative-sandbox/kn-plugin-func/issues/391)) ([4ba95b6](https://github.com/knative-sandbox/kn-plugin-func/commit/4ba95b69a8926ef56773166951ab8fa577111d37)) +* add a URL output type for `func describe` ([#389](https://github.com/knative-sandbox/kn-plugin-func/issues/389)) ([947fcaa](https://github.com/knative-sandbox/kn-plugin-func/commit/947fcaa968a90efed4b6037cafa19e8fadda1fc7)), closes [#387](https://github.com/knative-sandbox/kn-plugin-func/issues/387) +* allow setting autoscaling options to deployed KService ([#374](https://github.com/knative-sandbox/kn-plugin-func/issues/374)) ([a937c49](https://github.com/knative-sandbox/kn-plugin-func/commit/a937c490b7e1ad31c3596f91c310c3f4560329fd)) +* allow setting resource requests/limits ([#386](https://github.com/knative-sandbox/kn-plugin-func/issues/386)) ([12c5cda](https://github.com/knative-sandbox/kn-plugin-func/commit/12c5cda8e2157a775e9fc0bb14fc051c5119f86a)) +* reference ConfigMaps in `envs` and `volumes` sections in config ([#371](https://github.com/knative-sandbox/kn-plugin-func/issues/371)) ([1dbb5ae](https://github.com/knative-sandbox/kn-plugin-func/commit/1dbb5aecbf73cd77a648eaff5e52c1c3ce282a67)) +* reference Secrets in `envs` and `volumes` sections in config ([#369](https://github.com/knative-sandbox/kn-plugin-func/issues/369)) ([9d7fd34](https://github.com/knative-sandbox/kn-plugin-func/commit/9d7fd346495b119e895747d747c1c0a5bacb988e)) +* Rust templates ([#376](https://github.com/knative-sandbox/kn-plugin-func/issues/376)) ([4711638](https://github.com/knative-sandbox/kn-plugin-func/commit/4711638495692e5b8fc1ccca34000c44afa3832c)) +* typed errors for templates use cases ([40f1027](https://github.com/knative-sandbox/kn-plugin-func/commit/40f10277a4efc3239bbec7a35586c3eabf3337ee)) + + +### Bug Fixes + +* disable selinux labeling ([6e8517c](https://github.com/knative-sandbox/kn-plugin-func/commit/6e8517c023fa815c616606640657344785dbe4ff)) +* password read on windows ([84f896b](https://github.com/knative-sandbox/kn-plugin-func/commit/84f896b3298fffe9c8aeec2706c83b6a0fb48141)) +* use credsStore ([88ea081](https://github.com/knative-sandbox/kn-plugin-func/commit/88ea081cc0addb644ca4a575735a6dd3393197a2)) + + +### Code Refactoring + +* change --trigger and --templates flags ([ce29ff6](https://github.com/knative-sandbox/kn-plugin-func/commit/ce29ff6285d68bc008fbf0cfbd956982044104bc)) +* function signatures implied from trigger ([b30e883](https://github.com/knative-sandbox/kn-plugin-func/commit/b30e883e671477ebfa217df03e6825778e84a3df)) + +### [0.15.1](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.15.0...v0.15.1) (2021-05-27) + + +### Bug Fixes + +* Revert "chore: bump Knative deps to 0.22.0 ([#358](https://github.com/knative-sandbox/kn-plugin-func/issues/358))" ([#366](https://github.com/knative-sandbox/kn-plugin-func/issues/366)) ([72584ce](https://github.com/knative-sandbox/kn-plugin-func/commit/72584ced0dc3af86852f56ce36171ba567481b41)) + +## [0.15.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.14.0...v0.15.0) (2021-05-26) + + +### ⚠ BREAKING CHANGES + +* **templates:** modify the nodejs event template to accept a cloudevent (#356) + +### Features + +* add 'kn func emit' command ([#332](https://github.com/knative-sandbox/kn-plugin-func/issues/332)) ([49594d9](https://github.com/knative-sandbox/kn-plugin-func/commit/49594d976627c593ff18e42086199225ddcf5130)) +* add typescript templates ([#355](https://github.com/knative-sandbox/kn-plugin-func/issues/355)) ([d3eafe2](https://github.com/knative-sandbox/kn-plugin-func/commit/d3eafe2a8451ebc28124b913f03c12e9359d5e30)) + + +### Bug Fixes + +* minor typos in node template docs ([#351](https://github.com/knative-sandbox/kn-plugin-func/issues/351)) ([ea0a75a](https://github.com/knative-sandbox/kn-plugin-func/commit/ea0a75a7ccb6d00b8c859ff4cd311ad33fb8dbc3)) + + +### src + +* **templates:** modify the nodejs event template to accept a cloudevent ([#356](https://github.com/knative-sandbox/kn-plugin-func/issues/356)) ([caf0659](https://github.com/knative-sandbox/kn-plugin-func/commit/caf0659900a79650bb11877ffaeadbc30be9f922)) + +## [0.14.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.13.0...v0.14.0) (2021-05-12) + + +### ⚠ BREAKING CHANGES + +* revert bump to go 1.16 and template changes (#340) + +### src + +* revert bump to go 1.16 and template changes ([#340](https://github.com/knative-sandbox/kn-plugin-func/issues/340)) ([2b025df](https://github.com/knative-sandbox/kn-plugin-func/commit/2b025df19942e990050ef344784662fe77fd7309)) + +## [0.13.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.12.1...v0.13.0) (2021-05-12) + + +### ⚠ BREAKING CHANGES + +* change envVars to env in func.yaml (#316) + +### Features + +* add support for annotations in func.yaml ([#314](https://github.com/knative-sandbox/kn-plugin-func/issues/314)) ([5feb0e2](https://github.com/knative-sandbox/kn-plugin-func/commit/5feb0e20f366f8dc46f339257d87419bc852753c)) +* add/improve spinner for build and deploy ([#322](https://github.com/knative-sandbox/kn-plugin-func/issues/322)) ([857b0fd](https://github.com/knative-sandbox/kn-plugin-func/commit/857b0fd19d2a716c804426196e907a3ad31d559e)) +* create templates archive on go generate ([63b7f11](https://github.com/knative-sandbox/kn-plugin-func/commit/63b7f1147176ce5cfd21c3b74094fcc8154298df)) +* function name matches KService name ([#317](https://github.com/knative-sandbox/kn-plugin-func/issues/317)) ([541e858](https://github.com/knative-sandbox/kn-plugin-func/commit/541e8586f7348fa92ee83f246ef34730b1801b9f)) +* positive error when runtimme or template unrecognized ([acc56b0](https://github.com/knative-sandbox/kn-plugin-func/commit/acc56b0900113ca68270bd3ac68310864e42b5a7)) +* preserve file modes using in-memory tar FS ([7dc772e](https://github.com/knative-sandbox/kn-plugin-func/commit/7dc772ec62536fc77b84b16550bf7d2a1f0b6a09)) +* support windows paths in embedded templates FS ([c2b2168](https://github.com/knative-sandbox/kn-plugin-func/commit/c2b216857bcc1e18555a2e41fa3ad675e75cf1c3)) +* usage of local evnvvar in func cfg file ([7f8e595](https://github.com/knative-sandbox/kn-plugin-func/commit/7f8e5954a939563486661a98198b22f41eebc195)) + + +### Bug Fixes + +* added checks on delete command test for lint ([94e387c](https://github.com/knative-sandbox/kn-plugin-func/commit/94e387c9326aed79ede95f36b97da4de97c42dec)) +* default for `--builder` flag ([06455f4](https://github.com/knative-sandbox/kn-plugin-func/commit/06455f4bac02e8581ae4471e72909ba9fe7dbd4d)) +* func delete with explicity name as argument ([#323](https://github.com/knative-sandbox/kn-plugin-func/issues/323)) with strict validation ([8ab0ba2](https://github.com/knative-sandbox/kn-plugin-func/commit/8ab0ba243ae4c40867a2426b2ca965559a03cd53)) +* lint issues ([895872a](https://github.com/knative-sandbox/kn-plugin-func/commit/895872aee76b44be739bd0eafb9f2cdcdc137494)) + + +### Code Refactoring + +* change envVars to env in func.yaml ([#316](https://github.com/knative-sandbox/kn-plugin-func/issues/316)) ([89ff286](https://github.com/knative-sandbox/kn-plugin-func/commit/89ff286a1f3afae655a2c724a05cb3bc3c281786)) + +### [0.12.1](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.12.0...v0.12.1) (2021-04-14) + + +### Bug Fixes + +* build needs to use legacy jar ([129dc5a](https://github.com/knative-sandbox/kn-plugin-func/commit/129dc5a8348dc8e4e14f5891871cf6b50ae35ccc)) + +## [0.12.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.11.0...v0.12.0) (2021-03-30) + + +### Features + +* add --build (default: true) flag to func deploy ([8a91cac](https://github.com/knative-sandbox/kn-plugin-func/commit/8a91cac6cc78b5cf56d5158f3eb03a4076a34ffe)) +* basic lifecycle integraiton tests ([8edd0df](https://github.com/knative-sandbox/kn-plugin-func/commit/8edd0df836055b33473f9a7774e8ae755f46ac2e)) +* integration tests target ([ddf4ab8](https://github.com/knative-sandbox/kn-plugin-func/commit/ddf4ab86c46912f78e56a52a14efcf89fd187103)) +* local cluster allocation, configuration and teardown ([9c499b6](https://github.com/knative-sandbox/kn-plugin-func/commit/9c499b69c4991b86e51127081cee7fb0fc34d554)) +* using custom docker daemon (e.g podman) ([6d2d8c6](https://github.com/knative-sandbox/kn-plugin-func/commit/6d2d8c63b01e12f6cf277c2cd18c3f7298ce86ab)) + + +### Bug Fixes + +* `func deploy` uses Docker API, not binary ([dc2fbee](https://github.com/knative-sandbox/kn-plugin-func/commit/dc2fbee67f7f2304bece83a9b4d4f051ed19cd61)) +* `func run` now uses Docker API, not binary ([db0945e](https://github.com/knative-sandbox/kn-plugin-func/commit/db0945ed3ecb9e6e4283a0cb478d39657c6803dc)) +* compare service names in integraiton tests ([1551d69](https://github.com/knative-sandbox/kn-plugin-func/commit/1551d69b5d287becaafdf3d5b99a6ba8da926fa6)) +* exposed port ([7ed2e86](https://github.com/knative-sandbox/kn-plugin-func/commit/7ed2e86d9672f285c1def490a3d325ceb9e8471f)) +* increase remove timeout to 120s ([80e366b](https://github.com/knative-sandbox/kn-plugin-func/commit/80e366b14234c184932d91db4188bdabb0742e7a)) +* sprint-boot template ([38fd673](https://github.com/knative-sandbox/kn-plugin-func/commit/38fd673fdbef1094558b32910a42fcdff2d8bb0c)) +* update pack dependency ([c3c2165](https://github.com/knative-sandbox/kn-plugin-func/commit/c3c21657b2bc3cba9e4ba87864d8fe0c5d4e43af)) + +## [0.11.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.10.0...v0.11.0) (2021-01-21) + + +### Features + +* add --all-namespaces flag to `func list` ([#242](https://github.com/knative-sandbox/kn-plugin-func/issues/242)) ([8e72fd2](https://github.com/knative-sandbox/kn-plugin-func/commit/8e72fd2eba9f4e6e5d3a0bd366215025ba1d1004)) + + +### Bug Fixes + +* change --format flag to --output for list and describe commands ([#248](https://github.com/knative-sandbox/kn-plugin-func/issues/248)) ([6470d9e](https://github.com/knative-sandbox/kn-plugin-func/commit/6470d9e57462bc8d3a30583cf146d4f466e2d5f7)) +* correct fn signatures in Go Events template ([#246](https://github.com/knative-sandbox/kn-plugin-func/issues/246)) ([5502492](https://github.com/knative-sandbox/kn-plugin-func/commit/55024921c26e044f83187cbd5510375d8702c6d9)) +* correcting broken merge ([#252](https://github.com/knative-sandbox/kn-plugin-func/issues/252)) ([8d1f5b8](https://github.com/knative-sandbox/kn-plugin-func/commit/8d1f5b833d86fa959e3386db73f7e1b07bdd6dfd)) +* fix the help text for the describe function ([#243](https://github.com/knative-sandbox/kn-plugin-func/issues/243)) ([5a3a0d6](https://github.com/knative-sandbox/kn-plugin-func/commit/5a3a0d6bdab4d01292c4c8f6011a3b67cadb8ef6)) +* print "No functions found in [ns] namespace" for kn func list ([#240](https://github.com/knative-sandbox/kn-plugin-func/issues/240)) ([61ea8d4](https://github.com/knative-sandbox/kn-plugin-func/commit/61ea8d4fc6e841f0f10151244f10131862bf181c)) +* set envVars when creating a function ([#250](https://github.com/knative-sandbox/kn-plugin-func/issues/250)) ([f0be048](https://github.com/knative-sandbox/kn-plugin-func/commit/f0be048c841be22fcd0d448fdecc0da33b8c77be)) + +## [0.10.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.9.0...v0.10.0) (2020-12-08) + + +### Features + +* add spring cloud function runtime and templates ([#231](https://github.com/knative-sandbox/kn-plugin-func/issues/231)) ([557361a](https://github.com/knative-sandbox/kn-plugin-func/commit/557361a37446953dc613ae30f59913f1924dedd3)) + + +### Bug Fixes + +* Fix plugin version output ([#233](https://github.com/knative-sandbox/kn-plugin-func/issues/233)) ([8a30ba1](https://github.com/knative-sandbox/kn-plugin-func/commit/8a30ba193da6097a141332212cbd64e5a1a708e8)) +* use image name for run command ([#238](https://github.com/knative-sandbox/kn-plugin-func/issues/238)) ([985906b](https://github.com/knative-sandbox/kn-plugin-func/commit/985906b0e1f692f94fc84e3e796893192d17bd4c)) + +## [0.9.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.8.0...v0.9.0) (2020-11-06) + + +### ⚠ BREAKING CHANGES + +* rename faas to function (#210) +* remove create cli subcommand (#180) + +### Features + +* Better output of build/deploy/delete commands ([#206](https://github.com/knative-sandbox/kn-plugin-func/issues/206)) ([ddbb95b](https://github.com/knative-sandbox/kn-plugin-func/commit/ddbb95b075a383fb1847be2c75fd2c216870c7f8)) +* change default runtime to Node.js HTTP ([#198](https://github.com/knative-sandbox/kn-plugin-func/issues/198)) ([61cb56a](https://github.com/knative-sandbox/kn-plugin-func/commit/61cb56aec3461e9f9b35282435dbc884999be2b3)) +* list command - improved output ([#205](https://github.com/knative-sandbox/kn-plugin-func/issues/205)) ([29ca077](https://github.com/knative-sandbox/kn-plugin-func/commit/29ca07768ca455debb7992ebbf09b2db2058f56d)) +* remove create cli subcommand ([#180](https://github.com/knative-sandbox/kn-plugin-func/issues/180)) ([57e1236](https://github.com/knative-sandbox/kn-plugin-func/commit/57e12362af18f48624a9c303c070846e1645e08d)) +* rename faas to function ([#210](https://github.com/knative-sandbox/kn-plugin-func/issues/210)) ([cd57692](https://github.com/knative-sandbox/kn-plugin-func/commit/cd57692c9d04fecb918abf4f15cd37d45592cf82)) + + +### Bug Fixes + +* `delete` and `deploy sub-commands respects func.yaml conf ([d562498](https://github.com/knative-sandbox/kn-plugin-func/commit/d5624980d5f31f98bc27e803ae94311491d4d078)) +* return JSON in Node.js event template ([#211](https://github.com/knative-sandbox/kn-plugin-func/issues/211)) ([beb838f](https://github.com/knative-sandbox/kn-plugin-func/commit/beb838ff43d04c7ccec63a26fbe2af9fb167ae1a)) + +## [0.8.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.7.0...v0.8.0) (2020-10-20) + + +### ⚠ BREAKING CHANGES + +* change all references of "repository" to "registry" for images (#156) +* combine deploy and update commands (#152) + +### Features + +* add health probes to node & go services ([#174](https://github.com/knative-sandbox/kn-plugin-func/issues/174)) ([95c1eb5](https://github.com/knative-sandbox/kn-plugin-func/commit/95c1eb5e59335cfee84ce536d086bd394268c81c)) +* introduce CloudEvent data as first parameter for event functions ([#172](https://github.com/knative-sandbox/kn-plugin-func/issues/172)) ([7451194](https://github.com/knative-sandbox/kn-plugin-func/commit/74511948cefc368d898ad05b911fded74d44b759)) +* user can set envvars ([5182487](https://github.com/knative-sandbox/kn-plugin-func/commit/5182487df218685867fda10c3d1983b4c035c08a)) +* **kn:** Enable faas to be integrated as plugin to kn ([#155](https://github.com/knative-sandbox/kn-plugin-func/issues/155)) ([85a5f47](https://github.com/knative-sandbox/kn-plugin-func/commit/85a5f475eb32269b9cced05fe36dc90f8befd000)) +* ability for users to specify custom builders ([#147](https://github.com/knative-sandbox/kn-plugin-func/issues/147)) ([c2b4a30](https://github.com/knative-sandbox/kn-plugin-func/commit/c2b4a304bd3fa7d020c71db9f4d79c80c98d86d3)) +* combine deploy and update commands ([#152](https://github.com/knative-sandbox/kn-plugin-func/issues/152)) ([d5839ea](https://github.com/knative-sandbox/kn-plugin-func/commit/d5839ea6c1e84e843ad643cc0611a82e2e6d2399)) +* fish completion ([d822303](https://github.com/knative-sandbox/kn-plugin-func/commit/d82230353d3d437e8f35e7f9ce3569988d765b42)) + + +### Bug Fixes + +* examples in readme ([5591e7f](https://github.com/knative-sandbox/kn-plugin-func/commit/5591e7fa2ca9584f03bf8d065778cd120ea9054f)) +* image parsing ([6a621a5](https://github.com/knative-sandbox/kn-plugin-func/commit/6a621a5186ffffec79e6f34c34681cc37eeaa0bd)) +* regenerate pkger files ([#183](https://github.com/knative-sandbox/kn-plugin-func/issues/183)) ([1d14a8c](https://github.com/knative-sandbox/kn-plugin-func/commit/1d14a8c10156098d66ef691f84ecce1bd25a6d88)) +* root cmd init ([ec5327d](https://github.com/knative-sandbox/kn-plugin-func/commit/ec5327d5201b57d6a33bcc7314332686582b676f)) +* stop using manually edited completion ([bf9b048](https://github.com/knative-sandbox/kn-plugin-func/commit/bf9b04881333fed6038251fa4de92368771840d9)) +* update quarkus templates ([ffc6a12](https://github.com/knative-sandbox/kn-plugin-func/commit/ffc6a123e469968865fef1ccb5f8d84a443baccb)) +* update to Knative 0.17 ([#145](https://github.com/knative-sandbox/kn-plugin-func/issues/145)) ([5fe7052](https://github.com/knative-sandbox/kn-plugin-func/commit/5fe70526e531e283c6704d9526e3cdd7ef64f9e1)) + + +### src + +* change all references of "repository" to "registry" for images ([#156](https://github.com/knative-sandbox/kn-plugin-func/issues/156)) ([e425c8f](https://github.com/knative-sandbox/kn-plugin-func/commit/e425c8f08183b333e56d5d3cfe74fc9e85a6c903)) + +## [0.7.0](https://github.com/knative-sandbox/kn-plugin-func/compare/v0.6.2...v0.7.0) (2020-09-24) + + +### Features + +* add local debugging to node.js templates ([#132](https://github.com/knative-sandbox/kn-plugin-func/issues/132)) ([1b0bb15](https://github.com/knative-sandbox/kn-plugin-func/commit/1b0bb15147889bb55ff33de1dc132cb0370d1da6)) +* decouple function name from function domain ([#127](https://github.com/knative-sandbox/kn-plugin-func/issues/127)) ([0258626](https://github.com/knative-sandbox/kn-plugin-func/commit/025862689ec8dc460a1ef6f4402151c18a072ba3)) +* default to no confirmation prompts for CLI commands ([566d8f9](https://github.com/knative-sandbox/kn-plugin-func/commit/566d8f9255d532e88e72d5bce122bebaee88bc81)) +* set builder images in templates and .faas.yaml ([#136](https://github.com/knative-sandbox/kn-plugin-func/issues/136)) ([d6e131f](https://github.com/knative-sandbox/kn-plugin-func/commit/d6e131f9153c20bd3edbf1441060610987fa5693)) +* **ci/cd:** add release-please for automated release management ([8a60c5e](https://github.com/knative-sandbox/kn-plugin-func/commit/8a60c5e0c44d28d2ff085e56299217e05e408df8)) + + +### Bug Fixes + +* correct value for config path and robustify ([#130](https://github.com/knative-sandbox/kn-plugin-func/issues/130)) ([fae27da](https://github.com/knative-sandbox/kn-plugin-func/commit/fae27dabc97c78cd98be400d296da6fc2fbeba65)) +* delete command ([284b77f](https://github.com/knative-sandbox/kn-plugin-func/commit/284b77f7ef6524195da958850131190399470375)) +* describe works without Eventing ([6c16e65](https://github.com/knative-sandbox/kn-plugin-func/commit/6c16e65d60543458f0b70c010d672cb4d45f6279)) +* sync package-lock.json ([#137](https://github.com/knative-sandbox/kn-plugin-func/issues/137)) ([02309a2](https://github.com/knative-sandbox/kn-plugin-func/commit/02309a24a1d8779fb69e4f67fa4f7faea705b2ba)) + +## [Unreleased] + + + +## [v0.6.2] - 2020-09-09 +### Build +- remove main branch from release + +### Fix +- update pkger generated files +- signature of HTTP go function in template + + + +## [v0.6.1] - 2020-09-09 +### Chore +- update quarkus version to 1.7.2.Final +- use organization-level secrets for image deployment +- **actions:** add binary uploads to develop branch CI ([#104](https://github.com/knative-sandbox/kn-plugin-func/issues/104)) + +### Docs +- initial Go template READMEs + +### Fix +- build releases from main branch only +- remove references to unused binaries appsody, kn, kubectl +- image override ([#88](https://github.com/knative-sandbox/kn-plugin-func/issues/88)) + +### Release +- v0.6.1 + +### Templates +- **node:** make node templates use npx [@redhat](https://github.com/redhat)/faas-js-runtime ([#99](https://github.com/knative-sandbox/kn-plugin-func/issues/99)) + + + +## [v0.6.0] - 2020-08-31 +### Chore +- build static binary + +### Docs +- fix function typos +- setting up remote access to kind clusters +- wireguard configuraiton for OS X +- Kind cluster provisioning and TLS +- separate repository and system docs +- getting started with kubernetes, reorganization. + +### Feat +- golangci-lint allow enum shorthand, use config file +- consolidate formatters - Replaces globally-scoped formatter function with methods - Defines enumerated Format types - Renames the 'output' flag 'format' due to confusion with command file descriptors - FunctionDescription now Function - Global verbose flag replaced with config struct based value throughout +- test suite +- consolidate knative client config construction +- cli usability enhancements and API simplification +- the `list` sub-command uses namespace +- version command respects verbose flag ([#61](https://github.com/knative-sandbox/kn-plugin-func/issues/61)) +- add init/build/deploy commands and customizable namespace ([#65](https://github.com/knative-sandbox/kn-plugin-func/issues/65)) +- JSON output for the `list` sub-command + +### Fix +- return fs errors on config creation +- serialize trigger on faas.config +- default k8s namespace to 'faas' per documentation + +### Fixup +- remove unnecessary WithVerbose option from progressListener + +### Release +- v0.6.0 + +### Test +- add test targets for go and quarkus templates ([#72](https://github.com/knative-sandbox/kn-plugin-func/issues/72)) + + + +## [v0.5.0] - 2020-07-31 +### Actions +- add CHANGELOG.md and a release target to Makefile ([#45](https://github.com/knative-sandbox/kn-plugin-func/issues/45)) + +### Build +- reduce build verbosity for cross-platform compilations +- update container latest tag when releasing + +### Chore +- add `-race` flag for tests +- add lint to GH actions CI + +### Feat +- build and release cross-platform binaries +- version prints semver first +- http template for Quarkus stack + +### Fix +- build using environmentally-defined settings for GOOS and GOARCH by default +- version flag + + + +## [v0.4.0] - 2020-07-17 +### Actions +- add automated releases of faas binary + + + +## [v0.3.0] - 2020-07-12 +### Docs +- improved description and initial setup + +### Fixup +- remove node_modules from embedded node/http +- actuall embed the template + +### Init +- add Node.js HTTP template + + + +## [v0.2.2] - 2020-07-08 + + +## [v0.2.1] - 2020-07-08 +### Feat +- remove dependency on `kn` binary + +### Fix +- remove dependency on `kubectl` binary +- remove dependency on `kn` binary +- creating new revision of ksvc + +### Style +- formatting + + + +## [v0.2.0] - 2020-06-11 +### Feat +- buildpacks + +### Fix +- buildpack image reference + + + +## [v0.1.0] - 2020-06-01 + + +## [v0.0.19] - 2020-05-29 + + +## [v0.0.18] - 2020-05-25 + + +## [v0.0.17] - 2020-05-11 +### Doc +- command description + +### Feat +- 'describe' sub-command for faas cli + + + +## v0.0.16 - 2020-04-27 +### Builder +- remove superfluous appsody deploy yaml after build + +### Deployer +- move domain to labels + +### Docs +- appsody with boson stacks config +- configuration additions +- configuration notes for repo namespace + +### Feat +- list sub-command for faas cli + +### Updater +- add kn-based implementation + + +[Unreleased]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.6.2...HEAD +[v0.6.2]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.6.1...v0.6.2 +[v0.6.1]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.6.0...v0.6.1 +[v0.6.0]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.5.0...v0.6.0 +[v0.5.0]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.4.0...v0.5.0 +[v0.4.0]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.3.0...v0.4.0 +[v0.3.0]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.2.2...v0.3.0 +[v0.2.2]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.2.1...v0.2.2 +[v0.2.1]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.2.0...v0.2.1 +[v0.2.0]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.1.0...v0.2.0 +[v0.1.0]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.0.19...v0.1.0 +[v0.0.19]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.0.18...v0.0.19 +[v0.0.18]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.0.17...v0.0.18 +[v0.0.17]: https://github.com/knative-sandbox/kn-plugin-func/compare/v0.0.16...v0.0.17 diff --git a/vendor/knative.dev/kn-plugin-func/CODE-OF-CONDUCT.md b/vendor/knative.dev/kn-plugin-func/CODE-OF-CONDUCT.md new file mode 100644 index 0000000000..355a52f827 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/CODE-OF-CONDUCT.md @@ -0,0 +1,3 @@ +## Knative Community Code of Conduct + +The [Knative Community Code of Conduct](https://github.com/knative/community/blob/main/CODE-OF-CONDUCT.md) is defined in the [Knative community repository](https://github.com/knative/community). diff --git a/vendor/knative.dev/kn-plugin-func/LICENSE b/vendor/knative.dev/kn-plugin-func/LICENSE new file mode 100644 index 0000000000..57bc88a15a --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/vendor/knative.dev/kn-plugin-func/Makefile b/vendor/knative.dev/kn-plugin-func/Makefile new file mode 100644 index 0000000000..ea411c91cd --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/Makefile @@ -0,0 +1,181 @@ +# ## +# +# Run 'make help' for a summary +# +# ## + +# Binaries +BIN := func +BIN_DARWIN_AMD64 ?= $(BIN)_darwin_amd64 +BIN_DARWIN_ARM64 ?= $(BIN)_darwin_arm64 +BIN_LINUX ?= $(BIN)_linux_amd64 +BIN_WINDOWS ?= $(BIN)_windows_amd64.exe + +# Version +# A verbose version is built into the binary including a date stamp, git commit +# hash and the version tag of the current commit (semver) if it exists. +# If the current commit does not have a semver tag, 'tip' is used, unless there +# is a TAG environment variable. Precedence is git tag, environment variable, 'tip' +DATE := $(shell date -u +"%Y%m%dT%H%M%SZ") +HASH := $(shell git rev-parse --short HEAD 2>/dev/null) +VTAG := $(shell git tag --points-at HEAD) +VTAG := $(shell [ -z $(VTAG) ] && echo $(ETAG) || echo $(VTAG)) +VERS ?= $(shell [ -z $(VTAG) ] && echo 'tip' || echo $(VTAG) ) +LDFLAGS := "-X main.date=$(DATE) -X main.vers=$(VERS) -X main.hash=$(HASH)" + +# All Code prerequisites, including generated files, etc. +CODE := $(shell find . -name '*.go') zz_filesystem_generated.go go.mod schema/func_yaml-schema.json +TEMPLATES := $(shell find templates -name '*' -type f) + +.PHONY: test + +# Default Targets +all: build + +# Help Text +# Headings: lines with `##$` comment prefix +# Targets: printed if their line includes a `##` comment +help: + @echo 'Usage: make ... ' + @echo '' + @echo 'Available targets are:' + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + + +############### +##@ Development +############### + +build: $(BIN) ## (default) Build binary for current OS + +$(BIN): $(CODE) + env CGO_ENABLED=0 go build -ldflags $(LDFLAGS) ./cmd/$(BIN) + +test: $(CODE) ## Run core unit tests + go test -race -cover -coverprofile=coverage.out ./... + +check: bin/golangci-lint ## Check code quality (lint) + ./bin/golangci-lint run --timeout 300s + cd test/_e2e && ../../bin/golangci-lint run --timeout 300s + +bin/golangci-lint: + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./bin v1.43.0 + +.PHONY: clean_templates + +clean_templates: + # Removing temporary template files + @rm -f templates/go/cloudevents/go.sum + @rm -f templates/go/http/go.sum + @rm -rf templates/node/cloudevents/node_modules + @rm -rf templates/node/http/node_modules + @rm -rf templates/python/cloudevents/__pycache__ + @rm -rf templates/python/http/__pycache__ + @rm -rf templates/typescript/cloudevents/node_modules + @rm -rf templates/typescript/http/node_modules + @rm -rf templates/rust/cloudevents/target + @rm -rf templates/rust/http/target + @rm -rf templates/quarkus/cloudevents/target + @rm -rf templates/quarkus/http/target + @rm -rf templates/springboot/cloudevents/target + @rm -rf templates/springboot/http/target + @rm -f templates/**/.DS_Store + +.PHONY: zz_filesystem_generated.go + +zz_filesystem_generated.go: clean_templates + go generate filesystem.go + +.PHONY: clean + +clean: clean_templates ## Remove generated artifacts such as binaries and schemas + rm -f $(BIN) $(BIN_WINDOWS) $(BIN_LINUX) $(BIN_DARWIN_AMD64) $(BIN_DARWIN_ARM64) + rm -f schema/func_yaml-schema.json + rm -f coverage.out + + +############# +##@ Templates +############# + +test-templates: test-go test-node test-python test-quarkus test-rust test-typescript ## Run all template tests + +test-go: ## Test Go templates + cd templates/go/cloudevents && go mod tidy && go test + cd templates/go/http && go mod tidy && go test + +test-node: ## Test Node templates + cd templates/node/cloudevents && npm ci && npm test && rm -rf node_modules + cd templates/node/http && npm ci && npm test && rm -rf node_modules + +test-python: ## Test Python templates + cd templates/python/cloudevents && pip3 install -r requirements.txt && python3 test_func.py && rm -rf __pycache__ + cd templates/python/http && python3 test_func.py && rm -rf __pycache__ + +test-quarkus: ## Test Quarkus templates + cd templates/quarkus/cloudevents && mvn test && mvn clean + cd templates/quarkus/http && mvn test && mvn clean + +test-rust: ## Test Rust templates + cd templates/rust/cloudevents && cargo test && cargo clean + cd templates/rust/http && cargo test && cargo clean + +test-typescript: ## Test Typescript templates + cd templates/typescript/cloudevents && npm ci && npm test && rm -rf node_modules build + cd templates/typescript/http && npm ci && npm test && rm -rf node_modules build + + +################### +##@ Extended Testing (cluster required) +################### + +test-integration: ## Run integration tests using an available cluster. + go test -tags integration ./... -v + +test-e2e: ## Run end-to-end tests using an available cluster. + ./test/e2e_lifecycle_tests.sh node + ./test/e2e_extended_tests.sh + +test-e2e-runtime: ## Run end-to-end lifecycle tests using an available cluster for a single runtime. + ./test/e2e_lifecycle_tests.sh $(runtime) + +###################### +##@ Release Artifacts +###################### + +cross-platform: darwin-arm64 darwin-amd64 linux windows ## Build all distributable (cross-platform) binaries + +darwin-arm64: $(BIN_DARWIN_ARM64) ## Build for mac M1 + +$(BIN_DARWIN_ARM64): zz_filesystem_generated.go + env CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o $(BIN_DARWIN_ARM64) -ldflags $(LDFLAGS) ./cmd/$(BIN) + +darwin-amd64: $(BIN_DARWIN_AMD64) ## Build for Darwin (macOS) + +$(BIN_DARWIN_AMD64): zz_filesystem_generated.go + env CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o $(BIN_DARWIN_AMD64) -ldflags $(LDFLAGS) ./cmd/$(BIN) + +linux: $(BIN_LINUX) ## Build for Linux + +$(BIN_LINUX): zz_filesystem_generated.go + env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o $(BIN_LINUX) -ldflags $(LDFLAGS) ./cmd/$(BIN) + +windows: $(BIN_WINDOWS) ## Build for Windows + +$(BIN_WINDOWS): zz_filesystem_generated.go + env CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o $(BIN_WINDOWS) -ldflags $(LDFLAGS) ./cmd/$(BIN) + +###################### +##@ Schemas +###################### +schema-generate: schema/func_yaml-schema.json ## Generate func.yaml schema +schema/func_yaml-schema.json: function.go + go run schema/generator/main.go + +schema-check: ## Check that func.yaml schema is up-to-date + mv schema/func_yaml-schema.json schema/func_yaml-schema-previous.json + make schema-generate + diff schema/func_yaml-schema.json schema/func_yaml-schema-previous.json ||\ + (echo "\n\nFunction config schema 'schema/func_yaml-schema.json' is obsolete, please run 'make schema-generate'.\n\n"; rm -rf schema/func_yaml-schema-previous.json; exit 1) + rm -rf schema/func_yaml-schema-previous.json + diff --git a/vendor/knative.dev/kn-plugin-func/README.md b/vendor/knative.dev/kn-plugin-func/README.md new file mode 100644 index 0000000000..096a2736c1 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/README.md @@ -0,0 +1,17 @@ +# Func + +[![CI Status](https://github.com/knative-sandbox/kn-plugin-func/actions/workflows/ci.yaml/badge.svg)](https://github.com/knative-sandbox/kn-plugin-func/actions/workflows/ci.yaml) +[![Client API Documentation](https://pkg.go.dev/badge/knative.dev/kn-plugin-func?utm_source=godoc)](https://pkg.go.dev/knative.dev/kn-plugin-func) +[![Issues](https://img.shields.io/github/issues/knative-sandbox/kn-plugin-func.svg)](https://github.com/knative-sandbox/kn-plugin-func/issues) +[![License](https://img.shields.io/github/license/knative-sandbox/kn-plugin-func)](https://github.com/knative-sandbox/kn-plugin-func/blob/main/LICENSE) +[![Releases](https://img.shields.io/github/v/release/knative-sandbox/kn-plugin-func.svg?label=Release)](https://github.com/knative-sandbox/kn-plugin-func/releases) + +`func` is a Client Library and CLI enabling the development and deployment of Functions. + +[Read the Documentation](docs/README.md) + +## Contributing + +We are always looking for contributions from the Function Developer community. For more information on how to participate, see the [Contribuiting Guide](docs/CONTRIBUTING.md) + +The `func` Task Force meets @ 10:30 PST every Tuesday, we'd love to have you! For more information, see the invitation on the [Knative Team Calendar](https://calendar.google.com/calendar/u/0/embed?src=knative.team_9q83bg07qs5b9rrslp5jor4l6s@group.calendar.google.com). diff --git a/vendor/knative.dev/kn-plugin-func/ci b/vendor/knative.dev/kn-plugin-func/ci new file mode 100644 index 0000000000..422a0583e5 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/ci @@ -0,0 +1 @@ +Thu 2 Jun 00:21:06 CEST 2022 diff --git a/vendor/knative.dev/kn-plugin-func/client.go b/vendor/knative.dev/kn-plugin-func/client.go new file mode 100644 index 0000000000..4a6188d275 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/client.go @@ -0,0 +1,973 @@ +package function + +import ( + "context" + "errors" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "runtime" + "runtime/debug" + "time" + + "github.com/mitchellh/go-homedir" +) + +const ( + // DefaultRegistry through which containers of Functions will be shuttled. + DefaultRegistry = "docker.io" + + // DefaultTemplate is the default Function signature / environmental context + // of the resultant function. All runtimes are expected to have at least + // one implementation of each supported function signature. Currently that + // includes an HTTP Handler ("http") and Cloud Events handler ("events") + DefaultTemplate = "http" + + // DefaultVersion is the initial value for string members whose implicit type + // is a semver. + DefaultVersion = "0.0.0" + + // DefaultConfigPath is used in the unlikely event that + // the user has no home directory (no ~), there is no + // XDG_CONFIG_HOME set, and no WithConfigPath was used. + DefaultConfigPath = ".config/func" + + // DefaultBuildType is the default build type for a Function + DefaultBuildType = BuildTypeLocal +) + +// Client for managing Function instances. +type Client struct { + repositoriesPath string // path to repositories + repositoriesURI string // repo URI (overrides repositories path) + verbose bool // print verbose logs + builder Builder // Builds a runnable image source + pusher Pusher // Pushes Funcation image to a remote + deployer Deployer // Deploys or Updates a Function + runner Runner // Runs the Function locally + remover Remover // Removes remote services + lister Lister // Lists remote services + describer Describer // Describes Function instances + dnsProvider DNSProvider // Provider of DNS services + registry string // default registry for OCI image tags + progressListener ProgressListener // progress listener + repositories *Repositories // Repositories management + templates *Templates // Templates management + instances *Instances // Function Instances management + transport http.RoundTripper // Customizable internal transport + pipelinesProvider PipelinesProvider // CI/CD pipelines management +} + +// ErrNotBuilt indicates the Function has not yet been built. +var ErrNotBuilt = errors.New("not built") + +// Builder of Function source to runnable image. +type Builder interface { + // Build a Function project with source located at path. + Build(context.Context, Function) error +} + +// Pusher of Function image to a registry. +type Pusher interface { + // Push the image of the Function. + // Returns Image Digest - SHA256 hash of the produced image + Push(ctx context.Context, f Function) (string, error) +} + +// Deployer of Function source to running status. +type Deployer interface { + // Deploy a Function of given name, using given backing image. + Deploy(context.Context, Function) (DeploymentResult, error) +} + +type DeploymentResult struct { + Status Status + URL string +} + +// Status of the Function from the DeploymentResult +type Status int + +const ( + Failed Status = iota + Deployed + Updated +) + +// Runner runs the Function locally. +type Runner interface { + // Run the Function, returning a Job with metadata, error channels, and + // a stop function.The process can be stopped by running the returned stop + // function, either on context cancellation or in a defer. + Run(context.Context, Function) (*Job, error) +} + +// Remover of deployed services. +type Remover interface { + // Remove the Function from remote. + Remove(ctx context.Context, name string) error +} + +// Lister of deployed functions. +type Lister interface { + // List the Functions currently deployed. + List(ctx context.Context) ([]ListItem, error) +} + +type ListItem struct { + Name string `json:"name" yaml:"name"` + Namespace string `json:"namespace" yaml:"namespace"` + Runtime string `json:"runtime" yaml:"runtime"` + URL string `json:"url" yaml:"url"` + Ready string `json:"ready" yaml:"ready"` +} + +// ProgressListener is notified of task progress. +type ProgressListener interface { + // SetTotal steps of the given task. + SetTotal(int) + // Increment to the next step with the given message. + Increment(message string) + // Complete signals completion, which is expected to be somewhat different + // than a step increment. + Complete(message string) + // Stopping indicates the process is in the state of stopping, such as when a + // context cancelation has been received + Stopping() + // Done signals a cessation of progress updates. Should be called in a defer + // statement to ensure the progress listener can stop any outstanding tasks + // such as synchronous user updates. + Done() +} + +// Describer of Function instances +type Describer interface { + // Describe the named Function in the remote environment. + Describe(ctx context.Context, name string) (Instance, error) +} + +// Instance data about the runtime state of a Function in a given environment. +// +// A Function instance is a logical running Function space, which share +// a unique route (or set of routes). Due to autoscaling and load balancing, +// there is a one to many relationship between a given route and processes. +// By default the system creates the 'local' and 'remote' named instances +// when a Function is run (locally) and deployed, respectively. +// See the .Instances(f) accessor for the map of named environments to these +// Function Information structures. +type Instance struct { + // Route is the primary route of a Function instance. + Route string + // Routes is the primary route plus any other route at which the Function + // can be contacted. + Routes []string `json:"routes" yaml:"routes"` + Name string `json:"name" yaml:"name"` + Image string `json:"image" yaml:"image"` + Namespace string `json:"namespace" yaml:"namespace"` + Subscriptions []Subscription `json:"subscriptions" yaml:"subscriptions"` +} + +// Subscriptions currently active to event sources +type Subscription struct { + Source string `json:"source" yaml:"source"` + Type string `json:"type" yaml:"type"` + Broker string `json:"broker" yaml:"broker"` +} + +// DNSProvider exposes DNS services necessary for serving the Function. +type DNSProvider interface { + // Provide the given name by routing requests to address. + Provide(Function) error +} + +// PipelinesProvider manages lifecyle of CI/CD pipelines used by a Function +type PipelinesProvider interface { + Run(context.Context, Function) error + Remove(context.Context, Function) error +} + +// New client for Function management. +func New(options ...Option) *Client { + // Instantiate client with static defaults. + c := &Client{ + builder: &noopBuilder{output: os.Stdout}, + pusher: &noopPusher{output: os.Stdout}, + deployer: &noopDeployer{output: os.Stdout}, + runner: &noopRunner{output: os.Stdout}, + remover: &noopRemover{output: os.Stdout}, + lister: &noopLister{output: os.Stdout}, + describer: &noopDescriber{output: os.Stdout}, + dnsProvider: &noopDNSProvider{output: os.Stdout}, + progressListener: &NoopProgressListener{}, + pipelinesProvider: &noopPipelinesProvider{}, + repositoriesPath: filepath.Join(ConfigPath(), "repositories"), + transport: http.DefaultTransport, + } + for _, o := range options { + o(c) + } + + // Initialize sub-managers using now-fully-initialized client. + c.repositories = newRepositories(c) + c.templates = newTemplates(c) + c.instances = newInstances(c) + + // Trigger the creation of the config and repository paths + _ = ConfigPath() // Config is package-global scoped + _ = c.RepositoriesPath() // Repositories is Client-specific + + return c +} + +// The default config path is evaluated in the following order, from lowest +// to highest precedence. +// 1. The static default is DefaultConfigPath (./.config/func) +// 2. ~/.config/func if it exists (can be expanded: user has a home dir) +// 3. The value of $XDG_CONFIG_PATH/func if the environment variable exists. +// The path will be created if it does not already exist. +func ConfigPath() (path string) { + path = DefaultConfigPath + + // ~/.config/func is the default if ~ can be expanded + if home, err := homedir.Expand("~"); err == nil { + path = filepath.Join(home, ".config", "func") + } + + // 'XDG_CONFIG_HOME/func' takes precidence if defined + if xdg := os.Getenv("XDG_CONFIG_HOME"); xdg != "" { + path = filepath.Join(xdg, "func") + } + + mkdir(path) // make sure it exists + return +} + +// RepositoriesPath accesses the currently effective repositories path, +// which defaults to [ConfigPath]/repositories but can be set explicitly using +// the WithRepositoriesPath option when creating the client.. +// The path will be created if it does not already exist. +func (c *Client) RepositoriesPath() (path string) { + path = c.repositories.Path() + mkdir(path) // make sure it exists + return +} + +// RepositoriesPath is a convenience method for accessing the default path to +// repositories that will be used by new instances of a Client unless options +// such as WithRepositoriesPath are used to override. +// The path will be created if it does not already exist. +func RepositoriesPath() string { + return New().RepositoriesPath() +} + +// OPTIONS +// --------- + +// Option defines a Function which when passed to the Client constructor +// optionally mutates private members at time of instantiation. +type Option func(*Client) + +// WithVerbose toggles verbose logging. +func WithVerbose(v bool) Option { + return func(c *Client) { + c.verbose = v + } +} + +// WithBuilder provides the concrete implementation of a builder. +func WithBuilder(d Builder) Option { + return func(c *Client) { + c.builder = d + } +} + +// WithPusher provides the concrete implementation of a pusher. +func WithPusher(d Pusher) Option { + return func(c *Client) { + c.pusher = d + } +} + +// WithDeployer provides the concrete implementation of a deployer. +func WithDeployer(d Deployer) Option { + return func(c *Client) { + c.deployer = d + } +} + +// WithRunner provides the concrete implementation of a deployer. +func WithRunner(r Runner) Option { + return func(c *Client) { + c.runner = r + } +} + +// WithRemover provides the concrete implementation of a remover. +func WithRemover(r Remover) Option { + return func(c *Client) { + c.remover = r + } +} + +// WithLister provides the concrete implementation of a lister. +func WithLister(l Lister) Option { + return func(c *Client) { + c.lister = l + } +} + +// WithDescriber provides a concrete implementation of a Function describer. +func WithDescriber(describer Describer) Option { + return func(c *Client) { + c.describer = describer + } +} + +// WithProgressListener provides a concrete implementation of a listener to +// be notified of progress updates. +func WithProgressListener(p ProgressListener) Option { + return func(c *Client) { + c.progressListener = p + } +} + +// WithDNSProvider proivdes a DNS provider implementation for registering the +// effective DNS name which is either explicitly set via WithName or is derived +// from the root path. +func WithDNSProvider(provider DNSProvider) Option { + return func(c *Client) { + c.dnsProvider = provider + } +} + +// WithRepositoriesPath sets the location on disk to use for extensible template +// repositories. Extensible template repositories are additional templates +// that exist on disk and are not built into the binary. +func WithRepositoriesPath(path string) Option { + return func(c *Client) { + c.repositoriesPath = path + } +} + +// WithRepository sets a specific URL to a Git repository from which to pull +// templates. This setting's existence precldes the use of either the inbuilt +// templates or any repositories from the extensible repositories path. +func WithRepository(uri string) Option { + return func(c *Client) { + c.repositoriesURI = uri + } +} + +// WithRegistry sets the default registry which is consulted when an image name/tag +// is not explocitly provided. Can be fully qualified, including the registry +// (ex: 'quay.io/myname') or simply the namespace 'myname' which indicates the +// the use of the default registry. +func WithRegistry(registry string) Option { + return func(c *Client) { + c.registry = registry + } +} + +// WithTransport sets a custom transport to use internally. +func WithTransport(t http.RoundTripper) Option { + return func(c *Client) { + c.transport = t + } +} + +// WithPipelinesProvider sets implementation of provider responsible for CI/CD pipelines +func WithPipelinesProvider(pp PipelinesProvider) Option { + return func(c *Client) { + c.pipelinesProvider = pp + } +} + +// ACCESSORS +// --------- + +// Repositories accessor +func (c *Client) Repositories() *Repositories { + return c.repositories +} + +// Templates accessor +func (c *Client) Templates() *Templates { + return c.templates +} + +// Instances accessor +func (c *Client) Instances() *Instances { + return c.instances +} + +// Runtimes available in totality. +// Not all repository/template combinations necessarily exist, +// and further validation is performed when a template+runtime is chosen. +// from a given repository. This is the global list of all available. +// Returned list is unique and sorted. +func (c *Client) Runtimes() ([]string, error) { + runtimes := newSortedSet() + + // Gather all runtimes from all repositories + // into a uniqueness map + repositories, err := c.Repositories().All() + if err != nil { + return []string{}, err + } + for _, repo := range repositories { + for _, runtime := range repo.Runtimes { + runtimes.Add(runtime.Name) + } + } + + // Return a unique, sorted list of runtimes + return runtimes.Items(), nil +} + +// LIFECYCLE METHODS +// ----------------- + +// New Function. +// Use Create, Build and Deploy independently for lower level control. +func (c *Client) New(ctx context.Context, cfg Function) (err error) { + c.progressListener.SetTotal(3) + // Always start a concurrent routine listening for context cancellation. + // On this event, immediately indicate the task is canceling. + // (this is useful, for example, when a progress listener is mutating + // stdout, and a context cancelation needs to free up stdout entirely for + // the status or error from said cancelltion. + go func() { + <-ctx.Done() + c.progressListener.Stopping() + }() + + // Create Function at path indidcated by Config + if err = c.Create(cfg); err != nil { + return + } + + // Load the now-initialized Function. + f, err := NewFunction(cfg.Root) + if err != nil { + return + } + + // Build the now-initialized Function + c.progressListener.Increment("Building container image") + if err = c.Build(ctx, f.Root); err != nil { + return + } + + // Push the produced function image + c.progressListener.Increment("Pushing container image to registry") + if err = c.Push(ctx, f.Root); err != nil { + return + } + + // Deploy the initialized Function, returning its publicly + // addressible name for possible registration. + c.progressListener.Increment("Deploying Function to cluster") + if err = c.Deploy(ctx, f.Root); err != nil { + return + } + + // Create an external route to the Function + c.progressListener.Increment("Creating route to Function") + if err = c.Route(f.Root); err != nil { + return + } + + c.progressListener.Complete("Done") + + // TODO: use the knative client during deployment such that the actual final + // route can be returned from the deployment step, passed to the DNS Router + // for routing actual traffic, and returned here. + if c.verbose { + fmt.Printf("https://%v/\n", f.Name) + } + return +} + +// Create a new Function from the given defaults. +// will default to the absolute path of the current working directory. +// will default to the current working directory. +// When is provided but is not, a directory is created +// in the current working directory and used for . +func (c *Client) Create(cfg Function) (err error) { + // convert Root path to absolute + cfg.Root, err = filepath.Abs(cfg.Root) + if err != nil { + return + } + + // Create project root directory, if it doesn't already exist + if err = os.MkdirAll(cfg.Root, 0755); err != nil { + return + } + + // Create should never clobber a pre-existing Function + hasFunc, err := hasInitializedFunction(cfg.Root) + if err != nil { + return err + } + if hasFunc { + return fmt.Errorf("Function at '%v' already initialized", cfg.Root) + } + + // Path is defaulted to the current working directory + if cfg.Root == "" { + if cfg.Root, err = os.Getwd(); err != nil { + return + } + } + + // Name is defaulted to the directory of the given path. + if cfg.Name == "" { + cfg.Name = nameFromPath(cfg.Root) + } + + // The path for the new Function should not have any contentious files + // (hidden files OK, unless it's one used by Func) + if err := assertEmptyRoot(cfg.Root); err != nil { + return err + } + + // Create a new Function (in memory) + f := NewFunctionWith(cfg) + + // Create a .func diretory which is also added to a .gitignore + if err = createRuntimeDir(f); err != nil { + return + } + + // Write out the new Function's Template files. + // Templates contain values which may result in the Function being mutated + // (default builders, etc), so a new (potentially mutated) Function is + // returned from Templates.Write + err = c.Templates().Write(&f) + if err != nil { + return + } + + // Mark the Function as having been created + f.Created = time.Now() + if err = f.Write(); err != nil { + return + } + + // TODO: Create a status structure and return it for clients to use + // for output, such as from the CLI. + if c.verbose { + fmt.Printf("Builder: %s\n", f.Builder) + if len(f.Buildpacks) > 0 { + fmt.Println("Buildpacks:") + for _, b := range f.Buildpacks { + fmt.Printf(" ... %s\n", b) + } + } + fmt.Println("Function project created") + } + return +} + +// createRuntimeDir creates a .func directory in the root of the given +// Function which is also registered as ignored in .gitignore +// TODO: Mutate extant .gitignore file if it exists rather than failing +// if present (see contentious files in function.go), such that a user +// can `git init` a directory prior to `func init` in the same directory). +func createRuntimeDir(f Function) error { + if err := os.MkdirAll(filepath.Join(f.Root, RunDataDir), os.ModePerm); err != nil { + return err + } + + gitignore := ` +# Functions use the .func directory for local runtime data which should +# generally not be tracked in source control: +/.func +` + return os.WriteFile(filepath.Join(f.Root, ".gitignore"), []byte(gitignore), os.ModePerm) + +} + +// Build the Function at path. Errors if the Function is either unloadable or does +// not contain a populated Image. +func (c *Client) Build(ctx context.Context, path string) (err error) { + c.progressListener.Increment("Building function image") + + // If not logging verbosely, the ongoing progress of the build will not + // be streaming to stdout, and the lack of activity has been seen to cause + // users to prematurely exit due to the sluggishness of pulling large images + if !c.verbose { + c.printBuildActivity(ctx) // print friendly messages until context is canceled + } + + f, err := NewFunction(path) + if err != nil { + return + } + + // Derive Image from the path (precedence is given to extant config) + if f.Image, err = DerivedImage(path, c.registry); err != nil { + return + } + + if err = c.builder.Build(ctx, f); err != nil { + return + } + + // Write (save) - Serialize the Function to disk + // Will now contain populated image tag. + if err = f.Write(); err != nil { + return + } + + // TODO: create a status structure and return it here for optional + // use by the cli for user echo (rather than rely on verbose mode here) + message := fmt.Sprintf("🙌 Function image built: %v", f.Image) + if runtime.GOOS == "windows" { + message = fmt.Sprintf("Function image built: %v", f.Image) + } + c.progressListener.Increment(message) + return +} + +func (c *Client) printBuildActivity(ctx context.Context) { + m := []string{ + "Still building", + "Still building", + "Yes, still building", + "Don't give up on me", + "Still building", + "This is taking a while", + } + i := 0 + ticker := time.NewTicker(10 * time.Second) + go func() { + for { + select { + case <-ticker.C: + c.progressListener.Increment(m[i]) + i++ + i = i % len(m) + case <-ctx.Done(): + c.progressListener.Stopping() + ticker.Stop() + return + } + } + }() +} + +// Deploy the Function at path. Errors if the Function has not been +// initialized with an image tag. +func (c *Client) Deploy(ctx context.Context, path string) (err error) { + go func() { + <-ctx.Done() + c.progressListener.Stopping() + }() + + f, err := NewFunction(path) + if err != nil { + return + } + + // Functions must be built (have an associated image) before being deployed. + // Note that externally built images may be specified in the func.yaml + if !f.Built() { + return ErrNotBuilt + } + + // Deploy a new or Update the previously-deployed Function + c.progressListener.Increment("Deploying function to the cluster") + result, err := c.deployer.Deploy(ctx, f) + if result.Status == Deployed { + c.progressListener.Increment(fmt.Sprintf("Function deployed at URL: %v", result.URL)) + } else if result.Status == Updated { + c.progressListener.Increment(fmt.Sprintf("Function updated at URL: %v", result.URL)) + } + + return err +} + +// RunPipeline runs a Pipeline to Build and deploy the Function at path. +func (c *Client) RunPipeline(ctx context.Context, path string, git Git) (err error) { + go func() { + <-ctx.Done() + c.progressListener.Stopping() + }() + + f, err := NewFunction(path) + if err != nil { + err = fmt.Errorf("failed to laod function: %w", err) + return + } + f.Git = git + + // Build and deploy function using Pipeline + err = c.pipelinesProvider.Run(ctx, f) + if err != nil { + err = fmt.Errorf("failed to run pipeline: %w", err) + return + } + + return err +} + +func (c *Client) Route(path string) (err error) { + // Ensure that the allocated final address is enabled with the + // configured DNS provider. + // NOTE: + // DNS and TLS are provisioned by Knative Serving + cert-manager, + // but DNS subdomain CNAME to the Kourier Load Balancer is + // still manual, and the initial cluster config to suppot the TLD + // is still manual. + f, err := NewFunction(path) + if err != nil { + return + } + return c.dnsProvider.Provide(f) +} + +// Run the Function whose code resides at root. +// On start, the chosen port is sent to the provided started channel +func (c *Client) Run(ctx context.Context, root string) (job *Job, err error) { + go func() { + <-ctx.Done() + c.progressListener.Stopping() + }() + + // Load the Function + f, err := NewFunction(root) + if err != nil { + return + } + if !f.Initialized() { + // TODO: this needs a test. + err = fmt.Errorf("the given path '%v' does not contain an initialized "+ + "Function. Please create one at this path in order to run", root) + return + } + + // Run the Function, which returns a Job for use interacting (at arms length) + // with that running task (which is likely inside a container process). + if job, err = c.runner.Run(ctx, f); err != nil { + return + } + + // Return to the caller the effective port, a function to call to trigger + // stop, and a channel on which can be received runtime errors. + return job, nil +} + +// Info for a Function. Name takes precidence. If no name is provided, +// the Function defined at root is used. +func (c *Client) Info(ctx context.Context, name, root string) (d Instance, err error) { + go func() { + <-ctx.Done() + c.progressListener.Stopping() + }() + // If name is provided, it takes precidence. + // Otherwise load the Function defined at root. + if name != "" { + return c.describer.Describe(ctx, name) + } + + f, err := NewFunction(root) + if err != nil { + return d, err + } + if !f.Initialized() { + return d, fmt.Errorf("%v is not initialized", f.Name) + } + return c.describer.Describe(ctx, f.Name) +} + +// List currently deployed Functions. +func (c *Client) List(ctx context.Context) ([]ListItem, error) { + // delegate to concrete implementation of lister entirely. + return c.lister.List(ctx) +} + +// Remove a Function. Name takes precidence. If no name is provided, +// the Function defined at root is used if it exists. +func (c *Client) Remove(ctx context.Context, cfg Function, deleteAll bool) error { + go func() { + <-ctx.Done() + c.progressListener.Stopping() + }() + // If name is provided, it takes precidence. + // Otherwise load the Function defined at root. + functionName := cfg.Name + if cfg.Name == "" { + f, err := NewFunction(cfg.Root) + if err != nil { + return err + } + if !f.Initialized() { + return fmt.Errorf("Function at %v can not be removed unless initialized. Try removing by name", f.Root) + } + functionName = f.Name + cfg = f + } + + // Delete Knative Service and dependent resources in parallel + c.progressListener.Increment(fmt.Sprintf("Removing Knative Service: %v", functionName)) + errChan := make(chan error) + go func() { + errChan <- c.remover.Remove(ctx, functionName) + }() + + var errResources error + if deleteAll { + c.progressListener.Increment(fmt.Sprintf("Removing Knative Service '%v' and all dependent resources", functionName)) + errResources = c.pipelinesProvider.Remove(ctx, cfg) + } + + errService := <-errChan + + if errService != nil && errResources != nil { + return fmt.Errorf("%s\n%s", errService, errResources) + } else if errResources != nil { + return errResources + } + return errService +} + +// Invoke is a convenience method for triggering the execution of a Function +// for testing and development. Returned is a map of metadata and a stringified +// version of the content. +// The target argument is optional, naming the running instance of the Function +// which should be invoked. This can be the literal names "local" or "remote", +// or can be a URL to an arbitrary endpoint. If not provided, a running local +// instance is preferred, with the remote Function triggered if there is no +// locally running instance. +// Example: +// myClient.Invoke(myContext, myFunction, "local", NewInvokeMessage()) +// The message sent to the Function is defined by the invoke message. +// See NewInvokeMessage for its defaults. +// Functions are invoked in a manner consistent with the settings defined in +// their metadata. For example HTTP vs CloudEvent +func (c *Client) Invoke(ctx context.Context, root string, target string, m InvokeMessage) (metadata map[string][]string, body string, err error) { + go func() { + <-ctx.Done() + c.progressListener.Stopping() + }() + + f, err := NewFunction(root) + if err != nil { + return + } + + // See invoke.go for implementation details + return invoke(ctx, c, f, target, m, c.verbose) +} + +// Push the image for the named service to the configured registry +func (c *Client) Push(ctx context.Context, path string) (err error) { + f, err := NewFunction(path) + if err != nil { + return + } + + if !f.Built() { + return ErrNotBuilt + } + + imageDigest, err := c.pusher.Push(ctx, f) + if err != nil { + return + } + + // Record the Image Digest pushed. + f.ImageDigest = imageDigest + return f.Write() +} + +// DEFAULTS +// --------- + +// Manual implementations (noops) of required interfaces. +// In practice, the user of this client package (for example the CLI) will +// provide a concrete implementation for only the interfaces necessary to +// complete the given command. Integrators importing the package would +// provide a concrete implementation for all interfaces to be used. To +// enable partial definition (in particular used for testing) they +// are defaulted to noop implementations such that they can be provded +// only when necessary. Unit tests for the concrete implementations +// serve to keep the core logic here separate from the imperitive, and +// with a minimum of external dependencies. +// ----------------------------------------------------- + +// Builder +type noopBuilder struct{ output io.Writer } + +func (n *noopBuilder) Build(ctx context.Context, _ Function) error { return nil } + +// Pusher +type noopPusher struct{ output io.Writer } + +func (n *noopPusher) Push(ctx context.Context, f Function) (string, error) { return "", nil } + +// Deployer +type noopDeployer struct{ output io.Writer } + +func (n *noopDeployer) Deploy(ctx context.Context, _ Function) (DeploymentResult, error) { + return DeploymentResult{}, nil +} + +// Runner +type noopRunner struct{ output io.Writer } + +func (n *noopRunner) Run(context.Context, Function) (job *Job, err error) { + return +} + +// Remover +type noopRemover struct{ output io.Writer } + +func (n *noopRemover) Remove(context.Context, string) error { return nil } + +// Lister +type noopLister struct{ output io.Writer } + +func (n *noopLister) List(context.Context) ([]ListItem, error) { return []ListItem{}, nil } + +// Describer +type noopDescriber struct{ output io.Writer } + +func (n *noopDescriber) Describe(context.Context, string) (Instance, error) { + return Instance{}, errors.New("no describer provided") +} + +// PipelinesProvider +type noopPipelinesProvider struct{} + +func (n *noopPipelinesProvider) Run(ctx context.Context, _ Function) error { return nil } +func (n *noopPipelinesProvider) Remove(ctx context.Context, _ Function) error { return nil } + +// DNSProvider +type noopDNSProvider struct{ output io.Writer } + +func (n *noopDNSProvider) Provide(_ Function) error { return nil } + +// ProgressListener +type NoopProgressListener struct{} + +func (p *NoopProgressListener) SetTotal(i int) {} +func (p *NoopProgressListener) Increment(m string) {} +func (p *NoopProgressListener) Complete(m string) {} +func (p *NoopProgressListener) Stopping() {} +func (p *NoopProgressListener) Done() {} + +// mkdir attempts to mkdir, writing any errors to stderr. +func mkdir(path string) { + // Since it is expected that the code elsewhere never assume directories + // exist (doing so is a racing condition), it is valid to simply + // handle errors at this level. + if err := os.MkdirAll(path, 0700); err != nil { + fmt.Fprintf(os.Stderr, "Error creating '%v': %v", path, err) + debug.PrintStack() + } +} diff --git a/vendor/knative.dev/kn-plugin-func/config.go b/vendor/knative.dev/kn-plugin-func/config.go new file mode 100644 index 0000000000..ef56798be9 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/config.go @@ -0,0 +1,5 @@ +package function + +// Config is local and global configuration which is not "part of the Function" +// and is thus not likely to be tracked in source control. +type Config struct{} diff --git a/vendor/knative.dev/kn-plugin-func/filesystem.go b/vendor/knative.dev/kn-plugin-func/filesystem.go new file mode 100644 index 0000000000..0c4dc2a9dc --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/filesystem.go @@ -0,0 +1,250 @@ +package function + +import ( + "archive/zip" + "bytes" + "io" + "io/fs" + "os" + "path" + "path/filepath" + "strings" + + billy "github.com/go-git/go-billy/v5" +) + +// Filesystems +// Wrap the implementations of FS with their subtle differences into the +// common interface for accessing template files defined herein. +// os: standard for on-disk extensible template repositories. +// zip: embedded filesystem backed by the byte array representing zipfile. +// billy: go-git library's filesystem used for remote git template repos. + +type Filesystem interface { + fs.ReadDirFS + fs.StatFS +} + +type zipFS struct { + archive *zip.Reader +} + +func (z zipFS) Open(name string) (fs.File, error) { + return z.archive.Open(name) +} + +func (z zipFS) ReadDir(name string) ([]fs.DirEntry, error) { + var dirEntries []fs.DirEntry + for _, file := range z.archive.File { + cleanName := strings.TrimRight(file.Name, "/") + if path.Dir(cleanName) == name { + f, err := z.archive.Open(cleanName) + if err != nil { + return nil, err + } + fi, err := f.Stat() + if err != nil { + return nil, err + } + dirEntries = append(dirEntries, dirEntry{FileInfo: fi}) + } + } + return dirEntries, nil +} + +func (z zipFS) Stat(name string) (fs.FileInfo, error) { + f, err := z.archive.Open(name) + if err != nil { + return nil, err + } + return f.Stat() +} + +//go:generate go run ./generate/templates/main.go + +func newEmbeddedTemplatesFS() Filesystem { + archive, err := zip.NewReader(bytes.NewReader(templatesZip), int64(len(templatesZip))) + if err != nil { + panic(err) + } + return zipFS{ + archive: archive, + } +} + +var EmbeddedTemplatesFS Filesystem = newEmbeddedTemplatesFS() + +// billyFilesystem is a template file accessor backed by a billy FS +type billyFilesystem struct{ fs billy.Filesystem } + +type bfsFile struct { + billy.File + stats func() (fs.FileInfo, error) +} + +func (b bfsFile) Stat() (fs.FileInfo, error) { + return b.stats() +} + +func (b billyFilesystem) Open(name string) (fs.File, error) { + f, err := b.fs.Open(name) + if err != nil { + return nil, err + } + return bfsFile{ + File: f, + stats: func() (fs.FileInfo, error) { + return b.fs.Stat(name) + }}, nil +} + +type dirEntry struct { + fs.FileInfo +} + +func (d dirEntry) Type() fs.FileMode { + return d.Mode().Type() +} + +func (d dirEntry) Info() (fs.FileInfo, error) { + return d, nil +} + +func (b billyFilesystem) ReadDir(name string) ([]fs.DirEntry, error) { + fis, err := b.fs.ReadDir(name) + if err != nil { + return nil, err + } + var des = make([]fs.DirEntry, len(fis)) + for i, fi := range fis { + des[i] = dirEntry{fi} + } + return des, nil +} + +func (b billyFilesystem) Stat(name string) (fs.FileInfo, error) { + return b.fs.Stat(name) +} + +// osFilesystem is a template file accessor backed by the os. +type osFilesystem struct{ root string } + +func (o osFilesystem) Open(name string) (fs.File, error) { + name = filepath.FromSlash(name) + return os.Open(filepath.Join(o.root, name)) +} + +func (o osFilesystem) ReadDir(name string) ([]fs.DirEntry, error) { + name = filepath.FromSlash(name) + return os.ReadDir(filepath.Join(o.root, name)) +} + +func (o osFilesystem) Stat(name string) (fs.FileInfo, error) { + name = filepath.FromSlash(name) + return os.Stat(filepath.Join(o.root, name)) +} + +// subFS exposes subdirectory of underlying FS, this is similar to `chroot`. +type subFS struct { + root string + fs Filesystem +} + +func (o subFS) Open(name string) (fs.File, error) { + return o.fs.Open(path.Join(o.root, name)) +} + +func (o subFS) ReadDir(name string) ([]fs.DirEntry, error) { + return o.fs.ReadDir(path.Join(o.root, name)) +} + +func (o subFS) Stat(name string) (fs.FileInfo, error) { + return o.fs.Stat(path.Join(o.root, name)) +} + +type maskingFS struct { + masked func(path string) bool + fs Filesystem +} + +func (m maskingFS) Open(name string) (fs.File, error) { + if m.masked(name) { + return nil, &fs.PathError{Op: "open", Path: name, Err: fs.ErrNotExist} + } + return m.fs.Open(name) +} + +func (m maskingFS) ReadDir(name string) ([]fs.DirEntry, error) { + if m.masked(name) { + return nil, &fs.PathError{Op: "readdir", Path: name, Err: fs.ErrNotExist} + } + des, err := m.fs.ReadDir(name) + if err != nil { + return nil, err + } + result := make([]fs.DirEntry, 0, len(des)) + for _, de := range des { + if !m.masked(path.Join(name, de.Name())) { + result = append(result, de) + } + } + return result, nil +} + +func (m maskingFS) Stat(name string) (fs.FileInfo, error) { + if m.masked(name) { + return nil, &fs.PathError{Op: "stat", Path: name, Err: fs.ErrNotExist} + } + return m.fs.Stat(name) +} + +// copyFromFS copies files from the `src` dir on the accessor Filesystem to local filesystem into `dest` dir. +// The src path uses slashes as their separator. +// The dest path uses OS specific separator. +func copyFromFS(src, dest string, accessor Filesystem) (err error) { + + return fs.WalkDir(accessor, src, func(path string, de fs.DirEntry, err error) error { + if err != nil { + return err + } + + if path == src { + return nil + } + + p, err := filepath.Rel(filepath.FromSlash(src), filepath.FromSlash(path)) + if err != nil { + return err + } + + dest := filepath.Join(dest, p) + if de.IsDir() { + // Ideally we should use the file mode of the src node + // but it seems the git module is reporting directories + // as 0644 instead of 0755. For now, just do it this way. + // See https://github.com/go-git/go-git/issues/364 + // Upon resolution, return accessor.Stat(src).Mode() + return os.MkdirAll(dest, 0755) + } + fi, err := de.Info() + if err != nil { + return err + } + + destFile, err := os.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, fi.Mode()) + if err != nil { + return err + } + defer destFile.Close() + + srcFile, err := accessor.Open(path) + if err != nil { + return err + } + defer srcFile.Close() + + _, err = io.Copy(destFile, srcFile) + return err + }) + +} diff --git a/vendor/knative.dev/kn-plugin-func/function.go b/vendor/knative.dev/kn-plugin-func/function.go new file mode 100644 index 0000000000..7a2850a568 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/function.go @@ -0,0 +1,525 @@ +package function + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "regexp" + "strings" + "time" + + "gopkg.in/yaml.v2" +) + +// FunctionFile is the file used for the serialized form of a Function. +const FunctionFile = "func.yaml" + +type Function struct { + // Version at which this function is known to be compatible. + // More specifically, it is the highest migration which has been applied. + // For details see the .Migrated() and .Migrate() methods. + Version string `yaml:"version"` // semver format + + // Root on disk at which to find/create source and config files. + Root string `yaml:"-"` + + // Name of the Function. If not provided, path derivation is attempted when + // requried (such as for initialization). + Name string `yaml:"name" jsonschema:"pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"` + + // Namespace into which the Function is deployed on supported platforms. + Namespace string `yaml:"namespace"` + + // Runtime is the language plus context. nodejs|go|quarkus|rust etc. + Runtime string `yaml:"runtime"` + + // Template for the Function. + Template string `yaml:"-"` + + // Registry at which to store interstitial containers, in the form + // [registry]/[user]. + Registry string `yaml:"registry"` + + // Optional full OCI image tag in form: + // [registry]/[namespace]/[name]:[tag] + // example: + // quay.io/alice/my.function.name + // Registry is optional and is defaulted to DefaultRegistry + // example: + // alice/my.function.name + // If Image is provided, it overrides the default of concatenating + // "Registry+Name:latest" to derive the Image. + Image string `yaml:"image"` + + // SHA256 hash of the latest image that has been built + ImageDigest string `yaml:"imageDigest"` + + // BuildType represents the specified way of building the fuction + // ie. "local" or "git" + BuildType string `yaml:"build" jsonschema:"enum=local,enum=git"` + + // Git stores information about remote git repository, + // in case build type "git" is being used + Git Git `yaml:"git"` + + // Builder represents the CNCF Buildpack builder image for a function + Builder string `yaml:"builder"` + + // Map containing known builders. + // e.g. { "jvm": "docker.io/example/quarkus-jvm-builder" } + Builders map[string]string `yaml:"builders"` + + // BuilderImages define optional explicit builder images to use by + // builder implementations in leau of the in-code defaults. + // builderImages: + // pack: example.com/user/my-pack-node-builder + // s2i: example.com/user/my-s2i-node-builder + BuilderImages map[string]string `yaml:"builderImages,omitempty"` + + // Optional list of buildpacks to use when building the function + Buildpacks []string `yaml:"buildpacks"` + + // List of volumes to be mounted to the function + Volumes []Volume `yaml:"volumes"` + + // Build Env variables to be set + BuildEnvs []Env `yaml:"buildEnvs"` + + // Env variables to be set + Envs []Env `yaml:"envs"` + + // Map containing user-supplied annotations + // Example: { "division": "finance" } + Annotations map[string]string `yaml:"annotations"` + + // Options to be set on deployed function (scaling, etc.) + Options Options `yaml:"options"` + + // Map of user-supplied labels + Labels []Label `yaml:"labels"` + + // Health endpoints specified by the language pack + HealthEndpoints HealthEndpoints `yaml:"healthEndpoints"` + + // Created time is the moment that creation was successfully completed + // according to the client which is in charge of what constitutes being + // fully "Created" (aka initialized) + Created time.Time `yaml:"created"` + + // Invocation defines hints for use when invoking this function. + // See Client.Invoke for usage. + Invocation Invocation `yaml:"invocation,omitempty"` +} + +// HealthEndpoints specify the liveness and readiness endpoints for a Runtime +type HealthEndpoints struct { + Liveness string `yaml:"liveness,omitempty"` + Readiness string `yaml:"readiness,omitempty"` +} + +// BuildConfig defines builders and buildpacks +type BuildConfig struct { + Buildpacks []string `yaml:"buildpacks,omitempty"` + Builders map[string]string `yaml:"builders,omitempty"` +} + +// Invocation defines hints on how to accomplish a Function invocation. +type Invocation struct { + // Format indicates the expected format of the invocation. Either 'http' + // (a basic HTTP POST of standard form fields) or 'cloudevent' + // (a CloudEvents v2 formatted http request). + Format string `yaml:"format,omitempty"` + + // Protocol Note: + // Protocol is currently always HTTP. Method etc. determined by the single, + // simple switch of the Format field. +} + +// NewFunctionWith defaults as provided. +func NewFunctionWith(defaults Function) Function { + if defaults.Version == "" { + defaults.Version = DefaultVersion + } + if defaults.Template == "" { + defaults.Template = DefaultTemplate + } + if defaults.BuildType == "" { + defaults.BuildType = DefaultBuildType + } + return defaults +} + +// NewFunction from a given path. +// Invalid paths, or no Function at path are errors. +// Syntactic errors are returned immediately (yaml unmarshal errors). +// Functions which are syntactically valid are also then logically validated. +// Functions from earlier versions are brought up to current using migrations. +// Migrations are run prior to validators such that validation can omit +// concerning itself with backwards compatibility. Migrators must therefore +// selectively consider the minimal validation necesssary to ehable migration. +func NewFunction(path string) (f Function, err error) { + f.Root = path // path is not persisted, as this is the purvew of the FS itself + var filename = filepath.Join(path, FunctionFile) + if _, err = os.Stat(filename); err != nil { + return + } + bb, err := ioutil.ReadFile(filename) + if err != nil { + return + } + if err = yaml.UnmarshalStrict(bb, &f); err != nil { + err = formatUnmarshalError(err) // human-friendly unmarshalling errors + return + } + if f, err = f.Migrate(); err != nil { + return + } + return f, f.Validate() +} + +// Validate Function is logically correct, returning a bundled, and quite +// verbose, formatted error detailing any issues. +func (f Function) Validate() error { + if f.Name == "" { + return errors.New("function name is required") + } + if f.Runtime == "" { + return errors.New("function language runtime is required") + } + if f.Root == "" { + return errors.New("function root path is required") + } + + // if build type == git, we need to check that Git options are specified as well + mandatoryGitOption := false + if f.BuildType == BuildTypeGit { + mandatoryGitOption = true + } + + var ctr int + errs := [][]string{ + validateVolumes(f.Volumes), + ValidateBuildEnvs(f.BuildEnvs), + ValidateEnvs(f.Envs), + validateOptions(f.Options), + ValidateLabels(f.Labels), + ValidateBuildType(f.BuildType, true, false), + validateGit(f.Git, mandatoryGitOption), + } + + var b strings.Builder + b.WriteString(fmt.Sprintf("'%v' contains errors:", FunctionFile)) + + for _, ee := range errs { + if len(ee) > 0 { + b.WriteString("\n") // Precede each group of errors with a linebreak + } + for _, e := range ee { + ctr++ + b.WriteString("\t" + e) + } + } + + if ctr == 0 { + return nil // Return nil if there were no validation errors. + } + + return errors.New(b.String()) +} + +var envPattern = regexp.MustCompile(`^{{\s*(\w+)\s*:(\w+)\s*}}$`) + +// Interpolate Env slice +// Values with no special format are preserved as simple values. +// Values which do include the interpolation format (begin with {{) but are not +// keyed as "env" are also preserved as is. +// Values properly formated as {{ env:NAME }} are interpolated (substituted) +// with the value of the local environment variable "NAME", and an error is +// returned if that environment variable does not exist. +func Interpolate(ee []Env) (map[string]string, error) { + envs := make(map[string]string, len(ee)) + for _, e := range ee { + // Assert non-nil name. + if e.Name == nil { + return envs, errors.New("env name may not be nil") + } + // Nil value indicates the resultant map should not include this env var. + if e.Value == nil { + continue + } + k, v := *e.Name, *e.Value + + // Simple Values are preserved. + // If not prefixed by {{, no interpolation required (simple value) + if !strings.HasPrefix(v, "{{") { + envs[k] = v // no interpolation required. + continue + } + + // Values not matching the interpolation pattern are preserved. + // If not in the form "{{ env:XYZ }}" then return the value as-is for + // 0 1 2 3 + // possible match and interpolation in different ways. + parts := envPattern.FindStringSubmatch(v) + if len(parts) <= 2 || parts[1] != "env" { + envs[k] = v + continue + } + + // Properly formatted local env var references are interpolated. + localName := parts[2] + localValue, ok := os.LookupEnv(localName) + if !ok { + return envs, fmt.Errorf("expected environment variable '%v' not found", localName) + } + envs[k] = localValue + } + return envs, nil +} + +// nameFromPath returns the default name for a Function derived from a path. +// This consists of the last directory in the given path, if derivable (empty +// paths, paths consisting of all slashes, etc. return the zero value "") +func nameFromPath(path string) string { + pathParts := strings.Split(strings.TrimRight(path, string(os.PathSeparator)), string(os.PathSeparator)) + return pathParts[len(pathParts)-1] + /* the above may have edge conditions as it assumes the trailing value + * is a directory name. If errors are encountered, we _may_ need to use the + * inbuilt logic in the std lib and either check if the path indicated is a + * directory (appending slash) and then run: + base := filepath.Base(filepath.Dir(path)) + if base == string(os.PathSeparator) || base == "." { + return "" // Consider it underivable: string zero value + } + return base + */ +} + +// Write aka (save, serialize, marshal) the Function to disk at its path. +func (f Function) Write() (err error) { + path := filepath.Join(f.Root, FunctionFile) + var bb []byte + if bb, err = yaml.Marshal(&f); err != nil { + return + } + // TODO: open existing file for writing, such that existing permissions + // are preserved. + return ioutil.WriteFile(path, bb, 0644) +} + +// Initialized returns if the Function has been initialized. +// Any errors are considered failure (invalid or inaccessible root, config file, etc). +func (f Function) Initialized() bool { + return !f.Created.IsZero() +} + +// Built indicates the Function has been built. Does not guarantee the +// image indicated actually exists, just that it _should_ exist based off +// the current state of the Function object, in particular the value of +// the Image and ImageDiget fields. +func (f Function) Built() bool { + // If Image (the override) and ImageDigest (the most recent build stamp) are + // both empty, the Function is considered unbuilt. + // TODO: upgrade to a "build complete" timestamp. + return f.Image != "" || f.ImageDigest != "" +} + +// ImageWithDigest returns the full reference to the image including SHA256 Digest. +// If Digest is empty, image:tag is returned. +// TODO: Populate this only on a successful deploy, as this results on a dirty +// git tree on every build. +func (f Function) ImageWithDigest() string { + // Return image, if Digest is empty + if f.ImageDigest == "" { + return f.Image + } + + lastSlashIdx := strings.LastIndexAny(f.Image, "/") + imageAsBytes := []byte(f.Image) + + part1 := string(imageAsBytes[:lastSlashIdx+1]) + part2 := string(imageAsBytes[lastSlashIdx+1:]) + + // Remove tag from the image name and append SHA256 hash instead + return part1 + strings.Split(part2, ":")[0] + "@" + f.ImageDigest +} + +// DerivedImage returns the derived image name (OCI container tag) of the +// Function whose source is at root, with the default registry for when +// the image has to be calculated (derived). +// The following are equivalent due to the use of DefaultRegistry: +// registry: docker.io/myname +// myname +// A full image name consists of registry, image name and tag. +// in form [registry]/[image-name]:[tag] +// example docker.io/alice/my.example.func:latest +// Default if not provided is --registry (a required global setting) +// followed by the provided (or derived) image name. +// TODO: this calculated field should probably be generated on instantiation +// to avoid confusion. +func DerivedImage(root, registry string) (image string, err error) { + f, err := NewFunction(root) + if err != nil { + // an inability to load the Function means it is not yet initialized + // We could try to be smart here and fall through to the Function name + // deriviation logic, but that's likely to be confusing. Better to + // stay simple and say that derivation of Image depends on first having + // the Function initialized. + return + } + + // If the Function has already had image populated + // and a new registry hasn't been provided, use this pre-calculated value. + if f.Image != "" && f.Registry == registry { + image = f.Image + return + } + + // registry is currently required until such time as we support + // pushing to an implicitly-available in-cluster registry by default. + if registry == "" { + err = errors.New("registry name is required") + return + } + + // If the Function loaded, and there is not yet an Image set, then this is + // the first build and no explicit image override was specified. We should + // therefore derive the image tag from the defined registry and name. + // form: [registry]/[user]/[function]:latest + // example: quay.io/alice/my.function.name:latest + // Also nested namespaces should be supported: + // form: [registry]/[parent]/[user]/[function]:latest + // example: quay.io/project/alice/my.function.name:latest + registry = strings.Trim(registry, "/") // too defensive? + registryTokens := strings.Split(registry, "/") + if len(registryTokens) == 1 { + //namespace provided only 'alice' + image = DefaultRegistry + "/" + registry + "/" + f.Name + } else if len(registryTokens) == 2 || len(registryTokens) == 3 { + // registry/namespace provided `quay.io/alice` or registry/parent-namespace/namespace provided `quay.io/project/alice` + image = registry + "/" + f.Name + } else if len(registryTokens) > 3 { // the name of the image is also provided `quay.io/alice/my.function.name` + err = fmt.Errorf("registry should be either 'namespace', 'registry/namespace' or 'registry/parent/namespace', the name of the image will be derived from the function name.") + return + } + + // Explicitly append :latest. We currently expect source control to drive + // versioning, rather than rely on Docker Hub tags with explicit version + // numbers, as is seen in many serverless solutions. This will be updated + // to branch name when we add source-driven canary/ bluegreen deployments. + image = image + ":latest" + return +} + +// assertEmptyRoot ensures that the directory is empty enough to be used for +// initializing a new Function. +func assertEmptyRoot(path string) (err error) { + // If there exists contentious files (congig files for instance), this Function may have already been initialized. + files, err := contentiousFilesIn(path) + if err != nil { + return + } else if len(files) > 0 { + return fmt.Errorf("the chosen directory '%v' contains contentious files: %v. Has the Service Function already been created? Try either using a different directory, deleting the Function if it exists, or manually removing the files", path, files) + } + + // Ensure there are no non-hidden files, and again none of the aforementioned contentious files. + empty, err := isEffectivelyEmpty(path) + if err != nil { + return + } else if !empty { + err = errors.New("the directory must be empty of visible files and recognized config files before it can be initialized") + return + } + return +} + +// contentiousFiles are files which, if extant, preclude the creation of a +// Function rooted in the given directory. +var contentiousFiles = []string{ + FunctionFile, + ".gitignore", +} + +// contentiousFilesIn the given directory +func contentiousFilesIn(dir string) (contentious []string, err error) { + files, err := ioutil.ReadDir(dir) + for _, file := range files { + for _, name := range contentiousFiles { + if file.Name() == name { + contentious = append(contentious, name) + } + } + } + return +} + +// effectivelyEmpty directories are those which have no visible files +func isEffectivelyEmpty(dir string) (bool, error) { + // Check for any non-hidden files + files, err := ioutil.ReadDir(dir) + if err != nil { + return false, err + } + for _, file := range files { + if !strings.HasPrefix(file.Name(), ".") { + return false, nil + } + } + return true, nil +} + +// returns true if the given path contains an initialized Function. +func hasInitializedFunction(path string) (bool, error) { + var err error + var filename = filepath.Join(path, FunctionFile) + + if _, err = os.Stat(filename); err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err // invalid path or access error + } + bb, err := ioutil.ReadFile(filename) + if err != nil { + return false, err + } + f := Function{} + if err = yaml.UnmarshalStrict(bb, &f); err != nil { + return false, err + } + if f, err = f.Migrate(); err != nil { + return false, err + } + return f.Initialized(), nil +} + +// Format yaml unmarshall error to be more human friendly. +func formatUnmarshalError(err error) error { + var ( + e = err.Error() + rxp = regexp.MustCompile("not found in type .*") + header = fmt.Sprintf("'%v' is not valid:\n", FunctionFile) + ) + + if strings.HasPrefix(e, "yaml: unmarshal errors:") { + e = rxp.ReplaceAllString(e, "is not valid") + e = strings.Replace(e, "yaml: unmarshal errors:\n", header, 1) + } else if strings.HasPrefix(e, "yaml:") { + e = rxp.ReplaceAllString(e, "is not valid") + e = strings.Replace(e, "yaml: ", header+" ", 1) + } + + return errors.New(e) +} + +// Regex used during instantiation and validation of various Function fields +// by labels, envs, options, etc. +var ( + regWholeSecret = regexp.MustCompile(`^{{\s*secret:((?:\w|['-]\w)+)\s*}}$`) + regKeyFromSecret = regexp.MustCompile(`^{{\s*secret:((?:\w|['-]\w)+):([-._a-zA-Z0-9]+)\s*}}$`) + regWholeConfigMap = regexp.MustCompile(`^{{\s*configMap:((?:\w|['-]\w)+)\s*}}$`) + regKeyFromConfigMap = regexp.MustCompile(`^{{\s*configMap:((?:\w|['-]\w)+):([-._a-zA-Z0-9]+)\s*}}$`) + regLocalEnv = regexp.MustCompile(`^{{\s*env:(\w+)\s*}}$`) +) diff --git a/vendor/knative.dev/kn-plugin-func/function_buildtype.go b/vendor/knative.dev/kn-plugin-func/function_buildtype.go new file mode 100644 index 0000000000..d1a3c4585e --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/function_buildtype.go @@ -0,0 +1,55 @@ +package function + +import ( + "fmt" +) + +const ( + BuildTypeDisabled = "disabled" // in general, type "disabled" should be allowed only for "func deploy comamnd" related functionality + BuildTypeLocal = "local" + BuildTypeGit = "git" + //BuildTypeRemote = "remote" // TODO not supported yet +) + +func AllBuildTypes() []string { + return []string{BuildTypeLocal, BuildTypeGit, BuildTypeDisabled} +} + +// ValidateBuild validates input Build type option from Function config. +// If "allowUnset" is set to true, the specified type could be "" -> fallback to DefaultBuildType, +// this option should be used for validating func.yaml file, where users don't have to specify the build type. +// Type "disabled" is allowed only if parameter "allowDisabledBuildType" is set to true, +// in general type "disabled" should be allowed only for "func deploy command" related functionality. +func ValidateBuildType(build string, allowUnset, allowDisabledBuildType bool) (errors []string) { + valid := false + + switch build { + case BuildTypeLocal, BuildTypeGit: + valid = true + case BuildTypeDisabled: + if allowDisabledBuildType { + valid = true + } + case "": + if allowUnset { + valid = true + } + } + + if !valid { + return []string{fmt.Sprintf("specified build type \"%s\" is not valid, allowed build types are %s", build, SupportedBuildTypes(allowDisabledBuildType))} + } + return +} + +// SupportedBuildTypes prints string with supported build types, type "disabled" is +// returned only if parameter "allowDisabledBuildType" is set to true +// in general, type "disabled" should be allowed only for "deploy" related functionality +func SupportedBuildTypes(allowDisabledBuildType bool) string { + msg := "" + if allowDisabledBuildType { + msg = fmt.Sprintf("\"%s\", ", BuildTypeDisabled) + } + + return fmt.Sprintf("%s\"%s\" or \"%s\"", msg, BuildTypeLocal, BuildTypeGit) +} diff --git a/vendor/knative.dev/kn-plugin-func/function_envs.go b/vendor/knative.dev/kn-plugin-func/function_envs.go new file mode 100644 index 0000000000..ea244bc00a --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/function_envs.go @@ -0,0 +1,126 @@ +package function + +import ( + "fmt" + "strings" + + "knative.dev/kn-plugin-func/utils" +) + +type Env struct { + Name *string `yaml:"name,omitempty" jsonschema:"pattern=^[-._a-zA-Z][-._a-zA-Z0-9]*$"` + Value *string `yaml:"value"` +} + +func (e Env) String() string { + if e.Name == nil && e.Value != nil { + match := regWholeSecret.FindStringSubmatch(*e.Value) + if len(match) == 2 { + return fmt.Sprintf("All key=value pairs from Secret \"%s\"", match[1]) + } + match = regWholeConfigMap.FindStringSubmatch(*e.Value) + if len(match) == 2 { + return fmt.Sprintf("All key=value pairs from ConfigMap \"%s\"", match[1]) + } + } else if e.Name != nil && e.Value != nil { + match := regKeyFromSecret.FindStringSubmatch(*e.Value) + if len(match) == 3 { + return fmt.Sprintf("Env \"%s\" with value set from key \"%s\" from Secret \"%s\"", *e.Name, match[2], match[1]) + } + match = regKeyFromConfigMap.FindStringSubmatch(*e.Value) + if len(match) == 3 { + return fmt.Sprintf("Env \"%s\" with value set from key \"%s\" from ConfigMap \"%s\"", *e.Name, match[2], match[1]) + } + match = regLocalEnv.FindStringSubmatch(*e.Value) + if len(match) == 2 { + return fmt.Sprintf("Env \"%s\" with value set from local env variable \"%s\"", *e.Name, match[1]) + } + + return fmt.Sprintf("Env \"%s\" with value \"%s\"", *e.Name, *e.Value) + } + return "" +} + +// ValidateEnvs checks that input Envs are correct and contain all necessary fields. +// Returns array of error messages, empty if no errors are found +// +// Allowed settings: +// - name: EXAMPLE1 # ENV directly from a value +// value: value1 +// - name: EXAMPLE2 # ENV from the local ENV var +// value: {{ env:MY_ENV }} +// - name: EXAMPLE3 +// value: {{ secret:secretName:key }} # ENV from a key in secret +// - value: {{ secret:secretName }} # all key-pair values from secret are set as ENV +// - name: EXAMPLE4 +// value: {{ configMap:configMapName:key }} # ENV from a key in configMap +// - value: {{ configMap:configMapName }} # all key-pair values from configMap are set as ENV +func ValidateEnvs(envs []Env) (errors []string) { + for i, env := range envs { + if env.Name == nil && env.Value == nil { + errors = append(errors, fmt.Sprintf("env entry #%d is not properly set", i)) + } else if env.Value == nil { + errors = append(errors, fmt.Sprintf("env entry #%d is missing value field, only name '%s' is set", i, *env.Name)) + } else if env.Name == nil { + // all key-pair values from secret are set as ENV; {{ secret:secretName }} or {{ configMap:configMapName }} + if !regWholeSecret.MatchString(*env.Value) && !regWholeConfigMap.MatchString(*env.Value) { + errors = append(errors, fmt.Sprintf("env entry #%d has invalid value field set, it has '%s', but allowed is only '{{ secret:secretName }}' or '{{ configMap:configMapName }}'", + i, *env.Value)) + } + } else { + + if err := utils.ValidateEnvVarName(*env.Name); err != nil { + errors = append(errors, fmt.Sprintf("env entry #%d has invalid name set: %q; %s", i, *env.Name, err.Error())) + } + + if strings.HasPrefix(*env.Value, "{{") { + // ENV from the local ENV var; {{ env:MY_ENV }} + // or + // ENV from a key in secret/configMap; {{ secret:secretName:key }} or {{ configMap:configMapName:key }} + if !regLocalEnv.MatchString(*env.Value) && !regKeyFromSecret.MatchString(*env.Value) && !regKeyFromConfigMap.MatchString(*env.Value) { + errors = append(errors, + fmt.Sprintf( + "env entry #%d with name '%s' has invalid value field set, it has '%s', but allowed is only '{{ env:MY_ENV }}', '{{ secret:secretName:key }}' or '{{ configMap:configMapName:key }}'", + i, *env.Name, *env.Value)) + } + } + } + } + + return +} + +// ValidateBuildEnvs checks that input BuildEnvs are correct and contain all necessary fields. +// Returns array of error messages, empty if no errors are found +// +// Allowed settings: +// - name: EXAMPLE1 # ENV directly from a value +// value: value1 +// - name: EXAMPLE2 # ENV from the local ENV var +// value: {{ env:MY_ENV }} +func ValidateBuildEnvs(envs []Env) (errors []string) { + for i, env := range envs { + if env.Name == nil && env.Value == nil { + errors = append(errors, fmt.Sprintf("env entry #%d is not properly set", i)) + } else if env.Value == nil { + errors = append(errors, fmt.Sprintf("env entry #%d is missing value field, only name '%s' is set", i, *env.Name)) + } else { + + if err := utils.ValidateEnvVarName(*env.Name); err != nil { + errors = append(errors, fmt.Sprintf("env entry #%d has invalid name set: %q; %s", i, *env.Name, err.Error())) + } + + if strings.HasPrefix(*env.Value, "{{") { + // ENV from the local ENV var; {{ env:MY_ENV }} + if !regLocalEnv.MatchString(*env.Value) { + errors = append(errors, + fmt.Sprintf( + "env entry #%d with name '%s' has invalid value field set, it has '%s', but allowed is only '{{ env:MY_ENV }}'", + i, *env.Name, *env.Value)) + } + } + } + } + + return +} diff --git a/vendor/knative.dev/kn-plugin-func/function_git.go b/vendor/knative.dev/kn-plugin-func/function_git.go new file mode 100644 index 0000000000..f35a539ebd --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/function_git.go @@ -0,0 +1,40 @@ +package function + +import ( + "fmt" + "strings" + + giturls "github.com/whilp/git-urls" +) + +type Git struct { + URL *string `yaml:"url,omitempty"` + Revision *string `yaml:"revision,omitempty"` + ContextDir *string `yaml:"contextDir,omitempty"` +} + +// validateGit validates input Git option from Function config +// if mandatoryGit==true, it checks that Git options are specified (ie. build type == git) +func validateGit(git Git, mandatoryGit bool) (errors []string) { + if git.URL != nil { + _, err := giturls.ParseTransport(*git.URL) + if err != nil { + _, err = giturls.ParseScp(*git.URL) + } + if err != nil { + errMsg := fmt.Sprintf("specified option \"git.url=%s\" is not valid", *git.URL) + + originalErr := err.Error() + if !strings.HasSuffix(originalErr, "is not a valid transport") { + errMsg = fmt.Sprintf("%s, error: %s", errMsg, originalErr) + } + errors = append(errors, errMsg) + } + } else { + if mandatoryGit { + errors = append(errors, "\"git.url\" must be specified for this \"build\" type") + } + } + + return +} diff --git a/vendor/knative.dev/kn-plugin-func/function_labels.go b/vendor/knative.dev/kn-plugin-func/function_labels.go new file mode 100644 index 0000000000..87d55c3903 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/function_labels.go @@ -0,0 +1,75 @@ +package function + +import ( + "fmt" + "os" + "strings" + + "knative.dev/kn-plugin-func/utils" +) + +type Label struct { + // Key consist of optional prefix part (ended by '/') and name part + // Prefix part validation pattern: [a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)* + // Name part validation pattern: ([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9] + Key *string `yaml:"key" jsonschema:"pattern=^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\\/)?([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$"` + Value *string `yaml:"value,omitempty" jsonschema:"pattern=^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$"` +} + +func (l Label) String() string { + if l.Key != nil && l.Value == nil { + return fmt.Sprintf("Label with key \"%s\"", *l.Key) + } else if l.Key != nil && l.Value != nil { + match := regLocalEnv.FindStringSubmatch(*l.Value) + if len(match) == 2 { + return fmt.Sprintf("Label with key \"%s\" and value set from local env variable \"%s\"", *l.Key, match[1]) + } + return fmt.Sprintf("Label with key \"%s\" and value \"%s\"", *l.Key, *l.Value) + } + return "" +} + +// ValidateLabels checks that input labels are correct and contain all necessary fields. +// Returns array of error messages, empty if no errors are found +// +// Allowed settings: +// - key: EXAMPLE1 # label directly from a value +// value: value1 +// - key: EXAMPLE2 # label from the local ENV var +// value: {{ env:MY_ENV }} +func ValidateLabels(labels []Label) (errors []string) { + for i, label := range labels { + if label.Key == nil && label.Value == nil { + errors = append(errors, fmt.Sprintf("label entry #%d is not properly set", i)) + } else if label.Key == nil && label.Value != nil { + errors = append(errors, fmt.Sprintf("label entry #%d is missing key field, only value '%s' is set", i, *label.Value)) + } else { + if err := utils.ValidateLabelKey(*label.Key); err != nil { + errors = append(errors, fmt.Sprintf("label entry #%d has invalid key set: %q; %s", i, *label.Key, err.Error())) + } + if label.Value != nil { + if err := utils.ValidateLabelValue(*label.Value); err != nil { + errors = append(errors, fmt.Sprintf("label entry #%d has invalid value set: %q; %s", i, *label.Value, err.Error())) + } + + if strings.HasPrefix(*label.Value, "{{") { + // ENV from the local ENV var; {{ env:MY_ENV }} + if !regLocalEnv.MatchString(*label.Value) { + errors = append(errors, + fmt.Sprintf( + "label entry #%d with key '%s' has invalid value field set, it has '%s', but allowed is only '{{ env:MY_ENV }}'", + i, *label.Key, *label.Value)) + } else { + match := regLocalEnv.FindStringSubmatch(*label.Value) + value := os.Getenv(match[1]) + if err := utils.ValidateLabelValue(value); err != nil { + errors = append(errors, fmt.Sprintf("label entry #%d with key '%s' has invalid value when the environment is evaluated: '%s': %s", i, *label.Key, value, err.Error())) + } + } + } + } + } + } + + return +} diff --git a/vendor/knative.dev/kn-plugin-func/function_migrations.go b/vendor/knative.dev/kn-plugin-func/function_migrations.go new file mode 100644 index 0000000000..4863a58877 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/function_migrations.go @@ -0,0 +1,114 @@ +package function + +import ( + "time" + + "github.com/coreos/go-semver/semver" +) + +// Migrate applies any necessary migrations, returning a new migrated +// version of the Function. It is the caller's responsibility to +// .Write() the Function to persist to disk. +func (f Function) Migrate() (migrated Function, err error) { + // Return immediately if the Function indicates it has already been + // migrated. + if f.Migrated() { + return f, nil + } + + // If the version is empty, treat it as 0.0.0 + if f.Version == "" { + f.Version = DefaultVersion + } + + migrated = f // initially equivalent + for _, m := range migrations { + // Skip this migration if the current function's version is not less than + // the migration's applicable verion. + if !semver.New(migrated.Version).LessThan(*semver.New(m.version)) { + continue + } + // Apply this migration when the Function's version is less than that which + // the migration will impart. + migrated, err = m.migrate(migrated, m) + if err != nil { + return // fail fast on any migration errors + } + } + return +} + +// migration is a migration which should be applied to Functions whose version +// is below that indicated. +type migration struct { + version string // version before which this migration may be needed. + migrate migrator // Migrator migrates. +} + +// migrator is a function which returns a migrated copy of an inbound function. +type migrator func(Function, migration) (Function, error) + +// Migrated returns whether or not the Function has been migrated to the highest +// level the currently executing system is aware of (or beyond). +// returns true. +func (f Function) Migrated() bool { + // If the function has no Version, it is pre-migrations and is implicitly + // not migrated. + if f.Version == "" { + return false + } + + // lastMigration is the last registered migration. + lastMigration := semver.New(migrations[len(migrations)-1].version) + + // Fail the migration test if the Function's version is less than + // the latest available. + return !semver.New(f.Version).LessThan(*lastMigration) +} + +// Migrations registry +// ------------------- + +// migrations are all migrators in ascending order. +// No two migrations may have the exact version number (introduce a patch +// version for the migration if necessary) +var migrations = []migration{ + {"0.19.0", migrateToCreationStamp}, + // New Migrations Here. +} + +// Individual Migration implementations +// ------------------------------------ + +// migrateToCreationStamp is the initial migration which brings a Function from +// some unknown point in the past to the point at which it is versioned, +// migrated and includes a creation timestamp. Without this migration, +// instantiation of old functions will fail with a "Function at path X not +// initialized" in Func versions above v0.19.0 +// +// This migration must be aware of the difference between a Function which +// was previously created (but with no create stamp), and a Function which +// exists only in memory and should legitimately fail the .Initialized() check. +// The only way to know is to check a side-effect of earlier versions: +// are the .Name and .Runtime fields populated. This was the way the +// .Initialized check was implemented prior to versioning being introduced, so +// it is equivalent logically to use this here as well. + +// In summary: if the creation stamp is zero, but name and runtime fields are +// populated, then this is an old Function and should be migrated to having a +// create stamp. Otherwise, this is an in-memory (new) Function that is +// currently in the process of being created and as such need not be mutated +// to consider this migration having been evaluated. +func migrateToCreationStamp(f Function, m migration) (Function, error) { + // For functions with no creation timestamp, but appear to have been pre- + // existing, populate their create stamp and version. + // Yes, it's a little gnarly, but bootstrapping into the lovelieness of a + // versioned/migrated system takes cleaning up the trash. + if f.Created.IsZero() { // If there is no create stamp + if f.Name != "" && f.Runtime != "" { // and it appears to be an old Function + f.Created = time.Now() // Migrate it to having a timestamp. + } + } + f.Version = m.version // Record this migration was evaluated. + return f, nil +} diff --git a/vendor/knative.dev/kn-plugin-func/function_options.go b/vendor/knative.dev/kn-plugin-func/function_options.go new file mode 100644 index 0000000000..19d750a338 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/function_options.go @@ -0,0 +1,139 @@ +package function + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/api/resource" +) + +type Options struct { + Scale *ScaleOptions `yaml:"scale,omitempty"` + Resources *ResourcesOptions `yaml:"resources,omitempty"` +} + +type ScaleOptions struct { + Min *int64 `yaml:"min,omitempty" jsonschema_extras:"minimum=0"` + Max *int64 `yaml:"max,omitempty" jsonschema_extras:"minimum=0"` + Metric *string `yaml:"metric,omitempty" jsonschema:"enum=concurrency,enum=rps"` + Target *float64 `yaml:"target,omitempty" jsonschema_extras:"minimum=0.01"` + Utilization *float64 `yaml:"utilization,omitempty" jsonschema:"minimum=1,maximum=100"` +} + +type ResourcesOptions struct { + Requests *ResourcesRequestsOptions `yaml:"requests,omitempty"` + Limits *ResourcesLimitsOptions `yaml:"limits,omitempty"` +} + +type ResourcesLimitsOptions struct { + CPU *string `yaml:"cpu,omitempty" jsonschema:"pattern=^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$"` + Memory *string `yaml:"memory,omitempty" jsonschema:"pattern=^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$"` + Concurrency *int64 `yaml:"concurrency,omitempty" jsonschema_extras:"minimum=0"` +} + +type ResourcesRequestsOptions struct { + CPU *string `yaml:"cpu,omitempty" jsonschema:"pattern=^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$"` + Memory *string `yaml:"memory,omitempty" jsonschema:"pattern=^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$"` +} + +// validateOptions checks that input Options are correctly set. +// Returns array of error messages, empty if no errors are found +func validateOptions(options Options) (errors []string) { + + // options.scale + if options.Scale != nil { + if options.Scale.Min != nil { + if *options.Scale.Min < 0 { + errors = append(errors, fmt.Sprintf("options field \"scale.min\" has invalid value set: %d, the value must be greater than \"0\"", + *options.Scale.Min)) + } + } + + if options.Scale.Max != nil { + if *options.Scale.Max < 0 { + errors = append(errors, fmt.Sprintf("options field \"scale.max\" has invalid value set: %d, the value must be greater than \"0\"", + *options.Scale.Max)) + } + } + + if options.Scale.Min != nil && options.Scale.Max != nil { + if *options.Scale.Max < *options.Scale.Min { + errors = append(errors, "options field \"scale.max\" value must be greater or equal to \"scale.min\"") + } + } + + if options.Scale.Metric != nil { + if *options.Scale.Metric != "concurrency" && *options.Scale.Metric != "rps" { + errors = append(errors, fmt.Sprintf("options field \"scale.metric\" has invalid value set: %s, allowed is only \"concurrency\" or \"rps\"", + *options.Scale.Metric)) + } + } + + if options.Scale.Target != nil { + if *options.Scale.Target < 0.01 { + errors = append(errors, fmt.Sprintf("options field \"scale.target\" has value set to \"%f\", but it must not be less than 0.01", + *options.Scale.Target)) + } + } + + if options.Scale.Utilization != nil { + if *options.Scale.Utilization < 1 || *options.Scale.Utilization > 100 { + errors = append(errors, + fmt.Sprintf("options field \"scale.utilization\" has value set to \"%f\", but it must not be less than 1 or greater than 100", + *options.Scale.Utilization)) + } + } + } + + // options.resource + if options.Resources != nil { + + // options.resource.requests + if options.Resources.Requests != nil { + + if options.Resources.Requests.CPU != nil { + _, err := resource.ParseQuantity(*options.Resources.Requests.CPU) + if err != nil { + errors = append(errors, fmt.Sprintf("options field \"resources.requests.cpu\" has invalid value set: \"%s\"; \"%s\"", + *options.Resources.Requests.CPU, err.Error())) + } + } + + if options.Resources.Requests.Memory != nil { + _, err := resource.ParseQuantity(*options.Resources.Requests.Memory) + if err != nil { + errors = append(errors, fmt.Sprintf("options field \"resources.requests.memory\" has invalid value set: \"%s\"; \"%s\"", + *options.Resources.Requests.Memory, err.Error())) + } + } + } + + // options.resource.limits + if options.Resources.Limits != nil { + + if options.Resources.Limits.CPU != nil { + _, err := resource.ParseQuantity(*options.Resources.Limits.CPU) + if err != nil { + errors = append(errors, fmt.Sprintf("options field \"resources.limits.cpu\" has invalid value set: \"%s\"; \"%s\"", + *options.Resources.Limits.CPU, err.Error())) + } + } + + if options.Resources.Limits.Memory != nil { + _, err := resource.ParseQuantity(*options.Resources.Limits.Memory) + if err != nil { + errors = append(errors, fmt.Sprintf("options field \"resources.limits.memory\" has invalid value set: \"%s\"; \"%s\"", + *options.Resources.Limits.Memory, err.Error())) + } + } + + if options.Resources.Limits.Concurrency != nil { + if *options.Resources.Limits.Concurrency < 0 { + errors = append(errors, fmt.Sprintf("options field \"resources.limits.concurrency\" has value set to \"%d\", but it must not be less than 0", + *options.Resources.Limits.Concurrency)) + } + } + } + } + + return +} diff --git a/vendor/knative.dev/kn-plugin-func/function_volumes.go b/vendor/knative.dev/kn-plugin-func/function_volumes.go new file mode 100644 index 0000000000..fd85dd07b6 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/function_volumes.go @@ -0,0 +1,49 @@ +package function + +import "fmt" + +type Volume struct { + Secret *string `yaml:"secret,omitempty" jsonschema:"oneof_required=secret"` + ConfigMap *string `yaml:"configMap,omitempty" jsonschema:"oneof_required=configmap"` + Path *string `yaml:"path"` +} + +func (v Volume) String() string { + if v.ConfigMap != nil { + return fmt.Sprintf("ConfigMap \"%s\" mounted at path: \"%s\"", *v.ConfigMap, *v.Path) + } else if v.Secret != nil { + return fmt.Sprintf("Secret \"%s\" mounted at path: \"%s\"", *v.Secret, *v.Path) + } + + return "" +} + +// validateVolumes checks that input Volumes are correct and contain all necessary fields. +// Returns array of error messages, empty if no errors are found +// +// Allowed settings: +// - secret: example-secret # mount Secret as Volume +// path: /etc/secret-volume +// - configMap: example-configMap # mount ConfigMap as Volume +// path: /etc/configMap-volume +func validateVolumes(volumes []Volume) (errors []string) { + + for i, vol := range volumes { + if vol.Secret != nil && vol.ConfigMap != nil { + errors = append(errors, fmt.Sprintf("volume entry #%d is not properly set, both secret '%s' and configMap '%s' can not be set at the same time", + i, *vol.Secret, *vol.ConfigMap)) + } else if vol.Path == nil && vol.Secret == nil && vol.ConfigMap == nil { + errors = append(errors, fmt.Sprintf("volume entry #%d is not properly set", i)) + } else if vol.Path == nil { + if vol.Secret != nil { + errors = append(errors, fmt.Sprintf("volume entry #%d is missing path field, only secret '%s' is set", i, *vol.Secret)) + } else if vol.ConfigMap != nil { + errors = append(errors, fmt.Sprintf("volume entry #%d is missing path field, only configMap '%s' is set", i, *vol.ConfigMap)) + } + } else if vol.Path != nil && vol.Secret == nil && vol.ConfigMap == nil { + errors = append(errors, fmt.Sprintf("volume entry #%d is missing secret or configMap field, only path '%s' is set", i, *vol.Path)) + } + } + + return +} diff --git a/vendor/knative.dev/kn-plugin-func/go.mod b/vendor/knative.dev/kn-plugin-func/go.mod new file mode 100644 index 0000000000..b81066a240 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/go.mod @@ -0,0 +1,57 @@ +module knative.dev/kn-plugin-func + +go 1.16 + +require ( + github.com/AlecAivazis/survey/v2 v2.3.2 + github.com/Masterminds/semver v1.5.0 + github.com/Netflix/go-expect v0.0.0-20210722184520-ef0bf57d82b3 + github.com/alecthomas/jsonschema v0.0.0-20210526225647-edb03dcab7bc + github.com/buildpacks/pack v0.24.0 + github.com/cloudevents/sdk-go/v2 v2.8.0 + github.com/containers/image/v5 v5.19.1 + github.com/coreos/go-semver v0.3.0 + github.com/docker/cli v20.10.12+incompatible + github.com/docker/docker v20.10.12+incompatible + github.com/docker/docker-credential-helpers v0.6.4 + github.com/docker/go-connections v0.4.0 + github.com/go-git/go-billy/v5 v5.3.1 + github.com/go-git/go-git/v5 v5.4.2 + github.com/google/go-cmp v0.5.7 + github.com/google/go-containerregistry v0.8.1-0.20220414143355-892d7a808387 + github.com/google/uuid v1.3.0 + github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c + github.com/mitchellh/go-homedir v1.1.0 + github.com/openshift/source-to-image v1.3.1 + github.com/ory/viper v1.7.5 + github.com/pkg/errors v0.9.1 + github.com/spf13/cobra v1.3.0 + github.com/tektoncd/cli v0.23.1 + github.com/tektoncd/pipeline v0.34.1 + github.com/whilp/git-urls v1.0.0 + golang.org/x/crypto v0.0.0-20220214200702-86341886e292 + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce + gopkg.in/yaml.v2 v2.4.0 + k8s.io/api v0.23.5 + k8s.io/apimachinery v0.23.5 + k8s.io/client-go v1.5.2 + k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 + knative.dev/client v0.29.0 + knative.dev/eventing v0.29.2-0.20220420140829-ce4fe0990d23 + knative.dev/hack v0.0.0-20220128200847-51a42b2eb63e + knative.dev/networking v0.0.0-20220120045035-ec849677a316 // indirect + knative.dev/pkg v0.0.0-20220222214439-083dd97300e1 + knative.dev/serving v0.29.5 +) + +replace ( + // Tekton Triggers imports old google/cel-go, should be fixed with tektoncd/cli >=v0.24.x transitively + github.com/google/cel-go => github.com/google/cel-go v0.11.2 + // update docker to be compatible with version used by pack and removes invalid pseudo-version + github.com/openshift/source-to-image => github.com/boson-project/source-to-image v1.3.2 + // Pin k8s.io dependencies to align with Knative and Tekton needs + k8s.io/api => k8s.io/api v0.22.5 + k8s.io/apimachinery => k8s.io/apimachinery v0.22.5 + k8s.io/client-go => k8s.io/client-go v0.22.5 +) diff --git a/vendor/knative.dev/kn-plugin-func/go.sum b/vendor/knative.dev/kn-plugin-func/go.sum new file mode 100644 index 0000000000..e81a6804dc --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/go.sum @@ -0,0 +1,3929 @@ +4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA= +cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.67.0/go.mod h1:YNan/mUhNZFrYUor0vqrsQ0Ffl7Xtm/ACOy/vsTS858= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.92.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.1.0/go.mod h1:2NIffxgWfORSI7EOYMFatGTfjMLnqrOKBEyYb6NoRgA= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= +cloud.google.com/go/iam v0.2.0/go.mod h1:BCK88+tmjAwnZYfOSizmKCTSFjJHCa18t3DpdGEY13Y= +cloud.google.com/go/kms v1.0.0/go.mod h1:nhUehi+w7zht2XrUfvTRNpxrfayBHqP4lu2NSywui/0= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= +cloud.google.com/go/monitoring v0.1.0/go.mod h1:Hpm3XfzJv+UTiXzCG5Ffp0wijzHTC7Cv4eR7o3x/fEE= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/pubsub v1.17.1/go.mod h1:4qDxMr1WsM9+aQAz36ltDwCIM+R0QdlseyFjBuNvnss= +cloud.google.com/go/secretmanager v1.0.0/go.mod h1:+Qkm5qxIJ5mk74xxIXA+87fseaY1JLYBcFPQoc/GQxg= +cloud.google.com/go/security v1.1.0/go.mod h1:Zf3HhjGQIC3yQLUwW5cTcZ0u7sAQqYnvgx9r9KcFOJw= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= +cloud.google.com/go/spanner v1.17.0/go.mod h1:+17t2ixFwRG4lWRwE+5kipDR9Ef07Jkmc8z0IbMDKUs= +cloud.google.com/go/spanner v1.18.0/go.mod h1:LvAjUXPeJRGNuGpikMULjhLj/t9cRvdc+fxRoLiugXA= +cloud.google.com/go/spanner v1.25.0/go.mod h1:kQUft3x355hzzaeFbObjsvkzZDgpDkesp3v75WBnI8w= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.18.2/go.mod h1:AiIj7BWXyhO5gGVmYJ+S8tbkCx3yb0IMjua8Aw4naVM= +cloud.google.com/go/storage v1.19.0/go.mod h1:6rgiTRjOqI/Zd9YKimub5TIB4d+p3LH33V3ZE1DMuUM= +cloud.google.com/go/trace v0.1.0/go.mod h1:wxEwsoeRVPbeSkt7ZC9nWCgmoKQRAoySN7XHW2AmI7g= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +code.gitea.io/sdk/gitea v0.11.3/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +code.gitea.io/sdk/gitea v0.14.0/go.mod h1:89WiyOX1KEcvjP66sRHdu0RafojGo60bT9UqW17VbWs= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= +contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= +contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= +contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= +contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= +contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/exporter/stackdriver v0.13.8/go.mod h1:huNtlWx75MwO7qMs0KrMxPZXzNNWebav1Sq/pm02JdQ= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= +contrib.go.opencensus.io/exporter/zipkin v0.1.2/go.mod h1:mP5xM3rrgOjpn79MM8fZbj3gsxcuytSqtH0dxSWW1RE= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +cuelang.org/go v0.4.0/go.mod h1:tz/edkPi+T37AZcb5GlPY+WJkL6KiDlDVupKwL3vvjs= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20211102141018-f7be0cbad29c/go.mod h1:WpB7kf89yJUETZxQnP1kgYPNwlT2jjdDYUCoxVggM3g= +github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= +github.com/AlecAivazis/survey/v2 v2.2.12/go.mod h1:6d4saEvBsfSHXeN1a5OA5m2+HJ2LuVokllnC77pAIKI= +github.com/AlecAivazis/survey/v2 v2.3.2 h1:TqTB+aDDCLYhf9/bD2TwSO8u8jDSmMUd2SUVO4gCnU8= +github.com/AlecAivazis/survey/v2 v2.3.2/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg= +github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= +github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= +github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v46.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v50.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v55.8.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v60.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v60.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v61.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v62.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= +github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.6/go.mod h1:V6p3pKZx1KKkJubbxnDWrzNhEIfOy/pTGasLqzHIPHs= +github.com/Azure/go-autorest/autorest v0.11.8/go.mod h1:V6p3pKZx1KKkJubbxnDWrzNhEIfOy/pTGasLqzHIPHs= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.22/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= +github.com/Azure/go-autorest/autorest v0.11.24 h1:1fIGgHKqVm54KIPT+q8Zmd1QlVsmHqeUGso5qm2BqqE= +github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.4/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.10/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.17/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= +github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.2/go.mod h1:q98IH4qgc3eWM4/WOeR5+YPmBuy8Lq0jNRDwSM0CuFk= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.8/go.mod h1:kxyKZTSfKh8OVFWPAgOgQ/frrJgeYQJPyR5fLFmXko4= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9/go.mod h1:hg3/1yw0Bq87O3KvvnJoAh34/0zbP7SFizX/qN5JvjU= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.11/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.1/go.mod h1:JfDgiIO1/RPu6z42AdQTyjOoCM2MFhLqSBDvMEkDgcg= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.4/go.mod h1:yAQ2b6eP/CmLPnmLvxtT1ALIY3OR1oFcCqVBi8vHiTc= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= +github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GoogleCloudPlatform/cloud-builders/gcs-fetcher v0.0.0-20191203181535-308b93ad1f39/go.mod h1:yfGmCjKuUzk9WzubMlW2zwjhCraIc/J+M40cufdemRM= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.27.0/go.mod h1:bn9iHmAjogMoIPkqBGyJ9R1m9cXGCjBE/cuhBs3oEsQ= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317/go.mod h1:DF8FZRxMHMGv/vP2lQP6h+dYzzjpuRn24VeRiYn3qjQ= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= +github.com/Netflix/go-expect v0.0.0-20200312175327-da48e75238e2/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= +github.com/Netflix/go-expect v0.0.0-20210722184520-ef0bf57d82b3 h1:DM0Olh3jQEm4gVPLF0mI49+fm1+M1fXDtumX/fN/G4A= +github.com/Netflix/go-expect v0.0.0-20210722184520-ef0bf57d82b3/go.mod h1:68ORG0HSEWDuH5Eh73AFbYWZ1zT4Y+b0vhOa+vZRUdI= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PaesslerAG/gval v1.0.0/go.mod h1:y/nm5yEyTeX6av0OfKJNp9rBNj2XrGhAf5+v24IBN1I= +github.com/PaesslerAG/jsonpath v0.1.0/go.mod h1:4BzmtoM/PI8fPO4aQGIusjGxGir2BzcV0grWtFzq1Y8= +github.com/PaesslerAG/jsonpath v0.1.1/go.mod h1:lVboNxFGal/VwW6d9JzIy56bUsYAP6tH/x80vjnCseY= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3 h1:XcF0cTDJeiuZ5NU8w7WUDge0HRwwNRmxj/GGk6KSA6g= +github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/ReneKroon/ttlcache/v2 v2.9.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= +github.com/ReneKroon/ttlcache/v2 v2.10.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= +github.com/ReneKroon/ttlcache/v2 v2.11.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= +github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/ThalesIgnite/crypto11 v1.2.5/go.mod h1:ILDKtnCKiQ7zRoNxcp36Y1ZR8LBPmR2E23+wTQe/MlE= +github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20210420163308-c1402a70e2f1/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= +github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20210609063737-0067dc6dcea2/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/alecthomas/jsonschema v0.0.0-20180308105923-f2c93856175a/go.mod h1:qpebaTNSsyUn5rPSJMsfqEtDw71TTggXM6stUDI16HA= +github.com/alecthomas/jsonschema v0.0.0-20210526225647-edb03dcab7bc h1:mT8qSzuyEAkxbv4GBln7yeuQZpBnfikr3PTuiPs6Z3k= +github.com/alecthomas/jsonschema v0.0.0-20210526225647-edb03dcab7bc/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211221011931-643d94fcab96/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220209173558-ad29539cd2e9 h1:zvkJv+9Pxm1nnEMcKnShREt4qtduHKz4iw4AB4ul0Ao= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220209173558-ad29539cd2e9/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/beam v2.28.0+incompatible/go.mod h1:/8NX3Qi8vGstDLLaeaU7+lzVEu/ACaQhYjeefzQ0y1o= +github.com/apache/beam v2.32.0+incompatible/go.mod h1:/8NX3Qi8vGstDLLaeaU7+lzVEu/ACaQhYjeefzQ0y1o= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= +github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= +github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0= +github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.37.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.42.1/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.8/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.22/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.25/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs= +github.com/aws/aws-sdk-go v1.42.26/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.7.1/go.mod h1:L5LuPC1ZgDr2xQS7AmIec/Jlc7O/Y1u2KxJyNVab250= +github.com/aws/aws-sdk-go-v2 v1.11.0/go.mod h1:SQfA+m2ltnu1cA0soUkj4dRSsmITiVQUJvBIZjzfPyQ= +github.com/aws/aws-sdk-go-v2 v1.12.0/go.mod h1:tWhQI5N5SiMawto3uMAQJU5OUN/1ivhDDHq7HTsJvZ0= +github.com/aws/aws-sdk-go-v2 v1.13.0/go.mod h1:L6+ZpqHaLbAaxsqV0L4cvxZY7QupWJB4fhkf8LXvC7w= +github.com/aws/aws-sdk-go-v2 v1.14.0/go.mod h1:ZA3Y8V0LrlWj63MQAnRHgKf/5QB//LSZCPNWlWrNGLU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.0.0/go.mod h1:Xn6sxgRuIDflLRJFj5Ev7UxABIkNbccFPV/p8itDReM= +github.com/aws/aws-sdk-go-v2/config v1.5.0/go.mod h1:RWlPOAW3E3tbtNAqTwvSW54Of/yP3oiZXMI0xfUdjyA= +github.com/aws/aws-sdk-go-v2/config v1.10.1/go.mod h1:auIv5pIIn3jIBHNRcVQcsczn6Pfa6Dyv80Fai0ueoJU= +github.com/aws/aws-sdk-go-v2/config v1.12.0/go.mod h1:GQONFVSDdG6RRho1C730SGNyDhS1kSTnxpOE76ptBqo= +github.com/aws/aws-sdk-go-v2/config v1.13.0/go.mod h1:Pjv2OafecIn+4miw9VFDCr06YhKyf/oKOkIcpQOgWKk= +github.com/aws/aws-sdk-go-v2/config v1.13.1/go.mod h1:Ba5Z4yL/UGbjQUzsiaN378YobhFo0MLfueXGiOsYtEs= +github.com/aws/aws-sdk-go-v2/config v1.14.0/go.mod h1:GKDRrvsq/PTaOYc9252u8Uah1hsIdtor4oIrFvUNPNM= +github.com/aws/aws-sdk-go-v2/credentials v1.3.1/go.mod h1:r0n73xwsIVagq8RsxmZbGSRQFj9As3je72C2WzUIToc= +github.com/aws/aws-sdk-go-v2/credentials v1.6.1/go.mod h1:QyvQk1IYTqBWSi1T6UgT/W8DMxBVa5pVuLFSRLLhGf8= +github.com/aws/aws-sdk-go-v2/credentials v1.7.0/go.mod h1:Kmq64kahHJtXfmnEwnvRKeNjLBqkdP++Itln9BmQerE= +github.com/aws/aws-sdk-go-v2/credentials v1.8.0/go.mod h1:gnMo58Vwx3Mu7hj1wpcG8DI0s57c9o42UQ6wgTQT5to= +github.com/aws/aws-sdk-go-v2/credentials v1.9.0/go.mod h1:PyHKqk/+tJuDY7T8R580S1j/AcSD+ODeUZ99CAUKLqQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.3.0/go.mod h1:2LAuqPx1I6jNfaGDucWfA2zqQCYCOMCDHiCOciALyNw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.8.0/go.mod h1:5E1J3/TTYy6z909QNR0QnXGBpfESYGDqd3O0zqONghU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.9.0/go.mod h1:19SxQ+9zANyJCnNaoF3ovl8bFil4TaqCYEDdqNGKM+A= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.10.0/go.mod h1:I6/fHT/fH460v09eg2gVrd8B/IqskhNdpcLH0WNO3QI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.11.0/go.mod h1:rwdUKJV5rm+vHu1ncD1iGDqahBEL8O0tBjVqo9eO2N0= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.7.1/go.mod h1:wN/mvkow08GauDwJ70jnzJ1e+hE+Q3Q7TwpYLXOe9oI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.0/go.mod h1:NO3Q5ZTTQtO2xIg2+xTXYDiT7knSejfeDm7WGDaOo0U= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.3/go.mod h1:L72JSFj9OwHwyukeuKFFyTj6uFWE4AjB0IQp97bd9Lc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.4/go.mod h1:XHgQ7Hz2WY2GAn//UXHofLfPXWh+s62MbMOijrg12Lw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.5/go.mod h1:2hXc8ooJqF2nAznsbJQIn+7h851/bu8GVC80OVTTqf8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.0.0/go.mod h1:anlUzBoEWglcUxUQwZA7HQOEVEnQALVZsizAapB2hq8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.1.0/go.mod h1:KdVvdk4gb7iatuHZgIkIqvJlWHBtjCJLUtD/uO/FkWw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.2.0/go.mod h1:BsCSJHx5DnDXIrOcqB8KN1/B+hXLG/bi4Y6Vjcx/x9E= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.3.0/go.mod h1:miRSv9l093jX/t/j+mBCaLqFHo9xKYzJ7DGm1BsGoJM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.1.1/go.mod h1:Zy8smImhTdOETZqfyn01iNOe0CNggVbPjCajyaz6Gvg= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.0/go.mod h1:6oXGy4GLpypD3uCh8wcqztigGgmhLToMfjavgh+VySg= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.3/go.mod h1:N4dv+zawriMFZBO/6UKg3zt+XO6xWOQo1neAA0lFbo4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.4/go.mod h1:R3sWUqPcfXSiF/LSFJhjyJmpg9uV6yP2yv3YZZjldVI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.5/go.mod h1:R3sWUqPcfXSiF/LSFJhjyJmpg9uV6yP2yv3YZZjldVI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.6/go.mod h1:o1ippSg3yJx5EuT4AOGXJCUcmt5vrcxla1cg6K1Q8Iw= +github.com/aws/aws-sdk-go-v2/service/ecr v1.4.1/go.mod h1:FglZcyeiBqcbvyinl+n14aT/EWC7S1MIH+Gan2iizt0= +github.com/aws/aws-sdk-go-v2/service/ecr v1.13.0/go.mod h1:X9rkClmo0/dXh2fwvhkMoXR5zxirrzCqMgfU+Z0HIgs= +github.com/aws/aws-sdk-go-v2/service/ecr v1.14.0/go.mod h1:a3WUi3JjM3MFtIYenSYPJ7UZPXsw7U7vzebnynxucks= +github.com/aws/aws-sdk-go-v2/service/ecr v1.15.0/go.mod h1:4zYI85WiYDhFaU1jPFVfkD7HlBcdnITDE3QxDwy4Kus= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.4.1/go.mod h1:eD5Eo4drVP2FLTw0G+SMIPWNWvQRGGTtIZR2XeAagoA= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.10.0/go.mod h1:wlxlU/f1AOpsYIxt86LyrztTAIhyp/6HRNHcZjLzHjg= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.11.0/go.mod h1:iurUYk+aG+E2DO0MnQEZKh9zsaIxuTcrvCaAUTUhuTU= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.12.0/go.mod h1:IArQ3IBR00FkuraKwudKZZU32OxJfdTdwV+W5iZh3Y4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.5.0/go.mod h1:80NaCIH9YU3rzTTs/J/ECATjXuRqzo/wB6ukO6MZ0XY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.1/go.mod h1:zceowr5Z1Nh2WVP8bf/3ikB41IZW59E4yIYbg+pC6mw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.5.0/go.mod h1:Mq6AEc+oEjCUlBuLiK5YwW4shSOAKCQ3tXN0sQeYoBA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.6.0/go.mod h1:wTgFkG6t7jS/6Y0SILXwfspV3IXowb6ngsAlSajW0Kc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.7.0/go.mod h1:K/qPe6AP2TGYv4l6n7c88zh9jWBDf6nHhvg1fx/EWfU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.8.0/go.mod h1:rBDLgXDAwHOfxZKLRDl8OGTPzFDC+a2pLqNNj8+QwfI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.9.0/go.mod h1:xKCZ4YFSF2s4Hnb/J0TLeOsKuGzICzcElaOKNGrVnx4= +github.com/aws/aws-sdk-go-v2/service/kms v1.10.0/go.mod h1:ZkHWL8m5Nw1g9yMXqpCjnIJtSDToAmNbXXZ9gj0bO7s= +github.com/aws/aws-sdk-go-v2/service/s3 v1.19.0/go.mod h1:Gwz3aVctJe6mUY9T//bcALArPUaFmNAy2rTB9qN4No8= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.10.0/go.mod h1:qAgsrzF3Z2vvV01j79fs7D75ofCMQe81/OKBJx0rjFY= +github.com/aws/aws-sdk-go-v2/service/sns v1.11.0/go.mod h1:LIPf3BTbSY5UeVli+x/1y2Qw1w8T9DYyp7p18Qt8Zc8= +github.com/aws/aws-sdk-go-v2/service/sqs v1.12.0/go.mod h1:TDqDmQnsbgL2ZMIGUf3z9xTzCMqFX7FP1geAgIlYqvA= +github.com/aws/aws-sdk-go-v2/service/ssm v1.15.0/go.mod h1:kJa2uHklY03rKsNSbEsToeUgWJ1PambXBtRNacorRhg= +github.com/aws/aws-sdk-go-v2/service/sso v1.3.1/go.mod h1:J3A3RGUvuCZjvSuZEcOpHDnzZP/sKbhDWV2T1EOzFIM= +github.com/aws/aws-sdk-go-v2/service/sso v1.6.0/go.mod h1:Q/l0ON1annSU+mc0JybDy1Gy6dnJxIcWjphO6qJPzvM= +github.com/aws/aws-sdk-go-v2/service/sso v1.8.0/go.mod h1:AB6v3BedyhVRIbPQbJnUsBmtup2pFiikpp5n3YyB6Ac= +github.com/aws/aws-sdk-go-v2/service/sso v1.9.0/go.mod h1:vCV4glupK3tR7pw7ks7Y4jYRL86VvxS+g5qk04YeWrU= +github.com/aws/aws-sdk-go-v2/service/sso v1.10.0/go.mod h1:m1CRRFX7eH3EE6w0ntdu+lo+Ph9VS7y8qRV/vdym0ZY= +github.com/aws/aws-sdk-go-v2/service/sts v1.6.0/go.mod h1:q7o0j7d7HrJk/vr9uUt3BVRASvcU7gYZB9PUgPiByXg= +github.com/aws/aws-sdk-go-v2/service/sts v1.10.0/go.mod h1:jLKCFqS+1T4i7HDqCP9GM4Uk75YW1cS0o82LdxpMyOE= +github.com/aws/aws-sdk-go-v2/service/sts v1.13.0/go.mod h1:jQto17aC9pJ6xRa1g29uXZhbcS6qNT3PSnKfPShq4sY= +github.com/aws/aws-sdk-go-v2/service/sts v1.14.0/go.mod h1:u0xMJKDvvfocRjiozsoZglVNXRG19043xzp3r2ivLIk= +github.com/aws/aws-sdk-go-v2/service/sts v1.15.0/go.mod h1:E264g2Gl5U9KTGzmd8ypGEAoh75VmqyuA/Ox5O1eRE4= +github.com/aws/smithy-go v1.6.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.9.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.9.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.10.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.11.0/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20211215200129-69c85dc22db6/go.mod h1:8vJsEZ4iRqG+Vx6pKhWK6U00qcj0KC37IsfszMkY6UE= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220216180153-3d7835abdf40/go.mod h1:8vJsEZ4iRqG+Vx6pKhWK6U00qcj0KC37IsfszMkY6UE= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220228164355-396b2034c795/go.mod h1:8vJsEZ4iRqG+Vx6pKhWK6U00qcj0KC37IsfszMkY6UE= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= +github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec= +github.com/bluekeyes/go-gitdiff v0.4.0/go.mod h1:QpfYYO1E0fTVHVZAZKiRjtSGY9823iCdvGXBcEzHGbM= +github.com/bmatcuk/doublestar/v4 v4.0.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= +github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= +github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= +github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/boson-project/source-to-image v1.3.2 h1:jy0MQCbc6Ix/SrK9YUeuYUVP5XRFos15I5flTXC6GlY= +github.com/boson-project/source-to-image v1.3.2/go.mod h1:uT4SRJAhYbi9VbTIL0Os+0TTwTgqKwNydy7LoXrQ7v4= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/buildpacks/imgutil v0.0.0-20211203200417-76206845baac h1:XrKr6axRUBHEQdyyo7uffYDwWurOdeyH8MpNRJuBdIw= +github.com/buildpacks/imgutil v0.0.0-20211203200417-76206845baac/go.mod h1:YZReWjuSxwyvuN92Vlcul+WgaCXylpecgFn7T3rNang= +github.com/buildpacks/lifecycle v0.13.3 h1:vV2DGTPVQOELtrCSYpop8W9OF0m+l5gwxWDPmL9ZcOw= +github.com/buildpacks/lifecycle v0.13.3/go.mod h1:4Kv6HljeDJ1ibUcRijvvC1/AHXMCpNddIqH2KYnboks= +github.com/buildpacks/pack v0.24.0 h1:Oeq7DImb7PLX5z/11h5kWJC/YZtgCAxJiEBTU/XsnNo= +github.com/buildpacks/pack v0.24.0/go.mod h1:3BMdtlXEXTHUGAv31eeuPAebXq+JYZhFrAd7tEi6m0g= +github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/bytecodealliance/wasmtime-go v0.31.0/go.mod h1:q320gUxqyI8yB+ZqRuaJOEnGkAnHh6WtJjMaT2CW4wI= +github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cavaliercoder/badio v0.0.0-20160213150051-ce5280129e9e/go.mod h1:V284PjgVwSk4ETmz84rpu9ehpGg7swlIH8npP9k2bGw= +github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cavaliercoder/go-rpm v0.0.0-20200122174316-8cb9fd9c31a8/go.mod h1:AZIh1CCnMrcVm6afFf96PBvE2MRpWFco91z8ObJtgDY= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/chrismellard/docker-credential-acr-env v0.0.0-20220119192733-fe33c00cee21/go.mod h1:Zlre/PVxuSI9y6/UV4NwGixQ48RHQDSPiUkofr6rbMU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudevents/conformance v0.2.0/go.mod h1:rHKDwylBH89Rns6U3wL9ww8bg9/4GbwRCDNuyoC6bcc= +github.com/cloudevents/sdk-go/observability/opencensus/v2 v2.4.1/go.mod h1:lhEpxMrIUkeu9rVRgoAbyqZ8GR8Hd3DUy+thHUxAHoI= +github.com/cloudevents/sdk-go/sql/v2 v2.8.0 h1:gWednxJHL0Ycf93XeEFyQxYj81A7b4eNwkzjNxGunAM= +github.com/cloudevents/sdk-go/sql/v2 v2.8.0/go.mod h1:u9acNJbhmi1wnDJro4PEAqbr4N1LTCyEUClErxbPS1A= +github.com/cloudevents/sdk-go/v2 v2.4.1/go.mod h1:MZiMwmAh5tGj+fPFvtHv9hKurKqXtdB9haJYMJ/7GJY= +github.com/cloudevents/sdk-go/v2 v2.5.0/go.mod h1:nlXhgFkf0uTopxmRXalyMwS2LG70cRGPrxzmjJgSG0U= +github.com/cloudevents/sdk-go/v2 v2.8.0 h1:kmRaLbsafZmidZ0rZ6h7WOMqCkRMcVTLV5lxV/HKQ9Y= +github.com/cloudevents/sdk-go/v2 v2.8.0/go.mod h1:GpCBmUj7DIRiDhVvsK5d6WCbgTWs8DxAWTRtAwQmIXs= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/apd/v2 v2.0.1/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.5.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= +github.com/containerd/containerd v1.5.10/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= +github.com/containerd/containerd v1.6.0 h1:CLa12ZcV0d2ZTRKq1ssioeJpTnPJBMyndpEKA+UtzJg= +github.com/containerd/containerd v1.6.0/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2 h1:QSqfxcn8c+12slxwu00AtzXrsami0MJb/MQs9lOLHLA= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= +github.com/containerd/stargz-snapshotter v0.6.4 h1:mox1Ozl/LicA5j0O5Xk9Q8z+nOQQLnClarhxokyw9hI= +github.com/containerd/stargz-snapshotter v0.6.4/go.mod h1:1t0SF1gAHJhCSftWKDLVitvfF3c2qhL5hymG7C50wto= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/stargz-snapshotter/estargz v0.6.4/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= +github.com/containerd/stargz-snapshotter/estargz v0.7.0/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= +github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= +github.com/containerd/stargz-snapshotter/estargz v0.10.1/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= +github.com/containerd/stargz-snapshotter/estargz v0.11.0/go.mod h1:/KsZXsJRllMbTKFfG0miFQWViQKdI9+9aSXs+HN0+ac= +github.com/containerd/stargz-snapshotter/estargz v0.11.1 h1:mNQqxcAWmDrV6d6yUvzFhfY8puNzoQz9v4diW+Pmei4= +github.com/containerd/stargz-snapshotter/estargz v0.11.1/go.mod h1:6VoPcf4M1wvnogWxqc4TqBWWErCS+R+ucnPZId2VbpQ= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containers/image/v5 v5.19.1 h1:g4/+XIuh1kRoRn2MfLDhfHhkNOIO9JtqhSyo55tjpfE= +github.com/containers/image/v5 v5.19.1/go.mod h1:ewoo3u+TpJvGmsz64XgzbyTHwHtM94q7mgK/pX+v2SE= +github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/storage v1.38.2 h1:8bAIxnVBGKzMw5EWCivVj24bztQT6IkDp4uHiyhnzwE= +github.com/containers/storage v1.38.2/go.mod h1:INP0RPLHWBxx+pTsO5uiHlDUGHDFvWZPWprAbAlQWPQ= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc/v3 v3.1.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberphone/json-canonicalization v0.0.0-20210303052042-6bc126869bf4/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/cyberphone/json-canonicalization v0.0.0-20210823021906-dc406ceaf94b/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= +github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/danieljoos/wincred v1.1.1/go.mod h1:gSBQmTx6G0VmLowygiA7ZD0p0E09HJ68vta8z/RT2d0= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= +github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= +github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-gk v0.0.0-20140819190930-201884a44051/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= +github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= +github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77/go.mod h1:Va5MyIzkU0rAM92tn3hb3Anb7oz7KcnixF49+2wOMe4= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dimfeld/httppath v0.0.0-20170720192232-ee938bf73598/go.mod h1:0FpDmbrt36utu8jEmeU05dPC9AB5tsLYVVi+ZHfyuwI= +github.com/dimfeld/httptreemux/v5 v5.0.2/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= +github.com/dimfeld/httptreemux/v5 v5.2.2/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= +github.com/dimfeld/httptreemux/v5 v5.3.0/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.8+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.12+incompatible h1:lZlz0uzG+GH+c0plStMUdF/qk3ppmgnswpR5EbqzVGA= +github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= +github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.3-0.20210609071616-4c2ec79bf2a8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.11+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U= +github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= +github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dvyukov/go-fuzz v0.0.0-20210914135545-4980593459a1/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.15.0+incompatible h1:8KpYO/Xl/ZudZs5RNOEhWMBY4hmzlZhhRd9cu+jrZP4= +github.com/emicklei/go-restful v2.15.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/proto v1.6.15/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= +github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= +github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.5.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-docopt v0.0.0-20140912013429-f6dd2ebbb31e/go.mod h1:HyVoz1Mz5Co8TFO8EupIdlcpwShBmY98dkT2xeHkvEI= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fullstorydev/grpcurl v1.8.0/go.mod h1:Mn2jWbdMrQGJQ8UD62uNyMumT2acsZUCkZIqFxsQf1o= +github.com/fullstorydev/grpcurl v1.8.1/go.mod h1:3BWhvHZwNO7iLXaQlojdg5NA6SxUDePli4ecpK1N7gw= +github.com/fullstorydev/grpcurl v1.8.2/go.mod h1:YvWNT3xRp2KIRuvCphFodG0fKkMXwaxA9CJgKCcyzUQ= +github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell v1.2.0 h1:ikixzsxc8K8o3V2/CEmyoEW8mJZaNYQQ3NP3VIQdUe4= +github.com/gdamore/tcell v1.2.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= +github.com/gdamore/tcell/v2 v2.3.3/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= +github.com/gdamore/tcell/v2 v2.4.0 h1:W6dxJEmaxYvhICFoTY3WrLLEXsQ11SaFnKGVEXW57KM= +github.com/gdamore/tcell/v2 v2.4.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= +github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= +github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gormigrate/gormigrate/v2 v2.0.0/go.mod h1:YuVJ+D/dNt4HWrThTBnjgZuRbt7AuwINeg4q52ZE3Jw= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-ldap/ldap/v3 v3.1.10/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= +github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= +github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= +github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.1/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= +github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= +github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= +github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= +github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= +github.com/go-openapi/loads v0.21.0/go.mod h1:rHYve9nZrQ4CJhyeIIFJINGCg1tQpx2yJrrNo8sf1ws= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= +github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= +github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= +github.com/go-openapi/runtime v0.21.0/go.mod h1:aQg+kaIQEn+A2CRSY1TxbM8+sT9g2V3aLc1FbIAnbbs= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= +github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= +github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= +github.com/go-openapi/spec v0.20.2/go.mod h1:RW6Xcbs6LOyWLU/mXGdzn2Qc+3aj+ASfI7rvSZh1Vls= +github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= +github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= +github.com/go-openapi/strfmt v0.20.2/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= +github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= +github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= +github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= +github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= +github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= +github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= +github.com/go-openapi/validate v0.20.3/go.mod h1:goDdqVGiigM3jChcrYJxD2joalke3ZXeftD16byIjA4= +github.com/go-piv/piv-go v1.9.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-rod/rod v0.101.8/go.mod h1:N/zlT53CfSpq74nb6rOR0K8UF0SPUPBmzBnArrms+mY= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-testfixtures/testfixtures/v3 v3.2.0/go.mod h1:RZctY24ixituGC73XlAV1gkCwYMVwiSwPm26MNlQIhE= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= +github.com/gobuffalo/flect v0.2.4/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4-0.20210608040537-544b4180ac70/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= +github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= +github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/diff v0.0.0-20181124234638-500114f11e71/go.mod h1:22dM4PLscQl+Nzf64qNBurVJvfyvZELT0iRW2l/NN70= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2/go.mod h1:pDgmNM6seYpwvPos3q+zxlXMsbve6mOIPucUnUOrI7Y= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/mathext v0.0.0-20181121095525-8a4bf007ea55/go.mod h1:fmo8aiSEWkJeiGXUJf+sPvuDgEFgqIoZSs843ePKrGg= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= +github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs= +github.com/google/addlicense v1.0.0/go.mod h1:Sm/DHu7Jk+T5miFHHehdIjbi4M5+dJDRS3Cq0rncIxA= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/cel-go v0.11.2 h1:o16cOggWWtH1a3ZHQ8uWqt8nd255vDrEK1mDE1cFRSQ= +github.com/google/cel-go v0.11.2/go.mod h1:drz+knCRsctDZ180KZHwIEEUb9IdK/nxPoyhxi+O1K0= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/certificate-transparency-go v1.1.2-0.20210422104406-9f33727a7a18/go.mod h1:6CKh9dscIRoqc2kC6YUFICHZMT9NrClyPrRVFrdw1QQ= +github.com/google/certificate-transparency-go v1.1.2-0.20210512142713-bed466244fa6/go.mod h1:aF2dp7Dh81mY8Y/zpzyXps4fQW5zQbDu2CxfpJB6NkI= +github.com/google/certificate-transparency-go v1.1.2/go.mod h1:3OL+HKDqHPUfdKrHVQxO6T8nDLO0HF7LRTlkIWXaWvQ= +github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= +github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-containerregistry v0.5.2-0.20210609162550-f0ce2270b3b4/go.mod h1:R5WRYyTdQqTchlBhX4q+WICGh8HQIL5wDFoFZv7Jq6Q= +github.com/google/go-containerregistry v0.5.2-0.20210709161016-b448abac9a70/go.mod h1:nS0LmwaZT5kotebyNVC7ik7lC4OHOzGcctvvSosKlAc= +github.com/google/go-containerregistry v0.6.0/go.mod h1:euCCtNbZ6tKqi1E72vwDj2xZcN5ttKpZLfa/wSo5iLw= +github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= +github.com/google/go-containerregistry v0.7.1-0.20211118220127-abdc633f8305/go.mod h1:6cMIl1RfryEiPzBE67OgtZdEiLWz4myqCQIiBMy3CsM= +github.com/google/go-containerregistry v0.7.1-0.20211203164431-c75901cce627/go.mod h1:IwJblnDNiCs8sxubbfPNniYsUqr8m+nt7YbPzecsGuE= +github.com/google/go-containerregistry v0.8.0/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= +github.com/google/go-containerregistry v0.8.1-0.20220110151055-a61fd0a8e2bb/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= +github.com/google/go-containerregistry v0.8.1-0.20220120151853-ac864e57b117/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= +github.com/google/go-containerregistry v0.8.1-0.20220202214207-9c35968ef47e/go.mod h1:cwx3SjrH84Rh9VFJSIhPh43ovyOp3DCWgY3h8nWmdGQ= +github.com/google/go-containerregistry v0.8.1-0.20220211173031-41f8d92709b7/go.mod h1:cwx3SjrH84Rh9VFJSIhPh43ovyOp3DCWgY3h8nWmdGQ= +github.com/google/go-containerregistry v0.8.1-0.20220216220642-00c59d91847c/go.mod h1:MMbnwuvLeZJRPqhTs8jDWc8xGlOs5YCGx1TSc/qdExk= +github.com/google/go-containerregistry v0.8.1-0.20220414133640-f1b729141d33/go.mod h1:eTLvLZaEe2FoQsb25t7BLxQQryyrwHTzFfwxN87mhAw= +github.com/google/go-containerregistry v0.8.1-0.20220414143355-892d7a808387 h1:GWICy4b02s8EA1M9H5krRQ48BKpIHO5LtBBm2BQLhx0= +github.com/google/go-containerregistry v0.8.1-0.20220414143355-892d7a808387/go.mod h1:eTLvLZaEe2FoQsb25t7BLxQQryyrwHTzFfwxN87mhAw= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210610160139-c086c7f16d4e/go.mod h1:u9BUkrFoN0hojbyaW5occdRyQvT74KjJKx2VClbrDC8= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20210918223331-0e8b581974dd/go.mod h1:j3IqhBG3Ox1NXmmhbWU4UmiHVAf2dUgB7le1Ch7JZQ0= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20211215180950-ab77ea68f600/go.mod h1:j3IqhBG3Ox1NXmmhbWU4UmiHVAf2dUgB7le1Ch7JZQ0= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20220120151853-ac864e57b117/go.mod h1:BH7pLQnIZhfVpL7cRyWhvvz1bZLY9V45/HvXVh5UMDY= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20220216220642-00c59d91847c/go.mod h1:m6nUV1MgElByyfWJCAKsEt+5s/BtU9ZLjyHDmoeAHcM= +github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20220414154538-570ba6c88a50/go.mod h1:m7mMYMlUraMy65yWp4AXkMgousS5LFPYcvI19yjz6W0= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220110151055-a61fd0a8e2bb/go.mod h1:SK4EqntTk6tHEyNngoqHUwjjZaW6mfzLukei4+cbvu8= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220120123041-d22850aca581/go.mod h1:SK4EqntTk6tHEyNngoqHUwjjZaW6mfzLukei4+cbvu8= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220128225446-c63684ed5f15/go.mod h1:juPcrnQFaTyH72YA4Lt2MwEFSGi3orvGXyzxzo+RLss= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220223122423-dd8d514a9b24/go.mod h1:MO/Ilc3XTxy/Pi8aMXEiRUl6icOqResFyhSFCLlqtR8= +github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20220414143355-892d7a808387/go.mod h1:QOryQrrP9Uq/1w9F7WOWWhK2/gHXg7F0i3J/hPG6yQA= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v27 v27.0.6/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= +github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-github/v30 v30.1.0/go.mod h1:n8jBpHl45a/rlBUtRJMOG4GhNADUQFEufcolZ95JfU8= +github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= +github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= +github.com/google/go-intervals v0.0.2/go.mod h1:MkaR3LNRfeKLPmqgJYs4E66z5InYjmCjbbr4TQlcT6Y= +github.com/google/go-licenses v0.0.0-20200602185517-f29a4c695c3d/go.mod h1:g1VOUGKZYIqe8lDq2mL7plhAWXqrEaGUs7eIjthN1sk= +github.com/google/go-licenses v0.0.0-20210329231322-ce1d9163b77d/go.mod h1:+TYOmkVoJOpwnS0wfdsJCV9CoD5nJYsHoFk/0CrTK4M= +github.com/google/go-licenses v0.0.0-20210816172045-3099c18c36e1/go.mod h1:WkPB6PtjnM1pF4qeK8RcFmk7z+TIsrPYOng7OPlFDiw= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/go-replayers/httpreplay v1.0.0/go.mod h1:LJhKoTwS5Wy5Ld/peq8dFFG5OfJyHEz7ft+DsTUv25M= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gxui v0.0.0-20151028112939-f85e0a97b3a4/go.mod h1:Pw1H1OjSNHiqeuxAduB1BKYXIwFtsyrY47nEqSgEiCM= +github.com/google/licenseclassifier v0.0.0-20190926221455-842c0d70d702/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/licenseclassifier v0.0.0-20200708223521-3d09a0ea2f39/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/licenseclassifier v0.0.0-20210325184830-bb04aff29e72/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/licenseclassifier v0.0.0-20210722185704-3043a050f148/go.mod h1:rq9F0RSpNKlrefnf6ZYMHKUnEJBCNzf6AcCXMYBeYvE= +github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3/go.mod h1:YzLcVlL+NqWnmUEPuhS1LxDDwGO9WNbVlEXaF4IH35g= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/rpmpack v0.0.0-20210518075352-dc539ef4f2ea/go.mod h1:+y9lKiqDhR4zkLl+V9h4q0rdyrYVsWWm6LLCQP33DIk= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/trillian v1.3.14-0.20210409160123-c5ea3abd4a41/go.mod h1:1dPv0CUjNQVFEDuAUFhZql16pw/VlPgaX8qj+g5pVzQ= +github.com/google/trillian v1.3.14-0.20210511103300-67b5f349eefa/go.mod h1:s4jO3Ai4NSvxucdvqUHON0bCqJyoya32eNw6XJwsmNc= +github.com/google/trillian v1.4.0/go.mod h1:1Bja2nEgMDlEJWWRXBUemSPG9qYw84ZYX2gHRVHlR+g= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.3/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ= +github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= +github.com/goreleaser/goreleaser v0.134.0/go.mod h1:ZT6Y2rSYa6NxQzIsdfWWNWAlYGXGbreo66NmE+3X3WQ= +github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= +github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= +github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4= +github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.1.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.7/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-secure-stdlib/base62 v0.1.1/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.1/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.2/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.2/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-secure-stdlib/password v0.1.1/go.mod h1:9hH302QllNwu1o2TGYtSk8I8kTAN0ca1EHpwhm5Mmzo= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= +github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.1/go.mod h1:l8slYwnJA26yBz+ErHpp2IRCLr0vuOMGBORIz4rRiAs= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= +github.com/hashicorp/vault/api v1.3.0/go.mod h1:EabNQLI0VWbWoGlA+oBLC8PXmR9D60aUVgQGvangFWQ= +github.com/hashicorp/vault/api v1.3.1/go.mod h1:QeJoWxMFt+MsuWcYhmwRLwKEXrjwAFFywzhptMsTIUw= +github.com/hashicorp/vault/sdk v0.3.0/go.mod h1:aZ3fNuL5VNydQk8GcLJ2TV8YCRVvyaakYkhZRoVuhj0= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= +github.com/heroku/color v0.0.6 h1:UTFFMrmMLFcL3OweqP1lAdp8i1y/9oHqkeHjQ/b/Ny0= +github.com/heroku/color v0.0.6/go.mod h1:ZBvOcx7cTF2QKOv4LbmoBtNl5uB17qWxGuzZrsi1wLU= +github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= +github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c h1:kp3AxgXgDOmIJFR7bIwqFhwJ2qWar8tEQSE5XXhCfVk= +github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= +github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ikawaha/goahttpcheck v1.3.1/go.mod h1:RFH8+oq3GOW2yiRwI5tcx3FrVmONlT4DMmu80dsoBRE= +github.com/ikawaha/httpcheck v1.2.0/go.mod h1:eYUWSdmssaYCdUzcOUe8NMF0vgr4MKq7Iqbb3eXtpxI= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/in-toto/in-toto-golang v0.3.4-0.20211211042327-af1f9fb822bf/go.mod h1:twl9XmClqj6/h/HANQQYaJZVKPPW/Mz53bd2t6UXGQA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/tdigest v0.0.0-20180711151920-a7d76c6f093a/go.mod h1:9GkyshztGufsdPQWjH+ifgnIr3xNUL5syI70g2dzU1o= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/tdigest v0.0.0-20191024211133-5d87a7585faa/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= +github.com/influxdata/tdigest v0.0.1/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.6.4/go.mod h1:w2pne1C2tZgP+TvjqLpOigGzNqjBgQW9dUw/4Chex78= +github.com/jackc/pgconn v1.7.0/go.mod h1:sF/lPpNEMEOp+IYhyQGdAvrG20gWf6A1tKlr0v7JMeA= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.5/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.4.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= +github.com/jackc/pgtype v1.5.0/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.8.1/go.mod h1:4HOLxrl8wToZJReD04/yB20GDwf4KBYETvlHciCnwW0= +github.com/jackc/pgx/v4 v4.9.0/go.mod h1:MNGWmViCgqbZck9ujOOBN63gK9XVGILXWCvKLGKmnms= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.2/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= +github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= +github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jedisct1/go-minisign v0.0.0-20210703085342-c1f07ee84431/go.mod h1:3VIJLjlf5Iako82IX/5KOoCzDmogK5mO+bl+DRItnR8= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jenkins-x/go-scm v1.10.10/go.mod h1:z7xTO9/VzqW3xEbEMH2z5cpOGrZ8+nOHOWfU1ngFGxs= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= +github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.14.3/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.14.4 h1:eijASRJcobkVtSt81Olfh7JX43osYLwy5krOJo6YEu4= +github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/ktr0731/go-fuzzyfinder v0.2.0/go.mod h1:Ol2Z6Rc1tu/uUSlD6b67wnhB4nGQt0Mr2NtP0SNW6uM= +github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= +github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= +github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lestrrat-go/jwx v0.9.0/go.mod h1:iEoxlYfZjvoGpuWwxUz+eR5e6KTJGsaRcy/YNA/UnBk= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac/go.mod h1:Frd2bnT3w5FB5q49ENTfVlztJES+1k/7lyWX2+9gq/M= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d/go.mod h1:WZy8Q5coAB1zhY9AOBJP0O6J4BuDfbupUDavKY+I3+s= +github.com/manveru/gobdd v0.0.0-20131210092515-f1a17fdd710b/go.mod h1:Bj8LjjP0ReT1eKt5QlKjwgi5AFm5mI6O1A2G4ChI0Ag= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA= +github.com/markbates/goth v1.68.0/go.mod h1:V2VcDMzDiMHW+YmqYl7i0cMiAUeCkAe4QE6jRKBhXZw= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +github.com/mattn/go-sqlite3 v2.0.2+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mediocregopher/radix/v4 v4.0.0/go.mod h1:ajchozX/6ELmydxWeWM6xCFHVpZ4+67LXHOTOVR0nCE= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.17/go.mod h1:WgzbA6oji13JREwiNsRDNfl7jYdPnmz+VEuLrA+/48M= +github.com/miekg/dns v1.1.25/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e h1:Qa6dnn8DlasdXRnacluu8HzPts0S1I9zvvUPDbBnXFI= +github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e/go.mod h1:waEya8ee1Ro/lgxpVhkJI4BVASzkm3UZqkx/cFJiYHM= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= +github.com/moby/buildkit v0.9.3 h1:0JmMLY45KIKFogJXv4LyWo+KmIMuvhit5TDrwBlxDp0= +github.com/moby/buildkit v0.9.3/go.mod h1:5dZQUHg9STw/Fhl4zZiusDJKn8uje/0x952Nce4a8cg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.2.0 h1:WhCW5B355jtxndN5ovugJlMFJawbUODuW8fSnEH6SSM= +github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= +github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= +github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY= +github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/open-policy-agent/opa v0.35.0/go.mod h1:xEmekKlk6/c+so5HF9wtPnGPXDfBuBsrMGhSHOHEF+U= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202193544-a5463b7f9c84/go.mod h1:Qnt1q4cjDNQI9bT832ziho5Iw2BhK8o1KwLOwW56VP4= +github.com/opencontainers/image-spec v1.0.3-0.20211202222133-eacdcc10569b/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= +github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= +github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0 h1:O9+X96OcDjkmmZyfaG996kV7yq8HsoU2h1XRRQcefG8= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.0/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/openzipkin/zipkin-go v0.3.0 h1:XtuXmOLIXLjiU2XduuWREDT0LOKtSgos/g7i7RYyoZQ= +github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= +github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= +github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.0-beta.2/go.mod h1:+X+aW6gUj6Hda43TeYHVCIvYNG/jqY/8ZFXAeXXHl+Q= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/peterh/liner v0.0.0-20170211195444-bf27d3ba8e1d/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/proglottis/gpgme v0.1.1/go.mod h1:fPbW/EZ0LvwQtH8Hy7eixhp1eF3G39dtx7GUN+0Gmy0= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.1/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= +github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= +github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc/go.mod h1:KbKfKPy2I6ecOIGA9apfheFv14+P3RSmmQvshofQyMY= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/pseudomuto/protoc-gen-doc v1.5.0/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/qur/ar v0.0.0-20130629153254-282534b91770/go.mod h1:SjlYv2m9lpV0UW6K7lDqVJwEIIvSjaHbGk7nIfY8Hxw= +github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/rickb777/date v1.13.0 h1:+8AmwLuY1d/rldzdqvqTEg7107bZ8clW37x4nsdG3Hs= +github.com/rickb777/date v1.13.0/go.mod h1:GZf3LoGnxPWjX+/1TXOuzHefZFDovTyNLHDMd3qH70k= +github.com/rickb777/plural v1.2.1 h1:UitRAgR70+yHFt26Tmj/F9dU9aV6UfjGXSbO1DcC9/U= +github.com/rickb777/plural v1.2.1/go.mod h1:j058+3M5QQFgcZZ2oKIOekcygoZUL8gKW5yRO14BuAw= +github.com/rivo/tview v0.0.0-20210624165335-29d673af0ce2 h1:I5N0WNMgPSq5NKUFspB4jMJ6n2P0ipz5FlOlB4BXviQ= +github.com/rivo/tview v0.0.0-20210624165335-29d673af0ce2/go.mod h1:IxQujbYMAh4trWr0Dwa8jfciForjVmxyHpskZX6aydQ= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/dnscache v0.0.0-20210201191234-295bba877686/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= +github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/rs/zerolog v1.17.2/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= +github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sabhiram/go-gitignore v0.0.0-20201211074657-223ce5d391b0 h1:4Q/TASkyjpqyR5DL5+6c2FGSDpHM5bTMSspcXr7J6R8= +github.com/sabhiram/go-gitignore v0.0.0-20201211074657-223ce5d391b0/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= +github.com/sassoftware/go-rpmutils v0.1.1/go.mod h1:euhXULoBpvAxqrBHEyJS4Tsu3hHxUmQWNymxoJbzgUY= +github.com/sassoftware/relic v0.0.0-20210427151427-dfb082b79b74/go.mod h1:YlB8wFIZmFLZ1JllNBfSURzz52fBxbliNgYALk1UDmk= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= +github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/secure-systems-lab/go-securesystemslib v0.1.0/go.mod h1:eIjBmIP8LD2MLBL/DkQWayLiz006Q4p+hCu79rvWleY= +github.com/secure-systems-lab/go-securesystemslib v0.2.0/go.mod h1:eIjBmIP8LD2MLBL/DkQWayLiz006Q4p+hCu79rvWleY= +github.com/secure-systems-lab/go-securesystemslib v0.3.0/go.mod h1:o8hhjkbNl2gOamKUA/eNW3xUrntHT9L4W89W1nfj43U= +github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= +github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= +github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= +github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc= +github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sigstore/cosign v1.4.2-0.20220103014340-1a7f9d61a2e9/go.mod h1:07cmUkSH4O6pbvSXSulNP4VPPzNPccq4tB3BXM2u5M0= +github.com/sigstore/fulcio v0.1.2-0.20211207184413-f4746cc4ff3d/go.mod h1:4MU8ZIe1hJz85JUaYi7v1kIxG3z9t1T6I8Ae4KFjPV4= +github.com/sigstore/fulcio v0.1.2-0.20220103193424-0df42390d392/go.mod h1:HpEuqamoVS2jypmBqHcsF4goDzb28+0sQUyHUb+Cpf8= +github.com/sigstore/rekor v0.3.1-0.20211211150321-b8eca1b71e0b/go.mod h1:msxSFjTHSyqvb46svKXcvTIL5K39lqma91Gauu2Hj0Y= +github.com/sigstore/rekor v0.4.1-0.20220103184137-e86cf37242d3/go.mod h1:FTaicg3g+p5RV7H+MkxoXvx5ymI4coQLB/wHr2o84l0= +github.com/sigstore/sigstore v1.0.1/go.mod h1:1+krIdtuf81/fLC8mHPt/7uwYiOg7W8k/PAR7lzKW3w= +github.com/sigstore/sigstore v1.0.2-0.20211210190220-04746d994282/go.mod h1:SuM+QIHtnnR9eGsURRLv5JfxM6KeaU0XKA1O7FmLs4Q= +github.com/sigstore/sigstore v1.0.2-0.20211223185235-75bc699f921d/go.mod h1:gDpcHw4VwpoL5C6N1Ud1YtBsc+ikRDwDelDlWRyYoE8= +github.com/sigstore/sigstore v1.1.0/go.mod h1:gDpcHw4VwpoL5C6N1Ud1YtBsc+ikRDwDelDlWRyYoE8= +github.com/sigstore/sigstore v1.1.1-0.20220104191147-28bc731b4695/go.mod h1:HzhvIvMfEEPnqx4M7DoVT3O/47DFfvwxNuMXWPajWmE= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/smallstep/assert v0.0.0-20200723003110-82e2b9b3b262/go.mod h1:MyOHs9Po2fbM1LHej6sBUT8ozbxmMOFG+E+rx/GSGuc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5-0.20210205191134-5ec6847320e5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60= +github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= +github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= +github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/spiffe/go-spiffe/v2 v2.0.0-beta.10/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk= +github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:CKI4AZ4XmGV240rTHfO0hfE83S6/a3/Q1siZJ/vXf7A= +github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/sylabs/release-tools v0.1.0/go.mod h1:pqP/z/11/rYMQ0OM/Nn7TxGijw7KfZwW9UolD/J1TUo= +github.com/sylabs/sif/v2 v2.3.1/go.mod h1:NnvveH62GiibimL00MrI6YYcZfb7DnZMcRo/40giY+0= +github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tektoncd/chains v0.8.0/go.mod h1:54qsO4wJjmIkSt4BAv1FMwrh+S2HhuXiw4FNGgrxkLE= +github.com/tektoncd/cli v0.23.1 h1:EpT6kF66ADpg7pjnl8TIt36Kn43e1n94UJiUS5l3ZLA= +github.com/tektoncd/cli v0.23.1/go.mod h1:vyHxuzvbdQQ0/HBAko20r6rZY9mWDh6994sVfoM/HII= +github.com/tektoncd/hub v1.7.0/go.mod h1:c3lL6qU1nFD9TCCrFuEnygB3KcfNn5Tbi27nZ3H6nxA= +github.com/tektoncd/pipeline v0.31.1-0.20220105002759-3e137645be61/go.mod h1:dO84qW4sTq7S7Jv5G0PRmbTjvxnUAuDDxD1NBrsQX9w= +github.com/tektoncd/pipeline v0.33.0/go.mod h1:FAxcjW5FRSBUDmNVXxv1Lq4YlT6Qjgh85TC9JKcxdX4= +github.com/tektoncd/pipeline v0.33.1/go.mod h1:5Re8byhcUd3afN6m6IKn0SfNvbJCRmQRyEOl7fz0OXo= +github.com/tektoncd/pipeline v0.34.1 h1:foL7McnPbmn9AMU8XAz0XdBZWh+puPANG3ca03i6bEA= +github.com/tektoncd/pipeline v0.34.1/go.mod h1:ZdUe14VvTODQFAxQRHrDyuTEvnM4pMY8dPI+RJufw7s= +github.com/tektoncd/plumbing v0.0.0-20211012143332-c7cc43d9bc0c/go.mod h1:b9esRuV1absBvaPzKkjYdKXjC5Tgs8/vh1sz++RiTdc= +github.com/tektoncd/triggers v0.19.0 h1:/vIizEZCxc86/nM6/RSmSATaUOLqO8D9P0++nzaNxu0= +github.com/tektoncd/triggers v0.19.0/go.mod h1:o1LZztX+exY/MbwRJbgbeTv1exn9rDnepX2vM2CD2q0= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tent/canonical-json-go v0.0.0-20130607151641-96e4ba3a7613/go.mod h1:g6AnIpDSYMcphz193otpSIzN+11Rs+AAIIC6rm1enug= +github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= +github.com/theupdateframework/go-tuf v0.0.0-20210722233521-90e262754396/go.mod h1:L+uU/NRFK/7h0NYAnsmvsX9EghDB5QVCcHCIrK2h5nw= +github.com/theupdateframework/go-tuf v0.0.0-20211203210025-7ded50136bf9/go.mod h1:n2n6wwC9BEnYS/C/APAtNln0eM5zYAYOkOTx6VEG/mA= +github.com/theupdateframework/go-tuf v0.0.0-20211213174152-470b5ab00139/go.mod h1:I0Gs4Tev4hYQ5wiNqN8VJ7qS0gw7KOZNQuckC624RmE= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.3/go.mod h1:5WdjKx3AQMvCJ4RG6/2UYT7dLrGvJUV1x4jdTAyGvZs= +github.com/tilinna/clock v1.0.2/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= +github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= +github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= +github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj52Uc= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= +github.com/tonistiigi/fsutil v0.0.0-20210609172227-d72af97c0eaf/go.mod h1:lJAxK//iyZ3yGbQswdrPTxugZIDM7sd4bEsD0x3XMHk= +github.com/tonistiigi/go-actions-cache v0.0.0-20211002214948-4d48f2ff622a/go.mod h1:YiIBjH5gP7mao3t0dBrNNBGuKYdeJmcAJjYLXr43k6A= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tsenart/go-tsz v0.0.0-20180814232043-cdeb9e1e981e/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= +github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= +github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible/go.mod h1:Smz/ZWfhKRcyDDChZkG3CyTHdj87lHzio/HOCkbndXM= +github.com/tsenart/vegeta/v12 v12.8.4/go.mod h1:ZiJtwLn/9M4fTPdMY7bdbIeyNeFVE8/AHbWFqCsUuho= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vbauerster/mpb/v7 v7.3.2/go.mod h1:wfxIZcOJq/bG1/lAtfzMXcOiSvbqVi/5GX5WCSi+IsA= +github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= +github.com/vdemeester/k8s-pkg-credentialprovider v1.20.7/go.mod h1:K2nMO14cgZitdwBqdQps9tInJgcaXcU/7q5F59lpbNI= +github.com/vdemeester/k8s-pkg-credentialprovider v1.21.0-1/go.mod h1:l4LxiP0cmEcc5q4BTDE8tZSyIiyXe0T28x37yHpMzoM= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/wavesoftware/go-ensure v1.0.0/go.mod h1:K2UAFSwMTvpiRGay/M3aEYYuurcR8S4A6HkQlJPV8k4= +github.com/whilp/git-urls v1.0.0 h1:95f6UMWN5FKW71ECsXRUd3FVYiXdrE7aX4NZKcPmIjU= +github.com/whilp/git-urls v1.0.0/go.mod h1:J16SAmobsqc3Qcy98brfl5f5+e0clUvg1krgwk/qCfE= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.52.2/go.mod h1:Q+hQhV508bDPoBijv7YjK/Lvlb4PhVhJdKqXVQrUoAE= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= +github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b/go.mod h1:HptNXiXVDcJjXe9SqMd0v2FsL9f8dz4GnXgltU6q/co= +github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/ysmood/goob v0.3.0/go.mod h1:S3lq113Y91y1UBf1wj1pFOxeahvfKkCk6mTWTWbDdWs= +github.com/ysmood/got v0.15.1/go.mod h1:pE1l4LOwOBhQg6A/8IAatkGp7uZjnalzrZolnlhhMgY= +github.com/ysmood/gotrace v0.2.2/go.mod h1:TzhIG7nHDry5//eYZDYcTzuJLYQIkykJzCRIo4/dzQM= +github.com/ysmood/gson v0.6.4/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg= +github.com/ysmood/leakless v0.7.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea/go.mod h1:eNr558nEUjP8acGw8FFjTeWvSgU1stO7FAO6eknhHe4= +github.com/zalando/go-keyring v0.1.0/go.mod h1:RaxNwUITJaHVdQ0VC7pELPZ3tOWn13nr0gZMZEhpVU0= +github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= +github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0-alpha.0/go.mod h1:mPcW6aZJukV6Aa81LSKpBjQXTWlXB5r74ymPoSWa3Sw= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0-alpha.0/go.mod h1:kdV+xzCJ3luEBSIeQyB/OEKkWKd8Zkux4sbDeANrosU= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v3 v3.5.0-alpha.0/go.mod h1:wKt7jgDgf/OfKiYmCq5WFGxOFAkVMLxiiXgLDFhECr8= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/etcdctl/v3 v3.5.0-alpha.0/go.mod h1:YPwSaBciV5G6Gpt435AasAG3ROetZsKNUzibRa/++oo= +go.etcd.io/etcd/etcdctl/v3 v3.5.0/go.mod h1:vGTfKdsh87RI7kA2JHFBEGxjQEYx+pi299wqEOdi34M= +go.etcd.io/etcd/etcdutl/v3 v3.5.0/go.mod h1:o98rKMCibbFAG8QS9KmvlYDGDShmmIbmRE8vSofzYNg= +go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0/go.mod h1:tV31atvwzcybuqejDoY3oaNRTtlD2l/Ot78Pc9w7DMY= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0-alpha.0/go.mod h1:FAwse6Zlm5v4tEWZaTjmNhe17Int4Oxbu7+2r0DiD3w= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0-alpha.0/go.mod h1:tsKetYpt980ZTpzl/gb+UOJj9RkIyCb1u4wjzMg90BQ= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= +go.etcd.io/etcd/tests/v3 v3.5.0-alpha.0/go.mod h1:HnrHxjyCuZ8YDt8PYVyQQ5d1ZQfzJVEtQWllr5Vp/30= +go.etcd.io/etcd/tests/v3 v3.5.0/go.mod h1:f+mtZ1bE1YPvgKdOJV2BKy4JQW0nAFnQehgOE7+WyJE= +go.etcd.io/etcd/v3 v3.5.0-alpha.0/go.mod h1:JZ79d3LV6NUfPjUxXrpiFAYcjhT+06qqw+i28snx8To= +go.etcd.io/etcd/v3 v3.5.0/go.mod h1:FldM0/VzcxYWLvWx1sdA7ghKw7C3L2DvUTzGrcEtsC4= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= +go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= +go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib v0.21.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= +go.opentelemetry.io/contrib v1.3.0/go.mod h1:FlyPNX9s4U6MCsWEc5YAK4KzKNHFDsjrDUZijJiXvy8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.21.0/go.mod h1:Vm5u/mtkj1OMhtao0v+BGo2LUoLCgHYXvRmj0jWITlE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.21.0/go.mod h1:a9cocRplhIBkUAJmak+BPDx+LVL7cTmqUPB0uBcTA4k= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.21.0/go.mod h1:JQAtechjxLEL81EjmbRwxBq/XEzGaHcsPuDHAx54hg4= +go.opentelemetry.io/otel v0.16.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC1/go.mod h1:FXJnjGCoTQL6nQ8OpFJ0JI1DrdOvMoVx49ic0Hg4+D4= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0-RC1/go.mod h1:FliQjImlo7emZVjixV8nbDMAa4iAkcWTE9zzSEOiEPw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0-RC1/go.mod h1:cDwRc2Jrh5Gku1peGK8p9rRuX/Uq2OtVmLicjlw2WYU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.0.0-RC1/go.mod h1:OYKzEoxgXFvehW7X12WYT4/a2BlASJK9l7RtG4A91fg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/internal/metric v0.21.0/go.mod h1:iOfAaY2YycsXfYD4kaRSbLx2LKmfpKObWBEv9QK5zFo= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.21.0/go.mod h1:JWCt1bjivC4iCrz/aCrM1GSw+ZcvY44KCbaeeRhzHnc= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/oteltest v1.0.0-RC1/go.mod h1:+eoIG0gdEOaPNftuy1YScLr1Gb4mL/9lpDkZ0JjMRq4= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.0.0-RC1/go.mod h1:kj6yPn7Pgt5ByRuwesbaWcRLA+V7BSDg3Hf8xRvsvf8= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= +go.step.sm/crypto v0.13.0/go.mod h1:5YzQ85BujYBu6NH18jw7nFjwuRnDch35nLzH0ES5sKg= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.20.0 h1:N4oPlghZwYG55MlU6LXk/Zp00FVNE9X9wrYO8CEs4lc= +go.uber.org/zap v1.20.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +goa.design/goa/v3 v3.0.9/go.mod h1:oJR8VOFa4HV7wCQv4XhPtvyknz0B3VFFRUWDdEmI0FI= +goa.design/goa/v3 v3.1.3/go.mod h1:GEog3KvHosQPKrrZSlpXDSnm7PpmzZEiy3mLxI/FtXM= +goa.design/goa/v3 v3.3.1/go.mod h1:Br8id+evuay7oUIK3BXr6iFJVLxAiirb+FPzfYUYOWg= +goa.design/plugins/v3 v3.1.3/go.mod h1:j4gOWwZpEBsNmONKitV/tBlxG6Yu7unFCU1HJmqjiC8= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +gocloud.dev v0.24.1-0.20211119014450-028788aaaa4c/go.mod h1:EIJSlY7nvfeoWaV2GauF6es27gZfqtTVon47QFueoyE= +golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200930160638-afb6bcd081ae/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211115234514-b4de73f9ece8/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20210126221216-84987778548c/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20190806162312-597adff16ade/go.mod h1:AlhUtkH4DA4asiFC5RgK7ZKmauvtkAVcy9L0epCzlWo= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.0.0-20210326220855-61e056675ecf/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211111083644-e5c967477495/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211203184738-4852103109b8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211205041911-012df41ee64c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127074510-2fabfed7e28f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200930132711-30421366ff76/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191029155521-f43be2a4598c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201005172224-997123666555/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210326220804-49726bf1d181/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211001092434-39dca1131b70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220223155357-96fed51e1446/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/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/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190807223507-b346f7fd45de/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191030232956-1e24073be82c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200313205530-4303120df7d8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512001501-aaeff5de670a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200612220849-54c614fe050c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201014170642-d1624618ad65/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= +gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= +google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.1-0.20200106000736-b8fc810ca6b5/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.1/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= +google.golang.org/api v0.65.0/go.mod h1:ArYhxgGadlWmqO1IqVujw6Cs8IdD33bTmzKo2Sh+cbg= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0 h1:67zQnAE0T2rB0A3CwLSas0K+SbVzSxP+zTLkQLexeiw= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200929141702-51c3e5b607fe/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210325224202-eed09b1b5210/go.mod h1:f2Bd7+2PlaVKmvKQ52aspJZXIDaRQBVdOOBfJ5i8OEs= +google.golang.org/genproto v0.0.0-20210331142528-b7513248f0ba/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210416161957-9910b6c460de/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210427215850-f767ed18ee4d/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211019152133-63b7e35f4404/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211027162914-98a5263abeca/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211207154714-918901c715cf/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220301145929-1ac2ace0dbf7/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220303160752-862486edd9cc/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6 h1:FglFEfyj61zP3c6LgjmVHxYxZWXYul9oiS1EZqD5gLc= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/examples v0.0.0-20201130180447-c456688b1860/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/h2non/gentleman.v1 v1.0.4/go.mod h1:JYuHVdFzS4MKOXe0o+chKJ4hCe6tqKKw9XH9YP6WFrg= +gopkg.in/h2non/gock.v1 v1.0.16/go.mod h1:XVuDAssexPLwgxCLMvDTWNU5eqklsydR6I5phZ9oPB8= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= +gorm.io/driver/postgres v1.0.0/go.mod h1:wtMFcOzmuA5QigNsgEIb7O5lhvH1tHAF1RbWmLWV4to= +gorm.io/driver/postgres v1.0.2/go.mod h1:FvRSYfBI9jEp6ZSjlpS9qNcSjxwYxFc03UOTrHdvvYA= +gorm.io/driver/sqlite v1.1.1/go.mod h1:hm2olEcl8Tmsc6eZyxYSeznnsDaMqamBvEXLNtBg4cI= +gorm.io/driver/sqlserver v1.0.2/go.mod h1:gb0Y9QePGgqjzrVyTQUZeh9zkd5v0iz71cM1B4ZycEY= +gorm.io/gorm v1.9.19/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.20.0/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.20.2/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= +gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= +k8s.io/api v0.22.5 h1:xk7C+rMjF/EGELiD560jdmwzrB788mfcHiNbMQLIVI8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/apiextensions-apiserver v0.20.7/go.mod h1:rBGJeRYoDJi1jJFHPA4QWXV6YX/5scZfSdkuMSgWoyA= +k8s.io/apiextensions-apiserver v0.21.4/go.mod h1:OoC8LhI9LnV+wKjZkXIBbLUwtnOGJiTRE33qctH5CIk= +k8s.io/apiextensions-apiserver v0.22.5 h1:ML0QqT7FIlmZHN+9+2EtARJ3cJVHeoizt6GCteFRE0o= +k8s.io/apiextensions-apiserver v0.22.5/go.mod h1:tIXeZ0BrDxUb1PoAz+tgOz43Zi1Bp4BEEqVtUccMJbE= +k8s.io/apimachinery v0.22.5 h1:cIPwldOYm1Slq9VLBRPtEYpyhjIm1C6aAMAoENuvN9s= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= +k8s.io/apiserver v0.19.7/go.mod h1:DmWVQggNePspa+vSsVytVbS3iBSDTXdJVt0akfHacKk= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.20.7/go.mod h1:7gbB7UjDdP1/epYBGnIUE6jWY4Wpz99cZ7igfDa9rv4= +k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg= +k8s.io/apiserver v0.21.4/go.mod h1:SErUuFBBPZUcD2nsUU8hItxoYheqyYr2o/pCINEPW8g= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +k8s.io/cli-runtime v0.21.4/go.mod h1:eRbLHYkdVWzvG87yrkgGd8CqX6/+fAG9DTdAqTXmlRY= +k8s.io/cli-runtime v0.22.5 h1:bZqLgx1INiPgXyMk/Hu3o5NFmdfvlvtsoE+wHJuKA2U= +k8s.io/cli-runtime v0.22.5/go.mod h1:12ah4O0kaevIYHsRcFGt8RKER0wlTN2yCgHp1c4Uxp4= +k8s.io/client-go v0.22.5 h1:I8Zn/UqIdi2r02aZmhaJ1hqMxcpfJ3t5VqvHtctHYFo= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= +k8s.io/cloud-provider v0.19.7/go.mod h1:aO/VpUwkG+JQN7ZXc5WBLZ5NBXuq/Y5B6vri6U94PZ8= +k8s.io/cloud-provider v0.21.0/go.mod h1:z17TQgu3JgUFjcgby8sj5X86YdVK5Pbt+jm/eYMZU9M= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/code-generator v0.20.7/go.mod h1:i6FmG+QxaLxvJsezvZp0q/gAEzzOz3U53KFibghWToU= +k8s.io/code-generator v0.21.4/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo= +k8s.io/code-generator v0.22.5/go.mod h1:sbdWCOVob+KaQ5O7xs8PNNaCTpbWVqNgA6EPwLOmRNk= +k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= +k8s.io/component-base v0.19.7/go.mod h1:YX8spPBgwl3I6UGcSdQiEMAqRMSUsGQOW7SEr4+Qa3U= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.20.7/go.mod h1:878UWprXC07P2CWFg+jjvTfxJSlkHp1v2m1MTkNQnJY= +k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw= +k8s.io/component-base v0.21.4/go.mod h1:ZKG0eHVX+tUDcaoIGpU3Vtk4TIjMddN9uhEWDmW6Nyg= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/controller-manager v0.21.0/go.mod h1:Ohy0GRNRKPVjB8C8G+dV+4aPn26m8HYUI6ejloUBvUA= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= +k8s.io/csi-translation-lib v0.19.7/go.mod h1:WghizPQuzuygr2WdpgN2EjcNpDD2V4EAbxFXsgHgSBk= +k8s.io/csi-translation-lib v0.21.0/go.mod h1:edq+UMpgqEx3roTuGF/03uIuSOsI986jtu65+ytLlkA= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20210203185629-de9496dff47b/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4= +k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210113233702-8566a335510f/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kube-openapi v0.0.0-20220114203427-a0453230fd26/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf h1:M9XBsiMslw2lb2ZzglC0TOkBPK5NQi0/noUrdnoFwUg= +k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= +k8s.io/legacy-cloud-providers v0.19.7/go.mod h1:dsZk4gH9QIwAtHQ8CK0Ps257xlfgoXE3tMkMNhW2xDU= +k8s.io/legacy-cloud-providers v0.21.0/go.mod h1:bNxo7gDg+PGkBmT/MFZswLTWdSWK9kAlS1s8DJca5q4= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20211208161948-7d6a63dca704/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220127004650-9b3446523e65/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +knative.dev/caching v0.0.0-20210803185815-4e553d2275a0/go.mod h1:Vs+HND39+KKaIQp9M3m3Jmt4YtznpitDQ3n53gxbDYQ= +knative.dev/caching v0.0.0-20220118175933-0c1cc094a7f4/go.mod h1:OHsK3XaWmdi2/mPaNBiX8LbefbtM6TptnT90eVbYGSA= +knative.dev/client v0.29.0 h1:VzmXYWNfzF5O1OUpCYv2rd8hj6Q3mwGNwOyx6y4G0g8= +knative.dev/client v0.29.0/go.mod h1:VaTZlNkplns4UrscGPp4CwKcIVRcfC4Po1yRvfF4JiQ= +knative.dev/eventing v0.25.0/go.mod h1:8jIsrnSONPgv+m63OTzpwZQJiQASYl77C3llCyYlBMU= +knative.dev/eventing v0.29.0/go.mod h1:u5T5NZTDUsLR7yJwp5MDnBnDX5MhywD3yK3Rq+7gTtI= +knative.dev/eventing v0.29.2-0.20220420140829-ce4fe0990d23 h1:9DucdcOalX90T2QMhQjh4MLjXUEgqgsRxuK1o1Tt+44= +knative.dev/eventing v0.29.2-0.20220420140829-ce4fe0990d23/go.mod h1:u5T5NZTDUsLR7yJwp5MDnBnDX5MhywD3yK3Rq+7gTtI= +knative.dev/hack v0.0.0-20210622141627-e28525d8d260/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack v0.0.0-20211122162614-813559cefdda/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack v0.0.0-20211203062838-e11ac125e707/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack v0.0.0-20220118141833-9b2ed8471e30/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack v0.0.0-20220128200847-51a42b2eb63e h1:pW3LMToyFhAhbHQWQwUHLY57i7gjvyFwFC8Sg6oNkJ8= +knative.dev/hack v0.0.0-20220128200847-51a42b2eb63e/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= +knative.dev/hack/schema v0.0.0-20210622141627-e28525d8d260/go.mod h1:ffjwmdcrH5vN3mPhO8RrF2KfNnbHeCE2C60A+2cv3U0= +knative.dev/hack/schema v0.0.0-20220118141833-9b2ed8471e30/go.mod h1:ffjwmdcrH5vN3mPhO8RrF2KfNnbHeCE2C60A+2cv3U0= +knative.dev/networking v0.0.0-20210803181815-acdfd41c575c/go.mod h1:UA9m1M3rGssy63gVwjSh7CYoWTKZNO8cnY9QsIu7tyo= +knative.dev/networking v0.0.0-20220120043934-ec785540a732/go.mod h1:6cKBV/h/vIQWCPOkds/RvzUmMR8Vz6Dks2NWb0+3xks= +knative.dev/networking v0.0.0-20220120045035-ec849677a316 h1:fHgHP3nnJSfq115RgTMYVHPQBsBKQYtjUVGhMT/VLaA= +knative.dev/networking v0.0.0-20220120045035-ec849677a316/go.mod h1:+ozCw7PVf//G9+HOW04hfWnU8UJE5fmWAQkb+ieMaXY= +knative.dev/pkg v0.0.0-20210803160015-21eb4c167cc5/go.mod h1:RPk5txNA3apR9X40D4MpUOP9/VqOG8CrtABWfOwGVS4= +knative.dev/pkg v0.0.0-20211206113427-18589ac7627e/go.mod h1:E6B4RTjZyxe55a0kxOlnEHEl71zuG7gghnqYvNBKwBw= +knative.dev/pkg v0.0.0-20211215065729-552319d4f55b/go.mod h1:hrD91/shO1o4KMZa4oWhnbRPmVJhvq86TLy/STF/qf8= +knative.dev/pkg v0.0.0-20220104185830-52e42b760b54/go.mod h1:189cvGP0mwpqwZGFrLk5WuERIsNI/J6HuQ1CIX7SXxY= +knative.dev/pkg v0.0.0-20220118160532-77555ea48cd4/go.mod h1:etVT7Tm8pSDf4RKhGk4r7j/hj3dNBpvT7bO6a6wpahs= +knative.dev/pkg v0.0.0-20220131144930-f4b57aef0006/go.mod h1:bZMFTPDPHV3wXuiQ09UJuEGYYQnfpe81MCxNvsMAiJk= +knative.dev/pkg v0.0.0-20220222214439-083dd97300e1 h1:p6MI/Rs9AZC5+qRvqX48njRjmFBYi4Y80q23efgJ+38= +knative.dev/pkg v0.0.0-20220222214439-083dd97300e1/go.mod h1:etVT7Tm8pSDf4RKhGk4r7j/hj3dNBpvT7bO6a6wpahs= +knative.dev/reconciler-test v0.0.0-20210803183715-b61cc77c06f6/go.mod h1:+Kovy+G5zXZNcuO/uB+zfo37vFKZzsLIlWezt/nKMz0= +knative.dev/reconciler-test v0.0.0-20220118183433-c8bfbe66bada/go.mod h1:XV4cghzCtdASkfUsfMYSnGfGRyd/naDjy9h7Tnae22g= +knative.dev/serving v0.25.0/go.mod h1:24E4fVyViFnz8aAaafzdrYKB7CAsQr4FMU7QXoIE6CI= +knative.dev/serving v0.29.0/go.mod h1:8Ay9QjyTcqoJE+2PietSmT5/VMdSQHe5aIBhsAFOCjM= +knative.dev/serving v0.29.5 h1:+NUjm2Npo43hWlQTkGsG89johEzIf9aiMKUsKfidzjA= +knative.dev/serving v0.29.5/go.mod h1:00SLmEVPRwqtDPu4dXn2L8BVyvILurecO1z/v6oDAg0= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= +mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +sigs.k8s.io/kustomize/api v0.8.8/go.mod h1:He1zoK0nk43Pc6NlV085xDXDXTNprtcyKZVm3swsdNY= +sigs.k8s.io/kustomize/api v0.8.11 h1:LzQzlq6Z023b+mBtc6v72N2mSHYmN8x7ssgbf/hv0H8= +sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= +sigs.k8s.io/kustomize/kyaml v0.10.17/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= +sigs.k8s.io/kustomize/kyaml v0.11.0 h1:9KhiCPKaVyuPcgOLJXkvytOvjMJLoxpjodiycb4gHsA= +sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/vendor/knative.dev/kn-plugin-func/instances.go b/vendor/knative.dev/kn-plugin-func/instances.go new file mode 100644 index 0000000000..868af204b5 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/instances.go @@ -0,0 +1,118 @@ +package function + +import ( + "context" + "errors" + "fmt" +) + +const ( + EnvironmentLocal = "local" + EnvironmentRemote = "remote" +) + +var ( + ErrNotInitialized = errors.New("function is not initialized") + ErrNotRunning = errors.New("function not running") + ErrRootRequired = errors.New("function root path is required") + ErrEnvironmentNotFound = errors.New("environment not found") +) + +// Instances manager +// +// Instances are point-in-time snapshots of a Function's runtime state in +// a given environment. By default 'local' and 'remote' environmnts are +// available when a Function is run locally and deployed (respectively). +type Instances struct { + client *Client +} + +// newInstances creates a new manager of instances. +func newInstances(client *Client) *Instances { + return &Instances{client: client} +} + +// Get the instance data for a Function in the named environment. +// For convenient access to the default 'local' and 'remote' environment +// see the Local and Remote methods, respectively. +// Instance returned is populated with a point-in-time snapshot of the +// Function state in the named environment. +func (s *Instances) Get(ctx context.Context, f Function, environment string) (Instance, error) { + switch environment { + case EnvironmentLocal: + return s.Local(ctx, f) + case EnvironmentRemote: + return s.Remote(ctx, f.Name, f.Root) + default: + // Future versions will support additional ad-hoc named environments, such + // as for testing. Local and remote remaining the base cases. + return Instance{}, ErrEnvironmentNotFound + } +} + +// Local instance details for the Function +// If the Function is not running locally the error returned is ErrNotRunning +func (s *Instances) Local(ctx context.Context, f Function) (Instance, error) { + var i Instance + // To create a local instance the Function must have a root path defined + // which contains an initialized function and be running. + if f.Root == "" { + return i, ErrRootRequired + } + if !f.Initialized() { + return i, ErrNotInitialized + } + ports := jobPorts(f) + if len(ports) == 0 { + return i, ErrNotRunning + } + + route := fmt.Sprintf("http://localhost:%s/", ports[0]) + + return Instance{ + Route: route, + Routes: []string{route}, + Name: f.Name, + }, nil +} + +// Remote instance details for the Function +// +// Since this is specific to the implicitly available 'remote' environment, the +// request can be completed with either a name or the local source. Therefore +// either name or root path can be passed. If name is not passed, the Function +// at root is loaded and its name used for describing the remote instance. +// Name takes precedence. +func (s *Instances) Remote(ctx context.Context, name, root string) (Instance, error) { + var ( + f Function + err error + ) + + // Error if name and root disagree + // If both a name and root were passed but the Function at the root either + // does not exist or does not match the name, fail fast. + // The purpose of this method's signature is to allow passing either name or + // root, but doing so requires that we manually validate. + if name != "" && root != "" { + f, err = NewFunction(root) + if err != nil { + return Instance{}, err + } + if name != f.Name { + return Instance{}, errors.New( + "name passed does not match name of the Function at root. " + + "Try passing either name or root rather than both.") + } + } + + // Name takes precedence if provided + if name != "" { + f = Function{Name: name} + } else { + if f, err = NewFunction(root); err != nil { + return Instance{}, err + } + } + return s.client.describer.Describe(ctx, f.Name) +} diff --git a/vendor/knative.dev/kn-plugin-func/invoke.go b/vendor/knative.dev/kn-plugin-func/invoke.go new file mode 100644 index 0000000000..bd3aa748f1 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/invoke.go @@ -0,0 +1,206 @@ +package function + +import ( + "context" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "time" + + cloudevents "github.com/cloudevents/sdk-go/v2" + "github.com/google/uuid" +) + +const ( + DefaultInvokeSource = "/boson/fn" + DefaultInvokeType = "boson.fn" + DefaultInvokeContentType = "text/plain" + DefaultInvokeData = "Hello World" + DefaultInvokeFormat = "http" +) + +// InvokeMesage is the message used by the convenience method Invoke to provide +// a simple way to trigger the execution of a Function during development. +type InvokeMessage struct { + ID string + Source string + Type string + ContentType string + Data string + Format string //optional override for Function-defined message format +} + +// NewInvokeMessage creates a new InvokeMessage with fields populated +func NewInvokeMessage() InvokeMessage { + return InvokeMessage{ + ID: uuid.NewString(), + Source: DefaultInvokeSource, + Type: DefaultInvokeType, + ContentType: DefaultInvokeContentType, + Data: DefaultInvokeData, + // Format override not set by default: value from Function being preferred. + } +} + +// invoke the Function instance in the target environment with the +// invocation message. Returned is metadata (such as HTTP headers or +// CloudEvent fields) and a stringified version of the payload. +func invoke(ctx context.Context, c *Client, f Function, target string, m InvokeMessage, verbose bool) (metadata map[string][]string, body string, err error) { + + // Get the first available route from 'local', 'remote', a named environment + // or treat target + route, err := invocationRoute(ctx, c, f, target) // choose instance to invoke + if err != nil { + return + } + if verbose { + fmt.Printf("Invoking '%v' Function at %v\n", f.Invocation.Format, route) + } + + // Format" either 'http' or 'cloudevent' + // TODO: discuss if providing a Format on Message should a) update the + // Function to use the new format if none is defined already (backwards + // compatibility fix) or b) always update the Function, even if it was already + // set. Once decided, codify in a test. + format := DefaultInvokeFormat + if f.Invocation.Format != "" { + // Prefer the format set during Function creation if defined. + format = f.Invocation.Format + } + if m.Format != "" { + // Use the override specified on the message if provided + format = m.Format + if verbose { + fmt.Printf("Invoking '%v' Function using '%v' format\n", f.Invocation.Format, m.Format) + } + } + + switch format { + case "http": + return sendPost(ctx, route, m, c.transport, verbose) + case "cloudevent": + // CouldEvents return a string which always includes a fairly verbose + // summation of fields, so metadata is not applicable + meta := make(map[string][]string) + body, err = sendEvent(ctx, route, m, c.transport, verbose) + return meta, body, err + default: + err = fmt.Errorf("format '%v' not supported.", format) + return + } +} + +// invocationRoute returns a route to the named target instance of a Func: +// 'local': local environment; locally running Function (error if not running) +// 'remote': remote environment; first available instance (error if none) +// '': A valid alternate target which contains instances. +// '': An explicit URL +// '': Default if no target is passed is to first use local, then remote. +// errors if neither are available. +func invocationRoute(ctx context.Context, c *Client, f Function, target string) (string, error) { + // TODO: this function has code-smell; will de-smellify it in next pass. + if target == EnvironmentLocal { + instance, err := c.Instances().Get(ctx, f, target) + if err != nil { + if errors.Is(err, ErrEnvironmentNotFound) { + return "", errors.New("not running locally") + } + return "", err + } + return instance.Route, nil + + } else if target == EnvironmentRemote { + instance, err := c.Instances().Get(ctx, f, target) + if err != nil { + if errors.Is(err, ErrEnvironmentNotFound) { + return "", errors.New("not running in remote") + } + return "", err + } + return instance.Route, nil + + } else if target == "" { // target blank, check local first then remote. + instance, err := c.Instances().Get(ctx, f, EnvironmentLocal) + if err != nil && !errors.Is(err, ErrNotRunning) { + return "", err // unexpected errors are anything other than ErrNotRunning + } + if err == nil { + return instance.Route, nil // found instance in local environment + } + instance, err = c.Instances().Get(ctx, f, EnvironmentRemote) + if errors.Is(err, ErrNotRunning) { + return "", errors.New("not running locally or in the remote") + } + if err != nil { + return "", err // unexpected error + } + return instance.Route, nil + } else { // treat an unrecognized target as an ad-hoc verbatim endpoint + return target, nil + } +} + +// sendEvent to the route populated with data in the invoke message. +func sendEvent(ctx context.Context, route string, m InvokeMessage, t http.RoundTripper, verbose bool) (resp string, err error) { + event := cloudevents.NewEvent() + event.SetID(m.ID) + event.SetSource(m.Source) + event.SetType(m.Type) + if err = event.SetData(m.ContentType, m.Data); err != nil { + return + } + + c, err := cloudevents.NewClientHTTP( + cloudevents.WithTarget(route), + cloudevents.WithRoundTripper(t)) + if err != nil { + return + } + + if verbose { + fmt.Printf("Sending event\n%v", event) + // note event's stringification already includes a trailing linebreak. + } + + evt, result := c.Request(cloudevents.ContextWithTarget(ctx, route), event) + if cloudevents.IsUndelivered(result) { + err = fmt.Errorf("unable to invoke: %v", result) + } else if evt != nil { // Check for nil in case no event is returned + resp = evt.String() + } + + return +} + +// sendPost to the route populated with data in the invoke message. +func sendPost(ctx context.Context, route string, m InvokeMessage, t http.RoundTripper, verbose bool) (map[string][]string, string, error) { + client := http.Client{ + Transport: t, + Timeout: 10 * time.Second, + } + values := url.Values{ + "ID": {m.ID}, + "Source": {m.Source}, + "Type": {m.Type}, + "ContentType": {m.ContentType}, + "Data": {m.Data}, + } + if verbose { + fmt.Println("Sending values") + for k, v := range values { + fmt.Printf(" %v: %v\n", k, v[0]) // NOTE len==1 value slices assumed + } + } + resp, err := client.PostForm(route, values) + if err != nil { + return nil, "", err + } + defer resp.Body.Close() + if resp.StatusCode > 299 { + return nil, "", fmt.Errorf("failure invoking '%v' (HTTP %v)", route, resp.StatusCode) + } + b, err := io.ReadAll(resp.Body) + return resp.Header, string(b), err +} diff --git a/vendor/knative.dev/kn-plugin-func/job.go b/vendor/knative.dev/kn-plugin-func/job.go new file mode 100644 index 0000000000..62bf51b6ec --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/job.go @@ -0,0 +1,92 @@ +package function + +import ( + "fmt" + "os" + "path/filepath" +) + +const ( + // RunDataDir holds transient runtime metadata + // By default it is excluded from source control. + RunDataDir = ".func" +) + +// Job represents a running Function job (presumably started by this process' +// Runner instance. +type Job struct { + Function Function + Port string + Errors chan error + onStop func() +} + +// Create a new Job which represents a running Function task by providing +// the port on which it was started, a channel on which runtime errors can +// be received, and a stop function. +func NewJob(f Function, port string, errs chan error, onStop func()) (*Job, error) { + j := &Job{ + Function: f, + Port: port, + Errors: errs, + onStop: onStop, + } + return j, j.save() // Everything is a file: save instance data to disk. +} + +// Stop the Job, running the provided stop delegate and removing runtime +// metadata from disk. +func (j *Job) Stop() { + _ = j.remove() // Remove representation on disk + j.onStop() +} + +func (j *Job) save() error { + instancesDir := filepath.Join(j.Function.Root, RunDataDir, "instances") + // job metadata is stored in /.func/instances + mkdir(instancesDir) + + // create a file /.func/instances/ + file, err := os.Create(filepath.Join(instancesDir, j.Port)) + if err != nil { + return err + } + return file.Close() + + // Store the effective port for use by other client instances, possibly + // in other processes, such as to run Invoke from other terminal in CLI apps. + /* + if err := writeFunc(f, "port", []byte(port)); err != nil { + return j, err + } + return j, nil + */ +} + +func (j *Job) remove() error { + filename := filepath.Join(j.Function.Root, RunDataDir, "instances", j.Port) + return os.Remove(filename) +} + +// jobPorts returns all the ports on which an instance of the given Function is +// running. len is 0 when not running. +// Improperly initialized or nonexistent (zero value) Functions are considered +// to not be running. +func jobPorts(f Function) []string { + if f.Root == "" || !f.Initialized() { + return []string{} + } + instancesDir := filepath.Join(f.Root, RunDataDir, "instances") + mkdir(instancesDir) + + files, err := os.ReadDir(instancesDir) + if err != nil { + fmt.Fprintf(os.Stderr, "error reading %v", instancesDir) + return []string{} + } + ports := []string{} + for _, f := range files { + ports = append(ports, f.Name()) + } + return ports +} diff --git a/vendor/knative.dev/kn-plugin-func/repositories.go b/vendor/knative.dev/kn-plugin-func/repositories.go new file mode 100644 index 0000000000..89a732cad1 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/repositories.go @@ -0,0 +1,219 @@ +package function + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" +) + +const ( + // DefaultRepositoryName is the name by which the currently default repo can + // be referred. This name is assumed when no template prefix is provided + // when determining a template canonical (full) name. + // Unless a single-repo override is defined, this is usually referring to the + // builtin (embedded) repository. + DefaultRepositoryName = "default" + + // DefaultRepositoriesPath is the default location for repositories under + // management on local disk. + // TODO: the logic which defaults this to ~/.config/func/repositories will + // be moved from the CLI to the core in the near future. For now use the + // current working directory. + DefaultRepositoriesPath = "" +) + +// Repositories manager +type Repositories struct { + // Optional path to extensible repositories on disk. Blank indicates not + // to use extensible + path string + + // Optional uri of a single repo to use in leau of embedded and extensible. + // Enables single-repository mode. This replaces the default embedded repo + // and extended repositories. This is an important mode for both diskless + // (config-less) operation, such as security-restrited environments, and for + // running as a library in which case environmental settings should be + // ignored in favor of a more functional approach in which only inputs affect + // outputs. + remote string + + // backreference to the client enabling this repositorires manager to + // have full API access. + client *Client +} + +// newRepositories manager +// contains a backreference to the client (type tree root) for access to the +// full client API during implementations. +func newRepositories(client *Client) *Repositories { + return &Repositories{ + client: client, + path: client.repositoriesPath, + remote: client.repositoriesURI, + } +} + +// Path returns the currently active repositories path under management. +func (r *Repositories) Path() string { + return r.path +} + +// List all repositories the current configuration of the repo manager has +// defined. +func (r *Repositories) List() ([]string, error) { + repositories, err := r.All() + if err != nil { + return []string{}, err + } + + names := []string{} + for _, repo := range repositories { + names = append(names, repo.Name) + } + return names, nil +} + +// All repositories under management +// The default repository is always first. +// If a path to custom repositories is defined, these are included next. +// If repositories is in single-repo mode, it will be the only repo returned. +func (r *Repositories) All() (repos []Repository, err error) { + var repo Repository + + // if in single-repo mode: + // Create a new repository from the remote URI, and set its name to + // the default so that it is treated as the default in place of the embedded. + if r.remote != "" { + if repo, err = NewRepository(DefaultRepositoryName, r.remote); err != nil { + return + } + repos = []Repository{repo} + return + } + + // When not in single-repo mode (above), the default repository is always + // first in the list + if repo, err = NewRepository("", ""); err != nil { + return + } + repos = append(repos, repo) + + // Do not continue on to loading extended repositories unless path defined + // and it exists. + if r.path == "" { + return + } + + // Return empty if path does not exist + if _, err = os.Stat(r.path); os.IsNotExist(err) { + return repos, nil + } + + // Load each repo from disk. + // All settings, including name, are derived from its structure on disk + // plus manifest. + ff, err := os.ReadDir(r.path) + if err != nil { + return + } + for _, f := range ff { + if !f.IsDir() || strings.HasPrefix(f.Name(), ".") { + continue + } + var abspath string + abspath, err = filepath.Abs(r.path) + if err != nil { + return + } + if repo, err = NewRepository("", "file://"+filepath.ToSlash(abspath)+"/"+f.Name()); err != nil { + return + } + repos = append(repos, repo) + } + return +} + +// Get a repository by name, error if it does not exist. +func (r *Repositories) Get(name string) (repo Repository, err error) { + all, err := r.All() + if err != nil { + return + } + if len(all) == 0 { // should not be possible because embedded always exists. + err = errors.New("internal error: no repositories loaded") + return + } + + if name == DefaultRepositoryName { + repo = all[0] + return + } + + if r.remote != "" { + return repo, fmt.Errorf("in single-repo mode (%v). Repository '%v' not loaded", r.remote, name) + } + for _, v := range all { + if v.Name == name { + repo = v + return + } + } + return repo, ErrRepositoryNotFound +} + +// Add a repository of the given name from the URI. Name, if not provided, +// defaults to the repo name (sans optional .git suffix). Returns the final +// name as added. +func (r *Repositories) Add(name, uri string) (string, error) { + if r.path == "" { + return "", fmt.Errorf("repository %v(%v) not added. "+ + "No repositories path provided", name, uri) + } + + // Create a repo (in-memory FS) from the URI + repo, err := NewRepository(name, uri) + if err != nil { + return "", fmt.Errorf("failed to create new repository: %w", err) + } + + // Error if the repository already exists on disk + dest := filepath.Join(r.path, repo.Name) + if _, err := os.Stat(dest); !os.IsNotExist(err) { + return "", fmt.Errorf("repository '%v' already exists", repo.Name) + } + + // Instruct the repository to write itself to disk at the given path. + // Fails if path exists. + err = repo.Write(dest) + if err != nil { + return "", fmt.Errorf("failed to write repository: %w", err) + } + return repo.Name, nil +} + +// Rename a repository +func (r *Repositories) Rename(from, to string) error { + if r.path == "" { + return fmt.Errorf("repository %v not renamed. "+ + "No repositories path provided", from) + } + a := filepath.Join(r.path, from) + b := filepath.Join(r.path, to) + return os.Rename(a, b) +} + +// Remove a repository of the given name from the repositories. +// (removes its directory in Path) +func (r *Repositories) Remove(name string) error { + if r.path == "" { + return fmt.Errorf("repository %v not removed. "+ + "No repositories path provided", name) + } + if name == "" { + return errors.New("name is required") + } + path := filepath.Join(r.path, name) + return os.RemoveAll(path) +} diff --git a/vendor/knative.dev/kn-plugin-func/repository.go b/vendor/knative.dev/kn-plugin-func/repository.go new file mode 100644 index 0000000000..85bbe122a8 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/repository.go @@ -0,0 +1,526 @@ +package function + +import ( + "context" + "errors" + "fmt" + "io/ioutil" + "net/url" + "os" + "path" + "path/filepath" + "strings" + + "github.com/go-git/go-billy/v5/memfs" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/storage/memory" + "gopkg.in/yaml.v2" +) + +const ( + repositoryManifest = "manifest.yaml" + runtimeManifest = "manifest.yaml" + templateManifest = "manifest.yaml" +) + +const ( + // DefaultReadinessEndpoint for final deployed Function instances + DefaultReadinessEndpoint = "/health/readiness" + // DefaultLivenessEndpoint for final deployed Function instances + DefaultLivenessEndpoint = "/health/liveness" + // DefaultTemplatesPath is the root of the defined repository + DefaultTemplatesPath = "." + // DefaultInvocationFormat is a named invocation hint for the convenience + // helper .Invoke. It is usually set at the template level. The default + // ('http') is a plain HTTP POST. + DefaultInvocationFormat = "http" + + // Defaults for Builder and Builders not expressly defined as a purposeful + // delegation of choice. +) + +// Repository represents a collection of runtimes, each containing templates. +type Repository struct { + // Name of the repository + // This can be for instance: + // directory name on FS or last part of git URL or arbitrary value defined by the Template author. + Name string + // Runtimes containing Templates loaded from the repo + Runtimes []Runtime + // TODO get rid of fs and uri members + fs Filesystem + uri string // URI which was used when initially creating +} + +// Runtime is a division of templates within a repository of templates for a +// given runtime (source language plus environmentally available services +// and libraries) +type Runtime struct { + // Name of the runtime + Name string + // Templates defined for the runtime + Templates []Template +} + +// Template is a Function project template. +// It can be used to instantiate new Function project. +type Template interface { + // Name of this template. + Name() string + // Runtime for which this template applies. + Runtime() string + // Repository within which this template is contained. Value is set to the + // currently effective name of the repository, which may vary. It is user- + // defined when the repository is added, and can be set to "default" when + // the client is loaded in single repo mode. I.e. not canonical. + Repository() string + // Fullname is a calculated field of [repo]/[name] used + // to uniquely reference a template which may share a name + // with one in another repository. + Fullname() string + // Write updates fields of Function f and writes project files to path pointed by f.Root. + Write(ctx context.Context, f *Function) error +} + +// This structure defines defaults for a Function when generating project by a template.Write(). +// The structure can be read from manifest.yaml which can exist at level of repository, runtime or template. +type funcDefaults struct { + // BuildConfig defines builders and buildpacks. the denormalized view of + // members which can be defined per repo or per runtime first. + BuildConfig `yaml:",inline"` + + // HealthEndpoints. The denormalized view of members which can be defined + // first per repo or per runtime. + HealthEndpoints `yaml:"healthEndpoints,omitempty"` + + // BuildEnvs defines environment variables related to the builders, + // this can be used to parameterize the builders + BuildEnvs []Env `yaml:"buildEnvs,omitempty"` + + // Invocation defines invocation hints for a Functions which is created + // from this template prior to being materially modified. + Invocation Invocation `yaml:"invocation,omitempty"` +} + +type repositoryConfig struct { + // repository manifest.yaml can define some default values for func.yaml + funcDefaults `yaml:",inline"` + // DefaultName is the name indicated by the repository author. + // Stored in the yaml attribute "name", it is only consulted during initial + // addition of the repo as the default option. + DefaultName string `yaml:"name,omitempty"` + // Version of the repository. + Version string `yaml:"version,omitempty"` + // TemplatesPath defines an optional path within the repository at which + // templates are stored. By default this is the repository root. + TemplatesPath string `yaml:"templates,omitempty"` +} + +type runtimeConfig = funcDefaults +type templateConfig = funcDefaults + +// NewRepository creates a repository instance from any of: a path on disk, a +// remote or local URI, or from the embedded default repo if uri not provided. +// Name (optional), if provided takes precedence over name derived from repo at +// the given URI. +// URI (optional), the path either locally or remote from which to load +// the repository files. If not provided, the internal default is assumed. +func NewRepository(name, uri string) (r Repository, err error) { + r = Repository{ + uri: uri, + } + + fs, err := filesystemFromURI(uri) // Get a Filesystem from the URI + if err != nil { + return Repository{}, fmt.Errorf("failed to get repository from URI (%q): %w", uri, err) + } + + r.fs = fs // needed for Repository.Write() + + repoConfig := repositoryConfig{ + funcDefaults: funcDefaults{ + HealthEndpoints: HealthEndpoints{ + Liveness: DefaultLivenessEndpoint, + Readiness: DefaultLivenessEndpoint, + }, + Invocation: Invocation{Format: DefaultInvocationFormat}, + }, + } + + repoConfig, err = applyRepositoryManifest(fs, repoConfig) // apply optional manifest to r + if err != nil { + return + } + + // Validate custom path if defined + if repoConfig.TemplatesPath != "" { + if err = checkDir(r.fs, repoConfig.TemplatesPath); err != nil { + err = fmt.Errorf("templates path '%v' does not exist in repo '%v'. %v", + repoConfig.TemplatesPath, r.Name, err) + return + } + } else { + repoConfig.TemplatesPath = DefaultTemplatesPath + } + + r.Name, err = repositoryDefaultName(repoConfig.DefaultName, uri) // choose default name + if err != nil { + return + } + if name != "" { // If provided, the explicit name takes precidence + r.Name = name + } + r.Runtimes, err = repositoryRuntimes(fs, r.Name, repoConfig) // load templates grouped by runtime + return +} + +// filesystemFromURI returns a filesystem from the data located at the +// given URI. If URI is not provided, indicates the embedded repo should +// be loaded. URI can be a remote git repository (http:// https:// etc.), +// or a local file path (file://) which can be a git repo or a plain directory. +func filesystemFromURI(uri string) (f Filesystem, err error) { + // If not provided, indicates embedded. + if uri == "" { + return EmbeddedTemplatesFS, nil + } + + // Attempt to get a filesystem from the uri as a remote repo. + f, err = filesystemFromRepo(uri) + if f != nil || err != nil { + return // found a filesystem and/or an error + } + + // Attempt to get a filesystem from the uri as a file path. + return filesystemFromPath(uri) +} + +// filesystemFromRepo attempts to fetch a filesystem from a git repository +// indicated by the given URI. Returns nil if there is not a repo at the URI. +func filesystemFromRepo(uri string) (Filesystem, error) { + clone, err := git.Clone( + memory.NewStorage(), + memfs.New(), + &git.CloneOptions{URL: uri, Depth: 1, Tags: git.NoTags, + RecurseSubmodules: git.NoRecurseSubmodules, + }) + if err != nil { + if isRepoNotFoundError(err) { + return nil, nil + } + return nil, fmt.Errorf("failed to clone repository: %w", err) + } + wt, err := clone.Worktree() + if err != nil { + return nil, err + } + return billyFilesystem{fs: wt.Filesystem}, nil +} + +// isRepoNotFoundError returns true if the error is a +// "repository not found" error. +func isRepoNotFoundError(err error) bool { + // This would be better if the error being tested for was typed, but it is + // currently a simple string value comparison. + return (err != nil && err.Error() == "repository not found") +} + +// filesystemFromPath attempts to return a filesystem from a URI as a file:// path +func filesystemFromPath(uri string) (f Filesystem, err error) { + parsed, err := url.Parse(uri) + if err != nil { + return + } + + if parsed.Scheme != "file" { + return nil, fmt.Errorf("only file scheme is supported") + } + + path := filepath.FromSlash(uri[7:]) + + if _, err := os.Stat(path); os.IsNotExist(err) { + return nil, fmt.Errorf("path does not exist: %v", path) + } + return osFilesystem{root: path}, nil +} + +// repositoryRuntimes returns runtimes defined in this repository's filesystem. +// The views are denormalized, using the parent repository's values +// for inherited fields BuildConfig and HealthEndpoints as the default values +// for the runtimes and templates. The runtimes and templates themselves can +// override these values by specifying new values in thir config files. +func repositoryRuntimes(fs Filesystem, repoName string, repoConfig repositoryConfig) (runtimes []Runtime, err error) { + runtimes = []Runtime{} + + // Load runtimes + fis, err := fs.ReadDir(repoConfig.TemplatesPath) + if err != nil { + return + } + for _, fi := range fis { + // ignore files and hidden dirs + if !fi.IsDir() || strings.HasPrefix(fi.Name(), ".") { + continue + } + // Runtime, defaulted to values inherited from the repository + runtime := Runtime{ + Name: fi.Name(), + } + // Runtime Manifest + // Load the file if it exists, which may override values inherited from the + // repo such as builders, buildpacks and health endpoints. + var rtConfig runtimeConfig + rtConfig, err = applyRuntimeManifest(fs, runtime.Name, repoConfig) + if err != nil { + return + } + + // Runtime Templates + // Load from repo filesystem for runtime. Will inherit values from the + // runtime such as BuildConfig, HealthEndpoints etc. + runtime.Templates, err = runtimeTemplates(fs, repoConfig.TemplatesPath, repoName, runtime.Name, rtConfig) + if err != nil { + return + } + runtimes = append(runtimes, runtime) + } + return +} + +// runtimeTemplates returns templates currently defined in the given runtime's +// filesystem. The view is denormalized, using the inherited fields from the +// runtime for defaults of BuildConfig andHealthEndpoints. The template itself +// can override these by including a manifest. +func runtimeTemplates(fs Filesystem, templatesPath, repoName, runtimeName string, runtimeConfig runtimeConfig) (templates []Template, err error) { + // Validate runtime directory exists and is a directory + runtimePath := path.Join(templatesPath, runtimeName) + if err = checkDir(fs, runtimePath); err != nil { + err = fmt.Errorf("runtime path '%v' not found. %v", runtimePath, err) + return + } + + // Read the directory, loading each template. + fis, err := fs.ReadDir(runtimePath) + if err != nil { + return + } + for _, fi := range fis { + // ignore files and hidden dirs + if !fi.IsDir() || strings.HasPrefix(fi.Name(), ".") { + continue + } + // Template, defaulted to values inherited from the runtime + t := template{ + name: fi.Name(), + repository: repoName, + runtime: runtimeName, + config: runtimeConfig, + fs: subFS{root: path.Join(runtimePath, fi.Name()), fs: fs}, + } + + // Template Manifeset + // Load manifest file if it exists, which may override values inherited from + // the runtime/repo. + t, err = applyTemplateManifest(fs, templatesPath, t) + if err != nil { + return + } + templates = append(templates, t) + } + return +} + +// repositoryDefaultName returns the given name, which if empty falls back to +// deriving a name from the URI, which if empty then falls back to the +// statically defined default DefaultRepositoryName. +func repositoryDefaultName(name, uri string) (string, error) { + // explicit name takes precidence + if name != "" { + return name, nil + } + // URI-derived is second precidence + if uri != "" { + parsed, err := url.Parse(uri) + if err != nil { + return "", err + } + ss := strings.Split(parsed.Path, "/") + if len(ss) > 0 { + // name is the last token with optional '.git' suffix removed + return strings.TrimSuffix(ss[len(ss)-1], ".git"), nil + } + } + // static default + return DefaultRepositoryName, nil +} + +// applyRepositoryManifest from the root of the repository's filesystem if it +// exists. Returned is the repository with any values from the manifest +// set to those of the manifest. +func applyRepositoryManifest(fs Filesystem, repoConfig repositoryConfig) (repositoryConfig, error) { + file, err := fs.Open(repositoryManifest) + if err != nil { + if os.IsNotExist(err) { + return repoConfig, nil + } + return repoConfig, err + } + decoder := yaml.NewDecoder(file) + return repoConfig, decoder.Decode(&repoConfig) +} + +// applyRuntimeManifest from the directory specified (runtime root). Returned +// is the runtime with values from the manifest populated preferentially. An +// error is not returned for a missing manifest file (the passed runtime is +// returned), but errors decoding the file are. +func applyRuntimeManifest(fs Filesystem, runtimeName string, repoConfig repositoryConfig) (runtimeConfig, error) { + rtCfg := repoConfig.funcDefaults + file, err := fs.Open(path.Join(repoConfig.TemplatesPath, runtimeName, runtimeManifest)) + if err != nil { + if os.IsNotExist(err) { + return rtCfg, nil + } + return rtCfg, err + } + decoder := yaml.NewDecoder(file) + return rtCfg, decoder.Decode(&rtCfg) +} + +// applyTemplateManifest from the directory specified (template root). Returned +// is the template with values from the manifest populated preferentailly. An +// error is not returned for a missing manifest file (the passed template is +// returned), but errors decoding the file are. +func applyTemplateManifest(fs Filesystem, templatesPath string, t template) (template, error) { + file, err := fs.Open(path.Join(templatesPath, t.runtime, t.Name(), templateManifest)) + if err != nil { + if os.IsNotExist(err) { + return t, nil + } + return t, err + } + decoder := yaml.NewDecoder(file) + return t, decoder.Decode(&t.config) +} + +// check that the given path is an accessible directory or error. +// this checks within the given filesystem, which may have its own root. +func checkDir(fs Filesystem, path string) error { + fi, err := fs.Stat(path) + if err != nil && os.IsNotExist(err) { + err = fmt.Errorf("path '%v' not found", path) + } else if err == nil && !fi.IsDir() { + err = fmt.Errorf("path '%v' is not a directory", path) + } + return err +} + +// Template from repo for given runtime. +func (r *Repository) Template(runtimeName, name string) (t Template, err error) { + runtime, err := r.Runtime(runtimeName) + if err != nil { + return + } + for _, t := range runtime.Templates { + if t.Name() == name { + return t, nil + } + } + return nil, ErrTemplateNotFound +} + +// Templates returns the set of all templates for a given runtime. +// If runtime not found, an empty list is returned. +func (r *Repository) Templates(runtimeName string) ([]Template, error) { + for _, runtime := range r.Runtimes { + if runtime.Name == runtimeName { + return runtime.Templates, nil + } + } + return nil, nil +} + +// Runtime of the given name within the repository. +func (r *Repository) Runtime(name string) (runtime Runtime, err error) { + for _, runtime = range r.Runtimes { + if runtime.Name == name { + return runtime, err + } + } + return Runtime{}, ErrRuntimeNotFound +} + +// Write all files in the repository to the given path. +func (r *Repository) Write(path string) (err error) { + if r.fs == nil { + return errors.New("the write operation is not supported on this repo") + } + + fs := r.fs // The FS to copy + + // NOTE + // We re-load in-memory git repos via a temp directory to avoid what + // appears to be a missing .git directory in the default worktree FS. + // + // This missing .git dir is usually not an issue when utilizing the + // repository's filesystem (for writing templates, etc), but it does cause + // problems here where we are writing the entire repository to disk (cloning). + // We effectively want a full clone with a working tree. So here we do a + // plain clone first to a temp directory and then copy the files on disk + // using a regular file copy operation which thus includes the repo metadata. + if _, ok := r.fs.(billyFilesystem); ok { + var ( + tempDir string + clone *git.Repository + wt *git.Worktree + ) + if tempDir, err = ioutil.TempDir("", "func"); err != nil { + return + } + if clone, err = git.PlainClone(tempDir, false, // not bare + &git.CloneOptions{URL: r.uri, Depth: 1, Tags: git.NoTags, + RecurseSubmodules: git.NoRecurseSubmodules}); err != nil { + return fmt.Errorf("failed to plain clone repository: %w", err) + } + if wt, err = clone.Worktree(); err != nil { + return fmt.Errorf("failed to get worktree: %w", err) + } + fs = billyFilesystem{fs: wt.Filesystem} + } + return copyFromFS(".", path, fs) +} + +// URL attempts to read the remote git origin URL of the repository. Best +// effort; returns empty string if the repository is not a git repo or the repo +// has been mutated beyond recognition on disk (ex: removing the origin remote) +func (r *Repository) URL() string { + uri := r.uri + + // The default builtin repository is indicated by an empty URI. + // It has no remote URL, and without this check the current working directory + // would be checked. + if uri == "" { + return "" + } + + // git.PlainOpen does not seem to + if strings.HasPrefix(uri, "file://") { + uri = filepath.FromSlash(r.uri[7:]) + } + + repo, err := git.PlainOpen(uri) + if err != nil { + return "" // not a git repository + } + + c, err := repo.Config() + if err != nil { + return "" // Has no .git/config or other error. + } + + if _, ok := c.Remotes["origin"]; ok { + urls := c.Remotes["origin"].URLs + if len(urls) > 0 { + return urls[0] + } + } + return "" +} diff --git a/vendor/knative.dev/kn-plugin-func/sortedset.go b/vendor/knative.dev/kn-plugin-func/sortedset.go new file mode 100644 index 0000000000..cf731062e5 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/sortedset.go @@ -0,0 +1,45 @@ +package function + +import ( + "sort" + "sync" +) + +// sorted set of strings. +// +// write-optimized and suitable only for fairly small values of N. +// Should this increase dramatically in size, a different implementation, +// such as a linked list, might be more appropriate. +type sortedSet struct { + members map[string]bool + sync.Mutex +} + +func newSortedSet() *sortedSet { + return &sortedSet{ + members: make(map[string]bool), + } +} + +func (s *sortedSet) Add(value string) { + s.Lock() + s.members[value] = true + s.Unlock() +} + +func (s *sortedSet) Remove(value string) { + s.Lock() + delete(s.members, value) + s.Unlock() +} + +func (s *sortedSet) Items() []string { + s.Lock() + defer s.Unlock() + n := []string{} + for k := range s.members { + n = append(n, k) + } + sort.Strings(n) + return n +} diff --git a/vendor/knative.dev/kn-plugin-func/template.go b/vendor/knative.dev/kn-plugin-func/template.go new file mode 100644 index 0000000000..8f712174f3 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/template.go @@ -0,0 +1,71 @@ +package function + +import ( + "context" + "path" +) + +// template +type template struct { + name string + runtime string + repository string + fs Filesystem + config templateConfig +} + +func (t template) Name() string { + return t.name +} + +func (t template) Runtime() string { + return t.runtime +} + +func (t template) Repository() string { + return t.repository +} + +func (t template) Fullname() string { + return t.repository + "/" + t.name +} + +func (t template) Write(ctx context.Context, f *Function) error { + + // Apply fields from the template onto the function itself (Denormalize). + // The template is already the denormalized view of repo->runtime->template + // so it's values are treated as defaults. + // TODO: this begs the question: should the Template's manifest.yaml actually + // be a partially-populated func.yaml? + if f.Builder == "" { // as a special first case, this default comes from itself + f.Builder = f.Builders["default"] + if f.Builder == "" { // still nothing? then use the template + f.Builder = t.config.Builders["default"] + } + } + if len(f.Builders) == 0 { + f.Builders = t.config.Builders + } + if len(f.Buildpacks) == 0 { + f.Buildpacks = t.config.Buildpacks + } + if len(f.BuildEnvs) == 0 { + f.BuildEnvs = t.config.BuildEnvs + } + if f.HealthEndpoints.Liveness == "" { + f.HealthEndpoints.Liveness = t.config.HealthEndpoints.Liveness + } + if f.HealthEndpoints.Readiness == "" { + f.HealthEndpoints.Readiness = t.config.HealthEndpoints.Readiness + } + if f.Invocation.Format == "" { + f.Invocation.Format = t.config.Invocation.Format + } + + isManifest := func(p string) bool { + _, f := path.Split(p) + return f == templateManifest + } + + return copyFromFS(".", f.Root, maskingFS{fs: t.fs, masked: isManifest}) // copy everything but manifest.yaml +} diff --git a/vendor/knative.dev/kn-plugin-func/templates.go b/vendor/knative.dev/kn-plugin-func/templates.go new file mode 100644 index 0000000000..599bc3f3e9 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/templates.go @@ -0,0 +1,110 @@ +package function + +import ( + "context" + "errors" + "strings" +) + +var ( + ErrRepositoryNotFound = errors.New("repository not found") + ErrRepositoriesNotDefined = errors.New("custom template repositories location not specified") + ErrTemplatesNotFound = errors.New("templates path (runtimes) not found") + ErrRuntimeNotFound = errors.New("runtime not found") + ErrTemplateNotFound = errors.New("template not found") + ErrTemplateMissingRepository = errors.New("template name missing repository prefix") +) + +// Templates Manager +type Templates struct { + client *Client +} + +// newTemplates manager +// Includes a back-reference to client (logic tree root) such +// that the templates manager has full access to the API for +// use in its implementations. +func newTemplates(client *Client) *Templates { + return &Templates{client: client} +} + +// List the full name of templates available for the runtime. +// Full name is the optional repository prefix plus the template's repository +// local name. Default templates grouped first sans prefix. +func (t *Templates) List(runtime string) ([]string, error) { + names := []string{} + extended := newSortedSet() + + rr, err := t.client.Repositories().All() + if err != nil { + return []string{}, err + } + + for _, r := range rr { + tt, err := r.Templates(runtime) + if err != nil { + return []string{}, err + } + for _, t := range tt { + if r.Name == DefaultRepositoryName { + names = append(names, t.Name()) + } else { + extended.Add(t.Fullname()) + } + } + } + return append(names, extended.Items()...), nil +} + +// Template returns the named template in full form '[repo]/[name]' for the +// specified runtime. +// Templates from the default repository do not require the repo name prefix, +// though it can be provided. +func (t *Templates) Get(runtime, fullname string) (Template, error) { + var ( + template Template + repoName string + tplName string + repo Repository + err error + ) + + // Split into repo and template names. + // Defaults when unprefixed to DefaultRepository + cc := strings.Split(fullname, "/") + if len(cc) == 1 { + repoName = DefaultRepositoryName + tplName = fullname + } else { + repoName = cc[0] + tplName = cc[1] + } + + // Get specified repository + repo, err = t.client.Repositories().Get(repoName) + if err != nil { + return template, err + } + + return repo.Template(runtime, tplName) +} + +// Write a function's template to disk. +// Returns a Function which may have been modified dependent on the content +// of the template (which can define default Function fields, builders, +// buildpacks, etc) +func (t *Templates) Write(f *Function) error { + // Templates require an initially valid Function to write + // (has name, path, runtime etc) + if err := f.Validate(); err != nil { + return err + } + + // The Function's Template + template, err := t.Get(f.Runtime, f.Template) + if err != nil { + return err + } + + return template.Write(context.TODO(), f) +} diff --git a/vendor/knative.dev/kn-plugin-func/utils/names.go b/vendor/knative.dev/kn-plugin-func/utils/names.go new file mode 100644 index 0000000000..40114e3285 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/utils/names.go @@ -0,0 +1,104 @@ +package utils + +import ( + "errors" + "fmt" + "strings" + + "k8s.io/apimachinery/pkg/util/validation" +) + +// ErrInvalidName indicates the name did not pass function name validation. +type ErrInvalidFunctionName error + +// ErrInvalidEnvVarName indicates the name did not pass env var name validation. +type ErrInvalidEnvVarName error + +// ErrInvalidConfigMapKey indicates the key specified for ConfigMap did not pass validation. +type ErrInvalidConfigMapKey error + +// ErrInvalidSecretKey indicates the key specified for ConfigMap did not pass validation. +type ErrInvalidSecretKey error + +// ErrInvalidLabel indicates the name did not pass label key validation, or the value did not pass label value validation. +type ErrInvalidLabel error + +// ValidateFunctionName validatest that the input name is a valid function name, ie. valid DNS-1123 label. +// It must consist of lower case alphanumeric characters or '-' and start and end with an alphanumeric character +// (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?') +func ValidateFunctionName(name string) error { + + if errs := validation.IsDNS1123Label(name); len(errs) > 0 { + // In case of invalid name the error is this: + // "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', + // and must start and end with an alphanumeric character (e.g. 'my-name', + // or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')" + // Let's reuse it for our purposes, ie. replace "a lowercase RFC 1123 label" substring with "Function name" and the actual function name + return ErrInvalidFunctionName(errors.New(strings.Replace(strings.Join(errs, ""), "a lowercase RFC 1123 label", fmt.Sprintf("Function name '%v'", name), 1))) + } + + return nil +} + +// ValidateEnvVarName validatest that the input name is a valid Kubernetes Environmet Variable name. +// It must must consist of alphabetic characters, digits, '_', '-', or '.', and must not start with a digit +// (e.g. 'my.env-name', or 'MY_ENV.NAME', or 'MyEnvName1', regex used for validation is '[-._a-zA-Z][-._a-zA-Z0-9]*' +func ValidateEnvVarName(name string) error { + if errs := validation.IsEnvVarName(name); len(errs) > 0 { + return ErrInvalidEnvVarName(errors.New(strings.Join(errs, ""))) + } + + return nil +} + +// ValidateConfigMapKey validatest that the input ConfigMap key is valid. +// It must must consist of alphabetic characters, digits, '_', '-', or '.', regex used for validation is '[-._a-zA-Z0-9]+' +func ValidateConfigMapKey(key string) error { + if errs := validation.IsConfigMapKey(key); len(errs) > 0 { + return ErrInvalidConfigMapKey(errors.New(strings.Join(errs, ""))) + } + + return nil +} + +// ValidateSecretKey validatest that the input Secret key is valid. +// It must must consist of alphabetic characters, digits, '_', '-', or '.', regex used for validation is '[-._a-zA-Z0-9]+' +func ValidateSecretKey(key string) error { + if errs := validation.IsConfigMapKey(key); len(errs) > 0 { + return ErrInvalidSecretKey(errors.New(strings.Join(errs, ""))) + } + + return nil +} + +// ValidateLabelKey validates that the input name is a valid Kubernetes key. +// Valid label names have two segments: an optional prefix and name, separated by a slash (/). +// The name segment is required and must be 63 characters or less, beginning and ending with +// an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and +// alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: +// a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed +// by a slash (/). +func ValidateLabelKey(key string) error { + errs := validation.IsQualifiedName(key) + if len(errs) > 0 { + return ErrInvalidLabel(errors.New(strings.Join(errs, ""))) + } + return nil +} + +// ValidateLabelValue ensures that the input is a Kubernetes label value +// Valid label values must be 63 characters or less (can be empty), +// unless empty, must begin and end with an alphanumeric character ([a-z0-9A-Z]), +// could contain dashes (-), underscores (_), dots (.), and alphanumerics between. +// Label values may also come from the environment and therefore, could be enclosed with {{}} +// Treat this as a special case. +func ValidateLabelValue(value string) error { + var errs []string + if !strings.HasPrefix(value, "{{") { + errs = append(errs, validation.IsValidLabelValue(value)...) + } + if len(errs) > 0 { + return ErrInvalidLabel(errors.New(strings.Join(errs, ""))) + } + return nil +} diff --git a/vendor/knative.dev/kn-plugin-func/version.txt b/vendor/knative.dev/kn-plugin-func/version.txt new file mode 100644 index 0000000000..286d5b09c8 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/version.txt @@ -0,0 +1 @@ +0.24.0 \ No newline at end of file diff --git a/vendor/knative.dev/kn-plugin-func/zz_filesystem_generated.go b/vendor/knative.dev/kn-plugin-func/zz_filesystem_generated.go new file mode 100644 index 0000000000..fee5679847 --- /dev/null +++ b/vendor/knative.dev/kn-plugin-func/zz_filesystem_generated.go @@ -0,0 +1,12803 @@ +// Code generated by go generate; DO NOT EDIT. +package function + +var templatesZip = []byte{ + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x52, 0x45, + 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x7c, 0x93, 0x4f, 0x4f, 0xdc, 0x3c, 0x10, 0xc6, 0xef, 0xfe, 0x14, 0x23, 0x71, 0x01, 0x69, 0x95, 0xbc, 0xe8, 0x15, 0x95, 0xda, 0x73, 0xbb, 0xb4, 0x97, + 0x0a, 0xb1, 0x54, 0x95, 0xb8, 0x90, 0x89, 0x3d, 0x9b, 0x8c, 0xd6, 0x7f, 0x22, 0xcf, 0x98, 0x25, 0x7c, 0xfa, 0xca, 0x59, 0x76, 0x01, 0x09, 0x71, 0x4c, 0xec, 0x67, 0x66, 0x9e, 0x67, 0x7e, 0x3e, + 0x83, 0x3b, 0x0a, 0x93, 0x47, 0x25, 0x31, 0xe6, 0xec, 0x0c, 0x6e, 0xd0, 0xee, 0x70, 0xe0, 0x38, 0x18, 0xf3, 0x77, 0xa4, 0x08, 0x65, 0x72, 0xf5, 0x0c, 0x30, 0x13, 0x04, 0x74, 0x04, 0x9a, 0x40, + 0x47, 0x12, 0x02, 0x3d, 0xea, 0x56, 0xf5, 0xc7, 0x0c, 0xa1, 0x88, 0x42, 0x4f, 0x30, 0x2d, 0x15, 0xc8, 0xc1, 0xb9, 0x50, 0x66, 0xf4, 0xfc, 0x4c, 0x0e, 0x50, 0x00, 0xe1, 0x3a, 0x41, 0x3f, 0x2b, + 0x01, 0xe6, 0x8c, 0xf3, 0x85, 0xe9, 0x67, 0xc8, 0x25, 0x46, 0x8e, 0x03, 0x74, 0x01, 0x77, 0x04, 0xcf, 0xcf, 0x0f, 0x5b, 0xf6, 0x24, 0xb3, 0x28, 0x85, 0x87, 0x81, 0x22, 0x65, 0x54, 0x72, 0xcd, + 0x90, 0xba, 0x15, 0x60, 0x74, 0x60, 0x47, 0xb2, 0xbb, 0x7a, 0x9f, 0x63, 0xed, 0x09, 0x99, 0xa4, 0x78, 0xc5, 0xa8, 0xd0, 0x7d, 0xa2, 0x85, 0x7a, 0xd0, 0x2c, 0xee, 0x7e, 0xa6, 0x3d, 0xb0, 0xc2, + 0x3e, 0xe5, 0x9d, 0x18, 0x73, 0x37, 0x12, 0x74, 0x4d, 0x7b, 0xbc, 0xdc, 0x9e, 0x1c, 0x75, 0xe0, 0x38, 0x93, 0xd5, 0x94, 0x67, 0xb0, 0x29, 0x2a, 0x72, 0x94, 0x3a, 0xfd, 0x94, 0xd3, 0x90, 0x31, + 0x80, 0x8e, 0xa8, 0x70, 0x94, 0xc9, 0xa7, 0xcd, 0x9b, 0xa5, 0x4b, 0x3d, 0x05, 0x47, 0x5b, 0x8e, 0x24, 0x6f, 0x32, 0x80, 0x47, 0xcc, 0x8c, 0xbd, 0x27, 0x88, 0x18, 0xc8, 0x41, 0x77, 0x9a, 0xe0, + 0x9e, 0xa7, 0x17, 0xe9, 0xe9, 0xca, 0x69, 0x90, 0xfb, 0x5f, 0x37, 0x90, 0x69, 0xca, 0x24, 0x14, 0x15, 0x95, 0x53, 0x84, 0xb4, 0x5d, 0xf2, 0x38, 0xc9, 0x5f, 0xe7, 0x3f, 0x14, 0xf9, 0xa8, 0x25, + 0x4b, 0xd5, 0x44, 0x28, 0x42, 0xae, 0x6e, 0x95, 0xa3, 0xd4, 0x28, 0x19, 0x95, 0x80, 0x9e, 0xa6, 0x94, 0x95, 0x1c, 0x0c, 0x3e, 0xf5, 0xe8, 0x5f, 0x45, 0xdd, 0xb6, 0x44, 0x5b, 0x5b, 0x36, 0x3f, + 0x42, 0x4f, 0xce, 0x91, 0x3b, 0xe1, 0xb3, 0xde, 0x74, 0x2b, 0xb3, 0x1f, 0xd9, 0x8e, 0xc0, 0x61, 0xf2, 0x14, 0x28, 0xaa, 0x40, 0xad, 0xe9, 0x30, 0xbb, 0x1a, 0x1f, 0x47, 0xa5, 0xbc, 0x45, 0x5b, + 0x23, 0xdb, 0x4a, 0x73, 0x4b, 0xe8, 0xbe, 0x73, 0x5e, 0x6f, 0xba, 0x65, 0xb9, 0xf5, 0xd7, 0x46, 0x51, 0xd7, 0x9b, 0xee, 0xb0, 0xac, 0xdb, 0xc5, 0x1b, 0x7a, 0x32, 0xe6, 0x4f, 0x54, 0xf6, 0x20, + 0xc5, 0x8e, 0xa0, 0x1c, 0xa8, 0xe2, 0x44, 0x4b, 0xff, 0x0a, 0x83, 0xd4, 0x10, 0x2c, 0xa0, 0x08, 0xa9, 0x54, 0x34, 0x7a, 0x8e, 0x98, 0x99, 0xa4, 0x5a, 0xe4, 0x68, 0x7d, 0x71, 0xe4, 0x5e, 0x90, + 0x31, 0x3d, 0x0a, 0x41, 0x37, 0x24, 0xe8, 0x0b, 0x7b, 0xd7, 0xc1, 0xd1, 0x0f, 0x7a, 0xd6, 0xb9, 0x22, 0x4b, 0x30, 0xaa, 0x4e, 0xf2, 0xad, 0x6d, 0x07, 0xd6, 0xb1, 0xf4, 0x8d, 0x4d, 0xa1, 0x1d, + 0x92, 0xc7, 0x38, 0xb4, 0x43, 0x6a, 0x59, 0xa4, 0x90, 0xb4, 0xff, 0x5f, 0x7d, 0xbd, 0xfa, 0xef, 0xc2, 0xec, 0x09, 0x22, 0x1d, 0xe2, 0x2b, 0x42, 0x90, 0x4a, 0x06, 0x5b, 0x44, 0x53, 0x80, 0x23, + 0xfb, 0x87, 0xfd, 0x88, 0xcd, 0x3c, 0x29, 0x9c, 0x7f, 0x48, 0x5b, 0x1b, 0x90, 0x63, 0x65, 0xe5, 0xa2, 0x31, 0xe6, 0x37, 0x2a, 0x3f, 0x52, 0x4d, 0xeb, 0xd5, 0x20, 0x47, 0xcd, 0xc9, 0x15, 0x7b, + 0x70, 0x71, 0x9d, 0xe0, 0xb2, 0xb9, 0xfc, 0x02, 0x36, 0x15, 0xef, 0xea, 0x83, 0x5b, 0x16, 0xb8, 0x4d, 0x19, 0xe8, 0x89, 0x6c, 0xd1, 0x65, 0x4f, 0x4b, 0x04, 0xf3, 0xca, 0x8c, 0x69, 0x4f, 0x8f, + 0x94, 0x2b, 0xf4, 0x16, 0x63, 0x4c, 0xfa, 0x4e, 0xe0, 0xb9, 0xcf, 0x58, 0x19, 0x59, 0xa7, 0x0c, 0x78, 0xfc, 0x84, 0x37, 0xae, 0x8e, 0xd3, 0x1e, 0x5e, 0xaf, 0xa4, 0x92, 0x6d, 0x25, 0xd1, 0x9d, + 0x70, 0xac, 0xf3, 0xbd, 0x43, 0xaf, 0x31, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x06, 0xe4, 0x80, 0x4d, 0x46, 0x02, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, + 0x64, 0x54, 0x52, 0x5f, 0x4f, 0xfb, 0x46, 0x10, 0x7c, 0xbf, 0x4f, 0x31, 0x0d, 0x0f, 0x21, 0x12, 0x8e, 0xf9, 0xbd, 0x21, 0xbf, 0x52, 0x28, 0x95, 0x5a, 0x15, 0xa9, 0xa9, 0x5a, 0x89, 0xa2, 0xfa, + 0x7c, 0xde, 0xc4, 0x47, 0xce, 0xbb, 0xee, 0xfd, 0x31, 0x44, 0x55, 0xbf, 0xfb, 0x4f, 0x77, 0x24, 0x10, 0xde, 0xec, 0xd9, 0xdd, 0x9b, 0xd9, 0xd9, 0xb9, 0xc0, 0x4f, 0x82, 0x5b, 0x27, 0xa9, 0xc7, + 0xdd, 0x4c, 0x1c, 0x03, 0xee, 0x13, 0x9b, 0x68, 0x85, 0x95, 0xfa, 0x93, 0x9c, 0x91, 0x91, 0x10, 0x05, 0x07, 0x49, 0x1e, 0x4c, 0xaf, 0xb9, 0xfb, 0xd4, 0xf0, 0x03, 0x36, 0x03, 0xa1, 0x13, 0xeb, + 0xc8, 0x4f, 0x4e, 0x47, 0xc2, 0xf6, 0x58, 0x81, 0x91, 0x9e, 0x60, 0x34, 0xa3, 0x23, 0x6c, 0x25, 0x71, 0x0f, 0xcb, 0x78, 0x6a, 0x07, 0xcd, 0xbd, 0xa3, 0xf5, 0x4e, 0xda, 0xe7, 0xcb, 0x8f, 0xef, + 0xd5, 0x1a, 0x9b, 0xc1, 0x7e, 0xf2, 0xc2, 0x06, 0x8c, 0xa4, 0x39, 0x66, 0x5e, 0x4f, 0x61, 0x12, 0xee, 0x41, 0x6f, 0xc6, 0xa5, 0x60, 0x67, 0x72, 0x87, 0x0c, 0x3f, 0x9d, 0x2b, 0x7e, 0xbe, 0x1c, + 0x62, 0x9c, 0x42, 0x53, 0xd7, 0x26, 0xa3, 0x54, 0xc0, 0xb5, 0x95, 0x7a, 0x75, 0x85, 0x2e, 0xc5, 0xac, 0xbd, 0x68, 0xf1, 0x34, 0xca, 0x4c, 0x88, 0x03, 0xc1, 0x0c, 0x64, 0xf6, 0xd8, 0x8a, 0x47, + 0xcc, 0xd4, 0x96, 0x0b, 0xfa, 0x21, 0x5f, 0x67, 0xc1, 0x11, 0xaf, 0xd6, 0xb9, 0x0f, 0x05, 0x2f, 0x29, 0x44, 0x6c, 0x2d, 0x17, 0x3b, 0x26, 0xa7, 0x2d, 0x63, 0xd6, 0x6c, 0x9d, 0xd3, 0xb0, 0x6c, + 0x64, 0xb4, 0xbc, 0xc3, 0xc3, 0x66, 0xf3, 0x08, 0x4f, 0xff, 0x26, 0x0a, 0x31, 0xac, 0x95, 0xba, 0xb8, 0xc0, 0x8f, 0x34, 0x93, 0x93, 0x69, 0x24, 0x8e, 0x4a, 0x1d, 0x7f, 0x8a, 0x91, 0x5b, 0xd2, + 0x31, 0x79, 0x0a, 0xe8, 0x0e, 0xd0, 0x7d, 0x9f, 0xc7, 0x35, 0x22, 0x85, 0xb2, 0xf6, 0xc9, 0xaa, 0x7f, 0x32, 0x70, 0xee, 0xd7, 0x09, 0x58, 0x15, 0xf1, 0xa4, 0xcd, 0x70, 0x7a, 0xe8, 0xaa, 0xa8, + 0x36, 0xc2, 0x5b, 0xeb, 0xc7, 0xa2, 0x5e, 0xfc, 0x3e, 0xe0, 0xd5, 0xc6, 0x01, 0xed, 0x4e, 0xca, 0xd3, 0xed, 0x5a, 0xa9, 0x3f, 0xa6, 0x3e, 0x9f, 0x2a, 0xef, 0xeb, 0x13, 0x73, 0xe1, 0x65, 0xed, + 0x64, 0x07, 0xd9, 0x7e, 0x75, 0x21, 0x85, 0x5c, 0xcc, 0x50, 0x9b, 0xb1, 0x16, 0xb7, 0xbf, 0xfc, 0x0c, 0xf1, 0x30, 0xce, 0x12, 0x47, 0x38, 0xdb, 0x79, 0xed, 0x0f, 0x57, 0x27, 0xb7, 0x8e, 0xe7, + 0xb6, 0x3c, 0xcb, 0x9e, 0xfa, 0xe3, 0xb4, 0xc6, 0xa8, 0x39, 0x69, 0xe7, 0x0e, 0x95, 0xf1, 0xa4, 0x23, 0xf5, 0xef, 0x61, 0x2b, 0x97, 0x6b, 0x94, 0x6a, 0xdb, 0xd6, 0x08, 0x07, 0x71, 0xa4, 0x4c, + 0xf2, 0x0e, 0xd5, 0x8c, 0xea, 0x2f, 0x3c, 0xfe, 0xf6, 0xfb, 0x06, 0x55, 0x8f, 0xe5, 0x7f, 0x8b, 0x91, 0x42, 0xd0, 0x3b, 0x5a, 0x34, 0x58, 0x0c, 0xe4, 0x9c, 0x2c, 0xfe, 0x5f, 0xe2, 0x6f, 0x05, + 0x54, 0x0f, 0xcb, 0x5b, 0xe1, 0x48, 0x1c, 0xab, 0x78, 0x98, 0xa8, 0x81, 0x9e, 0x26, 0x67, 0x8d, 0xce, 0xca, 0xeb, 0x97, 0x20, 0xfc, 0xd9, 0x46, 0x95, 0xed, 0x1b, 0x7c, 0x3b, 0x07, 0x82, 0x24, + 0x6f, 0xa8, 0x41, 0x09, 0x4c, 0x55, 0x12, 0x53, 0xd1, 0x9b, 0x1e, 0x27, 0x47, 0x5f, 0xda, 0x52, 0xf7, 0x42, 0x26, 0x36, 0xb8, 0x33, 0x83, 0x64, 0x6f, 0x33, 0xdf, 0x79, 0xc3, 0x3b, 0xf5, 0xaf, + 0x87, 0xb2, 0xce, 0x97, 0xc9, 0x89, 0xcc, 0x4c, 0x3e, 0x58, 0xe1, 0x06, 0xdf, 0xd6, 0xd7, 0xef, 0xb5, 0x9c, 0xd3, 0xa6, 0xae, 0x9d, 0x18, 0xed, 0x06, 0x09, 0xb1, 0xb9, 0xb9, 0xbe, 0xb9, 0xae, + 0xb3, 0x09, 0x4a, 0xdd, 0x8b, 0xc7, 0x28, 0xf9, 0x8e, 0x81, 0x08, 0x4f, 0x25, 0xa5, 0x92, 0x05, 0x45, 0x42, 0x2f, 0x26, 0xe5, 0x04, 0x95, 0xed, 0x9e, 0x2f, 0x97, 0xa7, 0xbc, 0xef, 0x6c, 0x1c, + 0x52, 0xb7, 0x36, 0x32, 0xd6, 0x7b, 0xd6, 0xd1, 0xce, 0x54, 0x05, 0xcd, 0x7d, 0x27, 0x6f, 0xf5, 0x9e, 0xab, 0xc9, 0xa5, 0x9d, 0xe5, 0x2a, 0xdf, 0xae, 0x8e, 0x9e, 0xa8, 0x1e, 0xb5, 0xe5, 0xba, + 0x17, 0x13, 0x96, 0x2b, 0xa5, 0xbe, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9e, 0x2b, 0x64, 0x7b, 0x4a, 0x02, 0x00, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x04, 0xc0, 0xd1, 0x11, 0x80, 0x20, 0x08, 0x00, 0xd0, 0x7f, 0xa6, 0x60, 0x81, 0x30, 0xbd, 0x5a, 0x28, 0x25, + 0xf3, 0x52, 0xb9, 0x54, 0x98, 0xbf, 0xd7, 0x24, 0x69, 0x65, 0xbc, 0xb5, 0xc7, 0x55, 0xa4, 0x03, 0x64, 0x41, 0x4f, 0xfe, 0x00, 0x18, 0xfc, 0x69, 0x19, 0x8c, 0xb9, 0xac, 0x47, 0x2f, 0x8a, 0xd2, + 0x5c, 0xac, 0xa2, 0x89, 0x8d, 0xfb, 0x9a, 0x6e, 0xa6, 0x77, 0xcb, 0xe2, 0x2c, 0xa0, 0x05, 0x3a, 0x69, 0x87, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9a, 0xe7, 0x37, 0x3e, 0x49, + 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x8c, 0x52, 0xc1, + 0x8a, 0xdb, 0x40, 0x0c, 0x3d, 0x5b, 0x5f, 0xf1, 0xf0, 0xa1, 0xc4, 0x26, 0xf5, 0x40, 0x8f, 0xbd, 0x95, 0x6d, 0x60, 0x6f, 0x29, 0xa1, 0x3d, 0xf4, 0xd4, 0xb8, 0x33, 0x8a, 0x33, 0xec, 0x78, 0x14, + 0xc6, 0x9a, 0xb0, 0x4b, 0xe9, 0xbf, 0x17, 0x3b, 0x61, 0x9b, 0x06, 0xd7, 0xec, 0xc5, 0x1e, 0x3d, 0x3d, 0xe9, 0x89, 0x27, 0x9d, 0x5a, 0xfb, 0xd4, 0x76, 0x8c, 0x43, 0x8e, 0x56, 0xbd, 0x44, 0x22, + 0xdf, 0x9f, 0x24, 0x29, 0x56, 0x54, 0x94, 0x56, 0xa2, 0xf2, 0xb3, 0x96, 0x54, 0x94, 0x87, 0x5e, 0x4b, 0xa2, 0xa2, 0xec, 0xbc, 0x1e, 0xf3, 0xcf, 0xc6, 0x4a, 0x6f, 0x6c, 0x90, 0xec, 0xf8, 0xcc, + 0x51, 0x07, 0x33, 0xb8, 0xa7, 0xf7, 0x9d, 0x98, 0xf3, 0x07, 0x33, 0x01, 0x25, 0x55, 0x44, 0xc6, 0xe0, 0xb1, 0x8d, 0x2e, 0x30, 0xda, 0x88, 0x09, 0x6e, 0x68, 0x94, 0xb9, 0xa2, 0x2b, 0xab, 0xcf, + 0xb8, 0x2a, 0x34, 0x0f, 0x97, 0xff, 0x1a, 0x7c, 0x65, 0x6e, 0xc6, 0x6f, 0x85, 0x55, 0x7d, 0x13, 0xae, 0xc1, 0x29, 0x49, 0xaa, 0xf0, 0x8b, 0x0a, 0x53, 0x53, 0x81, 0x1a, 0xdf, 0xb7, 0xdf, 0x76, + 0x78, 0xd8, 0x7e, 0xde, 0xe0, 0x71, 0xb3, 0xdb, 0x8c, 0xd0, 0x04, 0x7f, 0x4d, 0x2f, 0x48, 0x39, 0x46, 0x1f, 0x3b, 0xec, 0x3b, 0x81, 0xf2, 0xa0, 0xfb, 0x06, 0xf8, 0xe4, 0x1c, 0x7a, 0x49, 0x3c, + 0x01, 0x68, 0x07, 0xbc, 0x48, 0x86, 0x15, 0xc7, 0xf0, 0x11, 0xfb, 0xe3, 0x34, 0xd7, 0x8f, 0x31, 0xd7, 0x74, 0xb2, 0x6f, 0xc6, 0x56, 0x86, 0xa8, 0x38, 0xf4, 0xda, 0x7c, 0x49, 0x3e, 0x6a, 0x88, + 0xab, 0x72, 0xc7, 0x96, 0xfd, 0x99, 0xdd, 0x65, 0xce, 0xb2, 0xfa, 0x37, 0xcd, 0x15, 0x8c, 0x01, 0xdb, 0xa3, 0x40, 0x05, 0x41, 0x6c, 0x1b, 0x20, 0x59, 0x4f, 0x59, 0xa9, 0x48, 0xac, 0x39, 0x45, + 0xbc, 0xe3, 0x35, 0xa2, 0x0f, 0xb7, 0x3c, 0xdb, 0x86, 0xc0, 0x89, 0x7e, 0x13, 0x99, 0x9a, 0xb6, 0x7a, 0xe4, 0x84, 0x21, 0x9f, 0xc6, 0x35, 0xb0, 0x7b, 0xdd, 0x0c, 0x06, 0xdf, 0xc5, 0x56, 0x73, + 0xe2, 0xe1, 0x23, 0x51, 0x71, 0x35, 0xb1, 0xfa, 0xfb, 0xba, 0xb8, 0xf3, 0x1a, 0xdf, 0x59, 0x5b, 0xfd, 0x37, 0x71, 0x57, 0x77, 0xeb, 0xff, 0x2c, 0xb8, 0xac, 0xb3, 0xc6, 0x6c, 0x83, 0x45, 0xd6, + 0xc2, 0x04, 0xb8, 0x3d, 0x80, 0x79, 0xc6, 0xec, 0x8d, 0xbc, 0x51, 0x78, 0xb6, 0xfb, 0x72, 0xc9, 0xbc, 0x1c, 0xd5, 0x86, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf9, 0xa7, + 0xe7, 0x98, 0x5d, 0x01, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, + 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x5c, 0x90, 0x41, 0x8b, 0xdb, 0x30, 0x10, 0x85, 0xcf, 0x9a, 0x5f, 0x31, 0x15, 0x94, 0x48, 0xc5, 0xb5, 0xa0, 0xc7, 0x42, 0x0e, 0x6d, 0x77, 0x4b, 0x7b, 0xe9, 0x65, + 0xf3, 0x07, 0x14, 0x69, 0x62, 0x8b, 0x38, 0x92, 0x91, 0xc6, 0xd9, 0x5d, 0xca, 0xfe, 0xf7, 0x32, 0x4e, 0x1a, 0xc2, 0x9e, 0x6c, 0x3f, 0x3f, 0xbe, 0x79, 0xef, 0xcd, 0x3e, 0x1c, 0xfd, 0x40, 0x78, + 0x58, 0x72, 0xe0, 0x54, 0x32, 0x40, 0x3a, 0xcd, 0xa5, 0x32, 0x1a, 0x50, 0x3a, 0x94, 0xcc, 0xf4, 0xc2, 0x1a, 0x94, 0x66, 0x6a, 0x9c, 0xf2, 0xa0, 0x01, 0x94, 0x1e, 0x12, 0x8f, 0xcb, 0xbe, 0x0f, + 0xe5, 0xe4, 0xc2, 0x54, 0x96, 0x48, 0x67, 0xca, 0xdc, 0x5c, 0x8b, 0xc7, 0xcf, 0x43, 0x71, 0xe7, 0x2f, 0x6e, 0x15, 0x34, 0x58, 0x00, 0xe7, 0x70, 0x47, 0x8d, 0x7f, 0xf9, 0x1c, 0x27, 0x42, 0xca, + 0x6d, 0xa9, 0xd4, 0x90, 0x47, 0xcf, 0x78, 0xd5, 0x7c, 0x08, 0x34, 0x73, 0x43, 0x8f, 0x67, 0x3f, 0xa5, 0x88, 0x3f, 0x84, 0xf8, 0x28, 0x00, 0x7c, 0x4e, 0x3c, 0x96, 0x85, 0x91, 0x6a, 0x2d, 0xb5, + 0x07, 0x89, 0x78, 0x47, 0x33, 0x8c, 0x9f, 0xae, 0xa9, 0xfa, 0x9d, 0xc5, 0xbf, 0xa0, 0x9c, 0xc3, 0x6f, 0xad, 0xd1, 0x69, 0x3f, 0x11, 0x28, 0xc2, 0xaf, 0x5b, 0x5c, 0x83, 0xf4, 0x7f, 0xe8, 0xd9, + 0x58, 0x50, 0xd4, 0x3f, 0x11, 0xff, 0x7e, 0x30, 0x3a, 0x45, 0xfd, 0xff, 0x73, 0xf7, 0x3a, 0x93, 0xd1, 0xfc, 0x3a, 0xd3, 0x4d, 0x7a, 0x2a, 0x4b, 0x0d, 0x64, 0x74, 0x5b, 0x9f, 0x37, 0xf9, 0xc1, + 0xb3, 0x37, 0x5a, 0xe6, 0x70, 0xf3, 0xe4, 0x53, 0xd6, 0x1d, 0xea, 0xe8, 0xd9, 0x6b, 0x0b, 0x97, 0xcb, 0x81, 0x41, 0x51, 0x18, 0x4b, 0x27, 0x79, 0xe5, 0xf8, 0x35, 0xe6, 0x75, 0xc4, 0xfe, 0xbb, + 0x0f, 0xc7, 0xa1, 0x96, 0x25, 0x47, 0x63, 0x3b, 0x24, 0x0b, 0x2a, 0x1d, 0x56, 0xeb, 0x87, 0x2d, 0xe6, 0x34, 0x49, 0x01, 0xc5, 0xfd, 0x4f, 0xcf, 0x7e, 0x32, 0x54, 0xab, 0x05, 0xf5, 0x06, 0xb7, + 0x4e, 0x95, 0x2f, 0xf6, 0x30, 0x16, 0xdc, 0xde, 0xfb, 0x1f, 0x65, 0x9b, 0x83, 0xd1, 0x95, 0x02, 0xa5, 0x33, 0xc5, 0xf5, 0xd7, 0x65, 0x7f, 0x8b, 0xce, 0xe1, 0xc1, 0xa7, 0x09, 0x4b, 0x16, 0x59, + 0x80, 0x02, 0x69, 0x5c, 0x53, 0x1e, 0x8c, 0xb0, 0xfa, 0xb5, 0x95, 0xb5, 0x92, 0xe1, 0xd2, 0xe6, 0x1d, 0x96, 0x47, 0xc2, 0x1b, 0x7a, 0xc5, 0x22, 0xbd, 0xcc, 0x14, 0x98, 0x22, 0x8a, 0x1f, 0xb9, + 0xe0, 0x9e, 0x70, 0x23, 0xef, 0x9b, 0x0e, 0x87, 0xc2, 0xb8, 0xf9, 0xd8, 0x36, 0xba, 0xc3, 0x7b, 0xbc, 0x5c, 0x7e, 0x83, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x4a, + 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, + 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x90, 0x31, 0x6e, 0xc3, 0x30, 0x0c, 0x45, 0x77, 0x9f, 0xe2, 0x23, 0x1e, 0xb2, 0xe5, 0x00, 0x59, 0x8b, 0x16, 0xed, 0xd6, 0x21, 0x17, 0x60, 0xa4, 0x6f, 0x5b, 0xa8, + 0x4d, 0x19, 0x22, 0xe5, 0xb4, 0xb7, 0x2f, 0xe4, 0xa2, 0x49, 0x46, 0x91, 0xc0, 0x7b, 0xd4, 0xeb, 0x91, 0x57, 0x4f, 0x59, 0x65, 0x3e, 0x01, 0x1f, 0xba, 0xe5, 0x20, 0xed, 0x89, 0xc8, 0x21, 0x29, + 0x0d, 0x53, 0x52, 0x37, 0x0c, 0xb9, 0x60, 0xca, 0x37, 0xbc, 0x55, 0x0d, 0x6d, 0x6d, 0x08, 0x85, 0xe2, 0x8c, 0xa8, 0x96, 0x74, 0x84, 0x4f, 0xc9, 0xba, 0x1e, 0xce, 0x65, 0x9d, 0xc5, 0x89, 0x20, + 0x8a, 0x2b, 0x91, 0x74, 0xcb, 0x5f, 0x8c, 0x27, 0xe0, 0x32, 0xd1, 0x08, 0xa3, 0x7b, 0xd2, 0xd1, 0xfe, 0xf7, 0x75, 0x8d, 0x3b, 0x24, 0x2b, 0x7c, 0x22, 0x0a, 0xad, 0xce, 0x2e, 0xea, 0x5d, 0x7f, + 0x37, 0x41, 0x0c, 0x91, 0x1b, 0xe7, 0xbc, 0x2e, 0x54, 0xc7, 0x5a, 0xf2, 0x58, 0x68, 0x46, 0x83, 0x67, 0x50, 0xad, 0x16, 0xe2, 0xf8, 0x27, 0x3a, 0xee, 0x5c, 0x99, 0x6f, 0xf2, 0x63, 0xf0, 0x92, + 0xc6, 0x91, 0xa5, 0x81, 0xbb, 0x1e, 0xfc, 0x66, 0xa8, 0x3b, 0x2f, 0x0f, 0x10, 0x94, 0xaa, 0xda, 0xee, 0xbe, 0x5b, 0x92, 0x9a, 0x8b, 0x06, 0xee, 0x3f, 0x75, 0x5a, 0x3b, 0x13, 0xa2, 0xf1, 0xd9, + 0x7d, 0xea, 0xd2, 0xbd, 0xcf, 0xb9, 0x03, 0xfa, 0xa7, 0x5e, 0xd6, 0xb8, 0x8f, 0x3a, 0x43, 0xc9, 0xcb, 0x1e, 0xe5, 0x91, 0x24, 0x19, 0xb6, 0x24, 0xb8, 0x8a, 0xa5, 0x80, 0xf7, 0xcb, 0xe5, 0x13, + 0x2f, 0x73, 0xae, 0xf1, 0x75, 0xa3, 0x7a, 0x87, 0xe6, 0x5d, 0xc4, 0xcf, 0x38, 0x84, 0x36, 0x65, 0x9b, 0x1e, 0xba, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb5, 0x17, 0x55, + 0x3f, 0xf5, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x4c, 0x91, + 0xbf, 0x8e, 0xdb, 0x3c, 0x10, 0xc4, 0x7b, 0x3e, 0xc5, 0x7c, 0x70, 0x71, 0x67, 0xe0, 0xb3, 0xd4, 0xbb, 0x4d, 0x70, 0x49, 0x80, 0x14, 0x29, 0x1c, 0xa4, 0x38, 0x1c, 0x42, 0x8a, 0x5c, 0x49, 0x84, + 0xc9, 0x5d, 0x85, 0x7f, 0xec, 0xf3, 0xdb, 0x07, 0xd4, 0x59, 0x46, 0x3a, 0x69, 0x76, 0xf7, 0x37, 0xb3, 0xcb, 0x1d, 0xbe, 0x08, 0xbe, 0x9e, 0x4e, 0x3f, 0xf0, 0x52, 0xd9, 0x16, 0x2f, 0xac, 0xd4, + 0x2f, 0x0a, 0x56, 0x22, 0xa1, 0x08, 0x6e, 0x52, 0x13, 0x98, 0xae, 0xad, 0x6b, 0x6b, 0xf8, 0x0f, 0xa7, 0x99, 0x30, 0x88, 0x0f, 0x94, 0x96, 0x60, 0x0a, 0x61, 0xbc, 0x57, 0x60, 0xc5, 0x11, 0xac, + 0x61, 0x0c, 0x84, 0x51, 0x2a, 0x3b, 0x78, 0x56, 0xaf, 0x7a, 0x36, 0xec, 0x02, 0x75, 0x93, 0xe8, 0xb7, 0xe7, 0xc7, 0xf7, 0xbe, 0xc3, 0x69, 0xf6, 0xf9, 0x81, 0x45, 0xa2, 0xbc, 0x08, 0xbb, 0xdc, + 0x7c, 0xd7, 0x44, 0x89, 0xfe, 0x54, 0xca, 0x25, 0x77, 0x4a, 0xed, 0x76, 0xf8, 0x4c, 0x17, 0x0a, 0xb2, 0x44, 0xe2, 0xa2, 0xd4, 0xfd, 0x67, 0x8d, 0x36, 0x92, 0x29, 0x35, 0x51, 0xc6, 0x70, 0x83, + 0x71, 0xce, 0xf3, 0x04, 0x83, 0x42, 0xb9, 0x34, 0xd0, 0x66, 0xfe, 0xbb, 0x09, 0xff, 0x26, 0xd8, 0x84, 0x3d, 0x46, 0x49, 0x8a, 0x8c, 0x9d, 0x37, 0xd0, 0xff, 0x30, 0xec, 0x60, 0x85, 0x47, 0x9f, + 0x22, 0x7c, 0xc1, 0x55, 0xd2, 0x39, 0xe3, 0xea, 0xcb, 0x0c, 0x3d, 0xc9, 0x8a, 0xd6, 0x9d, 0x52, 0x3f, 0x17, 0xd7, 0x96, 0x2f, 0x33, 0x21, 0x55, 0xe6, 0xd5, 0x97, 0x4d, 0x90, 0x09, 0x32, 0xae, + 0xea, 0xe3, 0x2c, 0x35, 0xb7, 0x62, 0x93, 0x74, 0xd3, 0x34, 0x3e, 0x7d, 0xff, 0x06, 0x49, 0xb0, 0xc1, 0xb7, 0x6d, 0x82, 0x1f, 0x92, 0x49, 0xb7, 0x0f, 0x5f, 0x5f, 0xb6, 0x03, 0x7a, 0xbe, 0xc8, + 0x99, 0x1c, 0xc6, 0x24, 0xf1, 0xe3, 0x21, 0x86, 0x24, 0xd7, 0x4c, 0xa9, 0x8d, 0xae, 0x62, 0x23, 0x5a, 0x89, 0xb1, 0xcd, 0x05, 0xcf, 0x74, 0x54, 0x4a, 0x6b, 0x6d, 0x85, 0xb3, 0x04, 0x52, 0xb6, + 0xa6, 0x80, 0xb9, 0x94, 0xe5, 0xd8, 0xf7, 0xf1, 0xb6, 0x85, 0xe9, 0xe8, 0xdd, 0xc4, 0x25, 0x50, 0x67, 0x25, 0xf6, 0xad, 0x5d, 0xa9, 0x17, 0x49, 0x88, 0xd2, 0x16, 0xcf, 0x44, 0x78, 0xbd, 0x53, + 0x97, 0x40, 0x85, 0xe0, 0xc4, 0xd6, 0x76, 0x72, 0xd3, 0x66, 0xdf, 0x9e, 0x9f, 0x1a, 0x2f, 0x1f, 0xfb, 0x7e, 0xf2, 0x65, 0xae, 0xc3, 0x0a, 0x39, 0xb3, 0x29, 0xfe, 0x42, 0x87, 0x6c, 0xd8, 0x0d, + 0xf2, 0xde, 0x9f, 0xf9, 0xb0, 0x84, 0x3a, 0x79, 0x3e, 0x34, 0xcf, 0xbe, 0x24, 0xa2, 0x3e, 0x1a, 0xcf, 0xbd, 0x13, 0x9b, 0x9f, 0xf6, 0x4a, 0xa9, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, + 0x07, 0x08, 0x28, 0xec, 0x7c, 0x05, 0x80, 0x01, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0xca, 0xcd, 0x4f, 0x29, 0xcd, 0x49, + 0x55, 0x48, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0xe3, 0xe2, 0x4a, 0xcf, 0x57, 0x30, 0xd4, 0x33, 0x34, 0xe1, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, 0xe0, 0x7c, + 0xeb, 0x1f, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x94, 0x91, 0xd1, 0x6b, 0xe2, 0x40, 0x10, 0xc6, + 0x9f, 0xb3, 0x7f, 0xc5, 0x47, 0xa0, 0x47, 0x22, 0x92, 0xbc, 0x0b, 0x3e, 0x5c, 0x7b, 0x16, 0x1f, 0xee, 0x50, 0x52, 0xcb, 0x71, 0x70, 0x50, 0x63, 0x32, 0xc6, 0x60, 0xdc, 0x8d, 0xb3, 0x93, 0x50, + 0x29, 0xfe, 0xef, 0xc7, 0x6e, 0x2c, 0xa7, 0xed, 0x53, 0x45, 0xd8, 0xc9, 0x7c, 0x33, 0xdf, 0xfe, 0xf8, 0xb6, 0xcd, 0x8b, 0x7d, 0x5e, 0x11, 0xb6, 0x9d, 0x2e, 0xa4, 0x36, 0x5a, 0xa9, 0xfa, 0xd0, + 0x1a, 0x16, 0x44, 0x2a, 0x08, 0x0b, 0xa3, 0x85, 0x5e, 0x25, 0x54, 0x41, 0xb8, 0x3d, 0xf8, 0x43, 0x93, 0xa4, 0x3b, 0x91, 0xd6, 0xd5, 0x56, 0xb8, 0xd6, 0x95, 0x0d, 0x55, 0xac, 0x54, 0x9a, 0x62, + 0x9e, 0xeb, 0xb2, 0x21, 0xe4, 0x1a, 0xf3, 0xd5, 0x6a, 0x89, 0x8c, 0x8e, 0x1d, 0x59, 0x49, 0x94, 0x73, 0xbe, 0x88, 0x51, 0x21, 0xaf, 0xb8, 0x98, 0x26, 0x0f, 0xc3, 0x39, 0x06, 0x93, 0x85, 0xf3, + 0x4c, 0x32, 0xb2, 0xad, 0xd1, 0x96, 0x7e, 0x73, 0x2d, 0xc4, 0x4e, 0x38, 0x62, 0x74, 0x51, 0xbc, 0x59, 0x8c, 0x37, 0x15, 0xa4, 0x23, 0x15, 0x60, 0x84, 0x3f, 0x8b, 0xe7, 0x0c, 0x0f, 0x8b, 0x1f, + 0x33, 0xcc, 0x67, 0xd9, 0xcc, 0xb5, 0x7c, 0x7b, 0xc5, 0x27, 0x70, 0xa7, 0x75, 0xad, 0x2b, 0xac, 0x2b, 0x03, 0x21, 0x2b, 0xeb, 0x04, 0xf8, 0x5e, 0x96, 0x38, 0x18, 0x26, 0xdf, 0x40, 0x6e, 0x71, + 0x32, 0x1d, 0x0a, 0x53, 0x12, 0x6a, 0x8d, 0xf5, 0xce, 0xe3, 0xbd, 0x38, 0x2d, 0xa9, 0xcc, 0x3a, 0x71, 0x56, 0xa9, 0x52, 0xc1, 0xf6, 0x20, 0xc9, 0x92, 0x6b, 0x2d, 0x8d, 0x8e, 0xc2, 0x8c, 0x0a, + 0xaa, 0x7b, 0x2a, 0x1d, 0x97, 0xa3, 0x09, 0xe3, 0xdb, 0x81, 0x96, 0x49, 0xe4, 0xe4, 0xbf, 0x22, 0xa6, 0x63, 0x1c, 0xc3, 0xff, 0xd2, 0x14, 0x54, 0xec, 0x0c, 0xc4, 0xa0, 0x31, 0x45, 0xde, 0xc0, + 0x74, 0xd2, 0x76, 0x32, 0xec, 0x3e, 0xb6, 0x6e, 0x7c, 0x1b, 0x31, 0xd9, 0x31, 0x3e, 0x1b, 0x5c, 0xed, 0x16, 0x79, 0xd3, 0x10, 0xab, 0xb3, 0x1a, 0x02, 0xfd, 0x30, 0xfb, 0x31, 0xa7, 0xe1, 0x6d, + 0x5c, 0x5c, 0x1b, 0x4c, 0xa6, 0xf8, 0x76, 0x79, 0xab, 0xe4, 0xbe, 0xab, 0x9b, 0x92, 0xf8, 0xed, 0x7c, 0x7b, 0xfd, 0x66, 0x8c, 0xf0, 0xae, 0xc7, 0xfb, 0xff, 0xaf, 0x0e, 0x7d, 0xfa, 0xc9, 0x2f, + 0x92, 0x9d, 0x29, 0x87, 0xfa, 0x39, 0xfb, 0x39, 0x14, 0x4b, 0x36, 0x62, 0x86, 0x72, 0x6e, 0xac, 0xb8, 0x14, 0x0c, 0x63, 0x3f, 0x46, 0xdf, 0xbb, 0xbb, 0x38, 0xd7, 0x15, 0x0d, 0x2a, 0xe5, 0x25, + 0xb1, 0x83, 0xf0, 0x13, 0x2f, 0x63, 0x5c, 0x0d, 0xf4, 0xbd, 0x17, 0x3e, 0x61, 0x00, 0x77, 0xfd, 0xe4, 0x9d, 0xc1, 0x99, 0xc6, 0x2a, 0x08, 0xce, 0x2a, 0x38, 0x2b, 0x15, 0xd4, 0xdb, 0x2b, 0x2a, + 0x4c, 0xa7, 0x08, 0x97, 0x8b, 0xa7, 0x55, 0xe8, 0x8d, 0x3c, 0x59, 0xce, 0x96, 0x1e, 0x0d, 0x1f, 0x22, 0xb7, 0xf4, 0xdf, 0xb9, 0xd1, 0xde, 0xfa, 0xde, 0x94, 0xa7, 0x49, 0x18, 0x5f, 0x70, 0xf6, + 0x37, 0x38, 0x6e, 0xdd, 0x6d, 0x7e, 0x1d, 0x8a, 0x49, 0x3a, 0xd6, 0xd8, 0x24, 0x4f, 0x3e, 0xe3, 0x28, 0x56, 0x67, 0xf5, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x66, 0xb8, 0x89, + 0xe0, 0xc1, 0x01, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x64, 0x90, 0xc1, + 0x8a, 0xdb, 0x30, 0x10, 0x86, 0xcf, 0x9a, 0xa7, 0x98, 0x0a, 0x0a, 0xf6, 0x62, 0xe4, 0xa5, 0xc7, 0x85, 0x5c, 0x76, 0x69, 0xbb, 0xa7, 0x52, 0xb6, 0x7e, 0x01, 0x21, 0x8d, 0x13, 0x11, 0x47, 0x72, + 0xa4, 0x51, 0xec, 0x12, 0xf2, 0xee, 0x45, 0x4a, 0x02, 0xa1, 0x7b, 0xb1, 0xc5, 0xcc, 0xfc, 0xff, 0xfc, 0xf3, 0xcd, 0xda, 0xec, 0xf5, 0x96, 0x70, 0xcc, 0xde, 0xb0, 0x0b, 0x1e, 0xc0, 0x1d, 0xe6, + 0x10, 0x19, 0x1b, 0x10, 0xd2, 0x04, 0xcf, 0xb4, 0xb2, 0x04, 0x21, 0x3d, 0x71, 0xbf, 0x63, 0x9e, 0x1f, 0xdf, 0xf5, 0xc3, 0x94, 0xea, 0x40, 0xf9, 0x3b, 0xbf, 0x95, 0xd0, 0x02, 0xf4, 0x3d, 0x0e, + 0x94, 0xf8, 0x5d, 0x7b, 0x3b, 0x11, 0x92, 0x4f, 0x39, 0x52, 0x42, 0xde, 0x69, 0xc6, 0x7b, 0x6d, 0x25, 0x93, 0x99, 0x12, 0x2e, 0x8e, 0x77, 0x21, 0x33, 0x52, 0x8c, 0x21, 0xa2, 0xf6, 0x16, 0x23, + 0x71, 0x8e, 0xbe, 0x8c, 0x53, 0x31, 0x7a, 0x1f, 0x86, 0xdf, 0xf8, 0xed, 0xf9, 0x19, 0x13, 0x6b, 0xce, 0x09, 0x4d, 0xb0, 0x84, 0xce, 0x5b, 0x67, 0x74, 0xd9, 0x87, 0x3e, 0x5c, 0xb5, 0x49, 0x41, + 0xb9, 0xe1, 0x61, 0x71, 0xc3, 0xf8, 0x74, 0x4b, 0xa5, 0x86, 0x16, 0xcf, 0x20, 0x4e, 0x3a, 0x96, 0xbb, 0xc4, 0x82, 0x88, 0x1b, 0xbc, 0xa7, 0x57, 0xbf, 0x68, 0xf9, 0x20, 0x13, 0xa2, 0xa5, 0xd8, + 0xb4, 0x20, 0x44, 0xa4, 0xe3, 0xa7, 0xf6, 0x31, 0x53, 0xe2, 0x46, 0xfe, 0xfc, 0x3e, 0xc8, 0x0e, 0x65, 0xe9, 0xbd, 0xf4, 0x3d, 0xad, 0xfa, 0x30, 0x4f, 0xa4, 0x4c, 0x38, 0xf4, 0x95, 0x43, 0x87, + 0xde, 0x4d, 0x57, 0x8b, 0x84, 0x4f, 0x65, 0x4a, 0x7d, 0x50, 0x9a, 0x83, 0x4f, 0x04, 0xa2, 0x05, 0x10, 0xb7, 0x64, 0x37, 0xb0, 0xea, 0x55, 0x9b, 0xfd, 0x36, 0x86, 0xec, 0x6d, 0xd3, 0x76, 0xb8, + 0x74, 0x18, 0xe9, 0xd8, 0x42, 0x55, 0x6f, 0x70, 0x29, 0xda, 0x3c, 0x71, 0xc9, 0x64, 0x69, 0xa4, 0x88, 0x91, 0x92, 0x7a, 0x0d, 0xf6, 0xaf, 0x7a, 0x9b, 0x42, 0xa2, 0xa6, 0x18, 0xba, 0xb1, 0x56, + 0xff, 0x54, 0x38, 0x6f, 0x85, 0xcd, 0x97, 0x4d, 0xc5, 0x75, 0x06, 0x21, 0x58, 0xfd, 0xd0, 0xac, 0xa7, 0xb1, 0x91, 0xd9, 0xd3, 0x3a, 0x93, 0x61, 0x2a, 0x7c, 0xaf, 0x81, 0x2a, 0xc9, 0x17, 0xfc, + 0x7a, 0x92, 0xdd, 0x7f, 0x16, 0x2d, 0x88, 0x0b, 0x5c, 0xe0, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x97, 0xcc, 0x0b, 0x00, 0x53, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x67, 0x6f, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x54, 0x90, 0x41, 0xd2, 0xd3, 0x30, 0x0c, 0x85, 0xf7, 0x39, 0xc5, 0x9b, 0x3f, + 0x8b, 0x6e, 0x98, 0x1c, 0xa0, 0x07, 0x60, 0x60, 0x45, 0x67, 0xc8, 0x05, 0xd4, 0xf8, 0x25, 0xf6, 0x90, 0xc8, 0xc1, 0x92, 0x5b, 0x7a, 0x7b, 0xc6, 0x29, 0xb4, 0xb0, 0x94, 0x65, 0x7d, 0xdf, 0x93, + 0x7a, 0xe4, 0xdd, 0x53, 0x56, 0x59, 0x07, 0xe0, 0xab, 0xde, 0xf2, 0x24, 0xad, 0x44, 0xe0, 0x9c, 0x94, 0x86, 0x98, 0xd4, 0x0d, 0x73, 0x2e, 0x88, 0xf9, 0x8e, 0xcf, 0x55, 0xa7, 0xd6, 0x36, 0x4c, + 0x85, 0xe2, 0x0c, 0xa8, 0x96, 0x74, 0x81, 0xc7, 0x64, 0x5d, 0x0f, 0xe7, 0xb6, 0xaf, 0xe2, 0xc4, 0x24, 0x8a, 0x2b, 0x91, 0xf4, 0x96, 0x7f, 0x30, 0x0c, 0xc0, 0x18, 0x69, 0x84, 0xd1, 0x3d, 0xe9, + 0x62, 0x7f, 0xfb, 0x75, 0x0f, 0x07, 0x24, 0x2b, 0x3c, 0x12, 0x85, 0x56, 0x57, 0x17, 0xf5, 0xae, 0x7f, 0x99, 0x20, 0x86, 0xc0, 0x1b, 0xd7, 0xbc, 0x6f, 0x54, 0xc7, 0x5e, 0xf2, 0x52, 0x68, 0x46, + 0x83, 0x67, 0x50, 0xad, 0x16, 0xe2, 0xf4, 0x14, 0x9d, 0x0e, 0xae, 0xac, 0x77, 0x79, 0x18, 0xbc, 0xa4, 0x65, 0x61, 0x69, 0xe0, 0xae, 0x07, 0x7f, 0x71, 0xaa, 0x07, 0x2f, 0xcf, 0x10, 0x94, 0xaa, + 0xda, 0x72, 0xbf, 0x2c, 0x49, 0xcd, 0x45, 0x27, 0x1e, 0x9b, 0x3a, 0xad, 0xc5, 0x84, 0x68, 0xf8, 0xd7, 0x3d, 0x74, 0xe9, 0x75, 0x9f, 0x73, 0x07, 0xf4, 0x6d, 0x2b, 0xbc, 0xdf, 0xda, 0xec, 0x26, + 0xfe, 0x44, 0xc4, 0x64, 0xef, 0x73, 0x24, 0x83, 0xa0, 0x09, 0x82, 0x94, 0x80, 0x2f, 0xe3, 0x78, 0x41, 0xe1, 0xcf, 0x4a, 0xf3, 0x4f, 0xb8, 0xc7, 0x34, 0xc5, 0x83, 0x76, 0x7d, 0xb4, 0xab, 0x4b, + 0x5d, 0xfd, 0x18, 0xd0, 0xe7, 0xc7, 0xcb, 0xb7, 0xef, 0x63, 0x0b, 0xdd, 0xe0, 0x98, 0x13, 0xd7, 0x60, 0xad, 0xf4, 0xff, 0xd5, 0x1b, 0xcd, 0x64, 0xe1, 0xd0, 0xe1, 0x4f, 0x8a, 0x33, 0x3e, 0xa2, + 0xfb, 0xfe, 0xd1, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf1, 0x21, 0x93, 0xab, 0x16, 0x01, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, + 0x79, 0x61, 0x6d, 0x6c, 0x54, 0x8f, 0xb1, 0x6a, 0xf4, 0x30, 0x10, 0x84, 0x7b, 0x3d, 0xc5, 0xc0, 0xb5, 0x3f, 0xbe, 0xfb, 0x5b, 0xf7, 0x81, 0x34, 0x21, 0x4d, 0x02, 0xe9, 0xc2, 0x9e, 0x35, 0x3e, + 0x89, 0xc8, 0x2b, 0x23, 0xad, 0x1d, 0xfc, 0xf6, 0xc1, 0xf6, 0xf9, 0xe0, 0xda, 0xd9, 0x91, 0xbe, 0x6f, 0x6a, 0x17, 0x38, 0xc8, 0xf7, 0xcc, 0x52, 0x63, 0xd6, 0x16, 0x97, 0xe6, 0xd2, 0xfc, 0xc7, + 0x09, 0x1f, 0x81, 0xb8, 0x87, 0xe8, 0x73, 0xc1, 0x20, 0x1a, 0x7b, 0x56, 0x6b, 0x16, 0x19, 0x12, 0xf6, 0x57, 0xce, 0xed, 0x3d, 0x95, 0x81, 0x98, 0x2a, 0xfd, 0xd6, 0xb4, 0x10, 0x2b, 0x92, 0xe8, + 0x6d, 0x92, 0x1b, 0x31, 0x4a, 0xf7, 0x83, 0xc2, 0x31, 0xd7, 0x68, 0xb9, 0x2c, 0xf8, 0x0d, 0x54, 0x14, 0xf6, 0x2c, 0xd4, 0x8e, 0xde, 0x9d, 0x10, 0x15, 0x16, 0x88, 0xcf, 0xaf, 0x7f, 0x10, 0xf5, + 0x88, 0x56, 0x0f, 0xb0, 0x5b, 0x3f, 0x6e, 0xe1, 0xd9, 0xcb, 0x94, 0xcc, 0x3d, 0x3b, 0xae, 0xf0, 0xf7, 0xd1, 0x62, 0x56, 0x49, 0x0d, 0x5e, 0x29, 0xc9, 0x02, 0xa8, 0x7e, 0xcc, 0x51, 0xad, 0x6e, + 0x26, 0x9e, 0x63, 0xca, 0xcb, 0xaa, 0x35, 0x69, 0xb7, 0x36, 0xeb, 0x0a, 0x93, 0x94, 0x50, 0x26, 0xb5, 0x38, 0xb0, 0x36, 0xee, 0x84, 0x37, 0x59, 0x70, 0x25, 0xf2, 0xcc, 0x52, 0xa2, 0xf7, 0x54, + 0x5c, 0x97, 0xa3, 0x70, 0x5f, 0x4b, 0xb3, 0xa8, 0xb7, 0x0a, 0xb1, 0x4d, 0xf5, 0x31, 0x2e, 0x71, 0x66, 0x6a, 0x5c, 0xd8, 0xe0, 0x2f, 0x07, 0xbb, 0x75, 0x40, 0x8a, 0x33, 0x95, 0xb5, 0xb6, 0x38, + 0xef, 0xd7, 0xf3, 0x91, 0x38, 0xa0, 0x50, 0x7c, 0x7c, 0xbe, 0x3e, 0x22, 0xf7, 0x17, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc0, 0x10, 0x6b, 0x5e, 0xee, 0x00, 0x00, 0x00, 0x91, 0x01, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x84, 0x54, 0x5d, 0x6f, 0x23, 0x35, 0x14, 0x7d, 0xf7, 0xaf, 0x38, 0xa4, 0x0f, 0x6d, 0x51, 0x33, 0x93, 0xb2, 0x2c, 0x94, + 0xbc, 0xad, 0x2a, 0xd0, 0x22, 0x21, 0x58, 0xd1, 0x20, 0x40, 0xa1, 0x92, 0x1d, 0xfb, 0x26, 0xe3, 0xd4, 0xe3, 0x3b, 0xb2, 0x3d, 0x49, 0x23, 0xc4, 0x7f, 0x47, 0x76, 0x32, 0xf9, 0x10, 0x45, 0xfb, + 0x14, 0xe5, 0xfa, 0x5c, 0xcf, 0xf1, 0xb9, 0xe7, 0x9e, 0x2b, 0xfc, 0xcc, 0x86, 0xaa, 0x75, 0xc4, 0xa3, 0xe3, 0xde, 0xe0, 0xfb, 0x0d, 0xf9, 0x14, 0xf1, 0x43, 0xef, 0x75, 0xb2, 0xec, 0x85, 0xf8, + 0x9d, 0x9c, 0xe6, 0x96, 0x90, 0x18, 0x3b, 0xee, 0x03, 0x3c, 0x6d, 0x8f, 0x2d, 0xcb, 0x03, 0x0a, 0x5d, 0xe0, 0x35, 0xe9, 0xf4, 0x05, 0x66, 0x0d, 0x61, 0xc1, 0xd6, 0x51, 0xe8, 0x9c, 0x4a, 0x74, + 0x44, 0x08, 0xcd, 0x86, 0xa0, 0x95, 0xc7, 0x82, 0xb0, 0xe4, 0xde, 0x1b, 0x58, 0x8f, 0xb9, 0xb4, 0xde, 0xd0, 0x6b, 0xb5, 0x8e, 0xf2, 0xf9, 0xa6, 0xaa, 0x87, 0x3f, 0xb7, 0x15, 0x66, 0x8d, 0x3d, + 0xbb, 0xde, 0x46, 0xb4, 0xa4, 0x7c, 0x12, 0x89, 0x11, 0x28, 0x76, 0xec, 0x4d, 0xe6, 0x33, 0x3f, 0xa7, 0xfc, 0x7c, 0xd3, 0xa4, 0xd4, 0xc5, 0x69, 0x5d, 0xeb, 0x5c, 0xa5, 0x52, 0xac, 0x2c, 0xd7, + 0xb7, 0x95, 0x10, 0x57, 0x57, 0xf8, 0x89, 0xb5, 0x72, 0xa0, 0x57, 0xd2, 0xfd, 0xfe, 0x61, 0x1f, 0x96, 0x89, 0xc2, 0x50, 0xf0, 0x2b, 0x48, 0xdf, 0xb5, 0xb0, 0x3e, 0x26, 0xe5, 0x9c, 0xbc, 0xcb, + 0x8f, 0x2d, 0x7c, 0x43, 0xef, 0x91, 0x2e, 0xd8, 0xb8, 0x7c, 0x93, 0xdb, 0x61, 0xb1, 0x3b, 0x75, 0x8b, 0xd2, 0x9d, 0xb1, 0xe5, 0x54, 0x56, 0x42, 0x64, 0x29, 0x42, 0xef, 0x93, 0x6d, 0x09, 0x5b, + 0xeb, 0xf2, 0xb7, 0x3b, 0x8e, 0x84, 0xd4, 0x04, 0x22, 0x90, 0x37, 0x1d, 0xdb, 0x4c, 0x51, 0x08, 0xe0, 0x4b, 0xc8, 0x5a, 0x16, 0xf1, 0x86, 0x3a, 0x96, 0x1c, 0xf6, 0x82, 0x0f, 0xdf, 0xad, 0x0e, + 0xb8, 0x86, 0x94, 0x4b, 0x4d, 0x1d, 0x48, 0x19, 0xeb, 0x29, 0xc6, 0x37, 0xfa, 0x14, 0x8e, 0xa7, 0xd8, 0xc3, 0xa1, 0x1b, 0xd2, 0x2f, 0x97, 0x37, 0x38, 0xbb, 0xa1, 0xff, 0xbd, 0x60, 0x38, 0xbc, + 0xec, 0x2f, 0x8f, 0x3a, 0xaf, 0xc4, 0x61, 0xa6, 0x4a, 0x6b, 0x8a, 0x91, 0xca, 0x58, 0x0b, 0xed, 0x45, 0xe0, 0x6d, 0xa4, 0x00, 0x95, 0xc4, 0x3c, 0x4f, 0x66, 0x5a, 0xd7, 0x45, 0x9a, 0x86, 0x63, + 0x9a, 0x3e, 0x4c, 0x1e, 0x26, 0xff, 0x79, 0xc8, 0xf3, 0xcd, 0x2d, 0x94, 0x37, 0x9f, 0x81, 0x0f, 0xc4, 0x9e, 0x6f, 0x6e, 0x2b, 0xfc, 0x79, 0x18, 0x52, 0x1f, 0x09, 0x52, 0xf7, 0xc1, 0xc9, 0xec, + 0x0b, 0xf9, 0xe9, 0x97, 0xa7, 0x99, 0x84, 0xf2, 0x28, 0x2e, 0xc8, 0xae, 0x49, 0xcd, 0xc9, 0x8b, 0xc7, 0xa7, 0x4e, 0x85, 0x90, 0x52, 0x6a, 0xf6, 0x91, 0x1d, 0x89, 0xdc, 0x8e, 0xf1, 0x1f, 0xc8, + 0xcd, 0x18, 0x1b, 0x5c, 0xff, 0x3d, 0xf2, 0xaa, 0xa5, 0xd1, 0x14, 0xa3, 0x99, 0x5d, 0x51, 0x18, 0xdd, 0x61, 0xa4, 0xfb, 0x98, 0xb8, 0xa5, 0xf0, 0xa3, 0xc9, 0xe5, 0xc9, 0xfd, 0x57, 0xef, 0xbe, + 0x7e, 0xff, 0xcd, 0xb7, 0x0f, 0xdf, 0x8d, 0xfe, 0xb9, 0xc6, 0x5f, 0x02, 0x18, 0x7f, 0xbc, 0x7e, 0x64, 0x9f, 0xc8, 0xa7, 0x71, 0xda, 0x75, 0x34, 0x85, 0xea, 0x3a, 0x67, 0xb5, 0xca, 0x9f, 0xad, + 0xd7, 0x91, 0xfd, 0x09, 0x46, 0x63, 0x6b, 0xa6, 0xb8, 0x3f, 0x2f, 0x44, 0xee, 0x83, 0xa6, 0x29, 0x8a, 0x81, 0xc7, 0x85, 0xfb, 0x98, 0x5e, 0x55, 0xdb, 0x39, 0x3a, 0x87, 0xed, 0x6f, 0x36, 0xb4, + 0xa9, 0x5e, 0xbc, 0x4a, 0x76, 0x43, 0xd5, 0x1b, 0xa0, 0xd8, 0x91, 0xde, 0x50, 0x88, 0x96, 0xfd, 0x14, 0xf7, 0xd5, 0x64, 0x7f, 0xf6, 0xa6, 0xb2, 0x59, 0x84, 0x83, 0x5d, 0x8f, 0xae, 0x51, 0xde, + 0x9c, 0x2c, 0x70, 0xf4, 0x6a, 0xd6, 0x59, 0xcc, 0x79, 0x43, 0xc1, 0xb1, 0x32, 0xe3, 0x2e, 0x70, 0xa2, 0x22, 0xe9, 0x69, 0xf9, 0xb6, 0xdb, 0x6d, 0xe5, 0xbb, 0x76, 0x1d, 0x2b, 0xcd, 0x6d, 0xdd, + 0x29, 0xfd, 0xa2, 0x56, 0x54, 0xbf, 0xd1, 0xb2, 0x9f, 0x75, 0x59, 0x8c, 0x61, 0xa5, 0xb7, 0x36, 0x35, 0x90, 0x1f, 0x67, 0xb3, 0x4f, 0x78, 0x3f, 0x79, 0x87, 0x27, 0x0a, 0x1b, 0xab, 0x09, 0xbf, + 0x79, 0xb5, 0x51, 0xd6, 0xa9, 0x85, 0x23, 0xb9, 0xc7, 0x28, 0xc8, 0x47, 0x67, 0xb3, 0x3c, 0xbf, 0x52, 0x0a, 0x3b, 0x99, 0x2d, 0x69, 0x28, 0xc0, 0x2e, 0xc5, 0xc5, 0xca, 0xe4, 0xe0, 0x30, 0x94, + 0x28, 0xb4, 0xd6, 0x53, 0x89, 0x8c, 0x05, 0x61, 0xe0, 0x42, 0xe6, 0x0e, 0x0b, 0x95, 0x2d, 0xcb, 0xbe, 0xf8, 0xa3, 0xa5, 0x96, 0xc3, 0x0e, 0x7d, 0x54, 0x2b, 0x2a, 0xe4, 0xca, 0x04, 0xe0, 0x98, + 0x3b, 0x18, 0x72, 0x6a, 0xb7, 0x0f, 0x92, 0x19, 0xc5, 0xb2, 0xf1, 0xe2, 0x32, 0xa3, 0x0e, 0x11, 0x08, 0xeb, 0xb5, 0xeb, 0x0d, 0x45, 0x28, 0xcc, 0x7b, 0x6f, 0x13, 0x12, 0xc5, 0x94, 0xd3, 0x2d, + 0xff, 0xd6, 0xb9, 0x92, 0x13, 0xae, 0x08, 0xac, 0xbc, 0x98, 0x5b, 0x9f, 0x68, 0x15, 0x8a, 0x41, 0x2e, 0x91, 0x67, 0x07, 0xfb, 0x48, 0xfc, 0xe0, 0x1c, 0x64, 0x8e, 0x4a, 0x2c, 0xad, 0xa3, 0x98, + 0x17, 0x2d, 0xb3, 0xce, 0x60, 0x18, 0x1b, 0x48, 0x27, 0x0e, 0x3b, 0xa1, 0x42, 0x49, 0x9d, 0xea, 0xc2, 0xda, 0x39, 0x9b, 0x32, 0xae, 0x4c, 0xfa, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, + 0x07, 0x08, 0x08, 0x73, 0x18, 0x7f, 0xf2, 0x02, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x8c, 0x54, 0xcb, 0x6e, 0xdb, 0x30, 0x10, 0xbc, 0xeb, 0x2b, 0x06, 0xe9, 0x41, 0x76, 0x20, 0x4b, 0x40, 0x8f, 0x36, 0x5c, 0x14, 0x48, 0x0d, 0xa4, 0x3d, 0x34, 0x45, + 0x92, 0x16, 0xc8, 0x91, 0x22, 0xd7, 0x16, 0x13, 0x89, 0xab, 0x90, 0x94, 0x1f, 0x35, 0xfc, 0xef, 0x05, 0x45, 0xc5, 0xb1, 0xd1, 0x20, 0xc8, 0x49, 0xc4, 0xce, 0xce, 0x70, 0xf6, 0x21, 0x4a, 0x36, + 0xce, 0x63, 0x8f, 0xab, 0x9a, 0x3b, 0xb5, 0x58, 0x93, 0xf1, 0x19, 0xae, 0xef, 0xef, 0x7f, 0xe1, 0x80, 0x39, 0x2c, 0x3d, 0x77, 0xda, 0xd2, 0x28, 0x95, 0x01, 0xa5, 0x80, 0xba, 0x74, 0x3c, 0x4b, + 0x92, 0xe2, 0xf2, 0x32, 0xc1, 0x25, 0x1e, 0xb8, 0xb3, 0x27, 0x4c, 0x54, 0xc2, 0xa8, 0x5a, 0x9b, 0x15, 0x96, 0x9d, 0x91, 0x5e, 0xb3, 0xc9, 0xa0, 0xcd, 0x9a, 0x9f, 0x48, 0x61, 0xa3, 0x7d, 0x05, + 0x12, 0xb2, 0xea, 0x45, 0xc9, 0xf9, 0x3c, 0x08, 0xdc, 0x57, 0xda, 0x81, 0xb6, 0xa2, 0x69, 0x6b, 0x3a, 0x92, 0x50, 0xf3, 0xca, 0x41, 0x7b, 0x07, 0x6d, 0xda, 0xce, 0x67, 0x10, 0x46, 0xc1, 0x92, + 0x6b, 0xd9, 0x28, 0x17, 0x85, 0xc4, 0xc9, 0xad, 0x41, 0x67, 0x53, 0x69, 0x59, 0x81, 0x64, 0xc5, 0xe4, 0xe0, 0x2b, 0x82, 0x36, 0x92, 0x9b, 0xe0, 0xa4, 0x37, 0x0d, 0x25, 0xbc, 0x48, 0xd0, 0x7b, + 0xfe, 0xee, 0x21, 0x85, 0x41, 0x49, 0xe7, 0xd6, 0xd2, 0x70, 0xfb, 0x10, 0x4a, 0xcf, 0xf3, 0x3c, 0x39, 0x7f, 0x4c, 0x33, 0x6d, 0xd3, 0x07, 0xd2, 0x41, 0xee, 0x6b, 0x2b, 0xac, 0x68, 0xb0, 0xbf, + 0x62, 0xe3, 0x69, 0xeb, 0x0f, 0x90, 0xf1, 0x00, 0x71, 0x3c, 0x71, 0xf9, 0x48, 0x32, 0xd6, 0xfb, 0x92, 0x1d, 0x43, 0xc7, 0xe4, 0xbc, 0x64, 0xb5, 0xeb, 0x7d, 0x0f, 0xcd, 0x41, 0x1f, 0xd0, 0x4b, + 0x08, 0xb3, 0x7b, 0x8f, 0xf7, 0xdc, 0x91, 0x8d, 0xc4, 0x78, 0x72, 0xde, 0x86, 0xa2, 0x15, 0x39, 0xb2, 0x5a, 0xd4, 0x7f, 0x49, 0x41, 0x38, 0x08, 0x33, 0x78, 0xc8, 0x3e, 0x20, 0x59, 0xf3, 0x2a, + 0x0c, 0x60, 0x15, 0x74, 0x22, 0x16, 0x2b, 0x6f, 0xc8, 0x57, 0xac, 0x1c, 0x96, 0x6c, 0x91, 0x6a, 0xb3, 0xe4, 0x34, 0x43, 0xba, 0x11, 0xd6, 0x84, 0x2f, 0x59, 0xcb, 0x36, 0xcd, 0x40, 0x5e, 0xbe, + 0x5b, 0x67, 0x45, 0x42, 0x91, 0x8d, 0x23, 0xea, 0xb7, 0xec, 0xa5, 0xde, 0x01, 0x38, 0xe5, 0xc6, 0x5a, 0x5e, 0xb9, 0xd1, 0xc0, 0xff, 0xd4, 0x18, 0x7f, 0x8f, 0x59, 0x79, 0xdf, 0xfe, 0x21, 0xeb, + 0xc2, 0x6e, 0x1d, 0xe9, 0xad, 0x65, 0xcf, 0x92, 0x6b, 0xac, 0x23, 0x12, 0x04, 0xee, 0x88, 0xa6, 0x08, 0xd9, 0x6e, 0x5a, 0x14, 0x2b, 0xed, 0xab, 0xae, 0xcc, 0x25, 0x37, 0xc5, 0x93, 0x11, 0x5e, + 0xaf, 0x69, 0xe2, 0x84, 0x51, 0x25, 0x6f, 0x8b, 0x27, 0x33, 0x69, 0xeb, 0x6e, 0xa5, 0xcd, 0x24, 0x6c, 0x4d, 0x51, 0xd6, 0x5c, 0x16, 0x8d, 0xd0, 0xa6, 0x50, 0x2c, 0x5d, 0xb1, 0xea, 0xb4, 0x22, + 0x57, 0x18, 0x56, 0xf4, 0xe8, 0xf2, 0x46, 0x7d, 0xf2, 0x15, 0x4d, 0x06, 0x2f, 0x93, 0xd8, 0x91, 0xb3, 0xcd, 0x39, 0x6e, 0xf2, 0x61, 0xd8, 0xd6, 0xe0, 0xf1, 0x6c, 0xbf, 0x8b, 0x24, 0xfe, 0xa6, + 0xfd, 0xff, 0x45, 0x98, 0x43, 0xb8, 0x9d, 0x91, 0x18, 0x0d, 0xa2, 0x59, 0xe4, 0x8d, 0x31, 0xff, 0x82, 0x7d, 0x02, 0x14, 0x05, 0x1e, 0x6e, 0x7e, 0xdf, 0xe2, 0xea, 0xe6, 0xdb, 0x02, 0xd7, 0x8b, + 0xdb, 0x45, 0x82, 0xd3, 0xf1, 0xe6, 0x61, 0x7a, 0xa3, 0x8b, 0x21, 0x72, 0x31, 0x9e, 0xbd, 0x05, 0xff, 0xb8, 0xbb, 0xf9, 0x99, 0xc7, 0x46, 0xea, 0xe5, 0xee, 0xf5, 0x26, 0xd3, 0xd5, 0x75, 0x86, + 0xcf, 0xe3, 0xf0, 0x0a, 0xbc, 0xa5, 0xda, 0x3b, 0xf9, 0x98, 0x26, 0xc5, 0xd7, 0xe6, 0x5c, 0xd1, 0x92, 0xef, 0xac, 0xe9, 0x47, 0x94, 0x97, 0xda, 0x08, 0xbb, 0x1b, 0x19, 0xda, 0x9c, 0xb4, 0x63, + 0x14, 0x2a, 0x04, 0x1c, 0x77, 0x56, 0xd2, 0x14, 0x69, 0xaf, 0x92, 0xc7, 0xce, 0xd8, 0x34, 0xeb, 0x41, 0xbf, 0x6b, 0x7b, 0x48, 0x56, 0x3c, 0x44, 0xc2, 0x03, 0x30, 0x8d, 0x6d, 0x4a, 0x80, 0x43, + 0xb8, 0xec, 0x30, 0x4b, 0x92, 0x86, 0x55, 0x57, 0x53, 0x4e, 0xdb, 0x96, 0xad, 0x77, 0x98, 0x63, 0xff, 0xd2, 0xe3, 0xc3, 0x2c, 0xf9, 0x17, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x22, + 0x89, 0xbf, 0x4c, 0x56, 0x02, 0x00, 0x00, 0x1b, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, + 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x90, 0x31, 0x6e, 0xc3, 0x30, 0x0c, 0x45, 0x77, 0x9f, 0xe2, 0x23, 0x1e, 0xb2, 0xe5, 0x00, 0x59, 0x8b, 0x16, 0xed, 0xd6, 0x21, 0x17, 0x60, 0xa4, + 0x6f, 0x5b, 0xa8, 0x4d, 0x19, 0x22, 0xe5, 0xb4, 0xb7, 0x2f, 0xe4, 0xa2, 0x49, 0x46, 0x91, 0xc0, 0x7b, 0xd4, 0xeb, 0x91, 0x57, 0x4f, 0x59, 0x65, 0x3e, 0x01, 0x1f, 0xba, 0xe5, 0x20, 0xed, 0x89, + 0xc8, 0x21, 0x29, 0x0d, 0x53, 0x52, 0x37, 0x0c, 0xb9, 0x60, 0xca, 0x37, 0xbc, 0x55, 0x0d, 0x6d, 0x6d, 0x08, 0x85, 0xe2, 0x8c, 0xa8, 0x96, 0x74, 0x84, 0x4f, 0xc9, 0xba, 0x1e, 0xce, 0x65, 0x9d, + 0xc5, 0x89, 0x20, 0x8a, 0x2b, 0x91, 0x74, 0xcb, 0x5f, 0x8c, 0x27, 0xe0, 0x32, 0xd1, 0x08, 0xa3, 0x7b, 0xd2, 0xd1, 0xfe, 0xf7, 0x75, 0x8d, 0x3b, 0x24, 0x2b, 0x7c, 0x22, 0x0a, 0xad, 0xce, 0x2e, + 0xea, 0x5d, 0x7f, 0x37, 0x41, 0x0c, 0x91, 0x1b, 0xe7, 0xbc, 0x2e, 0x54, 0xc7, 0x5a, 0xf2, 0x58, 0x68, 0x46, 0x83, 0x67, 0x50, 0xad, 0x16, 0xe2, 0xf8, 0x27, 0x3a, 0xee, 0x5c, 0x99, 0x6f, 0xf2, + 0x63, 0xf0, 0x92, 0xc6, 0x91, 0xa5, 0x81, 0xbb, 0x1e, 0xfc, 0x66, 0xa8, 0x3b, 0x2f, 0x0f, 0x10, 0x94, 0xaa, 0xda, 0xee, 0xbe, 0x5b, 0x92, 0x9a, 0x8b, 0x06, 0xee, 0x3f, 0x75, 0x5a, 0x3b, 0x13, + 0xa2, 0xf1, 0xd9, 0x7d, 0xea, 0xd2, 0xbd, 0xcf, 0xb9, 0x03, 0xfa, 0xa7, 0x5e, 0xd6, 0xb8, 0x8f, 0x3a, 0x43, 0xc9, 0xcb, 0x1e, 0xe5, 0x91, 0x24, 0x19, 0xb6, 0x24, 0xb8, 0x8a, 0xa5, 0x80, 0xf7, + 0xcb, 0xe5, 0x13, 0x2f, 0x73, 0xae, 0xf1, 0x75, 0xa3, 0x7a, 0x87, 0xe6, 0x5d, 0xc4, 0xcf, 0x38, 0x84, 0x36, 0x65, 0x9b, 0x1e, 0xba, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, + 0xb5, 0x17, 0x55, 0x3f, 0xf5, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0xe4, 0xbd, 0xe9, 0x97, 0xaa, 0xde, 0xb2, 0x20, 0xf8, 0xbd, 0xfe, 0x8a, 0xb3, 0xce, 0xa7, 0xee, 0xb6, 0x4c, 0x46, 0x01, + 0xdf, 0x5a, 0xaf, 0xfa, 0x89, 0xa0, 0x20, 0xa2, 0x28, 0xa0, 0x42, 0xaf, 0xba, 0xbd, 0x98, 0xe7, 0x79, 0x50, 0xe8, 0xea, 0xfb, 0xb7, 0xf7, 0x52, 0xd3, 0x4c, 0xcd, 0xd4, 0x4c, 0xd2, 0xdf, 0xb9, + 0xef, 0xd6, 0xad, 0xfe, 0x72, 0x0e, 0x1b, 0xc8, 0xc0, 0x1d, 0x11, 0x3b, 0x76, 0xcc, 0xfb, 0xff, 0xf9, 0x2f, 0xbf, 0x7e, 0xfd, 0x8e, 0xb5, 0xc8, 0xfa, 0xfd, 0x6f, 0xbf, 0x7e, 0x5b, 0xb5, 0x15, + 0x97, 0x7d, 0x57, 0x8b, 0xcd, 0xd0, 0xca, 0x7f, 0xff, 0xd7, 0xe3, 0xa3, 0xda, 0xca, 0x0b, 0x2f, 0x89, 0x8f, 0x4f, 0xc1, 0x17, 0xe8, 0x05, 0x3c, 0xdf, 0x0d, 0x13, 0x23, 0xb0, 0xbd, 0xd0, 0xda, + 0xbc, 0x3d, 0x85, 0x4f, 0xf7, 0x73, 0x2b, 0xab, 0xbc, 0xdc, 0x2a, 0x7e, 0xff, 0xdb, 0xaf, 0x32, 0xaf, 0xac, 0xd3, 0xbd, 0x54, 0x33, 0x02, 0xcd, 0x39, 0xdd, 0x3b, 0x7e, 0xec, 0xd7, 0xaf, 0xdf, + 0x6f, 0x57, 0x5f, 0x7e, 0xfa, 0xf4, 0xf8, 0xee, 0xe7, 0x4f, 0x4f, 0x42, 0xcf, 0xb0, 0xe2, 0xe2, 0xf4, 0xb7, 0xa3, 0x54, 0x33, 0x5c, 0xab, 0x0f, 0x5f, 0x3f, 0x36, 0xad, 0xd4, 0x8a, 0x4d, 0x2b, + 0x36, 0xbc, 0xab, 0x2f, 0x9f, 0x9e, 0x18, 0x61, 0x52, 0x99, 0xa7, 0xcf, 0x1d, 0x1f, 0xfc, 0xfe, 0xdb, 0xe0, 0xe5, 0xfa, 0x0f, 0x7f, 0xfd, 0xfa, 0x6d, 0x6b, 0x5a, 0xd1, 0xf7, 0x8b, 0x7e, 0x5e, + 0xc5, 0xa5, 0x77, 0xfe, 0x75, 0x7f, 0x03, 0x5f, 0x86, 0x2f, 0xe0, 0xef, 0xd7, 0x77, 0xfe, 0xdf, 0xab, 0xaf, 0xd4, 0xd4, 0xc3, 0x0f, 0xc5, 0x89, 0x69, 0x45, 0xe7, 0xdf, 0xfe, 0x37, 0xf8, 0x05, + 0x7c, 0x41, 0xaf, 0x3f, 0x52, 0x54, 0xa9, 0x95, 0x97, 0x56, 0x51, 0x9e, 0x1e, 0xa3, 0x2f, 0xe0, 0x0b, 0x7c, 0xfd, 0xb8, 0xd4, 0x52, 0xeb, 0xf5, 0x09, 0x84, 0x5c, 0x7d, 0xf9, 0xbf, 0x5c, 0x7d, + 0xff, 0xf4, 0x81, 0xff, 0x3b, 0x4a, 0xcc, 0x2a, 0xb4, 0x0a, 0xe0, 0x3f, 0x6c, 0xad, 0x28, 0x3d, 0xbb, 0x01, 0x34, 0xbf, 0xee, 0x1b, 0x49, 0x94, 0x7a, 0x47, 0x44, 0x5e, 0x61, 0xfa, 0x0a, 0x95, + 0xd0, 0x2d, 0x2a, 0x73, 0xab, 0x48, 0xc2, 0xda, 0x32, 0x8f, 0x8f, 0xdc, 0xb2, 0x4c, 0x8b, 0x7f, 0x03, 0x80, 0xdc, 0x72, 0xbc, 0xa2, 0xcc, 0x9b, 0x97, 0x38, 0x8d, 0xfc, 0xe2, 0x25, 0xc9, 0x9d, + 0xfb, 0x5f, 0x00, 0xfa, 0x37, 0xc3, 0xfe, 0x09, 0xf4, 0x4b, 0xe9, 0xb4, 0xef, 0xe0, 0xbd, 0xb8, 0xb4, 0x9c, 0xdc, 0x2b, 0x9b, 0x23, 0xfc, 0xc2, 0xd5, 0x06, 0x10, 0xdc, 0x77, 0xea, 0xf1, 0x52, + 0x5e, 0xa4, 0xbb, 0x62, 0x9b, 0xb3, 0x2b, 0x64, 0x84, 0x6a, 0xbb, 0xf1, 0x9c, 0x35, 0xf5, 0x70, 0x0e, 0x96, 0x54, 0x86, 0xc2, 0xe4, 0x14, 0x80, 0x77, 0x7b, 0x3c, 0x39, 0xe8, 0x5e, 0x38, 0x74, + 0x21, 0xa8, 0x4a, 0xf6, 0x10, 0xd8, 0x96, 0x22, 0x3c, 0xad, 0x26, 0x5a, 0xbb, 0x20, 0x6d, 0x5f, 0xcf, 0x0b, 0x75, 0x10, 0x87, 0xbd, 0x58, 0x08, 0x07, 0x3e, 0x25, 0xfa, 0xfe, 0x40, 0x12, 0x9d, + 0x7f, 0xff, 0xf7, 0x2e, 0x0c, 0xa0, 0xf9, 0xf5, 0x09, 0xb5, 0xd8, 0x0b, 0x04, 0xbf, 0x60, 0x5d, 0x50, 0x5b, 0x78, 0xb1, 0x79, 0x44, 0x52, 0xee, 0x56, 0x05, 0xe0, 0x15, 0x0f, 0xb0, 0x0a, 0xbe, + 0x40, 0xe8, 0x33, 0x68, 0xfd, 0x00, 0x1d, 0xe8, 0x03, 0x5e, 0xd1, 0x3f, 0x03, 0xfb, 0x1e, 0x91, 0xc3, 0x05, 0x2d, 0x0d, 0x21, 0x90, 0x5a, 0x68, 0xac, 0x10, 0x3b, 0x4a, 0x3c, 0x9f, 0x0b, 0x96, + 0xd3, 0x5b, 0x3a, 0x6d, 0x56, 0x78, 0xc3, 0x8a, 0x47, 0x23, 0x51, 0x4f, 0xe4, 0x41, 0x83, 0xa5, 0x84, 0x38, 0xa0, 0x5a, 0x5e, 0xda, 0xd0, 0xc5, 0x4c, 0xcd, 0xb5, 0xbd, 0xd7, 0x23, 0x13, 0x6a, + 0x21, 0x6f, 0x48, 0x0d, 0xa6, 0xdc, 0x59, 0xb6, 0x52, 0xe4, 0x49, 0xcd, 0x53, 0xb6, 0x23, 0x83, 0x18, 0x3c, 0x5f, 0xdd, 0x22, 0xb2, 0xbe, 0x5a, 0xce, 0xa7, 0x5b, 0x56, 0xec, 0x78, 0xf1, 0x3d, + 0x76, 0x3f, 0xfe, 0xb0, 0xff, 0xf6, 0xef, 0xdd, 0x70, 0xda, 0x46, 0x5a, 0x6e, 0xb4, 0x5a, 0x00, 0x1c, 0x71, 0xd3, 0x3f, 0xae, 0xb4, 0xaf, 0xd8, 0x15, 0x7e, 0x02, 0xaf, 0x77, 0xbe, 0x00, 0xf4, + 0xaf, 0x06, 0x27, 0x66, 0x85, 0xbf, 0xc7, 0xf1, 0x8e, 0x25, 0xe1, 0x9d, 0xde, 0x32, 0xd2, 0x02, 0xf3, 0x2c, 0xd6, 0xb7, 0x59, 0x7e, 0x33, 0x74, 0xc3, 0x8d, 0x61, 0x0b, 0x32, 0x8c, 0x15, 0x70, + 0xad, 0xd9, 0xca, 0x76, 0x65, 0xa8, 0xcc, 0x76, 0xc7, 0x2c, 0x0f, 0x9e, 0xb6, 0x56, 0x15, 0x9a, 0xe2, 0xe8, 0xbd, 0x19, 0x42, 0xf0, 0x50, 0x6d, 0x9c, 0x01, 0xd8, 0xb3, 0x13, 0x65, 0x03, 0xfb, + 0x63, 0xa7, 0xcc, 0x33, 0x71, 0x84, 0x65, 0x8b, 0x6a, 0x21, 0x8e, 0xbe, 0xc1, 0xf1, 0x63, 0xfe, 0x35, 0x2d, 0xdb, 0xca, 0xfb, 0x65, 0xd2, 0x37, 0x92, 0x38, 0xb6, 0x8c, 0xb3, 0x04, 0x39, 0xae, + 0x3a, 0xe8, 0xb3, 0x80, 0xfa, 0x03, 0x94, 0xd2, 0x74, 0x3d, 0x3f, 0xfd, 0xbc, 0x47, 0xa4, 0x81, 0x7e, 0x4c, 0x9a, 0x33, 0xc8, 0xa3, 0xe8, 0x38, 0x5d, 0x9c, 0xe8, 0x00, 0x7d, 0x4f, 0x87, 0x38, + 0xb6, 0x86, 0x00, 0xeb, 0xad, 0x00, 0xb7, 0x65, 0x5d, 0x05, 0x4b, 0x4d, 0x2a, 0xd6, 0xc9, 0xb2, 0xc5, 0x29, 0x5f, 0x90, 0xb8, 0x5c, 0x01, 0x41, 0x01, 0x68, 0x6b, 0x41, 0x8c, 0x06, 0xe9, 0x72, + 0x12, 0x84, 0xd8, 0xa1, 0x9a, 0xe6, 0xd3, 0x78, 0x17, 0x03, 0x9b, 0x52, 0x5a, 0x2c, 0xec, 0x45, 0x39, 0xb2, 0xd5, 0x21, 0x00, 0xad, 0x4b, 0xcb, 0x0d, 0x8a, 0x56, 0x1e, 0x66, 0x86, 0xe4, 0x79, + 0xe0, 0x03, 0x5e, 0xff, 0x0a, 0x1f, 0x45, 0x99, 0x6b, 0x46, 0xd9, 0x0f, 0x13, 0xc7, 0xf1, 0x62, 0xe7, 0x01, 0x66, 0xe0, 0x13, 0x41, 0x7e, 0x8e, 0x99, 0x5b, 0xe0, 0x27, 0x1c, 0xdd, 0xde, 0xea, + 0x9f, 0x20, 0x7f, 0x8f, 0x2d, 0x98, 0xf4, 0xd7, 0x92, 0x7a, 0x90, 0x84, 0xda, 0xb5, 0x96, 0xf5, 0x54, 0x27, 0x8b, 0x70, 0x22, 0x2a, 0x4b, 0x39, 0xc8, 0x7b, 0xa2, 0x2f, 0x94, 0xcb, 0x38, 0x9f, + 0x0b, 0x08, 0x62, 0xf7, 0x36, 0xec, 0x76, 0xde, 0x5a, 0xed, 0x2a, 0x55, 0x8d, 0x6c, 0xe3, 0xe0, 0xbe, 0x86, 0xcc, 0x51, 0x93, 0xdc, 0x45, 0x6d, 0xeb, 0xec, 0xa5, 0x9e, 0x06, 0xc2, 0x43, 0x7f, + 0x7d, 0x18, 0x08, 0x63, 0x0f, 0x99, 0x55, 0xde, 0x91, 0x6b, 0xbf, 0x40, 0x8d, 0xff, 0x88, 0x4f, 0x5e, 0x65, 0xed, 0x8f, 0xd1, 0xe1, 0xd7, 0xaf, 0x1b, 0xcc, 0x19, 0xc0, 0xf7, 0xb3, 0xf6, 0x11, + 0x7b, 0x33, 0x77, 0x6a, 0x29, 0x19, 0xc0, 0xb8, 0x16, 0x37, 0x4a, 0x33, 0x5b, 0x4e, 0x25, 0x65, 0xa6, 0x4f, 0x7b, 0x75, 0x1c, 0xaf, 0x94, 0x9a, 0x06, 0xa3, 0x41, 0x14, 0x05, 0x06, 0x24, 0x71, + 0xbd, 0xf8, 0x30, 0x4a, 0xd3, 0x60, 0x3c, 0xe7, 0xd9, 0x39, 0xa8, 0xa9, 0xa8, 0xa9, 0x87, 0x9b, 0xf1, 0x22, 0x99, 0x8a, 0xae, 0x1b, 0xf5, 0x82, 0x96, 0x46, 0x55, 0xb9, 0x09, 0xc8, 0x84, 0x77, + 0xd0, 0x8e, 0x1b, 0xcb, 0x71, 0x7f, 0xec, 0x9b, 0x96, 0x95, 0xf6, 0xad, 0xac, 0xd2, 0xc2, 0xd3, 0xba, 0x44, 0x6e, 0x16, 0xc8, 0xe5, 0x25, 0xbf, 0x48, 0xe2, 0x7e, 0x51, 0x6a, 0x7a, 0x68, 0xf5, + 0x8b, 0x32, 0xf7, 0x62, 0xc7, 0xb3, 0x9b, 0x37, 0x45, 0xe1, 0x46, 0x1b, 0x39, 0xbf, 0x6a, 0xb8, 0x56, 0xa4, 0xf5, 0xcb, 0x5c, 0x3b, 0xe2, 0xf4, 0xa2, 0x92, 0xa0, 0xb7, 0x90, 0xab, 0xdc, 0xeb, + 0xfb, 0xc5, 0xab, 0xd6, 0x00, 0xbf, 0xc0, 0x9f, 0xa5, 0x81, 0x5d, 0xc5, 0xe6, 0x2d, 0xc7, 0x1e, 0x55, 0x8d, 0xe6, 0xac, 0x6a, 0x38, 0x5e, 0xe9, 0x56, 0xfa, 0x2d, 0xc0, 0xf0, 0x9a, 0x3e, 0xe7, + 0x17, 0x5e, 0x8c, 0x24, 0x02, 0x8a, 0x34, 0x89, 0x8b, 0x24, 0x2f, 0x00, 0x2b, 0x4d, 0x74, 0x2b, 0xb7, 0xda, 0xc0, 0x8b, 0xbb, 0x88, 0x92, 0xb8, 0xf0, 0xfa, 0x5a, 0xe8, 0x39, 0xf1, 0x03, 0x36, + 0x41, 0x6e, 0x66, 0xdf, 0x99, 0x4b, 0xde, 0xc0, 0x1e, 0x99, 0xe5, 0x6d, 0xd0, 0x3f, 0x41, 0xfb, 0x9e, 0x65, 0xd4, 0x74, 0x1c, 0x6e, 0xb8, 0x6c, 0xb7, 0x40, 0xd6, 0x53, 0x32, 0xe2, 0x3c, 0xdd, + 0xb4, 0xb7, 0x6d, 0x36, 0x56, 0xd0, 0x30, 0xf6, 0xe9, 0x2a, 0x59, 0xb4, 0xf2, 0x40, 0x02, 0x13, 0x7a, 0x92, 0xda, 0x26, 0xd0, 0x0e, 0xb2, 0x19, 0xb3, 0xd1, 0xf2, 0x2a, 0xc8, 0x3d, 0x93, 0x42, + 0xfd, 0x6a, 0xbe, 0x84, 0x27, 0x3b, 0xde, 0xdb, 0xcb, 0xab, 0x43, 0x3e, 0xdc, 0x66, 0xab, 0x52, 0x53, 0x34, 0x62, 0xb7, 0x56, 0xf6, 0x4f, 0x8b, 0xf7, 0x33, 0x3f, 0xf4, 0xf7, 0x9e, 0x59, 0xba, + 0xaf, 0x2c, 0x04, 0x76, 0xd2, 0x00, 0xaf, 0xd0, 0xf0, 0xf9, 0x7e, 0x6e, 0x39, 0xd6, 0xe1, 0x01, 0xd6, 0xd1, 0xa7, 0xd4, 0xc1, 0x77, 0xb0, 0x17, 0xac, 0x9f, 0x06, 0x7d, 0xb4, 0x9b, 0x06, 0x08, + 0x69, 0xa9, 0x25, 0xd8, 0x3b, 0x1e, 0x92, 0x97, 0x62, 0xb6, 0x07, 0x93, 0x21, 0xeb, 0x4d, 0x46, 0x49, 0xbd, 0x69, 0x87, 0xfc, 0x40, 0x84, 0x28, 0xa7, 0x87, 0x4a, 0x39, 0xb5, 0xb7, 0x79, 0x6b, + 0xbf, 0xc2, 0x52, 0x20, 0x8f, 0xf8, 0xca, 0xd2, 0xf1, 0x72, 0xab, 0xfa, 0x2b, 0x28, 0x3f, 0xa0, 0xf3, 0xa4, 0x81, 0x46, 0x39, 0xe9, 0x38, 0x49, 0x36, 0x4d, 0xed, 0x2c, 0x33, 0x59, 0x34, 0x4f, + 0x62, 0xd3, 0xf9, 0xc7, 0x2b, 0x2e, 0x8f, 0xb0, 0xfc, 0x81, 0x6c, 0xf7, 0xb9, 0xfb, 0x19, 0x3c, 0x5f, 0x03, 0x06, 0xfa, 0x37, 0xc3, 0x3e, 0xd2, 0x0d, 0xd7, 0xb5, 0x66, 0x1b, 0x35, 0xc6, 0xf9, + 0x1b, 0x95, 0x13, 0x9d, 0x16, 0xc4, 0x12, 0x1e, 0x60, 0xb0, 0x29, 0x45, 0xe6, 0xa3, 0xb2, 0x25, 0x6a, 0xd3, 0x5d, 0x69, 0xc1, 0xd4, 0x9f, 0xb0, 0xf5, 0x22, 0x67, 0x46, 0x58, 0x83, 0x30, 0xe3, + 0x09, 0x34, 0x66, 0xe3, 0x79, 0xd3, 0x5b, 0xcd, 0x33, 0xc2, 0x94, 0x66, 0xc2, 0x0a, 0xd2, 0x7b, 0x1c, 0x25, 0x67, 0xd4, 0xc4, 0x28, 0x03, 0x73, 0xbd, 0x45, 0x51, 0x0b, 0x7a, 0x9e, 0xc3, 0xad, + 0x28, 0xf1, 0xdf, 0x39, 0xf2, 0xf7, 0xdf, 0xf0, 0x9b, 0xad, 0xf2, 0x38, 0x87, 0xa2, 0x6f, 0x57, 0x61, 0x78, 0x9e, 0xa3, 0x91, 0x98, 0x56, 0x3f, 0x4d, 0xbc, 0xb8, 0xbc, 0x2f, 0x20, 0x8f, 0x08, + 0x49, 0xfb, 0x47, 0xb2, 0xfc, 0x3e, 0x9b, 0x73, 0xd0, 0x3d, 0x4b, 0xed, 0x1f, 0x4c, 0xf9, 0xb7, 0x1f, 0x70, 0x8f, 0xee, 0xb7, 0x16, 0xe6, 0x4f, 0xe8, 0x7e, 0x06, 0xfb, 0x4a, 0xf5, 0xf3, 0xa0, + 0x7f, 0x82, 0xf6, 0x3d, 0xcd, 0xa9, 0x6a, 0x5d, 0x40, 0x0e, 0xa7, 0x93, 0x59, 0xc1, 0x73, 0xac, 0x1a, 0xe6, 0xb6, 0xbd, 0x0f, 0x2b, 0x87, 0xe0, 0x99, 0xc0, 0x88, 0x53, 0xbf, 0x18, 0x6c, 0x84, + 0x68, 0x0e, 0x09, 0x23, 0xb7, 0x17, 0x8d, 0x10, 0x50, 0x06, 0x29, 0x29, 0x29, 0x6d, 0x4a, 0x05, 0x4d, 0x58, 0x96, 0x8b, 0x5d, 0x2a, 0x44, 0x42, 0xc4, 0xf3, 0x33, 0x6c, 0x8b, 0xe3, 0x08, 0xaf, + 0x8d, 0x90, 0x59, 0x2f, 0xd4, 0xbd, 0xed, 0xf3, 0x4a, 0xeb, 0x8d, 0x10, 0x3a, 0x99, 0xb5, 0xff, 0x48, 0x2a, 0x7d, 0x25, 0xed, 0xfe, 0xc2, 0x1e, 0x73, 0x47, 0xda, 0x75, 0xd8, 0x63, 0xa0, 0x3e, + 0xbe, 0xe2, 0x77, 0xfb, 0x86, 0x9d, 0x4a, 0x48, 0x38, 0xd5, 0x47, 0xdc, 0x56, 0x1b, 0xc2, 0x30, 0xa9, 0x15, 0x08, 0xac, 0x3a, 0x57, 0xf8, 0xfc, 0x66, 0xf2, 0x68, 0xd7, 0xc9, 0x17, 0x65, 0x13, + 0x5a, 0x8f, 0x8c, 0x54, 0xf4, 0x05, 0x79, 0x76, 0xf6, 0x67, 0xb8, 0x97, 0xe9, 0x9f, 0x47, 0xfd, 0x13, 0xbc, 0xef, 0xb9, 0xb1, 0xd5, 0xc9, 0x61, 0x3e, 0x9e, 0x8d, 0x24, 0x28, 0xd7, 0x7d, 0x6f, + 0x43, 0xe9, 0xb0, 0x9b, 0x71, 0x13, 0x66, 0xa1, 0xcc, 0x0f, 0x4e, 0x19, 0x10, 0x0b, 0x79, 0x7d, 0x50, 0x11, 0x56, 0xdd, 0x53, 0xc8, 0x04, 0x5b, 0x94, 0x07, 0x7d, 0xa7, 0xae, 0xc6, 0x71, 0x2c, + 0x7a, 0xd0, 0x3c, 0x38, 0xf4, 0x58, 0x2a, 0x71, 0x4d, 0x21, 0x9c, 0xa4, 0x30, 0x0c, 0xef, 0x37, 0xa3, 0x39, 0xeb, 0x5a, 0xea, 0x6c, 0x25, 0xd2, 0x1d, 0xd5, 0x32, 0x23, 0x09, 0x93, 0xfc, 0x68, + 0x2c, 0xd5, 0x56, 0xfe, 0x2e, 0x43, 0x7e, 0x6e, 0x2c, 0x11, 0x1d, 0x15, 0xaa, 0xc7, 0x6a, 0x93, 0xe1, 0x6a, 0x61, 0x70, 0x8d, 0xbe, 0xff, 0xf3, 0x55, 0x91, 0xfa, 0x77, 0xa8, 0x13, 0x71, 0x9b, + 0x48, 0x2b, 0x8d, 0xaf, 0x76, 0x97, 0x9f, 0x5b, 0xc9, 0x17, 0xa0, 0x27, 0xb2, 0x9e, 0x2f, 0x4f, 0xbb, 0x4a, 0x07, 0xb3, 0x58, 0x40, 0x11, 0x4b, 0xb0, 0x97, 0x23, 0xb6, 0x4a, 0x03, 0xa7, 0x62, + 0xe4, 0xc6, 0xc8, 0x0d, 0x34, 0x9b, 0x0d, 0x83, 0x96, 0x50, 0xbd, 0x6a, 0x29, 0x7b, 0xbe, 0x46, 0x4b, 0xfb, 0x1d, 0x2e, 0x31, 0x25, 0xa8, 0x00, 0xd3, 0x05, 0x87, 0xd7, 0xa0, 0xa6, 0x11, 0xb9, + 0x42, 0x40, 0xd8, 0x61, 0xeb, 0xab, 0x78, 0x3e, 0x33, 0x47, 0x83, 0x9d, 0xc9, 0x1b, 0xe9, 0x66, 0x22, 0x71, 0x7c, 0xd6, 0x5b, 0xd7, 0xdb, 0xef, 0x76, 0xf0, 0xc7, 0x64, 0x8e, 0x93, 0x3c, 0xd2, + 0x42, 0xaf, 0xb5, 0xfa, 0xa9, 0x76, 0xa3, 0x39, 0x5d, 0xed, 0x15, 0xa9, 0x67, 0x24, 0x17, 0x1c, 0x5e, 0x9c, 0x72, 0x3f, 0x65, 0x83, 0x5f, 0x44, 0x17, 0x5a, 0xe5, 0x86, 0xdb, 0x3c, 0xb4, 0x99, + 0x9f, 0x12, 0x40, 0x47, 0x88, 0x47, 0x2a, 0x1d, 0xff, 0xef, 0x43, 0x5d, 0xc4, 0x4e, 0xcf, 0xf0, 0xc9, 0x05, 0x64, 0xf3, 0x8c, 0x69, 0x11, 0x8b, 0x41, 0xce, 0x58, 0xcd, 0xc1, 0x4b, 0x0d, 0x6e, + 0xea, 0xd3, 0xa3, 0x2f, 0xad, 0xb8, 0xdc, 0x49, 0xb5, 0xb3, 0x95, 0xf1, 0x07, 0x0d, 0xdb, 0x57, 0xa0, 0xa7, 0x19, 0x9c, 0x2f, 0xbb, 0x1a, 0xb2, 0x44, 0x6f, 0xb8, 0xcd, 0x2c, 0x5d, 0x9f, 0xb4, + 0xe9, 0x6e, 0xb8, 0x5c, 0xf7, 0xb6, 0x1a, 0xb6, 0x84, 0x87, 0x5a, 0xc1, 0x26, 0x8e, 0xb5, 0xe6, 0x5b, 0x63, 0x5a, 0x8e, 0xd8, 0x85, 0x99, 0xf2, 0x0c, 0xd3, 0x8c, 0x1c, 0x08, 0xb4, 0xc1, 0x81, + 0x26, 0x4e, 0x36, 0xa4, 0x6e, 0xd0, 0xd9, 0xd4, 0x06, 0x84, 0xdd, 0x1e, 0xa2, 0xfd, 0x91, 0xda, 0xcb, 0x60, 0x40, 0xa7, 0x49, 0x07, 0xa1, 0xea, 0x2a, 0xe7, 0x90, 0xd5, 0xd7, 0x86, 0x6c, 0xd1, + 0xc4, 0x46, 0xe0, 0x95, 0x0f, 0x3d, 0x7d, 0xcf, 0x38, 0xfa, 0x2e, 0x40, 0x8f, 0x28, 0x78, 0xbd, 0xec, 0x9f, 0x20, 0x7d, 0x47, 0xc7, 0xc3, 0x00, 0x57, 0x6d, 0x84, 0x00, 0x1b, 0x94, 0xc8, 0x13, + 0xbd, 0xd9, 0x05, 0xf3, 0x96, 0x52, 0x03, 0x73, 0x2e, 0x22, 0xc1, 0x97, 0x93, 0x28, 0x93, 0xc8, 0x33, 0xfa, 0x45, 0x68, 0x59, 0xe9, 0x9f, 0x65, 0xc5, 0x2b, 0xc0, 0xc7, 0xc9, 0x5c, 0x0d, 0xbb, + 0x30, 0xe6, 0x91, 0xa6, 0xc1, 0x62, 0xe9, 0x53, 0xd9, 0xc8, 0xc5, 0xd3, 0x03, 0xb8, 0xdb, 0x2e, 0xd8, 0x1e, 0xba, 0xd2, 0xdb, 0xc4, 0x5b, 0x03, 0xb1, 0x14, 0x30, 0xa3, 0xed, 0xa2, 0x32, 0xe1, + 0xaa, 0x8e, 0x67, 0x59, 0x45, 0x41, 0xc0, 0x61, 0xa0, 0xe1, 0xf4, 0x4a, 0xe5, 0x67, 0x12, 0x38, 0x32, 0xda, 0x8c, 0x03, 0x57, 0x31, 0x86, 0x27, 0x0a, 0x20, 0x49, 0x2b, 0x68, 0xae, 0xcb, 0x9c, + 0xe6, 0xab, 0x69, 0x8a, 0xb0, 0xc3, 0xf2, 0xc6, 0x95, 0xf3, 0x9d, 0x30, 0xef, 0x6a, 0x54, 0x55, 0x65, 0x62, 0x68, 0x71, 0x9c, 0x3c, 0x32, 0x59, 0xd1, 0x17, 0xec, 0x19, 0x14, 0xbe, 0x81, 0x3d, + 0x22, 0xf0, 0x6d, 0xd0, 0x3f, 0x41, 0xfb, 0x1e, 0x7d, 0xe9, 0x96, 0xa1, 0xc9, 0x99, 0x3b, 0xd4, 0x83, 0x95, 0x45, 0xed, 0x14, 0x1f, 0x5a, 0xcc, 0x61, 0x92, 0x54, 0xac, 0x9d, 0xa4, 0xcd, 0x03, + 0x7d, 0xed, 0x35, 0xc8, 0x42, 0xc5, 0xeb, 0xc5, 0x1a, 0xd2, 0x33, 0xbc, 0xde, 0x1e, 0x18, 0x81, 0x58, 0xf7, 0xbc, 0x71, 0x44, 0x35, 0xe4, 0xb8, 0xac, 0x5c, 0x58, 0xe0, 0x67, 0xde, 0x36, 0x9c, + 0x86, 0x5e, 0xb0, 0xd3, 0xa0, 0x14, 0x9c, 0xcb, 0xb2, 0x82, 0x48, 0xe6, 0xbe, 0xe3, 0x76, 0x7a, 0xdc, 0xc4, 0xee, 0x8b, 0x57, 0x23, 0xf4, 0xfa, 0x27, 0xa7, 0x06, 0xf2, 0xfb, 0xec, 0xa1, 0x18, + 0xdc, 0xea, 0xf5, 0x46, 0x98, 0xc4, 0xd6, 0xab, 0xe8, 0x85, 0x6e, 0x03, 0x1e, 0xe7, 0x4d, 0xba, 0xa8, 0xd2, 0x34, 0xc9, 0x2f, 0x1e, 0xcd, 0x0f, 0x9e, 0x13, 0x23, 0x4f, 0x8a, 0xa2, 0xaf, 0xe5, + 0x4e, 0xfd, 0xfb, 0xe2, 0xf1, 0xbc, 0x8d, 0xdb, 0x24, 0x79, 0xd4, 0x37, 0xb5, 0x52, 0x7b, 0xfd, 0xc2, 0x87, 0x8f, 0xbb, 0x5a, 0xd1, 0x3f, 0xad, 0xbb, 0xbe, 0x9b, 0x24, 0x41, 0x71, 0x1f, 0x86, + 0x6b, 0xe6, 0x7d, 0xd7, 0x2b, 0xca, 0xc4, 0xc9, 0xb5, 0xe8, 0xe2, 0x4d, 0x39, 0xfe, 0x12, 0xf4, 0xf1, 0x5b, 0xa9, 0x95, 0x1b, 0x56, 0x5c, 0x7a, 0x47, 0x75, 0x28, 0xd1, 0xfd, 0xdf, 0x77, 0xad, + 0x94, 0x93, 0xd7, 0xf9, 0x24, 0xf6, 0xf2, 0x0b, 0xd8, 0x23, 0x7a, 0x6e, 0x70, 0xe0, 0x36, 0xa9, 0x95, 0x7b, 0xe6, 0x1b, 0x00, 0xe4, 0xfa, 0x61, 0xa4, 0xc5, 0x9a, 0x73, 0xb5, 0xb7, 0x7d, 0xfa, + 0x42, 0xe4, 0xc5, 0x5e, 0xe4, 0x15, 0x17, 0xe4, 0x7d, 0x08, 0x6a, 0x25, 0x71, 0x3f, 0xb6, 0xca, 0x7e, 0xe8, 0x15, 0xa5, 0x15, 0xdf, 0xc7, 0x6f, 0x9a, 0x5b, 0x65, 0xd9, 0xf4, 0xf5, 0xa6, 0xb4, + 0x2e, 0x91, 0x31, 0xe4, 0xc3, 0xf6, 0x99, 0x27, 0x4e, 0x6e, 0x15, 0xc5, 0xfd, 0x5f, 0x98, 0x5b, 0x47, 0x56, 0xcd, 0xeb, 0x57, 0xcf, 0xd7, 0x6d, 0x90, 0xe9, 0xf4, 0xfc, 0xe2, 0xe4, 0xbf, 0xf3, + 0xeb, 0x8f, 0x8f, 0xce, 0xa6, 0xed, 0xef, 0x73, 0x6c, 0x06, 0xbc, 0x67, 0x1f, 0xe8, 0x5e, 0xfc, 0xc1, 0xac, 0xb8, 0x5e, 0x9e, 0x57, 0xa3, 0x17, 0xbf, 0xf8, 0xd1, 0xe2, 0xbe, 0xb5, 0xe8, 0x2e, + 0x2c, 0xfe, 0xe7, 0xcc, 0x87, 0xb3, 0xe6, 0xd7, 0x3f, 0xff, 0xdf, 0xc5, 0x68, 0x38, 0xae, 0x72, 0x94, 0x42, 0x48, 0x6c, 0x6b, 0xa3, 0x10, 0xb7, 0x54, 0xd6, 0x13, 0xb3, 0x68, 0x23, 0x2a, 0xe3, + 0xc7, 0xd3, 0x6c, 0xb0, 0xd9, 0x00, 0x15, 0x3f, 0x22, 0x61, 0x1c, 0x99, 0xb1, 0xf3, 0x68, 0xd9, 0x43, 0xfc, 0x51, 0xe8, 0x12, 0x3b, 0x34, 0xa3, 0x4a, 0xb3, 0x74, 0xc6, 0x6b, 0xc4, 0x3e, 0x94, + 0xfa, 0x9c, 0xe6, 0x5b, 0xf1, 0x00, 0xc3, 0x2b, 0xd3, 0x8d, 0x29, 0x63, 0x56, 0x57, 0x70, 0x05, 0xd9, 0x9b, 0x7d, 0x47, 0xa5, 0xf9, 0xd6, 0x92, 0xb8, 0x18, 0x6c, 0x57, 0x04, 0x7b, 0x5d, 0xaa, + 0x45, 0xff, 0xb4, 0x72, 0x7f, 0x9f, 0xed, 0xf8, 0x67, 0x8c, 0xba, 0x4e, 0xea, 0x54, 0xad, 0x79, 0xe1, 0xc9, 0x5b, 0x5a, 0x36, 0xa9, 0x65, 0xf6, 0xb5, 0x3c, 0xd7, 0x9a, 0x47, 0x26, 0xce, 0x71, + 0x51, 0x0f, 0x7e, 0x4c, 0xa1, 0xfb, 0x9f, 0x38, 0x4a, 0xe7, 0xbb, 0x0f, 0x4e, 0x1b, 0xdd, 0xe0, 0x7b, 0x1a, 0x52, 0x3c, 0x05, 0x72, 0xde, 0x02, 0xc5, 0x2c, 0x2f, 0xb5, 0x5a, 0x4f, 0x94, 0xa0, + 0xb9, 0x20, 0x00, 0xa2, 0x64, 0x53, 0x32, 0x58, 0x54, 0x36, 0x2b, 0xee, 0x22, 0x5f, 0x74, 0xea, 0x4d, 0x91, 0xc8, 0x70, 0x99, 0x1d, 0x8c, 0x72, 0x65, 0x8d, 0x44, 0xcb, 0xdf, 0x1a, 0xf6, 0xa2, + 0x3c, 0x28, 0x5c, 0x46, 0x4b, 0x3c, 0x24, 0x1f, 0x56, 0x44, 0x91, 0xc2, 0xcb, 0x5c, 0x24, 0xb7, 0x29, 0xa3, 0x60, 0xc5, 0xfe, 0x07, 0x1b, 0xdd, 0xaf, 0xbb, 0x3a, 0xee, 0x0f, 0x0d, 0x97, 0x37, + 0x7f, 0x6f, 0xe8, 0xbb, 0x5a, 0xae, 0x77, 0xa2, 0x58, 0xed, 0x25, 0x0f, 0x08, 0x84, 0x9f, 0xbc, 0xd3, 0x3f, 0x27, 0x50, 0xed, 0x25, 0x27, 0x7a, 0xd4, 0x5e, 0xd2, 0x3f, 0xc1, 0xf8, 0x1e, 0xfd, + 0xbb, 0x2d, 0x3c, 0xe6, 0xc7, 0x91, 0xaa, 0x8d, 0xa3, 0xf1, 0xb8, 0x60, 0xb5, 0x99, 0x36, 0xe7, 0x0e, 0xa3, 0x56, 0xd8, 0x4f, 0x10, 0xdc, 0xde, 0x79, 0x10, 0x37, 0x3d, 0x2c, 0x96, 0xb5, 0x65, + 0x2e, 0x53, 0xcb, 0x2b, 0xe6, 0x66, 0x74, 0x50, 0x63, 0x3d, 0x9c, 0x1a, 0x88, 0x9b, 0x32, 0x5b, 0x25, 0x0e, 0x85, 0x1e, 0xb7, 0x94, 0x0f, 0x6a, 0xa1, 0xb5, 0x2e, 0x8a, 0x6c, 0x77, 0x0b, 0xc6, + 0xd9, 0xa5, 0x7a, 0xd6, 0x71, 0xa3, 0xbc, 0xd8, 0x00, 0x77, 0xb6, 0x19, 0xd3, 0xd2, 0x2b, 0xe7, 0x75, 0x5d, 0x7d, 0xdc, 0xc5, 0xb4, 0xa2, 0xcc, 0x5e, 0xff, 0x0a, 0xbb, 0x15, 0xd0, 0x59, 0x65, + 0x55, 0x56, 0x3f, 0xf2, 0x8c, 0x3c, 0x29, 0xb5, 0x22, 0x78, 0x93, 0xb2, 0x70, 0x57, 0x7a, 0xdc, 0x4a, 0xb9, 0xcb, 0x8f, 0x78, 0xe4, 0x26, 0x40, 0x7e, 0x4c, 0xa2, 0x13, 0x44, 0xa0, 0x7f, 0xfe, + 0xff, 0xe4, 0x1a, 0x40, 0xbe, 0x27, 0x11, 0xd0, 0x1e, 0xf6, 0x83, 0x5e, 0xed, 0x42, 0x92, 0x5d, 0xf7, 0xd0, 0x55, 0x8c, 0x6b, 0x83, 0xb8, 0xd0, 0x8d, 0x19, 0x27, 0x68, 0x62, 0x3d, 0xa6, 0xdc, + 0xc4, 0x8f, 0xb1, 0x09, 0x1d, 0x0e, 0xeb, 0x2a, 0xdd, 0x73, 0xf0, 0x66, 0x2c, 0x52, 0x25, 0xed, 0xd1, 0x65, 0x96, 0x13, 0xd4, 0xa4, 0x6c, 0x95, 0xc9, 0xd2, 0x6c, 0x31, 0x64, 0x4e, 0x06, 0x07, + 0xcb, 0xc0, 0x29, 0xa5, 0x32, 0x60, 0x3f, 0x89, 0xb1, 0x55, 0x37, 0x12, 0x45, 0x27, 0xe1, 0x06, 0xdf, 0xe0, 0xb0, 0xeb, 0xc2, 0xc2, 0xee, 0xc9, 0xba, 0xd4, 0xb2, 0xf2, 0xeb, 0x8c, 0x10, 0xde, + 0x3a, 0xa9, 0x23, 0x57, 0x00, 0x3e, 0xc9, 0xcd, 0xf7, 0x67, 0xc7, 0x6d, 0x3a, 0x2d, 0xbd, 0x24, 0x3e, 0xed, 0xa0, 0x6f, 0x51, 0xc8, 0x5f, 0x6f, 0x94, 0xfd, 0x29, 0x85, 0xa3, 0x47, 0x22, 0x12, + 0x7e, 0xca, 0x57, 0x10, 0x1d, 0xc5, 0x61, 0x54, 0xf4, 0xe1, 0x6e, 0xfe, 0x81, 0x62, 0x1a, 0x08, 0x87, 0xde, 0xc6, 0xe7, 0xcb, 0x68, 0x84, 0xf1, 0x3b, 0x18, 0x4f, 0x46, 0xe8, 0x84, 0x9c, 0xd0, + 0xf3, 0xc9, 0x58, 0x55, 0x51, 0x11, 0xdd, 0x65, 0xd6, 0x74, 0xb9, 0x1b, 0xd7, 0x18, 0x51, 0x4a, 0x3d, 0x5f, 0x47, 0xea, 0x00, 0x58, 0x37, 0x1a, 0xb7, 0x15, 0x40, 0x41, 0xe2, 0x9a, 0x6d, 0x19, + 0xcd, 0x45, 0x1e, 0xd4, 0x7b, 0x9a, 0x29, 0x4b, 0x74, 0xad, 0x17, 0x90, 0x40, 0x6b, 0x0c, 0xbc, 0xff, 0xd2, 0x6e, 0xd3, 0xb5, 0x50, 0x8b, 0x0d, 0xcb, 0xec, 0x7f, 0xe5, 0x28, 0x81, 0x6e, 0x92, + 0x6d, 0xba, 0x4e, 0xfe, 0x16, 0x34, 0xd0, 0xff, 0x70, 0xe3, 0xb4, 0x1f, 0x74, 0x40, 0x0a, 0x92, 0x88, 0x96, 0xbc, 0x04, 0x25, 0x7e, 0x83, 0xe1, 0xee, 0x02, 0x1a, 0x45, 0xfa, 0xae, 0xe0, 0xd0, + 0x46, 0xcb, 0x64, 0xbc, 0xf4, 0x3d, 0x26, 0xd4, 0x0f, 0x6b, 0x4a, 0x5d, 0xa6, 0x0c, 0xc8, 0x6d, 0x87, 0xbd, 0xb1, 0xb5, 0x43, 0xf5, 0xf5, 0x48, 0xdb, 0x81, 0xa3, 0xf8, 0x50, 0x82, 0xe5, 0x01, + 0xe6, 0xf3, 0x74, 0x9d, 0x6e, 0xf7, 0x2b, 0x4d, 0xd8, 0xb3, 0x21, 0x2b, 0xd2, 0x33, 0x57, 0x91, 0x07, 0xc2, 0x03, 0x57, 0xfc, 0x57, 0x78, 0x2a, 0x2c, 0x0c, 0x3d, 0x2b, 0xa2, 0xf7, 0x51, 0x34, + 0x78, 0xc2, 0xc6, 0x7f, 0x83, 0x7a, 0xc2, 0xce, 0xeb, 0x75, 0xff, 0x04, 0xeb, 0x7b, 0xc4, 0x8c, 0xb8, 0x54, 0x53, 0x42, 0x26, 0x26, 0x4a, 0x54, 0xdc, 0xe8, 0x4b, 0x66, 0xdc, 0xf4, 0xf4, 0x41, + 0x8f, 0xe3, 0x9c, 0x7a, 0x8d, 0xd6, 0x79, 0x41, 0x11, 0xb5, 0x5e, 0xe7, 0xba, 0xb7, 0x9a, 0xa5, 0x05, 0x6e, 0x73, 0x94, 0x14, 0xf8, 0x01, 0x95, 0x37, 0x98, 0xef, 0x81, 0xb9, 0x3c, 0xf3, 0xc7, + 0x60, 0xd0, 0xea, 0x0b, 0x4b, 0x98, 0xef, 0xdb, 0x43, 0x46, 0x78, 0x4d, 0x9a, 0xa0, 0x50, 0x66, 0x6d, 0x6f, 0xfc, 0xd5, 0xef, 0x7b, 0xde, 0xff, 0xf5, 0xb6, 0xae, 0x6e, 0x16, 0xdf, 0xc3, 0x48, + 0x68, 0xb7, 0xbd, 0xd1, 0xb6, 0x8e, 0x06, 0xca, 0xef, 0xf7, 0x35, 0xfb, 0x5f, 0xbf, 0xfe, 0x4c, 0xaa, 0x95, 0xb9, 0x95, 0xc4, 0x5f, 0x7e, 0x67, 0xbf, 0xdf, 0xbf, 0xbc, 0xbe, 0x77, 0xfa, 0xd8, + 0x4f, 0xbf, 0x61, 0x24, 0x71, 0x51, 0x85, 0xe5, 0x71, 0xda, 0x5f, 0x7d, 0xe6, 0x0c, 0xf6, 0x1c, 0x76, 0x78, 0x35, 0xc1, 0x3e, 0x89, 0x9e, 0xff, 0xfe, 0x05, 0x3b, 0x79, 0xb1, 0x96, 0x37, 0x7d, + 0xeb, 0x50, 0x5a, 0xf1, 0x91, 0x85, 0x1e, 0x8b, 0x9d, 0x67, 0x02, 0x21, 0x9f, 0xa0, 0x1f, 0xd9, 0xeb, 0xe3, 0xbd, 0x3e, 0xdc, 0x2d, 0x2c, 0xe2, 0x53, 0x46, 0x39, 0x03, 0xd8, 0xcd, 0x4a, 0x57, + 0x93, 0x59, 0x13, 0x24, 0x16, 0xa3, 0xbb, 0xbb, 0x74, 0x19, 0x2e, 0xc8, 0x6c, 0xba, 0x30, 0xf6, 0xbb, 0x19, 0x37, 0x4b, 0x1c, 0x14, 0xa6, 0x07, 0x0c, 0x25, 0xc8, 0xfb, 0x95, 0x24, 0x9a, 0xfe, + 0x98, 0x31, 0x3d, 0xd7, 0xf7, 0x41, 0x2a, 0x8c, 0x5d, 0x6b, 0x85, 0xeb, 0xa1, 0x2e, 0x61, 0x26, 0xb3, 0xd4, 0xec, 0xc5, 0xc8, 0x13, 0x89, 0x24, 0x59, 0x71, 0xdf, 0x85, 0x45, 0xfe, 0x80, 0x06, + 0xac, 0x7b, 0x71, 0x99, 0x5b, 0x0f, 0xdd, 0xfa, 0xd0, 0x53, 0x4e, 0xb9, 0x0b, 0xd0, 0x33, 0x42, 0x4f, 0x97, 0x27, 0x39, 0xf6, 0xcd, 0x72, 0x85, 0xfa, 0x54, 0xb4, 0x31, 0xa2, 0xc1, 0x3e, 0x58, + 0x58, 0x59, 0xae, 0xcd, 0x87, 0xa3, 0x59, 0x33, 0x2b, 0x39, 0x68, 0xeb, 0xaf, 0xc5, 0xd5, 0x97, 0xe2, 0x39, 0x39, 0x58, 0x8f, 0xfd, 0x28, 0x4f, 0xf1, 0xc6, 0x11, 0xe2, 0xf1, 0xe7, 0x1f, 0xff, + 0xef, 0xa3, 0xdd, 0x78, 0xc0, 0x22, 0xd1, 0x4a, 0x1a, 0xae, 0xa7, 0xad, 0x03, 0x27, 0x66, 0x4a, 0xaf, 0x31, 0x58, 0x27, 0xf7, 0xe2, 0xbc, 0x96, 0xad, 0xe9, 0xb8, 0xb7, 0xd5, 0xd7, 0xbe, 0xdf, + 0x34, 0x13, 0x77, 0x5a, 0x70, 0xb1, 0x41, 0xec, 0x53, 0x20, 0x02, 0x7b, 0xee, 0xaa, 0xe0, 0xe5, 0x5a, 0xb6, 0x10, 0x06, 0xde, 0x80, 0xd4, 0xa0, 0xde, 0x83, 0x31, 0x69, 0x2e, 0x21, 0x77, 0x3c, + 0x4b, 0xd4, 0x64, 0x10, 0x71, 0x56, 0xc5, 0x7e, 0x97, 0x33, 0xf7, 0x8d, 0xa9, 0x75, 0xc9, 0x8a, 0xb8, 0xe7, 0x55, 0xd1, 0x22, 0x2b, 0x34, 0xb4, 0xd7, 0xb4, 0x8f, 0xa3, 0x51, 0x7e, 0xeb, 0x16, + 0xf9, 0xda, 0x1f, 0x73, 0xc4, 0xcc, 0xc5, 0x60, 0x87, 0x3f, 0x47, 0x4e, 0x6f, 0x32, 0x0d, 0x3e, 0x19, 0x79, 0xa5, 0x95, 0x47, 0xfd, 0xc2, 0x6b, 0xdf, 0x9d, 0x36, 0xb7, 0x8f, 0x9b, 0xd4, 0xea, + 0xdb, 0x97, 0x24, 0x56, 0xf0, 0x85, 0xb8, 0xfd, 0x65, 0x7b, 0xcf, 0xb4, 0x8a, 0xb2, 0x1f, 0x7a, 0xaf, 0x4e, 0x1f, 0xe4, 0x2f, 0xda, 0x87, 0x77, 0x24, 0xf9, 0xcf, 0xac, 0x97, 0xeb, 0x4c, 0xcb, + 0x2e, 0x6b, 0xee, 0xc4, 0x5c, 0x3f, 0x8b, 0x2e, 0x0e, 0x9e, 0x72, 0x0f, 0x3c, 0x8a, 0x2e, 0x0e, 0xba, 0x39, 0x0a, 0x74, 0x05, 0xb3, 0xfd, 0x01, 0xb6, 0x94, 0x57, 0xa0, 0x2b, 0x43, 0x9c, 0x3f, + 0x59, 0x50, 0xab, 0x6a, 0x36, 0xb1, 0xda, 0x8c, 0x33, 0xf3, 0x51, 0x33, 0x31, 0x59, 0xab, 0x1e, 0x51, 0x5e, 0x96, 0x6f, 0x99, 0xbd, 0x18, 0xea, 0x11, 0xb9, 0xe0, 0x99, 0x74, 0xa0, 0x05, 0xb0, + 0x8d, 0x82, 0x42, 0x44, 0xcc, 0xa4, 0x49, 0xc3, 0xc3, 0x51, 0x76, 0x08, 0xa6, 0x58, 0xec, 0x04, 0xcc, 0x12, 0x82, 0x6c, 0x20, 0xfc, 0x2e, 0x12, 0xd3, 0x99, 0x6c, 0x3f, 0x42, 0xf0, 0xff, 0x8f, + 0x5c, 0x2f, 0x3f, 0x15, 0x11, 0xff, 0xd3, 0x78, 0x63, 0xee, 0x90, 0xed, 0x36, 0xa5, 0xe3, 0x1e, 0xf1, 0x88, 0xa7, 0x88, 0x77, 0x05, 0x17, 0xe8, 0x5f, 0x8f, 0xfa, 0x44, 0x37, 0x42, 0xf2, 0xa2, + 0xaf, 0xb4, 0xc6, 0x76, 0xb1, 0x1c, 0x81, 0xd6, 0x7e, 0xc4, 0xa4, 0x2d, 0xc8, 0x1f, 0x52, 0x65, 0x52, 0xef, 0x1d, 0xac, 0xf1, 0x1b, 0x68, 0x31, 0x45, 0x0e, 0xa5, 0x95, 0x64, 0x2d, 0x86, 0xa2, + 0x9b, 0x71, 0x02, 0xac, 0x05, 0x27, 0xce, 0x21, 0x60, 0x3a, 0x2d, 0x7b, 0x9e, 0x81, 0x78, 0x33, 0xa9, 0x5d, 0x11, 0x74, 0x85, 0x48, 0x26, 0x0f, 0xa1, 0xa2, 0xb6, 0x8f, 0x37, 0x72, 0x34, 0xa5, + 0xb1, 0x07, 0xfb, 0xfd, 0x8f, 0x30, 0xf6, 0x38, 0xc7, 0xe5, 0xcf, 0xb1, 0xfe, 0x83, 0x6f, 0x9c, 0x33, 0xcc, 0xef, 0x3d, 0xe9, 0xba, 0x3c, 0xda, 0x26, 0x8a, 0x06, 0xbd, 0xaa, 0x57, 0x8c, 0x0b, + 0x71, 0xdb, 0x50, 0xc3, 0x6c, 0xa1, 0x59, 0xfe, 0x06, 0xa1, 0x26, 0xb5, 0x3b, 0xe6, 0x8c, 0x90, 0x33, 0xbd, 0x56, 0xd1, 0x66, 0x72, 0xc5, 0x8c, 0x08, 0x64, 0x3d, 0xf7, 0x75, 0x3c, 0x16, 0xab, + 0x69, 0x6c, 0x9a, 0x63, 0x66, 0x5a, 0x83, 0x6e, 0xd0, 0xe3, 0x14, 0x9c, 0xe4, 0x47, 0x61, 0xb1, 0xb5, 0x38, 0x54, 0xb6, 0x1c, 0x8c, 0xde, 0x60, 0xbb, 0xd5, 0x77, 0xcb, 0xe3, 0x1f, 0xc3, 0xb9, + 0x1d, 0xf2, 0xb6, 0xd0, 0xa7, 0xfc, 0x55, 0x5f, 0xe5, 0x6d, 0xa1, 0x1d, 0xbd, 0x57, 0xe4, 0x4c, 0x97, 0x90, 0x05, 0x3a, 0x73, 0x37, 0x55, 0xb4, 0xa3, 0x41, 0x2b, 0x99, 0xcb, 0x43, 0x6a, 0xec, + 0x1b, 0xda, 0x64, 0x08, 0x73, 0xf3, 0x45, 0x26, 0x45, 0x93, 0x71, 0x3c, 0x85, 0x52, 0x9b, 0x30, 0x2b, 0xf9, 0x30, 0x99, 0xee, 0x4b, 0x01, 0x1b, 0x51, 0x58, 0x1c, 0xf8, 0xfb, 0xa1, 0x86, 0xb0, + 0xa6, 0xb7, 0x2e, 0xe7, 0x08, 0x0d, 0xef, 0x91, 0x19, 0xe5, 0xd1, 0xc0, 0xc1, 0x43, 0xea, 0xa5, 0xf5, 0x9d, 0xb2, 0xda, 0x3d, 0x6f, 0x8b, 0xf8, 0xa8, 0x6f, 0x7c, 0x95, 0xb7, 0xf5, 0x49, 0x39, + 0xf9, 0x90, 0xb7, 0xf5, 0xc0, 0xe3, 0xff, 0x8f, 0x23, 0xfa, 0x97, 0x29, 0x5b, 0xd8, 0x53, 0xeb, 0xed, 0x51, 0xca, 0x16, 0xd6, 0x6d, 0x55, 0x8d, 0xaa, 0x9a, 0x93, 0x72, 0xc9, 0x5e, 0x2d, 0x94, + 0x05, 0x6b, 0x94, 0xfa, 0x1a, 0xe2, 0x00, 0x65, 0x2a, 0xad, 0x21, 0x7c, 0x80, 0x4d, 0x1b, 0x43, 0x28, 0x1c, 0x5c, 0x1f, 0xea, 0xe6, 0x66, 0x48, 0x55, 0x59, 0x95, 0xa3, 0x4e, 0x8d, 0x69, 0x5c, + 0xc6, 0xec, 0x34, 0x17, 0xc3, 0x55, 0x82, 0x8d, 0x44, 0x7c, 0x4b, 0xb7, 0x83, 0xd5, 0xc6, 0x58, 0x96, 0xa1, 0xbd, 0x85, 0x73, 0x95, 0xae, 0x9c, 0x12, 0x7b, 0x3e, 0x4d, 0xef, 0x43, 0xca, 0xd6, + 0xe0, 0x1f, 0x47, 0xa0, 0x5c, 0x33, 0xac, 0xbe, 0x75, 0x48, 0xb5, 0xf8, 0x15, 0xff, 0xf7, 0x4d, 0x1c, 0xe8, 0x05, 0x7a, 0xc2, 0xc6, 0xb9, 0x05, 0x7e, 0xb4, 0x15, 0x6e, 0xef, 0x9c, 0xab, 0x0f, + 0x3a, 0x78, 0x28, 0xbc, 0x71, 0x25, 0x30, 0xd4, 0xc4, 0xc9, 0x99, 0x1d, 0xce, 0xc0, 0x35, 0xcd, 0x02, 0x83, 0x43, 0xda, 0x82, 0x78, 0x2b, 0x32, 0x24, 0x08, 0x4a, 0x69, 0xe5, 0x64, 0x6e, 0xa4, + 0x94, 0x9b, 0x88, 0x5f, 0x62, 0x03, 0x88, 0x88, 0xc6, 0xd5, 0x9a, 0x4f, 0x96, 0xca, 0x24, 0x34, 0x69, 0x32, 0x04, 0x1d, 0x88, 0xc0, 0x2b, 0x3b, 0x69, 0x4d, 0x8d, 0x71, 0xb6, 0x9c, 0xa1, 0x4c, + 0x74, 0x0c, 0xca, 0xa6, 0xde, 0xf3, 0xab, 0xf1, 0x93, 0xaf, 0xeb, 0x8e, 0x9f, 0xd9, 0x48, 0x62, 0x43, 0x2b, 0xfb, 0x91, 0x96, 0xfe, 0x3e, 0xa5, 0x2d, 0x5c, 0xa7, 0x3d, 0x7d, 0x43, 0x8f, 0x47, + 0x96, 0x26, 0xf2, 0x9c, 0xf7, 0xec, 0x04, 0xf2, 0x82, 0xfc, 0xe2, 0xb4, 0xcf, 0x74, 0x10, 0x80, 0x3a, 0x51, 0x45, 0xbd, 0x39, 0xb4, 0x6e, 0x79, 0x64, 0x4b, 0x89, 0x6d, 0xed, 0x46, 0x98, 0xc3, + 0xb6, 0x50, 0x63, 0x4b, 0x3a, 0x59, 0x62, 0x8a, 0x14, 0x1a, 0x34, 0x37, 0xaa, 0x8b, 0x28, 0x1b, 0xab, 0xea, 0x64, 0x8f, 0x62, 0x2d, 0x06, 0x63, 0xe1, 0xc6, 0x1f, 0xfa, 0x50, 0x43, 0x0b, 0x5b, + 0x04, 0x61, 0x06, 0x4c, 0x2f, 0x24, 0x57, 0xa9, 0xca, 0x0b, 0x50, 0x40, 0x84, 0x3d, 0x9c, 0x60, 0x34, 0xf0, 0x79, 0x94, 0xdb, 0x5e, 0x18, 0xf6, 0x73, 0x2d, 0x76, 0xac, 0x57, 0x0d, 0xeb, 0xaf, + 0xa5, 0x91, 0x3d, 0xa6, 0x80, 0xa1, 0x19, 0xae, 0x75, 0x8a, 0x39, 0xe5, 0x56, 0x56, 0x9d, 0x0d, 0xac, 0xfb, 0x62, 0xea, 0x99, 0x8c, 0xe2, 0x4f, 0xd0, 0x8f, 0xda, 0xf1, 0xc7, 0x7b, 0x7d, 0xac, + 0x5b, 0x6e, 0xf1, 0xd2, 0x47, 0x8c, 0xd1, 0x54, 0x18, 0x67, 0x4b, 0x75, 0x87, 0xaf, 0x5b, 0x0c, 0x95, 0xe3, 0x06, 0x9e, 0x2a, 0x23, 0x75, 0x11, 0x7a, 0x2b, 0x31, 0xb3, 0x75, 0x4b, 0xc8, 0x9d, + 0xd1, 0x0a, 0xda, 0x73, 0x23, 0xcf, 0x55, 0xa2, 0xb1, 0x1c, 0xe7, 0x1a, 0x59, 0xce, 0x4a, 0xce, 0x98, 0xae, 0xd1, 0x43, 0x8b, 0xef, 0x27, 0xbd, 0x79, 0x32, 0x1b, 0xf7, 0x8a, 0x62, 0xa2, 0xd6, + 0xf5, 0x80, 0x74, 0x26, 0x43, 0xd6, 0xf9, 0x4e, 0x15, 0xf8, 0xb2, 0xba, 0x33, 0x3e, 0xce, 0xe1, 0x64, 0xf3, 0x59, 0x6f, 0xab, 0xe2, 0x26, 0xce, 0xee, 0x58, 0x65, 0xbf, 0x28, 0x73, 0x4b, 0x8b, + 0x5e, 0x05, 0x1b, 0x74, 0x27, 0x56, 0x7f, 0x42, 0x48, 0xbf, 0xb0, 0x22, 0x2d, 0x2e, 0x3d, 0xe3, 0xa2, 0x76, 0x7f, 0x58, 0x5f, 0x81, 0xd5, 0xd4, 0xf7, 0x77, 0xb7, 0x30, 0xd9, 0x5b, 0xf9, 0xd1, + 0x68, 0xef, 0x07, 0x56, 0x73, 0xb1, 0xbf, 0x3f, 0xbc, 0xf3, 0x9e, 0xb1, 0xf6, 0x6a, 0xbb, 0x7e, 0xd6, 0xeb, 0x2f, 0x13, 0x09, 0xbd, 0xe0, 0x7a, 0x32, 0xff, 0x29, 0x3c, 0x77, 0xbb, 0x65, 0xde, + 0x20, 0xed, 0xbe, 0xe5, 0xfb, 0x8c, 0x03, 0xe7, 0x1d, 0x2c, 0xd0, 0xbf, 0x1a, 0x74, 0xcd, 0x72, 0x8e, 0xc9, 0x49, 0x6f, 0x02, 0xe5, 0x23, 0x75, 0x33, 0xae, 0x80, 0x14, 0xcf, 0xfd, 0xd6, 0x19, + 0xf5, 0x14, 0x1d, 0x0d, 0x6d, 0x65, 0x97, 0xa7, 0x21, 0xae, 0x61, 0x9b, 0x68, 0x96, 0xcb, 0xc4, 0x7e, 0x32, 0x64, 0xa1, 0x31, 0x57, 0x0b, 0xc0, 0x6a, 0x2f, 0x2c, 0x54, 0x26, 0x5e, 0x86, 0x7b, + 0x5d, 0x0a, 0x14, 0xcc, 0xac, 0xcb, 0x09, 0xdb, 0x4e, 0x78, 0xb1, 0x59, 0xed, 0xf4, 0x79, 0x22, 0xad, 0x84, 0x75, 0xfa, 0xbc, 0x80, 0x48, 0xab, 0x28, 0xbd, 0xe2, 0x87, 0xe7, 0xc9, 0xf4, 0xf6, + 0x17, 0xff, 0x49, 0xae, 0x8e, 0x6f, 0x88, 0xff, 0x89, 0x9b, 0xef, 0x31, 0x00, 0xfc, 0x94, 0xce, 0x74, 0x0b, 0x1a, 0xe8, 0x7f, 0xb8, 0x71, 0x4a, 0x12, 0xec, 0xc0, 0x08, 0x65, 0xb6, 0xd8, 0xe5, + 0x22, 0x4e, 0x24, 0xfc, 0x92, 0xc6, 0x91, 0x05, 0x7f, 0xe0, 0x50, 0x9a, 0x9f, 0xaf, 0x8a, 0x55, 0xb2, 0xdf, 0xda, 0x84, 0xcf, 0x25, 0x09, 0x33, 0x74, 0xf0, 0x83, 0xa0, 0xd5, 0x6b, 0x09, 0x07, + 0xb1, 0x35, 0xa6, 0x07, 0xab, 0x19, 0x46, 0x29, 0xb0, 0x64, 0xe1, 0xab, 0x2a, 0xd0, 0xd4, 0xa2, 0x0a, 0x0f, 0x1a, 0x02, 0xee, 0x57, 0xb8, 0x1e, 0x80, 0x69, 0x84, 0xee, 0x3c, 0x26, 0xfa, 0x8e, + 0x11, 0x3a, 0x93, 0xf3, 0x2b, 0xc4, 0x87, 0x61, 0x5f, 0xf7, 0x62, 0xf3, 0xa1, 0xd6, 0xf3, 0xcc, 0x76, 0xfb, 0x06, 0xf5, 0x24, 0xd9, 0x5f, 0xaf, 0xbb, 0x86, 0xa8, 0xf0, 0x65, 0x6f, 0xa2, 0x8f, + 0x3d, 0x37, 0x27, 0x07, 0xdb, 0xa9, 0x3e, 0x51, 0xac, 0xc2, 0x28, 0xf7, 0x91, 0xc4, 0x69, 0x16, 0x96, 0x2f, 0x3d, 0xb6, 0x8d, 0x5a, 0xc8, 0x33, 0x72, 0x6b, 0x3b, 0xeb, 0x81, 0xda, 0x08, 0x9f, + 0xcf, 0xec, 0x2a, 0x73, 0xe9, 0x22, 0x81, 0xa5, 0x61, 0x6c, 0xa4, 0xc6, 0xa4, 0x6c, 0xf9, 0x55, 0xd9, 0xee, 0x6c, 0x78, 0x35, 0x9d, 0x56, 0xd6, 0x76, 0x36, 0x95, 0x94, 0x22, 0xcb, 0x47, 0xdd, + 0x02, 0xb2, 0x76, 0x15, 0x1b, 0xe5, 0x51, 0x29, 0x7b, 0x45, 0xc9, 0x9d, 0x34, 0xa5, 0xa3, 0x90, 0xf0, 0xe2, 0xa3, 0x35, 0x55, 0x78, 0xc6, 0x57, 0x32, 0xf1, 0xd9, 0xa5, 0xd3, 0x39, 0xc7, 0xe1, + 0xda, 0x31, 0x7b, 0x5f, 0x22, 0x22, 0x4f, 0x38, 0xe5, 0xdf, 0xa0, 0x9e, 0x68, 0xf7, 0x7a, 0xdd, 0x3f, 0xc1, 0xfa, 0x9e, 0x76, 0x73, 0x98, 0x10, 0x25, 0x12, 0xc2, 0xc1, 0x78, 0xbf, 0x15, 0x31, + 0x44, 0xf6, 0xcb, 0x90, 0x5e, 0xd2, 0x88, 0x19, 0x9a, 0xab, 0x51, 0xaa, 0xcd, 0x76, 0x6a, 0xb0, 0x64, 0xa1, 0x8a, 0x9f, 0xd8, 0xad, 0x8d, 0xe4, 0xeb, 0x4a, 0xb0, 0x1c, 0x46, 0x63, 0xac, 0xa2, + 0xb1, 0xac, 0x9e, 0x72, 0x58, 0xf5, 0xb6, 0x98, 0x58, 0xaf, 0xa9, 0xd5, 0x06, 0x93, 0x73, 0x73, 0x69, 0xae, 0xbd, 0x35, 0x34, 0x40, 0xf6, 0xb3, 0xef, 0x76, 0xe3, 0xef, 0x02, 0xe5, 0x5d, 0x50, + 0xf9, 0x85, 0xdb, 0x0f, 0x7d, 0x2a, 0x58, 0x7d, 0xeb, 0xf6, 0x43, 0xbb, 0x85, 0xac, 0x13, 0x2e, 0xd6, 0xdd, 0x49, 0xb3, 0x66, 0x77, 0xa9, 0x5c, 0x59, 0x2d, 0xe1, 0x91, 0x7c, 0xd4, 0xd0, 0x1a, + 0x1a, 0xeb, 0x3e, 0xca, 0x2e, 0x57, 0x4d, 0xe5, 0x1a, 0xc0, 0xbe, 0x19, 0x06, 0x0a, 0x0e, 0x6c, 0x37, 0x82, 0xb1, 0x67, 0x97, 0xc3, 0xcd, 0x08, 0xc3, 0x08, 0xa1, 0x22, 0xd6, 0xc1, 0x12, 0xef, + 0x81, 0x53, 0x1c, 0x13, 0xe7, 0xeb, 0xa5, 0xd5, 0xec, 0x87, 0xe3, 0x74, 0x05, 0x62, 0x90, 0x87, 0x7e, 0x94, 0x22, 0xff, 0x7c, 0x1f, 0x1f, 0x74, 0xe7, 0x4f, 0x7e, 0xb8, 0x58, 0xce, 0xd8, 0x3d, + 0xfd, 0xfb, 0xa3, 0x1a, 0x06, 0xc3, 0x4d, 0x02, 0xcf, 0xd4, 0x1e, 0x55, 0xfa, 0x23, 0x4f, 0xc5, 0x9d, 0x2f, 0x40, 0x4f, 0xd4, 0x3e, 0x5f, 0xf6, 0x91, 0x6e, 0x51, 0xe7, 0x61, 0xaf, 0xe8, 0x2d, + 0xcd, 0xde, 0x16, 0xdc, 0xcc, 0x66, 0xad, 0xb6, 0xa7, 0x22, 0x0d, 0x70, 0x6a, 0x72, 0xb1, 0xca, 0x02, 0xc9, 0xcb, 0x14, 0x69, 0x3b, 0xaf, 0xd4, 0xa4, 0x19, 0x15, 0x5e, 0x5d, 0xb0, 0xe8, 0x48, + 0xdb, 0x4a, 0xe3, 0x96, 0x99, 0x82, 0x18, 0x20, 0xf1, 0x7e, 0x61, 0x43, 0x86, 0x62, 0x0d, 0xc7, 0xfa, 0x10, 0x97, 0xc7, 0xb4, 0xeb, 0xb7, 0x38, 0x53, 0xc7, 0x42, 0x00, 0xa7, 0x40, 0xf9, 0x57, + 0x4c, 0xee, 0xb7, 0x12, 0x8f, 0xdf, 0x7f, 0xff, 0x54, 0x3a, 0xfc, 0x66, 0x97, 0x1d, 0x9f, 0x7d, 0xd4, 0x69, 0xc3, 0x44, 0xef, 0xa7, 0x5a, 0x6e, 0x9d, 0xdd, 0x2d, 0x7f, 0xff, 0xa4, 0xd4, 0x7a, + 0x45, 0xff, 0x35, 0x68, 0x7a, 0x49, 0x21, 0xfd, 0xfb, 0xa7, 0x78, 0x8e, 0x57, 0xf4, 0x8f, 0x70, 0x4e, 0x0f, 0xd1, 0x8f, 0x45, 0x79, 0x9f, 0xeb, 0x2b, 0xfe, 0xfe, 0x49, 0xeb, 0xcd, 0x2d, 0xcd, + 0x34, 0xbd, 0x3c, 0x7d, 0x7d, 0x3a, 0x78, 0x82, 0x39, 0x7f, 0x11, 0x2f, 0xd0, 0x5d, 0xdd, 0xe9, 0x92, 0x1a, 0xf3, 0xb8, 0xe1, 0x8a, 0x5d, 0xbc, 0xb7, 0x75, 0xf9, 0x3b, 0x7c, 0x12, 0xbe, 0x1d, + 0x38, 0xd2, 0xeb, 0x7b, 0xb1, 0xfd, 0x28, 0x55, 0xed, 0x39, 0x9d, 0xe6, 0x15, 0xe6, 0x91, 0x1f, 0xcf, 0x57, 0x5d, 0xb5, 0x98, 0x41, 0xc9, 0xe1, 0x74, 0x99, 0xab, 0xe0, 0xa2, 0xb7, 0x9c, 0x4f, + 0xf8, 0xd2, 0x2d, 0xb3, 0xa5, 0x8f, 0xda, 0x2c, 0x3c, 0xb3, 0x74, 0x82, 0x18, 0xa3, 0xe3, 0x91, 0x2a, 0x54, 0xf0, 0x60, 0x4e, 0x6d, 0x64, 0x67, 0x37, 0x03, 0x47, 0xc8, 0xac, 0x40, 0x05, 0x7e, + 0x9a, 0xe5, 0x31, 0x38, 0x93, 0xa1, 0x2d, 0xc8, 0xbb, 0x10, 0xa0, 0x12, 0x7b, 0xb5, 0x55, 0x84, 0x43, 0x26, 0xe7, 0x3b, 0x8b, 0xd4, 0x93, 0xf1, 0x8f, 0x3b, 0x1c, 0x5c, 0x87, 0x0d, 0xef, 0x23, + 0x05, 0x7e, 0x66, 0x95, 0x5e, 0xa0, 0x1e, 0xd1, 0x72, 0xb9, 0x3e, 0x85, 0xed, 0x3b, 0xac, 0xd3, 0x06, 0x35, 0x12, 0xde, 0x68, 0x42, 0x47, 0x1c, 0x9b, 0x1b, 0x2f, 0xf6, 0x3d, 0x8a, 0xac, 0xd6, + 0x84, 0x30, 0x1e, 0xc3, 0xfa, 0xdc, 0x6f, 0xa6, 0xd2, 0x9e, 0x8e, 0x04, 0x7d, 0xb8, 0x60, 0xd6, 0xc0, 0x4a, 0x5b, 0xc8, 0x18, 0x2d, 0x2f, 0x77, 0x86, 0xa4, 0x00, 0x05, 0xb6, 0xf1, 0xa7, 0x3c, + 0x85, 0xd1, 0x0b, 0x91, 0xd6, 0xac, 0x95, 0xc2, 0x8c, 0x15, 0x70, 0xba, 0x98, 0x8a, 0x03, 0xdf, 0xe6, 0xf7, 0x8f, 0xd2, 0x66, 0xba, 0x72, 0x2a, 0xf6, 0x97, 0xa5, 0xe8, 0xd3, 0xda, 0xfa, 0x75, + 0x9e, 0xfd, 0x3d, 0x0a, 0x81, 0xcf, 0xc9, 0xd1, 0x37, 0xb0, 0xaf, 0x24, 0x3a, 0x0f, 0xfa, 0x60, 0x37, 0x59, 0x8a, 0xaf, 0x1c, 0x78, 0x96, 0x5b, 0x29, 0x24, 0x02, 0xbd, 0x15, 0x42, 0x1b, 0x96, + 0xa7, 0x96, 0x2b, 0x83, 0x12, 0xb6, 0x07, 0x77, 0x54, 0x93, 0xfb, 0x1e, 0xbd, 0xb6, 0x21, 0x08, 0x83, 0x6b, 0xb4, 0xf0, 0x82, 0x59, 0x5e, 0x27, 0x3e, 0xcf, 0x4c, 0xb2, 0x5d, 0x49, 0xac, 0xd8, + 0x8d, 0xab, 0x11, 0x72, 0xc8, 0x0c, 0x73, 0x47, 0x06, 0x49, 0x6b, 0x2b, 0x34, 0xa5, 0x3a, 0x04, 0xa4, 0x56, 0xc9, 0x42, 0xb9, 0x63, 0xae, 0x65, 0xa2, 0xfb, 0x96, 0x51, 0xf6, 0xb5, 0xa2, 0xb8, + 0x84, 0xd1, 0x3f, 0x6f, 0x9f, 0x1f, 0xa3, 0xdd, 0xf0, 0x49, 0xbe, 0x7e, 0xa2, 0xe1, 0xcf, 0xa9, 0xfe, 0xbd, 0x64, 0x3a, 0xed, 0xd8, 0xe7, 0x6d, 0xbd, 0x6b, 0xc2, 0xe6, 0xa5, 0x56, 0xe2, 0xfe, + 0x02, 0x7c, 0x4a, 0x23, 0x3a, 0x42, 0x3c, 0x51, 0x36, 0x89, 0xad, 0x2e, 0x49, 0x7c, 0x50, 0x7f, 0x8a, 0x0c, 0xe7, 0x31, 0x14, 0xd8, 0x4c, 0xd2, 0xa3, 0xd4, 0xfd, 0x8a, 0x54, 0x46, 0x8b, 0x49, + 0x32, 0xf6, 0x98, 0x15, 0x44, 0x74, 0xcf, 0x40, 0x06, 0x5f, 0x3a, 0x19, 0x42, 0x1f, 0x1d, 0x37, 0x7f, 0xd0, 0x1a, 0xba, 0x01, 0xfd, 0x86, 0x81, 0xcb, 0x8d, 0x2e, 0x76, 0x11, 0xd4, 0x07, 0xcd, + 0x66, 0xb7, 0x14, 0x47, 0x07, 0xc9, 0x56, 0x81, 0x3a, 0x0f, 0xc7, 0x2c, 0x2e, 0x55, 0x8b, 0x15, 0x3b, 0xc0, 0xb6, 0xc5, 0xb3, 0xbb, 0x7d, 0xe4, 0x45, 0x9e, 0xf1, 0xd9, 0x57, 0xd5, 0xa5, 0x2c, + 0xe9, 0xb6, 0x89, 0xd9, 0x23, 0xe3, 0xe3, 0x29, 0x54, 0x5d, 0xe0, 0x9e, 0xf1, 0x74, 0x19, 0x9d, 0x0c, 0x90, 0x0e, 0x1a, 0xb4, 0xea, 0xd3, 0x13, 0xff, 0x00, 0x92, 0xb3, 0xd8, 0x4b, 0x08, 0x91, + 0xa6, 0x20, 0xa9, 0xa5, 0xf0, 0x29, 0x33, 0x82, 0x20, 0xa2, 0x1d, 0x07, 0x20, 0xca, 0xb7, 0x98, 0x46, 0xf1, 0xbc, 0xe7, 0xf5, 0x50, 0x40, 0xad, 0x77, 0x83, 0xb9, 0xe0, 0xc4, 0x10, 0x85, 0x86, + 0xd2, 0x60, 0xe6, 0xe3, 0x4c, 0x62, 0x8e, 0x75, 0xd3, 0x5a, 0x8b, 0x98, 0xb9, 0x23, 0x88, 0x2a, 0x66, 0x40, 0x6c, 0x65, 0x20, 0x51, 0xd0, 0x55, 0x83, 0x3e, 0x37, 0xf6, 0xfa, 0xfb, 0xa9, 0x57, + 0xcc, 0x4d, 0x69, 0x4a, 0x55, 0x7a, 0x67, 0x07, 0x1b, 0x78, 0x7c, 0x74, 0x53, 0xcb, 0x53, 0x55, 0xe7, 0x8a, 0x9b, 0xbf, 0x13, 0x2f, 0xdd, 0x1a, 0xad, 0x7d, 0x2c, 0x27, 0x7e, 0xa4, 0x36, 0x3c, + 0x21, 0x7f, 0xaf, 0x21, 0x1f, 0xd1, 0x7f, 0x3d, 0xee, 0x5a, 0x2d, 0xb9, 0x5e, 0xd3, 0x63, 0xa1, 0xf0, 0x71, 0xaf, 0x02, 0x0e, 0xfa, 0x20, 0xe1, 0x14, 0xa3, 0x98, 0x30, 0x62, 0x9a, 0x4e, 0x16, + 0x71, 0xe1, 0x03, 0x03, 0x78, 0xb9, 0x91, 0xd6, 0x9c, 0x8e, 0xb6, 0xc2, 0x20, 0x89, 0x77, 0xfb, 0xcd, 0x04, 0x69, 0x37, 0x51, 0x24, 0x25, 0x0b, 0x63, 0x69, 0x4f, 0xc7, 0xbd, 0xf1, 0x9a, 0x4a, + 0x6d, 0x0e, 0x90, 0x07, 0x04, 0x6a, 0xf3, 0x0e, 0x42, 0xa8, 0xcc, 0x58, 0xa3, 0x43, 0xae, 0x63, 0x3a, 0xf5, 0xf9, 0x07, 0x5f, 0x5a, 0xfa, 0xfd, 0xfd, 0x5c, 0x37, 0x75, 0xc1, 0x68, 0x57, 0x71, + 0x81, 0x77, 0x5d, 0x02, 0xd7, 0x1f, 0xbb, 0x2f, 0x2c, 0xae, 0xcb, 0xb6, 0x7e, 0x46, 0x84, 0x23, 0xd8, 0x37, 0x0a, 0x1c, 0x07, 0xa7, 0x28, 0x11, 0xfa, 0x3d, 0xfa, 0xcd, 0x65, 0xd3, 0x43, 0x46, + 0xd5, 0x16, 0xd1, 0xe0, 0xfd, 0x42, 0x57, 0x19, 0xb6, 0xe2, 0xd5, 0x54, 0x32, 0x1c, 0x7f, 0x5a, 0xcd, 0x65, 0xa0, 0x22, 0xe7, 0x40, 0xa5, 0x1b, 0xea, 0x64, 0xb8, 0xdc, 0xe9, 0x54, 0x42, 0xd8, + 0x36, 0xba, 0x24, 0x9a, 0x4d, 0x3a, 0x20, 0x6d, 0xd0, 0xb2, 0x45, 0xa2, 0xa2, 0x13, 0x25, 0x19, 0x64, 0xe8, 0xe4, 0x80, 0x9b, 0xca, 0x70, 0xe9, 0xac, 0xa6, 0x3b, 0x67, 0x54, 0xac, 0xbe, 0xee, + 0xba, 0xf4, 0xb1, 0x74, 0xee, 0x11, 0x2e, 0x7e, 0x9e, 0xcf, 0x7f, 0x03, 0xf9, 0x0d, 0x1d, 0xaf, 0xe3, 0x13, 0x46, 0x3a, 0xe4, 0xf7, 0x67, 0x1e, 0xe9, 0x07, 0xa9, 0xce, 0xcf, 0x97, 0x00, 0x33, + 0xc7, 0x88, 0xa6, 0x17, 0xba, 0x68, 0x06, 0x02, 0x4b, 0x88, 0x57, 0x27, 0x3e, 0xbc, 0xde, 0x61, 0x3b, 0x80, 0x8b, 0x78, 0x0d, 0xe9, 0x39, 0x33, 0x0a, 0x69, 0x7b, 0xdb, 0x3d, 0x0b, 0xa9, 0x2d, + 0xc5, 0x34, 0x45, 0x9d, 0x31, 0x53, 0x11, 0x89, 0x04, 0x2c, 0x6a, 0x63, 0xc1, 0x08, 0xd2, 0x5d, 0xb4, 0x87, 0x62, 0x76, 0x68, 0xcc, 0xfc, 0x66, 0x7d, 0xe3, 0x92, 0xf8, 0x54, 0x15, 0xf6, 0xa9, + 0x98, 0x50, 0xf7, 0x3a, 0x56, 0x84, 0xbd, 0x6d, 0xd4, 0xf7, 0x91, 0xf8, 0x4c, 0xd9, 0xef, 0x19, 0xe4, 0x05, 0x7b, 0x45, 0x1f, 0xfa, 0xbe, 0xe4, 0xf7, 0x88, 0x36, 0xad, 0x27, 0x67, 0x92, 0x8b, + 0x06, 0x8e, 0xea, 0x00, 0x62, 0x38, 0xad, 0x6d, 0xbd, 0xa5, 0x98, 0xd4, 0x59, 0x57, 0xf8, 0x68, 0xb4, 0x5a, 0x46, 0x51, 0xb6, 0x66, 0x66, 0xf1, 0xc1, 0x5d, 0xab, 0xec, 0x98, 0x9b, 0xc8, 0xd2, + 0x10, 0xd2, 0xf3, 0x8d, 0xbb, 0x58, 0x94, 0x03, 0x62, 0xcc, 0x6f, 0xe5, 0xa1, 0x50, 0x90, 0x7a, 0x8d, 0x08, 0xd4, 0x58, 0x95, 0x19, 0x7d, 0x73, 0xa8, 0x28, 0x8f, 0x81, 0xa3, 0xf2, 0x46, 0x90, + 0x7e, 0xa8, 0x35, 0xe8, 0xba, 0x3e, 0x8f, 0x52, 0x68, 0xd8, 0x6d, 0x81, 0x46, 0xba, 0x17, 0x5b, 0xe6, 0xd7, 0x61, 0x83, 0xe3, 0x8e, 0x47, 0x3c, 0x81, 0xd4, 0x1b, 0xd8, 0x27, 0xec, 0xde, 0xdc, + 0x39, 0x6d, 0xea, 0xc4, 0xf7, 0x68, 0x9e, 0xac, 0x16, 0x28, 0xbf, 0xb6, 0xab, 0x99, 0xc5, 0xd8, 0xb8, 0x41, 0xea, 0x24, 0x3f, 0x9b, 0xec, 0x5c, 0x4e, 0xa4, 0xb2, 0x1e, 0x1c, 0x8c, 0x46, 0x39, + 0x19, 0x46, 0x6b, 0xb2, 0x36, 0xea, 0x09, 0x3d, 0x20, 0x49, 0x88, 0x51, 0xb9, 0x5d, 0x29, 0x4e, 0x46, 0x22, 0xe5, 0x9a, 0x61, 0x3b, 0x6c, 0x97, 0xca, 0xfe, 0xe0, 0x12, 0x21, 0x65, 0xc6, 0x75, + 0xc4, 0x2f, 0x2d, 0xa0, 0x37, 0x30, 0xcc, 0x84, 0xfe, 0xd8, 0x86, 0xe8, 0x71, 0x23, 0xbf, 0x50, 0x6b, 0xae, 0xf1, 0x73, 0x14, 0x99, 0xcf, 0xc4, 0x0d, 0x7e, 0x75, 0x54, 0xb1, 0x92, 0x28, 0xd2, + 0x62, 0xf3, 0x61, 0x9f, 0x45, 0xe2, 0xa9, 0xde, 0x20, 0x6f, 0x50, 0xcf, 0x44, 0x38, 0x5f, 0xf7, 0x89, 0x6e, 0x7d, 0x41, 0x96, 0x81, 0x34, 0x1f, 0x56, 0x91, 0xdd, 0x63, 0x2c, 0x98, 0x52, 0x03, + 0x39, 0x23, 0x6c, 0x62, 0x36, 0x4c, 0x6c, 0xbc, 0x99, 0x63, 0xeb, 0x19, 0xc7, 0xc2, 0xa8, 0xb9, 0x61, 0x25, 0x32, 0x5a, 0xd8, 0x2a, 0x19, 0xe5, 0xde, 0xb0, 0x55, 0xd4, 0x55, 0xce, 0x05, 0xd5, + 0xce, 0xe3, 0xdc, 0xc6, 0x16, 0xc4, 0x8a, 0x28, 0x65, 0x37, 0xde, 0x90, 0x24, 0xe4, 0x71, 0x3b, 0xab, 0xae, 0xe3, 0x70, 0x8d, 0x6e, 0x7f, 0x54, 0x1e, 0x07, 0x75, 0x52, 0xc6, 0x93, 0x28, 0x4d, + 0x62, 0x2b, 0x2e, 0xfb, 0x56, 0xe4, 0x95, 0xe5, 0x17, 0x9d, 0x2a, 0x9f, 0xc4, 0xe0, 0x2d, 0xf4, 0x33, 0x26, 0x6f, 0xef, 0xf5, 0xa1, 0x6e, 0x18, 0x5d, 0x9b, 0x48, 0x61, 0x61, 0x2b, 0xb2, 0x57, + 0x2c, 0x21, 0x69, 0x9f, 0xa9, 0x7e, 0x61, 0xac, 0xf2, 0x2a, 0x4f, 0x69, 0x81, 0xb5, 0x97, 0x20, 0xd0, 0x28, 0xb1, 0xe8, 0xc5, 0xd8, 0x0a, 0xc8, 0x29, 0x24, 0x5a, 0x56, 0x25, 0x53, 0xcb, 0xf9, + 0x78, 0xe4, 0xce, 0x2a, 0x1d, 0xc9, 0x87, 0x60, 0xb5, 0xd0, 0x7b, 0x22, 0x2d, 0x92, 0x15, 0x0d, 0xae, 0x94, 0x84, 0x1c, 0x82, 0x8a, 0x69, 0x6b, 0x65, 0xb1, 0x7e, 0xe0, 0x01, 0xfe, 0x0a, 0x61, + 0x57, 0x89, 0x07, 0xf7, 0x2d, 0xd4, 0xe7, 0x34, 0xa4, 0x0b, 0xd8, 0x13, 0x8a, 0x2e, 0x83, 0x3e, 0xf8, 0xbd, 0x6e, 0x04, 0xf5, 0x61, 0x2e, 0xcc, 0x21, 0x04, 0xd8, 0xfa, 0xb6, 0x39, 0x58, 0xc6, + 0x3c, 0xa5, 0xf9, 0x95, 0x03, 0xc9, 0xa4, 0xb9, 0x46, 0xee, 0x6b, 0xf0, 0x5f, 0xce, 0xce, 0xf6, 0x9c, 0xa2, 0x4c, 0xf2, 0xc7, 0xae, 0xff, 0x27, 0xa7, 0x77, 0x81, 0x7b, 0x9e, 0xdf, 0x65, 0x74, + 0x4a, 0x04, 0xee, 0xa0, 0xfc, 0x69, 0x3c, 0x97, 0xe6, 0x4e, 0x30, 0x50, 0x5c, 0x72, 0xd1, 0x30, 0xf0, 0xc0, 0xf5, 0x89, 0xfd, 0xb4, 0x84, 0x7b, 0xd4, 0x00, 0x16, 0xf7, 0x10, 0xb5, 0x5e, 0xb3, + 0x6d, 0x46, 0xee, 0xe7, 0x29, 0xac, 0x68, 0xc3, 0x68, 0x12, 0x29, 0x04, 0x27, 0xd4, 0x75, 0x59, 0x47, 0xb1, 0x46, 0x88, 0x87, 0xcd, 0x7a, 0x38, 0xe3, 0x55, 0x34, 0x68, 0x79, 0x0a, 0x23, 0x16, + 0x30, 0x5c, 0x87, 0xda, 0x3a, 0x0d, 0xac, 0xc9, 0x77, 0x51, 0xb0, 0x2f, 0x04, 0x5c, 0x52, 0xf6, 0xd3, 0x3c, 0x39, 0x87, 0x44, 0x3f, 0xf5, 0x59, 0x76, 0x72, 0xcd, 0xb0, 0xec, 0x2a, 0xec, 0xdb, + 0xef, 0x0e, 0xef, 0x1b, 0x9f, 0x66, 0xa4, 0x05, 0x56, 0xdf, 0xf4, 0xce, 0xae, 0xee, 0x4f, 0xbe, 0xc6, 0x2a, 0xf6, 0xb2, 0xea, 0xd2, 0x3e, 0xf1, 0xf7, 0xdd, 0x00, 0xfb, 0x3e, 0xf7, 0x4a, 0xab, + 0x6f, 0x7b, 0xa1, 0xd5, 0x3f, 0x37, 0xa9, 0xb8, 0x0f, 0xe9, 0x60, 0x3a, 0x7d, 0x5d, 0x2b, 0xac, 0xcb, 0xa7, 0xd0, 0xa7, 0x84, 0x70, 0x37, 0x09, 0x9c, 0x04, 0xde, 0x23, 0x9e, 0xb9, 0x6d, 0xe8, + 0xd8, 0x9d, 0x67, 0x8e, 0x20, 0x4f, 0xec, 0x72, 0xbc, 0x38, 0x75, 0x14, 0xe9, 0xc0, 0x29, 0xea, 0x3e, 0x9f, 0x04, 0xd3, 0xd9, 0x41, 0x5e, 0x23, 0x34, 0x9b, 0xec, 0xca, 0x65, 0xaf, 0xd9, 0xd0, + 0xd8, 0x90, 0xd6, 0x71, 0x2e, 0xf4, 0x0e, 0xba, 0x66, 0x8d, 0xb6, 0x36, 0xb9, 0x22, 0x87, 0xf5, 0xa6, 0x58, 0xc4, 0x40, 0xd2, 0x53, 0xf6, 0xd8, 0xd0, 0x21, 0xb7, 0xa2, 0x48, 0x71, 0x04, 0x3c, + 0x70, 0x57, 0x0b, 0x73, 0xd1, 0xdb, 0x4f, 0x88, 0x96, 0x9e, 0xdb, 0x88, 0x39, 0x59, 0x84, 0x40, 0x70, 0x08, 0xe4, 0xd1, 0x4f, 0x04, 0x2f, 0xd8, 0xa9, 0xf7, 0xf2, 0x79, 0x56, 0xfe, 0xc3, 0x88, + 0xc1, 0x93, 0xae, 0x90, 0x0b, 0xd4, 0x37, 0xbc, 0xf9, 0x5a, 0xde, 0xc5, 0x25, 0x72, 0x4a, 0x29, 0xde, 0xf7, 0x34, 0xd3, 0xb0, 0x5b, 0xe1, 0x60, 0x08, 0x16, 0xdb, 0x03, 0xb7, 0x61, 0xbd, 0xce, + 0x73, 0x00, 0x09, 0xa7, 0x9b, 0x25, 0xa8, 0x53, 0xf8, 0x40, 0x3c, 0xec, 0x30, 0x02, 0x82, 0x8c, 0x83, 0xe8, 0x42, 0x5b, 0xfd, 0x70, 0xc0, 0x0f, 0x2a, 0x39, 0xe5, 0x20, 0x6b, 0x53, 0x52, 0x36, + 0x56, 0x78, 0x44, 0xee, 0xc0, 0xa1, 0x1b, 0xcb, 0x7e, 0xb1, 0x99, 0xf3, 0x13, 0xde, 0xd6, 0xd7, 0x6c, 0xb5, 0xff, 0x71, 0x4a, 0xb1, 0x71, 0x14, 0x0b, 0x47, 0xbb, 0xb6, 0xff, 0xb0, 0x21, 0xf5, + 0x93, 0xde, 0x92, 0x2b, 0xc0, 0x27, 0xf4, 0xbc, 0x0f, 0xbb, 0x79, 0x4a, 0x4a, 0x1b, 0x92, 0x59, 0x27, 0xf3, 0xea, 0x49, 0x06, 0x59, 0x59, 0x79, 0x58, 0xf1, 0xe1, 0xc8, 0x94, 0x65, 0x6a, 0xaf, + 0x19, 0x3f, 0x9d, 0xe3, 0x75, 0xc7, 0x8f, 0x47, 0x33, 0x7c, 0x62, 0xbf, 0x7d, 0x03, 0x7b, 0x9c, 0xdf, 0xdb, 0xa0, 0x6b, 0xef, 0x9a, 0x6a, 0xb4, 0xb1, 0x00, 0xdd, 0x59, 0x30, 0xa1, 0x60, 0x0a, + 0xd0, 0x86, 0x46, 0xc5, 0x00, 0x24, 0xaa, 0x61, 0x3a, 0x9a, 0xe1, 0x09, 0x74, 0x00, 0xca, 0xcd, 0xaa, 0xdc, 0xe1, 0xb8, 0x34, 0x68, 0x43, 0x57, 0x71, 0xab, 0xfd, 0x72, 0x5b, 0x6e, 0x02, 0x81, + 0xa4, 0x4b, 0xc6, 0xac, 0x27, 0x03, 0x23, 0x43, 0x89, 0x4d, 0x6b, 0x8d, 0xa7, 0x03, 0x0f, 0x6a, 0x17, 0xa8, 0xb9, 0x32, 0x88, 0x74, 0x3f, 0x57, 0xf2, 0xaf, 0xeb, 0x5a, 0x8d, 0xbc, 0x49, 0xcb, + 0xa4, 0x9f, 0x6b, 0xb1, 0x99, 0x44, 0xef, 0x22, 0xef, 0x91, 0xeb, 0xe1, 0x19, 0x94, 0x7c, 0xfe, 0xc0, 0x09, 0x39, 0x9f, 0x6f, 0x77, 0x8d, 0x65, 0xd4, 0x50, 0x1a, 0xb2, 0x14, 0xd2, 0x0c, 0x73, + 0x20, 0x14, 0xdc, 0xda, 0x9b, 0x41, 0xfb, 0x7c, 0x97, 0xce, 0xad, 0x46, 0x66, 0xa7, 0x23, 0x15, 0x16, 0x99, 0x85, 0x22, 0xd1, 0x5a, 0x1a, 0xe1, 0x00, 0x31, 0x1a, 0xc6, 0x73, 0x21, 0x69, 0xea, + 0x4d, 0x8a, 0xac, 0x39, 0x80, 0x16, 0x26, 0x59, 0x3c, 0x08, 0xe8, 0x36, 0x6e, 0xb6, 0x8e, 0xa2, 0x2e, 0x8a, 0x75, 0xa9, 0x28, 0xec, 0x56, 0xaf, 0xa6, 0xc4, 0x7f, 0x46, 0xa5, 0x9d, 0x69, 0x69, + 0x0f, 0x33, 0xc1, 0x9f, 0x6b, 0x9c, 0x7f, 0x82, 0x78, 0x2a, 0x8b, 0xd7, 0x4a, 0xb7, 0x4b, 0x87, 0x7c, 0xa8, 0x3f, 0xd2, 0x32, 0x63, 0x45, 0xe2, 0x66, 0x10, 0xcb, 0x93, 0x09, 0x6d, 0xcc, 0x9d, + 0x48, 0x19, 0x50, 0x53, 0x7d, 0x6a, 0x1c, 0x9c, 0xaf, 0xf8, 0xe4, 0xab, 0x92, 0xfe, 0xe7, 0xba, 0x8f, 0xde, 0x96, 0xf4, 0x77, 0xec, 0x37, 0xba, 0xdc, 0x11, 0xbb, 0x4c, 0xc0, 0x01, 0x48, 0x1b, + 0x1a, 0x59, 0x70, 0x50, 0xf6, 0x70, 0xb3, 0x2b, 0x0a, 0x68, 0x60, 0xc3, 0xd8, 0x82, 0xdb, 0x92, 0x29, 0xb5, 0x5b, 0x99, 0x20, 0x50, 0x71, 0x00, 0x27, 0x64, 0xe6, 0xca, 0x3d, 0xe8, 0x82, 0x36, + 0x1c, 0xa2, 0x6e, 0xdc, 0xfa, 0x06, 0x0d, 0x6f, 0xb2, 0x55, 0x4a, 0x15, 0xa1, 0x3d, 0x18, 0xe0, 0x30, 0x62, 0x70, 0x82, 0xbc, 0x9c, 0x8a, 0x11, 0xaf, 0x20, 0xdf, 0x65, 0x21, 0x7c, 0x5f, 0xe5, + 0xdf, 0xcd, 0xaf, 0x64, 0x5a, 0x47, 0xdd, 0x3b, 0xb7, 0x8a, 0xe2, 0x3b, 0x6f, 0x34, 0xf2, 0x94, 0xb6, 0x7f, 0x07, 0xfe, 0x09, 0xbf, 0x9f, 0xee, 0xf6, 0x91, 0xef, 0x35, 0x7e, 0xa8, 0xef, 0x70, + 0x92, 0xc9, 0xfb, 0x26, 0xbb, 0xa4, 0x6b, 0x6c, 0xc6, 0x8e, 0x29, 0xc5, 0xcb, 0x4b, 0x7c, 0xe6, 0x64, 0x08, 0xc0, 0x3f, 0x8d, 0xaf, 0xef, 0xfc, 0xd2, 0x5d, 0x97, 0x5b, 0x97, 0x96, 0x95, 0x37, + 0xfd, 0xb2, 0x1f, 0xad, 0xb9, 0x9f, 0xab, 0x45, 0xef, 0x60, 0x4f, 0xc8, 0xbd, 0x0c, 0xba, 0xb6, 0x9a, 0x6f, 0xcc, 0xa1, 0x31, 0x18, 0x99, 0x5e, 0xb6, 0x31, 0xd6, 0xbd, 0x99, 0x6f, 0xec, 0xe5, + 0x95, 0x3e, 0xa4, 0x02, 0x77, 0x66, 0x10, 0xb1, 0xb3, 0xc8, 0x41, 0x5e, 0x73, 0x69, 0x72, 0x5a, 0x53, 0xde, 0x6c, 0x4f, 0xa4, 0xd5, 0x56, 0xd3, 0xe1, 0x46, 0x0d, 0xdd, 0x5e, 0x1c, 0x68, 0xc5, + 0x32, 0x56, 0x85, 0x1e, 0x3d, 0x95, 0x46, 0x02, 0x96, 0xaf, 0x53, 0x78, 0xd6, 0xce, 0xdc, 0x99, 0xda, 0xd6, 0x8b, 0x09, 0xf1, 0x3c, 0x07, 0x7b, 0xa7, 0x1d, 0xaa, 0x8a, 0xde, 0x0e, 0x2d, 0x81, + 0x3e, 0x9e, 0x27, 0xe2, 0x15, 0x7d, 0x53, 0x2b, 0xad, 0xfe, 0x39, 0x10, 0xf6, 0xf6, 0xce, 0xc7, 0xb6, 0xba, 0xef, 0xe9, 0xfc, 0x9f, 0x20, 0xbc, 0x86, 0xd0, 0xbc, 0xe2, 0xfe, 0x1f, 0xbf, 0x3e, + 0x7e, 0xcb, 0x66, 0xfd, 0x94, 0x97, 0x75, 0x02, 0x9d, 0xbe, 0xa4, 0x79, 0x52, 0x26, 0x65, 0x93, 0x5a, 0x2f, 0x76, 0xa8, 0x39, 0x97, 0x77, 0xe1, 0x7b, 0xdc, 0xf3, 0x6c, 0xb4, 0xb4, 0x73, 0x82, + 0xd6, 0x99, 0xee, 0x87, 0xd2, 0x7a, 0x98, 0x5e, 0x07, 0x3e, 0xd5, 0xbd, 0xed, 0x0a, 0xee, 0x1b, 0x77, 0x9d, 0x46, 0x7d, 0xb0, 0x5b, 0xff, 0xb6, 0xf9, 0x92, 0x39, 0xb0, 0x4b, 0x4d, 0x50, 0x4c, + 0x26, 0x9c, 0xad, 0xcb, 0xf1, 0xca, 0xa6, 0xd8, 0x8d, 0x5a, 0xda, 0x7b, 0xa0, 0xb2, 0x79, 0xa2, 0x97, 0x6f, 0x7c, 0x0c, 0x1d, 0xae, 0x59, 0xa6, 0x35, 0x22, 0xa0, 0x9e, 0xee, 0x57, 0xeb, 0xdd, + 0xa4, 0xc4, 0x96, 0x42, 0xc6, 0x4e, 0xb6, 0x45, 0x04, 0xef, 0x68, 0x3e, 0x5f, 0xb0, 0x74, 0xb9, 0x5d, 0x63, 0x68, 0xa1, 0x40, 0x73, 0x9a, 0xa3, 0xe0, 0x7a, 0xb4, 0xfc, 0x8b, 0x7b, 0x23, 0xda, + 0x59, 0x3e, 0x5a, 0x69, 0x64, 0xe5, 0xce, 0x23, 0xa9, 0xf8, 0x5c, 0xb5, 0xd4, 0x1b, 0xd4, 0x57, 0x84, 0x9e, 0xae, 0xbb, 0xd6, 0x49, 0x4d, 0x66, 0x88, 0xec, 0xb0, 0xa8, 0xc3, 0x86, 0x3d, 0x81, + 0x51, 0xa3, 0x01, 0x12, 0xc4, 0x45, 0x25, 0x4e, 0x52, 0xba, 0x17, 0xd3, 0x22, 0x9f, 0xe3, 0x3c, 0x5a, 0x0f, 0x57, 0x86, 0x43, 0xe2, 0x22, 0x86, 0x70, 0x3e, 0x80, 0x6d, 0x33, 0xde, 0x9b, 0xac, + 0x66, 0x29, 0x49, 0x2a, 0x2d, 0x24, 0x94, 0x3d, 0x0c, 0xd3, 0xd5, 0x54, 0x40, 0x56, 0xf8, 0xbc, 0xb1, 0xc0, 0x65, 0x32, 0xe4, 0x05, 0xee, 0x83, 0x13, 0xef, 0x7b, 0x9f, 0x68, 0x57, 0xe4, 0x7d, + 0x3a, 0xbb, 0xe3, 0x91, 0xcc, 0xfb, 0xb9, 0xbb, 0xfe, 0x23, 0xf0, 0x13, 0x2a, 0x6f, 0x6f, 0x75, 0x75, 0xda, 0x83, 0xac, 0x68, 0x2e, 0x92, 0xaa, 0x60, 0x6a, 0x55, 0x82, 0x69, 0x6f, 0x12, 0xaa, + 0x96, 0x3a, 0x62, 0x48, 0xb9, 0x16, 0x0f, 0x11, 0x57, 0xec, 0x37, 0x63, 0xda, 0x26, 0xdc, 0x2d, 0xce, 0x6d, 0x9d, 0x29, 0xaa, 0x11, 0xfc, 0x86, 0xae, 0x00, 0x64, 0xa3, 0x63, 0xd5, 0x56, 0x49, + 0xda, 0xc0, 0x6f, 0xc2, 0x66, 0x7c, 0xb0, 0xc0, 0x19, 0xc9, 0x7a, 0x6b, 0x12, 0xf2, 0x37, 0xe8, 0x40, 0xc4, 0xc1, 0xed, 0xe6, 0xc7, 0x89, 0x28, 0xa6, 0x65, 0x7b, 0xb1, 0x75, 0x72, 0x21, 0x58, + 0x79, 0xe9, 0x3d, 0x4c, 0x48, 0x79, 0x1a, 0x5d, 0xb7, 0xd0, 0xcf, 0xf8, 0xba, 0xbd, 0xd7, 0x15, 0x61, 0x08, 0x9f, 0xd9, 0x0a, 0xe7, 0xc3, 0xe1, 0xbc, 0x35, 0x79, 0xd1, 0x26, 0x54, 0x56, 0xa5, + 0x81, 0x4d, 0x4f, 0xad, 0x9a, 0x1e, 0xe9, 0x50, 0x98, 0x0d, 0x61, 0xa8, 0x45, 0x70, 0xf0, 0x1e, 0x37, 0x9d, 0x38, 0xe5, 0x46, 0x39, 0x49, 0x59, 0xf9, 0x54, 0x49, 0x79, 0x14, 0x63, 0x15, 0xc5, + 0xf0, 0xe3, 0xc0, 0x14, 0x16, 0xbc, 0x2f, 0x04, 0xc3, 0x11, 0xb6, 0x99, 0x90, 0x44, 0x0f, 0x11, 0xb9, 0x70, 0xd7, 0x31, 0xec, 0xf6, 0x59, 0x34, 0x83, 0x2f, 0xd0, 0xcf, 0x8b, 0x04, 0x6e, 0x3a, + 0x85, 0x7d, 0x47, 0x94, 0x47, 0x02, 0xf5, 0x39, 0x8b, 0xec, 0x15, 0xe6, 0x1b, 0x01, 0xcc, 0x2e, 0xb6, 0x18, 0xd4, 0x6f, 0x14, 0x58, 0x6f, 0x6b, 0x73, 0x6b, 0x92, 0xde, 0x92, 0x5e, 0x85, 0xe9, + 0x64, 0x3d, 0x55, 0xd1, 0x41, 0x61, 0xa7, 0xe9, 0x7d, 0xdd, 0xe7, 0xab, 0x49, 0x7d, 0x70, 0xc5, 0xff, 0xc9, 0xb9, 0x5d, 0x83, 0x3e, 0x4d, 0xf1, 0xfa, 0x46, 0xb7, 0x99, 0x22, 0x6d, 0xee, 0x46, + 0x5a, 0x53, 0xf6, 0x10, 0x88, 0x1e, 0x67, 0xb9, 0x53, 0xa4, 0xa8, 0x67, 0xe4, 0xb3, 0xe5, 0xc1, 0x0d, 0x7e, 0x22, 0xa5, 0xd0, 0x6e, 0x42, 0xea, 0xdd, 0x6d, 0x77, 0xdf, 0xb7, 0xf9, 0x94, 0xda, + 0xfb, 0x0a, 0xf4, 0x88, 0x80, 0xd7, 0xcb, 0x53, 0x4e, 0x41, 0x87, 0xdd, 0x72, 0xc5, 0x13, 0x19, 0xd2, 0x52, 0xd6, 0x80, 0x70, 0x33, 0x39, 0xf3, 0x73, 0x6d, 0xb5, 0x8c, 0x5a, 0x15, 0x9a, 0xb3, + 0xcc, 0x50, 0xdc, 0xae, 0x66, 0x52, 0x48, 0x73, 0x63, 0x06, 0x0d, 0x66, 0x70, 0xb2, 0xaa, 0xe7, 0x6a, 0x80, 0xaf, 0xf5, 0xd5, 0xae, 0x2e, 0x29, 0x1e, 0xde, 0xd1, 0x19, 0x62, 0xef, 0x83, 0xcd, + 0x70, 0x3c, 0xae, 0x6b, 0x06, 0x9d, 0x8f, 0xc0, 0xd1, 0xa6, 0x97, 0x38, 0x93, 0x82, 0xe4, 0xe1, 0xe7, 0xfb, 0x75, 0x78, 0x1f, 0xdb, 0x7c, 0xfe, 0x74, 0xa1, 0x75, 0xb2, 0x42, 0x93, 0xd2, 0x73, + 0xe2, 0xc7, 0x0e, 0x66, 0xf0, 0x29, 0xbf, 0xd7, 0x1b, 0xd4, 0x33, 0x15, 0xce, 0xd7, 0x7d, 0xb0, 0x9b, 0xdf, 0x4b, 0x9e, 0x4e, 0xa7, 0x5b, 0x5b, 0xd4, 0xaa, 0xaa, 0xd0, 0x36, 0xb3, 0x71, 0x8f, + 0xb0, 0x9d, 0x4d, 0x6f, 0xb1, 0xa9, 0xc9, 0x5d, 0x30, 0x96, 0xa2, 0x4d, 0x8d, 0x17, 0x01, 0x16, 0x27, 0x3e, 0xa5, 0xaa, 0x75, 0xb5, 0x94, 0x17, 0x53, 0xb9, 0x01, 0xd5, 0x00, 0x95, 0x53, 0x66, + 0x45, 0x61, 0x34, 0xe5, 0x8b, 0xa0, 0x9f, 0x92, 0x7b, 0x63, 0x34, 0xae, 0x19, 0xd4, 0x4a, 0xec, 0xba, 0x69, 0x49, 0x63, 0x4d, 0x7d, 0x97, 0x83, 0xf7, 0x95, 0x95, 0x12, 0x7b, 0xef, 0xa5, 0x8f, + 0xc8, 0xfd, 0x5e, 0xde, 0x9f, 0x42, 0xc3, 0xe7, 0x29, 0x9f, 0xf0, 0xa4, 0x7b, 0x31, 0x70, 0x19, 0x76, 0x20, 0x48, 0x95, 0x86, 0xd6, 0xc1, 0xca, 0x1f, 0xa7, 0xdc, 0x3d, 0x93, 0x6d, 0xf0, 0x06, + 0xf5, 0x48, 0x90, 0xcb, 0xf5, 0x89, 0x20, 0xdf, 0xe4, 0x1a, 0x40, 0x7d, 0xdc, 0x61, 0x4c, 0x86, 0xdb, 0x2f, 0x41, 0xa2, 0x66, 0x00, 0x1d, 0xf3, 0x6d, 0x63, 0x9c, 0x10, 0x06, 0x3a, 0x9a, 0x2f, + 0xd9, 0x1f, 0x0a, 0xbf, 0xef, 0x9b, 0x37, 0xe0, 0x37, 0xbd, 0x5e, 0xbb, 0x4e, 0xee, 0x71, 0xf3, 0x86, 0x13, 0xbc, 0xef, 0x39, 0x6e, 0xbc, 0x27, 0xe7, 0x6b, 0x9a, 0x5d, 0xe1, 0xf3, 0x5a, 0x99, + 0x90, 0xe0, 0xb6, 0x59, 0xd7, 0x7b, 0x37, 0x1b, 0x2c, 0x06, 0x99, 0xe0, 0x1a, 0x98, 0xc0, 0xfb, 0x14, 0xa6, 0x2b, 0x8e, 0x33, 0x09, 0xd9, 0x81, 0xd2, 0x50, 0x4e, 0xd8, 0x03, 0xeb, 0x43, 0x36, + 0xd8, 0x30, 0x3a, 0xbf, 0x9c, 0x64, 0x73, 0x07, 0x77, 0xed, 0x6d, 0x1b, 0x55, 0x84, 0x34, 0x50, 0xa1, 0x55, 0x62, 0xbb, 0x91, 0xc4, 0xba, 0x6c, 0xf9, 0x63, 0x4f, 0xeb, 0x51, 0xaf, 0x4f, 0xec, + 0xef, 0xb6, 0x06, 0xf4, 0x09, 0xea, 0xdf, 0x40, 0x3e, 0xa2, 0xe8, 0x7a, 0x7c, 0x4a, 0x14, 0xe8, 0x90, 0x71, 0xd2, 0xab, 0xf6, 0x90, 0x17, 0xb3, 0xcc, 0x46, 0x58, 0x25, 0xda, 0xa6, 0x62, 0xda, + 0x75, 0xb3, 0x33, 0x61, 0xc8, 0x33, 0xf8, 0x9e, 0x11, 0x97, 0xe8, 0xb8, 0xa5, 0x06, 0xf9, 0xb6, 0xb7, 0x18, 0x43, 0x7b, 0x7f, 0x29, 0x8b, 0xd2, 0xb2, 0xe8, 0x49, 0x16, 0x3e, 0x59, 0xd6, 0xf8, + 0xc8, 0x5d, 0xe0, 0xb5, 0x38, 0x3c, 0x00, 0x09, 0xdb, 0xb8, 0x73, 0x61, 0x20, 0xac, 0x21, 0xa6, 0x97, 0xba, 0xab, 0x11, 0x53, 0x0d, 0x9e, 0x97, 0x8e, 0x49, 0x6c, 0x5c, 0x5c, 0x06, 0xdd, 0x76, + 0x1b, 0xab, 0xe8, 0x5f, 0x8e, 0x38, 0x7b, 0xac, 0xde, 0x0d, 0x9f, 0xe8, 0xe8, 0x7a, 0x05, 0xf8, 0x88, 0xdb, 0xf7, 0x51, 0xff, 0x0c, 0xf0, 0x7b, 0xd4, 0x8e, 0x34, 0x78, 0x0a, 0xf7, 0xd6, 0x26, + 0xa2, 0x63, 0xc1, 0x81, 0x96, 0x39, 0x69, 0x82, 0x4a, 0xda, 0x16, 0xc3, 0x8d, 0x96, 0x9c, 0x37, 0xa3, 0x1a, 0x69, 0xf1, 0xcd, 0xd2, 0x55, 0xd6, 0xf2, 0x00, 0x54, 0xc8, 0x43, 0x4f, 0xd7, 0x0b, + 0x45, 0x1d, 0x1e, 0x56, 0x02, 0x1a, 0xf2, 0x0b, 0xad, 0xb5, 0x84, 0x6a, 0x12, 0x36, 0xfa, 0x8e, 0x05, 0x37, 0x28, 0x9f, 0x57, 0x42, 0x52, 0xe0, 0x99, 0x9c, 0x0c, 0xec, 0x8e, 0xc9, 0x6c, 0xd7, + 0x85, 0x61, 0x77, 0x6a, 0x58, 0xad, 0xe2, 0xa8, 0xd5, 0xa7, 0xb9, 0x17, 0x79, 0xa5, 0x57, 0x5f, 0x30, 0x0e, 0x7f, 0x38, 0x6b, 0xec, 0xb9, 0x6a, 0xaa, 0x3b, 0xaf, 0x14, 0x4d, 0xa4, 0x27, 0x61, + 0xdf, 0xb4, 0x0a, 0x23, 0xf7, 0x4e, 0x79, 0x23, 0xbf, 0xff, 0xed, 0x6e, 0xff, 0x6c, 0xed, 0x5d, 0x05, 0x45, 0x3e, 0x3c, 0x78, 0x05, 0xf2, 0xe0, 0x85, 0x23, 0xfe, 0xf3, 0x58, 0x0b, 0xfb, 0x45, + 0x98, 0x94, 0x0f, 0x5e, 0x29, 0xfa, 0x47, 0xac, 0x68, 0x7a, 0xf8, 0x3e, 0xdf, 0x8f, 0x4e, 0x90, 0xd8, 0x72, 0xb4, 0x23, 0x42, 0xfa, 0xad, 0x95, 0x27, 0x6f, 0x7b, 0x34, 0xfc, 0xe1, 0xad, 0x6b, + 0x37, 0x08, 0xf4, 0x09, 0x46, 0xe1, 0x6a, 0xf9, 0xa5, 0xd1, 0x6f, 0x5f, 0xaf, 0x6c, 0xfb, 0xb5, 0x69, 0xf5, 0x27, 0x22, 0x1c, 0xdf, 0x7d, 0x0f, 0x3f, 0x1e, 0x1f, 0xe3, 0x1f, 0x1e, 0xef, 0x2d, + 0x2d, 0xc8, 0x2d, 0xfb, 0xfe, 0x9f, 0x5f, 0x3c, 0x2e, 0x71, 0x91, 0xbe, 0xfb, 0x6c, 0xa0, 0x8f, 0x8d, 0xbb, 0xbf, 0xf3, 0xbb, 0x9c, 0x5f, 0x78, 0xf9, 0x90, 0xfa, 0x7c, 0xf3, 0xa1, 0xf3, 0x8f, + 0xbc, 0x72, 0xcd, 0x94, 0xb9, 0x17, 0x59, 0x57, 0xac, 0x85, 0x7e, 0xfb, 0x76, 0x51, 0x6a, 0x79, 0x79, 0xff, 0xfd, 0x2a, 0xd6, 0x93, 0xc3, 0x27, 0x56, 0x7c, 0xa6, 0x34, 0xfe, 0x9f, 0xd4, 0xab, + 0xf8, 0x5a, 0x50, 0xdc, 0x3c, 0xb8, 0xe2, 0x94, 0x47, 0x66, 0xe7, 0xcf, 0x85, 0xfe, 0x05, 0xe8, 0xb9, 0x0b, 0xcf, 0x79, 0x3f, 0xec, 0x98, 0x5c, 0x18, 0xd4, 0x6b, 0xf3, 0x40, 0x15, 0x07, 0xd5, + 0x77, 0x5b, 0x79, 0x07, 0xe2, 0x6a, 0x3c, 0x6f, 0xcc, 0x56, 0x84, 0x24, 0x19, 0x90, 0x66, 0xa1, 0x24, 0x33, 0x8c, 0x82, 0x2a, 0xf3, 0x39, 0x81, 0x5b, 0x08, 0x9e, 0xc8, 0x23, 0x74, 0x48, 0xd9, + 0xc1, 0x3c, 0x73, 0x9a, 0xde, 0xc6, 0x9f, 0x24, 0x46, 0xb2, 0x6f, 0xe0, 0xa1, 0xc1, 0xd5, 0x86, 0xe8, 0x55, 0xbd, 0x80, 0xad, 0x71, 0x98, 0xf0, 0x25, 0x69, 0xd3, 0x31, 0x59, 0xe9, 0x1b, 0x79, + 0x74, 0x5c, 0xdf, 0x65, 0x72, 0x66, 0x9d, 0x52, 0x73, 0x7e, 0x3f, 0xef, 0x34, 0xfe, 0xe7, 0x31, 0xc1, 0x07, 0x81, 0x7a, 0x9f, 0xe4, 0xcf, 0x94, 0xbe, 0x7c, 0x80, 0x7d, 0xde, 0x8d, 0xae, 0xef, + 0xf4, 0xa1, 0x6e, 0x65, 0x30, 0xab, 0xf1, 0x32, 0x0c, 0x1d, 0x75, 0x56, 0x6a, 0x72, 0x32, 0x8c, 0x3c, 0x85, 0x34, 0xe6, 0x63, 0x57, 0x92, 0x35, 0x66, 0xe1, 0xcf, 0x26, 0x88, 0xa0, 0x14, 0xd0, + 0xc6, 0x33, 0x29, 0x7c, 0xb4, 0xf7, 0x68, 0x1f, 0x0a, 0x94, 0x03, 0x67, 0xad, 0x24, 0xa3, 0x9c, 0x8f, 0xac, 0x76, 0xb4, 0x64, 0x06, 0x2a, 0xb7, 0x66, 0x40, 0x07, 0x66, 0x1d, 0x21, 0xc6, 0xb8, + 0x3d, 0x89, 0xb2, 0x12, 0xe1, 0xad, 0xd3, 0xba, 0xe3, 0x86, 0xf4, 0x59, 0xfa, 0x7e, 0x96, 0x9c, 0x5d, 0x5c, 0xd0, 0xe7, 0x5d, 0xe0, 0x8a, 0x8b, 0xfe, 0x65, 0x18, 0xc4, 0xd0, 0x52, 0xab, 0xef, + 0x24, 0xda, 0xe3, 0xac, 0xef, 0x67, 0x22, 0x15, 0x57, 0x70, 0x4f, 0x8c, 0xf1, 0x36, 0x3a, 0xe5, 0x23, 0x74, 0x60, 0x0a, 0x02, 0xa8, 0x58, 0x57, 0x9f, 0x42, 0xf0, 0xb8, 0xf0, 0x1b, 0x78, 0x46, + 0x6f, 0x71, 0x6a, 0x98, 0x32, 0x7a, 0x6e, 0x69, 0x1b, 0x4d, 0x04, 0x96, 0xe9, 0x02, 0x69, 0x8c, 0xb8, 0xa9, 0xe9, 0x50, 0x32, 0xf7, 0xfc, 0x20, 0xc6, 0xa6, 0x0a, 0xb6, 0xc5, 0x2c, 0x98, 0x15, + 0xac, 0xc8, 0xae, 0xa7, 0xaa, 0x25, 0xf3, 0x99, 0x3a, 0x1c, 0x01, 0xc8, 0x34, 0x63, 0x55, 0xde, 0xe1, 0x62, 0xd2, 0x1d, 0xed, 0x81, 0xef, 0x14, 0xc0, 0x3f, 0x60, 0xe2, 0x7e, 0xe9, 0x98, 0x7f, + 0xae, 0xcd, 0xcc, 0x9b, 0x4f, 0xfe, 0xd5, 0x1d, 0xdf, 0xb1, 0xcd, 0x8c, 0xed, 0x67, 0xd5, 0x78, 0x30, 0x34, 0x28, 0x7c, 0xdc, 0x6c, 0xb1, 0x2a, 0x5f, 0xec, 0x38, 0x70, 0x42, 0x56, 0x76, 0xa0, + 0x1a, 0x89, 0x37, 0x9d, 0x12, 0xe0, 0x5e, 0xaa, 0x84, 0xca, 0xdf, 0x0d, 0x86, 0xa0, 0x41, 0x0e, 0xa4, 0x32, 0x8c, 0x61, 0x90, 0x86, 0x65, 0x12, 0x15, 0x81, 0xed, 0x68, 0xbd, 0xc9, 0xdc, 0x9d, + 0x6d, 0xab, 0x21, 0x3c, 0x5f, 0x38, 0x62, 0xcf, 0x59, 0x99, 0x02, 0xcb, 0x7a, 0x11, 0xf0, 0xe3, 0x9c, 0xb9, 0xcf, 0xe7, 0xce, 0xdf, 0xb7, 0x33, 0x87, 0x4f, 0x78, 0x5f, 0x3e, 0xc0, 0x06, 0xfa, + 0x1f, 0xef, 0xf4, 0x4f, 0x70, 0xbf, 0x47, 0x15, 0x30, 0x19, 0xed, 0x7d, 0x20, 0x9d, 0x6d, 0xb1, 0xfd, 0x70, 0x47, 0x58, 0xc5, 0xb8, 0x47, 0x42, 0x71, 0xe2, 0x7b, 0xec, 0x02, 0x5a, 0x5a, 0x0c, + 0xb8, 0xe6, 0xc6, 0x49, 0x7b, 0x00, 0xec, 0x4c, 0xf7, 0x0d, 0x58, 0x74, 0x82, 0xa8, 0xe0, 0x20, 0xd0, 0x98, 0xe0, 0x43, 0xa6, 0x4c, 0x19, 0x2b, 0x0c, 0x35, 0xc1, 0x94, 0x0b, 0x38, 0x99, 0x11, + 0x02, 0x89, 0xd6, 0xe0, 0x9a, 0x81, 0x35, 0x71, 0x2f, 0x7d, 0xac, 0x50, 0x7c, 0xb8, 0x05, 0xbd, 0x75, 0x3a, 0xfd, 0xa4, 0xe1, 0x7c, 0x3e, 0xd4, 0xff, 0x63, 0x97, 0xd4, 0xab, 0xdc, 0xd7, 0xdf, + 0x7f, 0x23, 0x3e, 0x16, 0x87, 0x5d, 0x82, 0xfe, 0xbf, 0x3f, 0x1f, 0x5b, 0xf2, 0x7a, 0xea, 0xfd, 0xef, 0xb3, 0x97, 0x01, 0xfe, 0x20, 0xd0, 0xfc, 0xa2, 0xdf, 0x68, 0xd1, 0x83, 0xee, 0x2d, 0x47, + 0xf2, 0xf6, 0x93, 0xe2, 0x94, 0x3e, 0x73, 0xd1, 0xde, 0x90, 0x2b, 0x4b, 0xe6, 0xa8, 0xbd, 0xd5, 0x56, 0x1e, 0x26, 0x9a, 0xd9, 0x3f, 0xaa, 0x5b, 0x96, 0x71, 0xa5, 0x59, 0x7f, 0xd0, 0x03, 0xd3, + 0x3c, 0x89, 0xfa, 0x46, 0xe8, 0xbd, 0x16, 0xf8, 0xfe, 0x0d, 0xfa, 0xd4, 0x8c, 0x26, 0x3b, 0x7f, 0x02, 0x7b, 0x81, 0xee, 0xea, 0x5e, 0x9f, 0x5c, 0x21, 0x9f, 0xf9, 0xed, 0xe4, 0x12, 0x31, 0x42, + 0xaf, 0x5b, 0xae, 0xfc, 0xeb, 0x71, 0xc7, 0xa7, 0x3e, 0x6f, 0x55, 0xee, 0xf5, 0xdf, 0x52, 0x56, 0xbf, 0x70, 0x9f, 0xfe, 0x5c, 0x3c, 0x3e, 0xfc, 0xca, 0x89, 0x87, 0x1f, 0x3c, 0xeb, 0xd2, 0xc5, + 0xf8, 0xc8, 0xcd, 0x5b, 0xce, 0xe1, 0xb6, 0xce, 0xc0, 0x92, 0x0f, 0xf5, 0x5a, 0x9d, 0xee, 0xb7, 0xc4, 0xa4, 0xb6, 0x75, 0x8d, 0xc1, 0x47, 0x3b, 0xd1, 0x85, 0x8d, 0x79, 0x0f, 0xf1, 0x07, 0x36, + 0x3f, 0x6d, 0x65, 0x7e, 0x7c, 0xd8, 0x92, 0x33, 0xc4, 0xdc, 0x20, 0x1a, 0xbe, 0x6d, 0x89, 0x06, 0xb6, 0x81, 0x6a, 0x05, 0x5a, 0x08, 0x89, 0x6d, 0xa3, 0xc4, 0xa4, 0x90, 0x44, 0x1c, 0xa0, 0xbe, + 0xb4, 0x1a, 0x32, 0x1b, 0x89, 0x65, 0x9d, 0x2f, 0x53, 0x79, 0x3e, 0x1f, 0x12, 0x7d, 0x5f, 0xfc, 0x3d, 0x13, 0xd1, 0xf8, 0x00, 0xfb, 0x1d, 0x43, 0x6f, 0xe1, 0x6f, 0xa4, 0x5b, 0x34, 0xc3, 0x46, + 0xb2, 0xd5, 0x30, 0x59, 0x35, 0x43, 0x1f, 0x1e, 0xb9, 0xa4, 0x05, 0x30, 0xc3, 0xcd, 0x78, 0x08, 0xed, 0xe7, 0x11, 0x47, 0x8e, 0xc7, 0x32, 0xe0, 0x50, 0xcb, 0x98, 0x5b, 0x8c, 0x94, 0xe9, 0xc0, + 0x2d, 0xf6, 0x4b, 0x9c, 0x9c, 0x73, 0x3e, 0x38, 0x64, 0x8c, 0x01, 0xa3, 0x2c, 0xda, 0xa1, 0x31, 0x65, 0x7b, 0xbd, 0x43, 0x98, 0x52, 0x63, 0xd6, 0xa1, 0x34, 0xaf, 0xdc, 0x14, 0x20, 0x32, 0x92, + 0xd6, 0x04, 0xfa, 0xf5, 0x91, 0x6b, 0x5f, 0x9e, 0x8b, 0xfd, 0x68, 0xb7, 0x7d, 0x46, 0x10, 0x3e, 0xfa, 0xcc, 0x05, 0x5b, 0x77, 0x1f, 0x9e, 0xf6, 0xe2, 0x0e, 0xe2, 0x31, 0x74, 0x4d, 0x60, 0x3f, + 0xe9, 0xcd, 0x83, 0x21, 0xc1, 0xa8, 0x89, 0x34, 0x2e, 0xc3, 0x4d, 0xae, 0x31, 0xa5, 0xed, 0x0e, 0x76, 0x8a, 0xe7, 0xb3, 0xbe, 0x16, 0xee, 0x8c, 0x00, 0x2f, 0x34, 0xb9, 0xac, 0xb4, 0x58, 0xa4, + 0x9a, 0x39, 0x7f, 0x88, 0x19, 0x57, 0xdc, 0xd1, 0xd4, 0x2c, 0x63, 0x0e, 0x14, 0x1e, 0x15, 0x6b, 0x82, 0x02, 0xab, 0x71, 0x94, 0x85, 0xc1, 0xde, 0x1f, 0x6f, 0x88, 0x43, 0xbd, 0x67, 0xbe, 0xce, + 0x0d, 0xbb, 0xfe, 0xd1, 0xdf, 0x61, 0x0c, 0x7f, 0x81, 0x7e, 0xbe, 0xa9, 0xde, 0xf9, 0xc0, 0x07, 0x5c, 0xbd, 0x23, 0xe9, 0xf8, 0x81, 0xef, 0xb1, 0x84, 0xba, 0xfe, 0x5e, 0xa5, 0x84, 0xc8, 0xf1, + 0x01, 0x55, 0xe6, 0x76, 0x2e, 0xbd, 0x4d, 0xea, 0xa9, 0x60, 0x78, 0x34, 0x30, 0x88, 0xb6, 0xe5, 0x88, 0x5d, 0xad, 0x0e, 0x8b, 0x1e, 0xbc, 0x21, 0xa9, 0x49, 0x15, 0xe3, 0xd4, 0x5a, 0x0a, 0xe0, + 0x64, 0xc9, 0x96, 0x7a, 0x35, 0x54, 0xd5, 0x14, 0x0b, 0x32, 0xbf, 0x67, 0xa9, 0x40, 0x85, 0xb7, 0x3d, 0xd3, 0x21, 0x1d, 0x1e, 0x47, 0x0d, 0x7b, 0xba, 0x8e, 0xc9, 0x8e, 0x9b, 0xc8, 0x6b, 0x91, + 0xe0, 0x51, 0x4c, 0x7e, 0xda, 0x03, 0xde, 0x03, 0xdb, 0x97, 0x23, 0xd4, 0xaf, 0x1e, 0xe7, 0xb6, 0x69, 0xdc, 0x17, 0xcd, 0xaf, 0x79, 0x71, 0x85, 0x17, 0x79, 0xa1, 0x76, 0x99, 0xea, 0xdf, 0xd0, + 0xe7, 0x4c, 0x60, 0x08, 0xec, 0x18, 0x87, 0x3f, 0x11, 0x20, 0xb7, 0xcc, 0xc7, 0x7e, 0xb3, 0xe7, 0x74, 0xa8, 0x2b, 0xb8, 0x17, 0x32, 0x9f, 0x47, 0x5d, 0xb5, 0x29, 0x65, 0xd1, 0x1b, 0x2b, 0xf6, + 0x78, 0xb3, 0xde, 0xf0, 0xb2, 0xba, 0x94, 0x05, 0xcb, 0x8b, 0x99, 0x05, 0xe7, 0x34, 0x25, 0x0f, 0xed, 0x05, 0x16, 0x18, 0x03, 0xf2, 0x78, 0x4e, 0x7b, 0x03, 0x8c, 0x2e, 0x14, 0xd8, 0xdc, 0xef, + 0x6b, 0x16, 0x04, 0x03, 0x76, 0xc6, 0xcc, 0x12, 0x16, 0x4f, 0xf9, 0x4d, 0x36, 0x4d, 0x78, 0x6b, 0x4f, 0x88, 0xbc, 0x0a, 0x8b, 0xa2, 0xcd, 0x70, 0x8c, 0x3c, 0x67, 0x76, 0x54, 0xf1, 0x93, 0x68, + 0x7c, 0x97, 0xbc, 0xe2, 0xd3, 0xbc, 0x0a, 0xcd, 0xee, 0x26, 0x67, 0x9e, 0xdc, 0xb6, 0x6e, 0xe1, 0x5f, 0xb0, 0x79, 0x7b, 0xb7, 0xab, 0x96, 0xbf, 0xed, 0x71, 0x33, 0x03, 0x36, 0x23, 0x76, 0x1e, + 0x0a, 0x69, 0x48, 0x01, 0x0c, 0xca, 0x0d, 0xc3, 0xe1, 0xdc, 0x18, 0x31, 0x23, 0x5b, 0x28, 0x05, 0x8c, 0x54, 0x08, 0xb4, 0xda, 0xcc, 0x77, 0x2b, 0x8c, 0xae, 0x8d, 0x76, 0x38, 0x37, 0x1c, 0x04, + 0x51, 0xe0, 0x16, 0x62, 0x37, 0x7a, 0x28, 0x61, 0x07, 0x53, 0x19, 0xa0, 0xc2, 0x4e, 0xd9, 0x30, 0x74, 0xdd, 0x03, 0xb7, 0x69, 0x46, 0xb0, 0x09, 0xd6, 0x06, 0x5f, 0x17, 0x16, 0xbe, 0x6b, 0x3e, + 0xf7, 0xb9, 0x0b, 0x7e, 0x26, 0x5f, 0xfd, 0x15, 0xe8, 0x2b, 0x32, 0x8e, 0x08, 0x38, 0x03, 0xfa, 0x1e, 0x03, 0xea, 0x1c, 0xdc, 0x60, 0x15, 0x82, 0x9b, 0xd8, 0xa0, 0x1c, 0x29, 0x44, 0xc8, 0xef, + 0x37, 0xfc, 0xa4, 0x9c, 0xd4, 0x31, 0x6d, 0xcd, 0x8c, 0x29, 0x01, 0xae, 0xc8, 0x85, 0x68, 0x8e, 0xdd, 0x6c, 0x1c, 0xa1, 0x1e, 0x7a, 0xe8, 0x79, 0x05, 0x80, 0x10, 0x4b, 0x19, 0x42, 0x9d, 0x76, + 0x56, 0xad, 0x77, 0x6e, 0x6a, 0xc5, 0xd2, 0xbc, 0x97, 0x4a, 0xb3, 0x76, 0x61, 0x54, 0x03, 0x2e, 0x86, 0x92, 0xaa, 0xe5, 0x91, 0x8e, 0x52, 0xe3, 0x3f, 0x2e, 0x3f, 0x5b, 0xf3, 0xeb, 0x93, 0x9a, + 0xe1, 0x85, 0x57, 0x4e, 0xc1, 0x1b, 0x69, 0xf0, 0xe6, 0x65, 0x0e, 0x13, 0xc7, 0x79, 0x58, 0x9a, 0x70, 0x39, 0x1f, 0xeb, 0xdc, 0xc3, 0x07, 0xfe, 0xa8, 0x70, 0x7e, 0x16, 0xe8, 0xe7, 0x13, 0x0d, + 0x3f, 0xbd, 0x78, 0x44, 0xa0, 0x95, 0xe7, 0xaf, 0xfd, 0x80, 0xc0, 0x8f, 0x27, 0xf6, 0x5d, 0x5e, 0xd9, 0x6b, 0x79, 0x7c, 0xf9, 0x2d, 0xe0, 0x47, 0xf9, 0x65, 0x7b, 0xb1, 0xd9, 0x8f, 0x8e, 0x2f, + 0x5d, 0x24, 0xd7, 0x47, 0x15, 0x38, 0xd4, 0xca, 0xa2, 0x7c, 0x9f, 0x2f, 0x74, 0xf3, 0x33, 0x42, 0xcf, 0x71, 0xcb, 0xe3, 0xdf, 0xbf, 0xf7, 0xaa, 0x3c, 0x8b, 0xcf, 0x5b, 0xfd, 0xd5, 0x8b, 0x93, + 0x8b, 0xe0, 0xfd, 0x7c, 0xac, 0xe0, 0xa1, 0xe9, 0x6b, 0xa6, 0xf9, 0x7e, 0x36, 0x20, 0xfe, 0x40, 0xf2, 0x7e, 0x70, 0x39, 0x14, 0x96, 0x51, 0xe5, 0xd6, 0x19, 0x59, 0x97, 0x33, 0x6b, 0xef, 0x1d, + 0x11, 0x6f, 0x45, 0xb5, 0x75, 0xe9, 0x98, 0x84, 0xdc, 0x22, 0xb1, 0xf4, 0xe2, 0xa6, 0x1f, 0xe6, 0xd5, 0xeb, 0xd3, 0xee, 0xb2, 0xf7, 0x1a, 0xf3, 0xf7, 0x0d, 0xb5, 0x67, 0xba, 0x7f, 0xdd, 0x40, + 0xbe, 0x5a, 0x24, 0xa7, 0x71, 0x1f, 0xec, 0xd6, 0x05, 0x2c, 0x19, 0xdb, 0xa9, 0x51, 0x50, 0xb1, 0xe9, 0xc4, 0xd4, 0xc6, 0xf1, 0x58, 0x5c, 0xdf, 0x4f, 0xb8, 0x51, 0x15, 0xc3, 0xe6, 0xb2, 0x87, + 0xba, 0x04, 0x5a, 0x93, 0x61, 0xb0, 0x2d, 0xb6, 0x71, 0x0b, 0x2c, 0x65, 0x6e, 0xb8, 0xb6, 0x6c, 0x7b, 0x20, 0x4f, 0x92, 0x49, 0x08, 0xa3, 0xd0, 0x41, 0xf2, 0xe6, 0x16, 0xb3, 0xdd, 0x01, 0xb5, + 0x3c, 0x6c, 0x03, 0x6a, 0xb3, 0xcb, 0x14, 0xf9, 0xe0, 0x2f, 0xf7, 0x8c, 0xf1, 0xbd, 0xfa, 0x76, 0xcb, 0x68, 0xf7, 0x71, 0xf2, 0x4c, 0x8f, 0xc8, 0x0f, 0xb0, 0xaf, 0xb0, 0xf2, 0x7a, 0xa7, 0x0f, + 0x76, 0xeb, 0x16, 0x59, 0x40, 0xf4, 0xca, 0xa9, 0xc8, 0x3d, 0x30, 0xcc, 0x4a, 0x03, 0x4a, 0x81, 0xad, 0xa4, 0xa0, 0x56, 0x36, 0xdc, 0xf2, 0x6b, 0x76, 0x34, 0x0e, 0xfc, 0x1e, 0x23, 0x19, 0x4b, + 0x96, 0x83, 0xbc, 0x18, 0xe5, 0x37, 0x03, 0x6d, 0xa2, 0xad, 0xc6, 0x43, 0x75, 0xcc, 0x96, 0xa0, 0x39, 0xc3, 0xd3, 0x7c, 0xa0, 0xb3, 0x36, 0x1a, 0x0a, 0x29, 0x53, 0x8f, 0x4a, 0x01, 0x6e, 0xf6, + 0xa9, 0xb4, 0x70, 0x0a, 0xdc, 0xcd, 0xbe, 0xd7, 0xce, 0xb2, 0xc7, 0xfe, 0xe3, 0x67, 0x32, 0x29, 0x4e, 0x20, 0x5f, 0x91, 0x90, 0xf5, 0xcf, 0x40, 0xbe, 0x9f, 0xbb, 0x92, 0x06, 0xa9, 0x1c, 0x73, + 0x44, 0x62, 0x82, 0x09, 0xe4, 0x46, 0x96, 0x68, 0xe0, 0xb2, 0x5c, 0x00, 0x16, 0x09, 0xd4, 0xac, 0xb0, 0x9d, 0x29, 0x3e, 0x67, 0x04, 0xf0, 0x8a, 0x63, 0xdb, 0x91, 0x8d, 0x43, 0x9b, 0x08, 0x1a, + 0x8d, 0x56, 0x08, 0xad, 0x57, 0x2a, 0x89, 0x38, 0xf0, 0x8c, 0x6d, 0x7a, 0xa9, 0xd3, 0xa3, 0xd7, 0x14, 0x58, 0x67, 0x2c, 0x3e, 0xe4, 0x1a, 0xd5, 0x23, 0x61, 0x0b, 0x5e, 0x74, 0xec, 0xce, 0x92, + 0x5b, 0x55, 0x71, 0x91, 0x62, 0xd0, 0x4b, 0xb7, 0x34, 0xa3, 0x9b, 0x5e, 0xbb, 0xf7, 0xb0, 0x87, 0x3f, 0x67, 0x4e, 0xbe, 0x81, 0x3d, 0x62, 0xf0, 0x6d, 0x70, 0x8a, 0x48, 0x77, 0x58, 0x59, 0xd9, + 0x32, 0x19, 0x4e, 0x7a, 0x26, 0x2f, 0x47, 0x63, 0x78, 0x6e, 0xe8, 0x28, 0xa9, 0x6f, 0xea, 0x98, 0x9b, 0x1d, 0x24, 0xc1, 0x1f, 0x47, 0xbd, 0xf5, 0x3a, 0xb5, 0x50, 0x87, 0xaa, 0xa6, 0x79, 0x1b, + 0xcc, 0xf1, 0x88, 0xde, 0x84, 0x80, 0xe9, 0x2b, 0x62, 0x05, 0x2f, 0xcd, 0x15, 0x2c, 0x68, 0x08, 0x08, 0x2f, 0xd0, 0x24, 0x0b, 0x44, 0x67, 0xe8, 0xe5, 0x98, 0xaf, 0xcd, 0xb7, 0x33, 0x58, 0x16, + 0x37, 0xe9, 0x77, 0xbe, 0xb6, 0xc7, 0x88, 0x2d, 0x93, 0xd7, 0x00, 0xc2, 0x7b, 0x53, 0xe2, 0xc1, 0x53, 0x6a, 0x67, 0x17, 0x7f, 0xdd, 0xed, 0x36, 0x71, 0x8f, 0x24, 0xe8, 0x53, 0x05, 0xf2, 0x57, + 0x70, 0x4f, 0x34, 0x79, 0x1b, 0xf5, 0xd1, 0x6e, 0xa5, 0xf2, 0x6e, 0x1a, 0x97, 0x4c, 0xcd, 0x81, 0xde, 0x92, 0x49, 0x91, 0x34, 0xdb, 0xae, 0xd7, 0x32, 0xdd, 0x7a, 0x89, 0x96, 0xa3, 0x65, 0x4a, + 0x58, 0x15, 0x49, 0x11, 0x54, 0x20, 0x4c, 0x91, 0x8d, 0x56, 0x2d, 0x73, 0x4f, 0x9d, 0x3b, 0xfb, 0xa9, 0x3a, 0x97, 0x16, 0x29, 0xd6, 0xa8, 0x62, 0x6e, 0x1a, 0xe5, 0x8c, 0x58, 0x8f, 0x29, 0x11, + 0x6f, 0x5d, 0x55, 0x5c, 0xc3, 0x9b, 0x5e, 0xb3, 0xd4, 0x48, 0x7d, 0x91, 0x74, 0x64, 0xed, 0x87, 0x2e, 0x88, 0xf7, 0xcd, 0xf2, 0xd3, 0xde, 0x7e, 0x63, 0xfd, 0x9f, 0x8f, 0xc5, 0xb9, 0x89, 0x73, + 0x9e, 0x14, 0xc4, 0x13, 0x5d, 0xe1, 0xaf, 0xf6, 0xb3, 0xfe, 0xa5, 0x00, 0xf5, 0xb2, 0xef, 0xff, 0x94, 0xe8, 0x50, 0xa7, 0xad, 0xee, 0x6d, 0xef, 0x7f, 0xe8, 0xd3, 0x79, 0xc2, 0xc6, 0x38, 0x03, + 0x3d, 0x92, 0xfb, 0x7c, 0x75, 0x76, 0xd8, 0x74, 0x30, 0x2e, 0xd0, 0x56, 0x38, 0x50, 0x8d, 0x3b, 0x6e, 0xbc, 0x05, 0xbc, 0x67, 0x47, 0xa5, 0x38, 0x67, 0x31, 0xc7, 0x20, 0x60, 0x80, 0xf6, 0x33, + 0xd5, 0x80, 0x92, 0x98, 0x45, 0xf9, 0x16, 0x08, 0xc1, 0x74, 0x9b, 0x8f, 0xc2, 0x42, 0xb4, 0x15, 0x06, 0x80, 0x55, 0xd6, 0x90, 0x7b, 0x16, 0x92, 0x8c, 0xe0, 0x3d, 0xb5, 0xd7, 0x5b, 0x76, 0xbb, + 0xe0, 0xf6, 0x1a, 0x8c, 0x4c, 0x88, 0xdc, 0xc5, 0x7a, 0xd4, 0x7a, 0x1b, 0x7c, 0x23, 0xc2, 0x93, 0xbc, 0x6f, 0x69, 0x0f, 0x8f, 0x13, 0x04, 0x9f, 0x3a, 0x2a, 0xf3, 0x02, 0xf4, 0x88, 0x82, 0xd7, + 0xcb, 0xd3, 0xee, 0xde, 0xc1, 0x39, 0xe3, 0x67, 0x8a, 0x3d, 0x4f, 0xf1, 0x28, 0x19, 0xd6, 0x6c, 0xb3, 0xb2, 0x89, 0x26, 0xd8, 0xc2, 0x35, 0x3e, 0xea, 0xc1, 0x0b, 0x74, 0xe5, 0x5b, 0x63, 0x8b, + 0x1d, 0xf4, 0xa8, 0x76, 0xb8, 0xcb, 0x35, 0x6f, 0x09, 0x79, 0x4e, 0x4c, 0x40, 0x7b, 0xdf, 0x63, 0xf0, 0x89, 0x3e, 0xac, 0xc5, 0xe5, 0xb6, 0x5e, 0xd9, 0x8b, 0x32, 0x12, 0x35, 0x94, 0x81, 0xd7, + 0xc9, 0x4a, 0xca, 0xf3, 0x9d, 0x57, 0x9b, 0xb2, 0x1a, 0x3d, 0x9f, 0x87, 0x75, 0x2f, 0x2e, 0x84, 0x74, 0x61, 0xac, 0x24, 0xff, 0x02, 0xab, 0xf0, 0x53, 0x87, 0xf8, 0xbe, 0xc2, 0x3c, 0x23, 0xf5, + 0x84, 0x53, 0xf8, 0xfb, 0x63, 0x7a, 0xa1, 0xfe, 0xb8, 0x87, 0x8e, 0x64, 0xd2, 0xab, 0x8a, 0x88, 0x5a, 0x25, 0x18, 0x81, 0x0d, 0x42, 0xdf, 0x1c, 0x49, 0x7a, 0x31, 0x1d, 0x7c, 0x79, 0xc0, 0xfe, + 0xf5, 0x81, 0xe3, 0xf7, 0xe7, 0xf0, 0x4c, 0x17, 0xb6, 0x37, 0xa8, 0xe7, 0x59, 0x9c, 0xaf, 0xfb, 0x70, 0xb7, 0x1e, 0x6c, 0x11, 0x0c, 0x2d, 0x90, 0xed, 0x32, 0xa2, 0x69, 0x79, 0xed, 0x04, 0x18, + 0x39, 0x9c, 0xce, 0x97, 0x34, 0xba, 0xae, 0xb6, 0xcb, 0x89, 0x0d, 0x13, 0x73, 0xd7, 0x1d, 0x66, 0x53, 0xc5, 0x5a, 0x84, 0xd3, 0x0c, 0xdd, 0x50, 0x3b, 0x39, 0x9c, 0x35, 0x70, 0xe9, 0xc2, 0x45, + 0x48, 0x2e, 0x64, 0x62, 0x9a, 0x12, 0x74, 0x1b, 0x26, 0x8a, 0xba, 0xf4, 0x74, 0x75, 0x86, 0x97, 0x03, 0xcb, 0x60, 0xf3, 0x89, 0xe8, 0x6f, 0x3a, 0x06, 0x08, 0x4f, 0x87, 0xab, 0x07, 0xde, 0xe5, + 0x30, 0x30, 0xf4, 0x56, 0x66, 0x7d, 0xee, 0x06, 0x72, 0x16, 0x8f, 0xd8, 0xf5, 0x4b, 0x91, 0x17, 0x9d, 0x8f, 0x59, 0x2e, 0x5e, 0x05, 0x1f, 0xf4, 0x64, 0x22, 0x73, 0xa7, 0xae, 0x0e, 0x47, 0xec, + 0x7a, 0xe6, 0x2b, 0xe3, 0xde, 0x97, 0x6e, 0xcf, 0x94, 0x32, 0xbc, 0x83, 0x7d, 0xa5, 0xe0, 0x79, 0x70, 0x8a, 0xf1, 0x76, 0x90, 0x70, 0x1b, 0xc2, 0x99, 0x47, 0x3d, 0x14, 0x62, 0x01, 0x22, 0x70, + 0xaa, 0x15, 0x0a, 0x24, 0x10, 0x85, 0xac, 0x59, 0x66, 0x1d, 0xb9, 0xca, 0x64, 0x8a, 0xa6, 0xf1, 0xa2, 0x49, 0xe2, 0xba, 0xd2, 0x7a, 0x28, 0x98, 0x67, 0x06, 0x1d, 0x49, 0x68, 0x6f, 0x83, 0x43, + 0x8d, 0xa6, 0x22, 0x24, 0x3a, 0xc0, 0x0f, 0xba, 0xee, 0x8c, 0x8b, 0xb1, 0xed, 0x8b, 0x82, 0x87, 0x0d, 0x2a, 0x60, 0x8b, 0xd5, 0x1c, 0x24, 0x7f, 0x9b, 0xcf, 0xd5, 0x25, 0x7a, 0x1a, 0x24, 0x7d, + 0xdb, 0x3b, 0x05, 0x4f, 0xcb, 0x2a, 0x8e, 0x8d, 0x20, 0x19, 0x27, 0xb9, 0x75, 0x6a, 0xf9, 0xe1, 0x15, 0xc5, 0xe9, 0xd4, 0xc7, 0x4e, 0x28, 0xdf, 0x6b, 0xb9, 0xf9, 0x30, 0x7d, 0xfc, 0x49, 0x03, + 0xe1, 0x02, 0xf5, 0x8c, 0xf0, 0xf3, 0x75, 0x57, 0xa3, 0x40, 0xaf, 0xd6, 0x53, 0xd0, 0x4e, 0xc9, 0x72, 0xcd, 0x88, 0xd2, 0x78, 0x39, 0x12, 0x2d, 0xcc, 0xa5, 0xe0, 0x01, 0x51, 0xd2, 0x95, 0x3e, + 0x49, 0xd6, 0x73, 0x1d, 0x55, 0x17, 0x23, 0x6c, 0x71, 0xe0, 0x37, 0xcc, 0x62, 0x0f, 0x3b, 0x4b, 0x63, 0xcf, 0x24, 0xc3, 0x7d, 0xa3, 0xe9, 0x61, 0xcb, 0xb7, 0xcb, 0xd1, 0xa0, 0x1d, 0x1e, 0x46, + 0xc3, 0x39, 0xc4, 0x2d, 0xfc, 0x00, 0x58, 0x94, 0x18, 0x2f, 0x0d, 0x35, 0x25, 0xf9, 0x51, 0x0b, 0x92, 0x6e, 0x95, 0xf0, 0x76, 0xf1, 0x92, 0x5b, 0x5a, 0x98, 0x7e, 0x55, 0x9d, 0xfa, 0x4c, 0x7e, + 0xfa, 0x15, 0xdc, 0x23, 0xfa, 0xde, 0x47, 0xdd, 0x32, 0xd3, 0x27, 0x2b, 0xb1, 0x9c, 0x89, 0xfc, 0xc6, 0xe7, 0xd2, 0x11, 0x0c, 0x26, 0xb1, 0x4b, 0x14, 0xe4, 0x6a, 0x1d, 0xc9, 0x58, 0x40, 0xfc, + 0x34, 0xfe, 0x59, 0x7c, 0xd9, 0xd0, 0x0e, 0x7e, 0xaa, 0xa1, 0xdd, 0x05, 0xe8, 0x69, 0x6a, 0xaf, 0xad, 0xec, 0xe0, 0x6e, 0xad, 0xec, 0x0e, 0x5e, 0xc6, 0xaf, 0xd6, 0xe8, 0x61, 0x64, 0x31, 0x52, + 0x45, 0x0e, 0xab, 0x6d, 0xd4, 0xb3, 0x27, 0x6b, 0x83, 0x5d, 0x3a, 0x1c, 0xc9, 0x7b, 0x4b, 0x52, 0xe8, 0x59, 0x3b, 0xaf, 0x91, 0x70, 0xbf, 0x70, 0x36, 0xe3, 0x0c, 0xd2, 0x83, 0x4d, 0xe3, 0x94, + 0x20, 0x98, 0x8c, 0xc4, 0x64, 0x4f, 0xe2, 0xb4, 0x59, 0xa6, 0x4b, 0x46, 0xd3, 0x04, 0x87, 0x2b, 0x09, 0x08, 0x16, 0x86, 0x9a, 0xde, 0xa3, 0xa8, 0x6f, 0x0b, 0x98, 0x5d, 0xad, 0x60, 0xe3, 0xa2, + 0xd4, 0xc2, 0x50, 0x3c, 0x65, 0xda, 0x7d, 0x7c, 0xfe, 0xa8, 0x69, 0x53, 0x52, 0xdc, 0x9c, 0x6b, 0xfb, 0xdb, 0xd4, 0xf2, 0xbd, 0x17, 0x5f, 0xd8, 0xea, 0xbf, 0x77, 0xe3, 0xc5, 0xbf, 0x11, 0x2f, + 0x10, 0xf6, 0x02, 0xfe, 0xfa, 0x1f, 0xff, 0xe3, 0xd7, 0xdf, 0xa0, 0x53, 0x29, 0xdb, 0xf1, 0xf2, 0xbf, 0xfd, 0x3b, 0x04, 0x75, 0xf5, 0x8b, 0x7c, 0x48, 0x38, 0x7c, 0x60, 0xf5, 0x3e, 0xb3, 0x2b, + 0x5e, 0x43, 0x3e, 0x12, 0xf3, 0x7a, 0xdc, 0xb9, 0xaa, 0x93, 0x4d, 0xea, 0x51, 0xcb, 0xef, 0xd0, 0x61, 0x31, 0x21, 0x94, 0x70, 0x40, 0xd8, 0xe2, 0x78, 0x3b, 0x1b, 0x14, 0xb5, 0x38, 0xaf, 0x34, + 0x4f, 0x17, 0x0e, 0xbb, 0xd5, 0x6c, 0x32, 0x8f, 0xc8, 0xa5, 0x2e, 0x55, 0xe3, 0x1c, 0xe4, 0x6d, 0x88, 0xf3, 0x84, 0x24, 0x9d, 0xf2, 0xc3, 0x85, 0x37, 0xf1, 0x3d, 0x85, 0x1c, 0xeb, 0xb6, 0xa6, + 0xc1, 0x13, 0x17, 0xd3, 0x73, 0x6b, 0x85, 0x8d, 0x16, 0x1b, 0x89, 0x05, 0xbf, 0xf6, 0xa1, 0x7e, 0xcc, 0xaf, 0xfc, 0x73, 0x18, 0xb9, 0x81, 0xfc, 0x7a, 0x78, 0xc6, 0xdb, 0xb8, 0x2b, 0x46, 0x82, + 0xad, 0x9a, 0xc7, 0x1b, 0x1e, 0x85, 0x57, 0x63, 0x8f, 0x1e, 0xc1, 0xac, 0x03, 0xe9, 0x53, 0xa2, 0xf5, 0x13, 0x96, 0x5f, 0x3a, 0x87, 0xed, 0x5e, 0x19, 0xd3, 0xd6, 0xc2, 0xdc, 0x2b, 0x98, 0x54, + 0x03, 0xc6, 0x52, 0xb4, 0xa6, 0xa9, 0x91, 0xec, 0xd0, 0x74, 0xc7, 0xd8, 0x9c, 0x7c, 0x58, 0x70, 0x9b, 0x64, 0x94, 0xc7, 0x39, 0x9d, 0xc3, 0xd6, 0xb0, 0xc8, 0xe3, 0xd1, 0xe1, 0x30, 0x65, 0x73, + 0x4d, 0x1c, 0x76, 0xf4, 0xa9, 0x76, 0xc8, 0x4e, 0xfd, 0x51, 0x3a, 0xe9, 0x1d, 0xab, 0xb7, 0xcb, 0xb6, 0xf6, 0x97, 0x92, 0x82, 0xbe, 0x3d, 0x15, 0x05, 0x7d, 0x2a, 0x4a, 0xf9, 0xe8, 0x54, 0x14, + 0xb4, 0x5b, 0x14, 0x72, 0xca, 0x6b, 0x25, 0x4a, 0xcf, 0x06, 0x10, 0x06, 0x05, 0x6c, 0x03, 0x33, 0x56, 0x3d, 0x0f, 0x73, 0x34, 0xac, 0x16, 0x3e, 0xe9, 0xd4, 0x91, 0x8f, 0x42, 0x08, 0xa7, 0xad, + 0x46, 0xb8, 0x5f, 0xa2, 0x1b, 0x82, 0x44, 0xd7, 0x54, 0x61, 0xa7, 0x4c, 0x80, 0x6f, 0x57, 0xc3, 0xe9, 0x26, 0xb3, 0x95, 0xa6, 0x39, 0x10, 0x4b, 0x11, 0x98, 0x63, 0x18, 0x97, 0x1c, 0x7a, 0xf9, + 0x6c, 0xbd, 0x08, 0xc2, 0x39, 0x87, 0x3f, 0x6f, 0x21, 0xfc, 0xc5, 0x53, 0x51, 0xba, 0x6c, 0x8e, 0x0f, 0x73, 0x94, 0xff, 0xdc, 0x3e, 0x79, 0xff, 0x13, 0x17, 0xfa, 0x7c, 0x7a, 0xd0, 0x65, 0xf7, + 0x3c, 0xd2, 0x0a, 0xa6, 0x23, 0x93, 0x81, 0x94, 0x9a, 0x5d, 0x79, 0x6a, 0x1a, 0x96, 0xe3, 0x85, 0x13, 0x54, 0x9e, 0x1c, 0x37, 0x55, 0xd0, 0x1e, 0x78, 0x60, 0x8d, 0x2d, 0xa8, 0xd9, 0x0e, 0x81, + 0x38, 0x0b, 0x21, 0xa7, 0xd0, 0x22, 0x1b, 0xe8, 0xa0, 0x08, 0x0b, 0xee, 0x6e, 0x30, 0x94, 0x39, 0x6f, 0x58, 0xab, 0xa9, 0x40, 0xad, 0x36, 0x66, 0x16, 0xf7, 0x20, 0xd6, 0xd0, 0x46, 0xfb, 0xb8, + 0x95, 0xa4, 0x41, 0x3d, 0xf6, 0x3b, 0x3a, 0x2f, 0xbe, 0xc9, 0xe9, 0x7c, 0x94, 0x1b, 0xfe, 0x53, 0x02, 0xfe, 0x93, 0x12, 0xf6, 0x5e, 0x5b, 0xd9, 0xdf, 0xf7, 0x1d, 0x42, 0x57, 0x21, 0x86, 0xce, + 0x1c, 0x10, 0x26, 0xfa, 0x91, 0xde, 0x61, 0xa2, 0xf7, 0x4f, 0x10, 0xbe, 0xa7, 0xee, 0xb2, 0xa6, 0x86, 0xf4, 0xa2, 0x15, 0xe6, 0xba, 0xe5, 0xd0, 0x8b, 0x58, 0x11, 0x06, 0xb2, 0x6c, 0xcf, 0x58, + 0x2f, 0x97, 0x1c, 0xb4, 0xb7, 0xdb, 0xf3, 0xdb, 0xa9, 0xb6, 0xb2, 0x57, 0x92, 0x02, 0xce, 0xac, 0xf8, 0xb0, 0xa8, 0x6b, 0x96, 0x13, 0x10, 0x19, 0x01, 0xca, 0xd1, 0x4a, 0x14, 0xd8, 0x0a, 0x08, + 0x99, 0xc3, 0x4e, 0x11, 0xd5, 0x28, 0xdd, 0x85, 0x32, 0x63, 0x65, 0x23, 0xd6, 0xe4, 0x5a, 0x72, 0xfe, 0x9d, 0x32, 0xff, 0x85, 0xc8, 0xbd, 0xd1, 0x21, 0xef, 0x04, 0xaf, 0xbc, 0xd8, 0x3e, 0x85, + 0x73, 0x7e, 0xff, 0xdb, 0xbd, 0x4c, 0x6f, 0x2f, 0x76, 0xad, 0xdc, 0x3b, 0xa7, 0x58, 0xdd, 0x76, 0xea, 0xba, 0x53, 0x8b, 0x75, 0xf5, 0xf8, 0xaa, 0x26, 0xe4, 0x63, 0xe8, 0xe7, 0xa8, 0x67, 0x7a, + 0xa7, 0xfc, 0xeb, 0x24, 0xac, 0x4a, 0xeb, 0xea, 0x57, 0xfd, 0x8c, 0xcb, 0xfe, 0x8f, 0x3f, 0xc7, 0x60, 0x5e, 0xa1, 0x69, 0x46, 0x17, 0x63, 0xe6, 0xf6, 0xcc, 0x85, 0x7b, 0x7c, 0x36, 0x78, 0xaa, + 0x4a, 0xef, 0x0a, 0xee, 0x85, 0xdd, 0xce, 0xa3, 0xfe, 0xa0, 0x5b, 0xa5, 0xde, 0x68, 0xc9, 0x3a, 0xe2, 0x6a, 0x6c, 0xa5, 0xde, 0x4c, 0xd9, 0x0b, 0xc8, 0x68, 0x1d, 0x4f, 0x0f, 0xbd, 0xc1, 0x26, + 0x96, 0x2a, 0x98, 0x21, 0x15, 0xb3, 0xd5, 0xa7, 0x02, 0x3a, 0xb0, 0xe6, 0x7b, 0xa8, 0xce, 0x91, 0x96, 0x44, 0x6a, 0x75, 0x6e, 0x35, 0x96, 0x09, 0x15, 0xe3, 0xa1, 0x1b, 0xeb, 0xc6, 0xd2, 0x18, + 0x02, 0x62, 0xce, 0x37, 0xfc, 0x60, 0x2d, 0xac, 0xf2, 0x60, 0xda, 0xa2, 0x9a, 0x38, 0x54, 0x3f, 0x3a, 0x44, 0x7f, 0xc0, 0x75, 0x57, 0xc7, 0x4a, 0x3c, 0x9b, 0x15, 0xd1, 0x69, 0x0f, 0x08, 0x13, + 0x5d, 0x0b, 0xfb, 0xa6, 0xf7, 0xb0, 0x81, 0xeb, 0x73, 0x29, 0x43, 0x57, 0x70, 0x5f, 0xc9, 0xf1, 0x3a, 0xea, 0x9a, 0x14, 0xc4, 0x4f, 0xb1, 0xc0, 0x5c, 0xca, 0x2e, 0x70, 0x20, 0xe3, 0x26, 0x19, + 0x1a, 0xb3, 0x89, 0xc5, 0x72, 0xc1, 0x9c, 0x36, 0xa0, 0x51, 0x33, 0xc9, 0x50, 0x78, 0x25, 0xc9, 0xe8, 0xce, 0xdb, 0x0d, 0x20, 0x0f, 0x5e, 0xd0, 0xe6, 0x61, 0x7e, 0x98, 0x6f, 0x77, 0xac, 0x4f, + 0xfb, 0x51, 0xc6, 0x59, 0x62, 0xc5, 0xad, 0xf1, 0x74, 0xa4, 0xfa, 0x52, 0x26, 0x6f, 0x12, 0x09, 0xd6, 0x61, 0xb7, 0x3a, 0x6c, 0xe6, 0x8e, 0xf2, 0xbc, 0x10, 0xf0, 0x62, 0xef, 0xf7, 0x6b, 0xaf, + 0x4a, 0xfc, 0xc7, 0x94, 0xf8, 0xe7, 0x1d, 0x51, 0xe6, 0x24, 0x8f, 0x56, 0xd9, 0xf0, 0xa9, 0x26, 0x1e, 0x4e, 0x72, 0x5a, 0x5d, 0x49, 0xd9, 0x1f, 0x76, 0x6b, 0xda, 0xb1, 0xc6, 0xad, 0x6d, 0x5a, + 0xee, 0xaa, 0xa9, 0x72, 0xd8, 0x7b, 0x7e, 0x01, 0x5a, 0x9b, 0x5e, 0x8d, 0x24, 0x58, 0x6f, 0xc7, 0x40, 0x6c, 0xb6, 0xe1, 0x08, 0x73, 0xb6, 0xa4, 0x2d, 0x63, 0x65, 0x4b, 0x51, 0x10, 0x1b, 0xfb, + 0xe1, 0x68, 0x83, 0x9a, 0xc6, 0x1e, 0xa0, 0xdc, 0x83, 0x47, 0xf0, 0x66, 0x98, 0x09, 0xa5, 0x7b, 0x38, 0xa4, 0x6a, 0xe3, 0xb5, 0x7c, 0xdb, 0x38, 0xc4, 0x5a, 0x8a, 0xe8, 0x62, 0xda, 0x7b, 0x9e, + 0x8c, 0xff, 0x71, 0x8d, 0x3f, 0xe0, 0xb5, 0x6d, 0x0b, 0xf8, 0x02, 0x7d, 0xf0, 0xbb, 0xfd, 0x47, 0xd1, 0x46, 0x5a, 0x6e, 0xb4, 0x5a, 0x00, 0x1c, 0x91, 0xd1, 0x2f, 0xbd, 0xe8, 0x2d, 0x73, 0xe1, + 0x63, 0x12, 0xed, 0x9d, 0x53, 0x27, 0x2f, 0x07, 0xf3, 0x5e, 0xbd, 0x76, 0xbf, 0x41, 0xd2, 0x51, 0xec, 0x7f, 0x10, 0xee, 0xd7, 0x25, 0xb3, 0xa7, 0x9f, 0x76, 0xbb, 0x2b, 0x7c, 0x38, 0x86, 0xf1, + 0x53, 0xd6, 0xc1, 0x9d, 0x23, 0x14, 0x3f, 0xc5, 0x53, 0x1e, 0xb4, 0x2a, 0xba, 0x79, 0x27, 0xed, 0x1b, 0x5a, 0x6c, 0x58, 0xd7, 0x1e, 0xea, 0x0f, 0x33, 0x3a, 0x85, 0xd1, 0x34, 0xf3, 0x92, 0xf2, + 0x77, 0xed, 0x9e, 0xbc, 0x79, 0xaf, 0xca, 0xc3, 0x73, 0x9a, 0x41, 0x3f, 0xd4, 0x0e, 0xbf, 0x9f, 0xd7, 0x68, 0x89, 0x4e, 0x0e, 0x9f, 0xdb, 0xfe, 0x98, 0xf7, 0x8d, 0x0b, 0xf8, 0xca, 0x7f, 0xda, + 0x99, 0xf1, 0xdf, 0xe1, 0x1e, 0x17, 0xc0, 0xfb, 0xe8, 0xd4, 0x6e, 0x05, 0xfb, 0x7e, 0x21, 0xc4, 0x52, 0x3c, 0x1b, 0xc0, 0x44, 0xaa, 0x67, 0x07, 0x45, 0x8b, 0xdd, 0x94, 0x52, 0x0a, 0x0f, 0x5d, + 0x9b, 0x04, 0x3f, 0xb2, 0x34, 0x72, 0x84, 0xe1, 0xbd, 0xb5, 0x0a, 0x81, 0x63, 0x1e, 0x8a, 0x10, 0x5d, 0x1a, 0x6d, 0x26, 0x34, 0x65, 0x98, 0x83, 0x51, 0x35, 0x42, 0x35, 0x6c, 0x3b, 0x50, 0x82, + 0xa9, 0x0a, 0x79, 0x8b, 0x1d, 0xd3, 0xaa, 0x2d, 0x21, 0x61, 0x12, 0xc9, 0xcd, 0x2d, 0xb2, 0x5a, 0xe4, 0xde, 0x8f, 0x9b, 0x83, 0x9c, 0x6d, 0xc3, 0x47, 0xfa, 0xfd, 0xcf, 0x23, 0x32, 0xae, 0x76, + 0x44, 0xc7, 0xd1, 0xb0, 0x84, 0xba, 0x55, 0x27, 0xdb, 0xb0, 0x59, 0x2f, 0xc1, 0x8d, 0x8c, 0x2d, 0x2d, 0x1f, 0x5f, 0x07, 0xdb, 0xd9, 0x34, 0xb7, 0x5c, 0x5f, 0x6f, 0xf9, 0x91, 0x3f, 0x49, 0x07, + 0xc0, 0x86, 0x13, 0xd2, 0x41, 0x29, 0xa5, 0x5b, 0x76, 0x83, 0xce, 0x18, 0x46, 0xe5, 0x20, 0x80, 0x3c, 0xe8, 0x93, 0x75, 0x69, 0x03, 0x85, 0x37, 0x82, 0xc5, 0xad, 0x64, 0x81, 0x43, 0x43, 0xa3, + 0xa2, 0x4d, 0xa9, 0x28, 0xed, 0x96, 0x66, 0x75, 0x52, 0x44, 0xdb, 0x8e, 0x9a, 0xfb, 0x23, 0xdb, 0xf9, 0xa7, 0x9c, 0xf8, 0xab, 0x6b, 0x4f, 0x88, 0x23, 0x5e, 0x4e, 0x0e, 0xfe, 0xbe, 0x9b, 0x24, + 0xc1, 0x57, 0x98, 0xff, 0xb9, 0x24, 0xfe, 0x00, 0xfb, 0x95, 0x0a, 0x57, 0x77, 0xba, 0xda, 0x52, 0xca, 0x04, 0xdc, 0x08, 0x53, 0x3f, 0x38, 0xe4, 0xf8, 0xa8, 0x69, 0x56, 0xab, 0x45, 0x13, 0xec, + 0x88, 0x96, 0x43, 0x85, 0xba, 0xa4, 0xa9, 0x42, 0x9e, 0x8d, 0x84, 0x6c, 0x5f, 0x81, 0x98, 0x3c, 0x69, 0xa1, 0x50, 0xc7, 0xe8, 0x9a, 0x1d, 0x20, 0x85, 0xe0, 0x0e, 0x18, 0x28, 0xd8, 0x1e, 0x1c, + 0x62, 0xb1, 0x63, 0x07, 0xf3, 0xc2, 0x5e, 0x8f, 0x55, 0xa2, 0xda, 0x0d, 0x17, 0x81, 0x42, 0xa9, 0xa4, 0x0e, 0x44, 0x5f, 0x07, 0x07, 0x8f, 0xbf, 0x54, 0xf7, 0x1c, 0xef, 0xb1, 0xdf, 0xf2, 0xb9, + 0xb4, 0xf7, 0x2b, 0xb8, 0xaf, 0xf8, 0x78, 0x1d, 0x75, 0x4d, 0x6d, 0x9f, 0x8b, 0xa4, 0x08, 0xcf, 0x7d, 0x7d, 0x41, 0x4a, 0x36, 0x06, 0x13, 0xf8, 0x8c, 0xd6, 0xe9, 0xb6, 0x9e, 0x39, 0x76, 0x19, + 0x4c, 0x06, 0xd9, 0x24, 0x88, 0xc6, 0xc9, 0xd0, 0xa5, 0xd6, 0xe9, 0xa8, 0xe5, 0x5c, 0x79, 0x19, 0xce, 0x7a, 0xee, 0x81, 0x30, 0x4d, 0x54, 0x16, 0x0b, 0x10, 0x14, 0x9d, 0x42, 0x5e, 0xec, 0x0d, + 0x14, 0x83, 0xf0, 0xd9, 0x30, 0xf0, 0x06, 0x4a, 0x49, 0x8f, 0x43, 0x1e, 0xb6, 0x6f, 0x6b, 0x97, 0x9f, 0xdd, 0xf7, 0x3b, 0x1b, 0x70, 0xc7, 0x59, 0xdb, 0xa1, 0xf6, 0x28, 0x99, 0x08, 0x7d, 0x9a, + 0xd9, 0x8e, 0x40, 0x5f, 0xb1, 0x7a, 0xbc, 0xec, 0xa3, 0xdd, 0xd8, 0x8b, 0x6e, 0x82, 0x99, 0x04, 0xac, 0x20, 0xce, 0x97, 0xb6, 0x46, 0x99, 0xa6, 0x0e, 0x3b, 0x72, 0x6c, 0x71, 0x09, 0x96, 0xdc, + 0xa6, 0x52, 0x65, 0xdf, 0x75, 0xf8, 0x1c, 0xc2, 0x83, 0x4c, 0xaa, 0x22, 0x3e, 0xc4, 0x46, 0x76, 0x8d, 0xd0, 0xac, 0x18, 0x5a, 0x32, 0x9e, 0xa9, 0x72, 0x9b, 0xec, 0xa8, 0x89, 0x34, 0x62, 0x24, + 0x6a, 0x8c, 0x2e, 0x96, 0xc9, 0x14, 0x50, 0x0f, 0x32, 0x42, 0xd7, 0x21, 0x2f, 0xac, 0x7e, 0x10, 0x29, 0xe8, 0x92, 0xa5, 0x71, 0xeb, 0x19, 0xfb, 0xa3, 0xe2, 0xf1, 0x02, 0xf7, 0x15, 0x75, 0xaf, + 0xa3, 0xae, 0xe2, 0x32, 0x44, 0xe6, 0xe3, 0x6a, 0x82, 0xf1, 0x0e, 0xb5, 0xd8, 0x4b, 0x14, 0x17, 0x98, 0xca, 0x94, 0xf6, 0x5c, 0xc5, 0x2f, 0x07, 0xe9, 0x5a, 0xd0, 0x69, 0x07, 0xc5, 0xf2, 0x32, + 0x8c, 0x62, 0x51, 0x08, 0x65, 0xdd, 0x89, 0x48, 0x62, 0xbe, 0x64, 0x73, 0x6e, 0xa6, 0x2b, 0xca, 0x84, 0x14, 0xf5, 0x58, 0xd0, 0x66, 0xd6, 0x81, 0xe7, 0x4a, 0x4f, 0x58, 0x12, 0x6e, 0x64, 0xad, + 0xfd, 0x75, 0x0b, 0x4b, 0x66, 0xef, 0x87, 0x1d, 0x87, 0xff, 0x19, 0x6e, 0x88, 0xcf, 0x95, 0xb1, 0x7f, 0x56, 0x72, 0x5e, 0xc1, 0x7e, 0x25, 0xcc, 0xd5, 0x9d, 0xae, 0x92, 0x33, 0x98, 0xf8, 0x86, + 0xb8, 0x70, 0xe3, 0x70, 0xba, 0x81, 0x82, 0x26, 0x99, 0x06, 0xf8, 0x72, 0xc7, 0x89, 0xda, 0x9e, 0x19, 0xcc, 0x96, 0x3a, 0x30, 0x6f, 0x65, 0x63, 0xb0, 0x1f, 0x92, 0x20, 0xec, 0x2e, 0xa5, 0x25, + 0x68, 0xda, 0x93, 0xb5, 0xaf, 0x33, 0x2b, 0xae, 0x76, 0x20, 0x13, 0x33, 0x6c, 0x84, 0xd1, 0x2d, 0x39, 0x2a, 0xe5, 0xe1, 0x46, 0xd7, 0x37, 0x48, 0xd6, 0xaa, 0xb0, 0x64, 0xb9, 0x43, 0x7c, 0xdb, + 0xd1, 0x0f, 0x7c, 0xcf, 0x97, 0xfb, 0x54, 0xd0, 0xf7, 0x9f, 0x45, 0xdd, 0x46, 0xcb, 0x1f, 0xb9, 0x1a, 0x9f, 0xb3, 0x38, 0x2f, 0x40, 0x5f, 0xe9, 0x79, 0xbc, 0xec, 0x6a, 0x6b, 0xca, 0x19, 0xb9, + 0xce, 0x3c, 0xd4, 0xaf, 0x70, 0xa9, 0x27, 0x65, 0xd3, 0x85, 0x99, 0x8d, 0x96, 0xa0, 0xa0, 0x89, 0x9b, 0x69, 0x41, 0x4d, 0x67, 0x32, 0xb9, 0xaa, 0x83, 0xa1, 0x25, 0x6f, 0x17, 0xd3, 0xb5, 0x02, + 0x8d, 0x27, 0x53, 0xaa, 0x55, 0xdc, 0xf9, 0x36, 0xe1, 0xf1, 0xd9, 0x8a, 0xb6, 0xa2, 0x38, 0xac, 0x37, 0x46, 0x0d, 0x28, 0x74, 0x64, 0xc0, 0xfb, 0xc5, 0x96, 0x20, 0xc7, 0x30, 0x4a, 0xc7, 0x72, + 0xf1, 0x9d, 0xe9, 0xff, 0x27, 0xc4, 0x96, 0x99, 0xf7, 0x5d, 0xaf, 0x28, 0x13, 0x27, 0xd7, 0xa2, 0xbe, 0xff, 0x58, 0x76, 0x3d, 0x13, 0x1f, 0xfe, 0x08, 0xfc, 0x88, 0xd7, 0x0f, 0xb7, 0x4e, 0xd1, + 0xf9, 0x0e, 0xf8, 0x75, 0x41, 0x45, 0x4a, 0x66, 0x88, 0xb5, 0xcf, 0x0a, 0x4d, 0x45, 0xe2, 0x89, 0x24, 0x69, 0x98, 0x39, 0x5f, 0x52, 0x78, 0x91, 0x1d, 0x7a, 0xb4, 0x63, 0x8e, 0xd1, 0xde, 0xd2, + 0x98, 0x0d, 0x97, 0x15, 0xde, 0xaa, 0x54, 0x28, 0x81, 0xc5, 0x4e, 0x14, 0x18, 0x26, 0x47, 0x8c, 0xc6, 0x8a, 0x57, 0x85, 0x90, 0x65, 0xfa, 0x86, 0x99, 0xc6, 0x40, 0x32, 0x51, 0xb0, 0xd6, 0xb7, + 0x69, 0x6e, 0x37, 0xad, 0xdb, 0xa8, 0xe3, 0x42, 0xd1, 0xb5, 0xc2, 0xc2, 0xd0, 0x33, 0x72, 0xee, 0x55, 0x08, 0x6a, 0x41, 0xf2, 0xfb, 0x3d, 0x5a, 0xf2, 0x53, 0x9c, 0xa7, 0x56, 0x6e, 0x58, 0x71, + 0xe9, 0x85, 0xd6, 0xa5, 0xbf, 0xd5, 0x7d, 0x86, 0x7e, 0x4a, 0x9b, 0xf9, 0xea, 0x4b, 0x9f, 0xa8, 0xf1, 0xe1, 0x79, 0xd7, 0x93, 0xaf, 0x56, 0x64, 0xad, 0x4b, 0x07, 0x21, 0x9c, 0xee, 0x19, 0x1f, + 0xc1, 0xd8, 0xf5, 0x04, 0xc2, 0x76, 0xf3, 0x44, 0xa1, 0x75, 0xb9, 0x1e, 0x28, 0x74, 0xb3, 0x44, 0x88, 0x41, 0xe0, 0x89, 0x20, 0x2b, 0x22, 0x04, 0x02, 0xd9, 0x86, 0x28, 0x2d, 0x76, 0xd2, 0x1a, + 0x27, 0x06, 0x9b, 0x72, 0x32, 0x51, 0x61, 0xcd, 0x55, 0x70, 0x04, 0x69, 0xc1, 0xa0, 0x21, 0x66, 0x35, 0x6a, 0x62, 0x6c, 0xdc, 0x13, 0x8b, 0xde, 0xbe, 0x23, 0x69, 0xee, 0xb0, 0xef, 0x47, 0x3f, + 0xe6, 0x17, 0x74, 0x38, 0xda, 0xe5, 0x27, 0xe3, 0xbb, 0x5f, 0x58, 0x91, 0x16, 0x97, 0x9e, 0xf1, 0xd8, 0xe2, 0x7b, 0x4a, 0x9e, 0xdc, 0xf9, 0xc0, 0x11, 0xeb, 0x77, 0x6e, 0x77, 0x0d, 0x31, 0x19, + 0x5a, 0x2e, 0x04, 0xa1, 0x21, 0xbb, 0xf8, 0x7a, 0xb9, 0x5d, 0x73, 0xf8, 0xb8, 0x86, 0xf1, 0xb5, 0x50, 0x9a, 0xae, 0xe2, 0xca, 0x85, 0x15, 0x6a, 0x40, 0x65, 0x0d, 0x00, 0x9f, 0x6b, 0x7d, 0xcb, + 0xd9, 0xd4, 0x3b, 0x2a, 0xe3, 0x61, 0x76, 0x4e, 0x0f, 0x57, 0x30, 0x39, 0x8d, 0x87, 0x33, 0x75, 0xe6, 0x42, 0x0e, 0x81, 0x1b, 0xe9, 0x00, 0x2b, 0x2a, 0x60, 0xe2, 0xac, 0xc4, 0xd6, 0xd8, 0x8a, + 0x84, 0xf1, 0x73, 0x1b, 0xf0, 0x38, 0x83, 0x93, 0x45, 0x9e, 0x3f, 0x96, 0x19, 0xe0, 0xcb, 0xe0, 0x19, 0x7d, 0xe7, 0x06, 0xf4, 0x05, 0x5b, 0x6f, 0x37, 0x4e, 0x87, 0x62, 0x76, 0xd0, 0x7a, 0x4a, + 0xdc, 0xf5, 0x6b, 0xcb, 0x06, 0x06, 0x0c, 0xcd, 0xe1, 0xeb, 0xad, 0x64, 0xca, 0xed, 0x46, 0x76, 0x43, 0xa2, 0x0d, 0xe8, 0xaa, 0x37, 0x0f, 0x35, 0x1a, 0x64, 0x95, 0xd6, 0xe4, 0xab, 0x5a, 0x17, + 0x29, 0x2f, 0x3d, 0x90, 0xeb, 0x74, 0x19, 0xa3, 0xb2, 0xbb, 0x27, 0xd4, 0x86, 0x1e, 0xd3, 0x1a, 0x01, 0x12, 0xde, 0x46, 0x22, 0x76, 0x63, 0xbf, 0x4d, 0xb0, 0x43, 0xa4, 0x94, 0xe8, 0xd8, 0x9b, + 0xab, 0x5f, 0x57, 0x98, 0xba, 0x4d, 0x6a, 0xe5, 0xde, 0xa3, 0xf0, 0xfb, 0x93, 0x3b, 0xd2, 0x19, 0xe6, 0x11, 0x0d, 0xe7, 0xab, 0xae, 0xfb, 0x91, 0x21, 0x6a, 0x81, 0x7b, 0xd0, 0xe5, 0x42, 0x63, + 0xab, 0xcc, 0xb7, 0xeb, 0xda, 0x90, 0xab, 0x3a, 0x04, 0x26, 0x21, 0x82, 0xc2, 0x33, 0x6c, 0x70, 0x70, 0xe6, 0x73, 0x25, 0x57, 0x0e, 0xa2, 0x98, 0x0f, 0xb3, 0x68, 0x06, 0xd0, 0x33, 0xae, 0x27, + 0x12, 0x46, 0x2e, 0x62, 0x11, 0x1b, 0xae, 0x4c, 0x40, 0xc3, 0xbd, 0x9e, 0x60, 0xa1, 0x14, 0xc8, 0x3b, 0x62, 0x5e, 0xaa, 0xc2, 0xbc, 0xb5, 0x7a, 0xda, 0xb8, 0xa3, 0x91, 0x7c, 0x39, 0xda, 0xef, + 0x6f, 0xc8, 0xc7, 0x64, 0xb4, 0xe3, 0x93, 0xab, 0x82, 0x11, 0xe8, 0xe6, 0x18, 0xed, 0x6f, 0x31, 0x7b, 0xdb, 0x24, 0xe6, 0xf5, 0x2b, 0xf7, 0x70, 0x8d, 0x3c, 0x95, 0x0f, 0x7d, 0x04, 0x08, 0xf4, + 0x4f, 0xff, 0xf5, 0x91, 0x6e, 0x19, 0xd0, 0x8c, 0x2f, 0x52, 0xeb, 0x3d, 0xe6, 0xa8, 0xf4, 0x60, 0xc6, 0x3b, 0x8e, 0x51, 0x32, 0xa4, 0xe1, 0x6f, 0xb4, 0x00, 0x24, 0x7a, 0x1c, 0xbd, 0x71, 0x45, + 0xd6, 0xa3, 0xda, 0x49, 0x2c, 0x0d, 0xc5, 0xa1, 0x66, 0x39, 0x51, 0x4a, 0x0c, 0x44, 0x40, 0x5f, 0x5b, 0xe4, 0x46, 0xd2, 0xd1, 0x95, 0x34, 0xd1, 0xd6, 0x8b, 0xb4, 0x9c, 0x0d, 0x83, 0x4a, 0xd1, + 0x16, 0x6e, 0xac, 0x2f, 0xe8, 0x65, 0xa0, 0x73, 0x3a, 0xf0, 0x31, 0xed, 0x2f, 0xb7, 0x0c, 0xad, 0x3c, 0xff, 0x7a, 0x21, 0xb4, 0xb4, 0xc2, 0xfa, 0x55, 0xa5, 0x4e, 0xae, 0x99, 0xd6, 0xaf, 0x5f, + 0x65, 0xf2, 0xeb, 0x75, 0xda, 0xbf, 0xf0, 0x5f, 0x49, 0xfe, 0xcb, 0xf5, 0x1c, 0xd7, 0xca, 0x5f, 0x7e, 0xfd, 0x5a, 0x86, 0xa6, 0x95, 0x5f, 0x9e, 0x15, 0xbf, 0x22, 0xad, 0xf9, 0x55, 0x15, 0xd6, + 0x2f, 0x5e, 0x2b, 0xdd, 0x97, 0xf3, 0xa9, 0x02, 0xff, 0xdb, 0xff, 0xfe, 0xcb, 0x8b, 0x7f, 0x19, 0x56, 0x5e, 0x6a, 0xc7, 0xff, 0xbd, 0xdc, 0xa8, 0xa2, 0xa2, 0xd4, 0x62, 0xc3, 0x2a, 0xfe, 0xeb, + 0xaf, 0xbd, 0xeb, 0x19, 0xee, 0x2f, 0xaf, 0xf8, 0x15, 0xc4, 0xc9, 0x3e, 0x3e, 0x7e, 0x46, 0xb7, 0x7e, 0xa5, 0x79, 0xa2, 0x87, 0x56, 0xa4, 0x95, 0x9e, 0xf1, 0xf2, 0xeb, 0x97, 0x68, 0x59, 0xbf, + 0x2e, 0xc8, 0xac, 0x89, 0x17, 0xd3, 0xaa, 0x01, 0x3d, 0x4c, 0x1c, 0x20, 0xd2, 0x4a, 0xf7, 0xf5, 0xe0, 0x82, 0x5f, 0x76, 0x92, 0xff, 0x32, 0xad, 0x52, 0xf3, 0xc2, 0xe2, 0xe5, 0x7d, 0x4a, 0x9f, + 0x0a, 0xe2, 0x2f, 0xfc, 0xa2, 0x7b, 0xf1, 0x99, 0xaa, 0xdf, 0x73, 0xc4, 0x6b, 0x07, 0x45, 0xbd, 0xe9, 0x9b, 0x96, 0xad, 0x55, 0xe1, 0x9f, 0xad, 0x7d, 0xff, 0x04, 0x1d, 0xe8, 0x7f, 0xbe, 0xd7, + 0xc5, 0x21, 0x00, 0xf5, 0x45, 0x3e, 0x2d, 0x8d, 0x5a, 0x9f, 0x26, 0x18, 0x31, 0xca, 0x34, 0x88, 0x1b, 0x24, 0x66, 0x8e, 0xa2, 0x9e, 0xc5, 0xed, 0x83, 0x1f, 0xca, 0x5c, 0x2f, 0x3a, 0x9d, 0xfe, + 0x17, 0x6a, 0x6d, 0xf3, 0x47, 0x45, 0xcc, 0x15, 0xdc, 0xe3, 0x34, 0xdf, 0x47, 0x5d, 0x44, 0x0d, 0xd4, 0x27, 0xb7, 0xd1, 0x52, 0x90, 0x77, 0xac, 0x9f, 0x40, 0xbd, 0x58, 0x9d, 0xcf, 0x49, 0x45, + 0x8a, 0xed, 0x7d, 0x58, 0x0b, 0xc1, 0x37, 0x7d, 0xf0, 0xbf, 0x6b, 0x8b, 0xdd, 0x85, 0x0b, 0xa2, 0x2a, 0x8f, 0xaa, 0xdc, 0xd5, 0x8a, 0xc7, 0x49, 0xe2, 0x4f, 0xb5, 0x8a, 0x7a, 0x87, 0x7b, 0x42, + 0xc9, 0xdb, 0xa8, 0x5b, 0x87, 0xc8, 0xc0, 0xf5, 0x06, 0x45, 0x1e, 0x24, 0x89, 0xef, 0x1d, 0x04, 0x43, 0xc2, 0x35, 0x18, 0xda, 0xe9, 0x0d, 0x2f, 0xcb, 0xbd, 0xe4, 0x2f, 0xa1, 0x04, 0x7c, 0x21, + 0x5e, 0xa0, 0x61, 0x17, 0xbc, 0xbc, 0x47, 0x93, 0x1f, 0x2d, 0x8a, 0x9f, 0xbb, 0xaf, 0x2f, 0x40, 0x8f, 0x18, 0x79, 0xbd, 0x3c, 0x2d, 0x81, 0x6f, 0x1c, 0xd7, 0x50, 0x5f, 0xd4, 0x21, 0x9f, 0x37, + 0xed, 0xd5, 0x7c, 0xb5, 0x9f, 0xd5, 0x33, 0x9a, 0xa3, 0x99, 0x2d, 0xe6, 0x6c, 0xb7, 0x90, 0x6e, 0xdf, 0x5f, 0x02, 0x1d, 0x76, 0x98, 0xc7, 0x81, 0xed, 0x7d, 0xae, 0xa5, 0xe9, 0xe9, 0xdb, 0x5d, + 0x0e, 0xa1, 0xbf, 0x0a, 0xac, 0x3f, 0x52, 0xba, 0x9f, 0xe0, 0x9e, 0x57, 0xa0, 0x27, 0x44, 0x9d, 0x2f, 0x4f, 0xaa, 0x74, 0x97, 0x46, 0x63, 0x40, 0x3d, 0xd5, 0x76, 0x28, 0xa0, 0x84, 0x1a, 0xb2, + 0x6d, 0x1b, 0x7e, 0x5c, 0x4b, 0xab, 0xe5, 0x4e, 0xb1, 0x58, 0xa6, 0xce, 0x96, 0x5c, 0x19, 0x67, 0xa4, 0x59, 0xb5, 0x12, 0x93, 0xb6, 0xe9, 0x4a, 0x6d, 0x47, 0x45, 0xc0, 0xf1, 0xae, 0x0a, 0x73, + 0x3d, 0x3a, 0x26, 0x3d, 0x91, 0x1f, 0xb6, 0x53, 0x31, 0x61, 0x27, 0x16, 0x9f, 0xee, 0xb8, 0x83, 0x86, 0x9a, 0x8a, 0xa5, 0xb2, 0xab, 0xcc, 0xda, 0x7f, 0x5d, 0x40, 0x78, 0x8e, 0x4a, 0xde, 0x67, + 0x13, 0xe4, 0x89, 0x64, 0x0d, 0x2f, 0xf6, 0x4e, 0x13, 0xf7, 0x4e, 0x07, 0xe7, 0x75, 0x48, 0xd5, 0xf0, 0xb8, 0x74, 0x9d, 0xee, 0x84, 0xde, 0x38, 0x17, 0x60, 0xbf, 0xc9, 0x0f, 0xb5, 0x03, 0x05, + 0xbc, 0x9c, 0xee, 0xa8, 0x66, 0x2d, 0x4f, 0xa8, 0x6d, 0x95, 0x1f, 0xf4, 0x78, 0x23, 0x41, 0xf5, 0x4a, 0x38, 0xf4, 0xb6, 0xed, 0xb0, 0x1a, 0x2b, 0x05, 0xcf, 0x66, 0x4a, 0x25, 0x92, 0xf3, 0x4d, + 0x4f, 0x18, 0x69, 0xea, 0x14, 0x30, 0xf1, 0x60, 0x3d, 0xe7, 0xd6, 0x13, 0x63, 0x98, 0x50, 0x7c, 0xc1, 0xf4, 0xa2, 0xc9, 0x8f, 0x35, 0x5a, 0xef, 0x43, 0x1b, 0xc4, 0x3f, 0xe7, 0xc0, 0xbb, 0x81, + 0x7c, 0x42, 0xcd, 0xd5, 0xb8, 0xab, 0x13, 0x6f, 0x09, 0x52, 0x24, 0x34, 0x1b, 0x03, 0x85, 0xd0, 0xa8, 0x21, 0x6e, 0xb0, 0x09, 0x4e, 0xc4, 0x03, 0x73, 0x8d, 0x5b, 0xb2, 0xb8, 0xdf, 0xa7, 0x8a, + 0xe0, 0xed, 0xd6, 0xae, 0xd4, 0x2e, 0x0e, 0xea, 0x66, 0xc4, 0xcb, 0x15, 0x49, 0xd4, 0x61, 0xbc, 0x9e, 0x34, 0xf3, 0x83, 0x99, 0x6f, 0xa4, 0x24, 0x28, 0xb0, 0x9d, 0x30, 0xdf, 0xc4, 0x13, 0x5b, + 0x6f, 0xb5, 0x8d, 0x39, 0xd8, 0xce, 0x7d, 0xd7, 0x71, 0x7a, 0x5d, 0x1b, 0x90, 0xdd, 0x4f, 0x47, 0xba, 0x59, 0x75, 0x0f, 0xf3, 0x05, 0x0b, 0xcf, 0xb4, 0xfa, 0x86, 0xab, 0xc5, 0xb1, 0xf5, 0xde, + 0x7a, 0xec, 0xe7, 0x67, 0x13, 0x77, 0x6c, 0x91, 0xee, 0xa5, 0x9a, 0x69, 0xe6, 0x2f, 0x5f, 0x78, 0x31, 0x86, 0xcf, 0x68, 0x03, 0x17, 0xa8, 0x47, 0xe2, 0x5d, 0xae, 0xfb, 0x27, 0x58, 0xdf, 0x13, + 0x0e, 0xe4, 0x58, 0x00, 0x03, 0xf1, 0x43, 0x72, 0x10, 0xa5, 0x84, 0xc1, 0xa7, 0xfe, 0x02, 0x9a, 0xd8, 0xa2, 0x3e, 0x4f, 0x64, 0xb0, 0xa7, 0x97, 0x92, 0x67, 0xf8, 0xc5, 0x4a, 0xdc, 0xae, 0x42, + 0x17, 0x70, 0xd5, 0x26, 0x58, 0x10, 0x5c, 0x1a, 0xf1, 0x36, 0x5e, 0x29, 0x7b, 0x61, 0x8b, 0xac, 0x7b, 0x5a, 0xa0, 0x62, 0x6b, 0x60, 0x0f, 0x11, 0x6a, 0xb8, 0x13, 0x19, 0x52, 0xd9, 0x79, 0x8a, + 0x2c, 0x2c, 0x91, 0x9f, 0x34, 0x65, 0xf8, 0x05, 0xbe, 0x74, 0xaa, 0x37, 0xfb, 0x70, 0xd4, 0xc9, 0x7d, 0xf4, 0x3d, 0xa5, 0x5f, 0x5c, 0x01, 0x3e, 0xf7, 0x5e, 0x7c, 0x1b, 0x76, 0x39, 0x93, 0xe9, + 0x88, 0x44, 0x88, 0xf5, 0xd1, 0x70, 0xc9, 0x0b, 0x21, 0x70, 0x20, 0x07, 0x01, 0x49, 0xc5, 0x38, 0xdb, 0xd3, 0xe1, 0xb2, 0x14, 0x78, 0x4e, 0x23, 0x8a, 0xd6, 0xa5, 0xd9, 0x7c, 0x47, 0x55, 0xbb, + 0x15, 0x05, 0x24, 0x16, 0xc2, 0xcc, 0xe6, 0xd2, 0xdc, 0xcd, 0x5c, 0x67, 0x5a, 0xa4, 0x7b, 0xa7, 0x99, 0x9a, 0x18, 0xbf, 0x6c, 0xf6, 0xa4, 0x9c, 0x6d, 0x6a, 0xc5, 0x33, 0x26, 0x38, 0x1c, 0x06, + 0x0e, 0x15, 0xb3, 0xcc, 0xd3, 0xfd, 0x17, 0x7f, 0x1e, 0x77, 0xfe, 0x27, 0xf9, 0x48, 0xbd, 0x4b, 0xf0, 0xea, 0x0b, 0x79, 0xf6, 0xf3, 0x2c, 0xa9, 0x37, 0xa8, 0x67, 0x62, 0x9e, 0xaf, 0xbb, 0x9c, + 0x50, 0x77, 0x5a, 0x0e, 0xb3, 0xcd, 0xa0, 0x27, 0x2e, 0xc7, 0xab, 0x80, 0x35, 0x5b, 0x9f, 0xe4, 0x86, 0x7a, 0x35, 0x5a, 0x1b, 0x1b, 0x02, 0x44, 0x29, 0xb3, 0xc2, 0x47, 0xe0, 0xca, 0x2a, 0xb1, + 0x82, 0xf1, 0x90, 0x89, 0x17, 0xd1, 0xc3, 0xd8, 0xc2, 0x22, 0x94, 0x9c, 0xae, 0x54, 0x7b, 0x1d, 0xf7, 0x16, 0xaa, 0xb7, 0xd3, 0xc9, 0x00, 0x9d, 0xa0, 0xbb, 0x88, 0xb1, 0x29, 0x95, 0xf5, 0xd2, + 0xb9, 0x3f, 0x4c, 0x77, 0x84, 0x29, 0xfe, 0xe7, 0x46, 0xc7, 0x4e, 0x73, 0x8e, 0xb5, 0xbc, 0xe9, 0x7f, 0x51, 0x12, 0xf2, 0xa4, 0x2a, 0x7e, 0x03, 0xfa, 0x82, 0xdf, 0xb7, 0x1b, 0x5d, 0x14, 0xf2, + 0x23, 0x92, 0x55, 0x9e, 0x5e, 0x2b, 0x56, 0x81, 0xa5, 0x54, 0x63, 0x36, 0xd5, 0xd4, 0x33, 0x0b, 0x0b, 0x5f, 0x16, 0xcc, 0xa1, 0xd4, 0x59, 0x7c, 0xbb, 0xb1, 0x64, 0x3a, 0x69, 0x9d, 0x35, 0xe0, + 0xe0, 0xb9, 0x09, 0x1e, 0x64, 0x2f, 0x52, 0x16, 0x61, 0xad, 0xae, 0x69, 0x80, 0x83, 0x79, 0x47, 0x95, 0xfc, 0x6d, 0x83, 0xc3, 0x03, 0xd6, 0xb6, 0xc2, 0xb9, 0xb5, 0x31, 0x68, 0x7e, 0x88, 0x47, + 0x51, 0xb9, 0x9e, 0xee, 0xbe, 0xf3, 0x45, 0x7f, 0xe1, 0x3e, 0x3d, 0xcf, 0xe0, 0xd4, 0x1a, 0xf0, 0x64, 0x8e, 0x9e, 0x56, 0xd2, 0x3f, 0xae, 0x85, 0xff, 0x11, 0x69, 0x49, 0x12, 0x5a, 0x5a, 0xfc, + 0xde, 0x12, 0xf3, 0x91, 0x38, 0x7b, 0x62, 0x37, 0xf8, 0x08, 0xfd, 0x95, 0x4c, 0x37, 0xf7, 0xba, 0x96, 0x01, 0xe8, 0x3b, 0x73, 0xb5, 0x0d, 0xe8, 0x31, 0x29, 0xb3, 0x23, 0x63, 0x1c, 0x58, 0x0c, + 0x54, 0xc5, 0xfb, 0xd9, 0x9c, 0x4d, 0x55, 0x45, 0xd3, 0x06, 0x9b, 0xba, 0x6a, 0x1c, 0xb1, 0x11, 0x01, 0x03, 0x0e, 0x6d, 0x1c, 0x1a, 0x46, 0x12, 0xa7, 0x52, 0xf2, 0x40, 0x36, 0xa9, 0x75, 0x98, + 0x9a, 0x20, 0x24, 0xfb, 0x23, 0xca, 0x89, 0xb6, 0xc4, 0xda, 0xce, 0x34, 0xa1, 0x17, 0xad, 0xb5, 0x8d, 0x60, 0xe6, 0xc0, 0xe2, 0x69, 0xc1, 0xf6, 0x2f, 0x13, 0xfc, 0xb9, 0x2d, 0x7d, 0xbd, 0x4f, + 0x5b, 0xf8, 0x19, 0xcd, 0xfd, 0x1d, 0xee, 0x99, 0xaa, 0x97, 0xd1, 0x29, 0x4a, 0xd1, 0x41, 0x7f, 0x8f, 0x8b, 0x6a, 0x5f, 0x1e, 0x54, 0x9b, 0xdf, 0x61, 0xf8, 0x32, 0x6f, 0xc2, 0xe1, 0x7c, 0xbc, + 0xea, 0x55, 0x69, 0x3c, 0x06, 0x55, 0x90, 0x74, 0xd2, 0x7d, 0x5c, 0xa6, 0x22, 0x31, 0x8c, 0x20, 0x06, 0x90, 0xe6, 0x13, 0xb0, 0x5d, 0xd8, 0xad, 0x3d, 0xe7, 0x37, 0xc0, 0x70, 0xab, 0x01, 0x18, + 0xaf, 0x16, 0x3e, 0xa8, 0x19, 0x29, 0xed, 0x8f, 0x96, 0x20, 0x37, 0x81, 0x0e, 0x12, 0xa6, 0x9a, 0xf3, 0x70, 0x38, 0xf8, 0x61, 0x4d, 0xdb, 0x3f, 0x8b, 0x20, 0x8f, 0xcc, 0x88, 0xe7, 0x0e, 0xc6, + 0x3c, 0x41, 0x7c, 0x25, 0x82, 0xd7, 0xf5, 0xe8, 0x4b, 0xc5, 0x9e, 0x49, 0x78, 0x1e, 0xa4, 0x2b, 0x12, 0xac, 0x52, 0xb3, 0x30, 0x99, 0xf9, 0x74, 0x9b, 0xd7, 0x2e, 0x39, 0xb3, 0x0d, 0xbb, 0x5d, + 0x2c, 0xb4, 0xbd, 0x42, 0x2d, 0xd8, 0x66, 0xb5, 0x9b, 0xb5, 0x20, 0xbb, 0xf1, 0xa6, 0x36, 0x3e, 0x58, 0x12, 0x34, 0x29, 0x70, 0xa2, 0x59, 0xef, 0xe1, 0x7c, 0xd2, 0x9b, 0x4f, 0xc7, 0xc5, 0x0e, + 0x9d, 0xa8, 0x44, 0x69, 0xe4, 0x88, 0x0e, 0x0d, 0xe7, 0x86, 0x9a, 0xa1, 0xcf, 0x0b, 0x3e, 0xc3, 0xeb, 0x7b, 0xb1, 0x9d, 0x7c, 0x25, 0xee, 0x3e, 0x9f, 0x93, 0xf1, 0x8a, 0xc9, 0xe3, 0x93, 0x6e, + 0xed, 0x20, 0x3f, 0xb5, 0xff, 0x7d, 0xb4, 0xd5, 0x3f, 0xb5, 0x1e, 0xae, 0x40, 0x9f, 0xa9, 0x71, 0x75, 0xe3, 0xb4, 0xe9, 0x77, 0x58, 0x15, 0x80, 0x8e, 0xaa, 0x9b, 0x62, 0x8a, 0xab, 0x83, 0xdd, + 0xa6, 0x64, 0x0f, 0x05, 0xe0, 0x0e, 0xb7, 0x44, 0x5c, 0xdb, 0x73, 0x47, 0x1c, 0x35, 0x9c, 0x62, 0x96, 0xd3, 0xed, 0x6a, 0xae, 0x67, 0x0d, 0xe6, 0x8f, 0x20, 0xcf, 0x88, 0x1c, 0xdf, 0x26, 0xb6, + 0xe3, 0x44, 0xe2, 0x1c, 0x4b, 0x44, 0xf7, 0xcd, 0xa0, 0x54, 0x34, 0xc1, 0x12, 0x92, 0xaa, 0x9d, 0xf0, 0xa3, 0x85, 0x1e, 0xfb, 0x43, 0xd4, 0x80, 0xd5, 0x7f, 0x85, 0x0c, 0x04, 0xaf, 0x38, 0x6e, + 0x7a, 0x5f, 0x94, 0x43, 0x3c, 0xd7, 0xe2, 0xec, 0x1d, 0xec, 0x99, 0x22, 0xaf, 0x83, 0x2e, 0x0d, 0xcd, 0xa0, 0x7e, 0xc6, 0xee, 0xc7, 0x32, 0x64, 0xad, 0x89, 0x31, 0x2e, 0xd9, 0x8c, 0xe6, 0x56, + 0x56, 0xb6, 0x33, 0x08, 0xa7, 0xed, 0xf1, 0xf7, 0x4f, 0x2f, 0xe9, 0x8a, 0xe2, 0xce, 0x27, 0xb1, 0x79, 0x45, 0xdf, 0xae, 0xc2, 0x70, 0xef, 0x99, 0xa5, 0xdb, 0x3f, 0xb5, 0xef, 0x48, 0x93, 0xc7, + 0x2a, 0xea, 0xd3, 0xc2, 0xe3, 0xde, 0x37, 0xce, 0xe8, 0xba, 0xf7, 0xa4, 0x8b, 0x80, 0x81, 0xfa, 0x09, 0xce, 0x73, 0x3b, 0x9a, 0x50, 0x03, 0x85, 0xdf, 0x5a, 0x59, 0x36, 0x58, 0xf6, 0x70, 0x0c, + 0x1d, 0x22, 0xb8, 0x2a, 0x13, 0xdd, 0x79, 0xb1, 0x93, 0x1d, 0x5b, 0xf4, 0x1d, 0x2b, 0xb6, 0x72, 0xad, 0x4c, 0xf2, 0xfe, 0x25, 0xe5, 0xf0, 0x8b, 0x95, 0x0d, 0x3d, 0x85, 0xa2, 0xcf, 0x9f, 0x38, + 0x23, 0xe8, 0xf3, 0xfd, 0xb3, 0xab, 0xbb, 0x83, 0x00, 0xf6, 0x0b, 0xda, 0x6f, 0x86, 0x21, 0xd2, 0x78, 0x3b, 0x7a, 0xd5, 0x13, 0x8a, 0x9d, 0x19, 0x91, 0x7b, 0x5a, 0x30, 0x96, 0x07, 0x6d, 0xb7, + 0x9d, 0x17, 0x29, 0x67, 0xa6, 0xe1, 0x44, 0xde, 0xb0, 0xc3, 0x3a, 0x83, 0x3c, 0xd5, 0x61, 0xad, 0xc0, 0x1a, 0x83, 0x73, 0x08, 0xc3, 0x33, 0xab, 0x22, 0x30, 0xa3, 0x5d, 0x69, 0x07, 0xcb, 0x44, + 0x32, 0x40, 0x6e, 0xab, 0x3d, 0x58, 0xec, 0xe7, 0xa0, 0x97, 0xcf, 0x89, 0x8e, 0x6e, 0x8a, 0x7f, 0xf9, 0x4e, 0xf8, 0xef, 0xe5, 0x1a, 0xf7, 0xe8, 0x8c, 0x3e, 0x17, 0xc9, 0x38, 0xc3, 0x7c, 0x25, + 0xec, 0x51, 0x4a, 0xa0, 0xdf, 0x47, 0x2d, 0x8e, 0x94, 0x1c, 0x4c, 0xc1, 0x92, 0x2b, 0x49, 0x69, 0xc2, 0x46, 0xcb, 0x8c, 0x8a, 0xe7, 0x24, 0xec, 0x4e, 0x31, 0x32, 0x85, 0x33, 0x83, 0xa3, 0x27, + 0x66, 0x95, 0xa0, 0xa5, 0x5a, 0x0d, 0x79, 0x09, 0x60, 0xb0, 0xc5, 0xaa, 0x06, 0x1c, 0xd7, 0x6d, 0x10, 0x30, 0x19, 0x0c, 0x2a, 0x5b, 0xb3, 0x0f, 0x33, 0x60, 0x6e, 0x32, 0xf8, 0x70, 0x3e, 0x2f, + 0x60, 0xce, 0xce, 0x63, 0x62, 0x20, 0xcd, 0xb9, 0x66, 0x84, 0x93, 0xf2, 0x5f, 0x3a, 0x88, 0xf5, 0x5d, 0x94, 0xbe, 0x36, 0xa8, 0xf8, 0x31, 0x5d, 0x7f, 0x22, 0xa3, 0xbc, 0x73, 0x31, 0xb8, 0x65, + 0xf6, 0xcf, 0x85, 0x27, 0xe1, 0xa3, 0xa0, 0x0b, 0xf8, 0x54, 0x79, 0xfc, 0xdd, 0x2f, 0x9c, 0xa9, 0xf4, 0xf9, 0xfe, 0xa9, 0x41, 0x4d, 0x07, 0xe3, 0x7a, 0xaf, 0x12, 0x07, 0xc8, 0x2f, 0x70, 0x56, + 0x03, 0x03, 0xcb, 0x10, 0x80, 0x31, 0xc3, 0x03, 0xc8, 0x88, 0x0c, 0x46, 0x51, 0xe5, 0xef, 0xf0, 0xad, 0x50, 0xaf, 0x02, 0xac, 0xaa, 0x90, 0x49, 0xd8, 0x00, 0x7c, 0x80, 0xa2, 0x69, 0x23, 0x56, + 0xe1, 0x2a, 0x8d, 0x99, 0x29, 0x8a, 0x2d, 0x79, 0x9f, 0x99, 0xee, 0x46, 0x29, 0xbb, 0x88, 0x37, 0xe8, 0xca, 0x55, 0x10, 0x71, 0x1b, 0xd3, 0xe3, 0x25, 0xdc, 0x0e, 0x9e, 0xa7, 0xd9, 0x6d, 0x5d, + 0xd0, 0x59, 0x05, 0xfa, 0x78, 0x28, 0xc1, 0xb9, 0x0e, 0x2d, 0x2e, 0x3c, 0xf3, 0x52, 0xcb, 0xf0, 0x4c, 0x99, 0xd2, 0x3f, 0xaf, 0x38, 0xe6, 0xce, 0xc9, 0x37, 0x8f, 0xb6, 0xb1, 0xa7, 0x98, 0xe4, + 0x06, 0xf8, 0x99, 0x3f, 0x6e, 0x6e, 0x9d, 0x36, 0xae, 0x0e, 0xac, 0x61, 0x66, 0xb3, 0x5a, 0xcb, 0xe7, 0xda, 0x7e, 0x57, 0x4c, 0xf4, 0x05, 0x65, 0xcd, 0xb6, 0x78, 0x3b, 0x6a, 0x09, 0xb6, 0x9c, + 0x0d, 0x0d, 0x13, 0x26, 0x94, 0xca, 0xae, 0xaa, 0x49, 0xeb, 0x82, 0x53, 0x22, 0x5d, 0x30, 0xfe, 0x8c, 0x8f, 0x15, 0x90, 0xa0, 0x6a, 0xbc, 0x50, 0x76, 0x70, 0x35, 0x19, 0xc8, 0xe9, 0x6a, 0xb9, + 0xf7, 0xac, 0x91, 0xb5, 0xa4, 0x0f, 0xb4, 0x32, 0xda, 0x6e, 0xed, 0x0a, 0x57, 0x55, 0xf9, 0x5f, 0x43, 0x05, 0x8b, 0xd3, 0xc7, 0x35, 0xe2, 0x4f, 0x2a, 0x17, 0x71, 0x1a, 0xbd, 0xd2, 0x22, 0x8d, + 0xba, 0x26, 0x31, 0x0f, 0x31, 0x7a, 0xcc, 0xda, 0xee, 0xf0, 0x50, 0x52, 0x54, 0x28, 0x34, 0xe1, 0x42, 0xd8, 0xb9, 0xad, 0x5f, 0x34, 0x01, 0x53, 0xf0, 0x33, 0x15, 0x22, 0x46, 0x62, 0xaa, 0x6d, + 0xdb, 0x55, 0x43, 0xe6, 0xa8, 0xb2, 0x96, 0x8c, 0x8d, 0x2f, 0xd7, 0xad, 0xc6, 0x68, 0x0d, 0x35, 0xa2, 0x45, 0x38, 0x91, 0x01, 0x84, 0x4b, 0x43, 0xdf, 0x65, 0x64, 0xbf, 0x14, 0xd7, 0x0b, 0x8f, + 0xda, 0x7b, 0xe0, 0x04, 0xf4, 0xbe, 0x5b, 0x9c, 0x9d, 0xd7, 0xcd, 0xd7, 0x18, 0xac, 0x22, 0xdd, 0x7a, 0xd4, 0x89, 0x0c, 0x7f, 0x1a, 0x89, 0x27, 0xa8, 0xaf, 0x78, 0x3c, 0x5d, 0x9f, 0x9a, 0x01, + 0x76, 0x40, 0x25, 0x0a, 0x8d, 0x3d, 0x3b, 0x70, 0x30, 0x8b, 0x90, 0x9a, 0x50, 0x4c, 0xcd, 0x52, 0x4a, 0xad, 0xf9, 0x86, 0xcf, 0x6a, 0x91, 0xa4, 0x37, 0xad, 0x54, 0x96, 0x4c, 0x4d, 0xaf, 0x29, + 0x1c, 0x85, 0x7a, 0x69, 0xac, 0x12, 0xa3, 0x45, 0x0d, 0x82, 0x20, 0xca, 0xaf, 0xe7, 0x28, 0xb2, 0xe2, 0x04, 0x2a, 0xe4, 0x86, 0xc6, 0xb4, 0x5e, 0xa4, 0xd8, 0x42, 0xdd, 0xaa, 0x32, 0x19, 0xea, + 0xd3, 0x9d, 0x72, 0x38, 0xc4, 0x7f, 0x11, 0x95, 0xe0, 0xf9, 0x00, 0xa9, 0x1f, 0xe0, 0xf3, 0x7b, 0x83, 0xed, 0xe7, 0x7d, 0xb8, 0x3e, 0x02, 0xbf, 0xc1, 0xee, 0x95, 0xd1, 0xd6, 0xe1, 0x0c, 0xb6, + 0xb5, 0x0c, 0x86, 0x2c, 0x10, 0x0f, 0x07, 0x29, 0x9f, 0xc8, 0x5c, 0x35, 0xac, 0x21, 0x52, 0x15, 0x06, 0x3c, 0x69, 0xa8, 0xd5, 0x42, 0xdc, 0xcc, 0x02, 0x3e, 0x18, 0x4d, 0x61, 0x73, 0x96, 0x8d, + 0xd1, 0x16, 0x9e, 0x86, 0xc1, 0x54, 0x5e, 0x58, 0x0c, 0x46, 0x88, 0x15, 0x53, 0x91, 0x1c, 0x49, 0x01, 0xbb, 0x89, 0xd5, 0x9b, 0x33, 0x6a, 0xcf, 0x1e, 0x92, 0x5c, 0x30, 0xa7, 0x25, 0x0c, 0x5c, + 0x78, 0x96, 0xf9, 0xaf, 0xe1, 0xca, 0xf8, 0x3a, 0x0b, 0xf3, 0x29, 0x66, 0x3f, 0xa7, 0x5b, 0x7a, 0xef, 0x79, 0x95, 0x1d, 0xd8, 0xdc, 0xcc, 0x33, 0x6a, 0x8a, 0x18, 0xba, 0xd1, 0x1e, 0x0e, 0xf4, + 0x6c, 0x9d, 0x2c, 0x77, 0xc6, 0xd2, 0x2f, 0xcd, 0x14, 0x9a, 0x01, 0x61, 0x93, 0x42, 0xd1, 0x22, 0x06, 0x0f, 0x5a, 0x1b, 0xaf, 0x0b, 0xa2, 0x17, 0x55, 0xa4, 0xeb, 0xac, 0x8c, 0x3c, 0xd6, 0x8b, + 0x34, 0x39, 0x0c, 0x76, 0x03, 0x7b, 0xb9, 0x07, 0x99, 0x98, 0x8f, 0x75, 0x9b, 0x6a, 0xeb, 0x98, 0xe6, 0xe9, 0x32, 0xa3, 0xe8, 0x19, 0x9d, 0x10, 0xdf, 0x79, 0x33, 0xfe, 0x8c, 0xc4, 0xb8, 0xdd, + 0xd6, 0xef, 0x61, 0x12, 0x79, 0x2e, 0x96, 0x7a, 0x03, 0xfa, 0x8c, 0xd1, 0xab, 0x1b, 0xa7, 0x4e, 0xe9, 0x1d, 0xa2, 0xa9, 0x13, 0x13, 0x75, 0x46, 0xa4, 0xde, 0x6b, 0x8c, 0xe9, 0x28, 0xe2, 0x92, + 0x8a, 0xb0, 0x78, 0xbb, 0x1c, 0x57, 0xa9, 0xe8, 0xe5, 0x83, 0x70, 0x7d, 0xc8, 0x6c, 0x54, 0xa3, 0x80, 0xda, 0x04, 0x0d, 0x0a, 0xce, 0x0c, 0x94, 0x99, 0x83, 0xf8, 0xd2, 0x1f, 0x5b, 0x15, 0xc3, + 0xe7, 0xc4, 0x3a, 0x41, 0xc7, 0x09, 0xaf, 0x59, 0x63, 0x8e, 0x22, 0x41, 0x80, 0x1e, 0x93, 0xcb, 0xcd, 0xd6, 0x97, 0xf6, 0x72, 0x2d, 0x7c, 0x57, 0x51, 0xfa, 0x67, 0x30, 0xfb, 0xf5, 0xb9, 0x68, + 0x4f, 0xca, 0x8c, 0x3b, 0xe7, 0xa2, 0x75, 0x92, 0x11, 0x75, 0xc8, 0x6d, 0x21, 0x5c, 0x5c, 0x64, 0x28, 0x9a, 0xec, 0xeb, 0xc1, 0x68, 0xb5, 0x46, 0xc6, 0x19, 0xa8, 0xaf, 0x04, 0x5a, 0x27, 0x7a, + 0xc1, 0x04, 0x91, 0x39, 0x15, 0xb6, 0x3d, 0x75, 0xb1, 0xdc, 0x96, 0x6d, 0xa9, 0xd0, 0x03, 0x0f, 0x1c, 0xb7, 0x63, 0xf5, 0x30, 0xa1, 0xf6, 0xcb, 0x01, 0x91, 0x8d, 0x96, 0xdb, 0xf2, 0x60, 0x92, + 0xeb, 0xcd, 0x12, 0xd8, 0x0c, 0x56, 0x5e, 0x0c, 0xed, 0xfd, 0x71, 0x36, 0xf9, 0x0b, 0x05, 0xd6, 0xb7, 0x51, 0xe8, 0x4f, 0xa2, 0xe3, 0x7f, 0x5a, 0x79, 0x73, 0xff, 0xdc, 0xc3, 0x47, 0x14, 0x7e, + 0x4a, 0x8f, 0xbc, 0xf3, 0x89, 0x33, 0xbd, 0xef, 0x3c, 0xe8, 0x1a, 0xcb, 0x2b, 0xb2, 0x05, 0x2c, 0x53, 0x15, 0x04, 0x80, 0x0d, 0x56, 0xd5, 0xbb, 0x46, 0x2c, 0xc7, 0xcb, 0xb6, 0x71, 0x47, 0xfe, + 0x58, 0x0c, 0x19, 0xc3, 0x9a, 0x24, 0x3c, 0x37, 0xdb, 0x12, 0xdb, 0x21, 0x2d, 0x0f, 0x8d, 0xda, 0x33, 0x80, 0x95, 0x59, 0xa8, 0x60, 0x40, 0xcb, 0x43, 0x84, 0xa1, 0x1b, 0x84, 0x95, 0xe9, 0x89, + 0xca, 0x7a, 0x0c, 0x80, 0xec, 0x7b, 0x23, 0x06, 0x90, 0x57, 0xba, 0xc0, 0x2c, 0x4c, 0xb7, 0xa3, 0xb1, 0xdf, 0x29, 0x78, 0xf1, 0x9f, 0x42, 0xbb, 0xcb, 0x39, 0x94, 0x8f, 0xc8, 0xf5, 0x44, 0x06, + 0xcd, 0x05, 0xea, 0x2b, 0x85, 0xce, 0xa7, 0x5c, 0x9c, 0x60, 0x7d, 0x4f, 0x94, 0x92, 0x86, 0xe5, 0x5d, 0xeb, 0xd5, 0xbe, 0x85, 0x25, 0xb6, 0xb0, 0xc5, 0x43, 0x18, 0x31, 0x7c, 0x6a, 0xc9, 0x6b, + 0xe0, 0xd0, 0xd1, 0xf1, 0x43, 0x38, 0xca, 0xa6, 0x98, 0x3f, 0x1d, 0x58, 0x3e, 0x56, 0x09, 0x1b, 0x04, 0x96, 0xc2, 0xad, 0x80, 0x2c, 0x38, 0xc1, 0x73, 0x4a, 0x6d, 0x6a, 0x31, 0x8b, 0x6a, 0x68, + 0x27, 0xae, 0x61, 0xac, 0x95, 0x9a, 0xf5, 0x54, 0xde, 0x5e, 0x2e, 0xe3, 0xa5, 0x22, 0x97, 0x1d, 0x23, 0x4a, 0xff, 0x2b, 0x78, 0x60, 0xde, 0x4e, 0xc9, 0x7b, 0x44, 0xcf, 0xa7, 0xbc, 0xe8, 0x67, + 0xa8, 0xaf, 0xf4, 0x3c, 0xb7, 0x2c, 0xea, 0xe8, 0x3b, 0x1f, 0x03, 0x63, 0x81, 0xcc, 0xb8, 0x6d, 0x5c, 0x9b, 0xc6, 0x21, 0x63, 0x47, 0xeb, 0x43, 0xb3, 0x74, 0xd1, 0x1a, 0x92, 0x65, 0x7a, 0x39, + 0x66, 0x52, 0x87, 0xd2, 0xc0, 0xad, 0xe2, 0xa4, 0x1c, 0x35, 0xe1, 0x8b, 0xd6, 0xc8, 0x05, 0xc3, 0xb6, 0x9d, 0x41, 0xe5, 0xee, 0x45, 0x47, 0x18, 0xcf, 0x29, 0x78, 0xbb, 0x3d, 0x44, 0x19, 0xe6, + 0x15, 0x5e, 0xd1, 0x12, 0x78, 0xd9, 0x4a, 0x20, 0x54, 0x56, 0x53, 0xf7, 0x07, 0xf4, 0xfc, 0x97, 0x2d, 0x10, 0xf3, 0x8a, 0x53, 0x43, 0xd3, 0x57, 0xd1, 0xf6, 0x90, 0xa0, 0xd0, 0x0b, 0xf1, 0x0c, + 0x41, 0xaf, 0x40, 0x9f, 0xa9, 0x7a, 0x75, 0xe3, 0x14, 0xfc, 0x25, 0xbe, 0x27, 0x2d, 0x93, 0x31, 0x28, 0x24, 0x2d, 0xd4, 0x0c, 0xb6, 0x9d, 0x72, 0x2a, 0x11, 0x5b, 0x66, 0x33, 0xd9, 0xcc, 0x5c, + 0x72, 0x33, 0xad, 0x14, 0x64, 0x14, 0x0b, 0xc8, 0x0a, 0xc1, 0x38, 0x62, 0xc6, 0xed, 0xe4, 0x83, 0x78, 0x58, 0x3b, 0x01, 0x60, 0xf6, 0xf0, 0x85, 0x1f, 0xed, 0xa7, 0x70, 0x9d, 0xc0, 0x91, 0x12, + 0xed, 0x38, 0x42, 0x56, 0x54, 0xae, 0x02, 0x33, 0x86, 0xd0, 0x37, 0xc2, 0xc0, 0xa1, 0xbd, 0xc2, 0xef, 0x28, 0x3f, 0xb5, 0x5a, 0xf3, 0xce, 0x91, 0xcd, 0xab, 0x1f, 0xfe, 0x4e, 0xe5, 0x9b, 0xa3, + 0xd2, 0xbe, 0x3f, 0x11, 0xf9, 0xea, 0x1c, 0xe9, 0x53, 0x72, 0x18, 0x71, 0x0b, 0xe0, 0xbd, 0xe3, 0xf0, 0xd9, 0x09, 0x74, 0xf3, 0xf0, 0x7f, 0x05, 0xa1, 0x71, 0xc2, 0xe1, 0xd7, 0x7c, 0xf6, 0xa4, + 0xdd, 0xf0, 0x0e, 0xf9, 0x8a, 0xcd, 0x2e, 0x5c, 0xf6, 0xad, 0x15, 0x01, 0xf5, 0x07, 0x4c, 0xcc, 0x8e, 0x27, 0xbe, 0x4d, 0x91, 0xc5, 0x1a, 0x31, 0xd3, 0x74, 0x25, 0x84, 0x0e, 0x6d, 0xb7, 0x9a, + 0x98, 0xde, 0x4f, 0x45, 0xfe, 0x72, 0x9a, 0xef, 0x87, 0x2a, 0xff, 0x51, 0xdd, 0xe4, 0x15, 0xec, 0x79, 0x82, 0xaf, 0x83, 0xae, 0x3a, 0x48, 0x66, 0x94, 0x45, 0x35, 0x57, 0x23, 0x76, 0x05, 0xf6, + 0x6a, 0x51, 0xe4, 0xed, 0x64, 0x53, 0x37, 0x13, 0x0b, 0xee, 0x4d, 0x45, 0xba, 0x8e, 0x23, 0x15, 0xb6, 0x5a, 0xa9, 0x4a, 0x21, 0x91, 0x2c, 0xac, 0x61, 0xaf, 0xdc, 0x8f, 0xc7, 0xd6, 0xff, 0xc7, + 0xde, 0xbf, 0x35, 0xa9, 0xca, 0x35, 0x71, 0x82, 0xf8, 0x7d, 0x7f, 0x8a, 0x1d, 0xcf, 0xe5, 0x9f, 0x70, 0x73, 0x14, 0xb1, 0x23, 0xfa, 0x3f, 0x8d, 0xa2, 0xa2, 0x08, 0xa8, 0xa0, 0x02, 0x13, 0xf3, + 0x4e, 0x70, 0x3e, 0x9f, 0xcf, 0x46, 0xc7, 0xfb, 0xd9, 0x27, 0xc4, 0xaa, 0xbd, 0x4b, 0x4b, 0x4b, 0xca, 0x67, 0x3f, 0xf1, 0x76, 0xcf, 0xf4, 0x55, 0x01, 0x52, 0x09, 0xfc, 0x32, 0xd7, 0x5a, 0x99, + 0xb9, 0xf2, 0xe0, 0xaa, 0x01, 0x3e, 0x9b, 0xb9, 0x28, 0xa7, 0x23, 0xcc, 0x5c, 0xb7, 0x70, 0x20, 0x3d, 0x21, 0xf3, 0xc9, 0x26, 0xf2, 0xa4, 0xdc, 0x27, 0x1a, 0x87, 0x11, 0xd4, 0x5b, 0x4d, 0xfe, + 0x7f, 0x7a, 0x1d, 0xa4, 0xcb, 0x53, 0xbd, 0x78, 0x5b, 0x1f, 0xf0, 0xe6, 0xba, 0x3f, 0xcd, 0x37, 0x78, 0xf3, 0x81, 0xf4, 0x85, 0x3f, 0x1f, 0x2e, 0x74, 0x6e, 0xe9, 0x1e, 0x76, 0xec, 0xc1, 0x13, + 0x4c, 0x0d, 0x0c, 0xe8, 0xd0, 0x8f, 0x5b, 0x83, 0xc8, 0xda, 0xcd, 0x61, 0xc9, 0x54, 0xfc, 0x34, 0xc2, 0x28, 0xd8, 0x8f, 0xd9, 0x54, 0x06, 0xaa, 0xb4, 0xf5, 0xbc, 0xbd, 0xa5, 0xa3, 0x4d, 0xcb, + 0x14, 0x1b, 0xcc, 0x90, 0xf9, 0x86, 0xc5, 0xb0, 0x5c, 0xc9, 0xa2, 0x74, 0x2b, 0x9c, 0x04, 0x23, 0x47, 0x9b, 0x96, 0xcf, 0xf6, 0xe2, 0x5a, 0x9c, 0x8e, 0xd7, 0x87, 0xe9, 0xc1, 0x5e, 0x47, 0xf6, + 0x03, 0x3b, 0xf6, 0x2b, 0x9c, 0xfe, 0x89, 0x01, 0xfa, 0x7b, 0x68, 0x7e, 0x63, 0x50, 0x96, 0x43, 0xce, 0x10, 0xe6, 0x76, 0x5e, 0x3a, 0x2a, 0x3b, 0x89, 0xb9, 0xd5, 0x01, 0x3f, 0x30, 0x1b, 0x5b, + 0x17, 0xc4, 0x66, 0xf6, 0xcd, 0x8f, 0xfa, 0xdd, 0x05, 0xf3, 0xde, 0x47, 0xbd, 0x96, 0xb4, 0xf8, 0x46, 0x13, 0x1c, 0xbc, 0x1f, 0xf5, 0x4d, 0x4d, 0xac, 0x93, 0x46, 0xc9, 0xc7, 0x5c, 0xdc, 0x28, + 0xea, 0x6a, 0x26, 0xac, 0x16, 0x4b, 0x45, 0x6c, 0xa9, 0x99, 0x2a, 0x27, 0x01, 0x34, 0x67, 0x04, 0x12, 0x98, 0x4f, 0xc6, 0xea, 0xca, 0x6d, 0xcd, 0x90, 0x71, 0xd8, 0xda, 0x6f, 0xb6, 0x36, 0x8e, + 0x3a, 0x98, 0x08, 0x33, 0x2b, 0x7b, 0xbf, 0xa0, 0x13, 0x31, 0xdd, 0x50, 0xdc, 0x4e, 0x0f, 0x43, 0x79, 0x5d, 0xda, 0xd9, 0xce, 0x5b, 0x05, 0x93, 0xe2, 0x58, 0xed, 0xfa, 0xae, 0x67, 0x99, 0x7d, + 0xdd, 0x87, 0xa8, 0x4f, 0x23, 0xce, 0x0f, 0x3d, 0x44, 0x35, 0x37, 0x7a, 0xff, 0xdc, 0x7e, 0x51, 0x17, 0x5d, 0xeb, 0xa3, 0x2f, 0x6d, 0x35, 0xf4, 0x25, 0x91, 0xfa, 0x40, 0xb7, 0xe3, 0xc0, 0xaf, + 0xb3, 0xce, 0xb7, 0xf1, 0x54, 0xb4, 0x8e, 0x0d, 0x31, 0x34, 0xab, 0x06, 0x86, 0x23, 0x73, 0x8c, 0xaf, 0x4f, 0x04, 0xe5, 0x5b, 0x0e, 0xa0, 0x6e, 0x94, 0x74, 0x65, 0x7f, 0x5b, 0xb4, 0xe2, 0x68, + 0x90, 0xeb, 0x8e, 0x19, 0xaa, 0x83, 0x22, 0x53, 0xcf, 0x1f, 0xf6, 0xc8, 0x97, 0x73, 0x56, 0x64, 0xbf, 0xbf, 0x35, 0x79, 0xef, 0x01, 0xef, 0x9f, 0x7c, 0x73, 0x79, 0xd0, 0x3d, 0xe1, 0xb9, 0x04, + 0x36, 0x9a, 0x36, 0xa5, 0x87, 0xc6, 0x54, 0xde, 0x0f, 0x45, 0x62, 0xad, 0xcf, 0x1c, 0xa7, 0x74, 0x46, 0xf4, 0x8a, 0x20, 0x68, 0xa9, 0x3c, 0xa2, 0x69, 0xbe, 0x44, 0x65, 0xe8, 0xc4, 0x2b, 0x73, + 0xc6, 0x52, 0x66, 0xb4, 0x9e, 0x1c, 0x5d, 0x7a, 0x0f, 0xae, 0x9a, 0x93, 0x8f, 0x23, 0xe3, 0x49, 0x96, 0xab, 0x1a, 0x18, 0xb2, 0x2e, 0xbd, 0x2d, 0xdc, 0x71, 0xcd, 0x6e, 0x00, 0x02, 0x1b, 0xee, + 0x36, 0x26, 0x7a, 0xf8, 0x3a, 0xe9, 0xd3, 0x37, 0xdb, 0xea, 0xa1, 0x00, 0xbc, 0x32, 0xfc, 0xce, 0x04, 0xc1, 0x41, 0xf7, 0xa7, 0xeb, 0x1a, 0xda, 0x63, 0xe0, 0x8d, 0x5b, 0x7f, 0x05, 0x62, 0xb8, + 0xc0, 0x81, 0x63, 0x66, 0xc3, 0x82, 0xb9, 0xab, 0x3b, 0xa7, 0xed, 0x88, 0xaf, 0xa4, 0x76, 0x41, 0xc9, 0xcc, 0x42, 0x54, 0xa9, 0x80, 0x61, 0x17, 0x53, 0x32, 0xb0, 0x91, 0x3d, 0x43, 0x30, 0xbb, + 0x16, 0xf3, 0x34, 0xc8, 0x20, 0xf2, 0xb9, 0x0e, 0x40, 0x62, 0x01, 0xc9, 0x72, 0x24, 0x3a, 0x29, 0x21, 0x21, 0x3b, 0xc5, 0x9e, 0xda, 0x23, 0x6c, 0xb7, 0x69, 0x6c, 0xfd, 0xb6, 0xf9, 0xc0, 0x37, + 0xdc, 0x30, 0xd7, 0x43, 0xe3, 0x2f, 0xb4, 0x67, 0x36, 0x76, 0xa0, 0x16, 0x66, 0x5e, 0x0c, 0x7e, 0x03, 0x78, 0x0f, 0xd3, 0xe1, 0x4b, 0x98, 0x5e, 0x93, 0x06, 0x07, 0x37, 0x17, 0xba, 0xf2, 0x8e, + 0x3d, 0x70, 0xae, 0x4d, 0x11, 0xc8, 0x20, 0x5f, 0xf4, 0x77, 0x5b, 0x63, 0x6a, 0xc8, 0x53, 0xae, 0xf0, 0xd9, 0xfa, 0x28, 0x6d, 0x45, 0x76, 0x96, 0xd7, 0x4c, 0x36, 0x9f, 0xf8, 0x21, 0xa6, 0xfb, + 0x5b, 0x9e, 0x3d, 0x38, 0x4e, 0xea, 0x2c, 0xd9, 0x25, 0xbc, 0x17, 0x11, 0x87, 0xf5, 0x00, 0xd8, 0x75, 0xed, 0xa5, 0x63, 0x0b, 0x4a, 0x38, 0xb4, 0xc5, 0x30, 0xdb, 0x49, 0x13, 0x2e, 0x5e, 0xec, + 0x6d, 0x55, 0x94, 0xe1, 0xe6, 0x75, 0x9c, 0x13, 0x55, 0xf7, 0x55, 0xfb, 0xd2, 0x85, 0xad, 0x9b, 0xf7, 0xf0, 0x97, 0xba, 0xd1, 0xf4, 0x71, 0x3c, 0xde, 0x69, 0x35, 0x77, 0x7f, 0xc1, 0x19, 0xbd, + 0xc2, 0x9d, 0x1b, 0xe2, 0x67, 0xfe, 0xdc, 0x5c, 0x1a, 0x74, 0x94, 0x9f, 0x73, 0x68, 0x2d, 0xaa, 0x84, 0xac, 0x24, 0x28, 0x83, 0x90, 0xfb, 0x24, 0xdd, 0x47, 0x75, 0xcd, 0xa8, 0x5e, 0xbc, 0xa4, + 0xf5, 0x9c, 0xe1, 0x27, 0xd1, 0xa9, 0x5e, 0x71, 0x5b, 0x21, 0xf3, 0x47, 0x65, 0x74, 0x72, 0x37, 0x75, 0x8c, 0x4f, 0x3d, 0x5e, 0xf6, 0x5a, 0x1e, 0x9a, 0x8f, 0x6b, 0xcb, 0x6f, 0xe6, 0xd5, 0x06, + 0x88, 0x26, 0xf9, 0x74, 0x61, 0xa2, 0x26, 0xbb, 0x89, 0x4c, 0xe3, 0x60, 0x2f, 0x97, 0xb6, 0x41, 0xf6, 0xcc, 0x7a, 0x7e, 0x6f, 0x70, 0xfa, 0xa9, 0xc7, 0xb5, 0x1e, 0xc7, 0xbe, 0x7b, 0x59, 0x99, + 0x3e, 0x75, 0xe7, 0xe8, 0xd5, 0x27, 0x30, 0x37, 0x8b, 0xc1, 0x85, 0xc8, 0x5b, 0x1e, 0xfc, 0xdb, 0x2a, 0x87, 0xfd, 0xec, 0x93, 0xe3, 0xf6, 0x09, 0xde, 0xab, 0x5f, 0x2f, 0x6f, 0x7d, 0x8f, 0x99, + 0xc4, 0x4f, 0xe2, 0x05, 0x7d, 0x5e, 0xf5, 0xce, 0xb3, 0x97, 0xea, 0x55, 0x83, 0xee, 0xff, 0x9f, 0xb3, 0xac, 0x19, 0x1f, 0x4a, 0x09, 0xd8, 0x81, 0x9e, 0x3e, 0xf7, 0x60, 0x8a, 0x8e, 0x41, 0x6b, + 0x9a, 0x8c, 0xc7, 0x66, 0x6e, 0x2f, 0xa8, 0xa3, 0x4b, 0xcf, 0xb8, 0x8c, 0x69, 0xd4, 0xe9, 0x8c, 0x2b, 0xa7, 0x4d, 0x12, 0xb3, 0xd3, 0x90, 0x2c, 0xc0, 0x29, 0x3f, 0x5d, 0x1c, 0xa8, 0x9a, 0x1c, + 0xf9, 0x81, 0x39, 0x4b, 0x66, 0xa7, 0x95, 0x47, 0x45, 0x95, 0x83, 0xb6, 0x8b, 0x98, 0x2f, 0xd7, 0x25, 0x44, 0x15, 0x41, 0xd0, 0x93, 0x65, 0x8f, 0xba, 0x42, 0xdd, 0x74, 0x1a, 0xbf, 0xbb, 0x10, + 0xde, 0x29, 0x53, 0x78, 0x06, 0xd8, 0xcd, 0xcc, 0x81, 0x95, 0xc5, 0xe1, 0x6f, 0xc7, 0xe0, 0x45, 0x1f, 0xb9, 0x32, 0x99, 0xcb, 0xcc, 0x7d, 0xaf, 0x55, 0x71, 0x69, 0x77, 0xfb, 0x69, 0xcc, 0xde, + 0x35, 0x1b, 0xce, 0xc6, 0xdf, 0xf9, 0x9f, 0x2e, 0xf6, 0xc2, 0x35, 0xc1, 0xa7, 0x06, 0x85, 0x99, 0xc4, 0x9a, 0x99, 0x99, 0x27, 0xff, 0x77, 0x77, 0x82, 0x97, 0x85, 0xe6, 0x1b, 0xba, 0xc1, 0x6b, + 0x8a, 0xf5, 0x77, 0x74, 0x83, 0x1e, 0x2a, 0xf7, 0x59, 0xce, 0x38, 0x96, 0x00, 0x37, 0xe3, 0x08, 0x95, 0x3c, 0xc9, 0x59, 0x2a, 0x11, 0x1c, 0xac, 0x1d, 0x7f, 0xae, 0x92, 0x53, 0x91, 0xdf, 0xef, + 0xb6, 0x92, 0x77, 0x74, 0x0e, 0xd8, 0x84, 0x04, 0x77, 0x11, 0x5f, 0x11, 0x4d, 0x65, 0xa7, 0x45, 0x9a, 0x90, 0xd2, 0x78, 0xc9, 0x63, 0xe1, 0x6e, 0xdb, 0x08, 0x0d, 0xbc, 0x0b, 0x62, 0xac, 0x48, + 0x4f, 0x66, 0xaa, 0x41, 0x39, 0x1f, 0x64, 0xa5, 0xca, 0xb7, 0xa8, 0x51, 0x7e, 0xad, 0x1b, 0x04, 0x71, 0x9c, 0x68, 0x66, 0xf4, 0xb0, 0xd7, 0xd2, 0x6b, 0x45, 0x75, 0x7e, 0x51, 0x3d, 0xcf, 0x93, + 0xef, 0xc7, 0x7d, 0xca, 0xe8, 0xc0, 0x03, 0xc3, 0x5e, 0xa0, 0x1b, 0x58, 0x5f, 0x59, 0xf4, 0x06, 0x5a, 0xa5, 0x13, 0xb3, 0x42, 0x6d, 0xb5, 0x00, 0x92, 0xd5, 0x1c, 0x24, 0x7a, 0x8d, 0x97, 0xa6, + 0x30, 0xdf, 0xac, 0xdd, 0xeb, 0x72, 0xc2, 0x5f, 0x41, 0x70, 0x53, 0x4b, 0xf4, 0x91, 0x8c, 0x7c, 0x5f, 0x7f, 0xbc, 0x26, 0xdd, 0x81, 0xf1, 0xf1, 0x42, 0x9f, 0xf4, 0xfc, 0xb3, 0x5c, 0x2c, 0x90, + 0xb5, 0x87, 0xc3, 0x85, 0x44, 0x45, 0x87, 0xf9, 0x9c, 0x77, 0x89, 0x83, 0x62, 0xe4, 0x80, 0x10, 0x6f, 0xbd, 0x62, 0x3b, 0x45, 0x0d, 0x3b, 0xf6, 0x19, 0x83, 0x5a, 0x20, 0xa1, 0x18, 0xc2, 0x45, + 0x83, 0x85, 0x43, 0x88, 0xdb, 0xd3, 0x13, 0x5e, 0x11, 0x26, 0xf5, 0x76, 0x4b, 0xb7, 0x2d, 0x74, 0x80, 0x11, 0x12, 0x5a, 0x89, 0x0b, 0xcc, 0xd5, 0x2d, 0x65, 0x4b, 0x03, 0xcd, 0xa6, 0x75, 0x88, + 0xa7, 0xca, 0xd3, 0xf3, 0x60, 0x82, 0x9e, 0x3a, 0x53, 0x56, 0x5e, 0x0a, 0xc9, 0x3c, 0x40, 0x16, 0x7f, 0x69, 0xf4, 0xfd, 0xa2, 0x7a, 0x06, 0xf5, 0xfd, 0x78, 0x80, 0xf7, 0x1b, 0x67, 0xab, 0x18, + 0x37, 0x56, 0x10, 0x36, 0x0d, 0x05, 0xaf, 0x3c, 0x45, 0xf5, 0x4a, 0x10, 0xd0, 0x64, 0x6f, 0x1e, 0x43, 0x03, 0xa4, 0x21, 0xcb, 0x12, 0x03, 0x5f, 0x92, 0xec, 0x5a, 0x71, 0x01, 0x33, 0x85, 0xf7, + 0xd3, 0x30, 0xdd, 0xd6, 0x53, 0x07, 0x30, 0xd7, 0xb9, 0xcc, 0xcb, 0xd3, 0x5a, 0x1e, 0x8f, 0x61, 0x17, 0x99, 0xab, 0x0e, 0xe6, 0xc0, 0x93, 0x19, 0x3b, 0x6d, 0xb0, 0x54, 0x74, 0x16, 0x5a, 0xee, + 0xf6, 0xb4, 0x02, 0x5b, 0x35, 0x08, 0xdc, 0x5f, 0x8d, 0x70, 0x5f, 0xf1, 0x21, 0xf6, 0x4a, 0x95, 0x0c, 0x55, 0xdf, 0x1c, 0x18, 0xee, 0x63, 0xc3, 0xef, 0x15, 0x1d, 0xf5, 0x9d, 0x28, 0x38, 0xf8, + 0x75, 0xd8, 0x57, 0xff, 0xb7, 0xd1, 0xb9, 0xb9, 0x41, 0xa0, 0x35, 0x57, 0x3b, 0xe4, 0x5a, 0x03, 0xf1, 0xe9, 0x09, 0xa7, 0x0c, 0x6c, 0x8e, 0x44, 0xf6, 0xc9, 0x84, 0xbc, 0xd3, 0xa8, 0xd0, 0x4e, + 0x19, 0x85, 0xd4, 0xe4, 0x01, 0x88, 0xc7, 0x73, 0x93, 0xa3, 0x4d, 0x2c, 0x5b, 0x03, 0x2d, 0x83, 0x84, 0x06, 0xb4, 0x02, 0x2d, 0x57, 0xb0, 0xe0, 0x5c, 0x85, 0x49, 0xca, 0x91, 0x52, 0x77, 0x08, + 0xc4, 0x87, 0x9a, 0x67, 0x41, 0x73, 0xf1, 0x2c, 0x50, 0xe0, 0x31, 0x17, 0x3e, 0x74, 0xfd, 0xc5, 0x5f, 0x62, 0xc2, 0x7f, 0x2e, 0x9c, 0xef, 0x17, 0x13, 0xae, 0xae, 0xfe, 0xfa, 0xa0, 0xfb, 0x43, + 0xec, 0x15, 0xd7, 0xda, 0x85, 0x24, 0x38, 0x78, 0x3b, 0x18, 0xe0, 0xfd, 0x5c, 0x69, 0x1a, 0x3a, 0x16, 0x27, 0xaa, 0x28, 0x58, 0x07, 0xbc, 0x9d, 0x64, 0x6a, 0xb2, 0x27, 0xc6, 0xc9, 0xd0, 0x62, + 0x4c, 0x7f, 0x86, 0x84, 0x20, 0x57, 0x47, 0x54, 0xac, 0xf3, 0x87, 0xac, 0xdc, 0xce, 0x05, 0x18, 0xac, 0x4c, 0xd6, 0x36, 0x4e, 0xe5, 0x46, 0x8f, 0x78, 0x16, 0xc5, 0x58, 0x7c, 0x5a, 0x37, 0x47, + 0xc2, 0xa3, 0xc1, 0xa0, 0x99, 0xa9, 0xc3, 0x6c, 0x12, 0x53, 0xe6, 0xbe, 0x2e, 0x87, 0x34, 0x2d, 0x3e, 0xe3, 0xf4, 0x27, 0xbf, 0xc9, 0x6f, 0x06, 0x6b, 0x6e, 0xf4, 0xf6, 0x05, 0xfd, 0xbc, 0x26, + 0xa1, 0x1a, 0x9d, 0x2d, 0x96, 0x2f, 0x13, 0x27, 0x5f, 0x99, 0xb1, 0x3e, 0xd0, 0xed, 0xc6, 0xcf, 0xaf, 0xb3, 0x3e, 0xb1, 0x36, 0xf0, 0x60, 0xcc, 0x02, 0xb3, 0xc3, 0xc8, 0x0f, 0x47, 0x25, 0x96, + 0xda, 0xa3, 0xf9, 0x69, 0x3f, 0xd9, 0xee, 0x2b, 0x5a, 0xcb, 0x02, 0x45, 0xff, 0x6a, 0x7d, 0x0f, 0xcd, 0xc2, 0x89, 0x8d, 0xc7, 0xab, 0xda, 0x2b, 0x3d, 0x08, 0xde, 0x68, 0x9e, 0xbf, 0xe2, 0x72, + 0xd4, 0xed, 0x26, 0x3d, 0xd1, 0xa3, 0xe1, 0xc1, 0x41, 0x08, 0x7d, 0x38, 0x52, 0xf6, 0x33, 0x68, 0xa4, 0x37, 0x82, 0x12, 0x1e, 0x62, 0x4e, 0xa3, 0xb0, 0xbd, 0x0a, 0xf2, 0xd8, 0xdf, 0x5a, 0x89, + 0x7a, 0xf6, 0x48, 0x0b, 0xdd, 0xf0, 0xb1, 0x02, 0xf8, 0x4a, 0x91, 0xf8, 0x33, 0xc1, 0x33, 0x06, 0x6e, 0x78, 0x56, 0xf0, 0x7a, 0x95, 0x89, 0x6f, 0xa0, 0x43, 0x44, 0xe4, 0xc9, 0x12, 0xa8, 0xcb, + 0x15, 0xcc, 0xe3, 0xc2, 0xc8, 0x8e, 0x34, 0x75, 0x6b, 0x13, 0x9b, 0xc6, 0xc1, 0x38, 0x8e, 0xd6, 0x46, 0x8c, 0xb0, 0xe4, 0xc2, 0xd9, 0x91, 0x71, 0x37, 0x33, 0x6c, 0xc7, 0xf0, 0x49, 0x50, 0xb9, + 0x5e, 0x04, 0x70, 0x7e, 0x28, 0x87, 0xe1, 0xce, 0xde, 0xe0, 0x44, 0xa8, 0x8f, 0x20, 0x0f, 0x99, 0x69, 0xa6, 0x38, 0xdf, 0xe5, 0x59, 0x5e, 0xab, 0x5b, 0xf3, 0x59, 0x54, 0xe0, 0xa7, 0xb1, 0xf1, + 0x86, 0xc4, 0x5f, 0x7a, 0xe0, 0x7e, 0x1c, 0x12, 0x7d, 0xf1, 0xee, 0x93, 0x1d, 0xd2, 0x81, 0x62, 0x3c, 0xca, 0x13, 0x80, 0x7f, 0x62, 0xaf, 0x18, 0xe1, 0x6f, 0x44, 0xdf, 0x31, 0x37, 0xb4, 0xc1, + 0x85, 0xd0, 0x73, 0xdc, 0xb7, 0x93, 0x90, 0x04, 0x17, 0x48, 0x0b, 0x2c, 0x2d, 0x53, 0xc0, 0x62, 0xbf, 0x30, 0x0b, 0x34, 0xdd, 0x29, 0xc0, 0x66, 0xe8, 0x6f, 0x9c, 0x29, 0xb3, 0x93, 0x1a, 0x29, + 0xda, 0xce, 0x4a, 0x43, 0x4e, 0xf7, 0xea, 0xcc, 0x8d, 0xc9, 0x3d, 0x0c, 0xae, 0x53, 0xa4, 0xcc, 0x51, 0x0a, 0x2c, 0xe0, 0x95, 0x15, 0x63, 0xce, 0x6c, 0xbc, 0x9b, 0x6d, 0x37, 0x99, 0x36, 0x19, + 0x31, 0xc3, 0x9c, 0xd7, 0x4f, 0xab, 0xc3, 0xf2, 0x9b, 0x81, 0x82, 0x7d, 0x65, 0xf4, 0x57, 0x8f, 0xcb, 0xfb, 0x53, 0x0f, 0xfc, 0x13, 0x7d, 0x11, 0xb9, 0x8e, 0xee, 0x3b, 0x78, 0xdd, 0xc9, 0xe0, + 0x42, 0xee, 0x39, 0x7e, 0x7a, 0x16, 0x7a, 0x24, 0xa6, 0xad, 0x8b, 0x1d, 0x11, 0x8e, 0xd3, 0x75, 0x42, 0x57, 0x76, 0x23, 0x4c, 0x1d, 0x11, 0x90, 0x62, 0x21, 0x50, 0x5c, 0x62, 0x85, 0x45, 0xa0, + 0xba, 0x34, 0x22, 0xf4, 0x34, 0x46, 0x4c, 0x70, 0x8f, 0x8d, 0x14, 0xe8, 0x00, 0xb6, 0x01, 0x70, 0x74, 0xc6, 0x47, 0x08, 0xc3, 0x17, 0xf6, 0xfc, 0x40, 0x86, 0x31, 0xb7, 0x03, 0xad, 0xd0, 0xd0, + 0x14, 0x59, 0x17, 0x84, 0xe5, 0xfe, 0x56, 0x6e, 0x1f, 0x2d, 0xd5, 0xbf, 0x45, 0xe9, 0x5d, 0x6e, 0xbe, 0x2b, 0xb0, 0xfd, 0xc1, 0xbf, 0xee, 0x17, 0xf0, 0xe7, 0xec, 0x80, 0x6b, 0xd2, 0x17, 0x1e, + 0x7c, 0xb8, 0xd0, 0xd7, 0x0e, 0xf0, 0x86, 0x33, 0xbd, 0x88, 0x7c, 0x7a, 0xa4, 0x86, 0xd6, 0x01, 0x4c, 0x87, 0xb4, 0x1d, 0xc6, 0x6a, 0x00, 0xdb, 0xc8, 0x96, 0x9e, 0xaf, 0x76, 0x99, 0xca, 0x17, + 0x61, 0x03, 0xad, 0x92, 0x65, 0xea, 0x37, 0xce, 0xc4, 0x59, 0x82, 0xc1, 0x4a, 0x08, 0xe0, 0x88, 0x4d, 0xb6, 0xd8, 0xd0, 0x39, 0xa8, 0x59, 0xcd, 0xcd, 0x44, 0x3e, 0x3e, 0xce, 0xdc, 0x30, 0x32, + 0x14, 0x6c, 0xcb, 0x40, 0x3b, 0xba, 0x29, 0x9b, 0x67, 0xb1, 0x6c, 0x7f, 0x64, 0x36, 0xf8, 0xdd, 0x02, 0xe8, 0xbe, 0x36, 0xfa, 0x4a, 0xcc, 0xca, 0x2f, 0xaa, 0x1d, 0x9e, 0x6f, 0xc7, 0xdd, 0x16, + 0x44, 0x8f, 0x98, 0x95, 0x76, 0x45, 0x1f, 0xb6, 0x33, 0xa7, 0x4d, 0x37, 0xeb, 0xbd, 0x68, 0x17, 0xe3, 0x09, 0x81, 0x6e, 0xa4, 0x12, 0x3f, 0xa2, 0x59, 0x83, 0xb1, 0x55, 0x45, 0x57, 0xc2, 0xbe, + 0x12, 0xe3, 0xd8, 0x4e, 0xea, 0x78, 0x41, 0xf1, 0xfb, 0x2d, 0xd0, 0x52, 0xd9, 0x0e, 0xa2, 0x77, 0x71, 0x01, 0xb4, 0xfc, 0xd4, 0x98, 0xf2, 0xa3, 0x12, 0x73, 0x24, 0x34, 0x39, 0x5a, 0x05, 0xee, + 0x1f, 0x27, 0x13, 0x3d, 0x75, 0xa0, 0xfd, 0x33, 0x93, 0xea, 0x8b, 0xfa, 0x03, 0x99, 0xaa, 0x9b, 0x03, 0xb3, 0x49, 0xd4, 0xe8, 0x1d, 0x94, 0xae, 0x82, 0xcd, 0x77, 0x9b, 0xb0, 0xfc, 0xff, 0xfa, + 0x72, 0xc3, 0x7d, 0xe8, 0x20, 0x3d, 0xaf, 0xe4, 0xdf, 0x8f, 0xd0, 0x7c, 0x27, 0xfa, 0xce, 0x0b, 0x37, 0x2f, 0x3a, 0x7b, 0xbf, 0x47, 0x84, 0xe6, 0x9c, 0x1d, 0x47, 0xdc, 0x5e, 0xce, 0x76, 0x13, + 0x72, 0xb6, 0x56, 0xb6, 0x22, 0xda, 0x98, 0xca, 0x76, 0x64, 0x85, 0x2c, 0x3f, 0xb1, 0xf1, 0xe8, 0xc8, 0x85, 0x2b, 0x46, 0xd4, 0xed, 0x7c, 0x65, 0xaa, 0xeb, 0xbc, 0xd8, 0x80, 0x7b, 0x9e, 0x3a, + 0x24, 0x8b, 0x3c, 0x1b, 0xf2, 0x8e, 0xe4, 0x38, 0x92, 0x8d, 0x5b, 0x40, 0x5a, 0xac, 0x88, 0xd2, 0x55, 0x80, 0xcd, 0xbe, 0xf1, 0xa9, 0xa3, 0x6e, 0x2f, 0xa5, 0xf5, 0xd7, 0x95, 0xf9, 0xc3, 0xc7, + 0xf3, 0xeb, 0x4b, 0xaa, 0x5d, 0x37, 0xad, 0xe6, 0xfd, 0x14, 0xb9, 0x83, 0xed, 0x96, 0x99, 0x55, 0x93, 0x55, 0x58, 0x27, 0xa4, 0x31, 0xb6, 0xc2, 0xc5, 0x1c, 0xf3, 0x4c, 0xea, 0x10, 0x10, 0xdf, + 0xdd, 0xfe, 0x3a, 0x9f, 0x0c, 0xe2, 0x7c, 0x50, 0x16, 0xee, 0x17, 0x05, 0xdd, 0xd1, 0x17, 0xb8, 0x79, 0x45, 0x19, 0x1c, 0x5c, 0x9f, 0x77, 0x45, 0xb3, 0x7a, 0xf0, 0x55, 0x5b, 0xae, 0x96, 0x81, + 0x0f, 0x38, 0x24, 0x30, 0x02, 0x49, 0x31, 0x2a, 0xd1, 0x7c, 0xcb, 0x16, 0x73, 0x7c, 0x3c, 0x72, 0xeb, 0xb1, 0x08, 0xae, 0xfc, 0x9c, 0x72, 0x18, 0xd6, 0x1c, 0x97, 0x33, 0x6e, 0x01, 0xf1, 0xce, + 0x69, 0xb9, 0x18, 0x39, 0x6b, 0x16, 0xb7, 0x34, 0xbd, 0x2d, 0x61, 0x42, 0xe3, 0x4b, 0xd5, 0x0b, 0xe4, 0x63, 0x24, 0x04, 0x1e, 0xb4, 0x74, 0xa8, 0x18, 0x49, 0x47, 0x3e, 0x64, 0x6a, 0x5f, 0x7b, + 0xb3, 0xce, 0x27, 0xe1, 0xc3, 0x8d, 0x19, 0xe4, 0xa5, 0x50, 0xc7, 0x37, 0x9a, 0x6f, 0x28, 0x84, 0x71, 0xd4, 0xb1, 0xb9, 0x47, 0x98, 0xa3, 0x44, 0x9f, 0x18, 0x7c, 0x4c, 0xd6, 0x76, 0x64, 0xea, + 0xe3, 0xfd, 0x89, 0xce, 0x60, 0x5f, 0x27, 0x66, 0x71, 0xb8, 0x75, 0xb0, 0xdc, 0x13, 0xb7, 0x44, 0xbc, 0xb3, 0x08, 0x31, 0x5f, 0x64, 0x42, 0x48, 0x53, 0xcd, 0x18, 0xdc, 0x87, 0xee, 0x62, 0x31, + 0x9e, 0x81, 0x21, 0x8b, 0x4e, 0x4a, 0xd1, 0xe2, 0xcc, 0x79, 0x6d, 0x70, 0x93, 0x2a, 0x4b, 0xb7, 0x29, 0xb8, 0xa3, 0xd7, 0x50, 0xb3, 0x34, 0xdb, 0x39, 0xff, 0x6c, 0x8a, 0x79, 0xd6, 0x23, 0xf6, + 0x8b, 0x50, 0x11, 0x27, 0xf6, 0x5d, 0x43, 0xbd, 0x18, 0xc5, 0xe8, 0x55, 0x77, 0xeb, 0xee, 0xff, 0xb4, 0xd2, 0xfe, 0xf5, 0xd3, 0x55, 0x63, 0xee, 0x7b, 0x75, 0x2e, 0xef, 0xb6, 0xe3, 0xf9, 0xb2, + 0x0f, 0x5c, 0x92, 0x17, 0x99, 0x69, 0xfe, 0xcc, 0xcc, 0xb0, 0xfd, 0x30, 0xfb, 0x7d, 0xb8, 0xe1, 0x83, 0xc9, 0x3e, 0xfc, 0x39, 0xba, 0xa6, 0x9d, 0x97, 0x49, 0x12, 0x67, 0x45, 0x3e, 0xd0, 0xe3, + 0x20, 0x7e, 0xbf, 0x67, 0x78, 0xed, 0xf9, 0x2e, 0xe2, 0xf2, 0xd7, 0xb3, 0x6f, 0x76, 0x3f, 0xca, 0xc8, 0x30, 0xad, 0x5c, 0xb5, 0x7e, 0x6f, 0xcd, 0x5f, 0x15, 0x08, 0x2b, 0x93, 0xae, 0xa0, 0x40, + 0x14, 0x17, 0xae, 0xe5, 0xbe, 0xbd, 0x02, 0x76, 0x55, 0x16, 0xf6, 0x17, 0xbc, 0x9f, 0x74, 0xed, 0xdf, 0x12, 0xd9, 0x19, 0xa2, 0x6f, 0xa7, 0xaf, 0xa8, 0xdd, 0xc4, 0xb5, 0xc3, 0xed, 0xd7, 0xbf, + 0x7d, 0xe9, 0x86, 0x8f, 0x13, 0x33, 0xd2, 0xe3, 0x20, 0x30, 0xf5, 0xc2, 0xad, 0xcc, 0xab, 0x8f, 0xba, 0x76, 0x4c, 0x5c, 0xdf, 0xd8, 0x39, 0x28, 0xde, 0x5f, 0xfd, 0xfd, 0x89, 0x4f, 0x87, 0xdd, + 0xb5, 0x47, 0xe2, 0x5d, 0x62, 0xee, 0x2f, 0xf8, 0xc8, 0x0b, 0x23, 0xb1, 0xa3, 0x08, 0x0e, 0x2e, 0x7f, 0x07, 0x1d, 0x8d, 0xe7, 0xa3, 0x70, 0x3a, 0xf7, 0x4e, 0xb2, 0x4c, 0xba, 0x98, 0xe8, 0x58, + 0xee, 0xb6, 0x72, 0x4f, 0xd9, 0x7c, 0x6b, 0x56, 0xa2, 0x28, 0xd1, 0x45, 0x34, 0x4d, 0x8f, 0x96, 0x39, 0x6a, 0x60, 0xd2, 0xb1, 0x67, 0xb9, 0x2e, 0x9e, 0x70, 0x45, 0x5b, 0x6b, 0x56, 0xbc, 0xde, + 0xad, 0x37, 0xa5, 0x2d, 0x6e, 0xdb, 0x49, 0xe1, 0xe0, 0x16, 0xa1, 0xcc, 0x76, 0x87, 0xbd, 0xd0, 0x1e, 0xe9, 0x39, 0x05, 0x8e, 0x8e, 0x25, 0x56, 0xc0, 0xd2, 0x33, 0x9d, 0xe9, 0x0b, 0x6d, 0x36, + 0x7f, 0x93, 0x31, 0xb8, 0x97, 0x6f, 0xfa, 0x2e, 0xb2, 0x4f, 0x7a, 0x9f, 0xbc, 0x16, 0xd4, 0x71, 0xaf, 0xf7, 0x49, 0xaf, 0x70, 0x8e, 0xc2, 0xd8, 0xed, 0xd1, 0xe9, 0x42, 0xc9, 0xdc, 0xd5, 0x31, + 0xb4, 0xb8, 0x85, 0x15, 0xc4, 0x34, 0x31, 0x0a, 0x0e, 0x65, 0x05, 0xfd, 0xe3, 0x8a, 0xe5, 0x5d, 0x78, 0xbe, 0x58, 0xdc, 0xe1, 0x17, 0xf2, 0x79, 0x7e, 0x2f, 0xee, 0x70, 0x9f, 0xbc, 0x1d, 0x7c, + 0x1e, 0x9c, 0x4a, 0x4d, 0x5c, 0x2b, 0x0b, 0x74, 0x85, 0xa8, 0x20, 0x77, 0x98, 0x92, 0x81, 0x39, 0x73, 0xbc, 0x53, 0x3a, 0x8c, 0x1b, 0x9b, 0x6e, 0xd5, 0xe9, 0x7e, 0xdc, 0xca, 0x52, 0xa5, 0xaf, + 0xf3, 0x2a, 0x3e, 0xa8, 0xf4, 0x2a, 0x05, 0xf3, 0x61, 0x23, 0x2d, 0x71, 0x50, 0x92, 0x36, 0x78, 0x71, 0x1a, 0xed, 0xc6, 0x0d, 0xc9, 0x17, 0x74, 0x24, 0xf0, 0x60, 0x21, 0x15, 0x73, 0xf4, 0xb8, + 0x13, 0x83, 0x07, 0xb3, 0xfe, 0x37, 0x81, 0xf9, 0xd2, 0x47, 0x78, 0x3d, 0xa7, 0xf6, 0x05, 0xe7, 0xd6, 0x47, 0xd8, 0x51, 0x79, 0x0e, 0x52, 0xae, 0x96, 0x2a, 0x65, 0x81, 0x1b, 0xc5, 0x38, 0xd8, + 0xd9, 0x5a, 0xe4, 0x64, 0x7a, 0x57, 0x24, 0x92, 0x0a, 0xbb, 0x3b, 0x97, 0xd1, 0x55, 0x53, 0x73, 0x99, 0x2d, 0x3c, 0x59, 0x19, 0xc9, 0x36, 0x38, 0xd2, 0x48, 0x30, 0xad, 0xcc, 0x66, 0x6b, 0x48, + 0xc3, 0x61, 0x1e, 0x6d, 0xe6, 0x2d, 0x33, 0xda, 0x9e, 0x92, 0xd2, 0x48, 0xb5, 0xe9, 0x12, 0x4a, 0xa5, 0xb9, 0xc5, 0xab, 0x39, 0x6d, 0xb4, 0x1c, 0xb5, 0x78, 0x36, 0x28, 0x7b, 0xf9, 0x08, 0x5f, + 0x15, 0xba, 0x4f, 0x2b, 0xd0, 0x7d, 0x8c, 0x87, 0x2f, 0x8c, 0xcc, 0x6b, 0xd2, 0x67, 0xac, 0xaf, 0x2e, 0x0c, 0x3a, 0xaa, 0xcf, 0x31, 0xdf, 0x7a, 0x07, 0xaf, 0x36, 0xa4, 0x65, 0x81, 0x41, 0x04, + 0xbb, 0x74, 0xc9, 0x74, 0x2a, 0x61, 0xf1, 0x9e, 0xc9, 0xed, 0x3d, 0x32, 0x4b, 0xc9, 0xc5, 0x29, 0x47, 0x36, 0x89, 0x1f, 0x62, 0xea, 0x56, 0xd6, 0xbc, 0x10, 0x50, 0x66, 0xc7, 0x99, 0x7e, 0xc4, + 0x04, 0x6b, 0xce, 0x89, 0x19, 0x56, 0xb2, 0x9c, 0x12, 0xaa, 0x90, 0xd9, 0x62, 0xd6, 0x30, 0xb0, 0xd7, 0x99, 0x3f, 0x81, 0x54, 0x09, 0xda, 0xb2, 0x7f, 0xa3, 0xf1, 0xe7, 0x87, 0x49, 0xec, 0xd5, + 0x56, 0x79, 0xfd, 0x66, 0x88, 0xe4, 0xcb, 0xba, 0xdb, 0xdf, 0x67, 0xc7, 0x99, 0x62, 0xa7, 0x0c, 0x26, 0x45, 0xaf, 0x9a, 0x23, 0xf0, 0x40, 0x33, 0x20, 0xa7, 0x12, 0xe2, 0x66, 0x2b, 0x95, 0x82, + 0x1e, 0xa1, 0x07, 0xc7, 0x72, 0x43, 0x02, 0x95, 0x97, 0x38, 0xf0, 0xc4, 0xf1, 0xf9, 0x45, 0x20, 0x87, 0xa6, 0x65, 0xdd, 0xfd, 0x7f, 0xf5, 0x09, 0x22, 0x7c, 0x03, 0xe1, 0x4d, 0x03, 0x49, 0x8a, + 0xef, 0xab, 0x1f, 0x7d, 0xec, 0xca, 0x28, 0xce, 0x42, 0x35, 0x70, 0x4f, 0x5f, 0xfa, 0xce, 0x5f, 0x5b, 0x9c, 0xae, 0x49, 0x77, 0xe8, 0x7f, 0xbc, 0xd0, 0x67, 0xa1, 0xea, 0xe6, 0x66, 0x53, 0xc9, + 0x87, 0xeb, 0x1c, 0x3d, 0x16, 0x53, 0x37, 0xa7, 0x8f, 0xc9, 0x58, 0x40, 0x16, 0xfb, 0x96, 0x30, 0x52, 0x3f, 0x59, 0xb8, 0xd8, 0xe4, 0x20, 0x9c, 0xd0, 0x85, 0x9a, 0xba, 0x33, 0xdc, 0x3c, 0x95, + 0x1a, 0x34, 0x84, 0x91, 0x99, 0x70, 0x2a, 0xa4, 0x7d, 0xbd, 0x9f, 0xe0, 0x53, 0x7c, 0xc9, 0x68, 0x5b, 0x5f, 0x46, 0x36, 0x91, 0x06, 0x86, 0x14, 0x76, 0x94, 0x63, 0x6f, 0xba, 0xab, 0xf5, 0x7a, + 0xfd, 0x4c, 0x23, 0xff, 0x53, 0xfb, 0xa8, 0xbf, 0x3f, 0xf9, 0xa2, 0xba, 0xdd, 0x43, 0x17, 0xfb, 0x39, 0x7c, 0x61, 0x12, 0xbf, 0xa2, 0x7c, 0x05, 0x6e, 0x99, 0x05, 0x83, 0x8e, 0xe6, 0x73, 0x6c, + 0xc7, 0x7b, 0x65, 0x3a, 0xdf, 0xd1, 0x5b, 0x83, 0xcb, 0x2c, 0x31, 0x59, 0xd8, 0x04, 0x00, 0x2f, 0xb9, 0xa5, 0x3d, 0x46, 0x27, 0xf8, 0x69, 0x06, 0xa9, 0x12, 0x7b, 0x98, 0xfb, 0x35, 0x7c, 0x9c, + 0xd7, 0x15, 0x8f, 0x09, 0x81, 0xd2, 0xd6, 0x7b, 0x5c, 0x5d, 0xdb, 0x43, 0xde, 0x82, 0xc8, 0x04, 0xdc, 0xd8, 0xba, 0x26, 0xd4, 0xd8, 0x9a, 0x6b, 0x2a, 0xf6, 0x28, 0xb1, 0x66, 0x69, 0xd7, 0xec, + 0x54, 0x82, 0xc8, 0xbf, 0x89, 0x6d, 0x9f, 0xb0, 0xb1, 0xb7, 0x8c, 0x73, 0x35, 0xcf, 0x5d, 0xfb, 0x91, 0xe1, 0x88, 0xbd, 0x54, 0x03, 0xeb, 0x8a, 0x32, 0x38, 0xb8, 0x3e, 0xef, 0x02, 0x96, 0x9f, + 0x56, 0xc2, 0x5a, 0x6e, 0xc3, 0xa2, 0x19, 0x2a, 0xb2, 0x43, 0x80, 0xa4, 0xb4, 0xae, 0xf6, 0xdb, 0x3c, 0x5b, 0x56, 0xa3, 0x1c, 0x99, 0x2e, 0xd8, 0xfe, 0xbe, 0xe7, 0xde, 0x12, 0xf6, 0xf6, 0x82, + 0x6e, 0x94, 0x27, 0x5f, 0x56, 0xa4, 0x7c, 0x25, 0x22, 0xe4, 0x9a, 0xf6, 0x6f, 0x34, 0xde, 0x2e, 0x0c, 0x2e, 0x64, 0x9f, 0x8b, 0x19, 0x1d, 0x23, 0x27, 0x02, 0xd2, 0x0e, 0xcb, 0x6a, 0x15, 0xc4, + 0x34, 0x20, 0x9f, 0x76, 0x61, 0xa2, 0x1c, 0xb6, 0x26, 0x31, 0x02, 0x52, 0x52, 0x08, 0x27, 0x7b, 0x46, 0xa1, 0x8e, 0x76, 0x33, 0xd6, 0x4b, 0x80, 0xa1, 0x32, 0x09, 0x51, 0x28, 0x1a, 0x44, 0x0b, + 0xb6, 0x05, 0x6c, 0x49, 0x53, 0x66, 0xe2, 0x61, 0x91, 0x23, 0x2c, 0x21, 0x1b, 0x0d, 0xaf, 0xf1, 0xce, 0x48, 0x22, 0x0b, 0x37, 0x1c, 0xcb, 0xd0, 0x95, 0x27, 0xfa, 0xd5, 0x6d, 0xdc, 0xde, 0xd9, + 0x10, 0xef, 0x5f, 0xfe, 0xd5, 0xa6, 0xdc, 0xf7, 0x5d, 0x36, 0xbf, 0xa8, 0x7e, 0xc0, 0xf6, 0xb2, 0x31, 0xd7, 0xc3, 0x55, 0x83, 0xea, 0x2d, 0x95, 0xb7, 0xb4, 0x5d, 0x84, 0xee, 0x68, 0x39, 0xa2, + 0x2c, 0x41, 0x58, 0x22, 0x6b, 0x2a, 0xc1, 0x05, 0x06, 0x09, 0xea, 0xaa, 0xd0, 0x6c, 0x28, 0x81, 0x76, 0xb0, 0x09, 0xed, 0x2a, 0x31, 0x9d, 0x0f, 0x75, 0x73, 0xd1, 0x00, 0x0c, 0x62, 0x58, 0x82, + 0x17, 0xc2, 0x1a, 0x43, 0xb1, 0x87, 0xe9, 0x7c, 0x46, 0x91, 0xdb, 0xaa, 0x05, 0x62, 0x42, 0xc7, 0xd5, 0xd1, 0xa1, 0xf4, 0x78, 0xc3, 0x78, 0x5d, 0x37, 0x78, 0x92, 0xcd, 0x65, 0x98, 0x96, 0x1b, + 0x99, 0x83, 0x24, 0x8b, 0x13, 0x33, 0x2b, 0x2e, 0xff, 0x7d, 0x71, 0x18, 0xfc, 0x2f, 0x93, 0x51, 0xfd, 0xc6, 0xa1, 0x2f, 0x03, 0x8e, 0xfe, 0xc6, 0x9c, 0xf3, 0x16, 0x6d, 0xf4, 0xe1, 0xac, 0x6f, + 0xb5, 0x57, 0xae, 0x24, 0x67, 0xc2, 0x9e, 0xdf, 0xb3, 0x59, 0xb0, 0x94, 0x78, 0x8b, 0x66, 0x4e, 0x14, 0xae, 0x25, 0x9b, 0x12, 0x2d, 0xe4, 0x02, 0x6d, 0x2a, 0x8f, 0x33, 0x76, 0xcb, 0x2d, 0x30, + 0x37, 0x45, 0x28, 0xe0, 0x34, 0x8c, 0x21, 0x8e, 0xbb, 0x11, 0x34, 0x55, 0xa9, 0xc6, 0x29, 0x39, 0xbb, 0x14, 0x10, 0x69, 0x01, 0x2c, 0x3c, 0xbf, 0x65, 0x6b, 0xfe, 0x94, 0x73, 0x43, 0xc5, 0x2f, + 0x96, 0xa1, 0xe5, 0xac, 0x5f, 0x2e, 0xc2, 0xf3, 0x0c, 0xc0, 0x9f, 0x4f, 0xa7, 0xed, 0xef, 0xef, 0x6e, 0x5f, 0x51, 0xfe, 0x05, 0xe2, 0xcf, 0x0f, 0xd3, 0x76, 0x8f, 0x88, 0x51, 0xb7, 0x11, 0x91, + 0xf5, 0x50, 0xa4, 0xa5, 0x9c, 0x4c, 0x5a, 0x77, 0xbf, 0x91, 0x99, 0xf0, 0x08, 0x20, 0x33, 0x3a, 0x91, 0x24, 0x73, 0xb8, 0x74, 0x51, 0x16, 0xb0, 0x30, 0x13, 0x50, 0x57, 0x73, 0x92, 0x56, 0xe3, + 0xa1, 0x1a, 0xce, 0x77, 0x47, 0x7c, 0x05, 0xf1, 0x3c, 0xae, 0x83, 0xeb, 0x3d, 0x31, 0x31, 0xb1, 0x51, 0x59, 0x4c, 0x1b, 0x64, 0xb1, 0x26, 0xc6, 0x4e, 0xb3, 0x98, 0xe0, 0x92, 0x10, 0x32, 0xe5, + 0xcb, 0x39, 0x5f, 0x50, 0xdf, 0xd1, 0xf3, 0xe1, 0xb6, 0x7b, 0x89, 0xb5, 0x57, 0x3e, 0xb7, 0x6b, 0x11, 0xfe, 0x3b, 0x4d, 0x86, 0xff, 0x13, 0xe3, 0x2f, 0x1a, 0x44, 0x66, 0x31, 0x08, 0xdc, 0xbc, + 0x30, 0x1f, 0x89, 0xcf, 0x6b, 0xc1, 0x11, 0x57, 0x94, 0xcf, 0xe2, 0xf3, 0xf1, 0xbc, 0x4f, 0xa0, 0x44, 0xb7, 0x3b, 0x05, 0xd3, 0x3b, 0xb9, 0x25, 0x72, 0x70, 0x17, 0xe8, 0x93, 0x8a, 0xda, 0xd7, + 0x8c, 0x24, 0x84, 0x3e, 0x4f, 0xb1, 0x46, 0x83, 0x31, 0x42, 0xb9, 0xac, 0x82, 0x78, 0x1a, 0x6d, 0xe5, 0x15, 0xb2, 0x36, 0x26, 0x93, 0x29, 0xac, 0xe6, 0x32, 0x46, 0x17, 0x96, 0x23, 0xd5, 0x26, + 0xba, 0x3f, 0xfa, 0xd1, 0x5a, 0xf5, 0x49, 0x51, 0xa1, 0x22, 0xed, 0xe4, 0x14, 0xc8, 0xd2, 0xab, 0x51, 0x16, 0x9e, 0xa5, 0xf3, 0xef, 0x54, 0xe4, 0x1f, 0xff, 0xc4, 0x7e, 0x42, 0x3f, 0xfe, 0xc7, + 0xff, 0xf8, 0xf1, 0x2f, 0xe2, 0xe7, 0xb8, 0xdf, 0x80, 0xbc, 0xb4, 0x3b, 0xb9, 0x0f, 0xe4, 0x2b, 0xad, 0xae, 0xce, 0x04, 0x3b, 0xfc, 0x74, 0x73, 0x00, 0x3f, 0x6f, 0x75, 0x05, 0x0f, 0x8e, 0x54, + 0xae, 0x26, 0xe8, 0xf1, 0x48, 0xef, 0xf3, 0x1d, 0x9f, 0xcf, 0xc7, 0xd1, 0x7c, 0x8a, 0x8f, 0x86, 0xa8, 0xa4, 0x8e, 0xef, 0xa7, 0xac, 0xf5, 0x18, 0x4a, 0xdf, 0xeb, 0xd4, 0x12, 0x57, 0x66, 0x16, + 0xc4, 0xaa, 0x71, 0x1e, 0x5b, 0x85, 0xf9, 0x75, 0x41, 0x4c, 0xe4, 0x95, 0xc9, 0xfd, 0x33, 0xfd, 0x33, 0x40, 0x9f, 0xaf, 0x76, 0x3b, 0x6f, 0x3d, 0x26, 0x7b, 0x75, 0xc9, 0xdb, 0xe9, 0x48, 0xb2, + 0x03, 0xc3, 0x9f, 0xac, 0xc7, 0x7a, 0x32, 0xf4, 0x7c, 0x12, 0x0c, 0x2d, 0x8e, 0x2c, 0x5d, 0x1f, 0xe2, 0x94, 0xea, 0xa0, 0x4e, 0x82, 0x64, 0xe5, 0x08, 0x22, 0x60, 0x99, 0x49, 0x8a, 0xd6, 0x32, + 0x19, 0xc6, 0xdb, 0x5d, 0xb2, 0xf2, 0xac, 0x05, 0x4e, 0xca, 0xc3, 0xba, 0x16, 0xe3, 0x45, 0xbc, 0xdf, 0xe4, 0xb8, 0xb9, 0xd9, 0xd4, 0x96, 0xe5, 0xc0, 0x29, 0x16, 0x01, 0x3d, 0xe3, 0x20, 0xd5, + 0xb2, 0x88, 0x75, 0x35, 0x8a, 0xde, 0x36, 0x3b, 0xb1, 0xab, 0xfc, 0xac, 0xae, 0xc3, 0xff, 0xef, 0xc0, 0xe4, 0xf7, 0x86, 0x96, 0xcf, 0x59, 0x70, 0xd3, 0xcf, 0xff, 0xd1, 0xb0, 0xfe, 0xbe, 0x34, + 0x7e, 0x24, 0x0c, 0x0e, 0xae, 0x4e, 0xfb, 0x76, 0x88, 0xc8, 0x47, 0xa8, 0xd4, 0xf0, 0x0a, 0x76, 0x4a, 0x0a, 0xd8, 0x34, 0x14, 0x59, 0x39, 0x55, 0x4e, 0x3a, 0x57, 0xf1, 0xb2, 0xda, 0xea, 0x70, + 0x55, 0xef, 0x55, 0x88, 0x81, 0x26, 0x46, 0xb1, 0x54, 0xec, 0x2d, 0x4b, 0xae, 0xbc, 0xf1, 0x52, 0x33, 0x35, 0x1a, 0x58, 0xf9, 0x36, 0xa3, 0xe8, 0x63, 0x07, 0x98, 0x40, 0xc3, 0x0d, 0x43, 0xaf, + 0x79, 0x31, 0xc0, 0x54, 0x6f, 0x01, 0x4f, 0x42, 0x2e, 0x3b, 0x28, 0xb7, 0x59, 0x04, 0xdf, 0xb5, 0x90, 0xfa, 0xc4, 0x45, 0xdc, 0xe4, 0xf0, 0xdc, 0xc3, 0x14, 0x7f, 0xc9, 0xb1, 0xf5, 0x91, 0xf0, + 0x19, 0xd3, 0x0f, 0xa7, 0x03, 0xbc, 0x9f, 0x53, 0xcb, 0x47, 0x35, 0x23, 0x44, 0x22, 0x64, 0x58, 0xf8, 0x6d, 0xa3, 0x7b, 0x02, 0x73, 0x9a, 0x0c, 0x1b, 0xc2, 0xb7, 0x0e, 0x4d, 0xc0, 0x1a, 0x76, + 0xae, 0x6d, 0x32, 0x68, 0xe1, 0x2b, 0x7a, 0x4d, 0xe7, 0xeb, 0x44, 0x53, 0x71, 0x7d, 0xe2, 0xa5, 0xd3, 0x02, 0x66, 0x02, 0x7d, 0xea, 0x30, 0xb3, 0xaa, 0xa1, 0x97, 0xba, 0x38, 0x81, 0xe7, 0x07, + 0xb6, 0xac, 0x63, 0xd7, 0x53, 0x10, 0xbc, 0x31, 0x9b, 0x21, 0xfb, 0xcc, 0x91, 0xf8, 0x45, 0x39, 0xc9, 0xf8, 0xb2, 0xf9, 0x35, 0xbe, 0x0a, 0x28, 0xeb, 0x10, 0xb9, 0x7c, 0xfd, 0x40, 0x2d, 0x0b, + 0x67, 0x50, 0xc4, 0xbe, 0xf9, 0x2e, 0xf6, 0x9f, 0xf2, 0x33, 0xde, 0x6e, 0x7c, 0x5b, 0xed, 0xfe, 0x35, 0xbc, 0xbd, 0xe3, 0x2a, 0x74, 0x15, 0x79, 0xc1, 0x6d, 0xd6, 0xc7, 0x2a, 0xbe, 0x62, 0x4d, + 0x7f, 0x27, 0xf2, 0xff, 0x0e, 0x34, 0xfd, 0x46, 0xa0, 0xe9, 0x5b, 0x4f, 0xde, 0xfb, 0x73, 0x14, 0xf4, 0x13, 0xfe, 0xfe, 0x02, 0x71, 0xa6, 0xd8, 0x0d, 0x24, 0x3f, 0xbe, 0xb8, 0x26, 0x7b, 0xac, + 0x01, 0x98, 0xb3, 0x9e, 0x10, 0x9b, 0x16, 0x3b, 0x29, 0xba, 0x39, 0xcc, 0xb1, 0xd6, 0x18, 0x4b, 0xa7, 0x38, 0x49, 0xeb, 0x43, 0x05, 0xb6, 0x0b, 0xce, 0x39, 0xc0, 0x93, 0x80, 0xe0, 0xc4, 0x70, + 0x9a, 0xc2, 0x23, 0x1c, 0xa5, 0x4d, 0x06, 0x01, 0x66, 0xf5, 0x41, 0xac, 0x80, 0xc0, 0x5c, 0x98, 0x6b, 0x18, 0xa5, 0x22, 0x07, 0xa9, 0x2d, 0x2d, 0x8d, 0xeb, 0xc3, 0x46, 0x9a, 0x2e, 0x79, 0xe8, + 0x84, 0x15, 0xaa, 0xfc, 0x75, 0xf4, 0xc5, 0xa5, 0x1a, 0x5a, 0x57, 0x92, 0x23, 0x0e, 0xca, 0xe2, 0xcf, 0x86, 0x5a, 0xdd, 0x12, 0xef, 0xf0, 0xb8, 0xbe, 0xd4, 0x27, 0xdc, 0x0a, 0x1e, 0xcc, 0xa1, + 0x52, 0x50, 0x69, 0xee, 0xc0, 0x6d, 0x00, 0xc2, 0xcc, 0x87, 0xd9, 0x58, 0x4c, 0xd4, 0xc8, 0x29, 0x74, 0x09, 0x26, 0xfe, 0xd6, 0x94, 0xdb, 0xdb, 0x1d, 0xd3, 0xbd, 0xf6, 0x7b, 0xc6, 0xf8, 0x23, + 0x80, 0xbe, 0xbf, 0x8b, 0xfa, 0x9b, 0xec, 0x3b, 0x34, 0xdd, 0x49, 0xdf, 0xe2, 0x4d, 0x6b, 0x6a, 0x75, 0xda, 0x1c, 0x66, 0xb3, 0xd9, 0x66, 0x07, 0xb4, 0x18, 0x71, 0x1a, 0xa3, 0x24, 0x34, 0x33, + 0xa0, 0x56, 0xd2, 0x88, 0x84, 0x9c, 0xb4, 0x8b, 0x63, 0x0c, 0xfa, 0x43, 0x59, 0x36, 0x64, 0x3b, 0x91, 0x11, 0x10, 0x99, 0xe5, 0x7c, 0xee, 0xe7, 0xab, 0x2c, 0x1d, 0x05, 0x3c, 0xdd, 0x64, 0x6d, + 0x76, 0xe0, 0x23, 0xd8, 0xf4, 0x16, 0x78, 0x4c, 0x26, 0x84, 0xea, 0x54, 0xfc, 0x72, 0x4b, 0x11, 0x8f, 0x9a, 0x88, 0x7f, 0x81, 0x8d, 0xab, 0xc7, 0x5f, 0x45, 0x94, 0x21, 0x2f, 0x4d, 0x44, 0xbf, + 0xa8, 0x9e, 0x91, 0x79, 0x3f, 0x1e, 0x20, 0xfd, 0xa6, 0xa3, 0x40, 0x86, 0xb7, 0xe0, 0xc6, 0x5d, 0x2d, 0xa6, 0xc8, 0x89, 0xaf, 0xc0, 0x13, 0x3a, 0x86, 0x8f, 0xbc, 0x48, 0x01, 0x0a, 0x84, 0x68, + 0x53, 0x3b, 0x9f, 0x5b, 0x55, 0x13, 0x4b, 0x92, 0x85, 0x3b, 0x23, 0xbf, 0x1a, 0xc7, 0xc0, 0x31, 0xcc, 0xc3, 0x93, 0x9c, 0x66, 0x64, 0x2d, 0xe3, 0x68, 0xce, 0xd9, 0x7c, 0x33, 0xc3, 0x9a, 0x99, + 0x91, 0x42, 0xc7, 0x76, 0x1f, 0x49, 0x16, 0x63, 0x4e, 0x32, 0xa1, 0x92, 0x9f, 0x4d, 0x47, 0xcf, 0xa6, 0xfa, 0x0f, 0x81, 0x8f, 0xbf, 0xfe, 0xe7, 0x55, 0xe3, 0xca, 0x8b, 0xa3, 0x5c, 0x77, 0x02, + 0x37, 0xf2, 0xcd, 0xac, 0xe8, 0x23, 0xbf, 0x6e, 0xf4, 0x68, 0x7e, 0xc3, 0x7f, 0xc2, 0xe8, 0x0b, 0x5b, 0xb1, 0x67, 0x8a, 0x1d, 0x6b, 0xa2, 0x78, 0x70, 0x21, 0xf1, 0x9c, 0x2d, 0xc5, 0xaa, 0xc5, + 0xd3, 0x83, 0xed, 0x3b, 0x63, 0xb6, 0xe6, 0xec, 0x54, 0x82, 0xc1, 0x58, 0x76, 0x51, 0xd3, 0xb1, 0x02, 0x44, 0x1e, 0xd3, 0x50, 0x49, 0xb7, 0xb3, 0x19, 0x9b, 0x4f, 0xcc, 0x11, 0xc6, 0xb8, 0xd1, + 0x4c, 0x58, 0x7a, 0x06, 0x9b, 0xb1, 0x5b, 0xea, 0x98, 0xe8, 0xca, 0x26, 0xd9, 0xb8, 0xba, 0x8d, 0x1e, 0x0e, 0xe8, 0xd0, 0x00, 0x17, 0xeb, 0xad, 0x12, 0xc6, 0xd8, 0xd6, 0xde, 0x23, 0x92, 0xdf, + 0x33, 0x74, 0xb5, 0xcb, 0xdd, 0xcc, 0x4c, 0xe3, 0xbd, 0xec, 0x10, 0x7a, 0xbb, 0x96, 0x77, 0x37, 0xe4, 0xaa, 0x65, 0xbe, 0xa5, 0x62, 0xba, 0xd6, 0x25, 0xf8, 0x05, 0xf9, 0x09, 0x7d, 0xa8, 0xf9, + 0xd4, 0x37, 0x07, 0xd7, 0x0a, 0xd4, 0x22, 0x2f, 0x2e, 0xaa, 0x41, 0x37, 0xc5, 0x5d, 0x79, 0xcd, 0x3a, 0xd4, 0xf2, 0xc2, 0x18, 0xe4, 0x66, 0xe6, 0x76, 0xee, 0xfd, 0xb7, 0x9a, 0xd7, 0x9f, 0xc2, + 0x61, 0xd2, 0xd2, 0xd5, 0xfd, 0x81, 0x15, 0x67, 0xa1, 0x5a, 0x0c, 0xca, 0xc8, 0xcc, 0x75, 0x35, 0xb9, 0xf0, 0xa6, 0xd3, 0x57, 0xae, 0x9b, 0xe7, 0xc5, 0x91, 0xab, 0x0f, 0xb4, 0x38, 0x0e, 0xff, + 0xfa, 0xaf, 0x8f, 0x2b, 0xcc, 0x7c, 0x5a, 0x35, 0xdf, 0x64, 0xa3, 0x7f, 0x07, 0x91, 0x07, 0x6f, 0x7f, 0x4f, 0xb8, 0xd0, 0x97, 0x52, 0x16, 0xef, 0x3d, 0xe0, 0x5d, 0xd6, 0x6e, 0x2e, 0x77, 0xa1, + 0x27, 0x3d, 0x66, 0x84, 0x59, 0x2a, 0x61, 0x49, 0x4d, 0x6d, 0xb2, 0x02, 0x65, 0x4b, 0x9e, 0x24, 0xf7, 0x13, 0x76, 0x0f, 0x89, 0xfe, 0xd0, 0xdf, 0x81, 0xb2, 0x3e, 0x65, 0x87, 0x16, 0xb7, 0x99, + 0x9d, 0xec, 0x29, 0x8f, 0x9c, 0x56, 0x43, 0xda, 0x92, 0xa0, 0x4a, 0x73, 0xe9, 0x31, 0xad, 0xad, 0xec, 0x20, 0x6a, 0xcd, 0x6d, 0xce, 0x8d, 0x71, 0xe6, 0x14, 0xa9, 0x26, 0xce, 0x1e, 0x29, 0x6c, + 0x94, 0x28, 0x93, 0xa1, 0x5a, 0x89, 0xd9, 0xd7, 0x01, 0x70, 0x49, 0xd6, 0x09, 0xe3, 0xe0, 0xfc, 0xa1, 0x0f, 0xa7, 0xc6, 0x57, 0x76, 0xe0, 0x3e, 0x12, 0x3e, 0xc3, 0xf2, 0xe1, 0xb4, 0x5f, 0xd8, + 0x23, 0x2e, 0x6c, 0xa1, 0x0a, 0x97, 0x52, 0x6f, 0x12, 0x41, 0x34, 0x07, 0xee, 0x49, 0xc3, 0x98, 0xc4, 0x84, 0xad, 0x20, 0x2b, 0xfd, 0x6f, 0x4d, 0x71, 0x7d, 0x7c, 0x13, 0x49, 0x66, 0x16, 0x45, + 0x3b, 0xd0, 0xda, 0xc2, 0x7c, 0x24, 0x34, 0xc3, 0x97, 0x52, 0x40, 0x3e, 0x12, 0xbe, 0xa0, 0xf2, 0xeb, 0x74, 0x30, 0xec, 0x97, 0x12, 0x32, 0x9f, 0xd7, 0x10, 0x3a, 0x16, 0xc3, 0x6c, 0x92, 0xce, + 0x19, 0x22, 0x54, 0xc1, 0x11, 0xbf, 0x46, 0x73, 0xea, 0x04, 0x1e, 0xda, 0xc2, 0x28, 0x56, 0x19, 0x84, 0x61, 0xe0, 0x76, 0xbf, 0x2a, 0x68, 0xa8, 0x66, 0xc6, 0x81, 0x36, 0xf6, 0xd6, 0xe9, 0xb8, + 0x58, 0xb5, 0xcb, 0x66, 0x5f, 0x17, 0xdb, 0x15, 0x5d, 0xab, 0x19, 0x32, 0x49, 0x0b, 0x97, 0xc4, 0xdc, 0xe9, 0x51, 0xa8, 0xe3, 0xf1, 0x6a, 0xed, 0x9f, 0xbe, 0xe5, 0xea, 0xf9, 0x83, 0x2b, 0xc4, + 0x37, 0x33, 0xd9, 0x92, 0x2c, 0xd6, 0xcd, 0x3c, 0x1f, 0x44, 0x66, 0x53, 0x9c, 0x67, 0x1c, 0x35, 0xb3, 0x1f, 0xb1, 0x07, 0x79, 0x4d, 0x17, 0xbc, 0xf3, 0x80, 0x8e, 0x4d, 0x9f, 0x2f, 0x77, 0x42, + 0xdc, 0x43, 0x5d, 0x46, 0xe3, 0x72, 0xcf, 0x27, 0x5b, 0xa7, 0xb0, 0x33, 0x8d, 0x57, 0xe1, 0xd1, 0x6a, 0x04, 0x94, 0x0d, 0x2f, 0x26, 0x4b, 0x51, 0x3e, 0xaa, 0x8b, 0xcd, 0x08, 0x24, 0x9d, 0x78, + 0x87, 0x02, 0x24, 0x00, 0xc2, 0xe6, 0x38, 0xf7, 0xb3, 0x93, 0x19, 0x2c, 0x5c, 0xd0, 0x90, 0x4e, 0x33, 0xb9, 0xad, 0xb4, 0xa6, 0xd4, 0x66, 0x73, 0xfc, 0x18, 0x21, 0x6d, 0x92, 0xeb, 0x22, 0xe3, + 0x32, 0xab, 0xf9, 0x3c, 0x82, 0xd5, 0x07, 0x19, 0x3c, 0x5f, 0x22, 0x67, 0x67, 0x66, 0xfe, 0x15, 0x5a, 0x2f, 0xac, 0xae, 0x6f, 0x44, 0x2f, 0x08, 0x75, 0x87, 0x1d, 0x2a, 0x3d, 0x16, 0xd9, 0xd1, + 0xc6, 0xa5, 0x8b, 0x75, 0x10, 0x0c, 0xd7, 0x46, 0xc4, 0x2c, 0xd9, 0x1a, 0x86, 0xa0, 0x25, 0x40, 0x34, 0x2b, 0x69, 0x37, 0xb4, 0x8f, 0xc8, 0xb6, 0x3e, 0xca, 0xbe, 0x88, 0xbb, 0xab, 0x4a, 0x85, + 0x34, 0xc9, 0x2d, 0x14, 0x46, 0x05, 0x25, 0x36, 0x13, 0x34, 0x23, 0xb4, 0xd1, 0x0c, 0x91, 0x22, 0xd5, 0x35, 0x4e, 0xe3, 0x6d, 0x19, 0x1a, 0xd0, 0x61, 0xa3, 0xb2, 0x99, 0x12, 0xcc, 0xc7, 0x87, + 0x71, 0xfe, 0x9d, 0x5d, 0x83, 0x4b, 0xd1, 0x8a, 0x5e, 0x22, 0x17, 0x0e, 0xf4, 0xc0, 0x35, 0x1f, 0x37, 0x9c, 0x7c, 0xad, 0x89, 0xc9, 0x07, 0xc2, 0x17, 0xfc, 0xde, 0xcf, 0x06, 0x70, 0xcf, 0x6e, + 0x26, 0x74, 0x23, 0x92, 0x99, 0x86, 0x5b, 0x3e, 0x1f, 0x15, 0x5b, 0x3a, 0xde, 0x2d, 0xaa, 0x0a, 0x4b, 0x0d, 0x70, 0xe2, 0xc7, 0x99, 0x17, 0xb8, 0x6e, 0xc9, 0x23, 0xa5, 0x70, 0x9c, 0x22, 0xcc, + 0x14, 0x1e, 0xb1, 0x7b, 0x91, 0x91, 0x8b, 0xe2, 0x68, 0x50, 0xb1, 0x24, 0x81, 0x55, 0xc3, 0x3b, 0x5b, 0xc3, 0x8f, 0x67, 0xd3, 0x19, 0x3b, 0x9e, 0x4c, 0x68, 0x28, 0xf1, 0x90, 0x80, 0x58, 0x10, + 0xbe, 0x59, 0xe1, 0x3d, 0x8b, 0x4c, 0x14, 0x86, 0x6b, 0x9b, 0x6f, 0x49, 0xc9, 0xd0, 0x4b, 0x7e, 0xfc, 0x5e, 0x49, 0xc9, 0x49, 0x16, 0x37, 0xed, 0x40, 0x35, 0x8c, 0x47, 0xfe, 0x83, 0xd7, 0x22, + 0xb4, 0x7f, 0x93, 0xbd, 0x40, 0xff, 0x76, 0xd2, 0x37, 0x4e, 0x3b, 0x08, 0xb6, 0x39, 0xbb, 0x16, 0xf6, 0xd4, 0x7e, 0x23, 0x62, 0x98, 0x67, 0x64, 0x7b, 0x90, 0x47, 0x47, 0x69, 0x10, 0xb9, 0x96, + 0x5b, 0x50, 0x1b, 0x40, 0xa9, 0xb3, 0x30, 0x54, 0xf4, 0x58, 0x60, 0xda, 0x35, 0x53, 0x15, 0x4a, 0x93, 0xb4, 0x07, 0x28, 0x42, 0x40, 0x8d, 0x02, 0x39, 0xac, 0x98, 0x90, 0xa4, 0x02, 0xda, 0xab, + 0x99, 0xa1, 0xec, 0x47, 0x0c, 0x9b, 0xa9, 0x31, 0x03, 0x03, 0x92, 0x4c, 0xf6, 0xd5, 0x10, 0xe3, 0xac, 0x56, 0x33, 0xe3, 0xf2, 0x89, 0x9f, 0x14, 0xba, 0x8f, 0xbd, 0x82, 0xdf, 0x1a, 0x03, 0x7f, + 0x97, 0x2f, 0x7d, 0x5b, 0xeb, 0x5e, 0x87, 0x5f, 0x3f, 0xf2, 0x9b, 0x7e, 0xbf, 0x0e, 0xe9, 0x07, 0xba, 0x67, 0xe6, 0xfc, 0x3e, 0xeb, 0x5b, 0x81, 0x74, 0x34, 0xa2, 0x94, 0xba, 0xd9, 0x86, 0x0d, + 0x13, 0x95, 0xa8, 0xba, 0x1b, 0x62, 0xc8, 0x1e, 0x90, 0x88, 0x79, 0x9b, 0x70, 0x27, 0xcd, 0x5a, 0x01, 0xd3, 0xa1, 0xb4, 0xa5, 0x7c, 0xb4, 0x3c, 0x7a, 0xc7, 0x26, 0xc2, 0xe1, 0x21, 0xac, 0x2e, + 0xd9, 0x45, 0xe1, 0x1c, 0xe5, 0x9d, 0x24, 0xa6, 0x22, 0x3c, 0x1b, 0xc6, 0xab, 0xca, 0x06, 0x02, 0x4f, 0x55, 0x11, 0x7e, 0xe5, 0x02, 0x07, 0xab, 0x9a, 0xf2, 0xdb, 0x47, 0x15, 0xe6, 0xbf, 0x80, + 0xa7, 0x0c, 0x1f, 0xe9, 0x53, 0xaf, 0x45, 0x34, 0x9d, 0x09, 0x9e, 0x01, 0x29, 0xc3, 0xa4, 0x6f, 0xf4, 0xd2, 0xba, 0x56, 0x5a, 0x20, 0x41, 0x85, 0x79, 0x0e, 0x6f, 0xda, 0xc2, 0x00, 0x3d, 0x59, + 0x2f, 0xb0, 0x3a, 0xa9, 0xb0, 0x31, 0xed, 0xca, 0xd3, 0xd4, 0x18, 0xef, 0x02, 0x7d, 0xa8, 0x1c, 0x0c, 0x1f, 0x3a, 0x00, 0x84, 0x7c, 0xaa, 0x70, 0x6f, 0x37, 0x9c, 0x04, 0x3e, 0x2a, 0xee, 0xc2, + 0xcd, 0x1a, 0xb6, 0x0a, 0x7c, 0x2c, 0x36, 0x1b, 0x68, 0xc9, 0x2a, 0x8b, 0x15, 0x70, 0xdc, 0xcc, 0xf7, 0xc8, 0x64, 0xee, 0xd4, 0xcf, 0x0c, 0xcc, 0xc7, 0xa2, 0x7b, 0x56, 0xff, 0x62, 0xeb, 0x6c, + 0xb8, 0x98, 0xea, 0xbb, 0xf2, 0x7f, 0x63, 0x48, 0x5c, 0xb5, 0xc0, 0xef, 0xb3, 0x83, 0x92, 0x94, 0x51, 0xab, 0x5f, 0x64, 0xf7, 0xfe, 0xf4, 0xf0, 0xca, 0x9e, 0xf8, 0x3b, 0xd1, 0x0e, 0xee, 0xcb, + 0x61, 0x9f, 0x3e, 0x74, 0x5d, 0x0a, 0xc7, 0x2e, 0xdf, 0x79, 0x86, 0x05, 0x78, 0xc3, 0x30, 0x00, 0x5a, 0x10, 0x5f, 0x30, 0xf4, 0x46, 0xd1, 0xb2, 0x39, 0x48, 0x24, 0x88, 0x6c, 0xab, 0xd0, 0x6a, + 0x53, 0x18, 0xa9, 0xb8, 0x94, 0x11, 0xc9, 0x1c, 0xc6, 0xce, 0x6a, 0x43, 0x8d, 0x73, 0x95, 0x5a, 0xad, 0xd6, 0x9b, 0x2a, 0x19, 0x03, 0x9c, 0x30, 0x49, 0xb2, 0x43, 0x65, 0x56, 0x86, 0xa4, 0xb4, + 0x5a, 0xe4, 0x21, 0x7a, 0x45, 0xf0, 0x33, 0x03, 0xfa, 0xce, 0xba, 0xd6, 0xcb, 0x3f, 0x5f, 0x26, 0xea, 0x1f, 0x06, 0x2c, 0x51, 0x3b, 0xb0, 0x12, 0xb5, 0x2f, 0x50, 0x01, 0xec, 0x71, 0x64, 0x9e, + 0x2c, 0x27, 0xc2, 0x3c, 0xd5, 0x44, 0xa0, 0x05, 0x86, 0xf3, 0x38, 0x8f, 0x3d, 0x2e, 0x39, 0x24, 0xf3, 0x31, 0x16, 0x05, 0x4b, 0xa0, 0xa6, 0xf6, 0x49, 0xba, 0x19, 0x9b, 0x51, 0xcd, 0x8b, 0x16, + 0xdd, 0x8c, 0x2d, 0xc8, 0x76, 0x86, 0xd1, 0x64, 0x8c, 0x57, 0x01, 0x80, 0xb7, 0x62, 0x92, 0xaf, 0xf2, 0x36, 0x31, 0xb9, 0xac, 0xb6, 0x4e, 0x9b, 0x8c, 0x29, 0xe9, 0x09, 0x06, 0x3f, 0x8b, 0xfe, + 0xfa, 0x42, 0x36, 0x3b, 0x93, 0x75, 0x60, 0xc7, 0xea, 0x65, 0x4d, 0x7b, 0xd0, 0xd9, 0xf2, 0x99, 0xf7, 0xa4, 0x07, 0xf8, 0xe9, 0x23, 0x1d, 0x0c, 0xff, 0x09, 0xbf, 0xa2, 0x47, 0xa4, 0x67, 0xf5, + 0x2b, 0xcd, 0x07, 0x97, 0x7f, 0x7f, 0x0e, 0x3c, 0x3b, 0x44, 0x08, 0x3a, 0x71, 0xf0, 0x3a, 0x17, 0x0e, 0xfc, 0xc4, 0x95, 0xf7, 0xd1, 0xc2, 0x02, 0x18, 0x70, 0x54, 0x43, 0x0e, 0x97, 0x3b, 0x39, + 0x68, 0x94, 0x8b, 0x9c, 0x93, 0x36, 0xfb, 0xe9, 0x9a, 0x1e, 0x4a, 0x64, 0xea, 0xcd, 0x0a, 0x77, 0xb3, 0xa8, 0x39, 0x9e, 0x5b, 0x1f, 0xa0, 0x62, 0x42, 0x13, 0x5c, 0xbc, 0xd0, 0xa0, 0xb0, 0xa2, + 0x86, 0xab, 0x52, 0x8b, 0xf6, 0x62, 0x56, 0x7a, 0x0c, 0x25, 0xf6, 0x5c, 0xbc, 0xfe, 0x50, 0xe3, 0x7c, 0xe8, 0x4f, 0x3a, 0xa9, 0x7a, 0x47, 0x00, 0xa4, 0xa5, 0x59, 0x9a, 0x83, 0xd0, 0xd5, 0xb3, + 0xb8, 0x50, 0x73, 0xff, 0xe1, 0xa2, 0x87, 0xbc, 0xa0, 0x49, 0xdf, 0xd0, 0x3e, 0x73, 0xf4, 0xfa, 0x4a, 0xb7, 0x41, 0xdb, 0x43, 0xaf, 0xe6, 0x4a, 0x95, 0x13, 0x54, 0xdc, 0x0a, 0x18, 0x71, 0xb8, + 0x52, 0x05, 0x79, 0x7b, 0x5a, 0xc5, 0x3e, 0x84, 0xad, 0x4e, 0xe2, 0x1a, 0x9e, 0x92, 0xb8, 0xba, 0x70, 0xaa, 0x61, 0x66, 0xad, 0x8f, 0xe8, 0xc6, 0x4e, 0x49, 0x80, 0x45, 0xa6, 0x4e, 0xa2, 0x6c, + 0x23, 0x72, 0x4a, 0x38, 0x84, 0x8b, 0x29, 0x73, 0x7f, 0x22, 0x10, 0xd2, 0x70, 0x97, 0xfa, 0xd4, 0x84, 0x26, 0x47, 0x19, 0xe6, 0x98, 0x1e, 0xca, 0x8c, 0x1f, 0xb4, 0x22, 0xff, 0x3f, 0x7f, 0xe1, + 0xfc, 0x1b, 0xf1, 0xaf, 0x0a, 0x7a, 0xf5, 0xe3, 0x87, 0x65, 0x66, 0x71, 0xfe, 0xcb, 0x18, 0xfc, 0xc0, 0xe1, 0x07, 0x8f, 0x49, 0xd4, 0x22, 0x33, 0xe3, 0xe8, 0xcb, 0xe7, 0xd4, 0x75, 0xfd, 0xf3, + 0xed, 0xbe, 0xee, 0x61, 0xdf, 0x7d, 0x86, 0x1e, 0x47, 0x79, 0x19, 0x14, 0xe7, 0xcf, 0xfe, 0xea, 0x31, 0x17, 0xb2, 0x97, 0x1d, 0xaa, 0x4b, 0xc4, 0xfd, 0x87, 0x47, 0xbc, 0x1d, 0xfd, 0x5f, 0x5f, + 0x09, 0xd8, 0x03, 0x2f, 0xda, 0x3d, 0x39, 0xc3, 0x5e, 0xca, 0x80, 0xbe, 0xff, 0x88, 0x4e, 0xdc, 0xee, 0xfd, 0xd0, 0xb5, 0x01, 0xeb, 0x91, 0x1b, 0x5d, 0xc8, 0x53, 0x78, 0x0b, 0x3b, 0x76, 0xbb, + 0x2b, 0x69, 0x3b, 0x88, 0x0f, 0xa0, 0x2c, 0xe5, 0x48, 0x0d, 0x0f, 0xcb, 0x68, 0x73, 0x70, 0x88, 0xd4, 0x2a, 0xc1, 0x74, 0x2a, 0x5a, 0x8e, 0x28, 0xab, 0xa1, 0x5a, 0x8f, 0xac, 0xd6, 0x29, 0x43, + 0x46, 0x45, 0xda, 0x45, 0x62, 0x08, 0x31, 0x31, 0xaa, 0x64, 0x14, 0xc9, 0x96, 0x7a, 0xe0, 0x01, 0x98, 0x75, 0x94, 0xb7, 0xd2, 0x9e, 0xcd, 0xc7, 0x33, 0xba, 0xfa, 0xda, 0x6f, 0x95, 0xe9, 0x5f, + 0x0c, 0xc0, 0xef, 0x6b, 0x9d, 0x99, 0x0e, 0x0e, 0xc0, 0x4c, 0xef, 0x86, 0x59, 0x0f, 0x1d, 0xb3, 0x45, 0xb5, 0x85, 0x9d, 0x32, 0x1e, 0xba, 0x9d, 0x18, 0xcd, 0x5a, 0x5b, 0xfb, 0x71, 0x18, 0xc4, + 0x8e, 0x5f, 0xe5, 0x24, 0x61, 0x1b, 0xa4, 0xbb, 0xdf, 0x06, 0xc2, 0x64, 0x15, 0x4d, 0x1c, 0x2b, 0x02, 0x26, 0x9b, 0xc6, 0xc6, 0x34, 0x1d, 0x47, 0x0c, 0x42, 0xd4, 0x27, 0x47, 0x78, 0x58, 0xab, + 0x15, 0x65, 0xd9, 0x66, 0x33, 0xb5, 0x75, 0x5d, 0xf7, 0x1d, 0x5d, 0xa9, 0xda, 0xba, 0xdd, 0xca, 0x1b, 0xfe, 0x75, 0xcd, 0xea, 0x52, 0xed, 0xef, 0x77, 0x21, 0x33, 0xe8, 0x76, 0x37, 0xd9, 0x8d, + 0xba, 0xf6, 0xcb, 0xff, 0x86, 0xaf, 0x76, 0x39, 0xde, 0x73, 0x2c, 0xdf, 0xab, 0x4b, 0xc1, 0x9f, 0x6a, 0x34, 0x16, 0x99, 0x9b, 0x5c, 0xb6, 0xd7, 0xf5, 0x38, 0x0c, 0xcd, 0xa8, 0xe8, 0x0c, 0x8b, + 0x7f, 0xf7, 0xad, 0x45, 0xdc, 0x31, 0xe9, 0xb6, 0x6a, 0xc8, 0x17, 0x3c, 0x35, 0x55, 0xc3, 0x70, 0xb3, 0xc7, 0x7a, 0xf3, 0x2b, 0x31, 0x03, 0xef, 0x44, 0xcf, 0xfc, 0x7d, 0x3b, 0x1c, 0xa0, 0xfd, + 0x62, 0x05, 0x74, 0xd6, 0x29, 0x47, 0x3a, 0x48, 0x64, 0x86, 0xe3, 0xd3, 0xd2, 0x31, 0x97, 0x81, 0x38, 0x9f, 0x38, 0x96, 0xd0, 0x42, 0x2b, 0xd7, 0xaf, 0x13, 0x9a, 0x01, 0x87, 0x80, 0x1b, 0xc6, + 0xc0, 0x3a, 0x31, 0xd5, 0x5c, 0x9c, 0x13, 0x71, 0x39, 0xcb, 0xe8, 0x2c, 0x90, 0xfd, 0x5a, 0x84, 0x00, 0x20, 0xf2, 0xdc, 0xb6, 0xa4, 0x2a, 0x7d, 0xc4, 0xcf, 0xe5, 0xa1, 0x88, 0x96, 0x7e, 0xa5, + 0x10, 0x69, 0x38, 0x7f, 0x3d, 0x56, 0xe0, 0xe3, 0x16, 0xd6, 0x59, 0x43, 0x41, 0x5e, 0xb0, 0xee, 0x88, 0xbe, 0x7b, 0x89, 0x5d, 0xcb, 0xa4, 0xe4, 0x67, 0x92, 0xc5, 0x45, 0x7c, 0x9e, 0x06, 0x7f, + 0x5a, 0x81, 0xfa, 0xd0, 0xd9, 0x76, 0xd1, 0xd6, 0xbf, 0xcf, 0x99, 0x7b, 0x8f, 0xe8, 0xf8, 0x74, 0xef, 0x87, 0x2e, 0x8b, 0xbc, 0x87, 0x82, 0xb3, 0x72, 0x27, 0xc6, 0x6e, 0x92, 0x8e, 0xe1, 0x63, + 0x20, 0x8f, 0xca, 0xdd, 0x0a, 0x32, 0xf2, 0xd1, 0x0e, 0x30, 0xf6, 0x10, 0xe2, 0xe2, 0x6b, 0xc6, 0x25, 0x32, 0x74, 0x52, 0x6e, 0x1d, 0x4e, 0x8a, 0x00, 0x3f, 0x34, 0xd7, 0x1c, 0x30, 0xb3, 0x68, + 0xc7, 0xf2, 0x52, 0x76, 0xe7, 0xe6, 0xf0, 0x69, 0xd5, 0x44, 0x41, 0x49, 0x10, 0x4e, 0x0a, 0x62, 0x46, 0x03, 0x6d, 0x10, 0x7e, 0x83, 0x92, 0x9b, 0x9d, 0xf8, 0x34, 0x8b, 0xfa, 0x3b, 0xc1, 0x95, + 0xff, 0x6f, 0x0b, 0x4d, 0xbe, 0x1f, 0xaa, 0x72, 0x7f, 0xd1, 0x7a, 0x25, 0x8a, 0xed, 0x0e, 0xfd, 0x8b, 0x90, 0xdc, 0x5e, 0x1d, 0x60, 0xfd, 0xa2, 0xd8, 0x70, 0xdb, 0x17, 0x34, 0x6c, 0x8f, 0xab, + 0xc7, 0xd5, 0x04, 0x13, 0xe6, 0x88, 0x52, 0xad, 0xb5, 0x11, 0xde, 0x4e, 0x27, 0x9e, 0x5e, 0x95, 0x96, 0x34, 0x49, 0xab, 0x6a, 0xd6, 0xc0, 0xb4, 0x16, 0x32, 0x1b, 0xbf, 0x2c, 0xf2, 0xda, 0x3b, + 0xc2, 0x0d, 0x77, 0xd8, 0xc9, 0x10, 0x60, 0xa8, 0x81, 0xb7, 0x94, 0x77, 0x5a, 0x6c, 0x73, 0x23, 0x1e, 0x32, 0x0b, 0x59, 0x08, 0x34, 0x57, 0x9d, 0x6d, 0x5b, 0xb6, 0x7d, 0x7d, 0xf6, 0xbe, 0xcc, + 0x92, 0xff, 0xba, 0x2c, 0x5c, 0xdf, 0xe5, 0x39, 0xde, 0xb3, 0x10, 0xf5, 0x4d, 0x98, 0xd0, 0x3d, 0xee, 0xbc, 0x56, 0x86, 0xfa, 0x23, 0xe1, 0x8f, 0x6c, 0x29, 0xb3, 0xa0, 0x6f, 0x09, 0x6a, 0x42, + 0xd5, 0x65, 0x49, 0x12, 0x97, 0x10, 0xe9, 0x6f, 0x2b, 0x7c, 0x47, 0xf2, 0xde, 0x0c, 0xad, 0x78, 0x75, 0x29, 0x29, 0xbe, 0x38, 0xae, 0x63, 0x6c, 0xcd, 0xcf, 0xb5, 0x09, 0x23, 0x6f, 0x67, 0xb3, + 0x28, 0x62, 0xb9, 0x49, 0xc2, 0xa4, 0xc6, 0x3e, 0x5b, 0xe2, 0x02, 0xc6, 0x89, 0x10, 0xb3, 0x59, 0xc6, 0xe0, 0xf1, 0x50, 0xad, 0x86, 0xc5, 0x0c, 0x94, 0x86, 0xeb, 0x39, 0x28, 0x6e, 0xf7, 0x16, + 0x64, 0xfa, 0xff, 0x21, 0x7e, 0xf4, 0x31, 0x01, 0x33, 0xf3, 0x8c, 0x42, 0x56, 0x3d, 0xec, 0x6c, 0xf1, 0x5a, 0xc4, 0xe1, 0x6f, 0xb2, 0x1d, 0x1f, 0xde, 0x4f, 0xfa, 0x44, 0x1b, 0xc2, 0x03, 0x16, + 0xa1, 0x73, 0xc0, 0x6b, 0xc3, 0x5a, 0x66, 0x28, 0x9e, 0x44, 0xb7, 0xe5, 0xf0, 0xb0, 0x20, 0x86, 0x14, 0x3c, 0xe2, 0xbf, 0xac, 0x16, 0x77, 0xbf, 0x3a, 0xf0, 0x7d, 0xcf, 0xc2, 0x2b, 0x9d, 0x54, + 0xee, 0xd0, 0xef, 0x3e, 0xee, 0xd3, 0xd5, 0xbe, 0x3d, 0x83, 0x25, 0x0b, 0x8a, 0x8e, 0x26, 0xbe, 0xcb, 0xcd, 0x93, 0x3b, 0x67, 0x4b, 0x80, 0x4c, 0xc6, 0x9a, 0xeb, 0xee, 0xb5, 0x30, 0x09, 0x52, + 0x5c, 0x18, 0x83, 0x09, 0x30, 0xaa, 0x47, 0xb2, 0xb4, 0x01, 0x57, 0x13, 0xda, 0xc9, 0xf6, 0x14, 0xb5, 0x77, 0x6a, 0x15, 0xa8, 0x48, 0xae, 0x2d, 0xb5, 0x32, 0xb5, 0x94, 0xa3, 0x58, 0x99, 0x7b, + 0x10, 0xa4, 0xe4, 0xc3, 0x22, 0xa7, 0x16, 0xa3, 0x1d, 0xb3, 0x06, 0xab, 0xd9, 0x77, 0x0a, 0x7b, 0xf5, 0x8e, 0xe6, 0x79, 0x43, 0xe8, 0xb1, 0x88, 0xbc, 0x52, 0x11, 0xed, 0xed, 0xb6, 0x0e, 0xc3, + 0xee, 0x68, 0x70, 0x21, 0xf4, 0x1c, 0x38, 0x57, 0x07, 0x46, 0x2b, 0xd9, 0x3d, 0x10, 0x07, 0x17, 0x69, 0x4f, 0xdb, 0xc5, 0xfc, 0xc8, 0xfb, 0xae, 0x42, 0x0d, 0x95, 0xf1, 0x69, 0xc4, 0x23, 0x8a, + 0x13, 0x8e, 0x25, 0x56, 0x15, 0x1b, 0x63, 0x35, 0x6b, 0x18, 0x35, 0x77, 0xcd, 0xf9, 0x34, 0x03, 0x5a, 0x49, 0x01, 0x8f, 0xa1, 0x94, 0xeb, 0x3e, 0xed, 0x32, 0x01, 0x8c, 0xa8, 0x19, 0xd4, 0xe2, + 0x92, 0x2b, 0x51, 0x0d, 0x1a, 0x62, 0x3b, 0x3a, 0x82, 0x5f, 0x1f, 0xa4, 0x57, 0xb1, 0x4e, 0x97, 0x75, 0xf5, 0x3f, 0xe1, 0x14, 0x78, 0x2f, 0xc8, 0x15, 0xb8, 0xfe, 0x57, 0x41, 0x57, 0xaf, 0x08, + 0xfe, 0x6f, 0xc2, 0x17, 0x6e, 0xfd, 0x3a, 0xed, 0xd3, 0x46, 0x08, 0x1e, 0xf8, 0xb2, 0x6e, 0x8f, 0x4e, 0x85, 0x47, 0xcf, 0x95, 0x69, 0x65, 0xab, 0x9b, 0xb9, 0x8a, 0x06, 0xc9, 0x62, 0xbc, 0x8e, + 0xcd, 0x27, 0xdb, 0xe7, 0x8f, 0x31, 0xff, 0x54, 0xf7, 0xf8, 0xb6, 0xa9, 0xd5, 0x97, 0x38, 0x95, 0xe1, 0xc3, 0x28, 0x50, 0xe8, 0x25, 0x8f, 0xf8, 0x1b, 0xcd, 0x0b, 0x3a, 0xe7, 0xa3, 0x01, 0xf4, + 0xdc, 0x2f, 0x0e, 0x0f, 0x08, 0xd3, 0x83, 0x64, 0x73, 0xbb, 0x10, 0x70, 0xde, 0xb4, 0x53, 0x82, 0x40, 0xa7, 0x29, 0xeb, 0x8a, 0x10, 0xad, 0xc0, 0xfe, 0xab, 0xc0, 0x14, 0x4e, 0x16, 0x97, 0x76, + 0xa7, 0x97, 0xff, 0x1b, 0xf9, 0x89, 0xf6, 0x4a, 0x7f, 0xc8, 0xcc, 0x47, 0x1b, 0x8a, 0xd0, 0x55, 0x29, 0x9d, 0xfe, 0x68, 0x14, 0x1d, 0x12, 0xc5, 0xa0, 0xfb, 0xff, 0xe7, 0x03, 0x9a, 0x85, 0x34, + 0x54, 0x3e, 0x6e, 0xf3, 0xd1, 0x0e, 0x55, 0xc6, 0xf0, 0xe8, 0xb8, 0xdb, 0xb6, 0x30, 0x4d, 0x93, 0xa3, 0x89, 0x3a, 0xa2, 0x08, 0xa7, 0x52, 0x6c, 0x7c, 0x3f, 0x1b, 0x86, 0xeb, 0xd6, 0x5f, 0x35, + 0xdb, 0xc3, 0x0c, 0xf1, 0x4a, 0x68, 0x29, 0x69, 0x8b, 0x40, 0xa5, 0x37, 0x9b, 0xc0, 0x97, 0x81, 0x23, 0x37, 0xaa, 0xe7, 0x1b, 0xa0, 0xde, 0xb3, 0x52, 0x38, 0x99, 0x93, 0x90, 0x7a, 0xc0, 0x2b, + 0xf9, 0xba, 0xa4, 0xc2, 0x1f, 0x08, 0xc4, 0xc8, 0xcc, 0xc2, 0x7d, 0x2c, 0x37, 0xaf, 0x45, 0xa6, 0xbc, 0xd1, 0xbc, 0xa0, 0x75, 0x3e, 0xea, 0x13, 0x8f, 0x72, 0x46, 0x8c, 0x59, 0x4b, 0x32, 0x31, + 0x3c, 0xfa, 0xb3, 0x14, 0x39, 0x20, 0x1a, 0x63, 0x36, 0xe0, 0x9a, 0xe7, 0xe1, 0x83, 0x2b, 0x1d, 0x22, 0x84, 0x59, 0xc8, 0x26, 0xb6, 0x91, 0xdb, 0x9c, 0x34, 0x64, 0xc3, 0x0b, 0x33, 0x55, 0x5e, + 0xee, 0xf3, 0x83, 0x2f, 0x95, 0x04, 0x8f, 0xa9, 0x21, 0x40, 0x00, 0xc3, 0xbd, 0xa6, 0xaa, 0x8b, 0x00, 0x4e, 0x9d, 0x18, 0x53, 0x53, 0x92, 0xdc, 0xd0, 0xdc, 0x16, 0x5b, 0x08, 0x4f, 0xea, 0x53, + 0x65, 0x66, 0x99, 0x5f, 0x62, 0xbc, 0x1e, 0x4d, 0x2d, 0xdf, 0x77, 0x02, 0xbd, 0xd1, 0xec, 0xbe, 0xbf, 0x3b, 0xea, 0xdb, 0xb6, 0x71, 0x3f, 0x8e, 0x68, 0x82, 0x50, 0x51, 0x4b, 0x07, 0x4d, 0x7f, + 0x3a, 0x87, 0x03, 0x08, 0xdc, 0x6f, 0xe0, 0x65, 0x9c, 0xbb, 0xe5, 0xd2, 0x6b, 0x45, 0x67, 0xe4, 0x4c, 0x2a, 0xe9, 0xc0, 0xd2, 0xb2, 0x7d, 0xd0, 0xad, 0x45, 0x55, 0x10, 0xe3, 0x91, 0x64, 0x97, + 0x1e, 0xb2, 0xe7, 0xd7, 0x94, 0xb9, 0x1c, 0x4e, 0x16, 0x48, 0x38, 0x02, 0xcb, 0xba, 0x55, 0xd7, 0x07, 0x11, 0xb7, 0xb4, 0x62, 0x5a, 0x8b, 0xed, 0xe9, 0xf9, 0xda, 0xe9, 0xc6, 0x97, 0xfd, 0xcc, + 0xff, 0xff, 0x7f, 0xfb, 0x94, 0x9a, 0xf6, 0xca, 0xb2, 0x6a, 0x19, 0x8f, 0x5d, 0x47, 0xaf, 0xc4, 0x80, 0x9e, 0x09, 0x9e, 0xb1, 0xb4, 0x0c, 0xbd, 0x33, 0x51, 0x7b, 0x08, 0xd2, 0x01, 0x71, 0xe2, + 0xca, 0x38, 0xcd, 0x35, 0xde, 0x1d, 0x8d, 0xc0, 0xa3, 0xea, 0xa9, 0x02, 0x2b, 0xf9, 0x08, 0xbf, 0x0e, 0x81, 0x86, 0x5b, 0x9a, 0x5b, 0x83, 0x65, 0xcb, 0xc9, 0xc8, 0xd5, 0xbd, 0x91, 0xe6, 0xe3, + 0x27, 0x17, 0x99, 0x13, 0x8b, 0x05, 0xd9, 0xb8, 0xb6, 0x1e, 0x51, 0xf3, 0x64, 0x45, 0x6b, 0x5c, 0xcb, 0xe9, 0x76, 0xbb, 0xa2, 0xdc, 0x0d, 0x40, 0x44, 0x7c, 0x26, 0x0f, 0x75, 0x65, 0x91, 0x91, + 0x5f, 0x0a, 0x52, 0x17, 0x33, 0xf8, 0x65, 0x6b, 0xa7, 0xe1, 0x4b, 0xc6, 0xd9, 0x07, 0xba, 0xe0, 0xe0, 0xe3, 0xd9, 0x60, 0xd8, 0xcf, 0x18, 0xcb, 0x12, 0x54, 0x88, 0xa1, 0x11, 0xa3, 0x1b, 0x61, + 0xc8, 0x68, 0x8b, 0xca, 0x56, 0xb9, 0x66, 0x2b, 0xac, 0xb2, 0x91, 0xb6, 0x38, 0x08, 0x07, 0x7f, 0x28, 0x8c, 0x67, 0x29, 0x3c, 0x07, 0x92, 0x44, 0xdb, 0xc5, 0x23, 0x08, 0x90, 0x4d, 0x95, 0x6a, + 0xfc, 0x7a, 0x48, 0x19, 0x04, 0xb7, 0xe1, 0x80, 0x05, 0x85, 0x6b, 0x5e, 0x24, 0x87, 0xc8, 0xa1, 0xdc, 0x94, 0x53, 0x29, 0x4c, 0x4a, 0xb9, 0x0a, 0xa7, 0xd7, 0xe5, 0x96, 0xfe, 0xb7, 0xc7, 0xfa, + 0xe1, 0x63, 0xfe, 0xa6, 0xc7, 0xba, 0x63, 0x77, 0xe7, 0xad, 0x41, 0xfe, 0xe8, 0x0c, 0xfd, 0x81, 0xee, 0xbb, 0x50, 0x5d, 0xce, 0xfa, 0xce, 0xd4, 0x1b, 0x75, 0x2f, 0xcc, 0xf3, 0xbd, 0xca, 0x71, + 0x25, 0x53, 0xfb, 0x13, 0xd7, 0x8b, 0xc9, 0x0d, 0x4d, 0x32, 0x38, 0x68, 0xb2, 0xf8, 0xc1, 0xcd, 0xaa, 0x76, 0x73, 0x0c, 0x94, 0xd1, 0x84, 0xdc, 0xb6, 0x18, 0x05, 0x38, 0xd3, 0xca, 0xc1, 0x26, + 0x78, 0xb0, 0x5c, 0x00, 0xd1, 0xc6, 0x70, 0xb4, 0xb9, 0xb5, 0xd4, 0x36, 0x80, 0x2d, 0x2e, 0x26, 0x7a, 0x66, 0xe4, 0xbc, 0xba, 0xcf, 0xa1, 0x39, 0xa0, 0x4c, 0xf8, 0x9e, 0xd9, 0xb4, 0x97, 0x85, + 0xfd, 0xaf, 0x7f, 0x43, 0x3d, 0x33, 0xd0, 0x72, 0x53, 0x2f, 0xb3, 0xb7, 0x24, 0xa6, 0xaf, 0x82, 0xf7, 0x91, 0x97, 0x92, 0x22, 0x3f, 0x51, 0xef, 0xb2, 0x66, 0x6e, 0xae, 0x0d, 0x90, 0xe7, 0xe9, + 0x92, 0x67, 0x58, 0xb7, 0x43, 0x05, 0x1c, 0x8f, 0x22, 0x8d, 0xe7, 0x86, 0x05, 0xb8, 0x06, 0x73, 0x1a, 0x0f, 0x65, 0x64, 0xa6, 0xea, 0x96, 0x77, 0x58, 0xd4, 0xd9, 0x54, 0x17, 0xdc, 0x21, 0x85, + 0x6a, 0xc5, 0x8e, 0x47, 0x16, 0x0a, 0x91, 0x58, 0x30, 0x03, 0xef, 0xb9, 0x91, 0x32, 0xa6, 0x87, 0xab, 0xe1, 0xc8, 0xf1, 0x0e, 0x7b, 0x64, 0x7b, 0x6a, 0x32, 0xb8, 0xe1, 0x81, 0x79, 0x38, 0x71, + 0xf8, 0x6a, 0xe6, 0x9f, 0xa6, 0x6c, 0xf8, 0xf5, 0x02, 0xf8, 0x65, 0xf6, 0xd0, 0xe8, 0xa5, 0x5a, 0x95, 0xb7, 0xd9, 0x43, 0xa3, 0x7e, 0xd5, 0x29, 0x37, 0xb1, 0xb9, 0x58, 0xc9, 0x0e, 0x41, 0x33, + 0xd8, 0x44, 0xe4, 0x41, 0x75, 0x2c, 0x5a, 0xb8, 0xb2, 0x40, 0x2b, 0x33, 0x06, 0xc9, 0x91, 0x72, 0xc8, 0xe5, 0x4c, 0x20, 0xf1, 0x15, 0x11, 0xb5, 0xe3, 0x48, 0x43, 0x27, 0xf0, 0x21, 0x4b, 0xfc, + 0x92, 0x03, 0x4e, 0x63, 0x7e, 0x36, 0xac, 0xad, 0xd9, 0x30, 0xc1, 0x69, 0x6c, 0xad, 0x3b, 0xb2, 0x92, 0x9b, 0xb6, 0xbb, 0xb5, 0xb5, 0x15, 0x35, 0xc6, 0x94, 0x5b, 0x6f, 0xf0, 0x43, 0xcd, 0xfb, + 0x43, 0x4b, 0x8c, 0x87, 0x0d, 0x08, 0xbe, 0x9d, 0x69, 0xf4, 0xf5, 0xb2, 0x1b, 0x7d, 0x2f, 0x54, 0xeb, 0x0d, 0x4c, 0xc3, 0xb5, 0x1e, 0xf5, 0x52, 0x45, 0x5f, 0x8a, 0x2d, 0xf8, 0x40, 0xf7, 0x37, + 0xcb, 0xce, 0x67, 0x5d, 0x23, 0x89, 0x1e, 0x0b, 0xcc, 0x42, 0x82, 0x96, 0x0d, 0x38, 0x5d, 0xe9, 0x74, 0x3b, 0x21, 0x74, 0xac, 0xf5, 0x13, 0x7a, 0xb1, 0x24, 0xab, 0x75, 0xcb, 0xd7, 0x7c, 0xac, + 0x15, 0x2c, 0x48, 0x18, 0x80, 0xb8, 0xf5, 0x49, 0x83, 0x80, 0x41, 0x6d, 0xe6, 0xd9, 0x1b, 0x3a, 0xb3, 0x34, 0x15, 0x83, 0x0f, 0x89, 0x99, 0x67, 0x23, 0x4f, 0x02, 0x0b, 0x62, 0xef, 0x00, 0x3b, + 0x74, 0x26, 0x8d, 0x4d, 0x52, 0x18, 0x6a, 0x26, 0xe0, 0x6d, 0xe5, 0x67, 0x25, 0xd4, 0x7b, 0x36, 0x92, 0xf8, 0xa7, 0x5a, 0x9b, 0x7d, 0x04, 0xad, 0xff, 0x70, 0xfa, 0xdf, 0xc9, 0x78, 0xdf, 0x48, + 0xc6, 0x7b, 0xfb, 0xda, 0xbc, 0x88, 0xb3, 0x47, 0x33, 0xf6, 0x6b, 0x0d, 0x6a, 0x3f, 0x12, 0xfe, 0x8d, 0x6a, 0x77, 0xda, 0xb7, 0x39, 0xad, 0xa8, 0x2b, 0xd5, 0x82, 0x65, 0xdb, 0x71, 0x15, 0x1b, + 0xb3, 0xb9, 0x90, 0x9b, 0x28, 0x14, 0x1c, 0xdd, 0xc8, 0xf7, 0x80, 0x95, 0xcd, 0x4f, 0xaa, 0x4d, 0x44, 0xd4, 0xbb, 0x65, 0x91, 0x6c, 0x77, 0x82, 0xda, 0x3a, 0x3a, 0x80, 0xe5, 0x39, 0x95, 0xa3, + 0xe8, 0xb0, 0xf4, 0x03, 0xdf, 0xaa, 0xb6, 0xdb, 0x95, 0xbd, 0x06, 0x8f, 0x55, 0x48, 0xaf, 0x0f, 0x1e, 0x26, 0xeb, 0x15, 0x92, 0x8f, 0xb6, 0xd3, 0x2d, 0xfb, 0x6c, 0x9e, 0xfe, 0xdc, 0xce, 0xed, + 0xd1, 0x2a, 0xf6, 0xfd, 0xed, 0xd9, 0x4f, 0xd4, 0x3b, 0x60, 0x6e, 0xae, 0x75, 0xab, 0x58, 0x8f, 0xcd, 0x5b, 0xd3, 0xd8, 0xd1, 0x44, 0x38, 0x61, 0x66, 0x47, 0xee, 0xb0, 0x3c, 0xb0, 0x8c, 0xe9, + 0x71, 0x51, 0xb9, 0x6a, 0x02, 0x33, 0x95, 0x67, 0xa0, 0x22, 0x18, 0xba, 0x48, 0x80, 0x9c, 0x19, 0x8e, 0xc1, 0x30, 0x8c, 0xf3, 0x06, 0x46, 0x12, 0xbd, 0x30, 0x08, 0x28, 0x47, 0xf8, 0x16, 0x82, + 0x18, 0x4e, 0x39, 0x65, 0xb1, 0xcd, 0x2a, 0xc2, 0x30, 0x54, 0x4b, 0x06, 0x01, 0xdb, 0x70, 0x0d, 0x6b, 0x55, 0xf0, 0x64, 0xb7, 0xfa, 0x26, 0xf0, 0xe5, 0xcf, 0xd9, 0x72, 0x1f, 0x09, 0x9f, 0x31, + 0xf9, 0x70, 0xda, 0xd7, 0xaa, 0x4b, 0x87, 0xd2, 0xa6, 0x2d, 0xd2, 0xf9, 0x6c, 0xc9, 0xd0, 0xfe, 0xc2, 0x70, 0xd9, 0x65, 0x26, 0xc3, 0x50, 0x58, 0xad, 0x77, 0x55, 0xb4, 0x75, 0x30, 0x04, 0x04, + 0x16, 0xf1, 0x24, 0x98, 0x1f, 0x51, 0x0d, 0x59, 0x4b, 0xeb, 0x19, 0xd2, 0x34, 0xab, 0x44, 0x99, 0x1b, 0xe1, 0x18, 0xab, 0x4d, 0x68, 0xa2, 0xc6, 0x07, 0x74, 0x57, 0xaf, 0xda, 0x45, 0x6a, 0x0f, + 0x6b, 0x61, 0x64, 0x26, 0x8d, 0x58, 0x41, 0x4a, 0xd5, 0x33, 0x8c, 0xf8, 0x49, 0xe5, 0x11, 0xdb, 0x2c, 0x06, 0x6e, 0x54, 0x64, 0x6e, 0x94, 0xbb, 0xfa, 0x5f, 0x77, 0xf7, 0xcf, 0x3e, 0x95, 0xa0, + 0x3a, 0xdf, 0x33, 0xee, 0x5d, 0xf6, 0xb6, 0x87, 0x7a, 0xdf, 0xdb, 0x17, 0x98, 0xbb, 0x76, 0xa4, 0x06, 0x03, 0xb3, 0x71, 0x1f, 0x79, 0x76, 0xd0, 0x97, 0xc2, 0xec, 0x3f, 0xd0, 0xed, 0x58, 0xfc, + 0xeb, 0xac, 0x8b, 0x03, 0xed, 0x11, 0x14, 0x74, 0xd8, 0xaf, 0xb0, 0xf1, 0x7c, 0x4a, 0xec, 0x61, 0xbe, 0xa9, 0x95, 0x75, 0xb3, 0xd4, 0x44, 0x31, 0xa3, 0xaa, 0x75, 0x64, 0x81, 0xb8, 0x48, 0xd9, + 0x8d, 0xa2, 0x33, 0x44, 0xdd, 0xec, 0x88, 0x53, 0x0e, 0xa3, 0x4d, 0xd2, 0x8c, 0x1a, 0x6d, 0x81, 0x43, 0x91, 0x31, 0x09, 0x1c, 0x2e, 0x9b, 0xbb, 0xc8, 0x8c, 0x2d, 0xe7, 0xbb, 0xd8, 0xa4, 0xe2, + 0x15, 0x3f, 0xaa, 0x0b, 0x47, 0x58, 0xa7, 0x18, 0x32, 0xbb, 0xed, 0xc9, 0xff, 0x3c, 0x22, 0xf6, 0x2a, 0xf1, 0xeb, 0xfe, 0x08, 0x78, 0xa5, 0xe3, 0xee, 0x6f, 0xb2, 0x67, 0x70, 0x7e, 0x9d, 0x74, + 0x15, 0x40, 0x7a, 0x68, 0x07, 0xeb, 0x1d, 0xed, 0x80, 0x24, 0x51, 0x24, 0xc7, 0x51, 0x56, 0x12, 0xe3, 0x20, 0x0b, 0xfc, 0x3d, 0x46, 0xe6, 0x27, 0xa9, 0x80, 0x0d, 0xad, 0x16, 0xbc, 0xc3, 0xd1, + 0x2e, 0x17, 0x59, 0x18, 0x34, 0xb3, 0x51, 0xa1, 0xd6, 0x87, 0x90, 0x9a, 0x04, 0x4b, 0x78, 0xb3, 0x5c, 0xb3, 0xbe, 0x44, 0x36, 0x2b, 0xb1, 0x4e, 0x1d, 0x3b, 0x9f, 0x99, 0x22, 0x7d, 0xf2, 0x50, + 0x9c, 0x1a, 0x4e, 0x43, 0xda, 0xde, 0x86, 0x5c, 0xcf, 0x70, 0x38, 0xb5, 0x88, 0x43, 0x57, 0x1f, 0xe4, 0x81, 0x69, 0x26, 0xf7, 0x07, 0xc0, 0x9d, 0x04, 0xbd, 0x1e, 0x72, 0x78, 0xd9, 0x10, 0xc9, + 0xdd, 0xd0, 0x0d, 0xd4, 0xb7, 0xcf, 0xbd, 0x87, 0xf7, 0x6b, 0x21, 0x44, 0x9f, 0xa8, 0x9f, 0x61, 0xbf, 0xbd, 0xd6, 0x37, 0x70, 0x08, 0x4c, 0x41, 0x62, 0x8b, 0x4d, 0x02, 0x4c, 0x61, 0xc8, 0x8d, + 0xe7, 0x11, 0x47, 0x33, 0x5b, 0x4e, 0x56, 0x47, 0x72, 0xcd, 0xf8, 0xea, 0x66, 0x67, 0x65, 0x95, 0x63, 0xcd, 0x09, 0x1f, 0x9c, 0x20, 0xa8, 0x8b, 0x45, 0xa7, 0x2c, 0xd8, 0x79, 0x08, 0x68, 0xc7, + 0x70, 0x38, 0x86, 0x96, 0xd1, 0x28, 0x5a, 0x80, 0xa8, 0x44, 0x09, 0x1a, 0x1f, 0x43, 0x40, 0x52, 0xe2, 0xbb, 0x6a, 0x2a, 0xb2, 0xe3, 0xdd, 0xa2, 0xab, 0xc6, 0xf0, 0x14, 0x9d, 0xda, 0x35, 0xbe, + 0x68, 0xd7, 0xf4, 0x92, 0xa2, 0xfa, 0x81, 0xf0, 0x6f, 0x4c, 0xba, 0xd3, 0xbe, 0x41, 0xb1, 0x11, 0x9f, 0xd2, 0xc3, 0xb1, 0x61, 0x4e, 0xd3, 0xb1, 0xb0, 0xa3, 0x83, 0x26, 0x85, 0xc9, 0x9a, 0x18, + 0xae, 0xa2, 0x02, 0xab, 0x71, 0xa6, 0x5a, 0x33, 0xe9, 0xf1, 0xe0, 0xfa, 0x78, 0x4c, 0x8e, 0x15, 0x3f, 0x90, 0xd6, 0xdc, 0x92, 0x0f, 0x52, 0x1b, 0x9b, 0x23, 0x6d, 0x26, 0xc2, 0xec, 0x41, 0x15, + 0x3d, 0x32, 0xad, 0x0e, 0xb5, 0x61, 0x99, 0xca, 0xa8, 0x1e, 0xa9, 0xd3, 0x6a, 0x45, 0x8d, 0x4a, 0xfb, 0x76, 0x23, 0xf4, 0x91, 0x30, 0xba, 0xf9, 0xc0, 0x2a, 0x83, 0xe0, 0xf2, 0xbe, 0x5d, 0xc8, + 0x73, 0x12, 0xbb, 0xd1, 0xc7, 0x68, 0xd8, 0x0f, 0x72, 0x79, 0x09, 0x0c, 0x52, 0xa3, 0xbc, 0x0b, 0x2b, 0x7a, 0xb1, 0x2d, 0x5d, 0x1f, 0xff, 0xef, 0x05, 0xc5, 0x0f, 0xa1, 0x20, 0x45, 0xe6, 0x3e, + 0x9e, 0x3f, 0x90, 0x97, 0xe5, 0xf9, 0xe6, 0x09, 0xbf, 0xf8, 0x77, 0x73, 0xbd, 0x8b, 0x0f, 0xeb, 0x21, 0xd7, 0xce, 0x71, 0xea, 0x83, 0x6e, 0x6a, 0x8d, 0x82, 0x04, 0x02, 0x49, 0x5b, 0x9c, 0x8f, + 0x40, 0xc3, 0xe0, 0xe1, 0xe5, 0xb1, 0x10, 0xb8, 0x0d, 0x29, 0x78, 0xc1, 0x69, 0xea, 0xea, 0x87, 0xa1, 0x9b, 0x91, 0x07, 0x63, 0x06, 0xdb, 0x99, 0x97, 0x47, 0x26, 0x83, 0xe0, 0xf2, 0x02, 0x6f, + 0xc8, 0x29, 0x3b, 0x99, 0x19, 0xd3, 0x8a, 0x27, 0xac, 0xbd, 0x20, 0x42, 0xfb, 0x13, 0xc5, 0x3a, 0x20, 0xb2, 0x6d, 0x81, 0xf1, 0xeb, 0x91, 0x43, 0x7f, 0x23, 0x06, 0xe5, 0xc3, 0x6d, 0x66, 0x57, + 0x10, 0xa1, 0xc8, 0xd4, 0x5f, 0xeb, 0x2c, 0x4c, 0xfc, 0x84, 0xba, 0xa4, 0xb8, 0x7b, 0x29, 0xbc, 0xff, 0x73, 0x06, 0xab, 0xdc, 0x65, 0xeb, 0x25, 0x6e, 0xee, 0x0f, 0x6a, 0x65, 0x0f, 0x1e, 0xf2, + 0x48, 0xac, 0xcc, 0xc8, 0xe8, 0xab, 0xad, 0xb5, 0xe3, 0x66, 0xea, 0xd5, 0xf0, 0x06, 0x41, 0xc9, 0xda, 0x27, 0x66, 0x95, 0x98, 0xe8, 0xed, 0x1a, 0xe1, 0x96, 0x19, 0xec, 0x8d, 0xea, 0x15, 0x3a, + 0xb6, 0x00, 0x1f, 0x0f, 0xaa, 0x5d, 0x24, 0xb0, 0x27, 0x20, 0x3c, 0x8d, 0xa7, 0x8b, 0xd3, 0x98, 0x93, 0x37, 0x66, 0x40, 0xf9, 0x18, 0xe2, 0xf3, 0x27, 0x1c, 0x48, 0x03, 0xa2, 0xf1, 0x2c, 0x86, + 0x88, 0xe5, 0x53, 0x8b, 0x7a, 0xe4, 0x66, 0xb8, 0xdd, 0x0f, 0x7b, 0x56, 0x60, 0xfa, 0x1b, 0x62, 0xf4, 0x3f, 0x09, 0xa3, 0xf3, 0x42, 0xcd, 0xbe, 0xaa, 0xee, 0xfc, 0x87, 0x58, 0xdd, 0x3d, 0xe6, + 0x11, 0xb3, 0xbb, 0x1f, 0xfb, 0xb2, 0xdb, 0x73, 0x70, 0x73, 0x4c, 0x60, 0xfc, 0xc4, 0xaa, 0x1a, 0x61, 0x08, 0x15, 0x86, 0x8c, 0x44, 0x3b, 0x25, 0x8a, 0xa7, 0x43, 0x30, 0x5c, 0xcf, 0x19, 0x7e, + 0x37, 0xdb, 0x5a, 0x35, 0x51, 0x0c, 0xdb, 0xb6, 0xf0, 0xe3, 0x7d, 0xbe, 0xda, 0x71, 0x4d, 0xb5, 0x04, 0x67, 0xe8, 0x38, 0x2d, 0xe1, 0x9c, 0x82, 0xf8, 0xe2, 0xb8, 0x44, 0xf9, 0x29, 0x24, 0xd9, + 0x8c, 0x10, 0xea, 0xc7, 0xfa, 0xe4, 0xd6, 0x72, 0xa9, 0xf4, 0x5c, 0x11, 0xfe, 0x97, 0x63, 0xf7, 0xaf, 0x15, 0xe9, 0x91, 0xb6, 0xf3, 0x82, 0x31, 0xfe, 0x8b, 0xec, 0x1b, 0x3b, 0x2f, 0x27, 0x9d, + 0x7e, 0xf3, 0x74, 0xa7, 0x39, 0x9d, 0x99, 0xdb, 0x65, 0x99, 0xab, 0x35, 0xe2, 0xc6, 0xba, 0xe8, 0x6a, 0x32, 0xbc, 0x72, 0x9b, 0xad, 0x54, 0x72, 0x71, 0xbf, 0xce, 0xc4, 0xdd, 0x93, 0x3a, 0xc7, + 0x77, 0x07, 0xed, 0x3f, 0x57, 0xf3, 0xfc, 0x7e, 0x9c, 0xef, 0x7d, 0xd5, 0xe8, 0x95, 0x1c, 0x95, 0x3b, 0xf4, 0x7f, 0xc1, 0x79, 0x75, 0xb5, 0x4f, 0x52, 0x35, 0x3c, 0xd8, 0xcc, 0x59, 0x65, 0x5b, + 0xfa, 0xcb, 0x3a, 0x0c, 0x08, 0x2a, 0xe7, 0x66, 0x8e, 0x5c, 0xc7, 0x1a, 0xdd, 0xda, 0x89, 0x1d, 0x7f, 0xbd, 0x42, 0xfe, 0xa9, 0xd0, 0x9c, 0xbc, 0x4c, 0xcc, 0x4c, 0xb5, 0x1f, 0xe7, 0x04, 0xa3, + 0x3f, 0x89, 0x57, 0x0c, 0xbd, 0x5f, 0x64, 0x2f, 0x35, 0xfb, 0xdf, 0x4e, 0x06, 0x1d, 0xb5, 0xe7, 0x73, 0xc5, 0x62, 0xbd, 0x2d, 0xd6, 0xec, 0x34, 0x9e, 0x2d, 0x19, 0xcc, 0xa4, 0x2a, 0x9c, 0x5f, + 0x14, 0x3e, 0x1f, 0x0b, 0x6c, 0x81, 0x52, 0x40, 0x9c, 0x42, 0x2d, 0x6a, 0xe4, 0x0d, 0x5b, 0xca, 0x25, 0x55, 0xa9, 0xdc, 0xbe, 0x2a, 0x45, 0xc2, 0x9c, 0x4f, 0xca, 0x75, 0x68, 0xed, 0x20, 0x57, + 0x96, 0x4f, 0xf4, 0x14, 0x36, 0x09, 0x27, 0x39, 0x4d, 0x71, 0x25, 0x6f, 0xb4, 0x72, 0x83, 0x53, 0x4b, 0x35, 0x60, 0xe7, 0x7f, 0x23, 0xf0, 0x35, 0x0e, 0x93, 0x38, 0x3a, 0xbf, 0xbf, 0x19, 0xba, + 0x45, 0x61, 0xbe, 0x5b, 0x31, 0x37, 0x31, 0xe6, 0x17, 0x17, 0x8e, 0xa7, 0xbe, 0xf7, 0xff, 0xbf, 0xc9, 0x08, 0xfc, 0xd8, 0x46, 0xe8, 0xe6, 0xa7, 0x0f, 0x01, 0xef, 0x9f, 0xeb, 0xa4, 0xc4, 0x59, + 0x38, 0x30, 0xd4, 0x42, 0x7d, 0xa3, 0x8a, 0x5e, 0xd7, 0x0a, 0x3c, 0xff, 0xec, 0x1a, 0x6f, 0x35, 0xff, 0xee, 0xbc, 0xd4, 0xef, 0x26, 0xa8, 0xef, 0x65, 0x4a, 0x3f, 0xfe, 0xf8, 0xd6, 0x0d, 0xf3, + 0x5f, 0xf0, 0x6d, 0x09, 0xc2, 0xf4, 0xf2, 0x1f, 0xf8, 0x55, 0x51, 0xf5, 0x8e, 0xff, 0x6a, 0xf7, 0xb0, 0x8f, 0xb9, 0x8f, 0x48, 0xb7, 0x77, 0xf1, 0xdd, 0xd1, 0xfc, 0xa3, 0x5f, 0xd6, 0xfa, 0x07, + 0x49, 0xba, 0x09, 0x27, 0xb8, 0x7d, 0x91, 0xfb, 0x83, 0x1c, 0x7d, 0x21, 0xa9, 0xfa, 0x86, 0xf6, 0x5b, 0xbc, 0xfd, 0x87, 0x2b, 0x5d, 0x5d, 0xa4, 0x1e, 0xe9, 0xd5, 0x33, 0xcd, 0x89, 0x09, 0x06, + 0xf3, 0x96, 0x1a, 0x4d, 0x36, 0x51, 0xd9, 0xb8, 0xa3, 0x18, 0x43, 0xf8, 0x4c, 0xb1, 0xe7, 0xa0, 0x22, 0x72, 0x7a, 0xae, 0x78, 0x78, 0xb4, 0x63, 0xda, 0x7d, 0xe8, 0x3b, 0xeb, 0x79, 0x4a, 0x4c, + 0xe9, 0x65, 0x91, 0x80, 0x56, 0x8b, 0x3b, 0x5b, 0xa5, 0x54, 0xc2, 0x0d, 0x18, 0xa1, 0xad, 0x32, 0x3e, 0x4c, 0xf6, 0x5a, 0x82, 0x9d, 0x4e, 0x60, 0x28, 0x11, 0x4e, 0x28, 0x6f, 0x9e, 0x79, 0x86, + 0xbf, 0x92, 0xe3, 0xcc, 0xec, 0xfa, 0x98, 0x5d, 0x0a, 0x70, 0xff, 0xf5, 0xef, 0x4f, 0x56, 0xba, 0x1b, 0x39, 0x66, 0xe6, 0x7e, 0xc8, 0x8d, 0xb8, 0x52, 0x9b, 0xdd, 0x5c, 0xcd, 0x32, 0xb5, 0xbd, + 0xff, 0xaf, 0x0f, 0x2a, 0x5a, 0x5c, 0xc8, 0x5c, 0x9b, 0x5c, 0x57, 0x1b, 0xf8, 0x7f, 0xfd, 0x7b, 0x78, 0x2b, 0x96, 0x17, 0x65, 0xe3, 0xff, 0x36, 0xcc, 0xb3, 0xf1, 0x96, 0xbd, 0x3d, 0xee, 0xe6, + 0x9e, 0xee, 0x33, 0x0c, 0x33, 0xc9, 0x4c, 0x5d, 0xed, 0xca, 0xa8, 0x5d, 0x5e, 0xa9, 0x4f, 0xa6, 0xed, 0x23, 0x91, 0xea, 0x13, 0x58, 0xf0, 0x4a, 0x59, 0xdc, 0xaf, 0x02, 0x0b, 0x7a, 0x95, 0xc4, + 0x5d, 0x18, 0xc8, 0x5e, 0x99, 0xac, 0x28, 0x5f, 0x0a, 0xe4, 0xd1, 0x42, 0x5b, 0x35, 0x56, 0x3e, 0x23, 0xc0, 0xa8, 0x62, 0xfc, 0xfd, 0x6c, 0x0f, 0x2f, 0x50, 0x42, 0x87, 0x73, 0x97, 0xc3, 0xb7, + 0x1b, 0x5c, 0x1d, 0x6f, 0xc4, 0x31, 0x1b, 0xd2, 0x13, 0x62, 0x11, 0x25, 0xb9, 0x2e, 0x84, 0xec, 0x4a, 0x88, 0xe7, 0xc4, 0x9a, 0x5f, 0x66, 0x05, 0x51, 0x1a, 0x60, 0xbd, 0x29, 0x62, 0xaf, 0xcd, + 0xb1, 0x05, 0x0e, 0x7c, 0xbb, 0xf0, 0xc6, 0x43, 0xd8, 0x6e, 0xb9, 0x75, 0x5f, 0x25, 0x7d, 0xdd, 0x11, 0xf1, 0x4e, 0xfa, 0x97, 0x1a, 0xfa, 0x7e, 0xa1, 0x6f, 0x61, 0xef, 0x08, 0x14, 0x9c, 0xa8, + 0xa2, 0x5c, 0x7c, 0x4e, 0x6b, 0xda, 0xc1, 0xaa, 0xdc, 0x2c, 0x06, 0x8e, 0xb1, 0xe7, 0xce, 0x4f, 0x15, 0x90, 0x13, 0xec, 0x86, 0xa5, 0x27, 0xfa, 0xe9, 0x60, 0x6e, 0xac, 0x7d, 0x42, 0xad, 0xd6, + 0x75, 0xbc, 0x16, 0x21, 0xa7, 0x80, 0x03, 0x4c, 0xae, 0x27, 0x53, 0xcd, 0x25, 0x92, 0x15, 0x59, 0x99, 0xb3, 0x99, 0x11, 0xf9, 0x74, 0xbb, 0x69, 0xc5, 0x0d, 0x18, 0x9e, 0x76, 0x56, 0xfd, 0x37, + 0xf6, 0xcd, 0xee, 0xc8, 0x7f, 0xef, 0xa9, 0xb0, 0x30, 0x1f, 0x76, 0xaf, 0xc4, 0x5e, 0x0a, 0xcf, 0xfc, 0x45, 0xf5, 0x7d, 0xa5, 0x3e, 0x1f, 0x77, 0x5a, 0x61, 0x0f, 0xc9, 0x84, 0x27, 0xa4, 0x56, + 0x65, 0xbc, 0x92, 0x2f, 0x48, 0x54, 0x16, 0xa7, 0xc7, 0x54, 0x0b, 0x1d, 0x18, 0x5b, 0x43, 0xf2, 0x2c, 0x85, 0x66, 0x8b, 0xe5, 0x54, 0x02, 0xa3, 0x49, 0x64, 0xf9, 0xd6, 0x61, 0x15, 0x8d, 0x84, + 0xac, 0xd9, 0x1e, 0xe0, 0x25, 0x9a, 0xb0, 0xb2, 0x27, 0x9c, 0x16, 0xe3, 0x16, 0x1c, 0x29, 0x7b, 0xe4, 0x30, 0x36, 0x8e, 0x69, 0x9b, 0xfa, 0xc8, 0x86, 0xaf, 0x9b, 0x40, 0x83, 0xc6, 0xc6, 0x6d, + 0xad, 0xef, 0x6f, 0x20, 0x7b, 0xbb, 0xd8, 0x5d, 0x69, 0xf9, 0x57, 0xaa, 0xce, 0x79, 0xa1, 0x25, 0x5e, 0x48, 0x4c, 0xe9, 0x9b, 0xa4, 0xd0, 0xab, 0x27, 0xd2, 0xe8, 0xa5, 0x6a, 0x5d, 0xcf, 0x7a, + 0x22, 0x8d, 0xfa, 0x55, 0xe8, 0x4a, 0x93, 0x29, 0x59, 0xed, 0x82, 0x71, 0x5e, 0x94, 0x3c, 0x5d, 0x99, 0x4c, 0x1e, 0x8d, 0xe8, 0x48, 0x5f, 0xed, 0xaa, 0x6a, 0x08, 0xc1, 0xe9, 0x52, 0xd5, 0x99, + 0xd3, 0x36, 0xe0, 0x41, 0x60, 0x5d, 0x37, 0xfa, 0x18, 0x80, 0x52, 0xa4, 0x5e, 0xb7, 0x15, 0x46, 0x59, 0x55, 0x41, 0x40, 0x20, 0xb5, 0x89, 0x90, 0x24, 0xe5, 0x27, 0xf9, 0xca, 0xa0, 0xdc, 0xd8, + 0x96, 0x16, 0xbb, 0x31, 0xc0, 0x57, 0xf5, 0xae, 0xa7, 0x3d, 0x76, 0xd5, 0x00, 0xe9, 0x35, 0x97, 0x5b, 0x9f, 0xbd, 0xe3, 0x42, 0x4d, 0x1e, 0x6d, 0x68, 0x62, 0xaf, 0x55, 0xe1, 0x3b, 0x53, 0x04, + 0x07, 0xdd, 0x9f, 0x01, 0xd6, 0xb3, 0x0a, 0x1f, 0x04, 0xca, 0x08, 0xb4, 0xa9, 0x77, 0xcb, 0xbd, 0xbf, 0xd5, 0xc5, 0xa9, 0xe0, 0x62, 0x24, 0x29, 0xe4, 0x00, 0x4f, 0x72, 0x8a, 0x52, 0xa7, 0x1b, + 0x46, 0x75, 0x93, 0xc5, 0x74, 0x56, 0x27, 0x30, 0x64, 0x6c, 0x59, 0x37, 0x39, 0x54, 0x82, 0x52, 0xef, 0xf7, 0x53, 0x17, 0x82, 0x65, 0x90, 0xf7, 0x83, 0xe5, 0xa2, 0xa5, 0x99, 0xb9, 0xb3, 0xd4, + 0xbd, 0x58, 0xf7, 0x01, 0x8a, 0x89, 0x26, 0xd6, 0x9a, 0x9c, 0xbf, 0xae, 0x04, 0x5c, 0x32, 0x2c, 0xd3, 0xb2, 0x4b, 0xd9, 0xb8, 0xb3, 0xb0, 0x5e, 0x8c, 0x61, 0xe3, 0xfe, 0x22, 0x6f, 0xc4, 0xc5, + 0xa5, 0xe5, 0xe5, 0x5f, 0x97, 0xb8, 0xa0, 0x9b, 0x21, 0x66, 0xc5, 0xd9, 0xc0, 0x54, 0x2f, 0x69, 0x7d, 0xff, 0x86, 0x7e, 0xa2, 0xd7, 0xea, 0x83, 0x55, 0x46, 0x97, 0x12, 0xdd, 0xef, 0x96, 0xf8, + 0xe7, 0x87, 0xdb, 0x41, 0xdc, 0x75, 0xbb, 0xfe, 0xf7, 0xe8, 0x27, 0x7c, 0xdd, 0x69, 0xd3, 0x51, 0x7f, 0xab, 0x2c, 0xe8, 0x97, 0x2a, 0x0b, 0x76, 0xad, 0xb2, 0xfc, 0x36, 0x3b, 0xbb, 0xff, 0x1d, + 0x7e, 0xfc, 0xf5, 0x63, 0xce, 0xe8, 0xbf, 0xaf, 0x9b, 0xff, 0xde, 0xdd, 0x90, 0xfb, 0x37, 0xfc, 0x73, 0x74, 0x0d, 0xc8, 0x9b, 0xdc, 0xbc, 0x7f, 0xcd, 0xe7, 0x5f, 0xdf, 0x62, 0xc5, 0xcf, 0x70, + 0xdc, 0xf1, 0x3c, 0xdf, 0x73, 0x08, 0x5f, 0xde, 0xe4, 0x0a, 0x96, 0xdb, 0xa8, 0xec, 0x3b, 0xc9, 0x3c, 0x9f, 0xe2, 0x01, 0xde, 0x84, 0xbf, 0x8b, 0x06, 0xe8, 0x8e, 0xfb, 0x8d, 0x97, 0xeb, 0xb5, + 0xbd, 0x67, 0x5b, 0x9c, 0x57, 0xf2, 0x37, 0x9e, 0x77, 0xc5, 0xe9, 0x95, 0xcc, 0xa1, 0x8e, 0x92, 0x19, 0x6d, 0x38, 0x70, 0xc3, 0x2c, 0x49, 0x5b, 0x6c, 0x85, 0xfd, 0xc2, 0x5e, 0xb3, 0x0d, 0xd8, + 0xd4, 0x94, 0x92, 0xfb, 0x1c, 0xbc, 0x37, 0x70, 0xd3, 0x96, 0x65, 0x0e, 0x9d, 0x19, 0xbb, 0x23, 0xa6, 0xb0, 0x1b, 0x6e, 0x46, 0xed, 0xc5, 0x39, 0xe0, 0xd4, 0x2d, 0xb2, 0xde, 0x4f, 0x81, 0x49, + 0x00, 0x08, 0xed, 0x5a, 0x22, 0xb9, 0xa8, 0x3e, 0x81, 0x5e, 0xeb, 0x80, 0x69, 0x59, 0x30, 0xfb, 0x67, 0xa3, 0xeb, 0x1f, 0xf7, 0x01, 0xfd, 0x2e, 0x4a, 0x75, 0x0f, 0x70, 0xe8, 0x25, 0x65, 0xea, + 0x8d, 0xe6, 0x79, 0xfa, 0xba, 0x1c, 0x0d, 0xa0, 0xe7, 0xea, 0x13, 0x3c, 0x58, 0x7b, 0x6d, 0x5b, 0x0f, 0x71, 0x5f, 0x30, 0x0f, 0x06, 0x1d, 0x9e, 0x94, 0xd9, 0xce, 0xcc, 0x4f, 0xcc, 0x4e, 0xb6, + 0xa7, 0xb3, 0x5e, 0x73, 0xbd, 0xe6, 0x46, 0x45, 0x66, 0x5e, 0x7c, 0x6a, 0x7d, 0x35, 0xf4, 0xc2, 0xcc, 0xc2, 0x41, 0xee, 0x9e, 0x1e, 0x07, 0x10, 0xbe, 0x12, 0xe0, 0xfb, 0x8b, 0xea, 0x19, 0x82, + 0xf7, 0xe3, 0x01, 0xd2, 0x2f, 0xb8, 0xb7, 0x66, 0xa0, 0x9d, 0x8b, 0x59, 0xfc, 0xc2, 0xab, 0x40, 0x69, 0xd3, 0x12, 0xc2, 0x84, 0x56, 0xa6, 0x4e, 0x40, 0x4c, 0xd9, 0x51, 0xc9, 0xea, 0xc3, 0x03, + 0xbb, 0x1e, 0x09, 0xa9, 0xbb, 0x85, 0x4e, 0x8b, 0x11, 0xb0, 0x1a, 0x1e, 0x32, 0x60, 0xc7, 0x6e, 0xa9, 0x98, 0x56, 0x91, 0x29, 0x27, 0xe2, 0x0c, 0xbd, 0x8f, 0xc4, 0xc5, 0x52, 0xa2, 0x51, 0x6c, + 0x4f, 0xb1, 0xfe, 0xe6, 0x44, 0xee, 0x5b, 0x35, 0x99, 0x28, 0xcf, 0x74, 0xc8, 0xde, 0x6b, 0xe0, 0xdf, 0x96, 0xcc, 0x6f, 0x96, 0x2f, 0xfc, 0x3d, 0x21, 0x3d, 0xb2, 0xba, 0xbf, 0x1f, 0x19, 0xf3, + 0x46, 0xf3, 0xcc, 0x9c, 0xcb, 0x51, 0x67, 0x65, 0x3f, 0x89, 0x82, 0x81, 0x07, 0x94, 0x21, 0xae, 0x40, 0x3c, 0x25, 0x38, 0x29, 0xb0, 0x73, 0x4d, 0xf7, 0x67, 0x07, 0x18, 0xa0, 0x62, 0xd5, 0xc5, + 0xac, 0xfd, 0x37, 0x0d, 0x9c, 0xc2, 0x0d, 0xcd, 0x2f, 0x13, 0xff, 0xf0, 0x97, 0x1c, 0xaf, 0xbf, 0xc9, 0x9e, 0x3f, 0xed, 0xd7, 0xc9, 0x00, 0x7f, 0xee, 0x78, 0xed, 0x04, 0x8f, 0xd5, 0x8b, 0xec, + 0x48, 0x21, 0xb4, 0xa2, 0xac, 0xcb, 0x65, 0xa0, 0x3b, 0x81, 0x3f, 0x43, 0x0c, 0x4b, 0x5a, 0x39, 0xa3, 0x15, 0xc2, 0x50, 0xcb, 0x31, 0x55, 0x07, 0x00, 0xa2, 0x6a, 0x1b, 0xd9, 0x86, 0xc2, 0xbc, + 0xde, 0xd2, 0x16, 0x4f, 0xb6, 0xdb, 0x23, 0xea, 0xad, 0x6c, 0x38, 0x91, 0x87, 0x07, 0xab, 0x28, 0x84, 0x25, 0xa7, 0x94, 0x8c, 0x2e, 0xc5, 0x13, 0x74, 0xbe, 0x68, 0x93, 0x83, 0x1f, 0x7c, 0xa7, + 0x0e, 0x53, 0x2f, 0x4d, 0xcb, 0x8d, 0xda, 0x41, 0x90, 0x95, 0x0f, 0x15, 0x5d, 0xe8, 0xc3, 0x6a, 0xde, 0x1f, 0xb8, 0x0b, 0xd1, 0x0e, 0xb6, 0xcb, 0xe1, 0xa0, 0xa3, 0xf4, 0x1c, 0xb4, 0x13, 0x27, + 0xf3, 0x10, 0x53, 0xd9, 0xd1, 0x30, 0x93, 0x4e, 0xc7, 0x64, 0x0d, 0xb5, 0xe8, 0x4e, 0x80, 0xc6, 0x39, 0xcb, 0xe0, 0x23, 0x73, 0xa1, 0x6e, 0xbd, 0x31, 0x01, 0x0d, 0xbd, 0x80, 0x19, 0x2f, 0xf0, + 0x44, 0x50, 0x0d, 0x2b, 0x73, 0x45, 0xfd, 0x74, 0x5a, 0xd3, 0x73, 0x49, 0x05, 0x1b, 0xfd, 0x88, 0x85, 0xcb, 0x9d, 0x15, 0x06, 0x93, 0x31, 0xdd, 0x6e, 0x41, 0x40, 0xb0, 0xd7, 0xd0, 0x01, 0x2e, + 0xe3, 0xe7, 0xf9, 0x1d, 0xd1, 0xb7, 0x8a, 0x57, 0x15, 0xf1, 0xa0, 0x9f, 0x17, 0x0b, 0x7e, 0x4d, 0xee, 0x3e, 0x91, 0x3f, 0x03, 0xf9, 0xe9, 0x62, 0xb7, 0x7f, 0xd3, 0x43, 0x0e, 0x97, 0x29, 0x32, + 0x94, 0x26, 0x05, 0x7e, 0xa2, 0x86, 0x51, 0xb2, 0x71, 0x82, 0xf5, 0x41, 0x5a, 0xcc, 0x39, 0x14, 0xb4, 0xdb, 0x1d, 0x02, 0xa6, 0x3c, 0xa5, 0x33, 0x1c, 0xd7, 0x8a, 0xac, 0x81, 0x55, 0x5a, 0x88, + 0x8e, 0xe9, 0xbd, 0xca, 0xbb, 0x24, 0x8b, 0x6d, 0xd8, 0x14, 0x32, 0xd9, 0xc3, 0x14, 0x14, 0xfd, 0xe6, 0x04, 0x28, 0x9e, 0x91, 0xeb, 0xc3, 0xa1, 0x3d, 0x6e, 0xdb, 0x13, 0x20, 0xa7, 0x10, 0xf4, + 0xcc, 0xd4, 0xfb, 0x53, 0x28, 0xdb, 0x66, 0x33, 0xc8, 0xd4, 0xc8, 0x7e, 0xb4, 0xa0, 0x0c, 0x5f, 0xda, 0x0c, 0xb8, 0x26, 0xfd, 0x8e, 0xee, 0xaf, 0x0b, 0x83, 0xe1, 0xf3, 0x2d, 0x80, 0x33, 0xb2, + 0xf8, 0x70, 0x33, 0x72, 0x4f, 0xb8, 0x34, 0x6c, 0x67, 0x19, 0xac, 0xd7, 0xba, 0x5d, 0x6d, 0x1b, 0x4d, 0x5b, 0xd6, 0xa3, 0xbd, 0x8f, 0xda, 0x7c, 0x3b, 0x34, 0x96, 0x46, 0xa1, 0x60, 0x19, 0x55, + 0x99, 0xeb, 0xd4, 0xc9, 0x8c, 0xd5, 0x06, 0x58, 0xbb, 0x20, 0xdd, 0xe0, 0x45, 0xcb, 0x40, 0xdc, 0x4c, 0x03, 0x90, 0xc5, 0xb4, 0x8d, 0xcc, 0x29, 0xbb, 0x72, 0x17, 0x69, 0x46, 0x52, 0x53, 0x81, + 0xf3, 0x89, 0xfc, 0x19, 0xb2, 0x5f, 0x86, 0x4f, 0x44, 0x65, 0xa8, 0xbd, 0x79, 0xb9, 0x47, 0xaf, 0x59, 0x67, 0xbd, 0x8c, 0xe4, 0xf7, 0xb6, 0xf4, 0xf7, 0x38, 0x82, 0xbe, 0x94, 0x38, 0xde, 0x51, + 0xec, 0x18, 0x51, 0xea, 0x4e, 0x17, 0x56, 0xdd, 0x43, 0xb2, 0x8f, 0x93, 0x86, 0xd8, 0xb7, 0x43, 0x71, 0x5d, 0xf0, 0xc2, 0xae, 0x58, 0xa6, 0x00, 0x0b, 0xa1, 0x60, 0xce, 0x50, 0x99, 0x34, 0x5d, + 0xd3, 0x4d, 0x4d, 0xe9, 0x69, 0x29, 0x6c, 0x10, 0x1d, 0x43, 0xd7, 0x26, 0x84, 0x82, 0xe3, 0xdc, 0xcc, 0xbc, 0xed, 0x64, 0x79, 0x2a, 0xbc, 0xdd, 0x09, 0x9f, 0xfb, 0x2b, 0xf3, 0x34, 0xa6, 0x40, + 0x27, 0x30, 0x5b, 0x52, 0x12, 0x27, 0x8b, 0x75, 0x5d, 0x2b, 0xfb, 0x7a, 0xfc, 0xa8, 0x6d, 0x75, 0x0f, 0xfc, 0xdf, 0x3b, 0xd6, 0x5e, 0xfc, 0x99, 0x7d, 0xa2, 0xe3, 0xcf, 0xa0, 0xfe, 0x6a, 0xf1, + 0xff, 0xde, 0x6a, 0xbf, 0xbb, 0xd0, 0x2f, 0x00, 0xf8, 0x6c, 0x7d, 0x0c, 0xac, 0xaf, 0xf4, 0x4d, 0xe2, 0x95, 0xd1, 0xf1, 0x4e, 0xf5, 0xcc, 0x8f, 0xf7, 0xe3, 0x41, 0x47, 0xeb, 0x39, 0x4f, 0x30, + 0x43, 0x3b, 0x2d, 0x4f, 0x69, 0xe5, 0x15, 0xb6, 0xcb, 0x0e, 0xb3, 0x1a, 0xf6, 0x87, 0xd9, 0x8c, 0x2e, 0x26, 0x24, 0xc7, 0x84, 0x46, 0x69, 0x38, 0x8b, 0x76, 0x32, 0x53, 0x3d, 0x0e, 0x82, 0xad, + 0x59, 0xeb, 0xa8, 0xe4, 0xd2, 0xc9, 0x63, 0x86, 0x6b, 0xf1, 0x76, 0x04, 0x2c, 0xb9, 0x31, 0xba, 0xb4, 0x92, 0x79, 0x51, 0xcb, 0x63, 0x37, 0x75, 0x47, 0x3e, 0x05, 0x34, 0x35, 0xe3, 0x6c, 0x73, + 0x6e, 0xf5, 0x8c, 0x27, 0xcf, 0x84, 0xba, 0x27, 0x94, 0x46, 0xe7, 0x25, 0x1f, 0x14, 0xf1, 0xd7, 0xce, 0x64, 0xf4, 0xa5, 0x5e, 0x97, 0xf7, 0x1e, 0xf0, 0x06, 0xf0, 0xed, 0xe5, 0x4e, 0xfe, 0x7b, + 0xa4, 0x83, 0x9c, 0x8c, 0x92, 0x90, 0x58, 0x6e, 0x46, 0x99, 0x09, 0xc3, 0xec, 0x00, 0x49, 0xe6, 0x25, 0xf2, 0xb0, 0x29, 0x8e, 0xa5, 0x0b, 0x05, 0x2d, 0xc4, 0x15, 0xb1, 0xb3, 0xcf, 0xf5, 0x1a, + 0xd8, 0x87, 0x2a, 0xed, 0x92, 0x47, 0x91, 0x70, 0xb2, 0x03, 0x9c, 0x65, 0x20, 0x48, 0xe3, 0x07, 0x00, 0xa2, 0xaa, 0x15, 0xca, 0x6f, 0xe1, 0xb1, 0x30, 0x1e, 0x8d, 0x59, 0x28, 0x50, 0xd7, 0x96, + 0x44, 0x64, 0x21, 0x81, 0xfc, 0xad, 0xf9, 0xe7, 0xf7, 0xd7, 0xfc, 0xf5, 0x9d, 0xd4, 0xec, 0x32, 0xd2, 0xe2, 0x66, 0x90, 0x64, 0x6e, 0xe8, 0x16, 0xee, 0x17, 0xf5, 0x06, 0x5e, 0x99, 0xeb, 0x6f, + 0x68, 0x83, 0x83, 0xdb, 0x2b, 0x7d, 0x3a, 0xab, 0x9c, 0xd1, 0x2e, 0x94, 0x3d, 0x88, 0x72, 0x29, 0x83, 0x1a, 0xe4, 0xd0, 0x4e, 0x66, 0x30, 0x53, 0xb4, 0xee, 0x6a, 0x9f, 0xcd, 0x26, 0x50, 0xd0, + 0x44, 0x0b, 0x9f, 0x9d, 0xd3, 0x49, 0xb1, 0x1a, 0xa5, 0xb8, 0x59, 0x1b, 0x0a, 0x91, 0xc3, 0xc8, 0x36, 0xe3, 0xa9, 0x9a, 0xd3, 0x9c, 0xe5, 0x4a, 0x28, 0xc2, 0x95, 0x6f, 0xc0, 0x5b, 0x4a, 0x52, + 0x61, 0x6e, 0x47, 0x12, 0xea, 0x1c, 0x21, 0xe1, 0x93, 0x0f, 0xca, 0xc9, 0x6d, 0xc9, 0x96, 0x87, 0x25, 0x77, 0x6f, 0x3d, 0x30, 0x9f, 0xb7, 0x04, 0x1d, 0x35, 0x1f, 0x68, 0xae, 0xed, 0xbe, 0x15, + 0xc8, 0xfa, 0xdc, 0xfb, 0xf0, 0x5e, 0x73, 0xc4, 0x2b, 0x27, 0x50, 0xed, 0xb8, 0xba, 0x33, 0xd0, 0xe2, 0xc6, 0x34, 0xae, 0x78, 0xf1, 0xb0, 0x43, 0xc2, 0xab, 0x36, 0x4b, 0x6f, 0x6b, 0xba, 0x8c, + 0x0c, 0xd3, 0xca, 0x55, 0xeb, 0xb1, 0x39, 0xf9, 0x4a, 0x30, 0xf3, 0x2f, 0xaa, 0x9d, 0x2c, 0xbc, 0x1d, 0xf7, 0xad, 0x1a, 0x1e, 0x65, 0x92, 0x52, 0xd7, 0x52, 0x46, 0x81, 0x22, 0xb8, 0x92, 0xcc, + 0xd6, 0x5e, 0xa5, 0xc6, 0x94, 0xc7, 0x39, 0x45, 0x81, 0xd7, 0x38, 0x4e, 0x67, 0x0d, 0x0b, 0x2a, 0xa3, 0x70, 0x99, 0x22, 0xf1, 0x46, 0x8d, 0x62, 0x0e, 0x9a, 0xc3, 0xd1, 0xba, 0x41, 0x83, 0x7a, + 0xc5, 0x96, 0x38, 0x59, 0xaf, 0x64, 0x7c, 0xec, 0x18, 0x6e, 0xa3, 0xce, 0xb7, 0x7c, 0x19, 0xcb, 0x39, 0xeb, 0xcd, 0x86, 0xe0, 0x14, 0x79, 0x36, 0xbf, 0x7d, 0xe5, 0x14, 0x7c, 0xdf, 0x9b, 0x46, + 0x7a, 0xe6, 0xfa, 0xfd, 0xfe, 0xfa, 0xab, 0xcb, 0xef, 0x84, 0xee, 0xc3, 0x8c, 0xff, 0x1c, 0x7f, 0x1b, 0xe6, 0x8e, 0x22, 0x38, 0xb8, 0xfc, 0x1d, 0x74, 0x34, 0x9e, 0xc3, 0xab, 0x4d, 0x47, 0xb3, + 0x20, 0x33, 0x56, 0xea, 0x2a, 0xda, 0x68, 0xe4, 0x06, 0x80, 0x67, 0x71, 0x21, 0x57, 0xa9, 0x92, 0x6b, 0xa8, 0xa9, 0x07, 0xc3, 0xda, 0xc5, 0x27, 0x96, 0x8b, 0x4f, 0x56, 0xe2, 0x5e, 0xe7, 0xe2, + 0x3a, 0xc1, 0xf5, 0x2a, 0x4f, 0x6c, 0xc8, 0x93, 0x4e, 0xd1, 0x4e, 0x64, 0x28, 0x2f, 0x04, 0x67, 0x23, 0xd2, 0xb0, 0xe7, 0x93, 0x83, 0x49, 0x6e, 0x0e, 0x2c, 0xa7, 0x33, 0x8b, 0x9c, 0x66, 0x5f, + 0x87, 0x37, 0xcc, 0xff, 0xfa, 0x95, 0x41, 0xda, 0x07, 0x5a, 0x37, 0x2d, 0xdf, 0xdb, 0xa2, 0x7c, 0x21, 0xb2, 0xdf, 0x57, 0x8f, 0xae, 0x28, 0x77, 0x62, 0xfb, 0xe1, 0xbc, 0x6f, 0x46, 0x6a, 0xc9, + 0xa9, 0xa6, 0x9b, 0xcd, 0x36, 0x55, 0xa2, 0x1c, 0x05, 0xfb, 0x54, 0xe7, 0x9b, 0x45, 0xb1, 0x47, 0x4e, 0x07, 0x41, 0xcc, 0x22, 0x90, 0x58, 0x0f, 0x53, 0x70, 0x69, 0x36, 0x4a, 0x48, 0x43, 0x26, + 0x8d, 0x0b, 0xe4, 0x08, 0x9d, 0x86, 0x24, 0x39, 0xdc, 0x63, 0x8b, 0x9a, 0xdf, 0x89, 0xcd, 0x96, 0x54, 0xf2, 0xf1, 0x50, 0x24, 0xa5, 0x35, 0x97, 0x9a, 0xeb, 0x78, 0xb3, 0xe1, 0xf8, 0xa1, 0xad, + 0x58, 0xc7, 0x67, 0x9e, 0x90, 0x2f, 0x36, 0xb5, 0xb3, 0x36, 0x39, 0xeb, 0xdd, 0x6a, 0x64, 0x7c, 0x2c, 0xdc, 0xf3, 0x4f, 0x16, 0xbe, 0x2d, 0x13, 0x43, 0x2d, 0xcc, 0x41, 0x14, 0x17, 0xae, 0xe5, + 0x3e, 0x5c, 0xdf, 0xb1, 0xab, 0xa8, 0xd3, 0xde, 0x2c, 0xba, 0xa6, 0x7d, 0x66, 0xd2, 0xf5, 0x95, 0xae, 0x0d, 0x6f, 0x8f, 0x19, 0x46, 0x0e, 0x0c, 0x5c, 0x81, 0x76, 0xed, 0x54, 0x5e, 0x4c, 0x70, + 0xdd, 0x5f, 0x7a, 0x96, 0xb5, 0xe0, 0x05, 0x3e, 0xa4, 0x25, 0x0f, 0xb6, 0x59, 0x73, 0x36, 0x52, 0x77, 0xfc, 0x09, 0x63, 0x17, 0x80, 0xc4, 0xfa, 0xa1, 0xdb, 0x4c, 0x24, 0xcc, 0xdb, 0x47, 0x76, + 0xb6, 0x90, 0x38, 0xf9, 0x34, 0xaa, 0x37, 0xcc, 0x24, 0x2c, 0x62, 0x0a, 0x63, 0xa3, 0x89, 0x8a, 0x90, 0x51, 0x39, 0xda, 0x09, 0x8c, 0x53, 0x80, 0xaf, 0x0f, 0x81, 0xf3, 0x7a, 0xd0, 0xc1, 0xf2, + 0x2f, 0xec, 0x53, 0xdc, 0x8c, 0xa3, 0x06, 0xfe, 0x5f, 0x77, 0x83, 0x5f, 0xf4, 0x38, 0xb2, 0x5c, 0xfb, 0x3d, 0x33, 0xed, 0xd2, 0x11, 0xf0, 0xd3, 0x6a, 0xd4, 0xaa, 0x59, 0xf4, 0xd7, 0xdd, 0x90, + 0x1b, 0x37, 0x4c, 0xe2, 0xac, 0x18, 0x04, 0xea, 0xa9, 0x7d, 0x70, 0x43, 0x3e, 0xd0, 0xdd, 0x0f, 0xd2, 0x72, 0xfd, 0x93, 0x1b, 0xe5, 0x85, 0x1a, 0x04, 0xa6, 0x31, 0xb0, 0x83, 0x58, 0x53, 0x83, + 0xe0, 0x42, 0x05, 0xba, 0x8d, 0xc1, 0x39, 0x5b, 0x4c, 0x49, 0xf8, 0xd7, 0x7f, 0xbd, 0xd7, 0xd4, 0xd0, 0xbd, 0xbc, 0xdf, 0x1b, 0x85, 0x5f, 0xff, 0x7f, 0x75, 0x4f, 0xa0, 0x76, 0x7b, 0xae, 0x1f, + 0x64, 0xe7, 0x73, 0xeb, 0xc3, 0xb7, 0x4a, 0xd7, 0x97, 0x17, 0xbd, 0x8e, 0x96, 0xb8, 0x4a, 0x57, 0xbd, 0x44, 0x17, 0x5d, 0xdd, 0xd0, 0x18, 0xf6, 0x40, 0x53, 0x73, 0xd3, 0x70, 0xb3, 0xbf, 0xfe, + 0xc4, 0x86, 0xdb, 0xaf, 0xff, 0xf8, 0xe6, 0xc2, 0xdd, 0x9a, 0x71, 0xa8, 0x46, 0xb7, 0xf2, 0xfc, 0x7f, 0xbc, 0xad, 0xe7, 0xff, 0xad, 0x8f, 0x63, 0xf8, 0x76, 0x74, 0x5c, 0xfd, 0xf8, 0x2e, 0x47, + 0xf7, 0x95, 0xed, 0x57, 0xe6, 0xcb, 0x8e, 0x22, 0x38, 0xb8, 0xfc, 0xed, 0x5b, 0xab, 0x1e, 0xa3, 0xd0, 0x09, 0x7e, 0xb4, 0x30, 0x98, 0xe1, 0xe5, 0xdd, 0xdc, 0xc8, 0x4f, 0x21, 0x95, 0xb2, 0xd3, + 0x45, 0x3a, 0x3c, 0x1c, 0xc0, 0x92, 0x25, 0x27, 0xc8, 0x08, 0x5d, 0x2d, 0xd7, 0x21, 0x0f, 0xa0, 0x1e, 0x19, 0x38, 0x84, 0x84, 0xa5, 0x54, 0x61, 0x14, 0xf6, 0x74, 0x87, 0x5a, 0x4d, 0xa1, 0xad, + 0x67, 0xec, 0x49, 0x68, 0x10, 0x64, 0x6b, 0x38, 0x11, 0xa5, 0xaf, 0xaa, 0x12, 0x29, 0x61, 0xeb, 0xf0, 0x37, 0xa2, 0x0d, 0xba, 0xd0, 0xcb, 0xbc, 0x68, 0x83, 0xb7, 0xb0, 0x56, 0xec, 0x76, 0x0c, + 0x7c, 0xda, 0xaa, 0x3e, 0x1b, 0xfd, 0xf0, 0xdf, 0x92, 0x90, 0x2f, 0x18, 0x98, 0xb9, 0x03, 0x2f, 0x7f, 0x38, 0x63, 0xbe, 0x92, 0x36, 0x75, 0x21, 0x79, 0x9e, 0x28, 0xbb, 0x83, 0x01, 0xd6, 0x2f, + 0x5d, 0x6a, 0x94, 0x31, 0xfb, 0xb6, 0x45, 0xd1, 0x2d, 0xdc, 0xea, 0x63, 0x22, 0xd9, 0xc2, 0x14, 0x19, 0xae, 0x8b, 0x5a, 0x82, 0xa1, 0xf1, 0x7c, 0x24, 0x2e, 0xad, 0x63, 0x70, 0x84, 0x65, 0x23, + 0x26, 0x8e, 0x01, 0xec, 0xba, 0xb0, 0x60, 0xd2, 0xae, 0x69, 0x3a, 0x10, 0x4d, 0x5b, 0x1b, 0x73, 0x8d, 0x58, 0xac, 0xc4, 0xe0, 0x27, 0x28, 0x27, 0x4c, 0x9d, 0xc9, 0xc7, 0x56, 0x36, 0x2d, 0xd7, + 0xab, 0x2a, 0x32, 0x26, 0x3d, 0xd3, 0xa5, 0x3e, 0xd4, 0xfa, 0x7f, 0x9f, 0x94, 0xfa, 0x40, 0x17, 0xbc, 0xd5, 0x38, 0x08, 0xd4, 0xe6, 0x8f, 0x8a, 0xf9, 0x15, 0xe5, 0x0e, 0xc8, 0x0f, 0xe7, 0x7d, + 0xc4, 0x1e, 0x1e, 0xcc, 0x33, 0x89, 0x01, 0x49, 0x4b, 0xc3, 0x10, 0x23, 0x5f, 0x34, 0xa1, 0x32, 0x47, 0x6d, 0x0f, 0x0e, 0x48, 0xbc, 0xad, 0xeb, 0x57, 0x05, 0xf7, 0xa6, 0x9f, 0xd7, 0xab, 0x0b, + 0x7a, 0x9f, 0xa8, 0xe1, 0xb2, 0x70, 0x1f, 0x25, 0xb3, 0x42, 0x3f, 0xe1, 0x57, 0x72, 0x71, 0xce, 0x14, 0xcf, 0x48, 0x16, 0x6e, 0x30, 0xb8, 0x90, 0x78, 0x2e, 0x91, 0x5a, 0xa3, 0x8c, 0xd3, 0x42, + 0x08, 0x16, 0xfb, 0xa3, 0xc0, 0xb7, 0xe3, 0xad, 0x3a, 0x96, 0x6c, 0x1f, 0x86, 0x7d, 0x21, 0x0f, 0x92, 0x52, 0xa9, 0xd5, 0x66, 0x6a, 0x63, 0x39, 0xb7, 0xa4, 0x3c, 0x7c, 0xbe, 0x2e, 0x75, 0x4a, + 0xd5, 0x90, 0x55, 0x13, 0xd1, 0x75, 0xcb, 0x89, 0xd3, 0x84, 0x66, 0x0b, 0x06, 0x66, 0xbd, 0x78, 0xeb, 0x1e, 0xb7, 0x38, 0xe5, 0xee, 0x59, 0x45, 0xd6, 0x84, 0x8c, 0x07, 0x84, 0x9e, 0x96, 0xe1, + 0xc7, 0x5d, 0xf4, 0x7f, 0xdd, 0x09, 0xfc, 0x1b, 0xa8, 0x99, 0x5d, 0xfe, 0x2a, 0x9b, 0xfc, 0x2f, 0xf8, 0xce, 0x3e, 0xbb, 0x6d, 0x46, 0x66, 0xa6, 0x16, 0x71, 0x36, 0x78, 0x37, 0x33, 0x7f, 0xdd, + 0x3a, 0xba, 0xb9, 0xb5, 0xb3, 0xef, 0x07, 0x1f, 0x0d, 0xfc, 0x9b, 0x04, 0x9d, 0x9b, 0x10, 0xa9, 0x7f, 0x0d, 0x6f, 0x23, 0x0d, 0x2e, 0x46, 0xe6, 0x3d, 0x3a, 0x7d, 0xf2, 0x0a, 0x3f, 0x05, 0x0f, + 0x3e, 0xf2, 0x13, 0x7c, 0x3f, 0x9c, 0xea, 0x9a, 0xf4, 0xbb, 0x08, 0xfc, 0xba, 0xd0, 0xaf, 0xe2, 0xdd, 0x6e, 0x0b, 0x73, 0xad, 0x95, 0xd4, 0x68, 0xc4, 0x46, 0x72, 0x55, 0x09, 0x30, 0xc3, 0xac, + 0xec, 0xfd, 0x42, 0xa5, 0xd8, 0xfb, 0xfd, 0x57, 0xbf, 0xf8, 0xd2, 0xd2, 0x35, 0x1e, 0x7c, 0x1f, 0xf1, 0x13, 0x7d, 0xe5, 0xfb, 0x4a, 0xd7, 0x38, 0x7f, 0x55, 0xe9, 0x1a, 0x83, 0x8e, 0xc2, 0x73, + 0xb9, 0x06, 0x38, 0x39, 0x47, 0xb6, 0x26, 0x7b, 0x6c, 0x81, 0xc5, 0x71, 0xce, 0xcf, 0xc2, 0x71, 0x13, 0x45, 0x38, 0x3d, 0xa5, 0x12, 0x28, 0x18, 0x6d, 0x27, 0xd4, 0x28, 0x0c, 0x88, 0xd3, 0x7a, + 0x1f, 0xae, 0x80, 0x31, 0xba, 0x1d, 0x72, 0x73, 0x88, 0x8b, 0xf5, 0x59, 0x16, 0xd5, 0xbe, 0xe8, 0x4b, 0x87, 0x39, 0xe7, 0x4a, 0x28, 0x68, 0x25, 0x53, 0x5c, 0xb5, 0x04, 0x82, 0x72, 0x34, 0xd0, + 0x3e, 0x8d, 0x76, 0x23, 0xf3, 0x6a, 0xa6, 0xfd, 0xe4, 0x11, 0x7d, 0xfb, 0xec, 0xbf, 0x0c, 0x37, 0x2f, 0x40, 0xcd, 0x8d, 0x2e, 0x38, 0xf4, 0x10, 0x8c, 0xf3, 0x67, 0x7d, 0xdd, 0x77, 0xf6, 0x15, + 0xb7, 0xf4, 0x6f, 0xb2, 0xef, 0xd0, 0xbd, 0xf7, 0x9d, 0xed, 0xe5, 0xa0, 0xe6, 0x8d, 0x50, 0x6a, 0x48, 0x22, 0xa3, 0xf2, 0xed, 0x48, 0x4e, 0xb8, 0x83, 0xc6, 0x08, 0x2b, 0x9f, 0x3b, 0x89, 0x35, + 0xb2, 0x04, 0x84, 0xe1, 0x31, 0xd7, 0x58, 0x2a, 0x9a, 0x16, 0xcb, 0xa3, 0xb0, 0x55, 0xe3, 0x9c, 0x23, 0xf5, 0x63, 0x31, 0x2f, 0x97, 0xa0, 0xcc, 0xc0, 0xa2, 0x77, 0xda, 0x2f, 0xf1, 0x48, 0xf3, + 0x6d, 0x37, 0x9d, 0xb5, 0x0e, 0x61, 0x1f, 0x23, 0xdb, 0xd2, 0x2b, 0x82, 0xcc, 0x8d, 0xf1, 0xd7, 0x45, 0xb6, 0x1e, 0x39, 0x71, 0xfe, 0xdc, 0x40, 0xb9, 0xfb, 0x04, 0x70, 0x70, 0xff, 0x7a, 0x9f, + 0x61, 0xd3, 0x4d, 0xa1, 0xb5, 0x62, 0x54, 0x10, 0xc9, 0xac, 0x93, 0x24, 0x98, 0xcb, 0x08, 0xa3, 0xec, 0x24, 0x5c, 0xac, 0xda, 0x92, 0x1b, 0xc5, 0x9e, 0x97, 0x8d, 0x82, 0xda, 0xb7, 0xf1, 0x30, + 0x80, 0xb2, 0x78, 0xd9, 0x8e, 0x65, 0xb3, 0x14, 0xb2, 0xd1, 0x4a, 0x40, 0x47, 0x48, 0x1a, 0x70, 0x47, 0x98, 0xd8, 0x6f, 0xe5, 0x93, 0x2d, 0x33, 0xe3, 0x93, 0xbb, 0xd0, 0xcd, 0xec, 0x98, 0x2a, + 0x7c, 0x38, 0x8b, 0xc6, 0x87, 0xbe, 0x39, 0xd0, 0xee, 0xbb, 0xe3, 0xec, 0xaf, 0xbb, 0x7e, 0xb3, 0xf3, 0xcf, 0x71, 0x1c, 0x98, 0x6a, 0x34, 0xb8, 0x44, 0xba, 0xfc, 0x9a, 0xb1, 0x6e, 0xed, 0x85, + 0xcb, 0xee, 0xcb, 0xf5, 0x5d, 0x9f, 0xa7, 0xdb, 0x0f, 0x96, 0xee, 0xa7, 0xb8, 0x26, 0xf7, 0xdd, 0x45, 0xf7, 0xeb, 0xe7, 0xff, 0x44, 0x22, 0xd3, 0xbd, 0x39, 0xfa, 0xd1, 0x98, 0xfa, 0x7e, 0x90, + 0xfe, 0x27, 0xea, 0xbf, 0x64, 0xe7, 0xc3, 0xb5, 0x6e, 0x84, 0xf5, 0x08, 0xd4, 0xaf, 0xbc, 0x46, 0x9d, 0x60, 0x91, 0x45, 0xa5, 0x35, 0xb3, 0x84, 0xea, 0x7c, 0x54, 0x2b, 0x49, 0xb3, 0x0c, 0x0c, + 0x13, 0x96, 0xb2, 0xb5, 0x34, 0x2c, 0x27, 0x90, 0xe2, 0x25, 0x56, 0xee, 0xd8, 0xa1, 0x9a, 0xac, 0x58, 0x6a, 0xe4, 0xad, 0x8e, 0x8e, 0xb2, 0x04, 0x5a, 0x31, 0x5e, 0x89, 0xa9, 0x3a, 0x9f, 0xb4, + 0x73, 0xc8, 0xe4, 0x26, 0xba, 0xdc, 0x68, 0x5e, 0x38, 0x3d, 0xc5, 0xbb, 0xcd, 0x68, 0x6a, 0xcd, 0x7a, 0x2e, 0xbd, 0x6a, 0xa5, 0xba, 0x41, 0xb7, 0x21, 0xfb, 0xe1, 0xc5, 0xf3, 0xfb, 0x8c, 0x7d, + 0x92, 0xc8, 0x76, 0x37, 0xaf, 0xf5, 0x8a, 0x80, 0x15, 0x67, 0xef, 0x01, 0x7a, 0xdd, 0x32, 0x7f, 0xf5, 0xe3, 0xd9, 0x98, 0x2e, 0xe2, 0x8b, 0x60, 0x15, 0xea, 0x6f, 0xd9, 0xba, 0x15, 0xd0, 0x7b, + 0xcb, 0xee, 0xe8, 0xdb, 0x8a, 0xd9, 0x7f, 0x28, 0x6d, 0xb6, 0x76, 0x8d, 0xb3, 0xb1, 0x1d, 0xb8, 0xd1, 0xa3, 0xf9, 0xec, 0xb5, 0xad, 0xc7, 0x0f, 0x74, 0xcf, 0x92, 0xf8, 0xfb, 0xac, 0xef, 0x36, + 0x24, 0x97, 0x87, 0xb1, 0xa4, 0x06, 0xf9, 0xf1, 0x40, 0xb1, 0x8b, 0x32, 0x69, 0x94, 0xe1, 0x0e, 0x22, 0x7c, 0x75, 0x6c, 0x05, 0x8a, 0xe7, 0xb9, 0xeb, 0x8a, 0x3e, 0x90, 0x47, 0x99, 0x67, 0x0a, + 0x97, 0x61, 0x89, 0xd2, 0x2b, 0x94, 0x63, 0x36, 0xd6, 0x77, 0x96, 0xa5, 0xfa, 0x40, 0x29, 0xcc, 0x30, 0x02, 0xe0, 0x35, 0x82, 0xd7, 0xd4, 0x40, 0x4a, 0xea, 0xd6, 0xdc, 0xbb, 0x2d, 0x45, 0xe1, + 0xdb, 0xb9, 0xfd, 0xba, 0xdd, 0x98, 0x5f, 0x57, 0x17, 0xf8, 0xfb, 0x6e, 0x83, 0x5e, 0x2c, 0xb9, 0xb6, 0xe8, 0xaf, 0xd2, 0x06, 0xef, 0xb1, 0x6a, 0xf8, 0x92, 0xbd, 0xf3, 0x9b, 0x2c, 0x38, 0xf8, + 0x70, 0xd2, 0xed, 0xd7, 0xf7, 0x60, 0x94, 0x26, 0xe3, 0x96, 0x37, 0xc4, 0xf9, 0xfd, 0x16, 0x72, 0xf6, 0x30, 0xe3, 0xcd, 0x39, 0x6a, 0x5b, 0xae, 0xe6, 0xe6, 0x29, 0x65, 0x8c, 0x8c, 0x6c, 0xe7, + 0xc6, 0xd2, 0xac, 0x48, 0xca, 0x4d, 0xb3, 0x23, 0x5d, 0x0b, 0x81, 0x16, 0x4e, 0x38, 0x96, 0x4e, 0x86, 0xaa, 0x8f, 0x58, 0x18, 0xb4, 0x09, 0x89, 0x95, 0x38, 0x6f, 0x59, 0x24, 0x4c, 0x1b, 0x7f, + 0x81, 0x47, 0xb6, 0x4f, 0xf3, 0x30, 0x6c, 0x81, 0xc1, 0x33, 0x46, 0xfd, 0x93, 0x30, 0x9b, 0x61, 0xec, 0x7d, 0x8d, 0x33, 0xf1, 0x12, 0xce, 0x1f, 0xe8, 0x82, 0x83, 0x8f, 0x67, 0x03, 0xa2, 0x1f, + 0xd2, 0xac, 0xe0, 0xc9, 0x27, 0xfd, 0xc8, 0xf1, 0x24, 0x64, 0xd6, 0x24, 0x9d, 0x9c, 0x20, 0xb6, 0x49, 0xe4, 0x79, 0x55, 0xdb, 0x78, 0xeb, 0xb5, 0x30, 0xb7, 0x40, 0x9b, 0xc2, 0x8c, 0xd3, 0x13, + 0x8e, 0x61, 0x87, 0x69, 0x0c, 0xee, 0x36, 0x76, 0x94, 0xc1, 0xe0, 0x62, 0x51, 0x00, 0xae, 0x8e, 0xba, 0x2b, 0xf1, 0xb4, 0x25, 0x66, 0x25, 0x2a, 0x1a, 0x2c, 0x8c, 0x09, 0x6a, 0x1d, 0x1d, 0xf6, + 0xe1, 0x62, 0x86, 0x7f, 0xbb, 0xdc, 0xcb, 0x43, 0xdc, 0x1e, 0x17, 0x9a, 0xf8, 0x73, 0xb6, 0xf9, 0x83, 0x67, 0x80, 0x83, 0x47, 0xbf, 0xf4, 0xb1, 0xd7, 0xbb, 0x5d, 0xdf, 0x36, 0x0c, 0x87, 0x40, + 0x09, 0xe4, 0xd3, 0x5c, 0x38, 0xb6, 0xd4, 0x38, 0xe5, 0x54, 0xd3, 0x3b, 0xa0, 0xd4, 0xbc, 0x72, 0xa6, 0x8c, 0x1e, 0x30, 0x86, 0x7b, 0x92, 0xd5, 0xd5, 0xbe, 0xa4, 0x49, 0x02, 0xdd, 0xad, 0x3d, + 0x6d, 0x14, 0x09, 0xe5, 0x22, 0x32, 0x8c, 0x29, 0xbd, 0xa8, 0x20, 0xc7, 0x07, 0x18, 0x79, 0x34, 0x61, 0xc9, 0x20, 0x3f, 0x9a, 0x0c, 0xb6, 0x37, 0x6d, 0x7c, 0x76, 0xc0, 0xa5, 0xed, 0x7f, 0x52, + 0x8a, 0xf3, 0xe7, 0xe5, 0x50, 0xb0, 0x97, 0xea, 0x51, 0xe7, 0x5f, 0x94, 0x43, 0xc1, 0xfa, 0x55, 0xa8, 0x96, 0x26, 0x2b, 0x4d, 0x44, 0x39, 0x6c, 0xe5, 0x1c, 0xca, 0x50, 0x9a, 0x41, 0x66, 0xbc, + 0xde, 0x8f, 0xa9, 0xa9, 0xa7, 0xab, 0xf3, 0x31, 0xc2, 0xac, 0xb9, 0x54, 0x0c, 0xe7, 0xd3, 0x68, 0x01, 0x27, 0x16, 0x61, 0x94, 0xfb, 0x66, 0xbe, 0xa8, 0x8b, 0x0d, 0x4e, 0x52, 0x78, 0xe4, 0x7b, + 0xf5, 0x58, 0x45, 0x97, 0x86, 0xbb, 0x2b, 0xd6, 0xe8, 0x0c, 0xa9, 0xd1, 0x15, 0xe5, 0xce, 0xc0, 0xc6, 0x45, 0x2b, 0xde, 0x7c, 0xdd, 0x19, 0x7f, 0x3d, 0xe0, 0xff, 0xfa, 0x17, 0x71, 0x67, 0x91, + 0x7f, 0x58, 0x42, 0xe5, 0x93, 0x93, 0x3e, 0xbf, 0x2e, 0xa1, 0xf2, 0xa0, 0xa6, 0xe3, 0x3f, 0xcd, 0xfa, 0x2f, 0x53, 0xe6, 0x5f, 0x8b, 0xdc, 0x7c, 0x94, 0x32, 0xdf, 0x33, 0x72, 0x93, 0x2c, 0x2b, + 0x46, 0xcc, 0x44, 0x6b, 0xcb, 0xc9, 0xdc, 0x52, 0x2f, 0xb4, 0x1d, 0xcc, 0x80, 0xf2, 0x42, 0xdc, 0xc1, 0xa3, 0x21, 0xbe, 0x68, 0xf5, 0x4d, 0x6e, 0x8f, 0xb4, 0xb1, 0x66, 0x1c, 0xc6, 0x54, 0x99, + 0x96, 0x19, 0x66, 0x57, 0xb8, 0xca, 0xa4, 0xb4, 0xa4, 0x3a, 0xf8, 0x48, 0x21, 0x96, 0xa1, 0x30, 0x3a, 0xce, 0x4e, 0xc3, 0xed, 0x41, 0xe7, 0x8b, 0xc0, 0x3a, 0x22, 0x99, 0x32, 0x2b, 0xed, 0xe2, + 0xb6, 0xab, 0xf1, 0x37, 0x98, 0x7e, 0x93, 0x83, 0x3f, 0xfc, 0xe7, 0xd8, 0x94, 0xa9, 0x49, 0xf2, 0x58, 0xd9, 0x7f, 0xc9, 0x58, 0xec, 0x48, 0x9e, 0xf5, 0xaa, 0xee, 0xa0, 0x8f, 0x39, 0x08, 0x0f, + 0x0a, 0x61, 0x3b, 0xf6, 0x4e, 0xa3, 0x49, 0xea, 0x49, 0x0d, 0xe7, 0xcb, 0xf3, 0x8a, 0x84, 0xb6, 0x5c, 0xc9, 0x32, 0x45, 0xf2, 0x5d, 0x2f, 0x4a, 0x9d, 0xb9, 0x85, 0x39, 0xb0, 0xdc, 0xc0, 0x1c, + 0x5c, 0x2a, 0x5d, 0x7d, 0x31, 0xc5, 0x7f, 0x7f, 0xcb, 0xef, 0x13, 0xf5, 0xee, 0x3b, 0x6f, 0xae, 0xf5, 0xad, 0x90, 0x46, 0x56, 0xb4, 0xde, 0x2a, 0xc3, 0x55, 0x24, 0x58, 0x29, 0xea, 0xc6, 0x42, + 0xeb, 0x65, 0x13, 0x9f, 0x1e, 0xb7, 0x47, 0x2c, 0x1c, 0x91, 0xad, 0x4f, 0x80, 0x63, 0xb6, 0x05, 0x29, 0x6a, 0x1c, 0x47, 0x8c, 0x59, 0x82, 0x63, 0xcc, 0xaa, 0x33, 0x36, 0xd6, 0xcd, 0x90, 0x47, + 0xb6, 0xe4, 0x6a, 0x4e, 0x06, 0x51, 0x44, 0x71, 0x80, 0x42, 0x09, 0x80, 0xe2, 0x91, 0xbb, 0x61, 0xa9, 0xc2, 0xe0, 0xe6, 0x00, 0xfe, 0x8d, 0x60, 0x9e, 0xb0, 0xcc, 0xc2, 0x32, 0x73, 0xd4, 0xfc, + 0xa2, 0x44, 0x42, 0x3f, 0xe1, 0x4f, 0x96, 0xec, 0xdd, 0x68, 0x9f, 0x8f, 0xf3, 0xcb, 0x55, 0x35, 0xba, 0xcb, 0x04, 0x74, 0x65, 0xf6, 0x3c, 0x08, 0xba, 0xba, 0x6c, 0x85, 0x0d, 0x7b, 0x48, 0xec, + 0xf5, 0x0e, 0xd9, 0xfd, 0x95, 0xe3, 0x95, 0x09, 0xe4, 0x03, 0x5d, 0x70, 0xf0, 0xf1, 0xac, 0x4f, 0xd5, 0x8d, 0x33, 0x37, 0x37, 0x02, 0xe7, 0xcc, 0x56, 0x94, 0xe9, 0x29, 0xf2, 0x61, 0xe4, 0x0c, + 0xa1, 0x49, 0xec, 0xac, 0xa1, 0xf1, 0x2c, 0x1b, 0x1f, 0xd4, 0xa5, 0x69, 0x65, 0xc8, 0x9a, 0x25, 0x2d, 0x94, 0x9f, 0x85, 0xc9, 0xd4, 0xf7, 0x78, 0x17, 0xc5, 0x4c, 0xb9, 0xdd, 0xca, 0xa4, 0xb4, + 0x17, 0xbd, 0xd9, 0xb6, 0x50, 0x56, 0x22, 0xa3, 0xcf, 0xa1, 0x19, 0xb2, 0x67, 0x44, 0x07, 0x88, 0x73, 0x6a, 0x9d, 0xdb, 0x9c, 0x1b, 0x3e, 0xad, 0xbe, 0xf4, 0x07, 0xa6, 0x80, 0xf7, 0x7a, 0x06, + 0x8f, 0xa0, 0xfc, 0xfe, 0x0c, 0xd0, 0x51, 0x3c, 0x83, 0x78, 0xfe, 0xdb, 0x37, 0x3d, 0x75, 0xcd, 0xc8, 0x7b, 0xd8, 0x25, 0xa5, 0x95, 0xb4, 0xb7, 0x49, 0x29, 0x1a, 0xef, 0x77, 0x9e, 0x5b, 0x02, + 0xec, 0xd1, 0x69, 0xf7, 0x12, 0x9d, 0x57, 0x56, 0x32, 0x0a, 0xf5, 0x52, 0x0e, 0xc7, 0x86, 0xb0, 0x67, 0x18, 0x08, 0x9c, 0x7a, 0x45, 0xb6, 0xaf, 0xe7, 0x64, 0x43, 0x11, 0x08, 0x18, 0x4e, 0x8f, + 0x5a, 0xb1, 0xce, 0x17, 0xde, 0x7c, 0xa9, 0x1a, 0x50, 0xbd, 0xcc, 0x63, 0x03, 0x3b, 0x65, 0x22, 0x39, 0xfb, 0x4e, 0x63, 0x08, 0xa8, 0x57, 0x03, 0x8d, 0x56, 0x0d, 0x02, 0xf7, 0xcb, 0xb4, 0xde, + 0xef, 0x8b, 0xde, 0x1b, 0x4d, 0x70, 0xf0, 0x7e, 0xd4, 0x57, 0xe4, 0xd0, 0xda, 0x58, 0xb8, 0x86, 0xd2, 0xa6, 0xc3, 0xcd, 0x04, 0x22, 0x30, 0x69, 0x3d, 0x13, 0x86, 0x62, 0xc2, 0x0b, 0x3b, 0x12, + 0xad, 0x3d, 0x89, 0x0c, 0x96, 0x47, 0xd6, 0x29, 0x43, 0xc4, 0xdf, 0xe9, 0x15, 0x88, 0xc1, 0x42, 0x84, 0x98, 0xe1, 0x16, 0x32, 0x5a, 0x7d, 0x7b, 0xc4, 0x4a, 0x45, 0x5a, 0x9b, 0x5e, 0xcd, 0x54, + 0x36, 0x3e, 0xcb, 0x2b, 0xcd, 0x08, 0x0e, 0x6b, 0x60, 0x2e, 0xcf, 0xf4, 0x62, 0xf4, 0xdb, 0xd9, 0xf8, 0x5f, 0xde, 0x30, 0xb8, 0x3f, 0x67, 0xfc, 0xf5, 0xdf, 0x2d, 0x35, 0x2f, 0x5c, 0xab, 0x05, + 0x55, 0xaf, 0x1a, 0xe8, 0x71, 0x98, 0xb8, 0xc1, 0x97, 0x39, 0xe5, 0xdf, 0x07, 0xe6, 0xee, 0x13, 0xce, 0x76, 0xe0, 0x87, 0xd3, 0xbe, 0x8e, 0x59, 0xbb, 0x9a, 0xf2, 0x7b, 0x2e, 0x91, 0xf2, 0x63, + 0xb6, 0xdc, 0xa2, 0x24, 0xa6, 0x4a, 0xd3, 0xf5, 0xd2, 0xd0, 0x82, 0x35, 0x54, 0x50, 0x29, 0x86, 0x4c, 0x16, 0x20, 0x22, 0xd5, 0xa3, 0xb8, 0xd1, 0xdc, 0x60, 0xec, 0xc0, 0x70, 0x19, 0xd7, 0x30, + 0x74, 0x2a, 0x04, 0x64, 0x51, 0xce, 0xd5, 0x13, 0x37, 0xb1, 0x3c, 0x2d, 0xcb, 0x95, 0x61, 0x14, 0x00, 0xd1, 0x26, 0x18, 0x7a, 0x94, 0xe0, 0x79, 0x43, 0x51, 0xb8, 0xd2, 0xa1, 0xdf, 0xfa, 0x43, + 0xdd, 0x2e, 0xe5, 0x5e, 0xf5, 0xa6, 0x6a, 0xc1, 0xc8, 0xcf, 0x07, 0x41, 0xf0, 0xff, 0xfd, 0x63, 0x4a, 0x0f, 0xe8, 0x3e, 0xda, 0x73, 0x85, 0x7e, 0xc2, 0xaf, 0x14, 0x63, 0xbf, 0xa5, 0x7e, 0xb1, + 0x47, 0x2e, 0xc4, 0x9e, 0xe3, 0x36, 0xe6, 0x66, 0xe2, 0x18, 0x86, 0x28, 0x4e, 0x5d, 0x6e, 0x22, 0x5b, 0x8e, 0xd6, 0xeb, 0x8d, 0x69, 0x03, 0xbc, 0x7d, 0x4a, 0x73, 0x77, 0x5c, 0xb2, 0x58, 0x28, + 0x68, 0xf1, 0x7e, 0xd8, 0xe2, 0x09, 0x21, 0x0c, 0xa9, 0x13, 0x2b, 0x1e, 0x66, 0xf9, 0x4a, 0xc9, 0xd4, 0xda, 0x05, 0x26, 0x31, 0xc5, 0xed, 0x0f, 0x13, 0x15, 0xa1, 0x9c, 0x55, 0xba, 0x95, 0xf7, + 0xf3, 0x8a, 0xa5, 0x2c, 0x7b, 0x0f, 0xe1, 0xc8, 0xfa, 0xc1, 0xb4, 0x76, 0x03, 0xca, 0x29, 0x54, 0x33, 0xfd, 0xa4, 0xfa, 0xe0, 0xf9, 0xe3, 0x06, 0x5f, 0xb5, 0x64, 0x81, 0x5f, 0x2a, 0xf6, 0x70, + 0xf7, 0x09, 0xe0, 0xe0, 0xc3, 0x49, 0x27, 0x5c, 0x3d, 0x26, 0x2f, 0x69, 0x39, 0x41, 0x24, 0xed, 0x44, 0x8b, 0x1c, 0xee, 0x9a, 0x4b, 0xcf, 0x5a, 0xb2, 0x87, 0xb1, 0x13, 0x1c, 0x74, 0x6b, 0xb3, + 0x47, 0xf0, 0x1c, 0xa9, 0x54, 0x4b, 0x3e, 0x6e, 0x75, 0x85, 0x3e, 0x4a, 0x34, 0xdf, 0xb8, 0xea, 0x4e, 0x91, 0x67, 0x14, 0x33, 0xab, 0x8d, 0x00, 0x46, 0xc6, 0x4a, 0x6b, 0x0f, 0x21, 0xc0, 0x8a, + 0xe5, 0x03, 0xe2, 0x4d, 0xed, 0x22, 0x4b, 0x05, 0x12, 0x4f, 0xb9, 0x92, 0x13, 0x9e, 0xd9, 0x0c, 0xf7, 0xe5, 0xcd, 0x30, 0x2d, 0x33, 0x3b, 0xaf, 0xad, 0x7a, 0x1c, 0x45, 0x1f, 0x9d, 0xd2, 0x0f, + 0x62, 0x36, 0x54, 0x4d, 0xcb, 0x3a, 0xda, 0x8f, 0x70, 0xfd, 0xfe, 0x2e, 0xff, 0x85, 0xe4, 0x79, 0x9c, 0x76, 0x07, 0xbd, 0x4b, 0x3f, 0x44, 0xe6, 0x18, 0x5c, 0xba, 0x5b, 0xd0, 0x39, 0x2d, 0x1d, + 0x19, 0x4f, 0x0c, 0x2a, 0xd2, 0x26, 0xc5, 0x69, 0x44, 0x79, 0x1b, 0x91, 0xc9, 0x64, 0x08, 0xda, 0x80, 0xa7, 0x6a, 0x23, 0x84, 0xc3, 0x84, 0x9f, 0xfb, 0x01, 0xde, 0x94, 0x8b, 0x6c, 0x11, 0x49, + 0x11, 0x78, 0x28, 0x44, 0x8e, 0xb3, 0xb8, 0x82, 0xb4, 0x94, 0x31, 0x08, 0xef, 0x0a, 0xd3, 0xf1, 0xf3, 0xd3, 0x7e, 0x9c, 0xea, 0xa2, 0xeb, 0x3e, 0xca, 0x5a, 0xb9, 0x81, 0xe0, 0xe2, 0x87, 0x1d, + 0x04, 0xb1, 0x6d, 0x7f, 0x1d, 0xc7, 0xf7, 0x0a, 0x18, 0xd7, 0xc4, 0x3b, 0x58, 0xae, 0x2f, 0xf5, 0xa9, 0x3f, 0x75, 0x06, 0x08, 0x99, 0x78, 0x3b, 0x51, 0x69, 0xc4, 0x4d, 0xe5, 0x98, 0x7c, 0xb5, + 0xd0, 0x26, 0x79, 0x30, 0x17, 0x64, 0x7e, 0xef, 0x67, 0x80, 0xe0, 0x6d, 0x0a, 0x3e, 0xca, 0xd6, 0x1b, 0x14, 0xb5, 0x80, 0xc3, 0xf2, 0xb8, 0x3e, 0x99, 0xa7, 0x6d, 0xa2, 0xe8, 0xe9, 0xc1, 0x1e, + 0x79, 0x2a, 0xba, 0xc6, 0x8c, 0x89, 0x14, 0x9e, 0x4e, 0x76, 0x2d, 0x02, 0x2a, 0x84, 0x8c, 0xbd, 0x5d, 0x33, 0xdc, 0x4c, 0x5d, 0x74, 0x55, 0xba, 0x9f, 0xf6, 0x96, 0x2e, 0x13, 0xd6, 0x7d, 0xcb, + 0xac, 0x9b, 0xc2, 0xbe, 0x8d, 0x80, 0x57, 0xbd, 0xcd, 0xd9, 0x17, 0x02, 0xcf, 0x3f, 0xd4, 0x43, 0xad, 0xc3, 0xda, 0xae, 0xc4, 0x78, 0x88, 0x8c, 0xd4, 0xa8, 0x95, 0xdb, 0x15, 0xbf, 0x10, 0xe5, + 0x95, 0xb6, 0x00, 0xaa, 0x28, 0xda, 0xca, 0xd5, 0x0c, 0x0a, 0x87, 0x61, 0xe8, 0xeb, 0xb0, 0xc8, 0x00, 0x51, 0x43, 0x26, 0x89, 0x3f, 0x5d, 0xb3, 0xcb, 0x35, 0xa4, 0x2a, 0x98, 0xa1, 0x05, 0x87, + 0x29, 0x17, 0x2f, 0x04, 0xc7, 0x09, 0x01, 0xff, 0x34, 0xc3, 0x94, 0x7d, 0xeb, 0x4f, 0x62, 0xd6, 0xc6, 0x7a, 0xcc, 0xd5, 0xe7, 0xe5, 0x66, 0x70, 0x9d, 0x74, 0xff, 0x39, 0x44, 0xab, 0xbb, 0xa9, + 0xab, 0x1f, 0x96, 0x17, 0xef, 0xb9, 0x59, 0x6e, 0x64, 0x5f, 0xfa, 0x25, 0xdd, 0x09, 0x4e, 0xbb, 0xdc, 0xaa, 0x3b, 0x66, 0xa8, 0x0e, 0x8a, 0x4c, 0x3d, 0xe3, 0x79, 0x09, 0x26, 0x81, 0x6e, 0x0b, + 0x39, 0xfd, 0x0a, 0xb8, 0xb9, 0x04, 0xde, 0x3d, 0xd8, 0x1d, 0xef, 0x6c, 0x43, 0x35, 0x70, 0xed, 0xe8, 0x8f, 0x3a, 0xaf, 0x7e, 0x93, 0x7d, 0x77, 0xb4, 0x76, 0x27, 0x7d, 0x5d, 0x54, 0x4a, 0x32, + 0x0d, 0x0e, 0x4c, 0x2a, 0x71, 0xe8, 0x6e, 0x31, 0x09, 0x19, 0x57, 0x33, 0xac, 0xe3, 0x29, 0x9d, 0xca, 0x58, 0x10, 0x79, 0xb3, 0x32, 0xe6, 0x4e, 0xfb, 0xa1, 0x08, 0xc5, 0xb3, 0x79, 0x62, 0x19, + 0xe0, 0x69, 0x98, 0xae, 0xe8, 0x83, 0x9a, 0x95, 0x7e, 0xe6, 0x1a, 0x14, 0xe6, 0x95, 0x6b, 0x1e, 0x99, 0x4b, 0xac, 0x5b, 0xef, 0xb7, 0x4d, 0x36, 0x3e, 0xa6, 0xdb, 0x42, 0x95, 0x55, 0x42, 0xda, + 0xc9, 0xcf, 0x0c, 0xe8, 0xfb, 0x5c, 0xfc, 0xe4, 0x0d, 0x7f, 0x50, 0xc2, 0xae, 0xa7, 0xf9, 0xfd, 0xfb, 0xfa, 0xe7, 0x98, 0xd1, 0x8f, 0x8c, 0xfe, 0x26, 0xd4, 0x77, 0x7c, 0xda, 0xd8, 0x27, 0x4d, + 0xe6, 0xc7, 0x23, 0xb8, 0x61, 0x35, 0x31, 0x37, 0x96, 0xc4, 0xc2, 0x7b, 0x5e, 0x48, 0x6b, 0x28, 0x1e, 0x2f, 0xdd, 0x39, 0x19, 0x57, 0x87, 0xd3, 0x98, 0x1d, 0x0a, 0x30, 0x65, 0x03, 0x98, 0x98, + 0x51, 0xb5, 0xc5, 0x9a, 0xf5, 0x16, 0x4f, 0xc0, 0x2c, 0x64, 0x4b, 0x53, 0x1b, 0x15, 0x47, 0xc5, 0xdb, 0xc2, 0x59, 0x83, 0xad, 0xe3, 0x16, 0x26, 0xb3, 0x89, 0x6d, 0xc7, 0xe9, 0x22, 0xb1, 0xd2, + 0xd4, 0x58, 0x62, 0x59, 0x1c, 0x19, 0x1f, 0x47, 0xc8, 0x8f, 0x3b, 0xf3, 0xe5, 0x8f, 0x8f, 0xf0, 0x7d, 0x06, 0xfa, 0x11, 0x50, 0xb7, 0x25, 0xd4, 0xfa, 0x03, 0xf5, 0x95, 0x37, 0xef, 0xf3, 0x4e, + 0xcd, 0x8f, 0x47, 0x60, 0x55, 0xaa, 0xa5, 0x57, 0x38, 0xe3, 0x1d, 0x14, 0x46, 0xb0, 0x4f, 0x10, 0x1e, 0xb3, 0x20, 0x8d, 0x2f, 0xa8, 0x49, 0x46, 0x16, 0x27, 0xa2, 0x32, 0x9c, 0xad, 0xea, 0x9f, + 0x4d, 0x87, 0x8a, 0xcb, 0x68, 0x12, 0x6f, 0x51, 0x7a, 0x3a, 0x87, 0xa7, 0xcb, 0x68, 0xdd, 0x02, 0xdb, 0x75, 0x4a, 0x18, 0xe2, 0x6a, 0xb3, 0x85, 0x35, 0x80, 0xa1, 0xf6, 0x29, 0x35, 0xd7, 0x0b, + 0xdf, 0xd8, 0x1d, 0x31, 0xcc, 0xbc, 0x6a, 0x22, 0xf9, 0xe3, 0xbe, 0x7c, 0xfe, 0x78, 0x28, 0xa3, 0xdd, 0x2f, 0xb7, 0x9e, 0xbd, 0xd1, 0xcd, 0x36, 0xf4, 0xe5, 0x7b, 0xbe, 0x51, 0x20, 0xf9, 0xc7, + 0x8f, 0xcf, 0x1e, 0xbe, 0xab, 0x82, 0x45, 0x3f, 0x7e, 0x4d, 0x26, 0x3f, 0xee, 0xb0, 0xf2, 0x93, 0x57, 0xee, 0xc7, 0x8f, 0xdb, 0x1d, 0x1c, 0xe4, 0x6f, 0x30, 0xf2, 0x9e, 0x77, 0x6e, 0xf8, 0xa9, + 0xfe, 0xcd, 0x8f, 0x47, 0x4c, 0xa4, 0xca, 0x5d, 0x0e, 0xdb, 0x8c, 0x36, 0x49, 0x73, 0x96, 0x59, 0x2a, 0x41, 0x66, 0x59, 0x75, 0x50, 0xda, 0x04, 0x4b, 0xfb, 0x7a, 0x94, 0x78, 0xf9, 0xf0, 0xb0, + 0x09, 0xd7, 0xf0, 0x86, 0x74, 0x80, 0x90, 0x44, 0xa1, 0x3d, 0x44, 0x89, 0x71, 0x61, 0x51, 0x0a, 0x64, 0x20, 0xfb, 0x7d, 0x2e, 0x25, 0x9b, 0x70, 0x13, 0xb2, 0xec, 0x0a, 0x3f, 0x8e, 0x46, 0x28, + 0xab, 0x92, 0xe8, 0x0a, 0x08, 0x34, 0xf7, 0x48, 0xfe, 0x6d, 0x26, 0xde, 0x78, 0xea, 0xb0, 0x2f, 0xe0, 0xfe, 0x2f, 0x1f, 0xff, 0x5e, 0xcd, 0xe6, 0x5f, 0x6d, 0xe7, 0xfc, 0x8d, 0xd9, 0xfc, 0xce, + 0x14, 0xd3, 0x63, 0x36, 0x87, 0x07, 0xa3, 0x2d, 0x2b, 0xd5, 0xed, 0x72, 0x21, 0xa2, 0xc1, 0x42, 0x23, 0x99, 0xa3, 0x3a, 0x46, 0x90, 0x89, 0x9a, 0xa3, 0x88, 0x62, 0xdf, 0xea, 0x0a, 0x57, 0x01, + 0xab, 0xf7, 0x2d, 0xe2, 0x57, 0xba, 0x91, 0x7c, 0xa0, 0xfb, 0xfe, 0xfe, 0x97, 0xb3, 0x01, 0xd6, 0xaf, 0x17, 0xc9, 0x49, 0x9b, 0x8c, 0xb3, 0xe9, 0x8a, 0x14, 0xe1, 0x4c, 0xf3, 0xdc, 0x03, 0xa5, + 0x21, 0x4e, 0xca, 0xcc, 0x69, 0x4e, 0x5e, 0x37, 0x76, 0xe1, 0x13, 0xdc, 0x7e, 0xd7, 0x28, 0xe8, 0x52, 0xa9, 0x29, 0x74, 0x8e, 0x73, 0x45, 0xa3, 0x49, 0xca, 0x76, 0x1a, 0x45, 0x82, 0x0b, 0xaf, + 0xfd, 0x06, 0x58, 0x52, 0xb1, 0x63, 0x6c, 0x82, 0x79, 0x82, 0x20, 0x48, 0x7d, 0x20, 0xd7, 0x4b, 0xc7, 0x54, 0x56, 0x5b, 0x61, 0xd6, 0x43, 0x83, 0xb8, 0x94, 0x75, 0xd2, 0xe3, 0xa8, 0x32, 0xb3, + 0xdf, 0x83, 0xf4, 0x91, 0xea, 0x1d, 0xb5, 0xef, 0x9d, 0xf5, 0xef, 0x73, 0xfe, 0x15, 0xa3, 0xe6, 0x9d, 0x68, 0x87, 0xdb, 0xe5, 0xb0, 0x9b, 0x2b, 0x7b, 0x58, 0x31, 0x1b, 0x0c, 0x35, 0x37, 0x16, + 0x4f, 0x2e, 0xcb, 0xc4, 0xb7, 0x4b, 0x7a, 0xdf, 0xea, 0x99, 0x8e, 0xa5, 0xab, 0xb1, 0x7f, 0x22, 0x14, 0xb7, 0xe4, 0xf7, 0xae, 0xa7, 0xce, 0xc4, 0x5a, 0x1a, 0x89, 0x74, 0x01, 0xc9, 0xe0, 0x82, + 0x63, 0x46, 0x15, 0xa4, 0xaa, 0x44, 0x26, 0x13, 0x30, 0xde, 0x1c, 0x3d, 0x65, 0x94, 0xad, 0x0c, 0x72, 0x28, 0x19, 0xac, 0x9e, 0x1c, 0xe6, 0x22, 0xc3, 0xa6, 0xc0, 0xae, 0x7a, 0x9a, 0x2d, 0x72, + 0x1f, 0xc7, 0x28, 0xce, 0x42, 0x35, 0x70, 0x4f, 0xe6, 0x20, 0x51, 0xaf, 0x56, 0xf1, 0x0f, 0x73, 0x56, 0xe2, 0xea, 0xf1, 0x3b, 0x7e, 0x17, 0x9c, 0x1f, 0x38, 0x70, 0xd4, 0x4c, 0x77, 0xbe, 0xf2, + 0x71, 0xbf, 0x20, 0x9f, 0x67, 0x8a, 0x67, 0x84, 0xcf, 0x7f, 0xfb, 0x64, 0xe5, 0xc3, 0x03, 0x40, 0xf7, 0x26, 0x1c, 0x6c, 0xb1, 0xb4, 0x61, 0x12, 0xdc, 0x30, 0xa3, 0xcd, 0xb6, 0x71, 0x13, 0x9d, + 0x59, 0x78, 0x33, 0xf2, 0x76, 0x50, 0x65, 0xf6, 0xd7, 0x1d, 0xd9, 0x5e, 0x32, 0x43, 0xde, 0x88, 0x76, 0x2f, 0x6d, 0xbf, 0xf7, 0x5f, 0xeb, 0x65, 0x76, 0x10, 0xc0, 0xf8, 0x98, 0x9a, 0x9a, 0x36, + 0x3f, 0x25, 0xd2, 0x98, 0xdf, 0x01, 0x47, 0x15, 0xe7, 0x91, 0xb1, 0x9a, 0x2f, 0x63, 0xdb, 0xdc, 0xb1, 0x27, 0x7d, 0x51, 0x90, 0x4b, 0xce, 0x48, 0x58, 0x9a, 0x6e, 0x49, 0x1b, 0x86, 0x2c, 0x68, + 0xa8, 0x0a, 0xf3, 0xc3, 0x44, 0xd3, 0x67, 0xe9, 0xc2, 0x02, 0x37, 0x52, 0x0d, 0xcf, 0x3c, 0x52, 0x01, 0x52, 0x04, 0xd4, 0x66, 0x13, 0x1b, 0xa5, 0xaa, 0x32, 0x63, 0xd0, 0x4f, 0xed, 0x12, 0xd4, + 0xbc, 0x8d, 0x74, 0xff, 0x61, 0x13, 0x13, 0xe8, 0xa5, 0x3e, 0x74, 0xef, 0x44, 0xcf, 0x5f, 0xfd, 0x76, 0x38, 0x80, 0x9e, 0x77, 0x9d, 0x83, 0x07, 0xcd, 0x70, 0xa4, 0x58, 0x28, 0x01, 0xb5, 0x18, + 0x91, 0xc5, 0x5a, 0x2b, 0xf9, 0xeb, 0x13, 0xa5, 0xf8, 0xc6, 0x5a, 0x40, 0xfd, 0xdb, 0xf7, 0xbe, 0x6e, 0xa7, 0xf1, 0x07, 0x65, 0xec, 0x03, 0xe1, 0xf3, 0xfb, 0x7f, 0x38, 0xed, 0x23, 0x71, 0x67, + 0xce, 0xf9, 0x1c, 0xef, 0x51, 0x29, 0xe9, 0x8c, 0x92, 0x06, 0x92, 0x8e, 0xdc, 0x12, 0xc0, 0xb6, 0xda, 0x29, 0x76, 0x77, 0x60, 0x24, 0xfa, 0x34, 0x79, 0xe4, 0x4a, 0x03, 0x29, 0xab, 0x68, 0x95, + 0x96, 0x14, 0x0c, 0x36, 0x43, 0x75, 0x34, 0xdb, 0x2a, 0xec, 0x4a, 0x84, 0x48, 0xfd, 0x94, 0x32, 0xd0, 0x36, 0xc2, 0x47, 0xb1, 0x0c, 0x8a, 0xe2, 0x16, 0x5e, 0x6b, 0x7b, 0x46, 0xf5, 0x94, 0x24, + 0x41, 0x97, 0xe3, 0xe2, 0x33, 0xe7, 0xca, 0x22, 0xd6, 0xd5, 0x28, 0x8a, 0x1f, 0x19, 0x24, 0xd8, 0x4f, 0xfc, 0x95, 0xef, 0xff, 0x45, 0xf6, 0xfc, 0xf5, 0xbf, 0x4e, 0x06, 0x1d, 0xb5, 0xe7, 0xdf, + 0x9e, 0x1c, 0xe9, 0xd9, 0x64, 0xe5, 0x8c, 0x35, 0x7f, 0x6b, 0x52, 0x92, 0xec, 0xc1, 0xdc, 0x1a, 0x99, 0x4c, 0x64, 0x53, 0x12, 0xd5, 0xb5, 0xaf, 0xed, 0xdc, 0x16, 0xe5, 0x94, 0x51, 0xc5, 0xed, + 0x60, 0x2d, 0x1d, 0x55, 0xc7, 0x86, 0xde, 0x10, 0x3b, 0xc0, 0x9d, 0x86, 0x54, 0x3b, 0x99, 0x16, 0xa5, 0x83, 0x6c, 0xd8, 0x95, 0x7b, 0x0c, 0x16, 0x81, 0xeb, 0x4b, 0x2a, 0x9c, 0x40, 0xeb, 0xfd, + 0x5e, 0x46, 0x45, 0xa3, 0xee, 0xb1, 0x02, 0x7c, 0x91, 0x21, 0x15, 0xb8, 0x83, 0xce, 0x64, 0x44, 0xff, 0xba, 0xd8, 0x7f, 0x37, 0x05, 0x7b, 0xf5, 0x20, 0x8e, 0x7e, 0xe7, 0x19, 0x5c, 0x6d, 0x9b, + 0x5c, 0xd6, 0x95, 0xf7, 0x6e, 0x99, 0xff, 0xf5, 0x5e, 0x36, 0xb0, 0x9e, 0xc5, 0x79, 0x17, 0xfb, 0x5d, 0xfd, 0x75, 0x77, 0x6b, 0xe6, 0xb6, 0x38, 0xf1, 0xf0, 0x73, 0x76, 0x56, 0x37, 0x46, 0x06, + 0x4e, 0x1c, 0xfb, 0xf9, 0x7d, 0x1a, 0x8e, 0x91, 0x0d, 0x1c, 0x37, 0x2f, 0x62, 0x3b, 0x53, 0xc3, 0x77, 0x5b, 0x15, 0xbe, 0xdd, 0x27, 0xba, 0xbe, 0x2b, 0x31, 0x33, 0xdd, 0x8c, 0x0a, 0xf7, 0xbc, + 0x7a, 0xc7, 0x9a, 0xf7, 0xd7, 0x5d, 0x23, 0xb9, 0x73, 0xb9, 0xbd, 0x35, 0xd4, 0x7a, 0x23, 0x7b, 0x86, 0xe7, 0x0a, 0x03, 0xa7, 0x4d, 0xcc, 0xec, 0x12, 0x2b, 0xfc, 0x39, 0xec, 0x3d, 0x54, 0x23, + 0xd5, 0xfe, 0xb0, 0x5a, 0x7c, 0x7a, 0xc2, 0xc7, 0xfa, 0x71, 0x9f, 0x4b, 0x2f, 0xc7, 0xd1, 0x20, 0x32, 0x8b, 0x41, 0xe0, 0xe6, 0xc5, 0x5b, 0xea, 0xdb, 0x27, 0x7c, 0x93, 0xcc, 0x2c, 0x8a, 0x76, + 0xa0, 0xb5, 0xc5, 0x5b, 0x76, 0xce, 0xf0, 0x36, 0x37, 0x2c, 0xc9, 0x62, 0x3b, 0x33, 0xf3, 0xfc, 0xfe, 0x1b, 0x66, 0xe6, 0x59, 0x4c, 0xb3, 0x4a, 0x0d, 0x7e, 0xd1, 0x87, 0xae, 0x7f, 0x7f, 0xf7, + 0x70, 0xde, 0x79, 0xfb, 0xab, 0x7a, 0x47, 0x0f, 0xf7, 0xed, 0xbf, 0xc8, 0xbc, 0xbc, 0xc9, 0xb7, 0xfa, 0xf1, 0xe3, 0x2b, 0x2d, 0xf3, 0xc7, 0x37, 0x86, 0xe9, 0xb3, 0xbc, 0xab, 0x1f, 0x8f, 0x06, + 0xe8, 0x3f, 0x9e, 0x7b, 0xf5, 0xe3, 0xe1, 0x20, 0xed, 0x7e, 0x79, 0x96, 0x6c, 0xd5, 0xdd, 0xf4, 0x2c, 0xe1, 0xea, 0x47, 0x1f, 0x15, 0xff, 0x51, 0xd0, 0xe8, 0xa3, 0xb5, 0xe2, 0xfb, 0x95, 0x26, + 0xee, 0x3f, 0xe2, 0x3c, 0x6f, 0xde, 0xfd, 0xa1, 0x5b, 0x3f, 0x7a, 0x54, 0x9b, 0xa0, 0x58, 0x0a, 0x62, 0x5c, 0x0e, 0xc3, 0x4d, 0x37, 0x31, 0x4f, 0xae, 0x20, 0xc2, 0xeb, 0xcd, 0x06, 0x14, 0x44, + 0x8b, 0xda, 0x43, 0x79, 0x69, 0x2d, 0x05, 0x29, 0xf4, 0x04, 0xbb, 0x3a, 0xe4, 0xf1, 0x1e, 0x29, 0xd2, 0x46, 0x2f, 0xb6, 0x26, 0x29, 0x98, 0xde, 0x51, 0xb7, 0xb8, 0xa2, 0x91, 0x99, 0x74, 0x26, + 0xb2, 0xf0, 0xbe, 0xd9, 0x12, 0x79, 0x82, 0xf0, 0x99, 0x30, 0x39, 0x26, 0xb4, 0x8c, 0xe7, 0xf5, 0xa7, 0xf5, 0xa3, 0xaa, 0xdc, 0xf8, 0x01, 0x1c, 0xa3, 0x97, 0xa2, 0x80, 0x3a, 0x8a, 0xdd, 0xd7, + 0x57, 0x6e, 0xdc, 0x15, 0x59, 0xed, 0xa1, 0xfd, 0x4a, 0x47, 0x64, 0xca, 0x4e, 0x43, 0x45, 0x9d, 0x86, 0xd3, 0x69, 0xbe, 0x54, 0x57, 0xea, 0x9a, 0x69, 0xc8, 0xd3, 0xa6, 0x9e, 0xa3, 0x23, 0x4b, + 0x72, 0x61, 0x66, 0xd1, 0x70, 0x7c, 0x65, 0x1a, 0x7c, 0x62, 0xba, 0xf9, 0xda, 0x08, 0x1b, 0x25, 0xd2, 0x82, 0x85, 0x8e, 0x3a, 0x09, 0x7d, 0x94, 0xa3, 0x60, 0x03, 0x30, 0xfc, 0xbe, 0x51, 0x72, + 0xf5, 0xe4, 0x60, 0xe8, 0x51, 0xe2, 0x68, 0x5b, 0x4a, 0xb4, 0xb4, 0xc7, 0x82, 0xf1, 0xae, 0x9d, 0xde, 0x99, 0x6e, 0x7f, 0xa7, 0xfa, 0x7f, 0xca, 0x55, 0xb5, 0xd4, 0xbc, 0x48, 0xdf, 0xfe, 0x0b, + 0xbf, 0xa9, 0x07, 0x5f, 0x9a, 0xa5, 0x39, 0x08, 0x5d, 0x3d, 0x8b, 0x0b, 0x35, 0xf7, 0x7f, 0xcd, 0x36, 0x77, 0xca, 0x39, 0x3c, 0xaf, 0x32, 0xf0, 0xd8, 0xfb, 0x75, 0x5d, 0x31, 0xb4, 0x3f, 0x73, + 0xae, 0x8b, 0x04, 0x74, 0x74, 0xfa, 0x4d, 0x18, 0xe0, 0xa9, 0xa9, 0x87, 0x40, 0xe5, 0xc0, 0xa2, 0x55, 0x01, 0xd8, 0x36, 0x1a, 0xa9, 0xc3, 0x28, 0xd7, 0xf4, 0x15, 0xb3, 0x51, 0x85, 0x6a, 0x4a, + 0x39, 0xb1, 0x17, 0xe1, 0xf3, 0x59, 0x30, 0xae, 0xca, 0xa4, 0x66, 0x90, 0xc3, 0x54, 0xa0, 0x8a, 0x99, 0x3b, 0x2b, 0xd2, 0x8c, 0xa0, 0xe6, 0xc5, 0x49, 0x9e, 0xf3, 0xc6, 0x09, 0x47, 0xd7, 0x13, + 0xbf, 0x31, 0xf5, 0x11, 0x25, 0x97, 0x3a, 0xe2, 0xc5, 0x11, 0xbe, 0xed, 0x3f, 0x61, 0xbc, 0x57, 0x06, 0xf8, 0x80, 0xe4, 0x8f, 0x87, 0x0e, 0x95, 0xf0, 0x96, 0xc0, 0xb5, 0x0a, 0x7f, 0xbd, 0xbc, + 0xf7, 0x07, 0x2f, 0x3c, 0x0f, 0xea, 0x30, 0xef, 0x5a, 0x7b, 0x21, 0xfd, 0x60, 0xcb, 0x17, 0xfe, 0xa6, 0x01, 0x0e, 0x1e, 0x5b, 0x84, 0x24, 0xce, 0x4a, 0xc8, 0x28, 0x26, 0xb1, 0xf9, 0x64, 0x3e, + 0x5b, 0xcf, 0xa7, 0x8a, 0x82, 0x09, 0x98, 0x94, 0x9a, 0x0b, 0x5e, 0x9a, 0x56, 0x38, 0x51, 0x88, 0x80, 0xa7, 0xa1, 0x95, 0x0f, 0xee, 0x5a, 0x95, 0x39, 0x6e, 0xa0, 0x8d, 0xc8, 0xb4, 0xc7, 0x22, + 0x5c, 0x0b, 0x2c, 0xa4, 0x01, 0xaa, 0xb1, 0x17, 0x67, 0x95, 0x96, 0xc3, 0x9b, 0x99, 0x4a, 0x23, 0xbf, 0x06, 0xf1, 0x8f, 0x87, 0xd3, 0x9e, 0xa6, 0x06, 0x6a, 0xa4, 0x9b, 0xc6, 0xe0, 0x2b, 0x1b, + 0xf7, 0xb5, 0x10, 0xa3, 0x6b, 0xd2, 0xe0, 0xe0, 0xe6, 0x42, 0x9f, 0x90, 0xa3, 0x6e, 0xfb, 0x3c, 0x16, 0xcc, 0x3d, 0x0f, 0x89, 0xec, 0x01, 0x1f, 0x39, 0x1c, 0x4c, 0x86, 0x9a, 0x94, 0x33, 0x58, + 0xab, 0xa6, 0xfb, 0x51, 0xe1, 0xb9, 0x74, 0xa0, 0x35, 0x3b, 0x4a, 0xe1, 0x13, 0x1a, 0x62, 0x8e, 0x63, 0x60, 0x6a, 0x4a, 0x98, 0xb6, 0x23, 0x55, 0x09, 0x22, 0xa3, 0xa6, 0x80, 0x8a, 0x06, 0x61, + 0xb3, 0x64, 0x97, 0x1c, 0xeb, 0xad, 0xba, 0xa9, 0x97, 0xc1, 0x52, 0x98, 0xad, 0x1c, 0x79, 0x3f, 0x7c, 0x54, 0xf2, 0xff, 0x06, 0x9a, 0xdc, 0xc4, 0xb1, 0xc7, 0xc9, 0xb5, 0xf0, 0x95, 0x72, 0xd6, + 0x1f, 0x95, 0x37, 0xaa, 0x1d, 0x20, 0x6f, 0xc7, 0x83, 0x8e, 0xd6, 0x73, 0x2c, 0x48, 0x26, 0x51, 0xe5, 0x80, 0x8e, 0x88, 0x02, 0x13, 0x0e, 0x1a, 0x4f, 0x4f, 0x5b, 0x40, 0x1b, 0x02, 0x0c, 0x63, + 0x57, 0x3b, 0xac, 0xca, 0x72, 0x8a, 0xa8, 0xb4, 0x2a, 0xd3, 0xdc, 0xed, 0x2a, 0xc9, 0x47, 0x16, 0x43, 0x89, 0xbe, 0xe7, 0x53, 0x59, 0x8b, 0x7b, 0x2e, 0x94, 0xed, 0x57, 0xde, 0x14, 0xf2, 0x4f, + 0x1a, 0x67, 0x6e, 0xd6, 0xf5, 0xa9, 0x49, 0x09, 0xb7, 0x4d, 0x62, 0x0c, 0x4e, 0xcd, 0xe3, 0xa7, 0xbd, 0x25, 0xcd, 0x8d, 0xd4, 0xac, 0x1d, 0x74, 0x3d, 0x34, 0xce, 0x1f, 0xfb, 0x08, 0x00, 0xe4, + 0xa5, 0x6a, 0xdb, 0x9f, 0xa8, 0x9f, 0x81, 0xb8, 0xbd, 0xd6, 0x15, 0x11, 0xed, 0x61, 0x3f, 0x78, 0x94, 0x5e, 0xac, 0xc0, 0xe5, 0x61, 0xab, 0x29, 0xf1, 0xaa, 0xf5, 0x63, 0x93, 0xd6, 0x1c, 0x29, + 0xe1, 0x03, 0x6e, 0x92, 0x2e, 0x38, 0xbd, 0x96, 0x56, 0xcc, 0x2a, 0xb6, 0x31, 0x64, 0x36, 0xa4, 0xa9, 0xcd, 0xbe, 0xde, 0x8a, 0x82, 0xe1, 0x4d, 0x69, 0xc3, 0x75, 0x3c, 0x0f, 0xa2, 0x82, 0xc8, + 0x31, 0xb7, 0x23, 0x2d, 0xd0, 0x44, 0xdc, 0xa0, 0x79, 0xd5, 0xe2, 0x48, 0x57, 0x20, 0xe2, 0x78, 0xcb, 0xf4, 0x89, 0x67, 0xfe, 0x50, 0x84, 0xf5, 0xd1, 0x88, 0x79, 0x41, 0x36, 0xde, 0x88, 0x5e, + 0x10, 0xe9, 0x0e, 0xfb, 0x14, 0x41, 0x82, 0x07, 0x54, 0x78, 0xd0, 0xc3, 0x61, 0xed, 0x73, 0x66, 0x9a, 0xa9, 0xeb, 0x31, 0xb9, 0x6a, 0x57, 0x05, 0x03, 0x1f, 0xbd, 0x9d, 0xb0, 0xbd, 0xe5, 0xed, + 0x5b, 0xd5, 0x88, 0xfb, 0x16, 0xe0, 0x4b, 0xfc, 0x3c, 0x53, 0x3c, 0xbf, 0xf1, 0xf9, 0x6f, 0x17, 0xbe, 0xdb, 0x83, 0x6f, 0xe6, 0x04, 0x2b, 0xc5, 0xf1, 0x6e, 0x71, 0xb2, 0x91, 0xd8, 0x48, 0x66, + 0x3b, 0x1c, 0xd1, 0x26, 0xb5, 0xb0, 0xae, 0xf6, 0xe6, 0x62, 0x0a, 0x1c, 0xb5, 0x9d, 0xe7, 0xb5, 0xed, 0xdc, 0x59, 0xe4, 0x4c, 0xa4, 0x13, 0x75, 0x02, 0x86, 0x10, 0xe0, 0x6c, 0x73, 0x76, 0x5f, + 0xed, 0x4d, 0x94, 0x46, 0x0e, 0x10, 0x35, 0xac, 0x6a, 0x28, 0x9a, 0x18, 0x3c, 0xec, 0x4c, 0x57, 0xb1, 0x12, 0x0f, 0x43, 0xc6, 0x2c, 0x97, 0xcf, 0xc2, 0xb0, 0x1e, 0xac, 0xec, 0x1f, 0x77, 0xea, + 0xee, 0xd9, 0x83, 0x6a, 0x68, 0x06, 0xba, 0x9a, 0xbf, 0xd7, 0xcb, 0xb8, 0x29, 0x55, 0xf1, 0xc4, 0x92, 0x3c, 0xa3, 0xf2, 0x6e, 0x6a, 0xdc, 0x58, 0x33, 0x77, 0xf2, 0x41, 0x6e, 0x8c, 0x8d, 0x8f, + 0x55, 0x7b, 0xef, 0xd4, 0xda, 0xf8, 0x58, 0x65, 0xee, 0x6c, 0x89, 0x11, 0xd7, 0x6f, 0x76, 0x9d, 0x97, 0xf3, 0xde, 0x24, 0xe7, 0xed, 0xf7, 0x3e, 0xda, 0x45, 0xaf, 0x0d, 0xb6, 0xdb, 0xba, 0x1a, + 0xfd, 0x05, 0xa7, 0x7f, 0xd2, 0xc8, 0x8f, 0x47, 0x62, 0xf4, 0x8f, 0x27, 0x8e, 0xfc, 0xb8, 0x33, 0x05, 0xfc, 0xb8, 0x51, 0x22, 0xfe, 0x3f, 0x6b, 0xb5, 0xbd, 0xb6, 0x0d, 0xf3, 0x87, 0x8d, 0xb9, + 0x0f, 0x8c, 0xb8, 0x9f, 0x75, 0xf3, 0xe3, 0x86, 0x1d, 0xb7, 0xa1, 0xf9, 0xfd, 0xd9, 0xf1, 0x9d, 0xec, 0x9b, 0x1f, 0x8f, 0x58, 0xf3, 0x8f, 0x67, 0xe0, 0xfc, 0xe8, 0x21, 0xb2, 0xcf, 0xf3, 0x6c, + 0x7e, 0xfc, 0x31, 0x21, 0xfe, 0x13, 0xf9, 0x36, 0x3f, 0x1e, 0xa1, 0xf9, 0x8f, 0xe7, 0xdc, 0xfc, 0xe8, 0x81, 0x66, 0xcf, 0x1d, 0xf6, 0xeb, 0x5c, 0x99, 0x1f, 0xdf, 0x80, 0xf0, 0x7b, 0xf9, 0x32, + 0x3f, 0x1e, 0x81, 0xf5, 0x8f, 0xe7, 0xcc, 0xfc, 0x78, 0x69, 0x56, 0x78, 0x96, 0x3b, 0xf3, 0xe3, 0x6b, 0x89, 0xfd, 0xbc, 0xf0, 0xfe, 0xf8, 0xf1, 0x24, 0x87, 0xe6, 0xc7, 0xc3, 0x29, 0xa4, 0xd7, + 0x0e, 0x3b, 0xfe, 0xf2, 0x58, 0xe8, 0x9f, 0xff, 0xf2, 0xe3, 0x11, 0x13, 0xff, 0xf1, 0x1c, 0x98, 0x1f, 0x2f, 0x31, 0xf1, 0xab, 0x5c, 0x98, 0x1f, 0x3d, 0xdc, 0x6f, 0x5a, 0xa6, 0xea, 0xe6, 0xc0, + 0x6c, 0x12, 0x35, 0x7a, 0x83, 0xf9, 0xbe, 0x5a, 0x0d, 0xff, 0x84, 0x5f, 0xd0, 0xab, 0xaf, 0x89, 0x9f, 0x95, 0xd5, 0xeb, 0x2b, 0x97, 0xe0, 0xc7, 0x1e, 0x06, 0x98, 0x3b, 0x2d, 0x37, 0x34, 0x35, + 0xb7, 0x33, 0x5a, 0x1a, 0xd1, 0x48, 0x35, 0x5b, 0x82, 0xc3, 0x26, 0x39, 0x41, 0xa3, 0x93, 0x40, 0x4f, 0x20, 0x48, 0x4c, 0x4a, 0x3b, 0x75, 0x42, 0xb9, 0x38, 0x84, 0x2c, 0x8f, 0x0f, 0x61, 0x22, + 0x9c, 0x96, 0x3b, 0x36, 0xe6, 0xe5, 0x79, 0x60, 0xcc, 0x26, 0x01, 0x64, 0xc3, 0xc4, 0xa8, 0xb4, 0xe2, 0x93, 0xa1, 0xd2, 0xf6, 0x91, 0xd1, 0xe5, 0xb9, 0x86, 0xc3, 0xe9, 0xc2, 0x7d, 0x2d, 0x84, + 0xf4, 0x93, 0xe5, 0x7e, 0xc7, 0x35, 0xa5, 0xc7, 0x91, 0xae, 0x16, 0x83, 0x50, 0xed, 0xea, 0xfd, 0x40, 0x8f, 0x37, 0xb9, 0x3b, 0x3c, 0x1e, 0x19, 0x33, 0xe8, 0x6b, 0xe6, 0x7f, 0x47, 0xf2, 0x1d, + 0xeb, 0xbc, 0x9b, 0xd5, 0x7b, 0x98, 0xfb, 0x1a, 0x51, 0x86, 0xc0, 0xfa, 0xff, 0x61, 0xef, 0x4d, 0x9e, 0xd4, 0x45, 0xa2, 0x7f, 0xd1, 0xfd, 0xfb, 0x2b, 0x3a, 0x7a, 0x6b, 0xd8, 0x0c, 0x22, 0xc3, + 0x5b, 0x5d, 0x51, 0x14, 0x44, 0x64, 0x46, 0x61, 0xf1, 0x8b, 0x60, 0x9e, 0x07, 0x19, 0x95, 0x88, 0xdb, 0x7f, 0xfb, 0x8b, 0xd2, 0x1a, 0xd4, 0xd2, 0x2a, 0xbe, 0xde, 0x7e, 0xbb, 0xbb, 0x2a, 0x12, + 0xa9, 0x03, 0xf9, 0xc9, 0xcc, 0x93, 0x27, 0xcf, 0x08, 0x49, 0x3d, 0x37, 0xd9, 0x2d, 0xe4, 0xbe, 0x0d, 0x52, 0xd4, 0x67, 0x7a, 0xe8, 0xe4, 0x29, 0x16, 0x59, 0xa3, 0xba, 0x92, 0xd8, 0x14, 0x3b, + 0x6b, 0xab, 0xf4, 0x30, 0x37, 0x8c, 0x65, 0x87, 0xa0, 0x3d, 0x0a, 0xa3, 0x89, 0x16, 0x11, 0x11, 0x74, 0xa2, 0x84, 0xdd, 0x64, 0x42, 0x4f, 0xe9, 0x51, 0x42, 0x8a, 0x85, 0xc1, 0x09, 0x50, 0x8c, + 0x27, 0x23, 0x0c, 0xa7, 0x4d, 0xf0, 0x35, 0x84, 0xbd, 0x30, 0x49, 0x3e, 0x93, 0x9c, 0x7f, 0x78, 0xfe, 0x3c, 0x84, 0xcf, 0x36, 0xed, 0xc0, 0x3d, 0x2b, 0x70, 0xdf, 0x28, 0x3d, 0xcf, 0xfb, 0x8c, + 0xbe, 0xe4, 0x60, 0xff, 0x8d, 0xfa, 0x9b, 0x48, 0x78, 0x7f, 0x6f, 0x8c, 0x0e, 0xf3, 0xb0, 0xe7, 0xa3, 0x89, 0x3d, 0x5b, 0x09, 0xf3, 0x03, 0x6f, 0xec, 0x31, 0xa9, 0x47, 0x11, 0x35, 0x3b, 0xc1, + 0x2b, 0x7d, 0x66, 0x6c, 0x93, 0x50, 0x94, 0x0f, 0x9e, 0xe5, 0x0a, 0xa5, 0x3f, 0x13, 0xa1, 0x8e, 0x9d, 0x85, 0x81, 0x9e, 0xce, 0xd5, 0xac, 0x34, 0xc9, 0x7a, 0x5d, 0xb3, 0xf6, 0x4a, 0x42, 0x8e, + 0x3d, 0xd6, 0x2d, 0x47, 0x9b, 0x7c, 0x3d, 0x1f, 0x55, 0xd5, 0xd2, 0x68, 0xdb, 0x29, 0xe9, 0x2f, 0x09, 0xe6, 0xd7, 0xa0, 0xf8, 0x27, 0x46, 0xb8, 0x24, 0xcf, 0xde, 0xbe, 0xff, 0x9c, 0x72, 0xe0, + 0x3a, 0xa1, 0xed, 0xd5, 0x0c, 0xf6, 0xdd, 0xfa, 0xba, 0x32, 0xe6, 0xf4, 0xfe, 0x0c, 0x74, 0x36, 0x49, 0x9d, 0xc1, 0x18, 0x57, 0x6e, 0x6a, 0x66, 0x75, 0x68, 0x7f, 0xc8, 0x96, 0x77, 0x6b, 0x21, + 0x76, 0x4f, 0xed, 0xc3, 0xed, 0xe2, 0xef, 0x24, 0xef, 0xdc, 0xf2, 0xed, 0x84, 0x37, 0x8e, 0xdd, 0xd3, 0x97, 0x5d, 0xe8, 0xe6, 0x99, 0x2f, 0x57, 0x87, 0xf7, 0xd4, 0x09, 0xdf, 0x4f, 0x6b, 0x1f, + 0x1d, 0x49, 0xc2, 0xf8, 0xc7, 0xec, 0xbc, 0xcf, 0x0f, 0x5c, 0x37, 0x9d, 0x7d, 0x7e, 0xe0, 0x7a, 0xd5, 0xbf, 0xeb, 0x8b, 0x3c, 0x30, 0xbe, 0x6a, 0xfc, 0x89, 0x7f, 0x57, 0x46, 0x2e, 0x47, 0x4b, + 0xa8, 0x9c, 0x19, 0xda, 0xbc, 0x01, 0x0a, 0xac, 0x8c, 0x7a, 0x7f, 0x36, 0xd2, 0x2d, 0x24, 0xf1, 0xf4, 0x7d, 0x59, 0x24, 0x98, 0x89, 0x6a, 0xe9, 0xba, 0x54, 0xf1, 0x6e, 0x49, 0x30, 0xd0, 0x9c, + 0x6d, 0x05, 0x40, 0xec, 0x84, 0xad, 0x41, 0x67, 0x7c, 0xd2, 0x59, 0x4a, 0xac, 0xa3, 0x4e, 0x5b, 0x2f, 0x99, 0x7e, 0xc9, 0xc9, 0x27, 0x71, 0x6f, 0x6d, 0x72, 0x45, 0x14, 0xa4, 0xe2, 0xff, 0x5c, + 0x84, 0x28, 0x9a, 0xb4, 0xb8, 0x1a, 0xdb, 0xab, 0x1f, 0x1f, 0x6f, 0xf3, 0xdf, 0x46, 0xfc, 0xb9, 0x0e, 0xf8, 0xd5, 0xad, 0xfe, 0xf6, 0x15, 0xc0, 0xf8, 0xee, 0xc6, 0x83, 0xdc, 0xb0, 0x7f, 0x3d, + 0x03, 0xbd, 0x3e, 0x6c, 0xf7, 0xa5, 0x8c, 0xe1, 0x39, 0xc7, 0x53, 0xd8, 0x64, 0xcb, 0x1d, 0x59, 0x84, 0xe2, 0x36, 0x62, 0x25, 0xe6, 0xdd, 0xce, 0xc3, 0x23, 0x36, 0xcf, 0x69, 0xc2, 0xc7, 0x8e, + 0x82, 0xd9, 0x4a, 0x0a, 0x06, 0xa2, 0x12, 0x6a, 0xc5, 0xe2, 0x1a, 0x5d, 0xe8, 0xb0, 0xe2, 0x62, 0x62, 0x13, 0x9b, 0x46, 0xd5, 0x24, 0x47, 0x73, 0x02, 0x76, 0x22, 0x66, 0xc5, 0x60, 0x91, 0x22, + 0xfb, 0x90, 0x4e, 0x07, 0x1d, 0x19, 0x9e, 0x30, 0xbb, 0xaf, 0x94, 0x29, 0xff, 0x9d, 0xb6, 0xf8, 0x93, 0xea, 0x99, 0xb9, 0xbd, 0x5f, 0x0f, 0xd5, 0x11, 0x63, 0xfc, 0x68, 0x69, 0xcd, 0xc3, 0xa0, + 0x24, 0xa7, 0xbb, 0x95, 0xb5, 0xd4, 0xdd, 0xca, 0xae, 0xbb, 0x54, 0x61, 0x4d, 0x17, 0x2d, 0xf9, 0x90, 0xe9, 0xd3, 0x1e, 0x0a, 0xed, 0xd2, 0xdd, 0xad, 0x47, 0xa0, 0x39, 0xc3, 0x36, 0x6b, 0xaf, + 0x39, 0x04, 0x54, 0x95, 0xc3, 0x0a, 0x91, 0xd9, 0x85, 0xbd, 0xac, 0x7b, 0x4e, 0xac, 0xfb, 0xbd, 0x07, 0x8b, 0xab, 0x55, 0xe3, 0xee, 0xd6, 0x2b, 0x45, 0xaf, 0x0e, 0xe5, 0xec, 0x77, 0xab, 0xd0, + 0x80, 0xf4, 0xdf, 0x6f, 0xeb, 0x2c, 0xcc, 0xde, 0x24, 0xf6, 0xea, 0x1c, 0xe5, 0x7a, 0xcf, 0x16, 0xee, 0xa0, 0xfd, 0xd2, 0x35, 0x3d, 0x82, 0xf6, 0x56, 0xfb, 0x34, 0x1c, 0xda, 0x77, 0xaa, 0x67, + 0x68, 0xdf, 0xaf, 0xc7, 0x67, 0x5a, 0xbf, 0x43, 0xbb, 0x81, 0x71, 0x59, 0x21, 0x21, 0x0c, 0xcc, 0xba, 0x9d, 0x8c, 0x4e, 0xd4, 0xa8, 0x4e, 0x28, 0x9e, 0x9a, 0x38, 0x89, 0x23, 0xce, 0x0a, 0x73, + 0xbd, 0x37, 0x62, 0x9e, 0x81, 0x1a, 0x6e, 0xe9, 0xf5, 0xde, 0xa4, 0x94, 0x1a, 0xc1, 0xf5, 0x69, 0x93, 0x76, 0xab, 0x93, 0xeb, 0x8e, 0xf4, 0xa3, 0x38, 0xda, 0xa1, 0x72, 0x2b, 0x2d, 0x44, 0x0d, + 0x55, 0x4b, 0x87, 0x77, 0xa4, 0x50, 0x82, 0xa6, 0x93, 0x6e, 0x3d, 0xa4, 0x54, 0xea, 0x4f, 0xc9, 0x47, 0x91, 0x97, 0x9c, 0xee, 0x6e, 0xd5, 0x29, 0xc8, 0x30, 0x77, 0xbb, 0x9c, 0xcd, 0xac, 0x60, + 0x79, 0x92, 0x98, 0x7d, 0xa1, 0x36, 0x6e, 0x8f, 0x87, 0x24, 0x97, 0x9e, 0x28, 0x13, 0xc9, 0xac, 0x08, 0x61, 0x78, 0xf1, 0xd4, 0x04, 0x36, 0xd0, 0x9d, 0x88, 0x58, 0xc7, 0x80, 0x9d, 0x26, 0xd8, + 0x1d, 0xc3, 0x13, 0xda, 0x0c, 0x45, 0x71, 0xa1, 0xc1, 0xa5, 0x98, 0xc7, 0x46, 0xe0, 0x0a, 0x43, 0xe5, 0x8d, 0xc4, 0xbb, 0xa7, 0x8e, 0x98, 0x17, 0x22, 0x88, 0x42, 0x21, 0x92, 0x0e, 0x98, 0x5a, + 0xbf, 0xe9, 0x4a, 0x7e, 0xd5, 0x93, 0xdc, 0xcd, 0xac, 0x20, 0x8f, 0x43, 0xc7, 0x7c, 0x5e, 0x3a, 0xe1, 0x15, 0x5b, 0xc6, 0x07, 0xd1, 0x33, 0xa6, 0x97, 0xcb, 0xf1, 0x64, 0x98, 0x25, 0x83, 0x18, + 0x55, 0x23, 0xde, 0x19, 0xed, 0x40, 0x6d, 0xbd, 0xee, 0xcd, 0x6e, 0x91, 0x9a, 0x80, 0xdf, 0x92, 0x5b, 0xf1, 0x10, 0x2b, 0xe1, 0x41, 0x57, 0x76, 0x9b, 0xc6, 0xc8, 0x4f, 0xb3, 0x2a, 0x6c, 0x2b, + 0x06, 0x99, 0x99, 0x3b, 0x65, 0xde, 0xd3, 0x2b, 0x10, 0x05, 0x14, 0x2e, 0xaa, 0x3c, 0xc8, 0xd6, 0x5d, 0x62, 0x6e, 0x11, 0x98, 0x3a, 0xa7, 0x82, 0xa8, 0xc7, 0xe8, 0x36, 0x13, 0x62, 0xb8, 0x00, + 0xea, 0xd7, 0x22, 0x11, 0xae, 0x1c, 0x3c, 0xff, 0xfe, 0xf7, 0x5b, 0x20, 0xc9, 0xa7, 0x64, 0xfc, 0xf6, 0xdb, 0x9d, 0x70, 0xe2, 0x55, 0x6e, 0xfb, 0x91, 0xc1, 0xf1, 0xdf, 0x6f, 0x85, 0xc4, 0xfd, + 0x24, 0xb7, 0xc6, 0x85, 0x59, 0xbe, 0xd7, 0x47, 0xfd, 0xf7, 0x9b, 0xec, 0x72, 0xce, 0x6f, 0x76, 0x36, 0x7c, 0x7c, 0x38, 0xc4, 0xfc, 0xfb, 0x28, 0x9f, 0xf2, 0x67, 0x09, 0x47, 0xe4, 0x3e, 0x03, + 0xda, 0x77, 0xff, 0xcb, 0x7f, 0xbf, 0x09, 0x37, 0xa5, 0x6b, 0x3a, 0x4e, 0x58, 0x16, 0xef, 0xbf, 0x4e, 0x9f, 0x4e, 0x90, 0x70, 0x1c, 0x66, 0xde, 0x33, 0x0b, 0xff, 0x6b, 0xd9, 0xd1, 0xdf, 0x69, + 0xbe, 0x4d, 0x8f, 0xcb, 0xd5, 0xd0, 0x8c, 0xe8, 0xd3, 0x9a, 0xc5, 0xa8, 0xba, 0x34, 0xc0, 0xed, 0x88, 0xdf, 0x2c, 0xb9, 0x3a, 0xa8, 0x0f, 0x7c, 0x84, 0x78, 0x0c, 0xbc, 0x76, 0x2d, 0x1c, 0x9f, + 0x23, 0xf3, 0x99, 0x21, 0x34, 0xf0, 0x74, 0xb3, 0xd0, 0x54, 0x7f, 0xbf, 0x06, 0x67, 0x93, 0x75, 0x85, 0x08, 0xdc, 0xea, 0x50, 0x66, 0xe0, 0x5a, 0x85, 0x76, 0x20, 0x17, 0x40, 0x80, 0x81, 0x77, + 0x46, 0xaf, 0x0b, 0xc7, 0x83, 0x5a, 0xee, 0x5d, 0xd2, 0xca, 0xe7, 0x43, 0x82, 0xcc, 0xae, 0x55, 0xf6, 0xcf, 0x4c, 0x5e, 0x2f, 0xac, 0x93, 0x0f, 0xaa, 0x6f, 0x48, 0x7c, 0x5c, 0x0f, 0xad, 0x93, + 0x77, 0x42, 0xec, 0x9c, 0xb3, 0x4f, 0x89, 0x2f, 0xcf, 0x1d, 0x2d, 0xcc, 0xa2, 0x70, 0x41, 0x36, 0x12, 0x2e, 0xcc, 0xe7, 0xb0, 0xb5, 0x89, 0x4e, 0x2b, 0xa5, 0xa3, 0x52, 0xc1, 0x22, 0xb6, 0xb4, + 0x04, 0x88, 0xe6, 0x56, 0x45, 0x29, 0x95, 0xdf, 0xdb, 0x8a, 0x0e, 0x54, 0xa8, 0x16, 0xad, 0xb8, 0x05, 0x4a, 0x6d, 0x65, 0xca, 0x74, 0x45, 0x9d, 0x9e, 0xeb, 0xe0, 0x6a, 0xbb, 0x92, 0xa7, 0x91, + 0xc7, 0x75, 0x83, 0xec, 0x9f, 0x37, 0x8e, 0x70, 0x8f, 0xc0, 0x00, 0x5f, 0x63, 0x1a, 0x9f, 0x64, 0xdf, 0xd1, 0xb8, 0x34, 0xc6, 0xe0, 0x30, 0xc6, 0x81, 0x89, 0x3e, 0xbc, 0x2e, 0xdd, 0x02, 0x92, + 0x81, 0x91, 0x38, 0xa1, 0x6c, 0x37, 0x34, 0x6a, 0xd1, 0x5e, 0x08, 0xbb, 0x63, 0x30, 0x6b, 0xc9, 0x6e, 0x44, 0x49, 0x1e, 0x04, 0xa1, 0x70, 0x8b, 0x54, 0x61, 0xbc, 0x2e, 0xdb, 0x3c, 0xe2, 0xe8, + 0xe5, 0x61, 0x5f, 0xe3, 0x22, 0xa3, 0x05, 0x26, 0xae, 0x26, 0x34, 0x51, 0xfa, 0x2a, 0x48, 0xba, 0x3b, 0xe1, 0x54, 0x1b, 0x04, 0xa0, 0xf4, 0xfa, 0x21, 0x51, 0x07, 0x38, 0x80, 0x9c, 0xb9, 0x6c, + 0xf5, 0xf7, 0x97, 0x9b, 0xc6, 0xd5, 0x1a, 0x7b, 0x2f, 0xb4, 0x69, 0x56, 0xd5, 0x87, 0x15, 0xe9, 0x3b, 0xb7, 0xbe, 0x37, 0xf6, 0xc0, 0x67, 0x46, 0xf3, 0x78, 0x29, 0xbe, 0x7b, 0x18, 0x3e, 0x9e, + 0x80, 0x2f, 0xed, 0x7c, 0x6f, 0x14, 0xcf, 0x70, 0xbf, 0x9d, 0xb8, 0xbe, 0xbb, 0x25, 0x3c, 0x30, 0x29, 0xae, 0x26, 0xc4, 0x26, 0x83, 0x62, 0x8f, 0xce, 0x47, 0x0b, 0xa3, 0x13, 0x49, 0x7d, 0xb6, + 0x5d, 0xe6, 0xf3, 0x90, 0x16, 0x21, 0xfc, 0xce, 0xa4, 0xf8, 0xed, 0x18, 0xf7, 0x1f, 0x0a, 0x85, 0x37, 0xa4, 0x3f, 0x3b, 0xf0, 0x71, 0x63, 0x88, 0x78, 0x08, 0x8d, 0x41, 0xe7, 0xb4, 0xe7, 0xe5, + 0xd9, 0x51, 0xf1, 0x0c, 0xa0, 0x2d, 0x93, 0x39, 0x83, 0x29, 0xcd, 0x56, 0x64, 0xa6, 0xe8, 0xae, 0x7a, 0x65, 0xbb, 0x48, 0xc3, 0x34, 0xb4, 0xbf, 0x9f, 0x5a, 0x9f, 0xb1, 0xd5, 0x24, 0x6f, 0x9c, + 0xcf, 0x5d, 0xe2, 0x99, 0x4c, 0xf7, 0x12, 0x32, 0x1f, 0x74, 0x2f, 0xb0, 0x7c, 0xb4, 0xce, 0x72, 0xdd, 0x00, 0xb9, 0xc6, 0x88, 0xa8, 0x65, 0x74, 0x04, 0xc9, 0x75, 0x16, 0xe6, 0xb8, 0x4c, 0x2d, + 0x20, 0xa5, 0x5f, 0x60, 0x2b, 0x7a, 0x06, 0x41, 0x78, 0x3f, 0x8f, 0x41, 0x84, 0xeb, 0x51, 0x73, 0xc1, 0x71, 0x61, 0x38, 0x42, 0x00, 0xa3, 0xdd, 0x4f, 0x37, 0x82, 0x9f, 0x41, 0x0b, 0x24, 0x51, + 0xa6, 0xeb, 0x08, 0xa3, 0x73, 0x67, 0x6e, 0x39, 0xae, 0x24, 0xa3, 0xce, 0x1e, 0xc7, 0x9b, 0x8c, 0x06, 0x51, 0xd1, 0x9e, 0xa4, 0xf1, 0x10, 0xb9, 0xe6, 0x12, 0x69, 0xff, 0xef, 0x39, 0xca, 0xf4, + 0xc6, 0xf5, 0xf2, 0x3d, 0x67, 0xf4, 0x39, 0xa5, 0x09, 0x7c, 0xeb, 0xab, 0xfa, 0x91, 0x7d, 0xf6, 0x5f, 0xfc, 0xec, 0xcd, 0xf9, 0x18, 0xe9, 0xbb, 0xa0, 0x8e, 0x67, 0xdb, 0xd8, 0x0b, 0x1c, 0xeb, + 0x9a, 0xf2, 0x1b, 0xda, 0xd7, 0xed, 0xa1, 0xfe, 0xf9, 0x92, 0x44, 0xcd, 0x85, 0x2a, 0xc2, 0xc2, 0x06, 0x38, 0x5a, 0xd3, 0x9c, 0xd5, 0xed, 0x6a, 0x49, 0xcb, 0x45, 0xb1, 0xdc, 0x66, 0x55, 0x04, + 0x4c, 0x61, 0x5e, 0x53, 0x24, 0xd6, 0x42, 0x7a, 0x61, 0x9a, 0x67, 0xfb, 0x4e, 0x5b, 0x4e, 0x7a, 0x2d, 0x4d, 0x95, 0x7c, 0x6b, 0xf3, 0xde, 0x6a, 0x3e, 0x9a, 0x4b, 0x8b, 0xc2, 0x63, 0x01, 0x75, + 0x8a, 0x23, 0x1e, 0xe7, 0x4f, 0x70, 0x83, 0x9e, 0x9b, 0x54, 0xc2, 0x8a, 0xbf, 0xe3, 0x7d, 0xf9, 0xd8, 0xcc, 0x4c, 0xcf, 0x53, 0xf5, 0xdf, 0x8b, 0x1b, 0xf0, 0x0f, 0x00, 0xbe, 0x3f, 0xf9, 0x4c, + 0xfb, 0xfa, 0xe7, 0x89, 0xbb, 0xbf, 0xc8, 0x7e, 0x42, 0xf7, 0xd6, 0x38, 0xab, 0x5c, 0x07, 0xe4, 0xf0, 0x76, 0xf8, 0xd3, 0x68, 0x32, 0x6b, 0x76, 0x13, 0x13, 0xee, 0xb6, 0x96, 0x41, 0x33, 0x0d, + 0x67, 0x14, 0x8a, 0xed, 0x47, 0xab, 0x66, 0xa3, 0x02, 0x0d, 0xb9, 0x01, 0x1a, 0xcb, 0x36, 0x96, 0x04, 0xbf, 0xb7, 0x16, 0x39, 0xee, 0x79, 0x08, 0x8f, 0x9f, 0xb4, 0x62, 0x4a, 0x7a, 0xa0, 0xeb, + 0xc9, 0x78, 0x43, 0xe5, 0x7a, 0x3e, 0x3d, 0x20, 0xcb, 0x23, 0xe6, 0xe8, 0x04, 0xef, 0x8b, 0xab, 0xbd, 0x3f, 0xab, 0xc4, 0x6f, 0x2e, 0x2f, 0xf7, 0x9e, 0xdb, 0xcf, 0xba, 0xff, 0xe7, 0xb9, 0x88, + 0x6e, 0x28, 0x7f, 0x22, 0xf0, 0xde, 0x3e, 0x83, 0x30, 0x20, 0x07, 0xd1, 0x21, 0x24, 0xa3, 0xb8, 0xb0, 0xb8, 0x0d, 0x0f, 0xd0, 0x1b, 0x14, 0x3f, 0x8d, 0x92, 0x00, 0x39, 0x80, 0x00, 0x0f, 0x71, + 0xc6, 0x32, 0x82, 0xa5, 0x3d, 0xba, 0x07, 0xd8, 0x94, 0x33, 0x27, 0x23, 0x7f, 0xbd, 0x98, 0xf4, 0xa3, 0x5d, 0xc7, 0x40, 0x46, 0xbf, 0xa0, 0x4f, 0x55, 0x7b, 0xa0, 0x57, 0xf2, 0x24, 0x15, 0xd0, + 0xb4, 0xcf, 0x04, 0x3b, 0x2e, 0xf6, 0x69, 0x07, 0x65, 0x0c, 0x61, 0xaf, 0xa3, 0x93, 0xe4, 0x3f, 0x04, 0xe1, 0xb9, 0x47, 0xcb, 0x2b, 0xa1, 0x1d, 0x17, 0x92, 0x1f, 0xdd, 0xae, 0xc6, 0xd0, 0xef, + 0x61, 0x1d, 0x6f, 0xfd, 0x35, 0x47, 0xea, 0x41, 0x09, 0x90, 0xd8, 0x37, 0x7c, 0x40, 0x4e, 0x56, 0xad, 0x67, 0xf5, 0x0b, 0xba, 0xf0, 0xa5, 0x06, 0x9b, 0xcd, 0x44, 0x3e, 0x4d, 0x0f, 0x12, 0xbd, + 0xce, 0x8e, 0x81, 0x64, 0x30, 0x73, 0x76, 0xa9, 0x2a, 0x04, 0x64, 0x95, 0x5a, 0xb0, 0xdd, 0xd6, 0x53, 0x7c, 0xce, 0xed, 0x54, 0x42, 0xa8, 0x48, 0xab, 0x9d, 0x08, 0x8b, 0xb9, 0xa1, 0xd2, 0x96, + 0x76, 0x6c, 0x16, 0x21, 0x0d, 0xa7, 0xf5, 0x0d, 0x73, 0xca, 0x8b, 0xb7, 0x73, 0xfb, 0xd9, 0xcb, 0xfb, 0xbb, 0xe0, 0x93, 0xa7, 0x56, 0x98, 0xb9, 0xce, 0xef, 0x35, 0x44, 0xff, 0xbc, 0x26, 0xef, + 0x1d, 0xed, 0x33, 0x32, 0x37, 0x77, 0xce, 0x7b, 0xda, 0x2f, 0x35, 0x7a, 0xdf, 0x20, 0x5a, 0x8a, 0x5b, 0x84, 0x93, 0xbc, 0x66, 0xed, 0xd2, 0x1e, 0x66, 0x93, 0x16, 0xc9, 0xad, 0x97, 0xfb, 0x80, + 0x95, 0x17, 0x87, 0x11, 0x1c, 0xcf, 0x66, 0x25, 0x99, 0xa4, 0x12, 0xd9, 0xda, 0xed, 0x92, 0x9a, 0x92, 0x24, 0x44, 0x1b, 0xec, 0xbe, 0x96, 0x97, 0x33, 0x79, 0x11, 0x38, 0x49, 0x4f, 0xf4, 0xbc, + 0xde, 0x1d, 0x03, 0x3c, 0x59, 0x38, 0x59, 0x9b, 0x72, 0xbc, 0x0b, 0x8c, 0xa6, 0xb6, 0x93, 0x53, 0xce, 0x80, 0xd8, 0x39, 0xc7, 0x4d, 0xcc, 0xd3, 0x35, 0x36, 0x1f, 0x45, 0xed, 0x9f, 0xf0, 0x94, + 0x34, 0x35, 0x33, 0xe7, 0x69, 0x4a, 0x10, 0xfc, 0xa5, 0xc0, 0xc3, 0x4f, 0xaa, 0x17, 0xf8, 0x2e, 0xd7, 0xe7, 0xe4, 0xe9, 0x03, 0xe6, 0x16, 0x1f, 0x2b, 0x1b, 0xa2, 0x49, 0xbd, 0x11, 0xed, 0xc2, + 0x0b, 0x23, 0x56, 0x0f, 0xb8, 0x87, 0xaf, 0x89, 0xdc, 0xc3, 0x4e, 0x1b, 0x54, 0x5a, 0xb3, 0x0c, 0x8c, 0x38, 0x1a, 0xa3, 0x90, 0xe9, 0xd6, 0x33, 0xc8, 0xb4, 0x0c, 0x89, 0x5e, 0x37, 0xc4, 0x92, + 0x8d, 0x9b, 0x7d, 0xc8, 0x06, 0x27, 0x4f, 0x90, 0x1b, 0xbc, 0x56, 0x83, 0x4c, 0x23, 0x49, 0x28, 0x64, 0xf7, 0x6e, 0xdb, 0x66, 0x89, 0x84, 0xec, 0xbe, 0xb9, 0x4b, 0xdb, 0x79, 0x5a, 0xe4, 0x99, + 0x9b, 0xd5, 0x63, 0x37, 0x0d, 0xeb, 0xfa, 0x87, 0x9c, 0x28, 0x2f, 0x02, 0x70, 0x4b, 0xfd, 0x02, 0xc4, 0xed, 0xbd, 0x31, 0x34, 0x0c, 0x10, 0xc9, 0x99, 0x54, 0x2e, 0x2a, 0x92, 0xa3, 0x8a, 0x87, + 0x94, 0xee, 0x60, 0x44, 0x95, 0x2d, 0x96, 0x4d, 0x59, 0x50, 0x02, 0xe3, 0xf1, 0x20, 0x70, 0xd2, 0x33, 0x39, 0xcc, 0x50, 0x11, 0x28, 0x17, 0x93, 0x94, 0x6f, 0x6a, 0xba, 0x55, 0xcb, 0xf9, 0x2c, + 0x58, 0x37, 0xd6, 0xa4, 0x24, 0xc0, 0x66, 0x6b, 0x8d, 0x64, 0x4a, 0x26, 0x1b, 0x0a, 0x14, 0xf5, 0x9c, 0x24, 0x40, 0xdd, 0xf1, 0xcc, 0xba, 0x92, 0x06, 0x69, 0x78, 0xae, 0xad, 0x53, 0x8f, 0x0f, + 0x18, 0xaf, 0x6d, 0xd7, 0x1f, 0x64, 0xcf, 0xa8, 0x7c, 0x34, 0xc6, 0xe0, 0xef, 0x1b, 0x35, 0x34, 0x86, 0xd9, 0xa4, 0x84, 0x26, 0xc0, 0x2e, 0xf2, 0x9c, 0x29, 0x9f, 0x71, 0x0b, 0x33, 0x6a, 0x7c, + 0x48, 0x25, 0x1d, 0x69, 0xf2, 0x58, 0x58, 0xbc, 0xef, 0xd0, 0x55, 0x71, 0xa5, 0xc7, 0xc2, 0xde, 0x8b, 0x3d, 0xfa, 0xa0, 0x7b, 0xe9, 0xd2, 0x47, 0x6b, 0x68, 0x41, 0x5c, 0x93, 0x63, 0x8b, 0xd2, + 0x8f, 0xa7, 0x7a, 0x40, 0x6e, 0x4f, 0x34, 0x3c, 0x0d, 0x22, 0xbc, 0x5b, 0xd5, 0xf0, 0x68, 0x31, 0x85, 0xe5, 0x0e, 0x5a, 0x48, 0x12, 0xd3, 0x1f, 0xc8, 0x6e, 0x53, 0xc0, 0xba, 0x49, 0xa4, 0xcb, + 0x54, 0xc7, 0x59, 0xa1, 0x6d, 0xeb, 0x36, 0xcd, 0x4c, 0x5c, 0x3e, 0x6a, 0x12, 0xb1, 0xe6, 0x0c, 0x24, 0xee, 0xb9, 0x05, 0x8a, 0x6f, 0x61, 0xb8, 0x4d, 0x4c, 0xa9, 0x88, 0xdd, 0xe5, 0x6b, 0x46, + 0x35, 0x27, 0xaf, 0xc7, 0x45, 0x99, 0x5f, 0xd4, 0xf5, 0xf7, 0xb6, 0x8c, 0xbf, 0xfd, 0xd2, 0xb4, 0x5d, 0xaf, 0x49, 0xc6, 0xde, 0x97, 0xd6, 0xeb, 0xe6, 0xa8, 0x95, 0x9a, 0xb1, 0x3b, 0xfe, 0xa8, + 0xbb, 0xf4, 0x4d, 0xd9, 0x71, 0x5f, 0xe8, 0xed, 0x81, 0x21, 0xe7, 0x51, 0xe6, 0xc1, 0x07, 0x94, 0x7e, 0x2e, 0xf1, 0x74, 0x37, 0xea, 0x79, 0x1c, 0x3e, 0x1b, 0x70, 0xf0, 0xa5, 0x0a, 0x3c, 0x17, + 0x92, 0xe7, 0xb1, 0x7e, 0xbb, 0x38, 0x47, 0x43, 0x0e, 0x18, 0x66, 0xa3, 0x2b, 0x97, 0xf1, 0x6a, 0x7d, 0x54, 0xa5, 0x09, 0xc5, 0xe4, 0xfb, 0x9a, 0x1f, 0x9d, 0x34, 0x0a, 0x25, 0x28, 0x0b, 0x63, + 0x93, 0xf0, 0x68, 0x99, 0xee, 0x6c, 0xe7, 0x91, 0x22, 0x49, 0xb4, 0x5a, 0xb5, 0xcd, 0x80, 0x7c, 0xa4, 0x77, 0x28, 0xe1, 0x93, 0x3b, 0x59, 0x5e, 0xb0, 0x38, 0x3c, 0x0d, 0xc4, 0xad, 0xb3, 0x1d, + 0x75, 0x4b, 0xbc, 0xa7, 0x36, 0xde, 0xc4, 0x59, 0x6e, 0x13, 0x20, 0x3e, 0xc6, 0xea, 0x03, 0x59, 0xe9, 0xed, 0x9b, 0xa2, 0xa7, 0xba, 0xc4, 0x17, 0x8f, 0xa8, 0x1f, 0x54, 0x3f, 0x7b, 0x1d, 0x99, + 0xe5, 0x90, 0xa3, 0xea, 0xd9, 0xa9, 0xaa, 0x1b, 0x99, 0x8e, 0xed, 0xf5, 0xc2, 0xd1, 0x16, 0x5c, 0x66, 0x04, 0xee, 0x92, 0x56, 0x2a, 0x4b, 0x60, 0x92, 0xac, 0x34, 0x1e, 0xb4, 0x16, 0xd8, 0x54, + 0x3e, 0xee, 0x51, 0x1c, 0x82, 0xec, 0xa3, 0x1c, 0x40, 0x3b, 0xeb, 0x78, 0xc4, 0x8e, 0x06, 0xb9, 0x62, 0x21, 0x57, 0xab, 0x17, 0x1e, 0x5a, 0x85, 0x78, 0xe9, 0xc3, 0x49, 0x90, 0xa9, 0x51, 0xa5, + 0x6d, 0xb8, 0x25, 0xe7, 0x59, 0x12, 0xd3, 0x74, 0x43, 0xdc, 0x80, 0xed, 0xb7, 0x45, 0x78, 0x2e, 0x48, 0xf2, 0x34, 0x1f, 0xd8, 0x8b, 0x27, 0xdf, 0x2b, 0xc2, 0x67, 0x44, 0xbe, 0x9a, 0xc3, 0x4e, + 0xbd, 0xb5, 0x07, 0xa9, 0x8c, 0x7f, 0x08, 0xdb, 0xe5, 0x01, 0x72, 0x0f, 0xf5, 0x51, 0xe4, 0x92, 0x99, 0xa3, 0xaa, 0x8b, 0xce, 0xb4, 0x07, 0x74, 0xeb, 0x3a, 0x4a, 0xf1, 0x59, 0xa7, 0x5e, 0xd8, + 0xb6, 0x3e, 0xc9, 0xbe, 0x75, 0xe9, 0xb3, 0x31, 0x34, 0x50, 0xb6, 0x99, 0x69, 0x2e, 0x60, 0xf9, 0x5b, 0x3a, 0x11, 0x1c, 0x01, 0xd2, 0x28, 0x44, 0x8e, 0x41, 0xbc, 0x21, 0x8a, 0xd9, 0x1a, 0xcb, + 0xa1, 0x23, 0x50, 0x6b, 0x62, 0xbd, 0xc7, 0x30, 0x65, 0xda, 0x27, 0x81, 0x1e, 0x34, 0x1d, 0xbf, 0xab, 0xb5, 0x58, 0x20, 0xa9, 0x9a, 0x76, 0xda, 0xe5, 0xd4, 0x3e, 0x20, 0xb8, 0xd6, 0xbb, 0xf3, + 0xd5, 0x34, 0x84, 0xfa, 0x2d, 0xe2, 0x88, 0x36, 0x5e, 0x74, 0x1b, 0xbd, 0xfc, 0xbe, 0x73, 0x3f, 0x2e, 0x7f, 0xf8, 0x1f, 0x6a, 0x45, 0x1f, 0xbc, 0xe0, 0x8c, 0xc7, 0xf7, 0xdb, 0x43, 0xf5, 0xa5, + 0x2d, 0x54, 0x24, 0xcc, 0x62, 0x72, 0x22, 0x4a, 0x20, 0x11, 0x82, 0x36, 0x5c, 0x43, 0x5d, 0xb9, 0x2f, 0x36, 0xee, 0x49, 0x65, 0x56, 0x33, 0x03, 0x96, 0xe9, 0xad, 0xae, 0x50, 0x66, 0x91, 0x62, + 0x00, 0x3e, 0x23, 0xb2, 0x8d, 0x90, 0x9f, 0x5a, 0xad, 0x98, 0x48, 0x2c, 0x40, 0x09, 0xcb, 0x43, 0x36, 0x8d, 0xa9, 0x3e, 0x3b, 0xed, 0x7c, 0xdd, 0xd8, 0x56, 0x52, 0xad, 0xeb, 0xcc, 0xce, 0x6a, + 0x56, 0xf8, 0x20, 0x37, 0x78, 0xc7, 0x35, 0x9f, 0xe6, 0x86, 0x7e, 0x2d, 0x9b, 0xe0, 0x99, 0xe2, 0x39, 0xf0, 0xc8, 0xac, 0x83, 0x21, 0x69, 0x03, 0xa1, 0xf1, 0xcc, 0x3c, 0xd8, 0x22, 0x89, 0x39, + 0x71, 0xa6, 0x2e, 0x97, 0x94, 0xbd, 0xf1, 0x53, 0x7d, 0xba, 0x58, 0x59, 0x2b, 0xfb, 0x78, 0x9f, 0x09, 0xe3, 0xa7, 0x62, 0xaa, 0xaf, 0x15, 0x29, 0xb8, 0x8d, 0x93, 0x1a, 0x58, 0x98, 0x80, 0xdf, + 0xe3, 0xfb, 0x83, 0x80, 0x01, 0x90, 0x49, 0xd8, 0x87, 0xf8, 0xa8, 0x77, 0xf0, 0x69, 0x5f, 0x55, 0xd0, 0xd4, 0x83, 0xd1, 0x2d, 0xbb, 0x23, 0x8b, 0xc5, 0x5e, 0x74, 0x40, 0xa0, 0x61, 0x01, 0x56, + 0x38, 0x38, 0x62, 0x70, 0xb4, 0x04, 0x93, 0x20, 0x90, 0x20, 0xeb, 0x23, 0x9b, 0x82, 0xb5, 0x83, 0x58, 0x2c, 0xaa, 0xc4, 0x9b, 0x4e, 0x31, 0x78, 0x62, 0xb3, 0x82, 0xca, 0xaf, 0xe4, 0x94, 0xd3, + 0x27, 0xaf, 0xf9, 0x60, 0xfc, 0x5a, 0x48, 0xd5, 0x71, 0xdf, 0x04, 0xcb, 0xd2, 0xad, 0xaa, 0xdf, 0x54, 0x7c, 0x93, 0x97, 0x44, 0xd9, 0x07, 0xf4, 0xcf, 0x70, 0x7e, 0xbb, 0x3b, 0x9e, 0xfc, 0x2e, + 0xce, 0x42, 0x63, 0x9f, 0x55, 0x1c, 0x2e, 0x72, 0x18, 0x9e, 0x6a, 0xd1, 0x35, 0x33, 0x5f, 0xe8, 0x61, 0x59, 0x63, 0x6b, 0xff, 0x30, 0x01, 0xb8, 0x97, 0xe0, 0xf9, 0x23, 0x65, 0xdf, 0x4d, 0x52, + 0xb2, 0x67, 0x4b, 0xe2, 0xcf, 0xa5, 0x81, 0x2f, 0xb2, 0x67, 0x64, 0x3e, 0x1a, 0x43, 0x33, 0xf6, 0x9d, 0x1c, 0xc2, 0x9e, 0xce, 0x9c, 0xf0, 0xa0, 0xd9, 0xd2, 0x68, 0x1d, 0xd9, 0x9d, 0x2a, 0x5a, + 0xc4, 0x22, 0x0e, 0xd6, 0x36, 0x9e, 0xf9, 0xdb, 0x12, 0xe4, 0xcc, 0x80, 0x22, 0x57, 0xed, 0x22, 0x5c, 0x77, 0x78, 0xd1, 0xec, 0x4c, 0x0b, 0x3e, 0x19, 0x49, 0x30, 0xca, 0x62, 0xb3, 0xe2, 0x33, + 0x43, 0x18, 0x51, 0x2b, 0x65, 0x26, 0xa0, 0xa5, 0x54, 0xc0, 0xeb, 0x7e, 0x1d, 0xac, 0x8d, 0xbe, 0xdd, 0x2e, 0xf1, 0xd7, 0x66, 0xdb, 0xa0, 0xb2, 0x67, 0xe7, 0x82, 0x94, 0x77, 0xb5, 0x7a, 0xee, + 0x0b, 0xff, 0x7c, 0x79, 0x1a, 0x7e, 0xa3, 0xf0, 0xae, 0x8c, 0x0f, 0xab, 0xc7, 0xff, 0xfc, 0xfe, 0xf3, 0xa7, 0xa7, 0xcf, 0x37, 0x83, 0xfd, 0x99, 0x74, 0xf1, 0x4f, 0x51, 0xe6, 0x75, 0x5e, 0x9f, + 0x0a, 0xf7, 0x1f, 0x2f, 0x31, 0xfd, 0x8f, 0x67, 0x9f, 0x96, 0x72, 0xbe, 0x0c, 0xcb, 0x4f, 0x59, 0x7a, 0xc1, 0x97, 0xf2, 0x2b, 0x5c, 0xd1, 0xfd, 0x1c, 0xfc, 0x4b, 0xc6, 0x5e, 0x70, 0x58, 0x86, + 0x85, 0x0d, 0x4f, 0x1f, 0x19, 0xde, 0x14, 0x74, 0x87, 0x4e, 0xd6, 0x52, 0x3d, 0x17, 0xbd, 0x05, 0xa3, 0x19, 0xb5, 0xd7, 0x01, 0x8d, 0xc7, 0xe1, 0xa3, 0x52, 0x8b, 0x50, 0x84, 0x90, 0x18, 0xba, + 0xb7, 0x53, 0xa0, 0x5d, 0x75, 0xa2, 0xb4, 0x5f, 0xd6, 0x28, 0x2f, 0x1c, 0x98, 0xe5, 0xae, 0x4a, 0xe1, 0x3d, 0xc5, 0x95, 0x5b, 0x86, 0xaa, 0x77, 0x12, 0x8a, 0x54, 0x3a, 0xb4, 0xa1, 0xd8, 0x05, + 0xdc, 0xce, 0xf8, 0x61, 0x5b, 0x83, 0x5b, 0xa4, 0x6e, 0xe9, 0x3f, 0x63, 0x17, 0xaf, 0x95, 0x0e, 0xf8, 0xa4, 0xfa, 0x8e, 0xc6, 0xf9, 0x7a, 0x68, 0xd1, 0x80, 0xe5, 0x7a, 0xa2, 0xfa, 0x0c, 0xe2, + 0x33, 0xc9, 0x48, 0xa0, 0x8d, 0x74, 0x3a, 0x89, 0xb3, 0xaa, 0x91, 0x97, 0x05, 0x35, 0xca, 0x28, 0x99, 0x2b, 0x31, 0x0e, 0x69, 0x09, 0xd1, 0xf6, 0x49, 0x4c, 0x46, 0x27, 0x6c, 0x04, 0xa0, 0xbb, + 0x03, 0x17, 0x2e, 0xc5, 0x75, 0x41, 0x92, 0x7a, 0x0f, 0x09, 0xf5, 0x08, 0x45, 0x2d, 0xa3, 0x10, 0x26, 0x22, 0xb6, 0x39, 0xb9, 0x20, 0x9f, 0x13, 0x9c, 0xc0, 0x5e, 0x74, 0x26, 0x77, 0x1d, 0xff, + 0x96, 0xdb, 0xf3, 0xbf, 0x53, 0x27, 0xde, 0x13, 0x3f, 0xc3, 0x70, 0x7b, 0x6b, 0xa8, 0x52, 0x11, 0x64, 0x64, 0x67, 0x9b, 0x37, 0x15, 0xdd, 0x1a, 0x0a, 0x4c, 0x85, 0xcb, 0xc4, 0x70, 0x8d, 0x19, + 0x4d, 0xaa, 0xad, 0x7c, 0x4c, 0xd9, 0xaa, 0xd3, 0xe6, 0x94, 0x87, 0x07, 0x3b, 0x8c, 0xdd, 0xf9, 0x2b, 0xc4, 0xc4, 0x39, 0x8d, 0x6a, 0x80, 0x89, 0x66, 0xa1, 0xcd, 0x4e, 0xcf, 0xfb, 0x38, 0x3a, + 0x25, 0xa7, 0xf9, 0xd1, 0x05, 0xd7, 0x24, 0x13, 0x4a, 0x24, 0x14, 0x69, 0xc8, 0x54, 0xc6, 0xc0, 0x9d, 0x36, 0xc4, 0xc8, 0xea, 0xb8, 0x5e, 0x98, 0xb9, 0xe7, 0x53, 0xa0, 0x5b, 0xd6, 0xe1, 0x0f, + 0x41, 0x74, 0x2f, 0x22, 0x74, 0x4b, 0xfd, 0x02, 0xd1, 0xed, 0xbd, 0xa1, 0x18, 0x4d, 0xb8, 0x83, 0xa7, 0xb3, 0x11, 0x9c, 0x6c, 0x7a, 0x87, 0x93, 0x3d, 0xdc, 0x60, 0x0c, 0x0a, 0xd0, 0x46, 0x46, + 0x73, 0x1a, 0x91, 0xfe, 0x02, 0xf5, 0x20, 0x14, 0x71, 0x71, 0x16, 0xee, 0x30, 0xc7, 0xcf, 0x0a, 0x76, 0x56, 0x92, 0x0b, 0xb7, 0x5c, 0xe9, 0x05, 0x87, 0xa0, 0x8c, 0xae, 0xdb, 0x51, 0x16, 0x3b, + 0xc2, 0x96, 0x8b, 0x84, 0x98, 0x98, 0xa1, 0xda, 0x92, 0xc4, 0x47, 0x13, 0x99, 0x4d, 0xf6, 0x03, 0xb4, 0xf6, 0xdf, 0xb9, 0x14, 0xf8, 0x0f, 0xf4, 0xc4, 0x69, 0xe8, 0xd2, 0xb9, 0x67, 0x6c, 0xe7, + 0x35, 0x49, 0xfd, 0x9d, 0xe6, 0x27, 0x74, 0xce, 0x10, 0x19, 0x1d, 0x1a, 0x9f, 0x74, 0xd8, 0xea, 0x5b, 0x67, 0xe7, 0x90, 0x21, 0x4f, 0x89, 0x49, 0xb1, 0x94, 0x56, 0x06, 0x32, 0xad, 0xbc, 0xa2, + 0x78, 0xbc, 0xfb, 0xde, 0xf5, 0xe3, 0x4e, 0xb3, 0xf8, 0x5f, 0x76, 0xe7, 0x9a, 0xf4, 0xb9, 0x57, 0xd7, 0x37, 0x86, 0x75, 0x6e, 0xd2, 0x97, 0x41, 0x6a, 0x9e, 0xea, 0xd1, 0x04, 0xa2, 0xe6, 0x87, + 0xd2, 0xaf, 0x0a, 0x24, 0xb4, 0xcb, 0x35, 0x7f, 0x0c, 0xee, 0xb3, 0x0d, 0x5d, 0xe9, 0x38, 0x1e, 0x2b, 0x81, 0x5e, 0x12, 0x94, 0xde, 0x89, 0xbe, 0x7d, 0xfd, 0xfb, 0xe5, 0xd9, 0xd6, 0x37, 0x60, + 0x0f, 0x10, 0x39, 0xfc, 0x30, 0xe9, 0x17, 0xee, 0x14, 0x0f, 0x0e, 0xea, 0x21, 0x2a, 0x4d, 0x91, 0x4f, 0x7b, 0x03, 0xda, 0x30, 0x34, 0x21, 0xef, 0xc4, 0xb5, 0x92, 0x50, 0xec, 0x9c, 0x46, 0xe2, + 0x35, 0x9c, 0x8b, 0xed, 0xc6, 0x88, 0x31, 0xc9, 0x12, 0xf7, 0x6d, 0xbd, 0xe0, 0xe0, 0x3d, 0x75, 0x98, 0x78, 0x5d, 0xac, 0x11, 0xf3, 0x79, 0xdb, 0xd2, 0xc8, 0x66, 0x06, 0xce, 0xb4, 0x51, 0xee, + 0x2f, 0x2b, 0x92, 0x83, 0x5f, 0x8b, 0xb6, 0x0c, 0xef, 0xd3, 0xcb, 0x3c, 0x9e, 0xd2, 0x79, 0x1d, 0xfa, 0xd9, 0x73, 0x35, 0x1a, 0xf8, 0x92, 0x8a, 0xe1, 0x93, 0xea, 0x05, 0xc2, 0xcb, 0xf5, 0x18, + 0x1c, 0xa6, 0x62, 0x50, 0x57, 0xab, 0xd5, 0xce, 0x93, 0xcd, 0xa6, 0xa9, 0x4c, 0x6d, 0x3d, 0x1f, 0xe1, 0x9e, 0xaf, 0x8d, 0xb6, 0x5a, 0x4b, 0xee, 0xe3, 0xb9, 0x92, 0x6a, 0x2d, 0x56, 0xc5, 0x68, + 0x96, 0x47, 0x0b, 0xc3, 0x68, 0x1b, 0x5e, 0xdd, 0xae, 0xd4, 0x13, 0x68, 0xc4, 0x88, 0x5a, 0xd0, 0xe2, 0x02, 0xa5, 0x16, 0x91, 0x0c, 0x46, 0x05, 0xd9, 0xd9, 0xb3, 0x79, 0x4b, 0x23, 0x6e, 0xee, + 0xb5, 0xa7, 0x9e, 0xb4, 0xa5, 0xc5, 0x6b, 0x0e, 0x4b, 0xe7, 0x24, 0x39, 0x9f, 0x4e, 0xff, 0x93, 0xe7, 0x29, 0xd5, 0x9c, 0xa6, 0x48, 0xdc, 0xa3, 0x5b, 0x3e, 0x77, 0xe0, 0x78, 0xc5, 0xa0, 0xf7, + 0x49, 0xf5, 0x0d, 0xc6, 0x8f, 0xeb, 0x33, 0x8c, 0xbf, 0x98, 0xf3, 0xa0, 0x31, 0xe6, 0xd3, 0x0e, 0xcd, 0x76, 0x3c, 0x88, 0xb7, 0x34, 0x60, 0xa1, 0x91, 0x67, 0xcf, 0x73, 0xdc, 0x46, 0x66, 0x1b, + 0x9e, 0xf9, 0x9d, 0x3f, 0xfc, 0x5e, 0x54, 0x0b, 0x7b, 0xa9, 0x5a, 0xc8, 0xf3, 0xb0, 0x3e, 0x6c, 0x58, 0x85, 0x90, 0x79, 0x47, 0x6e, 0x24, 0x8a, 0x11, 0xb1, 0x4d, 0xab, 0x2f, 0x49, 0x70, 0x77, + 0x92, 0xda, 0x2e, 0x38, 0x4c, 0xb7, 0xd3, 0x83, 0x10, 0xd8, 0xa8, 0xc0, 0x45, 0x0b, 0xd4, 0xd2, 0x7d, 0x7f, 0x99, 0x30, 0x53, 0xfd, 0xb4, 0xf0, 0x93, 0x11, 0xd8, 0x1e, 0x0f, 0x53, 0x8d, 0xb6, + 0x38, 0x7e, 0x79, 0xd8, 0xf8, 0x58, 0xe0, 0xed, 0xfa, 0xb4, 0xc1, 0x95, 0xa9, 0x01, 0x89, 0xb9, 0x17, 0xa4, 0x0a, 0x13, 0x30, 0xf5, 0x10, 0x11, 0xeb, 0x4d, 0x0c, 0xcc, 0xbd, 0xdf, 0x18, 0x26, + 0xf2, 0xc2, 0x18, 0xdf, 0x50, 0x7e, 0x43, 0xe5, 0xba, 0x7d, 0xb6, 0xe2, 0x0d, 0x30, 0xdd, 0x8e, 0x9a, 0x0e, 0x0a, 0x33, 0x86, 0xd6, 0x04, 0x31, 0x37, 0xb5, 0x86, 0xee, 0xa5, 0xd3, 0xde, 0x81, + 0xa1, 0xd0, 0xe6, 0x46, 0x76, 0x56, 0x23, 0xf3, 0x7e, 0x31, 0x2d, 0x77, 0xa3, 0xed, 0x1c, 0xea, 0x22, 0x5e, 0x95, 0x15, 0xbe, 0x1a, 0x29, 0x2e, 0xb6, 0xe4, 0x5b, 0x6c, 0x16, 0x6c, 0xb1, 0x56, + 0x26, 0x8e, 0x40, 0xce, 0x9c, 0x82, 0x8d, 0x30, 0x15, 0x24, 0x88, 0x1e, 0x15, 0x81, 0x38, 0xa3, 0x9b, 0xe9, 0x6b, 0x6c, 0x27, 0xcf, 0xec, 0x8f, 0xd3, 0x1b, 0xf2, 0x8c, 0xe9, 0xdc, 0xd6, 0x7a, + 0x7c, 0x22, 0x90, 0x10, 0x2f, 0xe4, 0xfd, 0xb9, 0x22, 0xfc, 0x06, 0xe5, 0x57, 0x6b, 0x7c, 0x21, 0xf8, 0x3b, 0x92, 0x33, 0x13, 0x5e, 0xc1, 0x23, 0xc9, 0x99, 0x58, 0x68, 0x7c, 0xa4, 0x54, 0x56, + 0x59, 0x22, 0x8a, 0xb9, 0x43, 0x31, 0xbb, 0x27, 0x37, 0xa7, 0x59, 0x3b, 0xe9, 0x31, 0x8d, 0x0f, 0x74, 0x49, 0x9d, 0x82, 0x3a, 0x79, 0x1c, 0x59, 0x56, 0xa5, 0x1b, 0xc4, 0x51, 0x14, 0x90, 0x84, + 0xdb, 0x9a, 0xbd, 0x2b, 0x34, 0xcb, 0xe4, 0x64, 0xed, 0x19, 0x50, 0x43, 0xb8, 0xb2, 0x11, 0xf2, 0x0a, 0x3b, 0xa8, 0xf9, 0xd4, 0x1b, 0xe0, 0xac, 0xf1, 0x7b, 0x75, 0xcc, 0x3a, 0xbf, 0xa9, 0x66, + 0x7b, 0x39, 0x23, 0xdd, 0x66, 0xe2, 0x7e, 0xcd, 0x47, 0xfa, 0xc1, 0x23, 0x97, 0x0a, 0xac, 0x63, 0xc7, 0xad, 0xec, 0x32, 0x2c, 0x6e, 0xea, 0x61, 0xdf, 0xc6, 0x84, 0x98, 0x5f, 0x42, 0xd3, 0xe4, + 0xee, 0x87, 0x77, 0x22, 0x4f, 0x1e, 0x78, 0xc3, 0xbe, 0xcc, 0xcc, 0x64, 0x5c, 0x25, 0x79, 0xfd, 0xe4, 0x91, 0x6a, 0xfc, 0x86, 0x8a, 0x69, 0x25, 0x5f, 0xfd, 0xbd, 0x3f, 0xc1, 0x66, 0xae, 0x6f, + 0x9e, 0x8b, 0xec, 0xf6, 0x6e, 0x99, 0x7f, 0xee, 0x75, 0xf0, 0xdd, 0x53, 0xd7, 0x67, 0xd8, 0xef, 0x35, 0x7c, 0xaa, 0xc0, 0x2c, 0x3f, 0x8b, 0xae, 0x5e, 0x55, 0xe0, 0xf9, 0x36, 0x08, 0xdf, 0x2b, + 0xd7, 0xde, 0x17, 0x07, 0xef, 0x5c, 0x33, 0x2e, 0x5d, 0xef, 0xf1, 0xbf, 0x7f, 0x1c, 0x97, 0xb3, 0xaa, 0xb8, 0x2a, 0xa1, 0x7b, 0x9f, 0x78, 0xed, 0xb7, 0x43, 0xf3, 0xe5, 0x81, 0x7f, 0xee, 0x3c, + 0xe0, 0x6e, 0x5e, 0x74, 0xf9, 0xc8, 0xab, 0x73, 0x75, 0x5d, 0x86, 0xa9, 0x7b, 0x35, 0xb5, 0x90, 0x5f, 0x9f, 0xae, 0x6a, 0xb3, 0x7c, 0x52, 0xbf, 0xb7, 0xc9, 0xac, 0xfc, 0xf8, 0x6d, 0x2a, 0x5e, + 0x07, 0x6c, 0x5d, 0x31, 0x8d, 0x1f, 0x0a, 0x0e, 0xff, 0x16, 0x3d, 0x7e, 0x3f, 0x54, 0xc3, 0xb9, 0xc0, 0x07, 0xf1, 0x4b, 0xe0, 0xf3, 0x65, 0x83, 0xf9, 0xee, 0x03, 0xf3, 0xd7, 0x33, 0x16, 0x10, + 0xb7, 0x92, 0x73, 0x5c, 0x54, 0x47, 0x23, 0x0a, 0x7a, 0x75, 0x0f, 0x62, 0x46, 0xb6, 0x39, 0x39, 0xbd, 0x0c, 0x29, 0x2a, 0xa0, 0xac, 0x13, 0x45, 0xa5, 0x69, 0x1d, 0xd1, 0x37, 0x1b, 0x1c, 0x73, + 0x27, 0x58, 0xae, 0xce, 0x10, 0x62, 0xe1, 0xc5, 0x9b, 0x83, 0x7f, 0x1a, 0x69, 0xd1, 0x32, 0xb7, 0xf3, 0xee, 0x04, 0x13, 0x36, 0xdb, 0xda, 0x72, 0xd8, 0x8c, 0x62, 0xa6, 0xc5, 0x60, 0x3c, 0x52, + 0x14, 0xed, 0x0f, 0x12, 0xb1, 0xfd, 0xcc, 0x0a, 0xfe, 0xfa, 0xeb, 0xc7, 0x6a, 0xb7, 0x57, 0xcf, 0xfd, 0x16, 0x08, 0xfa, 0x9d, 0xa7, 0x3c, 0xe6, 0xc4, 0xaf, 0xf8, 0xe1, 0xde, 0xd1, 0xbe, 0x30, + 0xe3, 0xeb, 0x3b, 0x63, 0x68, 0x98, 0x4f, 0xae, 0x38, 0xe7, 0x93, 0xc4, 0x37, 0xd6, 0xb5, 0xa9, 0xe6, 0x44, 0x1a, 0xea, 0xa4, 0xbd, 0x99, 0x07, 0x8a, 0x6a, 0xd2, 0xdb, 0x68, 0xbd, 0x9c, 0x08, + 0x7a, 0x05, 0x69, 0xa1, 0xb3, 0xc0, 0x66, 0x5d, 0x48, 0x45, 0x50, 0xac, 0x1f, 0x59, 0x57, 0x54, 0xec, 0x7a, 0x33, 0x73, 0xfb, 0x19, 0x4f, 0x4f, 0x0d, 0x56, 0xa2, 0x41, 0x1f, 0x66, 0x7c, 0x21, + 0x43, 0xd9, 0x8e, 0x44, 0x18, 0x05, 0x0f, 0xa5, 0xa2, 0x1d, 0xc0, 0x8f, 0xbf, 0x33, 0x9f, 0xef, 0x8c, 0x63, 0x88, 0xfa, 0xec, 0xae, 0x96, 0xf5, 0x93, 0x83, 0xa5, 0x5b, 0xd9, 0x66, 0xe1, 0x8e, + 0xfd, 0xdc, 0x7c, 0xee, 0x4f, 0xf7, 0x8a, 0x3e, 0xf3, 0x8a, 0xee, 0x79, 0x08, 0x3e, 0x5b, 0x67, 0x73, 0xdf, 0x00, 0xf8, 0x71, 0xa0, 0x61, 0x02, 0x6b, 0x05, 0xc1, 0xf3, 0x2a, 0x3a, 0xc1, 0x6b, + 0x6a, 0x87, 0x2d, 0x88, 0x82, 0xb6, 0x4a, 0xd7, 0xd4, 0x4c, 0x19, 0xe0, 0x8b, 0xed, 0xe4, 0x64, 0x67, 0xa7, 0x96, 0x4a, 0x14, 0xa7, 0xe3, 0xa6, 0x19, 0xba, 0xd2, 0xd1, 0x1d, 0xea, 0xc2, 0x8c, + 0xe0, 0xa6, 0x5e, 0xbb, 0x32, 0x5c, 0x95, 0x3b, 0x18, 0xc4, 0x0c, 0x98, 0xac, 0x0e, 0x8c, 0xc1, 0xf9, 0x6c, 0x46, 0x06, 0xb3, 0xee, 0x59, 0x49, 0xb6, 0x5b, 0x44, 0x7e, 0x52, 0xf0, 0xbd, 0x16, + 0x26, 0xfb, 0xa9, 0xdb, 0x7b, 0x57, 0xeb, 0x0d, 0x0c, 0x93, 0xf5, 0xa2, 0x43, 0x33, 0x9f, 0x12, 0xf6, 0x02, 0x9b, 0x9f, 0x76, 0x68, 0x53, 0x6e, 0xf7, 0x2c, 0xb8, 0x24, 0x1b, 0x2f, 0x36, 0xec, + 0x3c, 0x5c, 0xad, 0x70, 0xb0, 0x53, 0x1a, 0xa1, 0x89, 0xf6, 0x53, 0x02, 0xb4, 0xc9, 0xa9, 0x52, 0x27, 0x19, 0x0c, 0x52, 0xb0, 0x4a, 0x22, 0x32, 0xb0, 0x9b, 0x49, 0xda, 0x21, 0xd8, 0x7b, 0x9e, + 0x91, 0xc0, 0x9b, 0xad, 0x2f, 0x8f, 0x7c, 0xd1, 0x11, 0x18, 0x26, 0x4c, 0x81, 0x21, 0x4e, 0x1b, 0x9e, 0x69, 0x56, 0xe3, 0xa8, 0x1a, 0x97, 0x4d, 0x56, 0x87, 0x4f, 0x5d, 0x05, 0xc1, 0x7f, 0x88, + 0x17, 0x8e, 0xb8, 0x77, 0xb4, 0x81, 0xf1, 0xfd, 0x9d, 0xf1, 0x99, 0xee, 0xef, 0xe8, 0x00, 0xcb, 0x59, 0x17, 0x01, 0xc5, 0x7a, 0x87, 0x76, 0xc4, 0x1e, 0x77, 0xab, 0xf9, 0x88, 0x84, 0xb2, 0x3c, + 0x0a, 0x99, 0x2d, 0xc4, 0xbb, 0x34, 0x28, 0xb1, 0xf3, 0xbc, 0x3f, 0x02, 0xde, 0xc1, 0x8a, 0x6c, 0x58, 0xf6, 0xe3, 0xb4, 0x62, 0x21, 0xd0, 0x5e, 0x62, 0x04, 0x5d, 0x17, 0xb4, 0x9b, 0x24, 0xa6, + 0xe0, 0xa8, 0x15, 0x9c, 0xaf, 0x71, 0x81, 0x44, 0x5a, 0x50, 0xa2, 0x61, 0x53, 0xee, 0x94, 0xf9, 0x00, 0xb5, 0xcd, 0x57, 0x32, 0xa0, 0x6f, 0xdb, 0xdf, 0xad, 0x23, 0xf0, 0xa3, 0x44, 0x42, 0x57, + 0xae, 0x52, 0x7f, 0xff, 0x0f, 0x7e, 0xef, 0x40, 0xfe, 0x61, 0x69, 0xfb, 0xfb, 0x7b, 0x4e, 0xd2, 0xf7, 0xfa, 0x5b, 0x7f, 0x5f, 0x4e, 0x83, 0xf0, 0xdd, 0x72, 0x8f, 0xaa, 0xf1, 0xc9, 0x4c, 0x9f, + 0xc4, 0xac, 0x66, 0xb9, 0xe3, 0x8e, 0xf3, 0xea, 0x6c, 0x5a, 0xfe, 0xd8, 0xda, 0x27, 0xb7, 0x35, 0xcc, 0xf3, 0xd6, 0x2d, 0x93, 0xdc, 0x74, 0xc6, 0x6f, 0x7b, 0xb1, 0x6b, 0x5f, 0x89, 0x5d, 0x77, + 0x42, 0x42, 0x51, 0xe6, 0xe9, 0xd8, 0x4e, 0x42, 0xf7, 0xa3, 0x60, 0xff, 0xb7, 0x10, 0xdc, 0xc3, 0xe5, 0x15, 0xe8, 0x3f, 0xd0, 0xd3, 0x48, 0xea, 0xf7, 0xe2, 0x2e, 0xe7, 0x0c, 0x0f, 0x4d, 0x19, + 0x8e, 0x3f, 0xbd, 0x9a, 0x7e, 0xd0, 0x07, 0xfd, 0x39, 0x07, 0x7a, 0xfa, 0x96, 0xf3, 0x94, 0x7b, 0xf2, 0xdb, 0x90, 0x54, 0x5c, 0x6f, 0x93, 0x6f, 0xc7, 0xfa, 0xec, 0xce, 0x9f, 0xba, 0xea, 0xb1, + 0x95, 0x8c, 0x55, 0xb7, 0xc3, 0x97, 0xad, 0x67, 0x99, 0x34, 0x36, 0xdb, 0xcb, 0x01, 0x6c, 0x6f, 0x46, 0x93, 0x68, 0xea, 0x71, 0xab, 0x5e, 0xe5, 0xe6, 0xc7, 0x1d, 0xb9, 0x9e, 0x38, 0xda, 0xc4, + 0xc4, 0x76, 0x3d, 0x7e, 0x82, 0x3d, 0xa0, 0x11, 0x41, 0x77, 0x42, 0xa2, 0xbb, 0x34, 0x77, 0x16, 0x93, 0x5c, 0x9e, 0x22, 0x91, 0x22, 0x12, 0xb4, 0xa6, 0x30, 0xcc, 0x37, 0x2d, 0xf3, 0xf7, 0x2a, + 0x38, 0x8f, 0x79, 0xd2, 0x2b, 0x2a, 0xd4, 0x3b, 0xda, 0x5f, 0xa0, 0x7c, 0x9a, 0x9e, 0x26, 0xc3, 0xd4, 0xa7, 0xde, 0xe4, 0x20, 0x12, 0xb9, 0x78, 0x22, 0x22, 0x78, 0x16, 0x90, 0x2e, 0x40, 0x13, + 0xda, 0x9c, 0x80, 0xba, 0x4d, 0xca, 0x92, 0xf3, 0xb9, 0x0a, 0xf8, 0x0b, 0x3e, 0x63, 0xb7, 0x33, 0x7d, 0x35, 0x0d, 0xaa, 0x8e, 0xc7, 0xc8, 0x0d, 0x1b, 0x81, 0x04, 0x6d, 0x4f, 0x69, 0x7d, 0xdb, + 0x13, 0xf6, 0x8a, 0x19, 0x8d, 0x8e, 0x49, 0xb1, 0x98, 0x33, 0xfe, 0xc2, 0x0c, 0x6b, 0xad, 0x02, 0x27, 0x33, 0x45, 0xc2, 0x91, 0x6f, 0xa9, 0xad, 0x7f, 0xac, 0xf5, 0xf3, 0x6c, 0xdb, 0x7a, 0x85, + 0x3b, 0x3d, 0x7b, 0xcd, 0x07, 0x40, 0x0f, 0x7f, 0x3c, 0x6f, 0x6a, 0x03, 0x78, 0x56, 0x12, 0x38, 0x40, 0xb7, 0x1c, 0x6d, 0x62, 0x02, 0xa7, 0x8d, 0x5c, 0x99, 0xd7, 0x89, 0x56, 0x9a, 0x74, 0xed, + 0x05, 0xd3, 0xbd, 0x1e, 0x46, 0x4c, 0x64, 0x26, 0x7b, 0x3b, 0xc6, 0x2a, 0x53, 0xad, 0x1b, 0x33, 0x93, 0x17, 0xa7, 0x0d, 0x77, 0xcc, 0xe8, 0x40, 0xde, 0x53, 0x8b, 0xf5, 0x81, 0x3e, 0x2e, 0xb0, + 0xb4, 0x92, 0xf0, 0x05, 0xd8, 0xcc, 0xd3, 0x43, 0x12, 0x77, 0xd1, 0x5c, 0xc3, 0x8f, 0x6d, 0x47, 0x7f, 0xf3, 0x6e, 0xb8, 0xfe, 0xce, 0xdf, 0x40, 0xc2, 0xfe, 0x81, 0xfe, 0x7c, 0x3f, 0x7b, 0xf0, + 0x82, 0x3b, 0x78, 0xbe, 0x70, 0x79, 0x7b, 0xc1, 0xef, 0xc0, 0x20, 0x41, 0xd4, 0x19, 0x0b, 0x21, 0xf5, 0x23, 0xc0, 0x50, 0xd9, 0x7d, 0x40, 0xed, 0xf2, 0x76, 0x25, 0xd8, 0x21, 0x05, 0x4c, 0xd3, + 0x5d, 0x3d, 0x63, 0x44, 0xf1, 0xb8, 0x1d, 0xc1, 0x1a, 0xb9, 0x58, 0x36, 0x19, 0xb6, 0x90, 0x94, 0x18, 0xce, 0x79, 0xa6, 0xb6, 0x1a, 0xc2, 0x30, 0x0a, 0x34, 0x3e, 0x44, 0x23, 0xd7, 0x00, 0x1a, + 0xac, 0x1f, 0x39, 0x3e, 0xe9, 0x73, 0x18, 0x62, 0x7b, 0x2b, 0x29, 0x23, 0x07, 0x30, 0xf3, 0xab, 0x9a, 0x80, 0xdf, 0x78, 0xf1, 0x97, 0x69, 0xeb, 0xa3, 0x0a, 0xd4, 0xd5, 0xcf, 0xa5, 0xe7, 0xd8, + 0x8f, 0x59, 0xe4, 0xbb, 0x57, 0x47, 0x15, 0xa6, 0x61, 0x62, 0x7e, 0x74, 0xf3, 0x7f, 0x90, 0xe7, 0x89, 0x25, 0xce, 0xb8, 0x95, 0xae, 0xf3, 0x5c, 0x27, 0xf1, 0x9a, 0xd4, 0x71, 0x45, 0xf7, 0x63, + 0x74, 0x2e, 0xad, 0xa1, 0xf2, 0x87, 0xbe, 0x1d, 0xcd, 0x75, 0x6f, 0xae, 0x49, 0x1a, 0xa7, 0x1a, 0xbc, 0x2a, 0xb8, 0x61, 0x46, 0x6f, 0x59, 0xff, 0x54, 0x73, 0x50, 0x27, 0x30, 0xc0, 0x1c, 0x50, + 0xe7, 0x1b, 0x2a, 0x9c, 0xa2, 0x54, 0xa5, 0xc3, 0x4e, 0xd7, 0xb5, 0x0c, 0x08, 0xc6, 0xcc, 0x9a, 0x5e, 0xe7, 0x0c, 0x56, 0x70, 0xda, 0x61, 0x95, 0x73, 0x6e, 0x87, 0xcb, 0x9c, 0x01, 0xcb, 0xb2, + 0x47, 0xb3, 0xb4, 0xba, 0xa1, 0xf7, 0x8b, 0xea, 0x31, 0x93, 0xab, 0x4c, 0x6f, 0xd8, 0x92, 0x7e, 0x71, 0x1f, 0xb8, 0xa5, 0xff, 0x01, 0xc7, 0xed, 0xdd, 0xa1, 0x92, 0xe9, 0x6e, 0xc4, 0xae, 0x6d, + 0xd8, 0x49, 0x99, 0x4d, 0x22, 0x14, 0xc9, 0x02, 0xa0, 0x11, 0x96, 0x48, 0x88, 0x8d, 0x3d, 0xa3, 0x67, 0x9e, 0x50, 0x0b, 0x28, 0xa9, 0xe3, 0x48, 0xa3, 0x6d, 0xf6, 0x22, 0x4a, 0xb5, 0x76, 0x4f, + 0x6c, 0x6c, 0x7f, 0x32, 0xd1, 0xe1, 0x1e, 0x62, 0x34, 0x2b, 0x51, 0xd0, 0xa3, 0xa3, 0x4f, 0x11, 0x61, 0xaf, 0x6b, 0x34, 0xd5, 0x8e, 0xc0, 0x5d, 0x71, 0xc0, 0x99, 0x1c, 0xed, 0xe3, 0x6f, 0x1e, + 0x78, 0x5f, 0x1b, 0xfe, 0xe3, 0x19, 0x01, 0xbf, 0xe2, 0x73, 0xf8, 0x51, 0xc5, 0x73, 0xfc, 0x71, 0x35, 0xbe, 0x10, 0xfa, 0xbd, 0xd3, 0xc6, 0x06, 0xd4, 0xd0, 0x66, 0x82, 0x39, 0xe8, 0xb4, 0x9e, + 0xe9, 0x78, 0xc2, 0x75, 0x1a, 0xb7, 0xac, 0x97, 0x6d, 0x46, 0xb9, 0x6b, 0x7b, 0x85, 0x83, 0x22, 0xb9, 0x95, 0x9d, 0x79, 0x70, 0x98, 0xa7, 0x48, 0x88, 0x1c, 0x47, 0x61, 0x05, 0x4c, 0x70, 0x5e, + 0x85, 0x10, 0xbf, 0x5f, 0x37, 0xd2, 0x3e, 0x28, 0xdc, 0x4c, 0xd9, 0x8c, 0x0a, 0x65, 0xdd, 0x6f, 0xed, 0x66, 0xca, 0x66, 0x50, 0xde, 0xf4, 0xdc, 0x64, 0xc0, 0x02, 0x7d, 0x56, 0xda, 0xf4, 0x81, + 0x4a, 0xe8, 0x41, 0xf1, 0xc0, 0x07, 0xbe, 0xa1, 0x1f, 0x39, 0xae, 0x2f, 0x91, 0xd4, 0xf0, 0xbd, 0x8c, 0xf5, 0x9d, 0x6f, 0x5e, 0x32, 0xf4, 0x7f, 0x7b, 0xf0, 0x0d, 0x3c, 0xb7, 0x2c, 0xdf, 0xa3, + 0xb2, 0xc1, 0xfb, 0x0c, 0xf4, 0x1f, 0x8f, 0x74, 0x66, 0x99, 0x7d, 0x7c, 0x0b, 0x78, 0xcf, 0x2a, 0xbc, 0x30, 0x73, 0xc6, 0xe9, 0xdb, 0x43, 0x1f, 0x4c, 0xe2, 0x5e, 0xea, 0x4b, 0xcc, 0xba, 0xaa, + 0xbf, 0xfa, 0x0b, 0xdd, 0x7c, 0x46, 0x12, 0xfa, 0x41, 0xfd, 0xf6, 0xff, 0x5f, 0x09, 0x69, 0x2e, 0x9c, 0xea, 0x56, 0x64, 0x0b, 0xb3, 0xfc, 0x83, 0xc7, 0x7d, 0x4f, 0x93, 0x7f, 0x3c, 0x8d, 0x4d, + 0xc7, 0xf9, 0xca, 0x75, 0x8f, 0x3d, 0x61, 0x72, 0x77, 0x67, 0xd0, 0xca, 0xb5, 0x9b, 0xd2, 0xbd, 0x80, 0xf5, 0x51, 0x22, 0xe5, 0x01, 0xd8, 0x95, 0x9b, 0xb6, 0xee, 0x47, 0xdc, 0xfa, 0xe4, 0x16, + 0xc4, 0x3a, 0xcc, 0x4e, 0xe3, 0xa4, 0x6c, 0xde, 0x7f, 0x7d, 0x6a, 0x27, 0xba, 0x07, 0xfb, 0xf1, 0x51, 0xe4, 0x95, 0x9c, 0x09, 0x37, 0x94, 0xaf, 0xd6, 0xc4, 0xb9, 0x3d, 0x06, 0x87, 0xe5, 0x4e, + 0xc8, 0xe7, 0x5e, 0x61, 0x57, 0x8b, 0xcc, 0xf1, 0xb3, 0x85, 0xe6, 0x87, 0x0c, 0x66, 0x75, 0x4b, 0x76, 0xd6, 0x64, 0xb0, 0xc3, 0x8f, 0x90, 0x00, 0x47, 0x5a, 0x32, 0x89, 0x77, 0xd5, 0x2e, 0xeb, + 0x01, 0x5e, 0x65, 0x09, 0xc9, 0xf5, 0xbc, 0xa9, 0xba, 0xcc, 0x97, 0x09, 0x8c, 0x40, 0x47, 0x25, 0xdc, 0xb8, 0xf4, 0x6e, 0x0f, 0xb4, 0x2a, 0xd1, 0xc7, 0x0b, 0x6d, 0x7f, 0xd0, 0xd5, 0x63, 0xc4, + 0x77, 0xb4, 0xfd, 0x50, 0xfc, 0xb9, 0x9d, 0x4e, 0x8f, 0x61, 0x78, 0x25, 0xb9, 0xeb, 0x1d, 0xed, 0x2b, 0x20, 0xde, 0xef, 0x8c, 0xc1, 0x61, 0x09, 0x5f, 0x2b, 0x88, 0x12, 0xfd, 0x86, 0xec, 0x00, + 0xe2, 0x50, 0xdb, 0x50, 0x01, 0xec, 0x14, 0x1d, 0x71, 0x0f, 0xc4, 0x8e, 0x93, 0x98, 0xd9, 0x3c, 0x8e, 0x46, 0xb4, 0x62, 0xf3, 0x0c, 0x0b, 0x85, 0x19, 0xc2, 0x69, 0x53, 0x73, 0x69, 0x8a, 0x73, + 0xc2, 0x98, 0x33, 0x35, 0xe8, 0xac, 0xb1, 0xa2, 0x9c, 0x5a, 0x8c, 0x87, 0x24, 0x42, 0x41, 0xb7, 0xb3, 0x5a, 0x80, 0x4f, 0x5d, 0xa1, 0x6c, 0xfd, 0x0a, 0x0b, 0x0e, 0x0f, 0xa5, 0x9b, 0xc3, 0x73, + 0xe5, 0xfd, 0x2b, 0x66, 0xd7, 0x33, 0xc9, 0xf7, 0x7e, 0x1f, 0xc6, 0x17, 0x22, 0xbf, 0x77, 0x57, 0x2f, 0xe2, 0x42, 0xcd, 0x58, 0x3c, 0x77, 0xc0, 0x1c, 0x0a, 0x52, 0x57, 0xb6, 0x31, 0x55, 0xad, + 0x00, 0x97, 0x04, 0x5a, 0x46, 0xd8, 0xad, 0xf5, 0x88, 0xb5, 0x63, 0x58, 0x64, 0x99, 0x7e, 0xe6, 0x61, 0x90, 0x96, 0x42, 0xb3, 0x99, 0x38, 0xa1, 0xac, 0xc6, 0x20, 0x27, 0x3e, 0xbc, 0x66, 0x4e, + 0xa3, 0xc2, 0x1f, 0x51, 0xd2, 0x02, 0x6c, 0x0f, 0x0c, 0x46, 0xb0, 0x27, 0x23, 0x24, 0x61, 0x17, 0xde, 0x0e, 0x88, 0x52, 0x2e, 0xdd, 0xa6, 0xfa, 0x60, 0x4d, 0xd0, 0x73, 0xc3, 0xe0, 0x4d, 0x66, + 0xab, 0x67, 0x96, 0xb4, 0x17, 0x16, 0xcd, 0x27, 0xd9, 0x37, 0xc0, 0x3e, 0x1b, 0x67, 0x3b, 0xda, 0x80, 0xe5, 0x72, 0xe0, 0x73, 0x62, 0x39, 0x72, 0x38, 0x35, 0x9d, 0xc3, 0x1b, 0xdb, 0x42, 0x48, + 0x4b, 0x6b, 0x33, 0x76, 0x7d, 0x54, 0x84, 0x68, 0x9e, 0x8e, 0x24, 0xa9, 0x70, 0x11, 0x7f, 0xd1, 0xac, 0xca, 0x3e, 0xde, 0x60, 0x29, 0xa5, 0x25, 0x80, 0x13, 0xe9, 0x72, 0x03, 0xf3, 0x8e, 0x08, + 0x0b, 0xe6, 0x04, 0x84, 0xb7, 0x48, 0x7e, 0x88, 0x65, 0x9f, 0x08, 0x4b, 0x34, 0x32, 0x37, 0xbb, 0x35, 0xac, 0xca, 0x5a, 0xf1, 0x9a, 0xbd, 0xa8, 0xce, 0xdf, 0x35, 0xb4, 0x5f, 0xe9, 0xbf, 0xa6, + 0x3f, 0x48, 0x69, 0x37, 0xbc, 0xfa, 0x11, 0x9e, 0xc8, 0x4b, 0xd1, 0x73, 0x57, 0x74, 0xcf, 0x80, 0x7e, 0xb6, 0xc6, 0xc8, 0xb0, 0x38, 0xba, 0xa0, 0xc8, 0x6a, 0xba, 0x65, 0xc1, 0x90, 0xa7, 0x8b, + 0x49, 0x71, 0xd8, 0x49, 0x92, 0x4a, 0xf5, 0x61, 0x6e, 0x96, 0x48, 0x5d, 0xe0, 0x6e, 0x43, 0x2e, 0xf0, 0x45, 0x2c, 0xac, 0x26, 0x9a, 0xd9, 0xf0, 0x65, 0x68, 0x6c, 0xfc, 0x6e, 0x65, 0x6c, 0x94, + 0x6d, 0x81, 0x9e, 0x0c, 0xb9, 0x74, 0xec, 0x7a, 0x8d, 0x4b, 0xf3, 0x85, 0x8c, 0xf5, 0x81, 0x21, 0x4b, 0xb0, 0x36, 0x3a, 0xf1, 0x26, 0x69, 0x6d, 0xf3, 0x01, 0xd3, 0xf0, 0xe9, 0x19, 0xfa, 0x6b, + 0xb7, 0xfa, 0xb6, 0xb9, 0x3e, 0xa8, 0xe8, 0x7a, 0x63, 0x78, 0x39, 0x0b, 0x64, 0xe7, 0x41, 0x81, 0x7f, 0xda, 0x50, 0xc6, 0x1f, 0xe1, 0x37, 0x1f, 0x1b, 0xef, 0xe3, 0x11, 0xfb, 0xdc, 0x3c, 0x9f, + 0x2a, 0x15, 0x5e, 0x10, 0xaa, 0x2f, 0x44, 0xdf, 0x86, 0xea, 0x72, 0x75, 0xd1, 0x18, 0x0c, 0x90, 0xa6, 0x91, 0x5e, 0x38, 0x2e, 0x4e, 0xc1, 0xfc, 0x14, 0x6e, 0xe1, 0x8e, 0x99, 0xd5, 0xf2, 0x86, + 0x41, 0x7d, 0x1b, 0x87, 0x01, 0x2a, 0x3a, 0x18, 0x36, 0x94, 0x67, 0x0c, 0xc2, 0xf5, 0x40, 0x02, 0x16, 0xbb, 0x72, 0x96, 0x54, 0xb2, 0xa7, 0xd3, 0x00, 0x6c, 0x30, 0xb6, 0x3a, 0x72, 0x27, 0xf9, + 0x0c, 0xee, 0x16, 0x9d, 0xd5, 0x33, 0xbb, 0x2d, 0xdb, 0x99, 0xf0, 0x64, 0x89, 0x97, 0x01, 0x3a, 0x5a, 0x48, 0xbb, 0xf8, 0x3b, 0x77, 0xcc, 0xcb, 0xb1, 0x6b, 0x3e, 0xcd, 0xf2, 0x0f, 0xde, 0x14, + 0x8b, 0x18, 0xdc, 0xe9, 0x77, 0xa2, 0x6f, 0xbd, 0x7e, 0xbf, 0x3c, 0x6f, 0x8f, 0x03, 0xb4, 0x03, 0xd1, 0x41, 0xf7, 0x36, 0x05, 0x96, 0xe6, 0x44, 0xcb, 0x9c, 0x44, 0x0f, 0x3f, 0xc5, 0x3b, 0xb8, + 0xc5, 0x66, 0x23, 0x78, 0x8b, 0x88, 0x91, 0x3b, 0x77, 0x99, 0xe9, 0x68, 0xd1, 0x13, 0xfb, 0xd2, 0x0c, 0x79, 0x28, 0xf4, 0x33, 0x1c, 0xea, 0xa2, 0x90, 0xc6, 0x96, 0x16, 0xd1, 0xca, 0xfc, 0xae, + 0x15, 0xbd, 0x6d, 0x9d, 0xca, 0x26, 0x42, 0xc3, 0x52, 0x2e, 0x2a, 0x65, 0xb9, 0x0f, 0x5b, 0x47, 0x35, 0xd2, 0xd7, 0x5c, 0x2a, 0x1e, 0x29, 0xd6, 0x27, 0x4f, 0xa6, 0x4e, 0x5e, 0xfe, 0x00, 0x22, + 0xfc, 0x52, 0x65, 0x98, 0x77, 0x9a, 0x17, 0x0c, 0xcf, 0x10, 0xc2, 0xbf, 0xd7, 0x7e, 0x81, 0xc6, 0xf3, 0x11, 0x32, 0x53, 0xc9, 0xb0, 0xa9, 0xd2, 0x85, 0x98, 0xa3, 0x38, 0x3a, 0x4d, 0x22, 0x67, + 0xa6, 0x58, 0xd5, 0x6a, 0x7a, 0xef, 0x91, 0x74, 0x5d, 0x56, 0xea, 0xf1, 0x67, 0xbf, 0x92, 0xca, 0xe3, 0x93, 0xea, 0xe5, 0xc3, 0x2f, 0xd7, 0x63, 0x78, 0x58, 0x22, 0x8f, 0x14, 0x86, 0xb6, 0x93, + 0x1d, 0x9f, 0x52, 0x94, 0x2a, 0xf9, 0x31, 0x4a, 0x12, 0xab, 0x0d, 0x4f, 0x21, 0x52, 0xb3, 0xe3, 0x97, 0x1e, 0x8c, 0x6f, 0x82, 0x80, 0x38, 0xac, 0x74, 0x77, 0x9b, 0xac, 0x0e, 0x88, 0xb6, 0xd8, + 0xab, 0xc9, 0xfa, 0x04, 0xd7, 0x01, 0x5c, 0x25, 0xe4, 0x56, 0xc5, 0x57, 0x05, 0x4e, 0xf5, 0x49, 0xae, 0x1b, 0x7c, 0x68, 0x19, 0x6b, 0xac, 0x9e, 0xba, 0x36, 0x53, 0x2e, 0xe5, 0x48, 0x1b, 0x60, + 0x43, 0xb9, 0x2a, 0x61, 0x77, 0xa9, 0xee, 0x7c, 0xc3, 0x44, 0xbe, 0xc7, 0xfe, 0x5e, 0xf8, 0x15, 0x7a, 0xfd, 0x50, 0x1a, 0xa6, 0x97, 0x52, 0x3d, 0xd5, 0x3b, 0x27, 0x82, 0x9e, 0x3a, 0xe7, 0xbd, + 0xc1, 0x12, 0x3a, 0xef, 0xf3, 0xea, 0x99, 0x25, 0xeb, 0x05, 0x56, 0xf3, 0x49, 0xf6, 0x1d, 0xfa, 0x4b, 0xe3, 0x6c, 0xbf, 0x1a, 0xc0, 0x6f, 0x34, 0xdc, 0xdf, 0xa4, 0x23, 0x04, 0x62, 0x00, 0x3c, + 0xf6, 0x1b, 0x11, 0x01, 0x72, 0x68, 0x31, 0x91, 0x18, 0x5a, 0x4a, 0x03, 0x7d, 0xb9, 0x42, 0x8a, 0x6c, 0x7b, 0xca, 0xb3, 0xb6, 0x31, 0x47, 0x08, 0x58, 0x1e, 0x6c, 0x2a, 0x55, 0x90, 0x91, 0x86, + 0x41, 0x27, 0xd3, 0x98, 0x90, 0xc8, 0x14, 0x3b, 0x5a, 0x96, 0x3f, 0xaf, 0xe6, 0x5e, 0x24, 0x0b, 0x21, 0x3a, 0x6d, 0x80, 0x1d, 0xda, 0xb2, 0x90, 0xfa, 0xcc, 0x33, 0xe3, 0x1e, 0x8e, 0xce, 0x2c, + 0x9d, 0xa7, 0xde, 0x8a, 0x2f, 0x4a, 0xa9, 0x1f, 0x54, 0x2f, 0x60, 0x5c, 0xae, 0x87, 0x4a, 0xa6, 0x56, 0x23, 0xad, 0x40, 0xaf, 0x20, 0x6b, 0x89, 0x96, 0x95, 0x39, 0x3f, 0x93, 0x5d, 0x34, 0x58, + 0xc0, 0x53, 0xbc, 0xa6, 0x1a, 0x6b, 0x99, 0x4b, 0x1b, 0x0b, 0x31, 0xb6, 0x33, 0x74, 0x7b, 0xe4, 0x34, 0x7a, 0xdb, 0xc1, 0x3e, 0x6f, 0x77, 0x74, 0x4e, 0x74, 0x27, 0xd3, 0x4a, 0x7a, 0xae, 0xe7, + 0x67, 0xd3, 0x9e, 0x38, 0xce, 0x88, 0x0d, 0xc4, 0x6e, 0xa3, 0x18, 0xd8, 0xd6, 0x28, 0xa7, 0x10, 0xa6, 0x9e, 0x7f, 0xe7, 0xbd, 0xd5, 0x3f, 0xa5, 0x6b, 0x26, 0xc5, 0x4f, 0xe1, 0x32, 0xaf, 0x78, + 0x36, 0x5e, 0xd1, 0x7d, 0xeb, 0xfc, 0x57, 0x6b, 0x98, 0x4f, 0xe3, 0x52, 0x94, 0xeb, 0xb5, 0xcc, 0x69, 0x11, 0x5b, 0xcc, 0x60, 0x30, 0xcf, 0x02, 0xbc, 0x22, 0x45, 0x29, 0x55, 0xd1, 0x18, 0x1f, + 0x30, 0x98, 0xd5, 0x8f, 0x89, 0x4d, 0xe0, 0x97, 0x12, 0x9b, 0x7c, 0x10, 0x3d, 0xf7, 0xe6, 0x3d, 0xa5, 0x09, 0x3c, 0x2c, 0xa5, 0xc9, 0x31, 0x3c, 0x70, 0xa2, 0x84, 0x1c, 0x67, 0x2e, 0xad, 0x34, + 0x24, 0xd1, 0xec, 0xd2, 0x91, 0xb7, 0x94, 0x6c, 0x86, 0xf7, 0x59, 0x92, 0x0b, 0x79, 0x52, 0x18, 0xb9, 0xfb, 0xf0, 0xa4, 0x60, 0x51, 0xe5, 0x6b, 0xf3, 0x03, 0x64, 0xc5, 0xda, 0xc9, 0xaf, 0x41, + 0x30, 0x9f, 0xc9, 0x79, 0x47, 0x62, 0x94, 0x53, 0x17, 0x3c, 0x6d, 0x9a, 0x82, 0xcf, 0xd6, 0x38, 0x04, 0x0b, 0x84, 0x69, 0x8d, 0x16, 0x8b, 0x67, 0x51, 0x50, 0x9f, 0xb7, 0x7e, 0x4a, 0x24, 0x70, + 0xef, 0xfa, 0xf2, 0xe4, 0x58, 0xf2, 0x0a, 0xe7, 0xbd, 0xa6, 0xfc, 0x06, 0xd5, 0x75, 0x7b, 0x70, 0x60, 0x08, 0x93, 0xb7, 0xb3, 0x9e, 0xdb, 0x23, 0x44, 0xb5, 0xc4, 0xf5, 0x64, 0x8a, 0x7b, 0xf2, + 0x7c, 0xb7, 0x9e, 0x56, 0xad, 0xbc, 0x69, 0xcc, 0xd0, 0x12, 0x8e, 0x7b, 0x71, 0xbd, 0xdc, 0xa4, 0x24, 0x6f, 0x29, 0xcd, 0xbc, 0x04, 0x39, 0x0f, 0x62, 0x43, 0x21, 0x2f, 0x56, 0x1c, 0xb1, 0x0d, + 0x97, 0x51, 0xa8, 0x93, 0x73, 0xcb, 0x33, 0x4d, 0x78, 0x19, 0xa0, 0x56, 0xe9, 0x8a, 0xe8, 0x6c, 0xab, 0x29, 0x0c, 0xf8, 0x4d, 0x59, 0x75, 0xef, 0xdc, 0xf3, 0xdf, 0x81, 0x70, 0x43, 0xf9, 0x3d, + 0xa5, 0xe9, 0x67, 0x7b, 0x28, 0x08, 0xf1, 0xce, 0x28, 0x33, 0x8d, 0x43, 0x60, 0x71, 0x1e, 0x52, 0x33, 0x98, 0xf1, 0x21, 0x6b, 0x85, 0xf7, 0x51, 0xce, 0x70, 0xbc, 0x7f, 0xdc, 0x75, 0xfa, 0x9c, + 0x72, 0xb7, 0x4e, 0xa7, 0xa3, 0x4a, 0x0b, 0xd8, 0xbc, 0xec, 0xae, 0x0a, 0x3b, 0xdf, 0x23, 0xc5, 0x9e, 0xf6, 0x58, 0xf5, 0xb8, 0x65, 0xb5, 0x7c, 0x56, 0x66, 0x25, 0x55, 0xc2, 0x2e, 0x51, 0x95, + 0xd9, 0xec, 0x78, 0x5c, 0x31, 0xa5, 0x29, 0x13, 0x03, 0x94, 0x57, 0x03, 0xdc, 0xa2, 0xfe, 0xc8, 0x8f, 0xe9, 0xc9, 0xd1, 0xe4, 0x61, 0x4a, 0xd9, 0xdb, 0x93, 0xc9, 0x2b, 0xb6, 0x90, 0x67, 0xa9, + 0x64, 0xbf, 0x17, 0xc7, 0x7f, 0x08, 0xfa, 0x8a, 0x33, 0x6b, 0x84, 0x5a, 0x4f, 0x21, 0x14, 0x8a, 0x99, 0x13, 0x4c, 0xbb, 0xed, 0x26, 0x29, 0x91, 0xa4, 0xd9, 0x46, 0xa4, 0xdf, 0xa6, 0x11, 0x02, + 0x4d, 0x58, 0x53, 0x9c, 0x61, 0x51, 0x8d, 0x68, 0x38, 0x89, 0x48, 0x8b, 0xca, 0x2b, 0xe8, 0x18, 0xdb, 0x89, 0xc4, 0x4a, 0x3b, 0x78, 0xfa, 0xe9, 0x74, 0xc4, 0x79, 0x19, 0xd8, 0xa0, 0x28, 0x9b, + 0x1f, 0x47, 0xe5, 0x5a, 0xda, 0xc6, 0xc9, 0x86, 0xc5, 0x5e, 0x93, 0xfc, 0x1e, 0xa7, 0x8e, 0x7d, 0x00, 0xe2, 0x23, 0xe7, 0xb3, 0xff, 0x8e, 0x8f, 0x3f, 0x7e, 0xc5, 0x07, 0xb8, 0xdf, 0x7e, 0x18, + 0xc2, 0xdd, 0xdf, 0x80, 0x86, 0xa9, 0xd4, 0xa1, 0x21, 0xbd, 0x65, 0xc4, 0xd0, 0x28, 0x92, 0x7a, 0xbe, 0xf5, 0xe3, 0x26, 0x54, 0xb3, 0x53, 0x13, 0xf7, 0x47, 0x0e, 0x90, 0xd0, 0xed, 0x62, 0xbd, + 0x9f, 0x40, 0xac, 0x3b, 0x21, 0x57, 0xd0, 0xf6, 0x30, 0xb5, 0x40, 0x19, 0x16, 0x82, 0xfd, 0x94, 0x50, 0xd9, 0x90, 0x68, 0x8d, 0x42, 0x58, 0x88, 0x9a, 0x73, 0xc8, 0x46, 0x10, 0x63, 0x9b, 0xb3, + 0x2e, 0xeb, 0x15, 0x65, 0xda, 0xce, 0xa3, 0x01, 0x07, 0xc0, 0x5f, 0x1c, 0x07, 0x9f, 0x39, 0xfc, 0x3d, 0x46, 0xff, 0x92, 0xff, 0xf0, 0xb1, 0x9a, 0x02, 0xba, 0xd2, 0x4a, 0x0e, 0xc6, 0x3a, 0xc9, + 0xad, 0x37, 0x64, 0x93, 0xdc, 0x1a, 0x9f, 0x29, 0xfc, 0x8e, 0x23, 0xdf, 0x2e, 0x08, 0x6a, 0xdb, 0x0b, 0x1b, 0xcb, 0xf5, 0xa9, 0x6d, 0xa6, 0x0b, 0x53, 0x55, 0xf5, 0xd6, 0x4c, 0x58, 0x2a, 0x3e, + 0x32, 0xda, 0x77, 0xdc, 0x6e, 0x65, 0x8a, 0x9e, 0xa8, 0xe8, 0xe0, 0xda, 0xcd, 0x8e, 0xdb, 0xb6, 0x65, 0x58, 0x61, 0xa2, 0x4e, 0x80, 0x7a, 0x26, 0xca, 0x02, 0xd3, 0x00, 0x09, 0x7d, 0xdc, 0xeb, + 0xb2, 0x91, 0x16, 0xfb, 0x44, 0xa5, 0xdd, 0xc3, 0x8c, 0x71, 0xd8, 0x9e, 0xdc, 0xbc, 0xa6, 0x9a, 0xb8, 0x95, 0x24, 0x1e, 0xe8, 0xba, 0xc3, 0xcc, 0x3b, 0x6b, 0x7f, 0xff, 0xfe, 0x7f, 0x1f, 0x39, + 0xca, 0x85, 0x59, 0xe0, 0x96, 0xe1, 0xc5, 0x09, 0xe1, 0x36, 0xb3, 0xc2, 0x03, 0xaf, 0xf2, 0xab, 0x9f, 0xaf, 0x3c, 0x68, 0xef, 0x35, 0xc5, 0x6f, 0xd2, 0x46, 0x78, 0xf6, 0x6a, 0xcd, 0x93, 0xa6, + 0xfe, 0x35, 0x4a, 0xf2, 0x36, 0x2f, 0xe6, 0xa3, 0x61, 0x9d, 0xbe, 0xe4, 0xde, 0x7f, 0x45, 0xf7, 0x63, 0x74, 0x2f, 0xad, 0xf1, 0x74, 0x98, 0x8b, 0xff, 0x8c, 0x67, 0x7c, 0x59, 0x9c, 0xbb, 0x45, + 0xb8, 0xd6, 0x3b, 0x61, 0x32, 0x93, 0xb2, 0xd5, 0x71, 0x34, 0xd5, 0x32, 0xa5, 0x81, 0x69, 0x52, 0x77, 0x7a, 0x6b, 0x25, 0x20, 0x53, 0x77, 0xd3, 0x41, 0x6d, 0x39, 0xe9, 0xc9, 0x49, 0x6b, 0x6c, + 0xdc, 0x93, 0xeb, 0x40, 0xd5, 0x9c, 0x08, 0x32, 0xcb, 0xe6, 0x6d, 0x02, 0x90, 0x4b, 0xee, 0xc4, 0x4d, 0x25, 0x41, 0x2c, 0xe3, 0x55, 0x8f, 0x98, 0x32, 0x61, 0xe4, 0xaf, 0x71, 0xa5, 0xab, 0xb4, + 0x9f, 0x3f, 0x99, 0x07, 0xdf, 0x9e, 0x31, 0x93, 0xb1, 0x13, 0x3e, 0x4d, 0xdb, 0xf4, 0x9a, 0xa9, 0xfb, 0x8a, 0xee, 0x3b, 0x94, 0xef, 0xad, 0xa1, 0xc6, 0x6c, 0x6e, 0x85, 0xc6, 0x0e, 0xaf, 0x06, + 0xc0, 0x91, 0xcc, 0x4e, 0x39, 0x61, 0xaf, 0x97, 0x2e, 0xc3, 0xc6, 0x1b, 0xca, 0x86, 0x66, 0xa7, 0xe5, 0x01, 0x81, 0x45, 0x45, 0x45, 0xf6, 0xe1, 0x7e, 0x0a, 0x85, 0xf0, 0x96, 0x72, 0x8e, 0x9b, + 0xe3, 0x66, 0xb7, 0x67, 0x22, 0x2a, 0x4a, 0x0f, 0xac, 0x2b, 0x37, 0xac, 0x84, 0x15, 0x33, 0x23, 0x52, 0x0e, 0xaa, 0x96, 0x2b, 0xb0, 0x05, 0x07, 0xcd, 0x51, 0xdb, 0xf8, 0xfa, 0x6b, 0xeb, 0x25, + 0xcc, 0xc2, 0xbf, 0xdf, 0x13, 0xed, 0x60, 0x4f, 0x50, 0xcc, 0x9f, 0x4d, 0x44, 0xe2, 0xa5, 0x98, 0x4d, 0x3f, 0x3f, 0x4f, 0xc0, 0xbc, 0x1e, 0x13, 0xc3, 0x62, 0x34, 0x25, 0xcc, 0xdd, 0x15, 0xf5, + 0xbe, 0x59, 0xe9, 0xc7, 0x2e, 0x8c, 0x2a, 0xd0, 0xd5, 0x46, 0xed, 0x24, 0x47, 0x47, 0x7b, 0x1a, 0x62, 0x0e, 0x1a, 0x8b, 0x3b, 0x6b, 0x9e, 0x72, 0x6d, 0xd1, 0x53, 0xd2, 0x38, 0xb3, 0x3b, 0x62, + 0xa6, 0x21, 0x8e, 0xdd, 0x01, 0x8b, 0xe0, 0x18, 0xe2, 0x9c, 0x93, 0x1c, 0x84, 0x3a, 0x38, 0x1e, 0x0b, 0xe3, 0x14, 0xf6, 0x5c, 0x7f, 0xf2, 0x71, 0x49, 0x49, 0xa9, 0x6a, 0x35, 0x7a, 0x0d, 0xad, + 0xff, 0x55, 0x85, 0x99, 0xf3, 0xd6, 0xcf, 0x32, 0x68, 0x2a, 0xe0, 0x3d, 0x88, 0x16, 0xfc, 0x07, 0xba, 0x3b, 0x26, 0xff, 0xaf, 0xaa, 0x4f, 0xcd, 0xd2, 0xee, 0xcd, 0x18, 0x78, 0x03, 0x62, 0xfc, + 0x55, 0x14, 0x19, 0xfa, 0xe6, 0xf8, 0xf4, 0xa0, 0x36, 0xc2, 0x47, 0x3d, 0x96, 0xab, 0xc7, 0x1e, 0xc7, 0x99, 0xbf, 0x31, 0xa2, 0x3b, 0x76, 0x73, 0x1d, 0xd4, 0x72, 0xfe, 0xb4, 0x5b, 0x3e, 0x75, + 0x57, 0x30, 0xe0, 0x9b, 0xd9, 0xec, 0x41, 0xb2, 0xff, 0x6f, 0xfa, 0xc8, 0x27, 0x51, 0xdf, 0x37, 0xcf, 0x14, 0x63, 0xdb, 0xcc, 0x6c, 0xf7, 0x5a, 0x65, 0x74, 0xd7, 0xa3, 0xb3, 0x0e, 0xd9, 0x74, + 0x3e, 0xbc, 0x41, 0xae, 0xb5, 0x09, 0x37, 0xcf, 0x35, 0x65, 0x72, 0xb1, 0x93, 0x8d, 0x13, 0xf3, 0xf8, 0xf7, 0x6f, 0xa2, 0xc8, 0x4d, 0x82, 0x9c, 0xc7, 0x02, 0x1d, 0x7c, 0xa5, 0xad, 0x18, 0x3c, + 0x67, 0xbf, 0xe8, 0xbe, 0xcd, 0xdd, 0xaf, 0xd6, 0x39, 0xb6, 0x16, 0xfd, 0x7d, 0x0e, 0x67, 0x4a, 0xb6, 0x9e, 0xc2, 0x78, 0x61, 0x1d, 0x8e, 0xba, 0x99, 0x05, 0xc5, 0x42, 0xaf, 0x42, 0x44, 0x72, + 0x70, 0x6e, 0xe6, 0x9a, 0xe4, 0x0c, 0xc5, 0x46, 0x92, 0x01, 0x81, 0x73, 0x0e, 0x4a, 0x27, 0x96, 0x32, 0xd3, 0x96, 0xd4, 0xc2, 0x76, 0xa6, 0xb3, 0x66, 0x86, 0x98, 0xe8, 0x6e, 0xaa, 0xc7, 0x2b, + 0x03, 0x0a, 0xb7, 0x7b, 0xba, 0x37, 0x7a, 0x5c, 0x41, 0x15, 0x92, 0xdd, 0xb8, 0x64, 0xb3, 0x2d, 0xc3, 0x21, 0x2a, 0x85, 0x8b, 0x94, 0xfc, 0x4c, 0x12, 0xfb, 0x73, 0x85, 0x66, 0x60, 0xbe, 0x21, + 0xf0, 0x26, 0x62, 0x43, 0xc3, 0xc2, 0x7f, 0x3c, 0xd8, 0x69, 0x79, 0x50, 0x53, 0x51, 0xde, 0x8d, 0x30, 0x29, 0xde, 0xad, 0x57, 0xa5, 0x1b, 0x44, 0x56, 0xcf, 0xcd, 0xa2, 0x65, 0x31, 0x05, 0x34, + 0x56, 0x28, 0xa6, 0xb5, 0x52, 0xec, 0x18, 0x0d, 0x59, 0xd3, 0xb4, 0xc1, 0x42, 0x00, 0x79, 0xb4, 0x96, 0x52, 0xed, 0x01, 0x55, 0x38, 0x83, 0xe5, 0x9d, 0xe2, 0x82, 0x84, 0x6d, 0x2e, 0x52, 0xad, + 0xd6, 0xf5, 0x7e, 0x47, 0x31, 0x16, 0x29, 0x23, 0xfd, 0x00, 0x19, 0xeb, 0xd9, 0x09, 0xe2, 0xe1, 0xbc, 0xf9, 0x5e, 0x38, 0xfe, 0xbf, 0x93, 0x5d, 0xef, 0x68, 0xbf, 0xa3, 0x77, 0x75, 0x67, 0xa8, + 0xb4, 0xaa, 0x2f, 0x41, 0x4d, 0x58, 0x45, 0xf1, 0xb1, 0xc4, 0x66, 0xa7, 0x93, 0x28, 0x6e, 0x4f, 0xf1, 0x1e, 0xef, 0x59, 0x44, 0x68, 0x6b, 0x6a, 0x51, 0xa9, 0xeb, 0x99, 0x70, 0xe8, 0x1a, 0x10, + 0x55, 0x97, 0x3d, 0x94, 0x58, 0x28, 0xd5, 0x32, 0xd3, 0x49, 0x25, 0x04, 0x53, 0x1a, 0x8a, 0x77, 0x47, 0x1f, 0xdf, 0xee, 0x99, 0xe9, 0xa6, 0xf2, 0xa4, 0xb9, 0x81, 0x37, 0x7b, 0x62, 0x1b, 0xeb, + 0x0b, 0x83, 0xb4, 0x80, 0xf4, 0x9b, 0x2a, 0xe6, 0xed, 0xe3, 0xac, 0xd0, 0x0f, 0x9f, 0x6b, 0x2e, 0x5e, 0x73, 0x2a, 0xbc, 0xa2, 0xfb, 0x0e, 0xc1, 0x7b, 0x6b, 0xa8, 0xe3, 0xe0, 0x46, 0x26, 0x65, + 0x78, 0x13, 0x59, 0x5b, 0x52, 0xf1, 0x50, 0x18, 0xc7, 0xd6, 0x94, 0x45, 0xf5, 0xed, 0xda, 0xf7, 0xea, 0x78, 0x39, 0x3d, 0x2c, 0xe3, 0x74, 0x9e, 0x13, 0xc1, 0x42, 0x2a, 0x66, 0x3d, 0x1b, 0xa8, + 0x7c, 0xb2, 0x1e, 0x05, 0x47, 0xdc, 0x71, 0x10, 0x55, 0xae, 0x40, 0x50, 0xf6, 0x2b, 0x75, 0xdb, 0xd9, 0x08, 0x0a, 0x61, 0x6b, 0x22, 0x0e, 0xa7, 0x7a, 0x4d, 0xcd, 0x13, 0x0e, 0xf6, 0xbc, 0x6f, + 0xe7, 0xf1, 0xb7, 0x0f, 0xf3, 0x12, 0xf3, 0x99, 0x9d, 0x18, 0x79, 0x79, 0x0a, 0xbc, 0x11, 0x7d, 0xef, 0xf8, 0xdb, 0xe5, 0x18, 0x19, 0x36, 0xe8, 0xd4, 0x29, 0x5e, 0x2b, 0x80, 0x08, 0xb1, 0x91, + 0xb2, 0xb3, 0xeb, 0xa2, 0xf0, 0x99, 0x99, 0xef, 0xc9, 0x3c, 0x58, 0xb3, 0x5a, 0x63, 0xa8, 0x51, 0xe0, 0x73, 0x25, 0x84, 0xc5, 0x07, 0xa5, 0x49, 0xb9, 0x04, 0x9d, 0x79, 0xed, 0x84, 0x62, 0xe4, + 0xc4, 0x55, 0xb1, 0x83, 0xa1, 0xf6, 0xf9, 0x7e, 0xb1, 0x54, 0x66, 0xb4, 0xb2, 0x98, 0x23, 0x5b, 0x3e, 0x5f, 0x01, 0xc6, 0x51, 0x9d, 0x50, 0x6d, 0xc2, 0x09, 0xdf, 0x8c, 0xe4, 0xb7, 0x47, 0xe6, + 0xff, 0x94, 0x5b, 0x7c, 0xd0, 0x7d, 0xef, 0xfb, 0x7b, 0x6b, 0x28, 0xf7, 0x48, 0x26, 0x9b, 0x79, 0xb3, 0x44, 0x39, 0x7f, 0xb1, 0xed, 0x94, 0x05, 0x1b, 0x3b, 0xfa, 0x8a, 0x0a, 0x03, 0x3d, 0xaa, + 0xa7, 0x85, 0x24, 0x58, 0x94, 0x8f, 0xa0, 0x65, 0x9d, 0xa4, 0x99, 0x2c, 0x24, 0xaa, 0xe5, 0xa7, 0x24, 0xbe, 0xe1, 0x99, 0x92, 0x5d, 0x5b, 0xba, 0xbe, 0x24, 0x65, 0x2b, 0x13, 0xcc, 0xb5, 0x7b, + 0xe4, 0xd8, 0x3a, 0x14, 0x78, 0x3c, 0x48, 0x5d, 0x29, 0x92, 0x7a, 0x58, 0x71, 0x46, 0x0f, 0x07, 0xfd, 0x36, 0x34, 0xe3, 0xbf, 0x5d, 0xfe, 0x57, 0xb4, 0xdf, 0x61, 0xb8, 0xba, 0x33, 0x74, 0xf9, + 0xc7, 0xcb, 0xc8, 0x96, 0xb7, 0x41, 0x96, 0xac, 0x34, 0x28, 0x3e, 0xe5, 0xab, 0x18, 0xe3, 0xf7, 0xac, 0x6c, 0x76, 0xf4, 0x74, 0xcd, 0x5b, 0xc0, 0xa6, 0x57, 0xed, 0x69, 0x47, 0x90, 0x20, 0x1c, + 0xf0, 0x0a, 0x0f, 0x3a, 0xde, 0x52, 0x8a, 0x2c, 0x5a, 0x64, 0x5b, 0x1f, 0x72, 0x50, 0xdb, 0x9b, 0xd0, 0x96, 0xab, 0xa6, 0xb5, 0x4a, 0x68, 0x96, 0xa5, 0x4d, 0x0e, 0xbd, 0x01, 0x2b, 0x6e, 0x40, + 0x60, 0xbb, 0x01, 0xaa, 0x98, 0x47, 0xea, 0x94, 0x27, 0xea, 0xfc, 0xb7, 0x47, 0x4f, 0x66, 0xf9, 0xec, 0xec, 0xff, 0x9a, 0xb4, 0xfd, 0x41, 0xf4, 0x1d, 0xb9, 0xb7, 0xcb, 0xa1, 0x72, 0xb6, 0x7a, + 0x20, 0xa5, 0x43, 0x88, 0x44, 0x0d, 0xa6, 0x8c, 0x94, 0xc3, 0x6a, 0xeb, 0x1c, 0x66, 0x3c, 0x28, 0x98, 0xb2, 0xb6, 0xaa, 0x16, 0xab, 0xb5, 0x4a, 0x8a, 0x6d, 0x4c, 0xb8, 0xea, 0x6e, 0xbb, 0x92, + 0x74, 0x68, 0xbe, 0x5c, 0x2d, 0x7a, 0x3d, 0xd8, 0xec, 0x72, 0x0e, 0x5b, 0x8b, 0x94, 0x9b, 0x66, 0x49, 0xab, 0xd9, 0x2d, 0xa0, 0x53, 0xa9, 0x0d, 0x77, 0xdb, 0x1d, 0x4e, 0xce, 0x61, 0x84, 0xca, + 0xd4, 0x6a, 0x48, 0x72, 0xf8, 0xc0, 0x29, 0xc7, 0x41, 0x58, 0xd5, 0xb9, 0x5f, 0x9a, 0xe9, 0x4f, 0x35, 0xb2, 0x5f, 0xd1, 0xe7, 0xdf, 0x13, 0x7f, 0x03, 0xe6, 0xee, 0xd6, 0xd9, 0xd2, 0x31, 0x00, + 0xa0, 0x00, 0xd4, 0x95, 0x7c, 0x3d, 0x71, 0xbb, 0x43, 0x65, 0x1a, 0x93, 0x6c, 0xa9, 0x28, 0x26, 0xea, 0x6c, 0xf8, 0x05, 0x56, 0x1d, 0x8e, 0x23, 0xca, 0x77, 0xe6, 0xc8, 0x88, 0xb7, 0xd7, 0x04, + 0xdf, 0x60, 0xbd, 0xb1, 0x48, 0x14, 0xb0, 0xda, 0xcb, 0x02, 0x4d, 0x97, 0x13, 0xfb, 0xe4, 0x66, 0x62, 0x25, 0x1c, 0x0e, 0x96, 0x46, 0xaf, 0x32, 0x20, 0x5f, 0xea, 0x68, 0x1f, 0x79, 0x14, 0xbb, + 0x5f, 0xb5, 0x7d, 0x3a, 0x60, 0x4e, 0x5d, 0x17, 0x0f, 0x7f, 0xe4, 0x2b, 0x6f, 0xc6, 0xf9, 0xdf, 0x5f, 0xba, 0xbd, 0xc7, 0x73, 0xed, 0xa6, 0xcb, 0x85, 0x5b, 0xda, 0x6e, 0x56, 0x87, 0x89, 0xfb, + 0x11, 0x41, 0xff, 0x78, 0x02, 0xbe, 0xb4, 0x73, 0xfd, 0xf4, 0xa6, 0x6f, 0xe0, 0xdf, 0xfd, 0x3e, 0x34, 0x01, 0xb6, 0x48, 0xb6, 0x96, 0x72, 0x14, 0x92, 0x55, 0x47, 0x47, 0x13, 0x94, 0x91, 0x96, + 0x10, 0xba, 0xdf, 0xe4, 0x3a, 0x65, 0xa9, 0xed, 0x54, 0xa7, 0x4e, 0xfc, 0x04, 0x9f, 0xc6, 0xa1, 0x0c, 0x32, 0xf2, 0x04, 0x9f, 0x40, 0x9e, 0x2d, 0x2b, 0xdb, 0xbd, 0x22, 0x61, 0xf8, 0x54, 0xab, + 0x97, 0x4b, 0x03, 0x36, 0x03, 0x1d, 0x9b, 0x4c, 0x7a, 0x30, 0x3e, 0xe1, 0xeb, 0x16, 0x71, 0x50, 0x26, 0x1b, 0xc9, 0xd5, 0xa8, 0x1b, 0x30, 0x12, 0x0f, 0x66, 0xea, 0x8f, 0xea, 0x89, 0xe0, 0x71, + 0x45, 0xb1, 0xff, 0x4e, 0x77, 0xfa, 0xe8, 0x05, 0x6f, 0x20, 0x3f, 0xb8, 0x3d, 0x54, 0x9f, 0x6a, 0x9b, 0xa5, 0x10, 0x27, 0xb6, 0x1a, 0x60, 0x12, 0xbf, 0x93, 0x58, 0x6c, 0xde, 0xc2, 0x98, 0x24, + 0xd4, 0x4e, 0xa0, 0x07, 0x6a, 0xe5, 0x26, 0x26, 0xd0, 0xb8, 0x53, 0x20, 0x62, 0xfb, 0xc8, 0xf5, 0xb5, 0x76, 0xbf, 0x38, 0x70, 0x30, 0xb3, 0xa1, 0x08, 0x11, 0x26, 0x57, 0x19, 0xb1, 0x36, 0xd6, + 0x01, 0xe4, 0xe3, 0x98, 0x5d, 0x4c, 0xd1, 0xaa, 0x01, 0x96, 0xbe, 0x28, 0xf7, 0xf6, 0x4e, 0xc6, 0xed, 0x41, 0xc2, 0xf7, 0xdb, 0x47, 0x9f, 0x0f, 0x2f, 0xe5, 0x73, 0x26, 0x00, 0xfe, 0x33, 0x7d, + 0x65, 0x67, 0xbd, 0x21, 0xfd, 0x01, 0xd0, 0xe7, 0x8d, 0x73, 0xbd, 0x88, 0x01, 0xfb, 0x6b, 0x8d, 0x05, 0x51, 0xeb, 0x7a, 0xc0, 0x94, 0xa6, 0x58, 0x4c, 0xda, 0x29, 0x8e, 0xda, 0x6b, 0x6a, 0x90, + 0xe0, 0x7d, 0x4c, 0x35, 0xa3, 0x4d, 0x62, 0x52, 0x20, 0xa3, 0xf7, 0x0e, 0xd7, 0xb4, 0x96, 0xbc, 0x08, 0x8b, 0x23, 0x29, 0x15, 0x7c, 0x86, 0xa8, 0x41, 0x87, 0x1b, 0x27, 0x6a, 0x4e, 0x99, 0x38, + 0x88, 0x87, 0x9a, 0x82, 0xef, 0xe7, 0x51, 0x9f, 0xa3, 0xc7, 0x54, 0xaf, 0x91, 0x79, 0xb8, 0x31, 0xbe, 0x39, 0x2a, 0x07, 0xa7, 0xc2, 0x2d, 0xc3, 0x67, 0x36, 0x9e, 0x17, 0xb7, 0x85, 0x0b, 0xcd, + 0xb7, 0x9e, 0x5f, 0xae, 0x86, 0x6e, 0x0a, 0xb6, 0x6c, 0xc6, 0xc1, 0xd1, 0x52, 0x2b, 0x93, 0x69, 0x0e, 0x91, 0xd7, 0xb6, 0xb6, 0xda, 0xb4, 0x09, 0xb0, 0x4c, 0x26, 0x08, 0xbc, 0x46, 0xa7, 0x47, + 0x7f, 0xb3, 0xd1, 0x4b, 0xfd, 0x28, 0xcb, 0x25, 0x71, 0x48, 0xd7, 0x00, 0xb5, 0x66, 0x47, 0x32, 0x6e, 0x97, 0x32, 0x9a, 0x32, 0x89, 0xe8, 0x00, 0x26, 0x16, 0x8e, 0x04, 0x17, 0x59, 0x80, 0x9c, + 0x2f, 0x97, 0xb5, 0x21, 0x6c, 0x7a, 0x77, 0x64, 0xce, 0x07, 0x1c, 0x48, 0x3e, 0xb2, 0xf4, 0xff, 0xcf, 0xe4, 0xde, 0xaa, 0xfe, 0xf6, 0xcb, 0x95, 0x2f, 0x28, 0xf4, 0xcf, 0x1f, 0x56, 0x22, 0x7f, + 0xa7, 0xfc, 0x75, 0xe7, 0x16, 0xdf, 0xfb, 0xf7, 0x0d, 0xc7, 0xf8, 0x8d, 0x30, 0x30, 0x3e, 0xff, 0x19, 0x4f, 0xbe, 0xf9, 0x54, 0xfd, 0xf5, 0x0c, 0x61, 0x3a, 0x92, 0x17, 0x52, 0x87, 0xfa, 0x06, + 0x35, 0x5d, 0x73, 0xbe, 0x6f, 0xd7, 0x34, 0x69, 0x47, 0x9a, 0x19, 0x83, 0xf8, 0x88, 0xa5, 0xb4, 0x40, 0x66, 0xc2, 0x45, 0xbf, 0xcc, 0x14, 0x42, 0x26, 0x4c, 0xd7, 0x4f, 0x0b, 0x7c, 0x2a, 0x03, + 0x96, 0xe4, 0x92, 0x9a, 0x62, 0x21, 0xa2, 0xb2, 0x34, 0xa5, 0x6d, 0x51, 0xaf, 0x89, 0xb8, 0xd1, 0xcd, 0x6d, 0x90, 0x59, 0x5b, 0x8a, 0x8f, 0x2d, 0xd6, 0x02, 0x3e, 0x85, 0xb6, 0xbf, 0xfe, 0x7a, + 0x16, 0x1c, 0xfb, 0x9e, 0xb2, 0xc4, 0x3a, 0x8d, 0x1d, 0xd7, 0x33, 0x9b, 0xe4, 0xbf, 0x8d, 0x8a, 0xfa, 0x46, 0x1d, 0x18, 0x7f, 0xbf, 0x37, 0xe4, 0x30, 0x03, 0x8d, 0x65, 0xae, 0xa8, 0xed, 0xd6, + 0x5a, 0xe5, 0x28, 0x3e, 0x3b, 0x98, 0x10, 0x3b, 0xcd, 0x9d, 0x12, 0x41, 0x42, 0x97, 0xed, 0xe2, 0xdf, 0x99, 0x4a, 0x98, 0x9e, 0x73, 0xe3, 0x27, 0x66, 0x7f, 0xfa, 0x4f, 0x17, 0xd4, 0x15, 0xdd, + 0xb7, 0x9e, 0x7d, 0xb5, 0x86, 0x2c, 0x2c, 0x68, 0x4c, 0xee, 0x52, 0x5e, 0x50, 0xf7, 0x4c, 0x94, 0x43, 0xa3, 0xcc, 0xd8, 0x6c, 0x48, 0x5d, 0xc9, 0xbc, 0x2e, 0x69, 0x85, 0x78, 0x40, 0x72, 0xa3, + 0x30, 0x6d, 0xca, 0xb4, 0x29, 0x03, 0xb3, 0x7a, 0xee, 0x7e, 0xf5, 0x4a, 0x32, 0x96, 0x2b, 0xba, 0xe7, 0x3e, 0x7d, 0xb6, 0x86, 0x25, 0x64, 0x89, 0x83, 0x70, 0x5a, 0x95, 0x71, 0x9e, 0x47, 0xe1, + 0x51, 0xb0, 0x15, 0xcc, 0x84, 0xa1, 0xbd, 0x75, 0xe2, 0x54, 0x75, 0x94, 0x0f, 0xe8, 0xd3, 0x97, 0xa1, 0xe1, 0xd9, 0x24, 0xfc, 0x73, 0x45, 0xd4, 0x07, 0xd1, 0xb7, 0xde, 0xbc, 0x5f, 0x9e, 0xa7, + 0xdc, 0x2f, 0x2a, 0x28, 0x68, 0x2c, 0x5b, 0x50, 0xc4, 0x39, 0x9e, 0xb8, 0x11, 0xbb, 0x75, 0xbb, 0xa6, 0x58, 0x8a, 0xde, 0xa1, 0xfe, 0x6e, 0x07, 0x59, 0xde, 0xe3, 0x29, 0xf7, 0x0b, 0x33, 0x7b, + 0x6e, 0xef, 0xe8, 0x4a, 0xb3, 0x28, 0xce, 0xef, 0x7d, 0xa2, 0x6b, 0xb9, 0x32, 0xb1, 0x3c, 0x93, 0xd1, 0x5e, 0x18, 0xe8, 0x77, 0xa2, 0x67, 0x5c, 0x2e, 0x97, 0x67, 0xc9, 0x6b, 0x40, 0x1e, 0x96, + 0x18, 0x68, 0x57, 0xe6, 0x1e, 0x01, 0xf4, 0xc4, 0x9c, 0xec, 0xfa, 0x13, 0x37, 0x6f, 0x15, 0x91, 0xdf, 0xeb, 0x2e, 0x43, 0xb7, 0x07, 0x9e, 0xad, 0xb3, 0x03, 0xe9, 0x34, 0xbd, 0x42, 0x17, 0x7d, + 0x21, 0x1a, 0xfd, 0xac, 0x8a, 0x59, 0x2e, 0x30, 0x60, 0x76, 0x44, 0x65, 0x64, 0x28, 0x73, 0x44, 0xbf, 0x92, 0x73, 0x66, 0xe9, 0x72, 0xc5, 0x9e, 0x3d, 0x9a, 0x88, 0xa3, 0xbb, 0x06, 0x23, 0x1e, + 0xdc, 0xee, 0xdb, 0x09, 0xfb, 0xa2, 0x67, 0x7f, 0x3c, 0x11, 0x26, 0x2f, 0x58, 0xe9, 0xc2, 0x2c, 0x3c, 0xf7, 0x35, 0x3c, 0xe7, 0xb1, 0x1f, 0x60, 0xa3, 0x0b, 0xd9, 0x42, 0x2a, 0xf6, 0xc2, 0x68, + 0x5e, 0x0a, 0x70, 0x74, 0x2a, 0x8f, 0xad, 0x0f, 0xc5, 0x9c, 0x5a, 0xec, 0x17, 0x27, 0x49, 0x5d, 0x2e, 0x76, 0x4d, 0x79, 0xb4, 0x32, 0x4d, 0x81, 0x5a, 0x51, 0x38, 0x8e, 0x76, 0x3d, 0xd1, 0xcc, + 0xf5, 0x8a, 0x63, 0x0e, 0x7a, 0x23, 0x93, 0x1b, 0x6d, 0x24, 0xcc, 0x4c, 0x63, 0x05, 0x38, 0x58, 0x2c, 0x6d, 0x58, 0x69, 0x69, 0x13, 0xf9, 0x82, 0xab, 0xe8, 0x51, 0xba, 0x1c, 0x22, 0x04, 0x85, + 0x77, 0x59, 0x43, 0xfe, 0x3b, 0xed, 0xc2, 0x0d, 0xe5, 0x33, 0x1a, 0x57, 0xed, 0xa1, 0x1a, 0x06, 0x1e, 0x5c, 0x90, 0xd0, 0x7a, 0x0e, 0x54, 0xc2, 0xc9, 0x48, 0x30, 0x9b, 0xc9, 0x31, 0x3c, 0x9b, + 0x3a, 0x12, 0xe6, 0xaa, 0x72, 0xd7, 0x15, 0xba, 0x10, 0xee, 0xa5, 0x40, 0xe9, 0xb7, 0x47, 0x43, 0x9b, 0x71, 0x6a, 0x43, 0xe2, 0x6d, 0x92, 0x49, 0xcb, 0xd3, 0xe6, 0xe8, 0x94, 0x9a, 0x92, 0xc7, + 0x15, 0xba, 0x17, 0x36, 0x5a, 0xb6, 0xf4, 0xac, 0xde, 0xd4, 0x9c, 0xe9, 0x6e, 0x13, 0x05, 0xbe, 0x3f, 0x1a, 0x92, 0xac, 0xe0, 0xb1, 0x91, 0xf7, 0x66, 0x29, 0x3d, 0xf5, 0x70, 0xa8, 0x42, 0xc7, + 0x1d, 0xdb, 0x81, 0x99, 0x65, 0xee, 0x57, 0x9a, 0x82, 0x27, 0xce, 0xec, 0x61, 0x61, 0x3a, 0x4e, 0xf9, 0xcf, 0x0f, 0x67, 0x50, 0xe2, 0x95, 0xcd, 0xf0, 0x83, 0xea, 0x1b, 0xec, 0x1f, 0xd7, 0xe3, + 0x33, 0xad, 0xdf, 0x21, 0x07, 0x59, 0x06, 0x40, 0x41, 0xec, 0x98, 0x1f, 0x65, 0x25, 0xa7, 0xb1, 0x55, 0xb4, 0x85, 0x96, 0x9e, 0x6c, 0x6d, 0x72, 0x15, 0x1c, 0x59, 0xb5, 0x12, 0xda, 0x51, 0x25, + 0xca, 0x3b, 0x31, 0x09, 0x80, 0xc0, 0x38, 0xc5, 0x5b, 0x9c, 0x2d, 0x52, 0xce, 0xc3, 0x1a, 0xbd, 0x13, 0x76, 0x13, 0x69, 0x64, 0xc6, 0x06, 0x2a, 0x01, 0x1d, 0x84, 0x1b, 0xc9, 0x5e, 0xa6, 0x49, + 0x7d, 0x1f, 0xea, 0xaa, 0xc0, 0x4f, 0xbe, 0x09, 0x9d, 0x77, 0xd9, 0x54, 0x1f, 0xf7, 0xfd, 0xa5, 0x8d, 0xf2, 0x8a, 0xf0, 0x25, 0x5d, 0xc9, 0x67, 0x73, 0x48, 0x46, 0xe6, 0x37, 0x04, 0x20, 0x26, + 0x42, 0x12, 0x9e, 0x13, 0x12, 0xe0, 0x48, 0x4e, 0x63, 0x72, 0x91, 0x61, 0xcc, 0xc8, 0x82, 0xeb, 0x5a, 0xe0, 0x58, 0x13, 0xaf, 0xfa, 0x80, 0x62, 0xca, 0xfd, 0xa2, 0xd9, 0x8b, 0x0b, 0x20, 0x77, + 0x27, 0xf4, 0x7a, 0xa3, 0x6c, 0x82, 0x43, 0xe0, 0xaf, 0xaa, 0xa2, 0xf3, 0x4f, 0x2b, 0x07, 0xe5, 0xf8, 0x53, 0x47, 0xaa, 0x07, 0xad, 0xd5, 0x43, 0x7b, 0x89, 0xc1, 0x49, 0xec, 0x2f, 0x32, 0x86, + 0x1e, 0x50, 0x9e, 0xe4, 0xbb, 0xe3, 0xc1, 0x93, 0x63, 0x5e, 0xf8, 0xa1, 0x9e, 0xfd, 0x61, 0xc1, 0xfe, 0xb9, 0x0d, 0xfa, 0x93, 0xea, 0x05, 0xb6, 0xcb, 0xf5, 0x90, 0x84, 0xed, 0xe7, 0x59, 0xb3, + 0xd6, 0xa6, 0x23, 0x99, 0x9f, 0x8b, 0x31, 0xe3, 0xf4, 0x11, 0xc9, 0x12, 0x56, 0x33, 0x93, 0x6c, 0x0d, 0x07, 0x91, 0x85, 0xd3, 0x60, 0x33, 0x50, 0x74, 0x6b, 0xb4, 0xa2, 0xc3, 0xc9, 0x32, 0x4c, + 0x29, 0x22, 0x73, 0xd1, 0x14, 0x21, 0x57, 0xa2, 0xe1, 0x49, 0xd9, 0x68, 0x6b, 0x84, 0x7b, 0x8b, 0x8c, 0x91, 0x25, 0xb2, 0x4f, 0x69, 0x6f, 0x61, 0x30, 0x61, 0xb1, 0x89, 0x88, 0x62, 0x8f, 0x3b, + 0xf2, 0x37, 0x55, 0xe0, 0xb7, 0xaa, 0x93, 0xff, 0xa1, 0x80, 0x75, 0x43, 0xfa, 0x03, 0x82, 0xcf, 0x1b, 0x43, 0xc4, 0xac, 0x37, 0x1c, 0x0c, 0x8e, 0x92, 0x74, 0xb7, 0x42, 0x8b, 0xc5, 0xc9, 0x39, + 0x35, 0xab, 0xd0, 0xa9, 0x5c, 0x8c, 0xaf, 0xe8, 0x63, 0x6d, 0x31, 0xd8, 0x4e, 0x73, 0x55, 0x2a, 0xef, 0x7d, 0x09, 0xf0, 0xb1, 0xd2, 0x01, 0x8f, 0x6a, 0x98, 0xea, 0xdb, 0xa4, 0x35, 0x24, 0x0a, + 0x60, 0x61, 0xce, 0x37, 0x94, 0x68, 0x77, 0xc2, 0xe0, 0x29, 0xe3, 0xb9, 0xc9, 0xc6, 0xd5, 0x6c, 0x8a, 0x23, 0xb0, 0x34, 0xad, 0xa5, 0xd5, 0xfe, 0x35, 0x3b, 0xfc, 0xfb, 0xd7, 0x9f, 0x73, 0x73, + 0xbc, 0x61, 0x73, 0x61, 0x57, 0x3f, 0x64, 0x2e, 0x7c, 0xeb, 0x71, 0x9e, 0x27, 0xae, 0x99, 0x7d, 0xe5, 0x60, 0x79, 0xb6, 0x30, 0x5f, 0x60, 0x4a, 0xf7, 0xd4, 0xdf, 0x31, 0xbe, 0xb9, 0x37, 0xd4, + 0xf3, 0xcd, 0xda, 0x3b, 0xe2, 0x2e, 0xa6, 0xe6, 0xa4, 0xca, 0xcc, 0xec, 0x79, 0xec, 0xd2, 0x50, 0x93, 0x75, 0xeb, 0x0d, 0x53, 0x18, 0xba, 0x69, 0x4e, 0xb5, 0xb6, 0x39, 0xf9, 0xf2, 0x49, 0x06, + 0x6c, 0x38, 0xf1, 0x30, 0x88, 0x48, 0x15, 0xd6, 0x58, 0xa8, 0x53, 0xd5, 0x59, 0x48, 0x49, 0xe1, 0x80, 0x90, 0x1a, 0xcd, 0x16, 0x7e, 0xba, 0xc3, 0x25, 0xef, 0x60, 0x0a, 0xa3, 0x54, 0x32, 0x35, + 0xc1, 0x29, 0x81, 0xed, 0x4b, 0x4b, 0xf4, 0x89, 0xb2, 0xf5, 0xd6, 0x29, 0xff, 0x99, 0x7a, 0xf1, 0x05, 0x51, 0xea, 0x8b, 0xee, 0x05, 0xbf, 0x8f, 0xd6, 0x59, 0xa9, 0x38, 0x40, 0xa0, 0xca, 0xaa, + 0xa6, 0xab, 0x8f, 0x86, 0xc7, 0xed, 0x51, 0x8c, 0x2f, 0x4f, 0x09, 0xb1, 0x99, 0x8b, 0xa3, 0xa6, 0xc8, 0xe6, 0xa0, 0x01, 0x92, 0x7e, 0xd1, 0x65, 0x75, 0x21, 0xe3, 0x44, 0x0a, 0xd1, 0x80, 0xb2, + 0x59, 0x82, 0xfd, 0xd6, 0xeb, 0xbd, 0x0d, 0xa7, 0x01, 0xc4, 0xce, 0x04, 0x50, 0xce, 0xa8, 0x22, 0xd0, 0xb4, 0x0b, 0x2a, 0x9a, 0xf1, 0x20, 0xbb, 0x84, 0x8e, 0x0a, 0x6a, 0x38, 0x9b, 0x84, 0x98, + 0x7e, 0xb3, 0x53, 0xbd, 0x7d, 0xd8, 0x33, 0x91, 0xea, 0xb5, 0xca, 0x03, 0x67, 0x8a, 0xef, 0x5d, 0x0e, 0x87, 0xd6, 0x16, 0xd0, 0xbd, 0xb5, 0x82, 0x95, 0x71, 0x21, 0x92, 0x60, 0x53, 0x38, 0x95, + 0x43, 0x6f, 0x56, 0xbb, 0xb2, 0x0d, 0xc8, 0xb5, 0x67, 0x7b, 0xfd, 0x76, 0x6b, 0x76, 0xfa, 0x62, 0xcb, 0x9c, 0xc4, 0xfd, 0xba, 0x07, 0x19, 0x2d, 0x5c, 0x79, 0xd8, 0x94, 0xc7, 0x29, 0x52, 0x60, + 0x65, 0xa7, 0xed, 0xe0, 0x72, 0x39, 0xda, 0xac, 0xe6, 0xd5, 0x1e, 0x59, 0x1a, 0x78, 0x6d, 0x97, 0x13, 0x0b, 0x22, 0x36, 0xb6, 0x71, 0x40, 0x5e, 0x5b, 0x8d, 0x5f, 0x35, 0x6a, 0x7f, 0x5b, 0x83, + 0xb7, 0x49, 0x90, 0x9e, 0xf1, 0xf7, 0x97, 0xa6, 0xce, 0x15, 0xe9, 0x0b, 0x94, 0x57, 0x37, 0xce, 0x9c, 0x7e, 0xc0, 0x04, 0x02, 0x2c, 0xc4, 0xd0, 0xaa, 0x15, 0x66, 0x4c, 0xf7, 0x5a, 0xcd, 0x1c, + 0x2b, 0x20, 0x20, 0x76, 0x78, 0xd6, 0x7a, 0x1b, 0x5f, 0x9e, 0x9d, 0x58, 0xdd, 0xa9, 0x57, 0x3b, 0x71, 0x63, 0x1d, 0x4e, 0x68, 0x34, 0x83, 0x42, 0x3b, 0xf5, 0x23, 0x0f, 0xdf, 0xcd, 0x73, 0x85, + 0xf5, 0x5d, 0x19, 0xe9, 0x4e, 0xd3, 0x5a, 0x37, 0x05, 0x57, 0xc8, 0x9b, 0x7e, 0xc9, 0xcd, 0xb6, 0x56, 0x16, 0x11, 0x88, 0x0d, 0x1b, 0xdf, 0x8d, 0x3e, 0x61, 0xf5, 0xc6, 0xb8, 0x7e, 0x70, 0x9f, + 0x7b, 0x2d, 0x68, 0xfe, 0x8b, 0xec, 0xa5, 0xff, 0xef, 0x8d, 0x21, 0x21, 0xf2, 0xd0, 0xf8, 0xc0, 0x74, 0x73, 0x15, 0x72, 0x25, 0x7c, 0x8e, 0x29, 0x1e, 0x6d, 0x06, 0x8d, 0x7b, 0xd8, 0xdb, 0xb8, + 0xdf, 0x8f, 0xb8, 0x01, 0x19, 0x40, 0xc3, 0x6a, 0xec, 0x35, 0x49, 0x72, 0x2e, 0xa2, 0x3a, 0x3e, 0x07, 0x97, 0x15, 0xf9, 0xf3, 0x1d, 0xfc, 0xe5, 0x35, 0xf2, 0xe8, 0x1d, 0x97, 0xae, 0x3e, 0xfa, + 0x65, 0xc8, 0x3a, 0x82, 0xc6, 0x39, 0xc6, 0xb1, 0x7b, 0x0a, 0x37, 0x62, 0x9d, 0xdb, 0xb9, 0x87, 0xc3, 0x94, 0x1f, 0x61, 0x28, 0x42, 0x4c, 0x30, 0x43, 0xbd, 0x2f, 0xa7, 0x1a, 0x56, 0x63, 0xdf, + 0xcd, 0xdc, 0xd2, 0xac, 0xf3, 0x72, 0xfc, 0x61, 0xe3, 0xff, 0x49, 0xcf, 0xf3, 0x52, 0x1f, 0xbf, 0xbf, 0xe2, 0xd2, 0xc3, 0xef, 0xf7, 0x2f, 0x0a, 0x9f, 0x01, 0x8c, 0x22, 0xaa, 0xa8, 0xe8, 0x44, + 0x24, 0x93, 0x53, 0xb8, 0xa7, 0xc4, 0x91, 0x50, 0xed, 0x9d, 0x94, 0xec, 0x28, 0xc1, 0xe6, 0x8f, 0xe6, 0x7e, 0xb7, 0xa9, 0x0a, 0xd6, 0x29, 0x92, 0xa5, 0xaa, 0x31, 0x44, 0x7b, 0x80, 0x42, 0xc3, + 0x67, 0xdc, 0xd8, 0x9d, 0x83, 0x1b, 0x08, 0xc5, 0x0e, 0x6e, 0x83, 0xa3, 0x76, 0x2f, 0x9a, 0x47, 0xd7, 0x99, 0x1c, 0x00, 0xb5, 0x6f, 0x3a, 0xb0, 0xea, 0x36, 0x60, 0x58, 0x6e, 0xf0, 0x01, 0xe7, + 0x8c, 0x5f, 0xd3, 0xce, 0x7d, 0xe3, 0x0e, 0x3f, 0x2c, 0x09, 0xe4, 0x35, 0xcd, 0xd9, 0x85, 0xe6, 0x3b, 0x84, 0x6f, 0x8b, 0x01, 0xf9, 0x5d, 0x4b, 0xf6, 0x86, 0xd9, 0x74, 0x05, 0xd6, 0x6c, 0x4d, + 0x2a, 0x4b, 0x26, 0xe5, 0x0f, 0x8b, 0x6c, 0x43, 0xc2, 0xc1, 0x0a, 0x25, 0x0b, 0xf8, 0x60, 0xb3, 0xd4, 0xd2, 0x69, 0x72, 0xa4, 0x36, 0x1a, 0x82, 0x53, 0x00, 0x1a, 0xdd, 0x8a, 0x2d, 0xe0, 0x07, + 0xc1, 0x69, 0x02, 0xe6, 0xd3, 0x69, 0xe3, 0x99, 0xde, 0x71, 0x0d, 0x6c, 0x1c, 0x1a, 0x23, 0x36, 0x9b, 0x0a, 0x66, 0xbd, 0x32, 0xc3, 0xa7, 0xca, 0x86, 0x3d, 0xcd, 0x30, 0x52, 0x7d, 0xb9, 0x36, + 0xc3, 0x17, 0xb7, 0xf8, 0xb1, 0x3e, 0x71, 0x58, 0x8d, 0xc3, 0xac, 0xaa, 0xcd, 0x24, 0x71, 0x9d, 0xf1, 0xc5, 0x39, 0x30, 0x79, 0xa6, 0xa9, 0x03, 0x5f, 0x0a, 0x02, 0x79, 0xf8, 0x86, 0x0b, 0xba, + 0xdf, 0xef, 0x9f, 0xc3, 0x0d, 0x07, 0x88, 0xd7, 0x9d, 0x81, 0x1f, 0xa1, 0xa8, 0xc2, 0x18, 0x13, 0x8c, 0x5d, 0x5b, 0x00, 0xe6, 0x34, 0x07, 0x4c, 0x66, 0x64, 0x3c, 0x4b, 0x9b, 0x68, 0x8f, 0xed, + 0x84, 0x56, 0x8c, 0xd1, 0xa6, 0x99, 0x2c, 0x93, 0x13, 0xc0, 0xc5, 0x08, 0x52, 0x9c, 0xe4, 0x26, 0x11, 0x8b, 0x8c, 0x5e, 0x21, 0x28, 0xcf, 0x45, 0xf4, 0x6a, 0x3f, 0x2b, 0x98, 0x6d, 0xa6, 0x21, + 0x62, 0xa0, 0x4f, 0xe4, 0x5d, 0x46, 0xcd, 0x79, 0xb8, 0x9f, 0xbe, 0x86, 0xf5, 0xad, 0xdf, 0xe6, 0x65, 0x33, 0xbb, 0xcf, 0xd1, 0x77, 0x71, 0xab, 0xcd, 0xde, 0x4e, 0xc2, 0x7f, 0x7f, 0x38, 0x85, + 0x3d, 0x1f, 0x90, 0xfb, 0x94, 0xa3, 0xcf, 0x18, 0xe2, 0x4b, 0x63, 0x71, 0x43, 0xfc, 0x32, 0x0c, 0x37, 0xb7, 0xce, 0x2c, 0x70, 0xc0, 0x08, 0x38, 0x87, 0x75, 0x6b, 0x96, 0x1b, 0xb3, 0xdb, 0x57, + 0x4b, 0x6b, 0xbb, 0x70, 0xd7, 0x3b, 0xac, 0x9f, 0xf5, 0x38, 0x53, 0xaf, 0x09, 0xdb, 0x81, 0x71, 0xbd, 0xf1, 0x9a, 0x66, 0xd9, 0x07, 0xe0, 0x0a, 0x2f, 0xb6, 0x74, 0xb4, 0xe6, 0x32, 0x1d, 0xc4, + 0x17, 0x2d, 0x56, 0xe9, 0x7b, 0xb8, 0x59, 0x4e, 0xd5, 0x42, 0xe4, 0xbb, 0xd0, 0x9d, 0xb9, 0x3c, 0x75, 0xa4, 0xf4, 0xd9, 0x6e, 0xe7, 0x35, 0x98, 0x61, 0x7c, 0xaf, 0x4f, 0xf6, 0xf6, 0x75, 0xc5, + 0xf3, 0x70, 0x87, 0x17, 0x37, 0x85, 0xac, 0x48, 0xdf, 0x7b, 0x5e, 0xa4, 0x43, 0x5d, 0x5b, 0x08, 0x94, 0x9a, 0x33, 0x5e, 0x40, 0x1c, 0xeb, 0xc5, 0x22, 0x11, 0x4e, 0xc9, 0x56, 0xd8, 0x07, 0x7d, + 0x54, 0x9d, 0x62, 0xba, 0xe2, 0xd6, 0x06, 0x84, 0xcf, 0xe4, 0xc2, 0xdc, 0xf5, 0xe2, 0x89, 0x2c, 0x11, 0x5d, 0x52, 0x6c, 0x2d, 0x52, 0xdb, 0xde, 0xa4, 0xcd, 0xd3, 0x62, 0x46, 0xc9, 0x70, 0xae, + 0x02, 0x13, 0xb6, 0x48, 0xa2, 0x80, 0x56, 0xa3, 0x5a, 0x96, 0xb6, 0xe1, 0xa2, 0x0b, 0xc1, 0x25, 0x18, 0x0e, 0x49, 0xd2, 0xf7, 0xf6, 0x99, 0x4d, 0x6a, 0x3d, 0xad, 0x3a, 0x89, 0xbd, 0x8c, 0xc2, + 0x99, 0xea, 0x3b, 0x10, 0xe7, 0xeb, 0x73, 0x70, 0xff, 0x00, 0x2c, 0x10, 0x68, 0x1e, 0x7a, 0xb1, 0x8f, 0xba, 0xb8, 0x72, 0x4a, 0xe4, 0xc2, 0xa9, 0x95, 0xc2, 0xdd, 0x68, 0xdc, 0xa1, 0x95, 0x49, + 0x4a, 0xeb, 0x95, 0xba, 0xa6, 0x5b, 0x4a, 0x5a, 0x60, 0x08, 0x34, 0x2a, 0x32, 0x03, 0x9f, 0x6d, 0x5b, 0x10, 0x04, 0x11, 0x4e, 0xda, 0x20, 0x13, 0x91, 0x15, 0x16, 0x09, 0x4b, 0xd8, 0xab, 0x76, + 0x5b, 0xa0, 0x5b, 0x63, 0x67, 0xa8, 0x64, 0x62, 0xad, 0xf6, 0xfa, 0xf1, 0x98, 0xfd, 0x11, 0x16, 0xbf, 0xcb, 0x83, 0x7f, 0x1e, 0xb8, 0x7b, 0x4f, 0xfc, 0x06, 0x99, 0x2b, 0x99, 0x70, 0x40, 0x8e, + 0x67, 0x49, 0x05, 0x13, 0x06, 0xc8, 0x88, 0x69, 0xc1, 0xe5, 0x2a, 0xdb, 0x10, 0x2d, 0x44, 0x1a, 0xc2, 0x94, 0x23, 0x6d, 0xa3, 0xd9, 0xca, 0xda, 0x3a, 0xe6, 0xe2, 0xd9, 0x0a, 0x76, 0xd6, 0x87, + 0x39, 0xd2, 0xc3, 0xab, 0x24, 0x5e, 0xa9, 0x5b, 0x97, 0x46, 0x71, 0xb9, 0xa1, 0x1b, 0x92, 0x25, 0x17, 0xc0, 0x7e, 0xe9, 0x8e, 0x36, 0xb4, 0x31, 0xf2, 0x08, 0x92, 0x8d, 0x37, 0x94, 0x82, 0x82, + 0xdb, 0xd0, 0x75, 0x1e, 0x1d, 0x2a, 0x7e, 0xf6, 0x1e, 0x78, 0x69, 0x5a, 0x5c, 0xdc, 0x04, 0xc2, 0x2f, 0x7f, 0x80, 0x01, 0x13, 0xc2, 0x29, 0x0f, 0x8b, 0xd5, 0xc4, 0xb6, 0xec, 0xfe, 0x78, 0xa4, + 0xd6, 0x52, 0xce, 0xef, 0x6d, 0x3e, 0xaa, 0x9d, 0x02, 0x5a, 0x03, 0xc9, 0xa9, 0x80, 0xd2, 0x6d, 0x06, 0x1e, 0xcd, 0x3e, 0x93, 0x2a, 0x7c, 0x94, 0x36, 0x64, 0xe0, 0x8b, 0x76, 0x99, 0x59, 0x55, + 0x91, 0x1f, 0xa7, 0xfb, 0xa9, 0xc7, 0x77, 0x20, 0x9d, 0x71, 0x99, 0xe5, 0x2d, 0xfa, 0x36, 0xa3, 0x38, 0xaa, 0x3e, 0x2c, 0xa8, 0x35, 0x95, 0xe3, 0x43, 0x5c, 0x57, 0xbe, 0xf1, 0xd6, 0x47, 0x50, + 0x4c, 0x5e, 0xd3, 0xd7, 0xde, 0x90, 0xbe, 0x40, 0x72, 0x75, 0xe3, 0x9c, 0x5c, 0x6b, 0x80, 0xc6, 0x76, 0xe9, 0x20, 0xfe, 0x8c, 0xb4, 0x46, 0x27, 0x7b, 0x35, 0x4b, 0xd9, 0xbc, 0xc1, 0x5d, 0xce, + 0xab, 0xe7, 0x4d, 0x21, 0x87, 0xe5, 0x34, 0x91, 0x8e, 0x07, 0x0f, 0x31, 0x17, 0x40, 0xeb, 0x80, 0xf6, 0x02, 0x3e, 0xd8, 0x08, 0xbd, 0x01, 0x31, 0x3e, 0x9a, 0xbb, 0x0d, 0xcd, 0x95, 0xb8, 0x94, + 0x23, 0xf3, 0x9c, 0x33, 0xdd, 0x39, 0xbb, 0x20, 0x41, 0x80, 0x9a, 0x93, 0xbc, 0xb6, 0x8b, 0x94, 0x4e, 0x6d, 0x85, 0x41, 0x9a, 0xec, 0xef, 0x09, 0x90, 0xff, 0x93, 0x35, 0xf2, 0x20, 0xf1, 0xf1, + 0xa0, 0x35, 0xd1, 0x26, 0xec, 0x0e, 0xc2, 0xe4, 0xed, 0x01, 0x41, 0xf2, 0xae, 0x9d, 0xce, 0x44, 0x69, 0x32, 0x3f, 0x80, 0x96, 0x28, 0x50, 0x16, 0x3e, 0x8a, 0x97, 0x13, 0x95, 0x35, 0x60, 0x2f, + 0x34, 0xb6, 0xfc, 0xae, 0xee, 0x6b, 0x9d, 0x9a, 0x86, 0xe0, 0xbc, 0x9f, 0x1b, 0xc7, 0xe5, 0xa2, 0xe3, 0xa7, 0xf8, 0x61, 0xc6, 0xef, 0xea, 0xa3, 0x43, 0x4a, 0x1a, 0x0f, 0x68, 0x53, 0x31, 0xcc, + 0xa0, 0x2e, 0x9a, 0x1f, 0x96, 0x2f, 0x86, 0x11, 0xdc, 0xaa, 0xaa, 0xdf, 0xef, 0x7f, 0xdb, 0x86, 0x1f, 0x67, 0xed, 0xfe, 0x4f, 0xf5, 0x8b, 0x0f, 0x5e, 0x71, 0x41, 0xf6, 0xc1, 0x0f, 0x43, 0x35, + 0x8f, 0xd5, 0x61, 0x0b, 0xab, 0x8b, 0x06, 0x02, 0xc0, 0x13, 0xda, 0xb4, 0xfb, 0x93, 0x5c, 0xcf, 0xf9, 0xfe, 0x14, 0xcc, 0xa2, 0xb9, 0x9c, 0xd0, 0xb6, 0xbb, 0xcc, 0x39, 0x76, 0xbd, 0xc3, 0x77, + 0x04, 0xa5, 0x12, 0x76, 0x1b, 0xda, 0x80, 0xe8, 0x54, 0x06, 0x18, 0x53, 0x2a, 0x31, 0xa1, 0xa9, 0xd3, 0x84, 0x51, 0xa9, 0xa5, 0xc1, 0x84, 0x34, 0x30, 0xe9, 0x46, 0x33, 0x1a, 0x50, 0x45, 0x4b, + 0xa0, 0xb7, 0x4e, 0x30, 0x40, 0x74, 0xff, 0x13, 0x55, 0xd0, 0x8f, 0x95, 0x18, 0xa1, 0x9b, 0xf4, 0x54, 0x7f, 0x82, 0xe6, 0x47, 0xf9, 0xc5, 0xcf, 0xeb, 0x33, 0x66, 0x03, 0xcc, 0x4d, 0x35, 0x05, + 0xab, 0xfb, 0x3e, 0x6c, 0x23, 0x17, 0xcd, 0x3d, 0x61, 0x87, 0x25, 0xf0, 0xc4, 0x8e, 0x16, 0x3c, 0x67, 0x82, 0x84, 0x6f, 0x61, 0xc7, 0x64, 0x76, 0x58, 0xa1, 0xd1, 0x6a, 0xea, 0x46, 0x68, 0x23, + 0x68, 0x13, 0x58, 0x49, 0x76, 0xc2, 0x64, 0xcb, 0x0a, 0xa1, 0x5f, 0x9b, 0x2b, 0x97, 0xde, 0x36, 0x84, 0x97, 0x07, 0xb6, 0x2d, 0xe9, 0x2d, 0x13, 0x1a, 0x9c, 0xc7, 0xf3, 0x19, 0xaf, 0xab, 0xf5, + 0x00, 0xf5, 0xd9, 0x9f, 0x1f, 0x77, 0x3e, 0xb3, 0x3d, 0xff, 0xa7, 0x7a, 0x90, 0x0b, 0xd5, 0x77, 0xe4, 0x2e, 0x01, 0x8a, 0x03, 0xb5, 0x1f, 0x73, 0x60, 0x2e, 0x90, 0x07, 0x76, 0x97, 0xb5, 0x8e, + 0x7d, 0x3c, 0x30, 0x33, 0xe9, 0x78, 0xe2, 0x03, 0xa4, 0x85, 0x54, 0x95, 0xe2, 0xe7, 0x74, 0xe1, 0x2f, 0x4c, 0x70, 0xa7, 0xfb, 0x05, 0xbb, 0x58, 0x72, 0x55, 0x6f, 0x97, 0x82, 0xed, 0x79, 0xfe, + 0xb4, 0x09, 0x3a, 0xd9, 0x17, 0xe6, 0x9b, 0x05, 0xbc, 0xdb, 0x1d, 0xd3, 0x03, 0x1a, 0x56, 0x61, 0xd5, 0xe3, 0x58, 0xdd, 0x2b, 0x20, 0x54, 0x37, 0xab, 0x60, 0x20, 0x72, 0x03, 0xfd, 0x3c, 0xc3, + 0xea, 0x9c, 0xdf, 0xe1, 0x7d, 0x35, 0xfd, 0xa0, 0xc3, 0xfd, 0xf3, 0x0a, 0xf0, 0xb7, 0xa4, 0x2f, 0xf8, 0x5d, 0xdd, 0x38, 0x6b, 0x6f, 0x07, 0xd4, 0x7f, 0xa7, 0x0f, 0x34, 0x02, 0x29, 0x5b, 0xe3, + 0x00, 0x7b, 0x7e, 0xbd, 0x52, 0xf0, 0x1d, 0xad, 0x2d, 0xb5, 0x75, 0x40, 0x6a, 0xab, 0x46, 0x9f, 0xcc, 0x32, 0x61, 0x22, 0x4e, 0x50, 0x16, 0x5f, 0xb3, 0x7b, 0xf5, 0x28, 0x1f, 0x25, 0x3f, 0x06, + 0x9c, 0x11, 0xb6, 0x8d, 0xd2, 0x6e, 0x05, 0xb7, 0x39, 0x9c, 0xea, 0xe9, 0x9e, 0xc5, 0x55, 0xdd, 0x60, 0x1b, 0xf0, 0x40, 0xe3, 0x96, 0x26, 0x4c, 0x7d, 0x2a, 0xac, 0xa2, 0x01, 0x4b, 0xd6, 0x6c, + 0xcd, 0xf0, 0xa2, 0x2c, 0xbd, 0xfa, 0xe8, 0x2f, 0x3c, 0x6f, 0x52, 0x07, 0xff, 0x5e, 0x3e, 0xe2, 0xaa, 0xe0, 0xc6, 0xd9, 0x3c, 0x88, 0xdf, 0x12, 0xf8, 0xca, 0xb5, 0x72, 0x39, 0x23, 0xdd, 0xfc, + 0xf8, 0xe7, 0x0b, 0xe1, 0xfc, 0xc5, 0x3f, 0x8f, 0xe8, 0x8b, 0x02, 0xd0, 0x17, 0xe5, 0xab, 0x01, 0xfd, 0x18, 0xcf, 0x5f, 0xc5, 0x21, 0x68, 0x3c, 0xa5, 0x33, 0x66, 0xbe, 0x8c, 0xbc, 0x05, 0x59, + 0x49, 0x13, 0xa7, 0x28, 0x44, 0x21, 0xf1, 0x29, 0xaf, 0x37, 0xe5, 0x62, 0x88, 0x1f, 0xc6, 0x75, 0x89, 0x87, 0xff, 0x74, 0xaf, 0x79, 0x27, 0x7b, 0xe9, 0xd3, 0x7b, 0x63, 0xe8, 0x9e, 0x72, 0xb0, + 0xeb, 0xaa, 0xd9, 0x18, 0x29, 0x23, 0x82, 0xa3, 0x56, 0x96, 0x39, 0x2f, 0xd7, 0xda, 0xd3, 0xd2, 0x85, 0x47, 0x2b, 0x99, 0x6a, 0xb3, 0xd4, 0x80, 0xdd, 0x5e, 0x69, 0x0a, 0x48, 0x26, 0x2b, 0x97, + 0x18, 0xd5, 0xdd, 0x7c, 0xee, 0x86, 0x66, 0x82, 0x52, 0x54, 0x38, 0xd9, 0xda, 0x30, 0xbb, 0xb4, 0x3d, 0x74, 0x74, 0xe8, 0xe1, 0x25, 0x29, 0x64, 0xd1, 0xbe, 0x8a, 0xf1, 0x63, 0xc0, 0xca, 0xa6, + 0x30, 0xc0, 0xdf, 0xf3, 0x4f, 0xf6, 0x94, 0xb3, 0xab, 0xf5, 0xe5, 0x30, 0xfe, 0x83, 0xfe, 0xe2, 0xa5, 0x19, 0x71, 0x45, 0xfa, 0x02, 0xdf, 0xd5, 0x8d, 0xb3, 0xc6, 0x62, 0x80, 0x88, 0xac, 0x45, + 0xb2, 0x6b, 0x01, 0x09, 0x9d, 0xc6, 0xf9, 0xc9, 0xc1, 0xcb, 0x93, 0xa0, 0x31, 0x6c, 0xcb, 0xcf, 0x33, 0x64, 0x01, 0xc5, 0x39, 0x77, 0xd0, 0x47, 0xed, 0xe1, 0x14, 0x45, 0xaa, 0x67, 0x4f, 0x8e, + 0x27, 0xb6, 0x16, 0x10, 0x47, 0xe7, 0x8f, 0x1c, 0x82, 0x54, 0x46, 0x99, 0x1d, 0x44, 0xb9, 0x97, 0x9d, 0x6a, 0x72, 0x3c, 0xf1, 0xa5, 0xaa, 0x6c, 0x94, 0x39, 0xb1, 0xd1, 0xe6, 0x9a, 0xbf, 0xc9, + 0xfc, 0x61, 0x22, 0xf2, 0xff, 0x1f, 0xab, 0xe4, 0x6b, 0x7d, 0xfc, 0xc1, 0xca, 0x68, 0xa6, 0x5b, 0x47, 0x5e, 0xfa, 0x55, 0x13, 0x98, 0x1c, 0x99, 0x6f, 0xd7, 0x1a, 0xaa, 0xb1, 0x82, 0x6f, 0xcb, + 0xca, 0x91, 0xfa, 0xbd, 0x1f, 0x5f, 0xb9, 0xcf, 0x1f, 0xeb, 0x02, 0x5e, 0x31, 0x72, 0xbe, 0xd3, 0x04, 0xc6, 0x1f, 0x57, 0x43, 0x9d, 0x74, 0xbb, 0xe2, 0x68, 0x54, 0xc4, 0x36, 0x3f, 0x1a, 0xe6, + 0x9a, 0x92, 0xd7, 0x2b, 0xc6, 0x50, 0x4e, 0x0b, 0xca, 0xd4, 0x8b, 0x04, 0x5c, 0xb2, 0xf2, 0x6c, 0xb4, 0x24, 0x09, 0x73, 0x1d, 0x9e, 0xdc, 0x94, 0x0d, 0xb8, 0x2e, 0x3e, 0x8a, 0x3e, 0x3a, 0x09, + 0x10, 0x05, 0x62, 0xd7, 0xbe, 0xba, 0xa2, 0x0b, 0xe5, 0x20, 0x2c, 0xb6, 0x92, 0x9d, 0xa6, 0xfa, 0xa6, 0xf1, 0x4b, 0x29, 0x5a, 0x27, 0x64, 0xbd, 0x6b, 0xa5, 0x21, 0x1c, 0xbb, 0xf4, 0x6f, 0xd3, + 0x70, 0x3e, 0xd1, 0x22, 0x9d, 0x13, 0x76, 0xfe, 0x28, 0xb3, 0x4e, 0x5e, 0x1a, 0xf8, 0x2b, 0xba, 0x67, 0xd0, 0x3e, 0x5b, 0xe7, 0xe3, 0xd0, 0xaf, 0x13, 0x60, 0x77, 0xc4, 0xa7, 0x6e, 0x7b, 0x84, + 0xa0, 0xcc, 0x25, 0xd0, 0x4d, 0x8f, 0x2f, 0x62, 0x2f, 0x18, 0x99, 0x82, 0x71, 0x58, 0xfb, 0x43, 0x26, 0x40, 0x9e, 0x8d, 0x2b, 0x3b, 0x70, 0x53, 0x73, 0x5c, 0x97, 0xe6, 0x5b, 0x5f, 0xfe, 0xdb, + 0x4a, 0xfd, 0x8f, 0x5e, 0xf0, 0xd1, 0xcb, 0xbb, 0xdb, 0x43, 0xab, 0xf8, 0x1f, 0x2d, 0x6b, 0x4e, 0x4f, 0x9d, 0xb9, 0xae, 0x4e, 0x15, 0x7c, 0x63, 0x53, 0x41, 0xd0, 0x04, 0x18, 0xbd, 0xc6, 0x71, + 0x7a, 0xdf, 0xec, 0x26, 0x87, 0x8a, 0x99, 0xe8, 0x60, 0xcf, 0x1b, 0x4b, 0xd6, 0x33, 0x28, 0xda, 0x2e, 0x76, 0x21, 0xad, 0x02, 0xeb, 0x63, 0x1f, 0xa3, 0x30, 0x41, 0x96, 0x95, 0x69, 0x01, 0x29, + 0x17, 0xd2, 0x62, 0x1d, 0x12, 0x1d, 0x27, 0x8c, 0x70, 0x64, 0x2a, 0x09, 0xee, 0x44, 0xfb, 0xe6, 0x3c, 0x12, 0xbb, 0xa7, 0xf6, 0xe9, 0x30, 0xbf, 0xb2, 0x2e, 0xde, 0x08, 0x02, 0xe3, 0xf3, 0x9f, + 0xa1, 0x75, 0xb0, 0x89, 0x53, 0xbc, 0x06, 0x10, 0x54, 0xde, 0x02, 0x04, 0x2b, 0x70, 0x40, 0x15, 0xda, 0x41, 0x2f, 0x62, 0x7c, 0xbb, 0x3f, 0xad, 0x16, 0x3a, 0xbb, 0x52, 0xcc, 0x45, 0xc2, 0x72, + 0xab, 0xf9, 0x2c, 0xf1, 0x61, 0x95, 0xc5, 0x59, 0xe9, 0x84, 0x44, 0x16, 0xe8, 0xe0, 0xd5, 0xd2, 0x1e, 0x81, 0x4a, 0x0d, 0xea, 0x7a, 0xa6, 0x04, 0x07, 0x7c, 0x0f, 0x4b, 0x86, 0x3f, 0xf7, 0x31, + 0x44, 0x12, 0x8e, 0xbe, 0xad, 0xfd, 0x96, 0xb0, 0xe7, 0xf1, 0x22, 0xb9, 0x9d, 0xfc, 0x7f, 0xff, 0x10, 0x81, 0x9b, 0x98, 0xb5, 0x5b, 0xd5, 0xe3, 0x2f, 0xbc, 0x1e, 0x41, 0x38, 0x7d, 0x09, 0xc2, + 0x5b, 0xd2, 0xc0, 0xf8, 0xee, 0xc6, 0x39, 0x8f, 0xc1, 0x00, 0x58, 0x3b, 0x57, 0x19, 0x95, 0x60, 0xac, 0xc4, 0x92, 0xe8, 0xcc, 0x1d, 0x7d, 0xbe, 0xad, 0x63, 0xae, 0xdb, 0xed, 0x45, 0x85, 0xa3, + 0xaa, 0x8e, 0x2d, 0x97, 0x64, 0x9c, 0x22, 0x76, 0x2c, 0xf2, 0x9c, 0x16, 0x04, 0x87, 0x80, 0xe1, 0x18, 0x48, 0x55, 0xe0, 0x80, 0x8b, 0x46, 0x50, 0x18, 0xfa, 0x4c, 0xe0, 0xcb, 0x46, 0x3a, 0xf5, + 0x95, 0xb4, 0x94, 0xf6, 0xe4, 0x36, 0x5f, 0xa9, 0xbe, 0xa9, 0xe8, 0xd0, 0xf1, 0x35, 0x58, 0x0b, 0xd3, 0x8e, 0x4d, 0xff, 0x92, 0x0c, 0xf8, 0xcc, 0x7f, 0xd0, 0xe7, 0x39, 0x19, 0x1f, 0xa4, 0x2c, + 0x7e, 0xcc, 0xb5, 0xb1, 0x57, 0xa0, 0xbd, 0x23, 0xfe, 0x06, 0xee, 0xdd, 0xad, 0xf1, 0x99, 0xf2, 0xef, 0xf0, 0x6e, 0x14, 0x13, 0xd7, 0x8d, 0x62, 0xc2, 0xc2, 0x33, 0xb5, 0x38, 0xa8, 0x59, 0xd7, + 0xb1, 0x66, 0x94, 0x33, 0xb4, 0x5d, 0xb1, 0x3c, 0x99, 0xf5, 0xdd, 0x7a, 0x2b, 0xca, 0x65, 0x8c, 0x35, 0x59, 0x1f, 0x0a, 0x5d, 0x8e, 0xce, 0x23, 0x5e, 0x8f, 0x4e, 0x3c, 0xb8, 0x24, 0x3a, 0x2f, + 0x3e, 0x2e, 0x5b, 0x61, 0x94, 0x91, 0xd5, 0x7c, 0xe5, 0x4e, 0x5c, 0x4e, 0xc8, 0x5c, 0x47, 0xf3, 0x19, 0xc6, 0x77, 0x66, 0x03, 0xdc, 0xeb, 0x3f, 0xf2, 0xd1, 0x7f, 0x2b, 0x0d, 0x62, 0xe7, 0x79, + 0x1c, 0x7e, 0xa4, 0xbc, 0xbc, 0xf3, 0xbc, 0x1f, 0x94, 0x6b, 0xba, 0x72, 0xeb, 0xf1, 0x85, 0xc8, 0x7b, 0x7c, 0xc5, 0xfb, 0x56, 0x81, 0xfc, 0x59, 0xf9, 0xac, 0xcb, 0x07, 0x7e, 0xdd, 0xb8, 0x1d, + 0x37, 0xfc, 0x1f, 0xfc, 0xae, 0x64, 0xd4, 0xd0, 0xb1, 0x33, 0xa3, 0x37, 0xc6, 0x62, 0x46, 0xed, 0xf8, 0x4c, 0xe3, 0x66, 0x84, 0xfe, 0x7a, 0xca, 0x45, 0x09, 0xad, 0xd9, 0x8f, 0x24, 0x20, 0xb2, + 0x97, 0x11, 0xb4, 0xa0, 0x73, 0xc0, 0x9b, 0x17, 0x04, 0xe1, 0x56, 0xfe, 0x6a, 0xb1, 0x0b, 0x69, 0x6a, 0x5b, 0xb2, 0x47, 0x73, 0x4e, 0x6d, 0x9b, 0xf9, 0xb1, 0xc8, 0xb9, 0x79, 0x3a, 0xab, 0x81, + 0x39, 0x3f, 0x5f, 0x69, 0x8b, 0x6e, 0x86, 0xc5, 0x89, 0x4b, 0x15, 0x54, 0xbf, 0x8e, 0x16, 0x59, 0x1b, 0x4c, 0x4e, 0xab, 0x9c, 0x6f, 0x36, 0x0d, 0xb8, 0xa8, 0x93, 0xe4, 0x7a, 0x94, 0xfe, 0x7a, + 0x3a, 0x52, 0x7f, 0xfd, 0xf5, 0x43, 0x4e, 0x53, 0xe8, 0x86, 0xc0, 0xf3, 0x2d, 0xea, 0x7b, 0xa2, 0x80, 0xeb, 0x17, 0x8e, 0xbd, 0x32, 0x4f, 0xaf, 0xeb, 0xbe, 0xdd, 0x17, 0x98, 0x3b, 0x3f, 0xdc, + 0x94, 0xe1, 0x47, 0xc0, 0xd3, 0xa5, 0x48, 0xc1, 0xd5, 0xcf, 0xff, 0xfb, 0xf3, 0xfa, 0x7f, 0x5f, 0xcd, 0x84, 0x5f, 0xf6, 0xcb, 0xbf, 0xfe, 0xfa, 0x49, 0x12, 0xfc, 0xeb, 0x0f, 0xc6, 0xf4, 0x4f, + 0xf6, 0xcd, 0xef, 0x72, 0xe2, 0x5f, 0xcf, 0x46, 0x7d, 0xcb, 0xe1, 0x80, 0x40, 0x64, 0x93, 0x7d, 0xb4, 0x0f, 0x18, 0x23, 0x83, 0x92, 0x4d, 0x10, 0x2f, 0xcd, 0xd9, 0x5c, 0xe1, 0x55, 0x49, 0xdc, + 0x47, 0xbb, 0x40, 0x43, 0xc8, 0x19, 0x20, 0x65, 0x7c, 0x8b, 0x1f, 0x5b, 0xff, 0x50, 0x1f, 0x8a, 0xd9, 0x9e, 0x60, 0x78, 0x24, 0x95, 0xc4, 0xa3, 0x7c, 0x84, 0xa4, 0x24, 0x47, 0xea, 0x43, 0xef, + 0x1e, 0x2c, 0xb0, 0xe2, 0x93, 0xb2, 0x31, 0xf9, 0xd3, 0xc4, 0x69, 0xfc, 0xdf, 0x03, 0x33, 0x92, 0x3c, 0x2f, 0x2c, 0x37, 0x7b, 0x9a, 0x16, 0xf4, 0xb5, 0x38, 0xc8, 0x4f, 0xaa, 0x6f, 0xdc, 0xea, + 0xe3, 0x7a, 0x48, 0xe4, 0x23, 0x34, 0x76, 0xfc, 0xd5, 0x44, 0x80, 0xec, 0xb5, 0x47, 0x0b, 0xe0, 0xfa, 0x40, 0xba, 0xed, 0xc4, 0x37, 0xeb, 0x51, 0xb1, 0x5e, 0x02, 0xf8, 0xaf, 0x8c, 0xe6, 0xa3, + 0xc8, 0xd5, 0x8f, 0xa9, 0x67, 0xbe, 0xe5, 0xd1, 0x78, 0x76, 0x52, 0xf8, 0x73, 0x99, 0xea, 0x96, 0xf4, 0xb9, 0xef, 0xd7, 0x37, 0x86, 0x44, 0xa0, 0xbc, 0xcd, 0x85, 0x15, 0xbc, 0x89, 0x50, 0xa8, + 0xde, 0x2f, 0x32, 0x6d, 0xb9, 0xe4, 0x43, 0x5c, 0x33, 0x9c, 0x6a, 0x24, 0xe7, 0x62, 0x54, 0x8b, 0xf3, 0x89, 0xe3, 0xe7, 0x31, 0xeb, 0x2c, 0x56, 0x70, 0xaa, 0xa4, 0x50, 0x7d, 0x44, 0xd2, 0x29, + 0xb8, 0x55, 0x69, 0x92, 0x37, 0x64, 0xb2, 0x13, 0x45, 0xfa, 0x74, 0x02, 0x35, 0x08, 0x9e, 0x81, 0x6b, 0x65, 0x85, 0x84, 0xb6, 0x67, 0x88, 0xf4, 0xe8, 0x28, 0x9c, 0x02, 0xfc, 0x99, 0x74, 0x71, + 0x0b, 0x4d, 0xd9, 0x5c, 0x02, 0xf9, 0x9e, 0xa0, 0x82, 0xbe, 0x24, 0x46, 0x7f, 0x52, 0x7d, 0x03, 0xe4, 0xe3, 0x7a, 0x8c, 0xfe, 0x2e, 0x42, 0xbf, 0x61, 0xb1, 0xce, 0x51, 0x67, 0x0d, 0x22, 0xf3, + 0x54, 0x8e, 0x9a, 0x3e, 0xeb, 0xd6, 0xb2, 0x3c, 0x29, 0x54, 0x77, 0x97, 0x3a, 0x00, 0x0d, 0x7a, 0x9e, 0x92, 0xc4, 0xfb, 0xbd, 0xdf, 0x19, 0xe1, 0xc8, 0x3d, 0x40, 0xea, 0x3c, 0x3d, 0x88, 0xdd, + 0x3c, 0x18, 0xb9, 0x9b, 0x4a, 0xe7, 0xf5, 0x79, 0xa7, 0x13, 0x04, 0x14, 0xc2, 0x4b, 0x33, 0x40, 0x02, 0x88, 0xa4, 0xb8, 0xf9, 0x11, 0x39, 0x28, 0xc1, 0xca, 0xaa, 0xc2, 0x01, 0x67, 0x8f, 0x93, + 0x99, 0x24, 0xe1, 0x67, 0xf5, 0x81, 0xa7, 0x32, 0x55, 0x6a, 0xc6, 0xee, 0xd8, 0x09, 0x9f, 0x9f, 0x3b, 0x5e, 0x91, 0xa6, 0x3e, 0x88, 0x02, 0xe3, 0xcf, 0xcb, 0xa1, 0x82, 0xa9, 0x3f, 0x59, 0xba, + 0x02, 0x0c, 0x6e, 0xb6, 0x5d, 0x30, 0xdb, 0x58, 0x00, 0x3a, 0xef, 0xd1, 0x85, 0x83, 0x2c, 0xe1, 0xcc, 0xef, 0x5d, 0x30, 0xea, 0xb1, 0xda, 0xea, 0xcb, 0x05, 0xdc, 0xcd, 0xb4, 0x51, 0x4e, 0x2c, + 0xdd, 0x2d, 0xed, 0x22, 0xe5, 0x66, 0x74, 0x62, 0xe1, 0xd4, 0x01, 0xd7, 0x80, 0x17, 0xca, 0x1e, 0x54, 0x99, 0xd0, 0x6c, 0x11, 0xec, 0x0f, 0xe1, 0x74, 0x94, 0x6b, 0x1d, 0xcf, 0x01, 0xee, 0xea, + 0x35, 0x9f, 0xb7, 0xab, 0x32, 0x09, 0xe8, 0x0d, 0x80, 0x03, 0x36, 0xe4, 0xcf, 0xff, 0x7d, 0xc6, 0xbf, 0xd1, 0xbb, 0xd8, 0x96, 0xe1, 0xe0, 0x5e, 0x48, 0x03, 0xe3, 0xf7, 0x8b, 0x31, 0xfa, 0x4d, + 0xa3, 0xf1, 0xd7, 0x33, 0x70, 0xad, 0x09, 0xa1, 0x90, 0xa6, 0x22, 0x7b, 0x1a, 0x7a, 0x22, 0x4b, 0xb3, 0x50, 0x71, 0xa2, 0x98, 0x7a, 0xac, 0x1b, 0x53, 0x70, 0x0a, 0x6c, 0xbb, 0x6c, 0x91, 0xdb, + 0xbc, 0x56, 0x36, 0xe2, 0x52, 0x86, 0x80, 0xd6, 0xe5, 0x7c, 0xa7, 0x6f, 0x04, 0x3b, 0xe3, 0xb9, 0x09, 0xc2, 0xa1, 0xf3, 0xee, 0xb8, 0xc3, 0x23, 0x1a, 0x48, 0x8e, 0x94, 0x39, 0x2d, 0xc9, 0x7c, + 0xe1, 0xaa, 0x5d, 0x33, 0xa5, 0x69, 0xe5, 0xdb, 0xce, 0x7c, 0xb7, 0x36, 0xff, 0x7a, 0xca, 0xba, 0x53, 0x33, 0x7b, 0x93, 0x50, 0x7f, 0x74, 0x86, 0x7e, 0x65, 0xbd, 0x5e, 0xd1, 0x3d, 0xcf, 0xc0, + 0xcf, 0xd6, 0x10, 0x03, 0x29, 0x34, 0x26, 0xb8, 0x11, 0xa5, 0x61, 0x71, 0x8a, 0x35, 0xc8, 0xc1, 0xc7, 0x96, 0xbd, 0x4a, 0x8a, 0x6a, 0x4b, 0x5b, 0x65, 0x62, 0xd8, 0x77, 0x27, 0xb9, 0xd4, 0xad, + 0x83, 0xdc, 0xf9, 0x29, 0x02, 0xe0, 0xcf, 0x75, 0x7f, 0xef, 0x34, 0xdf, 0x3e, 0xfc, 0x72, 0x75, 0x56, 0x4b, 0xff, 0xa2, 0xf5, 0x83, 0xc6, 0x9a, 0x9c, 0xc6, 0x50, 0x66, 0xa8, 0x14, 0x88, 0xd9, + 0x47, 0xd9, 0x48, 0xb5, 0x7c, 0x6b, 0x2d, 0x10, 0xd5, 0x04, 0x78, 0xe4, 0x77, 0xb6, 0x99, 0x3e, 0x2f, 0x27, 0x08, 0xbd, 0x94, 0x87, 0x2b, 0xbd, 0xd4, 0x10, 0x3c, 0x67, 0x6b, 0x86, 0x86, 0x65, + 0xe2, 0x3a, 0x82, 0x5a, 0x86, 0x57, 0x05, 0x33, 0xea, 0x9a, 0x35, 0xc4, 0xa3, 0x32, 0xe6, 0x67, 0x96, 0x29, 0xfa, 0xb8, 0x70, 0x0c, 0x90, 0xed, 0x96, 0xb6, 0x30, 0x56, 0x66, 0xb6, 0x29, 0xb5, + 0x63, 0x43, 0x81, 0x42, 0x24, 0x96, 0x2f, 0x92, 0x36, 0x8c, 0xb2, 0xd1, 0x36, 0x4e, 0xf5, 0x34, 0x95, 0x7c, 0x01, 0xc5, 0x53, 0x1b, 0x03, 0x23, 0x98, 0xb2, 0x5c, 0x65, 0x29, 0x55, 0x65, 0xd5, + 0x99, 0xa2, 0x3b, 0xc4, 0x4b, 0xe1, 0xfc, 0x91, 0xce, 0x33, 0xaf, 0x34, 0xe8, 0x1f, 0xe4, 0x95, 0x43, 0xcf, 0x3b, 0xd1, 0x0f, 0x0c, 0x1c, 0x6b, 0x7c, 0x21, 0xf4, 0x3b, 0x0e, 0x22, 0x99, 0xce, + 0x80, 0x15, 0x7c, 0x1a, 0x31, 0x9e, 0x2b, 0x23, 0x79, 0x5c, 0xbb, 0xf5, 0xe4, 0x20, 0x19, 0x23, 0x61, 0x1a, 0x0b, 0xc1, 0x9c, 0x95, 0xf6, 0xc7, 0x7d, 0x26, 0x52, 0x8d, 0xa3, 0x1f, 0x54, 0x93, + 0x0a, 0xf3, 0x99, 0x0a, 0x01, 0x9b, 0x03, 0xdc, 0x54, 0x93, 0x05, 0x50, 0x43, 0x6b, 0x2f, 0x47, 0x02, 0x8a, 0x90, 0x28, 0x51, 0x28, 0x2d, 0x12, 0x63, 0xa7, 0x15, 0x6f, 0xf7, 0x6b, 0x8d, 0xf9, + 0xe6, 0x8c, 0x70, 0x93, 0x47, 0xfb, 0xf1, 0xca, 0x83, 0xfe, 0x99, 0xbc, 0xd8, 0xef, 0x33, 0xdd, 0x8f, 0xae, 0x9f, 0x1b, 0xe3, 0x0b, 0xb9, 0xdf, 0x7b, 0x6f, 0x97, 0x69, 0x34, 0x43, 0xac, 0x4d, + 0x2d, 0xe1, 0x29, 0x71, 0xd8, 0x14, 0x74, 0xeb, 0x1f, 0xe5, 0x79, 0xa0, 0x8c, 0xf6, 0xb9, 0x9c, 0x18, 0x21, 0xbe, 0x46, 0x32, 0xc0, 0x64, 0x9c, 0x6c, 0xd2, 0x13, 0xb0, 0x0b, 0xa8, 0x08, 0x66, + 0x80, 0x1a, 0x70, 0x4a, 0x46, 0xbb, 0x80, 0xd8, 0x81, 0x08, 0xba, 0xf2, 0x97, 0xda, 0x2c, 0xcd, 0xb7, 0x12, 0xe0, 0xa5, 0x8e, 0x65, 0xe8, 0xb6, 0x2c, 0x33, 0xaa, 0x3b, 0xc0, 0x40, 0xf5, 0x35, + 0x09, 0x3e, 0x46, 0xfc, 0x31, 0xc7, 0xba, 0x4f, 0x4f, 0xf6, 0xdf, 0x89, 0x5e, 0xb7, 0xa4, 0x2f, 0xe8, 0x5d, 0xdd, 0x18, 0x2a, 0x7a, 0x45, 0x53, 0xca, 0xae, 0xb3, 0x98, 0xc6, 0xcc, 0xd4, 0xd3, + 0x80, 0xc3, 0x94, 0xf6, 0xd3, 0xdc, 0x4c, 0x20, 0x1f, 0x16, 0xe9, 0xe5, 0x5a, 0x2a, 0x4d, 0xbe, 0x4e, 0x8f, 0xe0, 0xba, 0x60, 0x0e, 0xf1, 0x31, 0x20, 0x03, 0x06, 0x48, 0xd6, 0x72, 0x02, 0x65, + 0x5c, 0x21, 0x22, 0xd3, 0x40, 0x33, 0xcb, 0x6e, 0x4b, 0x29, 0x7c, 0xbe, 0xa3, 0xc2, 0x34, 0x73, 0x0c, 0x44, 0x64, 0x41, 0x89, 0x3e, 0x36, 0xc7, 0x21, 0x0e, 0x0c, 0xd7, 0x49, 0x2c, 0x9f, 0x69, + 0x30, 0xff, 0xdc, 0xda, 0xf9, 0x49, 0xf5, 0x0c, 0xc8, 0xfb, 0xf5, 0x59, 0x7b, 0x39, 0xc0, 0xda, 0x79, 0x5a, 0xd3, 0x9a, 0x48, 0x05, 0xa7, 0x83, 0xb0, 0x51, 0x15, 0xbf, 0x26, 0x48, 0x7c, 0x22, + 0xec, 0x1b, 0x74, 0x37, 0x29, 0x8f, 0x08, 0xd7, 0xb6, 0x74, 0x2b, 0xab, 0xad, 0x92, 0xe7, 0x7e, 0xd1, 0xe5, 0xab, 0x05, 0xaf, 0x8a, 0xa3, 0xd3, 0xa2, 0x94, 0x40, 0x5a, 0xca, 0xeb, 0xd1, 0x89, + 0x9f, 0x3b, 0x73, 0x1e, 0x6b, 0x90, 0x60, 0x3f, 0x29, 0x76, 0x5e, 0x8d, 0xc6, 0x3b, 0x92, 0xb4, 0x0f, 0x01, 0xa8, 0xbe, 0xa6, 0x8d, 0xb1, 0x4a, 0xd3, 0x76, 0xc7, 0xee, 0xb1, 0x30, 0xb3, 0x0f, + 0x40, 0xce, 0x31, 0x79, 0x4f, 0xf2, 0x22, 0x9e, 0xbb, 0x1a, 0x3e, 0x55, 0xc4, 0xbc, 0xed, 0x07, 0x7f, 0xee, 0x0d, 0xf2, 0x41, 0xf4, 0x03, 0xca, 0xb0, 0xaa, 0xcf, 0x27, 0x9a, 0x01, 0xde, 0x20, + 0x4b, 0x8e, 0xc8, 0xb6, 0xaa, 0x5e, 0x4a, 0xe4, 0x8c, 0xda, 0x18, 0xa2, 0x32, 0x39, 0xba, 0x86, 0x88, 0x79, 0x29, 0xc7, 0x93, 0x3e, 0x9a, 0xed, 0xb6, 0xe9, 0x9a, 0x55, 0x6c, 0xbf, 0x5a, 0xbb, + 0xe6, 0xa6, 0xaa, 0x05, 0x40, 0xe5, 0x17, 0x5a, 0xb1, 0xaa, 0xca, 0x29, 0x1f, 0xec, 0x83, 0x60, 0xef, 0xa3, 0xde, 0xe8, 0x50, 0xaf, 0xf1, 0x26, 0x34, 0x46, 0x82, 0x7a, 0x8c, 0x17, 0x3b, 0xdb, + 0x67, 0xf6, 0x9b, 0xef, 0x4c, 0xe9, 0x39, 0x33, 0x7a, 0x49, 0x0c, 0x38, 0xf3, 0xa0, 0x6a, 0xd8, 0xa6, 0xaf, 0xf9, 0x61, 0x53, 0x7a, 0xdd, 0xac, 0x4d, 0xbb, 0x62, 0xe6, 0x10, 0x5e, 0xba, 0x5a, + 0x22, 0x91, 0xbb, 0xd0, 0x12, 0x7c, 0x80, 0xae, 0xfb, 0xbe, 0x96, 0xeb, 0xe3, 0x31, 0x9b, 0xbc, 0x30, 0x66, 0x37, 0x94, 0x81, 0xf1, 0x6d, 0xfb, 0x1c, 0x9e, 0x3b, 0x60, 0xf4, 0x2c, 0x66, 0xcd, + 0x24, 0xf1, 0x28, 0x98, 0x8d, 0x30, 0x60, 0xa6, 0x64, 0xcd, 0xa4, 0x12, 0xb9, 0x7a, 0x89, 0x12, 0x58, 0xd8, 0x11, 0x0a, 0xb0, 0x8e, 0xab, 0x45, 0xc0, 0x72, 0x2e, 0xd1, 0x50, 0xdb, 0x15, 0xc8, + 0x07, 0x3d, 0xb3, 0xc2, 0x82, 0x0d, 0x87, 0x7a, 0x96, 0x7d, 0x6a, 0x20, 0xdc, 0xe2, 0x1b, 0x33, 0x4a, 0xf4, 0x5d, 0x26, 0x27, 0x11, 0xc8, 0x04, 0x8b, 0x1c, 0x3e, 0x60, 0x31, 0xe8, 0x5a, 0xdf, + 0xd4, 0xda, 0x6f, 0x9f, 0x96, 0x3e, 0x55, 0xcb, 0xc2, 0x2f, 0xb9, 0x89, 0xbc, 0xd3, 0x7c, 0xef, 0x78, 0x9a, 0x67, 0xe7, 0xc1, 0x1c, 0xe0, 0x22, 0xb2, 0xa7, 0x7b, 0x16, 0x25, 0x66, 0x9d, 0x9f, + 0xb9, 0x36, 0xa1, 0xf6, 0x74, 0x09, 0xc5, 0x36, 0x4e, 0xe5, 0xa9, 0x18, 0x20, 0x55, 0xa4, 0x88, 0x78, 0x2e, 0x79, 0xb8, 0x52, 0xad, 0x4a, 0x39, 0xa5, 0x17, 0x47, 0x02, 0x50, 0xd3, 0x70, 0xb5, + 0x22, 0x28, 0x20, 0xe5, 0x26, 0x64, 0xa3, 0x78, 0x5b, 0x77, 0xd9, 0x39, 0x5b, 0xb2, 0x2d, 0x0f, 0xe2, 0x01, 0x90, 0xe8, 0x0d, 0x78, 0x64, 0xdc, 0xd3, 0x92, 0x7f, 0x6d, 0xe9, 0xdb, 0x41, 0x1e, + 0x87, 0x8e, 0x79, 0x39, 0x48, 0x4c, 0xee, 0x2b, 0x56, 0x3a, 0xae, 0xd5, 0xf8, 0x9f, 0x3f, 0xdd, 0xd4, 0xba, 0x78, 0x94, 0x72, 0xe2, 0x61, 0xca, 0xcc, 0x1f, 0xb3, 0x07, 0x17, 0x55, 0x5d, 0xba, + 0xee, 0x3f, 0xa5, 0x9b, 0x9e, 0xae, 0xb8, 0xce, 0xd5, 0x03, 0x57, 0xc7, 0x9c, 0xe9, 0x3f, 0xd8, 0x2d, 0xed, 0xaa, 0x29, 0x8a, 0xbc, 0xac, 0xab, 0xb1, 0x9d, 0x27, 0xf9, 0xc7, 0x33, 0xd3, 0x5b, + 0x15, 0x66, 0x9d, 0x37, 0x9f, 0xef, 0xbe, 0x53, 0x8f, 0x36, 0x99, 0xe3, 0x7a, 0x95, 0xe9, 0x7d, 0x19, 0xc0, 0x6e, 0x42, 0x8d, 0x9b, 0xe2, 0x1c, 0xc0, 0x93, 0xe5, 0x75, 0xe8, 0x85, 0xef, 0x9f, + 0x80, 0xfc, 0x69, 0x82, 0x92, 0x0f, 0x00, 0x9f, 0x1d, 0xb4, 0xde, 0x60, 0xbd, 0xee, 0xef, 0xf0, 0xc9, 0x77, 0xa6, 0x0c, 0x8c, 0x2f, 0x7f, 0xc7, 0x67, 0x3a, 0xc3, 0x8e, 0x59, 0xf3, 0x65, 0xd4, + 0xeb, 0xfa, 0x2c, 0x44, 0x94, 0xc0, 0x0b, 0xc5, 0x36, 0xec, 0xcb, 0xa5, 0xe8, 0xb6, 0x8a, 0xb2, 0xa7, 0xeb, 0x6c, 0x7e, 0xd8, 0x79, 0x2e, 0x76, 0x84, 0x66, 0x81, 0x4f, 0x55, 0xb6, 0xd2, 0xa3, + 0x86, 0xb5, 0xb1, 0xbc, 0x7c, 0x23, 0x6d, 0x84, 0xc6, 0x57, 0xc4, 0x13, 0x59, 0x07, 0xa8, 0x87, 0x1b, 0x94, 0xa4, 0xa9, 0xf2, 0x69, 0x47, 0x2f, 0x17, 0x00, 0xb6, 0x6b, 0x90, 0x1a, 0xda, 0x8b, + 0xcf, 0x8f, 0x59, 0x77, 0x9d, 0x7b, 0xa6, 0x17, 0x4d, 0x3f, 0x3c, 0xde, 0xaf, 0xc2, 0x0b, 0xfe, 0x7a, 0xaa, 0x8f, 0x7c, 0x90, 0xac, 0xf0, 0xaf, 0x6f, 0xd0, 0xbe, 0xaa, 0x83, 0x7c, 0x94, 0xb4, + 0xf0, 0xbb, 0x49, 0xf2, 0xaf, 0x47, 0x00, 0x43, 0xe3, 0xda, 0x91, 0xd4, 0xc9, 0x7c, 0x65, 0x94, 0xe1, 0x7a, 0x97, 0x7a, 0xdb, 0x95, 0x97, 0xe4, 0x34, 0x8e, 0x25, 0x5a, 0xd3, 0x82, 0x03, 0x4e, + 0xa2, 0xd7, 0x2b, 0xe7, 0x1e, 0xa4, 0x6f, 0x02, 0xf0, 0x4b, 0x9d, 0xfb, 0xda, 0x77, 0xee, 0x2b, 0x35, 0xff, 0xf5, 0x6c, 0xc6, 0xa0, 0xcb, 0xa4, 0x6f, 0x2c, 0x65, 0x63, 0xac, 0x26, 0x6b, 0xd8, + 0x04, 0xb6, 0xda, 0x7c, 0x96, 0xb8, 0x54, 0x10, 0xf5, 0x87, 0x69, 0x7e, 0xf4, 0xe9, 0x93, 0x39, 0x57, 0x89, 0x93, 0xbe, 0x6f, 0xed, 0x4d, 0xd5, 0xe6, 0x9a, 0x49, 0xaf, 0x0f, 0x40, 0x35, 0x3d, + 0xee, 0x19, 0x14, 0xd8, 0xef, 0x05, 0xb4, 0xee, 0x31, 0x89, 0x38, 0xce, 0xf8, 0x9a, 0xce, 0x64, 0x1e, 0xa8, 0xf7, 0xf5, 0x72, 0xb2, 0x93, 0x94, 0x64, 0x36, 0xe4, 0x60, 0xfe, 0x88, 0x11, 0x3c, + 0x83, 0xe4, 0x9e, 0x3d, 0x0c, 0x87, 0xe4, 0x5e, 0x67, 0x71, 0xa6, 0x34, 0x0c, 0x9a, 0xca, 0x6c, 0xcc, 0x85, 0x07, 0x08, 0x86, 0xa3, 0xf9, 0xe5, 0x46, 0xd9, 0xea, 0xb4, 0x54, 0x17, 0x7b, 0x13, + 0x0a, 0xa5, 0x90, 0xb5, 0x4d, 0xd7, 0x0a, 0x59, 0x11, 0x22, 0xd7, 0x4e, 0x21, 0x26, 0x3b, 0x1a, 0x4e, 0xe6, 0xad, 0x7b, 0x14, 0x9d, 0xfd, 0x74, 0x5a, 0x65, 0xc2, 0xf2, 0xc4, 0x62, 0x62, 0x5f, + 0x34, 0xce, 0xc1, 0x9a, 0x33, 0xe0, 0x61, 0xbf, 0xf4, 0x78, 0xb3, 0xa2, 0x9d, 0xd3, 0x76, 0xb1, 0xfa, 0x61, 0x31, 0x3d, 0x86, 0xe6, 0x9e, 0x0f, 0x3e, 0x87, 0x68, 0xfa, 0xe2, 0x92, 0xb8, 0x7d, + 0xc5, 0x1b, 0x54, 0x37, 0x37, 0xc6, 0x67, 0xca, 0xc3, 0x20, 0x13, 0x23, 0x2d, 0xea, 0x9c, 0x3d, 0x53, 0x23, 0x20, 0xce, 0x31, 0xe1, 0xec, 0x30, 0xdf, 0x23, 0xb9, 0xca, 0x56, 0xbe, 0x0a, 0x53, + 0x87, 0xd9, 0xaa, 0xaf, 0x60, 0xa1, 0x88, 0x53, 0xc4, 0x14, 0x75, 0x2b, 0x4a, 0x47, 0x06, 0xb5, 0xa3, 0xec, 0x1d, 0x22, 0x7b, 0xcb, 0xad, 0x52, 0x22, 0x0d, 0xb7, 0x35, 0x52, 0x13, 0x74, 0x4f, + 0x88, 0x37, 0x4d, 0xfc, 0x4d, 0x19, 0x93, 0xa0, 0xb9, 0x07, 0x45, 0x2e, 0xff, 0x41, 0xcd, 0x33, 0x90, 0xff, 0x5c, 0x71, 0x94, 0xbb, 0x44, 0xcb, 0x7f, 0xdd, 0x72, 0xa1, 0xff, 0xe7, 0xfa, 0xef, + 0x97, 0x78, 0x51, 0xfc, 0x98, 0x73, 0xe9, 0xcf, 0xe5, 0xc3, 0x37, 0x8a, 0x67, 0xc9, 0xa2, 0xa8, 0x07, 0x45, 0xda, 0x41, 0x63, 0xcb, 0x01, 0x83, 0x56, 0xce, 0x8f, 0xe2, 0xbe, 0x91, 0xed, 0x6c, + 0xa2, 0x05, 0x5e, 0x98, 0xe2, 0x13, 0x9d, 0x41, 0x47, 0x8f, 0x95, 0x2c, 0x57, 0x5f, 0xf4, 0xd0, 0xac, 0x68, 0x59, 0xe5, 0xf9, 0xd9, 0x67, 0xe9, 0x6c, 0xb2, 0xbc, 0x4c, 0xcd, 0x24, 0xec, 0x7f, + 0xd4, 0x91, 0xbd, 0xe6, 0x1a, 0x72, 0x4b, 0xfa, 0x0c, 0xc3, 0xf5, 0x8d, 0x21, 0x0e, 0x22, 0x67, 0xc6, 0xe5, 0x1a, 0xd5, 0x74, 0x53, 0x4d, 0x76, 0xf5, 0x3c, 0xac, 0xe8, 0x5d, 0x41, 0xc8, 0xf0, + 0x4a, 0x3d, 0xe1, 0xce, 0x21, 0x2e, 0x56, 0x21, 0x42, 0x6a, 0x72, 0x3f, 0x59, 0x99, 0x87, 0x90, 0x42, 0xdd, 0xbe, 0xb1, 0xc0, 0x29, 0x04, 0x53, 0x72, 0x5f, 0xef, 0xd5, 0x4e, 0x25, 0xd1, 0x39, + 0xca, 0xb0, 0x96, 0x18, 0xeb, 0xb0, 0x90, 0x59, 0x40, 0xba, 0x40, 0x76, 0x7a, 0x1e, 0xcd, 0xa5, 0xce, 0xee, 0x36, 0x43, 0x34, 0xfd, 0x5f, 0x9f, 0xdb, 0x94, 0xcf, 0xbd, 0x8c, 0x5e, 0x29, 0xad, + 0x76, 0x43, 0xf9, 0x06, 0x98, 0xa6, 0x4c, 0xc6, 0xc8, 0xb0, 0x12, 0x6b, 0x84, 0x6a, 0xcc, 0x97, 0x12, 0x2d, 0x3a, 0xdb, 0xd2, 0x53, 0x8a, 0x95, 0x8f, 0x8f, 0x20, 0x66, 0xcb, 0xf8, 0xc4, 0x84, + 0x44, 0x7b, 0x0a, 0x34, 0xf7, 0x9c, 0xb6, 0x8c, 0x3b, 0x68, 0xb7, 0xec, 0x5a, 0x1e, 0x91, 0x13, 0xe3, 0xd4, 0xa9, 0xa8, 0xb9, 0xf1, 0xa7, 0xbc, 0x07, 0xce, 0x0a, 0x40, 0xf0, 0x6d, 0x4b, 0xee, + 0x90, 0xcd, 0xf6, 0xd8, 0x72, 0xbb, 0x3d, 0xe7, 0x36, 0x7e, 0xc7, 0xcd, 0xf7, 0xe0, 0x6c, 0x08, 0x2e, 0xef, 0x91, 0x2f, 0x66, 0x55, 0x85, 0xfe, 0x33, 0x59, 0x1c, 0x79, 0x29, 0xf8, 0xf8, 0x86, + 0x32, 0x30, 0xbe, 0x6d, 0x9f, 0x3d, 0xb1, 0x7e, 0x0d, 0x41, 0x66, 0xc4, 0xb4, 0x3e, 0x4e, 0x0d, 0x3d, 0xc0, 0x81, 0xd9, 0x7e, 0xd3, 0xaa, 0x62, 0x55, 0x32, 0x2d, 0x56, 0xc1, 0xf3, 0x15, 0x77, + 0x77, 0x98, 0x78, 0x27, 0x1e, 0x66, 0x55, 0xf1, 0x63, 0x26, 0x87, 0x57, 0x6c, 0x7b, 0xb7, 0xb4, 0xbf, 0x7a, 0xf2, 0x7e, 0x63, 0x7c, 0x21, 0xfb, 0xfb, 0x18, 0xd3, 0x39, 0xdc, 0xe3, 0xa0, 0xa5, + 0x31, 0xed, 0x3a, 0xc9, 0xe9, 0x91, 0xde, 0x4b, 0x69, 0x61, 0x68, 0xa2, 0x8b, 0x63, 0xa3, 0xc3, 0x4c, 0x4e, 0x49, 0x95, 0x35, 0x16, 0x3b, 0xff, 0x48, 0xd8, 0xcd, 0x88, 0x5d, 0x94, 0x7b, 0xd8, + 0x58, 0xd0, 0xc0, 0xa4, 0xe6, 0x4e, 0x23, 0x7f, 0x6f, 0x19, 0x94, 0xa2, 0xad, 0x2a, 0x98, 0xc3, 0x75, 0xe7, 0xc8, 0x5b, 0x7c, 0x80, 0xed, 0x67, 0x75, 0x98, 0x12, 0x3a, 0xf8, 0xed, 0x58, 0xf5, + 0xf1, 0x71, 0x3f, 0x69, 0x99, 0xff, 0xfc, 0x5c, 0xf9, 0x49, 0xf5, 0xaa, 0xfb, 0x17, 0x4d, 0xf3, 0x80, 0xf3, 0xe4, 0xc4, 0x3e, 0x2d, 0xaa, 0x13, 0xed, 0xd7, 0x69, 0x88, 0x31, 0xd8, 0xc2, 0x93, + 0x65, 0x06, 0xde, 0x2c, 0x0a, 0x54, 0x66, 0xe1, 0xa4, 0x6b, 0x6b, 0xcb, 0x07, 0x0b, 0x50, 0x82, 0x5c, 0x50, 0x6a, 0x95, 0xc3, 0x72, 0x6a, 0xbb, 0xab, 0xe3, 0x88, 0x85, 0x1d, 0x4f, 0x8e, 0x52, + 0xc8, 0x62, 0x17, 0x9c, 0x36, 0x5f, 0x52, 0x8b, 0x99, 0xd8, 0x9e, 0x46, 0x39, 0x6e, 0xa3, 0x26, 0xa6, 0x35, 0x11, 0xef, 0x38, 0xaf, 0xd9, 0x68, 0x7e, 0xf1, 0x73, 0x76, 0x5c, 0x2f, 0xcc, 0xdc, + 0x71, 0x51, 0xe6, 0x85, 0x5b, 0xd6, 0x97, 0xb3, 0xc3, 0xdf, 0x3f, 0x95, 0x98, 0x7c, 0xc7, 0xe2, 0x47, 0xc3, 0xea, 0xff, 0xc1, 0xe2, 0x79, 0xb7, 0xaa, 0x5e, 0xb5, 0x86, 0xa6, 0x0c, 0xd9, 0x36, + 0x33, 0x4a, 0x56, 0x79, 0x95, 0x2b, 0x13, 0x66, 0xcf, 0x7b, 0x34, 0xdb, 0x2f, 0x50, 0xab, 0x10, 0x9a, 0x49, 0xad, 0xd7, 0x93, 0x63, 0x1b, 0x6d, 0x1d, 0x89, 0x11, 0x47, 0x4b, 0x57, 0x01, 0x93, + 0xad, 0x85, 0xb0, 0xf8, 0x4e, 0xc2, 0xc0, 0xb9, 0xb9, 0x38, 0x06, 0xcd, 0xd6, 0x6f, 0x64, 0x78, 0xbf, 0x1a, 0xad, 0xa2, 0xf8, 0xc4, 0x75, 0x7c, 0x5f, 0x6d, 0xa7, 0x46, 0x5c, 0x33, 0xa9, 0x17, + 0x6c, 0xbe, 0x05, 0x70, 0x5e, 0x3e, 0xec, 0x9f, 0x5f, 0xb9, 0xc7, 0x9f, 0x9b, 0x35, 0x6e, 0x28, 0x7f, 0x42, 0xf0, 0xcf, 0x15, 0xf7, 0x18, 0xe0, 0xd8, 0x1c, 0x1e, 0x15, 0x78, 0x33, 0x55, 0xe8, + 0x7d, 0x35, 0x2b, 0x4e, 0xa1, 0x2a, 0xe8, 0x6c, 0xba, 0x1b, 0xc1, 0x14, 0x5d, 0xec, 0xf7, 0xee, 0x94, 0x09, 0x27, 0xdc, 0xc8, 0x43, 0xdc, 0x91, 0xb9, 0x5e, 0xce, 0x68, 0x33, 0x9f, 0x9a, 0xe9, + 0x52, 0xda, 0xa1, 0x6b, 0x90, 0xe7, 0x51, 0x1b, 0xd8, 0xa8, 0x38, 0xe9, 0x22, 0x58, 0x53, 0xcf, 0x8f, 0xf0, 0x6a, 0x83, 0x13, 0xc1, 0x71, 0x45, 0xa2, 0x7b, 0x39, 0x65, 0x9b, 0x97, 0x1c, 0x9b, + 0xc1, 0xa1, 0xb3, 0xec, 0xea, 0xb1, 0xc7, 0xb5, 0xc3, 0xae, 0x1e, 0xb8, 0x9d, 0x7c, 0x3f, 0x16, 0x15, 0xc8, 0xb3, 0x71, 0xe6, 0xd6, 0xe3, 0x24, 0xac, 0x6a, 0xf7, 0xd9, 0x40, 0xbd, 0x66, 0x7f, + 0xba, 0xa1, 0xfc, 0x36, 0x50, 0xd7, 0xed, 0x21, 0xb6, 0xa8, 0xb3, 0xe6, 0x15, 0xa2, 0x25, 0xfd, 0x84, 0x57, 0x80, 0x94, 0xd8, 0x64, 0xbb, 0x50, 0x3b, 0x76, 0x2f, 0xa7, 0x31, 0xbf, 0xe0, 0x9c, + 0x23, 0xc2, 0xca, 0x0d, 0xd3, 0x26, 0xf9, 0x3c, 0x13, 0xf5, 0x35, 0xbc, 0x71, 0x48, 0x72, 0x0e, 0x99, 0x95, 0x8e, 0xd0, 0xb5, 0x17, 0xec, 0x3b, 0x77, 0xa2, 0xee, 0xe2, 0x6c, 0x63, 0xc6, 0x33, + 0xc5, 0x58, 0x64, 0x56, 0x1f, 0xd4, 0x30, 0x13, 0x75, 0x13, 0x0e, 0xa2, 0x0e, 0xcb, 0xef, 0xac, 0xf1, 0x92, 0x28, 0xf0, 0x89, 0xd9, 0xe6, 0x95, 0x9d, 0x21, 0xb3, 0xdd, 0x73, 0x97, 0x6d, 0x77, + 0x0c, 0xfd, 0x5e, 0xe7, 0x19, 0x1a, 0xef, 0x16, 0x95, 0x59, 0x4c, 0x76, 0x3b, 0x5a, 0xad, 0x24, 0xbe, 0x5a, 0x12, 0xd9, 0x72, 0x8e, 0x62, 0xd3, 0xc9, 0xde, 0x24, 0x1e, 0xbb, 0x48, 0xff, 0x32, + 0xcf, 0x7e, 0xcd, 0x6f, 0x98, 0xb7, 0x6e, 0x99, 0xe4, 0xa6, 0xf3, 0x36, 0xd7, 0x6a, 0xf7, 0xe7, 0xfc, 0x14, 0xf0, 0x2b, 0x6c, 0xea, 0x3b, 0xfd, 0x37, 0x3c, 0xbe, 0xdf, 0x3d, 0x2b, 0x8e, 0x07, + 0xb0, 0x2d, 0x93, 0xe1, 0xfd, 0x03, 0xb6, 0xf7, 0x13, 0x27, 0x26, 0x37, 0x84, 0x5d, 0x4c, 0xa3, 0x78, 0x06, 0xa4, 0xde, 0x76, 0xd6, 0x84, 0x31, 0xb8, 0x35, 0x5a, 0xcd, 0x24, 0x93, 0x62, 0x1d, + 0xc8, 0xca, 0xc8, 0x73, 0x8b, 0xc3, 0xa4, 0xd3, 0x67, 0x69, 0x2e, 0x4a, 0xc5, 0x3a, 0xf2, 0x56, 0xe8, 0x4c, 0x9f, 0x76, 0x9d, 0x92, 0xaf, 0x72, 0x55, 0xa8, 0x50, 0x57, 0x10, 0x3a, 0xcf, 0x0b, + 0xa0, 0x03, 0x92, 0x8d, 0x06, 0x78, 0x3f, 0x98, 0x4d, 0x9d, 0xdb, 0x66, 0x96, 0xbd, 0xab, 0xda, 0x91, 0x1b, 0x0f, 0xe3, 0x3b, 0xaf, 0xa1, 0x8f, 0x24, 0xe1, 0x0f, 0x11, 0xbf, 0x2b, 0x36, 0xf3, + 0x6c, 0x9d, 0xfd, 0xf9, 0x5c, 0xbb, 0x26, 0x0c, 0x8c, 0x6f, 0x9a, 0x43, 0x33, 0xbd, 0x55, 0xd8, 0x64, 0x7f, 0xe4, 0x0d, 0xa4, 0x2f, 0x6a, 0xc8, 0x75, 0x0c, 0xdd, 0xe8, 0xdb, 0xe0, 0xb0, 0x34, + 0xd1, 0xa6, 0x15, 0x6d, 0xa8, 0xed, 0x54, 0x13, 0x64, 0x41, 0xd2, 0xa9, 0x19, 0xc3, 0x17, 0xb9, 0xd9, 0x3a, 0x22, 0x18, 0xcb, 0xb5, 0xe8, 0xd1, 0x3a, 0xf6, 0x59, 0xc3, 0x26, 0x82, 0x11, 0x09, + 0x4e, 0x05, 0x96, 0xde, 0xf0, 0x4a, 0x82, 0x98, 0xd1, 0x0a, 0x22, 0xd3, 0x6d, 0xa9, 0x19, 0xc9, 0x90, 0x20, 0x85, 0x3b, 0xdf, 0xd2, 0x47, 0xa0, 0xa0, 0x37, 0x07, 0xe1, 0xc1, 0xa0, 0x5c, 0x11, + 0x7e, 0x03, 0xe5, 0xaa, 0x39, 0x46, 0xbf, 0x1d, 0x80, 0x1f, 0x82, 0x12, 0x4f, 0x2c, 0x27, 0x85, 0x33, 0x78, 0x5a, 0xc7, 0xa7, 0xa3, 0x1d, 0xc9, 0x6c, 0x4f, 0x4e, 0x8f, 0x78, 0xec, 0x69, 0xc7, + 0x84, 0x73, 0xfc, 0xca, 0x12, 0x4a, 0x70, 0x15, 0x1b, 0x76, 0x47, 0x57, 0x9b, 0xc2, 0x32, 0x51, 0x9b, 0x8c, 0x0e, 0xf3, 0x1a, 0x62, 0x13, 0x7b, 0x1e, 0xb0, 0x54, 0x7b, 0xa4, 0x19, 0x5b, 0x21, + 0xa1, 0xa5, 0xc6, 0x35, 0x5d, 0x1e, 0x46, 0x06, 0x8c, 0x1e, 0xdd, 0xe3, 0x94, 0x7b, 0x2d, 0x70, 0xf5, 0x52, 0xdd, 0xea, 0xef, 0xff, 0xb9, 0xad, 0x65, 0x75, 0x7e, 0xfc, 0xd2, 0xf3, 0xb1, 0xd9, + 0xd4, 0xc1, 0xb8, 0xce, 0x63, 0xf7, 0x63, 0x9a, 0x82, 0x4f, 0x1e, 0xbc, 0x1c, 0x72, 0x2e, 0xa5, 0xf0, 0xef, 0x1c, 0x48, 0xaf, 0x9c, 0x54, 0xe0, 0x3f, 0x53, 0x9d, 0xfe, 0xaa, 0xf0, 0xf9, 0xbf, + 0x4e, 0x2a, 0x9f, 0xf5, 0x02, 0x9e, 0xea, 0x1d, 0xfe, 0x9c, 0xc9, 0xbe, 0x51, 0x3c, 0x4f, 0xee, 0x38, 0xbf, 0xe8, 0x1d, 0x06, 0xf0, 0x51, 0x24, 0xd8, 0x90, 0xb8, 0x70, 0x42, 0x7a, 0xc3, 0x76, + 0xa7, 0x15, 0x72, 0x72, 0x88, 0x7d, 0x9f, 0x17, 0x87, 0x4e, 0x6b, 0x81, 0xd3, 0x6a, 0x1b, 0x68, 0x10, 0x99, 0xe0, 0x5b, 0x25, 0x9d, 0x1f, 0x20, 0x0c, 0x9d, 0xd0, 0x2e, 0x0b, 0x8f, 0xa8, 0x4e, + 0x53, 0xda, 0x51, 0xe2, 0xae, 0xdc, 0x0d, 0x34, 0x59, 0x64, 0x01, 0xdc, 0x79, 0xd6, 0x21, 0xef, 0x34, 0x61, 0x3f, 0x67, 0x78, 0xb0, 0x47, 0x6a, 0x53, 0xff, 0x66, 0x80, 0x7b, 0x50, 0x4f, 0xf0, + 0x69, 0xbf, 0x5f, 0xe8, 0xf6, 0x2d, 0xf1, 0x33, 0x04, 0xb7, 0xb7, 0x86, 0x18, 0xb9, 0xa1, 0xf1, 0x12, 0x6c, 0x64, 0x93, 0xde, 0x6a, 0x5b, 0x61, 0x84, 0xbb, 0xd5, 0xb4, 0x24, 0x94, 0xc2, 0xcc, + 0x82, 0xda, 0xde, 0x43, 0x03, 0x2a, 0x27, 0x9f, 0x5f, 0xf9, 0x11, 0x94, 0xf3, 0xac, 0x73, 0x7f, 0x6e, 0xa8, 0xfa, 0x22, 0xfb, 0xd1, 0xad, 0x4b, 0x5d, 0x31, 0x68, 0x98, 0xb9, 0x6a, 0xb3, 0x58, + 0xf7, 0x82, 0x46, 0x51, 0x94, 0x20, 0x8d, 0x4e, 0x08, 0xde, 0x13, 0x93, 0x19, 0x48, 0x39, 0xe0, 0x69, 0x6f, 0xe1, 0xc5, 0x8c, 0x3c, 0xad, 0x76, 0x39, 0x10, 0x4f, 0x75, 0xdd, 0xd1, 0xfd, 0x42, + 0x87, 0x01, 0x98, 0xaa, 0xf8, 0x2a, 0xae, 0xd6, 0xe5, 0x01, 0x4b, 0x78, 0xfa, 0x58, 0x9e, 0x4a, 0x8d, 0xcf, 0x20, 0x37, 0x5a, 0xa1, 0xf9, 0xac, 0xc0, 0xcd, 0xa0, 0xe5, 0x19, 0x71, 0x81, 0x0f, + 0x2a, 0x26, 0x52, 0x84, 0x76, 0xfe, 0x93, 0xd5, 0x1e, 0x7e, 0x29, 0x08, 0xef, 0x93, 0xea, 0x1b, 0x18, 0x1f, 0xd7, 0xe7, 0x5a, 0xd2, 0x03, 0x18, 0x78, 0xa2, 0x43, 0x22, 0x20, 0x84, 0xeb, 0xd5, + 0x1c, 0xee, 0xf9, 0x16, 0xe8, 0x27, 0x04, 0xb4, 0xe3, 0x95, 0xc5, 0xc8, 0x00, 0x61, 0x6b, 0xee, 0x57, 0x4b, 0xaf, 0x3d, 0xe6, 0xfb, 0xbd, 0x87, 0x06, 0x58, 0xdc, 0x12, 0xf9, 0x68, 0x97, 0x56, + 0x69, 0xaf, 0x1f, 0xca, 0x59, 0xa7, 0xa3, 0x93, 0x6a, 0xeb, 0xf3, 0x47, 0x0a, 0x39, 0x52, 0xce, 0x01, 0xdc, 0x9d, 0xd4, 0x6c, 0xef, 0xb1, 0x2e, 0x59, 0xca, 0xad, 0x3e, 0x0c, 0x8b, 0xec, 0xd9, + 0x4a, 0x47, 0xff, 0x81, 0x26, 0x2f, 0x24, 0xa5, 0x78, 0xa3, 0x78, 0x86, 0x20, 0xcb, 0xc7, 0x17, 0x12, 0xbf, 0x77, 0xbf, 0x5e, 0x9f, 0xd0, 0x83, 0xe6, 0xc7, 0x01, 0xc1, 0x75, 0x5b, 0xff, 0xb0, + 0x87, 0x80, 0x5c, 0x0f, 0x27, 0x6e, 0xe0, 0x25, 0xb0, 0x4e, 0xd0, 0x60, 0x43, 0x9f, 0x28, 0x8a, 0xab, 0x48, 0x17, 0x43, 0xd8, 0x30, 0xa3, 0x64, 0x26, 0x72, 0xb8, 0x92, 0x13, 0x17, 0xbb, 0xc2, + 0x36, 0x84, 0x42, 0x08, 0x6d, 0x7f, 0xa2, 0x69, 0x93, 0xa9, 0x03, 0xac, 0x36, 0xa2, 0x91, 0xe6, 0x88, 0xe8, 0xab, 0xf0, 0x3e, 0x1e, 0xe0, 0x01, 0x73, 0xf6, 0x9a, 0x2f, 0x5d, 0xe7, 0x23, 0x24, + 0xf8, 0xde, 0xb8, 0x73, 0x79, 0xa0, 0x32, 0x3d, 0xf7, 0xdd, 0xf9, 0x3d, 0xf4, 0x2e, 0x06, 0x45, 0xf8, 0x1f, 0xf0, 0x2a, 0x16, 0x7b, 0x68, 0xe0, 0x83, 0x97, 0x98, 0x75, 0x55, 0x7f, 0x14, 0x2e, + 0x04, 0xff, 0x81, 0x6e, 0xce, 0xed, 0x67, 0xc4, 0xaa, 0xda, 0x19, 0x57, 0x6e, 0x19, 0x9e, 0x95, 0x6f, 0xef, 0xe9, 0x9a, 0xbe, 0x99, 0x18, 0x0f, 0x4d, 0x68, 0xc7, 0x63, 0x2f, 0x2f, 0x53, 0xb3, + 0x1e, 0x37, 0x99, 0x5b, 0xd9, 0x66, 0x71, 0x19, 0x97, 0xf3, 0x6e, 0x7a, 0x9b, 0xda, 0x38, 0xcf, 0x42, 0x7b, 0x6c, 0xe5, 0xf9, 0x57, 0x39, 0xc0, 0x27, 0x01, 0xaa, 0x4f, 0xde, 0xff, 0x58, 0xfd, + 0xfa, 0x8a, 0x0e, 0xea, 0xd1, 0x0b, 0x3e, 0x66, 0xca, 0xdd, 0xed, 0xb3, 0xe5, 0x71, 0xc0, 0xba, 0xa1, 0x0e, 0x7b, 0xa4, 0xe8, 0x16, 0x42, 0x59, 0x4f, 0xb8, 0x86, 0x9f, 0xcd, 0x54, 0x92, 0x53, + 0x41, 0x25, 0x9e, 0xc6, 0x12, 0xa0, 0xdb, 0x73, 0x6e, 0xea, 0x6d, 0x05, 0xaa, 0xf7, 0xe7, 0x3c, 0xdc, 0xaf, 0xa7, 0xb4, 0xb7, 0x07, 0x5b, 0x2b, 0xa4, 0x09, 0xda, 0x5a, 0xfb, 0x49, 0x76, 0x72, + 0xc5, 0x6a, 0x4b, 0xa0, 0x6c, 0x9f, 0x99, 0x2e, 0xca, 0xed, 0x16, 0x08, 0x56, 0x18, 0xe4, 0xd4, 0x6c, 0x95, 0xf2, 0xdb, 0x99, 0xab, 0x28, 0xcf, 0xe2, 0xc4, 0xf8, 0xad, 0x6f, 0x4f, 0x79, 0xc6, + 0x2b, 0x0a, 0xe9, 0x6b, 0xc2, 0x6f, 0x48, 0x5c, 0x35, 0x87, 0x79, 0x70, 0xa0, 0xb2, 0x08, 0xb6, 0xe8, 0xfe, 0x10, 0x91, 0x19, 0x48, 0x6f, 0x01, 0x75, 0xe6, 0x38, 0x64, 0x8e, 0xfb, 0x06, 0xbc, + 0xb6, 0x07, 0xac, 0xfd, 0xd2, 0xad, 0xeb, 0xd3, 0xd8, 0x3a, 0xd5, 0x4f, 0x3d, 0xe2, 0xa6, 0x2f, 0x79, 0x42, 0x5e, 0x13, 0xbe, 0x74, 0xeb, 0xb3, 0x39, 0x9e, 0x0e, 0xf3, 0x8c, 0x5c, 0x2e, 0x3b, + 0x70, 0x42, 0x28, 0x69, 0x49, 0x1e, 0x96, 0x2c, 0x9e, 0x9a, 0x00, 0xc6, 0x6f, 0x26, 0xd5, 0xa2, 0x07, 0xb4, 0x53, 0xed, 0xd4, 0xeb, 0x12, 0x44, 0x10, 0x40, 0x54, 0xd7, 0x35, 0x0d, 0x76, 0x2c, + 0x91, 0x58, 0xc4, 0xff, 0xc7, 0xde, 0x7b, 0x34, 0xa9, 0xcd, 0x75, 0xed, 0xc2, 0xf3, 0xf7, 0x57, 0xb8, 0x3c, 0x55, 0x71, 0x2b, 0xa1, 0xf4, 0xcd, 0x04, 0x02, 0x81, 0x22, 0x20, 0x82, 0xa4, 0xc1, + 0xf3, 0x95, 0x72, 0xce, 0x99, 0xaa, 0x73, 0xff, 0xf6, 0x53, 0x40, 0xb7, 0x4d, 0x37, 0xd0, 0x8d, 0x79, 0xfc, 0xce, 0xce, 0xc0, 0x65, 0x6d, 0x49, 0xbd, 0xc4, 0x5e, 0x3b, 0xad, 0x78, 0xad, 0x50, + 0x28, 0xa8, 0x9a, 0x1b, 0x96, 0xfd, 0xae, 0xab, 0xd7, 0xdc, 0xa2, 0x33, 0x4a, 0x64, 0x52, 0xd4, 0x01, 0x3d, 0x0e, 0xa6, 0x07, 0xa5, 0xcb, 0x28, 0x4e, 0x88, 0x8e, 0xb7, 0xca, 0x74, 0x5e, 0x66, + 0x96, 0x53, 0x55, 0xa3, 0xd4, 0xe9, 0xeb, 0xd3, 0x92, 0x32, 0x4a, 0xef, 0xab, 0x70, 0x9c, 0x17, 0xce, 0xff, 0x3b, 0x1f, 0x38, 0x73, 0xe4, 0xf6, 0xf6, 0xb3, 0x85, 0x8d, 0xd0, 0xac, 0xd9, 0xc9, + 0xf9, 0xda, 0xaf, 0xbd, 0xd2, 0x94, 0x0d, 0x98, 0xe0, 0x08, 0xa0, 0xe9, 0xe5, 0x6d, 0xbe, 0xdc, 0x6a, 0x07, 0x83, 0x5d, 0x11, 0x20, 0xed, 0x67, 0x1b, 0x14, 0xa0, 0x01, 0x10, 0x76, 0xa8, 0x2a, + 0x2a, 0x8f, 0x4e, 0xcc, 0x06, 0xa0, 0xad, 0x1e, 0x67, 0xda, 0xd0, 0x9a, 0x7d, 0x63, 0xce, 0xe6, 0xf8, 0x21, 0x45, 0x86, 0xbc, 0xb2, 0xb6, 0x7c, 0xc0, 0x73, 0xf3, 0x79, 0x0a, 0x1b, 0xcf, 0xc4, + 0x8c, 0xe6, 0x65, 0xe6, 0x95, 0x4e, 0xf5, 0x15, 0x83, 0x5e, 0x38, 0x2d, 0xde, 0x88, 0x5e, 0x98, 0x72, 0xbe, 0x3c, 0x33, 0xe2, 0x89, 0x43, 0x83, 0x58, 0x05, 0x8b, 0x5a, 0x88, 0x63, 0x4c, 0xb0, + 0x53, 0x7e, 0x29, 0x76, 0x30, 0x04, 0x2d, 0x01, 0xb2, 0xe7, 0xd4, 0x0d, 0xe6, 0x1d, 0x90, 0x75, 0x77, 0xd0, 0xa2, 0x2d, 0x1e, 0x70, 0xad, 0x01, 0x99, 0x6a, 0x50, 0xeb, 0xbc, 0x01, 0xaa, 0x62, + 0xa9, 0x98, 0x76, 0xe2, 0xa1, 0x25, 0xa2, 0xa6, 0x46, 0x60, 0x1f, 0xa9, 0x75, 0x93, 0xd8, 0xd0, 0x7e, 0x65, 0x88, 0xa5, 0x1e, 0xcf, 0xa9, 0x3d, 0x55, 0xdd, 0x58, 0x07, 0xf3, 0x32, 0x4b, 0x46, + 0x56, 0x1c, 0x3c, 0x2e, 0x1f, 0x0d, 0xbf, 0x06, 0xe2, 0x78, 0x45, 0xf8, 0xd2, 0xf9, 0xf7, 0xd6, 0x08, 0x7e, 0x12, 0xcd, 0x71, 0xd1, 0x6f, 0xe9, 0xd2, 0xc4, 0xdd, 0x48, 0x4e, 0xeb, 0xf5, 0x22, + 0xdb, 0xb0, 0x6d, 0x3b, 0x2e, 0x6c, 0x70, 0x12, 0x65, 0x65, 0x18, 0x07, 0x41, 0x23, 0x23, 0x8d, 0x72, 0x98, 0x22, 0xfc, 0x14, 0x26, 0xc4, 0xdd, 0x96, 0xd7, 0xea, 0xfa, 0x60, 0x33, 0x99, 0xaa, + 0x82, 0x6d, 0x2f, 0xfb, 0x6b, 0x3b, 0xca, 0x66, 0xd3, 0x99, 0x48, 0x4d, 0x26, 0x0b, 0x28, 0x0f, 0x91, 0x98, 0x64, 0xc9, 0xc8, 0x69, 0xf1, 0x27, 0x32, 0x03, 0x6b, 0x3b, 0xf0, 0xde, 0x0b, 0xeb, + 0x42, 0x8f, 0xcd, 0x75, 0x79, 0x99, 0xf5, 0xc3, 0xc8, 0xb0, 0xed, 0x47, 0x79, 0x16, 0xaf, 0x85, 0x47, 0xfd, 0x26, 0x7b, 0x61, 0xdb, 0x5b, 0xe3, 0xd9, 0x20, 0xa9, 0x38, 0x5e, 0x57, 0xa2, 0xa0, + 0xec, 0x98, 0xdd, 0x6a, 0x3b, 0x1e, 0x87, 0x76, 0xb9, 0x03, 0x65, 0x94, 0x28, 0xe2, 0x34, 0x70, 0x83, 0x9a, 0x59, 0x01, 0x7a, 0x57, 0x26, 0x89, 0x6e, 0x65, 0x0a, 0x3f, 0x08, 0x7c, 0x5b, 0xeb, + 0x7d, 0x3e, 0xec, 0xa1, 0x14, 0x01, 0x4d, 0x06, 0x94, 0xc6, 0xf5, 0x84, 0xa6, 0x75, 0xd0, 0xe3, 0x66, 0xb6, 0xbe, 0x23, 0x78, 0xb1, 0x34, 0x32, 0x1e, 0x06, 0x54, 0x8d, 0x7e, 0x46, 0xd4, 0xc8, + 0xca, 0xce, 0x28, 0xed, 0x4b, 0xf7, 0x6e, 0x24, 0x83, 0xeb, 0xa2, 0x02, 0x6f, 0x15, 0x04, 0xee, 0xf3, 0xf4, 0x43, 0x60, 0xd3, 0x23, 0xc3, 0xcc, 0x9f, 0xa3, 0xc4, 0x5c, 0xd1, 0x3d, 0x71, 0xf5, + 0x77, 0xeb, 0x59, 0x7c, 0x18, 0x82, 0x60, 0xf4, 0xae, 0x5f, 0x27, 0x3d, 0x9f, 0x36, 0xa8, 0xb1, 0xc1, 0xc6, 0xc8, 0x0e, 0x50, 0xc9, 0xf9, 0x90, 0x4b, 0x47, 0xd3, 0xe5, 0x80, 0x29, 0xa6, 0xae, + 0x99, 0x08, 0x6d, 0x0e, 0xe1, 0xa1, 0x4f, 0x71, 0x18, 0x83, 0x8d, 0xa5, 0xc8, 0xd6, 0xfe, 0x41, 0xdb, 0xa8, 0xdb, 0x62, 0x0b, 0xcf, 0xb0, 0x8c, 0x6b, 0x3d, 0x20, 0x0e, 0x0d, 0x03, 0x91, 0xb9, + 0x00, 0xd8, 0xbb, 0xed, 0x54, 0x5e, 0x3f, 0x05, 0xaf, 0x96, 0x37, 0xc9, 0xa3, 0x33, 0xf9, 0x35, 0x27, 0xf1, 0x89, 0xe0, 0x89, 0x07, 0x4d, 0x92, 0x3f, 0xeb, 0x10, 0x16, 0x3a, 0x7d, 0x00, 0x72, + 0x54, 0x99, 0x57, 0xf0, 0x6a, 0xa8, 0x6d, 0x30, 0xd4, 0xac, 0x7a, 0xdc, 0xe5, 0xed, 0x98, 0x5a, 0x04, 0xda, 0xb4, 0xb0, 0xa9, 0x4d, 0x6c, 0x61, 0xfa, 0xde, 0x8e, 0xa0, 0x3d, 0x40, 0x6a, 0xc7, + 0x16, 0x0f, 0x37, 0xd8, 0x24, 0x8e, 0xd0, 0xed, 0x26, 0x59, 0x09, 0xb0, 0x5b, 0xe3, 0xd4, 0xb6, 0x5f, 0x41, 0x4b, 0x51, 0x67, 0x39, 0xe0, 0xb0, 0x9a, 0xef, 0x90, 0xc9, 0xdc, 0xef, 0x5e, 0xf3, + 0x0d, 0x9d, 0xc4, 0x87, 0xcc, 0xfd, 0x58, 0x00, 0xfa, 0x93, 0xf4, 0xf8, 0xa1, 0xd4, 0xcc, 0xa3, 0x79, 0xd6, 0xa4, 0x83, 0x95, 0x3d, 0x84, 0xab, 0x7b, 0x0d, 0xc9, 0xf9, 0x9d, 0xe8, 0x99, 0xbb, + 0x97, 0xcb, 0x67, 0x50, 0x9c, 0xcf, 0xa1, 0x8d, 0x9b, 0x6a, 0x13, 0xda, 0x2e, 0x10, 0x62, 0x49, 0x0c, 0x0c, 0x20, 0xce, 0xf2, 0x8b, 0x95, 0x6e, 0x96, 0x73, 0x90, 0xcc, 0x11, 0xcd, 0x33, 0x20, + 0x6e, 0x55, 0xdb, 0xc5, 0x76, 0xa9, 0x21, 0xaa, 0x83, 0x65, 0x3e, 0xb7, 0x62, 0xa8, 0xca, 0x60, 0x38, 0x4e, 0x58, 0xb5, 0x39, 0x05, 0x48, 0xca, 0x24, 0x2f, 0xf7, 0xad, 0xd3, 0xda, 0xaa, 0x3e, + 0x98, 0x69, 0x88, 0x58, 0x2d, 0x29, 0xcf, 0x6c, 0xe8, 0x76, 0xaf, 0x6f, 0x72, 0xe3, 0x2f, 0xf7, 0x38, 0x37, 0xce, 0xbd, 0xcd, 0x8d, 0x67, 0x7b, 0x1a, 0xc3, 0xa1, 0x44, 0x57, 0xf9, 0x72, 0xa2, + 0xcc, 0x0b, 0x73, 0x0b, 0x0c, 0x00, 0x36, 0xcf, 0xaa, 0x2c, 0x94, 0xf2, 0x7d, 0x3e, 0xa7, 0xc6, 0x69, 0xbc, 0x04, 0x3a, 0x66, 0x97, 0x17, 0x2b, 0xca, 0x49, 0x3b, 0x79, 0xeb, 0x2e, 0x7a, 0xca, + 0x85, 0x3c, 0x1f, 0x4b, 0x27, 0x14, 0xde, 0xc6, 0x00, 0x3e, 0x6c, 0xf3, 0x8a, 0xab, 0x86, 0xdc, 0x91, 0xca, 0xce, 0x3d, 0xae, 0x4a, 0xbe, 0x59, 0x4c, 0xc6, 0xf0, 0x6b, 0x41, 0x9c, 0x17, 0xbd, + 0x62, 0xe4, 0x65, 0xc6, 0x65, 0xaf, 0xff, 0x02, 0x03, 0xbd, 0x78, 0x24, 0x15, 0xe0, 0xff, 0xc0, 0xaf, 0x1c, 0x8e, 0xc5, 0x49, 0x20, 0x28, 0xaa, 0xd1, 0xe5, 0xcf, 0xbf, 0xe7, 0x9a, 0x88, 0x21, + 0xe4, 0x22, 0xf7, 0xf1, 0xae, 0x52, 0xf6, 0xf2, 0x24, 0xd0, 0x76, 0x29, 0xeb, 0x02, 0x3c, 0x48, 0x74, 0x90, 0x2f, 0x55, 0x7e, 0x05, 0xda, 0x0d, 0x5b, 0x49, 0xea, 0x6a, 0x37, 0x15, 0x16, 0x98, + 0x4a, 0x17, 0xe1, 0xac, 0x0e, 0x56, 0x6c, 0x27, 0xc9, 0x92, 0xb0, 0x87, 0xea, 0xc9, 0x82, 0x94, 0x32, 0xd6, 0x84, 0x92, 0x96, 0xc1, 0xb8, 0xc6, 0x4c, 0x77, 0xdb, 0xb2, 0x09, 0x79, 0x66, 0xfb, + 0xc4, 0xae, 0xfe, 0x27, 0x85, 0x63, 0x8a, 0xc6, 0x69, 0x9c, 0x51, 0x12, 0x58, 0x65, 0x56, 0x1b, 0x55, 0xf4, 0x85, 0x0f, 0xe3, 0xcf, 0xc5, 0xa8, 0x4f, 0xb4, 0x4f, 0xcc, 0xfb, 0x78, 0xe7, 0xec, + 0xbb, 0x78, 0x42, 0xa8, 0x92, 0x1a, 0x43, 0x52, 0x0c, 0xdc, 0x8d, 0xf9, 0x2d, 0xc6, 0x19, 0x8a, 0xb6, 0x3e, 0x72, 0x59, 0x04, 0x8d, 0xb9, 0xe3, 0x56, 0x80, 0xa7, 0x34, 0x6e, 0xb0, 0x7e, 0x8b, + 0x95, 0xae, 0x70, 0x40, 0x57, 0x5e, 0x41, 0x03, 0x22, 0x32, 0xf5, 0x73, 0x7d, 0x9d, 0xd2, 0x53, 0xd2, 0x27, 0x83, 0xb1, 0x3e, 0x8f, 0x26, 0x0a, 0xa9, 0x62, 0x9b, 0x22, 0x62, 0x26, 0x0b, 0x9a, + 0x28, 0xc7, 0xbe, 0x13, 0xa2, 0x3c, 0x75, 0xb3, 0xd0, 0x1e, 0x2a, 0xb0, 0xf7, 0x38, 0x32, 0x7e, 0x29, 0x89, 0xe2, 0xfe, 0x27, 0xce, 0x8c, 0xb9, 0xf7, 0xe0, 0x8c, 0xb1, 0xfb, 0x44, 0x7a, 0x45, + 0xad, 0x4d, 0xe1, 0x35, 0xec, 0x7b, 0xc3, 0xa6, 0x59, 0x78, 0x71, 0xb6, 0x07, 0x35, 0xb5, 0x42, 0x3a, 0x18, 0x6b, 0xd2, 0xd5, 0xde, 0x27, 0x0b, 0xb7, 0x01, 0x8b, 0xe9, 0xd6, 0xf5, 0xb7, 0x9a, + 0x91, 0x18, 0x1d, 0xe1, 0x0e, 0x7e, 0x93, 0xf0, 0x06, 0x32, 0xb0, 0xb9, 0xad, 0x64, 0x24, 0xd1, 0x6a, 0x28, 0x52, 0x2e, 0xad, 0x38, 0x04, 0xc6, 0xee, 0x41, 0x5b, 0xab, 0x3b, 0xb1, 0xa2, 0x66, + 0x8b, 0xf6, 0x46, 0x2f, 0x29, 0xad, 0x2f, 0x66, 0xc7, 0x9f, 0x9f, 0xee, 0xa5, 0x05, 0x8e, 0xc0, 0xd2, 0x3a, 0xcf, 0x81, 0x27, 0xce, 0xf2, 0x01, 0x35, 0x59, 0xaf, 0xe0, 0x43, 0x74, 0x3d, 0xb1, + 0x7b, 0xc1, 0x14, 0xa2, 0x2c, 0x89, 0x33, 0x3f, 0x6a, 0x2b, 0x9a, 0xf4, 0x6c, 0x3a, 0xd8, 0xad, 0x63, 0x65, 0xc2, 0xa5, 0x13, 0xdf, 0x4d, 0x81, 0xc9, 0xaa, 0xf7, 0xc6, 0xa6, 0x85, 0x23, 0x36, + 0xb9, 0xb5, 0x26, 0x07, 0x18, 0xeb, 0x8c, 0x96, 0x71, 0x3d, 0xa7, 0x9f, 0x7a, 0x96, 0x65, 0x45, 0xbe, 0xa5, 0xb7, 0x43, 0x37, 0xac, 0xb5, 0x95, 0xfc, 0xda, 0x71, 0x76, 0x41, 0x34, 0xf8, 0x9d, + 0x21, 0x0e, 0x7d, 0xf6, 0x2a, 0x5c, 0xca, 0x80, 0xfd, 0xfc, 0xf7, 0xa6, 0x6c, 0xda, 0x55, 0x36, 0xc9, 0xcf, 0xdb, 0x82, 0xb8, 0x55, 0x5d, 0x06, 0xf9, 0xc5, 0xc5, 0x62, 0x65, 0xc9, 0x7b, 0x49, + 0xa3, 0x9f, 0xff, 0x7e, 0x81, 0x57, 0x54, 0x3a, 0x86, 0x6d, 0x07, 0xe5, 0x63, 0x61, 0xe3, 0x15, 0xdf, 0xcf, 0x3b, 0xd1, 0xd3, 0xf8, 0xbc, 0x5d, 0x8e, 0xd0, 0xe7, 0x7c, 0x3e, 0x96, 0xe8, 0x37, + 0x84, 0x05, 0x92, 0xa5, 0xed, 0x47, 0x0b, 0xf5, 0x50, 0x69, 0x40, 0x56, 0x4d, 0x7c, 0x57, 0x19, 0x20, 0x2e, 0x88, 0xba, 0x7c, 0xc1, 0x83, 0x18, 0x10, 0x24, 0x19, 0x20, 0xe4, 0x8e, 0x51, 0x6d, + 0xe7, 0x64, 0xd6, 0xcc, 0xca, 0x45, 0x19, 0x6b, 0x51, 0xb7, 0x85, 0x00, 0x20, 0x0d, 0x83, 0xa1, 0x61, 0x5a, 0x8b, 0x90, 0xe7, 0x1a, 0xb6, 0x45, 0x9b, 0xa8, 0xd5, 0xc9, 0xe2, 0x61, 0xfd, 0xb1, + 0x6f, 0x46, 0xe9, 0xda, 0xa0, 0x7a, 0x3a, 0x26, 0x90, 0xc7, 0x3c, 0xf4, 0x9c, 0x3e, 0xff, 0x27, 0x2f, 0xb3, 0x3a, 0xab, 0x87, 0xdc, 0xf9, 0xc7, 0x8d, 0x8d, 0x87, 0x1a, 0xf7, 0x45, 0x3c, 0xf9, + 0x73, 0x8e, 0xde, 0xfb, 0xc4, 0x99, 0xbf, 0xf7, 0x1e, 0x9c, 0xd3, 0x49, 0x9e, 0x38, 0x60, 0xb8, 0x60, 0x62, 0x6f, 0x26, 0x05, 0x05, 0x1f, 0x62, 0x8d, 0x68, 0x36, 0x1c, 0x64, 0x57, 0xc4, 0x06, + 0xb0, 0x77, 0x10, 0x12, 0xe0, 0x02, 0x1f, 0x90, 0x25, 0x3a, 0x69, 0xd6, 0xbe, 0xa4, 0xa6, 0x40, 0x94, 0x38, 0x82, 0x04, 0xcc, 0xdc, 0x85, 0xef, 0x86, 0x85, 0xb8, 0x09, 0x2a, 0xf8, 0xc8, 0xf5, + 0x69, 0xdc, 0x90, 0xa4, 0x5f, 0x80, 0x63, 0xbb, 0x87, 0x56, 0x88, 0xbc, 0x42, 0xe9, 0xd5, 0x66, 0xfb, 0x6a, 0x6e, 0xc5, 0x5f, 0x0e, 0xff, 0xb9, 0xef, 0x98, 0xbb, 0xbf, 0x13, 0xbf, 0xe2, 0x5f, + 0xbf, 0x43, 0xff, 0x32, 0x1c, 0x9f, 0xef, 0x8e, 0xc6, 0xcf, 0xf9, 0xd7, 0x71, 0x2f, 0x52, 0xcc, 0xf1, 0x0e, 0x37, 0x0e, 0xdc, 0x64, 0xac, 0xcc, 0x11, 0xbd, 0x15, 0x4c, 0x02, 0x1f, 0xa6, 0x93, + 0xd0, 0x6a, 0x1b, 0x57, 0x9d, 0x14, 0x6d, 0x3b, 0xeb, 0xe1, 0x85, 0x99, 0xf0, 0xab, 0xa8, 0xa9, 0xab, 0x2e, 0x3c, 0xc0, 0xbd, 0xb4, 0xdf, 0x68, 0x10, 0x60, 0x1b, 0x71, 0xb8, 0xd4, 0x36, 0x66, + 0xe6, 0x49, 0x84, 0x0c, 0x39, 0xb5, 0xa6, 0xc4, 0x66, 0x60, 0xcc, 0xd6, 0x83, 0x38, 0xbc, 0xb6, 0x3f, 0x95, 0xd6, 0xaf, 0xfd, 0x85, 0xfc, 0x86, 0xbb, 0x8f, 0x43, 0x36, 0x5f, 0x43, 0x6f, 0xba, + 0x26, 0x7c, 0xcd, 0xcf, 0xa6, 0x8c, 0x9f, 0x45, 0x6e, 0x22, 0x0d, 0x4b, 0x53, 0xd5, 0xed, 0x12, 0xa2, 0xa3, 0x75, 0x8b, 0x6f, 0x68, 0x39, 0x9c, 0xa1, 0xad, 0x6c, 0x2c, 0x55, 0x3d, 0xda, 0x52, + 0x5d, 0x36, 0x16, 0xe4, 0xb9, 0x39, 0xe1, 0xb5, 0xf5, 0x6c, 0x96, 0xa6, 0xa2, 0x34, 0xc9, 0xf9, 0xc2, 0xde, 0x95, 0x4b, 0x5c, 0x19, 0x4b, 0x5b, 0x88, 0x5f, 0x2d, 0x33, 0xf0, 0xb0, 0x6f, 0x39, + 0xac, 0x9e, 0x81, 0x2a, 0x26, 0xcc, 0xc1, 0xed, 0x7a, 0xe7, 0x42, 0x4e, 0xf4, 0xbf, 0xc7, 0xc8, 0x53, 0x17, 0xca, 0xf6, 0x21, 0x76, 0xe2, 0x6b, 0x21, 0x09, 0xbf, 0xc9, 0x9e, 0x99, 0xf8, 0xde, + 0x78, 0x26, 0x1c, 0x01, 0x1e, 0x89, 0xc8, 0xa2, 0x02, 0xc2, 0x21, 0xe9, 0x34, 0x9e, 0x91, 0x69, 0x74, 0xdd, 0x60, 0x7b, 0x96, 0xc4, 0x18, 0x98, 0x90, 0x3f, 0x67, 0xcd, 0xdf, 0x07, 0xd2, 0x79, + 0x64, 0x15, 0xf9, 0xf3, 0x08, 0xa6, 0x3b, 0xf4, 0xcf, 0xfd, 0xb9, 0xb9, 0xfb, 0x6c, 0xf1, 0x04, 0xd5, 0x85, 0xd2, 0x83, 0x83, 0x6f, 0x2a, 0xe7, 0x18, 0xcc, 0xc5, 0x06, 0xa0, 0x73, 0xca, 0x0c, + 0x82, 0x9d, 0x99, 0xe4, 0x71, 0x81, 0x2b, 0x14, 0x98, 0x03, 0x44, 0x47, 0x68, 0xea, 0x0a, 0xe4, 0x26, 0x0b, 0xbf, 0xdc, 0x31, 0xcc, 0xce, 0xef, 0x0c, 0xa0, 0xa5, 0xa5, 0xa1, 0x31, 0x9b, 0xc2, + 0xd5, 0x0f, 0xdb, 0xd6, 0xd9, 0x81, 0x20, 0xa3, 0xed, 0xd9, 0x8a, 0x61, 0x89, 0x0d, 0x2f, 0x80, 0xed, 0xec, 0xc6, 0xf9, 0xfa, 0xd6, 0xbb, 0xc7, 0x23, 0xfa, 0x4a, 0x1e, 0xfa, 0xdb, 0x6b, 0xe7, + 0xfe, 0x9f, 0xaf, 0x46, 0x17, 0x42, 0xdf, 0x77, 0x3a, 0xb0, 0x00, 0x82, 0xd3, 0x82, 0x3d, 0xb9, 0x0f, 0x90, 0xe1, 0xb8, 0x66, 0xe7, 0x07, 0x39, 0x0a, 0x74, 0x06, 0xd3, 0xa9, 0x23, 0x21, 0x23, + 0xba, 0x9f, 0x50, 0xaa, 0x68, 0x6c, 0x7b, 0x9b, 0x9b, 0xf5, 0xbc, 0x51, 0x05, 0xce, 0x7c, 0x5a, 0x02, 0x83, 0xaa, 0x83, 0x87, 0x44, 0xad, 0xac, 0x68, 0x11, 0xf0, 0x31, 0x8c, 0x18, 0x25, 0x34, + 0xe0, 0x6a, 0xa0, 0x32, 0x3d, 0x9a, 0x8c, 0x37, 0x8b, 0x14, 0x7e, 0x6d, 0x41, 0x7c, 0xf0, 0xd9, 0x5e, 0xb6, 0x79, 0xfc, 0xd1, 0xc2, 0xb8, 0x64, 0x4b, 0xc7, 0x41, 0xf4, 0x95, 0x7f, 0xf7, 0x95, + 0x39, 0xf5, 0x9b, 0xf0, 0x85, 0x99, 0xbf, 0x9a, 0xcf, 0xa0, 0xb2, 0xc2, 0xa3, 0x48, 0xb3, 0x3c, 0xe2, 0x58, 0x87, 0x8b, 0xb9, 0x3e, 0x6d, 0x3d, 0x63, 0x35, 0x37, 0xd0, 0x38, 0x67, 0x29, 0x21, + 0x73, 0xee, 0x7b, 0x27, 0xbe, 0x61, 0xc9, 0x0d, 0x06, 0xd0, 0x97, 0x00, 0xbc, 0xa5, 0x53, 0x35, 0xc9, 0x43, 0x6c, 0x49, 0xe8, 0x25, 0xdb, 0xd0, 0x1b, 0xcd, 0x0b, 0x33, 0x4e, 0x57, 0x23, 0xe8, + 0x7b, 0x0b, 0x11, 0x3c, 0x22, 0x9d, 0x10, 0xd2, 0x9c, 0x35, 0xab, 0xe0, 0xb2, 0xe3, 0x15, 0x24, 0x89, 0x4e, 0x0b, 0x31, 0xd8, 0x42, 0x0b, 0x1d, 0x7e, 0xa9, 0x56, 0x70, 0xed, 0x97, 0x59, 0xe3, + 0x9d, 0x85, 0xad, 0x7f, 0x4f, 0x4a, 0xdd, 0x03, 0x7d, 0xb3, 0x74, 0x1e, 0x59, 0xac, 0xa1, 0x0f, 0x09, 0x99, 0xcf, 0x77, 0xbe, 0x3e, 0x77, 0xbc, 0x1e, 0x9d, 0xff, 0xfe, 0xfb, 0xd5, 0x24, 0x42, + 0x26, 0xaa, 0x1d, 0xd6, 0x15, 0xb1, 0x41, 0x75, 0x0a, 0x26, 0x0e, 0x9b, 0xf5, 0x00, 0x2f, 0x16, 0x34, 0x31, 0x31, 0x08, 0x86, 0xf4, 0x5b, 0xdd, 0xc3, 0x77, 0x33, 0x2c, 0x11, 0x86, 0x88, 0xeb, + 0xd7, 0xfb, 0x19, 0x12, 0x36, 0xd0, 0x52, 0x35, 0xd9, 0xd8, 0x58, 0xac, 0x56, 0x71, 0xa4, 0x01, 0x07, 0x89, 0xe8, 0xe6, 0x2b, 0xa0, 0xdb, 0x89, 0x6a, 0x32, 0x99, 0xd3, 0x90, 0xb1, 0xc7, 0x5b, + 0x8d, 0xbd, 0x29, 0x04, 0x5c, 0x3a, 0x75, 0xf0, 0x78, 0x9c, 0x5f, 0xf3, 0xcb, 0xbd, 0xd1, 0xbc, 0x74, 0xf7, 0x74, 0xf5, 0x8c, 0x37, 0xee, 0xd4, 0x65, 0x5e, 0x50, 0x35, 0x12, 0x3b, 0x44, 0xb3, + 0x02, 0xd9, 0x23, 0x26, 0xef, 0xf4, 0xa0, 0x20, 0xcb, 0xf0, 0x3e, 0x50, 0xf7, 0x29, 0xc2, 0xb3, 0x9a, 0x33, 0x5e, 0x69, 0x43, 0x45, 0xdb, 0x9a, 0x1d, 0x26, 0xa5, 0xa1, 0x2d, 0x77, 0xd5, 0x3e, + 0x52, 0x1b, 0x52, 0x1e, 0x1b, 0x09, 0x40, 0x02, 0xd8, 0xce, 0x34, 0x0c, 0x36, 0x86, 0x0b, 0x3f, 0x1b, 0x1b, 0x05, 0x4d, 0xaf, 0x16, 0xd2, 0x7a, 0xcc, 0x2a, 0xb7, 0x59, 0xc7, 0xa5, 0xd3, 0x54, + 0x17, 0x4f, 0xf4, 0xa3, 0xc5, 0xfe, 0xe7, 0xfa, 0xf2, 0x1b, 0xcd, 0x73, 0x97, 0xcf, 0x57, 0xcf, 0xc2, 0xab, 0xef, 0xa8, 0x74, 0x41, 0x92, 0x06, 0xea, 0x5a, 0xa0, 0x13, 0x4d, 0xe7, 0x70, 0x0c, + 0x81, 0xbb, 0x15, 0xbc, 0xcc, 0xaa, 0xa0, 0x59, 0x86, 0xc3, 0xd6, 0x27, 0xfc, 0x49, 0xab, 0xee, 0xc5, 0x85, 0xe6, 0xed, 0x2d, 0x97, 0x6d, 0x6b, 0x92, 0x22, 0x54, 0xaf, 0x09, 0x91, 0x9d, 0x2c, + 0x30, 0xce, 0x12, 0x9b, 0xb0, 0x48, 0x42, 0x80, 0x4d, 0x37, 0x18, 0xc2, 0x7e, 0x8b, 0xbb, 0x66, 0x3d, 0xed, 0xb6, 0xc3, 0xf1, 0xf6, 0xa0, 0x70, 0xed, 0xc7, 0x3a, 0xf1, 0x2b, 0xe1, 0x1a, 0x27, + 0x82, 0xa7, 0xce, 0xba, 0xb6, 0x75, 0xd6, 0x01, 0x9e, 0x18, 0xdc, 0x3d, 0xe2, 0x67, 0xad, 0x7d, 0x9c, 0x9b, 0x72, 0x40, 0x10, 0xe0, 0xc1, 0x08, 0x0d, 0x45, 0x54, 0x23, 0x44, 0x16, 0x12, 0xa0, + 0x97, 0x96, 0xce, 0xda, 0x16, 0xc5, 0x66, 0x42, 0x04, 0x56, 0x48, 0x98, 0x11, 0x7e, 0x0c, 0x90, 0x39, 0xc9, 0xb2, 0x74, 0x1f, 0x78, 0x56, 0xca, 0xcc, 0x73, 0x6e, 0x61, 0x4a, 0x83, 0x64, 0x79, + 0x03, 0xc7, 0x04, 0x2b, 0x80, 0x4c, 0xe5, 0x52, 0xc3, 0x2c, 0x9d, 0x2d, 0x6f, 0x6c, 0x23, 0xe7, 0x68, 0x83, 0x2f, 0x71, 0x71, 0xb1, 0x97, 0xc4, 0xf0, 0x2b, 0xba, 0xe0, 0xe8, 0xba, 0x35, 0xc2, + 0x9e, 0x13, 0xbb, 0xcb, 0x1c, 0x55, 0x32, 0x88, 0xe0, 0x2d, 0x3b, 0x49, 0x78, 0x93, 0x6d, 0x3d, 0x43, 0xea, 0xd7, 0x0a, 0x57, 0x12, 0x26, 0xbb, 0x57, 0xf6, 0x11, 0xa6, 0x50, 0xb3, 0x02, 0x9e, + 0x03, 0x79, 0x6e, 0x6e, 0x32, 0x02, 0x02, 0x34, 0xc7, 0x60, 0xfa, 0xa8, 0xc3, 0x18, 0x9b, 0x94, 0x56, 0x12, 0xc0, 0x32, 0xb8, 0x19, 0xa6, 0x5a, 0x82, 0xec, 0x9b, 0x55, 0x33, 0x55, 0x93, 0xbc, + 0xd1, 0xda, 0x64, 0xaa, 0xde, 0x2c, 0xe7, 0xf3, 0x0f, 0x3b, 0xeb, 0x6a, 0xc8, 0x5f, 0x5d, 0xd2, 0x57, 0x74, 0xdf, 0xbb, 0x7f, 0x69, 0x3d, 0xbb, 0xb4, 0x57, 0xc6, 0x4e, 0x99, 0x57, 0x3b, 0x43, + 0x92, 0x1a, 0xbe, 0x8b, 0x26, 0x41, 0x98, 0xd1, 0xab, 0x05, 0xcd, 0xe3, 0xa0, 0x23, 0xe2, 0xfb, 0xa0, 0x6c, 0x87, 0xd5, 0x21, 0xd6, 0x89, 0x09, 0xbd, 0x1e, 0xc6, 0x0c, 0xe0, 0x4f, 0x5b, 0x7f, + 0x3c, 0xc1, 0xe3, 0x25, 0x0b, 0xa4, 0x2b, 0xdb, 0x37, 0xe7, 0xee, 0xd2, 0x5c, 0x01, 0xde, 0x96, 0x9d, 0x58, 0xa5, 0x5d, 0xc9, 0xc6, 0xae, 0x82, 0xe6, 0x80, 0x3e, 0x91, 0x9f, 0x88, 0xc3, 0xbf, + 0x6c, 0xe3, 0x3f, 0xff, 0x85, 0x1e, 0xc7, 0xeb, 0x56, 0x8e, 0xd5, 0x94, 0x6f, 0x11, 0xa3, 0x5f, 0x85, 0x79, 0x21, 0x2f, 0x05, 0x88, 0xdf, 0x50, 0x3f, 0x47, 0x38, 0x7e, 0xba, 0x37, 0x42, 0xbe, + 0x0f, 0x1d, 0x3f, 0x71, 0x71, 0x8d, 0xe9, 0x20, 0x45, 0xa4, 0xa6, 0x2c, 0x61, 0x35, 0x28, 0x80, 0xd5, 0x02, 0x4f, 0x34, 0x64, 0x66, 0x58, 0x6e, 0xb8, 0x67, 0xbb, 0x72, 0x6a, 0x29, 0x01, 0xc6, + 0xa0, 0x66, 0xbd, 0x91, 0x11, 0x56, 0x27, 0x73, 0x17, 0xe6, 0xe1, 0x9d, 0x44, 0xe8, 0xd4, 0x02, 0xe3, 0x30, 0xc2, 0x0f, 0xf7, 0x3b, 0x64, 0x7d, 0xec, 0x4b, 0xb8, 0x97, 0x81, 0x79, 0x32, 0xf1, + 0xe5, 0x76, 0x16, 0x1d, 0xa7, 0x62, 0x72, 0xb3, 0x41, 0xde, 0x04, 0x79, 0x5e, 0x73, 0x81, 0x78, 0x09, 0x94, 0xe2, 0x73, 0x70, 0x27, 0xf1, 0x1c, 0x0c, 0xc5, 0x2a, 0x73, 0x58, 0x4e, 0xf3, 0xc9, + 0x05, 0x3f, 0x9e, 0x6c, 0x65, 0xd0, 0xa0, 0xb6, 0x2e, 0xae, 0xb3, 0x68, 0xeb, 0x64, 0x20, 0x4d, 0xe8, 0xfb, 0x4a, 0x2b, 0x15, 0x1a, 0xe7, 0xc8, 0x74, 0xa0, 0x52, 0x13, 0x9d, 0xc0, 0xfb, 0x32, + 0x8f, 0x1a, 0x09, 0x38, 0x52, 0xf2, 0x0c, 0xeb, 0xdc, 0x19, 0x96, 0xe3, 0x8b, 0xb1, 0x60, 0xf9, 0x9a, 0x5e, 0x39, 0x5e, 0xb0, 0xf6, 0x4c, 0x8e, 0xa1, 0xc6, 0xfa, 0xfc, 0x89, 0x59, 0x73, 0x0d, + 0x0a, 0xf8, 0x19, 0xca, 0xed, 0x0e, 0xab, 0x46, 0x76, 0xe0, 0x3e, 0x82, 0xf3, 0x47, 0x5f, 0x72, 0x7d, 0x5c, 0xd1, 0xfd, 0xcd, 0xb4, 0x53, 0xeb, 0x0c, 0x8a, 0xf7, 0xc4, 0x76, 0xc3, 0xaa, 0xd0, + 0xb2, 0x07, 0xa7, 0x9c, 0xb5, 0x18, 0x26, 0xa4, 0x35, 0x1e, 0xa2, 0x7c, 0xc1, 0x2e, 0xe9, 0x56, 0x18, 0xe4, 0x4e, 0xce, 0xcc, 0x5a, 0x04, 0x49, 0x1b, 0xd8, 0xae, 0x23, 0xda, 0x26, 0x61, 0xd0, + 0x9c, 0x85, 0xde, 0x6a, 0x51, 0xba, 0xa6, 0x31, 0x86, 0xf7, 0xb9, 0x53, 0x95, 0x44, 0xa8, 0x82, 0x35, 0xb9, 0xf3, 0x81, 0x0d, 0x3a, 0x53, 0x29, 0x87, 0x56, 0x30, 0xd3, 0x01, 0xc2, 0xb5, 0xf6, + 0x5a, 0xfd, 0xbc, 0x0f, 0xf1, 0xc6, 0xe8, 0xff, 0x8b, 0x37, 0xfe, 0xeb, 0xf1, 0xc6, 0x6f, 0x1d, 0xa8, 0xea, 0xac, 0x7c, 0x8c, 0x97, 0xfe, 0xca, 0x29, 0x7f, 0x4d, 0xf8, 0x37, 0xa3, 0xce, 0xcd, + 0x67, 0xab, 0x22, 0x6c, 0x2d, 0xbd, 0x65, 0x45, 0x71, 0xa0, 0xda, 0xcc, 0x9e, 0xcd, 0x95, 0xca, 0x41, 0xa1, 0xf8, 0x10, 0xa4, 0x51, 0x08, 0x70, 0x9e, 0x3c, 0x69, 0x57, 0x29, 0xd9, 0x6d, 0x96, + 0x75, 0xbe, 0xde, 0x28, 0xc6, 0xe0, 0x5b, 0xc0, 0xb8, 0xaa, 0x98, 0x0a, 0x45, 0xb1, 0x26, 0x8a, 0x23, 0xb7, 0x5d, 0xaf, 0x39, 0x4f, 0x00, 0x0f, 0x6d, 0xb2, 0x10, 0xf6, 0xe1, 0x58, 0xb3, 0x5a, + 0xa4, 0x22, 0xd6, 0xd3, 0xb5, 0x78, 0x67, 0xc7, 0xba, 0xc5, 0x44, 0x7e, 0xb4, 0x85, 0xff, 0xb9, 0x03, 0xe0, 0x86, 0xfa, 0x99, 0x17, 0x9f, 0xee, 0x9d, 0xb7, 0xf0, 0x27, 0xdc, 0x03, 0x8e, 0xbd, + 0x59, 0x90, 0xc9, 0x84, 0x9f, 0x1d, 0xa4, 0xfd, 0x72, 0x2f, 0xf2, 0x4e, 0x28, 0xa5, 0x0d, 0xd7, 0xc7, 0x4e, 0xa1, 0xcd, 0x40, 0x5d, 0xb1, 0xad, 0x2d, 0x09, 0x4a, 0x4e, 0x42, 0x81, 0x49, 0x92, + 0x55, 0x3d, 0x8c, 0xe4, 0x56, 0x6d, 0x93, 0x50, 0x85, 0xc8, 0x03, 0x04, 0xf1, 0x92, 0x7e, 0x2c, 0x33, 0x4f, 0xd4, 0x15, 0x2c, 0x31, 0x1a, 0x1e, 0x01, 0x87, 0x44, 0x80, 0xcd, 0x36, 0xbe, 0x75, + 0x81, 0x7c, 0xf2, 0xac, 0xfd, 0x3d, 0x41, 0xf7, 0x9a, 0xf0, 0x89, 0x0d, 0x57, 0xcd, 0x67, 0x45, 0xde, 0x02, 0x53, 0x57, 0x43, 0x5d, 0xcc, 0x67, 0x4b, 0x7e, 0x11, 0xb1, 0x76, 0x20, 0x2e, 0x4b, + 0x0d, 0x86, 0x92, 0x56, 0xd8, 0xb4, 0xe9, 0xda, 0x1f, 0x23, 0x20, 0xc0, 0x66, 0x93, 0x78, 0x7e, 0x40, 0x4d, 0x44, 0x50, 0x85, 0x19, 0xd2, 0xf7, 0x5c, 0xae, 0xcf, 0xed, 0x84, 0x1a, 0x77, 0x0e, + 0x34, 0x31, 0xb2, 0x3d, 0xba, 0xe9, 0xb8, 0x81, 0x2d, 0x3c, 0xac, 0x53, 0x08, 0x27, 0xef, 0xb7, 0x2d, 0xa4, 0xb7, 0x4f, 0x04, 0xde, 0x7c, 0x93, 0x92, 0xe7, 0x39, 0xf5, 0x28, 0x48, 0xeb, 0x32, + 0x48, 0xab, 0xc0, 0xfa, 0x79, 0xd7, 0x38, 0x7c, 0x93, 0x62, 0x7c, 0x7a, 0x87, 0x7a, 0x78, 0x36, 0x04, 0x5e, 0x6a, 0xc4, 0x23, 0xa7, 0x0f, 0x1e, 0x69, 0x92, 0xaf, 0xd5, 0xad, 0xbb, 0xa2, 0x7b, + 0x1e, 0x81, 0x5f, 0xad, 0x67, 0x2b, 0xd6, 0xed, 0x77, 0xdc, 0x98, 0x9a, 0x4f, 0xc9, 0x1d, 0x2c, 0xf7, 0x9d, 0x2e, 0xf4, 0x4b, 0x73, 0xbb, 0x2d, 0x99, 0x56, 0x48, 0x5d, 0x10, 0xdf, 0x32, 0x5e, + 0xaf, 0x5b, 0x3c, 0xd9, 0xf5, 0x1b, 0xf2, 0x58, 0xc1, 0x68, 0x9f, 0xf7, 0x44, 0x6f, 0xb2, 0x38, 0x94, 0xda, 0x93, 0xd8, 0x97, 0xca, 0x79, 0x80, 0xcc, 0xc4, 0x66, 0xbe, 0xc9, 0x1c, 0x26, 0xe3, + 0x64, 0xa2, 0xab, 0x7d, 0x45, 0x28, 0xc6, 0xc8, 0x2c, 0x7c, 0x26, 0xd3, 0xfc, 0x43, 0x34, 0xed, 0xfd, 0x39, 0xf9, 0x4a, 0x59, 0x87, 0xdf, 0x64, 0x4f, 0xfc, 0xf8, 0xd5, 0x38, 0xe7, 0xe3, 0x3d, + 0x71, 0x54, 0x0a, 0x9b, 0x85, 0x0f, 0xd2, 0x64, 0x9d, 0x1f, 0x88, 0xb2, 0x21, 0xa9, 0xb8, 0x8c, 0xa3, 0xdd, 0x98, 0xae, 0x8e, 0x6a, 0x0d, 0xdb, 0x66, 0xa7, 0x84, 0xfb, 0x83, 0xd7, 0xb0, 0x65, + 0x12, 0xf7, 0x33, 0xa2, 0x36, 0xba, 0x7d, 0xc2, 0x4c, 0xe2, 0x25, 0xbc, 0x5a, 0x0a, 0x62, 0xa4, 0xd2, 0x3d, 0xb7, 0xed, 0x0a, 0xdf, 0xab, 0x66, 0xce, 0x76, 0x71, 0x0c, 0x51, 0x9c, 0xc1, 0xa6, + 0xc9, 0xc2, 0x5b, 0x27, 0xcf, 0x94, 0xd6, 0x37, 0xea, 0x2c, 0x09, 0xac, 0x51, 0x15, 0x3b, 0x4e, 0x7e, 0x7f, 0x4a, 0xde, 0x89, 0x78, 0xbe, 0x3f, 0xd3, 0x2e, 0xb6, 0xc9, 0x2a, 0x48, 0x82, 0xd8, + 0x78, 0xeb, 0xdd, 0x3d, 0xf6, 0xbe, 0xe6, 0x0b, 0xbe, 0xa1, 0x7e, 0xe2, 0xf2, 0xe7, 0x7b, 0xcf, 0x7a, 0x80, 0xc1, 0x02, 0x24, 0xd7, 0xe3, 0x49, 0x3c, 0xd6, 0x79, 0x7a, 0x15, 0x86, 0xe4, 0xc1, + 0x29, 0x97, 0x13, 0xee, 0x40, 0x0b, 0x7c, 0x64, 0xac, 0x36, 0x6e, 0xd9, 0xfa, 0xee, 0x9c, 0x8c, 0xc0, 0x09, 0x82, 0x06, 0xe3, 0xf4, 0x58, 0xc6, 0x9b, 0x10, 0x01, 0xbd, 0x0c, 0x4e, 0x28, 0x68, + 0x99, 0x12, 0x29, 0x0b, 0xa2, 0x2a, 0xa3, 0x98, 0x72, 0x06, 0x01, 0x79, 0x83, 0x6f, 0xda, 0xe9, 0x56, 0xa4, 0x36, 0xac, 0x78, 0xab, 0x06, 0x5d, 0x7e, 0xde, 0xb9, 0xfa, 0xf7, 0xc3, 0xa3, 0xe0, + 0x25, 0xb9, 0xec, 0x8a, 0xf0, 0x6f, 0x36, 0x5c, 0xaa, 0x8c, 0x3f, 0x19, 0xa2, 0x92, 0xca, 0xc5, 0x02, 0xa3, 0x6c, 0x67, 0x5a, 0x50, 0xca, 0x66, 0x11, 0xf7, 0x05, 0x4c, 0x77, 0x24, 0xc6, 0xa5, + 0xf5, 0xb8, 0xc3, 0xf9, 0x56, 0xe0, 0x8b, 0xc3, 0x3e, 0x88, 0xf0, 0x8c, 0xa6, 0xf4, 0x28, 0x56, 0x05, 0x69, 0x29, 0xc7, 0x85, 0x37, 0x9e, 0x23, 0x43, 0xb9, 0x85, 0xc5, 0xbd, 0xb1, 0x0d, 0xe9, + 0xa2, 0xdd, 0x77, 0xb6, 0xeb, 0xe8, 0x44, 0x47, 0x18, 0xd3, 0x96, 0x63, 0x88, 0xc6, 0x8b, 0x9e, 0xd8, 0xfe, 0x1e, 0xd7, 0x63, 0x7f, 0x8f, 0x4d, 0xb9, 0x9a, 0x79, 0x17, 0x0f, 0xaf, 0x91, 0x56, + 0x67, 0xff, 0xf0, 0x57, 0x68, 0xd0, 0x17, 0x16, 0x5c, 0x39, 0x06, 0xeb, 0x32, 0x78, 0xbc, 0xbc, 0x91, 0x97, 0xe7, 0xdf, 0xa7, 0x2f, 0xfc, 0x62, 0xfe, 0xa7, 0xfb, 0x67, 0x2f, 0xfd, 0x13, 0xf3, + 0xd0, 0x3f, 0x4c, 0x23, 0x30, 0x28, 0x5c, 0x22, 0xce, 0x21, 0x90, 0xf6, 0xb6, 0x73, 0x02, 0xb4, 0x6d, 0x19, 0x5e, 0x1e, 0x6a, 0x45, 0x5a, 0xd1, 0x4a, 0x18, 0x1f, 0xa7, 0x81, 0xb5, 0xc7, 0x82, + 0x92, 0xde, 0xdb, 0x33, 0xd8, 0x2b, 0xc3, 0x2a, 0x75, 0x78, 0x04, 0xd7, 0x58, 0xbc, 0xa7, 0xa7, 0xe2, 0x64, 0x66, 0x4f, 0x5b, 0x99, 0x74, 0x77, 0xca, 0x16, 0xda, 0x1d, 0x19, 0xd1, 0x07, 0x91, + 0xf5, 0x00, 0x50, 0xaf, 0xf9, 0x7f, 0xff, 0x0b, 0x8f, 0xe4, 0xd5, 0x6b, 0x77, 0xeb, 0xb3, 0x41, 0xe7, 0x18, 0xe9, 0x47, 0x29, 0x0b, 0x77, 0x19, 0x78, 0x89, 0x15, 0xf8, 0x8b, 0x02, 0xc3, 0x83, + 0x8f, 0x3c, 0x1a, 0x40, 0x27, 0xb5, 0x9f, 0x15, 0x24, 0x06, 0xaa, 0x9f, 0x86, 0x1d, 0xbc, 0x42, 0x50, 0xba, 0x8b, 0xc8, 0x59, 0xbb, 0xcd, 0xad, 0x41, 0x40, 0xa4, 0x65, 0x09, 0x87, 0x44, 0xc7, + 0xa1, 0x94, 0x0b, 0x44, 0x78, 0xdc, 0x6e, 0x52, 0x45, 0x3c, 0x02, 0xc9, 0x91, 0x9a, 0xb2, 0x47, 0x4a, 0xd2, 0x56, 0x4e, 0xcc, 0x44, 0x63, 0x24, 0x92, 0x8f, 0x38, 0x50, 0xc4, 0x64, 0x1f, 0xba, + 0x3c, 0x99, 0x69, 0xc7, 0x01, 0x0d, 0xe9, 0x15, 0xb6, 0xde, 0x61, 0x4f, 0x64, 0x0a, 0xff, 0x17, 0x03, 0xf6, 0xfc, 0x38, 0x54, 0xb5, 0x51, 0x7e, 0x85, 0x5e, 0xf4, 0x97, 0x46, 0xe2, 0xfc, 0x99, + 0x47, 0x63, 0x71, 0x7e, 0xf8, 0xec, 0x68, 0x84, 0x3e, 0xee, 0x50, 0xe4, 0x58, 0x9e, 0xb8, 0x6d, 0xaf, 0x60, 0x50, 0x6d, 0x6b, 0x48, 0xba, 0xd1, 0xd3, 0x6c, 0x8a, 0x81, 0x89, 0x30, 0xe7, 0xe5, + 0xcd, 0x6c, 0xed, 0x76, 0x64, 0x8d, 0x0d, 0x43, 0x1d, 0x65, 0xbb, 0x8a, 0xdb, 0x48, 0x7d, 0xbb, 0x04, 0x67, 0x28, 0x55, 0x34, 0x70, 0xc5, 0x40, 0x72, 0x7d, 0x58, 0xa2, 0xf2, 0x14, 0x52, 0x3d, + 0x5e, 0x49, 0xac, 0x43, 0x77, 0x0c, 0x3a, 0xad, 0xd1, 0x9f, 0xd8, 0xd7, 0xfe, 0x37, 0x46, 0xe3, 0xd7, 0xd6, 0xf7, 0xe8, 0x14, 0x7d, 0x41, 0x97, 0xfa, 0x45, 0xf6, 0x8d, 0xdb, 0x97, 0xc6, 0x33, + 0xd5, 0xc9, 0xe1, 0x51, 0x31, 0x73, 0xd6, 0xcb, 0xa6, 0x32, 0x3a, 0x24, 0xc8, 0xac, 0x6d, 0x60, 0x6a, 0x30, 0x17, 0xf4, 0x6b, 0xb5, 0x91, 0xb2, 0xef, 0x0b, 0x44, 0x9c, 0xbf, 0xf2, 0x5e, 0x28, + 0xf8, 0x13, 0x8a, 0xd6, 0xbd, 0x9e, 0x7f, 0x0e, 0xeb, 0x79, 0x64, 0x44, 0x7c, 0xed, 0xf0, 0xfc, 0x44, 0xff, 0x17, 0x2f, 0x3e, 0xdc, 0x7d, 0x26, 0x99, 0x03, 0x1e, 0xad, 0xe6, 0xa2, 0xbe, 0x6e, + 0xa2, 0x65, 0x97, 0xc4, 0x24, 0x53, 0x49, 0x33, 0x5f, 0xeb, 0x32, 0x73, 0x31, 0x78, 0xb9, 0xf7, 0x44, 0x19, 0xc6, 0xaa, 0xc9, 0x9d, 0xd2, 0xf0, 0x1e, 0xe7, 0x25, 0xa0, 0xff, 0x90, 0xaf, 0xc8, + 0xe6, 0xbf, 0xc8, 0x5e, 0xe0, 0xd8, 0xde, 0x1a, 0xa3, 0x33, 0xb5, 0xef, 0xd7, 0x10, 0x2b, 0xac, 0x6b, 0x41, 0x9c, 0x66, 0xb3, 0x25, 0x3f, 0x76, 0x98, 0x16, 0x97, 0xd9, 0x3a, 0x92, 0x33, 0x45, + 0xac, 0x51, 0x06, 0xc8, 0x0a, 0x68, 0x40, 0xed, 0xaa, 0x17, 0x1b, 0xad, 0x61, 0x5a, 0x43, 0xda, 0xb5, 0xcd, 0x96, 0x74, 0xe6, 0x93, 0x46, 0x48, 0xdc, 0x0d, 0x14, 0x68, 0xda, 0x71, 0x31, 0x85, + 0x1d, 0xd2, 0xcf, 0x8f, 0x53, 0x5c, 0xaf, 0x7a, 0xb3, 0x59, 0xe1, 0xcc, 0xd2, 0x88, 0xc5, 0xf9, 0x8b, 0x71, 0x32, 0x59, 0x92, 0x67, 0xe9, 0xe9, 0xb7, 0x3b, 0x49, 0x50, 0xd7, 0xce, 0xbb, 0x14, + 0xfa, 0x29, 0x14, 0xec, 0xa2, 0x03, 0x87, 0xc6, 0x7b, 0x15, 0xa2, 0x4f, 0xd1, 0xd2, 0xd7, 0x58, 0xa5, 0x9f, 0x1e, 0x5d, 0xc5, 0xa5, 0xdd, 0x26, 0x0e, 0x66, 0x65, 0x32, 0xb2, 0x8d, 0xda, 0x78, + 0xa3, 0x8a, 0x7e, 0x84, 0x62, 0x38, 0x3d, 0x0e, 0xec, 0x37, 0x7c, 0x85, 0x3b, 0x3f, 0xea, 0x37, 0xc8, 0xfe, 0x3b, 0x22, 0xca, 0xf5, 0xc3, 0x0b, 0x72, 0xfd, 0xe9, 0xc9, 0x27, 0x84, 0x87, 0xe2, + 0xf2, 0x17, 0xf8, 0x07, 0x0c, 0xb0, 0x33, 0x83, 0x8c, 0xf3, 0xc7, 0xae, 0xe3, 0xc2, 0x91, 0xb3, 0x19, 0xf4, 0x7d, 0x19, 0x5d, 0xb1, 0xf7, 0x91, 0x25, 0xeb, 0x96, 0xc8, 0x23, 0x93, 0xd6, 0x89, + 0xf4, 0x6b, 0xf0, 0xa3, 0x9f, 0xbe, 0xf1, 0x16, 0x16, 0x77, 0x75, 0xe7, 0x9c, 0x50, 0xfb, 0x24, 0x24, 0xe9, 0xcc, 0xf4, 0x33, 0x92, 0x1f, 0x87, 0x4b, 0x73, 0x41, 0xf7, 0x69, 0xd3, 0x07, 0x44, + 0x36, 0x46, 0xe4, 0x52, 0xf7, 0xe6, 0xa0, 0xbe, 0x95, 0xac, 0x4a, 0x0f, 0xf1, 0x74, 0xc3, 0x0f, 0xbb, 0x24, 0xf2, 0x85, 0x79, 0x41, 0x4e, 0x17, 0xcb, 0x3a, 0x07, 0xdd, 0x01, 0xf7, 0xd7, 0x7a, + 0xa3, 0x27, 0x2b, 0x30, 0x45, 0x07, 0x9d, 0xda, 0x4f, 0x76, 0x66, 0x3e, 0x3e, 0x1e, 0xc1, 0x44, 0x25, 0xfd, 0x44, 0x5b, 0xfd, 0xf7, 0x90, 0x80, 0x56, 0x56, 0x3a, 0x67, 0x2c, 0xe3, 0x0b, 0xbe, + 0xd5, 0xcf, 0x7f, 0x3f, 0x6b, 0x4d, 0x6f, 0x1d, 0xf2, 0x9d, 0x32, 0xb8, 0x0a, 0x4b, 0x44, 0x6f, 0xde, 0xf8, 0x55, 0x35, 0xf3, 0x01, 0x89, 0x07, 0xd9, 0x6d, 0x17, 0x72, 0x37, 0x6f, 0x7f, 0xf4, + 0x3b, 0xfd, 0xfc, 0x17, 0xbb, 0x57, 0x3d, 0xea, 0x72, 0xc8, 0xfe, 0xff, 0xb6, 0x73, 0x12, 0xbf, 0xcb, 0xb7, 0x4f, 0xdf, 0x79, 0xef, 0xdc, 0x3d, 0xdb, 0xc9, 0x4b, 0xc7, 0x32, 0xce, 0x29, 0xf5, + 0x97, 0x9f, 0xf8, 0x04, 0x04, 0xeb, 0x7d, 0xf7, 0xd7, 0x8f, 0x1f, 0xb7, 0x21, 0x53, 0xaf, 0x55, 0xf7, 0xfa, 0xca, 0x0d, 0xf6, 0x19, 0xe6, 0xe7, 0xc7, 0xc3, 0x5d, 0xce, 0x46, 0x76, 0xfa, 0x84, + 0x63, 0x22, 0x35, 0xd6, 0x08, 0xd6, 0xe4, 0x7a, 0xb7, 0x9a, 0x91, 0x60, 0xda, 0xf2, 0xd1, 0x6e, 0xb6, 0x83, 0x59, 0x94, 0xb4, 0xe0, 0x2a, 0x90, 0xf0, 0xf5, 0x0a, 0x37, 0xa8, 0xd5, 0x96, 0x12, + 0x93, 0xc5, 0x84, 0x64, 0xd3, 0xbc, 0xb2, 0x94, 0x44, 0xe4, 0x94, 0x6c, 0x4e, 0x0a, 0xf2, 0xb2, 0xac, 0xc9, 0xc6, 0x06, 0xbb, 0x55, 0x9d, 0x85, 0x43, 0x35, 0x66, 0x71, 0xc0, 0x7b, 0xc6, 0x7c, + 0x7a, 0xcd, 0xa9, 0xcf, 0x63, 0xf1, 0x88, 0x59, 0xb7, 0x23, 0xf4, 0x34, 0xb3, 0x3e, 0x7c, 0xe2, 0x97, 0x90, 0xf5, 0x7e, 0xe3, 0x0e, 0x8e, 0xd7, 0x8f, 0x47, 0x2c, 0x4b, 0x41, 0xc5, 0x4f, 0x5b, + 0x26, 0xc0, 0xe7, 0x0b, 0xd3, 0xdc, 0xbb, 0x6d, 0x50, 0x66, 0xc0, 0x21, 0x0b, 0x83, 0xf9, 0xb1, 0x05, 0x2a, 0x52, 0x5c, 0x89, 0x8b, 0x89, 0x75, 0xdc, 0x3b, 0x2b, 0x77, 0x97, 0x33, 0x9c, 0xd0, + 0x65, 0xc2, 0x16, 0xf2, 0x6b, 0x38, 0x1e, 0x6b, 0xdd, 0x64, 0x6a, 0x06, 0x64, 0xce, 0xd1, 0xad, 0x33, 0x9b, 0xd9, 0x69, 0xb4, 0x18, 0x56, 0xc3, 0x76, 0x05, 0x26, 0xc7, 0x8d, 0xdb, 0x7d, 0xc1, + 0xb2, 0x27, 0x17, 0xe3, 0xbd, 0x59, 0xff, 0x47, 0x10, 0x9d, 0xe7, 0x23, 0xb2, 0xfe, 0xaa, 0x7e, 0xe0, 0x2b, 0xa1, 0x37, 0xbf, 0xa8, 0xbe, 0x1f, 0xc2, 0xf5, 0xa5, 0x62, 0xe0, 0xb7, 0x41, 0x37, + 0x27, 0x56, 0xc3, 0x13, 0xda, 0x6c, 0x4b, 0x59, 0xaf, 0x58, 0x1a, 0xd5, 0xb6, 0xd3, 0x43, 0x61, 0x26, 0x3e, 0x3c, 0x16, 0x20, 0x6d, 0x56, 0x40, 0x33, 0x76, 0x39, 0x55, 0xc1, 0x74, 0x92, 0xba, + 0x91, 0xbb, 0xe7, 0x52, 0x42, 0x29, 0xfb, 0xf5, 0x1e, 0x5e, 0xa2, 0xb9, 0xa8, 0x85, 0xca, 0x91, 0xa5, 0x06, 0x90, 0xd0, 0x77, 0xc8, 0x9e, 0xb2, 0x0f, 0xc5, 0x50, 0x44, 0xc8, 0x4a, 0xee, 0xfa, + 0xd8, 0x84, 0x28, 0xbb, 0x79, 0x4d, 0x33, 0xfc, 0x7c, 0x8e, 0x7d, 0x10, 0x6c, 0x3f, 0x48, 0x30, 0xa7, 0x33, 0x94, 0x7c, 0x28, 0xd1, 0x3e, 0x82, 0xa2, 0xfd, 0xe8, 0xd7, 0x7b, 0x25, 0x29, 0xfd, + 0x3b, 0x08, 0x5a, 0xe2, 0xb9, 0x44, 0xf4, 0x22, 0x9f, 0xd2, 0xed, 0x26, 0xa6, 0xaa, 0xba, 0x91, 0x17, 0xad, 0xc3, 0x57, 0x29, 0xb1, 0x48, 0x2d, 0x6e, 0xd3, 0xb6, 0x18, 0x04, 0x17, 0x4b, 0xc3, + 0xe2, 0x8f, 0xeb, 0x58, 0x06, 0x01, 0xa1, 0xeb, 0x2d, 0x0a, 0x80, 0x0a, 0xa4, 0x13, 0x86, 0x76, 0xcc, 0xb8, 0x6d, 0x4d, 0x42, 0x20, 0xb3, 0x4a, 0x91, 0xbc, 0x90, 0x27, 0x15, 0x67, 0x33, 0x41, + 0xe6, 0xa9, 0xec, 0x86, 0x02, 0xe4, 0xb6, 0xdb, 0x3c, 0xa1, 0x3b, 0x7c, 0xc0, 0x97, 0xfd, 0xc2, 0xc8, 0x51, 0x1b, 0xf9, 0x23, 0xcf, 0xca, 0xf8, 0x35, 0x9c, 0x87, 0x13, 0x45, 0x70, 0x74, 0xfe, + 0x6f, 0x34, 0x7e, 0x12, 0xe7, 0x01, 0x02, 0x35, 0x04, 0x5a, 0x75, 0x9b, 0xe5, 0x2e, 0x5a, 0x5b, 0xdb, 0xa9, 0x12, 0x8c, 0x69, 0x5a, 0xa9, 0x00, 0x99, 0x96, 0x74, 0xbd, 0x2b, 0x56, 0xbc, 0x11, + 0xe4, 0xec, 0x74, 0xd6, 0xe5, 0x30, 0x64, 0xaf, 0xc5, 0x20, 0xdf, 0xb7, 0x8a, 0xde, 0xed, 0x76, 0xd3, 0x00, 0x82, 0x35, 0x50, 0x8e, 0xe2, 0x25, 0x3b, 0x2c, 0xf8, 0xb9, 0xbf, 0xb4, 0xc2, 0xcc, + 0x8a, 0x00, 0x86, 0x4f, 0x27, 0xae, 0x40, 0xcf, 0x5f, 0x8b, 0xaf, 0xfb, 0x58, 0x2b, 0xf1, 0xe6, 0x14, 0x7b, 0xd3, 0xba, 0xec, 0xbb, 0xa7, 0xeb, 0x4f, 0x3b, 0xab, 0x2f, 0x40, 0xf5, 0x3f, 0x2f, + 0x9e, 0xf9, 0x4f, 0x13, 0xdb, 0xcd, 0xca, 0xd1, 0x7b, 0x21, 0xf9, 0x7f, 0xa1, 0x7f, 0xd0, 0x8f, 0x76, 0x0e, 0xb7, 0x49, 0x2f, 0x70, 0x62, 0xef, 0x2a, 0xdf, 0xed, 0xc7, 0xbd, 0x38, 0x3b, 0x97, + 0x65, 0xf9, 0x97, 0xf8, 0x07, 0xfe, 0x88, 0x8f, 0xef, 0x1b, 0xbf, 0x65, 0x86, 0x0f, 0x54, 0x6f, 0xe4, 0x85, 0x0f, 0x80, 0xf8, 0x41, 0xf5, 0x5b, 0x81, 0x3a, 0xff, 0xed, 0x87, 0xd2, 0xf6, 0xd7, + 0xb9, 0x12, 0xff, 0x7e, 0xac, 0xb3, 0x71, 0xd7, 0x67, 0xf0, 0x2f, 0xfc, 0xa1, 0x28, 0xea, 0xef, 0x39, 0xf3, 0xde, 0x9b, 0xdb, 0xa7, 0x6f, 0xa1, 0x78, 0x27, 0x76, 0xdc, 0x31, 0xd4, 0xdd, 0x33, + 0xbf, 0x5d, 0x7e, 0xc9, 0x07, 0xb6, 0x7c, 0x0e, 0x7c, 0x23, 0xff, 0x44, 0x7c, 0x7d, 0x88, 0xae, 0xfa, 0xe3, 0xc7, 0xe7, 0xe3, 0x92, 0x78, 0xd1, 0x21, 0xfb, 0x3d, 0xc8, 0xea, 0xe7, 0x28, 0xd4, + 0x1f, 0x8f, 0x56, 0x8a, 0x41, 0xe4, 0xb3, 0x85, 0xed, 0xc3, 0x3d, 0xbf, 0xa4, 0xbd, 0xed, 0xa0, 0xec, 0x58, 0x4f, 0x10, 0x7b, 0xb0, 0xef, 0x18, 0xbd, 0x8a, 0x24, 0x78, 0x67, 0xe3, 0x8e, 0xa7, + 0x69, 0x12, 0x3a, 0xb3, 0x37, 0x87, 0xb1, 0x2e, 0xae, 0xa4, 0x19, 0xb3, 0xdb, 0xce, 0x01, 0xbf, 0x1b, 0x10, 0x61, 0x37, 0x05, 0x26, 0x31, 0xa0, 0x0c, 0x82, 0x4a, 0x4b, 0x69, 0x77, 0x04, 0xc3, + 0xc1, 0x07, 0x8b, 0xa6, 0xe6, 0x77, 0xaf, 0x3b, 0x68, 0x7f, 0xa7, 0x7c, 0xdf, 0xdb, 0x41, 0xa0, 0x97, 0x2c, 0xd1, 0x6f, 0x34, 0x4f, 0x7b, 0xc8, 0xe5, 0x6a, 0x04, 0x7d, 0x6f, 0x7f, 0x86, 0x47, + 0x42, 0x38, 0x0c, 0x1d, 0x86, 0x47, 0x8a, 0xb3, 0xb7, 0x17, 0xc9, 0x51, 0x9f, 0x6d, 0x9c, 0xea, 0xc8, 0x6f, 0x34, 0x6f, 0x3a, 0xfb, 0x76, 0xb7, 0x34, 0x83, 0xb4, 0x2e, 0x9d, 0x8b, 0x05, 0x05, + 0x7e, 0x9c, 0xea, 0x53, 0x3b, 0x65, 0x32, 0xaa, 0x82, 0xe3, 0xe3, 0x38, 0x9a, 0x57, 0x02, 0xb0, 0x7e, 0x51, 0x3d, 0xf5, 0xf8, 0xfd, 0x7a, 0x84, 0x3c, 0x17, 0x7c, 0xd5, 0xf1, 0xd0, 0x26, 0x18, + 0xbb, 0x32, 0x1b, 0xb6, 0xa0, 0xba, 0x1a, 0x48, 0x65, 0xb2, 0xd0, 0xa7, 0x7e, 0x4c, 0x4e, 0x45, 0xa2, 0x11, 0x2d, 0x6c, 0x2f, 0x0a, 0x84, 0x52, 0x04, 0x6b, 0xe8, 0xc8, 0x12, 0x00, 0x87, 0xed, + 0x4b, 0x60, 0x23, 0xae, 0x99, 0x6c, 0x61, 0x20, 0x53, 0x69, 0x8b, 0xf3, 0x8b, 0x5d, 0xba, 0x65, 0x97, 0xea, 0x02, 0x1d, 0xef, 0x18, 0x31, 0x5a, 0x1d, 0xe9, 0xdd, 0x60, 0xe4, 0x13, 0xfd, 0x19, + 0xd4, 0x87, 0xdf, 0x6b, 0xee, 0x3e, 0x27, 0xd0, 0x17, 0xdc, 0xd1, 0x6f, 0x34, 0x4f, 0x7c, 0xb8, 0x5c, 0x9d, 0xb5, 0xba, 0x6f, 0x5c, 0xcf, 0xf0, 0x88, 0xb1, 0xb7, 0x1c, 0x88, 0x17, 0xa4, 0xa4, + 0xc6, 0x5e, 0x65, 0x5a, 0xd1, 0x6c, 0x0f, 0x03, 0x4c, 0x66, 0x04, 0x63, 0x77, 0xf7, 0x44, 0x3f, 0x82, 0xc4, 0xf9, 0x32, 0xee, 0xfe, 0xb5, 0x32, 0x99, 0xbf, 0xc9, 0x9e, 0x7a, 0xf3, 0xab, 0xf1, + 0x6c, 0xa1, 0xcc, 0x4e, 0xb4, 0xea, 0xf2, 0xc0, 0x20, 0x0b, 0x5d, 0x17, 0x9a, 0x65, 0x6c, 0xf9, 0x71, 0x34, 0x43, 0x6c, 0x57, 0xe5, 0x7c, 0x82, 0x43, 0x78, 0x66, 0x49, 0x31, 0x5d, 0x0c, 0x20, + 0x86, 0xb9, 0xd2, 0x3c, 0x28, 0xa9, 0xba, 0xf5, 0xc2, 0x95, 0xe9, 0x61, 0x7d, 0x40, 0x43, 0xce, 0x83, 0x73, 0x0d, 0xdb, 0xbb, 0x75, 0xad, 0x2c, 0x25, 0xbd, 0xe1, 0x2d, 0x35, 0x9b, 0xa0, 0x73, + 0x76, 0xc8, 0xf7, 0x51, 0x7c, 0x13, 0x52, 0x58, 0x07, 0xe9, 0x30, 0x8a, 0xcb, 0xe6, 0xa1, 0xe0, 0x04, 0x5d, 0x1d, 0x32, 0xcf, 0xf7, 0xfc, 0x42, 0xf4, 0xdc, 0xef, 0xcb, 0xe5, 0xe8, 0x4c, 0xe9, + 0xfb, 0x5e, 0x1f, 0x25, 0x4d, 0x86, 0xf8, 0xd6, 0x4b, 0xb1, 0x52, 0x3d, 0x1e, 0x72, 0x01, 0x1a, 0xd0, 0x8d, 0x02, 0x51, 0x95, 0xc8, 0xe3, 0x84, 0xc3, 0x1a, 0xeb, 0x90, 0x22, 0x21, 0x2c, 0x8c, + 0x79, 0x8a, 0xc5, 0x73, 0xc5, 0xb0, 0xdd, 0x32, 0xd8, 0x5a, 0xc7, 0xa3, 0xb0, 0x98, 0xab, 0x06, 0xd8, 0x5b, 0x87, 0x71, 0xb2, 0xdc, 0xb8, 0x49, 0x3c, 0xa1, 0x16, 0xc3, 0x1a, 0x04, 0x14, 0x4f, + 0x80, 0xf6, 0x70, 0x93, 0xdd, 0x84, 0x8c, 0xd6, 0xd9, 0xe8, 0xb1, 0xc9, 0xe2, 0xb3, 0x31, 0xfa, 0x85, 0x91, 0xbf, 0x21, 0x7f, 0xe2, 0xc4, 0xcd, 0xcd, 0x3b, 0xe5, 0x84, 0xef, 0xf2, 0x64, 0x59, + 0x20, 0x98, 0x3a, 0xa9, 0xf1, 0x23, 0x83, 0xa5, 0xf9, 0xca, 0x8f, 0x85, 0xbd, 0xca, 0xce, 0x25, 0x14, 0xf4, 0x86, 0x0d, 0x02, 0x16, 0x32, 0x63, 0xf1, 0x92, 0x34, 0x6c, 0x45, 0x7b, 0xdc, 0x9a, + 0x09, 0x4a, 0x2d, 0x76, 0x86, 0x1c, 0xd0, 0xe2, 0x78, 0x25, 0x16, 0x90, 0x23, 0xee, 0xa7, 0xe0, 0x36, 0xea, 0x8f, 0x80, 0x1e, 0xda, 0x95, 0x85, 0x61, 0x1e, 0x35, 0x0c, 0x47, 0x40, 0x2b, 0x20, + 0xe8, 0x99, 0x1a, 0x66, 0xe7, 0x9f, 0xec, 0x39, 0xfd, 0xa8, 0x34, 0x52, 0xef, 0xd1, 0x8e, 0x87, 0xbd, 0x64, 0x2e, 0xfd, 0x48, 0xfa, 0x9d, 0x3d, 0xbf, 0x6e, 0x8c, 0xb0, 0xef, 0x8d, 0xa4, 0x27, + 0xd6, 0xe0, 0xd8, 0x8a, 0x08, 0x8e, 0xb8, 0x8a, 0x0d, 0xb3, 0x12, 0xb6, 0x3a, 0xcb, 0x6b, 0xd7, 0xbd, 0x69, 0x2e, 0x3b, 0x62, 0x17, 0xa1, 0x9e, 0x3c, 0x60, 0xf6, 0xd2, 0xae, 0xf5, 0x71, 0xc9, + 0xb4, 0x8e, 0x50, 0xf8, 0xa5, 0xcd, 0xad, 0x00, 0x21, 0x00, 0x17, 0x3d, 0x5e, 0x0f, 0x3c, 0x24, 0xcd, 0x4c, 0x00, 0x61, 0xa7, 0x43, 0xea, 0x4c, 0x45, 0x2e, 0x60, 0x8b, 0x92, 0x66, 0xa6, 0x8a, + 0x14, 0x91, 0xd5, 0x6b, 0xfa, 0x4c, 0x50, 0x8d, 0xd2, 0x26, 0x31, 0xdf, 0x6c, 0x89, 0xc4, 0x17, 0xf2, 0xf6, 0x5b, 0x81, 0xa0, 0xfb, 0x86, 0xd9, 0x57, 0x12, 0x95, 0xce, 0x14, 0xcf, 0x3c, 0x6c, + 0xce, 0xd5, 0xe0, 0xbe, 0x4d, 0x4f, 0x3a, 0xb1, 0xee, 0x30, 0xe9, 0xc9, 0xdd, 0x80, 0x6d, 0x85, 0x5a, 0x56, 0x36, 0xf5, 0xb2, 0x00, 0x44, 0x08, 0x05, 0x2b, 0x9e, 0x29, 0xd5, 0xa9, 0xb0, 0xe8, + 0x3b, 0xc6, 0x2a, 0x1a, 0x65, 0x85, 0x58, 0x63, 0x54, 0x70, 0x20, 0x14, 0xa4, 0x2a, 0xa7, 0x0c, 0xd7, 0x93, 0xe5, 0xb1, 0x0e, 0x37, 0x47, 0x7c, 0x1e, 0x71, 0xce, 0x91, 0x62, 0x40, 0x3f, 0x76, + 0x06, 0x5a, 0xdd, 0x4e, 0x58, 0xa1, 0xeb, 0xf4, 0x5d, 0x47, 0xc5, 0xaf, 0x99, 0x63, 0xdf, 0x6a, 0x59, 0xbc, 0x19, 0x82, 0x1e, 0xb1, 0x6d, 0xc8, 0x9d, 0x91, 0xfb, 0x95, 0xa4, 0x41, 0xbe, 0x32, + 0x0f, 0xdf, 0xa9, 0x9e, 0xd8, 0xf7, 0x7e, 0x3d, 0x3a, 0xd3, 0xfa, 0x9e, 0x85, 0x63, 0xdb, 0x3c, 0x2e, 0x8f, 0x45, 0x1b, 0xd6, 0x5e, 0x20, 0x62, 0x65, 0x07, 0x47, 0x58, 0x39, 0x5b, 0xd4, 0x13, + 0x5a, 0xe2, 0x13, 0xbb, 0xb1, 0x7d, 0x76, 0x98, 0xcc, 0x8c, 0x50, 0x82, 0x60, 0x77, 0x36, 0xf8, 0x06, 0xbd, 0xf4, 0xab, 0x8c, 0x97, 0x06, 0x7c, 0x20, 0x80, 0xa5, 0x44, 0xa1, 0x4b, 0x37, 0x9f, + 0xd7, 0x9d, 0x46, 0x05, 0x45, 0x40, 0x44, 0x0c, 0xd0, 0x77, 0xbc, 0xbf, 0xae, 0x24, 0xee, 0x99, 0x58, 0x93, 0xd3, 0x2f, 0xb5, 0xcf, 0x26, 0xbe, 0x51, 0x9d, 0x7d, 0x1d, 0x11, 0x8e, 0xbe, 0x84, + 0x87, 0x7f, 0xef, 0x03, 0x6f, 0x1c, 0xfa, 0x7c, 0xfb, 0x3c, 0xdf, 0x9e, 0x08, 0x77, 0x3d, 0xda, 0x0d, 0xa9, 0x8a, 0xd2, 0x8c, 0x71, 0x72, 0x9e, 0xdf, 0x00, 0xaa, 0x26, 0xab, 0xf4, 0x7e, 0x55, + 0x1f, 0x9a, 0x00, 0x8a, 0x07, 0x48, 0xaa, 0x33, 0x7f, 0x57, 0x59, 0x1d, 0xb0, 0x4b, 0x8c, 0x45, 0x40, 0x1f, 0xb6, 0xa4, 0x5f, 0xee, 0xe1, 0xb2, 0x04, 0xc1, 0x05, 0xbe, 0x07, 0x20, 0xa6, 0xe5, + 0x50, 0x79, 0x0d, 0x53, 0x0a, 0x45, 0x50, 0x22, 0x14, 0x1b, 0x82, 0xab, 0x92, 0x65, 0x42, 0x22, 0x2f, 0x2f, 0xd5, 0xdf, 0x3d, 0xf9, 0xf9, 0x4d, 0xb2, 0x50, 0x93, 0x9a, 0x59, 0x3f, 0xca, 0xcb, + 0x20, 0x09, 0xea, 0xe0, 0x8b, 0x7c, 0xb4, 0x57, 0x76, 0xc1, 0x4f, 0xb4, 0xc1, 0xd1, 0xe7, 0x3b, 0xcf, 0x20, 0x80, 0x9e, 0x98, 0x5b, 0xeb, 0x3b, 0x10, 0x95, 0x0a, 0x1e, 0xb5, 0x69, 0xcc, 0xcb, + 0x67, 0x30, 0x5f, 0x0f, 0x01, 0xb7, 0x2b, 0x67, 0x13, 0x28, 0xee, 0x53, 0x36, 0x12, 0xe7, 0x8b, 0xbc, 0xe6, 0x88, 0x02, 0x77, 0x3a, 0x5b, 0x27, 0x2b, 0x18, 0x59, 0x97, 0x32, 0xd3, 0x49, 0xa6, + 0xbf, 0xe4, 0x94, 0x3a, 0xe1, 0x22, 0x1b, 0x5e, 0x33, 0xaa, 0x01, 0x4b, 0x1b, 0x9a, 0x34, 0xe6, 0x08, 0x0d, 0x1f, 0x23, 0x50, 0xcb, 0x87, 0x27, 0x6c, 0x0c, 0x37, 0x0a, 0xeb, 0xad, 0x4b, 0xc2, + 0x37, 0xaa, 0x91, 0x19, 0x78, 0xc1, 0x5b, 0x1e, 0xfd, 0x2d, 0xcc, 0xfb, 0x3d, 0x1c, 0xf8, 0x0f, 0x3a, 0x73, 0xe7, 0x07, 0x96, 0x3f, 0x32, 0xb3, 0xde, 0xb1, 0x3f, 0x8c, 0xc3, 0x97, 0x90, 0x85, + 0xd7, 0xb5, 0xd6, 0xee, 0x8b, 0xa7, 0xaf, 0x84, 0xa7, 0xfd, 0xa2, 0x7a, 0x1e, 0xaa, 0xb7, 0xeb, 0x67, 0x51, 0xc9, 0xd2, 0x52, 0xd5, 0xbb, 0x4e, 0x2d, 0x19, 0x70, 0x0b, 0x72, 0xaa, 0x33, 0x78, + 0x5c, 0x61, 0x4f, 0x65, 0x5c, 0xd2, 0x75, 0x58, 0xc0, 0xf1, 0x45, 0xd9, 0x8b, 0xa0, 0x4e, 0x24, 0xcb, 0x02, 0xc9, 0x56, 0x46, 0x9a, 0x49, 0xd0, 0x1c, 0x4e, 0x85, 0x1e, 0x8d, 0x3b, 0x4e, 0x6c, + 0x70, 0xba, 0xe3, 0x34, 0x9c, 0xf2, 0xed, 0xa0, 0x37, 0xe6, 0x6b, 0xb9, 0xc9, 0xb4, 0x4a, 0x0c, 0x67, 0x18, 0x38, 0x45, 0x5e, 0xdb, 0x71, 0x7f, 0xbb, 0xae, 0x90, 0x3f, 0x45, 0x49, 0xfe, 0xae, + 0xc0, 0x1c, 0xf2, 0x0f, 0xfe, 0x0f, 0x75, 0x35, 0x7c, 0xcf, 0x33, 0xf7, 0x63, 0x81, 0xb9, 0x33, 0x9d, 0xe7, 0x34, 0x62, 0x73, 0x4a, 0xcc, 0xe2, 0xd2, 0xe6, 0x0c, 0x2e, 0x5d, 0x99, 0xf4, 0x0a, + 0x80, 0x67, 0x59, 0xad, 0xb5, 0x85, 0x5e, 0x99, 0xa8, 0x63, 0xc5, 0x58, 0x17, 0xe0, 0x13, 0x37, 0xc0, 0x27, 0xdc, 0x76, 0x67, 0x49, 0x59, 0x97, 0xe3, 0x56, 0x5b, 0xe5, 0x1e, 0x14, 0xaa, 0xc7, + 0x74, 0xb3, 0xe5, 0x99, 0x30, 0x01, 0x67, 0x04, 0x6d, 0x7b, 0xf3, 0xc9, 0xde, 0xa1, 0x57, 0x7b, 0x51, 0xb2, 0x78, 0xb6, 0x5a, 0x88, 0x5f, 0x94, 0x0b, 0xfb, 0xd4, 0xb9, 0x47, 0x06, 0xe4, 0x4b, + 0x81, 0xb9, 0x0f, 0xd0, 0x38, 0x3f, 0x9e, 0x30, 0x1b, 0x37, 0x69, 0x50, 0x34, 0xce, 0xf7, 0x99, 0xc0, 0x7f, 0x2e, 0x27, 0x7c, 0xa0, 0x7c, 0x9e, 0xc1, 0x57, 0xed, 0x67, 0x93, 0x5d, 0x1a, 0xc9, + 0x70, 0x82, 0x72, 0xb6, 0x6a, 0x73, 0xfd, 0xa0, 0x78, 0xc7, 0xae, 0x5a, 0xb1, 0xf5, 0x0e, 0x39, 0xee, 0x95, 0x6d, 0x99, 0x82, 0xa4, 0x80, 0x15, 0xe0, 0xd2, 0xe9, 0xf5, 0x64, 0x01, 0x39, 0x0b, + 0x5c, 0xa1, 0x09, 0x74, 0x9a, 0xd0, 0x34, 0xb6, 0x1b, 0xb3, 0x9d, 0xbc, 0xd9, 0xf6, 0x6b, 0x5a, 0xaf, 0x28, 0x6c, 0x4b, 0xab, 0x82, 0x54, 0x38, 0x42, 0xb6, 0x5a, 0x49, 0x32, 0xe6, 0xe9, 0xee, + 0xe1, 0xb5, 0xe0, 0x7b, 0xab, 0x1c, 0xf2, 0x93, 0xdc, 0x68, 0xa4, 0xf6, 0x75, 0xea, 0xf4, 0x97, 0x70, 0x44, 0xb7, 0x45, 0x16, 0x1f, 0x18, 0x3e, 0x5f, 0xd9, 0x1d, 0x3e, 0xd2, 0x3e, 0x71, 0xf8, + 0xe3, 0x9d, 0x73, 0x61, 0x8f, 0x27, 0x76, 0x0a, 0x2d, 0xb6, 0x71, 0x1d, 0xda, 0x0c, 0x53, 0x8d, 0x9d, 0xe0, 0x56, 0xb4, 0x0c, 0x5d, 0x97, 0x95, 0x15, 0x39, 0x59, 0xa8, 0x21, 0xec, 0x89, 0xce, + 0x8c, 0x30, 0x36, 0xf2, 0x71, 0x2c, 0xb2, 0x80, 0x2a, 0x46, 0x49, 0xd0, 0x4f, 0xd4, 0x71, 0xb8, 0x4b, 0xbd, 0x92, 0x55, 0x25, 0xed, 0x48, 0x74, 0x2b, 0x7e, 0x92, 0xd4, 0x19, 0x33, 0x16, 0xd3, + 0x89, 0x81, 0xd0, 0x69, 0x43, 0x6c, 0x14, 0xde, 0xaf, 0xc1, 0xd7, 0x76, 0x8a, 0xd3, 0xb6, 0x7b, 0x66, 0xc9, 0x7f, 0xc6, 0x37, 0xee, 0x71, 0xdf, 0x88, 0xa3, 0x9f, 0x77, 0x7d, 0xdc, 0x56, 0x96, + 0xba, 0x81, 0xf7, 0x1e, 0xb4, 0x7f, 0xc1, 0x69, 0xbf, 0xd9, 0xf4, 0x07, 0xa3, 0x4c, 0x7f, 0xde, 0xf5, 0xac, 0x07, 0x49, 0x9e, 0x95, 0xf5, 0x28, 0x36, 0x8e, 0xc3, 0x83, 0x17, 0xaa, 0x91, 0x15, + 0x5c, 0x0d, 0xf5, 0xc7, 0x47, 0x41, 0x5a, 0xd5, 0x46, 0x1c, 0x3b, 0xf6, 0xc8, 0x8b, 0x33, 0xd3, 0x88, 0xe3, 0x0b, 0x15, 0xe8, 0xb3, 0xab, 0xfd, 0x24, 0xb2, 0xe7, 0xc9, 0xcf, 0xff, 0xef, 0x1e, + 0xd4, 0x7c, 0x70, 0xf9, 0x7d, 0x6f, 0x14, 0x7e, 0xfd, 0xfd, 0x87, 0x77, 0x62, 0xe3, 0xec, 0x7b, 0xb9, 0x9a, 0x37, 0xb7, 0x80, 0xf4, 0x6f, 0xc0, 0x61, 0x97, 0x1f, 0xfa, 0xe1, 0xeb, 0x1f, 0xd3, + 0x6b, 0x2e, 0x41, 0x04, 0x1f, 0x5e, 0xe8, 0x6d, 0x6f, 0x64, 0x1a, 0x95, 0x63, 0x07, 0xe5, 0xcf, 0x5b, 0x1b, 0xfe, 0x13, 0x5b, 0xf5, 0xfb, 0x00, 0x3d, 0xda, 0xaa, 0x5f, 0x2f, 0x58, 0x79, 0xa6, + 0x0c, 0x8e, 0x2e, 0xff, 0x3f, 0x5b, 0xaa, 0xf2, 0x2c, 0x32, 0x33, 0xe8, 0x04, 0x3f, 0xb8, 0x63, 0x98, 0x97, 0xb5, 0xcd, 0xdc, 0xae, 0x8e, 0x09, 0x53, 0x88, 0x53, 0xb6, 0xc0, 0xf6, 0x7b, 0xb0, + 0x11, 0xe9, 0x09, 0x42, 0xa0, 0xdc, 0x52, 0x48, 0x64, 0x00, 0x0d, 0xe9, 0xd8, 0x27, 0xd5, 0x71, 0xc1, 0xd4, 0x76, 0xed, 0x4d, 0x37, 0xa8, 0xdb, 0xd7, 0xa6, 0x30, 0x13, 0x8f, 0x4a, 0x8f, 0x20, + 0x6b, 0xdb, 0x4f, 0x19, 0x8b, 0x6b, 0x1b, 0xa4, 0x81, 0xdd, 0xfd, 0x5f, 0xf0, 0xf5, 0x9d, 0xe3, 0x88, 0xaa, 0x7a, 0x88, 0xdf, 0x42, 0xa8, 0xc6, 0x9f, 0x26, 0xdc, 0xf9, 0xa5, 0x3b, 0xd5, 0x5f, + 0x89, 0x3f, 0xf5, 0x09, 0x36, 0x65, 0x30, 0x0a, 0xab, 0x87, 0xbb, 0xce, 0x2b, 0x11, 0xe2, 0x17, 0x92, 0xa7, 0xcd, 0xe6, 0x7c, 0x31, 0x1a, 0x3f, 0x17, 0x19, 0x4e, 0x94, 0xfc, 0x6e, 0x18, 0x50, + 0x74, 0x0d, 0x0f, 0x16, 0x45, 0xe6, 0x6b, 0x98, 0xa1, 0x13, 0xa1, 0xee, 0x54, 0x18, 0xa2, 0xe6, 0xc4, 0x76, 0xe9, 0x1e, 0xe2, 0x03, 0xac, 0xd9, 0x19, 0x79, 0x88, 0xe1, 0x20, 0x80, 0x15, 0x67, + 0x11, 0x38, 0x8e, 0x0f, 0x2d, 0x16, 0xee, 0xca, 0x11, 0x10, 0x57, 0x54, 0x79, 0xfc, 0x08, 0x55, 0xa4, 0x63, 0xf1, 0x15, 0xe5, 0x96, 0xd3, 0x46, 0xe0, 0xda, 0xd4, 0x9e, 0x3c, 0x11, 0x19, 0x7e, + 0x85, 0x1f, 0xf8, 0xbe, 0xb0, 0x1f, 0x70, 0x2a, 0x7e, 0xcb, 0x1f, 0x8c, 0x8d, 0xfe, 0xa1, 0x72, 0xf3, 0xd2, 0x31, 0x78, 0x4d, 0xf9, 0xcc, 0xb7, 0xab, 0xf6, 0x33, 0xc0, 0x8e, 0xf0, 0x68, 0x5e, + 0xaa, 0x3c, 0x48, 0xbb, 0xe6, 0x18, 0xb1, 0x2b, 0xb6, 0x4f, 0xf4, 0x39, 0xea, 0x85, 0x70, 0x4c, 0xe3, 0x43, 0xd7, 0xbd, 0xb2, 0xc9, 0x7e, 0x42, 0x91, 0xfe, 0xfa, 0x00, 0xab, 0x83, 0x47, 0x59, + 0x2f, 0xd0, 0x3f, 0xf0, 0x2b, 0x31, 0xc8, 0x27, 0x8a, 0x27, 0x36, 0xd4, 0x41, 0x3c, 0xba, 0x90, 0xf8, 0x7e, 0xf6, 0x98, 0xbd, 0x4e, 0x15, 0xb5, 0x12, 0xb3, 0xbb, 0x83, 0x22, 0x0f, 0xd4, 0xda, + 0xa0, 0x54, 0x2f, 0x82, 0xe1, 0x48, 0xa9, 0xe2, 0xbc, 0xd1, 0x3b, 0xa3, 0x9f, 0x7a, 0xe3, 0x4a, 0x5a, 0x32, 0x21, 0x3e, 0x17, 0x1a, 0x8b, 0x31, 0x4c, 0x84, 0xeb, 0xd3, 0x45, 0x37, 0x48, 0xdb, + 0x69, 0xbe, 0x10, 0x6b, 0x1e, 0x16, 0xc3, 0x6c, 0x1d, 0x1c, 0xd6, 0x38, 0x13, 0xec, 0x44, 0x5d, 0x33, 0x95, 0x52, 0x06, 0x94, 0x27, 0x14, 0x8e, 0x6b, 0x5f, 0xd6, 0x6d, 0x05, 0xe5, 0xa0, 0x1a, + 0x19, 0xa5, 0xd7, 0xfc, 0x02, 0xed, 0xfa, 0x0f, 0x7c, 0xc7, 0xdb, 0xe5, 0x39, 0xa9, 0x53, 0x1a, 0x75, 0x56, 0x8e, 0xde, 0xb5, 0x97, 0x5f, 0xaf, 0x12, 0x9f, 0x5e, 0x3d, 0x6b, 0x89, 0xa3, 0x6b, + 0x35, 0xf1, 0x53, 0x60, 0xf2, 0xa7, 0x18, 0x81, 0xff, 0x7c, 0x0e, 0x3e, 0x79, 0xd3, 0x5d, 0xee, 0xd1, 0x79, 0xa4, 0xb7, 0x7c, 0x0e, 0x8f, 0x79, 0xa4, 0x6d, 0xfe, 0x79, 0xe4, 0xc0, 0x47, 0xd2, + 0xef, 0x23, 0xfe, 0xeb, 0xc6, 0x73, 0xc0, 0x1d, 0x9b, 0x35, 0x2c, 0x0d, 0x6e, 0xde, 0xa1, 0xa9, 0x98, 0x6a, 0x6d, 0xab, 0xc0, 0x3c, 0xcf, 0x79, 0x3b, 0xd6, 0x60, 0xc4, 0x27, 0xaa, 0x4d, 0x34, + 0x4d, 0x60, 0x3f, 0xe8, 0x12, 0xf9, 0x0f, 0xfa, 0x4a, 0x97, 0x9a, 0xc0, 0x3e, 0x75, 0xa4, 0x09, 0xec, 0xd1, 0x99, 0xc2, 0xf7, 0x33, 0x17, 0x90, 0xb4, 0x0a, 0x59, 0x3b, 0xe2, 0x61, 0x00, 0xd8, + 0xc3, 0x5c, 0x9e, 0x25, 0x54, 0x9f, 0xa6, 0xf8, 0x62, 0xca, 0xe4, 0x50, 0x4c, 0xac, 0x27, 0x0c, 0x91, 0xc4, 0xe4, 0x51, 0xd8, 0x25, 0x1c, 0x40, 0xa1, 0x6b, 0x4c, 0x9a, 0x43, 0x52, 0x66, 0xcd, + 0xca, 0xb4, 0x8b, 0xb6, 0x91, 0xba, 0x9f, 0x4b, 0x81, 0x8a, 0x82, 0x6e, 0x3e, 0xc5, 0x0d, 0x57, 0x21, 0x19, 0xdf, 0x04, 0xbd, 0x23, 0xb1, 0x21, 0x9c, 0x9b, 0x1c, 0xb5, 0xf3, 0x2f, 0xfa, 0xba, + 0xae, 0xc6, 0x2b, 0x96, 0xbe, 0xdf, 0x64, 0xdf, 0x7b, 0xfd, 0x5e, 0x57, 0xe3, 0x29, 0x9b, 0x9f, 0x6c, 0x27, 0x6a, 0x4f, 0x93, 0x25, 0x53, 0xad, 0x09, 0x2d, 0x97, 0xf6, 0x26, 0xaf, 0x70, 0x91, + 0x74, 0xdc, 0x76, 0xc8, 0x12, 0x50, 0xb0, 0x43, 0x65, 0x8a, 0x4c, 0x3a, 0xad, 0x97, 0x07, 0x65, 0x6d, 0x64, 0x95, 0x44, 0x5b, 0x87, 0x7a, 0xde, 0x2c, 0x41, 0x8d, 0x87, 0xb7, 0xe1, 0x71, 0xb7, + 0xc4, 0x53, 0x33, 0xf2, 0x82, 0x62, 0x36, 0xf8, 0xa4, 0x77, 0x48, 0x3d, 0xd7, 0x6a, 0x49, 0xba, 0xb2, 0x6f, 0x21, 0x1c, 0x1f, 0xe9, 0xeb, 0x7f, 0x6f, 0x26, 0xdf, 0xfd, 0x02, 0x38, 0xba, 0x7f, + 0xff, 0x99, 0x79, 0x7d, 0xde, 0xd2, 0x3a, 0xdd, 0x6e, 0x21, 0x9a, 0x17, 0xf2, 0x3c, 0x9e, 0x6b, 0x08, 0xaf, 0x6f, 0x54, 0x7c, 0xdb, 0x0e, 0x8d, 0x44, 0x64, 0x61, 0x58, 0x12, 0x71, 0x17, 0x79, + 0x78, 0x12, 0x43, 0x65, 0xb6, 0x1c, 0x28, 0xcd, 0x69, 0x94, 0x92, 0xe0, 0x14, 0x94, 0x40, 0x8a, 0x58, 0x3a, 0xc0, 0xe4, 0x6e, 0xad, 0x1d, 0x3d, 0x8d, 0xa7, 0x8e, 0x01, 0x6b, 0x39, 0xe5, 0xa1, + 0xd0, 0xe5, 0x64, 0x96, 0x52, 0xfb, 0x67, 0x52, 0xa5, 0x82, 0x77, 0xfb, 0xc8, 0xcf, 0xbb, 0xe6, 0x91, 0xd3, 0xe3, 0x2c, 0x8b, 0x1d, 0x23, 0x1d, 0x5d, 0x7c, 0xc6, 0xbf, 0x76, 0x90, 0xcf, 0xf2, + 0xea, 0xc5, 0xfc, 0xfc, 0xf1, 0xad, 0xdb, 0xed, 0xef, 0x4a, 0x4d, 0xba, 0xf1, 0xf6, 0x07, 0xef, 0x96, 0x98, 0x5f, 0x8f, 0x1f, 0x44, 0xdd, 0xdc, 0xdb, 0xd6, 0x1e, 0xcd, 0xf2, 0x3f, 0xc7, 0xf1, + 0xbe, 0xa1, 0xfe, 0x6b, 0x68, 0xaf, 0xee, 0x9d, 0xe7, 0xfc, 0x13, 0xa8, 0xde, 0x6d, 0xd8, 0x1b, 0x93, 0x71, 0xea, 0x32, 0x45, 0xc7, 0x2f, 0xa1, 0xae, 0x22, 0x3a, 0x3d, 0xef, 0x97, 0xb1, 0xed, + 0xc0, 0x6a, 0x29, 0xa8, 0x58, 0x33, 0x81, 0xf4, 0x30, 0x77, 0x2b, 0xdf, 0x4b, 0x8c, 0x9c, 0x13, 0x19, 0x22, 0xe4, 0x0e, 0xbe, 0xbe, 0x04, 0x86, 0x6d, 0xc6, 0x6d, 0x0b, 0x63, 0x3e, 0x19, 0xe6, + 0x90, 0x23, 0x4d, 0x2c, 0xad, 0x37, 0xc3, 0x64, 0x7a, 0xcc, 0x36, 0x2b, 0x62, 0xea, 0xce, 0x9e, 0x38, 0xa9, 0x8c, 0xd6, 0x08, 0x2e, 0xe5, 0xcb, 0xae, 0x7e, 0x74, 0x75, 0x9f, 0xef, 0xdf, 0x84, + 0xf9, 0xdf, 0x4d, 0x7f, 0xf9, 0x40, 0xc0, 0xcd, 0xca, 0xf7, 0xa8, 0x92, 0xf3, 0xa9, 0xf8, 0xe1, 0xe1, 0x49, 0xd7, 0xaa, 0xb3, 0xcb, 0xb8, 0xd7, 0xc6, 0xef, 0xa1, 0xff, 0x3c, 0x7f, 0xee, 0x9d, + 0x52, 0xc4, 0x83, 0xf1, 0x0f, 0xec, 0x93, 0xe6, 0x13, 0x07, 0xe9, 0xa3, 0x85, 0xfd, 0x9a, 0x27, 0xe3, 0x8a, 0xee, 0x69, 0xcc, 0x7f, 0xb7, 0x9e, 0xf5, 0x6a, 0x48, 0x55, 0x92, 0xa9, 0x46, 0x5c, + 0x1d, 0xf6, 0x8c, 0xc8, 0x36, 0x79, 0xaf, 0x63, 0x1b, 0x88, 0x8c, 0x0c, 0xca, 0x8d, 0xf5, 0x30, 0x0c, 0x84, 0x76, 0xb1, 0xa7, 0x0f, 0x9a, 0xcc, 0xd7, 0x01, 0x2f, 0x92, 0x4d, 0x58, 0xeb, 0x87, + 0x92, 0xb2, 0x36, 0xae, 0x6b, 0x44, 0x40, 0xa3, 0xcc, 0xc6, 0x24, 0x20, 0x9b, 0xa4, 0x6c, 0x1a, 0xb1, 0x9a, 0x77, 0x83, 0xb3, 0x0b, 0x06, 0x86, 0xc1, 0xd7, 0x73, 0xef, 0x35, 0xeb, 0x44, 0xf5, + 0x31, 0x4f, 0xef, 0x05, 0xfd, 0xed, 0x43, 0x76, 0xc3, 0x23, 0x25, 0xee, 0xb3, 0xc6, 0xf9, 0x3c, 0xb3, 0x7f, 0x93, 0x07, 0x47, 0x57, 0x8d, 0xb3, 0xef, 0xed, 0x49, 0x75, 0xce, 0xd4, 0x70, 0x37, + 0xc4, 0x70, 0x79, 0xb7, 0x86, 0xfc, 0x1d, 0xcc, 0x87, 0x73, 0x89, 0x59, 0x37, 0xdc, 0xdc, 0x39, 0x16, 0xbc, 0x5d, 0xd2, 0xc3, 0xdc, 0x5e, 0x3a, 0x2d, 0xcd, 0x04, 0x45, 0x79, 0x58, 0x74, 0x4a, + 0x6c, 0x26, 0x13, 0x49, 0x5c, 0xe4, 0x98, 0x11, 0x21, 0xee, 0x18, 0x5a, 0x25, 0x24, 0xb7, 0x9d, 0x0f, 0x22, 0x92, 0x14, 0x7d, 0xc4, 0xe2, 0xa9, 0x17, 0x2d, 0x64, 0x18, 0x76, 0xc1, 0xf8, 0x4f, + 0xa3, 0x5d, 0x9d, 0x24, 0x0b, 0xbf, 0xe7, 0x13, 0xf9, 0x32, 0x9f, 0xae, 0xe8, 0x83, 0xa3, 0xeb, 0xd6, 0x88, 0x7c, 0x9e, 0x53, 0xa2, 0x12, 0x6a, 0x47, 0xeb, 0x20, 0xc9, 0x34, 0xe4, 0x74, 0xf4, + 0x22, 0x3f, 0x42, 0x62, 0x9f, 0x6b, 0xf3, 0xb6, 0xf3, 0xf0, 0x21, 0x1c, 0x60, 0x89, 0x45, 0xfb, 0xda, 0xc9, 0x8a, 0x23, 0x3e, 0x1e, 0xef, 0xa7, 0x19, 0xb8, 0x59, 0x79, 0x69, 0x09, 0x83, 0x2c, + 0x5b, 0x03, 0x81, 0x85, 0x06, 0xdc, 0xf6, 0xb8, 0x26, 0x67, 0x0d, 0xba, 0xb5, 0x45, 0x78, 0xac, 0x18, 0x5d, 0xba, 0xdf, 0x25, 0xec, 0x0c, 0xff, 0xc2, 0x46, 0x79, 0x97, 0x53, 0x8f, 0xd3, 0x24, + 0xff, 0xbe, 0x89, 0xe0, 0xc1, 0xb7, 0xc0, 0xd1, 0xa3, 0x27, 0x7f, 0x62, 0x46, 0x38, 0x0e, 0x49, 0x82, 0x01, 0x0d, 0x50, 0x4d, 0x2b, 0xe5, 0x30, 0x30, 0x54, 0x21, 0x19, 0x4e, 0xb8, 0x47, 0x99, + 0x79, 0xeb, 0x4f, 0x79, 0x2b, 0xe6, 0xed, 0xe0, 0xa8, 0x19, 0xdc, 0xae, 0x59, 0xd0, 0x24, 0xba, 0x11, 0x42, 0x93, 0x48, 0x95, 0x86, 0x4d, 0x6d, 0x7b, 0xba, 0x60, 0x5b, 0xc8, 0x8f, 0x00, 0x5e, + 0x23, 0x26, 0x22, 0x1d, 0x57, 0x07, 0x87, 0x1f, 0xef, 0x1c, 0x0f, 0x9f, 0xed, 0x71, 0x75, 0xfd, 0xa7, 0xf3, 0xae, 0xba, 0x9f, 0x88, 0xfb, 0xe3, 0xc7, 0x67, 0xad, 0x1e, 0x79, 0x35, 0x20, 0xfd, + 0x8b, 0x84, 0xdc, 0xf1, 0x0d, 0xd0, 0xda, 0x8f, 0x47, 0xcc, 0x52, 0x27, 0x9c, 0xb9, 0x45, 0xa5, 0x31, 0xe7, 0xef, 0x9b, 0x44, 0x9d, 0x41, 0x4e, 0x26, 0xec, 0x28, 0x66, 0x1a, 0x5a, 0xc6, 0x9c, + 0x42, 0x78, 0x41, 0x2a, 0xb6, 0xc9, 0x7c, 0x9a, 0xb2, 0x70, 0xee, 0x92, 0x76, 0xb3, 0xeb, 0xe7, 0x6c, 0x57, 0xaf, 0x70, 0x9a, 0xc1, 0xd3, 0x28, 0xec, 0x28, 0x03, 0x5d, 0xda, 0xc1, 0xa6, 0x16, + 0xd0, 0x19, 0xd2, 0xa1, 0x1c, 0x13, 0xcc, 0xc0, 0x3e, 0x40, 0x5b, 0xd9, 0xf9, 0xef, 0xcd, 0xe3, 0x1f, 0x97, 0xed, 0xcf, 0xff, 0xdc, 0x2e, 0xd0, 0x2f, 0x67, 0xec, 0xad, 0xd5, 0xf1, 0xc7, 0x8f, + 0xdb, 0xe4, 0x5e, 0xfc, 0x0b, 0xeb, 0xfb, 0xa7, 0xa1, 0xbc, 0xc9, 0x8b, 0xfb, 0xf1, 0xe3, 0xab, 0x30, 0xa0, 0x1f, 0x7f, 0x38, 0x90, 0xf7, 0xf2, 0xe3, 0x6e, 0x43, 0x81, 0x7e, 0x3c, 0x1a, 0x44, + 0xba, 0x69, 0xf9, 0x6d, 0xb9, 0x75, 0xd7, 0x92, 0x26, 0x2d, 0xad, 0xda, 0xdc, 0xc0, 0x3c, 0xa8, 0xb1, 0xdb, 0x0d, 0x4c, 0x60, 0x38, 0x3b, 0x58, 0xab, 0xca, 0x23, 0x4c, 0xca, 0xb4, 0xf7, 0x14, + 0xd3, 0x14, 0x4d, 0x39, 0xf6, 0x5a, 0xdc, 0xe0, 0x8b, 0x85, 0x6a, 0xf8, 0x38, 0xa1, 0x93, 0xcb, 0x44, 0x21, 0x0e, 0xb3, 0x23, 0xb6, 0xde, 0x5b, 0x72, 0x1d, 0xbb, 0x07, 0xa4, 0xd4, 0x67, 0x8d, + 0x57, 0xe3, 0xff, 0x7d, 0xc6, 0xca, 0xa7, 0x04, 0x3c, 0xec, 0x4f, 0x9d, 0x1d, 0xbf, 0x4a, 0xfc, 0xfe, 0x45, 0xe5, 0xe0, 0x4c, 0xf2, 0x24, 0x3e, 0x9c, 0x2f, 0x9e, 0x11, 0xff, 0xe1, 0x51, 0xad, + 0xac, 0xa9, 0xf0, 0x48, 0x4c, 0x8a, 0x50, 0xed, 0xa5, 0x48, 0x9b, 0xb7, 0x34, 0xb4, 0x96, 0x1a, 0x91, 0xaf, 0xf3, 0x27, 0xd4, 0xda, 0xae, 0x0c, 0x6a, 0x67, 0xe4, 0x06, 0xb1, 0x33, 0xba, 0xe0, + 0x1e, 0x7c, 0x61, 0xae, 0xfa, 0x73, 0xaf, 0xc2, 0x0d, 0xf5, 0x73, 0xd7, 0x3e, 0xdd, 0x7b, 0x16, 0x1e, 0x83, 0x6e, 0x17, 0xd6, 0xa0, 0x63, 0x5c, 0xaa, 0xb8, 0x05, 0x1a, 0x64, 0xca, 0x10, 0x96, + 0x93, 0x68, 0x41, 0x0d, 0x87, 0x71, 0x42, 0xd0, 0x43, 0x44, 0x82, 0x94, 0x38, 0x80, 0x0c, 0x43, 0x65, 0x29, 0xef, 0x34, 0x20, 0x35, 0x76, 0xbb, 0x52, 0xcc, 0x2c, 0x27, 0x91, 0x91, 0x35, 0xcd, + 0xcd, 0xe9, 0x38, 0x4d, 0x19, 0x09, 0xd0, 0x19, 0x05, 0xd0, 0x43, 0x7a, 0x83, 0x35, 0x06, 0x0c, 0xae, 0xf6, 0xe0, 0x8b, 0x5e, 0xf8, 0xa4, 0x29, 0x93, 0xa6, 0xf4, 0x8d, 0xea, 0x22, 0x1e, 0x41, + 0xff, 0xc0, 0x37, 0xca, 0xca, 0x5d, 0x37, 0xfd, 0xf5, 0xba, 0xfd, 0x00, 0x43, 0x72, 0xd9, 0x12, 0x3e, 0x88, 0xce, 0x0f, 0x22, 0x25, 0x2e, 0xd6, 0x76, 0xec, 0xbe, 0x70, 0xfb, 0xd1, 0xee, 0x7e, + 0xdf, 0x50, 0xfb, 0x8a, 0xdd, 0xf1, 0x8a, 0x2e, 0x38, 0xba, 0x6e, 0x3d, 0x93, 0x27, 0x7b, 0x1a, 0xbc, 0x95, 0x22, 0xf9, 0x33, 0x8e, 0x71, 0x42, 0x5d, 0xdb, 0x13, 0x3e, 0x06, 0x4d, 0x32, 0x5f, + 0x80, 0xa8, 0x59, 0x49, 0xed, 0x8d, 0xa5, 0xe3, 0x96, 0x88, 0x20, 0xd2, 0x2e, 0x2a, 0xcf, 0x92, 0x7c, 0x1a, 0x85, 0x72, 0x80, 0x8e, 0x1d, 0x6d, 0x58, 0x6b, 0xb4, 0xba, 0xdb, 0x86, 0xb3, 0x75, + 0xad, 0x73, 0x5b, 0xde, 0x9a, 0x43, 0x33, 0x64, 0xc7, 0x6f, 0x7d, 0x20, 0xab, 0x18, 0xa1, 0xf2, 0xa4, 0x20, 0x79, 0x94, 0xd7, 0xff, 0x91, 0x23, 0xf5, 0xe3, 0xcc, 0xf9, 0xd7, 0xb2, 0x58, 0xce, + 0x14, 0x4f, 0x5c, 0x38, 0xfd, 0xff, 0x6c, 0xf6, 0x8a, 0xc0, 0x6b, 0x3b, 0x38, 0xa0, 0x55, 0x4e, 0xdd, 0x79, 0xb4, 0x9a, 0x52, 0xbb, 0x4d, 0x18, 0x34, 0x80, 0x78, 0xf0, 0x87, 0x9d, 0xba, 0xa8, + 0x5a, 0x37, 0x27, 0x12, 0xab, 0xd1, 0x12, 0xca, 0x56, 0x76, 0x3c, 0x0f, 0x81, 0xd3, 0xb0, 0x2e, 0x77, 0xdd, 0x9c, 0xee, 0x19, 0x12, 0x01, 0x93, 0xe9, 0xc1, 0xac, 0x85, 0x8a, 0x0d, 0xe7, 0x4b, + 0xc3, 0x86, 0xba, 0x65, 0x95, 0xd9, 0xe3, 0x63, 0xb9, 0xa5, 0x67, 0x37, 0xf8, 0x1a, 0x83, 0x11, 0xc7, 0xc1, 0x97, 0x49, 0x3b, 0x7f, 0x3e, 0xf4, 0x6f, 0x34, 0xc1, 0xd1, 0xfb, 0xd5, 0xb3, 0x43, + 0x8e, 0x76, 0x36, 0x1b, 0xd8, 0xfa, 0x50, 0x60, 0xab, 0x09, 0x44, 0x8e, 0x55, 0x61, 0xa6, 0x60, 0xdb, 0x5c, 0x56, 0x36, 0x34, 0xda, 0x85, 0x2a, 0x1d, 0x2f, 0x0f, 0xa2, 0xdf, 0x24, 0x48, 0xb4, + 0xb1, 0x5a, 0x70, 0x0c, 0x2b, 0x29, 0xe2, 0x24, 0x6b, 0xc8, 0x1e, 0xac, 0xf5, 0x61, 0xdc, 0xe8, 0xaa, 0xe0, 0x84, 0x1d, 0xdf, 0x7a, 0xf8, 0xac, 0x6a, 0x4d, 0x3b, 0xde, 0x0b, 0xc0, 0x5c, 0x9b, + 0x59, 0x35, 0xf1, 0xdb, 0x62, 0xf3, 0x3f, 0xa7, 0x7f, 0xff, 0xe7, 0x7f, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb8, 0x80, 0x79, 0xb2, 0x67, 0xe6, 0x00, 0x00, 0x13, + 0x33, 0x03, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, + 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x6c, 0x51, + 0xcd, 0x6e, 0xe2, 0x30, 0x10, 0xbe, 0xe7, 0x29, 0x46, 0x3e, 0x70, 0xda, 0x4c, 0x02, 0xcb, 0x1e, 0x96, 0xdb, 0x6a, 0x5b, 0xa9, 0xa7, 0x3e, 0x02, 0x95, 0xb1, 0xa7, 0x60, 0x94, 0x8c, 0x2d, 0x8f, + 0x8d, 0x8a, 0x2a, 0xde, 0xbd, 0xb2, 0x21, 0x34, 0x6a, 0x7b, 0xf4, 0x7c, 0xbf, 0xe3, 0x79, 0x6f, 0x00, 0x14, 0xeb, 0x91, 0xd4, 0x06, 0x14, 0x9d, 0x88, 0x53, 0x7b, 0xd0, 0x6c, 0x07, 0x8a, 0xea, + 0x57, 0x81, 0x4e, 0x14, 0xc5, 0x79, 0x2e, 0x68, 0x8f, 0x4b, 0xec, 0xaf, 0x53, 0x4b, 0x62, 0xa2, 0x0b, 0xe9, 0x86, 0x3c, 0x7b, 0x4b, 0x78, 0x14, 0xf8, 0x3f, 0xf8, 0x6c, 0x1f, 0x8b, 0x09, 0x3c, + 0xcd, 0x4d, 0x06, 0x67, 0x88, 0xa5, 0x46, 0xfc, 0x0b, 0xda, 0x1c, 0xa8, 0x5d, 0x4d, 0x4e, 0x91, 0x82, 0x17, 0x97, 0x7c, 0x3c, 0xab, 0x0d, 0x94, 0x32, 0x00, 0x2a, 0x9d, 0x43, 0xe5, 0xee, 0x5d, + 0xaa, 0x24, 0x00, 0x95, 0xe3, 0x50, 0x26, 0xaa, 0x01, 0xb8, 0x54, 0xdd, 0x35, 0x5f, 0x66, 0x22, 0x92, 0x54, 0x28, 0xec, 0x2d, 0x41, 0x79, 0x74, 0x99, 0x5d, 0x2a, 0xad, 0x16, 0x0b, 0xf8, 0x1c, + 0x3a, 0x4e, 0xb4, 0x8f, 0xba, 0x34, 0xc7, 0xa3, 0x4c, 0xf6, 0x92, 0x74, 0xac, 0xea, 0x57, 0xad, 0xa5, 0x3d, 0x4a, 0x1b, 0x33, 0x27, 0x37, 0x12, 0x60, 0xe7, 0xd8, 0xd2, 0xdb, 0x8c, 0x6a, 0x69, + 0x97, 0xf7, 0x53, 0xd0, 0xe8, 0x19, 0xda, 0xd6, 0xb1, 0x04, 0x32, 0x09, 0xb0, 0x2b, 0xb3, 0x97, 0xd1, 0xdb, 0x3c, 0x90, 0x74, 0x5f, 0xbc, 0xba, 0x9d, 0xe3, 0xce, 0x0c, 0xae, 0x54, 0x9a, 0xd9, + 0xde, 0x37, 0xb2, 0x74, 0x7a, 0xa0, 0x40, 0x6c, 0x89, 0x8d, 0xa3, 0xd9, 0x66, 0xb7, 0xa0, 0x92, 0xb9, 0x5d, 0x61, 0x8f, 0xeb, 0x7b, 0xeb, 0x1c, 0x28, 0x4e, 0x7b, 0x6f, 0xd7, 0xd8, 0xe3, 0x6a, + 0x82, 0x92, 0xbe, 0x7e, 0xe1, 0x76, 0x8d, 0xcb, 0xdf, 0xd8, 0xcf, 0x53, 0x7e, 0x8a, 0x30, 0xe5, 0x70, 0xf5, 0xfa, 0x52, 0x55, 0x7f, 0x70, 0x3a, 0x10, 0x7c, 0xfb, 0x93, 0x4a, 0xe8, 0xf1, 0xef, + 0xcd, 0xb5, 0xb9, 0x34, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x04, 0x4c, 0x45, 0xda, 0x2c, 0x01, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, + 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0x8c, 0x53, 0xb1, 0x6e, 0xdb, 0x30, 0x10, 0xdd, 0xf5, 0x15, 0xb7, 0x91, 0x02, 0x68, 0xda, 0x49, + 0xdb, 0xa5, 0x46, 0xba, 0x14, 0x05, 0x9a, 0xa5, 0x4b, 0xbb, 0x15, 0x1d, 0x58, 0xf2, 0x12, 0x2b, 0x95, 0x49, 0xe5, 0x78, 0x32, 0x12, 0x04, 0xfe, 0xf7, 0xe2, 0x28, 0xca, 0x56, 0x1c, 0x14, 0xe8, + 0x64, 0xf2, 0xf1, 0xdd, 0x3b, 0xdd, 0x7b, 0x67, 0x35, 0x66, 0x84, 0xcc, 0xd4, 0x79, 0x56, 0xdb, 0xc6, 0xa7, 0x98, 0x19, 0x5e, 0x20, 0xb3, 0x23, 0x86, 0x23, 0xdc, 0x00, 0xe1, 0xe3, 0xd8, 0x11, + 0x6a, 0x75, 0xe7, 0x5c, 0x5e, 0x3d, 0xe4, 0x15, 0x8d, 0x91, 0xbb, 0x3d, 0xaa, 0x76, 0x66, 0x0b, 0x03, 0x33, 0x2f, 0xb9, 0x79, 0x1c, 0x90, 0x18, 0x33, 0x0b, 0xab, 0xd2, 0xee, 0xc6, 0xe8, 0x97, + 0x1c, 0x6b, 0x55, 0x6b, 0x77, 0x2e, 0x86, 0x1e, 0x67, 0x25, 0xbe, 0x90, 0x61, 0x37, 0xe0, 0x42, 0xe1, 0xfb, 0x80, 0xa2, 0xf0, 0xd2, 0x00, 0x1c, 0x90, 0x72, 0x97, 0xe2, 0x47, 0x50, 0x1e, 0x57, + 0x79, 0x40, 0x5f, 0x01, 0x65, 0x1a, 0x00, 0x7e, 0x1e, 0x70, 0x7a, 0x91, 0x53, 0x81, 0xba, 0x30, 0x01, 0x5d, 0x28, 0xd7, 0x9c, 0x46, 0xf2, 0x95, 0x33, 0x9d, 0x55, 0x73, 0x3c, 0xf5, 0x09, 0x8e, + 0x5d, 0xed, 0x13, 0xdd, 0x5e, 0x68, 0xdc, 0xdd, 0x23, 0x95, 0x4a, 0x3f, 0x66, 0x4e, 0x7b, 0xa4, 0x5b, 0x11, 0xdc, 0x5c, 0x5d, 0xbf, 0x7b, 0xaf, 0x9a, 0xe3, 0x5c, 0x88, 0x44, 0x5f, 0xcb, 0x40, + 0x04, 0x37, 0xc0, 0x70, 0xf3, 0x49, 0x10, 0xf9, 0x11, 0x29, 0xb6, 0x48, 0x94, 0x48, 0x23, 0x51, 0xbb, 0x9d, 0xee, 0x31, 0xe8, 0x76, 0x5b, 0x1a, 0xcb, 0xe4, 0x5a, 0xdd, 0x46, 0xc6, 0x7b, 0x72, + 0x5c, 0x26, 0x9b, 0xac, 0xc9, 0xe0, 0xe0, 0xe0, 0xfa, 0x2e, 0x00, 0x1e, 0x30, 0xb2, 0x32, 0x93, 0xae, 0x08, 0x96, 0x8c, 0xb4, 0xd8, 0xda, 0x5a, 0xde, 0x61, 0xd4, 0x19, 0xe9, 0x80, 0xa7, 0x7e, + 0xd2, 0x61, 0xe8, 0x5d, 0xd4, 0x1f, 0x4a, 0x3b, 0x98, 0x73, 0xaa, 0xb4, 0xb6, 0x60, 0x00, 0x76, 0x48, 0xd2, 0x7a, 0xad, 0x4e, 0x40, 0x96, 0xef, 0x12, 0x0f, 0x16, 0x08, 0x6b, 0x31, 0xdf, 0x76, + 0xc1, 0xcc, 0x53, 0xbf, 0x7d, 0x9c, 0x8c, 0x34, 0xa0, 0xd6, 0x53, 0xf2, 0x6f, 0x08, 0x92, 0x86, 0x01, 0xe5, 0xd3, 0xde, 0xe2, 0x93, 0xdb, 0x0f, 0x3d, 0x5a, 0xdf, 0xa7, 0x31, 0x94, 0xc9, 0xb2, + 0xfd, 0x47, 0x55, 0x4d, 0xd6, 0x80, 0xba, 0xb2, 0x9b, 0xf3, 0x3b, 0x3e, 0x0d, 0xe8, 0x59, 0x5f, 0x6f, 0x36, 0x97, 0x90, 0xfa, 0x9c, 0x22, 0x63, 0xe4, 0xd5, 0x8f, 0x92, 0x3e, 0xac, 0x1f, 0x72, + 0x8a, 0xeb, 0x33, 0x2b, 0x06, 0x2d, 0x21, 0x18, 0x20, 0xcc, 0x63, 0xcf, 0xed, 0xd9, 0x30, 0x80, 0x57, 0x31, 0x19, 0x50, 0xdf, 0x12, 0x94, 0xab, 0xaa, 0x1e, 0x4e, 0x8c, 0xf4, 0x47, 0xd7, 0xda, + 0x25, 0x1a, 0x10, 0x87, 0x2f, 0x8f, 0xa3, 0xeb, 0xeb, 0xa3, 0xfd, 0x9d, 0xc2, 0xb3, 0x15, 0x23, 0x4d, 0x59, 0xa9, 0x57, 0x64, 0x5c, 0x12, 0x77, 0xe8, 0x02, 0x52, 0xfe, 0x79, 0x5a, 0xd9, 0x5f, + 0x06, 0x14, 0xfa, 0x5d, 0x52, 0xff, 0x57, 0x53, 0x57, 0xb8, 0x54, 0x89, 0x97, 0xf5, 0x6f, 0x75, 0xf1, 0xd5, 0x75, 0xdd, 0x66, 0x60, 0x5a, 0x03, 0x49, 0x20, 0xe3, 0x19, 0x3f, 0x96, 0xd3, 0xd1, + 0x2c, 0x76, 0x59, 0x73, 0x2b, 0x5b, 0xda, 0x6e, 0x9b, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb9, 0xc7, 0xa4, 0xab, 0xdf, 0x01, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, + 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0x8c, 0x52, 0xc1, 0x6e, 0xdb, 0x3a, + 0x10, 0xbc, 0xeb, 0x2b, 0xe6, 0x46, 0x19, 0xd0, 0x93, 0xde, 0x7b, 0xcd, 0xc9, 0x86, 0x0b, 0x14, 0x41, 0x0e, 0x29, 0xd0, 0x16, 0x68, 0xd1, 0x53, 0xd1, 0x03, 0x43, 0x6e, 0x2c, 0x22, 0x14, 0xe9, + 0x90, 0xcb, 0x38, 0x46, 0xe0, 0x7f, 0x2f, 0x48, 0xc9, 0x96, 0x52, 0x04, 0x68, 0x6f, 0xd2, 0x68, 0x76, 0x67, 0x34, 0x3b, 0x22, 0x45, 0x42, 0xe4, 0x60, 0x14, 0x8b, 0x4d, 0x55, 0x29, 0xef, 0x22, + 0xe3, 0x3e, 0x39, 0x85, 0x2d, 0x02, 0x3d, 0x26, 0x13, 0xa8, 0x16, 0x6d, 0x2b, 0x56, 0x6d, 0x2f, 0x9d, 0xb6, 0xb4, 0x99, 0x28, 0x4c, 0x91, 0x97, 0x14, 0x96, 0x7b, 0x12, 0xab, 0xf3, 0xd7, 0x17, + 0x5c, 0x5b, 0x9f, 0xf4, 0xcd, 0x13, 0x39, 0xc6, 0x69, 0xc9, 0x53, 0x19, 0xa7, 0x8c, 0xc7, 0x4c, 0xaf, 0xba, 0x0e, 0x37, 0x2e, 0xa6, 0x40, 0xe0, 0x5e, 0x32, 0xb8, 0xa7, 0xa2, 0xce, 0xc6, 0x3b, + 0x28, 0x3f, 0xec, 0x2d, 0x31, 0x45, 0x28, 0x4b, 0xd2, 0xd9, 0x23, 0x0e, 0x3d, 0x39, 0xec, 0x65, 0x8c, 0xa4, 0x21, 0xf1, 0x24, 0xad, 0xd1, 0x28, 0xcb, 0xda, 0x2a, 0x1b, 0xaa, 0xc5, 0x77, 0x67, + 0x78, 0x8d, 0xd1, 0x6a, 0x7c, 0x4d, 0x11, 0x0d, 0x64, 0x3c, 0x3a, 0x05, 0xc6, 0xf6, 0x3d, 0x5e, 0x2a, 0x80, 0xdb, 0xbd, 0x95, 0xae, 0xbe, 0x5a, 0x6d, 0x2a, 0x60, 0x34, 0xae, 0x25, 0x4b, 0x6c, + 0xcb, 0x57, 0xc0, 0xc9, 0x81, 0xd6, 0x10, 0x6c, 0x76, 0x14, 0x44, 0x53, 0x20, 0x95, 0x22, 0xfb, 0x81, 0xc2, 0xad, 0x5e, 0x43, 0xfc, 0xfb, 0xdf, 0xff, 0xef, 0xae, 0x44, 0x05, 0x9c, 0x2a, 0xa0, + 0xeb, 0xf0, 0x61, 0x29, 0x07, 0xe3, 0x94, 0x4d, 0x9a, 0x22, 0x8c, 0x6e, 0xc0, 0xc7, 0x3d, 0x41, 0x3a, 0x8d, 0xe8, 0x53, 0x50, 0x04, 0xc9, 0x90, 0x18, 0x8c, 0x33, 0x43, 0x1a, 0xda, 0x8b, 0xfa, + 0x1c, 0x0e, 0xb6, 0x70, 0x74, 0x58, 0xa4, 0x58, 0x8f, 0x96, 0xcc, 0xac, 0x3b, 0x1a, 0xca, 0x8b, 0xd7, 0x10, 0xca, 0x0f, 0x2d, 0x3d, 0xcb, 0x9c, 0x57, 0xbb, 0x88, 0xb8, 0xcd, 0xa9, 0x4c, 0xcc, + 0x51, 0x79, 0x0d, 0xd1, 0x2d, 0xc0, 0xfc, 0xbf, 0xf9, 0x07, 0xf2, 0x29, 0xce, 0x2e, 0x06, 0xaf, 0x1e, 0xae, 0xbd, 0x63, 0x7a, 0x3e, 0xdb, 0xf8, 0x34, 0x23, 0xf5, 0xbc, 0x7d, 0x9c, 0xe9, 0x3a, + 0xdc, 0xba, 0x27, 0xff, 0x40, 0xaf, 0x6f, 0x77, 0x30, 0xdc, 0x17, 0x64, 0x11, 0x49, 0x83, 0x43, 0x6f, 0x54, 0x8f, 0xd8, 0xfb, 0x64, 0xf5, 0xe5, 0xbc, 0x85, 0xeb, 0x13, 0x83, 0x42, 0xf0, 0x61, + 0x4e, 0x23, 0x50, 0x4c, 0x36, 0x5b, 0x80, 0x3c, 0x48, 0x33, 0xb6, 0xb2, 0x5e, 0x98, 0x6b, 0x8a, 0xfb, 0x72, 0x3c, 0x6e, 0xfd, 0x43, 0x3d, 0xf2, 0xa7, 0x77, 0x7a, 0x4c, 0xd2, 0x4e, 0x50, 0x7b, + 0xe7, 0xf5, 0xb1, 0xc1, 0xc7, 0x6f, 0x5f, 0x3e, 0xb7, 0xb9, 0xea, 0x6e, 0x67, 0xee, 0x8f, 0x75, 0x19, 0x7e, 0x8b, 0xdd, 0x93, 0xd4, 0x14, 0xe2, 0x0f, 0xa1, 0xe8, 0x9f, 0x1c, 0xaf, 0xf8, 0xd9, + 0x40, 0x90, 0xea, 0xbd, 0xf8, 0x13, 0x7b, 0x8c, 0x78, 0xe4, 0x97, 0x56, 0x8e, 0x45, 0x0c, 0x97, 0x41, 0xa7, 0xeb, 0xd5, 0xa6, 0x2a, 0x69, 0x2b, 0x2b, 0x63, 0x5c, 0x26, 0x5b, 0x4a, 0x37, 0xa7, + 0x3b, 0x1f, 0x24, 0x24, 0xc5, 0x3e, 0x2c, 0x83, 0x9f, 0xfa, 0xc9, 0xbd, 0x89, 0xed, 0xab, 0xce, 0x2c, 0xc7, 0x2f, 0x0c, 0xeb, 0x77, 0xb9, 0xd2, 0x30, 0xee, 0xde, 0xaf, 0xcb, 0x4a, 0x6f, 0x29, + 0xa3, 0x0d, 0x34, 0xdd, 0xa5, 0xdd, 0x8c, 0x95, 0xd7, 0xd2, 0xe6, 0x53, 0x75, 0x36, 0x53, 0xda, 0xf7, 0x95, 0xe2, 0xde, 0xbb, 0x48, 0x63, 0x68, 0x93, 0x7c, 0x20, 0x4e, 0xc1, 0xbd, 0xdd, 0xd3, + 0xb1, 0x59, 0xcd, 0xf4, 0xfc, 0x17, 0x25, 0x6d, 0xc3, 0x24, 0x21, 0xce, 0x43, 0xbf, 0xf5, 0x15, 0x28, 0xf8, 0x69, 0x55, 0xdc, 0x9d, 0xaa, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x5a, 0x92, 0xcd, 0x83, 0x23, 0x02, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, + 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x7c, 0x55, 0x4d, 0x8f, 0xdb, 0x36, 0x10, 0xbd, 0xeb, 0x57, 0x4c, 0x37, 0x87, 0xb5, 0x8b, 0x5d, 0x69, 0x81, 0xa2, 0x40, 0xe0, 0xa0, 0x87, 0xa0, 0x68, 0x9b, + 0x02, 0x45, 0xbb, 0x48, 0xdc, 0x2f, 0x6c, 0x17, 0x20, 0x2d, 0x8e, 0x2d, 0x7a, 0xa9, 0x19, 0x85, 0xa4, 0xec, 0x15, 0x82, 0xfc, 0xf7, 0x62, 0x48, 0xc9, 0x1f, 0x5d, 0xa7, 0x27, 0xc3, 0xe4, 0xe3, + 0xd3, 0xbc, 0x99, 0x37, 0x33, 0xaf, 0xe0, 0x57, 0x36, 0x58, 0x6e, 0x03, 0xbc, 0x5b, 0x2e, 0xef, 0xe1, 0xc7, 0x9e, 0xea, 0x68, 0x99, 0x8a, 0xe2, 0x4f, 0x74, 0x35, 0xb7, 0x08, 0x91, 0x61, 0xe0, + 0xde, 0x03, 0xe1, 0xfe, 0x00, 0x5d, 0x8f, 0x28, 0xe8, 0x3c, 0x6f, 0xb1, 0x8e, 0x5f, 0xc1, 0xb2, 0x41, 0x58, 0xb1, 0x75, 0xe8, 0x3b, 0xa7, 0x23, 0x1e, 0x11, 0x35, 0x1b, 0x84, 0x5a, 0x13, 0xac, + 0x10, 0xd6, 0xdc, 0x93, 0x01, 0x4b, 0xf0, 0xa0, 0x2c, 0x19, 0x7c, 0x2e, 0xb7, 0x41, 0x3d, 0xce, 0xca, 0x6a, 0xfa, 0x33, 0x2f, 0x61, 0xd9, 0xd8, 0x13, 0xfa, 0xbd, 0x75, 0x0e, 0x3c, 0x86, 0x8e, + 0xc9, 0x48, 0x20, 0x96, 0x6a, 0x6e, 0x2d, 0x6d, 0x72, 0xac, 0x3f, 0xfd, 0xb0, 0x04, 0x4d, 0x06, 0xee, 0x7f, 0xfb, 0xb0, 0x04, 0x8f, 0x1f, 0x7b, 0x0c, 0x31, 0x8c, 0x14, 0xf8, 0xac, 0xdb, 0xce, + 0x9d, 0xc4, 0x61, 0x03, 0xec, 0xbd, 0x8d, 0x11, 0x09, 0xc2, 0x40, 0x75, 0xe3, 0x99, 0xb8, 0x0f, 0x6e, 0xb8, 0x01, 0x8f, 0xb1, 0xf7, 0x24, 0xac, 0x1a, 0xbc, 0xde, 0xc3, 0x4e, 0xbb, 0x1e, 0x4b, + 0xf8, 0x79, 0x9d, 0x75, 0x1f, 0xb5, 0xa2, 0x5f, 0xb3, 0x6f, 0x03, 0x68, 0x1a, 0x40, 0x9f, 0x90, 0x00, 0x3e, 0x63, 0xdd, 0x0b, 0xe6, 0x46, 0x9e, 0x24, 0xb5, 0x41, 0xaf, 0xd1, 0x0d, 0xa0, 0x8d, + 0x81, 0xd8, 0x20, 0xa8, 0x84, 0x57, 0xf0, 0x84, 0xc3, 0x9e, 0x7d, 0xd2, 0x22, 0xc7, 0x13, 0xf7, 0x4d, 0xd2, 0x91, 0x03, 0x01, 0x0d, 0xea, 0xde, 0x73, 0x6b, 0x03, 0xaa, 0xb2, 0x28, 0x5e, 0xbd, + 0x82, 0x5f, 0xb8, 0xd6, 0xee, 0xf8, 0x91, 0xa2, 0x78, 0xbb, 0x8e, 0xe8, 0xa7, 0x03, 0xda, 0x80, 0xa2, 0xae, 0x05, 0x4b, 0x21, 0x6a, 0xe7, 0xd4, 0x31, 0x06, 0xdf, 0x13, 0xc4, 0xb3, 0x7c, 0x3a, + 0x61, 0x72, 0x03, 0xac, 0x86, 0xff, 0xbe, 0x16, 0x6c, 0xba, 0x95, 0x6f, 0x4a, 0x31, 0x7d, 0x4f, 0xd1, 0xb6, 0x98, 0x4b, 0x80, 0xcf, 0x1d, 0x07, 0x84, 0xd8, 0x78, 0x44, 0x40, 0x32, 0x1d, 0x5b, + 0x8a, 0xa1, 0x2c, 0x0a, 0x80, 0xaf, 0x41, 0x55, 0x2a, 0x95, 0x7f, 0x3a, 0x87, 0x35, 0xfb, 0xf3, 0xd4, 0x95, 0x23, 0xae, 0x41, 0xed, 0x62, 0x53, 0x79, 0xd4, 0xc6, 0x12, 0x86, 0x70, 0xe1, 0x9d, + 0x86, 0xc3, 0x2d, 0x64, 0x38, 0xd4, 0x0d, 0xd6, 0x4f, 0xe7, 0x0c, 0xce, 0xee, 0xf0, 0x8b, 0x04, 0xd3, 0xe5, 0xf9, 0xfb, 0x24, 0xaa, 0xd3, 0x5e, 0xb7, 0x28, 0xc9, 0xeb, 0x3c, 0xef, 0xac, 0xc1, + 0x17, 0x95, 0x38, 0x92, 0xe9, 0x08, 0x96, 0x76, 0x5c, 0xeb, 0xc9, 0x3e, 0x1a, 0xd4, 0xf7, 0x4c, 0x11, 0x9f, 0xa3, 0x02, 0x5e, 0x89, 0xed, 0xa1, 0x66, 0x8a, 0xda, 0xd2, 0xc1, 0x91, 0xa3, 0x09, + 0xc1, 0x92, 0x38, 0x45, 0x67, 0xed, 0x85, 0x52, 0x6a, 0x1b, 0x8a, 0xc3, 0x17, 0x1a, 0x4d, 0xc6, 0xe1, 0xfb, 0x0c, 0x9d, 0xd5, 0x99, 0x72, 0x0e, 0x9f, 0x0a, 0x10, 0xbe, 0x10, 0xc1, 0xf1, 0x06, + 0xbe, 0x83, 0xf1, 0xa2, 0x74, 0xbc, 0x79, 0x53, 0x80, 0x1c, 0x96, 0x42, 0x3b, 0x3d, 0x28, 0x9b, 0x18, 0xbb, 0x3f, 0xd0, 0x07, 0xcb, 0x34, 0xbf, 0x08, 0x68, 0x31, 0x36, 0x6c, 0xe6, 0x6f, 0xa0, + 0xaa, 0x92, 0xc4, 0xb3, 0x08, 0xf3, 0x25, 0xcc, 0x98, 0xdc, 0x90, 0x1a, 0x89, 0x7d, 0xee, 0xa3, 0xd0, 0x77, 0x1d, 0xfb, 0x88, 0x66, 0x7e, 0x89, 0xf3, 0x63, 0x8f, 0x7e, 0xc8, 0x94, 0x76, 0x0d, + 0xe9, 0xdf, 0x31, 0xa9, 0x01, 0xb4, 0xc7, 0x63, 0x66, 0xad, 0x58, 0x59, 0xa8, 0xc7, 0x6f, 0x5e, 0xe2, 0x5b, 0xb1, 0x19, 0xe9, 0xc6, 0x54, 0x86, 0x14, 0xea, 0x14, 0xa5, 0x5c, 0x8f, 0x55, 0x3d, + 0x6d, 0xf2, 0x8b, 0xe9, 0x40, 0x6d, 0xd0, 0x87, 0x4c, 0xa6, 0x9d, 0xcb, 0x72, 0xc7, 0x53, 0x08, 0x48, 0x11, 0xf6, 0x36, 0x36, 0x89, 0x1e, 0x77, 0x48, 0xb1, 0xf8, 0x2c, 0x85, 0xc9, 0xbe, 0x38, + 0x75, 0x4a, 0x98, 0xa6, 0x95, 0xae, 0x6b, 0x0c, 0x21, 0x0b, 0x49, 0x76, 0x5e, 0x79, 0xde, 0x07, 0xf4, 0xe2, 0x8c, 0x07, 0xc9, 0xfe, 0xa2, 0xaa, 0x52, 0xcb, 0x34, 0x1c, 0xe2, 0xe2, 0xf5, 0xdd, + 0xeb, 0xbb, 0x17, 0x06, 0x7f, 0x9c, 0xcd, 0x53, 0x67, 0xff, 0x3f, 0x7c, 0x32, 0xec, 0xe3, 0x6c, 0x5e, 0xc2, 0xdf, 0x63, 0xf3, 0xf6, 0x01, 0x41, 0xd5, 0xbd, 0x77, 0x4a, 0x2c, 0xaa, 0x44, 0xbe, + 0x02, 0x4d, 0x39, 0xf6, 0x2f, 0xba, 0x76, 0x91, 0xdc, 0x26, 0x36, 0x62, 0x87, 0x85, 0x3c, 0x87, 0xdb, 0xbf, 0x72, 0xee, 0x6e, 0x0d, 0x5c, 0x7f, 0xba, 0x6a, 0xd0, 0x39, 0xbe, 0x5a, 0xc0, 0xd5, + 0x9e, 0xbd, 0x33, 0x57, 0x9f, 0xaf, 0xe1, 0x9f, 0x02, 0xe0, 0xf6, 0xdd, 0x75, 0xb2, 0x36, 0xc5, 0xdb, 0x38, 0x74, 0xb8, 0x00, 0xdd, 0x75, 0xce, 0x66, 0xeb, 0x57, 0xdb, 0xc0, 0x94, 0x61, 0x17, + 0x55, 0x1c, 0xb3, 0x78, 0xec, 0x5c, 0xd1, 0x7c, 0x68, 0xc3, 0xc3, 0xbc, 0x48, 0x9a, 0x1e, 0x78, 0x87, 0xde, 0xb1, 0x36, 0xb7, 0x9d, 0xe7, 0x88, 0x29, 0xfc, 0xc7, 0x99, 0x30, 0x87, 0x45, 0x55, + 0xed, 0xf7, 0xfb, 0x92, 0xba, 0x76, 0x1b, 0xca, 0x9a, 0xdb, 0xaa, 0xd3, 0xf5, 0x93, 0xde, 0x60, 0x75, 0xe1, 0x49, 0xce, 0xeb, 0xd9, 0x7e, 0x48, 0xe5, 0x55, 0xa9, 0xec, 0xdf, 0xde, 0x7d, 0x03, + 0x1f, 0xd0, 0xef, 0x6c, 0x8d, 0xf0, 0x3b, 0xe9, 0x9d, 0xb6, 0x4e, 0xaf, 0x1c, 0xaa, 0x8c, 0x91, 0x46, 0x76, 0x56, 0xc4, 0xbe, 0xc7, 0xe8, 0x07, 0x35, 0xba, 0x44, 0x1c, 0x7d, 0x3e, 0xf1, 0x6d, + 0x00, 0x23, 0xc6, 0x6e, 0x2d, 0xe5, 0x49, 0xb1, 0x42, 0x98, 0x62, 0x41, 0x73, 0x03, 0x2b, 0x2d, 0xf6, 0x60, 0x4a, 0xb5, 0x68, 0xb1, 0x65, 0x3f, 0x40, 0x1f, 0xf4, 0x06, 0x53, 0x70, 0xb9, 0x52, + 0x8e, 0xb9, 0x03, 0x83, 0x4e, 0x0f, 0x79, 0x98, 0x2f, 0x31, 0xc8, 0xd4, 0x95, 0x8c, 0xd9, 0x97, 0x8b, 0x54, 0x36, 0x9c, 0xeb, 0x0d, 0xca, 0xb4, 0x79, 0xe8, 0xc9, 0x46, 0x88, 0x18, 0xa2, 0xec, + 0x48, 0xf9, 0xad, 0xe4, 0x44, 0xf6, 0x64, 0xe2, 0xd7, 0x04, 0x0f, 0x96, 0x22, 0x6e, 0x7c, 0x1e, 0x51, 0x67, 0xc8, 0x93, 0x8b, 0xbc, 0x58, 0xdf, 0x3a, 0x07, 0x4a, 0x16, 0x2e, 0xac, 0xad, 0xc3, + 0x20, 0xa6, 0x96, 0xa8, 0x05, 0x0c, 0xc6, 0x7a, 0xac, 0xa3, 0x44, 0x2f, 0x0d, 0xec, 0xfb, 0x71, 0x68, 0x4d, 0x36, 0x92, 0xfd, 0x20, 0xb8, 0x54, 0xe9, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0xd8, 0x26, 0x8e, 0x5d, 0xb9, 0x03, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x8c, + 0x54, 0x5d, 0x6f, 0xdb, 0x36, 0x14, 0x7d, 0xd7, 0xaf, 0x38, 0xc0, 0x1e, 0x94, 0x04, 0xb2, 0x34, 0x0c, 0xdb, 0x8b, 0x03, 0x0f, 0x03, 0x32, 0x23, 0xed, 0x80, 0x2e, 0x45, 0xe3, 0x0d, 0xe8, 0x23, + 0x2d, 0x5e, 0x4b, 0x6c, 0x28, 0x5e, 0x95, 0xbc, 0x4a, 0x9c, 0x05, 0xfe, 0xef, 0x03, 0x49, 0x39, 0x8d, 0xd7, 0x35, 0xdb, 0x93, 0xa9, 0xcb, 0x7b, 0x0e, 0xcf, 0xb9, 0x1f, 0x6e, 0x2e, 0x2e, 0x0a, + 0x5c, 0xe0, 0x23, 0x4f, 0x1e, 0x6f, 0x36, 0x9b, 0xf7, 0xe8, 0x95, 0xd3, 0xd6, 0xb8, 0x0e, 0xbb, 0xc9, 0xb5, 0x62, 0xd8, 0x55, 0x30, 0xee, 0x9e, 0xef, 0x48, 0xe3, 0xc1, 0x48, 0x0f, 0x52, 0x6d, + 0x0f, 0x4f, 0x9f, 0x27, 0x0a, 0x52, 0x63, 0xd3, 0x9b, 0x00, 0x13, 0xa0, 0x1c, 0x68, 0xaf, 0x86, 0xd1, 0x52, 0x64, 0x3b, 0x42, 0x21, 0xbd, 0x12, 0x50, 0xdb, 0x33, 0x05, 0x18, 0x09, 0x30, 0x6e, + 0x9c, 0x04, 0xc2, 0x90, 0x9e, 0xd0, 0x2a, 0x6b, 0xc9, 0x57, 0x50, 0x4e, 0xc3, 0x93, 0x4c, 0xde, 0x65, 0x1e, 0xef, 0xd9, 0xc3, 0xec, 0x22, 0x51, 0x4c, 0x33, 0xae, 0xe5, 0x21, 0x0a, 0x9a, 0x1f, + 0x8d, 0xcf, 0x05, 0x1e, 0x48, 0xfa, 0x18, 0x64, 0xe9, 0xc9, 0xc7, 0x77, 0x5c, 0xc4, 0x26, 0x07, 0xef, 0x6f, 0x6e, 0x37, 0x60, 0x8f, 0xeb, 0xf5, 0xa6, 0x2e, 0x90, 0xec, 0xbd, 0x75, 0x68, 0x95, + 0xc3, 0x96, 0x4e, 0xbd, 0x94, 0x51, 0xe8, 0x1c, 0x2a, 0x53, 0x9e, 0x1c, 0xf3, 0x84, 0x82, 0x3c, 0xa7, 0xb9, 0x71, 0x48, 0x81, 0x72, 0xa6, 0xfb, 0x65, 0x54, 0x5e, 0x0d, 0x78, 0xba, 0x62, 0x27, + 0xb4, 0x97, 0x03, 0xda, 0x7c, 0x80, 0x7a, 0x3e, 0xf1, 0xf6, 0x13, 0xb5, 0x52, 0xbf, 0xcc, 0xce, 0xa1, 0xe7, 0xe4, 0x7a, 0xcb, 0xfa, 0x31, 0x39, 0x3c, 0x1a, 0x4b, 0x01, 0xb3, 0x83, 0x72, 0x8f, + 0xaf, 0xe1, 0x3e, 0x4f, 0xe4, 0x33, 0x30, 0x9f, 0x82, 0xf8, 0x58, 0x09, 0x4d, 0x81, 0xbc, 0x51, 0xd6, 0xfc, 0x45, 0x1a, 0x2a, 0x95, 0x32, 0x23, 0xab, 0xff, 0xc1, 0x69, 0xb9, 0x83, 0xe5, 0xae, + 0x4b, 0x25, 0x4d, 0x77, 0xd9, 0x7a, 0x2c, 0x33, 0xeb, 0x80, 0x1d, 0x7b, 0x94, 0xc6, 0xed, 0xb8, 0xac, 0x50, 0x3e, 0x28, 0xef, 0xe2, 0x6f, 0xea, 0x54, 0x59, 0x81, 0xa4, 0x7d, 0xd5, 0x68, 0x4f, + 0x4a, 0x93, 0x0f, 0x49, 0x72, 0xea, 0xd0, 0xd1, 0xf0, 0x7c, 0xf1, 0x12, 0x9b, 0xcd, 0x7c, 0xc1, 0x66, 0x01, 0x5f, 0x43, 0x73, 0xfc, 0x35, 0x64, 0x2f, 0x32, 0xfe, 0x49, 0x3e, 0xe4, 0x39, 0x9c, + 0xe1, 0xa3, 0x67, 0xe1, 0x96, 0x2d, 0xee, 0xf3, 0x4d, 0x24, 0xb8, 0x25, 0x5a, 0x22, 0x66, 0x87, 0x65, 0xd3, 0x74, 0x46, 0xfa, 0x69, 0x5b, 0xb7, 0x3c, 0x34, 0x77, 0x4e, 0x89, 0xb9, 0xa7, 0x45, + 0x50, 0x4e, 0x6f, 0x79, 0xdf, 0xdc, 0xb9, 0xc5, 0x68, 0xa7, 0xce, 0xb8, 0x45, 0x1c, 0x9b, 0x66, 0x6b, 0x79, 0xdb, 0x0c, 0xca, 0xb8, 0x46, 0x73, 0x1b, 0x9a, 0x6e, 0x32, 0x9a, 0x42, 0xe3, 0x58, + 0xd3, 0xa7, 0x50, 0x0f, 0xfa, 0x3b, 0xe9, 0x69, 0x31, 0x6b, 0x59, 0xe4, 0x8a, 0x14, 0xb8, 0x68, 0x8a, 0x96, 0x5d, 0x74, 0x1e, 0xb7, 0x8c, 0xb0, 0x82, 0x0a, 0x8f, 0xae, 0xc5, 0xd9, 0x9c, 0x78, + 0x8e, 0xd5, 0xcf, 0x78, 0x2a, 0x80, 0xa6, 0xc1, 0xc7, 0x9b, 0x3f, 0x3e, 0xe0, 0xea, 0xe6, 0xd7, 0x35, 0xde, 0xac, 0x3f, 0xac, 0x0b, 0xbc, 0xec, 0x55, 0x1d, 0x5b, 0x71, 0xf6, 0xdb, 0xed, 0xcd, + 0xef, 0x75, 0xb6, 0x6d, 0x76, 0x8f, 0x47, 0x8e, 0x0a, 0x6e, 0xb2, 0xb6, 0xc2, 0x0f, 0xe7, 0xe7, 0x97, 0x45, 0xa6, 0x7a, 0xbb, 0x3b, 0x99, 0xb3, 0xbc, 0xaf, 0xcf, 0xbb, 0x52, 0xe5, 0x6d, 0x9c, + 0x07, 0xf7, 0xc1, 0x58, 0x9b, 0x3e, 0x94, 0x71, 0x5f, 0x4d, 0x67, 0x81, 0x38, 0x4b, 0x67, 0xff, 0x68, 0xce, 0x6a, 0xb5, 0x42, 0x19, 0x99, 0xca, 0xf3, 0x24, 0x1e, 0xf3, 0x3a, 0xcf, 0x1f, 0x48, + 0xd0, 0xe5, 0xc9, 0xdc, 0x57, 0xe9, 0xe6, 0xf0, 0x5f, 0xf2, 0xae, 0xd7, 0xff, 0xa6, 0xce, 0xb8, 0xd6, 0x4e, 0x9a, 0xa0, 0x4e, 0x16, 0x20, 0x8d, 0xb9, 0x11, 0xd0, 0xde, 0x04, 0x09, 0x05, 0x70, + 0x00, 0xd9, 0x40, 0xdf, 0x14, 0x7c, 0xbd, 0xfe, 0xa6, 0xde, 0x44, 0xbb, 0x3c, 0x5d, 0xb8, 0x2f, 0x8a, 0x67, 0xde, 0x53, 0x24, 0x82, 0x28, 0x99, 0xc2, 0x15, 0x6b, 0x5a, 0xe2, 0xc7, 0xef, 0x7f, + 0xaa, 0xe6, 0xc0, 0x3b, 0x0a, 0x41, 0x75, 0xb4, 0x44, 0xf9, 0x2e, 0xbf, 0xed, 0x58, 0xa0, 0xac, 0xe5, 0x07, 0xd2, 0x25, 0x0e, 0x97, 0x91, 0xaf, 0x38, 0x14, 0x45, 0xd3, 0x60, 0xbd, 0x1f, 0xd9, + 0x4b, 0xb2, 0x7b, 0xfc, 0x03, 0x2d, 0x06, 0xd6, 0x93, 0xa5, 0x9a, 0xd2, 0x55, 0xc0, 0x0a, 0x4f, 0xc7, 0xd1, 0x39, 0x5c, 0x16, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb6, + 0x09, 0x1b, 0x6e, 0x9c, 0x02, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x6a, 0x73, 0x6f, 0x6e, 0xec, 0xbd, 0x59, 0x93, 0xe2, 0xce, 0x96, 0x27, 0xf8, 0xde, 0x9f, 0x22, 0x2d, 0x9f, 0x66, 0x86, 0x26, 0xb4, 0x22, 0x89, 0x32, 0xab, 0x9e, 0x42, 0x08, 0x90, 0x10, 0x02, + 0xb4, 0x01, 0xd2, 0x58, 0xdf, 0x31, 0xed, 0x0b, 0xda, 0x57, 0xa4, 0xe9, 0xae, 0xcf, 0x3e, 0xc6, 0x16, 0x09, 0x11, 0x10, 0xa1, 0xe0, 0xfe, 0xab, 0x6e, 0x5f, 0x9b, 0x79, 0xc9, 0x94, 0x4b, 0xc4, + 0x91, 0xfc, 0x77, 0xdc, 0x8f, 0x9f, 0xcd, 0x8f, 0xff, 0x3f, 0xff, 0xe5, 0xd7, 0xaf, 0xdf, 0x91, 0x16, 0x5a, 0xbf, 0xff, 0xe5, 0xd7, 0x6f, 0xb7, 0x28, 0x92, 0xbe, 0xab, 0x45, 0x66, 0x60, 0x65, + 0xbf, 0xff, 0xeb, 0xf1, 0x49, 0x65, 0x65, 0xb9, 0x17, 0x47, 0xc7, 0x87, 0xe0, 0x1b, 0xf4, 0x06, 0x9e, 0xef, 0x06, 0xb1, 0xb1, 0xb7, 0xbd, 0xc0, 0xda, 0xbc, 0x3f, 0x85, 0x4f, 0xf7, 0x33, 0x2b, + 0x2d, 0xbd, 0xcc, 0xca, 0x7f, 0xff, 0xcb, 0xaf, 0x22, 0x2b, 0xad, 0xd3, 0xbd, 0x44, 0x33, 0xf6, 0x9a, 0x73, 0xba, 0x77, 0x7c, 0xd7, 0xaf, 0x5f, 0xbf, 0xdf, 0xaf, 0xbe, 0x7a, 0xf3, 0xe9, 0xe9, + 0xc3, 0xb7, 0x9f, 0x9e, 0x04, 0x9e, 0x61, 0x45, 0xf9, 0xe9, 0x4f, 0x47, 0x89, 0x66, 0xb8, 0x56, 0x1f, 0xbe, 0x7d, 0x6c, 0x5a, 0x89, 0x15, 0x99, 0x56, 0x64, 0x78, 0x37, 0x2f, 0x3e, 0x3d, 0xb1, + 0x35, 0x2d, 0xef, 0xfb, 0x79, 0x3f, 0x2b, 0xa3, 0xc2, 0x3b, 0xbf, 0xfb, 0x6f, 0xe0, 0xdb, 0xf0, 0x0d, 0xfc, 0x7d, 0xf9, 0xcd, 0xff, 0xbc, 0x21, 0x52, 0x51, 0x4f, 0xe9, 0x44, 0xb1, 0x69, 0x85, + 0xe7, 0x4f, 0xfb, 0x1b, 0xfc, 0x06, 0xbe, 0xa1, 0xef, 0x2f, 0xff, 0xf5, 0xeb, 0x77, 0x5e, 0x26, 0x56, 0x56, 0x58, 0x79, 0x71, 0x7a, 0x8c, 0xbe, 0x81, 0x6f, 0xf0, 0xed, 0xe3, 0x42, 0x4b, 0xce, + 0x2f, 0x1e, 0xbc, 0x81, 0x6f, 0xd0, 0xfb, 0x8b, 0xff, 0xcb, 0xcd, 0xeb, 0x4f, 0xf4, 0xff, 0xef, 0x30, 0x36, 0xcb, 0xc0, 0xca, 0x81, 0x7f, 0xb3, 0xb5, 0xbc, 0xf0, 0xec, 0x06, 0xd0, 0xfc, 0xaa, + 0x6f, 0xc4, 0x61, 0xe2, 0x1d, 0x61, 0xba, 0x81, 0xf1, 0x06, 0x28, 0xe8, 0x1e, 0xa8, 0xcc, 0xca, 0xe3, 0xa0, 0xb2, 0xcc, 0x2b, 0xc8, 0xf9, 0xbf, 0x00, 0x40, 0x66, 0x39, 0x5e, 0x5e, 0x64, 0xcd, + 0x5b, 0x94, 0x84, 0x7e, 0xfe, 0x16, 0x67, 0xce, 0xe3, 0x37, 0x00, 0xfd, 0xbb, 0x66, 0xff, 0x44, 0xfa, 0xad, 0x70, 0xda, 0x3f, 0xe4, 0xbd, 0xa8, 0xb0, 0x9c, 0xcc, 0x2b, 0x9a, 0x23, 0xfd, 0xdc, + 0xd5, 0x06, 0x10, 0xdc, 0x77, 0xaa, 0xf1, 0x4a, 0x5e, 0x26, 0xbb, 0x7c, 0x9b, 0x31, 0x3c, 0x32, 0x42, 0xb5, 0xdd, 0x78, 0xc1, 0x98, 0x7a, 0xb0, 0x00, 0x0b, 0x2a, 0x45, 0x61, 0x72, 0x06, 0xc0, + 0xbb, 0x1a, 0x8f, 0x0f, 0xba, 0x17, 0x0c, 0x5d, 0x08, 0x2a, 0xe3, 0x1a, 0x02, 0xdb, 0x42, 0x84, 0x67, 0xe5, 0x54, 0x6b, 0x97, 0xa4, 0xed, 0xeb, 0x59, 0xae, 0x0e, 0xa2, 0xa0, 0x17, 0xad, 0x83, + 0x81, 0x4f, 0x89, 0xbe, 0x3f, 0x90, 0x44, 0xe7, 0x5f, 0xff, 0xb5, 0x0b, 0x7b, 0x35, 0xbf, 0x3a, 0x21, 0x8b, 0xbd, 0x41, 0xf0, 0x1b, 0xd6, 0x05, 0xda, 0xdc, 0x8b, 0xcc, 0x23, 0x48, 0x99, 0x5b, + 0xe6, 0x80, 0x97, 0x3f, 0x41, 0x15, 0x7c, 0x83, 0xd0, 0x57, 0x60, 0xfd, 0x40, 0x1d, 0xe8, 0x03, 0x5e, 0xde, 0x3f, 0x13, 0xfb, 0x1e, 0xc8, 0xe1, 0x72, 0x22, 0x0d, 0x21, 0x90, 0x5a, 0x6a, 0xcc, + 0x3a, 0x72, 0x94, 0x68, 0xb1, 0x58, 0x5b, 0x4e, 0x6f, 0xe5, 0xb4, 0x69, 0xee, 0x0d, 0x4b, 0x0e, 0x0d, 0x45, 0x3d, 0x96, 0x07, 0x0d, 0x96, 0x10, 0xe2, 0x80, 0x6a, 0x39, 0x69, 0x33, 0xc9, 0xe7, + 0x6a, 0xa6, 0xd5, 0x5e, 0x8f, 0x8c, 0xa9, 0xa5, 0xbc, 0x21, 0x35, 0x98, 0x72, 0xe7, 0x29, 0xaf, 0xc8, 0xd3, 0x8a, 0xa3, 0x6c, 0x47, 0x06, 0x31, 0x78, 0xc1, 0xdf, 0x03, 0x59, 0xdd, 0xcc, 0xd5, + 0xd3, 0x2d, 0x2b, 0x72, 0xbc, 0xe8, 0xd1, 0x68, 0x3f, 0x7e, 0xd8, 0x7f, 0xfb, 0xd7, 0x6e, 0x98, 0xb6, 0xa1, 0x96, 0x19, 0xad, 0xb6, 0x07, 0x4e, 0xf3, 0xfa, 0x38, 0xd1, 0xbe, 0x1a, 0xae, 0xf0, + 0x0b, 0xb8, 0x3e, 0x78, 0x03, 0xd0, 0xbf, 0x69, 0x9c, 0x06, 0x2b, 0xfc, 0x3d, 0xc6, 0x3b, 0x86, 0x84, 0x77, 0x7a, 0x4b, 0x4b, 0x4b, 0xcc, 0xb3, 0x18, 0xdf, 0x66, 0xb8, 0xcd, 0xd0, 0x0d, 0x36, + 0x86, 0xbd, 0x96, 0x61, 0x2c, 0x87, 0x2b, 0xcd, 0x56, 0xb6, 0xbc, 0xa1, 0xd2, 0xdb, 0x1d, 0xbd, 0x3a, 0x78, 0x9a, 0xa0, 0x2a, 0x13, 0x8a, 0x9d, 0xd4, 0x66, 0x00, 0xc1, 0x43, 0xb5, 0x71, 0x06, + 0x60, 0xcf, 0x8e, 0x95, 0x0d, 0xec, 0x8f, 0x9d, 0x22, 0x4b, 0xc5, 0x11, 0x96, 0x2e, 0xcb, 0xa5, 0x38, 0xfa, 0x06, 0xe3, 0xe7, 0xe3, 0xd7, 0xb4, 0x6c, 0x2b, 0xeb, 0x17, 0x71, 0xdf, 0x88, 0xa3, + 0xc8, 0x32, 0xce, 0x02, 0x04, 0xba, 0x13, 0x13, 0x7f, 0x25, 0xa7, 0x34, 0x5d, 0xcf, 0x4e, 0x9f, 0xf7, 0x8c, 0x35, 0xd0, 0x8f, 0x59, 0x73, 0x26, 0x79, 0x14, 0x1d, 0xa7, 0x8b, 0x13, 0x1f, 0xa0, + 0xef, 0xf9, 0x10, 0x45, 0xd6, 0x10, 0x60, 0x3c, 0x1e, 0x70, 0x5b, 0xc6, 0x55, 0xb0, 0xc4, 0xa4, 0x22, 0x9d, 0x2c, 0x5a, 0x9c, 0xf2, 0xd7, 0x12, 0x9b, 0x29, 0x20, 0xb8, 0x06, 0xda, 0x6a, 0x2d, + 0x86, 0x83, 0x64, 0x35, 0xdd, 0x07, 0xd8, 0xa1, 0x9c, 0x65, 0xb3, 0x68, 0x17, 0x01, 0x9b, 0x42, 0x5a, 0x2e, 0xed, 0x65, 0x31, 0xb2, 0xd5, 0x21, 0x00, 0x09, 0x85, 0xe5, 0xee, 0xf3, 0x56, 0x1e, + 0xa6, 0x86, 0xe4, 0x79, 0xe0, 0x93, 0xb1, 0xfe, 0x15, 0x1e, 0x79, 0x91, 0x69, 0x46, 0xd1, 0x0f, 0x62, 0xc7, 0xf1, 0x22, 0xe7, 0x09, 0x32, 0xf0, 0x89, 0x21, 0x3f, 0x47, 0xe6, 0x9e, 0xf8, 0x09, + 0xa3, 0xfb, 0x5b, 0xfd, 0x13, 0xe5, 0xef, 0xd1, 0x82, 0x49, 0x5f, 0x90, 0xd4, 0x83, 0xb4, 0xae, 0x5c, 0x6b, 0x55, 0xcd, 0x74, 0x32, 0x0f, 0xa6, 0xa2, 0xb2, 0x92, 0xf7, 0x59, 0x4f, 0xf4, 0xd7, + 0xc5, 0x2a, 0xca, 0x16, 0x6b, 0x04, 0xb1, 0x7b, 0x1b, 0x66, 0xbb, 0x68, 0xad, 0x96, 0x4f, 0x54, 0x23, 0xdd, 0x38, 0xb8, 0xaf, 0x21, 0x0b, 0xd4, 0x24, 0x77, 0x61, 0xdb, 0x3a, 0xb5, 0xd4, 0xd3, + 0x40, 0x78, 0xe8, 0x0b, 0x87, 0xc1, 0x7a, 0xec, 0x21, 0xf3, 0xd2, 0x3b, 0x8e, 0xda, 0x2f, 0xa0, 0xf1, 0x9f, 0x8d, 0x93, 0x8b, 0xac, 0xfd, 0x31, 0x1c, 0x7e, 0x75, 0x59, 0x60, 0xce, 0x04, 0xbe, + 0xef, 0xb5, 0x8f, 0xd8, 0x9b, 0x85, 0x53, 0x49, 0xf1, 0x00, 0xc6, 0xb5, 0xa8, 0x51, 0x9a, 0xf9, 0x6a, 0x26, 0x29, 0x73, 0x7d, 0xd6, 0xab, 0xa2, 0x88, 0x57, 0xaa, 0x09, 0x18, 0x0e, 0xc2, 0x70, + 0x6f, 0x40, 0x12, 0xdb, 0x8b, 0x0e, 0xa3, 0x24, 0xd9, 0x8f, 0x17, 0x1c, 0xb3, 0x00, 0x35, 0x15, 0x35, 0xf5, 0x60, 0x33, 0x5e, 0xc6, 0x33, 0xd1, 0x75, 0xc3, 0xde, 0xbe, 0x9d, 0xa0, 0xaa, 0xdc, + 0xec, 0xc9, 0x98, 0x73, 0xd0, 0x8e, 0x0b, 0xcb, 0x71, 0x7d, 0xec, 0x9b, 0x96, 0x95, 0xf4, 0xad, 0xb4, 0xd4, 0x82, 0xd3, 0xbc, 0x44, 0xee, 0x26, 0xc8, 0xf5, 0x47, 0x7e, 0x1e, 0x47, 0xfd, 0xbc, + 0xd0, 0xf4, 0xc0, 0xea, 0xe7, 0x45, 0xe6, 0x45, 0x8e, 0x67, 0x37, 0xef, 0x7a, 0x02, 0x78, 0xfb, 0xfb, 0xf3, 0x4f, 0x0d, 0xd7, 0x0a, 0xb5, 0x7e, 0x91, 0x69, 0x47, 0x4c, 0xaf, 0x1a, 0x09, 0x7a, + 0x4f, 0xb9, 0xcc, 0xbc, 0xbe, 0x9f, 0x5f, 0xd4, 0x09, 0xf8, 0x0d, 0xfe, 0x2c, 0x0d, 0xec, 0x32, 0x32, 0xef, 0x47, 0xec, 0x51, 0xd3, 0x68, 0xce, 0x9a, 0x86, 0xe3, 0x15, 0x6e, 0xa9, 0xdf, 0x13, + 0x0c, 0x6e, 0xf9, 0x73, 0xfe, 0xc1, 0x9b, 0x11, 0x87, 0x40, 0x9e, 0xc4, 0x51, 0x1e, 0x67, 0x39, 0x60, 0x25, 0xb1, 0x6e, 0x65, 0x56, 0xbb, 0xf7, 0xa2, 0x2e, 0xa2, 0x24, 0xca, 0xbd, 0xbe, 0x16, + 0x78, 0x4e, 0xf4, 0x64, 0x98, 0x20, 0x77, 0xbd, 0xef, 0x3c, 0x4a, 0xde, 0xc9, 0x1e, 0x07, 0xcb, 0x7b, 0xa3, 0x7f, 0xa2, 0xf6, 0xfd, 0x90, 0x51, 0x93, 0x71, 0xb0, 0x61, 0xd3, 0xdd, 0x12, 0x11, + 0x66, 0x64, 0xc8, 0x7a, 0xba, 0x69, 0x6f, 0xdb, 0x74, 0xac, 0xa0, 0x41, 0xe4, 0x4f, 0xca, 0x78, 0xd9, 0xca, 0x03, 0x09, 0x8c, 0x27, 0xd3, 0xc4, 0x36, 0x81, 0x76, 0x90, 0xce, 0xe9, 0x8d, 0x96, + 0x95, 0xfb, 0xcc, 0x33, 0x29, 0xd4, 0x2f, 0x17, 0x2b, 0x78, 0xba, 0xe3, 0xbc, 0x5a, 0xe6, 0x0f, 0xd9, 0x70, 0x9b, 0xf2, 0x85, 0xa6, 0x68, 0xc4, 0x4e, 0x50, 0xea, 0x97, 0xc5, 0xfb, 0x79, 0x3c, + 0xf4, 0x6b, 0xcf, 0x2c, 0xdc, 0xcb, 0x10, 0x02, 0x6f, 0x54, 0xcf, 0x2e, 0xe8, 0x02, 0x9f, 0xef, 0x67, 0x96, 0x63, 0x1d, 0x9e, 0xa0, 0x8e, 0xbe, 0xa4, 0x0e, 0xfe, 0x21, 0x7b, 0x45, 0xfd, 0xd4, + 0xe8, 0xa3, 0xdd, 0x34, 0x40, 0x48, 0x4b, 0xac, 0xb5, 0xbd, 0xe3, 0x20, 0x79, 0x25, 0xa6, 0x35, 0x18, 0x0f, 0x19, 0x6f, 0x3a, 0x8a, 0xab, 0x4d, 0x3b, 0xe4, 0x06, 0x22, 0x44, 0x39, 0x3d, 0x54, + 0xca, 0xa8, 0xda, 0xe6, 0xac, 0x9a, 0xc7, 0x12, 0x20, 0x0b, 0xb9, 0xd2, 0xd2, 0xf1, 0x62, 0xab, 0xfa, 0x3c, 0x94, 0x1d, 0xd0, 0x45, 0xdc, 0x40, 0xa3, 0x8c, 0x74, 0x9c, 0x38, 0x9d, 0x25, 0x76, + 0x9a, 0x9a, 0x0c, 0x9a, 0xc5, 0x91, 0xe9, 0xfc, 0xc7, 0x2b, 0x2e, 0xcf, 0x50, 0xfe, 0xc0, 0xb6, 0xc7, 0xa3, 0xfb, 0x15, 0x9c, 0x6f, 0x09, 0x03, 0xfd, 0xbb, 0x66, 0x1f, 0xe9, 0x86, 0x75, 0xa5, + 0xd9, 0x46, 0x85, 0xb1, 0xfe, 0x46, 0x65, 0x45, 0xa7, 0x05, 0xb1, 0x98, 0x03, 0x68, 0x6c, 0x46, 0x91, 0xd9, 0xa8, 0x68, 0x89, 0xca, 0x74, 0x79, 0x6d, 0x3f, 0xf3, 0xa7, 0x4c, 0xb5, 0xcc, 0xe8, + 0x11, 0xd6, 0x20, 0xf4, 0x78, 0x0a, 0x8d, 0x99, 0x68, 0xd1, 0xf4, 0xf8, 0x45, 0x4a, 0x98, 0xd2, 0x7c, 0xcd, 0x43, 0x7a, 0x8f, 0xa5, 0xe4, 0x94, 0x9a, 0x1a, 0xc5, 0xde, 0x14, 0xb6, 0x28, 0x6a, + 0x41, 0xaf, 0x8f, 0x70, 0x2b, 0x8c, 0xfd, 0x3f, 0x23, 0xf2, 0xf7, 0xdf, 0xf0, 0xbb, 0xa5, 0xf2, 0xd8, 0x87, 0xbc, 0x6f, 0x97, 0x41, 0x70, 0xee, 0xa3, 0x11, 0x9b, 0x56, 0x3f, 0x89, 0xbd, 0xa8, + 0x78, 0x2c, 0x20, 0x8f, 0x80, 0x24, 0xfd, 0x23, 0x5b, 0x7e, 0x9f, 0xed, 0x25, 0xe8, 0x91, 0xa1, 0xf6, 0x1f, 0xcc, 0xf9, 0xf7, 0x0f, 0x78, 0xc4, 0xf7, 0xc1, 0x1b, 0xfc, 0x22, 0xdf, 0xcf, 0x64, + 0x2f, 0x5c, 0x3f, 0x37, 0xfa, 0x27, 0x6a, 0xdf, 0xf3, 0x9c, 0x2a, 0x85, 0x1c, 0x72, 0x58, 0x9d, 0x4c, 0x73, 0x8e, 0x65, 0xd4, 0x20, 0xb3, 0xed, 0x3a, 0x28, 0x1d, 0x82, 0xa3, 0xf7, 0x46, 0x94, + 0xf8, 0xf9, 0x60, 0xb3, 0x0e, 0x17, 0xd0, 0x7a, 0xe4, 0xf6, 0xc2, 0x11, 0x02, 0xca, 0x20, 0x25, 0xc5, 0x85, 0x4d, 0xa9, 0xa0, 0x09, 0xcb, 0x72, 0xbe, 0x4b, 0xd6, 0xe1, 0x3a, 0xe4, 0xb8, 0x39, + 0xb6, 0xc5, 0x71, 0x84, 0xd3, 0x46, 0xc8, 0xbc, 0x17, 0xe8, 0xde, 0xf6, 0x75, 0xa5, 0xf5, 0x4e, 0x08, 0x1d, 0x17, 0xa8, 0xff, 0x50, 0x2e, 0x7d, 0x25, 0xed, 0xfe, 0x8e, 0x35, 0xe6, 0x81, 0xb4, + 0xeb, 0xb0, 0xc6, 0x40, 0x7d, 0x9c, 0xe7, 0x76, 0x75, 0xc3, 0xcc, 0x24, 0x24, 0x98, 0xe9, 0x23, 0x76, 0xab, 0x0d, 0x61, 0x98, 0xd4, 0x72, 0x04, 0x56, 0x9d, 0x1b, 0x3c, 0xbf, 0xe9, 0x3c, 0xda, + 0xb5, 0xf3, 0x79, 0xd1, 0x04, 0xd6, 0x33, 0x23, 0x15, 0x7d, 0x43, 0x5e, 0xed, 0xfd, 0x99, 0xee, 0xb5, 0xfb, 0xe7, 0x56, 0xff, 0x44, 0xef, 0xfb, 0xd1, 0xd8, 0xea, 0xe4, 0x30, 0x1b, 0xcf, 0x47, + 0x12, 0x94, 0xe9, 0xbe, 0xb7, 0xa1, 0x74, 0xd8, 0x4d, 0xd9, 0x29, 0xbd, 0x54, 0x16, 0x07, 0xa7, 0xd8, 0x13, 0x4b, 0x59, 0x38, 0xa8, 0x08, 0xa3, 0xd6, 0x14, 0x32, 0xc5, 0x96, 0xc5, 0x41, 0xdf, + 0xa9, 0xfc, 0x38, 0x8a, 0x44, 0x0f, 0x5a, 0xec, 0x0f, 0x3d, 0x86, 0x8a, 0x5d, 0x73, 0x1d, 0x4c, 0x13, 0x18, 0x86, 0xeb, 0xcd, 0x68, 0xc1, 0xb8, 0x96, 0x3a, 0xe7, 0xc5, 0x49, 0x47, 0xb5, 0xcc, + 0x88, 0x83, 0x38, 0x3b, 0x1a, 0x4b, 0x95, 0x95, 0xfd, 0x91, 0x21, 0x3f, 0x37, 0x96, 0x88, 0x8e, 0x0a, 0xd5, 0x73, 0xb5, 0xc9, 0x70, 0xb5, 0x60, 0x7f, 0x0b, 0xdf, 0xff, 0x79, 0x51, 0xa4, 0xfe, + 0xb5, 0x8b, 0x87, 0x47, 0x8b, 0x9a, 0x50, 0x2b, 0x8c, 0xaf, 0x56, 0x97, 0x9f, 0x5b, 0xc9, 0x57, 0xa2, 0x27, 0xb6, 0x9e, 0x2f, 0x4f, 0xab, 0x4a, 0x07, 0xb3, 0x78, 0x8d, 0x22, 0xd6, 0xda, 0x5e, + 0x8d, 0x98, 0x32, 0xd9, 0x3b, 0x25, 0x2d, 0x37, 0x46, 0x66, 0xa0, 0xe9, 0x7c, 0xb8, 0x6f, 0x09, 0xd5, 0x2b, 0x57, 0xb2, 0xe7, 0x6b, 0x13, 0xa9, 0xde, 0xe1, 0x12, 0x5d, 0x80, 0x0a, 0x30, 0x5b, + 0xb2, 0x78, 0x05, 0x6a, 0x1a, 0x91, 0x29, 0x04, 0x84, 0x1d, 0xb6, 0xbe, 0x8a, 0x67, 0x73, 0x73, 0x34, 0xd8, 0x99, 0x9c, 0x91, 0x6c, 0xa6, 0x12, 0xcb, 0xa5, 0x3d, 0xa1, 0xda, 0x7e, 0xb7, 0x82, + 0x3f, 0x67, 0x73, 0x14, 0x67, 0xa1, 0x16, 0x78, 0xad, 0xd5, 0x4f, 0xb4, 0x3b, 0xcd, 0xe9, 0x66, 0xad, 0x48, 0x3c, 0x23, 0xbe, 0x62, 0x78, 0xf5, 0xc9, 0xfd, 0x74, 0x18, 0xfc, 0x22, 0xba, 0xf0, + 0x2a, 0x33, 0xdc, 0xe6, 0xa9, 0xcd, 0xfc, 0x92, 0x00, 0x3a, 0x52, 0x3c, 0x72, 0xe9, 0xf8, 0x7f, 0x1f, 0xea, 0x22, 0x76, 0x7a, 0x86, 0x4f, 0x2e, 0x21, 0x9b, 0xa3, 0x4d, 0x8b, 0x58, 0x0e, 0x32, + 0xda, 0x6a, 0x0e, 0x5e, 0x62, 0xb0, 0x33, 0x7f, 0x32, 0xfa, 0xd2, 0x8a, 0xcb, 0x9c, 0x44, 0x3b, 0x5b, 0x19, 0x7f, 0xa1, 0x61, 0x7b, 0x21, 0x7a, 0xea, 0xc1, 0xf9, 0xb2, 0xab, 0x21, 0x4b, 0xf4, + 0x86, 0xdb, 0xd4, 0xd2, 0xf5, 0x69, 0x9b, 0xec, 0x86, 0x2b, 0xa1, 0xb7, 0xd5, 0xb0, 0x15, 0x3c, 0xd4, 0x72, 0x26, 0x76, 0x2c, 0x81, 0x6b, 0x8d, 0x59, 0x31, 0x62, 0x96, 0x66, 0xc2, 0xd1, 0x74, + 0x33, 0x72, 0x20, 0xd0, 0x06, 0x07, 0x9a, 0x38, 0xdd, 0x90, 0xba, 0x31, 0x49, 0x67, 0x36, 0xb0, 0xde, 0xd5, 0xd0, 0xc4, 0x1f, 0xa9, 0xbd, 0x14, 0x06, 0xf4, 0x09, 0xe9, 0x20, 0x54, 0x55, 0x66, + 0x2c, 0xc2, 0x7f, 0x6d, 0xc8, 0xe6, 0x4d, 0x64, 0xec, 0xbd, 0xe2, 0xa9, 0xa7, 0xef, 0x15, 0x47, 0xdf, 0x95, 0xe8, 0x11, 0x82, 0xcb, 0x65, 0xff, 0x44, 0xe9, 0x3b, 0x3e, 0x1e, 0x06, 0xb8, 0x6a, + 0x23, 0x04, 0xd8, 0xa0, 0x44, 0x16, 0xeb, 0xcd, 0x6e, 0xbf, 0x68, 0x29, 0x75, 0x6f, 0x2e, 0x44, 0x64, 0xff, 0x65, 0x27, 0x8a, 0x38, 0xf4, 0x8c, 0x7e, 0x1e, 0x58, 0x56, 0xf2, 0xd7, 0x0e, 0xc5, + 0x1b, 0xc2, 0xc7, 0xce, 0xdc, 0x34, 0xbb, 0x0c, 0xcc, 0x23, 0x4f, 0xf7, 0xcb, 0x95, 0x4f, 0xa5, 0x23, 0x17, 0x4f, 0x0e, 0xe0, 0x6e, 0xbb, 0x64, 0x7a, 0x28, 0xaf, 0xb7, 0xb1, 0x27, 0x00, 0x91, + 0xb4, 0xa7, 0x47, 0xdb, 0x65, 0x69, 0xc2, 0x65, 0x15, 0xcd, 0xd3, 0x92, 0x82, 0x80, 0xc3, 0x40, 0xc3, 0x27, 0xbc, 0xca, 0xcd, 0x25, 0x70, 0x64, 0xb4, 0x29, 0x0b, 0xf2, 0x11, 0x86, 0xc7, 0x0a, + 0x20, 0x49, 0x3c, 0xb4, 0xd0, 0x65, 0x56, 0xf3, 0xd5, 0x24, 0x41, 0x98, 0x61, 0x71, 0xe7, 0xca, 0xf9, 0x4e, 0x98, 0x77, 0x35, 0xaa, 0xca, 0x22, 0x36, 0xb4, 0x28, 0x8a, 0x9f, 0x99, 0xac, 0xe8, + 0x1b, 0xf6, 0x0a, 0x84, 0xef, 0x64, 0x8f, 0x00, 0xbe, 0x37, 0xfa, 0x27, 0x6a, 0xdf, 0xc3, 0x97, 0x6c, 0xe9, 0x09, 0x39, 0x77, 0x87, 0xfa, 0x9e, 0xb7, 0xa8, 0x9d, 0xe2, 0x43, 0xcb, 0x05, 0x4c, + 0x92, 0x8a, 0xb5, 0x93, 0xb4, 0xc5, 0x5e, 0x17, 0xbc, 0x06, 0x59, 0xaa, 0x78, 0xb5, 0x14, 0x20, 0x3d, 0xc5, 0xab, 0xed, 0x81, 0x5e, 0x13, 0x42, 0xcf, 0x1b, 0x87, 0x54, 0x43, 0x8e, 0x8b, 0xd2, + 0x85, 0xd7, 0xdc, 0xdc, 0xdb, 0x06, 0xb3, 0xc0, 0xdb, 0xef, 0x34, 0x28, 0x01, 0x17, 0xb2, 0xac, 0x20, 0x92, 0x59, 0x77, 0x5c, 0x4e, 0x8f, 0x8b, 0xd8, 0x63, 0xf1, 0x6a, 0x04, 0x5e, 0xff, 0xe4, + 0xd4, 0x40, 0x7e, 0x9f, 0x3d, 0x14, 0x83, 0x7b, 0xbd, 0xde, 0x08, 0xe2, 0xc8, 0xba, 0x88, 0x5e, 0xe8, 0x3e, 0xde, 0x71, 0x5e, 0xa4, 0xf3, 0x32, 0x49, 0xe2, 0xec, 0xea, 0xd1, 0xfc, 0xe0, 0x39, + 0x31, 0xb2, 0x38, 0xcf, 0xfb, 0x5a, 0xe6, 0x54, 0xbf, 0xaf, 0x1e, 0xcf, 0xbb, 0xb7, 0xdb, 0x71, 0x16, 0xf6, 0x4d, 0xad, 0xd0, 0x2e, 0x6f, 0xf8, 0xf0, 0x72, 0x57, 0xcb, 0xfb, 0xa7, 0x79, 0xd7, + 0x77, 0xe3, 0x78, 0x9f, 0x3f, 0xa6, 0xe1, 0x9a, 0x59, 0xdf, 0xf5, 0xf2, 0x22, 0x76, 0x32, 0x2d, 0xbc, 0x7a, 0x53, 0x8e, 0x5f, 0x82, 0x3e, 0xff, 0x55, 0x62, 0x65, 0x86, 0x15, 0x15, 0xde, 0x51, + 0x1d, 0x8a, 0x75, 0xff, 0xf7, 0x43, 0x2b, 0xe5, 0xe4, 0x75, 0x3e, 0x89, 0xbd, 0xec, 0x4a, 0xf6, 0x08, 0xcf, 0x1d, 0x06, 0x6e, 0x93, 0x58, 0x99, 0x67, 0xbe, 0x13, 0x40, 0x6e, 0x1f, 0x86, 0x5a, + 0xa4, 0x39, 0x37, 0x6b, 0xdb, 0xa7, 0x37, 0x84, 0x5e, 0xe4, 0x85, 0x5e, 0x7e, 0x05, 0x0f, 0xbe, 0x7f, 0x1a, 0x47, 0xfd, 0xc8, 0x2a, 0xfa, 0x81, 0x97, 0x17, 0x56, 0xf4, 0x18, 0xdf, 0x24, 0xb3, + 0x8a, 0xa2, 0xe9, 0xeb, 0x4d, 0x61, 0x9d, 0x3f, 0x70, 0x70, 0xa7, 0x2b, 0x9e, 0x7e, 0x11, 0x3b, 0x99, 0x95, 0xe7, 0x8f, 0xbf, 0x30, 0xb3, 0x8e, 0x43, 0x35, 0xab, 0x2e, 0x9e, 0xaf, 0xfb, 0x20, + 0xd3, 0xe9, 0xf9, 0xd5, 0xc9, 0xff, 0xe0, 0xeb, 0x8f, 0x8f, 0xce, 0xa6, 0xed, 0xef, 0x73, 0x6c, 0x06, 0x7c, 0x64, 0x1f, 0xe8, 0x5e, 0xf4, 0xc1, 0xac, 0xb8, 0x9d, 0x9e, 0x37, 0xad, 0x37, 0x3f, + 0xff, 0xd1, 0xe4, 0xbe, 0xb7, 0xe8, 0xae, 0x43, 0xfc, 0xaf, 0x33, 0x1f, 0xce, 0x9a, 0x5f, 0xff, 0xfc, 0x7f, 0x17, 0xa3, 0xe1, 0x38, 0xcb, 0x51, 0x0a, 0x21, 0xb1, 0xad, 0x8d, 0x42, 0xec, 0x4a, + 0x11, 0xa6, 0x66, 0xde, 0x86, 0x54, 0xca, 0x8d, 0x67, 0xe9, 0x60, 0xb3, 0x01, 0x4a, 0x6e, 0x44, 0xc2, 0x38, 0x32, 0x67, 0x16, 0xe1, 0xaa, 0x87, 0xf8, 0xa3, 0xc0, 0x25, 0x76, 0x68, 0x4a, 0x15, + 0x66, 0xe1, 0x8c, 0x05, 0xc4, 0x3e, 0x14, 0xfa, 0x62, 0xc2, 0xb5, 0xe2, 0x01, 0x86, 0x79, 0xd3, 0x8d, 0x28, 0x63, 0x5e, 0x95, 0x70, 0x09, 0xd9, 0x9b, 0xba, 0xa3, 0xd2, 0x7c, 0x6f, 0x49, 0x5c, + 0x0d, 0xb6, 0x1b, 0x86, 0x5d, 0xa6, 0x6a, 0xde, 0x3f, 0xcd, 0xdc, 0xdf, 0x67, 0x3b, 0xfe, 0x15, 0xa3, 0xae, 0x93, 0x3a, 0x55, 0x69, 0x5e, 0x70, 0xf2, 0x96, 0x16, 0x4d, 0x62, 0x99, 0x7d, 0x2d, + 0xcb, 0xb4, 0xe6, 0x99, 0x89, 0x03, 0xdd, 0x85, 0x5a, 0xbb, 0x72, 0xe8, 0xf1, 0x2b, 0x8e, 0xd2, 0xf9, 0xe1, 0x83, 0xd3, 0x42, 0x87, 0x7e, 0xcf, 0x43, 0x71, 0x34, 0x08, 0x77, 0xf3, 0x6d, 0xc6, + 0x98, 0x90, 0xa4, 0xf1, 0xbe, 0x7d, 0x90, 0x15, 0xc7, 0xd5, 0x53, 0x1e, 0x70, 0x15, 0x2f, 0x66, 0xc3, 0xc5, 0xbc, 0x5a, 0xcf, 0x1b, 0xaa, 0x54, 0x84, 0x62, 0xb7, 0xb3, 0xa2, 0xe9, 0x92, 0xf3, + 0x7d, 0xd4, 0x15, 0xc5, 0x02, 0x1a, 0xdb, 0xd0, 0x21, 0x2f, 0x77, 0xe2, 0x2e, 0x2b, 0x0e, 0xd9, 0x66, 0x3c, 0x58, 0x15, 0xa8, 0x25, 0x63, 0xc6, 0xaa, 0x20, 0x29, 0x73, 0xf4, 0x83, 0x85, 0xee, + 0xd7, 0x43, 0x1d, 0xf7, 0x87, 0x86, 0xcb, 0xbb, 0xbf, 0x37, 0xf0, 0x5d, 0x2d, 0xd3, 0x3b, 0x71, 0xac, 0xf2, 0xe2, 0x27, 0x0c, 0xc2, 0x4f, 0xde, 0xe9, 0x9f, 0x33, 0xa8, 0xf2, 0xe2, 0x13, 0x3f, + 0x2a, 0x2f, 0xee, 0x9f, 0x68, 0x7c, 0x0f, 0xff, 0x6e, 0x0b, 0x8f, 0xb9, 0x71, 0xa8, 0x6a, 0xe3, 0x70, 0x3c, 0xce, 0x19, 0x6d, 0xae, 0x2d, 0xd8, 0xc3, 0xa8, 0x5d, 0xd7, 0x53, 0x04, 0xb7, 0x77, + 0x1e, 0xc4, 0xce, 0x0e, 0xcb, 0x55, 0x65, 0x99, 0xab, 0xc4, 0xf2, 0xf2, 0x85, 0x19, 0x1e, 0xd4, 0x48, 0x0f, 0x66, 0x06, 0xe2, 0x26, 0xf4, 0x56, 0x89, 0x82, 0x75, 0x8f, 0x5d, 0xc9, 0x07, 0x35, + 0xd7, 0x5a, 0x17, 0x45, 0xb6, 0xbb, 0x25, 0xed, 0xec, 0x12, 0x3d, 0xed, 0xb8, 0x50, 0x5e, 0x6d, 0x80, 0x07, 0xcb, 0x8c, 0x69, 0xe9, 0xa5, 0x73, 0x99, 0x57, 0x1f, 0x57, 0x31, 0x2d, 0x2f, 0xd2, + 0xcb, 0x5f, 0x61, 0xf7, 0x02, 0x3a, 0x2d, 0xad, 0xd2, 0xea, 0x87, 0x9e, 0x91, 0xc5, 0x85, 0x96, 0xef, 0xdf, 0xa5, 0x2c, 0xdc, 0x81, 0x1f, 0xba, 0x16, 0x68, 0x91, 0x61, 0x99, 0xfd, 0xaf, 0x4c, + 0x48, 0xe8, 0x2e, 0x0b, 0xa1, 0x2b, 0x63, 0xee, 0x49, 0x03, 0xfd, 0x0f, 0x37, 0x4e, 0x33, 0xa5, 0x03, 0xab, 0x90, 0x58, 0xb4, 0xe4, 0x15, 0x28, 0x71, 0x1b, 0x0c, 0x77, 0x97, 0xd0, 0x28, 0xd4, + 0x77, 0x39, 0x8b, 0x36, 0x5a, 0x2a, 0xe3, 0x85, 0xef, 0xd1, 0x81, 0x7e, 0x10, 0x28, 0x75, 0x95, 0xd0, 0x20, 0xbb, 0x1d, 0xf6, 0xc6, 0xd6, 0x0e, 0xd5, 0x85, 0x91, 0xb6, 0x03, 0x47, 0xd1, 0xa1, + 0x00, 0x8b, 0x03, 0xcc, 0x65, 0x89, 0x90, 0x6c, 0x6b, 0x5e, 0x5b, 0xd7, 0x4c, 0xc0, 0x88, 0x93, 0xb9, 0xab, 0xc8, 0x83, 0xf5, 0x13, 0x27, 0xe5, 0x57, 0x38, 0xe5, 0x16, 0x86, 0x9e, 0x97, 0xe8, + 0xc7, 0x10, 0x0d, 0x5e, 0xb0, 0x7e, 0xde, 0xa9, 0x9e, 0xd0, 0xb9, 0x5c, 0xf7, 0x4f, 0xb4, 0xbe, 0x07, 0x66, 0xc4, 0x26, 0x9a, 0x12, 0xd0, 0x11, 0x51, 0xa0, 0xe2, 0x46, 0x5f, 0xd1, 0xe3, 0xa6, + 0xa7, 0x0f, 0x7a, 0x2c, 0xeb, 0x54, 0x02, 0x5a, 0x65, 0x39, 0x45, 0x54, 0x7a, 0x95, 0xe9, 0x1e, 0x3f, 0x4f, 0x72, 0xdc, 0x66, 0x29, 0x69, 0xef, 0xef, 0xa9, 0xac, 0xc1, 0x7c, 0x0f, 0xcc, 0xe4, + 0xb9, 0x3f, 0x06, 0xf7, 0xad, 0xbe, 0xb4, 0xd6, 0x8b, 0xba, 0x3d, 0xa4, 0x84, 0xd7, 0x24, 0x31, 0x0a, 0xa5, 0xd6, 0xf6, 0x4e, 0x84, 0xfc, 0x91, 0x06, 0xff, 0xd7, 0xfb, 0x68, 0xfb, 0x33, 0x90, + 0xbf, 0x8a, 0x11, 0x75, 0x93, 0x1a, 0xb6, 0x75, 0x54, 0xdd, 0x7e, 0xbf, 0xff, 0xd5, 0xff, 0xfc, 0xaf, 0x5f, 0xbf, 0x26, 0xd1, 0x8a, 0xcc, 0x8a, 0xa3, 0x2f, 0xdf, 0x53, 0xd7, 0xf5, 0xdb, 0xe5, + 0x77, 0xa7, 0x97, 0xfd, 0xf4, 0x1d, 0x46, 0x1c, 0xe5, 0x65, 0x50, 0x1c, 0xbb, 0xfd, 0xd5, 0x6b, 0xce, 0x64, 0xcf, 0x0e, 0xd9, 0x8b, 0x72, 0xfa, 0xe7, 0x15, 0x97, 0xab, 0xff, 0xfe, 0xc5, 0x70, + 0xf2, 0x22, 0x2d, 0x6b, 0xfa, 0xd6, 0xa1, 0xb0, 0xa2, 0xe3, 0x10, 0x7a, 0x36, 0xac, 0xe0, 0x97, 0x5c, 0xc4, 0x9f, 0xa8, 0x1f, 0x87, 0xd7, 0xc7, 0x7b, 0x7d, 0xb8, 0x9b, 0xc3, 0xd8, 0xa7, 0x8c, + 0x62, 0x0e, 0x30, 0x1b, 0x5e, 0x57, 0xe3, 0x79, 0xb3, 0x8f, 0x2d, 0x5a, 0x77, 0x77, 0xc9, 0x2a, 0x58, 0x92, 0xe9, 0x6c, 0x69, 0xd4, 0xbb, 0x39, 0x3b, 0x8f, 0x1d, 0x14, 0x9e, 0x0c, 0x68, 0x6a, + 0x2d, 0xd7, 0xbc, 0x24, 0x9a, 0xfe, 0x98, 0x36, 0x3d, 0xd7, 0xf7, 0x41, 0x2a, 0x88, 0x5c, 0x8b, 0xc7, 0xf5, 0x40, 0x97, 0x30, 0x93, 0x5e, 0x69, 0xf6, 0x72, 0xe4, 0x89, 0x44, 0x1c, 0xf3, 0xec, + 0x77, 0x0e, 0xe3, 0xbf, 0x40, 0x37, 0xd0, 0xbd, 0xa8, 0xc8, 0xac, 0xa7, 0x0e, 0x4f, 0xe8, 0x25, 0x77, 0xc5, 0x95, 0xe8, 0x19, 0xd0, 0xd3, 0xe5, 0x49, 0x8e, 0x7d, 0x33, 0x5d, 0xa1, 0x3e, 0x15, + 0x6e, 0x8c, 0x70, 0x50, 0xef, 0x97, 0x56, 0x9a, 0x69, 0x8b, 0xe1, 0x68, 0xde, 0xcc, 0x0b, 0x16, 0xda, 0xfa, 0x82, 0xc8, 0x7f, 0x65, 0xab, 0xeb, 0xf1, 0xc1, 0x7a, 0x6e, 0x61, 0xbe, 0x34, 0x36, + 0x8e, 0x14, 0x8f, 0x9f, 0x7f, 0xfc, 0xbf, 0x8f, 0x76, 0x1b, 0x03, 0x16, 0x89, 0x96, 0xd2, 0x50, 0x98, 0xb5, 0x0e, 0x1c, 0x9b, 0xc9, 0x44, 0xc0, 0x60, 0x9d, 0xac, 0xc5, 0x45, 0x25, 0x5b, 0xb3, + 0x71, 0x6f, 0xab, 0x0b, 0xbe, 0xdf, 0x34, 0x53, 0x77, 0x96, 0xb3, 0x91, 0x41, 0xd4, 0x09, 0x10, 0x82, 0x3d, 0x97, 0xcf, 0x39, 0xb9, 0x92, 0x2d, 0x84, 0x86, 0x37, 0x20, 0x35, 0xa8, 0x6a, 0x30, + 0x22, 0xcd, 0x15, 0xe4, 0x8e, 0xe7, 0xb1, 0x1a, 0x0f, 0x42, 0xd6, 0x2a, 0x99, 0xef, 0xb2, 0x89, 0xbe, 0x51, 0x42, 0xaf, 0xf1, 0xe2, 0x47, 0xf6, 0xa6, 0x16, 0x5a, 0x81, 0xa1, 0xe5, 0xd7, 0x4c, + 0x39, 0xe4, 0x83, 0xc1, 0xf8, 0xb5, 0xa5, 0x7a, 0x44, 0xe6, 0x6a, 0xca, 0xc0, 0x9f, 0x63, 0x4a, 0x77, 0x31, 0xd8, 0x4f, 0xea, 0x6f, 0x61, 0x65, 0x61, 0x3f, 0xf7, 0xda, 0x3f, 0xe6, 0xec, 0xfd, + 0xe3, 0x26, 0xb1, 0xfa, 0xf6, 0x35, 0xbb, 0x0f, 0x7c, 0x23, 0xee, 0xbf, 0xac, 0xf6, 0x4c, 0x2b, 0x3f, 0x5a, 0x63, 0x17, 0x73, 0x18, 0xf9, 0x3b, 0x35, 0xe7, 0x07, 0x92, 0xfc, 0x67, 0x7a, 0xdd, + 0x6d, 0x0e, 0x5a, 0x97, 0x39, 0x77, 0x1a, 0x5c, 0x3f, 0x8b, 0xbb, 0x0c, 0x5e, 0x32, 0x9c, 0x9e, 0xc5, 0x5d, 0x06, 0xdd, 0x4c, 0x28, 0x5d, 0xc1, 0x6c, 0x7f, 0x80, 0xad, 0x64, 0x1e, 0x74, 0x65, + 0x88, 0xf5, 0xa7, 0x4b, 0x8a, 0x2f, 0xe7, 0x53, 0xab, 0x4d, 0x59, 0x33, 0x1b, 0x35, 0x53, 0x93, 0xb1, 0xaa, 0x11, 0xe5, 0xa5, 0xd9, 0x96, 0xae, 0xc5, 0x40, 0x0f, 0xc9, 0x25, 0x47, 0x27, 0x03, + 0x6d, 0x0f, 0xdb, 0x28, 0xb8, 0x0e, 0x89, 0xb9, 0x34, 0x6d, 0x38, 0x38, 0x4c, 0x0f, 0xfb, 0x19, 0x16, 0x39, 0x7b, 0x7a, 0x05, 0x41, 0x36, 0x10, 0x7c, 0xe7, 0xa3, 0xee, 0xcc, 0xb6, 0x1f, 0x01, + 0xfc, 0xff, 0x21, 0xa3, 0xf4, 0xa7, 0x22, 0xe2, 0x7f, 0x19, 0x3b, 0xf5, 0x01, 0xdb, 0xee, 0x83, 0xdd, 0x8f, 0x98, 0x47, 0xbc, 0xc4, 0xbc, 0x1b, 0xba, 0x40, 0xff, 0xb6, 0xd5, 0x27, 0xba, 0x31, + 0x92, 0x13, 0x7d, 0xa5, 0x35, 0xb6, 0xcb, 0xd5, 0x08, 0xb4, 0xea, 0x11, 0x9d, 0xb4, 0x20, 0x77, 0x48, 0x94, 0x69, 0x55, 0x3b, 0x58, 0xe3, 0x37, 0xd0, 0x72, 0x86, 0x1c, 0x0a, 0x2b, 0x4e, 0x5b, + 0x0c, 0x45, 0x37, 0xe3, 0x18, 0x10, 0xd6, 0x4e, 0x94, 0x41, 0xc0, 0x6c, 0x56, 0xf4, 0x3c, 0x03, 0xf1, 0xe6, 0x52, 0xcb, 0x13, 0x93, 0x12, 0x91, 0x4c, 0x0e, 0x42, 0x45, 0xad, 0x8e, 0x36, 0x72, + 0x38, 0x9b, 0x60, 0x4f, 0xd6, 0xfb, 0x1f, 0x21, 0xf6, 0x3c, 0xfa, 0xff, 0xd7, 0x0d, 0xfd, 0x27, 0xef, 0x38, 0xe7, 0xde, 0x3e, 0x7a, 0xd2, 0x75, 0x7a, 0xb4, 0x4d, 0x18, 0x0e, 0x7a, 0x65, 0x2f, + 0x1f, 0xe7, 0xe2, 0xb6, 0xa1, 0x86, 0xe9, 0x52, 0xb3, 0xfc, 0x0d, 0x42, 0x4d, 0x2b, 0x77, 0xcc, 0x1a, 0x01, 0x6b, 0x7a, 0xad, 0xa2, 0xcd, 0xe5, 0x92, 0x1e, 0x11, 0x88, 0xb0, 0xf0, 0x75, 0x3c, + 0x12, 0xcb, 0x59, 0x64, 0x9a, 0x63, 0x7a, 0x56, 0x81, 0xee, 0xbe, 0xc7, 0x2a, 0x38, 0xc9, 0x8d, 0x82, 0x7c, 0x6b, 0xb1, 0xa8, 0x6c, 0x39, 0xd8, 0x64, 0x83, 0xed, 0xf8, 0xef, 0xa6, 0xc7, 0x7f, + 0xcc, 0xc8, 0xed, 0x90, 0xd1, 0x82, 0xbe, 0x64, 0xc9, 0x7f, 0x95, 0xd1, 0x82, 0x76, 0xb4, 0xeb, 0xc9, 0xb9, 0x2e, 0x21, 0x4b, 0x74, 0xee, 0x6e, 0xca, 0x70, 0x37, 0x01, 0xad, 0x78, 0x21, 0x0f, + 0xa9, 0xb1, 0x6f, 0x68, 0xd3, 0x21, 0xcc, 0x2e, 0x96, 0xa9, 0x14, 0x4e, 0xc7, 0xd1, 0x0c, 0x4a, 0x6c, 0xc2, 0x2c, 0xe5, 0xc3, 0x74, 0x56, 0x17, 0x6b, 0x6c, 0x44, 0x61, 0xd1, 0xde, 0xaf, 0x87, + 0x1a, 0xc2, 0x98, 0x9e, 0x50, 0x2c, 0x90, 0x09, 0x5c, 0x23, 0x73, 0xca, 0x9b, 0x00, 0x07, 0x0f, 0xa9, 0x56, 0xd6, 0x77, 0xca, 0x6a, 0xf7, 0x8c, 0x16, 0xe2, 0xa3, 0xbe, 0xf1, 0x55, 0x46, 0xcb, + 0x27, 0xe5, 0xe4, 0x43, 0x46, 0xcb, 0x13, 0x5f, 0xe8, 0x7f, 0x1c, 0xd3, 0xbf, 0x4c, 0x66, 0xc1, 0x5e, 0x9a, 0x6f, 0xcf, 0x92, 0x59, 0xb0, 0x6e, 0xb3, 0x6a, 0x54, 0x56, 0xac, 0x94, 0x49, 0x36, + 0xbf, 0x54, 0x96, 0x8c, 0x51, 0xe8, 0x02, 0xc4, 0x02, 0xca, 0x4c, 0x12, 0x20, 0x7c, 0x80, 0xcd, 0x1a, 0x63, 0x9d, 0x3b, 0xb8, 0x3e, 0xd4, 0xcd, 0xcd, 0x90, 0x2a, 0xd3, 0x32, 0x43, 0x9d, 0x0a, + 0xd3, 0xd8, 0x94, 0xde, 0x69, 0x2e, 0x86, 0xab, 0x04, 0x13, 0x8a, 0xf8, 0x76, 0xd2, 0x0e, 0xf8, 0x8d, 0xb1, 0x2a, 0x02, 0x7b, 0x0b, 0x67, 0xea, 0xa4, 0x74, 0x0a, 0xec, 0xf5, 0x04, 0xa6, 0x0f, + 0xc9, 0x2c, 0x83, 0xff, 0x38, 0x06, 0x65, 0x9a, 0x61, 0xf5, 0xad, 0x43, 0xa2, 0x45, 0x17, 0xfc, 0x1f, 0x9b, 0x38, 0xd0, 0x1b, 0xf4, 0x82, 0x8d, 0x73, 0x4f, 0xfc, 0x68, 0x2b, 0xdc, 0xdf, 0x39, + 0xe7, 0x65, 0x77, 0xf0, 0x50, 0x78, 0xe3, 0x72, 0x4d, 0x53, 0x53, 0x27, 0xa3, 0x77, 0x38, 0x0d, 0x57, 0x13, 0x06, 0x18, 0x1c, 0x92, 0x16, 0xc4, 0x5b, 0x91, 0x26, 0x41, 0x50, 0x4a, 0x4a, 0x27, + 0x75, 0x43, 0xa5, 0xd8, 0x84, 0xdc, 0x0a, 0x1b, 0x40, 0x44, 0x38, 0x2e, 0x05, 0x2e, 0x5e, 0x29, 0xd3, 0xc0, 0x9c, 0x90, 0x01, 0xe8, 0x40, 0x04, 0x5e, 0xda, 0x71, 0x6b, 0x6a, 0xb4, 0xb3, 0x65, + 0x0d, 0x65, 0xaa, 0x63, 0x50, 0x3a, 0xf3, 0x5e, 0x9f, 0x8d, 0x9f, 0x7c, 0x5d, 0x0f, 0x3c, 0x70, 0x46, 0x1c, 0x19, 0x5a, 0xd1, 0x0f, 0xb5, 0xe4, 0xf7, 0x29, 0xa0, 0xdb, 0x6d, 0x93, 0xcd, 0x09, + 0xa0, 0x67, 0x96, 0x26, 0xf2, 0x9a, 0xf7, 0xec, 0x44, 0xf2, 0x0a, 0x7e, 0x7e, 0x5a, 0x67, 0x3a, 0x08, 0x40, 0x9d, 0x28, 0xc3, 0xde, 0x02, 0x12, 0x5a, 0x0e, 0xd9, 0x52, 0x62, 0x5b, 0xb9, 0x21, + 0xe6, 0x30, 0x2d, 0xd4, 0xd8, 0x92, 0x4e, 0x16, 0x98, 0x22, 0x05, 0xc6, 0x84, 0x1d, 0x55, 0x79, 0x98, 0x8e, 0x55, 0x75, 0x5a, 0xa3, 0x58, 0x8b, 0xc1, 0x58, 0xb0, 0xf1, 0x87, 0x3e, 0xd4, 0x4c, + 0xd6, 0x5b, 0x04, 0xa1, 0x07, 0x74, 0x2f, 0x20, 0xf9, 0x44, 0xe5, 0xd6, 0xd0, 0x9e, 0x08, 0x7a, 0x38, 0x41, 0x6b, 0xe0, 0xeb, 0x90, 0xdb, 0x5e, 0x10, 0xf4, 0x33, 0x2d, 0x72, 0xac, 0x8b, 0x86, + 0xf5, 0xf7, 0x25, 0xd8, 0x3c, 0xe7, 0x80, 0xa1, 0x19, 0xae, 0x75, 0xf2, 0xc6, 0x67, 0x56, 0x5a, 0x9e, 0x0d, 0xac, 0xc7, 0x62, 0xea, 0x95, 0x5c, 0xcb, 0x4f, 0xd4, 0x8f, 0xda, 0xf1, 0xc7, 0x7b, + 0x7d, 0xac, 0x5b, 0xd6, 0xe5, 0xca, 0x47, 0x8c, 0xd1, 0x6c, 0x3d, 0x4e, 0x57, 0xea, 0x0e, 0x17, 0x5a, 0x0c, 0x95, 0xa3, 0x06, 0x9e, 0x29, 0x23, 0x75, 0x19, 0x78, 0xbc, 0x98, 0xda, 0xba, 0xb5, + 0xce, 0x9c, 0x11, 0x0f, 0xd5, 0xec, 0xc8, 0x73, 0x95, 0x70, 0x2c, 0x47, 0x99, 0x46, 0x16, 0xf3, 0x82, 0x35, 0x66, 0x02, 0x7a, 0x68, 0xf1, 0x7a, 0xda, 0x5b, 0xc4, 0xf3, 0x71, 0x2f, 0xcf, 0xa7, + 0x6a, 0x55, 0x0d, 0x48, 0x67, 0x3a, 0x64, 0x9c, 0xef, 0x54, 0x81, 0x2f, 0xe2, 0xb6, 0x41, 0x1c, 0x1d, 0xfb, 0x70, 0xb2, 0xf9, 0xac, 0xf7, 0x59, 0x71, 0x17, 0x81, 0x74, 0xac, 0xa2, 0x9f, 0x17, + 0x99, 0xa5, 0x85, 0x17, 0xc1, 0x06, 0x3d, 0x88, 0x62, 0x9e, 0x00, 0xe9, 0xe7, 0x56, 0xa8, 0x45, 0x85, 0x67, 0x5c, 0xd5, 0xee, 0x0f, 0xf3, 0x6b, 0x6f, 0x35, 0xd5, 0xe3, 0xd5, 0x2d, 0x88, 0x6b, + 0x2b, 0x3b, 0x1a, 0xed, 0xfd, 0xbd, 0xd5, 0xfc, 0x09, 0x25, 0xde, 0xfd, 0xe6, 0x4f, 0x2e, 0xcf, 0xc5, 0x76, 0xfd, 0xac, 0xd7, 0x5f, 0x3b, 0x12, 0x78, 0xfb, 0xdb, 0xce, 0xfc, 0xa7, 0x8c, 0xb9, + 0xfb, 0x25, 0xf3, 0x0e, 0xb4, 0xc7, 0x96, 0xef, 0x2b, 0x0e, 0x9c, 0x3f, 0x64, 0x81, 0xfe, 0x4d, 0xa3, 0x6b, 0xfe, 0x67, 0x44, 0x4e, 0x7b, 0x53, 0x28, 0x1b, 0xa9, 0x9b, 0x71, 0x09, 0x24, 0x78, + 0xe6, 0xb7, 0xce, 0xa8, 0xa7, 0xe8, 0x68, 0x60, 0x2b, 0xbb, 0x2c, 0x09, 0x70, 0x0d, 0xdb, 0x84, 0xf3, 0x4c, 0x26, 0xea, 0xe9, 0x90, 0x81, 0xc6, 0x6c, 0xb5, 0x06, 0xf8, 0x7a, 0xbd, 0x54, 0xe9, + 0x68, 0x15, 0xd4, 0xba, 0xb4, 0x57, 0x30, 0xb3, 0x2a, 0xa6, 0x4c, 0x3b, 0xe5, 0xc4, 0x86, 0xdf, 0xe9, 0x8b, 0x58, 0xe2, 0xd7, 0x42, 0xf2, 0xba, 0x80, 0x48, 0xca, 0x30, 0xb9, 0x19, 0x0f, 0xaf, + 0xb3, 0xe9, 0xfd, 0x2f, 0xfe, 0x93, 0x5c, 0x1d, 0xdf, 0x30, 0xff, 0xd3, 0x68, 0x7e, 0x34, 0x00, 0xe0, 0x97, 0x74, 0xa6, 0x7b, 0xd2, 0x40, 0xff, 0xc3, 0x8d, 0x53, 0xfa, 0x54, 0x87, 0x81, 0x50, + 0xa4, 0xcb, 0x5d, 0x26, 0xe2, 0x44, 0xcc, 0xad, 0x26, 0x38, 0xb2, 0xe4, 0x0e, 0x2c, 0x3a, 0xe1, 0x16, 0x7c, 0xce, 0xc7, 0xf5, 0xd6, 0x26, 0x7c, 0x36, 0x8e, 0xe9, 0xa1, 0x83, 0x1f, 0xd6, 0x5a, + 0x25, 0x48, 0x38, 0x88, 0x09, 0x98, 0xbe, 0xe7, 0xe7, 0x18, 0xa5, 0xc0, 0x92, 0x85, 0xf3, 0xe5, 0x5e, 0x53, 0xf3, 0x32, 0x38, 0x68, 0x08, 0x58, 0xf3, 0xb8, 0xbe, 0x07, 0x93, 0x10, 0xdd, 0x79, + 0x74, 0xf8, 0xdd, 0x40, 0xe8, 0xcc, 0xce, 0xaf, 0x80, 0x0f, 0x82, 0xbe, 0xee, 0x45, 0xe6, 0x53, 0xad, 0xe7, 0x95, 0xe5, 0xf6, 0x9d, 0xea, 0x49, 0xb2, 0x5f, 0xae, 0xbb, 0x86, 0xa8, 0xf0, 0x55, + 0x6f, 0xaa, 0x8f, 0x3d, 0x37, 0x23, 0x07, 0xdb, 0x99, 0x3e, 0x55, 0xac, 0xdc, 0x28, 0xea, 0x50, 0x62, 0x35, 0x0b, 0xcb, 0x56, 0x1e, 0xd3, 0x86, 0x2d, 0xe4, 0x19, 0x99, 0xb5, 0x9d, 0xf7, 0x40, + 0x6d, 0x84, 0x2f, 0xe6, 0x76, 0x99, 0xba, 0x93, 0x3c, 0x86, 0xa5, 0x61, 0x64, 0x24, 0xc6, 0xb4, 0x68, 0x39, 0xbe, 0x68, 0x77, 0x36, 0xcc, 0xcf, 0x66, 0xa5, 0xb5, 0x9d, 0xcf, 0x24, 0x25, 0x4f, + 0xb3, 0x51, 0xb7, 0x68, 0xa2, 0x5d, 0x46, 0x46, 0x71, 0x54, 0xca, 0x2e, 0x90, 0x3c, 0x48, 0xe0, 0x38, 0x0a, 0x09, 0x2f, 0x3a, 0x5a, 0x53, 0xb9, 0x67, 0x7c, 0x25, 0x13, 0x5f, 0x9d, 0x3a, 0x9d, + 0xa3, 0xbf, 0xb7, 0x8e, 0xd9, 0xc7, 0x12, 0x11, 0x79, 0xc1, 0x29, 0xff, 0x4e, 0xf5, 0xc4, 0xbb, 0xcb, 0x75, 0xff, 0x44, 0xeb, 0x7b, 0xde, 0x2d, 0x60, 0x42, 0x94, 0x48, 0x08, 0x07, 0xa3, 0x7a, + 0x2b, 0x62, 0x88, 0xec, 0x17, 0xc1, 0x64, 0x35, 0x41, 0xcc, 0xc0, 0xe4, 0x47, 0x89, 0x36, 0xdf, 0xa9, 0xfb, 0x15, 0x03, 0x95, 0xdc, 0xd4, 0x6e, 0x6d, 0x24, 0x13, 0xca, 0xb5, 0xe5, 0xd0, 0x1a, + 0x6d, 0xe5, 0x8d, 0x65, 0xf5, 0x94, 0x03, 0xdf, 0xdb, 0x62, 0x62, 0x25, 0x50, 0xfc, 0x06, 0x93, 0x33, 0x73, 0x65, 0x0a, 0x9e, 0x00, 0x0d, 0x90, 0x7a, 0xfe, 0xdd, 0x6a, 0xfc, 0x17, 0xe4, 0xb3, + 0x7f, 0xe5, 0xf6, 0x43, 0x5f, 0x4a, 0xf9, 0xbd, 0x77, 0xfb, 0xa1, 0xdd, 0x92, 0x7d, 0x63, 0x36, 0xd2, 0xdd, 0x69, 0x23, 0x30, 0xbb, 0x44, 0x2e, 0xad, 0x96, 0xf0, 0x48, 0x2e, 0x6c, 0x26, 0x1a, + 0x1a, 0xe9, 0x3e, 0xca, 0xac, 0xf8, 0xa6, 0x74, 0x0d, 0xa0, 0x6e, 0x86, 0x7b, 0x05, 0x07, 0xb6, 0x9b, 0xb5, 0x51, 0x33, 0xab, 0xe1, 0x66, 0x84, 0x61, 0xc4, 0xba, 0x24, 0x84, 0xfd, 0x0a, 0xef, + 0x81, 0x33, 0x1c, 0x13, 0x17, 0xc2, 0xca, 0x6a, 0xea, 0xe1, 0x38, 0xe1, 0x41, 0x0c, 0xf2, 0xd0, 0x8f, 0x52, 0xe4, 0x1f, 0xef, 0xe3, 0x83, 0x1e, 0xfc, 0xc9, 0x0f, 0x27, 0xcb, 0x19, 0xdd, 0xd3, + 0xbf, 0x3f, 0xca, 0xee, 0x36, 0xdc, 0x78, 0xef, 0x99, 0xda, 0xb3, 0x3d, 0xd0, 0xc8, 0x4b, 0x71, 0xe7, 0x2b, 0xd1, 0x13, 0xb7, 0xcf, 0x97, 0x7d, 0xa4, 0x5b, 0xd4, 0x79, 0xd8, 0xcb, 0x7b, 0x2b, + 0xb3, 0xb7, 0x05, 0x37, 0xf3, 0x79, 0xab, 0xd5, 0x54, 0xa8, 0x01, 0x4e, 0x45, 0x2e, 0xf9, 0x74, 0x2f, 0x79, 0xa9, 0x22, 0x6d, 0x17, 0xa5, 0x1a, 0x37, 0xa3, 0xdc, 0xab, 0x72, 0x06, 0x1d, 0x69, + 0x5b, 0x69, 0xdc, 0xd2, 0x33, 0x10, 0x03, 0x24, 0xce, 0xcf, 0x6d, 0xc8, 0x50, 0xac, 0xe1, 0x58, 0x1f, 0xe2, 0xf2, 0x78, 0xe2, 0xfa, 0x2d, 0x4e, 0x57, 0xd1, 0x7a, 0x0f, 0x27, 0x40, 0xf1, 0xf7, + 0x98, 0xdc, 0xef, 0xc9, 0xef, 0xbf, 0xff, 0xfd, 0xd3, 0xa6, 0xca, 0x77, 0xbb, 0xec, 0xf8, 0xec, 0xa3, 0x4e, 0x1b, 0xc4, 0x7a, 0x3f, 0xd1, 0x32, 0xeb, 0xec, 0x6e, 0xf9, 0xf7, 0x4f, 0x4a, 0xad, + 0x97, 0xf7, 0x2f, 0x41, 0xd3, 0x6b, 0x72, 0xdd, 0xbf, 0x7f, 0x8a, 0xe7, 0x78, 0x79, 0xff, 0x48, 0xe7, 0xf4, 0x10, 0xfd, 0xb8, 0x5d, 0xe9, 0x73, 0xe6, 0xf9, 0xbf, 0x7f, 0xd2, 0x7a, 0x33, 0x4b, + 0x33, 0x4d, 0x2f, 0x4b, 0x2e, 0x4f, 0x07, 0x2f, 0x0c, 0xce, 0x5f, 0xc4, 0x1b, 0xf4, 0x50, 0x77, 0x8a, 0x93, 0xe3, 0xc2, 0xa0, 0x05, 0xcf, 0x2b, 0x51, 0xd8, 0xb9, 0x55, 0x59, 0x51, 0x91, 0x5f, + 0x3a, 0x87, 0x74, 0x32, 0x76, 0x0d, 0xaf, 0xef, 0x45, 0xf6, 0xb3, 0x24, 0x9e, 0xd7, 0x74, 0x9a, 0x0b, 0xcd, 0xe3, 0x78, 0x3c, 0x5f, 0x75, 0xd5, 0x62, 0x06, 0x05, 0x8b, 0x4f, 0x8a, 0x4c, 0x05, + 0x97, 0xbd, 0xd5, 0x62, 0xca, 0x15, 0x6e, 0x91, 0xae, 0x7c, 0xd4, 0x66, 0xe0, 0xb9, 0xa5, 0x13, 0xc4, 0x18, 0x1d, 0x8f, 0xd4, 0x75, 0x09, 0x0f, 0x16, 0xd4, 0x46, 0x76, 0x76, 0x73, 0x70, 0x84, + 0xcc, 0x73, 0x74, 0xcd, 0xcd, 0xd2, 0x2c, 0x02, 0xe7, 0x32, 0xb4, 0x05, 0x39, 0x17, 0x02, 0x54, 0xa2, 0x56, 0x5b, 0x65, 0x7d, 0x48, 0xe5, 0x6c, 0x67, 0x91, 0x7a, 0x3c, 0xfe, 0xf1, 0xde, 0xef, + 0xdb, 0xb0, 0xe1, 0x63, 0x50, 0xe0, 0x57, 0x66, 0xe9, 0x95, 0xea, 0x11, 0x96, 0xeb, 0xf5, 0x29, 0x6c, 0xdf, 0x61, 0x9e, 0x36, 0xa8, 0x11, 0x73, 0x46, 0x13, 0x38, 0xe2, 0xd8, 0xdc, 0x78, 0x91, + 0xef, 0x51, 0x64, 0x29, 0x10, 0xeb, 0xf1, 0x18, 0xd6, 0x17, 0x7e, 0x33, 0x93, 0xea, 0x49, 0xb8, 0xd6, 0x87, 0x4b, 0x5a, 0x00, 0x78, 0x6d, 0x29, 0x63, 0x13, 0x79, 0xb5, 0x33, 0x24, 0x05, 0xc8, + 0xb1, 0x8d, 0x3f, 0xe3, 0x28, 0x6c, 0xb2, 0x14, 0x27, 0x9a, 0xc5, 0x2b, 0xf4, 0x58, 0x01, 0x67, 0xcb, 0x99, 0x38, 0xf0, 0x6d, 0xae, 0x7e, 0x96, 0x36, 0xd3, 0x75, 0xa4, 0x62, 0x7f, 0xb7, 0x14, + 0x7d, 0x59, 0x5b, 0xbf, 0xcd, 0x40, 0x7e, 0xc4, 0x21, 0xf0, 0x35, 0x39, 0xfa, 0x4e, 0xf6, 0xc2, 0xa2, 0x73, 0xa3, 0x0f, 0x76, 0x93, 0xa5, 0x38, 0xef, 0xc0, 0xf3, 0xcc, 0x4a, 0x20, 0x11, 0xe8, + 0xf1, 0xc8, 0xc4, 0xb0, 0x3c, 0xb5, 0xe0, 0x0d, 0x6a, 0xbd, 0x3d, 0xb8, 0xa3, 0x8a, 0xac, 0x7b, 0x13, 0xc1, 0x86, 0x20, 0x0c, 0xae, 0xd0, 0xdc, 0xdb, 0xcf, 0xb3, 0x2a, 0xf6, 0x39, 0x7a, 0x9a, + 0xee, 0x0a, 0x82, 0x67, 0x36, 0xae, 0x46, 0xc8, 0x01, 0x3d, 0xcc, 0x1c, 0x19, 0x24, 0xad, 0xed, 0xba, 0x29, 0xd4, 0x21, 0x20, 0xb5, 0x4a, 0x1a, 0xc8, 0x1d, 0xb3, 0xd0, 0x62, 0xdd, 0xb7, 0x8c, + 0xa2, 0xaf, 0xe5, 0xf9, 0x35, 0x8c, 0xfe, 0x79, 0xf9, 0xfc, 0x18, 0xed, 0x86, 0x4f, 0xf2, 0xf5, 0x13, 0x0f, 0x7f, 0xce, 0xf5, 0xef, 0x25, 0xd3, 0x69, 0xc5, 0x3e, 0x2f, 0xeb, 0x5d, 0x53, 0xd9, + 0xae, 0x59, 0xe4, 0x8f, 0x27, 0xe0, 0x4b, 0x1a, 0xd1, 0x91, 0xe2, 0x89, 0xb3, 0x71, 0x64, 0xf5, 0xe1, 0xef, 0x35, 0x22, 0xa8, 0x3f, 0x43, 0x86, 0x8b, 0x08, 0xda, 0xdb, 0x74, 0xdc, 0xa3, 0xd4, + 0x9a, 0x27, 0x95, 0xd1, 0x72, 0x1a, 0x8f, 0x3d, 0x9a, 0x87, 0x88, 0xee, 0xb9, 0x99, 0xe0, 0x5b, 0x27, 0x43, 0xe8, 0xa3, 0xe3, 0xe6, 0x2f, 0xb4, 0x86, 0xee, 0x48, 0xbf, 0x23, 0x70, 0xbd, 0xd1, + 0xc5, 0x2e, 0x82, 0xfa, 0xa0, 0xd9, 0xec, 0x56, 0xe2, 0xe8, 0x20, 0xd9, 0x2a, 0x50, 0x65, 0xc1, 0x98, 0xc1, 0xa5, 0x72, 0xc9, 0x33, 0x03, 0x6c, 0x9b, 0xbf, 0xba, 0xda, 0x87, 0x5e, 0xe8, 0x19, + 0x9f, 0x7d, 0x55, 0x5d, 0x36, 0x6c, 0x18, 0x41, 0x5c, 0x9a, 0xef, 0xab, 0xdd, 0x33, 0xe3, 0xe3, 0x25, 0xa8, 0xae, 0x74, 0xcf, 0x38, 0x5d, 0x5b, 0x27, 0x03, 0xa4, 0x83, 0x06, 0xad, 0xfa, 0x93, + 0xa9, 0x7f, 0x00, 0xc9, 0x79, 0xe4, 0xc5, 0x84, 0x38, 0xa1, 0x20, 0xa9, 0xa5, 0xf0, 0x19, 0x3d, 0x82, 0x20, 0xa2, 0x1d, 0xef, 0x41, 0x94, 0x6b, 0x31, 0x8d, 0xe2, 0x38, 0xcf, 0xeb, 0xa1, 0x80, + 0x5a, 0xed, 0x06, 0x8b, 0xb5, 0x13, 0x41, 0x14, 0x1a, 0x48, 0x83, 0xb9, 0x8f, 0xd3, 0xb1, 0x39, 0xd6, 0x4d, 0x4b, 0x10, 0x31, 0x73, 0x47, 0x10, 0x65, 0x44, 0x83, 0x18, 0x6f, 0x20, 0xe1, 0xbe, + 0xab, 0x06, 0x7d, 0x2e, 0x79, 0xf4, 0xef, 0xa7, 0x2a, 0x1a, 0x77, 0x49, 0xfb, 0x65, 0xe1, 0x9d, 0x1d, 0x6c, 0xe0, 0xf1, 0xd1, 0xdd, 0x2e, 0x87, 0xb2, 0x3c, 0xef, 0x45, 0xf8, 0x77, 0xe2, 0xb4, + 0x0f, 0xa0, 0x03, 0xf4, 0x1f, 0x36, 0x5a, 0x3e, 0x53, 0x1b, 0x5e, 0x90, 0xbf, 0xb7, 0x94, 0x8f, 0xf0, 0xdf, 0xb6, 0xbb, 0xee, 0x23, 0x13, 0x84, 0xc9, 0x78, 0x9d, 0xfb, 0xb8, 0x57, 0x02, 0x07, + 0x7d, 0x10, 0xb3, 0x8a, 0x91, 0x4f, 0x69, 0x31, 0x49, 0xa6, 0xcb, 0x28, 0xf7, 0x81, 0x01, 0xbc, 0xda, 0x48, 0x02, 0xab, 0xa3, 0xed, 0x7a, 0x10, 0x47, 0xbb, 0x7a, 0x33, 0x45, 0xda, 0x4d, 0x18, + 0x4a, 0xf1, 0xd2, 0x58, 0xd9, 0xb3, 0x71, 0x6f, 0x2c, 0x50, 0x89, 0xcd, 0x02, 0xf2, 0x80, 0x40, 0x6d, 0xce, 0x41, 0x08, 0x95, 0x1e, 0x6b, 0x93, 0x80, 0xe5, 0xbb, 0x31, 0xe0, 0xfc, 0xc1, 0xd7, + 0x4a, 0x66, 0xff, 0x7e, 0xde, 0x51, 0x72, 0x45, 0xb4, 0xab, 0xb8, 0xc0, 0xbb, 0x4e, 0x81, 0xdb, 0x97, 0x3d, 0x16, 0x16, 0xd0, 0x0b, 0x19, 0xf2, 0x7f, 0xc8, 0xbe, 0x73, 0xe0, 0xd8, 0x38, 0x45, + 0x89, 0x3a, 0x64, 0xc2, 0x9b, 0xab, 0xa6, 0x87, 0x8c, 0xca, 0x2d, 0xa2, 0xc1, 0xf5, 0x52, 0x57, 0x69, 0xa6, 0xe4, 0xd4, 0x44, 0x32, 0x1c, 0x7f, 0x56, 0x2e, 0x64, 0xa0, 0x24, 0x17, 0x40, 0xa9, + 0x1b, 0xea, 0x74, 0xb8, 0xda, 0xe9, 0x54, 0x4c, 0xd8, 0x36, 0xba, 0x22, 0x9a, 0x4d, 0x32, 0x20, 0x6d, 0xd0, 0xb2, 0x45, 0xa2, 0x9c, 0xc4, 0x4a, 0x3c, 0x48, 0xd1, 0xe9, 0x01, 0x37, 0x95, 0xe1, + 0xca, 0xe1, 0x67, 0x3b, 0x67, 0x94, 0xf3, 0x5f, 0xd7, 0xa3, 0xf9, 0xb8, 0xa9, 0xe8, 0x19, 0x16, 0xc8, 0x8b, 0x58, 0x5c, 0x28, 0xbf, 0xc3, 0x71, 0x69, 0x9f, 0x10, 0x41, 0xbe, 0x47, 0x24, 0xf5, + 0x48, 0x7f, 0x9f, 0xe8, 0xdc, 0x62, 0x05, 0xd0, 0x0b, 0x8c, 0x68, 0x7a, 0x81, 0x8b, 0xa6, 0x20, 0xb0, 0x82, 0x38, 0x75, 0xea, 0xc3, 0xc2, 0x0e, 0xdb, 0x01, 0x6c, 0xc8, 0x69, 0x48, 0xcf, 0x99, + 0x53, 0x48, 0xdb, 0xdb, 0xd6, 0x0c, 0xa4, 0xb6, 0x14, 0xdd, 0xe4, 0x55, 0x4a, 0xcf, 0x44, 0x24, 0x5c, 0x63, 0x61, 0x1b, 0xad, 0x8d, 0x7d, 0xb2, 0x0b, 0x6b, 0x28, 0x62, 0x86, 0xc6, 0xdc, 0x6f, + 0x84, 0x3b, 0x97, 0xc4, 0xa7, 0xfd, 0x32, 0x9f, 0xb6, 0x59, 0xe9, 0x5e, 0xc7, 0xbd, 0x32, 0xef, 0x0b, 0xf5, 0x63, 0x10, 0x5f, 0xd9, 0x10, 0x79, 0x26, 0x79, 0x45, 0x2f, 0xef, 0x43, 0xdf, 0x6f, + 0x86, 0x3c, 0xc2, 0xa6, 0xf5, 0xe4, 0x54, 0x72, 0xd1, 0xbd, 0xa3, 0x3a, 0x80, 0x18, 0xcc, 0x2a, 0x5b, 0x6f, 0x29, 0x3a, 0x71, 0x84, 0x12, 0x1f, 0x8d, 0xf8, 0x55, 0x18, 0xa6, 0x02, 0x3d, 0x8f, + 0x0e, 0xae, 0xa0, 0x32, 0x63, 0x76, 0x2a, 0x4b, 0x43, 0x48, 0xcf, 0x36, 0xee, 0x72, 0x59, 0x0c, 0x88, 0x31, 0xb7, 0x95, 0x87, 0xeb, 0x9c, 0xd4, 0x2b, 0x64, 0x4d, 0x8d, 0x55, 0x99, 0xd6, 0x37, + 0x87, 0x92, 0xf2, 0x68, 0x38, 0x2c, 0xee, 0x04, 0xe9, 0x55, 0x6d, 0xf9, 0xa1, 0xda, 0x7b, 0x94, 0x42, 0xc3, 0x6e, 0x13, 0x34, 0xd4, 0xbd, 0xc8, 0x32, 0xbf, 0x0e, 0x1b, 0x1c, 0x57, 0x3c, 0xe2, + 0x05, 0x50, 0xef, 0x68, 0x9f, 0xd0, 0xbd, 0xbb, 0x73, 0x5a, 0xd4, 0x89, 0xef, 0x61, 0x9e, 0xf2, 0x4b, 0x94, 0x13, 0xec, 0x72, 0x6e, 0xd1, 0x36, 0x6e, 0x90, 0x3a, 0xc9, 0xcd, 0xa7, 0x3b, 0x97, + 0x15, 0xa9, 0xb4, 0x07, 0xef, 0x47, 0xa3, 0x8c, 0x0c, 0x42, 0x81, 0xac, 0x8c, 0x6a, 0x3a, 0x19, 0x90, 0x24, 0x44, 0xab, 0xec, 0xae, 0x10, 0xa7, 0x23, 0x91, 0x72, 0xcd, 0xa0, 0x1d, 0xb6, 0x2b, + 0xa5, 0x3e, 0xb8, 0x44, 0x40, 0x99, 0x51, 0x15, 0x72, 0x2b, 0x0b, 0xe8, 0x0d, 0x0c, 0x33, 0x9e, 0x7c, 0x2c, 0xd0, 0xf2, 0xbc, 0xc4, 0x59, 0xa0, 0x35, 0xb7, 0xf8, 0x1c, 0x45, 0xe6, 0x2b, 0x71, + 0x83, 0x5f, 0x1d, 0x55, 0xac, 0x38, 0x0c, 0xb5, 0xc8, 0x7c, 0x5a, 0x81, 0x8e, 0x78, 0xa9, 0x6a, 0xc2, 0x3b, 0xd5, 0x33, 0x13, 0xce, 0xd7, 0x7d, 0xa2, 0x5b, 0xc5, 0x84, 0xd5, 0x5e, 0x5a, 0x0c, + 0xcb, 0xd0, 0xee, 0xd1, 0x16, 0x4c, 0xa9, 0x7b, 0x39, 0x25, 0x6c, 0x62, 0x3e, 0x8c, 0x6d, 0xbc, 0x59, 0x60, 0xc2, 0x9c, 0x65, 0x60, 0xd4, 0xdc, 0x30, 0x12, 0x19, 0x2e, 0x6d, 0x95, 0x0c, 0x33, + 0x6f, 0xd8, 0x2a, 0x2a, 0x9f, 0xb1, 0xfb, 0x72, 0xe7, 0xb1, 0x6e, 0x63, 0xaf, 0xc5, 0x92, 0x28, 0x64, 0x37, 0xda, 0x90, 0x24, 0xe4, 0xb1, 0x3b, 0xab, 0xaa, 0xa2, 0x40, 0x40, 0xb7, 0xf5, 0x4f, + 0x36, 0x0e, 0x41, 0x9d, 0x94, 0xf1, 0x38, 0x4c, 0xe2, 0xc8, 0x8a, 0x8a, 0xbe, 0x15, 0x7a, 0x45, 0xf1, 0x45, 0x0d, 0xbf, 0x17, 0x11, 0xbc, 0xa7, 0x7e, 0x46, 0xf2, 0xfe, 0x5e, 0x1f, 0xea, 0x86, + 0xa8, 0x60, 0x22, 0xb9, 0x85, 0xf1, 0x64, 0x2f, 0x5f, 0x41, 0x52, 0x9d, 0xaa, 0x7e, 0x6e, 0xf0, 0x59, 0x99, 0x25, 0x93, 0x35, 0x63, 0xaf, 0x40, 0xa0, 0x51, 0x22, 0xd1, 0x8b, 0x30, 0x1e, 0xc8, + 0x28, 0x24, 0x5c, 0x95, 0x05, 0x5d, 0xc9, 0xd9, 0x78, 0xe4, 0xce, 0x4b, 0x1d, 0xc9, 0x86, 0x60, 0xb9, 0xd4, 0x7b, 0xe2, 0x44, 0x24, 0xcb, 0x09, 0xc8, 0x2b, 0x31, 0x39, 0x04, 0x15, 0xd3, 0xd6, + 0x8a, 0x5c, 0x78, 0xe2, 0x01, 0xfe, 0x0a, 0xb0, 0x9b, 0xc4, 0x83, 0xc7, 0x16, 0xea, 0x6b, 0x1a, 0xd2, 0x95, 0xec, 0x09, 0xa2, 0x6b, 0xa3, 0x0f, 0x7e, 0xaf, 0x1b, 0x41, 0x7d, 0x98, 0x0d, 0x32, + 0x08, 0x01, 0xb6, 0xbe, 0x6d, 0x0e, 0x56, 0x11, 0x47, 0x69, 0x7e, 0xe9, 0x40, 0x32, 0x69, 0x0a, 0xc8, 0x63, 0x0d, 0xfe, 0xcb, 0xde, 0xd9, 0x9e, 0x93, 0x17, 0x71, 0xf6, 0xdc, 0xf5, 0xff, 0x62, + 0xf7, 0xae, 0x74, 0xcf, 0xfd, 0xbb, 0xb6, 0x4e, 0x89, 0xc0, 0x1d, 0x94, 0x3f, 0x8d, 0x63, 0x93, 0xcc, 0xd9, 0x0f, 0x14, 0x97, 0x5c, 0x36, 0x34, 0x3c, 0x70, 0x7d, 0xa2, 0x9e, 0x15, 0x70, 0x8f, + 0x1a, 0xc0, 0x62, 0x0d, 0x51, 0x82, 0xc0, 0xb4, 0x29, 0x59, 0x2f, 0x12, 0x58, 0xd1, 0x86, 0xe1, 0x34, 0x54, 0x08, 0x76, 0x5d, 0x55, 0x45, 0x15, 0x46, 0x1a, 0x21, 0x1e, 0x36, 0xc2, 0x70, 0xce, + 0xa9, 0xe8, 0xbe, 0xe5, 0x28, 0x8c, 0x58, 0xc2, 0x70, 0x15, 0x68, 0x42, 0xb2, 0xb7, 0xa6, 0xdf, 0x45, 0xc1, 0xbe, 0x10, 0x70, 0x71, 0xd1, 0x4f, 0xb2, 0xf8, 0x1c, 0x12, 0x1d, 0x7c, 0x4c, 0x3f, + 0x77, 0x32, 0xcd, 0xb0, 0xec, 0x32, 0xe8, 0xdb, 0x7f, 0x1c, 0xde, 0x77, 0x3e, 0xcd, 0x50, 0xdb, 0x5b, 0x7d, 0xd3, 0x3b, 0xbb, 0xba, 0x3f, 0xf9, 0x1a, 0xcb, 0xc8, 0x4b, 0xcb, 0x6b, 0x61, 0xb9, + 0xdf, 0x0f, 0x03, 0xec, 0x75, 0xe6, 0x15, 0x56, 0xdf, 0xf6, 0x02, 0xab, 0x7f, 0xde, 0xbe, 0xff, 0x98, 0xd2, 0xc1, 0x74, 0xfa, 0xba, 0x96, 0x5b, 0xd7, 0x57, 0xa1, 0x2f, 0x09, 0xe1, 0x6e, 0x12, + 0x38, 0xde, 0x7b, 0xcf, 0xc6, 0xcc, 0x7d, 0xa9, 0xbb, 0xee, 0x63, 0xe6, 0x48, 0xf2, 0x34, 0x5c, 0x8e, 0x17, 0xa7, 0x5a, 0x0b, 0x1d, 0x46, 0x8a, 0x5a, 0x67, 0xd3, 0xfd, 0x6c, 0x7e, 0x90, 0x05, + 0x64, 0xc2, 0xc4, 0xbb, 0x62, 0xd5, 0x6b, 0x36, 0x13, 0x6c, 0x38, 0xd1, 0x71, 0x36, 0xf0, 0x0e, 0xba, 0x66, 0x8d, 0xb6, 0x36, 0xc9, 0x93, 0xc3, 0x6a, 0x93, 0x2f, 0x23, 0x20, 0xee, 0x29, 0x35, + 0x36, 0x74, 0xc8, 0xad, 0x28, 0x52, 0x2c, 0x01, 0x0f, 0x5c, 0x7e, 0x69, 0x2e, 0x7b, 0xf5, 0x94, 0x68, 0x27, 0x0b, 0x1b, 0x31, 0xa7, 0xcb, 0x00, 0xd8, 0x1f, 0xf6, 0xf2, 0x0f, 0x77, 0x6c, 0x76, + 0x0a, 0x0c, 0x9d, 0x7a, 0xe5, 0x3f, 0x8d, 0x18, 0xbc, 0xe8, 0x0a, 0xb9, 0x52, 0x7d, 0xc7, 0xcd, 0xd7, 0xb2, 0x2e, 0x2e, 0x91, 0x53, 0x4a, 0x71, 0xdd, 0xd3, 0x4c, 0xc3, 0x6e, 0xd7, 0x07, 0x63, + 0x6d, 0x31, 0x3d, 0x70, 0x1b, 0x54, 0x42, 0x96, 0x01, 0x48, 0x30, 0xdb, 0xac, 0x40, 0x9d, 0xc2, 0x07, 0xe2, 0x61, 0x87, 0x11, 0x10, 0x64, 0x1c, 0x44, 0x17, 0xda, 0xea, 0x87, 0x03, 0x7e, 0x50, + 0xc9, 0x19, 0x0b, 0x59, 0x9b, 0x82, 0xb2, 0xb1, 0xdc, 0x23, 0x32, 0x07, 0x0e, 0xdc, 0x48, 0xf6, 0xf3, 0xcd, 0x82, 0x9b, 0x72, 0xb6, 0x2e, 0x30, 0x65, 0xfd, 0xe3, 0x94, 0x62, 0xe3, 0x28, 0x16, + 0x8e, 0x76, 0x6d, 0xff, 0x69, 0xa9, 0xde, 0x17, 0xbd, 0x25, 0x37, 0x84, 0x4f, 0xf0, 0xfc, 0x69, 0x76, 0xf3, 0x94, 0x14, 0x36, 0x24, 0x33, 0x4e, 0xea, 0x55, 0xd3, 0x14, 0xb2, 0xd2, 0xe2, 0xc0, + 0x73, 0xc1, 0xc8, 0x94, 0x65, 0xaa, 0xd6, 0x8c, 0x9f, 0xf6, 0xf1, 0xb6, 0x16, 0xc2, 0xb3, 0x1e, 0xbe, 0xb0, 0xde, 0xbe, 0x93, 0x3d, 0xf6, 0xef, 0xbd, 0xd1, 0xb5, 0xaa, 0x47, 0x39, 0xda, 0x58, + 0x80, 0xee, 0x2c, 0xe9, 0x60, 0x6d, 0xae, 0xa1, 0xcd, 0x04, 0x15, 0xf7, 0x20, 0x51, 0x0e, 0x93, 0xd1, 0x1c, 0x8f, 0xa1, 0x03, 0x50, 0x6c, 0xf8, 0x62, 0x87, 0xe3, 0xd2, 0xa0, 0x0d, 0x5c, 0xc5, + 0x2d, 0xeb, 0xd5, 0xb6, 0xd8, 0xec, 0xd7, 0xe4, 0xa4, 0xa0, 0xcd, 0x6a, 0x3a, 0x30, 0x52, 0x94, 0xd8, 0xb4, 0xd6, 0x78, 0x36, 0xf0, 0xa0, 0x76, 0x89, 0x9a, 0xbc, 0x41, 0x24, 0xf5, 0x42, 0xc9, + 0xea, 0xaf, 0x4d, 0xbc, 0xac, 0x49, 0x8a, 0xb8, 0x9f, 0x69, 0x91, 0x19, 0x87, 0x7f, 0x44, 0xde, 0x33, 0xd7, 0xc3, 0x2b, 0x90, 0x7c, 0x7e, 0xc1, 0x09, 0x9c, 0xcf, 0xb7, 0xbb, 0xc6, 0x32, 0x2a, + 0x28, 0x09, 0x18, 0x0a, 0x69, 0x86, 0x19, 0x10, 0xac, 0xdd, 0xca, 0x9b, 0x43, 0x75, 0xb6, 0x4b, 0x16, 0x56, 0x23, 0x33, 0xb3, 0x91, 0x0a, 0x8b, 0xf4, 0x52, 0x91, 0x26, 0x5a, 0x12, 0xe2, 0x00, + 0x31, 0x1a, 0x46, 0x8b, 0x75, 0xdc, 0x54, 0x9b, 0x04, 0x11, 0x58, 0x60, 0xb2, 0x9e, 0xa6, 0xd1, 0x60, 0x3f, 0x69, 0xa3, 0x66, 0xeb, 0x28, 0xea, 0x32, 0x17, 0x0a, 0x45, 0x61, 0xb6, 0x7a, 0x39, + 0x23, 0xfe, 0x33, 0x76, 0xda, 0x99, 0x96, 0xf6, 0x34, 0x13, 0xfc, 0xb5, 0x92, 0xe2, 0x27, 0x8a, 0x40, 0xff, 0xfc, 0x7f, 0x97, 0xda, 0xe1, 0x50, 0x7f, 0xa4, 0xa5, 0x06, 0x4f, 0xe2, 0xe6, 0x3e, + 0x92, 0xa7, 0xd3, 0x89, 0xb1, 0x70, 0x42, 0x65, 0x40, 0xcd, 0xf4, 0x99, 0x71, 0x70, 0xbe, 0x1a, 0x27, 0xd7, 0x1d, 0xd7, 0x8f, 0xbe, 0x1d, 0x7d, 0x43, 0x5e, 0x70, 0x01, 0x9c, 0x28, 0x9e, 0xbe, + 0x5d, 0x2f, 0x9d, 0x53, 0x1d, 0xb4, 0x0e, 0x26, 0x3f, 0xd0, 0x1e, 0xea, 0x41, 0xaf, 0x72, 0x21, 0xc9, 0xae, 0x7a, 0x28, 0x1f, 0xe1, 0xda, 0x20, 0xca, 0x75, 0x63, 0xce, 0xae, 0x35, 0xb1, 0x1a, + 0x53, 0x6e, 0xec, 0x47, 0xd8, 0x74, 0x12, 0x0c, 0xab, 0x32, 0xa9, 0x59, 0x78, 0x33, 0x16, 0xa9, 0x62, 0xe2, 0x4d, 0x8a, 0x34, 0x23, 0xa8, 0x69, 0xd1, 0x2a, 0xd3, 0x95, 0xd9, 0x62, 0xc8, 0x82, + 0xdc, 0x1f, 0x2c, 0x03, 0xa7, 0x94, 0xd2, 0x80, 0xfd, 0x38, 0xc2, 0x3a, 0xfa, 0xa0, 0xc2, 0xfc, 0xcf, 0xb2, 0x70, 0x65, 0x76, 0xd7, 0xe1, 0x81, 0x3d, 0x5a, 0xf6, 0x13, 0xcb, 0xca, 0x6e, 0x3d, + 0xfb, 0x9c, 0x75, 0xaa, 0xbd, 0x72, 0x43, 0xe0, 0x53, 0x60, 0xfe, 0xcf, 0xb3, 0xcf, 0x66, 0xf6, 0xfb, 0xa3, 0xff, 0xd9, 0x65, 0x28, 0x1e, 0xcd, 0x80, 0xcc, 0xca, 0xf3, 0xef, 0x1c, 0xe3, 0xc8, + 0x4b, 0x86, 0xc7, 0x03, 0xfa, 0x27, 0x56, 0x7f, 0xba, 0xdb, 0x47, 0xbe, 0x37, 0x3e, 0xa0, 0xbe, 0xc3, 0x4a, 0x26, 0xe7, 0x9b, 0xcc, 0x6a, 0x52, 0x61, 0x73, 0x66, 0x4c, 0x29, 0x5e, 0x56, 0xe0, + 0x73, 0x27, 0x45, 0x00, 0xee, 0x55, 0x0d, 0xf2, 0x5b, 0x17, 0x79, 0x57, 0xd6, 0x76, 0xa9, 0x2b, 0x78, 0x57, 0xd4, 0xf8, 0x99, 0x6c, 0x1d, 0xbc, 0x80, 0xf2, 0x95, 0xec, 0x09, 0xdc, 0x6b, 0xe3, + 0x24, 0x47, 0x07, 0xdf, 0x4f, 0xa6, 0x68, 0xed, 0x09, 0x4e, 0xa8, 0x8f, 0x8a, 0x10, 0xd2, 0x90, 0x79, 0x1e, 0x2d, 0xc6, 0x36, 0x06, 0x88, 0x0b, 0x7b, 0x67, 0xf8, 0xcd, 0x72, 0x50, 0x11, 0x0b, + 0x48, 0xda, 0xb5, 0xe6, 0x38, 0xa4, 0xb3, 0xdd, 0x1c, 0x75, 0x0f, 0x3d, 0x67, 0x0b, 0xd4, 0x90, 0x32, 0x36, 0x22, 0xbc, 0x25, 0x9c, 0x79, 0x21, 0x7a, 0xd4, 0x28, 0x53, 0xc7, 0x8e, 0x52, 0xe8, + 0x5a, 0x8c, 0xf0, 0xe9, 0x22, 0x04, 0x96, 0x90, 0xf8, 0x5d, 0xe8, 0xf3, 0x0b, 0x1f, 0xef, 0x4d, 0xc2, 0xda, 0x83, 0x8c, 0x73, 0x2b, 0xef, 0x9f, 0x12, 0xb4, 0x0a, 0x2b, 0xd3, 0x8a, 0x4b, 0x96, + 0x4a, 0xc7, 0x14, 0xae, 0x8f, 0xc5, 0x51, 0xb5, 0xcc, 0x29, 0xc3, 0x6b, 0x3c, 0xff, 0x6f, 0xd0, 0xc7, 0xa3, 0x25, 0xbc, 0xbc, 0x6f, 0x6a, 0x85, 0xd5, 0x3f, 0x87, 0xfe, 0x7e, 0x3f, 0xcc, 0xf4, + 0xf5, 0xf2, 0x9b, 0x0d, 0x0c, 0x9f, 0x3e, 0xc3, 0xcb, 0x4f, 0x55, 0x4e, 0x7e, 0x5f, 0x6d, 0x87, 0xc1, 0xed, 0xc3, 0x4b, 0x44, 0xd1, 0xfb, 0x13, 0xb5, 0x43, 0x1f, 0x3c, 0x7e, 0x4f, 0xee, 0xfd, + 0x44, 0xfc, 0xfc, 0x83, 0xb7, 0x0f, 0x11, 0xc9, 0xbb, 0xaf, 0x3b, 0x7d, 0x5a, 0xf2, 0x96, 0x64, 0x71, 0x11, 0x17, 0x4d, 0x62, 0xbd, 0xd9, 0x81, 0xe6, 0x5c, 0xc9, 0x7d, 0x28, 0x4a, 0x94, 0x7b, + 0xa6, 0xd5, 0x37, 0x5c, 0x2d, 0x8a, 0xac, 0xe0, 0xbd, 0xaf, 0x77, 0x31, 0x8e, 0xda, 0xf5, 0x0c, 0xf7, 0x14, 0x55, 0x37, 0xfb, 0x49, 0xe6, 0x85, 0x5e, 0xe1, 0x55, 0xd6, 0x63, 0x70, 0xcf, 0x3f, + 0x35, 0xe2, 0x20, 0xb0, 0x4e, 0xd9, 0x76, 0x5f, 0xfd, 0xea, 0xa6, 0x1c, 0xcc, 0xef, 0xcf, 0xf1, 0xcb, 0xf7, 0x01, 0xf3, 0x6a, 0xe4, 0xbb, 0x73, 0xb2, 0xdd, 0xcd, 0x2c, 0xba, 0xbb, 0xff, 0x87, + 0x89, 0x7f, 0xdd, 0x8c, 0xbd, 0xd0, 0x3c, 0xed, 0x93, 0x3b, 0x5d, 0x75, 0x9d, 0xab, 0x07, 0xda, 0x77, 0xa9, 0x0c, 0x31, 0x96, 0x24, 0x0b, 0x92, 0xad, 0x29, 0xcf, 0xc5, 0xf5, 0x4e, 0x8d, 0x0a, + 0x5e, 0x3e, 0x00, 0x61, 0xcd, 0x89, 0x03, 0xa1, 0x46, 0x47, 0x78, 0xb0, 0x9e, 0x0f, 0xc1, 0xdd, 0x6c, 0xb4, 0xc2, 0x18, 0x71, 0x0d, 0x58, 0x6b, 0x6a, 0x59, 0xc6, 0x60, 0xe5, 0xa6, 0x2b, 0x55, + 0xee, 0xc9, 0xd4, 0x60, 0x1e, 0xc7, 0x66, 0x3d, 0x1e, 0x8d, 0x62, 0x95, 0x37, 0x91, 0xa9, 0x35, 0x62, 0x7f, 0x5c, 0xdd, 0xe3, 0x0c, 0xd5, 0xa1, 0xb0, 0x9e, 0x66, 0x95, 0x82, 0x2f, 0x95, 0x73, + 0xbb, 0xa1, 0xfb, 0x2e, 0xc9, 0x4e, 0xad, 0x3e, 0xd8, 0xad, 0xa0, 0xdb, 0x62, 0x45, 0x1f, 0x98, 0x95, 0xb6, 0x56, 0x4c, 0x3a, 0x98, 0x0b, 0xc5, 0x98, 0xb7, 0x29, 0x66, 0xa3, 0x16, 0x76, 0x0d, + 0x94, 0x36, 0x47, 0xf4, 0xb2, 0x8d, 0x8f, 0xa1, 0x43, 0x81, 0xa1, 0x5b, 0x23, 0x04, 0xaa, 0x59, 0xcd, 0x0b, 0xbb, 0x69, 0x81, 0xad, 0xd6, 0x29, 0x33, 0xdd, 0xe6, 0x21, 0xbc, 0x9b, 0x70, 0xd9, + 0x92, 0x99, 0x14, 0x5b, 0x01, 0x43, 0x73, 0x05, 0x5a, 0x4c, 0x58, 0x0a, 0xae, 0x46, 0xab, 0xbf, 0x53, 0x25, 0x44, 0x3b, 0x86, 0x9b, 0x8e, 0xdd, 0x0d, 0xad, 0xcc, 0x79, 0xb6, 0x02, 0xbf, 0xb6, + 0x49, 0xf0, 0x9d, 0xea, 0x05, 0xd0, 0xd3, 0x75, 0xd7, 0xed, 0x81, 0xd3, 0x39, 0x22, 0x3b, 0x0c, 0xea, 0x30, 0x41, 0x6f, 0x4d, 0xab, 0xe1, 0x00, 0xd9, 0x47, 0x79, 0x29, 0x4e, 0x93, 0x49, 0x2f, + 0x9a, 0x88, 0x5c, 0x86, 0x73, 0x68, 0x35, 0xe4, 0x0d, 0x87, 0xc4, 0x45, 0x0c, 0x61, 0x7d, 0x00, 0xdb, 0xa6, 0x9c, 0x37, 0xe5, 0xe7, 0x09, 0x49, 0x2a, 0x2d, 0xb4, 0x2e, 0x7a, 0x18, 0xa6, 0xab, + 0xc9, 0x1a, 0xe1, 0xf1, 0x45, 0x63, 0x81, 0xab, 0x78, 0xc8, 0xad, 0xd9, 0x0f, 0xbe, 0xeb, 0xef, 0x43, 0x01, 0x5d, 0xc1, 0xfb, 0x74, 0x98, 0xc7, 0x33, 0xf5, 0xfa, 0x15, 0x15, 0xf5, 0x9e, 0xf8, + 0x09, 0xca, 0xfb, 0x5b, 0x5d, 0x63, 0x55, 0x20, 0x23, 0x9a, 0xcb, 0xb8, 0xcc, 0xe9, 0x4a, 0x95, 0xe0, 0x89, 0x37, 0x0d, 0x54, 0x4b, 0x1d, 0xd1, 0xa4, 0x5c, 0x89, 0x87, 0x90, 0xcd, 0xeb, 0xcd, + 0x78, 0x62, 0x13, 0xee, 0x16, 0x67, 0xb7, 0xce, 0x0c, 0xd5, 0x08, 0x6e, 0x33, 0x29, 0x01, 0x64, 0xa3, 0x63, 0xe5, 0x56, 0x89, 0xdb, 0xbd, 0xdf, 0x04, 0xcd, 0xf8, 0x60, 0x81, 0x73, 0x92, 0xf1, + 0x04, 0x12, 0xf2, 0x37, 0xe8, 0x40, 0xc4, 0xc1, 0xed, 0xe6, 0xc7, 0xf9, 0x57, 0xa6, 0x65, 0x7b, 0x91, 0x75, 0xf2, 0x9c, 0x59, 0x59, 0xe1, 0x3d, 0xcd, 0xc3, 0x7a, 0x19, 0xae, 0x7b, 0xea, 0x67, + 0xbc, 0xee, 0xef, 0x75, 0x05, 0x0c, 0xe1, 0x52, 0x5b, 0x61, 0x7d, 0x38, 0x58, 0xb4, 0x26, 0x27, 0xda, 0x84, 0xca, 0xa8, 0x13, 0x60, 0xd3, 0x53, 0xcb, 0xa6, 0x47, 0x3a, 0x14, 0x66, 0x43, 0x18, + 0x6a, 0x11, 0x2c, 0x5c, 0xe3, 0xa6, 0x13, 0x25, 0xec, 0x28, 0x23, 0x29, 0x2b, 0x9b, 0x29, 0x09, 0x87, 0x62, 0x8c, 0xa2, 0x18, 0x7e, 0xb4, 0x37, 0xd7, 0x4b, 0xce, 0x5f, 0xef, 0x87, 0x23, 0x6c, + 0x33, 0x25, 0x89, 0x1e, 0x22, 0xb2, 0xc1, 0xae, 0xa3, 0xa6, 0xff, 0x79, 0x09, 0x06, 0xdf, 0xa0, 0x9f, 0x2b, 0xfd, 0x77, 0xa5, 0xc3, 0xbe, 0x63, 0xca, 0x33, 0x81, 0xfa, 0x9a, 0x23, 0xe2, 0x42, + 0xf3, 0x9d, 0x01, 0x66, 0x17, 0x17, 0x04, 0xd4, 0x6f, 0x14, 0x58, 0x6f, 0x2b, 0x73, 0x6b, 0x92, 0xde, 0x6a, 0xc2, 0x07, 0xc9, 0x54, 0x98, 0xa9, 0xe8, 0x20, 0xb7, 0x93, 0xe4, 0xb1, 0x9e, 0xfd, + 0x55, 0xa7, 0x3e, 0x44, 0xa0, 0xfe, 0xca, 0xbe, 0xdd, 0x92, 0x3e, 0x75, 0xf1, 0xf6, 0x46, 0xb7, 0x9e, 0x22, 0x6d, 0xe6, 0x86, 0x5a, 0x53, 0xf4, 0x10, 0x68, 0x32, 0x4e, 0x33, 0x27, 0x4f, 0x50, + 0xcf, 0xc8, 0xe6, 0xab, 0x83, 0xbb, 0xff, 0x89, 0x94, 0x42, 0xbb, 0x09, 0xa9, 0x3f, 0xde, 0xea, 0x47, 0x30, 0x0c, 0x5e, 0x33, 0xb1, 0x2e, 0x44, 0x8f, 0x00, 0x5c, 0x2e, 0x4f, 0xa9, 0x34, 0x1d, + 0x56, 0x4b, 0x9e, 0x23, 0x52, 0xa4, 0xa5, 0xac, 0x01, 0xe1, 0xa6, 0x72, 0xea, 0x67, 0x1a, 0xbf, 0x0a, 0x5b, 0x15, 0x5a, 0x30, 0xf4, 0x50, 0xdc, 0xf2, 0x73, 0x29, 0x98, 0xb0, 0x63, 0x1a, 0xdd, + 0xcf, 0xe1, 0x98, 0xaf, 0x16, 0xea, 0x1e, 0x17, 0x74, 0x7e, 0x57, 0x15, 0x14, 0x07, 0xef, 0x26, 0x29, 0x62, 0xd7, 0xfb, 0xcd, 0x70, 0x3c, 0xae, 0x2a, 0x1a, 0x5d, 0x8c, 0xc0, 0xd1, 0xa6, 0x17, + 0x3b, 0xd3, 0x9c, 0xe4, 0xe0, 0xd7, 0xcb, 0xd4, 0x78, 0x1f, 0xeb, 0x7e, 0xfe, 0x74, 0xa2, 0x75, 0x72, 0xbe, 0xc4, 0x85, 0xe7, 0x44, 0xcf, 0xe3, 0x2a, 0xe0, 0x4b, 0xee, 0xde, 0x77, 0xaa, 0x67, + 0x2e, 0x9c, 0xaf, 0xfb, 0x60, 0x37, 0x77, 0xaf, 0x3c, 0x9b, 0xcd, 0xb6, 0xb6, 0xa8, 0x95, 0x65, 0xae, 0x6d, 0xe6, 0xe3, 0x1e, 0x61, 0x3b, 0x9b, 0xde, 0x72, 0x53, 0x91, 0xbb, 0xfd, 0x58, 0x0a, + 0x37, 0x15, 0x9e, 0xef, 0xb1, 0x28, 0xf6, 0x29, 0x55, 0xad, 0xca, 0x95, 0xbc, 0x9c, 0xc9, 0x0d, 0xa8, 0xee, 0x51, 0x39, 0xa1, 0x79, 0x0a, 0x9b, 0x50, 0xbe, 0x08, 0xfa, 0x09, 0x59, 0x1b, 0xa3, + 0x71, 0x45, 0xa3, 0x56, 0x6c, 0x57, 0x4d, 0x4b, 0x1a, 0x02, 0xf5, 0xba, 0xfd, 0x75, 0x2a, 0x80, 0xfa, 0xbe, 0xe3, 0x17, 0x79, 0x5c, 0xdc, 0xfb, 0x53, 0x46, 0xc4, 0xb9, 0xcb, 0x27, 0x9c, 0x74, + 0x2f, 0x02, 0xae, 0xcd, 0x0e, 0x0c, 0x29, 0x93, 0xc0, 0x3a, 0x58, 0xd9, 0xf3, 0x4c, 0xd3, 0x57, 0x92, 0x6c, 0xde, 0xa9, 0x1e, 0x19, 0x72, 0xbd, 0x3e, 0x31, 0xe4, 0x9b, 0x14, 0x1b, 0xa8, 0x8f, + 0x3b, 0xb4, 0x49, 0xb3, 0xf5, 0x0a, 0x24, 0x2a, 0x1a, 0xd0, 0x31, 0xdf, 0x36, 0xc6, 0x31, 0x61, 0xa0, 0xa3, 0xc5, 0x8a, 0xf9, 0xa1, 0xf0, 0xfb, 0xbe, 0x66, 0x09, 0x7e, 0x67, 0x63, 0x75, 0xed, + 0xdc, 0xf3, 0x9a, 0x25, 0x27, 0x7a, 0xdf, 0x8f, 0xb8, 0x71, 0x4d, 0x2e, 0x84, 0x09, 0xc3, 0xe3, 0x8b, 0x4a, 0x99, 0x92, 0xe0, 0xb6, 0x11, 0xaa, 0xda, 0x4d, 0x07, 0xcb, 0x41, 0xba, 0x76, 0x0d, + 0x6c, 0xcd, 0xf9, 0x14, 0xa6, 0x2b, 0x8e, 0x33, 0x0d, 0x98, 0x81, 0xd2, 0x50, 0x4e, 0xd0, 0x03, 0xab, 0x43, 0x3a, 0xd8, 0xd0, 0x3a, 0xb7, 0x9a, 0xa6, 0x0b, 0x07, 0x77, 0xed, 0x6d, 0x1b, 0x96, + 0x84, 0x34, 0x50, 0x21, 0x3e, 0xb6, 0xdd, 0x50, 0x62, 0x5c, 0xa6, 0xf8, 0x71, 0x80, 0xe1, 0xa8, 0xd7, 0xc7, 0xf6, 0x77, 0x4b, 0x03, 0xfa, 0x02, 0xf7, 0xef, 0x28, 0x1f, 0x21, 0xba, 0x6d, 0x9f, + 0xf2, 0x63, 0x3a, 0x24, 0x5a, 0xf5, 0xca, 0x1a, 0xf2, 0x22, 0x86, 0xde, 0xac, 0xf9, 0x58, 0xdb, 0x94, 0x74, 0x2b, 0x34, 0x3b, 0x13, 0x86, 0x3c, 0x83, 0xeb, 0x19, 0x51, 0x81, 0x8e, 0x5b, 0x6a, + 0x90, 0x6d, 0x7b, 0xcb, 0x31, 0x54, 0xfb, 0x2b, 0x59, 0x94, 0x56, 0x79, 0x4f, 0xb2, 0xf0, 0xe9, 0xaa, 0xc2, 0x47, 0xee, 0x12, 0xaf, 0xc4, 0xe1, 0x01, 0x88, 0x99, 0xc6, 0x5d, 0xac, 0x07, 0x6b, + 0x01, 0xa2, 0x7b, 0x89, 0xcb, 0x8f, 0xe8, 0x72, 0xf0, 0xba, 0x74, 0x8c, 0x23, 0xe3, 0x6a, 0x6c, 0x77, 0x5b, 0x6d, 0xac, 0xbc, 0x7f, 0x3d, 0xf3, 0xec, 0xb9, 0x7a, 0x47, 0xbc, 0xb0, 0xe2, 0xdc, + 0x10, 0x3e, 0x62, 0xfb, 0xa7, 0xd5, 0x3f, 0x13, 0xfc, 0x1e, 0xda, 0xc5, 0xbc, 0x65, 0x71, 0x2e, 0xe3, 0x35, 0x42, 0x12, 0x41, 0x5f, 0x83, 0x6b, 0x44, 0x59, 0x2e, 0x5a, 0xd9, 0x99, 0x8f, 0x67, + 0x6b, 0x73, 0xbd, 0xda, 0x40, 0xcd, 0xa6, 0xb2, 0x5a, 0x7f, 0x19, 0x89, 0xc4, 0x90, 0xea, 0x6d, 0x04, 0x90, 0xe8, 0x89, 0x6d, 0x01, 0x87, 0x2d, 0xa2, 0x90, 0x30, 0x65, 0xec, 0x81, 0x5e, 0x3d, + 0x28, 0x6c, 0x26, 0x05, 0x84, 0x58, 0x1e, 0x4d, 0xd3, 0xf9, 0x7c, 0xc6, 0xc1, 0x4d, 0xc7, 0x44, 0xee, 0xcf, 0xee, 0xa5, 0x3b, 0x97, 0x89, 0x95, 0x1f, 0xb5, 0xfa, 0x8f, 0xee, 0x0d, 0xf8, 0xc3, + 0xe1, 0x63, 0xaf, 0x6d, 0x22, 0x84, 0x3e, 0x55, 0xd2, 0xfe, 0xfd, 0xd0, 0xd1, 0xe2, 0x6a, 0x79, 0x3f, 0x6f, 0x42, 0x3d, 0x0e, 0xf2, 0xc7, 0x1f, 0xe9, 0xe5, 0xfd, 0x63, 0x37, 0x34, 0x3d, 0xf8, + 0xf3, 0x81, 0xc8, 0x87, 0x1f, 0x44, 0x96, 0xa3, 0x1d, 0x7b, 0xd0, 0x6f, 0xad, 0x2c, 0x7e, 0x5f, 0x54, 0x3f, 0xba, 0xc0, 0xee, 0x9d, 0x57, 0x1f, 0x5f, 0x72, 0x13, 0xfa, 0x86, 0x9e, 0xb9, 0xaf, + 0xa2, 0x3c, 0xf9, 0xe3, 0x1d, 0x1b, 0xde, 0xfb, 0x94, 0xfe, 0x0a, 0x1f, 0xd6, 0xf9, 0x1b, 0x6e, 0x7c, 0x58, 0x45, 0xe6, 0x85, 0xd6, 0x0d, 0xfb, 0xd0, 0x6f, 0x7f, 0x9d, 0x17, 0x5a, 0x56, 0x3c, + 0xfe, 0x7d, 0x19, 0xe9, 0xf1, 0xe1, 0x81, 0x37, 0xeb, 0xe7, 0xca, 0xc7, 0x3f, 0xa8, 0x40, 0xf0, 0x67, 0x77, 0xe8, 0x33, 0x43, 0xee, 0xe7, 0x5a, 0xcd, 0x07, 0xda, 0xe7, 0xc9, 0x7e, 0x7b, 0xa7, + 0xeb, 0xc9, 0x9f, 0x3d, 0x4a, 0x5a, 0x11, 0x33, 0xa5, 0xd6, 0xb9, 0x71, 0xad, 0x37, 0xb5, 0xef, 0x85, 0xb5, 0xca, 0xd1, 0x09, 0x31, 0x2a, 0x95, 0xdd, 0x4a, 0x84, 0xe7, 0xea, 0x74, 0x1b, 0x7b, + 0xf0, 0x28, 0x58, 0xaf, 0x44, 0xc4, 0xd2, 0x23, 0x86, 0x19, 0xd6, 0xc0, 0x72, 0x91, 0x2c, 0xd5, 0x62, 0x84, 0x8f, 0x40, 0x65, 0xa1, 0x6d, 0xa8, 0xba, 0xb7, 0xc2, 0xd9, 0xe9, 0xd8, 0x8a, 0x99, + 0x0d, 0xbe, 0x5a, 0x57, 0x1c, 0xee, 0xbe, 0x2e, 0x4a, 0xbf, 0x11, 0x01, 0x8f, 0xa7, 0x2e, 0xf8, 0xdd, 0x0c, 0xfd, 0xce, 0xbb, 0xfc, 0x79, 0x2b, 0xdc, 0xa5, 0x6a, 0xca, 0x69, 0x62, 0x7e, 0x9a, + 0x7a, 0x56, 0xf1, 0xfc, 0xd9, 0x17, 0xd3, 0xf2, 0xb3, 0xcb, 0xf9, 0x1f, 0x3e, 0x26, 0xff, 0x7f, 0x77, 0xea, 0x77, 0x8a, 0xd0, 0xa7, 0x35, 0xe7, 0xf1, 0x1c, 0x7e, 0x65, 0x53, 0xdc, 0x07, 0xda, + 0xe7, 0x39, 0x7c, 0x7b, 0xa7, 0x0f, 0x75, 0xdb, 0x20, 0xc7, 0x8f, 0x57, 0x41, 0xe0, 0xa8, 0xf3, 0x42, 0x93, 0xe3, 0x61, 0xe8, 0x29, 0xa4, 0xb1, 0x18, 0xbb, 0x92, 0xac, 0xd1, 0x4b, 0x7f, 0x3e, + 0x45, 0xd6, 0x4a, 0x0e, 0x6d, 0x3c, 0x93, 0xc2, 0x47, 0xb5, 0x37, 0xf1, 0xa1, 0xbd, 0x72, 0x60, 0x2d, 0x5e, 0x32, 0x8a, 0xc5, 0xc8, 0x6a, 0x47, 0x2b, 0x7a, 0xa0, 0xb2, 0x02, 0x0d, 0x3a, 0x30, + 0xe3, 0xac, 0x23, 0x8c, 0xad, 0x49, 0x94, 0x91, 0x08, 0x4f, 0x48, 0xaa, 0x8e, 0xfb, 0x2e, 0x3e, 0xaf, 0x77, 0x50, 0xa7, 0x50, 0xcd, 0xc7, 0x29, 0x79, 0x9e, 0xb2, 0x37, 0xb3, 0xfe, 0xd3, 0xdc, + 0xf8, 0x5f, 0x55, 0xc8, 0x1b, 0x5a, 0x62, 0xf5, 0x9d, 0x58, 0x7b, 0xbe, 0x1f, 0xe4, 0x95, 0x03, 0x84, 0x6f, 0xe8, 0x9e, 0x06, 0xc6, 0x7b, 0xeb, 0x94, 0xa9, 0xd4, 0x61, 0x50, 0x10, 0x40, 0xc9, + 0xb8, 0xfa, 0x0c, 0x82, 0xc7, 0xb9, 0xdf, 0xc0, 0xf3, 0xc9, 0x16, 0xa7, 0x86, 0x09, 0xad, 0x67, 0x96, 0xb6, 0xd1, 0x44, 0x60, 0x95, 0x2c, 0x91, 0xc6, 0x88, 0x9a, 0x6a, 0x12, 0x48, 0x66, 0xcd, + 0x0d, 0x22, 0x6c, 0xa6, 0x60, 0x5b, 0xcc, 0x82, 0x99, 0xb5, 0x15, 0xda, 0xd5, 0x4c, 0xb5, 0x64, 0x2e, 0x55, 0x87, 0x23, 0x00, 0x99, 0xa5, 0x8c, 0xca, 0x39, 0x6c, 0x44, 0xba, 0xa3, 0x1a, 0xf8, + 0x4e, 0xb0, 0xff, 0x05, 0x5e, 0x80, 0x2f, 0x63, 0x17, 0xaf, 0x15, 0xa0, 0x7a, 0x0f, 0x5b, 0x5c, 0x22, 0x16, 0x1d, 0x0b, 0x50, 0xd9, 0x7e, 0x5a, 0x8e, 0x07, 0x43, 0x83, 0xc2, 0xc7, 0xcd, 0x16, + 0x2b, 0xb3, 0xe5, 0x8e, 0x05, 0xa7, 0x64, 0x69, 0xef, 0x55, 0x23, 0xf6, 0x66, 0x33, 0x02, 0xac, 0xa5, 0x72, 0x5d, 0xfa, 0xbb, 0xc1, 0x10, 0x34, 0xc8, 0x81, 0x54, 0x04, 0x11, 0x0c, 0x4e, 0x60, + 0x99, 0x44, 0x45, 0x60, 0x3b, 0x12, 0x36, 0xa9, 0xbb, 0xb3, 0x6d, 0x35, 0x80, 0x17, 0x4b, 0x47, 0xec, 0x39, 0xbc, 0xb9, 0x66, 0x18, 0x2f, 0x04, 0x7e, 0x9c, 0x4d, 0xfb, 0xf9, 0xa8, 0xfe, 0xc7, + 0xa6, 0xf8, 0xf0, 0x05, 0x73, 0xe1, 0x03, 0x6d, 0xa0, 0xff, 0xf1, 0x4e, 0xff, 0x44, 0xf7, 0x7b, 0xa8, 0x80, 0xe9, 0xa8, 0xf6, 0x81, 0x64, 0xbe, 0xc5, 0xea, 0xe1, 0x8e, 0xb0, 0xf2, 0x71, 0x8f, + 0x84, 0xa2, 0xd8, 0xf7, 0x98, 0x25, 0xb4, 0xb2, 0x68, 0x50, 0x60, 0xc7, 0x71, 0x7b, 0x00, 0xec, 0x54, 0xf7, 0x0d, 0x58, 0x74, 0xf6, 0x61, 0xce, 0x42, 0xa0, 0x31, 0xc5, 0x87, 0x74, 0x91, 0xd0, + 0x56, 0x10, 0x68, 0x6b, 0x53, 0xce, 0xe1, 0x78, 0x4e, 0xac, 0x49, 0xb4, 0x02, 0x05, 0x1a, 0xd6, 0xc4, 0x5a, 0xfa, 0xb8, 0x77, 0xf9, 0xa9, 0xca, 0xf0, 0x5e, 0x03, 0xf9, 0x93, 0x82, 0x7a, 0xbf, + 0x53, 0xee, 0x51, 0xfd, 0xe4, 0x9b, 0xac, 0xf8, 0xdf, 0x7f, 0x23, 0x3e, 0x2a, 0x02, 0xd7, 0x74, 0xa0, 0x07, 0x3a, 0x82, 0xad, 0xe5, 0xc5, 0xf5, 0x44, 0x63, 0xe4, 0x0d, 0xfe, 0x20, 0xd0, 0xfc, + 0xbc, 0xdf, 0x68, 0xe1, 0x93, 0xba, 0x4e, 0x47, 0xf6, 0xf6, 0xe3, 0xfc, 0x94, 0x58, 0xf7, 0x27, 0xe2, 0x7b, 0xaf, 0xc1, 0x57, 0x56, 0x16, 0xc4, 0x9a, 0xd9, 0x3f, 0x6a, 0xcb, 0x77, 0x71, 0xda, + 0x0f, 0x79, 0xb4, 0x49, 0x16, 0x87, 0x7d, 0x23, 0xf0, 0x2e, 0x5b, 0xff, 0xff, 0x06, 0x7d, 0x2a, 0x53, 0x95, 0x9e, 0x5f, 0x81, 0xbd, 0x41, 0x0f, 0x0b, 0x96, 0x7d, 0xf2, 0x16, 0x7d, 0x1e, 0x6f, + 0x27, 0xaf, 0x91, 0x11, 0x78, 0xdd, 0x76, 0xd1, 0x5c, 0x8e, 0x88, 0x3e, 0x55, 0x80, 0x2c, 0x33, 0xaf, 0xff, 0x9e, 0xcc, 0xfe, 0x85, 0x87, 0xf9, 0xe7, 0xe2, 0xf1, 0xe9, 0x5b, 0x4e, 0x63, 0xf8, + 0xc9, 0xb3, 0x2e, 0xf5, 0xcd, 0x8f, 0xa3, 0x79, 0xcb, 0x3a, 0xec, 0xd6, 0x19, 0x58, 0xf2, 0xa1, 0x12, 0xd4, 0x59, 0xbd, 0x25, 0xa6, 0x95, 0xad, 0x6b, 0x34, 0x3e, 0xda, 0x89, 0x2e, 0x6c, 0x2c, + 0x7a, 0x88, 0x3f, 0xb0, 0xb9, 0x59, 0x2b, 0x73, 0xe3, 0xc3, 0x96, 0x9c, 0x23, 0xe6, 0x06, 0xd1, 0xf0, 0x6d, 0x4b, 0x34, 0xb0, 0x0d, 0x94, 0x3c, 0x68, 0x21, 0x24, 0xb6, 0x0d, 0x63, 0x93, 0x42, + 0x62, 0x71, 0x80, 0xfa, 0x12, 0x3f, 0xa4, 0x37, 0x12, 0xc3, 0x38, 0x5f, 0x26, 0xf9, 0x7d, 0x3e, 0x58, 0xfb, 0xb1, 0xf8, 0x7b, 0x25, 0xe8, 0xf3, 0x81, 0xf6, 0x1f, 0x84, 0xde, 0xb3, 0x51, 0x90, + 0x6e, 0x01, 0x1f, 0x1b, 0x49, 0xf9, 0x61, 0xcc, 0x37, 0x43, 0x1f, 0x1e, 0xb9, 0xa4, 0x05, 0xd0, 0xc3, 0xcd, 0x78, 0x08, 0xd5, 0x8b, 0x90, 0x25, 0xc7, 0x63, 0x19, 0x70, 0xa8, 0x55, 0xc4, 0x2e, + 0x47, 0xca, 0x6c, 0xe0, 0xe6, 0xf5, 0x0a, 0x27, 0x17, 0xac, 0x0f, 0x0e, 0x69, 0x63, 0x40, 0x2b, 0xcb, 0x76, 0x68, 0xcc, 0x98, 0x5e, 0xef, 0x10, 0x24, 0xd4, 0x98, 0x71, 0x28, 0xcd, 0x2b, 0x36, + 0x39, 0x88, 0x8c, 0x24, 0x81, 0x40, 0xbf, 0x3e, 0xa6, 0xee, 0xcb, 0xb3, 0xc4, 0x9f, 0xad, 0xb6, 0xaf, 0x08, 0xc2, 0x67, 0xaf, 0xb9, 0xa2, 0xf5, 0xf0, 0xe1, 0x69, 0x2d, 0xee, 0x20, 0x1e, 0x03, + 0xd7, 0x04, 0xea, 0x69, 0x6f, 0xb1, 0x1f, 0x12, 0xb4, 0x1a, 0x4b, 0xe3, 0x22, 0xd8, 0x64, 0x1a, 0x5d, 0xd8, 0xee, 0x60, 0xa7, 0x78, 0x3e, 0xe3, 0x6b, 0xc1, 0xce, 0xd8, 0xe3, 0xb9, 0x26, 0x17, + 0xa5, 0x16, 0x89, 0x54, 0xb3, 0xe0, 0x0e, 0x11, 0xed, 0x8a, 0xbb, 0x09, 0x35, 0x4f, 0xe9, 0x03, 0x85, 0x87, 0xb9, 0x40, 0x50, 0x60, 0x39, 0x0e, 0xd3, 0x60, 0x5f, 0xfb, 0xe3, 0x0d, 0x71, 0xa8, + 0x6a, 0xfa, 0xeb, 0xac, 0xd1, 0xdb, 0x8f, 0xfe, 0x0e, 0x31, 0xfc, 0x0d, 0xfa, 0xf9, 0xa2, 0xfa, 0xe0, 0x05, 0x1f, 0xb0, 0xfa, 0x03, 0xd2, 0xf1, 0x05, 0xdf, 0xa3, 0x84, 0xba, 0x7e, 0xad, 0x52, + 0xeb, 0xd0, 0xf1, 0x01, 0x55, 0x66, 0x77, 0xee, 0x64, 0x1b, 0x57, 0xb3, 0xb5, 0xe1, 0x4d, 0x80, 0x41, 0xb8, 0x2d, 0x46, 0x0c, 0xcf, 0x1f, 0x96, 0x3d, 0x78, 0x43, 0x52, 0xd3, 0x32, 0xc2, 0x29, + 0x41, 0xda, 0xc3, 0xf1, 0x8a, 0x29, 0xf4, 0x72, 0xa8, 0xaa, 0x09, 0xb6, 0x4f, 0xfd, 0x9e, 0xa5, 0x02, 0x25, 0xde, 0xf6, 0x4c, 0x87, 0x74, 0x38, 0x1c, 0x35, 0xec, 0x99, 0x10, 0x91, 0x1d, 0x17, + 0x91, 0xcb, 0xf6, 0xe1, 0xa3, 0x98, 0xfc, 0xb4, 0x06, 0xfc, 0x89, 0xfd, 0x5f, 0x8f, 0x9d, 0xbf, 0x79, 0x9c, 0xd9, 0xa6, 0xf1, 0x58, 0x34, 0x5f, 0x32, 0x66, 0x73, 0x2f, 0xf4, 0x02, 0xed, 0xda, + 0xd5, 0xbf, 0xa1, 0x2f, 0xd5, 0x8d, 0xfc, 0x05, 0x81, 0x1d, 0x53, 0x15, 0x4e, 0x0c, 0xc8, 0x2c, 0xf3, 0xb9, 0x6b, 0xf1, 0x35, 0x1d, 0xea, 0x86, 0xee, 0x95, 0xcd, 0xe7, 0x56, 0x57, 0x6d, 0x4a, + 0x59, 0xf6, 0xc6, 0x8a, 0x3d, 0xde, 0x08, 0x1b, 0x4e, 0x56, 0x57, 0xf2, 0xda, 0xf2, 0x22, 0x7a, 0xc9, 0x3a, 0x4d, 0xc1, 0x41, 0xf5, 0x9a, 0x01, 0xc6, 0x80, 0x3c, 0x5e, 0x4c, 0xbc, 0x01, 0x36, + 0xc9, 0x15, 0xd8, 0xac, 0xeb, 0x8a, 0x01, 0xc1, 0x3d, 0x33, 0xa7, 0xe7, 0x31, 0x83, 0x27, 0xdc, 0x26, 0x9d, 0xc5, 0x9c, 0x55, 0x13, 0x22, 0xa7, 0xc2, 0xa2, 0x68, 0xd3, 0x2c, 0x2d, 0x2f, 0xe8, + 0x1d, 0x95, 0xff, 0x24, 0x61, 0xa1, 0xcb, 0x8e, 0x83, 0x53, 0xbf, 0x72, 0xcd, 0xee, 0x26, 0x67, 0x5e, 0x5c, 0xb6, 0xee, 0xe9, 0x5f, 0xd1, 0xbc, 0xbf, 0xdb, 0x55, 0xcb, 0xdf, 0xf6, 0xd8, 0xb9, + 0x01, 0x9b, 0x21, 0xb3, 0x08, 0xd6, 0x49, 0x40, 0x01, 0x34, 0xca, 0x0e, 0x83, 0xe1, 0xc2, 0x18, 0xd1, 0x23, 0x7b, 0x5d, 0xac, 0x31, 0x52, 0x21, 0xd0, 0x72, 0xb3, 0xd8, 0xf1, 0xd8, 0xa4, 0x32, + 0xda, 0xe1, 0xc2, 0x70, 0x10, 0x44, 0x81, 0x5b, 0x88, 0xd9, 0xe8, 0x81, 0x84, 0x1d, 0x4c, 0x65, 0x80, 0xae, 0x77, 0xca, 0x86, 0x9e, 0x54, 0x3d, 0x70, 0x9b, 0xa4, 0x04, 0x13, 0x63, 0xed, 0xfe, + 0xeb, 0x2d, 0xc7, 0x7f, 0x34, 0x9f, 0xc7, 0xa3, 0x0b, 0x7e, 0x65, 0x27, 0xcb, 0x85, 0xe8, 0x05, 0x8c, 0x23, 0x00, 0x67, 0x42, 0xdf, 0x23, 0xa0, 0x2e, 0xc0, 0x0d, 0x56, 0x22, 0xb8, 0x89, 0x0d, + 0x8a, 0x91, 0x42, 0x04, 0x5c, 0xbd, 0xe1, 0xa6, 0xc5, 0xb4, 0x8a, 0x26, 0xd6, 0xdc, 0x98, 0x11, 0x20, 0x4f, 0x2e, 0x45, 0x73, 0xec, 0xa6, 0xe3, 0x10, 0xf5, 0xd0, 0x43, 0xcf, 0xcb, 0x01, 0x84, + 0x58, 0xc9, 0x10, 0xea, 0xb4, 0xf3, 0x52, 0xd8, 0xb9, 0x89, 0x15, 0x49, 0x8b, 0x5e, 0x22, 0xcd, 0xdb, 0xa5, 0x51, 0x0e, 0xd8, 0x08, 0x8a, 0xcb, 0x96, 0x43, 0x3a, 0x4a, 0x8d, 0x7f, 0xbb, 0x7e, + 0xb6, 0xe6, 0x57, 0x27, 0x35, 0xc3, 0x0b, 0xac, 0x6b, 0xda, 0xe3, 0x07, 0x35, 0xec, 0xdd, 0x11, 0x1f, 0xc4, 0x8e, 0xf3, 0x74, 0xd3, 0xd2, 0xf5, 0x4c, 0xb1, 0x73, 0x75, 0x2f, 0xf8, 0xa3, 0xc2, + 0xf9, 0x59, 0xa0, 0x9f, 0x4f, 0x81, 0xfc, 0xf4, 0xc3, 0x23, 0x80, 0x56, 0x96, 0x5d, 0x72, 0x30, 0xc1, 0x8f, 0x09, 0x85, 0xd7, 0x9f, 0xd4, 0x5a, 0x16, 0x5d, 0xbf, 0x05, 0xfc, 0x28, 0xbf, 0x6c, + 0x2f, 0x32, 0xfb, 0xe1, 0xf1, 0x47, 0x57, 0xc9, 0xf5, 0x51, 0x05, 0x0e, 0xb4, 0x22, 0x2f, 0xfe, 0xf4, 0x17, 0xba, 0xfb, 0x8c, 0xc0, 0x73, 0xdc, 0xe2, 0xf8, 0xf7, 0x7f, 0xaa, 0xd8, 0x9e, 0xc5, + 0xe7, 0xbd, 0xfe, 0xea, 0x45, 0xf1, 0x55, 0xf0, 0x7e, 0x3e, 0x8a, 0xf1, 0xd0, 0xf4, 0x35, 0xd3, 0xfc, 0x73, 0x9e, 0x22, 0xfe, 0x44, 0xf2, 0x7e, 0x70, 0x39, 0xe4, 0x96, 0x51, 0x66, 0xd6, 0x19, + 0xac, 0xeb, 0x39, 0xbf, 0x8f, 0x8e, 0xd5, 0xb7, 0xc2, 0xca, 0xba, 0xd6, 0x52, 0x43, 0xee, 0x41, 0x2c, 0xbc, 0xa8, 0xe9, 0x07, 0x59, 0x79, 0x79, 0xda, 0x5d, 0xf6, 0xde, 0x22, 0xff, 0xd8, 0x50, + 0x7b, 0xa5, 0x2e, 0xe0, 0x1d, 0xe5, 0x9b, 0x49, 0x72, 0x6a, 0xf7, 0xc1, 0x6e, 0xf5, 0x01, 0xe3, 0xb1, 0x9d, 0x18, 0x39, 0x15, 0x99, 0x4e, 0x44, 0x6d, 0x1c, 0x8f, 0xc1, 0xf5, 0x7a, 0xca, 0x8e, + 0xca, 0x08, 0x36, 0x57, 0x3d, 0xd4, 0x25, 0xd0, 0x8a, 0x0c, 0xf6, 0xdb, 0x7c, 0x1b, 0xb5, 0xc0, 0x4a, 0x66, 0x87, 0x82, 0x65, 0xdb, 0x03, 0x79, 0x1a, 0x4f, 0x03, 0x18, 0x85, 0x0e, 0x92, 0xb7, + 0xb0, 0xe8, 0xed, 0x0e, 0xa8, 0xe4, 0x61, 0xbb, 0xa7, 0x36, 0xbb, 0x54, 0x91, 0x0f, 0xfe, 0xaa, 0xa6, 0x8d, 0xef, 0xd5, 0xb7, 0xfb, 0x81, 0xf6, 0x18, 0x93, 0x57, 0xaa, 0xc7, 0x7e, 0xa0, 0x7d, + 0x83, 0xca, 0xe5, 0x4e, 0x1f, 0xec, 0x56, 0x47, 0x36, 0x87, 0x26, 0xbc, 0x53, 0x92, 0x35, 0x30, 0x4c, 0x0b, 0x03, 0x4a, 0x80, 0xad, 0xa4, 0xa0, 0x56, 0x3a, 0xdc, 0x72, 0x02, 0x33, 0x1a, 0xef, + 0xfd, 0x1e, 0x2d, 0x19, 0x2b, 0x86, 0x85, 0xbc, 0x08, 0xe5, 0x36, 0x03, 0x6d, 0xaa, 0xf1, 0xe3, 0xa1, 0x3a, 0x66, 0x0a, 0xd0, 0x9c, 0xe3, 0x49, 0x36, 0xd0, 0x19, 0x1b, 0x0d, 0xd6, 0x09, 0x5d, + 0x8d, 0x8a, 0x35, 0xdc, 0xd4, 0x89, 0xb4, 0x74, 0x72, 0xdc, 0x4d, 0xbf, 0xd7, 0xce, 0xd2, 0xe7, 0x01, 0x81, 0x57, 0x92, 0x4d, 0x4e, 0x24, 0x2f, 0x20, 0xa4, 0xfd, 0x33, 0x91, 0xef, 0xfb, 0xae, + 0x24, 0xfb, 0x44, 0x8e, 0x58, 0x22, 0x36, 0xc1, 0x18, 0x72, 0x43, 0x4b, 0x34, 0x70, 0x59, 0xce, 0x01, 0x8b, 0x04, 0x2a, 0x66, 0xbd, 0x9d, 0x2b, 0x3e, 0x6b, 0xec, 0x61, 0x9e, 0x65, 0xda, 0x91, + 0x8d, 0x43, 0x9b, 0x10, 0x1a, 0x8d, 0x78, 0x64, 0xa2, 0x97, 0x2a, 0x89, 0x38, 0xf0, 0x9c, 0x69, 0x7a, 0x89, 0xd3, 0x9b, 0x08, 0x14, 0x58, 0xa5, 0x0c, 0x3e, 0x64, 0x1b, 0xd5, 0x23, 0x61, 0x0b, + 0x5e, 0x76, 0x0c, 0xf7, 0x65, 0x56, 0x99, 0x5f, 0xa5, 0x18, 0xf4, 0xd6, 0x2d, 0x13, 0xeb, 0xae, 0x0a, 0xf7, 0x23, 0xf4, 0xf0, 0xd7, 0xcc, 0xc9, 0x77, 0xb2, 0x47, 0x04, 0xdf, 0x1b, 0xa7, 0xa0, + 0x7d, 0x87, 0x99, 0x95, 0xae, 0xe2, 0xe1, 0xb4, 0x67, 0x72, 0x72, 0x38, 0x86, 0x17, 0x86, 0x8e, 0x92, 0xfa, 0xa6, 0x8a, 0xd8, 0xf9, 0x41, 0x5a, 0xfb, 0xe3, 0xb0, 0x27, 0x08, 0x89, 0x85, 0x3a, + 0x54, 0x39, 0xcb, 0xda, 0xfd, 0x02, 0x0f, 0x27, 0x9b, 0x00, 0x30, 0x7d, 0x45, 0x2c, 0xe1, 0x95, 0xc9, 0xc3, 0x6b, 0x0d, 0x01, 0xe1, 0x25, 0x1a, 0xa7, 0x7b, 0xd1, 0x19, 0x7a, 0x19, 0xe6, 0x6b, + 0x8b, 0xed, 0x1c, 0x96, 0xc5, 0x4d, 0xf2, 0x9d, 0xaf, 0xed, 0x39, 0xb0, 0x45, 0x7c, 0xc9, 0x39, 0xf8, 0x53, 0xae, 0x7c, 0xf0, 0x92, 0xda, 0xd9, 0xc5, 0x5f, 0x77, 0xbf, 0x4c, 0x3c, 0x62, 0x09, + 0xfa, 0x52, 0xe9, 0x8c, 0x1b, 0xba, 0x27, 0x9e, 0xbc, 0xb7, 0xfa, 0x68, 0xb7, 0x22, 0x1a, 0x6e, 0x12, 0x15, 0x74, 0xc5, 0x82, 0xde, 0x8a, 0x4e, 0x90, 0x24, 0xdd, 0x0a, 0x82, 0x3c, 0x69, 0xbd, + 0x58, 0xcb, 0xd0, 0x22, 0x21, 0xac, 0x92, 0xa4, 0x08, 0x6a, 0xbf, 0x9e, 0x21, 0x1b, 0xad, 0x5c, 0x65, 0x9e, 0xba, 0x70, 0xea, 0x99, 0xba, 0x90, 0x96, 0x09, 0xd6, 0xa8, 0x62, 0x66, 0x1a, 0xc5, + 0x9c, 0x10, 0xc6, 0x94, 0x88, 0xb7, 0xae, 0x2a, 0x0a, 0xf0, 0xa6, 0xd7, 0xac, 0x34, 0x52, 0x5f, 0xc6, 0x1d, 0x87, 0xf6, 0x53, 0x17, 0xc4, 0x9f, 0xc5, 0xf2, 0xd3, 0xda, 0x7e, 0x67, 0xfd, 0x9f, + 0x0f, 0xcc, 0xba, 0x0b, 0x1c, 0x9f, 0x14, 0xc4, 0x13, 0x5f, 0xe1, 0xaf, 0xd6, 0xb3, 0xfe, 0x75, 0x6b, 0xfa, 0x75, 0xdd, 0xff, 0x29, 0xd3, 0xa1, 0x4e, 0x4b, 0xdd, 0xfb, 0xda, 0xff, 0xd4, 0xa7, + 0xf3, 0x82, 0x8d, 0x71, 0x26, 0x7a, 0x64, 0xf7, 0xf9, 0xea, 0xec, 0xb0, 0xe9, 0x60, 0x5c, 0xa0, 0xed, 0xfa, 0x40, 0x35, 0xee, 0xb8, 0xf1, 0x96, 0x70, 0xcd, 0x8c, 0x0a, 0x71, 0xc1, 0x60, 0x8e, + 0x41, 0xc0, 0xc0, 0xc4, 0x4f, 0x55, 0x03, 0x8a, 0x23, 0x06, 0xe5, 0x5a, 0x20, 0x00, 0x93, 0x6d, 0x36, 0x0a, 0x72, 0xd1, 0x56, 0x68, 0x00, 0x56, 0x19, 0x43, 0xee, 0x59, 0x48, 0x3c, 0x82, 0x6b, + 0xaa, 0xd6, 0x5b, 0x66, 0xbb, 0x64, 0x6b, 0x0d, 0x46, 0xa6, 0x44, 0xe6, 0x62, 0x3d, 0x4a, 0xd8, 0xee, 0xbf, 0x11, 0xe1, 0x71, 0xd6, 0xb7, 0xb4, 0xa7, 0x07, 0x8d, 0x82, 0x2f, 0xed, 0xb8, 0xbb, + 0x12, 0x3d, 0x42, 0x70, 0xb9, 0x3c, 0xad, 0xee, 0x1d, 0x9c, 0x33, 0x7e, 0xaa, 0xd8, 0x8b, 0x04, 0x0f, 0xe3, 0x61, 0xc5, 0x34, 0xbc, 0x4d, 0x34, 0xfb, 0x2d, 0x5c, 0xe1, 0xa3, 0x1e, 0xbc, 0x44, + 0x79, 0xdf, 0x1a, 0x5b, 0xcc, 0xa0, 0x47, 0xb5, 0xc3, 0x5d, 0xa6, 0x79, 0x2b, 0xc8, 0x73, 0x22, 0x02, 0xaa, 0x7d, 0x8f, 0xc6, 0xa7, 0xfa, 0xb0, 0x12, 0x57, 0xdb, 0x8a, 0xb7, 0x97, 0x45, 0x28, + 0x6a, 0x28, 0x0d, 0x0b, 0x31, 0x2f, 0x65, 0xd9, 0xce, 0xab, 0x4c, 0x59, 0x0d, 0x5f, 0x4f, 0x55, 0x7b, 0x14, 0x17, 0x42, 0xba, 0x0c, 0xac, 0x38, 0xfb, 0x02, 0xd5, 0xd7, 0x62, 0x90, 0x17, 0x9a, + 0x67, 0x50, 0x4f, 0x98, 0x76, 0x88, 0x41, 0x42, 0xfd, 0x71, 0x0f, 0x1d, 0xc9, 0xa4, 0x57, 0xe6, 0x21, 0xc5, 0xc7, 0x18, 0x81, 0x0d, 0x02, 0xdf, 0x1c, 0x49, 0x7a, 0x3e, 0x1b, 0xec, 0xbf, 0x19, + 0x18, 0xef, 0x87, 0xb4, 0x3f, 0xee, 0xc3, 0x2b, 0xf5, 0x19, 0xdf, 0xa9, 0x9e, 0x7b, 0x71, 0xbe, 0xee, 0xc3, 0xdd, 0xaa, 0x33, 0x86, 0x30, 0xb4, 0x44, 0xb6, 0xab, 0x70, 0x32, 0x91, 0x05, 0x67, + 0x8f, 0x91, 0xc3, 0xd9, 0x62, 0x35, 0x41, 0x85, 0x72, 0xbb, 0x9a, 0xda, 0x30, 0xb1, 0x70, 0xdd, 0x61, 0x3a, 0x53, 0xac, 0x65, 0x30, 0x4b, 0xd1, 0x0d, 0xb5, 0x93, 0x83, 0x79, 0x03, 0x17, 0x2e, + 0x9c, 0x07, 0xe4, 0x52, 0x26, 0x66, 0x09, 0x31, 0x69, 0x83, 0x58, 0x51, 0x57, 0x9e, 0xae, 0xce, 0xf1, 0x62, 0x60, 0x19, 0x4c, 0x36, 0x15, 0xfd, 0x4d, 0xc7, 0x00, 0xe1, 0xe9, 0x40, 0xfa, 0xbd, + 0x77, 0x3d, 0x26, 0x10, 0xbd, 0x97, 0x59, 0x9f, 0xeb, 0x04, 0x9d, 0xc5, 0x23, 0x76, 0xfb, 0xa3, 0xd0, 0x0b, 0xcf, 0x47, 0x53, 0xe7, 0x17, 0xc1, 0x07, 0xbd, 0x98, 0xeb, 0xdd, 0xa9, 0xde, 0xcb, + 0x11, 0x5d, 0xcf, 0xbc, 0x0c, 0xdc, 0xc7, 0xd2, 0xed, 0x95, 0xdd, 0x1e, 0x7f, 0xc8, 0x5e, 0x38, 0x78, 0x6e, 0x9c, 0x62, 0xbc, 0x1d, 0x24, 0xdc, 0x86, 0x70, 0x16, 0x61, 0x0f, 0x85, 0x18, 0x80, + 0xd8, 0x3b, 0x25, 0x8f, 0x02, 0x31, 0x44, 0x21, 0x02, 0x43, 0x0b, 0xa1, 0xab, 0x4c, 0x67, 0x68, 0x12, 0x2d, 0x9b, 0x38, 0xaa, 0x4a, 0xad, 0x87, 0x82, 0x59, 0x6a, 0x4c, 0x42, 0x09, 0xed, 0x6d, + 0x70, 0xa8, 0xd1, 0x54, 0x84, 0x44, 0x07, 0xf8, 0x41, 0xd7, 0x9d, 0x71, 0x3e, 0xb6, 0x7d, 0x71, 0xed, 0x61, 0x83, 0x12, 0xd8, 0x62, 0x15, 0x0b, 0xc9, 0xdf, 0xa6, 0xbc, 0x75, 0x89, 0x9e, 0xee, + 0xe3, 0xbe, 0xed, 0x9d, 0x82, 0xa7, 0x45, 0x19, 0x45, 0xc6, 0x3e, 0x1e, 0xc7, 0x99, 0x75, 0x2a, 0x06, 0xe4, 0xe5, 0xf9, 0xe9, 0x3c, 0xd8, 0x4e, 0x90, 0xd7, 0x5a, 0x66, 0x5a, 0xcf, 0xc2, 0x7e, + 0x2f, 0x1a, 0x08, 0x57, 0xaa, 0x67, 0xc0, 0xcf, 0xd7, 0x5d, 0x8d, 0x02, 0xbd, 0x14, 0x66, 0xa0, 0x9d, 0x90, 0x85, 0x40, 0x8b, 0xd2, 0x78, 0x35, 0x12, 0x2d, 0xcc, 0xa5, 0xe0, 0x01, 0x51, 0x4c, + 0x4a, 0x7d, 0x1a, 0x0b, 0x0b, 0x1d, 0x55, 0x97, 0x23, 0x6c, 0x79, 0xe0, 0x36, 0xf4, 0xb2, 0x86, 0x9d, 0x95, 0x51, 0xd3, 0xf1, 0xb0, 0x6e, 0x34, 0x3d, 0x68, 0xb9, 0x76, 0x35, 0x1a, 0xb4, 0xc3, + 0xc3, 0x68, 0xb8, 0x80, 0xd8, 0xa5, 0xbf, 0x07, 0x96, 0x05, 0xc6, 0x49, 0x43, 0x4d, 0x89, 0x7f, 0x54, 0x9c, 0xa8, 0x5b, 0x8d, 0x0c, 0x3b, 0x7f, 0xcb, 0x2c, 0x2d, 0x48, 0xbe, 0xda, 0xb7, 0xfe, + 0x4a, 0x0a, 0xff, 0x0d, 0xdd, 0x23, 0x7c, 0x7f, 0x5a, 0xdd, 0x92, 0xf7, 0xa7, 0xbc, 0x58, 0xcc, 0x45, 0x6e, 0xe3, 0xb3, 0xc9, 0x08, 0x06, 0xe3, 0xc8, 0x25, 0x72, 0x92, 0x17, 0x42, 0x19, 0xdb, + 0x13, 0x3f, 0x8d, 0x7f, 0xe6, 0x5f, 0x96, 0xba, 0x84, 0x5f, 0x2a, 0x75, 0x79, 0x25, 0x7a, 0xea, 0xda, 0xa5, 0xc8, 0x25, 0xdc, 0xad, 0xc8, 0xe5, 0xc1, 0x4b, 0x39, 0x5e, 0x40, 0x0f, 0x23, 0x8b, + 0x96, 0x4a, 0x72, 0x58, 0x6e, 0xc3, 0x9e, 0x3d, 0x15, 0x0c, 0x66, 0xe5, 0xb0, 0x24, 0xe7, 0xad, 0xc8, 0x75, 0xcf, 0xda, 0x79, 0x8d, 0x84, 0xfb, 0xb9, 0xb3, 0x19, 0xa7, 0x90, 0xbe, 0xdf, 0x34, + 0x4e, 0x01, 0x82, 0xf1, 0x48, 0x8c, 0x6b, 0x12, 0x9f, 0x98, 0x45, 0xb2, 0xa2, 0x35, 0x6d, 0xed, 0xb0, 0x05, 0x01, 0xc1, 0xeb, 0xa1, 0xa6, 0xf7, 0x28, 0xea, 0xdb, 0xd2, 0x06, 0xae, 0x96, 0x33, + 0x51, 0x5e, 0x68, 0x41, 0x20, 0x1a, 0x99, 0x97, 0x14, 0x1f, 0x9f, 0x3f, 0x2b, 0xe7, 0x16, 0xe7, 0x77, 0x27, 0x5e, 0xff, 0x36, 0xb5, 0xac, 0xf6, 0xa2, 0xeb, 0xb0, 0xfa, 0xef, 0xdd, 0xc6, 0xe2, + 0xdf, 0x88, 0x37, 0x08, 0x7b, 0x03, 0x7f, 0xfd, 0x8f, 0xff, 0xf1, 0xeb, 0x6f, 0xd0, 0x69, 0xb7, 0xdf, 0xf1, 0xf2, 0xbf, 0xfd, 0x2b, 0x04, 0x75, 0xf5, 0x8b, 0x7c, 0xc8, 0xc9, 0x7c, 0x62, 0xf5, + 0xbe, 0xb2, 0x2a, 0xde, 0x52, 0x3e, 0x32, 0xf3, 0xb6, 0x7d, 0x3e, 0xdc, 0xeb, 0x7b, 0x8e, 0x36, 0x4c, 0x5c, 0x8d, 0x5a, 0x6e, 0x87, 0x0e, 0xf3, 0x29, 0xa1, 0x04, 0x03, 0xc2, 0x16, 0xc7, 0xdb, + 0xf9, 0x20, 0xaf, 0xc4, 0x45, 0xa9, 0x79, 0xfa, 0xfa, 0xb0, 0xe3, 0xe7, 0xd3, 0x45, 0x48, 0xae, 0x74, 0xa9, 0x1c, 0x67, 0x20, 0x67, 0x43, 0xac, 0xb7, 0x8e, 0x93, 0x19, 0x37, 0x5c, 0x7a, 0x53, + 0xdf, 0x53, 0xc8, 0xb1, 0x6e, 0x6b, 0x1a, 0x3c, 0x75, 0x31, 0x3d, 0xb3, 0x78, 0x6c, 0xb4, 0xdc, 0x48, 0x0c, 0xf8, 0xb5, 0x0f, 0xf5, 0x63, 0x1e, 0xdb, 0x5f, 0x87, 0xc8, 0x1d, 0xe5, 0xcb, 0xb1, + 0x3a, 0xef, 0xed, 0xae, 0x88, 0xec, 0xb7, 0x6a, 0x16, 0x6d, 0x38, 0x14, 0xe6, 0xc7, 0xde, 0x64, 0x04, 0x33, 0x0e, 0xa4, 0xcf, 0x88, 0xd6, 0x8f, 0x19, 0x6e, 0xe5, 0x1c, 0xb6, 0xb5, 0x32, 0x9e, + 0x58, 0x4b, 0xb3, 0x56, 0x30, 0xa9, 0x02, 0x8c, 0x95, 0x68, 0xcd, 0x12, 0x23, 0xde, 0xa1, 0xc9, 0x8e, 0xb6, 0x59, 0xf9, 0xb0, 0x64, 0x37, 0xf1, 0x28, 0x8b, 0xb2, 0x49, 0x06, 0x5b, 0xc3, 0x3c, + 0x8b, 0x46, 0x87, 0xc3, 0x8c, 0xc9, 0x34, 0x71, 0xd8, 0xd1, 0xa7, 0xda, 0x21, 0x81, 0xf7, 0x47, 0xd9, 0xb9, 0x0f, 0xac, 0xde, 0x2e, 0xcb, 0xda, 0xdf, 0x95, 0x14, 0xf4, 0xed, 0x79, 0x49, 0xe8, + 0x4b, 0x51, 0xca, 0x67, 0xe7, 0x25, 0xa1, 0xdd, 0xa2, 0x90, 0x33, 0x4e, 0x2b, 0xd0, 0xc9, 0x7c, 0x00, 0x61, 0xd0, 0x9e, 0x69, 0x60, 0xda, 0xaa, 0x16, 0x41, 0x86, 0x06, 0xe5, 0xd2, 0x27, 0x9d, + 0x2a, 0xf4, 0x51, 0x08, 0x61, 0x35, 0x7e, 0x84, 0xfb, 0x05, 0xba, 0x21, 0x48, 0x54, 0xa0, 0x72, 0x3b, 0xa1, 0xf7, 0xf8, 0x96, 0x1f, 0xce, 0x36, 0xa9, 0xad, 0x34, 0xcd, 0x81, 0x58, 0x89, 0xc0, + 0x02, 0xc3, 0xd8, 0xf8, 0xd0, 0xcb, 0xe6, 0xc2, 0x72, 0x1f, 0x2c, 0x58, 0xfc, 0x75, 0x0b, 0xe1, 0xef, 0x3c, 0x2f, 0xa9, 0xcb, 0xe2, 0x78, 0x39, 0xd0, 0xe0, 0xb1, 0x9f, 0x08, 0xba, 0x71, 0x27, + 0x77, 0xe6, 0x40, 0x10, 0xeb, 0x47, 0xec, 0x83, 0x58, 0xef, 0x9f, 0x28, 0x7c, 0x8f, 0xfa, 0xaa, 0xa2, 0x86, 0x93, 0x65, 0xbb, 0x5e, 0xe8, 0x96, 0x33, 0x59, 0x46, 0xca, 0x7a, 0x20, 0xcb, 0xf6, + 0x9c, 0xf1, 0x32, 0xc9, 0x41, 0x7b, 0xbb, 0x9a, 0xdb, 0xce, 0x34, 0xde, 0xe6, 0x25, 0x05, 0x9c, 0x5b, 0xd1, 0x61, 0x59, 0x55, 0x0c, 0xbb, 0x46, 0x64, 0x04, 0x28, 0x46, 0xbc, 0xb8, 0x66, 0x4a, + 0x20, 0xa0, 0x0f, 0x3b, 0x45, 0x54, 0xc3, 0x64, 0x17, 0xc8, 0xb4, 0x95, 0x8e, 0x18, 0x93, 0x6d, 0xc9, 0xc5, 0x77, 0x8a, 0xdb, 0x17, 0xd3, 0xeb, 0x4e, 0x5f, 0x78, 0x10, 0xa8, 0xf0, 0x22, 0xfb, + 0xe4, 0xba, 0xff, 0xfd, 0x2f, 0x8f, 0x92, 0xb2, 0xbd, 0xc8, 0xb5, 0x32, 0xef, 0x9c, 0x4e, 0x73, 0x5f, 0xaf, 0xed, 0xc1, 0xd6, 0xa4, 0x9b, 0xc7, 0x37, 0x5b, 0x24, 0x3e, 0xba, 0xf9, 0x8f, 0x3a, + 0x85, 0x77, 0xda, 0xa9, 0x10, 0x07, 0x65, 0xf1, 0x7a, 0x9e, 0xf7, 0xff, 0xf1, 0xd7, 0x4d, 0x74, 0x2f, 0xd7, 0x34, 0xa3, 0x8b, 0xe2, 0x7a, 0x7f, 0xf2, 0xc6, 0xa3, 0x71, 0x36, 0x78, 0x29, 0xbd, + 0xfb, 0x86, 0xee, 0x75, 0xb8, 0x9d, 0x5b, 0xfd, 0x41, 0xb7, 0xb4, 0xee, 0xd1, 0x8a, 0x71, 0x44, 0x7e, 0x6c, 0x25, 0xde, 0x5c, 0xa9, 0xd7, 0xc8, 0x48, 0x88, 0x66, 0x87, 0xde, 0x60, 0x13, 0x49, + 0x25, 0x4c, 0x93, 0x8a, 0xd9, 0xea, 0xb3, 0x35, 0x3a, 0xb0, 0x16, 0x35, 0x54, 0x65, 0x48, 0x4b, 0x22, 0x95, 0xba, 0xb0, 0x1a, 0xcb, 0x84, 0xf2, 0xf1, 0xd0, 0x8d, 0x74, 0x63, 0x65, 0x0c, 0x01, + 0x31, 0xe3, 0x1a, 0x6e, 0x20, 0xac, 0xf9, 0x6c, 0x3f, 0x6b, 0x51, 0x4d, 0x1c, 0xaa, 0x1f, 0x9d, 0x5f, 0x3f, 0x18, 0x75, 0x37, 0x87, 0x8b, 0xbc, 0x1a, 0x01, 0xef, 0x3a, 0xdf, 0xb5, 0xa0, 0x6f, + 0x7a, 0x4f, 0xcb, 0xf8, 0xbe, 0x96, 0x1e, 0x72, 0x43, 0xf7, 0xc2, 0x8e, 0x4b, 0xab, 0x6b, 0x02, 0x08, 0x37, 0xc3, 0xf6, 0xe6, 0x4a, 0x76, 0x81, 0x03, 0x19, 0x35, 0xf1, 0xd0, 0x98, 0x4f, 0x2d, + 0x86, 0xdd, 0x2f, 0x26, 0x06, 0x34, 0x6a, 0xa6, 0x29, 0x0a, 0xf3, 0x92, 0x8c, 0xee, 0xbc, 0xdd, 0x00, 0xf2, 0xe0, 0xe5, 0xc4, 0x3c, 0x2c, 0x0e, 0x8b, 0xed, 0x8e, 0xf1, 0x27, 0x7e, 0x98, 0xb2, + 0x96, 0x58, 0xb2, 0x02, 0x9e, 0x8c, 0x54, 0x5f, 0x4a, 0xe5, 0x4d, 0x2c, 0xc1, 0x3a, 0xec, 0x96, 0x87, 0xcd, 0xc2, 0x51, 0x5e, 0x17, 0x02, 0x5e, 0xe4, 0xfd, 0xbe, 0x54, 0x2c, 0xc5, 0x7f, 0xcc, + 0x89, 0x7f, 0xdc, 0x41, 0x75, 0x4e, 0xfc, 0x6c, 0x96, 0x0d, 0x5f, 0xaa, 0x69, 0xe1, 0xc4, 0xa7, 0xd9, 0x15, 0x17, 0xfd, 0x61, 0xb7, 0x1a, 0x16, 0x02, 0x6e, 0x6d, 0x93, 0x62, 0x57, 0xce, 0x94, + 0x43, 0xed, 0xf9, 0x39, 0x68, 0x6d, 0x7a, 0x15, 0x12, 0x63, 0xbd, 0x1d, 0x0d, 0x31, 0xe9, 0x86, 0x25, 0xcc, 0xf9, 0x6a, 0x62, 0x19, 0xbc, 0x2d, 0x85, 0xfb, 0xc8, 0xa8, 0x87, 0xa3, 0x0d, 0x6a, + 0x1a, 0x35, 0x40, 0xb9, 0x07, 0x8f, 0xe0, 0xcc, 0x20, 0x5d, 0x17, 0xee, 0xe1, 0x90, 0xa8, 0x8d, 0xd7, 0x72, 0x6d, 0xe3, 0x10, 0x82, 0x14, 0x4e, 0xf2, 0x59, 0xef, 0x75, 0x36, 0xfe, 0xdb, 0x2d, + 0x7e, 0xc0, 0xa5, 0x5a, 0x0d, 0xf8, 0x06, 0x7d, 0xf0, 0xb1, 0xfc, 0x5b, 0xde, 0x86, 0x5a, 0x66, 0xb4, 0xda, 0x1e, 0x38, 0x82, 0xd1, 0x2f, 0xbc, 0xd0, 0xfa, 0x53, 0x9c, 0xe7, 0x3e, 0x61, 0xf2, + 0xc1, 0xd9, 0xa3, 0xd7, 0xe3, 0x99, 0x6f, 0x7e, 0xf6, 0xb8, 0x36, 0xd5, 0x51, 0xec, 0x7f, 0x10, 0xee, 0xb7, 0x3b, 0x48, 0x4f, 0x9f, 0x76, 0xbf, 0x2a, 0x7c, 0x38, 0x8c, 0xf3, 0x53, 0x84, 0xf9, + 0xc1, 0x41, 0x9a, 0x9f, 0x7c, 0xe7, 0x4f, 0xaa, 0x44, 0xdd, 0xfd, 0x26, 0xe9, 0x1b, 0x5a, 0x64, 0x58, 0xb7, 0xde, 0xc8, 0x0f, 0x3d, 0x3a, 0x85, 0x4c, 0x34, 0xf3, 0x9a, 0xde, 0x75, 0xeb, 0x8a, + 0xba, 0xfb, 0x5d, 0x99, 0x05, 0xe7, 0x90, 0x72, 0x3f, 0xd0, 0x0e, 0xbf, 0x5f, 0xd7, 0x5e, 0x88, 0x4e, 0xc6, 0xfd, 0x7d, 0x95, 0xd4, 0xc7, 0x8a, 0x24, 0x7c, 0xe3, 0x2b, 0xeb, 0x3c, 0xf0, 0xff, + 0xd0, 0x3d, 0x4e, 0x80, 0x3f, 0xad, 0x53, 0xf5, 0x11, 0xec, 0xfb, 0x89, 0x10, 0x49, 0xd1, 0x7c, 0x00, 0x13, 0x89, 0x9e, 0x1e, 0x14, 0x2d, 0x72, 0x13, 0x4a, 0xc9, 0x3d, 0x54, 0x30, 0x09, 0x6e, + 0x64, 0x69, 0xe4, 0x08, 0xc3, 0x7b, 0x82, 0x0a, 0x81, 0x63, 0x0e, 0x0a, 0x11, 0x5d, 0x1a, 0x6d, 0xa6, 0x13, 0xca, 0x30, 0x07, 0xa3, 0x72, 0x84, 0x6a, 0xd8, 0x76, 0xa0, 0xec, 0x67, 0x2a, 0xe4, + 0x2d, 0x77, 0x74, 0xab, 0xb6, 0x84, 0x84, 0x49, 0x24, 0xbb, 0xb0, 0xc8, 0x72, 0x99, 0x79, 0x3f, 0xae, 0x95, 0x71, 0xb6, 0x03, 0x9e, 0xf9, 0x3c, 0x7e, 0xee, 0x7d, 0x77, 0xb5, 0x23, 0x1c, 0x47, + 0x23, 0x02, 0xea, 0xb6, 0x59, 0xd7, 0x86, 0xcd, 0x6a, 0x05, 0x6e, 0x64, 0x6c, 0x65, 0xf9, 0xb8, 0xb0, 0xdf, 0xce, 0x67, 0x99, 0xe5, 0xfa, 0x7a, 0xcb, 0x8d, 0xfc, 0x69, 0x32, 0x00, 0x36, 0xec, + 0x3a, 0x19, 0x14, 0x52, 0xb2, 0x65, 0x36, 0xe8, 0x9c, 0xa6, 0x55, 0x16, 0x02, 0xc8, 0x83, 0x3e, 0x15, 0x0a, 0x1b, 0xc8, 0xbd, 0x11, 0x2c, 0x6e, 0x25, 0x0b, 0x1c, 0x1a, 0x1a, 0x15, 0x6e, 0x0a, + 0x45, 0x69, 0xb7, 0x13, 0x46, 0x27, 0x45, 0xb4, 0xed, 0x1a, 0x62, 0x7a, 0x62, 0x27, 0xfd, 0x74, 0x24, 0xfe, 0xea, 0x5a, 0x22, 0xe1, 0x88, 0xcb, 0xc9, 0x99, 0xdb, 0x77, 0xe3, 0x78, 0xff, 0x15, + 0xf2, 0x3f, 0x97, 0xc4, 0x1f, 0x68, 0x5f, 0xb8, 0x70, 0x73, 0xa7, 0x8b, 0xd7, 0xe9, 0x14, 0xcf, 0x9e, 0x82, 0x9b, 0xf5, 0xcc, 0xdf, 0x1f, 0x32, 0x7c, 0xd4, 0x34, 0x3c, 0xbf, 0x6c, 0xf6, 0x3b, + 0xa2, 0x65, 0xd1, 0x75, 0x55, 0x4c, 0xa8, 0x5c, 0x9e, 0x8f, 0xd6, 0x69, 0x5d, 0x82, 0x98, 0x3c, 0x6d, 0xa1, 0x40, 0xc7, 0x26, 0x15, 0x33, 0x40, 0xf2, 0xb5, 0x3b, 0xa0, 0xa1, 0xfd, 0xf6, 0xe0, + 0x10, 0xcb, 0x1d, 0x33, 0x58, 0xe4, 0xb6, 0x30, 0x56, 0x89, 0x72, 0x37, 0x5c, 0xee, 0x15, 0x4a, 0x25, 0x75, 0x20, 0xfc, 0x3a, 0x10, 0x74, 0xfc, 0x52, 0xdd, 0x73, 0xbc, 0xe7, 0x3e, 0xaa, 0xd7, + 0x52, 0x9c, 0x6f, 0xe8, 0x5e, 0xf0, 0xb8, 0xb4, 0xba, 0xa6, 0x31, 0x2f, 0x44, 0x52, 0x84, 0x17, 0xbe, 0xbe, 0x24, 0x25, 0x1b, 0x83, 0x09, 0x7c, 0x3e, 0xd1, 0x27, 0x6d, 0x35, 0x77, 0xec, 0x62, + 0x3f, 0x1d, 0xa4, 0xd3, 0x7d, 0x38, 0x8e, 0x87, 0x2e, 0x25, 0x24, 0xa3, 0x96, 0x75, 0xe5, 0x55, 0x30, 0xef, 0xb9, 0x07, 0xc2, 0x34, 0x51, 0x59, 0xcc, 0x41, 0x50, 0x74, 0x72, 0x79, 0x59, 0x1b, + 0x28, 0x06, 0xe1, 0xf3, 0xe1, 0xde, 0x1b, 0x28, 0xc5, 0x64, 0x1c, 0x70, 0xb0, 0x6d, 0xdf, 0x79, 0xaa, 0x5e, 0x5d, 0xf7, 0x3b, 0x1b, 0xd2, 0xc7, 0x5e, 0xdb, 0x81, 0xf6, 0xbc, 0xac, 0xe5, 0xab, + 0x83, 0xed, 0x48, 0xf4, 0x82, 0xea, 0xf1, 0xb2, 0x8f, 0x76, 0x1b, 0x5e, 0x93, 0x66, 0x3f, 0x97, 0x00, 0x1e, 0x62, 0x7d, 0x69, 0x6b, 0x14, 0x49, 0xe2, 0x30, 0x23, 0xc7, 0x16, 0x57, 0x60, 0xc1, + 0x6e, 0x4a, 0x55, 0xf6, 0x5d, 0x87, 0xcb, 0x20, 0x7c, 0x9f, 0x4a, 0x65, 0xc8, 0x05, 0xd8, 0xc8, 0xae, 0x90, 0x09, 0x23, 0x06, 0x96, 0x8c, 0xa7, 0xaa, 0xdc, 0xc6, 0x3b, 0x6a, 0x2a, 0x8d, 0x68, + 0x89, 0x1a, 0xa3, 0xcb, 0x55, 0x3c, 0x03, 0xd4, 0x83, 0x8c, 0x4c, 0xaa, 0x80, 0x5b, 0xf3, 0x3f, 0xf0, 0x0a, 0x77, 0x89, 0xc8, 0xdf, 0x7b, 0x41, 0x9e, 0x0d, 0xc8, 0x9f, 0x1b, 0x25, 0x37, 0x74, + 0x2f, 0xd0, 0x5d, 0x5a, 0x5d, 0x4a, 0x03, 0x1f, 0xd1, 0x33, 0xdc, 0x9d, 0x86, 0x0f, 0xb3, 0x05, 0x20, 0x8f, 0x61, 0x36, 0xd8, 0x41, 0xb8, 0x1f, 0x23, 0x95, 0x30, 0x6b, 0x41, 0xad, 0xd5, 0xb6, + 0x93, 0xc3, 0xa0, 0x98, 0xa5, 0xaa, 0x33, 0x48, 0x56, 0xc8, 0x52, 0x6e, 0x26, 0xf3, 0x0d, 0x09, 0xe1, 0x26, 0x97, 0x95, 0x7c, 0xd0, 0x8e, 0xc7, 0x2b, 0x5b, 0xae, 0x26, 0x81, 0xe3, 0xb2, 0x46, + 0x38, 0x80, 0x86, 0x68, 0x8f, 0x1c, 0x0b, 0x95, 0x07, 0x0b, 0x15, 0x30, 0xfb, 0xa1, 0x4f, 0xfd, 0x1f, 0xb1, 0x47, 0xec, 0x08, 0x55, 0x11, 0x9f, 0xd3, 0xf6, 0x8a, 0xa7, 0x83, 0xf9, 0x75, 0xc9, + 0x79, 0x43, 0xfb, 0xc2, 0x98, 0x9b, 0x3b, 0x5d, 0x25, 0xe7, 0x7e, 0xea, 0x1b, 0xe2, 0xd2, 0x8d, 0x82, 0xd9, 0x06, 0xda, 0x37, 0xf1, 0x6c, 0x8f, 0xaf, 0x76, 0xac, 0xa8, 0xd5, 0xf4, 0x60, 0xbe, + 0xd2, 0x81, 0x45, 0x2b, 0x1b, 0x83, 0x7a, 0x48, 0x82, 0xb0, 0xbb, 0x92, 0x56, 0xa0, 0x69, 0x4f, 0x05, 0x5f, 0xa7, 0x79, 0xb6, 0x72, 0x20, 0x13, 0x33, 0x6c, 0x84, 0xd6, 0x2d, 0x39, 0x2c, 0xe4, + 0xe1, 0x46, 0xd7, 0x37, 0x48, 0xda, 0xaa, 0xb0, 0x64, 0xb9, 0x43, 0x7c, 0xdb, 0xd1, 0xe7, 0xf7, 0x78, 0x57, 0xfd, 0x27, 0x46, 0xfd, 0xaf, 0xcb, 0xdd, 0x46, 0xcb, 0xa2, 0xbf, 0xd4, 0xe2, 0xbc, + 0x12, 0xbd, 0xf0, 0xf3, 0x78, 0xd9, 0xd5, 0xd6, 0x94, 0x53, 0x52, 0x48, 0x3d, 0xd4, 0x2f, 0x71, 0xa9, 0x27, 0xa5, 0xb3, 0xa5, 0x99, 0x8e, 0x56, 0xe0, 0x5a, 0x13, 0x37, 0xb3, 0x9c, 0x9a, 0xcd, + 0x65, 0x92, 0xaf, 0xf6, 0x43, 0x4b, 0xde, 0x2e, 0x67, 0x82, 0x02, 0x8d, 0xa7, 0x33, 0xaa, 0x55, 0xdc, 0xc5, 0x36, 0xe6, 0xf0, 0x39, 0x3f, 0xb1, 0xc2, 0x28, 0xa8, 0x36, 0x46, 0x05, 0x28, 0x93, + 0xd0, 0x80, 0xeb, 0xe5, 0x96, 0x20, 0xc7, 0x30, 0x3a, 0x89, 0xe4, 0xfc, 0x3b, 0xd3, 0xff, 0xaf, 0x10, 0x5b, 0x66, 0xd6, 0x77, 0xbd, 0xbc, 0x88, 0x9d, 0x4c, 0x0b, 0xfb, 0xfe, 0x73, 0xd9, 0xf5, + 0x4a, 0x2c, 0xf0, 0x23, 0xf1, 0x23, 0xae, 0x1f, 0x6e, 0x9d, 0x22, 0xb1, 0x1d, 0xf0, 0x75, 0x41, 0x45, 0x8a, 0xe7, 0x88, 0x55, 0xa7, 0xb9, 0xa6, 0x22, 0xd1, 0x54, 0x92, 0x34, 0xcc, 0x5c, 0xac, + 0x28, 0x3c, 0x4f, 0x0f, 0xbd, 0x89, 0x63, 0x8e, 0xd1, 0xde, 0xca, 0x98, 0x0f, 0x57, 0x25, 0xde, 0xaa, 0x54, 0x20, 0x81, 0xf9, 0x4e, 0x5c, 0xd3, 0x74, 0x86, 0x18, 0x8d, 0x15, 0xf1, 0xf9, 0x3a, + 0x4d, 0xf5, 0x0d, 0x3d, 0x8b, 0x80, 0x78, 0xaa, 0x60, 0xad, 0x6f, 0x4f, 0xd8, 0xdd, 0xac, 0x6a, 0xc3, 0x8e, 0x13, 0x45, 0xd7, 0x72, 0x0b, 0x43, 0xcf, 0xe0, 0x3c, 0xda, 0x0d, 0xa6, 0xed, 0xe3, + 0xdf, 0x7f, 0x3c, 0xe3, 0x3f, 0xc5, 0x3c, 0xb1, 0x32, 0xc3, 0x8a, 0x0a, 0x2f, 0xb0, 0xae, 0xe5, 0x9e, 0x1e, 0x0f, 0xe8, 0x97, 0xb4, 0x99, 0xaf, 0xde, 0xf4, 0x89, 0x1b, 0x1f, 0x9e, 0x77, 0x3d, + 0xff, 0x8c, 0x27, 0x2b, 0x5d, 0x3a, 0xac, 0x83, 0x59, 0x4d, 0xfb, 0x08, 0xc6, 0x08, 0x53, 0x08, 0xdb, 0x2d, 0x62, 0x65, 0xa2, 0xcb, 0xd5, 0x40, 0x99, 0x34, 0x2b, 0x84, 0x18, 0xec, 0x3d, 0x11, + 0x64, 0x44, 0x84, 0x40, 0x20, 0xdb, 0x10, 0xa5, 0xe5, 0x4e, 0x12, 0x70, 0x62, 0xb0, 0x29, 0xa6, 0x53, 0x15, 0xd6, 0x5c, 0x05, 0x47, 0x90, 0x16, 0xdc, 0x37, 0xc4, 0xbc, 0x42, 0x4d, 0x8c, 0x89, + 0x7a, 0x62, 0xde, 0xab, 0x3b, 0xb2, 0xe6, 0xc1, 0xf0, 0xfd, 0xe8, 0xc7, 0xfc, 0x82, 0x0f, 0x47, 0xbb, 0xfc, 0x64, 0x7c, 0xf7, 0x73, 0x2b, 0xd4, 0xa2, 0xc2, 0x33, 0x9e, 0x5b, 0x7c, 0x2f, 0xc9, + 0x93, 0x07, 0x2f, 0x38, 0xa2, 0xfe, 0xe0, 0x76, 0xd7, 0x70, 0x82, 0xa1, 0x65, 0xeb, 0x7d, 0x60, 0xc8, 0x2e, 0x2e, 0xac, 0xb6, 0x02, 0x8b, 0x8f, 0x2b, 0x18, 0x17, 0xd6, 0x85, 0xe9, 0x2a, 0xae, + 0x9c, 0x5b, 0x81, 0x06, 0x94, 0xd6, 0x00, 0xf0, 0xd9, 0xd6, 0xb7, 0x9c, 0x4d, 0xb5, 0xa3, 0x52, 0x0e, 0x66, 0x16, 0x93, 0x21, 0x0f, 0x93, 0xb3, 0x68, 0x38, 0x57, 0xe7, 0x2e, 0xe4, 0x10, 0xb8, + 0x91, 0x0c, 0xb0, 0xbc, 0x04, 0xa6, 0x0e, 0x2f, 0xb6, 0xc6, 0x56, 0x24, 0x8c, 0x9f, 0xdb, 0x80, 0xc7, 0x1e, 0x9c, 0x2c, 0xf2, 0xec, 0xb9, 0xcc, 0x00, 0xdf, 0x06, 0xaf, 0x98, 0x83, 0x77, 0xa4, + 0xaf, 0x68, 0xbd, 0xdf, 0x38, 0x1d, 0x8d, 0xda, 0xc1, 0x48, 0x2c, 0x70, 0xd7, 0xaf, 0x2c, 0x1b, 0x18, 0xd0, 0x13, 0x16, 0x17, 0xb6, 0x92, 0x29, 0xb7, 0x1b, 0xd9, 0x0d, 0x88, 0x76, 0x3f, 0x29, + 0x7b, 0x8b, 0x40, 0x9b, 0x80, 0x8c, 0xd2, 0x9a, 0x5c, 0x59, 0xe9, 0x22, 0xe5, 0x25, 0x07, 0x52, 0x48, 0x56, 0x11, 0x2a, 0xbb, 0x35, 0xa1, 0x36, 0x93, 0xf1, 0x44, 0x23, 0x40, 0xc2, 0xdb, 0x48, + 0xc4, 0x6e, 0xec, 0xb7, 0x31, 0x76, 0x08, 0x95, 0x02, 0x1d, 0x7b, 0x0b, 0xf5, 0xeb, 0xdd, 0x84, 0x6e, 0x93, 0x58, 0x99, 0xf7, 0x2c, 0xd4, 0xfa, 0xe2, 0x8a, 0x74, 0xa6, 0x79, 0x84, 0xe1, 0x7c, + 0xd5, 0x75, 0x3d, 0x32, 0x44, 0x6d, 0xef, 0x1e, 0x74, 0x39, 0xd7, 0x98, 0x32, 0xf5, 0xed, 0xaa, 0x32, 0xe4, 0xb2, 0x0a, 0x80, 0x69, 0x80, 0xa0, 0xf0, 0x1c, 0x1b, 0x1c, 0x9c, 0xc5, 0x42, 0xc9, + 0x94, 0x83, 0x28, 0x66, 0xc3, 0x34, 0x9c, 0x03, 0x93, 0x39, 0xdb, 0x13, 0x09, 0x23, 0x13, 0xb1, 0x90, 0x09, 0x78, 0x13, 0xd0, 0x70, 0xaf, 0xb7, 0xb6, 0x50, 0x0a, 0xe4, 0x1c, 0x31, 0x2b, 0xd4, + 0xf5, 0xa2, 0xb5, 0x7a, 0xda, 0xb8, 0xa3, 0x91, 0x7c, 0x3d, 0xe0, 0xf1, 0x6f, 0xc8, 0xc7, 0xc4, 0xa3, 0xe3, 0x93, 0x9b, 0xcd, 0x01, 0xd0, 0xdd, 0x61, 0xea, 0xdf, 0x22, 0x7b, 0x5f, 0x37, 0xe3, + 0xf2, 0x96, 0x47, 0x58, 0x23, 0x2f, 0xe5, 0xbe, 0x1e, 0x09, 0x02, 0xfd, 0xd3, 0x7f, 0x7d, 0xa4, 0x5b, 0xb6, 0x2b, 0xed, 0x8b, 0x94, 0x50, 0x63, 0x8e, 0x3a, 0x19, 0xcc, 0x39, 0xc7, 0x31, 0x0a, + 0x9a, 0x34, 0xfc, 0x8d, 0xb6, 0x07, 0x89, 0x1e, 0x3b, 0xd9, 0xb8, 0x22, 0xe3, 0x51, 0xed, 0x34, 0x92, 0x86, 0xe2, 0x50, 0xb3, 0x9c, 0x30, 0x21, 0x06, 0x22, 0xa0, 0x0b, 0x16, 0xb9, 0x91, 0x74, + 0x94, 0x97, 0xa6, 0x9a, 0xb0, 0x4c, 0x8a, 0xf9, 0x70, 0x5f, 0x2a, 0xda, 0xd2, 0x8d, 0xf4, 0xe5, 0x64, 0xb5, 0xd7, 0x59, 0x1d, 0xf8, 0x98, 0xe2, 0x95, 0x59, 0x86, 0x56, 0x9c, 0xbf, 0x7e, 0x1d, + 0x58, 0x5a, 0x6e, 0xfd, 0x2a, 0x13, 0x27, 0xd3, 0x4c, 0xeb, 0xd7, 0xaf, 0x22, 0xfe, 0x75, 0xe9, 0xf6, 0x2f, 0xfc, 0x57, 0x9c, 0xfd, 0x72, 0x3d, 0xc7, 0xb5, 0xb2, 0xb7, 0x5f, 0xbf, 0x56, 0x81, + 0x69, 0x65, 0xd7, 0x67, 0xf9, 0xaf, 0x50, 0x6b, 0x7e, 0x95, 0xb9, 0xf5, 0x8b, 0xd3, 0x0a, 0xf7, 0xed, 0x7c, 0xb6, 0xc4, 0xff, 0xf6, 0xbf, 0xff, 0xf2, 0xa2, 0x5f, 0x86, 0x95, 0x15, 0xda, 0xf1, + 0x7f, 0x2f, 0x33, 0xca, 0x30, 0x2f, 0xb4, 0xc8, 0xb0, 0xf2, 0xff, 0xfa, 0xeb, 0x54, 0x88, 0xfa, 0x97, 0x97, 0xff, 0xda, 0x47, 0x71, 0x1d, 0x1d, 0x5f, 0xa3, 0x5b, 0xbf, 0x92, 0x2c, 0xd6, 0x03, + 0x2b, 0xd4, 0x0a, 0xcf, 0x78, 0xfb, 0xf5, 0x4b, 0xb4, 0xac, 0x5f, 0x57, 0x30, 0x2b, 0xe2, 0xcd, 0xb4, 0x2a, 0x40, 0x0f, 0x62, 0x07, 0x08, 0xb5, 0xc2, 0xbd, 0x1c, 0x5f, 0xf1, 0xcb, 0x8e, 0xb3, + 0x5f, 0xa6, 0x55, 0x68, 0x5e, 0x90, 0xbf, 0xfd, 0xe9, 0xd2, 0xa7, 0xcd, 0xcf, 0xd7, 0xf1, 0xa2, 0x7b, 0xd1, 0x99, 0xab, 0xdf, 0x8f, 0x88, 0x4b, 0x41, 0x41, 0xbd, 0xe9, 0x9b, 0x96, 0xad, 0x95, + 0xc1, 0x5f, 0xbb, 0xcf, 0xf9, 0x13, 0x75, 0xa0, 0xff, 0xf9, 0x5e, 0x17, 0x87, 0x00, 0xd4, 0x17, 0xb9, 0xa4, 0x30, 0x2a, 0x7d, 0x16, 0x63, 0xc4, 0x28, 0xd5, 0x20, 0x76, 0x10, 0x9b, 0x19, 0x8a, + 0x7a, 0x16, 0x5b, 0xef, 0x7f, 0x28, 0x73, 0xbd, 0xf0, 0x74, 0x06, 0x64, 0xa0, 0xb5, 0xcf, 0x52, 0xbe, 0x5f, 0x13, 0x31, 0x37, 0x74, 0x8f, 0xdd, 0xfc, 0xd3, 0xea, 0x22, 0x6a, 0xa0, 0x3e, 0xb9, + 0x0d, 0x57, 0x6b, 0x79, 0xc7, 0xf8, 0x31, 0xd4, 0x8b, 0xd4, 0xc5, 0x82, 0x54, 0xa4, 0xc8, 0xae, 0x83, 0x6a, 0xbd, 0xff, 0xe6, 0x08, 0x82, 0xef, 0xaa, 0x44, 0x77, 0x19, 0x05, 0x61, 0x99, 0x85, + 0x65, 0xe6, 0x6a, 0xf9, 0xf3, 0x84, 0xe0, 0x57, 0x8a, 0x25, 0xde, 0xd0, 0x3d, 0x41, 0xf2, 0xde, 0xea, 0x56, 0x30, 0x71, 0xef, 0x7a, 0x83, 0x3c, 0xdb, 0xc7, 0xb1, 0xef, 0x1d, 0xd6, 0x86, 0x84, + 0x6b, 0x30, 0xb4, 0xd3, 0x1b, 0x4e, 0x96, 0x7b, 0xf1, 0xdf, 0x05, 0x09, 0xf8, 0x46, 0xbc, 0x41, 0xc3, 0x2e, 0xb8, 0xfc, 0x89, 0x26, 0x3f, 0x9b, 0x14, 0x3f, 0x77, 0x5f, 0x5f, 0x89, 0x1e, 0x11, + 0xb9, 0x5c, 0x9e, 0xa6, 0xc0, 0x37, 0x8e, 0x6b, 0xa8, 0x2f, 0xea, 0x90, 0xcf, 0x99, 0x36, 0xbf, 0xe0, 0xeb, 0x79, 0x35, 0x9f, 0xb0, 0x13, 0x7a, 0x8b, 0x39, 0xdb, 0x2d, 0xa4, 0xdb, 0x8f, 0xa7, + 0x40, 0x87, 0x15, 0xe6, 0x79, 0x60, 0xbb, 0xce, 0xb4, 0x24, 0x39, 0xbd, 0x1b, 0xea, 0x04, 0xd4, 0x7b, 0x60, 0xfd, 0x99, 0xd2, 0xfd, 0xc2, 0xe8, 0xb9, 0x10, 0x3d, 0x01, 0x75, 0xbe, 0x3c, 0xa9, + 0xd2, 0x1d, 0x4a, 0x2c, 0xee, 0x81, 0x6a, 0xa6, 0xed, 0x50, 0x40, 0x09, 0x34, 0x64, 0xdb, 0x36, 0xdc, 0xb8, 0x92, 0xf8, 0xd5, 0x4e, 0xb1, 0x18, 0xba, 0x4a, 0x57, 0x6c, 0x11, 0xa5, 0xa4, 0x59, + 0xb6, 0x12, 0x9d, 0xb4, 0x09, 0xaf, 0xb6, 0xa3, 0x7c, 0xcf, 0x72, 0xae, 0x0a, 0xb3, 0xbd, 0x49, 0x44, 0x7a, 0x22, 0x37, 0x6c, 0x67, 0x62, 0xcc, 0x4c, 0x2d, 0x2e, 0xd9, 0xb1, 0x07, 0x0d, 0x35, + 0x15, 0x4b, 0x65, 0xf8, 0xd4, 0xaa, 0xbf, 0xde, 0x2c, 0x76, 0x8e, 0x4a, 0x3e, 0x1e, 0x26, 0xc8, 0x0b, 0xc9, 0x1a, 0x5e, 0xe4, 0x9d, 0x3a, 0xee, 0x9d, 0x8e, 0x4f, 0xec, 0x90, 0xaa, 0xe1, 0xb1, + 0x89, 0x90, 0xec, 0xd6, 0xbd, 0x71, 0xb6, 0x86, 0xfd, 0x26, 0x3b, 0x54, 0x0e, 0xb4, 0xe7, 0xe4, 0x64, 0x47, 0x35, 0x82, 0x3c, 0xa5, 0xb6, 0x65, 0x76, 0xd0, 0xa3, 0x8d, 0x04, 0x55, 0xfc, 0xfa, + 0xd0, 0xdb, 0xb6, 0xc3, 0x72, 0xac, 0xe4, 0x1c, 0x93, 0x2a, 0xa5, 0x48, 0x2e, 0x36, 0xbd, 0xf5, 0x48, 0x53, 0x67, 0x80, 0x89, 0xef, 0x85, 0x05, 0x2b, 0x4c, 0x8d, 0x61, 0x4c, 0x71, 0x39, 0xdd, + 0x0b, 0xa7, 0x3f, 0xd6, 0x68, 0xbd, 0x44, 0x33, 0xcd, 0xec, 0xed, 0x0b, 0x03, 0x78, 0xf8, 0xca, 0x42, 0x72, 0xa5, 0x7a, 0x84, 0xe4, 0x7a, 0xdd, 0x3f, 0xd1, 0xfa, 0x1e, 0x18, 0x90, 0x65, 0x00, + 0x0c, 0xc4, 0x0f, 0xf1, 0x41, 0x94, 0x62, 0x1a, 0x9f, 0xf9, 0x4b, 0x68, 0x6a, 0x8b, 0xfa, 0x22, 0x96, 0xc1, 0x9e, 0x5e, 0x48, 0x9e, 0xe1, 0xe7, 0xbc, 0xb8, 0xe5, 0x03, 0x17, 0x70, 0xd5, 0x66, + 0xbf, 0x24, 0xd8, 0x24, 0xe4, 0x6c, 0xbc, 0x54, 0xea, 0xf5, 0x16, 0x11, 0x7a, 0xda, 0x5e, 0xc5, 0x04, 0xa0, 0x86, 0x08, 0x35, 0xd8, 0x89, 0x34, 0xa9, 0xec, 0x3c, 0x45, 0x5e, 0xaf, 0x90, 0x9f, + 0xec, 0xdd, 0xfe, 0x05, 0xbe, 0x75, 0xda, 0x96, 0xf2, 0xa1, 0xb6, 0xdb, 0x63, 0xf8, 0x5e, 0x5a, 0x9a, 0x6e, 0x08, 0x9f, 0x6a, 0x99, 0xfd, 0x69, 0x76, 0x39, 0xd4, 0xe9, 0x08, 0x22, 0xc4, 0xf8, + 0x68, 0xb0, 0xe2, 0xd6, 0x01, 0x70, 0x20, 0x07, 0x7b, 0x92, 0x8a, 0x70, 0xa6, 0xa7, 0xc3, 0x45, 0xb1, 0xe6, 0x58, 0x8d, 0xc8, 0x5b, 0x77, 0xc2, 0x64, 0x3b, 0xaa, 0xdc, 0xf1, 0x14, 0x10, 0x5b, + 0x08, 0x3d, 0x5f, 0x48, 0x0b, 0x37, 0x75, 0x9d, 0x59, 0x9e, 0xd4, 0x4e, 0x33, 0x33, 0x31, 0x6e, 0xd5, 0xd4, 0xa4, 0x9c, 0x6e, 0x2a, 0xc5, 0x33, 0xa6, 0x38, 0x1c, 0xec, 0x1d, 0x2a, 0x62, 0xe8, + 0x8e, 0xa7, 0xcd, 0x3e, 0x3a, 0xb8, 0xe5, 0x8a, 0xe6, 0x0f, 0x78, 0xf0, 0x8f, 0x70, 0xaf, 0x79, 0xd7, 0xb8, 0xc7, 0x17, 0x4b, 0xc8, 0xcf, 0x7d, 0xd9, 0xef, 0x54, 0xcf, 0xcc, 0x3c, 0x5f, 0x77, + 0xf5, 0x63, 0x83, 0xf3, 0xcd, 0xa0, 0x27, 0xae, 0xc6, 0xfc, 0x9e, 0x31, 0x5b, 0x9f, 0x64, 0x87, 0x7a, 0x39, 0x12, 0x8c, 0x0d, 0x01, 0xa2, 0x94, 0x59, 0xe2, 0x23, 0x90, 0xb7, 0x0a, 0x2c, 0xa7, + 0x3d, 0x64, 0xea, 0x85, 0x93, 0x61, 0x64, 0x61, 0x21, 0x4a, 0xce, 0x78, 0xd5, 0x16, 0xa2, 0xde, 0x52, 0xf5, 0x76, 0x3a, 0xb9, 0x47, 0xa7, 0xe8, 0x2e, 0xa4, 0x6d, 0x4a, 0x65, 0xbc, 0x64, 0xe1, + 0x0f, 0x93, 0x1d, 0x61, 0x8a, 0xff, 0xb9, 0x81, 0x95, 0x53, 0x9f, 0x23, 0x2d, 0x6b, 0xfa, 0x5f, 0x64, 0x8e, 0xbf, 0xa8, 0xc5, 0xdd, 0x91, 0xbe, 0xe2, 0xfb, 0x7e, 0xa3, 0x8b, 0x2e, 0x77, 0x04, + 0x59, 0xe5, 0x26, 0x82, 0x62, 0xe5, 0x58, 0x42, 0x35, 0x66, 0x53, 0xce, 0x3c, 0x33, 0xb7, 0xf0, 0x55, 0x4e, 0x1f, 0x0a, 0x9d, 0xc1, 0xb7, 0x1b, 0x4b, 0x9e, 0xc4, 0xad, 0x23, 0x00, 0x0e, 0x9e, + 0x99, 0xe0, 0x41, 0xf6, 0x42, 0x65, 0x19, 0x54, 0xaa, 0x30, 0x01, 0x58, 0x98, 0x73, 0x54, 0xc9, 0xdf, 0x36, 0x38, 0x3c, 0x60, 0x6c, 0x2b, 0x58, 0x58, 0x1b, 0x63, 0xc2, 0x0d, 0xf1, 0x30, 0x2c, + 0x84, 0xd9, 0xee, 0x3b, 0x37, 0xe6, 0x17, 0x9e, 0xb7, 0x73, 0x0f, 0x4e, 0x15, 0xc4, 0x4e, 0x96, 0xcc, 0xef, 0x7f, 0xf9, 0x0f, 0x2d, 0x86, 0x7e, 0x04, 0x2d, 0x8e, 0x03, 0x4b, 0x8b, 0xfe, 0x54, + 0xce, 0x7b, 0x26, 0xce, 0x5e, 0x58, 0x0d, 0x3e, 0x52, 0xbf, 0xb0, 0xe9, 0xee, 0x5e, 0xd7, 0x6c, 0x61, 0x7d, 0x67, 0xf2, 0xdb, 0xfd, 0x64, 0x4c, 0xca, 0xcc, 0xc8, 0x18, 0xef, 0x2d, 0x1a, 0x2a, + 0xa3, 0x7a, 0xbe, 0x60, 0x12, 0x55, 0xd1, 0xb4, 0xc1, 0xa6, 0x2a, 0x1b, 0x47, 0x6c, 0x44, 0xc0, 0x80, 0x03, 0x1b, 0x87, 0x86, 0xa1, 0xc4, 0xaa, 0x94, 0x3c, 0x90, 0x4d, 0x4a, 0x08, 0x12, 0x13, + 0x84, 0x64, 0x7f, 0x44, 0x39, 0xe1, 0x96, 0x10, 0xec, 0x54, 0x5b, 0xf7, 0x42, 0x41, 0xdb, 0xac, 0xcd, 0x0c, 0x58, 0xbe, 0x2c, 0xd8, 0xfe, 0x69, 0xe2, 0x06, 0xf7, 0x3b, 0xe4, 0x1e, 0xf3, 0x16, + 0x7e, 0xc1, 0x6d, 0x75, 0x43, 0xf7, 0xcc, 0xd5, 0x6b, 0xeb, 0xe4, 0xe0, 0xee, 0xe0, 0xb0, 0x9a, 0x43, 0x94, 0xc1, 0x59, 0x84, 0xac, 0x48, 0xa4, 0x98, 0xb1, 0x56, 0x5b, 0x32, 0xb2, 0x24, 0xd7, + 0xfe, 0x2e, 0x77, 0x63, 0x78, 0x88, 0x0d, 0x91, 0x32, 0xda, 0x71, 0xb0, 0xe2, 0xce, 0x65, 0x49, 0x80, 0x8b, 0x03, 0x0b, 0x58, 0x33, 0x14, 0xd7, 0xab, 0xa5, 0x06, 0xd4, 0x5e, 0xb2, 0x9e, 0x86, + 0xea, 0xd4, 0xc9, 0x80, 0x25, 0x66, 0x43, 0xb3, 0x11, 0x86, 0x99, 0x15, 0x18, 0x4e, 0x1a, 0x89, 0x69, 0x7e, 0x12, 0xe4, 0xfc, 0x07, 0x32, 0xe4, 0x99, 0x06, 0xfa, 0xda, 0xc9, 0x9a, 0x27, 0x8a, + 0x17, 0x26, 0x78, 0x5d, 0xcf, 0xce, 0x54, 0xec, 0xb9, 0x84, 0x67, 0xfb, 0x84, 0x27, 0xc1, 0x32, 0x31, 0x73, 0x93, 0x5e, 0xcc, 0xb6, 0x59, 0xe5, 0x92, 0x73, 0xdb, 0xb0, 0xdb, 0xe5, 0x52, 0xab, + 0x15, 0x6a, 0xc9, 0x34, 0xfc, 0x6e, 0xde, 0x82, 0xcc, 0xc6, 0x9b, 0xd9, 0xf8, 0x60, 0x45, 0x4c, 0xc8, 0x35, 0x2b, 0x9a, 0x55, 0x0d, 0x67, 0xd3, 0xde, 0x62, 0x36, 0xce, 0x77, 0xe8, 0x54, 0x25, + 0x0a, 0x23, 0x43, 0x74, 0x68, 0xb8, 0x30, 0xd4, 0x14, 0x7d, 0x5d, 0xf0, 0x19, 0x5e, 0xdf, 0x8b, 0xec, 0xf8, 0x2b, 0x71, 0xf7, 0xf9, 0xc4, 0x81, 0x0b, 0x92, 0xc7, 0x27, 0xdd, 0xaa, 0xc6, 0x1d, + 0xff, 0x22, 0xce, 0xac, 0xfe, 0xb9, 0xfd, 0x94, 0x09, 0xaf, 0x38, 0xd3, 0xee, 0x49, 0x5f, 0xb8, 0xf1, 0xe7, 0x46, 0x1f, 0xee, 0xe6, 0x60, 0xc3, 0x46, 0xb0, 0xbd, 0xb7, 0x53, 0x28, 0xb3, 0x2d, + 0x5e, 0xf5, 0x0f, 0x99, 0x3a, 0x9f, 0x59, 0x59, 0xb2, 0x18, 0x4b, 0xb4, 0xb0, 0x9c, 0x90, 0x9e, 0xe8, 0x44, 0x25, 0xd8, 0x8b, 0x75, 0x6b, 0x9e, 0x4c, 0xd6, 0xaa, 0x20, 0xc7, 0x31, 0xed, 0xe4, + 0x5e, 0x5b, 0xb5, 0x15, 0xa8, 0xfa, 0xf3, 0x7a, 0xd5, 0x22, 0xde, 0x96, 0xa1, 0xcd, 0x79, 0xb1, 0xd9, 0xce, 0x81, 0x22, 0x5c, 0x67, 0x08, 0x05, 0x43, 0x1f, 0x1d, 0x6c, 0x3f, 0x60, 0xcb, 0xfd, + 0x1e, 0x88, 0x7f, 0xc8, 0x64, 0xb9, 0x2f, 0xeb, 0xfa, 0x4c, 0x37, 0x7b, 0xc1, 0x6a, 0xbd, 0x23, 0x7d, 0x66, 0xd8, 0xcd, 0x8d, 0x93, 0x96, 0xd6, 0xc1, 0x82, 0x05, 0x74, 0x54, 0xdd, 0xe4, 0x33, + 0x5c, 0x1d, 0xec, 0x36, 0x05, 0x73, 0xc8, 0x01, 0x77, 0xb8, 0x25, 0xa2, 0xca, 0x5e, 0x38, 0xe2, 0xa8, 0x61, 0x15, 0xb3, 0x98, 0x6d, 0xf9, 0x85, 0x9e, 0x36, 0x98, 0x3f, 0x82, 0x3c, 0x23, 0x74, + 0x7c, 0x9b, 0xd8, 0x8e, 0x63, 0x89, 0x75, 0x2c, 0x11, 0xad, 0x9b, 0x41, 0xa1, 0x68, 0x6b, 0x6b, 0x1d, 0x97, 0xed, 0x94, 0x1b, 0x2d, 0xf5, 0xc8, 0x1f, 0xa2, 0x06, 0xac, 0xf6, 0x7e, 0x78, 0xca, + 0xf5, 0x3f, 0x48, 0x8c, 0x59, 0x87, 0xe2, 0x8b, 0xad, 0x0f, 0xaf, 0x95, 0xae, 0xfa, 0x43, 0xf6, 0xcc, 0x91, 0x4b, 0xa3, 0x4b, 0xa1, 0x2a, 0xa8, 0x9f, 0x32, 0xf5, 0x58, 0x86, 0x2c, 0x81, 0x18, + 0xe3, 0x92, 0x4d, 0x6b, 0x6e, 0x69, 0xa5, 0x3b, 0x83, 0x70, 0xda, 0x1e, 0xf7, 0xf8, 0xe0, 0x8e, 0xae, 0x10, 0x77, 0x3e, 0x84, 0xcc, 0xcb, 0xfb, 0x76, 0x19, 0x04, 0xb5, 0x67, 0x16, 0x6e, 0xff, + 0x54, 0x96, 0x21, 0x89, 0x9f, 0xdb, 0x14, 0x2f, 0x4b, 0xfb, 0x47, 0xef, 0x38, 0xc3, 0xf5, 0xe8, 0x49, 0x97, 0x15, 0x01, 0xea, 0xc7, 0x38, 0xc7, 0xee, 0x26, 0x84, 0xba, 0x57, 0xb8, 0xad, 0x95, + 0xa6, 0x83, 0x55, 0x0f, 0xc7, 0xd0, 0x21, 0x82, 0xab, 0x32, 0xd1, 0x7d, 0x2c, 0x76, 0xf2, 0x61, 0xe6, 0x7d, 0xc7, 0x8a, 0x2e, 0xe5, 0xe3, 0xaf, 0xe9, 0x85, 0x5f, 0xcc, 0x6c, 0xe8, 0x25, 0x88, + 0x3e, 0xbf, 0xe2, 0x0c, 0xd0, 0xe7, 0xfb, 0x67, 0xb7, 0x76, 0x07, 0xd1, 0xec, 0xe7, 0x13, 0xbf, 0x19, 0x06, 0x48, 0xe3, 0xed, 0x26, 0x7c, 0x6f, 0x9d, 0xef, 0xcc, 0x90, 0xac, 0x27, 0x6b, 0x63, + 0x75, 0xd0, 0x76, 0xdb, 0x45, 0x9e, 0xb0, 0x66, 0x12, 0x4c, 0xe5, 0x0d, 0x33, 0xac, 0x52, 0xc8, 0x53, 0x1d, 0xc6, 0xda, 0x5b, 0x63, 0x70, 0x01, 0x61, 0x78, 0x6a, 0x95, 0x04, 0x66, 0xb4, 0xbc, + 0x76, 0xb0, 0x4c, 0x24, 0x05, 0xe4, 0xb6, 0xac, 0xc1, 0xbc, 0x5e, 0x80, 0x5e, 0xb6, 0x20, 0x3a, 0x6e, 0x6f, 0xff, 0x9c, 0xdb, 0xf3, 0xcf, 0x67, 0x5f, 0x7f, 0x21, 0x2b, 0xd0, 0xd7, 0xa2, 0x16, + 0x67, 0x9a, 0x17, 0xc6, 0x1e, 0xa5, 0x04, 0xfa, 0x7d, 0x84, 0xe2, 0xc8, 0xc9, 0xc1, 0x0c, 0x2c, 0xd8, 0x82, 0x94, 0xa6, 0x4c, 0xb8, 0x4a, 0xa9, 0x68, 0x41, 0xc2, 0xee, 0x0c, 0x23, 0x13, 0x38, + 0x35, 0xd8, 0xc9, 0xd4, 0x2c, 0x63, 0xb4, 0x50, 0xcb, 0x21, 0x27, 0x01, 0x34, 0xb6, 0xe4, 0x2b, 0xc0, 0x71, 0xdd, 0x06, 0x01, 0xe3, 0xc1, 0xa0, 0xb4, 0x35, 0xfb, 0x30, 0x07, 0x16, 0x26, 0x8d, + 0x0f, 0x17, 0x8b, 0x1c, 0x66, 0xed, 0x2c, 0x22, 0x06, 0xd2, 0x82, 0x6d, 0x46, 0x38, 0x29, 0x3f, 0x29, 0xb9, 0xdc, 0x81, 0xb9, 0x77, 0xa2, 0xf4, 0x52, 0x78, 0xe0, 0xc7, 0x7c, 0xfd, 0x89, 0x8c, + 0xf2, 0xce, 0x9b, 0x7c, 0x2d, 0xb3, 0x7f, 0xde, 0x64, 0x12, 0x3c, 0x0b, 0xb0, 0x80, 0x2f, 0x6d, 0x7b, 0x7e, 0xf8, 0x86, 0x33, 0x97, 0x3e, 0xdf, 0x3f, 0x15, 0x1e, 0xe9, 0xe0, 0x0d, 0xa9, 0x55, + 0xe2, 0x00, 0xf9, 0x39, 0xce, 0x68, 0xe0, 0xde, 0x32, 0xd6, 0xc0, 0x98, 0xe6, 0x00, 0x64, 0x44, 0xee, 0x47, 0x61, 0xe9, 0xef, 0xf0, 0xed, 0xba, 0xe2, 0xf7, 0x58, 0x59, 0x22, 0xd3, 0xa0, 0x01, + 0xb8, 0x3d, 0x8a, 0x26, 0x8d, 0x58, 0x06, 0x7c, 0x12, 0xd1, 0x33, 0x14, 0x5b, 0x71, 0x3e, 0x3d, 0xdb, 0x8d, 0x12, 0x66, 0x19, 0x6d, 0x50, 0xde, 0x55, 0x10, 0x71, 0x1b, 0x4d, 0xc6, 0x2b, 0xb8, + 0x1d, 0xbc, 0xce, 0xb3, 0xfb, 0x3d, 0x40, 0x8f, 0x8f, 0x56, 0x39, 0xef, 0x39, 0x8b, 0x72, 0xcf, 0xbc, 0xee, 0x5b, 0x78, 0x65, 0x4b, 0xd2, 0x3f, 0x6e, 0x23, 0xcc, 0xfb, 0x01, 0x15, 0xcf, 0x16, + 0xaf, 0x97, 0x86, 0x46, 0xa8, 0x25, 0xe7, 0xb1, 0x10, 0x6a, 0xc9, 0x69, 0x69, 0xea, 0xc0, 0x7c, 0x63, 0xa5, 0x4e, 0x79, 0x3e, 0x6e, 0x25, 0x57, 0x83, 0x6c, 0x94, 0x3b, 0x2c, 0xa6, 0x6d, 0xe0, + 0xb0, 0xca, 0x5a, 0x6a, 0x7c, 0x18, 0x4b, 0x3c, 0xc3, 0x54, 0xa5, 0x03, 0x01, 0xbb, 0xba, 0x01, 0xec, 0x6c, 0x94, 0x05, 0x0a, 0x75, 0xb5, 0xda, 0x89, 0xe3, 0x3d, 0x57, 0xc9, 0x68, 0xc2, 0x7a, + 0xb1, 0xb0, 0x9b, 0x51, 0x8b, 0xb9, 0x10, 0x81, 0x33, 0x0e, 0x97, 0x13, 0x0b, 0xdf, 0x0b, 0x38, 0x0c, 0x35, 0xdf, 0x31, 0xff, 0x55, 0x94, 0x7f, 0x22, 0x13, 0x3f, 0x9e, 0xd1, 0xf3, 0x0c, 0xe9, + 0x97, 0x84, 0xe3, 0x1d, 0xf1, 0x33, 0xe6, 0x77, 0xb7, 0xba, 0xe6, 0x3b, 0xc1, 0x2d, 0x36, 0x6f, 0xf9, 0x4a, 0x15, 0xb4, 0xe1, 0x08, 0x56, 0xf0, 0xc3, 0x18, 0x33, 0x79, 0x3e, 0x44, 0xa7, 0xa2, + 0x24, 0x4a, 0xcb, 0xad, 0xcf, 0x32, 0x8a, 0x22, 0x15, 0x28, 0x8c, 0x62, 0x16, 0x27, 0xcd, 0x43, 0x26, 0x06, 0xf9, 0x9e, 0xda, 0xac, 0x72, 0x19, 0xc3, 0x76, 0x44, 0x70, 0x60, 0xa1, 0x91, 0x4e, + 0x0e, 0x61, 0x73, 0x6a, 0x39, 0xc1, 0x7a, 0x91, 0xb9, 0x75, 0x62, 0x09, 0xec, 0x0a, 0xfb, 0x27, 0x48, 0xa8, 0x3d, 0xe2, 0x95, 0x3c, 0xdf, 0x5b, 0xfd, 0xa2, 0xf2, 0x16, 0x25, 0xe1, 0x85, 0x17, + 0x49, 0xd8, 0x35, 0x21, 0x7c, 0x88, 0x4d, 0xc6, 0x8c, 0xed, 0x0e, 0x0f, 0x05, 0x45, 0x05, 0xeb, 0x26, 0x58, 0xae, 0x77, 0x6e, 0xeb, 0xe7, 0xcd, 0x9e, 0xce, 0xb9, 0xb9, 0x0a, 0x11, 0x23, 0x31, + 0xd1, 0xb6, 0x2d, 0xdf, 0x90, 0x19, 0xaa, 0x08, 0x92, 0xb1, 0xf1, 0xe5, 0xaa, 0xd5, 0x68, 0xad, 0xa1, 0x46, 0x13, 0x11, 0x8e, 0x65, 0x00, 0x61, 0x93, 0xc0, 0x77, 0x69, 0xd9, 0x2f, 0x44, 0x61, + 0xe9, 0x51, 0xb5, 0x07, 0x4e, 0x41, 0xef, 0xbb, 0xf1, 0xdf, 0x59, 0x2e, 0x7d, 0x8d, 0x60, 0x19, 0xea, 0xd6, 0xb3, 0x0a, 0x5e, 0xf8, 0xcb, 0x20, 0x9e, 0xa8, 0x5e, 0x70, 0x3c, 0x5d, 0x9f, 0x8a, + 0xe8, 0x75, 0x80, 0x12, 0x85, 0xc6, 0x9e, 0xbd, 0x77, 0x30, 0x8b, 0x90, 0x9a, 0x40, 0x4c, 0xcc, 0x42, 0x4a, 0xac, 0xc5, 0x86, 0x4b, 0x2b, 0x91, 0x9c, 0x6c, 0x5a, 0xa9, 0x28, 0xe8, 0x6a, 0x22, + 0x50, 0x38, 0x0a, 0xf5, 0x92, 0x48, 0x25, 0x46, 0xcb, 0x0a, 0x04, 0x41, 0x94, 0x13, 0x16, 0x28, 0xc2, 0xb3, 0x6b, 0x2a, 0x60, 0x87, 0xc6, 0xac, 0x5a, 0x26, 0xd8, 0x52, 0xdd, 0xaa, 0x32, 0x19, + 0xe8, 0xb3, 0x9d, 0x72, 0x38, 0x44, 0x7f, 0x27, 0x94, 0xa7, 0xea, 0x63, 0x1d, 0xd7, 0xee, 0x4b, 0x6f, 0xbf, 0x35, 0x88, 0x7f, 0x5e, 0xbf, 0xea, 0x23, 0xf1, 0x3b, 0x74, 0x6f, 0x8c, 0xe2, 0x0e, + 0xa7, 0xea, 0x08, 0x32, 0x18, 0x30, 0x40, 0x34, 0x1c, 0x24, 0x5c, 0x2c, 0xb3, 0xe5, 0xb0, 0x82, 0x48, 0x75, 0x3d, 0xe0, 0x48, 0x43, 0x2d, 0x97, 0xe2, 0x66, 0xbe, 0xe7, 0xf6, 0xa3, 0x19, 0x6c, + 0xce, 0xd3, 0x31, 0xda, 0xc2, 0xb3, 0x60, 0x3f, 0x93, 0x97, 0x16, 0x8d, 0x11, 0x62, 0x49, 0x97, 0x24, 0x4b, 0x52, 0xc0, 0x6e, 0x6a, 0xf5, 0x16, 0xb4, 0xda, 0xb3, 0x87, 0x24, 0xbb, 0x5f, 0x4c, + 0x24, 0x0c, 0x5c, 0x7a, 0x96, 0xf9, 0xcf, 0x21, 0x31, 0xbe, 0xce, 0x68, 0x7d, 0x69, 0xb0, 0x9f, 0x53, 0x57, 0xbd, 0x3f, 0x39, 0xaa, 0x1d, 0x86, 0xb9, 0x99, 0xa5, 0xd4, 0x0c, 0x31, 0x74, 0xa3, + 0x3d, 0x1c, 0x26, 0x73, 0x21, 0x5e, 0xed, 0x8c, 0x95, 0x5f, 0x98, 0x09, 0x34, 0x07, 0x82, 0x26, 0x81, 0xc2, 0x65, 0x04, 0x1e, 0xb4, 0x36, 0x12, 0x72, 0xa2, 0x17, 0x96, 0xa4, 0xeb, 0xf0, 0x46, + 0x16, 0xe9, 0x79, 0x12, 0x1f, 0x06, 0xbb, 0x81, 0xbd, 0xaa, 0x41, 0x3a, 0xe2, 0x22, 0xdd, 0xa6, 0xda, 0x2a, 0x9a, 0x70, 0x93, 0x22, 0xa5, 0x26, 0xf3, 0x49, 0x4c, 0x7c, 0xe7, 0xde, 0xfb, 0x6b, + 0x24, 0xc6, 0xbd, 0xda, 0xf4, 0x08, 0x49, 0xe4, 0xa5, 0x7d, 0x77, 0xf7, 0xa4, 0xcf, 0x88, 0xde, 0xdc, 0x38, 0x55, 0x18, 0xef, 0xe0, 0xb7, 0x9e, 0x9a, 0xa8, 0x33, 0x22, 0xf5, 0x5e, 0x63, 0xcc, + 0x46, 0x21, 0x1b, 0x97, 0x84, 0xc5, 0xd9, 0xc5, 0xb8, 0x4c, 0x44, 0x2f, 0x1b, 0x04, 0xc2, 0x21, 0xb5, 0x51, 0x8d, 0x02, 0x2a, 0x13, 0x34, 0x28, 0x38, 0x35, 0x50, 0x7a, 0x01, 0xe2, 0x2b, 0x7f, + 0x6c, 0x95, 0x34, 0x97, 0x11, 0x42, 0x8c, 0x8e, 0x63, 0x4e, 0xb3, 0xc6, 0x2c, 0x45, 0x82, 0xc0, 0x64, 0x4c, 0xae, 0x36, 0x5b, 0x5f, 0xaa, 0xe5, 0x6a, 0xfd, 0xdd, 0xee, 0xdc, 0xbf, 0x06, 0xd9, + 0xaf, 0x0e, 0x22, 0x7d, 0xed, 0xa4, 0xef, 0x2b, 0xd1, 0x33, 0x9a, 0xe7, 0x72, 0xa0, 0x1d, 0xcf, 0xf5, 0x4e, 0xc5, 0xcd, 0x6e, 0xda, 0xc2, 0x04, 0xcd, 0xe1, 0x4d, 0x8f, 0xd9, 0xee, 0xb0, 0x6a, + 0x31, 0xce, 0xad, 0x83, 0x19, 0x54, 0xad, 0x04, 0xad, 0xe7, 0xcb, 0xa9, 0x48, 0x96, 0x1a, 0xbf, 0xe0, 0x07, 0x31, 0xc8, 0x4c, 0x6a, 0x42, 0xa6, 0x94, 0x2d, 0x06, 0xc0, 0x3d, 0x6b, 0xcc, 0x6d, + 0x1a, 0x26, 0xd7, 0x39, 0x62, 0xbc, 0x5c, 0xec, 0x60, 0x0d, 0xe0, 0xb7, 0xa1, 0x98, 0x34, 0x07, 0x65, 0x42, 0x2b, 0x78, 0xe7, 0xc3, 0x5c, 0xbe, 0x3e, 0xff, 0xed, 0x9f, 0x7a, 0xa3, 0xc8, 0xfb, + 0xd1, 0x71, 0x7f, 0xa9, 0xd6, 0x9e, 0x5b, 0x97, 0xf5, 0x20, 0xb7, 0x8a, 0xae, 0x5a, 0x7b, 0x0f, 0x36, 0x22, 0x69, 0xa2, 0x5a, 0xca, 0xa0, 0x05, 0xbc, 0xdd, 0x4c, 0x5f, 0xb8, 0xeb, 0x6c, 0x35, + 0xd2, 0x58, 0x80, 0xd3, 0xca, 0xc1, 0x7e, 0x60, 0xed, 0xd2, 0xa1, 0x0f, 0xa1, 0xe3, 0x44, 0x90, 0xec, 0x22, 0x05, 0x93, 0xd1, 0xbc, 0x84, 0xb9, 0x7a, 0x23, 0x88, 0xaa, 0xdb, 0xa8, 0x5b, 0xb2, + 0x3d, 0x20, 0x31, 0xb6, 0xc3, 0x87, 0x83, 0x45, 0x8b, 0x91, 0x89, 0x8e, 0x09, 0xe0, 0x8c, 0xb5, 0x11, 0xfc, 0xbb, 0xa5, 0xf6, 0x3f, 0x05, 0xdf, 0xeb, 0xf1, 0x7b, 0xcf, 0x16, 0xdf, 0x17, 0x92, + 0xcd, 0xae, 0x54, 0x2f, 0x28, 0x9f, 0x4f, 0x75, 0xe8, 0x90, 0x6e, 0x76, 0x52, 0xd0, 0x1d, 0xb3, 0xd5, 0x59, 0xb9, 0x4c, 0x0b, 0x1e, 0x09, 0x94, 0x65, 0x26, 0x4b, 0xbc, 0x12, 0x8f, 0x83, 0xb5, + 0x1b, 0xe2, 0x31, 0x5f, 0xa2, 0xb2, 0x99, 0x88, 0x2a, 0x97, 0x40, 0x00, 0x35, 0x73, 0xf6, 0x34, 0x29, 0x11, 0x13, 0x58, 0x85, 0x02, 0xb0, 0xe1, 0x4c, 0x1d, 0xa3, 0xd0, 0x76, 0x39, 0x3a, 0xd4, + 0x94, 0xc7, 0x55, 0x04, 0x67, 0x96, 0x01, 0x2b, 0xac, 0xe6, 0xb3, 0x65, 0x00, 0xf2, 0xe0, 0x3f, 0xc7, 0x72, 0xfb, 0x7e, 0xa0, 0xdb, 0x33, 0x56, 0xbc, 0x14, 0x18, 0x38, 0x53, 0xbd, 0xb0, 0xe2, + 0x74, 0xdd, 0x35, 0x1c, 0x30, 0x06, 0xc6, 0x6b, 0x32, 0x65, 0xb7, 0x51, 0x65, 0x1a, 0x87, 0x94, 0x19, 0x09, 0x87, 0x66, 0xe5, 0xa2, 0x15, 0x24, 0xcb, 0x93, 0xd5, 0x98, 0x4e, 0x1c, 0x4a, 0x03, + 0xb7, 0x8a, 0x93, 0xb0, 0xd4, 0x94, 0xcb, 0x5b, 0x23, 0x5b, 0x1b, 0xb6, 0xed, 0x0c, 0x4a, 0xb7, 0x16, 0x9d, 0xf5, 0x78, 0x41, 0xc1, 0xdb, 0xed, 0x21, 0x4c, 0x31, 0x2f, 0xf7, 0xf2, 0x96, 0xc0, + 0x8b, 0x56, 0x02, 0xa1, 0xa2, 0x9c, 0xb9, 0x1d, 0xa3, 0xd4, 0xff, 0xec, 0x62, 0xab, 0x68, 0x12, 0xcb, 0xec, 0x7f, 0x75, 0x38, 0xe4, 0x71, 0x69, 0x79, 0x49, 0xb1, 0xbd, 0x21, 0x7d, 0xe6, 0xea, + 0xcd, 0x8d, 0xd3, 0x82, 0xd5, 0x41, 0xa9, 0x15, 0x7b, 0x33, 0x81, 0x72, 0xe6, 0x81, 0x80, 0xac, 0x9b, 0x89, 0x9e, 0xef, 0x80, 0x69, 0xac, 0x9b, 0x43, 0x23, 0x4d, 0x54, 0xb2, 0xac, 0x64, 0xb1, + 0x47, 0x68, 0xb9, 0x90, 0x2a, 0x14, 0xb7, 0x18, 0xeb, 0x70, 0xca, 0xb5, 0x05, 0x14, 0xb7, 0x83, 0x70, 0x10, 0x1f, 0xf8, 0xf1, 0x61, 0xe5, 0xc8, 0xd4, 0xc1, 0xdb, 0xe6, 0xab, 0xcd, 0xd2, 0x43, + 0x1b, 0x6d, 0xda, 0x03, 0xca, 0xca, 0x0c, 0xe8, 0x40, 0x29, 0x3b, 0xb2, 0x56, 0xab, 0x34, 0xef, 0x1c, 0x5d, 0xbf, 0xf9, 0xf0, 0xfc, 0xf1, 0xea, 0xf5, 0xfd, 0xf9, 0xc6, 0x37, 0xa7, 0x42, 0x9f, + 0xf6, 0x24, 0x10, 0x6f, 0x60, 0x3f, 0xb2, 0x0e, 0xc5, 0x87, 0x13, 0x1e, 0xde, 0x6b, 0xe4, 0x5e, 0x0f, 0x12, 0xfd, 0x66, 0x89, 0xfc, 0xb9, 0x6f, 0xeb, 0x1f, 0x3c, 0xd6, 0xbe, 0x1e, 0x6a, 0x2f, + 0x6a, 0xeb, 0x7f, 0x28, 0xdf, 0x8c, 0xb4, 0xeb, 0x40, 0xfb, 0x56, 0x77, 0x87, 0xfa, 0x03, 0x3a, 0x62, 0xc6, 0x53, 0xdf, 0xa6, 0xc8, 0x5c, 0x40, 0xcc, 0x24, 0xe1, 0xd7, 0x81, 0x33, 0xb1, 0x5b, + 0x4d, 0x4c, 0x1e, 0x27, 0x53, 0x7f, 0xd9, 0xcd, 0xda, 0xd2, 0xf6, 0x5f, 0xfb, 0xf0, 0x5e, 0xf2, 0x2c, 0x5d, 0xc8, 0x9e, 0x3b, 0x78, 0x69, 0x74, 0xf5, 0x26, 0x2d, 0x45, 0x52, 0x40, 0xf7, 0xf4, + 0x20, 0xde, 0xf8, 0x90, 0x5c, 0x57, 0xd5, 0x10, 0x07, 0xb3, 0x52, 0xde, 0x8f, 0x37, 0xf8, 0x0a, 0x0a, 0x5b, 0x67, 0x33, 0x5d, 0xa1, 0x40, 0x66, 0x55, 0xb0, 0xb1, 0x10, 0x4c, 0x6d, 0x28, 0x85, + 0x43, 0x3a, 0x5b, 0xe0, 0xa0, 0xba, 0x2e, 0x0b, 0x34, 0x5b, 0xd1, 0x8e, 0x02, 0x4e, 0x97, 0x99, 0x5c, 0x0e, 0xc9, 0xb1, 0xbe, 0x1b, 0xc1, 0xb9, 0xc9, 0xf7, 0x0e, 0xa0, 0xe1, 0x7e, 0x17, 0xe1, + 0xfe, 0xcf, 0x18, 0x52, 0x47, 0x1c, 0xbe, 0xd6, 0xbc, 0x5e, 0xc6, 0xfa, 0x5d, 0xfb, 0xba, 0x34, 0xba, 0x62, 0x9d, 0x78, 0x68, 0xe5, 0xea, 0xee, 0x86, 0x9e, 0x2d, 0x0e, 0xb1, 0xfb, 0xff, 0xb2, + 0xf7, 0x67, 0x4d, 0xca, 0x72, 0x4d, 0xff, 0x28, 0x78, 0xbe, 0x3f, 0xc5, 0x15, 0xf7, 0x61, 0x13, 0x5e, 0x8c, 0x22, 0xbc, 0x11, 0xbb, 0x7b, 0xa3, 0xa8, 0x28, 0x82, 0x03, 0xa8, 0x40, 0x47, 0x3f, + 0x1d, 0xcc, 0xf3, 0x3c, 0x1b, 0x3b, 0xde, 0xcf, 0xde, 0x21, 0x56, 0xd5, 0x55, 0x5a, 0x5a, 0x52, 0xde, 0xf7, 0xd3, 0xcf, 0xbf, 0x7b, 0xbf, 0x47, 0x05, 0x48, 0x25, 0xf0, 0x5b, 0xb9, 0x72, 0x65, + 0xe6, 0xca, 0x61, 0x5f, 0x8f, 0x36, 0xce, 0x3c, 0x2f, 0x4d, 0x11, 0xab, 0x76, 0xf3, 0x59, 0x2c, 0x39, 0x9b, 0x11, 0xb0, 0x9b, 0xf3, 0x90, 0xc7, 0x2e, 0x2a, 0x12, 0x20, 0x36, 0x47, 0x79, 0xb2, + 0x15, 0xd3, 0x82, 0xa2, 0x23, 0x3b, 0x6b, 0xd6, 0x21, 0x62, 0x63, 0xb8, 0x13, 0x33, 0x10, 0x60, 0x13, 0xa5, 0xa2, 0x8c, 0x4f, 0x5c, 0x56, 0x1d, 0xe6, 0xf4, 0xd3, 0x6a, 0xdd, 0xff, 0xdf, 0xc0, + 0xba, 0xcb, 0x54, 0xbe, 0xf8, 0xe0, 0x1f, 0xe0, 0x7d, 0xdd, 0x8d, 0xe6, 0x07, 0x78, 0x7f, 0x22, 0x7d, 0xc1, 0xfc, 0xd3, 0x85, 0x6e, 0xb3, 0xa2, 0x87, 0xf5, 0x7d, 0xf0, 0x04, 0x53, 0x03, 0x03, + 0x26, 0xf4, 0xe3, 0xd6, 0x20, 0xb2, 0x76, 0x73, 0x58, 0xb0, 0xd5, 0x7a, 0x12, 0x61, 0x34, 0xec, 0xc7, 0x5c, 0x2a, 0x03, 0x55, 0xda, 0x7a, 0xde, 0xde, 0xd2, 0xd1, 0xa6, 0x65, 0x8b, 0x0d, 0x66, + 0xc8, 0xeb, 0x86, 0xc3, 0xb0, 0x5c, 0xc9, 0xa2, 0x74, 0x2b, 0x9c, 0x04, 0x23, 0x47, 0x9b, 0x76, 0x9d, 0xed, 0xc5, 0x95, 0x38, 0x21, 0x57, 0x87, 0xc9, 0xc1, 0x5e, 0x45, 0xf6, 0x8f, 0xbb, 0x0a, + 0x7f, 0xdf, 0x68, 0xf9, 0x55, 0x01, 0x77, 0xdb, 0x68, 0xb9, 0x97, 0x50, 0x2b, 0x87, 0xbc, 0x21, 0xcc, 0xec, 0xbc, 0x74, 0x54, 0x6e, 0x1c, 0xf3, 0xcb, 0x03, 0x7e, 0x60, 0x37, 0xb6, 0x2e, 0x88, + 0xcd, 0xf4, 0x87, 0x1f, 0xf5, 0xa7, 0xe7, 0xe5, 0xbd, 0x8f, 0x7a, 0x2d, 0x6d, 0xf5, 0x8d, 0x26, 0x38, 0x78, 0x3f, 0xea, 0x9b, 0x9c, 0x5a, 0x27, 0x8d, 0x92, 0x93, 0x7c, 0xdc, 0x28, 0xea, 0x72, + 0x2a, 0x2c, 0xe7, 0x0b, 0x45, 0x6c, 0xe9, 0xa9, 0x2a, 0x27, 0x01, 0x34, 0x63, 0x05, 0x0a, 0x98, 0x8d, 0x49, 0x75, 0xe9, 0xb6, 0x66, 0xc8, 0x3a, 0x5c, 0xed, 0x37, 0x5b, 0x1b, 0x47, 0x1d, 0x4c, + 0x84, 0xd9, 0xa5, 0xbd, 0x9f, 0x33, 0x89, 0x98, 0x6e, 0x68, 0x7e, 0xa7, 0x87, 0xa1, 0xbc, 0x2a, 0xed, 0x6c, 0xe7, 0x2d, 0x83, 0x71, 0x71, 0xac, 0x76, 0x3d, 0xb7, 0x84, 0xd5, 0xcc, 0xbe, 0xee, + 0x3a, 0xd4, 0xa7, 0xed, 0xe6, 0xa7, 0x8e, 0xa1, 0x9a, 0x1b, 0xbd, 0x7f, 0x6e, 0xbf, 0xe0, 0xa9, 0xae, 0xd1, 0x91, 0x56, 0x5a, 0xd6, 0x43, 0x77, 0x2e, 0xfa, 0x12, 0x4b, 0x7d, 0xa2, 0xdb, 0x8d, + 0xc0, 0xc7, 0x59, 0xe7, 0x91, 0x79, 0xca, 0x5a, 0xc7, 0x86, 0x18, 0x9a, 0x55, 0x03, 0xc3, 0x91, 0x49, 0xe2, 0xab, 0x13, 0x41, 0xfb, 0x96, 0x03, 0xa8, 0x1b, 0x25, 0x5d, 0xda, 0x3f, 0x66, 0xad, + 0x38, 0x1a, 0xe4, 0xba, 0x63, 0x86, 0xea, 0xa0, 0xc8, 0xd4, 0xf3, 0x87, 0x3d, 0xf2, 0x40, 0x9d, 0x6d, 0x81, 0x9f, 0x4b, 0xf3, 0x7b, 0x0f, 0x78, 0xff, 0xe4, 0x9b, 0xcb, 0x83, 0xee, 0x09, 0xcf, + 0x39, 0xb0, 0xd1, 0xb4, 0x09, 0x33, 0x34, 0x26, 0xf2, 0x7e, 0x28, 0x12, 0x2b, 0x7d, 0xea, 0x38, 0xa5, 0x33, 0x62, 0x96, 0x04, 0xc1, 0x48, 0xe5, 0x11, 0x4d, 0xf3, 0x05, 0x2a, 0x43, 0xa7, 0xb5, + 0x32, 0x63, 0x2d, 0x65, 0xca, 0xe8, 0xc9, 0xd1, 0x65, 0xf6, 0xe0, 0xb2, 0x39, 0xf9, 0x38, 0x42, 0x8e, 0xb3, 0x5c, 0xd5, 0xc0, 0x90, 0x73, 0x99, 0x6d, 0xe1, 0x92, 0x35, 0xb7, 0x01, 0x08, 0x6c, + 0xb8, 0xdb, 0x98, 0xe8, 0xe1, 0xfb, 0xb4, 0x5f, 0xdf, 0x6c, 0xab, 0x87, 0x0c, 0xf0, 0xca, 0xf4, 0x3b, 0x13, 0x04, 0x07, 0xdd, 0x9f, 0xae, 0x47, 0x68, 0x8f, 0x89, 0x47, 0xb6, 0xfe, 0x12, 0xc4, + 0x70, 0x81, 0x07, 0x49, 0x76, 0xc3, 0x81, 0xb9, 0xab, 0x3b, 0xa7, 0xed, 0x68, 0x5d, 0x49, 0xed, 0x9c, 0x96, 0xd9, 0xb9, 0xa8, 0xd2, 0x01, 0xcb, 0xcd, 0x27, 0x54, 0x60, 0x23, 0x7b, 0x96, 0x60, + 0x77, 0x2d, 0xe6, 0x69, 0x90, 0x41, 0xe4, 0x33, 0x1d, 0x80, 0xc4, 0x02, 0x92, 0xe5, 0x48, 0x74, 0x52, 0x42, 0x42, 0x76, 0x8a, 0x3d, 0xb1, 0x47, 0xd8, 0x6e, 0xd3, 0xd8, 0xfa, 0x6d, 0xab, 0x81, + 0x1f, 0xec, 0x06, 0x5f, 0x4f, 0x8d, 0xbf, 0xd0, 0x9e, 0xf9, 0xf8, 0x81, 0x5a, 0x98, 0x79, 0x31, 0xf8, 0x03, 0xe0, 0x3d, 0x4c, 0x87, 0x2f, 0x61, 0x7a, 0x4d, 0x1a, 0x1c, 0xdc, 0x5c, 0xe8, 0x0a, + 0x7c, 0xf6, 0xc0, 0xb9, 0x36, 0x45, 0x20, 0x83, 0x7c, 0xd1, 0xdf, 0x6d, 0x8d, 0x89, 0x21, 0x4f, 0xf8, 0xc2, 0xe7, 0xea, 0xa3, 0xb4, 0x15, 0xb9, 0x69, 0x5e, 0xb3, 0xd9, 0x6c, 0xec, 0x87, 0x98, + 0xee, 0x6f, 0xd7, 0xdc, 0xc1, 0x71, 0x52, 0x67, 0xc1, 0x2d, 0xe0, 0xbd, 0x88, 0x38, 0x9c, 0x07, 0xc0, 0xae, 0x6b, 0x2f, 0x1c, 0x5b, 0x50, 0xc2, 0xa1, 0x2d, 0x86, 0xd9, 0x4e, 0x1a, 0xf3, 0xf1, + 0x7c, 0x6f, 0xab, 0xa2, 0x0c, 0x37, 0xaf, 0xe3, 0x9c, 0xa8, 0xba, 0xaf, 0xda, 0x97, 0x9e, 0x6b, 0x9d, 0xdc, 0xc3, 0x5f, 0xea, 0x3d, 0xd3, 0xc7, 0x5d, 0x7a, 0xa7, 0xb1, 0xdc, 0xfd, 0x05, 0x67, + 0xf4, 0xca, 0xe8, 0xdc, 0x10, 0x3f, 0x8f, 0xcf, 0xcd, 0xa5, 0x41, 0x47, 0xf9, 0xf9, 0x08, 0xad, 0x44, 0x95, 0x90, 0x95, 0x04, 0x65, 0x11, 0x6a, 0x9f, 0xa4, 0xfb, 0xa8, 0xae, 0x59, 0xd5, 0x8b, + 0x17, 0x8c, 0x9e, 0xb3, 0xeb, 0x71, 0x74, 0xaa, 0x97, 0xfc, 0x56, 0xc8, 0xfc, 0x51, 0x19, 0x9d, 0xdc, 0x4d, 0x1d, 0xe3, 0x13, 0x6f, 0x2d, 0x7b, 0xed, 0x1a, 0x9a, 0x91, 0xb5, 0xe5, 0x37, 0xb3, + 0x6a, 0x03, 0x44, 0xe3, 0x7c, 0x32, 0x37, 0x51, 0x93, 0xdb, 0x44, 0xa6, 0x71, 0xb0, 0x17, 0x0b, 0xdb, 0xa0, 0x7a, 0xe6, 0xbd, 0xbf, 0xb7, 0x33, 0xfd, 0xd2, 0xd1, 0x5a, 0x8f, 0x63, 0xdf, 0xbd, + 0xac, 0x4c, 0x5f, 0x7a, 0x71, 0xf4, 0xea, 0x0a, 0x78, 0xd6, 0x71, 0x2f, 0x44, 0xde, 0x2a, 0x21, 0xbc, 0xad, 0x72, 0xd8, 0xef, 0x3e, 0x59, 0x8e, 0x5f, 0xe0, 0xbd, 0xfa, 0xf5, 0xf2, 0xd6, 0xf7, + 0x06, 0x93, 0xf8, 0x4d, 0xbc, 0xe0, 0x1d, 0x55, 0xbd, 0xb3, 0xf4, 0x52, 0xbd, 0x6a, 0xd0, 0xfd, 0xff, 0xf3, 0x21, 0x6b, 0xc8, 0x43, 0x29, 0x01, 0x3b, 0xd0, 0xd3, 0x67, 0x1e, 0x4c, 0x33, 0x31, + 0x68, 0x4d, 0x12, 0x92, 0x34, 0x73, 0x7b, 0x4e, 0x1f, 0x5d, 0x66, 0xca, 0x67, 0x6c, 0xa3, 0x4e, 0xa6, 0x7c, 0x39, 0x69, 0x92, 0x98, 0x9b, 0x84, 0x54, 0x01, 0x4e, 0xd6, 0x93, 0xf9, 0x81, 0xae, + 0xa9, 0x91, 0x1f, 0x98, 0xd3, 0x64, 0x7a, 0x5a, 0x7a, 0x74, 0x54, 0x39, 0x68, 0x3b, 0x8f, 0xd7, 0xe5, 0xaa, 0x84, 0xe8, 0x22, 0x08, 0x7a, 0x0e, 0xd9, 0xa3, 0x1e, 0x50, 0x37, 0x7d, 0xc5, 0xef, + 0x2e, 0x84, 0x77, 0x0a, 0x55, 0x9e, 0x01, 0x76, 0x33, 0x73, 0x60, 0x65, 0x71, 0xf8, 0xc7, 0x2d, 0x7a, 0xd1, 0x47, 0xae, 0x9c, 0x09, 0x65, 0xe6, 0xbe, 0x57, 0x2b, 0xb9, 0x34, 0xb7, 0xfd, 0x32, + 0x67, 0xef, 0x9a, 0x0d, 0x67, 0xe3, 0xf9, 0xfc, 0x4f, 0x17, 0x7b, 0xe1, 0x9a, 0xe0, 0x53, 0x83, 0xc2, 0x4c, 0x62, 0xcd, 0xcc, 0xcc, 0x93, 0xff, 0xa7, 0x17, 0xc1, 0xcb, 0x4c, 0xf3, 0x03, 0xdd, + 0xe0, 0x35, 0xc5, 0xfa, 0x27, 0xba, 0x41, 0x0f, 0x95, 0xbb, 0xb3, 0xb4, 0x39, 0x02, 0xdc, 0x90, 0x11, 0x2a, 0x79, 0x92, 0xb3, 0x50, 0x22, 0x38, 0x58, 0x39, 0xfe, 0x4c, 0xa5, 0x26, 0xe2, 0x7a, + 0xbf, 0xdb, 0x4a, 0xde, 0xd1, 0x39, 0x60, 0x63, 0x0a, 0xdc, 0x45, 0xeb, 0x8a, 0x68, 0x2a, 0x3b, 0x2d, 0xd2, 0x84, 0x92, 0xc8, 0xc5, 0x1a, 0x0b, 0x77, 0xdb, 0x46, 0x68, 0xe0, 0x5d, 0x10, 0x63, + 0x45, 0x7a, 0x32, 0x53, 0x0d, 0xca, 0xd7, 0x41, 0x56, 0xaa, 0xeb, 0x16, 0x35, 0xca, 0xef, 0x75, 0x83, 0x20, 0x8e, 0x13, 0xcd, 0x8c, 0x1e, 0x76, 0x56, 0x7a, 0xad, 0xac, 0xd2, 0x07, 0xd5, 0xb3, + 0x9c, 0x7c, 0x3f, 0xee, 0x53, 0x48, 0x09, 0x1e, 0x18, 0xf6, 0x1c, 0xdd, 0xc0, 0xfa, 0xd2, 0x62, 0x36, 0xd0, 0x32, 0x1d, 0x9b, 0x15, 0x6a, 0xab, 0x05, 0x90, 0x2c, 0x67, 0x20, 0xd1, 0x6b, 0xbe, + 0x34, 0x85, 0xf9, 0xe6, 0x48, 0xbb, 0x2e, 0x28, 0xfd, 0x1d, 0x04, 0x37, 0xd5, 0x64, 0x1f, 0xf1, 0xc8, 0xcf, 0xf5, 0xc7, 0x6b, 0xd2, 0x1d, 0x18, 0x9f, 0x2f, 0xf4, 0x29, 0xd0, 0x70, 0xe6, 0x8b, + 0x39, 0xb2, 0xf2, 0x70, 0xb8, 0x90, 0xe8, 0xe8, 0x30, 0x9b, 0xad, 0x5d, 0xe2, 0xa0, 0x18, 0x39, 0x20, 0xc4, 0x5b, 0xaf, 0xd8, 0x4e, 0x50, 0xc3, 0x8e, 0x7d, 0xd6, 0xa0, 0xe7, 0x48, 0x28, 0x86, + 0x70, 0xd1, 0x60, 0xe1, 0x10, 0xe2, 0xf7, 0xcc, 0x78, 0xad, 0x08, 0xe3, 0x7a, 0xbb, 0x65, 0xda, 0x16, 0x3a, 0xc0, 0x08, 0x05, 0x2d, 0xc5, 0x39, 0xe6, 0xea, 0x96, 0xb2, 0x65, 0x80, 0x66, 0xd3, + 0x3a, 0xc4, 0x53, 0xe5, 0xe9, 0x79, 0x08, 0x44, 0x4f, 0x9d, 0x29, 0x2b, 0x2f, 0xa5, 0x84, 0x1e, 0x20, 0x8b, 0xbf, 0x34, 0xfb, 0x3e, 0xa8, 0x9e, 0x41, 0x7d, 0x3f, 0x1e, 0xe0, 0xfd, 0xe6, 0xd9, + 0x32, 0xc6, 0x8d, 0x25, 0x84, 0x4d, 0x42, 0xc1, 0x2b, 0x4f, 0x51, 0xbd, 0x14, 0x04, 0x34, 0xd9, 0x9b, 0xc7, 0xd0, 0x00, 0x19, 0xc8, 0xb2, 0xc4, 0xc0, 0x97, 0x24, 0xbb, 0x56, 0x5c, 0xc0, 0x4c, + 0xe1, 0xfd, 0x24, 0x4c, 0xb7, 0xf5, 0xc4, 0x01, 0xcc, 0x55, 0x2e, 0xaf, 0xe5, 0x49, 0x2d, 0x93, 0x24, 0xec, 0x22, 0x33, 0xd5, 0xc1, 0x1c, 0x78, 0x3c, 0xe5, 0x26, 0x0d, 0x96, 0x8a, 0xce, 0x5c, + 0xcb, 0xdd, 0x9e, 0x56, 0x60, 0xab, 0x06, 0x81, 0xfb, 0xd1, 0xf6, 0xf6, 0x95, 0x80, 0xe0, 0x5e, 0x19, 0xcf, 0xa1, 0xea, 0x9b, 0x03, 0xc3, 0x7d, 0x6c, 0xf8, 0xbd, 0xa2, 0xa3, 0xbe, 0x13, 0x05, + 0x07, 0x1f, 0x87, 0x7d, 0xf5, 0x7f, 0x1b, 0x9d, 0x99, 0x1b, 0x04, 0x5a, 0xf1, 0xb5, 0x43, 0xad, 0x34, 0x10, 0x9f, 0x9c, 0x70, 0xda, 0xc0, 0x66, 0x48, 0x64, 0x9f, 0x4c, 0xc8, 0x3b, 0x8d, 0x0a, + 0xed, 0x94, 0xd1, 0x48, 0x4d, 0x1d, 0x80, 0x98, 0x9c, 0x99, 0x3c, 0x63, 0x62, 0xd9, 0x0a, 0x68, 0x59, 0x24, 0x34, 0xa0, 0x25, 0x68, 0xb9, 0x82, 0x05, 0xe7, 0x2a, 0x4c, 0xd1, 0x8e, 0x94, 0xba, + 0x43, 0x20, 0x3e, 0xd4, 0x6b, 0x0e, 0x34, 0xe7, 0xcf, 0x1c, 0x5b, 0x8f, 0x47, 0xe1, 0x53, 0x8f, 0x5f, 0xfc, 0xa5, 0x41, 0xf8, 0xcf, 0x05, 0x79, 0x7e, 0x0c, 0xc2, 0xd5, 0xd5, 0x8f, 0x0f, 0xba, + 0x3f, 0xc5, 0x5e, 0x71, 0xad, 0x5d, 0x48, 0x82, 0x83, 0xb7, 0x83, 0x01, 0xde, 0xcf, 0x95, 0xa6, 0xa1, 0xa4, 0x38, 0x56, 0x45, 0xc1, 0x3a, 0xe0, 0xed, 0x38, 0x53, 0x93, 0x3d, 0x41, 0x26, 0x43, + 0x8b, 0x35, 0xfd, 0x29, 0x12, 0x82, 0x7c, 0x1d, 0xd1, 0xb1, 0xbe, 0x3e, 0x64, 0xe5, 0x76, 0x26, 0xc0, 0x60, 0x65, 0x72, 0xb6, 0x71, 0x2a, 0x37, 0x7a, 0xb4, 0xe6, 0x50, 0x8c, 0xc3, 0x27, 0x75, + 0x73, 0x24, 0x3c, 0x06, 0x0c, 0x9a, 0xa9, 0x3a, 0xcc, 0xc6, 0x31, 0x6d, 0xee, 0xeb, 0x72, 0xc8, 0x30, 0xe2, 0xb3, 0x91, 0xfe, 0xe2, 0x37, 0xf9, 0x33, 0xc0, 0x9a, 0x1b, 0xbd, 0x7d, 0x41, 0x3f, + 0xaf, 0x49, 0xa8, 0x46, 0x67, 0x8b, 0xe5, 0xdb, 0xfc, 0xe7, 0x57, 0x24, 0xd6, 0x27, 0xba, 0xdd, 0xfc, 0xf9, 0x38, 0xeb, 0x13, 0x21, 0x04, 0x0f, 0x48, 0x0e, 0x98, 0x1e, 0x46, 0x7e, 0x38, 0x2a, + 0xb1, 0xd4, 0x1e, 0xcd, 0x4e, 0xfb, 0xf1, 0x76, 0x5f, 0x31, 0x5a, 0x16, 0x28, 0xfa, 0x77, 0xeb, 0x7b, 0x68, 0x16, 0x4e, 0x6c, 0x3c, 0x5e, 0xd5, 0x5e, 0xe9, 0x42, 0xf1, 0x46, 0xf3, 0xfc, 0x15, + 0x97, 0xa3, 0x6e, 0x43, 0xee, 0x89, 0x1e, 0x0d, 0x0f, 0x0e, 0x42, 0xe8, 0xc3, 0x91, 0xb2, 0x9f, 0x42, 0x23, 0xbd, 0x11, 0x94, 0xf0, 0x10, 0xf3, 0x1a, 0x8d, 0xed, 0x55, 0x70, 0x8d, 0xfd, 0xad, + 0x95, 0xa8, 0x67, 0x47, 0xb4, 0xd0, 0x0d, 0x1f, 0x2b, 0x80, 0xaf, 0xb4, 0x09, 0x38, 0x13, 0x3c, 0x63, 0xe0, 0x86, 0x67, 0x05, 0xaf, 0x57, 0xa3, 0x80, 0x06, 0x3a, 0x44, 0x44, 0x9e, 0x2c, 0x80, + 0xba, 0x5c, 0xc2, 0x6b, 0x5c, 0x18, 0xd9, 0x91, 0xa6, 0x6e, 0x6d, 0x62, 0xd3, 0x38, 0x18, 0xcf, 0x33, 0xda, 0x88, 0x15, 0x16, 0x7c, 0x38, 0x3d, 0xb2, 0xee, 0x66, 0x8a, 0xed, 0xd8, 0x75, 0x12, + 0x54, 0xae, 0x17, 0x01, 0xbc, 0x1f, 0xca, 0x61, 0xb8, 0xb3, 0x37, 0x38, 0x11, 0xea, 0x23, 0xc8, 0x43, 0xa6, 0x9a, 0x29, 0xce, 0x76, 0x79, 0x96, 0xd7, 0xea, 0xd6, 0x7c, 0x16, 0x60, 0xf1, 0x65, + 0x6e, 0xbc, 0x21, 0xf1, 0x97, 0x1e, 0xb8, 0x9f, 0xa7, 0x44, 0x5f, 0xbc, 0xfb, 0xe4, 0x0c, 0x75, 0xa0, 0x18, 0x8f, 0xb2, 0x47, 0xe0, 0xdf, 0xd8, 0x2b, 0x46, 0xf8, 0x1b, 0xd1, 0x77, 0xcc, 0x0d, + 0x6d, 0x70, 0x21, 0xf4, 0x1c, 0xf7, 0xed, 0x38, 0xa4, 0xc0, 0x39, 0xd2, 0x02, 0x0b, 0xcb, 0x14, 0xb0, 0xd8, 0x2f, 0xcc, 0x02, 0x4d, 0x77, 0x0a, 0xb0, 0x19, 0xfa, 0x1b, 0x67, 0xc2, 0xee, 0xa4, + 0x46, 0x8a, 0xb6, 0xd3, 0xd2, 0x90, 0xd3, 0xbd, 0x3a, 0x75, 0x63, 0x6a, 0x0f, 0x83, 0xab, 0x14, 0x29, 0x73, 0x94, 0x06, 0x0b, 0x78, 0x69, 0xc5, 0x98, 0x33, 0x25, 0x77, 0xd3, 0xed, 0x26, 0xd3, + 0xc6, 0x23, 0x76, 0x98, 0xaf, 0xf5, 0xd3, 0xf2, 0xb0, 0xf8, 0x61, 0xbc, 0x45, 0x5f, 0x1e, 0xfd, 0xe8, 0x68, 0x79, 0x5f, 0xf4, 0xc0, 0xbf, 0xd1, 0x17, 0x91, 0xeb, 0xe8, 0xbe, 0x83, 0xd7, 0x9d, + 0x0c, 0x2e, 0xe4, 0x9e, 0xe3, 0xa7, 0x67, 0xa1, 0x47, 0x61, 0xda, 0xaa, 0xd8, 0x11, 0x21, 0x99, 0xae, 0x12, 0xa6, 0xb2, 0x1b, 0x61, 0xe2, 0x88, 0x80, 0x14, 0x0b, 0x81, 0xe2, 0x12, 0x4b, 0x2c, + 0x02, 0xd5, 0x85, 0x11, 0xa1, 0x27, 0x12, 0x31, 0xc1, 0x3d, 0x36, 0x52, 0xa0, 0x03, 0xd8, 0x06, 0xc0, 0xd1, 0x21, 0x8f, 0x10, 0x86, 0xcf, 0xed, 0xd9, 0x81, 0x0a, 0x63, 0x7e, 0x07, 0x5a, 0xa1, + 0xa1, 0x29, 0xb2, 0x2e, 0x08, 0x8b, 0xfd, 0x2d, 0xdf, 0x3e, 0x5a, 0xaa, 0xff, 0xb0, 0xd2, 0x3b, 0xdf, 0xfc, 0x94, 0x61, 0xfb, 0x83, 0x7f, 0xdd, 0x31, 0xe2, 0x9f, 0xb3, 0x03, 0xae, 0x49, 0x5f, + 0xc6, 0xe0, 0xd3, 0x85, 0xbe, 0x76, 0x80, 0x37, 0x9c, 0xea, 0x45, 0xe4, 0x33, 0x23, 0x35, 0xb4, 0x0e, 0x60, 0x3a, 0x64, 0xec, 0x30, 0x56, 0x03, 0xd8, 0x46, 0xb6, 0xcc, 0x6c, 0xb9, 0xcb, 0xd4, + 0x75, 0x11, 0x36, 0xd0, 0x32, 0x59, 0xa4, 0x7e, 0xe3, 0x8c, 0x9d, 0x05, 0x18, 0x2c, 0x85, 0x00, 0x8e, 0xb8, 0x64, 0x8b, 0x0d, 0x9d, 0x83, 0x9a, 0xd5, 0xfc, 0x54, 0x5c, 0xc7, 0xc7, 0xa9, 0x1b, + 0x46, 0x86, 0x82, 0x6d, 0x59, 0x68, 0xc7, 0x34, 0x65, 0xf3, 0x37, 0x23, 0x19, 0xfb, 0x49, 0x83, 0x3f, 0x4d, 0xa0, 0xee, 0x6b, 0xa3, 0xaf, 0x84, 0xfd, 0x7c, 0x50, 0xed, 0xf0, 0x7c, 0x3b, 0xee, + 0xb6, 0x20, 0x7a, 0x84, 0xfd, 0xb4, 0x4b, 0xe6, 0xb0, 0x9d, 0x3a, 0x6d, 0xba, 0x59, 0xed, 0x45, 0xbb, 0x20, 0xc7, 0x04, 0xba, 0x91, 0x4a, 0xfc, 0x88, 0x66, 0x0d, 0xc6, 0x55, 0x15, 0x53, 0x09, + 0xfb, 0x4a, 0x8c, 0x63, 0x3b, 0xa9, 0xe3, 0x39, 0xbd, 0xde, 0x6f, 0x81, 0x96, 0xce, 0x76, 0x10, 0xb3, 0x8b, 0x0b, 0xa0, 0x5d, 0x4f, 0x8c, 0xc9, 0x7a, 0x54, 0x62, 0x8e, 0x84, 0x26, 0x47, 0xab, + 0xc0, 0xfd, 0xe3, 0x78, 0xac, 0xa7, 0x0e, 0xb4, 0x7f, 0x66, 0x52, 0x7d, 0x53, 0x46, 0x24, 0x53, 0x75, 0x73, 0x60, 0x36, 0x89, 0x1a, 0xbd, 0x83, 0xd2, 0xd5, 0x9e, 0xfc, 0x69, 0x1b, 0x9e, 0xff, + 0x5b, 0xdf, 0xd1, 0x70, 0x1f, 0x3a, 0x48, 0xcf, 0x2b, 0xf9, 0xcf, 0x43, 0x76, 0xde, 0x89, 0xbe, 0x8f, 0x85, 0x9b, 0x17, 0x9d, 0xbd, 0xdf, 0x23, 0x4c, 0x67, 0xc6, 0x91, 0x11, 0xbf, 0x97, 0xb3, + 0xdd, 0x98, 0x9a, 0xae, 0x94, 0xad, 0x88, 0x36, 0xa6, 0xb2, 0x1d, 0x59, 0x21, 0xb7, 0x1e, 0xdb, 0x78, 0x74, 0xe4, 0xc3, 0x25, 0x2b, 0xea, 0x76, 0xbe, 0x34, 0xd5, 0x55, 0x5e, 0x6c, 0xc0, 0xfd, + 0x9a, 0x3e, 0x24, 0xf3, 0x3c, 0x1b, 0xae, 0x1d, 0xc9, 0x71, 0x24, 0x1b, 0xb7, 0x80, 0xb4, 0x58, 0x12, 0xa5, 0xab, 0x00, 0x9b, 0x7d, 0xe3, 0xd3, 0x47, 0xdd, 0x5e, 0x48, 0xab, 0xef, 0x7b, 0x33, + 0x84, 0xdf, 0xc9, 0xd7, 0x17, 0x14, 0xa2, 0x4e, 0xac, 0x5e, 0xc4, 0x69, 0x0f, 0x77, 0x62, 0x3e, 0xf7, 0x37, 0x0d, 0x70, 0xf0, 0xb8, 0x22, 0xa4, 0x70, 0x4e, 0x42, 0x46, 0x31, 0x85, 0xcd, 0xc6, + 0xb3, 0xe9, 0x6a, 0x36, 0x51, 0x14, 0x4c, 0xc0, 0xa4, 0xd4, 0x9c, 0xaf, 0xa5, 0x49, 0x85, 0x13, 0x85, 0x08, 0x78, 0x1a, 0x5a, 0xf9, 0xe0, 0xae, 0x55, 0xd9, 0xe3, 0x06, 0xda, 0x88, 0x6c, 0x7b, + 0x2c, 0xc2, 0x95, 0xc0, 0x41, 0x1a, 0xa0, 0x1a, 0x7b, 0x71, 0x5a, 0x69, 0x39, 0xbc, 0x99, 0xaa, 0x0c, 0xf2, 0xfd, 0x07, 0x9f, 0x4f, 0x06, 0x71, 0x3e, 0x28, 0x0b, 0xf7, 0x9b, 0xea, 0xff, 0xe8, + 0x0b, 0x03, 0x7f, 0x45, 0x19, 0x1c, 0x5c, 0x9f, 0x77, 0x15, 0xd6, 0x7a, 0xb0, 0x80, 0xb6, 0x58, 0x2e, 0x02, 0x1f, 0x70, 0x28, 0x60, 0x04, 0x52, 0x62, 0x54, 0xa2, 0xf9, 0x96, 0x2b, 0x66, 0x38, + 0x39, 0x72, 0x6b, 0x52, 0x04, 0x97, 0x7e, 0x4e, 0x3b, 0x2c, 0x67, 0x92, 0xe5, 0x94, 0x9f, 0x43, 0x6b, 0xe7, 0xb4, 0x98, 0x8f, 0x9c, 0x15, 0x87, 0x5b, 0x9a, 0xde, 0x96, 0x30, 0xa1, 0xad, 0x4b, + 0xd5, 0x0b, 0xe4, 0x63, 0x24, 0x04, 0x1e, 0xb4, 0x70, 0xe8, 0x18, 0x49, 0x47, 0x3e, 0x64, 0x6a, 0xdf, 0x3b, 0xbe, 0xce, 0x27, 0xe1, 0xc3, 0x3d, 0x9c, 0xb3, 0x4a, 0xfe, 0xf3, 0xca, 0x72, 0x6f, + 0x34, 0xdf, 0x50, 0x08, 0xe3, 0xa8, 0x53, 0xed, 0x7b, 0x54, 0x98, 0x93, 0x98, 0x13, 0x8b, 0x93, 0x54, 0x6d, 0x47, 0xa6, 0x4e, 0xee, 0x4f, 0x4c, 0x06, 0xfb, 0x3a, 0x31, 0x8d, 0xc3, 0xad, 0x83, + 0xe5, 0x9e, 0xb8, 0x25, 0xe2, 0x9d, 0x45, 0x88, 0xf9, 0x3c, 0x13, 0x42, 0x86, 0x6e, 0x48, 0x70, 0x1f, 0xba, 0xf3, 0x39, 0x39, 0x05, 0x43, 0x0e, 0x1d, 0x97, 0xa2, 0xc5, 0x9b, 0xb3, 0xda, 0xe0, + 0xc7, 0x55, 0x96, 0x6e, 0x53, 0x70, 0xc7, 0xac, 0xa0, 0x66, 0x61, 0xb6, 0xb3, 0xf5, 0x33, 0x69, 0xf4, 0xac, 0x79, 0xec, 0x37, 0xd1, 0xd8, 0x4e, 0xec, 0xbb, 0x86, 0x7a, 0xb1, 0x9f, 0xd1, 0xab, + 0xb6, 0xd7, 0xdd, 0xff, 0x69, 0xa5, 0xfd, 0xf1, 0xd3, 0x55, 0xc7, 0xee, 0x7b, 0x45, 0x51, 0xef, 0xf6, 0x6e, 0xfa, 0xb6, 0x69, 0x60, 0x92, 0x17, 0x99, 0x69, 0xfe, 0xce, 0xcc, 0xb0, 0xfd, 0x24, + 0x28, 0x3f, 0xdd, 0xf0, 0xc9, 0xba, 0x1f, 0xfe, 0x1e, 0x5d, 0xd3, 0xce, 0xcb, 0x24, 0x89, 0xb3, 0x22, 0x1f, 0xe8, 0x71, 0x10, 0xbf, 0xdf, 0x33, 0xbc, 0x76, 0x92, 0x17, 0x71, 0xf9, 0xf1, 0xec, + 0x9b, 0x8d, 0x92, 0x32, 0x32, 0x4c, 0x2b, 0x57, 0xad, 0x3f, 0xbb, 0xf8, 0x57, 0x9d, 0x46, 0xcb, 0xa4, 0xab, 0x48, 0x11, 0xc5, 0x85, 0x6b, 0xb9, 0x6f, 0xaf, 0x80, 0x5d, 0xd5, 0x10, 0xfe, 0x80, + 0xf7, 0x8b, 0x5a, 0xfe, 0x87, 0x23, 0x3b, 0x9b, 0xf5, 0xed, 0xf4, 0x15, 0x0d, 0x9d, 0xb8, 0xf6, 0xcd, 0x7d, 0xfc, 0xdb, 0xb7, 0x1e, 0xfb, 0x38, 0x31, 0x23, 0x3d, 0x0e, 0x02, 0x53, 0x2f, 0xdc, + 0xca, 0xbc, 0xfa, 0xa8, 0x6b, 0x1f, 0xc6, 0xf5, 0x8d, 0x9d, 0x2f, 0xe3, 0xfd, 0xd5, 0xdf, 0x9f, 0xf8, 0x74, 0xda, 0x5d, 0x3b, 0x2f, 0xde, 0x39, 0xe6, 0xbe, 0x6e, 0x80, 0xbc, 0x30, 0x13, 0x3b, + 0x8a, 0xe0, 0xe0, 0xf2, 0x77, 0xd0, 0xd1, 0x78, 0x3e, 0x0b, 0x27, 0x33, 0xef, 0x24, 0xcb, 0x94, 0x8b, 0x89, 0x8e, 0xe5, 0x6e, 0x2b, 0xf7, 0x94, 0xcd, 0xb6, 0x66, 0x25, 0x8a, 0x12, 0x53, 0x44, + 0x93, 0xf4, 0x68, 0x99, 0xa3, 0x06, 0xa6, 0x1c, 0x7b, 0x9a, 0xeb, 0xe2, 0x09, 0x57, 0xb4, 0x95, 0x66, 0xc5, 0xab, 0xdd, 0x6a, 0x53, 0xda, 0xe2, 0xb6, 0x1d, 0x17, 0x0e, 0x6e, 0x11, 0xca, 0x74, + 0x77, 0xd8, 0x0b, 0xed, 0x91, 0x99, 0xd1, 0xe0, 0xe8, 0x58, 0x62, 0x05, 0x2c, 0x3d, 0x53, 0xaf, 0xbe, 0x51, 0x7c, 0xf3, 0x37, 0x1e, 0x83, 0x7b, 0xb9, 0xb1, 0xef, 0x22, 0xfb, 0xa4, 0x51, 0xce, + 0x6b, 0xf1, 0x1f, 0xf7, 0x1a, 0xe5, 0xf4, 0x8a, 0xfc, 0x28, 0x8c, 0xdd, 0x1e, 0x9d, 0xcc, 0x95, 0xcc, 0x5d, 0x1e, 0x43, 0x8b, 0x9f, 0x5b, 0x41, 0xcc, 0x10, 0xa3, 0xe0, 0x50, 0x56, 0xd0, 0xbf, + 0x5d, 0x07, 0xbd, 0x0b, 0xcf, 0xb7, 0x5e, 0xb3, 0x6b, 0xd1, 0xd1, 0x17, 0x9c, 0x5b, 0xaf, 0x59, 0x47, 0xe5, 0x39, 0xef, 0xe5, 0x6a, 0xa9, 0xd2, 0x16, 0xb8, 0x51, 0x8c, 0x83, 0x9d, 0xad, 0x44, + 0x5e, 0x66, 0x76, 0x45, 0x22, 0xa9, 0xb0, 0xbb, 0x73, 0x59, 0x5d, 0x35, 0x35, 0x97, 0xdd, 0xc2, 0xe3, 0xa5, 0x91, 0x6c, 0x83, 0x23, 0x83, 0x04, 0x93, 0xca, 0x6c, 0xb6, 0x86, 0x34, 0x1c, 0xe6, + 0xd1, 0x66, 0xd6, 0xb2, 0xa3, 0xed, 0x29, 0x29, 0x8d, 0x54, 0x9b, 0x2c, 0xa0, 0x54, 0x9a, 0x59, 0x6b, 0x35, 0x67, 0x8c, 0x96, 0xa7, 0xe7, 0xcf, 0x78, 0xaf, 0x97, 0xd7, 0xec, 0x65, 0x6c, 0x6f, + 0x05, 0xed, 0x7d, 0x8c, 0x87, 0x2f, 0x30, 0xe0, 0x35, 0xe9, 0x33, 0xd6, 0x57, 0x17, 0x06, 0x1d, 0xd5, 0xe7, 0x98, 0x6f, 0xbd, 0x83, 0x57, 0x1b, 0xd2, 0xa2, 0xc0, 0x20, 0x82, 0x5b, 0xb8, 0x54, + 0x3a, 0x91, 0xb0, 0x78, 0xcf, 0xe6, 0xf6, 0x1e, 0x99, 0xa6, 0xd4, 0xfc, 0x94, 0x23, 0x9b, 0xc4, 0x0f, 0x31, 0x75, 0x2b, 0x6b, 0x5e, 0x08, 0x28, 0xd3, 0xe3, 0x54, 0x3f, 0x62, 0x82, 0x35, 0xe3, + 0xc5, 0x0c, 0x2b, 0x39, 0x5e, 0x09, 0x55, 0xc8, 0x6c, 0x31, 0x6b, 0x18, 0xd8, 0xab, 0xcc, 0x1f, 0x43, 0xaa, 0x04, 0x6d, 0xb9, 0xbf, 0xd1, 0x0c, 0xf5, 0xd3, 0x5c, 0x7d, 0xb5, 0x7d, 0x60, 0xbf, + 0x89, 0x90, 0x7c, 0x5b, 0x8b, 0xfc, 0xe7, 0xc3, 0x71, 0xa6, 0xd8, 0xe9, 0x3c, 0x49, 0xd1, 0xab, 0x36, 0x0b, 0x3c, 0xd0, 0x0c, 0xc8, 0xa9, 0x84, 0xb8, 0xd9, 0x4a, 0xa5, 0xa0, 0x47, 0xe8, 0xc1, + 0xb1, 0xdc, 0x90, 0x40, 0xe5, 0x05, 0x0e, 0x3c, 0x71, 0x05, 0x7e, 0x13, 0xda, 0xa0, 0x69, 0x59, 0x77, 0xff, 0x5f, 0x7d, 0xc2, 0xea, 0xde, 0x40, 0x78, 0x5b, 0x68, 0x93, 0xe2, 0xe7, 0xab, 0x6c, + 0x1f, 0x4b, 0x2b, 0x8a, 0xb3, 0x50, 0x0d, 0xdc, 0xd3, 0xb7, 0xde, 0xe4, 0xd7, 0x64, 0xf0, 0x35, 0xe9, 0x0e, 0xfd, 0xcf, 0x17, 0xfa, 0xc8, 0xe3, 0xf3, 0x14, 0xc0, 0x4d, 0x25, 0x1f, 0xae, 0x72, + 0xf4, 0x58, 0x4c, 0xdc, 0x9c, 0x39, 0x26, 0xa4, 0x80, 0xcc, 0xf7, 0x2d, 0x61, 0xa4, 0x7e, 0x32, 0x77, 0xb1, 0xf1, 0x41, 0x38, 0xa1, 0x73, 0x35, 0x75, 0xa7, 0xb8, 0x79, 0x2a, 0x35, 0x68, 0x08, + 0x23, 0x53, 0xe1, 0x54, 0x48, 0xfb, 0x7a, 0x3f, 0xc6, 0x27, 0xf8, 0x82, 0xd5, 0xb6, 0xbe, 0x8c, 0x6c, 0x22, 0x0d, 0x0c, 0x69, 0xec, 0x28, 0xc7, 0xde, 0x64, 0x57, 0xeb, 0xf5, 0xea, 0x99, 0xe2, + 0xf9, 0x4f, 0xed, 0x2c, 0xfe, 0xf9, 0xe4, 0x8b, 0x86, 0x72, 0x0f, 0x5d, 0xec, 0xf7, 0xf0, 0x05, 0x21, 0x7e, 0x45, 0xf9, 0x0a, 0xdc, 0x32, 0x0b, 0x06, 0x1d, 0xcd, 0xe7, 0xd8, 0x92, 0x7b, 0x65, + 0x32, 0xdb, 0x31, 0x5b, 0x83, 0xcf, 0x2c, 0x31, 0x99, 0xdb, 0x04, 0x00, 0x2f, 0xf8, 0x85, 0x4d, 0xa2, 0x63, 0xfc, 0x34, 0x85, 0x54, 0x89, 0x3b, 0xcc, 0xfc, 0x1a, 0x3e, 0xce, 0xea, 0x6a, 0x8d, + 0x09, 0x81, 0xd2, 0xd6, 0x7b, 0x5c, 0x5d, 0xd9, 0xc3, 0xb5, 0x05, 0x51, 0x09, 0xb8, 0xb1, 0x75, 0x4d, 0xa8, 0xb1, 0x15, 0xdf, 0x54, 0xdc, 0x51, 0xe2, 0xcc, 0xd2, 0xae, 0xb9, 0x89, 0x04, 0x51, + 0x7f, 0x13, 0xdb, 0x3e, 0x81, 0x54, 0x6f, 0x99, 0xe3, 0x6a, 0x9e, 0xbb, 0xf6, 0x23, 0xfb, 0x08, 0x7b, 0xa9, 0x56, 0xd8, 0x15, 0x65, 0x70, 0x70, 0x7d, 0xde, 0x85, 0xf0, 0x3e, 0xad, 0x18, 0xb6, + 0xd8, 0x86, 0x45, 0x33, 0x54, 0x64, 0x87, 0x00, 0x29, 0x69, 0x55, 0xed, 0xb7, 0x79, 0xb6, 0xa8, 0x46, 0x39, 0x32, 0x99, 0x73, 0xfd, 0xbd, 0xb1, 0xbd, 0x39, 0xec, 0xed, 0x05, 0xdd, 0x28, 0x4f, + 0xbe, 0x2d, 0xb5, 0xfa, 0x4a, 0x76, 0xf3, 0x35, 0xed, 0x3f, 0x68, 0xbc, 0x5d, 0x18, 0x5c, 0xc8, 0x3e, 0x67, 0x33, 0x73, 0x18, 0x4e, 0x96, 0x81, 0xc0, 0x8c, 0x92, 0x98, 0xe2, 0xad, 0x09, 0x71, + 0x22, 0x04, 0x32, 0x27, 0x05, 0x64, 0xc1, 0x0f, 0x41, 0x4c, 0xd1, 0x50, 0x55, 0x41, 0x51, 0x6b, 0x98, 0x13, 0x72, 0x1a, 0xab, 0xa7, 0xc9, 0xec, 0xc4, 0xaf, 0x82, 0x78, 0xb5, 0x27, 0xb2, 0xe1, + 0x61, 0x32, 0x07, 0xe6, 0xa3, 0x63, 0x9c, 0xae, 0x2a, 0x8a, 0x52, 0xe2, 0x03, 0xa7, 0xb7, 0x68, 0x91, 0x80, 0xa8, 0x04, 0x6d, 0xae, 0x83, 0x93, 0x5e, 0xdd, 0xd8, 0xec, 0x9d, 0x1f, 0xf0, 0xfe, + 0xe5, 0xdf, 0x6d, 0x53, 0xfd, 0xdc, 0x33, 0xf1, 0x41, 0xf5, 0x13, 0xb6, 0x79, 0xdf, 0xdc, 0x31, 0x54, 0x6f, 0xe9, 0xbc, 0x65, 0xec, 0x22, 0x74, 0x47, 0x8b, 0x11, 0x6d, 0x09, 0xc2, 0x02, 0x59, + 0xd1, 0x09, 0x2e, 0xb0, 0x48, 0x50, 0x57, 0x85, 0x66, 0x43, 0x09, 0xb4, 0x83, 0x4d, 0x68, 0x57, 0x89, 0xe9, 0x6c, 0xa8, 0x9b, 0xf3, 0x06, 0x60, 0x11, 0xc3, 0x12, 0xbc, 0x10, 0xd6, 0x58, 0x9a, + 0x3b, 0x4c, 0x66, 0x53, 0x9a, 0xda, 0x56, 0x2d, 0x10, 0x13, 0x3a, 0xae, 0x8e, 0x0e, 0xa5, 0xb7, 0x36, 0x8c, 0xd7, 0x75, 0x83, 0x27, 0x29, 0x62, 0x86, 0x69, 0xb9, 0x91, 0x39, 0x48, 0xb2, 0x38, + 0x31, 0xb3, 0xe2, 0xf2, 0xdf, 0x17, 0xbb, 0xf8, 0x4e, 0x0d, 0xc8, 0xe7, 0xde, 0xf2, 0xff, 0x44, 0x8a, 0xd7, 0xdb, 0x08, 0x7d, 0x1b, 0x82, 0xf3, 0x37, 0x64, 0xce, 0x5b, 0xfc, 0xcd, 0xa7, 0xb3, + 0xbe, 0x65, 0x8c, 0xf9, 0x92, 0x9a, 0x0a, 0xfb, 0xf5, 0x9e, 0xcb, 0x82, 0x85, 0xb4, 0xb6, 0x18, 0xf6, 0x44, 0xe3, 0x5a, 0xb2, 0x29, 0xd1, 0x42, 0x2e, 0xd0, 0xa6, 0xf2, 0x78, 0x63, 0xb7, 0xd8, + 0x02, 0x33, 0x53, 0x84, 0x02, 0x5e, 0xc3, 0x58, 0xe2, 0xb8, 0x1b, 0x41, 0x13, 0x95, 0x6e, 0x9c, 0x92, 0xb7, 0x4b, 0x01, 0x91, 0xe6, 0xc0, 0xdc, 0xf3, 0x5b, 0xae, 0x5e, 0x9f, 0x72, 0x7e, 0xa8, + 0xf8, 0xc5, 0x22, 0xb4, 0x9c, 0xd5, 0xcb, 0xf5, 0x22, 0x9f, 0x01, 0xf8, 0xfb, 0xa9, 0xd8, 0xfe, 0xb9, 0x7b, 0xf3, 0x8a, 0xf2, 0x07, 0x88, 0xbf, 0x3f, 0x89, 0xed, 0x1e, 0x4e, 0x4f, 0xb7, 0x11, + 0x91, 0xd5, 0x50, 0x64, 0xa4, 0x9c, 0x4a, 0x5a, 0x77, 0xbf, 0x91, 0xd9, 0xf0, 0x08, 0x20, 0x53, 0x26, 0x91, 0x24, 0x73, 0xb8, 0x70, 0x51, 0x0e, 0xb0, 0x30, 0x13, 0x50, 0x97, 0x33, 0x8a, 0x51, + 0xe3, 0xa1, 0x1a, 0xce, 0x76, 0x47, 0x7c, 0x09, 0xad, 0xd7, 0xb8, 0x0e, 0xae, 0xf6, 0xc4, 0xd8, 0xc4, 0x46, 0x65, 0x31, 0x69, 0x90, 0xf9, 0x8a, 0x20, 0x9d, 0x66, 0x3e, 0xc6, 0x25, 0x21, 0x64, + 0xcb, 0x97, 0xab, 0x07, 0x40, 0x7d, 0x67, 0xcf, 0xa7, 0xdb, 0xee, 0x67, 0x50, 0x7e, 0xba, 0xe1, 0x9a, 0x85, 0xff, 0x4e, 0xe3, 0xe5, 0xff, 0xc4, 0xfc, 0x8b, 0x06, 0x91, 0x59, 0x0c, 0x02, 0x37, + 0x2f, 0xcc, 0x47, 0xec, 0xf3, 0x5a, 0xb8, 0xc0, 0x15, 0xe5, 0x33, 0xfb, 0x7c, 0x3e, 0xef, 0x13, 0x3a, 0xd0, 0xed, 0xd7, 0xc0, 0xcc, 0x4e, 0x6e, 0x89, 0x1c, 0xdc, 0x05, 0xfa, 0xb8, 0xa2, 0xf7, + 0x35, 0x2b, 0x09, 0xa1, 0xbf, 0xa6, 0x39, 0xa3, 0xc1, 0x58, 0xa1, 0x5c, 0x54, 0x41, 0x3c, 0x89, 0xb6, 0xf2, 0x12, 0x59, 0x19, 0xe3, 0xf1, 0x04, 0x56, 0x73, 0x19, 0x63, 0x0a, 0xcb, 0x91, 0x6a, + 0x13, 0xdd, 0x1f, 0xfd, 0x68, 0xa5, 0xfa, 0x94, 0xa8, 0xd0, 0x91, 0x76, 0x72, 0x0a, 0x64, 0xe1, 0xd5, 0x28, 0x07, 0x4f, 0xd3, 0xd9, 0x4f, 0x5a, 0x4d, 0x90, 0xbf, 0xb1, 0xdf, 0xd0, 0xaf, 0xff, + 0xf3, 0xff, 0xfc, 0xf5, 0x2f, 0xe2, 0x37, 0xd9, 0x6f, 0x42, 0x5e, 0x5a, 0xc0, 0xdc, 0x07, 0xf2, 0x95, 0x8a, 0xc5, 0x67, 0x82, 0x1d, 0x7e, 0xba, 0x39, 0x80, 0x9f, 0x57, 0x27, 0x86, 0x07, 0x47, + 0x3a, 0x57, 0x13, 0xf4, 0x78, 0x64, 0xf6, 0xf9, 0x6e, 0x9d, 0xcf, 0xc8, 0x68, 0x36, 0xc1, 0x47, 0x43, 0x54, 0x52, 0xc9, 0xfb, 0x49, 0x5c, 0x3d, 0xa6, 0xd2, 0xcf, 0xba, 0xd7, 0xc4, 0x95, 0x99, + 0x05, 0xb1, 0x6a, 0x9c, 0xe7, 0x56, 0x61, 0x7e, 0x5f, 0x38, 0x14, 0x79, 0x45, 0xb8, 0x7f, 0xa5, 0x7f, 0x06, 0xe8, 0xeb, 0xd5, 0x6e, 0x2f, 0xaa, 0x87, 0xb0, 0x57, 0x17, 0x6b, 0x3b, 0x1d, 0x49, + 0x76, 0x60, 0xf8, 0xe3, 0x15, 0xa9, 0x27, 0x43, 0xcf, 0xa7, 0xc0, 0xd0, 0xe2, 0xa9, 0xd2, 0xf5, 0x21, 0x5e, 0xa9, 0x0e, 0xea, 0x38, 0x48, 0x96, 0x8e, 0x20, 0x02, 0x96, 0x99, 0xa4, 0x68, 0x2d, + 0x53, 0x61, 0xbc, 0xdd, 0x25, 0x4b, 0xcf, 0x9a, 0xe3, 0x94, 0x3c, 0xac, 0x6b, 0x31, 0x9e, 0xc7, 0xfb, 0x4d, 0x8e, 0x9b, 0x9b, 0x4d, 0x6d, 0x59, 0x0e, 0x9c, 0x62, 0x11, 0xd0, 0x33, 0x32, 0x50, + 0x2d, 0x8b, 0x58, 0x57, 0xa3, 0xe8, 0x6d, 0xfb, 0x0f, 0xbb, 0xca, 0x58, 0xfa, 0xf5, 0xeb, 0xaf, 0xcf, 0xa1, 0xba, 0xef, 0x4d, 0x3e, 0x9f, 0x0f, 0x41, 0x32, 0xd0, 0xd5, 0x48, 0x37, 0xbf, 0xaf, + 0x27, 0xff, 0x4a, 0x30, 0xe0, 0x67, 0xc2, 0xe0, 0xe0, 0xea, 0xb4, 0x6f, 0xeb, 0x93, 0x7c, 0x84, 0x4a, 0xcd, 0x5a, 0xc1, 0x4e, 0x49, 0x01, 0x9b, 0x86, 0x22, 0x2b, 0xa7, 0xca, 0x49, 0x67, 0x2a, + 0x5e, 0x56, 0x5b, 0x1d, 0xae, 0xea, 0xbd, 0x0a, 0xb1, 0xd0, 0xd8, 0x28, 0x16, 0x8a, 0xbd, 0xe5, 0xa8, 0xa5, 0x47, 0x2e, 0x34, 0x53, 0x63, 0x80, 0xa5, 0x6f, 0xb3, 0x8a, 0x4e, 0x3a, 0xc0, 0x18, + 0x1a, 0x6e, 0x58, 0x66, 0xb5, 0x16, 0x03, 0x4c, 0xf5, 0xe6, 0xf0, 0x38, 0xe4, 0xb3, 0x83, 0x72, 0x1b, 0x57, 0xff, 0x53, 0x0b, 0xa9, 0x4f, 0xa4, 0xc0, 0x4d, 0x56, 0xcb, 0x3d, 0x4c, 0xf1, 0x97, + 0x1c, 0x5b, 0x9f, 0x09, 0x9f, 0x31, 0xfd, 0x74, 0x3a, 0xc0, 0xfb, 0x39, 0xb5, 0x7c, 0x54, 0x33, 0x42, 0x24, 0x42, 0x86, 0x85, 0xdf, 0x36, 0xba, 0x27, 0xb0, 0xa7, 0xf1, 0xb0, 0x21, 0x7c, 0xeb, + 0xd0, 0x04, 0x9c, 0x61, 0xe7, 0xda, 0x26, 0x83, 0xe6, 0xbe, 0xa2, 0xd7, 0x4c, 0xbe, 0x4a, 0x34, 0x15, 0xd7, 0xc7, 0x5e, 0x3a, 0x29, 0x60, 0x36, 0xd0, 0x27, 0x0e, 0x3b, 0xad, 0x1a, 0x66, 0xa1, + 0x8b, 0x63, 0x78, 0x76, 0xe0, 0xca, 0x3a, 0x76, 0x3d, 0x05, 0xc1, 0x1b, 0xb3, 0x19, 0x72, 0xcf, 0x1c, 0x89, 0xdf, 0x94, 0xdd, 0x8c, 0x2f, 0x7b, 0x3c, 0xe4, 0x55, 0x88, 0x55, 0x87, 0xc8, 0xe5, + 0xeb, 0x07, 0x6a, 0x59, 0x38, 0x83, 0x22, 0xf6, 0xcd, 0x77, 0xb6, 0xff, 0x92, 0xb1, 0xf0, 0x76, 0xe3, 0xdb, 0x6a, 0xf7, 0xaf, 0xe1, 0xed, 0x1d, 0x57, 0xc1, 0x9c, 0xc8, 0x0b, 0x6e, 0xb3, 0x3e, + 0x56, 0xf1, 0xd5, 0xd0, 0xf4, 0x77, 0x22, 0xff, 0x4f, 0xe8, 0xe5, 0x0f, 0x42, 0x2f, 0xdf, 0xfa, 0x14, 0xdf, 0x97, 0x51, 0xd0, 0x6f, 0xf8, 0xe7, 0x0b, 0xc4, 0x99, 0x62, 0x37, 0x91, 0xfc, 0xf8, + 0xe2, 0x9a, 0xec, 0xb1, 0x06, 0x60, 0xce, 0x6a, 0x4c, 0x6c, 0x5a, 0xec, 0xa4, 0xe8, 0xe6, 0x30, 0xc7, 0x5a, 0x83, 0x94, 0x4e, 0x71, 0x92, 0xd6, 0x87, 0x0a, 0x6c, 0xe7, 0xbc, 0x73, 0x80, 0xc7, + 0x01, 0xc1, 0x8b, 0xe1, 0x24, 0x85, 0x47, 0x38, 0xca, 0x98, 0x2c, 0x02, 0x4c, 0xeb, 0x83, 0x58, 0x01, 0x81, 0x39, 0x37, 0x57, 0x30, 0x4a, 0x47, 0x0e, 0x52, 0x5b, 0x5a, 0x1a, 0xd7, 0x87, 0x8d, + 0x34, 0x59, 0xac, 0xa1, 0x13, 0x56, 0xa8, 0xf2, 0xf7, 0xdb, 0xf3, 0x97, 0xaa, 0x66, 0x5d, 0x9d, 0x8f, 0x38, 0x28, 0x8b, 0x7f, 0x36, 0xf8, 0xe8, 0x96, 0x78, 0x87, 0xc7, 0xf5, 0xa5, 0x3e, 0x01, + 0x48, 0xf0, 0x60, 0x06, 0x95, 0x82, 0xca, 0xf0, 0x07, 0x7e, 0x03, 0x10, 0x66, 0x3e, 0xcc, 0x48, 0x31, 0x51, 0x23, 0xa7, 0xd0, 0x25, 0x98, 0xf8, 0x5b, 0x22, 0xb7, 0xb7, 0x3b, 0xa6, 0x7b, 0xed, + 0xf7, 0x1c, 0xea, 0x47, 0x00, 0xfd, 0x7c, 0xb3, 0xf0, 0x0f, 0xd9, 0x77, 0x68, 0xba, 0x93, 0x0e, 0x94, 0x1e, 0xdb, 0x86, 0x2b, 0x7a, 0x79, 0xda, 0x1c, 0xa6, 0xd3, 0xe9, 0x66, 0x07, 0xb4, 0x18, + 0x71, 0x22, 0x51, 0x0a, 0x9a, 0x1a, 0x50, 0x2b, 0x69, 0x44, 0x42, 0x8d, 0xdb, 0xf9, 0x31, 0x06, 0xfd, 0xa1, 0x2c, 0x1b, 0xb2, 0x9d, 0xc8, 0x08, 0x88, 0x4c, 0xf3, 0x75, 0xee, 0xe7, 0xcb, 0x2c, + 0x1d, 0x05, 0x6b, 0xa6, 0xc9, 0xda, 0xec, 0xb0, 0x8e, 0x60, 0xd3, 0x9b, 0xe3, 0x31, 0x95, 0x10, 0xaa, 0x53, 0xad, 0x17, 0x5b, 0x9a, 0x78, 0xd4, 0x58, 0xfd, 0x1b, 0x6c, 0x5c, 0x3d, 0xfe, 0x2e, + 0xc6, 0x0a, 0x79, 0x49, 0x10, 0x7d, 0x50, 0x3d, 0x23, 0xf3, 0x7e, 0x3c, 0x40, 0xfa, 0x89, 0xa3, 0x40, 0x86, 0xb7, 0xe0, 0xc6, 0x5d, 0xce, 0x27, 0xc8, 0x69, 0x5d, 0x81, 0x27, 0x94, 0x84, 0x8f, + 0x6b, 0x91, 0x06, 0x14, 0x08, 0xd1, 0x26, 0x76, 0x3e, 0xb3, 0xaa, 0x26, 0x96, 0x24, 0x0b, 0x77, 0x46, 0x7e, 0x45, 0xc6, 0xc0, 0x31, 0xcc, 0xc3, 0x93, 0x9c, 0x66, 0x54, 0x2d, 0xe3, 0x68, 0xce, + 0xdb, 0xeb, 0x66, 0x8a, 0x35, 0x53, 0x23, 0x85, 0x8e, 0xed, 0x3e, 0x92, 0x2c, 0xd6, 0x1c, 0x67, 0x42, 0x25, 0x3f, 0x13, 0x47, 0xcf, 0x44, 0xfd, 0xa7, 0x50, 0xc0, 0x8f, 0xff, 0x79, 0xd5, 0xb8, + 0xf2, 0xe2, 0x28, 0xd7, 0x9d, 0xc0, 0x8d, 0x7c, 0x33, 0x2b, 0xfa, 0xf0, 0xaf, 0x1b, 0x3d, 0x92, 0x6f, 0xf8, 0x6f, 0x18, 0x7d, 0xc1, 0x89, 0x78, 0xa6, 0xd8, 0x0d, 0x4d, 0x14, 0x0f, 0x2e, 0x24, + 0x9e, 0x0f, 0x4b, 0xb1, 0x6c, 0xf1, 0xf4, 0x60, 0xfb, 0x0e, 0xc9, 0xd5, 0xbc, 0x9d, 0x4a, 0x30, 0x18, 0xcb, 0x2e, 0x6a, 0x3a, 0x56, 0x80, 0xc8, 0x24, 0x03, 0x95, 0x4c, 0x3b, 0x9d, 0x72, 0xf9, + 0xd8, 0x1c, 0x61, 0xac, 0x1b, 0x4d, 0x85, 0x85, 0x67, 0x70, 0x19, 0xb7, 0xa5, 0x8f, 0x89, 0xae, 0x6c, 0x92, 0x8d, 0xab, 0xdb, 0xe8, 0xe1, 0x80, 0x0e, 0x0d, 0x70, 0xbe, 0xda, 0x2a, 0x61, 0x8c, + 0x6d, 0xed, 0x3d, 0x22, 0xf9, 0x3d, 0x83, 0x39, 0xbb, 0x6c, 0xc6, 0xcc, 0x34, 0xde, 0x6b, 0x19, 0xa1, 0xb7, 0x6b, 0x79, 0x77, 0x43, 0xae, 0x5a, 0xe6, 0x5b, 0x72, 0xa2, 0x6b, 0x5d, 0x62, 0x3c, + 0x90, 0xdf, 0xd0, 0x6f, 0xe2, 0xf6, 0xc6, 0xa7, 0x59, 0xa9, 0x56, 0xa0, 0x16, 0x79, 0x71, 0x51, 0x0d, 0x3a, 0x11, 0x77, 0xe5, 0x35, 0xeb, 0x50, 0xcb, 0x0b, 0x63, 0x90, 0x9b, 0x99, 0xdb, 0xb9, + 0xf7, 0xdf, 0x6a, 0x83, 0x7f, 0x89, 0xfa, 0x48, 0x4b, 0x57, 0xf7, 0x07, 0x56, 0x9c, 0x85, 0x6a, 0x31, 0x28, 0x23, 0x33, 0xd7, 0xd5, 0xe4, 0x32, 0x36, 0x9d, 0xbe, 0x72, 0xe5, 0x26, 0xc8, 0xe3, + 0xc8, 0xd5, 0x07, 0x5a, 0x1c, 0x87, 0x7f, 0xfd, 0xd7, 0xe3, 0x9a, 0x5e, 0x5f, 0x56, 0xcd, 0x37, 0xde, 0xe8, 0xdf, 0x1a, 0xe7, 0xc1, 0xdb, 0xdf, 0x63, 0x2e, 0xf4, 0xa5, 0x24, 0xbe, 0x7b, 0x0f, + 0x78, 0xe7, 0xb5, 0x9b, 0xcb, 0x5d, 0x84, 0x45, 0x0f, 0x89, 0x30, 0x4d, 0x25, 0x2c, 0xa9, 0xe9, 0x4d, 0x56, 0xa0, 0x5c, 0xb9, 0xa6, 0xa8, 0xfd, 0x98, 0xdb, 0x43, 0xa2, 0x3f, 0xf4, 0x77, 0xa0, + 0xac, 0x4f, 0xb8, 0xa1, 0xc5, 0x6f, 0xa6, 0x27, 0x7b, 0xb2, 0x46, 0x4e, 0xcb, 0x21, 0x63, 0x49, 0x50, 0xa5, 0xb9, 0x0c, 0xc9, 0x68, 0x4b, 0x3b, 0x88, 0x5a, 0x73, 0x9b, 0xf3, 0x24, 0xce, 0x9e, + 0x22, 0xd5, 0xc4, 0xb9, 0x23, 0x8d, 0x8d, 0x12, 0x65, 0x3c, 0x54, 0x2b, 0x31, 0xfb, 0x3e, 0xce, 0x2b, 0xc9, 0x3a, 0x66, 0x1c, 0x9c, 0x3f, 0xf4, 0xa1, 0x68, 0x7c, 0x65, 0x07, 0xee, 0x33, 0xe1, + 0x33, 0x2c, 0x9f, 0x4e, 0xfb, 0x65, 0x74, 0xe0, 0xc2, 0x16, 0xaa, 0x70, 0x29, 0xf5, 0xc6, 0x11, 0xc4, 0xf0, 0xe0, 0x9e, 0x32, 0x8c, 0x71, 0x4c, 0xd8, 0x0a, 0xb2, 0xd4, 0xff, 0x96, 0x88, 0xeb, + 0xe3, 0x9b, 0x48, 0x32, 0xb3, 0x28, 0xda, 0x81, 0xd6, 0x16, 0xe6, 0x23, 0xa6, 0x19, 0xbe, 0x94, 0x14, 0xf1, 0x99, 0xf0, 0x05, 0x95, 0x8f, 0xd3, 0xc1, 0xb0, 0x5f, 0x92, 0xc4, 0x6c, 0x56, 0x43, + 0x28, 0x29, 0x86, 0xd9, 0x38, 0x9d, 0xb1, 0x44, 0xa8, 0x82, 0xa3, 0xf5, 0x0a, 0xcd, 0xe9, 0x13, 0x78, 0x68, 0x0b, 0xa3, 0x58, 0x66, 0x10, 0x86, 0x81, 0xdb, 0xfd, 0xb2, 0x60, 0xa0, 0x9a, 0x25, + 0x03, 0x8d, 0xf4, 0x56, 0x29, 0x59, 0x2c, 0xdb, 0x45, 0xb3, 0xaf, 0x8b, 0xed, 0x92, 0xa9, 0xd5, 0x0c, 0x19, 0xa7, 0x85, 0x4b, 0x61, 0xee, 0xe4, 0x28, 0xd4, 0x31, 0xb9, 0x5c, 0xf9, 0xa7, 0x1f, + 0xb9, 0x7a, 0xfe, 0xc1, 0x15, 0xe2, 0x87, 0xb9, 0x5d, 0x49, 0x16, 0xeb, 0x66, 0x9e, 0x77, 0xb5, 0xdd, 0xce, 0x12, 0x47, 0xcd, 0xec, 0x47, 0xc3, 0xf3, 0x5a, 0x79, 0xaa, 0x7b, 0x0f, 0xe8, 0x86, + 0xe9, 0xeb, 0xe5, 0xbe, 0x25, 0xab, 0xd0, 0xb8, 0xdc, 0xaf, 0x93, 0xad, 0x53, 0xd8, 0x99, 0xb6, 0x56, 0xe1, 0xd1, 0x72, 0x04, 0x94, 0xcd, 0x5a, 0x4c, 0x16, 0xa2, 0x7c, 0x54, 0xe7, 0x9b, 0x11, + 0x48, 0x39, 0xf1, 0x0e, 0x05, 0x28, 0x00, 0x84, 0x4d, 0x32, 0xf7, 0xb3, 0x93, 0x19, 0xcc, 0x5d, 0xd0, 0x90, 0x4e, 0x53, 0xb9, 0xad, 0xb4, 0xa6, 0xd4, 0xa6, 0x33, 0xfc, 0x18, 0x21, 0x6d, 0x92, + 0xeb, 0x22, 0xeb, 0xb2, 0xcb, 0xd9, 0x2c, 0x82, 0xd5, 0x07, 0x39, 0x2d, 0xdf, 0x22, 0x67, 0x67, 0x66, 0xfe, 0x1d, 0x5a, 0x2f, 0xac, 0xae, 0x6f, 0x44, 0x2f, 0x08, 0x75, 0x87, 0x1d, 0x2a, 0x3d, + 0x16, 0xd9, 0xd1, 0xc6, 0x65, 0x8a, 0x55, 0x10, 0x0c, 0x57, 0x46, 0xc4, 0x2e, 0xb8, 0x1a, 0x86, 0xa0, 0x05, 0x40, 0x34, 0x4b, 0x69, 0x37, 0xb4, 0x8f, 0xc8, 0xb6, 0x3e, 0xca, 0xbe, 0x88, 0xbb, + 0xcb, 0x4a, 0x85, 0x34, 0xc9, 0x2d, 0x14, 0x56, 0x05, 0x25, 0x2e, 0x13, 0x34, 0x23, 0xb4, 0xd1, 0x0c, 0x91, 0x22, 0xd5, 0x35, 0x4e, 0xe4, 0xb6, 0x0c, 0x0d, 0xe8, 0xb0, 0x51, 0xb9, 0x4c, 0x09, + 0x66, 0xe4, 0x81, 0xcc, 0x7f, 0xb2, 0x6b, 0x70, 0x29, 0xe3, 0xd0, 0x8b, 0xe5, 0xc2, 0x81, 0x1e, 0xb8, 0xe6, 0xe3, 0x4e, 0xaa, 0xaf, 0x35, 0x7b, 0xf9, 0x44, 0xf8, 0x82, 0xdf, 0xfb, 0xd9, 0x00, + 0xee, 0xd9, 0xf5, 0x85, 0x69, 0x44, 0x2a, 0xd3, 0x70, 0xcb, 0x5f, 0x47, 0xc5, 0x96, 0x89, 0x77, 0xf3, 0xaa, 0xc2, 0x52, 0x03, 0x1c, 0xfb, 0x71, 0xe6, 0x05, 0xae, 0x5b, 0xae, 0x91, 0x52, 0x38, + 0x4e, 0x10, 0x76, 0x02, 0x8f, 0xb8, 0xbd, 0xc8, 0xca, 0x45, 0x71, 0x34, 0xe8, 0x58, 0x92, 0xc0, 0xaa, 0x59, 0x3b, 0x5b, 0xc3, 0x8f, 0xa7, 0x93, 0x29, 0x47, 0x8e, 0xc7, 0x0c, 0x94, 0x78, 0x48, + 0x40, 0xcc, 0x09, 0xdf, 0xac, 0xf0, 0x9e, 0x65, 0x17, 0x0a, 0xc3, 0xb5, 0xcd, 0xb7, 0x34, 0x5d, 0xe8, 0x25, 0x3f, 0x7e, 0xaf, 0x34, 0xdd, 0x24, 0x8b, 0x9b, 0x76, 0xa0, 0x1a, 0xc6, 0x23, 0xff, + 0xc1, 0x6b, 0x81, 0xc8, 0x7f, 0xc8, 0x5e, 0xa0, 0x7f, 0x3b, 0xe9, 0x1b, 0x8e, 0x1c, 0x04, 0xdb, 0x9c, 0x5b, 0x09, 0x7b, 0x7a, 0xbf, 0x11, 0x31, 0xcc, 0x33, 0xb2, 0x3d, 0xb8, 0x46, 0x47, 0x69, + 0x10, 0xb9, 0x96, 0x5b, 0xd0, 0x1b, 0x40, 0xa9, 0xb3, 0x30, 0x54, 0xf4, 0x58, 0x60, 0xdb, 0x15, 0x5b, 0x15, 0x4a, 0x93, 0xb4, 0x07, 0x28, 0x42, 0x40, 0x8d, 0x06, 0x79, 0xac, 0x18, 0x53, 0x94, + 0x02, 0xda, 0xcb, 0xa9, 0xa1, 0xec, 0x47, 0x2c, 0x97, 0xa9, 0x31, 0x0b, 0x03, 0x92, 0x4c, 0xf5, 0xd5, 0x10, 0xe3, 0xac, 0x56, 0x33, 0xe3, 0xf2, 0x89, 0x5f, 0x14, 0xba, 0xcf, 0x4d, 0xb0, 0xdf, + 0x3a, 0x5e, 0xff, 0x74, 0x5c, 0xfa, 0xf6, 0x8c, 0xbe, 0x8e, 0x32, 0x7e, 0xe4, 0x37, 0x25, 0x7e, 0x3e, 0x36, 0x7f, 0xe8, 0x9e, 0x07, 0xe7, 0xcf, 0x59, 0xe7, 0x35, 0x25, 0x9e, 0x8f, 0xce, 0x68, + 0x44, 0x2b, 0x75, 0xb3, 0x0d, 0x1b, 0x36, 0x2a, 0x51, 0x75, 0x37, 0xc4, 0x90, 0x3d, 0x20, 0x11, 0xb3, 0x36, 0xe1, 0x4f, 0x9a, 0xb5, 0x04, 0x26, 0x43, 0x69, 0x4b, 0xfb, 0x68, 0x79, 0xf4, 0x8e, + 0x4d, 0x84, 0xc3, 0x43, 0x58, 0x5d, 0x70, 0xf3, 0xc2, 0x39, 0xca, 0x3b, 0x49, 0x4c, 0x45, 0x78, 0x3a, 0x8c, 0x97, 0x95, 0x0d, 0x04, 0x9e, 0xaa, 0x22, 0xeb, 0xa5, 0x0b, 0x1c, 0xac, 0x6a, 0xb2, + 0xde, 0x3e, 0xaa, 0x14, 0xff, 0x0d, 0x3c, 0x65, 0xf8, 0x48, 0x9f, 0x7a, 0x2d, 0xa2, 0xe9, 0x4c, 0xf0, 0x0c, 0x48, 0x19, 0x26, 0x7d, 0xa3, 0x97, 0x56, 0xb5, 0xd2, 0x02, 0x09, 0x2a, 0xcc, 0x72, + 0x78, 0xd3, 0x16, 0x06, 0xe8, 0xc9, 0x7a, 0x81, 0xd5, 0x49, 0x85, 0x91, 0x8c, 0x2b, 0x4f, 0x52, 0x83, 0xdc, 0x05, 0xfa, 0x50, 0x39, 0x18, 0x3e, 0x74, 0x00, 0x08, 0xf9, 0x54, 0xe1, 0xde, 0x6e, + 0x38, 0x0e, 0x7c, 0x54, 0xdc, 0x85, 0x9b, 0x15, 0x6c, 0x15, 0x38, 0x29, 0x36, 0x1b, 0x68, 0xc1, 0x29, 0xf3, 0x25, 0x70, 0xdc, 0xcc, 0xf6, 0xc8, 0x78, 0xe6, 0xd4, 0xcf, 0x0c, 0xcc, 0xc7, 0xac, + 0x7b, 0x56, 0xff, 0x62, 0xeb, 0x6c, 0xb8, 0x98, 0xea, 0xbb, 0xf2, 0x7f, 0x63, 0x48, 0xbc, 0xed, 0x09, 0x9d, 0x7f, 0x41, 0x7b, 0x45, 0xf5, 0x26, 0x65, 0xd4, 0xea, 0x17, 0xde, 0xbd, 0x2f, 0x1e, + 0x5e, 0xd9, 0x13, 0x7f, 0x27, 0xda, 0xc1, 0x7d, 0x39, 0xec, 0xd3, 0xaf, 0xaf, 0xcb, 0x54, 0xd8, 0xe5, 0x3b, 0xcf, 0xb0, 0x00, 0x6f, 0x18, 0x06, 0x40, 0x0b, 0xe2, 0x73, 0x96, 0xd9, 0x28, 0x5a, + 0x36, 0x03, 0x89, 0x04, 0x91, 0x6d, 0x15, 0x5a, 0x6e, 0x0a, 0x23, 0x15, 0x17, 0x32, 0x22, 0x99, 0xc3, 0xd8, 0x59, 0x6e, 0x68, 0x32, 0x57, 0xe9, 0xe5, 0x72, 0xb5, 0xa9, 0x12, 0x12, 0xe0, 0x85, + 0x71, 0x92, 0x1d, 0x2a, 0xb3, 0x32, 0x24, 0xa5, 0xd5, 0x22, 0x0f, 0xd1, 0x2b, 0x62, 0x3d, 0x35, 0xa0, 0x9f, 0xac, 0x6b, 0xbd, 0xfc, 0xf3, 0x65, 0xa2, 0xfe, 0xc3, 0x80, 0x25, 0x6a, 0x07, 0x56, + 0xa2, 0xf6, 0x05, 0x2a, 0x80, 0x3d, 0x9e, 0xca, 0x93, 0xc5, 0x58, 0x98, 0xa5, 0x9a, 0x08, 0xb4, 0xc0, 0x70, 0x16, 0xe7, 0xb1, 0xc7, 0x27, 0x87, 0x64, 0x46, 0x62, 0x51, 0xb0, 0x00, 0x6a, 0x7a, + 0x9f, 0xa4, 0x1b, 0xd2, 0x8c, 0xea, 0xb5, 0x68, 0x31, 0x0d, 0x69, 0x41, 0xb6, 0x33, 0x8c, 0xc6, 0x24, 0x5e, 0x05, 0x00, 0xde, 0x8a, 0x49, 0xbe, 0xcc, 0xdb, 0xc4, 0xe4, 0xb3, 0xda, 0x3a, 0x6d, + 0x32, 0xb6, 0x64, 0xc6, 0x18, 0xfc, 0x2c, 0xfa, 0xeb, 0x1b, 0xde, 0xec, 0x4c, 0xd6, 0x81, 0x1d, 0xab, 0x97, 0x35, 0x0d, 0x79, 0x29, 0xbe, 0xb4, 0x8f, 0xa3, 0x3c, 0x7d, 0xa4, 0x83, 0xe1, 0xbf, + 0xe1, 0x57, 0xf4, 0x88, 0xf4, 0xac, 0x7e, 0xa5, 0xf9, 0xe0, 0xf2, 0xef, 0xcf, 0x81, 0xe7, 0x86, 0x08, 0xc1, 0x24, 0x0e, 0x5e, 0xe7, 0xc2, 0x61, 0x3d, 0x76, 0xe5, 0x7d, 0x34, 0xb7, 0x00, 0x16, + 0x1c, 0xd5, 0x90, 0xc3, 0xe7, 0x4e, 0x0e, 0x1a, 0xe5, 0x3c, 0xe7, 0xa5, 0xcd, 0x7e, 0xb2, 0x62, 0x86, 0x12, 0x95, 0x7a, 0xd3, 0xc2, 0xdd, 0xcc, 0x6b, 0x7e, 0xcd, 0xaf, 0x0e, 0x50, 0x31, 0x66, + 0x08, 0x3e, 0x9e, 0x6b, 0x50, 0x58, 0xd1, 0xc3, 0x65, 0xa9, 0x45, 0x7b, 0x31, 0x2b, 0x3d, 0x96, 0x16, 0x7b, 0x2e, 0x5e, 0x5d, 0x5b, 0x0a, 0xdd, 0x51, 0xa3, 0xc8, 0x0c, 0xfe, 0x7a, 0xb7, 0xfe, + 0xef, 0xec, 0xe6, 0x3f, 0xd5, 0xdd, 0xfe, 0x41, 0x13, 0xa4, 0x77, 0x04, 0x40, 0x5a, 0x9a, 0xa5, 0x39, 0x08, 0x5d, 0x3d, 0x8b, 0x0b, 0x35, 0xf7, 0x1f, 0x2e, 0x7a, 0xaf, 0x34, 0x9f, 0xbe, 0xa1, + 0x7d, 0x1e, 0xd1, 0xeb, 0x2b, 0x7d, 0x9b, 0x50, 0xf3, 0xa5, 0xca, 0x0b, 0x2a, 0x6e, 0x05, 0xac, 0x38, 0x5c, 0xaa, 0x82, 0xbc, 0x3d, 0x2d, 0x63, 0x1f, 0xc2, 0x96, 0x27, 0x71, 0x05, 0x4f, 0x28, + 0x5c, 0x9d, 0x3b, 0xd5, 0x30, 0xb3, 0x56, 0x47, 0x74, 0x63, 0xa7, 0x14, 0xc0, 0x21, 0x13, 0x27, 0x51, 0xb6, 0x11, 0x35, 0x21, 0x1c, 0xc2, 0xc5, 0x94, 0x99, 0x3f, 0x16, 0x08, 0x69, 0xb8, 0x4b, + 0x7d, 0x7a, 0xcc, 0x50, 0xa3, 0x0c, 0x73, 0x4c, 0x0f, 0x65, 0xc9, 0x07, 0x3d, 0xf6, 0xff, 0x9f, 0x1f, 0x38, 0xff, 0x41, 0xfc, 0xbb, 0x12, 0x57, 0xfd, 0xc6, 0xc3, 0x32, 0xb3, 0x38, 0xff, 0x30, + 0x06, 0x3f, 0x8d, 0xf0, 0x83, 0xc7, 0x24, 0x6a, 0x91, 0x99, 0x71, 0xf4, 0xed, 0x73, 0xea, 0xba, 0xfe, 0xfd, 0x76, 0x5f, 0xf7, 0xb0, 0x9f, 0x3e, 0x43, 0x8f, 0xa3, 0xbc, 0x0c, 0x8a, 0xf3, 0x67, + 0x7f, 0xf7, 0x98, 0x0b, 0xd9, 0xcb, 0x0e, 0xd5, 0x25, 0xe2, 0xfe, 0xd3, 0x23, 0xde, 0x8e, 0xfe, 0x5f, 0xdf, 0x31, 0xd8, 0x03, 0x2f, 0xda, 0x3d, 0x3e, 0xc3, 0x5e, 0xca, 0x09, 0xbe, 0xff, 0x88, + 0x8e, 0xdd, 0xee, 0xfd, 0xd0, 0xb5, 0xf3, 0xea, 0x91, 0x2d, 0x5c, 0xc8, 0x13, 0x78, 0x0b, 0x3b, 0x76, 0xbb, 0x2b, 0x19, 0x3b, 0x88, 0x0f, 0xa0, 0x2c, 0xe5, 0x48, 0x0d, 0x0f, 0xcb, 0x68, 0x73, + 0x70, 0x88, 0xd4, 0x2a, 0xc1, 0x74, 0x22, 0x5a, 0x8e, 0x28, 0xab, 0xa1, 0x5a, 0x8f, 0xac, 0xd6, 0x29, 0x43, 0x56, 0x45, 0xda, 0x79, 0x62, 0x08, 0x31, 0x31, 0xaa, 0x64, 0x14, 0xc9, 0x16, 0x7a, + 0xe0, 0x01, 0x98, 0x75, 0x94, 0xb7, 0xd2, 0x9e, 0xcb, 0xc9, 0x29, 0x53, 0x7d, 0xef, 0xb7, 0xca, 0xf4, 0x6f, 0x26, 0xe0, 0xcf, 0xb5, 0xce, 0x4c, 0x07, 0x07, 0x60, 0xa6, 0x77, 0xd3, 0xac, 0x87, + 0x8e, 0xd9, 0xa2, 0xda, 0xdc, 0x4e, 0x59, 0x0f, 0xdd, 0x8e, 0x8d, 0x66, 0xa5, 0xad, 0xfc, 0x38, 0x0c, 0x62, 0xc7, 0xaf, 0x72, 0x8a, 0xb0, 0x0d, 0xca, 0xdd, 0x6f, 0x03, 0x61, 0xbc, 0x8c, 0xc6, + 0x8e, 0x15, 0x01, 0xe3, 0x4d, 0x63, 0x63, 0x9a, 0x8e, 0x23, 0x06, 0x21, 0xea, 0xe3, 0x23, 0x3c, 0xac, 0xd5, 0x8a, 0xb6, 0x6c, 0xb3, 0x99, 0xd8, 0xba, 0xae, 0xfb, 0x8e, 0xae, 0x54, 0x6d, 0xdd, + 0x6e, 0xe5, 0xcd, 0xfa, 0x75, 0xcd, 0xea, 0x52, 0xff, 0xee, 0x4f, 0x69, 0x2f, 0xe8, 0x76, 0x37, 0xd9, 0x8d, 0xba, 0xbe, 0xe2, 0xff, 0x0d, 0x5f, 0xed, 0x72, 0xbc, 0xa7, 0x12, 0xbe, 0xd7, 0x5b, + 0x82, 0xbf, 0x54, 0x2d, 0x2c, 0x32, 0x37, 0xb9, 0x6c, 0xaf, 0xeb, 0x71, 0x18, 0x9a, 0x51, 0xd1, 0x19, 0x16, 0xff, 0xdd, 0xb7, 0x3a, 0x6f, 0x37, 0x48, 0xb7, 0x75, 0x34, 0xbe, 0x19, 0x53, 0x53, + 0x35, 0x0c, 0x37, 0x7b, 0xac, 0x37, 0xbf, 0x12, 0x33, 0xf0, 0x4e, 0xf4, 0x3c, 0xbe, 0x6f, 0x87, 0x03, 0xb4, 0x5f, 0xac, 0x80, 0xce, 0x39, 0xe5, 0x48, 0x07, 0x89, 0xcc, 0x70, 0x7c, 0x46, 0x3a, + 0xe6, 0x32, 0x10, 0xe7, 0x63, 0xc7, 0x12, 0x5a, 0x68, 0xe9, 0xfa, 0x75, 0xc2, 0xb0, 0xe0, 0x10, 0x70, 0xc3, 0x18, 0x58, 0x25, 0xa6, 0x9a, 0x8b, 0x33, 0x22, 0x2e, 0xa7, 0x19, 0x93, 0x05, 0xb2, + 0x5f, 0x8b, 0x10, 0x00, 0x44, 0x9e, 0xdb, 0x96, 0x74, 0xa5, 0x8f, 0xd6, 0x33, 0x79, 0x28, 0xa2, 0xa5, 0x5f, 0x29, 0x44, 0x1a, 0xce, 0x5e, 0x8f, 0x15, 0xf8, 0xbc, 0x85, 0x75, 0xd6, 0x50, 0x90, + 0x17, 0xac, 0x3b, 0xa2, 0xef, 0x5e, 0x62, 0xd7, 0xfa, 0x28, 0xf9, 0x9d, 0x64, 0x71, 0x11, 0x9f, 0xc5, 0xe0, 0x6f, 0x2b, 0x50, 0x1f, 0x3a, 0xdb, 0x2e, 0xda, 0xfa, 0xcf, 0x47, 0xe6, 0xde, 0x23, + 0xba, 0x71, 0xba, 0xf7, 0x43, 0x97, 0x2c, 0xdd, 0x43, 0xc1, 0x59, 0xba, 0x63, 0x63, 0x37, 0x4e, 0x49, 0xf8, 0x18, 0xc8, 0xa3, 0x72, 0xb7, 0x84, 0x8c, 0x7c, 0xb4, 0x03, 0x8c, 0x3d, 0x84, 0xb8, + 0xf8, 0x8a, 0x75, 0x89, 0x0c, 0x1d, 0x97, 0x5b, 0x87, 0x97, 0x22, 0xc0, 0x0f, 0xcd, 0x15, 0x0f, 0x4c, 0x2d, 0xc6, 0xb1, 0xbc, 0x94, 0xdb, 0xb9, 0x39, 0x7c, 0x5a, 0x36, 0x51, 0x50, 0x12, 0x84, + 0x93, 0x82, 0x98, 0xd1, 0x40, 0x1b, 0x64, 0xbd, 0x41, 0xa9, 0xcd, 0x4e, 0x7c, 0x9a, 0x2c, 0xfc, 0x93, 0xe0, 0xca, 0xff, 0x7f, 0x0b, 0x4d, 0xbe, 0x1f, 0xaa, 0x72, 0x7f, 0xd1, 0x7a, 0x25, 0x8a, + 0xed, 0x0e, 0xfd, 0x0b, 0x93, 0xdc, 0x5e, 0x1d, 0x60, 0xfd, 0xa2, 0xd8, 0x70, 0xdb, 0x17, 0x34, 0x6c, 0x8f, 0xab, 0xc7, 0xe5, 0x18, 0x13, 0x66, 0x88, 0x52, 0xad, 0xb4, 0x11, 0xde, 0x4e, 0xc6, + 0x9e, 0x5e, 0x95, 0x96, 0x34, 0x4e, 0xab, 0x6a, 0xda, 0xc0, 0x8c, 0x16, 0xb2, 0x1b, 0xbf, 0x2c, 0xf2, 0xda, 0x3b, 0xc2, 0x0d, 0x7f, 0xd8, 0xc9, 0x10, 0x60, 0xa8, 0x81, 0xb7, 0x90, 0x77, 0x5a, + 0x6c, 0xf3, 0xa3, 0x35, 0x64, 0x16, 0xb2, 0x10, 0x68, 0xae, 0x3a, 0xdd, 0xb6, 0x5c, 0xfb, 0xba, 0xf4, 0xbe, 0x48, 0xc9, 0x7f, 0x5d, 0x16, 0xae, 0x9f, 0x8e, 0x39, 0xde, 0xb3, 0x34, 0xf3, 0x4d, + 0x98, 0xd0, 0xbd, 0xd1, 0x79, 0xad, 0x30, 0xf3, 0x67, 0xc2, 0x9f, 0x87, 0xa5, 0xcc, 0x82, 0xbe, 0x45, 0x99, 0x09, 0x55, 0x97, 0x25, 0x49, 0x5c, 0x40, 0x94, 0xbf, 0xad, 0xf0, 0x1d, 0xb5, 0xf6, + 0xa6, 0x68, 0xb5, 0x56, 0x17, 0x92, 0xe2, 0x8b, 0x64, 0x1d, 0x63, 0xab, 0xf5, 0x4c, 0x1b, 0xb3, 0xf2, 0x76, 0x3a, 0x8d, 0x22, 0x8e, 0x1f, 0x27, 0x6c, 0x6a, 0xec, 0xb3, 0x05, 0x2e, 0x60, 0xbc, + 0x08, 0xb1, 0x9b, 0x45, 0x0c, 0x1e, 0x0f, 0xd5, 0x72, 0x58, 0x4c, 0x41, 0x69, 0xb8, 0x9a, 0x81, 0xe2, 0x76, 0x6f, 0x41, 0xa6, 0xff, 0x1f, 0x1a, 0x8f, 0x3e, 0x26, 0x60, 0x66, 0x9e, 0x51, 0xc8, + 0xaa, 0x87, 0xbd, 0x1e, 0x5e, 0x8b, 0x38, 0xfc, 0x43, 0xb6, 0x1b, 0x87, 0xf7, 0x93, 0x3e, 0xd1, 0x86, 0xf0, 0x80, 0x43, 0x98, 0x1c, 0xf0, 0xda, 0xb0, 0x96, 0x59, 0x7a, 0x4d, 0xa1, 0xdb, 0x72, + 0x78, 0x98, 0x13, 0x43, 0x1a, 0x1e, 0xad, 0xbf, 0xad, 0x9f, 0x76, 0xbf, 0x5e, 0xee, 0x7d, 0xcf, 0xc2, 0x2b, 0x9d, 0xda, 0xee, 0xd0, 0xef, 0x3e, 0xee, 0xcb, 0xd5, 0xbe, 0x3d, 0xdc, 0x24, 0x0b, + 0x8a, 0x8e, 0x26, 0xbe, 0xcb, 0xcd, 0x93, 0x3b, 0xe3, 0x4a, 0x80, 0x4a, 0x48, 0xcd, 0x75, 0xf7, 0x5a, 0x98, 0x04, 0x29, 0x2e, 0x90, 0x60, 0x02, 0x8c, 0xea, 0x91, 0x2c, 0x6d, 0xc0, 0xe5, 0x98, + 0x71, 0xb2, 0x3d, 0x4d, 0xef, 0x9d, 0x5a, 0x05, 0x2a, 0x8a, 0x6f, 0x4b, 0xad, 0x4c, 0x2d, 0xe5, 0x28, 0x56, 0xe6, 0x1e, 0x04, 0x69, 0xf9, 0x30, 0xcf, 0xe9, 0xf9, 0x68, 0xc7, 0xae, 0xc0, 0x6a, + 0xfa, 0x93, 0x52, 0x57, 0xbd, 0xa3, 0x79, 0xde, 0x10, 0xfa, 0x06, 0xce, 0xb7, 0x26, 0x47, 0x3f, 0x37, 0x37, 0xdf, 0x6e, 0xeb, 0x90, 0xec, 0x8e, 0x06, 0x9f, 0xc9, 0x3d, 0x07, 0xf1, 0x48, 0xac, + 0x4a, 0x5d, 0x68, 0x23, 0x76, 0xbf, 0xa0, 0x4b, 0xb2, 0x0d, 0x32, 0x55, 0x1d, 0x95, 0xe6, 0x41, 0x19, 0x39, 0x3a, 0x54, 0x52, 0xf6, 0x72, 0xdc, 0x1c, 0xf2, 0xad, 0xc0, 0xae, 0xa5, 0x75, 0x1b, + 0x98, 0x84, 0x4a, 0xa2, 0xa9, 0xe4, 0xe8, 0x27, 0x40, 0xa2, 0x24, 0x85, 0xd0, 0x16, 0x29, 0x62, 0xe0, 0x2e, 0x36, 0x75, 0x0c, 0x23, 0xc2, 0xa7, 0x55, 0x01, 0x40, 0xe0, 0xbe, 0x66, 0x7d, 0xfc, + 0x75, 0xc5, 0xc8, 0xcd, 0x07, 0x7a, 0x9c, 0x99, 0x83, 0x0b, 0x72, 0x1f, 0xda, 0xd1, 0x95, 0x2a, 0x7b, 0x15, 0x1b, 0x75, 0x59, 0x87, 0xff, 0x13, 0x4e, 0x84, 0xf7, 0x92, 0x56, 0x81, 0xeb, 0x7f, + 0x17, 0xa4, 0xf5, 0xca, 0x44, 0xf9, 0x43, 0xf8, 0x32, 0xae, 0x1f, 0xa7, 0x5d, 0xa0, 0xd6, 0xd3, 0xf2, 0x83, 0xbe, 0xac, 0xdb, 0xa3, 0x53, 0xe1, 0x31, 0x33, 0x65, 0x52, 0xd9, 0xea, 0x66, 0xa6, + 0xa2, 0x41, 0x32, 0x27, 0x57, 0xb1, 0xf9, 0x64, 0xbb, 0xfd, 0xf1, 0xb8, 0x7c, 0xa9, 0x1c, 0xfc, 0x9e, 0x5c, 0xd2, 0x0b, 0xa7, 0x32, 0x7c, 0x18, 0x35, 0x0a, 0xbd, 0xe4, 0x41, 0x7f, 0xa3, 0x79, + 0x41, 0xe7, 0x7c, 0x34, 0x80, 0x9e, 0xfb, 0xd1, 0xe1, 0x01, 0x61, 0x7a, 0x90, 0x6c, 0x6e, 0xe7, 0x02, 0xbe, 0x36, 0xed, 0x94, 0x20, 0xd0, 0x49, 0xca, 0xb9, 0x22, 0xc4, 0x28, 0xb0, 0xff, 0x2a, + 0x30, 0x85, 0x93, 0xc5, 0xa5, 0xdd, 0xe9, 0xf1, 0xff, 0x8d, 0xfc, 0x46, 0x7b, 0xa5, 0x4b, 0x64, 0x0f, 0x3b, 0x31, 0x41, 0x57, 0x15, 0x66, 0xfa, 0xa3, 0x51, 0x74, 0x48, 0x14, 0x83, 0xee, 0xff, + 0x9f, 0x4f, 0x7a, 0x0e, 0xd2, 0x50, 0xf9, 0xb8, 0xcd, 0x47, 0x3b, 0x54, 0x21, 0xe1, 0xd1, 0x71, 0xb7, 0x6d, 0x61, 0x86, 0xa1, 0x46, 0x63, 0x75, 0x44, 0x13, 0x4e, 0xa5, 0xd8, 0xf8, 0x7e, 0x3a, + 0x0c, 0x57, 0xad, 0xbf, 0x6c, 0xb6, 0x87, 0x29, 0xe2, 0x95, 0xd0, 0x42, 0xd2, 0xe6, 0x81, 0xca, 0x6c, 0x36, 0x81, 0x2f, 0x03, 0x47, 0x7e, 0x54, 0xcf, 0x36, 0x40, 0xbd, 0xe7, 0xa4, 0x70, 0x3c, + 0xa3, 0x20, 0xf5, 0x80, 0x57, 0xf2, 0x75, 0x09, 0x86, 0x7f, 0x20, 0x70, 0x23, 0x33, 0x0b, 0xf7, 0x31, 0xdf, 0xbc, 0x16, 0xc9, 0xf2, 0x46, 0xf3, 0x82, 0xd6, 0xf9, 0xa8, 0x4f, 0xfc, 0xca, 0x19, + 0x31, 0x76, 0x25, 0xc9, 0xc4, 0xf0, 0xe8, 0x4f, 0x53, 0xe4, 0x80, 0x68, 0xac, 0xd9, 0x80, 0xab, 0xf5, 0x1a, 0x3e, 0xb8, 0xd2, 0x21, 0x42, 0xd8, 0xb9, 0x6c, 0x62, 0x1b, 0xb9, 0xcd, 0x29, 0x43, + 0x36, 0xbc, 0x30, 0x53, 0xe5, 0xc5, 0x3e, 0x3f, 0xf8, 0x52, 0x49, 0xac, 0x31, 0x35, 0x04, 0x08, 0x60, 0xb8, 0xd7, 0x54, 0x75, 0x1e, 0xc0, 0xa9, 0x13, 0x63, 0x6a, 0x4a, 0x51, 0x1b, 0x86, 0xdf, + 0x62, 0x73, 0xe1, 0x49, 0xd9, 0xa6, 0xcc, 0x2c, 0xf3, 0x4b, 0x4c, 0xd8, 0x23, 0xd1, 0xf2, 0x73, 0xa7, 0xd1, 0x1b, 0xcd, 0xee, 0xfb, 0xbb, 0xa3, 0xbe, 0xbd, 0x23, 0xf7, 0x64, 0xc4, 0x10, 0x84, + 0x8a, 0x5a, 0x3a, 0x68, 0xfa, 0x93, 0x19, 0x1c, 0x40, 0xe0, 0x7e, 0x03, 0x2f, 0xe2, 0xdc, 0x2d, 0x17, 0x5e, 0x2b, 0x3a, 0x23, 0x67, 0x5c, 0x49, 0x07, 0x8e, 0x91, 0xed, 0x83, 0x6e, 0xcd, 0xab, + 0x82, 0x20, 0x47, 0x92, 0x5d, 0x7a, 0xc8, 0x7e, 0xbd, 0xa2, 0xcd, 0xc5, 0x70, 0x3c, 0x47, 0xc2, 0x11, 0x58, 0xd6, 0xad, 0xba, 0x3a, 0x88, 0xb8, 0xa5, 0x15, 0x93, 0x5a, 0x6c, 0x4f, 0xcf, 0xd7, + 0x5a, 0x37, 0xbe, 0xec, 0x7f, 0xfe, 0xdf, 0xff, 0xf7, 0x2f, 0xa9, 0x6c, 0xaf, 0x2c, 0xc3, 0x96, 0xf1, 0xd8, 0xd5, 0xf4, 0x4a, 0xcc, 0xe8, 0x99, 0xe0, 0x19, 0x4b, 0xcb, 0xd0, 0x3b, 0x93, 0xb6, + 0x07, 0x23, 0x1d, 0x10, 0x27, 0xae, 0x8c, 0xd3, 0x4c, 0x5b, 0xbb, 0xa3, 0x11, 0x78, 0x54, 0x3d, 0x55, 0xe0, 0x24, 0x1f, 0x59, 0xaf, 0x42, 0xa0, 0xe1, 0x17, 0xe6, 0xd6, 0xe0, 0xb8, 0x72, 0x3c, + 0x72, 0x75, 0x6f, 0xa4, 0xf9, 0xf8, 0xc9, 0x45, 0x66, 0xc4, 0x7c, 0x4e, 0x35, 0xae, 0xad, 0x47, 0xf4, 0x2c, 0x59, 0x32, 0x1a, 0xdf, 0xf2, 0xba, 0xdd, 0x2e, 0x69, 0x77, 0x03, 0x10, 0xd1, 0x3a, + 0x93, 0x87, 0xba, 0x32, 0xcf, 0xa8, 0x6f, 0x19, 0xa9, 0x8b, 0x31, 0xfc, 0xb6, 0x39, 0xd2, 0xf0, 0x25, 0x63, 0xee, 0x13, 0x5d, 0x70, 0xf0, 0xf9, 0x6c, 0x30, 0xec, 0x67, 0xbc, 0x65, 0x09, 0x2a, + 0xc4, 0xd0, 0x88, 0xd5, 0x8d, 0x30, 0x64, 0xb5, 0x79, 0x65, 0xab, 0x7c, 0xb3, 0x15, 0x96, 0xd9, 0x48, 0x9b, 0x1f, 0x84, 0x83, 0x3f, 0x14, 0xc8, 0x69, 0x0a, 0xcf, 0x80, 0x24, 0xd1, 0x76, 0xf1, + 0x08, 0x02, 0x64, 0x53, 0xa5, 0x1b, 0xbf, 0x1e, 0xd2, 0x06, 0xc1, 0x6f, 0x78, 0x60, 0x4e, 0xe3, 0x9a, 0x17, 0xc9, 0x21, 0x72, 0x28, 0x37, 0xe5, 0x44, 0x0a, 0x93, 0x52, 0xae, 0xc2, 0xc9, 0x75, + 0x15, 0xa2, 0xff, 0xf1, 0x70, 0x3f, 0x7c, 0xcc, 0xdf, 0xf4, 0x70, 0x77, 0xc3, 0xdd, 0x79, 0x77, 0x90, 0x7f, 0x54, 0x42, 0x7f, 0xa2, 0xfb, 0xce, 0x54, 0x97, 0xb3, 0xbe, 0x92, 0x7a, 0xa3, 0xee, + 0x85, 0x59, 0xbe, 0x57, 0x79, 0xbe, 0x64, 0x6b, 0x7f, 0xec, 0x7a, 0x31, 0xb5, 0x61, 0x28, 0x16, 0x07, 0x4d, 0x0e, 0x3f, 0xb8, 0x59, 0xd5, 0x6e, 0x8e, 0x81, 0x32, 0x1a, 0x53, 0xdb, 0x16, 0xa3, + 0x01, 0x67, 0x52, 0x39, 0xd8, 0x18, 0x0f, 0x16, 0x73, 0x20, 0xda, 0x18, 0x8e, 0x36, 0xb3, 0x16, 0xda, 0x06, 0xb0, 0xc5, 0xf9, 0x58, 0xcf, 0x8c, 0x7c, 0xad, 0xee, 0x73, 0x68, 0x06, 0x28, 0xe3, + 0x75, 0xcf, 0xec, 0xdb, 0xcb, 0xc2, 0xfe, 0xd7, 0x7f, 0x43, 0x3d, 0x33, 0xd6, 0x72, 0x53, 0x2f, 0xb3, 0xb7, 0xa4, 0xa7, 0xef, 0x82, 0xfd, 0x91, 0x97, 0x92, 0x28, 0xbf, 0x50, 0xef, 0xb2, 0x6c, + 0x6e, 0xae, 0x0d, 0x90, 0xe7, 0xe9, 0x95, 0x67, 0x58, 0xb7, 0x43, 0x05, 0x24, 0x47, 0x91, 0xb6, 0xe6, 0x87, 0x05, 0xb8, 0x02, 0x73, 0x06, 0x0f, 0x65, 0x64, 0xaa, 0xea, 0x96, 0x77, 0x98, 0xd7, + 0xd9, 0x44, 0x17, 0xdc, 0x21, 0x8d, 0x6a, 0xc5, 0x6e, 0x8d, 0xcc, 0x15, 0x22, 0xb1, 0x60, 0x16, 0xde, 0xf3, 0x23, 0x85, 0x64, 0x86, 0xcb, 0xe1, 0xc8, 0xf1, 0x0e, 0x7b, 0x64, 0x7b, 0x6a, 0x32, + 0xb8, 0x59, 0x03, 0xb3, 0x70, 0xec, 0xac, 0xab, 0xa9, 0x7f, 0x9a, 0x70, 0xe1, 0xf7, 0x0b, 0xe0, 0xb7, 0xd9, 0x46, 0xa3, 0x97, 0x4a, 0x38, 0xde, 0x66, 0x1b, 0x8d, 0xfa, 0x15, 0x6d, 0xdc, 0xc4, + 0xe6, 0x7c, 0x29, 0x3b, 0x04, 0xc3, 0x62, 0x63, 0x71, 0x0d, 0xaa, 0xa4, 0x68, 0xe1, 0xca, 0x1c, 0xad, 0xcc, 0x18, 0xa4, 0x46, 0xca, 0x21, 0x97, 0x33, 0x81, 0xc2, 0x97, 0x44, 0xd4, 0x92, 0x91, + 0x86, 0x8e, 0xe1, 0x43, 0x96, 0xf8, 0x25, 0x0f, 0x9c, 0xc8, 0xf5, 0x74, 0x58, 0x5b, 0xd3, 0x61, 0x82, 0x33, 0xd8, 0x4a, 0x77, 0x64, 0x25, 0x37, 0x6d, 0x77, 0x6b, 0x6b, 0x4b, 0x9a, 0xc4, 0x94, + 0x5b, 0xef, 0xf1, 0x43, 0xcd, 0xfb, 0x53, 0x53, 0x89, 0x87, 0x25, 0xfc, 0x7f, 0x9c, 0x99, 0xf4, 0xfd, 0xb2, 0x1b, 0xfd, 0x2c, 0xb4, 0xeb, 0x0d, 0x4c, 0xc3, 0xb5, 0xac, 0x07, 0xa3, 0x85, 0xbe, + 0x14, 0x8b, 0xf0, 0x89, 0xee, 0x9f, 0x21, 0x3b, 0x9f, 0x75, 0xad, 0x18, 0x7a, 0x2c, 0x30, 0x73, 0x09, 0x5a, 0x34, 0xe0, 0x64, 0xa9, 0x33, 0xed, 0x98, 0xd0, 0xb1, 0xd6, 0x4f, 0x98, 0xf9, 0x82, + 0xaa, 0x56, 0xed, 0xba, 0x5e, 0xc7, 0x5a, 0xc1, 0x81, 0x84, 0x01, 0x88, 0x5b, 0x9f, 0x32, 0x08, 0x18, 0xd4, 0xa6, 0x9e, 0xbd, 0x61, 0x32, 0x4b, 0x53, 0x31, 0xf8, 0x90, 0x98, 0x79, 0x36, 0xf2, + 0x24, 0xb0, 0x20, 0xf6, 0x0e, 0xb0, 0x43, 0xa7, 0x12, 0x69, 0x52, 0xc2, 0x50, 0x33, 0x01, 0x6f, 0x2b, 0x3f, 0x2b, 0x42, 0xde, 0xb3, 0x15, 0xc3, 0xbf, 0xab, 0x39, 0xd8, 0x67, 0xd0, 0xfa, 0x4f, + 0xa7, 0xff, 0x49, 0xde, 0xfb, 0x41, 0xf2, 0xde, 0xdb, 0xd7, 0xe6, 0x45, 0x9c, 0x3d, 0x92, 0xd8, 0xaf, 0xb5, 0x78, 0xfd, 0x4c, 0xf8, 0x0f, 0xaa, 0xdd, 0x69, 0xdf, 0xf6, 0xae, 0xa2, 0xae, 0x54, + 0x73, 0x8e, 0x6b, 0xc9, 0x2a, 0x36, 0xa6, 0x33, 0x21, 0x37, 0x51, 0x28, 0x38, 0xba, 0x91, 0xef, 0x01, 0x4b, 0x7b, 0x3d, 0xae, 0x36, 0x11, 0x51, 0xef, 0x16, 0x45, 0xb2, 0xdd, 0x09, 0x6a, 0xeb, + 0xe8, 0x00, 0x96, 0xe7, 0x74, 0x8e, 0xa2, 0xc3, 0xd2, 0x0f, 0x7c, 0xab, 0xda, 0x6e, 0x97, 0xf6, 0x0a, 0x3c, 0x56, 0x21, 0xb3, 0x3a, 0x78, 0x98, 0xac, 0x57, 0x48, 0x3e, 0xda, 0x4e, 0xb6, 0xdc, + 0x33, 0x39, 0xfd, 0xb5, 0x21, 0xda, 0xa3, 0x55, 0xec, 0xe7, 0xdb, 0xb9, 0x5f, 0xa8, 0x77, 0xc0, 0xdc, 0x5c, 0xeb, 0x56, 0xb1, 0x1e, 0x9b, 0xbd, 0xa6, 0xb1, 0x63, 0x88, 0x70, 0xcc, 0x4e, 0x8f, + 0xfc, 0x61, 0x71, 0xe0, 0x58, 0xd3, 0xe3, 0xa3, 0x72, 0xd9, 0x04, 0x66, 0x2a, 0x4f, 0x41, 0x45, 0x30, 0x74, 0x91, 0x00, 0x79, 0x33, 0x24, 0xc1, 0x30, 0x8c, 0xf3, 0x06, 0x46, 0x12, 0xbd, 0x30, + 0x08, 0x28, 0x47, 0xd6, 0x2d, 0x04, 0xb1, 0xbc, 0x72, 0xca, 0x62, 0x9b, 0x53, 0x84, 0x61, 0xa8, 0x96, 0x2c, 0x02, 0xb6, 0xe1, 0x0a, 0xd6, 0xaa, 0xe0, 0xc9, 0xee, 0xf6, 0x4d, 0xa0, 0xcc, 0x3f, + 0x67, 0xcb, 0x7d, 0x26, 0x7c, 0xc6, 0xe4, 0xd3, 0x69, 0x5f, 0xab, 0x2e, 0x1d, 0x4a, 0x9b, 0xb6, 0x48, 0x67, 0xd3, 0x05, 0xcb, 0xf8, 0x73, 0xc3, 0xe5, 0x16, 0x99, 0x0c, 0x43, 0x61, 0xb5, 0xda, + 0x55, 0xd1, 0xd6, 0xc1, 0x10, 0x10, 0x98, 0xc7, 0xe3, 0x60, 0x76, 0x44, 0x35, 0x64, 0x25, 0xad, 0xa6, 0x48, 0xd3, 0x2c, 0x13, 0x65, 0x66, 0x84, 0x24, 0x56, 0x9b, 0xd0, 0x58, 0x8d, 0x0f, 0xe8, + 0xae, 0x5e, 0xb6, 0xf3, 0xd4, 0x1e, 0xd6, 0xc2, 0xc8, 0x4c, 0x1a, 0xb1, 0x82, 0x94, 0xaa, 0x67, 0xd8, 0xf1, 0x93, 0x4a, 0x25, 0xb6, 0x59, 0x0c, 0xdc, 0xa8, 0xc8, 0xdc, 0x28, 0x77, 0xf5, 0xbf, + 0xee, 0xee, 0xb7, 0x7d, 0x29, 0x59, 0x75, 0xbe, 0x87, 0xec, 0x5d, 0x0d, 0xb6, 0x87, 0x7a, 0xdf, 0xdb, 0x17, 0x98, 0xbb, 0x76, 0xa4, 0x06, 0x03, 0xb3, 0x71, 0x1f, 0x79, 0x76, 0xd0, 0x97, 0xc2, + 0xf2, 0x3f, 0xd1, 0xed, 0x86, 0xf8, 0xe3, 0xac, 0x8b, 0x1b, 0xed, 0xe1, 0xde, 0x3d, 0xec, 0x97, 0x18, 0x39, 0x9b, 0x10, 0x7b, 0x78, 0xdd, 0xd4, 0xca, 0xaa, 0x59, 0x68, 0xa2, 0x98, 0xd1, 0xd5, + 0x2a, 0xb2, 0x40, 0x5c, 0xa4, 0xed, 0x46, 0xd1, 0x59, 0xa2, 0x6e, 0x76, 0xc4, 0x29, 0x87, 0xd1, 0x26, 0x69, 0x46, 0x8d, 0x36, 0xc7, 0xa1, 0xc8, 0x18, 0x07, 0x0e, 0x9f, 0xcd, 0x5c, 0x64, 0xca, + 0x95, 0xb3, 0x5d, 0x6c, 0xd2, 0xf1, 0x72, 0x3d, 0xaa, 0x0b, 0x47, 0x58, 0xa5, 0x18, 0x32, 0xf5, 0x1e, 0xec, 0xa0, 0x7e, 0x03, 0xcf, 0xe7, 0x44, 0xb1, 0xfb, 0x33, 0xe0, 0x95, 0x9e, 0xb5, 0x7f, + 0xc8, 0x9e, 0xc1, 0xf9, 0x38, 0xe9, 0x2a, 0x86, 0xf4, 0xd0, 0x0e, 0x56, 0x3b, 0xc6, 0x01, 0x29, 0xa2, 0x48, 0x8e, 0xa3, 0xac, 0x24, 0xc8, 0x20, 0x0b, 0xfc, 0x3d, 0x46, 0xe5, 0x27, 0xa9, 0x80, + 0x0d, 0xad, 0x16, 0xbc, 0xc3, 0xd1, 0x2e, 0xe7, 0x59, 0x18, 0x34, 0xd3, 0x51, 0xa1, 0xd6, 0x87, 0x90, 0x1e, 0x07, 0x0b, 0x78, 0xb3, 0x58, 0x71, 0xbe, 0x44, 0x35, 0x4b, 0xb1, 0x4e, 0x1d, 0x3b, + 0x9f, 0x9a, 0x22, 0x73, 0xf2, 0x50, 0x9c, 0x1e, 0x4e, 0x42, 0xc6, 0xde, 0x86, 0x7c, 0xcf, 0xf0, 0x39, 0xb5, 0x88, 0x43, 0x57, 0x1f, 0xe4, 0x81, 0x69, 0x26, 0xf7, 0x27, 0xc0, 0x9d, 0x84, 0xbe, + 0x1e, 0x7c, 0x78, 0xd9, 0x40, 0xc9, 0xdd, 0xd0, 0x0d, 0xd4, 0xb7, 0xcf, 0xbd, 0x87, 0xf7, 0x6b, 0x21, 0x47, 0x5f, 0xa8, 0x9f, 0x61, 0xbf, 0xbd, 0xd6, 0x37, 0xd0, 0x08, 0x4c, 0x41, 0x62, 0x8b, + 0x8d, 0x03, 0x4c, 0x61, 0xa9, 0x8d, 0xe7, 0x11, 0x47, 0x33, 0x5b, 0x8c, 0x97, 0x47, 0x6a, 0xc5, 0xfa, 0xea, 0x66, 0x67, 0x65, 0x95, 0x63, 0xcd, 0x08, 0x1f, 0x1c, 0x23, 0xa8, 0x8b, 0x45, 0xa7, + 0x2c, 0xd8, 0x79, 0x08, 0x68, 0xc7, 0x70, 0x48, 0x42, 0x8b, 0x68, 0x14, 0xcd, 0x41, 0x54, 0xa2, 0x05, 0x6d, 0x1d, 0x43, 0x40, 0x52, 0xe2, 0xbb, 0x6a, 0x22, 0x72, 0xe4, 0x6e, 0xde, 0x55, 0x6f, + 0x78, 0x8a, 0x4e, 0xed, 0x1a, 0xdf, 0x34, 0x3c, 0x7a, 0x49, 0x51, 0xfd, 0x44, 0xf8, 0x0f, 0x26, 0xdd, 0x69, 0xdf, 0x20, 0xda, 0x68, 0x9d, 0x32, 0x43, 0xd2, 0x30, 0x27, 0x29, 0x29, 0xec, 0x98, + 0xa0, 0x49, 0x61, 0xaa, 0x26, 0x86, 0xcb, 0xa8, 0xc0, 0x6a, 0x9c, 0xad, 0x56, 0x6c, 0x7a, 0x3c, 0xb8, 0x3e, 0x1e, 0x53, 0xa4, 0xe2, 0x07, 0xd2, 0x8a, 0x5f, 0xac, 0x83, 0xd4, 0xc6, 0x66, 0x48, + 0x9b, 0x89, 0x30, 0x77, 0x50, 0x45, 0x8f, 0x4a, 0xab, 0x43, 0x6d, 0x58, 0xa6, 0x32, 0xaa, 0x47, 0xea, 0xa4, 0x5a, 0xd2, 0xa3, 0xd2, 0xbe, 0xdd, 0x38, 0xfd, 0x66, 0xd3, 0xc5, 0x2a, 0x83, 0xe0, + 0xf2, 0xbe, 0x5d, 0x88, 0x74, 0x12, 0xbb, 0xd1, 0xe7, 0xe8, 0xd9, 0x4f, 0x7c, 0x79, 0x09, 0x24, 0x52, 0xa3, 0xbc, 0x0b, 0x43, 0x7a, 0xb1, 0xb1, 0x5b, 0x1f, 0xff, 0xef, 0x05, 0xc5, 0x4f, 0xa1, + 0x23, 0x45, 0xe6, 0x3e, 0x96, 0x1f, 0xc8, 0xcb, 0xfc, 0x7c, 0xf3, 0x84, 0x8f, 0xf1, 0xbb, 0xb9, 0xde, 0xc5, 0x93, 0xf5, 0xe0, 0x6b, 0xe7, 0x38, 0xf1, 0x41, 0x37, 0xb5, 0x46, 0x41, 0x02, 0x81, + 0x94, 0x2d, 0xce, 0x46, 0xa0, 0x61, 0xac, 0xe1, 0xc5, 0xb1, 0x10, 0xf8, 0x0d, 0x25, 0x78, 0xc1, 0x69, 0xe2, 0xea, 0x87, 0xa1, 0x9b, 0x51, 0x07, 0x63, 0x0a, 0xdb, 0x99, 0x97, 0x47, 0x26, 0x8b, + 0xe0, 0xf2, 0x1c, 0x6f, 0xa8, 0x09, 0x37, 0x9e, 0x1a, 0x93, 0x6a, 0x4d, 0x58, 0x7b, 0x41, 0x84, 0xf6, 0x27, 0x9a, 0x73, 0x40, 0x64, 0xdb, 0x02, 0xe4, 0xeb, 0x1b, 0x6a, 0x7f, 0x23, 0x66, 0xe5, + 0xd3, 0x6d, 0x66, 0x57, 0x40, 0xa1, 0xc8, 0xd4, 0x8f, 0x75, 0x16, 0x26, 0xde, 0x37, 0x19, 0xef, 0xa4, 0xfc, 0xfe, 0xaf, 0x19, 0xdc, 0x72, 0x77, 0x58, 0x2f, 0x71, 0x76, 0xff, 0xa0, 0x56, 0xf6, + 0xe0, 0x21, 0x8f, 0xd8, 0xca, 0x8c, 0x8c, 0xbe, 0xda, 0x5a, 0x4b, 0x36, 0x13, 0xaf, 0x86, 0x37, 0x08, 0x4a, 0xd5, 0x3e, 0x31, 0xad, 0xc4, 0x44, 0x6f, 0x57, 0x08, 0xbf, 0xc8, 0x60, 0x6f, 0x54, + 0x2f, 0x51, 0xd2, 0x02, 0x7c, 0x3c, 0xa8, 0x76, 0x91, 0xc0, 0x9d, 0x80, 0xf0, 0x44, 0x4e, 0xe6, 0x27, 0x92, 0x97, 0x37, 0x66, 0x40, 0xfb, 0x18, 0xe2, 0xaf, 0x4f, 0x38, 0x90, 0x06, 0x44, 0xe3, + 0x59, 0x2c, 0x11, 0xcb, 0xa7, 0x16, 0xf5, 0xa8, 0xcd, 0x70, 0xbb, 0x1f, 0xf6, 0xac, 0xd8, 0xf4, 0x37, 0xd8, 0xe8, 0x7f, 0x91, 0x81, 0xce, 0x0b, 0x35, 0xfb, 0xae, 0x1a, 0xf4, 0x3f, 0x34, 0xd4, + 0xdd, 0x63, 0x1e, 0x0d, 0x76, 0xf7, 0x63, 0xdf, 0xe1, 0xf6, 0x1c, 0xdc, 0x24, 0x09, 0x6c, 0x3d, 0xb6, 0xaa, 0x46, 0x18, 0x42, 0x85, 0x21, 0x23, 0xd1, 0x4e, 0x89, 0xe2, 0xc9, 0x10, 0x0c, 0x57, + 0x33, 0x76, 0xbd, 0x9b, 0x6e, 0xad, 0x9a, 0x28, 0x86, 0x6d, 0x5b, 0xf8, 0xf1, 0x3e, 0x5f, 0xee, 0xf8, 0xa6, 0x5a, 0x80, 0x53, 0x94, 0x4c, 0x4b, 0x38, 0xa7, 0xa1, 0x75, 0x71, 0x5c, 0xa0, 0xeb, + 0x09, 0x24, 0xd9, 0xac, 0x10, 0xea, 0xc7, 0xfa, 0xe4, 0xd6, 0x72, 0xa9, 0xf4, 0x5c, 0x11, 0xfe, 0x7f, 0x6e, 0xb8, 0x3f, 0x56, 0xa4, 0x47, 0xda, 0xce, 0x0b, 0xc6, 0xf8, 0x07, 0xd9, 0xb7, 0xe1, + 0xbc, 0x9c, 0x74, 0xfa, 0xcd, 0xd3, 0x9d, 0xe6, 0x74, 0x6a, 0x6e, 0x17, 0x65, 0xae, 0xd6, 0x88, 0x1b, 0xeb, 0xa2, 0xab, 0xc9, 0xf0, 0xd2, 0x6d, 0xb6, 0x52, 0xc9, 0xc7, 0xfd, 0x7a, 0xfb, 0x76, + 0x4f, 0xea, 0x1c, 0xdf, 0x1d, 0xb4, 0xff, 0xbe, 0x1a, 0xe9, 0xf7, 0xe3, 0x82, 0xef, 0xab, 0x46, 0xaf, 0xe4, 0xb4, 0xdc, 0xa1, 0xff, 0x01, 0xe7, 0xd5, 0xd5, 0x3e, 0x49, 0xd8, 0xf0, 0x60, 0x33, + 0xe3, 0x94, 0x6d, 0xe9, 0x2f, 0xea, 0x30, 0x20, 0xe8, 0x9c, 0x9f, 0x3a, 0x72, 0x1d, 0x6b, 0x4c, 0x6b, 0x27, 0x76, 0xfc, 0xfd, 0x0a, 0xf9, 0x4f, 0x85, 0xf2, 0xe4, 0x65, 0x62, 0x66, 0xaa, 0xfd, + 0x38, 0x87, 0x18, 0xfd, 0x4d, 0xbc, 0x62, 0xe8, 0x7d, 0x90, 0xbd, 0xd4, 0xf8, 0x7f, 0x3b, 0x19, 0x74, 0xd4, 0x9e, 0xcb, 0x8a, 0xf9, 0x6a, 0x5b, 0xac, 0xb8, 0x49, 0x3c, 0x5d, 0xb0, 0x98, 0x49, + 0x57, 0xf8, 0x7a, 0x5e, 0xf8, 0xeb, 0x58, 0xe0, 0x0a, 0x94, 0x06, 0xe2, 0x14, 0x6a, 0x51, 0x23, 0x6f, 0xb8, 0x52, 0x2e, 0xe9, 0x4a, 0xe5, 0xf7, 0x55, 0x29, 0x12, 0xe6, 0x6c, 0x5c, 0xae, 0x42, + 0x6b, 0x07, 0xb9, 0xb2, 0x7c, 0x62, 0x26, 0xb0, 0x49, 0x38, 0xc9, 0x69, 0x82, 0x2b, 0x79, 0xa3, 0x95, 0x1b, 0x9c, 0x5e, 0xa8, 0x01, 0x37, 0xfb, 0x1b, 0x81, 0xb2, 0x71, 0x98, 0xc4, 0xd1, 0xf9, + 0xfd, 0xcd, 0xd0, 0x2d, 0x0a, 0xf3, 0xdd, 0x8a, 0xb9, 0x09, 0xe4, 0xb9, 0xb8, 0x70, 0x3c, 0xf5, 0xbd, 0x83, 0xfe, 0x4d, 0x06, 0xe1, 0xe7, 0xee, 0x3a, 0x37, 0x3f, 0x7d, 0x0a, 0x90, 0xff, 0x5a, + 0x57, 0x25, 0xce, 0xc2, 0x81, 0xa1, 0x16, 0xea, 0x1b, 0x55, 0xf4, 0xba, 0xb6, 0xe0, 0xf9, 0x67, 0xd7, 0x78, 0xab, 0x11, 0x78, 0xe7, 0xa5, 0xfe, 0xb4, 0x11, 0x7d, 0x2f, 0x6b, 0xfa, 0xf9, 0xc7, + 0xb7, 0x7e, 0x92, 0xff, 0x82, 0x6f, 0x4b, 0x16, 0xa6, 0x97, 0xff, 0xc0, 0xaf, 0x8a, 0xb0, 0x77, 0xe3, 0xaf, 0x76, 0x0f, 0xfb, 0x9c, 0x2b, 0x89, 0x74, 0x7b, 0x17, 0x3f, 0x9d, 0xcd, 0xbf, 0xfa, + 0x65, 0xb9, 0x7f, 0xe2, 0xa4, 0xab, 0xeb, 0xff, 0xd3, 0x79, 0xe6, 0x1e, 0xa7, 0xfe, 0xb0, 0xf3, 0xcc, 0x23, 0x70, 0xbf, 0x8e, 0xf2, 0x7d, 0x09, 0x8a, 0xbe, 0x00, 0xf3, 0x0d, 0xed, 0xb7, 0xe4, + 0x87, 0x4f, 0x57, 0xba, 0x22, 0x55, 0x3d, 0xa0, 0x9f, 0x6a, 0x4e, 0x4c, 0xb0, 0x98, 0xb7, 0xd0, 0x18, 0xaa, 0x89, 0xca, 0xc6, 0x1d, 0xc5, 0x18, 0xb2, 0xce, 0x14, 0x7b, 0x06, 0x2a, 0x22, 0xaf, + 0xe7, 0x8a, 0x87, 0x47, 0x3b, 0xb6, 0xdd, 0x87, 0xbe, 0xb3, 0x9a, 0xa5, 0xc4, 0x84, 0x59, 0x14, 0x09, 0x68, 0xb5, 0xb8, 0xb3, 0x55, 0x4a, 0x25, 0xdc, 0x80, 0x11, 0xda, 0x2a, 0xe4, 0x61, 0xbc, + 0xd7, 0x12, 0xec, 0x74, 0x02, 0x43, 0x89, 0x70, 0x42, 0x79, 0xf3, 0xcc, 0xed, 0xfe, 0x9d, 0x90, 0xc8, 0xcc, 0xae, 0x77, 0xda, 0xa5, 0x1a, 0xfa, 0x5f, 0xff, 0xfd, 0xc5, 0x05, 0xe2, 0x46, 0x8e, + 0x99, 0xb9, 0x9f, 0x12, 0x55, 0xae, 0x6c, 0x12, 0x37, 0x57, 0xb3, 0x4c, 0x6d, 0xef, 0xff, 0xeb, 0x83, 0xf2, 0x22, 0x17, 0x32, 0xd7, 0xf6, 0xec, 0x55, 0x74, 0xc4, 0x5f, 0xff, 0x3d, 0xbc, 0x9d, + 0xf3, 0x17, 0x4d, 0xee, 0xff, 0x6d, 0x98, 0x67, 0xcb, 0x38, 0x7b, 0x7b, 0xdc, 0xcd, 0x3d, 0xdd, 0x67, 0x18, 0x66, 0x92, 0x99, 0xba, 0xda, 0xd5, 0xb4, 0xbb, 0xbc, 0xd2, 0xdf, 0x61, 0xa9, 0x3e, + 0x51, 0x1b, 0xaf, 0xd4, 0x28, 0xfe, 0x2e, 0x6a, 0xa3, 0x57, 0x7d, 0xe2, 0xb9, 0x81, 0xec, 0x95, 0xf1, 0x92, 0xf6, 0xa5, 0x40, 0x1e, 0xcd, 0xb5, 0x65, 0x63, 0xe5, 0x53, 0x02, 0x8c, 0x2a, 0xd6, + 0xdf, 0x4f, 0xf7, 0xf0, 0x1c, 0x25, 0x74, 0x38, 0x77, 0x79, 0x7c, 0xbb, 0xc1, 0x55, 0x72, 0x23, 0x92, 0x5c, 0xc8, 0x8c, 0x89, 0x79, 0x94, 0xe4, 0xba, 0x10, 0x72, 0x4b, 0x21, 0x9e, 0x11, 0xab, + 0xf5, 0x22, 0x2b, 0x88, 0xd2, 0x00, 0xeb, 0x4d, 0x11, 0x7b, 0x6d, 0x8e, 0xcd, 0x71, 0xe0, 0xc7, 0x55, 0x50, 0x1e, 0xc2, 0x76, 0x3b, 0x5a, 0xf7, 0xf5, 0xfd, 0xd7, 0xbd, 0x3c, 0xef, 0xa4, 0x3f, + 0x74, 0xfc, 0xf7, 0x0b, 0x7d, 0xab, 0xac, 0x47, 0xa0, 0xe0, 0x44, 0x15, 0xed, 0xe2, 0x33, 0x46, 0xd3, 0x0e, 0x56, 0xe5, 0x66, 0x31, 0x70, 0x8c, 0x3d, 0x77, 0x76, 0xaa, 0x80, 0x9c, 0xe0, 0x36, + 0x1c, 0x33, 0xd6, 0x4f, 0x07, 0x73, 0x63, 0xed, 0x13, 0x7a, 0xb9, 0xaa, 0xe3, 0x95, 0x08, 0x39, 0x05, 0x1c, 0x60, 0x72, 0x3d, 0x9e, 0x68, 0x2e, 0x91, 0x2c, 0xa9, 0xca, 0x9c, 0x4e, 0x8d, 0xc8, + 0x67, 0xda, 0x4d, 0x2b, 0x6e, 0xc0, 0xf0, 0xb4, 0xb3, 0xea, 0xbf, 0xb1, 0x29, 0x79, 0x87, 0xff, 0x7b, 0xaf, 0x33, 0x85, 0xf9, 0xb0, 0xb9, 0x26, 0xf6, 0x52, 0xec, 0xeb, 0x07, 0xd5, 0x77, 0x35, + 0xe8, 0x7c, 0xdc, 0xa9, 0xdc, 0x3d, 0x38, 0x13, 0x1e, 0x53, 0x5a, 0x95, 0xad, 0x95, 0x7c, 0x4e, 0xa1, 0xb2, 0x38, 0x39, 0xa6, 0x5a, 0xe8, 0xc0, 0xd8, 0x0a, 0x92, 0xa7, 0x29, 0x34, 0x9d, 0x2f, + 0x26, 0x12, 0x18, 0x8d, 0x23, 0xcb, 0xb7, 0x0e, 0xcb, 0x68, 0x24, 0x64, 0xcd, 0xf6, 0x00, 0x2f, 0xd0, 0x84, 0x93, 0x3d, 0xe1, 0x34, 0x27, 0x5b, 0x70, 0xa4, 0xec, 0x91, 0x03, 0x69, 0x1c, 0xd3, + 0x36, 0xf5, 0x91, 0xcd, 0xba, 0x6e, 0x02, 0x0d, 0x22, 0x8d, 0xdb, 0xc2, 0xeb, 0x3f, 0x40, 0xf6, 0x56, 0x93, 0xb8, 0x32, 0xa1, 0xae, 0xf4, 0xc8, 0xb3, 0x16, 0x43, 0xbc, 0x90, 0x25, 0xd4, 0x37, + 0x63, 0xa4, 0x57, 0x83, 0xaa, 0xd1, 0x4b, 0xa5, 0xd3, 0x9e, 0x35, 0xa8, 0x1a, 0xf5, 0x2b, 0x97, 0x96, 0x26, 0x13, 0xaa, 0xda, 0x05, 0x64, 0x5e, 0x94, 0x6b, 0xa6, 0x32, 0xd9, 0x3c, 0x1a, 0x31, + 0x91, 0xbe, 0xdc, 0x55, 0xd5, 0x10, 0x82, 0xd3, 0x85, 0xaa, 0xb3, 0xa7, 0x6d, 0xb0, 0x06, 0x81, 0x55, 0xdd, 0xe8, 0x24, 0x00, 0xa5, 0x48, 0xbd, 0x6a, 0x2b, 0x8c, 0xb6, 0xaa, 0x82, 0x80, 0x40, + 0x7a, 0x13, 0x21, 0x49, 0xba, 0x1e, 0xe7, 0x4b, 0x83, 0x76, 0x63, 0x5b, 0x9a, 0xef, 0x48, 0x60, 0x5d, 0xd5, 0xbb, 0x9e, 0xc6, 0xee, 0x55, 0x37, 0xaa, 0xd7, 0xfc, 0x99, 0x7d, 0x36, 0xe6, 0x0b, + 0x35, 0x79, 0xb4, 0x5b, 0x3c, 0x7c, 0x29, 0xec, 0xf7, 0x4c, 0x10, 0x1c, 0x74, 0x7f, 0xba, 0x88, 0xbb, 0x1e, 0x33, 0xc4, 0xce, 0xa4, 0xec, 0xb4, 0x99, 0xc0, 0x41, 0x8b, 0xf8, 0xad, 0xc8, 0xb1, + 0x46, 0xda, 0x38, 0xc3, 0xb9, 0xbb, 0x4a, 0x34, 0x68, 0x9c, 0xf0, 0x7a, 0x31, 0x29, 0x4d, 0x5d, 0x1c, 0x43, 0x49, 0xce, 0x48, 0xd8, 0xbc, 0x84, 0x22, 0x1d, 0x28, 0x9b, 0xe3, 0x0e, 0x6b, 0x58, + 0x4f, 0x74, 0x40, 0x6c, 0x62, 0x6d, 0x03, 0x06, 0x3b, 0x39, 0x95, 0xc8, 0x21, 0xe0, 0x54, 0x0a, 0x19, 0x29, 0xc1, 0x2b, 0xb0, 0xfc, 0x1b, 0x76, 0xc2, 0x33, 0x37, 0x83, 0x99, 0x0c, 0xcc, 0xb4, + 0x54, 0x2f, 0x15, 0x06, 0xce, 0x8c, 0x34, 0xbc, 0xfe, 0xdd, 0x72, 0x23, 0xf3, 0xc1, 0x06, 0xa2, 0x11, 0x17, 0x97, 0x1e, 0x9c, 0xdd, 0xcf, 0xd0, 0xed, 0xfc, 0xb3, 0xe2, 0x6c, 0x60, 0xaa, 0x6f, + 0x09, 0x98, 0xd0, 0x6f, 0xf4, 0x5a, 0xb7, 0xb0, 0x83, 0xb8, 0x6b, 0xc3, 0xfd, 0xaf, 0xd1, 0x6f, 0xf8, 0xba, 0xaf, 0xa7, 0xa3, 0xe6, 0x1f, 0xcf, 0x43, 0x1f, 0x29, 0x2b, 0xdd, 0xab, 0x62, 0xd7, + 0xca, 0xca, 0x27, 0x6b, 0xfe, 0x8b, 0x30, 0xf8, 0x92, 0xba, 0x7b, 0xf5, 0x99, 0x0f, 0xf7, 0x39, 0xef, 0xdc, 0xf3, 0x47, 0xda, 0xdc, 0x21, 0xf1, 0xa7, 0x63, 0xc6, 0xa5, 0x55, 0xe7, 0xd5, 0x3b, + 0xbc, 0x31, 0xdd, 0xc7, 0xeb, 0x7f, 0xc9, 0x48, 0xb9, 0xdc, 0xf3, 0x16, 0xca, 0x7f, 0xc6, 0xec, 0xce, 0xc6, 0xc0, 0x3d, 0x7f, 0xfd, 0xe5, 0x8b, 0xae, 0xd0, 0xf8, 0x14, 0x34, 0xdf, 0x19, 0x43, + 0x77, 0x72, 0xb3, 0xbe, 0x84, 0x6b, 0xbc, 0x4d, 0x9f, 0x2e, 0x58, 0xa3, 0x3b, 0xee, 0x31, 0xe3, 0x3e, 0x2a, 0x5b, 0xdd, 0x9b, 0x74, 0xd0, 0x4b, 0x4a, 0xc0, 0x1b, 0xcd, 0xf3, 0xbc, 0xbb, 0x1c, + 0x0d, 0xa0, 0xe7, 0xcb, 0x3e, 0x3c, 0x58, 0x79, 0x6d, 0x5b, 0x0f, 0x71, 0x5f, 0x30, 0x0f, 0x06, 0x13, 0x9e, 0x94, 0xe9, 0xce, 0xcc, 0x4f, 0xec, 0x4e, 0xb6, 0x27, 0xd3, 0x5e, 0x32, 0x4a, 0x73, + 0xa3, 0x22, 0x33, 0x2f, 0x8e, 0xb6, 0xbe, 0x9a, 0x65, 0x61, 0x66, 0xe1, 0x20, 0x77, 0x4f, 0x8f, 0xa3, 0x0a, 0x5f, 0x89, 0xfa, 0xfd, 0xa0, 0x7a, 0x86, 0xe0, 0xfd, 0x78, 0x80, 0xf4, 0x8b, 0xf8, + 0xad, 0x59, 0x68, 0xe7, 0x62, 0xd6, 0x7a, 0xee, 0x55, 0xa0, 0xb4, 0x69, 0x09, 0x61, 0xcc, 0x28, 0x13, 0x27, 0x20, 0x26, 0xdc, 0xa8, 0xe4, 0xf4, 0xe1, 0x81, 0x5b, 0x8d, 0x84, 0xd4, 0xdd, 0x42, + 0xa7, 0xf9, 0x08, 0x58, 0x0e, 0x0f, 0x19, 0xb0, 0xe3, 0xb6, 0x74, 0xcc, 0xa8, 0xc8, 0x84, 0x17, 0x71, 0x96, 0xd9, 0x47, 0xe2, 0x7c, 0x21, 0x31, 0x28, 0xb6, 0xa7, 0x39, 0x7f, 0x73, 0xa2, 0xf6, + 0xad, 0x9a, 0x8c, 0x95, 0x67, 0xba, 0x4f, 0x6f, 0xd9, 0xfd, 0xf1, 0x1f, 0xaf, 0xba, 0x2c, 0x7f, 0x58, 0x03, 0xf1, 0xcf, 0x34, 0x78, 0x64, 0x2d, 0xfe, 0x3c, 0x5c, 0xe6, 0x8d, 0xe6, 0x79, 0x70, + 0x2e, 0x47, 0x9d, 0x75, 0xf8, 0x24, 0x34, 0x06, 0x1e, 0xd0, 0x86, 0xb8, 0x04, 0xf1, 0x94, 0xe0, 0xa5, 0xc0, 0xce, 0x35, 0xdd, 0x9f, 0x1e, 0x60, 0x80, 0x8e, 0x55, 0x17, 0xb3, 0xf6, 0x3f, 0x54, + 0xcc, 0x0b, 0x37, 0x34, 0xbf, 0xcd, 0x1e, 0xc4, 0x5f, 0xf2, 0xc6, 0xfe, 0x21, 0x7b, 0xfe, 0xb4, 0x8f, 0x93, 0x01, 0xfe, 0xdc, 0x1b, 0xdb, 0x31, 0x1e, 0xa7, 0x17, 0xd9, 0x91, 0x46, 0x18, 0x45, + 0x59, 0x95, 0x8b, 0x40, 0x77, 0x02, 0x7f, 0x8a, 0x18, 0x96, 0xb4, 0x74, 0x46, 0x4b, 0x84, 0xa5, 0x17, 0x24, 0x5d, 0x07, 0x00, 0xa2, 0x6a, 0x1b, 0xd9, 0x86, 0xc2, 0xbc, 0xde, 0x32, 0xd6, 0x9a, + 0x6a, 0xb7, 0x47, 0xd4, 0x5b, 0xda, 0x70, 0x22, 0x0f, 0x0f, 0x56, 0x51, 0x08, 0x0b, 0x5e, 0x29, 0x59, 0x5d, 0x8a, 0xc7, 0xe8, 0x6c, 0xde, 0x26, 0x07, 0x3f, 0xf8, 0x49, 0x31, 0xa7, 0x5e, 0x1a, + 0x82, 0x1b, 0xb5, 0x83, 0x20, 0x2b, 0x1f, 0x2a, 0x68, 0xd0, 0xa7, 0xb5, 0xa8, 0x3f, 0x70, 0x17, 0xa2, 0x1d, 0x6c, 0x97, 0xc3, 0x41, 0x47, 0xe9, 0x39, 0x68, 0x27, 0x5e, 0x5e, 0x43, 0x6c, 0x65, + 0x47, 0xc3, 0x4c, 0x3a, 0x1d, 0x93, 0x15, 0xd4, 0xa2, 0x3b, 0x01, 0x22, 0x73, 0x8e, 0xc5, 0x47, 0xe6, 0x5c, 0xdd, 0x7a, 0x24, 0x01, 0x0d, 0xbd, 0x80, 0x25, 0xe7, 0x78, 0x22, 0xa8, 0x86, 0x95, + 0xb9, 0xa2, 0x7e, 0x3a, 0xad, 0x98, 0x99, 0xa4, 0x82, 0x8d, 0x7e, 0xc4, 0xc2, 0xc5, 0xce, 0x0a, 0x83, 0x31, 0xc9, 0xb4, 0x5b, 0x10, 0x10, 0xec, 0x15, 0x74, 0x80, 0xcb, 0xf8, 0x79, 0xd2, 0x47, + 0xf4, 0xa3, 0x0a, 0x58, 0x45, 0x3c, 0xe8, 0xe7, 0x7d, 0x81, 0x5f, 0xe3, 0xbb, 0x2f, 0xe4, 0xcf, 0x40, 0x7e, 0xb9, 0xd8, 0x6d, 0xea, 0xf4, 0xe0, 0xc3, 0x45, 0x8a, 0x0c, 0xa5, 0x71, 0x81, 0x9f, + 0xe8, 0x61, 0x94, 0x6c, 0x9c, 0x60, 0x75, 0x90, 0xe6, 0x33, 0x1e, 0x05, 0xed, 0x76, 0x87, 0x80, 0xe9, 0x9a, 0xd6, 0x59, 0x9e, 0x6f, 0x45, 0xce, 0xc0, 0x2a, 0x2d, 0x44, 0x49, 0x66, 0xaf, 0xae, + 0x5d, 0x8a, 0xc3, 0x36, 0x5c, 0x0a, 0x99, 0xdc, 0x61, 0x02, 0x8a, 0x7e, 0x73, 0x02, 0x14, 0xcf, 0xc8, 0xf5, 0xe1, 0xd0, 0x26, 0xdb, 0xf6, 0x04, 0xc8, 0x29, 0x04, 0x3d, 0x33, 0x51, 0xfe, 0x29, + 0x94, 0x6d, 0xb3, 0x19, 0x64, 0x6a, 0x64, 0x3f, 0x56, 0x63, 0x5f, 0xd9, 0x21, 0xb8, 0x26, 0xfd, 0x8e, 0xee, 0xc7, 0x85, 0xc1, 0xf0, 0xf9, 0xbe, 0xc0, 0x19, 0x59, 0x7c, 0xb8, 0x19, 0xb9, 0x27, + 0x5c, 0x1a, 0xb6, 0xd3, 0x0c, 0xd6, 0x6b, 0xdd, 0xae, 0xb6, 0x8d, 0xa6, 0x2d, 0xea, 0xd1, 0xde, 0x47, 0xed, 0x75, 0x3b, 0x34, 0x16, 0x46, 0xa1, 0x60, 0x19, 0x5d, 0x99, 0xab, 0xd4, 0xc9, 0x8c, + 0xe5, 0x06, 0x58, 0xb9, 0x20, 0xd3, 0xe0, 0x45, 0xcb, 0x42, 0xfc, 0x54, 0x03, 0x90, 0xf9, 0xa4, 0x8d, 0xcc, 0x09, 0xb7, 0x74, 0xe7, 0x69, 0x46, 0xd1, 0x13, 0x81, 0xf7, 0x89, 0xfc, 0x19, 0xb2, + 0xdf, 0xc6, 0x54, 0x44, 0x65, 0xa8, 0xbd, 0x29, 0x4b, 0xa3, 0xd7, 0xac, 0x8a, 0x5e, 0xc6, 0xdd, 0x7b, 0x0b, 0xf7, 0xfb, 0x8e, 0xdd, 0x57, 0xb2, 0xcf, 0x3b, 0x8a, 0xdd, 0x40, 0x94, 0xba, 0xd3, + 0xc5, 0x5a, 0xf7, 0xe0, 0xec, 0xe3, 0xb8, 0x21, 0xf6, 0xed, 0x50, 0x5c, 0x15, 0x6b, 0x61, 0x57, 0x2c, 0x52, 0x80, 0x83, 0x50, 0x30, 0x67, 0xe9, 0x4c, 0x9a, 0xac, 0x98, 0xa6, 0xa6, 0xf5, 0xb4, + 0x14, 0x36, 0x88, 0x8e, 0xa1, 0x2b, 0x13, 0x42, 0x41, 0x32, 0x37, 0x33, 0x6f, 0x3b, 0x5e, 0x9c, 0x0a, 0x6f, 0x77, 0xc2, 0x67, 0xfe, 0xd2, 0x3c, 0x91, 0x34, 0xe8, 0x04, 0x66, 0x4b, 0x49, 0xe2, + 0x78, 0xbe, 0xaa, 0x6b, 0x65, 0x5f, 0x93, 0xc1, 0xeb, 0xa6, 0xc5, 0x7b, 0xdb, 0xdb, 0x8b, 0x1f, 0xae, 0x4f, 0xc8, 0xfc, 0x19, 0xd4, 0x8f, 0x76, 0xf8, 0xef, 0x6d, 0xe9, 0xbb, 0x0b, 0xfd, 0xa2, + 0x82, 0xcf, 0x3a, 0xef, 0xc0, 0xfa, 0x4e, 0xdf, 0x24, 0x5e, 0x99, 0x1d, 0xef, 0x54, 0xcf, 0xe3, 0xf1, 0x7e, 0x3c, 0xe8, 0x68, 0x3d, 0x1f, 0x13, 0xcc, 0xd0, 0x4e, 0x8b, 0x53, 0x5a, 0x79, 0x85, + 0xed, 0x72, 0xc3, 0xac, 0x86, 0xfd, 0x61, 0x36, 0x65, 0x8a, 0x31, 0xc5, 0xb3, 0xa1, 0x51, 0x1a, 0xce, 0xbc, 0x1d, 0x4f, 0x55, 0x8f, 0x87, 0x60, 0x6b, 0xda, 0x3a, 0x2a, 0xb5, 0x70, 0xf2, 0x98, + 0xe5, 0x5b, 0xbc, 0x1d, 0x01, 0x0b, 0x9e, 0x44, 0x17, 0x56, 0x32, 0x2b, 0x6a, 0x99, 0x74, 0x53, 0x77, 0xe4, 0xd3, 0x40, 0x53, 0xb3, 0xce, 0x36, 0xe7, 0x97, 0xcf, 0xc6, 0xe4, 0x19, 0x53, 0xf7, + 0x84, 0xd2, 0xe8, 0xbc, 0xbb, 0x83, 0x22, 0xfe, 0xde, 0x09, 0x8a, 0xbe, 0xd4, 0x30, 0xf3, 0xde, 0x03, 0xde, 0x00, 0xbe, 0xbd, 0xdc, 0xf1, 0x7f, 0x8f, 0x1c, 0x91, 0x93, 0x51, 0x12, 0x12, 0xc7, + 0x4f, 0x69, 0x33, 0x61, 0xd9, 0x1d, 0x20, 0xc9, 0x6b, 0x89, 0x3a, 0x6c, 0x8a, 0x63, 0xe9, 0x42, 0x41, 0x0b, 0xf1, 0x45, 0xec, 0xec, 0x73, 0xbd, 0x06, 0xf6, 0xa1, 0xca, 0xb8, 0xd4, 0x51, 0x24, + 0x9c, 0xec, 0x00, 0x67, 0x19, 0x08, 0x32, 0xf8, 0x01, 0x80, 0xe8, 0x6a, 0x89, 0xae, 0xb7, 0x30, 0x29, 0x90, 0x23, 0x92, 0x83, 0x02, 0x75, 0x65, 0x49, 0x44, 0x16, 0x12, 0xc8, 0xdf, 0x92, 0x3f, + 0x7f, 0xbe, 0xe6, 0xaf, 0xff, 0xfa, 0x41, 0xbe, 0x76, 0x19, 0x69, 0x71, 0x33, 0x48, 0x32, 0x37, 0x74, 0x0b, 0xf7, 0x61, 0xd1, 0x02, 0xf8, 0x25, 0x59, 0x7f, 0x43, 0x1b, 0x1c, 0xdc, 0x5e, 0xe9, + 0xd3, 0x9e, 0xe5, 0x8c, 0x76, 0xa1, 0xec, 0x41, 0x94, 0x4f, 0x59, 0xd4, 0xa0, 0x86, 0x76, 0x32, 0x85, 0xd9, 0xa2, 0x75, 0x97, 0xfb, 0x6c, 0x3a, 0x86, 0x82, 0x26, 0x9a, 0xfb, 0xdc, 0x8c, 0x49, + 0x8a, 0xe5, 0x28, 0xc5, 0xcd, 0xda, 0x50, 0x88, 0x1c, 0x46, 0xb6, 0xd9, 0x9a, 0xae, 0x79, 0xcd, 0x59, 0x2c, 0x85, 0x22, 0x5c, 0xfa, 0x06, 0xbc, 0xa5, 0x25, 0x15, 0xe6, 0x77, 0x14, 0xa1, 0xce, + 0x10, 0x0a, 0x3e, 0xf9, 0xa0, 0x9c, 0xdc, 0xd6, 0x7d, 0x79, 0x04, 0xad, 0x55, 0x46, 0x97, 0x4e, 0x6b, 0x9f, 0x3c, 0x17, 0x37, 0xfb, 0x01, 0x8e, 0x9a, 0x0f, 0x34, 0xd7, 0x76, 0xdf, 0xaa, 0x6c, + 0x7d, 0x6d, 0xa0, 0x78, 0xaf, 0xc3, 0xe2, 0x95, 0x39, 0x5e, 0x3b, 0xae, 0xee, 0x0c, 0xb4, 0xb8, 0x31, 0x8d, 0xab, 0xb1, 0xf8, 0xeb, 0x51, 0x9b, 0x85, 0x57, 0x6d, 0x96, 0xde, 0x61, 0x16, 0x65, + 0x64, 0x98, 0x56, 0xae, 0x5a, 0x8f, 0xcd, 0xc9, 0x57, 0x22, 0x9c, 0x3f, 0xa8, 0x76, 0xbc, 0xf0, 0x76, 0xdc, 0xb7, 0xf4, 0x78, 0x94, 0x49, 0x4a, 0x5d, 0x4b, 0x19, 0x0d, 0x8a, 0xe0, 0x52, 0x32, + 0x5b, 0x7b, 0x99, 0x1a, 0x93, 0x35, 0xce, 0x2b, 0x0a, 0xbc, 0xc2, 0x71, 0x26, 0x6b, 0x38, 0x50, 0x19, 0x85, 0x8b, 0x14, 0x89, 0x37, 0x6a, 0x14, 0xf3, 0xd0, 0x0c, 0x8e, 0x56, 0x0d, 0x1a, 0xd4, + 0x4b, 0xae, 0xc4, 0xa9, 0x7a, 0x29, 0xe3, 0xa4, 0x63, 0xb8, 0x8d, 0x3a, 0xdb, 0xae, 0xcb, 0x58, 0xce, 0x39, 0x6f, 0x3a, 0x04, 0x27, 0xc8, 0x33, 0xf9, 0xf6, 0x5d, 0xed, 0xb6, 0xf7, 0x0d, 0x6b, + 0xa4, 0x67, 0x02, 0xe0, 0x9f, 0xaf, 0x8f, 0xfa, 0xee, 0xd5, 0x22, 0xbf, 0xf1, 0xdf, 0xe4, 0x8f, 0x61, 0xbe, 0xde, 0xab, 0xed, 0x68, 0x3c, 0x87, 0x57, 0x9b, 0x8c, 0xa6, 0x41, 0x66, 0x2c, 0xd5, + 0x65, 0xb4, 0xd1, 0xa8, 0x0d, 0x00, 0x4f, 0xe3, 0x42, 0xae, 0x52, 0x25, 0xd7, 0x50, 0x53, 0x0f, 0x86, 0xb5, 0x8b, 0x8f, 0x2d, 0x17, 0x1f, 0x2f, 0xc5, 0xbd, 0xce, 0xc7, 0x75, 0x82, 0xeb, 0x55, + 0x9e, 0xd8, 0x90, 0x27, 0x9d, 0xa2, 0x9d, 0xc8, 0xd2, 0x5e, 0x08, 0x4e, 0x47, 0x94, 0x61, 0xcf, 0xc6, 0x07, 0x93, 0xda, 0x1c, 0x38, 0x5e, 0x67, 0xe7, 0x39, 0xc3, 0xbd, 0x0e, 0xef, 0x65, 0xaf, + 0x16, 0xe9, 0x2d, 0xc6, 0xee, 0x42, 0x1b, 0xe6, 0xdf, 0xb0, 0xef, 0xcf, 0x55, 0xa5, 0x30, 0x07, 0x07, 0x60, 0x98, 0xf7, 0x49, 0x4e, 0x85, 0x07, 0x07, 0xdb, 0x2d, 0x33, 0xab, 0xa6, 0xaa, 0xb0, + 0x4e, 0x28, 0x83, 0xb4, 0xc2, 0xf9, 0x0c, 0xf3, 0x4c, 0xfa, 0x10, 0x10, 0xf6, 0x0f, 0x8d, 0xec, 0x32, 0x72, 0xd3, 0xf2, 0xbd, 0x71, 0xcc, 0x3f, 0xfa, 0x41, 0x57, 0x94, 0xbb, 0x39, 0xf9, 0xe9, + 0xbc, 0xcf, 0x67, 0x9e, 0x19, 0xa7, 0xe4, 0x55, 0xd3, 0xcd, 0xa6, 0x9b, 0x2a, 0x51, 0x8e, 0x82, 0x7d, 0xaa, 0xf3, 0xcd, 0xbc, 0xd8, 0x23, 0xa7, 0x83, 0x20, 0x66, 0x11, 0x48, 0xac, 0x86, 0x29, + 0xb8, 0x30, 0x1b, 0x25, 0x64, 0x20, 0x93, 0xc1, 0x05, 0x6a, 0x84, 0x4e, 0x42, 0x8a, 0x1a, 0xee, 0xb1, 0x79, 0xbd, 0xde, 0x89, 0xcd, 0x96, 0x52, 0x72, 0x72, 0x28, 0x52, 0xd2, 0x8a, 0x4f, 0xcd, + 0x55, 0xbc, 0xd9, 0xf0, 0xeb, 0xa1, 0xad, 0x58, 0xc7, 0x67, 0x6e, 0x9e, 0x6f, 0xdc, 0xcc, 0x59, 0x9b, 0x9c, 0x8d, 0x0a, 0x35, 0x32, 0x3e, 0x97, 0x36, 0xfa, 0x77, 0x96, 0x06, 0x2e, 0x13, 0x43, + 0x2d, 0xcc, 0x41, 0x14, 0x17, 0xae, 0xe5, 0x3e, 0x54, 0x5e, 0xb0, 0xab, 0x38, 0xdb, 0xde, 0x43, 0x74, 0x4d, 0xfb, 0x3c, 0x48, 0xd7, 0x57, 0xba, 0x46, 0xc5, 0x3d, 0xc4, 0xa7, 0x1c, 0x18, 0xb8, + 0x02, 0xed, 0xda, 0x89, 0x3c, 0x1f, 0xe3, 0xba, 0xbf, 0xf0, 0x2c, 0x6b, 0xbe, 0x16, 0xd6, 0x21, 0x23, 0x79, 0xb0, 0xcd, 0x99, 0xd3, 0x91, 0xba, 0x5b, 0x9f, 0x30, 0x6e, 0x0e, 0x48, 0x9c, 0x1f, + 0xba, 0xcd, 0x58, 0xc2, 0xbc, 0x7d, 0x64, 0x67, 0x73, 0x89, 0x97, 0x4f, 0xa3, 0x7a, 0xc3, 0x8e, 0xc3, 0x22, 0xa6, 0x31, 0x2e, 0x1a, 0xab, 0x08, 0x15, 0x95, 0xa3, 0x9d, 0xc0, 0x3a, 0x05, 0xf8, + 0xfa, 0xfc, 0x3e, 0x2f, 0x76, 0xef, 0xce, 0xe9, 0xdb, 0x48, 0x21, 0x47, 0x0d, 0xfc, 0xbf, 0xfe, 0xeb, 0x5e, 0xb8, 0x8f, 0x1e, 0x47, 0x96, 0x6b, 0xbf, 0xe7, 0xe2, 0x5d, 0x7a, 0x26, 0x7e, 0x59, + 0x6a, 0x5b, 0x35, 0x8b, 0xfe, 0xfa, 0xaf, 0x7b, 0x41, 0x46, 0x6e, 0x98, 0xc4, 0x59, 0x31, 0x08, 0xd4, 0x53, 0xfb, 0xe0, 0x86, 0x7c, 0xa0, 0xbb, 0x9f, 0xb8, 0xe5, 0xfa, 0x27, 0x37, 0xca, 0x0b, + 0x35, 0x08, 0x4c, 0x63, 0x60, 0x07, 0xb1, 0xa6, 0x06, 0xc1, 0x85, 0x0a, 0x74, 0x1b, 0x75, 0x74, 0x36, 0x07, 0x93, 0xf0, 0xed, 0xe3, 0xbe, 0x92, 0x39, 0xbf, 0xdf, 0x1b, 0x85, 0x8f, 0xff, 0xbf, + 0xba, 0x27, 0x50, 0xbb, 0x8d, 0xd0, 0x4f, 0xbc, 0xf3, 0xb5, 0x39, 0xe4, 0x5b, 0x2d, 0xf0, 0xcb, 0x8b, 0x5e, 0x87, 0x30, 0x5c, 0x25, 0xe8, 0x5e, 0xe2, 0xa9, 0xae, 0x6e, 0x68, 0x0c, 0x7b, 0xa0, + 0xa9, 0xb9, 0x69, 0xb8, 0xd9, 0xa7, 0x77, 0x7c, 0x7d, 0x62, 0x7c, 0xfc, 0xc7, 0x0f, 0xb5, 0x92, 0xd6, 0x8c, 0x43, 0x35, 0xba, 0xe5, 0xe7, 0xff, 0xc7, 0x9b, 0xb2, 0xf2, 0xbf, 0xf7, 0xf1, 0x7a, + 0xdf, 0xce, 0x8e, 0xab, 0x1f, 0xdf, 0xf9, 0xe8, 0xbe, 0x25, 0xf1, 0x8a, 0xbc, 0xec, 0x28, 0x82, 0x83, 0xcb, 0xdf, 0xbe, 0xd5, 0xfc, 0x31, 0x1a, 0x1d, 0xe3, 0x47, 0x0b, 0x83, 0xd9, 0xb5, 0xbc, + 0x9b, 0x19, 0xf9, 0x29, 0xa4, 0x53, 0x6e, 0x32, 0x4f, 0x87, 0x87, 0x03, 0x58, 0x72, 0xd4, 0x18, 0x19, 0xa1, 0xcb, 0xc5, 0x2a, 0x5c, 0x03, 0xa8, 0x47, 0x05, 0x0e, 0x21, 0x61, 0x29, 0x5d, 0x18, + 0x85, 0x3d, 0xd9, 0xa1, 0x56, 0x53, 0x68, 0xab, 0x29, 0x77, 0x12, 0x1a, 0x04, 0xd9, 0x1a, 0x4e, 0x44, 0xeb, 0xcb, 0xaa, 0x44, 0x4a, 0xd8, 0x3a, 0xfc, 0x8d, 0x10, 0x80, 0x2e, 0xd8, 0x34, 0x2f, + 0xda, 0xe0, 0xb2, 0xbf, 0xd0, 0xed, 0x0d, 0x5d, 0x6f, 0xed, 0xdc, 0xee, 0x1f, 0x5f, 0x36, 0xc6, 0xfe, 0x0e, 0x87, 0x7c, 0x33, 0x80, 0x99, 0x3b, 0xf0, 0x1e, 0xad, 0xd2, 0xd8, 0x4b, 0x89, 0x62, + 0x17, 0x92, 0x67, 0x41, 0xd9, 0x1d, 0x0c, 0xb0, 0x7e, 0x09, 0x62, 0xa3, 0x8c, 0xdd, 0xb7, 0x2d, 0x8a, 0x6e, 0xe1, 0x56, 0x27, 0x89, 0x64, 0x0b, 0xd3, 0x54, 0xb8, 0x2a, 0x6a, 0x09, 0x86, 0xc8, + 0xd9, 0x48, 0x5c, 0x58, 0xc7, 0xe0, 0x08, 0xcb, 0x46, 0x4c, 0x1c, 0x03, 0xd8, 0x75, 0x61, 0xc1, 0x64, 0x5c, 0xd3, 0x74, 0x20, 0x86, 0xb1, 0x36, 0xe6, 0x0a, 0xb1, 0x38, 0x89, 0xc5, 0x4f, 0x50, + 0x4e, 0x98, 0x3a, 0x9b, 0x93, 0x56, 0x36, 0x29, 0x57, 0xcb, 0x2a, 0x32, 0xc6, 0x3d, 0x13, 0xc4, 0x3e, 0x75, 0x43, 0x78, 0x17, 0x4a, 0x7d, 0xa0, 0x0b, 0xde, 0xaa, 0x3a, 0x04, 0x6a, 0xf3, 0x8f, + 0xb2, 0xf9, 0x15, 0xe5, 0x0e, 0xc8, 0x4f, 0xe7, 0x7d, 0xd8, 0x1e, 0x1e, 0xcc, 0x32, 0x89, 0x05, 0x29, 0x4b, 0xc3, 0x10, 0x23, 0x9f, 0x37, 0xa1, 0x32, 0x43, 0x6d, 0x0f, 0x0e, 0x28, 0xbc, 0xad, + 0xeb, 0x57, 0x19, 0xf7, 0xa6, 0xe3, 0xd9, 0xab, 0x0b, 0x7a, 0x9f, 0x38, 0xe9, 0xb2, 0x70, 0x1f, 0xa5, 0xef, 0x42, 0xbf, 0xe1, 0x57, 0xb2, 0x8f, 0xce, 0x14, 0xcf, 0x48, 0x16, 0x6e, 0x30, 0xb8, + 0x90, 0x78, 0xce, 0x91, 0x5a, 0xa3, 0x90, 0x69, 0x21, 0x04, 0xf3, 0xfd, 0x51, 0x58, 0xb7, 0xe4, 0x56, 0x25, 0x25, 0xdb, 0x87, 0x61, 0x5f, 0xc8, 0x83, 0xa4, 0x54, 0x6a, 0xb5, 0x99, 0xd8, 0x58, + 0xce, 0x2f, 0x68, 0x0f, 0x9f, 0xad, 0x4a, 0x9d, 0x56, 0x35, 0x64, 0xd9, 0x44, 0x4c, 0xdd, 0xf2, 0xe2, 0x24, 0x61, 0xb8, 0x82, 0x85, 0x39, 0x2f, 0xde, 0xba, 0xc7, 0x2d, 0x4e, 0xbb, 0x7b, 0x4e, + 0x91, 0x35, 0x21, 0x5b, 0x03, 0x42, 0x4f, 0xb3, 0xf7, 0xcb, 0x06, 0xf7, 0x4d, 0x34, 0xde, 0x40, 0xcd, 0xec, 0xf2, 0xa3, 0xb0, 0xf4, 0xbf, 0xe0, 0x3b, 0x5b, 0xe0, 0xb6, 0x19, 0x99, 0x99, 0x5a, + 0xc4, 0xd9, 0xe0, 0xdd, 0x86, 0xfe, 0xb8, 0x75, 0x74, 0x73, 0x6b, 0xe7, 0xbc, 0x18, 0x7c, 0xf6, 0x5e, 0xdc, 0xa4, 0x24, 0xdd, 0xc4, 0x2d, 0xfd, 0x6b, 0x78, 0xbb, 0xa1, 0x7d, 0xb1, 0xa0, 0xef, + 0xd1, 0xe9, 0x93, 0x49, 0xf9, 0x25, 0xa2, 0xef, 0x91, 0x13, 0xe4, 0xe7, 0x71, 0x1b, 0xd7, 0xa4, 0xdf, 0x59, 0xe0, 0xe3, 0x42, 0xbf, 0x1a, 0x7f, 0xbb, 0x2d, 0xcc, 0xb7, 0x56, 0x52, 0xa3, 0x11, + 0x17, 0xc9, 0x55, 0x25, 0xc0, 0x2c, 0xbb, 0xb4, 0xf7, 0x73, 0x95, 0xe6, 0xee, 0x77, 0xa8, 0xfd, 0xe6, 0x4b, 0x4b, 0xd7, 0x78, 0xf0, 0x7d, 0xc4, 0x6f, 0xf4, 0x95, 0xef, 0x2b, 0x5d, 0xe3, 0xfc, + 0x55, 0xa5, 0x6b, 0x0c, 0x3a, 0x0a, 0xcf, 0xf9, 0x1a, 0xe0, 0xe5, 0x1c, 0xd9, 0x9a, 0xdc, 0xb1, 0x05, 0xe6, 0xc7, 0xd9, 0x7a, 0x1a, 0x92, 0x4d, 0x14, 0xe1, 0xcc, 0x84, 0x4e, 0xa0, 0x60, 0xb4, + 0x1d, 0xd3, 0xa3, 0x30, 0x20, 0x4e, 0xab, 0x7d, 0xb8, 0x04, 0x48, 0x74, 0x3b, 0xe4, 0x67, 0x10, 0x1f, 0xeb, 0xd3, 0x2c, 0xaa, 0x7d, 0xd1, 0x97, 0x0e, 0x33, 0xde, 0x95, 0x50, 0xd0, 0x4a, 0x26, + 0xb8, 0x6a, 0x09, 0x04, 0xed, 0x68, 0xa0, 0x7d, 0x1a, 0xed, 0x46, 0xe6, 0x95, 0xa4, 0xfd, 0xe2, 0xee, 0x7d, 0xfb, 0xec, 0xbf, 0x0c, 0x37, 0x2f, 0x40, 0xcd, 0x8d, 0x2e, 0x38, 0xf4, 0x60, 0x8c, + 0xf3, 0x67, 0x7d, 0xdf, 0x99, 0xf7, 0x15, 0x9f, 0xfb, 0x1f, 0xb2, 0xef, 0xd0, 0xbd, 0x77, 0xe6, 0xed, 0xe5, 0x7d, 0x5f, 0x1b, 0xa1, 0xd4, 0x50, 0x44, 0x46, 0xe7, 0xdb, 0x91, 0x9c, 0xf0, 0x07, + 0x8d, 0x15, 0x96, 0x3e, 0x7f, 0x12, 0x6b, 0x64, 0x01, 0x08, 0xc3, 0x63, 0xae, 0x71, 0x74, 0x34, 0x29, 0x16, 0x47, 0x61, 0xab, 0xc6, 0x39, 0x4f, 0xe9, 0xc7, 0x62, 0x56, 0x2e, 0x40, 0x99, 0x85, + 0x45, 0xef, 0xb4, 0x5f, 0xe0, 0x91, 0xe6, 0xdb, 0x6e, 0x3a, 0x6d, 0x1d, 0xc2, 0x3e, 0x46, 0xb6, 0xa5, 0x57, 0x04, 0x95, 0x1b, 0xe4, 0xf7, 0x65, 0xc5, 0x1e, 0x79, 0xa8, 0xfe, 0xb9, 0x89, 0x72, + 0xf7, 0x09, 0xe0, 0xe0, 0xfe, 0xf5, 0x3e, 0xd3, 0xa6, 0x13, 0xa1, 0xb5, 0x62, 0x54, 0x10, 0xc5, 0xae, 0x92, 0x24, 0x98, 0xc9, 0x08, 0xab, 0xec, 0x24, 0x5c, 0xac, 0xda, 0x92, 0x1f, 0xc5, 0x9e, + 0x97, 0x8d, 0x82, 0xda, 0xb7, 0xf1, 0x30, 0x80, 0xb2, 0x78, 0xd1, 0x92, 0xb2, 0x59, 0x0a, 0xd9, 0x68, 0x29, 0xa0, 0x23, 0x24, 0x0d, 0xf8, 0x23, 0x4c, 0xec, 0xb7, 0xf2, 0xc9, 0x96, 0x59, 0xf2, + 0xe4, 0xce, 0x75, 0x33, 0x3b, 0xa6, 0xca, 0x3a, 0x9c, 0x46, 0xe4, 0xa1, 0x6f, 0xd6, 0xb7, 0xfb, 0xee, 0x15, 0xfc, 0xeb, 0xae, 0x53, 0xf0, 0xfc, 0x73, 0x1c, 0x07, 0xa6, 0x1a, 0x0d, 0x2e, 0x01, + 0x3b, 0x1f, 0x12, 0xeb, 0xd6, 0x5e, 0xb8, 0x6c, 0x2d, 0x5d, 0xdf, 0xf5, 0x55, 0xdc, 0x7e, 0xb2, 0x74, 0xe1, 0xdb, 0xd8, 0x29, 0xf7, 0xdd, 0xff, 0xf8, 0xf1, 0xf3, 0x7f, 0x22, 0x75, 0xeb, 0x32, + 0x92, 0x7a, 0x1c, 0x04, 0xe6, 0xfb, 0x72, 0xf0, 0x88, 0x7d, 0x7e, 0xae, 0xf5, 0xdd, 0x12, 0xff, 0xe0, 0x9c, 0x3f, 0x97, 0xfa, 0xba, 0x9b, 0x8f, 0x44, 0x63, 0x8a, 0xfb, 0x5a, 0x0d, 0x22, 0xc2, + 0x45, 0x59, 0x50, 0x97, 0xe1, 0x68, 0x2e, 0x9d, 0x8c, 0xe8, 0xa0, 0x04, 0xae, 0x31, 0xd6, 0x55, 0xbb, 0xe5, 0x67, 0xc5, 0xd8, 0xa0, 0x87, 0x7e, 0x13, 0x69, 0x98, 0x58, 0xcd, 0xd9, 0xdd, 0x68, + 0x66, 0x09, 0x0b, 0x01, 0x0d, 0xe5, 0xa4, 0x3e, 0x0a, 0xf0, 0x76, 0x3f, 0x29, 0x0b, 0x8b, 0x3d, 0x11, 0x0b, 0x99, 0xd8, 0x79, 0x56, 0x31, 0x86, 0x80, 0xbf, 0xd1, 0xe2, 0xc8, 0xcd, 0x07, 0xa1, + 0xfa, 0x47, 0xe3, 0xb9, 0x65, 0xa2, 0xdc, 0x2c, 0x1e, 0xfe, 0x56, 0x9b, 0xaa, 0xff, 0xdd, 0xff, 0x9e, 0x7f, 0xbf, 0xfe, 0xff, 0xff, 0x14, 0x57, 0x5c, 0xaf, 0xdc, 0x8f, 0x24, 0xed, 0xcf, 0xf5, + 0xae, 0x2f, 0xd4, 0x3f, 0xf8, 0xe2, 0xd3, 0xb5, 0x4e, 0xee, 0xf6, 0x50, 0xc8, 0x30, 0x72, 0x0a, 0x09, 0xc9, 0xde, 0x24, 0x21, 0xdd, 0x4b, 0x62, 0x7d, 0x34, 0x5e, 0x2f, 0xeb, 0x76, 0xc3, 0xec, + 0x52, 0x81, 0x32, 0x60, 0x44, 0x87, 0xa1, 0x6d, 0x88, 0xa8, 0xa1, 0x31, 0x55, 0xb2, 0xe5, 0x66, 0x22, 0x23, 0x3c, 0xdd, 0xa8, 0x47, 0x08, 0x3e, 0x31, 0x0b, 0x31, 0x33, 0x43, 0x20, 0x8b, 0xa6, + 0xa2, 0x8c, 0x1a, 0x75, 0xa6, 0x31, 0xe8, 0x7e, 0x9f, 0xed, 0x6b, 0xd5, 0xb6, 0x26, 0x32, 0xdd, 0x33, 0x27, 0x57, 0xad, 0x54, 0x37, 0xe8, 0x62, 0x10, 0x3e, 0xbd, 0xf8, 0x83, 0xed, 0x84, 0x27, + 0xd5, 0x56, 0xbe, 0xcb, 0xef, 0xbe, 0xcd, 0x9e, 0xfa, 0x88, 0x9a, 0xfc, 0x12, 0x8f, 0xd9, 0x73, 0x63, 0xe4, 0x76, 0xdf, 0xe3, 0x96, 0x05, 0xef, 0xab, 0x7e, 0x5f, 0xd8, 0xf0, 0x59, 0xba, 0xd4, + 0x7f, 0x26, 0xc9, 0xbc, 0x76, 0x0d, 0x33, 0x2f, 0x06, 0x81, 0x1b, 0x3d, 0x5a, 0x0b, 0x5f, 0xdb, 0x93, 0xff, 0x44, 0xf7, 0xcc, 0xaf, 0x7f, 0xce, 0xfa, 0xee, 0xcf, 0xf3, 0x79, 0x18, 0x4b, 0x6a, + 0x90, 0x1f, 0x0f, 0x34, 0x37, 0x2f, 0x93, 0x46, 0x19, 0xee, 0x20, 0xc2, 0x57, 0x49, 0x2b, 0x50, 0x3c, 0xcf, 0x5d, 0x55, 0xcc, 0x81, 0x3a, 0xca, 0x6b, 0xb6, 0x70, 0x59, 0x8e, 0x28, 0xbd, 0x42, + 0x39, 0x66, 0xa4, 0xbe, 0xb3, 0x2c, 0xd5, 0x07, 0x4a, 0x61, 0x8a, 0x11, 0xc0, 0x5a, 0x23, 0xd6, 0x9a, 0x1a, 0x48, 0x49, 0xdd, 0x9a, 0x7b, 0xb7, 0xa5, 0x69, 0x7c, 0x3b, 0xb3, 0x5f, 0xf7, 0x39, + 0xdc, 0xd4, 0xe2, 0xf8, 0xfb, 0x2e, 0xa7, 0x5e, 0x43, 0x72, 0xed, 0x0d, 0xba, 0x4a, 0xb2, 0xbd, 0x37, 0x54, 0xc3, 0x97, 0x6c, 0xe5, 0x3f, 0x64, 0xc1, 0xc1, 0xa7, 0x93, 0x2e, 0x90, 0xa5, 0xc7, + 0x40, 0x69, 0x32, 0x6e, 0x79, 0x43, 0x7c, 0xbd, 0xdf, 0x42, 0xce, 0x1e, 0x66, 0xbd, 0x19, 0x4f, 0x6f, 0xcb, 0xe5, 0xcc, 0x3c, 0xa5, 0xac, 0x91, 0x51, 0xed, 0xcc, 0x58, 0x98, 0x15, 0x45, 0xbb, + 0x69, 0x76, 0x64, 0x6a, 0x21, 0xd0, 0xc2, 0x31, 0xcf, 0x31, 0xc9, 0x50, 0xf5, 0x11, 0x0b, 0x83, 0x36, 0x21, 0xb1, 0x14, 0x67, 0x2d, 0x87, 0x84, 0x69, 0xe3, 0xcf, 0xf1, 0xc8, 0xf6, 0x99, 0x35, + 0x0c, 0x5b, 0x60, 0xf0, 0x6c, 0xa0, 0xfe, 0x9d, 0x30, 0x9b, 0x61, 0xec, 0x7d, 0x8f, 0x33, 0xf1, 0x12, 0xce, 0x9f, 0xe8, 0x82, 0x83, 0xcf, 0x67, 0x03, 0xa2, 0x1f, 0xd2, 0x9c, 0xe0, 0xc9, 0x27, + 0xfd, 0xc8, 0xaf, 0x29, 0xc8, 0xac, 0x29, 0x26, 0x39, 0x41, 0x5c, 0x93, 0xc8, 0xb3, 0xaa, 0xb6, 0xf1, 0xd6, 0x6b, 0x61, 0x7e, 0x8e, 0x36, 0x85, 0x19, 0xa7, 0x27, 0x1c, 0xc3, 0x0e, 0x93, 0x18, + 0xdc, 0x6d, 0xec, 0x28, 0x83, 0xc1, 0xf9, 0xbc, 0x00, 0x5c, 0x1d, 0x75, 0x97, 0xe2, 0x69, 0x4b, 0x4c, 0x4b, 0x54, 0x34, 0x38, 0x18, 0x13, 0xd4, 0x3a, 0x3a, 0xec, 0xc3, 0xf9, 0x14, 0xff, 0x71, + 0x71, 0xa4, 0x87, 0xb8, 0x3d, 0x2e, 0xcb, 0xf2, 0xcf, 0xf9, 0x75, 0x1e, 0x3c, 0x03, 0x1c, 0x3c, 0xfa, 0xa5, 0x8f, 0xaf, 0xa7, 0x0b, 0x87, 0x68, 0xc3, 0x70, 0x08, 0x94, 0x40, 0x3e, 0xc9, 0x85, + 0x63, 0x4b, 0x93, 0x29, 0xaf, 0x9a, 0xde, 0x01, 0xa5, 0x67, 0x95, 0x33, 0x61, 0xf5, 0x80, 0x35, 0xdc, 0x93, 0xac, 0x2e, 0xf7, 0x25, 0x43, 0x11, 0xe8, 0x6e, 0xe5, 0x69, 0xa3, 0x48, 0x28, 0xe7, + 0x91, 0x61, 0x4c, 0x98, 0x79, 0x05, 0x39, 0x3e, 0xc0, 0xca, 0xa3, 0x31, 0x47, 0x05, 0xf9, 0xd1, 0x64, 0xb1, 0xbd, 0x69, 0xe3, 0xd3, 0x03, 0x2e, 0x6d, 0xff, 0x93, 0x5c, 0x9c, 0x3f, 0x2f, 0x1e, + 0x84, 0xbd, 0x94, 0xc6, 0x91, 0x7f, 0x53, 0x3c, 0x08, 0xeb, 0x97, 0xd6, 0x21, 0x8d, 0x97, 0x9a, 0x88, 0xf2, 0xd8, 0xd2, 0x39, 0x94, 0xa1, 0x34, 0x85, 0xcc, 0x78, 0xb5, 0x27, 0xe9, 0x89, 0xa7, + 0xab, 0x33, 0x12, 0x61, 0x57, 0x7c, 0x2a, 0x86, 0xb3, 0x49, 0x34, 0x87, 0x13, 0x8b, 0x30, 0xca, 0x7d, 0x33, 0x9b, 0xd7, 0xc5, 0x06, 0xa7, 0x68, 0x3c, 0xf2, 0xbd, 0x9a, 0x54, 0xd1, 0x85, 0xe1, + 0xee, 0x8a, 0x15, 0x3a, 0x45, 0x6a, 0x74, 0x49, 0xbb, 0x53, 0xb0, 0x71, 0xd1, 0x6a, 0x6d, 0xbe, 0xae, 0x9e, 0x5e, 0x4f, 0xf8, 0xbf, 0xfe, 0x45, 0xdc, 0xd9, 0xf1, 0x78, 0x58, 0x70, 0xe8, 0xcb, + 0x06, 0x4f, 0x7e, 0x5d, 0x70, 0xe8, 0x41, 0x05, 0xd4, 0x7f, 0xf7, 0xd0, 0x7f, 0x5b, 0x60, 0xe2, 0xb5, 0x90, 0xe6, 0x47, 0x05, 0x26, 0x7a, 0x86, 0x34, 0x53, 0x65, 0xc5, 0x8a, 0x99, 0x68, 0x6d, + 0x79, 0x99, 0x5f, 0xe8, 0x85, 0xb6, 0x83, 0x59, 0x50, 0x9e, 0x8b, 0x3b, 0x78, 0x34, 0xc4, 0xe7, 0xad, 0xbe, 0xc9, 0xed, 0x91, 0x46, 0x6a, 0xc6, 0x81, 0xa4, 0xcb, 0xb4, 0xcc, 0x30, 0xbb, 0xc2, + 0x55, 0x36, 0x65, 0x24, 0xd5, 0xc1, 0x47, 0x0a, 0xb1, 0x08, 0x85, 0xd1, 0x71, 0x7a, 0x1a, 0x6e, 0x0f, 0xfa, 0xba, 0x08, 0xac, 0x23, 0x92, 0x29, 0xd3, 0xd2, 0x2e, 0x6e, 0x7b, 0x86, 0xff, 0x60, + 0xd0, 0x6f, 0x2a, 0x56, 0x0c, 0xff, 0x7d, 0xc3, 0x94, 0xa9, 0x49, 0xf2, 0xd8, 0x24, 0x78, 0xc9, 0xd1, 0xd0, 0x91, 0x3c, 0xeb, 0x55, 0xdd, 0x41, 0x1f, 0x57, 0x02, 0x3c, 0x28, 0x84, 0x2d, 0xe9, + 0x9d, 0x46, 0xe3, 0xd4, 0x93, 0x1a, 0xde, 0x97, 0x67, 0x15, 0x05, 0x6d, 0xf9, 0x92, 0x63, 0x8b, 0xe4, 0xa7, 0x1e, 0xb8, 0x3a, 0x73, 0x0b, 0x73, 0x60, 0xb9, 0x81, 0x39, 0xb8, 0xd4, 0x85, 0xfb, + 0x46, 0xc4, 0xff, 0x7c, 0xbb, 0xf8, 0x0b, 0xf5, 0xee, 0x3b, 0x6f, 0xae, 0xf5, 0xad, 0x27, 0x48, 0x55, 0x8c, 0xde, 0x2a, 0xc3, 0x65, 0x24, 0x58, 0x29, 0xea, 0xc6, 0x42, 0xeb, 0x65, 0x63, 0x9f, + 0x21, 0xdb, 0x23, 0x16, 0x8e, 0xa8, 0xd6, 0x27, 0x40, 0x92, 0x6b, 0x41, 0x9a, 0x26, 0xe3, 0x88, 0x35, 0x4b, 0x90, 0xc4, 0xac, 0x3a, 0xe3, 0x62, 0xdd, 0x0c, 0xd7, 0xc8, 0x96, 0x5a, 0xce, 0xa8, + 0x20, 0x8a, 0x68, 0x1e, 0x50, 0x68, 0x01, 0x50, 0x3c, 0x6a, 0x37, 0x2c, 0x55, 0x18, 0xdc, 0x1c, 0xc0, 0xbf, 0x11, 0xe5, 0x16, 0x96, 0x59, 0x58, 0x66, 0x8e, 0x9a, 0xbf, 0x27, 0x72, 0xc1, 0x5f, + 0xbc, 0x20, 0x77, 0xc3, 0xe0, 0x3e, 0xcb, 0x97, 0xab, 0xda, 0x8d, 0x17, 0x01, 0x74, 0x65, 0x3b, 0x3d, 0x88, 0x46, 0xbc, 0x6c, 0xa3, 0x0e, 0x7b, 0x70, 0xec, 0xf5, 0xee, 0xea, 0xfd, 0x95, 0xe3, + 0x15, 0x01, 0xf2, 0x89, 0x2e, 0x38, 0xf8, 0x7c, 0xd6, 0xa7, 0x46, 0xcd, 0x79, 0x34, 0x37, 0x02, 0xef, 0x4c, 0x97, 0xb4, 0xe9, 0x29, 0xf2, 0x61, 0xe4, 0x0c, 0xa1, 0x71, 0xec, 0xac, 0x20, 0x72, + 0x9a, 0x91, 0x07, 0x75, 0x61, 0x5a, 0x19, 0xb2, 0xe2, 0x28, 0x0b, 0x5d, 0x4f, 0xc3, 0x64, 0xe2, 0x7b, 0x6b, 0x17, 0xc5, 0x4c, 0xb9, 0xdd, 0xca, 0x94, 0xb4, 0x17, 0xbd, 0xe9, 0xb6, 0x50, 0x96, + 0x22, 0xab, 0xcf, 0xa0, 0x29, 0xb2, 0x67, 0x45, 0x07, 0x88, 0x73, 0x7a, 0x95, 0xdb, 0xbc, 0x1b, 0x3e, 0xad, 0x55, 0xf6, 0x0f, 0x88, 0x80, 0xf7, 0xea, 0x1f, 0x8f, 0xa0, 0xfc, 0xb9, 0x04, 0xe8, + 0x28, 0x9e, 0x41, 0x3c, 0xff, 0xed, 0x9b, 0x6f, 0xbc, 0x62, 0xe5, 0x3d, 0xec, 0x52, 0xd2, 0x52, 0xda, 0xdb, 0x94, 0x14, 0x91, 0xfb, 0x9d, 0xe7, 0x96, 0x00, 0x77, 0x74, 0xda, 0xbd, 0xc4, 0xe4, + 0x95, 0x95, 0x8c, 0x42, 0xbd, 0x94, 0x43, 0xd2, 0x10, 0xf6, 0x2c, 0x0b, 0x81, 0x13, 0xaf, 0xc8, 0xf6, 0xf5, 0x8c, 0x6a, 0x68, 0x02, 0x01, 0xc3, 0xc9, 0x51, 0x2b, 0x56, 0xf9, 0xdc, 0x9b, 0x2d, + 0x54, 0x03, 0xaa, 0x17, 0x79, 0x6c, 0x60, 0xa7, 0x4c, 0xa4, 0xa6, 0x3f, 0x69, 0xa3, 0x02, 0xf5, 0x6a, 0x37, 0xd3, 0xaa, 0x41, 0xe0, 0x7e, 0x9b, 0xa7, 0xfd, 0x73, 0xd6, 0x7b, 0xa3, 0x09, 0x0e, + 0xde, 0x8f, 0xfa, 0xb2, 0x1c, 0x5a, 0x1b, 0x73, 0xd7, 0x50, 0xda, 0x74, 0xb8, 0x19, 0x43, 0x04, 0x26, 0xad, 0xa6, 0xc2, 0x50, 0x4c, 0xd6, 0xc2, 0x8e, 0x42, 0x6b, 0x4f, 0xa2, 0x82, 0xc5, 0x91, + 0x73, 0xca, 0x10, 0xf1, 0x77, 0x7a, 0x05, 0x62, 0xb0, 0x10, 0x21, 0x66, 0xb8, 0x85, 0x8c, 0x56, 0xdf, 0x1e, 0xb1, 0x52, 0x91, 0x56, 0xa6, 0x57, 0xb3, 0x95, 0x8d, 0x4f, 0xf3, 0x4a, 0x33, 0x82, + 0xc3, 0x0a, 0x98, 0xc9, 0x53, 0xbd, 0x18, 0xfd, 0x71, 0x54, 0xff, 0x6f, 0x6f, 0x18, 0xdc, 0x97, 0x19, 0x7f, 0xfd, 0x1f, 0x96, 0x9a, 0x17, 0xae, 0xd5, 0x82, 0xaa, 0x57, 0x0d, 0xf4, 0x38, 0x4c, + 0xdc, 0xe0, 0xdb, 0x22, 0x01, 0x3f, 0x07, 0xe6, 0xee, 0x13, 0xce, 0x76, 0xe0, 0xa7, 0xd3, 0xbe, 0x4e, 0x7d, 0xbb, 0x9a, 0xac, 0xf7, 0x7c, 0x22, 0xe5, 0xc7, 0x6c, 0xb1, 0x45, 0x29, 0x4c, 0x95, + 0x26, 0xab, 0x85, 0xa1, 0x05, 0x2b, 0xa8, 0xa0, 0x53, 0x0c, 0x19, 0xcf, 0x41, 0x44, 0xaa, 0x47, 0x71, 0xa3, 0xb9, 0x01, 0xe9, 0xc0, 0x70, 0x19, 0xd7, 0x30, 0x74, 0x2a, 0x04, 0x64, 0x5e, 0xce, + 0xd4, 0x13, 0x3f, 0xb6, 0x3c, 0x2d, 0xcb, 0x95, 0x61, 0x14, 0x00, 0xd1, 0x26, 0x18, 0x7a, 0xb4, 0xe0, 0x79, 0x43, 0x51, 0xb8, 0xd2, 0xa1, 0xdf, 0xba, 0xaf, 0xdd, 0x2e, 0xe5, 0x5e, 0xf5, 0xa6, + 0x6a, 0xc1, 0xc8, 0xef, 0x07, 0xd9, 0x21, 0xff, 0xc7, 0xe7, 0x5c, 0x37, 0xd0, 0x7d, 0xb4, 0x5f, 0x0f, 0xfd, 0x86, 0x5f, 0x69, 0x5d, 0x70, 0x4b, 0xfd, 0x62, 0x8f, 0x5c, 0x88, 0x3d, 0xc7, 0x8d, + 0xe4, 0xa7, 0x22, 0x09, 0x43, 0x34, 0xaf, 0x2e, 0x36, 0x91, 0x2d, 0x47, 0xab, 0xd5, 0xc6, 0xb4, 0x81, 0xb5, 0x7d, 0x4a, 0x73, 0x97, 0x2c, 0x39, 0x2c, 0x14, 0xb4, 0x78, 0x3f, 0x6c, 0xf1, 0x84, + 0x10, 0x86, 0xf4, 0x89, 0x13, 0x0f, 0xd3, 0x7c, 0xa9, 0x64, 0x6a, 0xed, 0x02, 0xe3, 0x98, 0xe6, 0xf7, 0x87, 0xb1, 0x8a, 0xd0, 0xce, 0x32, 0xdd, 0xca, 0xfb, 0x59, 0xc5, 0xd1, 0x96, 0xbd, 0x87, + 0x70, 0x64, 0xf5, 0x40, 0xac, 0xdd, 0x80, 0x72, 0x0a, 0xd5, 0x4c, 0x3f, 0xa9, 0x3e, 0x78, 0xfe, 0xb8, 0xc1, 0x77, 0x0d, 0x8c, 0xe0, 0x97, 0xaa, 0x77, 0xdc, 0x7d, 0x02, 0x38, 0xf8, 0x74, 0xd2, + 0x31, 0x57, 0x0f, 0xe1, 0x25, 0x2d, 0xc6, 0x88, 0xa4, 0x9d, 0x18, 0x91, 0xc7, 0x5d, 0x73, 0xe1, 0x59, 0x0b, 0xee, 0x40, 0x3a, 0xc1, 0x41, 0xb7, 0x36, 0x7b, 0x04, 0xcf, 0x91, 0x4a, 0xb5, 0xe4, + 0xe3, 0x56, 0x57, 0x98, 0xa3, 0xc4, 0xac, 0x1b, 0x57, 0xdd, 0x29, 0xf2, 0x94, 0x66, 0xa7, 0xb5, 0x11, 0xc0, 0x08, 0xa9, 0xb4, 0xf6, 0x10, 0x02, 0xac, 0x58, 0x3e, 0x20, 0xde, 0xc4, 0x2e, 0xb2, + 0x54, 0xa0, 0xf0, 0x94, 0x2f, 0x79, 0xe1, 0x99, 0xcd, 0x70, 0x9f, 0xdf, 0x0c, 0xd3, 0x32, 0xb3, 0xf3, 0xda, 0xaa, 0xc7, 0x51, 0xf4, 0x79, 0x43, 0xe3, 0x41, 0xbc, 0x8f, 0xaa, 0x69, 0x59, 0x47, + 0xfb, 0x11, 0xae, 0x3f, 0xdf, 0x2b, 0xb8, 0x90, 0x3c, 0xcf, 0xd3, 0xee, 0xa0, 0x77, 0x2d, 0x8f, 0xc8, 0x24, 0xc1, 0x85, 0xbb, 0x05, 0x9d, 0xd3, 0xc2, 0x91, 0xf1, 0xc4, 0xa0, 0x23, 0x6d, 0x5c, + 0x9c, 0x46, 0xb4, 0xb7, 0x11, 0xd9, 0x4c, 0x86, 0xa0, 0x0d, 0x78, 0xaa, 0x36, 0x42, 0x38, 0x4c, 0xd6, 0x33, 0x3f, 0xc0, 0x9b, 0x72, 0x9e, 0xcd, 0x23, 0x29, 0x02, 0x0f, 0x85, 0xc8, 0xf3, 0x16, + 0x5f, 0x50, 0x96, 0x42, 0x82, 0xf0, 0xae, 0x30, 0x1d, 0x3f, 0x3f, 0xed, 0xc9, 0x54, 0x17, 0x5d, 0xf7, 0x51, 0x3a, 0xd7, 0x0d, 0x04, 0x17, 0x6f, 0xed, 0x20, 0x88, 0x6d, 0xfb, 0xfb, 0x18, 0xd0, + 0x57, 0xc0, 0xb8, 0x26, 0xde, 0xc1, 0x72, 0x7d, 0xa9, 0x4f, 0xb5, 0xb6, 0x33, 0x40, 0xc8, 0xd8, 0xdb, 0x89, 0x4a, 0x23, 0x6e, 0x2a, 0xc7, 0x5c, 0x57, 0x73, 0x6d, 0x9c, 0x07, 0x33, 0x41, 0x5e, + 0xef, 0xfd, 0x0c, 0x10, 0xbc, 0x4d, 0xb1, 0x8e, 0xb2, 0xd5, 0x06, 0x45, 0x2d, 0xe0, 0xb0, 0x38, 0xae, 0x4e, 0xe6, 0x69, 0x9b, 0x28, 0x7a, 0x7a, 0xb0, 0x47, 0x9e, 0x8a, 0xae, 0x30, 0x63, 0x2c, + 0x85, 0xa7, 0x93, 0x5d, 0x8b, 0x80, 0x0a, 0x21, 0xa4, 0xb7, 0x6b, 0x86, 0x9b, 0x89, 0x8b, 0x2e, 0x4b, 0xf7, 0xcb, 0xbe, 0xe4, 0x45, 0x60, 0xdd, 0xb7, 0xcc, 0x3a, 0x11, 0xf6, 0x63, 0x04, 0xbc, + 0xea, 0x4d, 0x66, 0x5f, 0x08, 0x3c, 0xff, 0x50, 0x0f, 0xb5, 0x0e, 0x2b, 0xbb, 0x12, 0xe3, 0x21, 0x32, 0x52, 0xa3, 0x56, 0x6e, 0x97, 0xeb, 0xb9, 0x28, 0x2f, 0xb5, 0x39, 0x50, 0x45, 0xd1, 0x56, + 0xae, 0xa6, 0x50, 0x38, 0x0c, 0x43, 0x5f, 0x87, 0x45, 0x16, 0x88, 0x1a, 0x2a, 0x49, 0xfc, 0xc9, 0x8a, 0x5b, 0xac, 0x20, 0x55, 0xc1, 0x0c, 0x2d, 0x38, 0x4c, 0xf8, 0x78, 0x2e, 0x38, 0x4e, 0x08, + 0xf8, 0xa7, 0x29, 0xa6, 0xec, 0x5b, 0x7f, 0x1c, 0x73, 0x36, 0xd6, 0x43, 0x56, 0x9f, 0x97, 0x9b, 0xc1, 0x4d, 0xa1, 0x84, 0x2f, 0xe1, 0x7d, 0xdd, 0x4d, 0x5d, 0xb5, 0xbd, 0xbc, 0x78, 0x4f, 0x5a, + 0x74, 0x23, 0xfb, 0xd2, 0x5d, 0xec, 0x4e, 0x60, 0xe3, 0xe5, 0x56, 0xdd, 0x31, 0x43, 0x75, 0x50, 0x64, 0xea, 0x19, 0xcf, 0xf7, 0x32, 0x0a, 0x37, 0x65, 0xcf, 0x3e, 0x82, 0xb5, 0x2e, 0x41, 0x9b, + 0x0f, 0x22, 0x2b, 0x3a, 0xdb, 0x50, 0x0d, 0x2e, 0xb5, 0x07, 0xfe, 0x39, 0xe7, 0xd5, 0x1f, 0xb2, 0xef, 0x8e, 0xd6, 0xee, 0xa4, 0xaf, 0x8b, 0x4a, 0x49, 0x26, 0xc1, 0x81, 0x4d, 0x25, 0x1e, 0xdd, + 0xcd, 0xc7, 0x21, 0xeb, 0x6a, 0x86, 0x75, 0x3c, 0xa5, 0x13, 0x19, 0x0b, 0x22, 0x6f, 0x5a, 0xc6, 0xfc, 0x69, 0x3f, 0x14, 0xa1, 0x78, 0x3a, 0x4b, 0x2c, 0x03, 0x3c, 0x0d, 0xd3, 0x25, 0x73, 0x50, + 0xb3, 0xd2, 0xcf, 0x5c, 0x83, 0xc6, 0xbc, 0x72, 0xb5, 0x46, 0x66, 0x12, 0xe7, 0xd6, 0xfb, 0x6d, 0x93, 0x91, 0xc7, 0x74, 0x5b, 0xa8, 0xb2, 0x4a, 0x48, 0x3b, 0xf9, 0x99, 0x01, 0x7d, 0x7f, 0x14, + 0xbf, 0x78, 0xc3, 0x1f, 0x14, 0x7c, 0xec, 0x69, 0x7e, 0xff, 0xb9, 0xfe, 0x35, 0xde, 0xf8, 0xf3, 0x40, 0xff, 0x10, 0xea, 0x3b, 0x3e, 0x6d, 0xec, 0x8b, 0x26, 0xf3, 0xeb, 0x11, 0xdc, 0xb0, 0x9a, + 0x98, 0x1b, 0x4b, 0xe2, 0xe0, 0xfd, 0x5a, 0x48, 0x6b, 0x28, 0x26, 0x17, 0xee, 0x8c, 0x8a, 0xab, 0xc3, 0x89, 0xe4, 0x86, 0x02, 0x4c, 0xdb, 0x00, 0x26, 0x66, 0x74, 0x6d, 0x71, 0x66, 0xbd, 0xc5, + 0x13, 0x30, 0x0b, 0xb9, 0xd2, 0xd4, 0x46, 0xc5, 0x51, 0xf1, 0xb6, 0x70, 0xd6, 0x60, 0xab, 0xb8, 0x85, 0xa9, 0x6c, 0x6c, 0xdb, 0x71, 0x3a, 0x4f, 0xac, 0x34, 0x35, 0x16, 0x58, 0x16, 0x47, 0xc6, + 0xe7, 0x19, 0xf2, 0xeb, 0x8e, 0xbc, 0xfc, 0xf5, 0x19, 0xbe, 0xaf, 0x40, 0x3f, 0x02, 0xea, 0xb6, 0xe0, 0x60, 0x7f, 0xa0, 0xbe, 0xf3, 0xe6, 0x7d, 0xdd, 0xa9, 0xf9, 0xf5, 0x08, 0xac, 0x4a, 0xb5, + 0xf4, 0x0a, 0x67, 0xbd, 0x83, 0xc2, 0x0a, 0xf6, 0x09, 0xc2, 0x63, 0x0e, 0x64, 0xf0, 0x39, 0x3d, 0xce, 0xa8, 0xe2, 0x44, 0x54, 0x86, 0xb3, 0x55, 0xfd, 0xb3, 0xe9, 0x50, 0xf1, 0x19, 0x43, 0xe1, + 0x2d, 0xca, 0x4c, 0x66, 0xf0, 0x64, 0x11, 0xad, 0x5a, 0x60, 0xbb, 0x4a, 0x09, 0x43, 0x5c, 0x6e, 0xb6, 0xb0, 0x06, 0xb0, 0xf4, 0x3e, 0xa5, 0x67, 0x7a, 0xe1, 0x1b, 0xbb, 0x23, 0x86, 0x99, 0x70, + 0xfd, 0x18, 0xac, 0x9b, 0x4f, 0xbd, 0xc3, 0xa3, 0xdd, 0x2f, 0xb7, 0x9e, 0xbd, 0xd1, 0xcd, 0xf6, 0xdd, 0xe5, 0x7b, 0x7e, 0x50, 0x4e, 0xfc, 0xd7, 0xaf, 0xaf, 0x1e, 0xbe, 0xab, 0x0a, 0x54, 0xbf, + 0x3e, 0x84, 0xc9, 0xaf, 0x3b, 0x43, 0xf9, 0xc5, 0x2b, 0xf7, 0xeb, 0xd7, 0xed, 0x0e, 0x0e, 0xf2, 0x37, 0x06, 0xf2, 0x9e, 0x77, 0x6e, 0xf8, 0xa5, 0xa0, 0xd1, 0xaf, 0x47, 0x83, 0x48, 0x97, 0xbb, + 0x1c, 0xb6, 0x59, 0x6d, 0x9c, 0xe6, 0x1c, 0xbb, 0x50, 0x82, 0xcc, 0xb2, 0xea, 0xa0, 0xb4, 0x09, 0x8e, 0xf1, 0xf5, 0x28, 0xf1, 0xf2, 0xe1, 0x61, 0x13, 0xae, 0xe0, 0x0d, 0xe5, 0x00, 0x21, 0x85, + 0x42, 0x7b, 0x88, 0x16, 0xe3, 0xc2, 0xa2, 0x15, 0xc8, 0x40, 0xf6, 0xfb, 0x5c, 0x4a, 0x36, 0xe1, 0x26, 0xe4, 0xb8, 0x25, 0x7e, 0x1c, 0x8d, 0x50, 0x4e, 0xa5, 0xd0, 0x25, 0x10, 0x68, 0xee, 0x91, + 0xfa, 0xdb, 0x83, 0x78, 0xe3, 0xa9, 0xc3, 0xbe, 0x81, 0xfb, 0x7f, 0xfb, 0xfc, 0xf7, 0x4a, 0x9a, 0x7f, 0xb7, 0x9d, 0xf3, 0x37, 0xa4, 0xf9, 0x1d, 0x11, 0xd3, 0x43, 0x9a, 0xc3, 0x83, 0xd1, 0x96, + 0x93, 0xea, 0x76, 0x31, 0x17, 0xd1, 0x60, 0xae, 0x51, 0xec, 0x51, 0x25, 0x11, 0x64, 0xac, 0xe6, 0x28, 0xa2, 0xd8, 0xb7, 0xba, 0xc2, 0x55, 0xb0, 0xf3, 0x7d, 0x8b, 0xf8, 0x95, 0xde, 0x3d, 0x9f, + 0xe8, 0xbe, 0xbf, 0xff, 0xe5, 0x6c, 0x80, 0xf5, 0xeb, 0xdc, 0x73, 0xd2, 0xc6, 0x64, 0x36, 0x59, 0x52, 0x22, 0x9c, 0x69, 0x9e, 0x7b, 0xa0, 0x35, 0xc4, 0x49, 0xd9, 0x19, 0xc3, 0xcb, 0xab, 0xc6, + 0x2e, 0x7c, 0x82, 0xdf, 0xef, 0x1a, 0x05, 0x5d, 0x28, 0x35, 0x8d, 0xce, 0x70, 0xbe, 0x68, 0x34, 0x49, 0xd9, 0x4e, 0xa2, 0x48, 0x70, 0xe1, 0x95, 0xdf, 0x00, 0x0b, 0x3a, 0x76, 0x8c, 0x4d, 0x30, + 0x4b, 0x10, 0x04, 0xa9, 0x0f, 0xd4, 0x6a, 0xe1, 0x98, 0xca, 0x72, 0x2b, 0x4c, 0x7b, 0x68, 0x10, 0x97, 0x3a, 0x5d, 0x7a, 0x1c, 0x55, 0x66, 0x76, 0x2f, 0xee, 0xe3, 0x06, 0xbd, 0x36, 0x54, 0x8b, + 0x6f, 0xf3, 0xcd, 0x7f, 0x6e, 0xd4, 0xbc, 0x13, 0xed, 0x70, 0xbb, 0x1c, 0x76, 0xb2, 0xb2, 0x87, 0x15, 0xb3, 0xc1, 0x50, 0x73, 0x63, 0xad, 0xa9, 0x45, 0x99, 0xf8, 0x76, 0xc9, 0xec, 0x5b, 0x3d, + 0xd3, 0xb1, 0x74, 0x49, 0xfa, 0x27, 0x42, 0x71, 0xcb, 0xf5, 0xde, 0xf5, 0xd4, 0xa9, 0x58, 0x4b, 0x23, 0x91, 0x29, 0x20, 0x19, 0x9c, 0xf3, 0xec, 0xa8, 0x82, 0x54, 0x95, 0xc8, 0x64, 0x02, 0xc6, + 0x9b, 0xa3, 0xa7, 0x8c, 0xb2, 0xa5, 0x41, 0x0d, 0x25, 0x83, 0xd3, 0x93, 0xc3, 0x4c, 0x64, 0xb9, 0x14, 0xd8, 0x55, 0x4f, 0x33, 0x8d, 0xee, 0xe3, 0x18, 0xc5, 0x59, 0xa8, 0x06, 0xee, 0xc9, 0x1c, + 0x24, 0xea, 0xd5, 0x2a, 0xfe, 0x49, 0x66, 0x25, 0xae, 0x1e, 0xbf, 0xe3, 0xf7, 0x5e, 0x25, 0xea, 0x3e, 0xce, 0x99, 0xee, 0x7c, 0xe7, 0xe3, 0x7e, 0x81, 0x3f, 0xcf, 0x14, 0xcf, 0x08, 0x9f, 0xff, + 0xf6, 0x29, 0x57, 0x01, 0x0f, 0x00, 0xdd, 0x1b, 0xf3, 0xb0, 0xc5, 0x31, 0x86, 0x49, 0xf0, 0xc3, 0x8c, 0x31, 0xdb, 0xc6, 0x4d, 0x74, 0x76, 0xee, 0x4d, 0xa9, 0xdb, 0x49, 0x95, 0xd9, 0xdf, 0xf7, + 0x2f, 0x7c, 0xc9, 0x0c, 0x79, 0x23, 0xda, 0xbd, 0xb4, 0xfd, 0xde, 0xad, 0xb0, 0x97, 0xd9, 0x41, 0x00, 0xe4, 0x31, 0x35, 0x35, 0x6d, 0x76, 0x4a, 0x24, 0x72, 0xbd, 0x03, 0x8e, 0x2a, 0xbe, 0x46, + 0x48, 0x35, 0x5f, 0xc4, 0xb6, 0xb9, 0xe3, 0x4e, 0xfa, 0xbc, 0xa0, 0x16, 0xbc, 0x91, 0x70, 0x0c, 0xd3, 0x52, 0x36, 0x0c, 0x59, 0xd0, 0x50, 0x15, 0x66, 0x87, 0xb1, 0xa6, 0x4f, 0xd3, 0xb9, 0x05, + 0x6e, 0xa4, 0x1a, 0x9e, 0x7a, 0x94, 0x02, 0xa4, 0x08, 0xa8, 0x4d, 0xc7, 0x36, 0x4a, 0x57, 0x65, 0xc6, 0xa2, 0x5f, 0x9a, 0x8b, 0xa8, 0x79, 0x1b, 0xe9, 0xfe, 0xc3, 0x96, 0x3f, 0xd0, 0x4b, 0x5d, + 0x1b, 0xdf, 0x89, 0x9e, 0xbf, 0xfa, 0xed, 0x70, 0x00, 0x3d, 0xef, 0xd1, 0x08, 0x0f, 0x9a, 0xe1, 0x48, 0xb1, 0x50, 0x02, 0x6a, 0x31, 0x22, 0x8b, 0xb5, 0x56, 0xf2, 0x57, 0x27, 0x5a, 0xf1, 0x8d, + 0x95, 0x80, 0xfa, 0xb7, 0xef, 0x7d, 0xdd, 0x7c, 0xe6, 0x1f, 0xe4, 0xb1, 0x4f, 0x84, 0xcf, 0xef, 0xff, 0xe9, 0xb4, 0x0f, 0xc7, 0x9d, 0x47, 0xce, 0xe7, 0xd7, 0x1e, 0x9d, 0x52, 0xce, 0x28, 0x69, + 0x20, 0xe9, 0xc8, 0x2f, 0x00, 0x6c, 0xab, 0x9d, 0x62, 0x77, 0x07, 0x46, 0xa2, 0xcf, 0x50, 0x47, 0xbe, 0x34, 0x90, 0xb2, 0x8a, 0x96, 0x69, 0x49, 0xc3, 0x60, 0x33, 0x54, 0x47, 0xd3, 0xad, 0xc2, + 0x2d, 0x45, 0x88, 0xd2, 0x4f, 0x29, 0x0b, 0x6d, 0x23, 0x7c, 0x14, 0xcb, 0xa0, 0x28, 0x6e, 0xe1, 0x95, 0xb6, 0x67, 0x55, 0x4f, 0x49, 0x12, 0x74, 0x41, 0x16, 0x5f, 0x47, 0xae, 0x2c, 0x62, 0x5d, + 0x8d, 0xa2, 0x87, 0x11, 0x87, 0xd8, 0x6f, 0xfc, 0x95, 0xef, 0xff, 0x20, 0x7b, 0xfe, 0xfa, 0x8f, 0x93, 0x41, 0x47, 0xed, 0xf9, 0xb7, 0x27, 0x47, 0x66, 0x3a, 0x5e, 0x3a, 0xa4, 0xe6, 0x6f, 0x4d, + 0x5a, 0x92, 0x3d, 0x98, 0x5f, 0x21, 0xe3, 0xb1, 0x6c, 0x4a, 0xa2, 0xba, 0xf2, 0xb5, 0x9d, 0xdb, 0xa2, 0xbc, 0x32, 0xaa, 0xf8, 0x1d, 0xac, 0xa5, 0xa3, 0xea, 0xd8, 0x30, 0x1b, 0x62, 0x07, 0xb8, + 0x93, 0x90, 0x6e, 0xc7, 0x93, 0xa2, 0x74, 0x90, 0x0d, 0xb7, 0x74, 0x8f, 0xc1, 0x3c, 0x70, 0x7d, 0x49, 0x85, 0x13, 0x68, 0xb5, 0xdf, 0xcb, 0xa8, 0x68, 0xd4, 0x3d, 0x56, 0x80, 0x6f, 0xb2, 0xeb, + 0x02, 0x77, 0xd0, 0x99, 0x8c, 0xe8, 0x5f, 0x17, 0xfb, 0xef, 0xa6, 0xbc, 0xb5, 0x1e, 0xc4, 0xd1, 0x9f, 0x1c, 0x95, 0xeb, 0x90, 0xb3, 0x6e, 0x5d, 0x79, 0xef, 0x2d, 0x7b, 0x37, 0x1a, 0x4c, 0xcf, + 0xe2, 0xbc, 0xcb, 0x1b, 0xa8, 0xfe, 0xba, 0xbb, 0x35, 0x73, 0x5b, 0xca, 0x7b, 0xf8, 0x35, 0x98, 0xac, 0x9b, 0x23, 0x03, 0x27, 0x8e, 0xfd, 0xfc, 0x3e, 0x0d, 0xc7, 0xc8, 0x06, 0x8e, 0x9b, 0x17, + 0xb1, 0x9d, 0xa9, 0xe1, 0xbb, 0xad, 0x0a, 0xdf, 0xee, 0x13, 0x5d, 0xdf, 0x95, 0x98, 0x99, 0x6e, 0x46, 0x85, 0x7b, 0x5e, 0xbd, 0x63, 0xcd, 0xfb, 0xeb, 0xae, 0x91, 0xdc, 0xb9, 0xdc, 0xde, 0xda, + 0xcf, 0xbd, 0x91, 0x3d, 0xc3, 0x73, 0x85, 0x81, 0xd3, 0x26, 0x66, 0x76, 0x89, 0x33, 0xff, 0x9a, 0x32, 0x11, 0xaa, 0x91, 0x6a, 0x7f, 0x5a, 0x2d, 0xbe, 0x3c, 0xe1, 0x4b, 0x59, 0xc0, 0xab, 0x5f, + 0xe3, 0x68, 0x10, 0x99, 0xc5, 0x20, 0x70, 0xf3, 0xe2, 0x2d, 0x6d, 0xf2, 0x0b, 0xbe, 0x49, 0x66, 0x16, 0x45, 0x3b, 0xd0, 0xda, 0xc2, 0xbc, 0xbc, 0xe0, 0xf0, 0x36, 0xaf, 0x30, 0xc9, 0x62, 0x3b, + 0x33, 0xf3, 0xfc, 0xfe, 0x1b, 0x66, 0xe6, 0x99, 0x4d, 0xb3, 0x4a, 0x0d, 0x3e, 0xe8, 0x43, 0xd7, 0xbf, 0xbf, 0x7b, 0x38, 0xef, 0xbc, 0xfd, 0x55, 0x21, 0xb0, 0x87, 0xfb, 0xf6, 0xdf, 0x64, 0xed, + 0xde, 0xe4, 0xea, 0xfd, 0xfa, 0xf5, 0x9d, 0x96, 0xf9, 0xeb, 0x07, 0xd3, 0xf4, 0x59, 0xce, 0xde, 0xaf, 0x47, 0x13, 0xf4, 0xdf, 0x9e, 0xb7, 0xf7, 0xeb, 0xe1, 0x24, 0xed, 0x7e, 0x79, 0x96, 0xa8, + 0xd7, 0xdd, 0xf4, 0x2c, 0x59, 0xef, 0x57, 0x1f, 0x15, 0xff, 0x51, 0x68, 0xe9, 0xa3, 0xb5, 0xe2, 0xe7, 0x61, 0xb8, 0xf7, 0x1f, 0x71, 0x96, 0x9b, 0x77, 0x7f, 0xe8, 0xdb, 0x35, 0x45, 0xa0, 0x86, + 0xa1, 0xb4, 0x3c, 0x66, 0x0b, 0x03, 0x16, 0xd5, 0xad, 0x67, 0x35, 0x7b, 0xd9, 0x76, 0xb4, 0x74, 0x0b, 0x3a, 0xb2, 0x1b, 0xb3, 0xe1, 0x6a, 0x59, 0x6d, 0x96, 0x2d, 0x5d, 0xca, 0xbb, 0x42, 0x92, + 0xcc, 0x68, 0xc6, 0x73, 0x9e, 0x87, 0x39, 0x82, 0x50, 0xc0, 0x13, 0x0b, 0x6e, 0xf2, 0x52, 0x12, 0xa4, 0xac, 0x68, 0xb2, 0xc3, 0x64, 0xb8, 0x2e, 0x30, 0x73, 0x8f, 0xeb, 0xeb, 0x62, 0x4c, 0x1b, + 0x5f, 0x1d, 0x8e, 0x55, 0xe5, 0xc6, 0x0f, 0xe0, 0x18, 0xbd, 0x14, 0x05, 0xd4, 0x51, 0xec, 0xbe, 0xbe, 0x72, 0xe3, 0xae, 0x6a, 0x6e, 0x0f, 0xed, 0x57, 0x3a, 0x22, 0x13, 0x6e, 0x12, 0x2a, 0xea, + 0x24, 0x9c, 0x4c, 0xf2, 0x85, 0xba, 0x54, 0x57, 0x6c, 0x43, 0x9d, 0x36, 0xf5, 0x0c, 0x1d, 0x59, 0x92, 0x0b, 0xb3, 0xf3, 0x86, 0x5f, 0x57, 0xa6, 0xb1, 0x4e, 0x4c, 0x37, 0x5f, 0x19, 0x61, 0xa3, + 0x44, 0x5a, 0x30, 0xd7, 0x51, 0x27, 0x61, 0x8e, 0x72, 0x14, 0x6c, 0x00, 0x76, 0xbd, 0x6f, 0x94, 0x5c, 0x3d, 0x39, 0x18, 0x7a, 0x94, 0x78, 0xc6, 0x96, 0x12, 0x2d, 0xed, 0xb1, 0x60, 0xbc, 0x6b, + 0xa7, 0x77, 0xc4, 0xed, 0x9f, 0x1a, 0x18, 0x5f, 0xf2, 0x9c, 0x2d, 0x35, 0x2f, 0xd2, 0xb7, 0xff, 0xc2, 0xaf, 0x05, 0x55, 0x5a, 0x9a, 0xa5, 0x39, 0x08, 0x5d, 0x3d, 0x8b, 0x0b, 0x35, 0xf7, 0x3f, + 0xa4, 0xcd, 0x03, 0x7f, 0xa2, 0xa6, 0x06, 0x6a, 0xa4, 0x9b, 0xc6, 0xe0, 0x3b, 0x5b, 0xe4, 0xb5, 0x50, 0x90, 0x6b, 0xd2, 0xe0, 0xe0, 0xe6, 0x42, 0x9f, 0xd0, 0x90, 0x6e, 0x9b, 0x33, 0x16, 0xcc, + 0xfd, 0x1a, 0x12, 0xb9, 0x03, 0x3e, 0x72, 0x78, 0x98, 0x0a, 0x35, 0x29, 0x67, 0xb1, 0x56, 0x4d, 0xf7, 0xa3, 0xc2, 0x73, 0x99, 0x40, 0x6b, 0x76, 0xb4, 0xb2, 0x4e, 0x18, 0x88, 0x3d, 0x92, 0xc0, + 0xc4, 0x94, 0x30, 0x6d, 0x47, 0xa9, 0x12, 0x44, 0x45, 0x4d, 0x01, 0x15, 0x0d, 0xc2, 0x65, 0xc9, 0x2e, 0x39, 0xd6, 0x5b, 0x75, 0x53, 0x2f, 0x82, 0x85, 0x30, 0x5d, 0x3a, 0xf2, 0x7e, 0xf8, 0xa8, + 0xd6, 0xfe, 0x0d, 0x34, 0xb9, 0x89, 0x63, 0x8f, 0x13, 0x68, 0xe1, 0xab, 0x45, 0xb4, 0x3f, 0x2a, 0x6f, 0x54, 0x3b, 0x40, 0xde, 0x8e, 0x07, 0x1d, 0xad, 0xe7, 0x58, 0x50, 0x6c, 0xa2, 0xca, 0x01, + 0x13, 0x11, 0x05, 0x26, 0x1c, 0xb4, 0x35, 0x33, 0x69, 0x01, 0x6d, 0x08, 0xb0, 0xac, 0x5d, 0xed, 0xb0, 0x2a, 0xcb, 0x69, 0xa2, 0xd2, 0xaa, 0x4c, 0x73, 0xb7, 0xcb, 0x24, 0x1f, 0x59, 0x2c, 0x2d, + 0xfa, 0x9e, 0x4f, 0x67, 0x2d, 0xee, 0xb9, 0x50, 0xb6, 0x5f, 0x7a, 0x13, 0xc8, 0x3f, 0x69, 0xbc, 0xb9, 0x59, 0xd5, 0xa7, 0x26, 0x25, 0xdc, 0x36, 0x89, 0x31, 0x38, 0x35, 0x8f, 0x5f, 0xa6, 0xa4, + 0xe6, 0x46, 0x6a, 0xd6, 0x0e, 0xba, 0xce, 0x20, 0xe7, 0x8f, 0x7d, 0x04, 0x00, 0xf2, 0x52, 0x99, 0xeb, 0x2f, 0xd4, 0xcf, 0x40, 0xdc, 0x5e, 0xeb, 0xaa, 0xa0, 0xf6, 0xd0, 0xf3, 0x3c, 0x5a, 0x2f, + 0x96, 0xe0, 0xe2, 0xb0, 0xd5, 0x94, 0x78, 0xd9, 0xfa, 0xb1, 0xc9, 0x68, 0x8e, 0x94, 0xac, 0x03, 0x7e, 0x9c, 0xce, 0x79, 0xbd, 0x96, 0x96, 0xec, 0x32, 0xb6, 0x31, 0x64, 0x3a, 0x64, 0xe8, 0xcd, + 0xbe, 0xde, 0x8a, 0x82, 0xe1, 0x4d, 0x18, 0xc3, 0x75, 0x3c, 0x0f, 0xa2, 0x83, 0xc8, 0x31, 0xb7, 0x23, 0x2d, 0xd0, 0x44, 0xdc, 0x60, 0xd6, 0xaa, 0xc5, 0x53, 0xae, 0x40, 0xc4, 0xf1, 0x96, 0xed, + 0x13, 0x77, 0xfa, 0xa9, 0x8a, 0xec, 0xa3, 0x19, 0xf3, 0x02, 0x6f, 0xbc, 0x11, 0xbd, 0x20, 0xd2, 0x1d, 0xf6, 0x49, 0xab, 0x81, 0x07, 0x74, 0x78, 0xd0, 0xc3, 0x61, 0xed, 0xf3, 0x66, 0x9a, 0xa9, + 0x2b, 0x92, 0x5a, 0xb6, 0xcb, 0x82, 0x85, 0x8f, 0xde, 0x4e, 0xd8, 0xde, 0x8e, 0xed, 0x5b, 0x65, 0x88, 0xfb, 0x9a, 0xfa, 0x4b, 0xe3, 0x79, 0xa6, 0x78, 0x7e, 0xe3, 0xf3, 0xdf, 0x2e, 0xcc, 0xb2, + 0xc7, 0xb8, 0x99, 0x63, 0xac, 0x14, 0xc9, 0xdd, 0xfc, 0x64, 0x23, 0xb1, 0x91, 0x4c, 0x77, 0x38, 0xa2, 0x8d, 0x6b, 0x61, 0x55, 0xed, 0xcd, 0xf9, 0x04, 0x38, 0x6a, 0x3b, 0xcf, 0x6b, 0xdb, 0x99, + 0x33, 0xcf, 0xd9, 0x48, 0x27, 0xea, 0x04, 0x0c, 0x21, 0xc0, 0xd9, 0xe6, 0xdc, 0xbe, 0xda, 0x9b, 0x28, 0x83, 0x1c, 0x20, 0x7a, 0x58, 0xd5, 0x50, 0x34, 0x36, 0xd6, 0xb0, 0x33, 0x59, 0xc6, 0x4a, + 0x3c, 0x0c, 0x59, 0xb3, 0x5c, 0x3c, 0x0b, 0x97, 0x79, 0x20, 0x81, 0x3f, 0xef, 0xa8, 0xdc, 0xd3, 0xdb, 0xd5, 0xd0, 0x0c, 0x74, 0x35, 0x7f, 0xaf, 0x89, 0x71, 0x53, 0x8e, 0xe2, 0x89, 0xc6, 0x7f, + 0x46, 0xe5, 0x5d, 0x25, 0xbc, 0xd1, 0x3a, 0xef, 0xc4, 0xed, 0xdf, 0x28, 0x85, 0x9f, 0xcb, 0x0e, 0xdf, 0xa9, 0xa7, 0xf1, 0xb9, 0x4c, 0xde, 0x59, 0x63, 0x26, 0xae, 0xdf, 0xec, 0x3a, 0x7f, 0xe2, + 0xbd, 0xf5, 0xcf, 0xdb, 0xef, 0x7d, 0xd4, 0xc6, 0x5e, 0x1b, 0x21, 0xb7, 0xb5, 0x33, 0xfa, 0x33, 0x4e, 0xff, 0xe0, 0xfe, 0x5f, 0x8f, 0xd8, 0xe8, 0xdf, 0x1e, 0xe0, 0xff, 0xeb, 0x8e, 0x08, 0xf8, + 0x75, 0xe3, 0x3d, 0xff, 0xbf, 0xac, 0x76, 0xfd, 0x9a, 0xbb, 0xfc, 0x1f, 0x56, 0xba, 0x3f, 0x0d, 0xc4, 0xfd, 0xec, 0x88, 0x5f, 0x37, 0xc3, 0x71, 0x1b, 0x42, 0xdd, 0x7f, 0x38, 0x7e, 0x92, 0x25, + 0xf1, 0xeb, 0xd1, 0xd0, 0xfc, 0xdb, 0x33, 0x25, 0x7e, 0xf5, 0x60, 0xd9, 0xe7, 0xf9, 0x10, 0xbf, 0xfe, 0x31, 0x26, 0xfe, 0x27, 0xf2, 0x22, 0x7e, 0x3d, 0x42, 0xf3, 0xdf, 0x9e, 0x1b, 0xf1, 0xab, + 0x07, 0x9a, 0x3d, 0x77, 0x42, 0xaf, 0x73, 0x1a, 0x7e, 0xfd, 0x00, 0xc2, 0x9f, 0xe5, 0x35, 0xfc, 0x7a, 0x04, 0xd6, 0xbf, 0x3d, 0xb7, 0xe1, 0xd7, 0x4b, 0x52, 0xe1, 0x59, 0x8e, 0xc3, 0xaf, 0xef, + 0x39, 0xf6, 0xeb, 0xc2, 0xfb, 0xeb, 0xd7, 0x93, 0x5c, 0x87, 0x5f, 0x0f, 0x45, 0x48, 0xaf, 0x9d, 0x50, 0xfc, 0xe5, 0xb9, 0xd0, 0x3f, 0x4f, 0xe1, 0xd7, 0xa3, 0x41, 0xfc, 0xb7, 0xe7, 0x2a, 0xfc, + 0x7a, 0x69, 0x10, 0xbf, 0xcb, 0x59, 0xf8, 0xd5, 0xc3, 0x4d, 0xa2, 0x65, 0xaa, 0x6e, 0x0e, 0xcc, 0x26, 0x51, 0xa3, 0x37, 0x98, 0xef, 0xab, 0xd5, 0xf0, 0x6f, 0xf8, 0x05, 0xbd, 0xfa, 0x9a, 0xf8, + 0x59, 0x59, 0xbd, 0xbe, 0x72, 0x09, 0x52, 0xeb, 0x61, 0x80, 0xb9, 0x93, 0x72, 0xc3, 0xd0, 0x33, 0x3b, 0x63, 0xa4, 0x11, 0x83, 0x54, 0xd3, 0x05, 0x38, 0x6c, 0x92, 0x13, 0x34, 0x3a, 0x09, 0xcc, + 0x18, 0x82, 0xc4, 0xa4, 0xb4, 0x53, 0x27, 0x94, 0x8b, 0x43, 0xc8, 0xad, 0xf1, 0x21, 0x4c, 0x84, 0x93, 0x72, 0xc7, 0xc5, 0x6b, 0x79, 0x16, 0x18, 0xd3, 0x71, 0x00, 0xd9, 0x30, 0x31, 0x2a, 0xad, + 0xf8, 0x64, 0xa8, 0x8c, 0x7d, 0x64, 0x75, 0x79, 0xa6, 0xe1, 0x70, 0x3a, 0x77, 0x5f, 0x0b, 0xf5, 0xfb, 0x62, 0xb9, 0xdf, 0x71, 0x21, 0xe8, 0x71, 0xa4, 0xab, 0xc5, 0x7b, 0x86, 0x3b, 0xf4, 0x78, + 0x33, 0xb2, 0xc3, 0xe3, 0x91, 0x31, 0x83, 0xbe, 0x66, 0xfe, 0x77, 0x24, 0xdf, 0xb1, 0xce, 0x3b, 0xa9, 0xde, 0xc3, 0xdc, 0xd7, 0x88, 0x32, 0x04, 0x56, 0xf0, 0xee, 0xc4, 0xa1, 0x47, 0x5a, 0x38, + 0x55, 0x4e, 0x88, 0xdb, 0x8b, 0x13, 0xdc, 0x5a, 0xa2, 0x36, 0x2e, 0x70, 0x59, 0x0c, 0xf4, 0x29, 0x4b, 0x55, 0x79, 0x98, 0x4e, 0x14, 0x65, 0x56, 0x63, 0xf8, 0x09, 0x47, 0xf0, 0xe0, 0xe0, 0x91, + 0x1e, 0xdc, 0x4e, 0x37, 0x47, 0x14, 0x65, 0x86, 0x0c, 0x10, 0x8c, 0xb7, 0x89, 0xc2, 0x6d, 0x60, 0x9f, 0x08, 0x80, 0x11, 0xc1, 0xa8, 0xd0, 0x6b, 0x08, 0x5b, 0x6e, 0x10, 0x7c, 0x54, 0x69, 0x7f, + 0x8f, 0xd0, 0xb8, 0x0b, 0x9f, 0xae, 0xea, 0x8e, 0xd9, 0x39, 0xda, 0xce, 0x94, 0x1e, 0x17, 0xae, 0xc6, 0x5f, 0x0a, 0x84, 0xfe, 0x42, 0xfd, 0xac, 0x12, 0xde, 0x5e, 0x1b, 0xe0, 0xfd, 0x22, 0xa1, + 0xd7, 0x1e, 0xaa, 0x53, 0xf3, 0xcd, 0xe4, 0xff, 0xc3, 0xde, 0x9b, 0x2c, 0x29, 0xcb, 0x74, 0xff, 0xa2, 0xf3, 0x73, 0x15, 0x6f, 0x7c, 0x53, 0xc3, 0x87, 0x46, 0x04, 0x3c, 0xa3, 0x2d, 0x8d, 0x82, + 0x88, 0xf4, 0x28, 0x0c, 0xfe, 0x11, 0xf4, 0x20, 0xad, 0xb4, 0x4a, 0xc4, 0xfe, 0xae, 0xfd, 0x44, 0x69, 0x35, 0x6a, 0x69, 0x15, 0x8f, 0xfb, 0x3d, 0xb3, 0x3d, 0x2a, 0x32, 0xa5, 0x16, 0xe4, 0x8f, + 0xcc, 0x95, 0x2b, 0x57, 0x7b, 0x10, 0xcc, 0x1d, 0x26, 0xf7, 0x28, 0xa2, 0x65, 0x27, 0x78, 0x69, 0xcc, 0xcd, 0x4d, 0x12, 0x49, 0xca, 0xc1, 0xb7, 0x3d, 0xb1, 0x0c, 0xe6, 0x12, 0xd4, 0x71, 0xf3, + 0x28, 0x34, 0x52, 0x52, 0xcb, 0x4a, 0x8b, 0xa8, 0x57, 0x35, 0xe7, 0x2c, 0x65, 0xe4, 0xd8, 0x63, 0xdd, 0x62, 0xb4, 0xce, 0x57, 0xe4, 0xa8, 0xaa, 0x16, 0x66, 0xdb, 0x4e, 0x89, 0x60, 0x31, 0x63, + 0x7f, 0x0d, 0x5e, 0x7e, 0x62, 0x2c, 0x49, 0xf2, 0xec, 0xed, 0xfd, 0xcf, 0xa1, 0xe1, 0xd7, 0x19, 0x79, 0xaf, 0x66, 0x70, 0xe0, 0xd5, 0xd7, 0xf5, 0x3e, 0xa7, 0xf7, 0x67, 0xa0, 0xb3, 0xe9, 0xe0, + 0x0c, 0xc6, 0xb8, 0xf2, 0x52, 0x2b, 0xab, 0x23, 0xe7, 0x43, 0xb6, 0xbc, 0x5b, 0x0b, 0xb1, 0x77, 0x6a, 0x1f, 0x6e, 0x17, 0xff, 0x49, 0xf2, 0xce, 0x2b, 0xdf, 0x4e, 0x78, 0xe3, 0xd8, 0x3b, 0x7d, + 0xe9, 0xef, 0x6f, 0xee, 0xf9, 0x32, 0x49, 0xbf, 0x87, 0xb8, 0x7f, 0x3f, 0xad, 0x7d, 0x0c, 0x24, 0x89, 0xe2, 0x1f, 0xd3, 0x0b, 0x3f, 0x3f, 0x70, 0xdd, 0x0c, 0xf6, 0xf9, 0x81, 0xeb, 0x55, 0x3f, + 0x9c, 0x2f, 0xf2, 0xc0, 0xf8, 0xaa, 0xf1, 0x37, 0x7e, 0x38, 0x19, 0xb1, 0x18, 0x2d, 0xa0, 0x72, 0x6e, 0xea, 0x64, 0x03, 0x14, 0x58, 0xb9, 0xef, 0x83, 0xf9, 0xc8, 0xb0, 0x91, 0xc4, 0x37, 0x76, + 0x65, 0x91, 0x60, 0x16, 0xaa, 0xa7, 0xab, 0x52, 0xc3, 0xbb, 0xc5, 0x8c, 0x85, 0x48, 0xae, 0x15, 0x01, 0xa9, 0x13, 0x37, 0x26, 0x93, 0x09, 0x49, 0x67, 0xab, 0xb1, 0x81, 0xba, 0x6d, 0xbd, 0x60, + 0xfb, 0x05, 0xaf, 0x9c, 0xa4, 0x9d, 0xbd, 0xce, 0x55, 0x49, 0x94, 0x8b, 0xff, 0x73, 0x11, 0xa2, 0x68, 0xd2, 0xe2, 0xea, 0xdb, 0x5e, 0xfd, 0xf8, 0x78, 0x9b, 0xff, 0xf6, 0xc5, 0x9f, 0x81, 0xfd, + 0xdd, 0xc9, 0x6a, 0x28, 0xd8, 0xb7, 0x8f, 0x00, 0xc6, 0x77, 0x1d, 0x0f, 0xf2, 0xbf, 0xfe, 0xf3, 0x0c, 0xf4, 0xfa, 0xb0, 0xd9, 0x95, 0x0a, 0x86, 0xe7, 0xbc, 0x40, 0x63, 0x93, 0x0d, 0x7f, 0xe4, + 0x10, 0x9a, 0x5f, 0x4b, 0x95, 0x94, 0x77, 0x5b, 0x1f, 0xdf, 0x73, 0x79, 0xce, 0xcc, 0x02, 0xec, 0x28, 0x5a, 0xad, 0xac, 0x62, 0x20, 0x2a, 0xa3, 0x76, 0x2c, 0xad, 0x50, 0xca, 0x80, 0x55, 0x0f, + 0x93, 0x9a, 0xd8, 0x32, 0xab, 0x26, 0x39, 0x5a, 0x13, 0xb0, 0x93, 0x30, 0x3b, 0x06, 0x8b, 0x14, 0xd9, 0x45, 0x4c, 0x3a, 0xe8, 0xc8, 0xf0, 0x84, 0xd9, 0x7d, 0x25, 0xc0, 0xf8, 0xf7, 0xb4, 0xc5, + 0x9f, 0x54, 0xcf, 0xcc, 0xed, 0xfd, 0x7a, 0xa8, 0x8e, 0x18, 0x13, 0x46, 0x0b, 0x9b, 0x8c, 0xc2, 0x92, 0x98, 0x6e, 0x97, 0xf6, 0xc2, 0xf0, 0x2a, 0xa7, 0xee, 0x52, 0x95, 0xb3, 0x3c, 0xb4, 0x14, + 0x22, 0xb6, 0x4f, 0x7b, 0x28, 0x72, 0x4a, 0x6f, 0xbb, 0x1a, 0x81, 0xd6, 0x1c, 0x5b, 0xaf, 0xfc, 0xe6, 0x10, 0xd2, 0x55, 0x0e, 0xab, 0xb3, 0xcc, 0x29, 0x9c, 0x45, 0xdd, 0xf3, 0x52, 0xdd, 0xef, + 0x7c, 0x58, 0x5a, 0x2e, 0x1b, 0x6f, 0xbb, 0x5a, 0xaa, 0x46, 0x75, 0x28, 0xe7, 0xbf, 0x6b, 0xef, 0x07, 0xa4, 0xe9, 0x78, 0x5b, 0x67, 0x51, 0xf6, 0x26, 0xb1, 0x57, 0xe7, 0x68, 0xc4, 0x7b, 0xb6, + 0x70, 0x07, 0xed, 0x97, 0xae, 0xe9, 0x11, 0xb4, 0xb7, 0xda, 0xa7, 0xe1, 0xd0, 0xbe, 0x53, 0x3d, 0x43, 0xfb, 0x7e, 0x3d, 0x3e, 0xd3, 0xfa, 0x1d, 0xda, 0x35, 0x8c, 0x2b, 0x2a, 0x01, 0x61, 0x60, + 0xd6, 0x6d, 0x15, 0x74, 0xa2, 0xed, 0xeb, 0x84, 0x16, 0xe8, 0x89, 0x9b, 0xb8, 0xd2, 0xbc, 0xb0, 0x56, 0x3b, 0x33, 0x16, 0x58, 0xa8, 0xe1, 0x17, 0x7e, 0xef, 0x4f, 0x4a, 0xb9, 0x11, 0xbd, 0x80, + 0xb1, 0x18, 0xaf, 0x3a, 0x79, 0xde, 0xc8, 0x38, 0x4a, 0xa3, 0x2d, 0xaa, 0xb4, 0x32, 0x25, 0xe9, 0xa8, 0x56, 0xba, 0x82, 0x2b, 0x47, 0x32, 0x34, 0x9d, 0x74, 0xab, 0x21, 0x35, 0x4a, 0x7f, 0x4a, + 0x30, 0x8a, 0xbc, 0xe4, 0x1c, 0x75, 0xab, 0x4e, 0x41, 0x86, 0xb9, 0x45, 0xe5, 0x5c, 0x66, 0x87, 0x8b, 0x93, 0xcc, 0xee, 0x0a, 0xad, 0xf1, 0x7a, 0x3c, 0x22, 0xf8, 0xf4, 0x44, 0x5b, 0x48, 0x66, + 0xef, 0x11, 0x56, 0x90, 0x4e, 0x4d, 0xe8, 0x00, 0xdd, 0x69, 0x16, 0x1b, 0x18, 0xb0, 0xd5, 0x45, 0xa7, 0x63, 0x85, 0x99, 0x3e, 0x47, 0x51, 0x5c, 0x6c, 0x70, 0x39, 0x16, 0xb0, 0x11, 0xb8, 0xc4, + 0x50, 0x65, 0x2d, 0x0b, 0xde, 0xa9, 0x9b, 0x91, 0x85, 0x04, 0xa2, 0x50, 0x84, 0xa4, 0x03, 0xa6, 0xd6, 0x6f, 0xba, 0x92, 0x5f, 0xf5, 0x24, 0x77, 0x33, 0x2b, 0xcc, 0xe3, 0xc8, 0xb5, 0x9e, 0xd7, + 0x7e, 0x78, 0xc5, 0x96, 0xf1, 0x41, 0xf4, 0x8c, 0xe9, 0xe5, 0x72, 0x3c, 0x19, 0x66, 0xc9, 0x98, 0x8d, 0xaa, 0x91, 0xe0, 0x8e, 0xb6, 0xa0, 0xbe, 0x5a, 0xf5, 0x56, 0x47, 0xa5, 0x16, 0x10, 0xb4, + 0xc4, 0x46, 0x3a, 0xc4, 0x6a, 0x74, 0x30, 0xd4, 0xed, 0xba, 0x31, 0xf3, 0xd3, 0xbc, 0x8a, 0xda, 0x8a, 0x45, 0xe6, 0xd6, 0x56, 0x25, 0x7b, 0x66, 0x09, 0xa2, 0x80, 0xca, 0xef, 0x2b, 0x1f, 0x72, + 0x0c, 0x6f, 0x46, 0xda, 0x33, 0x4c, 0x23, 0xe9, 0x70, 0xdf, 0x63, 0x4c, 0x9b, 0x89, 0x31, 0x5c, 0x00, 0xf5, 0x6b, 0x1e, 0xe3, 0x57, 0x8e, 0x78, 0xff, 0xf9, 0xef, 0x37, 0x87, 0xff, 0x4f, 0xc9, + 0xf8, 0xed, 0xb7, 0x3b, 0xe1, 0xc4, 0xaf, 0xbc, 0xf6, 0x23, 0x4b, 0xe3, 0x7f, 0xbf, 0x95, 0x47, 0x0f, 0x92, 0xdc, 0x1e, 0x17, 0x56, 0xf9, 0x5e, 0x98, 0xf4, 0xbf, 0xdf, 0x64, 0x97, 0x73, 0x0e, + 0xb3, 0xb3, 0xe1, 0xe3, 0xc3, 0x71, 0xe1, 0xbf, 0x8f, 0x72, 0x26, 0x7f, 0x54, 0x50, 0xfc, 0x2f, 0x72, 0x9f, 0xe1, 0xe7, 0xbb, 0x9f, 0xdc, 0x7f, 0xbf, 0x09, 0x37, 0xa5, 0x67, 0xb9, 0x6e, 0x54, + 0x16, 0xef, 0xbf, 0x4e, 0x9f, 0x4e, 0x90, 0x68, 0x1c, 0x65, 0xfe, 0x33, 0x4b, 0xec, 0x6b, 0x19, 0xd0, 0xdf, 0x69, 0xbe, 0x4d, 0x8f, 0xcb, 0xd5, 0xd0, 0xac, 0xe7, 0xd3, 0x9a, 0xc3, 0xe8, 0xba, + 0x34, 0xc1, 0xcd, 0x48, 0x58, 0x2f, 0xf8, 0x3a, 0xac, 0x0f, 0xc2, 0x1e, 0xf1, 0x59, 0x78, 0xe5, 0xd9, 0x38, 0x4e, 0x22, 0xe4, 0xdc, 0x14, 0x1b, 0x78, 0xba, 0xa6, 0x74, 0x2d, 0xd8, 0xad, 0xc0, + 0xf9, 0x64, 0x55, 0x21, 0x22, 0xbf, 0x3c, 0x94, 0x19, 0xb8, 0xd2, 0xa0, 0x2d, 0xc8, 0x87, 0x10, 0x60, 0xe2, 0x9d, 0xd9, 0x1b, 0xe2, 0xf1, 0xa0, 0x95, 0x3b, 0x8f, 0xb0, 0x73, 0x72, 0x48, 0x30, + 0xd0, 0xb5, 0xca, 0xfe, 0x99, 0xc9, 0xeb, 0x85, 0x75, 0xf2, 0x41, 0xf5, 0x0d, 0x89, 0x8f, 0xeb, 0xa1, 0x85, 0xfe, 0x4e, 0x88, 0x93, 0xf3, 0xce, 0x29, 0x09, 0x14, 0xd2, 0xd5, 0xa3, 0x6c, 0x1f, + 0x51, 0x44, 0x23, 0xe3, 0x22, 0x49, 0xc2, 0xf6, 0x7a, 0x7f, 0x5a, 0xaa, 0x1d, 0x9d, 0x8a, 0xf6, 0x6c, 0xc3, 0xc8, 0x80, 0x64, 0x6d, 0x34, 0x94, 0xd6, 0x84, 0x9d, 0xa3, 0x1a, 0x40, 0x85, 0xea, + 0xfb, 0x25, 0x4f, 0xa1, 0xf4, 0x46, 0xa1, 0x2d, 0x4f, 0x32, 0x18, 0xd2, 0x00, 0x97, 0x9b, 0xa5, 0x32, 0xdd, 0xfb, 0x7c, 0x37, 0xc8, 0xfe, 0x79, 0xe3, 0xb0, 0xf4, 0x08, 0x0c, 0xf0, 0x35, 0xa6, + 0xf1, 0x49, 0xf6, 0x1d, 0x8d, 0x4b, 0x63, 0x0c, 0x0e, 0x63, 0x1c, 0x98, 0x14, 0xc0, 0xab, 0xd2, 0x2b, 0x20, 0x05, 0x18, 0x49, 0x13, 0xda, 0xf1, 0x22, 0xb3, 0x96, 0x1c, 0x4a, 0xdc, 0x1e, 0xc3, + 0x79, 0x4b, 0x74, 0x23, 0x5a, 0xf6, 0x21, 0x08, 0x85, 0x5b, 0xa4, 0x8a, 0xe2, 0x55, 0xd9, 0xe6, 0x7b, 0x9e, 0x59, 0x1c, 0x76, 0x35, 0x2e, 0xb1, 0x7a, 0x68, 0xe1, 0x5a, 0xc2, 0xcc, 0xca, 0x40, + 0x03, 0x09, 0x6f, 0x2b, 0x9e, 0x6a, 0x73, 0x06, 0xa8, 0xbd, 0x71, 0x48, 0xb4, 0x01, 0x86, 0xfa, 0x33, 0x97, 0xad, 0xfe, 0xf3, 0x65, 0x4e, 0xbf, 0x5a, 0x63, 0xef, 0x25, 0x43, 0xef, 0x6a, 0x82, + 0xfe, 0x6c, 0xec, 0xf9, 0xa1, 0x4e, 0xfe, 0x87, 0x27, 0xd8, 0xe3, 0x09, 0xf8, 0xd2, 0xce, 0xf7, 0x46, 0xf1, 0x0c, 0xf7, 0xdb, 0x89, 0x0b, 0xfe, 0x7d, 0xe7, 0x83, 0xc6, 0xcb, 0xc9, 0x6c, 0x9d, + 0x41, 0xb1, 0xcf, 0xe4, 0x23, 0xca, 0xec, 0x24, 0xc2, 0x98, 0x6f, 0x16, 0x39, 0x19, 0x31, 0x12, 0x84, 0xdf, 0x99, 0x14, 0xbf, 0x1d, 0xe3, 0xfe, 0x45, 0xa1, 0xf0, 0x86, 0xf4, 0xe7, 0x00, 0x3e, + 0x3a, 0x86, 0x88, 0x87, 0xd0, 0x18, 0x74, 0x4f, 0x3b, 0x41, 0x99, 0x1f, 0x55, 0xdf, 0x04, 0xda, 0x32, 0x21, 0x59, 0x4c, 0x6d, 0x36, 0x12, 0x3b, 0x45, 0xb7, 0xd5, 0x2b, 0xdb, 0x45, 0x1a, 0xa5, + 0x91, 0xf3, 0xfd, 0xd4, 0xfa, 0x8c, 0xad, 0x26, 0x79, 0xe3, 0x7e, 0xee, 0x12, 0xcf, 0x64, 0xba, 0x97, 0x90, 0xf9, 0xa0, 0x7b, 0x81, 0xe5, 0xa3, 0x75, 0x96, 0xeb, 0x06, 0xc8, 0x35, 0xe6, 0x9e, + 0x5e, 0xec, 0x8f, 0x20, 0xb1, 0xca, 0xa2, 0x1c, 0x57, 0x68, 0x0a, 0x52, 0x7b, 0x0a, 0x5b, 0x32, 0x73, 0x08, 0xc2, 0x7b, 0x32, 0x06, 0x11, 0xbe, 0x47, 0x2d, 0x8a, 0xe7, 0xa3, 0x68, 0x84, 0x00, + 0x66, 0xbb, 0x9b, 0xae, 0xc5, 0x20, 0x83, 0x28, 0x24, 0x51, 0xa7, 0xab, 0x3d, 0xc6, 0xe4, 0x2e, 0x69, 0xbb, 0x9e, 0xac, 0xa0, 0xee, 0x0e, 0xc7, 0x9b, 0x8c, 0x01, 0x51, 0xc9, 0x99, 0xa4, 0xf1, + 0x10, 0xb9, 0xe6, 0x12, 0x11, 0xfd, 0xdf, 0x73, 0x34, 0xe0, 0x8d, 0x8b, 0xdc, 0x7b, 0x5e, 0xe8, 0x73, 0xea, 0x89, 0xbb, 0x2a, 0xb7, 0x1f, 0x19, 0x66, 0xff, 0x8b, 0x9f, 0xbd, 0xee, 0x1e, 0x23, + 0x7d, 0xe7, 0x7c, 0xff, 0x6c, 0x1b, 0x7b, 0x81, 0x63, 0x5d, 0x53, 0x7e, 0x43, 0xfb, 0xba, 0x3d, 0xd4, 0x8f, 0x5a, 0x96, 0x69, 0x52, 0xac, 0xf6, 0x58, 0xd4, 0x00, 0x47, 0x7b, 0x9a, 0x73, 0x86, + 0x53, 0x2d, 0x18, 0xa5, 0x28, 0x16, 0x9b, 0xac, 0xda, 0x03, 0x53, 0x58, 0xd0, 0x55, 0x99, 0xb3, 0x91, 0x5e, 0x9c, 0xe6, 0xd9, 0xae, 0xd3, 0x17, 0x93, 0x5e, 0x4f, 0x53, 0x35, 0xdf, 0x38, 0x82, + 0xbf, 0x24, 0x47, 0xa4, 0x4c, 0x15, 0x3e, 0x07, 0x68, 0x53, 0x1c, 0xf1, 0xf9, 0x60, 0x82, 0x9b, 0x0c, 0x69, 0xd1, 0x09, 0x27, 0xfd, 0x8e, 0xf7, 0xe5, 0x65, 0x33, 0x2b, 0x3d, 0x4f, 0xd5, 0xff, + 0x5e, 0xdc, 0x35, 0x7f, 0x00, 0xf0, 0xfd, 0xce, 0x67, 0xda, 0xd7, 0xbf, 0xf7, 0x4e, 0xfb, 0x22, 0xfb, 0x09, 0xdd, 0x5b, 0x63, 0x68, 0x5a, 0x48, 0x57, 0x38, 0x8d, 0x26, 0xf3, 0x66, 0x3b, 0xb1, + 0xe0, 0x6e, 0x63, 0x9b, 0x0c, 0xdb, 0xf0, 0x66, 0xa1, 0x3a, 0xc1, 0x7e, 0xd9, 0xac, 0x35, 0xa0, 0x21, 0xd6, 0x40, 0x63, 0x3b, 0xe6, 0x62, 0x26, 0xec, 0x6c, 0x2a, 0xc7, 0x7d, 0x1f, 0x11, 0xf0, + 0x93, 0x5e, 0x4c, 0x09, 0x1f, 0xf4, 0x7c, 0x05, 0x6f, 0xe8, 0xdc, 0xc8, 0xa7, 0x07, 0x64, 0x71, 0xc4, 0x5c, 0x63, 0x26, 0x04, 0xd2, 0x72, 0x17, 0xcc, 0x2b, 0xe9, 0x9b, 0xcb, 0xcb, 0xbd, 0x87, + 0xed, 0xb3, 0xe1, 0xff, 0x7d, 0xce, 0x98, 0x1b, 0xca, 0x9f, 0x08, 0xbc, 0xb7, 0xcf, 0x20, 0x0c, 0xc8, 0x15, 0x73, 0x88, 0x88, 0x7d, 0x5c, 0xd8, 0xfc, 0x5a, 0x00, 0x98, 0x35, 0x8a, 0x9f, 0x46, + 0x49, 0x88, 0x1c, 0x40, 0x40, 0x80, 0x78, 0x73, 0xb1, 0x87, 0xe5, 0x1d, 0xba, 0x03, 0xb8, 0x94, 0xb7, 0x26, 0xa3, 0x60, 0x45, 0x4d, 0xfa, 0xd1, 0xb6, 0x63, 0x21, 0xb3, 0xa7, 0x98, 0x53, 0xd5, + 0x1e, 0x98, 0xa5, 0x32, 0x49, 0x45, 0x34, 0xed, 0x33, 0xd1, 0x89, 0x8b, 0x5d, 0xda, 0x41, 0x19, 0x3b, 0x73, 0x56, 0xfb, 0x93, 0x1c, 0x3c, 0x04, 0xe1, 0xb9, 0x47, 0xcb, 0x2b, 0x2e, 0xf8, 0x17, + 0x92, 0x1f, 0xc3, 0xae, 0xc6, 0xd0, 0xef, 0xee, 0xf7, 0x6f, 0xe3, 0xb5, 0x46, 0xda, 0x41, 0x0d, 0x91, 0x38, 0x30, 0x03, 0x40, 0x49, 0x96, 0xad, 0x6f, 0xf7, 0x14, 0x53, 0x04, 0x72, 0x83, 0xcd, + 0xe7, 0x92, 0x90, 0xa6, 0x07, 0x99, 0x59, 0x65, 0xc7, 0x50, 0x36, 0x59, 0x92, 0x5b, 0x68, 0xea, 0x0c, 0xb2, 0x4b, 0x3d, 0xdc, 0x6c, 0xea, 0x29, 0x4e, 0xf2, 0x5b, 0x6d, 0x26, 0x56, 0x84, 0xdd, + 0x4e, 0x44, 0x8a, 0x34, 0x35, 0xc6, 0xd6, 0x8f, 0x0d, 0x15, 0x31, 0x70, 0x5a, 0xdf, 0x30, 0xa7, 0xbc, 0x78, 0x3b, 0xb7, 0x9f, 0xbd, 0x71, 0xbf, 0x0b, 0x3e, 0x79, 0x6a, 0x47, 0x99, 0xe7, 0xfe, + 0x5e, 0x04, 0xf5, 0xef, 0x8b, 0x0a, 0xdf, 0xd1, 0x3e, 0x23, 0x73, 0xd3, 0x73, 0xde, 0xd3, 0x7e, 0x29, 0x32, 0xfc, 0x06, 0xd1, 0x42, 0xda, 0x20, 0xbc, 0xec, 0x37, 0x2b, 0x8f, 0xf1, 0x31, 0x87, + 0xb0, 0x09, 0x7e, 0xb5, 0xd8, 0x85, 0x9c, 0x42, 0x1d, 0x46, 0x70, 0x3c, 0x9f, 0x97, 0x44, 0x92, 0xca, 0x44, 0xeb, 0xb4, 0x0b, 0x7a, 0x4a, 0x10, 0x10, 0x63, 0x72, 0xbb, 0x5a, 0x59, 0xcc, 0x15, + 0x2a, 0x74, 0x93, 0x7e, 0xd6, 0x0b, 0x46, 0x77, 0x0c, 0xf1, 0x84, 0x72, 0xb3, 0x36, 0xe5, 0x05, 0x0f, 0x18, 0x4d, 0x1d, 0x37, 0xa7, 0xdd, 0x01, 0x31, 0x4e, 0xae, 0x97, 0x58, 0xa7, 0x6b, 0x6c, + 0x2e, 0x75, 0x21, 0x9f, 0x32, 0xe5, 0x34, 0xb5, 0x32, 0xf7, 0x69, 0xea, 0x06, 0xfc, 0xa5, 0x00, 0xb1, 0x4f, 0xaa, 0x17, 0xf8, 0x2e, 0xd7, 0xe7, 0x04, 0xe9, 0x03, 0xe6, 0x96, 0x10, 0xab, 0xeb, + 0x59, 0x93, 0xfa, 0x23, 0xc6, 0x83, 0x29, 0x33, 0xd6, 0x0e, 0xb8, 0x8f, 0xaf, 0x66, 0xb9, 0x8f, 0x9d, 0xd6, 0xa8, 0xbc, 0xe2, 0x58, 0x18, 0x71, 0x75, 0x56, 0x25, 0xd2, 0x8d, 0x6f, 0x12, 0x69, + 0x19, 0xcd, 0x7a, 0xc3, 0x94, 0x4a, 0x2e, 0x6e, 0x76, 0x11, 0x17, 0x9e, 0x7c, 0x51, 0x69, 0xf0, 0x5a, 0x0b, 0x33, 0x9d, 0x20, 0xa0, 0x88, 0xdb, 0x79, 0x6d, 0x9b, 0x25, 0x32, 0xb2, 0xed, 0xbe, + 0xaf, 0xa5, 0xb4, 0xc8, 0x33, 0x2f, 0xab, 0xc7, 0x5e, 0x1a, 0xd5, 0xf5, 0x0f, 0xb9, 0x2b, 0x5e, 0x04, 0xe0, 0x96, 0xfa, 0x05, 0x88, 0xdb, 0xbe, 0x31, 0x34, 0x0c, 0x10, 0xd9, 0x9d, 0x54, 0x1e, + 0x2a, 0x11, 0xa3, 0x4a, 0x80, 0xd4, 0xee, 0x60, 0xee, 0x2b, 0x47, 0x2a, 0x9b, 0xb2, 0xa0, 0x45, 0xd6, 0x17, 0x40, 0xe0, 0x64, 0x64, 0x4a, 0x94, 0xa1, 0x12, 0x50, 0x52, 0x93, 0x54, 0x68, 0x6a, + 0xa6, 0xd5, 0x4a, 0x72, 0x1e, 0xae, 0x1a, 0x7b, 0x52, 0xce, 0xc0, 0x66, 0x63, 0x8f, 0x14, 0x5a, 0x21, 0x1a, 0x1a, 0x94, 0x8c, 0x9c, 0x98, 0x81, 0x86, 0xeb, 0x5b, 0x75, 0x25, 0x0f, 0xd2, 0xf0, + 0x5c, 0x5b, 0xa7, 0x1e, 0x1f, 0x30, 0x5e, 0xdb, 0xae, 0x3f, 0xc8, 0x9e, 0x51, 0xf9, 0x68, 0x8c, 0xc1, 0xdf, 0x37, 0x6a, 0x68, 0x0c, 0x73, 0x49, 0x09, 0x4d, 0x80, 0xed, 0xde, 0x77, 0xa7, 0x42, + 0xc6, 0x53, 0xd6, 0xbe, 0x09, 0x20, 0x8d, 0x70, 0xe5, 0xc9, 0x63, 0x61, 0xf1, 0x7e, 0x40, 0x57, 0x05, 0x94, 0x1e, 0x0b, 0x7b, 0x2f, 0x8e, 0xe8, 0x83, 0xee, 0x65, 0x48, 0x1f, 0xad, 0xa1, 0x15, + 0x7d, 0x2d, 0x9e, 0x2b, 0xca, 0x20, 0x9e, 0x1a, 0x21, 0xb1, 0x39, 0x31, 0xf0, 0x34, 0xdc, 0xe3, 0xdd, 0xb2, 0x86, 0x47, 0xd4, 0x14, 0x56, 0x3a, 0x88, 0x92, 0x65, 0xb6, 0x3f, 0x10, 0xdd, 0xba, + 0x80, 0x0d, 0x6b, 0x96, 0x2e, 0x52, 0x03, 0xe7, 0xc4, 0xb6, 0xad, 0xdb, 0x34, 0xb3, 0x70, 0xe5, 0xa8, 0xcb, 0xb3, 0x15, 0x6f, 0x22, 0x71, 0xcf, 0x53, 0x28, 0xbe, 0x81, 0xe1, 0x36, 0xb1, 0xe4, + 0x22, 0xf6, 0x16, 0xaf, 0x19, 0xd5, 0xdc, 0xbc, 0x1e, 0x17, 0x65, 0x7e, 0x51, 0xd7, 0xdf, 0xdb, 0x32, 0xfe, 0x13, 0x94, 0x96, 0xe3, 0xf9, 0x4d, 0x32, 0xf6, 0xbf, 0xb4, 0x5e, 0x37, 0x47, 0xad, + 0xd4, 0x8a, 0xbd, 0xf1, 0x47, 0x6d, 0xa5, 0x6f, 0xca, 0x8e, 0xfb, 0x62, 0x6e, 0x0f, 0x0c, 0x39, 0x8f, 0x32, 0xc4, 0x3d, 0xa0, 0xf4, 0x73, 0x19, 0xa7, 0xbb, 0xaf, 0x9e, 0xc7, 0xd1, 0xb3, 0x0f, + 0x0e, 0xbe, 0x54, 0x65, 0xe7, 0x42, 0xf2, 0xfc, 0xad, 0xdf, 0x2e, 0xce, 0x51, 0x6b, 0x03, 0x3e, 0xb3, 0xd9, 0x95, 0x8b, 0x78, 0xb9, 0x3a, 0x6a, 0xf2, 0x84, 0x66, 0xf3, 0x5d, 0x2d, 0x8c, 0x4e, + 0x3a, 0x8d, 0xce, 0x68, 0x1b, 0xe3, 0x92, 0xe8, 0x68, 0x5b, 0xde, 0x7c, 0xeb, 0x13, 0x12, 0x31, 0x6b, 0xf5, 0x6a, 0x93, 0x01, 0xf9, 0xc8, 0xe8, 0xd0, 0x59, 0x40, 0x6c, 0x15, 0x85, 0xe2, 0x70, + 0x78, 0x1a, 0x4a, 0x1b, 0x77, 0x33, 0xea, 0x16, 0x78, 0x4f, 0xaf, 0xfd, 0x89, 0xbb, 0xd8, 0x24, 0x40, 0x7c, 0x8c, 0xb5, 0x07, 0xb2, 0xd2, 0xdb, 0x3b, 0xed, 0x9f, 0xea, 0x12, 0x5f, 0x3c, 0xa2, + 0x7e, 0x50, 0xfd, 0x1c, 0xf5, 0xde, 0x2a, 0x87, 0x1c, 0x55, 0xcf, 0x4e, 0x55, 0xdd, 0xc8, 0x72, 0x1d, 0xbf, 0x17, 0x8f, 0x8e, 0xe8, 0xb1, 0x23, 0x70, 0x9b, 0xb4, 0x72, 0x59, 0x02, 0x93, 0x64, + 0xa9, 0x0b, 0xa0, 0x4d, 0x61, 0x53, 0xe5, 0xb8, 0x43, 0x71, 0x08, 0x72, 0x8e, 0x4a, 0x08, 0x6d, 0xed, 0xe3, 0x11, 0x3b, 0x9a, 0xc4, 0x92, 0x83, 0x3c, 0xbd, 0xa6, 0x7c, 0xb4, 0x8a, 0xf0, 0x32, + 0x80, 0x93, 0x30, 0xd3, 0xf6, 0x95, 0xbe, 0xe6, 0x17, 0xbc, 0x6f, 0xcb, 0x6c, 0xd3, 0x0d, 0x71, 0x03, 0x76, 0xde, 0x16, 0xe1, 0xb9, 0xe8, 0xc8, 0xd3, 0xbc, 0x4d, 0x2f, 0x9e, 0x7c, 0xaf, 0x08, + 0x9f, 0x11, 0xf9, 0x6a, 0x0e, 0x3b, 0xf5, 0xd6, 0x3e, 0xa4, 0xb1, 0xc1, 0x21, 0x6a, 0x17, 0x07, 0xc8, 0x3b, 0xd4, 0x47, 0x89, 0x4f, 0xe6, 0xae, 0xa6, 0x51, 0x9d, 0xe5, 0x0c, 0x18, 0xd6, 0x75, + 0x34, 0xd9, 0xb3, 0x41, 0xbd, 0xb0, 0x6d, 0x7d, 0x92, 0x7d, 0x1b, 0xd2, 0x67, 0x63, 0x68, 0x40, 0x63, 0x33, 0xd7, 0x3d, 0xc0, 0x0e, 0x36, 0x4c, 0x22, 0xba, 0x22, 0xa4, 0xd3, 0x88, 0x12, 0x83, + 0x78, 0x33, 0x2b, 0xe6, 0x2b, 0x2c, 0x87, 0x8e, 0x40, 0xad, 0x4b, 0xf5, 0x0e, 0xc3, 0xd4, 0x69, 0x9f, 0x84, 0x46, 0xd8, 0x74, 0xc2, 0xb6, 0xd6, 0x63, 0x91, 0xa0, 0x6b, 0xc6, 0x6d, 0x17, 0x53, + 0xe7, 0x80, 0xe0, 0x7a, 0xef, 0x91, 0xcb, 0x69, 0x04, 0xf5, 0x1b, 0xc4, 0x95, 0x1c, 0xbc, 0xe8, 0xd6, 0x46, 0xf9, 0x7d, 0xe7, 0x7e, 0x5c, 0xe2, 0xf0, 0x5f, 0xd4, 0x8a, 0x3e, 0x78, 0xc0, 0x19, + 0x8f, 0xef, 0xdd, 0x43, 0xf5, 0xa5, 0x2d, 0x54, 0x24, 0x2c, 0x35, 0x39, 0xcd, 0x4a, 0x20, 0x11, 0xc3, 0x36, 0x5a, 0x41, 0x5d, 0xb9, 0x2b, 0xd6, 0xde, 0x49, 0x63, 0x97, 0x73, 0x13, 0x56, 0x98, + 0x8d, 0xa1, 0xd2, 0x56, 0x91, 0x62, 0x00, 0x3e, 0x9f, 0x65, 0x6b, 0x31, 0x3f, 0xb5, 0x7a, 0x31, 0x91, 0x39, 0x80, 0x16, 0x17, 0x87, 0x6c, 0x1a, 0xd3, 0x7d, 0x76, 0xda, 0x06, 0x86, 0xb9, 0xa9, + 0xe4, 0xda, 0x30, 0xd8, 0xad, 0xdd, 0x2c, 0xf1, 0x41, 0x6e, 0xf0, 0xae, 0x67, 0x3d, 0xcd, 0xe1, 0xfb, 0x5a, 0xd6, 0xb7, 0x33, 0xc5, 0x73, 0x79, 0x55, 0xab, 0x0e, 0x87, 0xa4, 0x77, 0x83, 0xc6, + 0x73, 0xeb, 0xe0, 0x48, 0x04, 0xe6, 0xc6, 0x99, 0xb6, 0x58, 0xd0, 0xce, 0x3a, 0x48, 0x8d, 0x29, 0xb5, 0xb4, 0x97, 0xce, 0xf1, 0x3e, 0x63, 0xc1, 0x4f, 0xd5, 0x60, 0x91, 0x3f, 0x93, 0x17, 0x8e, + 0x77, 0xb7, 0xd5, 0x60, 0xcf, 0x34, 0x7e, 0xff, 0x5c, 0x40, 0x7f, 0xec, 0xa6, 0xa3, 0x36, 0x84, 0x54, 0xbf, 0x1d, 0x21, 0x52, 0x86, 0x59, 0xd3, 0xac, 0xb2, 0x9d, 0x15, 0x27, 0x5a, 0x4a, 0x4b, + 0x52, 0x61, 0xbe, 0xcf, 0xd0, 0x05, 0x9d, 0xcc, 0xda, 0xa6, 0xe8, 0x38, 0x58, 0x27, 0x15, 0xaa, 0xa6, 0x23, 0xba, 0x3e, 0x94, 0x38, 0xb5, 0xa8, 0x7b, 0x63, 0x21, 0xb8, 0x3d, 0x3a, 0x59, 0x13, + 0xf1, 0xd1, 0x73, 0x30, 0xca, 0x68, 0x1c, 0x78, 0x9f, 0x67, 0xe8, 0x00, 0x5d, 0xc0, 0x47, 0xd9, 0xd7, 0xa7, 0xd1, 0x40, 0xae, 0xf7, 0x26, 0x45, 0x96, 0x5e, 0x55, 0xfd, 0xa6, 0xcf, 0x9b, 0xbc, + 0x24, 0xb7, 0x3e, 0xa0, 0x7f, 0xc6, 0xee, 0x5b, 0xef, 0x78, 0xf2, 0xbb, 0xec, 0x0a, 0x8d, 0x03, 0x4e, 0x75, 0xf9, 0xbd, 0xcb, 0x0a, 0x74, 0x8b, 0xae, 0x58, 0x92, 0x32, 0xa2, 0xb2, 0xc6, 0x56, + 0xc1, 0x61, 0x02, 0xf0, 0xaf, 0x88, 0x26, 0x7f, 0xa7, 0xd9, 0xbb, 0xc9, 0x14, 0xf5, 0x8c, 0x3b, 0xfc, 0x7d, 0x3d, 0xf5, 0x2f, 0xb2, 0x67, 0x64, 0x3e, 0x1a, 0x67, 0x4e, 0x30, 0xa0, 0x76, 0x7a, + 0x26, 0x46, 0x72, 0x90, 0xda, 0xf3, 0x3a, 0x85, 0xac, 0xc9, 0xaa, 0xca, 0xd6, 0xa4, 0x8f, 0x02, 0xca, 0xda, 0xdf, 0x39, 0xfb, 0xd3, 0x66, 0xda, 0xe2, 0x6b, 0x48, 0xdd, 0xf5, 0x2e, 0x99, 0x32, + 0xe5, 0x6e, 0x85, 0x84, 0xc7, 0x51, 0xb0, 0x05, 0x3a, 0xc8, 0x20, 0x9d, 0x0c, 0xeb, 0xf1, 0x60, 0x55, 0x2b, 0x11, 0x35, 0x2f, 0x4d, 0x32, 0x30, 0x6a, 0xdb, 0xca, 0x27, 0xd2, 0x61, 0x9d, 0x02, + 0x1b, 0xe8, 0xbe, 0xac, 0xd9, 0x40, 0x38, 0x7f, 0x2f, 0x94, 0x71, 0xb6, 0x8d, 0xd7, 0x97, 0x3a, 0x66, 0xff, 0xf9, 0x0b, 0xeb, 0xf9, 0x7d, 0x99, 0x8b, 0xdf, 0xcb, 0xa5, 0x9d, 0x0b, 0x59, 0xde, + 0xd5, 0xf8, 0x81, 0xef, 0xee, 0xf9, 0xf2, 0x5e, 0xfc, 0xf6, 0x1a, 0x51, 0xf5, 0x95, 0xf5, 0xf6, 0x5b, 0xad, 0x8e, 0x77, 0xed, 0x7f, 0xf4, 0x65, 0x1c, 0x40, 0x1e, 0xfc, 0xfc, 0xe9, 0x5a, 0xf4, + 0x8d, 0xf8, 0xe5, 0x86, 0x3f, 0x77, 0xd6, 0x83, 0x9b, 0xb7, 0x3b, 0xbf, 0x5a, 0xf1, 0xa7, 0x28, 0xf3, 0x3a, 0xaf, 0x4f, 0x85, 0xf7, 0xc7, 0x4f, 0xac, 0xe0, 0x83, 0xdc, 0x5d, 0x1c, 0x72, 0x15, + 0xb9, 0xde, 0xd8, 0x09, 0xad, 0x2c, 0xf3, 0xae, 0x2b, 0x12, 0x5d, 0xdd, 0xf1, 0x73, 0x41, 0x74, 0xe8, 0xfb, 0xad, 0x37, 0x55, 0x85, 0x9e, 0xde, 0xf5, 0x73, 0x7d, 0xb8, 0xab, 0xf9, 0xf3, 0xbc, + 0x16, 0xcf, 0x7d, 0x89, 0x9a, 0x7f, 0x7e, 0x5c, 0x52, 0xff, 0xfc, 0xc5, 0xb2, 0x7a, 0xa7, 0x7d, 0xf6, 0x3a, 0xbf, 0x24, 0x20, 0xfe, 0xbe, 0xa0, 0xfe, 0x79, 0xb6, 0xa8, 0x8e, 0xcc, 0x3e, 0xa4, + 0xca, 0x89, 0xb3, 0x21, 0x38, 0x90, 0xe8, 0x5d, 0x6d, 0xa5, 0x88, 0x3b, 0x33, 0xab, 0x25, 0xed, 0x08, 0xa4, 0x1d, 0xaf, 0x4c, 0xe5, 0x0e, 0x99, 0x63, 0x89, 0xb8, 0x9a, 0x81, 0xbb, 0xe5, 0x5c, + 0x40, 0x59, 0x45, 0x04, 0x3c, 0x91, 0xda, 0x34, 0x39, 0xd8, 0x86, 0x07, 0xc1, 0xd4, 0x46, 0x1a, 0x35, 0x5d, 0xe5, 0xb9, 0xdb, 0x91, 0xf3, 0x79, 0x6e, 0x4a, 0xee, 0x64, 0xe1, 0xcd, 0xb9, 0x1f, + 0x7c, 0x6e, 0x3f, 0x7b, 0x1f, 0x3b, 0xe0, 0x5c, 0xb8, 0xc2, 0x4f, 0x99, 0x7b, 0xc1, 0x97, 0x72, 0x2e, 0x5c, 0xd1, 0xfd, 0xe4, 0x3d, 0x97, 0x2c, 0xbe, 0xe0, 0xb0, 0xac, 0x0b, 0x6b, 0x81, 0x39, + 0xb2, 0x82, 0x25, 0x1a, 0x2e, 0x93, 0xac, 0xe4, 0x9a, 0x94, 0x7c, 0x8a, 0xd5, 0xcd, 0xda, 0xef, 0x80, 0xc6, 0xe7, 0xf1, 0x51, 0xa9, 0xef, 0x51, 0x64, 0x26, 0xb3, 0x4c, 0xef, 0xa4, 0x40, 0xbb, + 0xec, 0x24, 0x79, 0xb7, 0xa8, 0x51, 0x41, 0x3c, 0xb0, 0x8b, 0x6d, 0x95, 0xc2, 0x3b, 0x9a, 0x2f, 0x37, 0x2c, 0x5d, 0x6f, 0x65, 0x14, 0xa9, 0x0c, 0x68, 0x4d, 0x73, 0x14, 0xdc, 0xce, 0x85, 0x61, + 0x62, 0x88, 0x57, 0xa4, 0x5e, 0x19, 0x3c, 0xdb, 0xad, 0x5e, 0x2b, 0x27, 0xf0, 0x49, 0xf5, 0x1d, 0x8d, 0xf3, 0xf5, 0xd0, 0x42, 0x02, 0x8b, 0xd5, 0x44, 0x0b, 0x58, 0x24, 0x60, 0x93, 0x91, 0xc8, + 0x98, 0xe9, 0x74, 0x12, 0x67, 0x55, 0xa3, 0x2c, 0x0a, 0x7a, 0x94, 0xd1, 0x0a, 0x5f, 0x62, 0x3c, 0xd2, 0xce, 0x24, 0x27, 0x20, 0x30, 0x05, 0x9d, 0x70, 0x7b, 0x00, 0xdd, 0x1e, 0xf8, 0x68, 0x21, + 0xad, 0x0a, 0x82, 0x30, 0x7a, 0x48, 0xac, 0x47, 0x28, 0x6a, 0x9b, 0x85, 0x38, 0x91, 0xb0, 0xf5, 0xc9, 0x03, 0x85, 0x7c, 0xc6, 0x8b, 0xdc, 0x45, 0x3f, 0x77, 0x37, 0xf0, 0x6f, 0xf9, 0x3e, 0xff, + 0x3d, 0xd5, 0xf5, 0x3d, 0xf1, 0x33, 0x0c, 0xb7, 0x5d, 0x43, 0x15, 0xd8, 0x20, 0xab, 0xb8, 0x9b, 0xbc, 0xa9, 0x98, 0xd6, 0x54, 0x61, 0x3a, 0x5a, 0x24, 0xa6, 0x67, 0xce, 0x19, 0x42, 0x6b, 0x95, + 0x63, 0xca, 0x55, 0x9d, 0x4e, 0xd2, 0x3e, 0x1e, 0x6e, 0x31, 0x6e, 0x1b, 0x2c, 0x11, 0x0b, 0xe7, 0x75, 0xba, 0x01, 0x26, 0xba, 0x8d, 0x36, 0x5b, 0x23, 0xef, 0xe3, 0xfd, 0x29, 0x39, 0x91, 0x47, + 0x0f, 0x5c, 0x11, 0x6c, 0x24, 0x13, 0xd0, 0x5e, 0x47, 0xa6, 0x0a, 0x06, 0x6e, 0xf5, 0x21, 0x06, 0x7d, 0xd7, 0xf3, 0xa3, 0xcc, 0x3b, 0x6b, 0x1c, 0xbc, 0xb2, 0x8e, 0x7e, 0x08, 0xd8, 0x7c, 0x11, + 0xa1, 0x5b, 0xea, 0x17, 0x88, 0x6e, 0xfb, 0x86, 0x62, 0x34, 0xe1, 0x0f, 0xbe, 0xc1, 0xed, 0xe1, 0x64, 0xdd, 0xbb, 0xbc, 0xe2, 0xe3, 0x26, 0x6b, 0xd2, 0x80, 0x3e, 0x32, 0x9b, 0xd3, 0x88, 0x08, + 0x28, 0xd4, 0x87, 0x50, 0xc4, 0xc3, 0x39, 0xb8, 0xc3, 0xdc, 0x20, 0x2b, 0xb8, 0x79, 0x49, 0x50, 0x5e, 0xb9, 0x34, 0x0a, 0x1e, 0x41, 0x59, 0xc3, 0x70, 0xf6, 0x59, 0xec, 0x8a, 0x1b, 0x7e, 0x2f, + 0xc6, 0xb3, 0x39, 0xaa, 0x2f, 0x08, 0x7c, 0x34, 0x51, 0xb8, 0x64, 0x37, 0x40, 0x2a, 0xfc, 0xbe, 0x41, 0x81, 0x7f, 0xa0, 0xa7, 0x02, 0xe2, 0xdb, 0xe0, 0x9e, 0xb1, 0x9d, 0xd7, 0x4e, 0x85, 0xef, + 0x34, 0x3f, 0xa1, 0x73, 0x87, 0x9c, 0x07, 0xa1, 0xf1, 0xc9, 0x80, 0xed, 0xbe, 0x75, 0xb7, 0x2e, 0x11, 0x09, 0xb4, 0x94, 0x14, 0x0b, 0x79, 0x69, 0x22, 0xd3, 0xca, 0x2f, 0x8a, 0xc7, 0xc2, 0xdf, + 0xdd, 0x38, 0xee, 0xb4, 0xd8, 0xff, 0xe6, 0x70, 0xae, 0x49, 0x9f, 0x47, 0x75, 0xdd, 0x31, 0x6c, 0x70, 0x93, 0xbe, 0x0c, 0x53, 0xeb, 0x54, 0x8f, 0x26, 0x10, 0x4d, 0x1e, 0xca, 0xa0, 0x2a, 0x90, + 0xc8, 0x29, 0x57, 0xc2, 0x31, 0xbc, 0xcf, 0x40, 0x74, 0xa5, 0x4f, 0x7b, 0xac, 0x70, 0x7c, 0x49, 0x4e, 0x7f, 0x27, 0xfa, 0xf6, 0xf6, 0xef, 0x97, 0x67, 0xbb, 0xf2, 0x80, 0x3d, 0x40, 0xe2, 0xf1, + 0xc3, 0xa4, 0xa7, 0xbc, 0x29, 0x1e, 0x1e, 0xb4, 0xc3, 0xbe, 0xb4, 0x24, 0x21, 0xed, 0x4d, 0x68, 0xcd, 0x32, 0x33, 0x65, 0x2b, 0xad, 0xd4, 0x84, 0xe6, 0x48, 0x06, 0x89, 0x57, 0x70, 0x2e, 0xb5, + 0x6b, 0x33, 0xc6, 0x64, 0x5b, 0xda, 0xb5, 0x35, 0xc5, 0xc3, 0x3b, 0xfa, 0x30, 0xf1, 0xbb, 0x58, 0x9f, 0x91, 0x64, 0xdb, 0x32, 0xc8, 0x7a, 0x0e, 0xce, 0xf5, 0x51, 0x1e, 0x2c, 0x2a, 0x82, 0x87, + 0x5f, 0x8b, 0xec, 0x8d, 0xee, 0x53, 0xce, 0x3c, 0x9e, 0xd2, 0x79, 0x1d, 0x05, 0xd9, 0x73, 0x95, 0x2d, 0xf8, 0x92, 0x3a, 0xeb, 0x93, 0xea, 0x05, 0xc2, 0xcb, 0xf5, 0x18, 0x1c, 0xa6, 0xce, 0xd2, + 0x96, 0xcb, 0xe5, 0xd6, 0x57, 0xac, 0xa6, 0xa9, 0x2c, 0x7d, 0x45, 0x8e, 0x70, 0x3f, 0xd0, 0x47, 0x1b, 0xbd, 0x25, 0x76, 0x31, 0xa9, 0xa6, 0x7a, 0x8b, 0x55, 0x31, 0x9a, 0xe5, 0x7b, 0xca, 0x34, + 0xdb, 0x46, 0xd0, 0x36, 0x4b, 0xed, 0x04, 0x9a, 0x31, 0xa2, 0x15, 0x8c, 0x44, 0xa1, 0x34, 0xb5, 0x57, 0xc0, 0x7d, 0x41, 0x74, 0xce, 0x9c, 0x6c, 0x19, 0xc4, 0xcb, 0xfd, 0xf6, 0xd4, 0x13, 0x8e, + 0x4c, 0xbd, 0x26, 0xc4, 0x9f, 0x13, 0xe7, 0x7c, 0x06, 0x98, 0x4c, 0x9e, 0xa7, 0x59, 0x73, 0x9b, 0x22, 0xf1, 0x8e, 0x5e, 0xf9, 0xdc, 0x59, 0xe8, 0x15, 0xe3, 0xf1, 0x27, 0xd5, 0x37, 0x18, 0x3f, + 0xae, 0xcf, 0x30, 0xfe, 0x62, 0x3a, 0x86, 0xc6, 0x58, 0xc0, 0xb8, 0x0c, 0xd7, 0x09, 0x20, 0xde, 0x32, 0x80, 0x8d, 0xee, 0x7d, 0x87, 0xcc, 0x71, 0x07, 0x99, 0xaf, 0x05, 0xf6, 0x77, 0xfe, 0xf0, + 0x7b, 0xa1, 0x2d, 0xec, 0xa5, 0x0a, 0x22, 0xcf, 0x43, 0x48, 0xb1, 0x61, 0x55, 0x43, 0xc8, 0x8e, 0x58, 0xcb, 0x34, 0x2b, 0x61, 0xeb, 0xd6, 0x58, 0x10, 0xe0, 0xf6, 0x24, 0xb7, 0x5d, 0x78, 0x98, + 0x6e, 0xa6, 0x07, 0x31, 0x74, 0x50, 0x91, 0xdf, 0x53, 0xa8, 0x6d, 0x04, 0xc1, 0x22, 0x61, 0xa7, 0xc6, 0x89, 0x0a, 0x92, 0x11, 0xd8, 0x1e, 0x0f, 0x53, 0x9d, 0xb1, 0x79, 0x61, 0x71, 0x58, 0x07, + 0x58, 0xe8, 0x6f, 0xfb, 0xb4, 0xc1, 0xd5, 0xa9, 0x09, 0x49, 0xb9, 0x1f, 0xa6, 0x2a, 0x1b, 0xb2, 0xf5, 0x10, 0x11, 0xeb, 0x4d, 0x0c, 0xcc, 0xfd, 0xdf, 0x18, 0x26, 0xf2, 0xc2, 0x37, 0xbe, 0xa1, + 0xfc, 0x86, 0xca, 0x75, 0xfb, 0x6c, 0x31, 0x1e, 0xe0, 0x26, 0x30, 0x6a, 0x3a, 0x28, 0xca, 0x58, 0x46, 0x17, 0xa5, 0xdc, 0xd2, 0x1b, 0xa6, 0x97, 0x4f, 0x3b, 0x17, 0x86, 0x22, 0x87, 0x1f, 0x39, + 0x59, 0x8d, 0x90, 0x3d, 0x35, 0x2d, 0xb7, 0xa3, 0x0d, 0x09, 0x75, 0x7b, 0x41, 0x53, 0x54, 0xa1, 0x1a, 0xa9, 0x1e, 0xb6, 0x10, 0x5a, 0x6c, 0x1e, 0x6e, 0xb0, 0x56, 0x99, 0x1d, 0x81, 0x9c, 0x3d, + 0x85, 0x6b, 0x71, 0x2a, 0xca, 0x10, 0x33, 0x2a, 0x42, 0x69, 0xce, 0x34, 0xd3, 0xd7, 0xd8, 0x4e, 0x9e, 0x39, 0x1f, 0xa7, 0x29, 0xe4, 0x19, 0xd3, 0xb9, 0xad, 0x12, 0xf9, 0x44, 0x20, 0xc1, 0x5f, + 0xe0, 0xdc, 0x57, 0x84, 0xdf, 0xa0, 0xfc, 0x6a, 0x8d, 0x2f, 0x04, 0x7f, 0x47, 0x72, 0xbd, 0xea, 0x39, 0x8c, 0x2f, 0x25, 0x0b, 0x57, 0x15, 0x70, 0x6f, 0xc1, 0xdd, 0xc4, 0xd8, 0xac, 0x7b, 0x2d, + 0x58, 0x91, 0x4b, 0xd1, 0x15, 0x05, 0x1d, 0x3a, 0xe9, 0xad, 0xd7, 0xef, 0x37, 0x99, 0x82, 0xcf, 0xa8, 0x91, 0x2e, 0x83, 0xf8, 0x48, 0xe9, 0x6b, 0x38, 0xed, 0x27, 0x06, 0x01, 0x53, 0x4e, 0x0c, + 0x8c, 0xba, 0x69, 0xed, 0xb3, 0x07, 0x40, 0xce, 0xb5, 0xf9, 0xe2, 0xb0, 0x5a, 0x2d, 0x79, 0xf8, 0x34, 0xc4, 0xc1, 0xee, 0x9b, 0xba, 0xe0, 0xe6, 0x08, 0xec, 0x55, 0x6f, 0x62, 0xe7, 0xfd, 0x71, + 0x15, 0xbe, 0xcb, 0xce, 0xfd, 0x9a, 0x3f, 0xfe, 0xf7, 0xca, 0x9a, 0xff, 0x79, 0x78, 0x70, 0x7e, 0x54, 0x72, 0xf3, 0x5e, 0x8b, 0xf0, 0x36, 0x0c, 0xcb, 0x4e, 0xbe, 0x5e, 0xf0, 0xbe, 0xb6, 0x7b, + 0xe6, 0x05, 0xd6, 0xb9, 0xca, 0x72, 0xef, 0x95, 0xf9, 0xe7, 0xe6, 0x74, 0xaf, 0xd2, 0xb8, 0x55, 0x46, 0xdc, 0x3f, 0xe4, 0xa7, 0x72, 0xc4, 0x1f, 0xea, 0x88, 0xac, 0x2a, 0xbe, 0xb4, 0x1d, 0xb3, + 0x5b, 0x1d, 0xc1, 0xbf, 0xa1, 0x93, 0xb8, 0xbc, 0xc3, 0x95, 0x4e, 0xa2, 0x2e, 0xa3, 0xd4, 0xbb, 0xfa, 0x7c, 0xc8, 0xaf, 0x77, 0x57, 0xb5, 0x55, 0x3e, 0xa9, 0xb9, 0xdc, 0x64, 0x76, 0x7e, 0x7c, + 0xa0, 0x9d, 0x78, 0xbe, 0x9e, 0xee, 0x94, 0x49, 0xcf, 0x84, 0xfc, 0xbf, 0xdf, 0xca, 0xef, 0x68, 0x5f, 0x96, 0xd5, 0x75, 0xcf, 0xd0, 0x3a, 0x11, 0x23, 0x4a, 0x15, 0xf0, 0xa5, 0xd1, 0xd9, 0x3c, + 0xd9, 0xd9, 0xa7, 0x6e, 0x1f, 0xa5, 0x9d, 0xc9, 0x33, 0x05, 0x3e, 0x6f, 0x8c, 0x9d, 0xa0, 0xc0, 0x2b, 0x73, 0xb1, 0xcd, 0x23, 0x78, 0x9e, 0x88, 0x82, 0x32, 0xf1, 0xec, 0x8c, 0x65, 0x67, 0x1d, + 0xb0, 0x59, 0x17, 0x1b, 0xb3, 0x9e, 0x63, 0x73, 0xd0, 0x58, 0x5b, 0x3a, 0xd5, 0x8d, 0x04, 0x8c, 0x5b, 0x90, 0x5e, 0xce, 0xea, 0x98, 0x20, 0xb6, 0x3c, 0x16, 0xbe, 0xc6, 0xa3, 0x7e, 0x59, 0x6c, + 0x8f, 0x17, 0x09, 0xf8, 0xdb, 0x5a, 0xf8, 0x4d, 0x2f, 0xf7, 0xdd, 0xb7, 0xfd, 0xba, 0x7e, 0xf2, 0xb7, 0x49, 0x7e, 0x55, 0x3b, 0xf9, 0x6f, 0x16, 0xc0, 0x77, 0x65, 0xdd, 0xc7, 0x94, 0xb9, 0xc2, + 0xe9, 0xff, 0xea, 0xa0, 0xfe, 0xcf, 0x74, 0x50, 0xdf, 0xd9, 0xf1, 0xe3, 0x05, 0xf7, 0x8a, 0xbb, 0xfc, 0x1d, 0xed, 0xcb, 0x82, 0xbb, 0xee, 0x19, 0x43, 0xc3, 0x5c, 0xe7, 0x25, 0x52, 0x48, 0x92, + 0xc0, 0x5c, 0xd5, 0x96, 0x96, 0xcf, 0xd2, 0xc8, 0x20, 0x9c, 0x35, 0x19, 0xaa, 0x9a, 0xc5, 0x6c, 0xf6, 0xab, 0xc5, 0x44, 0x34, 0x2a, 0x48, 0x8f, 0x5c, 0x0a, 0x9b, 0x77, 0x11, 0xbd, 0x87, 0x62, + 0xe3, 0xc8, 0x79, 0x92, 0xea, 0xd4, 0xeb, 0xb9, 0xd7, 0xcf, 0x05, 0x66, 0x6a, 0x72, 0x32, 0x03, 0x06, 0x30, 0x1b, 0x88, 0x19, 0xca, 0x75, 0x04, 0xc2, 0xaa, 0x78, 0x24, 0x17, 0xed, 0x00, 0x1f, + 0xd7, 0xef, 0xdb, 0xc0, 0xf7, 0x5a, 0x6a, 0x8f, 0x34, 0xd2, 0xf7, 0xeb, 0xe7, 0xae, 0xac, 0xfc, 0x93, 0x33, 0xb9, 0x57, 0x39, 0x56, 0xe1, 0x8d, 0x83, 0xdc, 0x7a, 0xee, 0xf6, 0xfa, 0x4a, 0x21, + 0x97, 0x2b, 0xba, 0xe7, 0x4f, 0xf0, 0xd9, 0x3a, 0x5b, 0xe5, 0x07, 0xc0, 0x8f, 0x03, 0x0d, 0x1b, 0xda, 0x4b, 0x08, 0x26, 0xab, 0xfd, 0x09, 0x5e, 0xd1, 0x5b, 0x8c, 0x9a, 0x15, 0x8c, 0x5d, 0x7a, + 0x96, 0x6e, 0x29, 0x80, 0x50, 0x6c, 0x26, 0x27, 0x27, 0x3b, 0xb5, 0x74, 0xa2, 0xba, 0x1d, 0x3f, 0xcd, 0xd0, 0xa5, 0x81, 0x6e, 0x51, 0x0f, 0x66, 0x45, 0x2f, 0xf5, 0xdb, 0xa5, 0xe9, 0x69, 0xfc, + 0xc1, 0x9c, 0xcd, 0x81, 0xc9, 0xf2, 0xc0, 0x9a, 0x7c, 0xc0, 0x65, 0x44, 0x38, 0xef, 0x9e, 0x55, 0xb8, 0xbb, 0x45, 0xe4, 0x27, 0xdd, 0xe8, 0x6b, 0xd1, 0xec, 0x9f, 0x6a, 0xd1, 0x77, 0x8d, 0xe8, + 0xc0, 0x68, 0x76, 0x7f, 0x7f, 0x68, 0xc8, 0xe9, 0xcc, 0xa1, 0x30, 0xf2, 0xb4, 0x45, 0x9b, 0x72, 0xb3, 0xe3, 0xc0, 0x05, 0xd1, 0xf8, 0xb1, 0xe9, 0xe4, 0xd1, 0x72, 0x89, 0x83, 0x9d, 0xda, 0x88, + 0xcd, 0x7e, 0x37, 0x9d, 0x81, 0x0e, 0x31, 0x55, 0xeb, 0x24, 0x83, 0x41, 0x1a, 0xd6, 0x08, 0x44, 0x01, 0xb6, 0x73, 0x59, 0x3f, 0x84, 0x3b, 0xdf, 0x37, 0x13, 0x78, 0xbd, 0x09, 0x94, 0x51, 0x20, + 0xb9, 0x22, 0xcb, 0x46, 0x29, 0x30, 0xc4, 0xb7, 0xca, 0xb7, 0xac, 0x6a, 0xbc, 0xaf, 0xc6, 0x65, 0x93, 0xd5, 0xd1, 0x53, 0x8f, 0x5e, 0xf0, 0x46, 0x30, 0x18, 0x8a, 0xc5, 0x1d, 0x6d, 0x60, 0x7c, + 0xdf, 0x33, 0x3e, 0xd3, 0xfd, 0x1d, 0x1d, 0x60, 0x31, 0xef, 0xf6, 0x40, 0xb1, 0xda, 0xa2, 0xdd, 0x6c, 0x87, 0x7b, 0x15, 0x39, 0x22, 0xa0, 0x2c, 0xdf, 0x47, 0xec, 0x06, 0x12, 0x3c, 0x06, 0x94, + 0x39, 0x32, 0xef, 0x8f, 0x80, 0x7f, 0xb0, 0xf7, 0x0e, 0xac, 0x04, 0x71, 0x5a, 0x71, 0x10, 0xe8, 0x2c, 0xb0, 0x19, 0x53, 0x17, 0x8c, 0x97, 0x24, 0x96, 0xe8, 0x6a, 0x15, 0x9c, 0xaf, 0x70, 0x91, + 0x40, 0x5a, 0x50, 0x66, 0x60, 0x4b, 0xe9, 0x54, 0x72, 0x80, 0xc6, 0xeb, 0x2b, 0x67, 0xd7, 0x37, 0xa9, 0xe6, 0xd6, 0x5f, 0xff, 0x51, 0xbe, 0xaf, 0x2b, 0x8f, 0xc6, 0xff, 0xfc, 0x0f, 0x7e, 0xbf, + 0xa7, 0x7d, 0x18, 0xc4, 0x1f, 0x6c, 0x77, 0xef, 0xe5, 0xcc, 0xce, 0x3f, 0x4e, 0xfe, 0xc0, 0x77, 0xcb, 0x7d, 0x5f, 0x8d, 0x4f, 0x56, 0xfa, 0x24, 0xb4, 0x3c, 0xcb, 0x5d, 0x6f, 0x9c, 0x57, 0x67, + 0x0f, 0x90, 0x2f, 0xb3, 0xcf, 0xad, 0xd8, 0xd7, 0x7a, 0x65, 0x92, 0x5b, 0xee, 0xf8, 0x4d, 0xc4, 0xba, 0x31, 0xd6, 0xdc, 0xb9, 0x58, 0x15, 0x65, 0x9e, 0x8e, 0x9d, 0x24, 0x7a, 0x0f, 0x4b, 0xfb, + 0x1f, 0xe8, 0x5b, 0xa4, 0xfc, 0xe1, 0xf2, 0x08, 0xf4, 0x0f, 0xf4, 0x34, 0xe1, 0xc1, 0x7b, 0xad, 0x9c, 0x73, 0x22, 0x96, 0xa6, 0x8c, 0xc6, 0x9f, 0xce, 0x87, 0x3f, 0xa8, 0xd2, 0xfe, 0x9e, 0x03, + 0x3d, 0x7d, 0xca, 0x79, 0xca, 0x3d, 0xf9, 0x6d, 0x48, 0xc6, 0xbc, 0xb7, 0xc9, 0xb7, 0xe5, 0x02, 0x6e, 0x1b, 0x4c, 0x3d, 0xed, 0xd8, 0xca, 0xe6, 0xb2, 0xdb, 0xe2, 0x8b, 0xd6, 0xb7, 0x2d, 0x06, + 0x9b, 0xef, 0x94, 0x10, 0x76, 0xd6, 0xa3, 0xc9, 0x7e, 0xea, 0xf3, 0xcb, 0x5e, 0xe3, 0xc9, 0xe3, 0x96, 0x58, 0x4d, 0x5c, 0x7d, 0x62, 0x61, 0xdb, 0x1e, 0x3f, 0xc1, 0x3e, 0xd0, 0x48, 0xa0, 0x37, + 0x21, 0xd0, 0x6d, 0x9a, 0xbb, 0xd4, 0x24, 0x57, 0xa6, 0xc8, 0x5e, 0x95, 0x66, 0x8c, 0xae, 0xb2, 0xec, 0x37, 0x05, 0xfd, 0xf7, 0xa2, 0x42, 0x8f, 0x79, 0xd2, 0x2b, 0xda, 0xe7, 0x3b, 0xda, 0x5f, + 0xa0, 0x7c, 0x1a, 0x8d, 0x27, 0xc3, 0x34, 0xcf, 0xfe, 0xe4, 0x20, 0xcd, 0x72, 0xe9, 0x34, 0xdb, 0xc3, 0xf3, 0x90, 0xf0, 0x00, 0x66, 0xa6, 0x93, 0x33, 0xa8, 0x5b, 0xa7, 0x1c, 0x41, 0x92, 0x1a, + 0x10, 0x50, 0x42, 0xc6, 0x6d, 0xe6, 0xc6, 0x72, 0x1a, 0x56, 0x9d, 0x80, 0x11, 0x6b, 0x6e, 0x0f, 0xce, 0x18, 0x67, 0xca, 0x18, 0x9b, 0x7e, 0xe6, 0x2c, 0xd9, 0xd1, 0xe8, 0x98, 0x14, 0x14, 0xc9, + 0x06, 0x94, 0x15, 0xd5, 0x7a, 0x05, 0x4e, 0xe6, 0xaa, 0x8c, 0x23, 0xdf, 0x32, 0x85, 0xff, 0x58, 0x3a, 0xe9, 0xd9, 0xb6, 0xf5, 0x0a, 0x77, 0x7a, 0xf6, 0x98, 0x0f, 0x80, 0x1e, 0xfe, 0x78, 0xde, + 0xd4, 0x06, 0xf0, 0xac, 0x24, 0x74, 0x81, 0x6e, 0x31, 0x5a, 0xc7, 0x33, 0x9c, 0x31, 0x73, 0x95, 0xac, 0x13, 0xbd, 0xb4, 0x98, 0xda, 0x0f, 0xa7, 0x3b, 0x23, 0xda, 0xb3, 0x7b, 0x2b, 0xd9, 0x39, + 0x31, 0x56, 0x59, 0x5a, 0xdd, 0x58, 0x99, 0x42, 0x9d, 0xd6, 0xfc, 0x31, 0x63, 0x42, 0x65, 0x47, 0x53, 0xab, 0x03, 0x73, 0xa4, 0xb0, 0xb4, 0x92, 0x71, 0x0a, 0x6c, 0xc8, 0xf4, 0x90, 0xc4, 0xdd, + 0x9e, 0xd4, 0xf1, 0x63, 0xdb, 0x31, 0xdf, 0x9c, 0x90, 0xae, 0xdf, 0xf3, 0x37, 0x90, 0xb0, 0x3f, 0xd0, 0xdf, 0xef, 0x67, 0x0f, 0x1e, 0x70, 0x07, 0xcf, 0x17, 0x2e, 0x6f, 0x0f, 0xf8, 0x1d, 0x18, + 0x24, 0xdc, 0x77, 0x26, 0x25, 0xa6, 0xc1, 0x1e, 0x30, 0x35, 0x6e, 0x17, 0xd2, 0xdb, 0xbc, 0x5d, 0x8a, 0x4e, 0x44, 0x03, 0xd3, 0x74, 0x5b, 0xcf, 0x59, 0x49, 0x3a, 0x6e, 0x46, 0xb0, 0x4e, 0x50, + 0x8b, 0x26, 0xc3, 0x28, 0x59, 0x8d, 0xe1, 0x5c, 0x60, 0x6b, 0xbb, 0x99, 0x99, 0x66, 0x81, 0xc6, 0x87, 0xfd, 0xc8, 0x33, 0x81, 0x06, 0xeb, 0x47, 0x6e, 0x40, 0x04, 0x3c, 0x86, 0x38, 0xfe, 0x52, + 0xce, 0x88, 0x01, 0xcc, 0xfc, 0xaa, 0xc4, 0xe2, 0x37, 0x5e, 0xfc, 0x65, 0x15, 0xfc, 0x28, 0xaa, 0x75, 0xf5, 0x73, 0xe9, 0xbb, 0xce, 0x63, 0x16, 0xf9, 0xee, 0x7c, 0x55, 0x45, 0x69, 0x94, 0x58, + 0x1f, 0xc3, 0xfc, 0x1f, 0xe4, 0x79, 0xfe, 0x97, 0x33, 0x6e, 0xa5, 0xe7, 0x3e, 0x57, 0xe7, 0xbc, 0x26, 0x75, 0x5c, 0xd1, 0xfd, 0xf8, 0x3a, 0x97, 0xd6, 0x50, 0xf9, 0xc3, 0xd8, 0x8c, 0x48, 0xc3, + 0x27, 0x75, 0x59, 0xe7, 0x35, 0x53, 0xd0, 0x44, 0x2f, 0xca, 0x98, 0x0d, 0x17, 0x9c, 0x6a, 0x1e, 0xea, 0x44, 0x16, 0x20, 0x01, 0x8d, 0x5c, 0xd3, 0xd1, 0x14, 0xa5, 0x2b, 0x03, 0x76, 0xbb, 0xae, + 0x65, 0x41, 0x30, 0x66, 0x57, 0xcc, 0x2a, 0x67, 0xb1, 0x82, 0xd7, 0x0f, 0xcb, 0x9c, 0xf7, 0x3a, 0x5c, 0xe1, 0x4d, 0x58, 0x51, 0x7c, 0x86, 0x63, 0xb4, 0x35, 0xb3, 0xa3, 0xaa, 0xc7, 0x4c, 0xae, + 0xb2, 0xfc, 0x61, 0x4b, 0xfa, 0xc5, 0x7d, 0xe0, 0x96, 0xfe, 0x07, 0x1c, 0xb7, 0xbd, 0x43, 0x25, 0xd3, 0xed, 0x88, 0x5b, 0x39, 0xb0, 0x9b, 0xb2, 0xeb, 0x44, 0x2c, 0x12, 0x0a, 0x60, 0x10, 0x6e, + 0x96, 0xcc, 0xd6, 0xce, 0x9c, 0x99, 0xfb, 0x62, 0x2d, 0xa2, 0x84, 0x81, 0x23, 0x8d, 0xbe, 0xde, 0x49, 0x28, 0xdd, 0x3a, 0xfd, 0x6c, 0xed, 0x04, 0x93, 0x89, 0x01, 0xf7, 0x10, 0xab, 0xdb, 0x89, + 0x8a, 0x1e, 0x5d, 0x63, 0x8a, 0x88, 0x3b, 0x43, 0x67, 0xe8, 0x76, 0x04, 0x6e, 0x8b, 0x03, 0xce, 0xe6, 0x68, 0x1f, 0x7f, 0x73, 0x94, 0xfd, 0xda, 0xf0, 0x1f, 0xcf, 0x08, 0xf8, 0x15, 0xd7, 0xe0, + 0x8f, 0xa2, 0xa8, 0xe3, 0x8f, 0xab, 0xf1, 0x85, 0xd0, 0xef, 0x83, 0x36, 0xd7, 0xa0, 0x8e, 0x36, 0x13, 0xcc, 0x45, 0xa7, 0xf5, 0xdc, 0xc0, 0x13, 0xbe, 0xd3, 0xf9, 0x45, 0xbd, 0x68, 0x33, 0xda, + 0x5b, 0x39, 0x4b, 0x1c, 0x94, 0x88, 0x8d, 0xe2, 0x92, 0xe1, 0x81, 0x4c, 0x91, 0x08, 0x39, 0x8e, 0xa2, 0x0a, 0x98, 0xe0, 0x82, 0x06, 0x21, 0x41, 0xbf, 0x6a, 0xe4, 0x5d, 0x58, 0x78, 0x99, 0xba, + 0x1e, 0x15, 0xea, 0xaa, 0xdf, 0x38, 0xcd, 0x94, 0xcb, 0xa0, 0xbc, 0xe9, 0xf9, 0xc9, 0x80, 0x05, 0xfa, 0xac, 0x52, 0xec, 0x7f, 0xbe, 0xfb, 0x04, 0x3d, 0xa8, 0xc5, 0xf8, 0xc0, 0x85, 0xfb, 0x23, + 0x65, 0xf8, 0x25, 0xe1, 0x01, 0x7c, 0x2f, 0x63, 0x7d, 0xe7, 0x9b, 0x97, 0x82, 0x07, 0xdf, 0x6e, 0x7c, 0x03, 0xcf, 0x2b, 0xcb, 0x77, 0xdf, 0x23, 0xf0, 0xde, 0x91, 0xe6, 0xe3, 0x96, 0xce, 0x2a, + 0xb3, 0x8f, 0x77, 0x01, 0xef, 0x59, 0x85, 0x1f, 0x65, 0xee, 0x38, 0x7d, 0xbb, 0xe9, 0x83, 0x49, 0xdc, 0x4b, 0x7d, 0x89, 0x55, 0x57, 0xf5, 0xd7, 0x78, 0xa1, 0x9b, 0xd7, 0x48, 0xa2, 0x20, 0xac, + 0xdf, 0xfe, 0xff, 0x2b, 0x6f, 0xd4, 0x85, 0x53, 0xdd, 0x8a, 0x6c, 0x51, 0x96, 0x7f, 0xf0, 0xb8, 0xef, 0x55, 0x07, 0x8e, 0xa7, 0xb1, 0xe5, 0xba, 0x5f, 0xa5, 0x03, 0xb0, 0x27, 0x4c, 0xee, 0xee, + 0x0c, 0x5a, 0x79, 0x4e, 0x53, 0x7a, 0x17, 0xb0, 0x3e, 0x2a, 0xce, 0x3c, 0x00, 0xbb, 0xf2, 0xd2, 0xd6, 0xfb, 0x48, 0x2f, 0x31, 0xb9, 0x05, 0xb1, 0x8e, 0xb2, 0xd3, 0x38, 0x29, 0x9b, 0xf7, 0x5f, + 0x9f, 0x6a, 0xe7, 0xee, 0xc1, 0x7e, 0x7c, 0x14, 0x79, 0x25, 0xb5, 0xc9, 0x0d, 0xe5, 0xab, 0x35, 0x71, 0x6e, 0x8f, 0xc1, 0x61, 0x29, 0x4e, 0x72, 0xd2, 0x2f, 0x9c, 0x8a, 0xca, 0xdc, 0x20, 0xa3, + 0xf4, 0x20, 0x62, 0x31, 0xbb, 0x5b, 0x70, 0xf3, 0x26, 0x83, 0x5d, 0x61, 0x84, 0x84, 0x38, 0xd2, 0x12, 0x49, 0xbc, 0xad, 0xb6, 0x59, 0x0f, 0x08, 0x1a, 0x37, 0x93, 0x3d, 0xdf, 0x9f, 0x6a, 0x8b, + 0x7c, 0x91, 0xc0, 0x08, 0x74, 0x54, 0xa3, 0xb5, 0xc7, 0x6c, 0x77, 0x40, 0xab, 0xcd, 0xfa, 0x98, 0xd2, 0x77, 0x07, 0x43, 0x3b, 0xee, 0x85, 0x8e, 0x71, 0x1e, 0x8a, 0x3f, 0xb7, 0xd3, 0xe9, 0x31, + 0x0c, 0xaf, 0xe4, 0x60, 0xbe, 0xa3, 0x7d, 0x05, 0xc4, 0x7b, 0xcf, 0x18, 0x1c, 0x96, 0x97, 0xb9, 0x82, 0x68, 0x29, 0x68, 0x88, 0x0e, 0x98, 0x1d, 0x6a, 0x07, 0x2a, 0x80, 0xad, 0x6a, 0x20, 0xde, + 0x61, 0xb6, 0xe5, 0x65, 0x76, 0x4e, 0xc6, 0xfb, 0x11, 0xa3, 0x3a, 0x02, 0xcb, 0x41, 0x51, 0x86, 0xf0, 0xfa, 0xd4, 0x5a, 0x58, 0x12, 0x39, 0x33, 0x49, 0xb6, 0x06, 0xdd, 0x15, 0x56, 0x94, 0x53, + 0x9b, 0xf5, 0x91, 0x44, 0x2c, 0x98, 0x76, 0x5e, 0x8b, 0xf0, 0xa9, 0x2b, 0xd4, 0x4d, 0x50, 0x61, 0xe1, 0xe1, 0xa1, 0x74, 0x73, 0x78, 0xae, 0xa3, 0x7d, 0xc5, 0x62, 0x7d, 0x26, 0xf9, 0x3e, 0xee, + 0xc3, 0xf8, 0x42, 0xe4, 0xf7, 0xe1, 0x1a, 0x45, 0x5c, 0x68, 0x19, 0x87, 0xe7, 0x2e, 0x98, 0x43, 0x61, 0xea, 0x29, 0x0e, 0xa6, 0x69, 0x15, 0xe0, 0x11, 0x40, 0xcb, 0x8a, 0xdb, 0x95, 0xb1, 0xe7, + 0x9c, 0x18, 0x96, 0x38, 0xb6, 0x9f, 0xfb, 0x18, 0xa4, 0xa7, 0xd0, 0x7c, 0x2e, 0x4d, 0x68, 0xbb, 0x31, 0x89, 0x49, 0x00, 0xaf, 0xd8, 0xd3, 0xa8, 0x08, 0x46, 0xb4, 0x4c, 0x81, 0xed, 0x81, 0xc5, + 0x66, 0xdc, 0xc9, 0x8c, 0x08, 0xd8, 0x83, 0x37, 0x03, 0x6c, 0x1d, 0xa5, 0xd7, 0x54, 0x1f, 0xac, 0x09, 0x7a, 0x6e, 0x53, 0xbd, 0x49, 0x40, 0xf7, 0xcc, 0x08, 0xf9, 0xc2, 0xa2, 0xf9, 0x24, 0xfb, + 0x06, 0xd8, 0x67, 0xe3, 0x6c, 0x82, 0x1c, 0xb0, 0x5c, 0x0e, 0x42, 0x3e, 0x5b, 0x8c, 0x5c, 0x5e, 0x4b, 0x49, 0x78, 0xed, 0xd8, 0x08, 0x61, 0xeb, 0x6d, 0xc6, 0xad, 0x8e, 0xaa, 0xb8, 0x27, 0xd3, + 0x91, 0x2c, 0x17, 0x1e, 0x12, 0x50, 0xcd, 0xb2, 0xec, 0xe3, 0x35, 0x96, 0xd2, 0x7a, 0x02, 0xb8, 0x7b, 0x43, 0x69, 0x60, 0xc1, 0x95, 0x60, 0xd1, 0x9a, 0x80, 0xf0, 0x06, 0xc9, 0x0f, 0xb1, 0x12, + 0xcc, 0xa2, 0x12, 0xdd, 0x5b, 0xeb, 0xed, 0x0a, 0xd6, 0x14, 0xbd, 0x78, 0x4d, 0x8d, 0x5d, 0xe7, 0xef, 0xd6, 0xd3, 0xaf, 0x2c, 0x7d, 0xd3, 0x1f, 0xa4, 0xb4, 0x1b, 0x5e, 0xfd, 0x08, 0x4f, 0xe4, + 0xa5, 0x20, 0xd7, 0x2b, 0xba, 0x67, 0x40, 0x3f, 0x5b, 0x63, 0x64, 0x58, 0xb8, 0x6b, 0x58, 0x64, 0x35, 0xd3, 0x72, 0x60, 0x24, 0x30, 0xc5, 0xa4, 0x38, 0x6c, 0x65, 0x59, 0xa3, 0xfb, 0x28, 0xb7, + 0x4a, 0xa4, 0x2e, 0x70, 0xaf, 0x21, 0x28, 0x9c, 0x8a, 0xc5, 0xe5, 0x44, 0xb7, 0x1a, 0xa1, 0x8c, 0xcc, 0x75, 0xd0, 0x2d, 0xcd, 0xb5, 0xba, 0x29, 0xd0, 0x93, 0xa9, 0x94, 0xae, 0x53, 0xaf, 0x70, + 0x99, 0xa4, 0x14, 0xac, 0x0f, 0x4d, 0x45, 0x86, 0xf5, 0xd1, 0x49, 0xb0, 0x08, 0x7b, 0x93, 0x0f, 0x98, 0x86, 0x4f, 0xcf, 0xd0, 0x5f, 0xbb, 0xd5, 0xb7, 0xcd, 0xf5, 0x41, 0x81, 0xdc, 0x1b, 0x0b, + 0xd7, 0x59, 0x20, 0x3b, 0x7f, 0x14, 0xf8, 0xa7, 0x0d, 0x65, 0xfc, 0x11, 0x25, 0xf7, 0xb1, 0xf1, 0x3e, 0xfe, 0x62, 0x9f, 0x9b, 0xe7, 0x53, 0xa5, 0xc2, 0x0b, 0x42, 0xf5, 0x85, 0xe8, 0xdb, 0xa7, + 0xba, 0x5c, 0x5d, 0x34, 0x06, 0x03, 0xa4, 0x69, 0xa4, 0x17, 0x8f, 0xd4, 0x29, 0x24, 0x4f, 0xd1, 0x06, 0xee, 0xd8, 0x79, 0xad, 0xac, 0x59, 0x34, 0x70, 0x70, 0x18, 0xa0, 0xf7, 0x07, 0xd3, 0x81, + 0xf2, 0x8c, 0x45, 0xf8, 0x1e, 0x48, 0xc0, 0x62, 0x5b, 0xce, 0x93, 0x4a, 0xf1, 0x0d, 0x06, 0x80, 0x4d, 0xd6, 0xd1, 0x46, 0xde, 0x24, 0x9f, 0xc3, 0x1d, 0xd5, 0xd9, 0x3d, 0xbb, 0xdd, 0x70, 0x9d, + 0x05, 0x4f, 0x16, 0x78, 0x19, 0xa2, 0x23, 0x4a, 0xde, 0xc6, 0xdf, 0xb9, 0x63, 0x5e, 0x8e, 0x3d, 0xeb, 0x69, 0x31, 0x0e, 0xf0, 0xa5, 0x38, 0x85, 0x0f, 0xa2, 0x6f, 0xa3, 0x7e, 0xbf, 0x3c, 0x6f, + 0x8f, 0x03, 0xb4, 0x03, 0xfb, 0x83, 0xe1, 0xaf, 0x0b, 0x2c, 0xcd, 0x67, 0x2d, 0x7b, 0x92, 0x7c, 0xfc, 0x14, 0x6f, 0xe1, 0x16, 0x9b, 0x8f, 0xe0, 0x0d, 0x22, 0xed, 0x3d, 0xd2, 0x63, 0xa7, 0x23, + 0xaa, 0x9f, 0xed, 0x4a, 0x2b, 0x12, 0xa0, 0x28, 0xc8, 0x70, 0xa8, 0xdb, 0x47, 0x0c, 0xb6, 0xb0, 0x67, 0xad, 0x22, 0x6c, 0x5b, 0xc9, 0xdf, 0xd4, 0xa9, 0x62, 0x21, 0x0c, 0x2c, 0xe7, 0x92, 0x5a, + 0x96, 0xbb, 0xa8, 0x75, 0x35, 0x33, 0x7d, 0xcd, 0x1b, 0xe5, 0x91, 0x62, 0x7d, 0xf2, 0x64, 0xea, 0xe4, 0xe5, 0x0f, 0x20, 0xbe, 0xe6, 0x9b, 0xff, 0x4e, 0xf3, 0x82, 0xe1, 0x19, 0xc2, 0x01, 0x5e, + 0xf9, 0xd0, 0x98, 0x1c, 0x21, 0x73, 0x8d, 0x88, 0x9a, 0x2a, 0xa5, 0xa4, 0x1c, 0xc5, 0xd1, 0x69, 0xb2, 0x77, 0xe7, 0xaa, 0x5d, 0x2d, 0xa7, 0xf7, 0xce, 0x5c, 0xd7, 0x55, 0xba, 0x1e, 0xbf, 0xf6, + 0x2b, 0x19, 0x77, 0x3e, 0xa9, 0x5e, 0x5e, 0xfc, 0x72, 0x3d, 0x86, 0x87, 0xe5, 0xdb, 0x49, 0x61, 0x68, 0x33, 0xd9, 0x0a, 0x29, 0x4d, 0x6b, 0x72, 0x10, 0xa3, 0xc4, 0x6c, 0xb9, 0x16, 0x68, 0x44, + 0x6e, 0xb6, 0xc2, 0xc2, 0x87, 0xf1, 0x75, 0x18, 0xce, 0x0e, 0x4b, 0xc3, 0xdb, 0x24, 0xcb, 0x03, 0xa2, 0x53, 0x3b, 0x2d, 0x59, 0x9d, 0xe0, 0x3a, 0x84, 0xab, 0x84, 0xd8, 0x68, 0xf8, 0xb2, 0xc0, + 0xe9, 0x3e, 0xc9, 0x0d, 0x53, 0x88, 0x6c, 0x73, 0x85, 0xd5, 0x53, 0xcf, 0x61, 0xcb, 0x85, 0xb2, 0xd7, 0x07, 0xd8, 0x50, 0xae, 0x2a, 0x02, 0x5e, 0x8a, 0x65, 0xdf, 0x30, 0x91, 0xef, 0x21, 0xfa, + 0x17, 0x7e, 0x85, 0x5e, 0xdf, 0x94, 0x46, 0xe9, 0xa5, 0xf2, 0x51, 0xf5, 0xce, 0x89, 0xa0, 0xa7, 0x7e, 0x8d, 0x6f, 0xb0, 0x44, 0xee, 0xfb, 0xbc, 0x7a, 0x66, 0xc9, 0x7a, 0x81, 0xd5, 0x7c, 0x92, + 0x7d, 0x87, 0xfe, 0xd2, 0x38, 0xdb, 0xaf, 0x06, 0xf0, 0x1b, 0x1d, 0x0f, 0xd6, 0xe9, 0x08, 0x81, 0x58, 0x00, 0x8f, 0x83, 0x46, 0x42, 0x80, 0x1c, 0xa2, 0x26, 0x32, 0xcb, 0xc8, 0x69, 0x68, 0x2c, + 0x96, 0x48, 0x91, 0x6d, 0x4e, 0x79, 0xd6, 0x36, 0xd6, 0x08, 0x01, 0xcb, 0x83, 0x43, 0xa7, 0x2a, 0x32, 0xd2, 0x31, 0xe8, 0x64, 0x99, 0x13, 0x02, 0x99, 0x62, 0x47, 0xdb, 0x0e, 0xc8, 0x8a, 0xf4, + 0xf7, 0x8a, 0x18, 0xa1, 0xd3, 0x06, 0xd8, 0xa2, 0x2d, 0x07, 0x69, 0xcf, 0x9c, 0x5a, 0xee, 0xe1, 0xe8, 0xac, 0xd2, 0x7d, 0xea, 0xe8, 0xf9, 0xa2, 0x94, 0xfa, 0x41, 0xf5, 0x02, 0xc6, 0xe5, 0x7a, + 0xa8, 0x64, 0x6a, 0x37, 0xf2, 0x12, 0xf4, 0x0b, 0xa2, 0x96, 0x19, 0x45, 0x25, 0x85, 0xb9, 0xe2, 0xa1, 0x21, 0x05, 0x4f, 0xf1, 0x9a, 0x6e, 0xec, 0x45, 0x2e, 0xaf, 0x6d, 0xc4, 0xdc, 0xcc, 0xd1, + 0xcd, 0x91, 0xd7, 0x99, 0x4d, 0x07, 0x07, 0x82, 0xd3, 0x31, 0xf9, 0xac, 0x3b, 0x59, 0x76, 0xd2, 0xf3, 0xbd, 0x30, 0x9f, 0xf6, 0xb3, 0xe3, 0x7c, 0xb6, 0x86, 0xb8, 0xcd, 0x3e, 0x06, 0x36, 0x35, + 0xca, 0xab, 0x33, 0xcb, 0xc8, 0xbf, 0xf3, 0xde, 0xea, 0x4f, 0xe9, 0x59, 0x49, 0xf1, 0x53, 0x54, 0xdb, 0x2b, 0x4e, 0xa1, 0x57, 0x74, 0xdf, 0x06, 0xff, 0xd5, 0x1a, 0xe6, 0x0e, 0xba, 0x90, 0x94, + 0x7a, 0xa5, 0xf0, 0xfa, 0x9e, 0x2b, 0xe6, 0x30, 0x98, 0x67, 0x21, 0x5e, 0x11, 0x92, 0x9c, 0x6a, 0x68, 0x8c, 0x0f, 0xf8, 0x98, 0xd5, 0x8f, 0xf9, 0x87, 0xe0, 0x97, 0xf2, 0x0f, 0x7d, 0x10, 0x3d, + 0x8f, 0xe6, 0x3d, 0xf3, 0x10, 0x3c, 0x2c, 0xf3, 0xd0, 0x31, 0x3a, 0xf0, 0x92, 0x8c, 0x1c, 0xe7, 0x1e, 0xa3, 0x36, 0xc4, 0xac, 0xd9, 0xa6, 0x23, 0x7f, 0x21, 0x3b, 0xac, 0x10, 0x70, 0x04, 0x1f, + 0x09, 0x84, 0x38, 0xf2, 0x76, 0xd1, 0x49, 0xc5, 0xf6, 0x55, 0xa0, 0x93, 0x07, 0xc8, 0x8e, 0xf5, 0x53, 0x50, 0x83, 0x60, 0x3e, 0x57, 0xf2, 0x8e, 0xc0, 0x68, 0xb7, 0x2e, 0x04, 0xc6, 0xb2, 0xc4, + 0x80, 0xab, 0x71, 0x08, 0x16, 0x67, 0x96, 0x3d, 0xa2, 0xa8, 0x67, 0xc1, 0x8a, 0x9f, 0x5d, 0x3f, 0xe5, 0xfb, 0xb8, 0xf7, 0x1a, 0x7a, 0x72, 0x2c, 0x79, 0x85, 0xf3, 0x5e, 0x53, 0x7e, 0x83, 0xea, + 0xba, 0x7d, 0x49, 0x3a, 0xfe, 0x3b, 0x5e, 0x27, 0x36, 0x6f, 0xe7, 0x3d, 0xbf, 0x43, 0x66, 0xd5, 0x02, 0x37, 0x92, 0x29, 0xee, 0x2b, 0xe4, 0x76, 0x35, 0xad, 0x5a, 0x65, 0xdd, 0x58, 0x91, 0x2d, + 0x1e, 0x77, 0xd2, 0x6a, 0xb1, 0x4e, 0x09, 0xc1, 0x56, 0x1b, 0xb2, 0x04, 0x79, 0x1f, 0xe2, 0x22, 0x31, 0x2f, 0x96, 0xfc, 0x6c, 0x13, 0x2d, 0xf6, 0x91, 0x41, 0x90, 0xb6, 0x6f, 0x59, 0xf0, 0x22, + 0x44, 0xed, 0xd2, 0x93, 0xd0, 0xf9, 0x46, 0x57, 0x59, 0xf0, 0x9b, 0xb2, 0xea, 0xde, 0xe5, 0xe3, 0xdf, 0x03, 0xe1, 0x86, 0xf2, 0x7b, 0xe6, 0xe1, 0xcf, 0xf6, 0x50, 0x10, 0xe2, 0xad, 0x59, 0x66, + 0x3a, 0x8f, 0xc0, 0x12, 0x19, 0xd1, 0x73, 0x98, 0x0d, 0x20, 0x7b, 0x89, 0xf7, 0xfb, 0x9c, 0xe5, 0x85, 0xe0, 0xb8, 0xed, 0x0c, 0x92, 0xf6, 0x36, 0x6e, 0x67, 0xa0, 0x6a, 0x0b, 0x38, 0x82, 0xe2, + 0x2d, 0x0b, 0x27, 0xdf, 0x21, 0xc5, 0x8e, 0xf1, 0x39, 0xed, 0xb8, 0xe1, 0xf4, 0x7c, 0x5e, 0x66, 0x25, 0x5d, 0xc2, 0xde, 0xac, 0x2a, 0xb3, 0xf9, 0xf1, 0xb8, 0x64, 0x4b, 0x4b, 0x99, 0x0d, 0x50, + 0x5e, 0x0d, 0xf0, 0x28, 0xfb, 0x2b, 0x77, 0xb1, 0x27, 0x47, 0x93, 0x87, 0x99, 0x9f, 0x6f, 0x4f, 0x26, 0xaf, 0xd8, 0x42, 0x9e, 0x65, 0x7c, 0x46, 0x86, 0xd9, 0x3a, 0x96, 0xbc, 0x55, 0x23, 0xf4, + 0x6a, 0x0a, 0xa1, 0x50, 0xcc, 0x9e, 0x60, 0xc6, 0x6b, 0xd7, 0x49, 0x89, 0x24, 0xcd, 0x66, 0x4f, 0x04, 0x6d, 0xba, 0x47, 0xa0, 0x09, 0x67, 0x49, 0x73, 0x6c, 0x5f, 0x23, 0x3a, 0x4e, 0x20, 0x32, + 0x55, 0xf9, 0x05, 0x13, 0x63, 0x5b, 0x69, 0xb6, 0xd4, 0x0f, 0xbe, 0x71, 0x3a, 0x1d, 0x71, 0x41, 0x01, 0xd6, 0x28, 0xca, 0xe5, 0xc7, 0x51, 0xb9, 0x92, 0x37, 0x71, 0xb2, 0xe6, 0xb0, 0xd7, 0x24, + 0xbf, 0xc7, 0x19, 0x9e, 0xef, 0x40, 0xbc, 0x24, 0xca, 0x7c, 0x7c, 0x50, 0x86, 0xae, 0xf4, 0x62, 0x83, 0xe1, 0x4b, 0x72, 0xfb, 0x0d, 0xb8, 0x24, 0xb7, 0xc7, 0x67, 0x0a, 0xbf, 0x43, 0x26, 0xb4, + 0xd4, 0x8c, 0xde, 0xf4, 0xe2, 0xda, 0xf6, 0x02, 0x7a, 0x93, 0x19, 0xe2, 0x54, 0xd3, 0xfc, 0x15, 0x1b, 0x95, 0x6a, 0x80, 0x8c, 0x76, 0x1d, 0xbf, 0x5d, 0x5a, 0x92, 0x2f, 0xa9, 0x06, 0xb8, 0xf2, + 0xb2, 0xe3, 0xa6, 0x6d, 0x59, 0x4e, 0x9c, 0x68, 0x13, 0xa0, 0x9e, 0x4b, 0x8a, 0xc8, 0x36, 0x40, 0xc2, 0x1c, 0x77, 0x86, 0x62, 0xa6, 0xc5, 0x2e, 0xd1, 0x18, 0xef, 0x30, 0x67, 0x5d, 0xae, 0x27, + 0xd6, 0xaf, 0x1d, 0x8e, 0x6f, 0xf7, 0xb2, 0x07, 0xda, 0xd6, 0x28, 0xf3, 0xcf, 0xfa, 0xc7, 0xff, 0xfc, 0xbf, 0x8f, 0x3c, 0xf0, 0xa2, 0x2c, 0xf4, 0xca, 0xe8, 0x62, 0x06, 0xbf, 0x4d, 0xc1, 0xf1, + 0xc0, 0x25, 0xfc, 0xea, 0xe7, 0x2b, 0xf7, 0xd7, 0x7b, 0x5d, 0xe5, 0xdb, 0x7e, 0x17, 0x9d, 0x5d, 0x52, 0xf3, 0xa4, 0xa9, 0x7f, 0x75, 0xea, 0xbb, 0x4d, 0xa0, 0xfa, 0xe8, 0xb3, 0x4e, 0x5f, 0x72, + 0xe8, 0xbb, 0xa2, 0xfb, 0xf1, 0x75, 0x2f, 0xad, 0xf1, 0x74, 0x98, 0x23, 0xdf, 0x5c, 0x60, 0x03, 0x45, 0x22, 0xbd, 0x22, 0x5a, 0x19, 0x9d, 0x38, 0x99, 0xcb, 0xd9, 0xf2, 0x38, 0x9a, 0xea, 0x99, + 0xda, 0xc0, 0x0c, 0x61, 0xb8, 0xbd, 0xbd, 0x14, 0x91, 0xa9, 0xb7, 0xee, 0xa0, 0xb6, 0x9c, 0xf4, 0xc4, 0xa4, 0x35, 0xd7, 0xde, 0xc9, 0x73, 0xa1, 0x8a, 0x9c, 0x85, 0x99, 0xed, 0x08, 0xce, 0x0c, + 0x50, 0x4a, 0xfe, 0xc4, 0x4f, 0x65, 0x51, 0x2a, 0xe3, 0x65, 0x8f, 0x58, 0xca, 0xcc, 0xcc, 0x5f, 0x5b, 0x17, 0x57, 0xf9, 0x61, 0x7f, 0x32, 0x50, 0xbd, 0xdd, 0x63, 0x25, 0x63, 0x37, 0x7a, 0x9a, + 0xdf, 0xeb, 0x35, 0x63, 0xeb, 0x15, 0xdd, 0x77, 0x28, 0xdf, 0x5b, 0x43, 0xcd, 0xa9, 0xfc, 0x12, 0x8d, 0x5d, 0x41, 0x0b, 0x81, 0x23, 0x91, 0x9d, 0xf2, 0x99, 0xb3, 0x5a, 0x78, 0x2c, 0x17, 0xaf, + 0x69, 0x07, 0x9a, 0x9f, 0x16, 0x07, 0x04, 0x96, 0x54, 0x0d, 0xd9, 0x45, 0xbb, 0x29, 0x14, 0xc1, 0x1b, 0xda, 0x3d, 0xae, 0x8f, 0xeb, 0xed, 0x8e, 0xdd, 0xd3, 0xfb, 0xf4, 0xc0, 0x79, 0x4a, 0xc3, + 0xc9, 0x58, 0x31, 0x37, 0xf7, 0xea, 0x41, 0xd3, 0x73, 0x15, 0xb6, 0xe1, 0xb0, 0x39, 0xea, 0xeb, 0xc0, 0x78, 0x6d, 0xbd, 0x44, 0x59, 0xf4, 0x9f, 0xf7, 0x8c, 0x4c, 0xd8, 0x13, 0x14, 0xf3, 0x67, + 0x13, 0x71, 0xf6, 0x52, 0xc0, 0x65, 0x90, 0x9f, 0x27, 0x60, 0x5e, 0x8f, 0x67, 0xc3, 0x02, 0x2c, 0x65, 0xcc, 0xdb, 0x16, 0xf5, 0xae, 0x59, 0x1a, 0xc7, 0x2e, 0xda, 0x57, 0xa0, 0xa7, 0x8f, 0xda, + 0x49, 0x8e, 0x8e, 0x76, 0x0c, 0xc4, 0x1e, 0x74, 0x0e, 0x77, 0x57, 0x02, 0xed, 0x39, 0x92, 0xaf, 0xa6, 0x71, 0xe6, 0x74, 0xb3, 0xb9, 0x8e, 0xb8, 0x4e, 0x07, 0x50, 0xe1, 0x31, 0xc2, 0x79, 0x37, + 0x39, 0x88, 0x75, 0x78, 0x3c, 0x16, 0xe6, 0x29, 0xea, 0xf9, 0xfe, 0x14, 0xe0, 0xb2, 0x9a, 0xd2, 0xd5, 0x72, 0xf4, 0x1a, 0x5a, 0xff, 0xab, 0x8a, 0x32, 0xf7, 0x6d, 0x9c, 0x65, 0xd8, 0x54, 0xc0, + 0x7b, 0xf0, 0x33, 0xf8, 0x07, 0xba, 0x3b, 0xa8, 0xfd, 0xaf, 0xaa, 0x4f, 0xad, 0xd2, 0xe9, 0xad, 0x18, 0x78, 0x03, 0x62, 0xfc, 0x55, 0xe5, 0xf8, 0x9b, 0x5f, 0xf3, 0xa3, 0x22, 0x1a, 0x1f, 0x85, + 0x7b, 0xae, 0x6e, 0x7b, 0x9c, 0xa3, 0xe0, 0x8d, 0x11, 0xdd, 0xb1, 0x9b, 0xeb, 0x88, 0x94, 0xf3, 0xab, 0xdd, 0xf2, 0xa9, 0xbb, 0xca, 0x12, 0xdf, 0x0c, 0x37, 0x0f, 0xaa, 0x42, 0x7c, 0xd3, 0x88, + 0x3d, 0xc9, 0x18, 0x70, 0x73, 0x4f, 0x31, 0x76, 0xac, 0xcc, 0xf1, 0xae, 0x95, 0x16, 0x77, 0x23, 0x3a, 0x6b, 0x31, 0x2d, 0xf7, 0xc3, 0x1f, 0xe1, 0xfa, 0x3c, 0x7b, 0x73, 0x5f, 0x53, 0x26, 0x17, + 0x4b, 0xcd, 0x38, 0xb1, 0x8e, 0xbf, 0x6e, 0x86, 0x37, 0x99, 0x94, 0x1e, 0x8b, 0x14, 0xf0, 0xd5, 0x79, 0x79, 0xf0, 0x9c, 0xfd, 0xa2, 0xfb, 0x36, 0x77, 0xbf, 0x5a, 0xe7, 0xc0, 0x58, 0xf4, 0xf7, + 0x39, 0x9c, 0xa9, 0xd9, 0x6a, 0x0a, 0xe3, 0x85, 0x7d, 0x38, 0x1a, 0x56, 0x16, 0x16, 0x94, 0x51, 0x45, 0x88, 0xec, 0xe2, 0xfc, 0xdc, 0xb3, 0x88, 0x39, 0x8a, 0x8d, 0x64, 0x13, 0x02, 0x49, 0x1e, + 0x4a, 0x27, 0xb6, 0x3a, 0xd7, 0x17, 0x34, 0xe5, 0xb8, 0xd3, 0x79, 0x33, 0x47, 0x2c, 0x74, 0x3b, 0x35, 0xe2, 0xa5, 0x09, 0x45, 0x9b, 0x1d, 0xd3, 0x9b, 0x3d, 0xae, 0xa2, 0x2a, 0xc1, 0xad, 0x3d, + 0xa2, 0xd9, 0x94, 0xd1, 0x90, 0x43, 0xed, 0x45, 0x4e, 0x7b, 0x76, 0xa6, 0xfb, 0x7b, 0x95, 0x5a, 0x68, 0xbd, 0x21, 0xf0, 0x26, 0xe4, 0x41, 0xc3, 0x62, 0x77, 0x7c, 0xd8, 0x6d, 0x05, 0x50, 0xd7, + 0x50, 0xc1, 0xdb, 0x63, 0x72, 0xbc, 0x5d, 0x2d, 0x4b, 0x2f, 0xdc, 0xdb, 0x3d, 0x3f, 0xdf, 0x2f, 0x8a, 0x29, 0xa0, 0x73, 0x62, 0x31, 0xad, 0xd5, 0x62, 0xcb, 0xea, 0xc8, 0x8a, 0x61, 0x4c, 0x0e, + 0x02, 0x88, 0xa3, 0xbd, 0x90, 0x6b, 0x1f, 0xa8, 0xa2, 0x39, 0xac, 0x6c, 0x55, 0x0f, 0x9c, 0x39, 0x16, 0x95, 0xea, 0xb5, 0x61, 0xf4, 0x5b, 0x9a, 0xb5, 0x09, 0x05, 0xe9, 0x87, 0xa8, 0x79, 0x9f, + 0xc8, 0xb0, 0x0f, 0xe7, 0xcd, 0xf7, 0x4a, 0xf0, 0xff, 0xde, 0x29, 0xf8, 0x8e, 0xf6, 0x3b, 0x7a, 0x57, 0x3d, 0x43, 0x4e, 0xc3, 0x67, 0xbb, 0xcd, 0x02, 0xd4, 0xc5, 0xe5, 0x3e, 0x3e, 0x96, 0xd8, + 0xfc, 0x74, 0x92, 0xa4, 0xcd, 0x29, 0xde, 0xe1, 0x3d, 0x87, 0x88, 0x6d, 0x4d, 0x53, 0x95, 0xb6, 0x9a, 0x8b, 0x87, 0xae, 0x01, 0x51, 0x6d, 0xd1, 0x43, 0x89, 0x8d, 0xd2, 0x2d, 0x3b, 0x9d, 0x54, + 0x62, 0x38, 0x65, 0xa0, 0x78, 0x7b, 0x0c, 0xf0, 0xcd, 0x8e, 0x9d, 0xae, 0x2b, 0x5f, 0x26, 0x4d, 0xbc, 0xd9, 0xcd, 0x36, 0xb1, 0x41, 0x99, 0x84, 0x0d, 0xa4, 0xdf, 0x94, 0x01, 0x6f, 0x2f, 0x67, + 0x47, 0x41, 0xf4, 0xfc, 0xec, 0xfc, 0x9a, 0x5b, 0xdb, 0x15, 0xdd, 0x77, 0x08, 0xde, 0x5b, 0x43, 0x5d, 0xd7, 0xd6, 0x0a, 0xa1, 0xc0, 0xeb, 0xbd, 0xbd, 0x21, 0x54, 0x1f, 0x85, 0x71, 0x6c, 0x45, + 0xdb, 0x74, 0xdf, 0xae, 0x02, 0xbf, 0x8e, 0x17, 0xd3, 0xc3, 0x22, 0x4e, 0xc9, 0x7c, 0x16, 0x52, 0x72, 0x31, 0xef, 0xb9, 0x50, 0x13, 0x92, 0xd5, 0x28, 0x3c, 0xe2, 0xae, 0x8b, 0x68, 0x4a, 0x05, + 0x82, 0x4a, 0x50, 0x69, 0x9b, 0xce, 0x41, 0x50, 0x08, 0x5b, 0xcd, 0xe2, 0x68, 0x6a, 0xd4, 0x34, 0x99, 0xf0, 0xb0, 0xef, 0x7f, 0x3b, 0x11, 0xbe, 0xbd, 0x98, 0x9f, 0x58, 0xcf, 0xf3, 0xe5, 0xbc, + 0x3a, 0x05, 0xde, 0x88, 0xbe, 0x0f, 0xfc, 0xed, 0x72, 0x8c, 0x0c, 0xfb, 0xe8, 0xf4, 0x29, 0x5e, 0xa9, 0x80, 0x04, 0x71, 0x7b, 0x75, 0xeb, 0xd4, 0x45, 0x11, 0xb0, 0xf3, 0xc0, 0x57, 0x04, 0xb0, + 0xe6, 0xf4, 0xc6, 0xd4, 0xf6, 0x61, 0xc0, 0x97, 0x10, 0x16, 0x1f, 0xd4, 0x26, 0xe5, 0x13, 0x74, 0xee, 0xb7, 0x13, 0x9a, 0x55, 0x12, 0x4f, 0xc3, 0x0e, 0xa6, 0xd6, 0xe7, 0x3b, 0x6a, 0xa1, 0xce, + 0x19, 0x95, 0x22, 0x91, 0x8d, 0x90, 0x2f, 0x01, 0xf3, 0xa8, 0x4d, 0xe8, 0x36, 0xe1, 0xc5, 0x6f, 0x66, 0xda, 0xdb, 0x43, 0xdb, 0xb3, 0x8f, 0xfe, 0xf7, 0x42, 0xe7, 0x15, 0xdd, 0xf7, 0xb1, 0xbf, + 0xb7, 0x86, 0xa4, 0xf3, 0x7a, 0x1b, 0xbe, 0x13, 0xee, 0x2c, 0x6c, 0x56, 0xae, 0x01, 0x8d, 0x84, 0xb9, 0x64, 0x07, 0x61, 0xfb, 0x7c, 0xd2, 0xca, 0xcb, 0x1e, 0xb4, 0x7a, 0x6b, 0x4b, 0x1f, 0xa7, + 0xf5, 0xf2, 0x60, 0x06, 0xd3, 0x42, 0x98, 0x6c, 0xb4, 0x13, 0xbd, 0xd2, 0x09, 0x08, 0x73, 0xf9, 0xb2, 0x91, 0x92, 0x9e, 0x24, 0x05, 0x5f, 0x6b, 0xe9, 0x24, 0x08, 0x39, 0x27, 0x9d, 0x42, 0x33, + 0x64, 0x44, 0x90, 0x72, 0x1b, 0xc1, 0x72, 0x0b, 0x2c, 0x1f, 0xce, 0xf9, 0x3a, 0xbf, 0x38, 0x4f, 0xd4, 0x4f, 0xbf, 0xfd, 0xeb, 0xcb, 0xff, 0x8a, 0xf6, 0x3b, 0x0c, 0x57, 0x3d, 0x43, 0x97, 0x7f, + 0xbc, 0xd8, 0x3b, 0xca, 0x26, 0xcc, 0x92, 0xa5, 0x0e, 0xc5, 0xa7, 0x7c, 0x19, 0x63, 0xc2, 0x8e, 0x53, 0xac, 0x8e, 0x99, 0xae, 0x04, 0x1b, 0x58, 0xf7, 0x9a, 0x33, 0xed, 0x66, 0x04, 0x08, 0x87, + 0x82, 0x2a, 0x80, 0xae, 0xbf, 0x90, 0xf7, 0x36, 0x23, 0x71, 0x6d, 0x00, 0xb9, 0xa8, 0xe3, 0x4f, 0x18, 0xdb, 0xd3, 0xd2, 0x5a, 0x9b, 0xe9, 0xb6, 0xad, 0x4f, 0x0e, 0xbd, 0x09, 0xab, 0x5e, 0x38, + 0xc3, 0xb6, 0x03, 0x94, 0x01, 0x8f, 0xe3, 0xbf, 0x9e, 0xb2, 0xd1, 0x93, 0x55, 0x66, 0xff, 0xaa, 0xb4, 0xfd, 0x41, 0xf4, 0x1d, 0xb9, 0xb7, 0xcb, 0xa1, 0x72, 0xb6, 0x76, 0x20, 0xe4, 0x43, 0x84, + 0xec, 0x1b, 0x4c, 0x1d, 0xa9, 0x87, 0xe5, 0xc6, 0x3d, 0xcc, 0x05, 0x50, 0xb4, 0x14, 0x7d, 0x59, 0x51, 0xcb, 0x95, 0x46, 0x48, 0x6d, 0x3c, 0xf3, 0xb4, 0xed, 0x66, 0x29, 0x1b, 0x10, 0xb9, 0x58, + 0x52, 0xbd, 0x11, 0xae, 0xb7, 0x39, 0x8f, 0xad, 0x24, 0xda, 0x4b, 0xb3, 0xa4, 0xd5, 0x9d, 0x16, 0x30, 0xe8, 0xd4, 0x81, 0xbb, 0xcd, 0x16, 0x27, 0x48, 0x18, 0xa1, 0x33, 0xad, 0x1a, 0x52, 0x45, + 0x20, 0x74, 0xcb, 0x71, 0x18, 0x55, 0x75, 0x1e, 0x94, 0x56, 0xfa, 0x53, 0x31, 0xf5, 0x57, 0x34, 0xca, 0xf7, 0xc4, 0xdf, 0x80, 0xb9, 0xeb, 0x3a, 0xeb, 0xda, 0x07, 0x00, 0x14, 0x82, 0x86, 0x9a, + 0xaf, 0x26, 0x5e, 0x77, 0xa8, 0x2c, 0x73, 0x92, 0x2d, 0x54, 0xd5, 0x42, 0xdd, 0xb5, 0x40, 0x61, 0xd5, 0xe1, 0x38, 0xa2, 0x03, 0x97, 0x44, 0x46, 0x82, 0xb3, 0x9a, 0x09, 0x0d, 0xd6, 0x9b, 0x54, + 0xa2, 0x82, 0xd5, 0x4e, 0x11, 0x19, 0xa6, 0x9c, 0x38, 0x27, 0x2f, 0x93, 0x2a, 0xf1, 0x70, 0xb0, 0x75, 0x66, 0x99, 0x01, 0xf9, 0xc2, 0x40, 0xfb, 0xbd, 0x4f, 0x73, 0xbb, 0x65, 0xdb, 0xa7, 0x03, + 0xe6, 0xd4, 0x75, 0x95, 0xf9, 0x47, 0xde, 0xda, 0x56, 0x9c, 0xff, 0xe7, 0x4b, 0xbb, 0xf4, 0x78, 0xae, 0xdd, 0x0c, 0xb9, 0xf0, 0x4a, 0xc7, 0xcb, 0xea, 0x28, 0xf1, 0x3e, 0xc2, 0xdf, 0x9f, 0x19, + 0xc0, 0x5e, 0xd8, 0xb9, 0x7e, 0x7a, 0xd2, 0x37, 0xf0, 0xef, 0x7e, 0x1f, 0x9a, 0x29, 0x5d, 0x22, 0x5a, 0x5b, 0x3d, 0x8a, 0xc9, 0xb2, 0x63, 0xf6, 0x13, 0x94, 0x95, 0x17, 0x10, 0xba, 0x5b, 0xe7, + 0x06, 0x6d, 0x6b, 0xed, 0xd4, 0xa0, 0x4f, 0xc2, 0x04, 0x9f, 0xc6, 0x91, 0x02, 0xb2, 0xca, 0x04, 0x9f, 0x40, 0xbe, 0xa3, 0xa8, 0x9b, 0x9d, 0x2a, 0x63, 0xf8, 0x54, 0xaf, 0x17, 0x0b, 0x13, 0xb6, + 0x42, 0x03, 0x9b, 0x4c, 0x7a, 0x30, 0x3e, 0xe1, 0xab, 0x16, 0x71, 0x51, 0x36, 0x1b, 0x29, 0xd5, 0xa8, 0x1b, 0xf0, 0x25, 0x1e, 0xcc, 0xd4, 0x1f, 0xd5, 0x13, 0xe1, 0xe3, 0xd2, 0x73, 0xff, 0x9e, + 0xf6, 0xee, 0xd1, 0x03, 0xde, 0x40, 0x7e, 0xd0, 0x3d, 0x54, 0xa3, 0xe7, 0x58, 0xa5, 0x18, 0x27, 0x8e, 0x16, 0x62, 0xb2, 0xb0, 0x95, 0x39, 0x8c, 0x6c, 0x61, 0x4c, 0x16, 0x6b, 0x37, 0x34, 0x42, + 0xad, 0xf2, 0x12, 0x0b, 0x68, 0xbc, 0x29, 0xb0, 0xe7, 0xfa, 0xbd, 0x17, 0xe8, 0xed, 0x8e, 0x3a, 0xf0, 0x30, 0xbb, 0xa6, 0x67, 0x12, 0x4c, 0x2c, 0xb3, 0xd9, 0xca, 0x5c, 0x85, 0x50, 0x80, 0x63, + 0x4e, 0x31, 0x45, 0xab, 0x06, 0x58, 0x04, 0x92, 0xd2, 0x3b, 0x5b, 0x05, 0x77, 0x06, 0x09, 0xdf, 0x6f, 0x2f, 0x7d, 0x3e, 0xbc, 0x94, 0xcf, 0x99, 0x00, 0xf8, 0x67, 0xfa, 0x8a, 0x1c, 0x7e, 0x43, + 0xfa, 0x03, 0xa0, 0xcf, 0x8e, 0x73, 0x61, 0x91, 0x01, 0xd2, 0x79, 0x8d, 0x85, 0xfb, 0xd6, 0xf3, 0x81, 0x29, 0x43, 0x73, 0x98, 0xbc, 0x55, 0x5d, 0xad, 0xd7, 0xb5, 0x30, 0xc1, 0xfb, 0x98, 0x6e, + 0x46, 0xeb, 0xc4, 0xa2, 0x41, 0xd6, 0xe8, 0x5d, 0xbe, 0x69, 0x6d, 0x85, 0x8a, 0x8a, 0x23, 0x21, 0x17, 0x42, 0x86, 0x68, 0x61, 0x87, 0x9b, 0x27, 0x9a, 0xa4, 0x2d, 0x1c, 0xc4, 0x23, 0x5d, 0xc5, + 0x77, 0xe4, 0xbe, 0xcf, 0xd1, 0x63, 0x6a, 0xd4, 0x08, 0x19, 0xad, 0xcd, 0x6f, 0xae, 0xb2, 0xe1, 0xa9, 0xf0, 0xca, 0xe8, 0x99, 0x95, 0xe1, 0xc5, 0x6d, 0xe1, 0x42, 0xf3, 0x6d, 0xe4, 0x97, 0xab, + 0xa1, 0x9b, 0x82, 0xa3, 0x58, 0x71, 0x78, 0xb4, 0xb5, 0xca, 0x62, 0x9b, 0xc3, 0xde, 0x6f, 0x5b, 0x47, 0x6b, 0xda, 0x04, 0x58, 0x24, 0x13, 0x04, 0x5e, 0xa1, 0xd3, 0x63, 0xb0, 0x5e, 0x1b, 0xa5, + 0x71, 0x54, 0x94, 0x72, 0x76, 0x48, 0x57, 0x00, 0xbd, 0xe2, 0x46, 0x0a, 0xee, 0x94, 0x0a, 0x9a, 0xb2, 0x89, 0xe4, 0x02, 0x16, 0x16, 0x8d, 0x44, 0x0f, 0xa1, 0x40, 0x3e, 0x50, 0xca, 0xda, 0x14, + 0xd7, 0xbd, 0x37, 0xb2, 0xc8, 0x01, 0x07, 0x92, 0x8f, 0x72, 0x0e, 0xff, 0x33, 0xb9, 0xb7, 0xeb, 0xbe, 0xfd, 0x72, 0xe5, 0x8d, 0x08, 0xfd, 0xf9, 0xcb, 0x92, 0xf5, 0xef, 0x94, 0xbf, 0x7a, 0x6e, + 0xf1, 0xbd, 0x7f, 0xde, 0x70, 0x8c, 0xdf, 0x08, 0x03, 0xe3, 0xf3, 0x9f, 0xf1, 0xe4, 0x9b, 0x57, 0xcf, 0x3f, 0xcf, 0x10, 0x66, 0xf6, 0x0a, 0x25, 0x77, 0x68, 0x60, 0xd2, 0xd3, 0x15, 0x1f, 0x04, + 0x4e, 0xcd, 0x10, 0xce, 0x5e, 0xb7, 0x62, 0x10, 0x1f, 0x71, 0xb4, 0x1e, 0x2a, 0x6c, 0x44, 0xf5, 0x8b, 0x4c, 0x9d, 0x29, 0x33, 0xcb, 0x0b, 0xd2, 0x02, 0x9f, 0x2a, 0x80, 0x2d, 0x7b, 0x84, 0xae, + 0xda, 0x88, 0xa4, 0x2e, 0x2c, 0x79, 0x53, 0xd4, 0xab, 0x59, 0xdc, 0x18, 0xd6, 0x26, 0xcc, 0xec, 0x0d, 0x2d, 0xc4, 0x36, 0x67, 0x03, 0x9f, 0x92, 0xfa, 0x3f, 0xff, 0x3c, 0x0b, 0xcf, 0x7c, 0xcf, + 0x37, 0x62, 0x9f, 0xc6, 0xae, 0xe7, 0x5b, 0x4d, 0xf2, 0xef, 0xc6, 0xe5, 0x7c, 0xa3, 0x0e, 0x8c, 0xbf, 0xf7, 0x0d, 0x39, 0xcc, 0x40, 0x63, 0x85, 0x2f, 0x6a, 0xa7, 0xb5, 0x97, 0x39, 0x8a, 0xcf, + 0x0f, 0x16, 0xc4, 0x4d, 0x73, 0xb7, 0x44, 0x90, 0xc8, 0xe3, 0xba, 0xf8, 0x77, 0xa6, 0x12, 0xa5, 0xe7, 0x22, 0x0a, 0x89, 0xd5, 0x3f, 0x73, 0xe8, 0x7a, 0x6d, 0x41, 0x5d, 0xd1, 0x7d, 0x1b, 0xd9, + 0x57, 0x6b, 0xc8, 0xc2, 0x82, 0xc6, 0xc4, 0x36, 0x15, 0x44, 0x6d, 0xc7, 0xee, 0x73, 0x68, 0x94, 0x99, 0xeb, 0x35, 0x61, 0xa8, 0x99, 0xdf, 0x25, 0xad, 0x18, 0x0f, 0xc8, 0x4c, 0x14, 0xa5, 0x4d, + 0x99, 0x36, 0x65, 0x68, 0x55, 0xcf, 0x1d, 0x80, 0x5e, 0xc9, 0xa4, 0x72, 0x45, 0xf7, 0x3c, 0xa6, 0xcf, 0xd6, 0xb0, 0x6c, 0x2a, 0x71, 0x18, 0x4d, 0xab, 0x32, 0xce, 0xf3, 0x7d, 0x74, 0x14, 0x1d, + 0x15, 0xb3, 0x60, 0x68, 0x67, 0x9f, 0x78, 0x4d, 0x1b, 0xe5, 0x03, 0xc6, 0xf4, 0x65, 0x68, 0x78, 0x36, 0x09, 0xff, 0x5e, 0x11, 0xf5, 0x41, 0xf4, 0x6d, 0x34, 0xef, 0x97, 0xe7, 0x29, 0xf7, 0x8b, + 0x0a, 0x0a, 0x1a, 0x2b, 0x36, 0xb4, 0xe7, 0x5d, 0x5f, 0x5a, 0x4b, 0xdd, 0xaa, 0x5d, 0xd1, 0x1c, 0xcd, 0x6c, 0xd1, 0x60, 0xbb, 0x85, 0x6c, 0xff, 0xf1, 0x94, 0xfb, 0x85, 0x99, 0x3d, 0xb7, 0x77, + 0x74, 0xa5, 0x55, 0x14, 0xe7, 0xe7, 0x3e, 0xd1, 0xb5, 0x5c, 0x99, 0x58, 0x9e, 0xc9, 0x68, 0x2f, 0x7c, 0xe8, 0x77, 0xa2, 0x67, 0x5c, 0x2e, 0x97, 0x67, 0xc9, 0x6b, 0x40, 0x12, 0x95, 0x18, 0x68, + 0x97, 0xd6, 0x0e, 0x01, 0x8c, 0xc4, 0x9a, 0x6c, 0xfb, 0x13, 0x4f, 0xb6, 0xaa, 0x24, 0xec, 0x0c, 0x8f, 0x65, 0xda, 0x83, 0xc0, 0xd5, 0xd9, 0x81, 0x70, 0x9b, 0x5e, 0x65, 0x8a, 0xbe, 0x90, 0xcc, + 0x7e, 0x5e, 0xc5, 0x1c, 0x1f, 0x9a, 0x30, 0x37, 0xa2, 0x33, 0x22, 0x52, 0xf8, 0x59, 0xbf, 0x54, 0x72, 0x76, 0xe1, 0xf1, 0xc5, 0x8e, 0x3b, 0x5a, 0x88, 0x6b, 0x78, 0x26, 0x2b, 0x1d, 0xbc, 0xee, + 0xdb, 0x09, 0xfb, 0xa2, 0x67, 0x7f, 0x3c, 0x11, 0x26, 0x2f, 0x58, 0xe9, 0xa2, 0x2c, 0x3a, 0x8f, 0x35, 0x3a, 0x17, 0x3c, 0x18, 0x60, 0xa3, 0x8b, 0xb8, 0x42, 0x2e, 0x76, 0xe2, 0x88, 0x2c, 0x45, + 0x78, 0x7f, 0x2a, 0x8f, 0x6d, 0x00, 0xc5, 0xbc, 0x56, 0xec, 0xa8, 0x93, 0xac, 0x2d, 0xa8, 0x6d, 0x53, 0x1e, 0xed, 0x4c, 0x57, 0xa1, 0x56, 0x12, 0x8f, 0xa3, 0x6d, 0x3f, 0x6b, 0x48, 0xa3, 0xe2, + 0xd9, 0x83, 0xd1, 0x28, 0xc4, 0x5a, 0x1f, 0x89, 0x73, 0xcb, 0x5c, 0x02, 0x2e, 0x16, 0xcb, 0x6b, 0x4e, 0x5e, 0x38, 0xb3, 0x9c, 0xe2, 0x2b, 0x66, 0x94, 0x2e, 0x86, 0x08, 0x41, 0x51, 0x61, 0xb9, + 0x6e, 0xf9, 0xe7, 0x87, 0x43, 0xd0, 0xec, 0x15, 0x6e, 0xfc, 0x41, 0xf5, 0x0d, 0x85, 0x8f, 0xeb, 0xf1, 0x99, 0xd6, 0xef, 0x58, 0x80, 0x1c, 0x0b, 0xa0, 0x20, 0x76, 0xcc, 0x8f, 0x8a, 0x9a, 0x33, + 0xd8, 0x72, 0xbf, 0x81, 0x16, 0xbe, 0x62, 0xaf, 0x73, 0x0d, 0x1c, 0xd9, 0xb5, 0x1a, 0x39, 0xfb, 0x4a, 0x52, 0xb6, 0x52, 0x12, 0x02, 0xa1, 0x79, 0x8a, 0x37, 0x38, 0x57, 0xa4, 0xbc, 0x8f, 0x35, + 0x46, 0x27, 0x6e, 0x27, 0xf2, 0xc8, 0x8a, 0x4d, 0x54, 0x06, 0x3a, 0x08, 0x37, 0x93, 0x9d, 0xc2, 0x10, 0xc6, 0x2e, 0x32, 0x34, 0x51, 0x98, 0x7c, 0x93, 0x7a, 0xee, 0x72, 0x41, 0x3c, 0x1e, 0xfb, + 0x4b, 0x9c, 0xfa, 0x8a, 0xf0, 0x39, 0xaf, 0xc2, 0x57, 0x73, 0x48, 0xee, 0xe8, 0x37, 0x04, 0x20, 0x76, 0x8f, 0x24, 0x02, 0x2f, 0x26, 0xc0, 0x91, 0x98, 0xc6, 0x04, 0x95, 0x61, 0xec, 0xc8, 0x86, + 0xeb, 0x5a, 0xe4, 0x39, 0x0b, 0xaf, 0xfa, 0x90, 0x66, 0xcb, 0x1d, 0xd5, 0xec, 0x24, 0x0a, 0xc8, 0xbd, 0x09, 0xb3, 0x5a, 0xab, 0xeb, 0xf0, 0x10, 0x06, 0xcb, 0xaa, 0xe8, 0x82, 0xd3, 0xd2, 0x45, + 0x79, 0xe1, 0xd4, 0x11, 0xda, 0x41, 0x6f, 0x8d, 0xc8, 0x59, 0x60, 0x70, 0x12, 0x07, 0x54, 0xc6, 0x32, 0x03, 0x0a, 0xa9, 0x3c, 0x4a, 0x8f, 0xfb, 0x98, 0x4b, 0x7c, 0xe8, 0x07, 0xff, 0x55, 0x7d, + 0xd4, 0x27, 0xd5, 0x0b, 0x6c, 0x97, 0xeb, 0xa1, 0xba, 0x28, 0x70, 0xa5, 0x4f, 0x47, 0x8a, 0x40, 0x4a, 0x31, 0xeb, 0xf6, 0x7b, 0x82, 0x9b, 0xd9, 0xcd, 0x5c, 0x76, 0x74, 0x1c, 0x44, 0x28, 0xb7, + 0xc1, 0xe6, 0xa0, 0xe4, 0xd5, 0x68, 0xc5, 0x44, 0x93, 0x45, 0x94, 0xd2, 0xb3, 0xcc, 0x43, 0x53, 0x84, 0x58, 0x4a, 0xa6, 0x2f, 0x67, 0xa3, 0x8d, 0x19, 0xed, 0x6c, 0x22, 0x46, 0x16, 0xc8, 0x2e, + 0x65, 0x7c, 0xca, 0x64, 0xa3, 0x62, 0xbd, 0x9f, 0x15, 0x3b, 0xdc, 0x55, 0xbe, 0x29, 0x20, 0xbf, 0xd5, 0xc7, 0xfc, 0x17, 0x77, 0xf8, 0x1b, 0xd2, 0x1f, 0x10, 0x7c, 0x76, 0x0c, 0xd9, 0xe7, 0xdf, + 0x70, 0x30, 0x79, 0x5a, 0x36, 0xbc, 0x0a, 0x2d, 0xa8, 0x93, 0x7b, 0x6a, 0x96, 0x91, 0x5b, 0x79, 0x98, 0x50, 0x31, 0xc7, 0xda, 0x66, 0xb1, 0xad, 0xee, 0x69, 0x74, 0xde, 0x07, 0x32, 0x10, 0x60, + 0xa5, 0x0b, 0x1e, 0xb5, 0x28, 0x35, 0x36, 0x49, 0x6b, 0xca, 0x34, 0xc0, 0xc1, 0x7c, 0x60, 0xaa, 0xfb, 0xed, 0x09, 0x83, 0xa7, 0xac, 0xef, 0x25, 0x6b, 0x4f, 0x77, 0x68, 0x7e, 0x86, 0xa5, 0x69, + 0x2d, 0x2f, 0x77, 0xaf, 0x19, 0x82, 0xdf, 0xdf, 0xfe, 0x9c, 0x9e, 0xe0, 0x0d, 0x9b, 0xcb, 0xf1, 0xf5, 0x87, 0xbc, 0x77, 0x6f, 0x23, 0xce, 0xf3, 0xc4, 0xb3, 0xb2, 0xaf, 0x34, 0x14, 0xcf, 0x16, + 0xe6, 0x0b, 0x4c, 0xe9, 0x9e, 0xfa, 0x3b, 0xc6, 0x37, 0x7d, 0x43, 0x9d, 0x7f, 0xec, 0x9d, 0x2b, 0x6d, 0x63, 0x9a, 0x24, 0x34, 0x76, 0xee, 0x90, 0xb1, 0xc7, 0x40, 0x4d, 0xd6, 0xad, 0xd6, 0x6c, + 0x61, 0x1a, 0x96, 0x35, 0xd5, 0xdb, 0xe6, 0x14, 0x28, 0x27, 0x05, 0x70, 0xe0, 0xc4, 0xc7, 0xa0, 0x59, 0xaa, 0x72, 0x26, 0xa5, 0x4d, 0x35, 0x97, 0x92, 0x93, 0xc2, 0x05, 0x21, 0x6d, 0x3f, 0xa7, + 0x82, 0x74, 0x8b, 0xcb, 0xfe, 0xc1, 0x12, 0x47, 0xa9, 0x6c, 0xe9, 0xa2, 0x5b, 0x02, 0x9b, 0x97, 0x96, 0xe8, 0x13, 0x6d, 0xdf, 0xad, 0x5f, 0xf2, 0x33, 0xfd, 0xd6, 0xdf, 0x1f, 0x6d, 0xaf, 0xe8, + 0x5e, 0xf0, 0xfb, 0x68, 0x9d, 0xb5, 0x5a, 0x03, 0x0e, 0xb5, 0x2b, 0x88, 0x72, 0x78, 0x0f, 0xd7, 0x0c, 0x95, 0x50, 0x4a, 0xce, 0xeb, 0x1b, 0x56, 0x53, 0xb5, 0x6e, 0xbf, 0xab, 0xc2, 0x1c, 0x9e, + 0xa1, 0xb3, 0x49, 0x93, 0xed, 0x78, 0xd8, 0x08, 0x57, 0x9a, 0x2a, 0xc3, 0xf5, 0x91, 0x03, 0xbc, 0x25, 0x82, 0xd9, 0xed, 0xc6, 0x02, 0xba, 0xa8, 0x10, 0x17, 0xa9, 0xb9, 0x08, 0x4a, 0x60, 0x83, + 0xfa, 0xd0, 0x72, 0x8e, 0xa2, 0x6e, 0x0b, 0xa6, 0xf4, 0x49, 0x65, 0x4f, 0xdf, 0x77, 0xf4, 0x6a, 0xec, 0x3c, 0xdb, 0xd3, 0x5f, 0xab, 0x91, 0x70, 0xa6, 0xf8, 0x3e, 0xe4, 0x68, 0x68, 0x15, 0x04, + 0xc3, 0x5f, 0xa9, 0x58, 0x19, 0x17, 0x12, 0x01, 0x36, 0x85, 0x5b, 0xb9, 0xcc, 0x7a, 0xb9, 0x2d, 0xdb, 0x90, 0x58, 0xf9, 0x8e, 0xdf, 0x6f, 0x36, 0x56, 0x67, 0x50, 0x1b, 0xf6, 0x24, 0xed, 0x56, + 0x3d, 0xc8, 0xea, 0xd1, 0xd2, 0xc7, 0xa6, 0x02, 0x4e, 0x13, 0x22, 0xa7, 0xb8, 0x6d, 0x07, 0x97, 0x8b, 0xd1, 0x7a, 0x49, 0x56, 0x3b, 0x64, 0x61, 0xe2, 0xb5, 0x53, 0x4e, 0x6c, 0x68, 0xb6, 0x76, + 0xcc, 0x03, 0xf2, 0xda, 0x6a, 0xfc, 0xaa, 0xa6, 0xfb, 0xdb, 0x1a, 0x3c, 0x57, 0xf6, 0x48, 0x73, 0xb7, 0x79, 0x3a, 0x75, 0xe0, 0x97, 0x82, 0x52, 0x6e, 0x49, 0xbf, 0x43, 0xf9, 0xd5, 0x31, 0x86, + 0x87, 0x85, 0xa6, 0xa0, 0x73, 0xd8, 0x8f, 0xfd, 0x03, 0x54, 0xfa, 0x9e, 0x64, 0xee, 0x8f, 0xa5, 0xb9, 0x5a, 0x7a, 0x65, 0xb1, 0x26, 0x55, 0x46, 0xde, 0xd0, 0x44, 0xa4, 0x04, 0x59, 0x03, 0x8e, + 0x72, 0xdb, 0x5b, 0x15, 0xb4, 0x68, 0xca, 0x5a, 0x9e, 0x33, 0x41, 0x15, 0xf5, 0x6d, 0xdf, 0x82, 0xe6, 0x7e, 0xd5, 0x09, 0xfd, 0x24, 0xda, 0xb2, 0x8c, 0xbb, 0xaa, 0xf5, 0xed, 0x0a, 0xa8, 0x53, + 0xb1, 0x9c, 0x50, 0x30, 0x04, 0xfc, 0xe6, 0xac, 0xf9, 0x54, 0xfb, 0xfe, 0x9f, 0x5f, 0x34, 0xa1, 0xdf, 0xf2, 0xea, 0x3c, 0xdb, 0x2f, 0x5f, 0x10, 0xab, 0x6f, 0x48, 0x5f, 0xf0, 0xbc, 0xea, 0x38, + 0xef, 0x9c, 0x03, 0x44, 0x6c, 0xc0, 0x46, 0x4c, 0xbd, 0x5a, 0x62, 0xe6, 0x74, 0xa7, 0xd7, 0xec, 0xb1, 0x02, 0xc2, 0xd9, 0x16, 0xcf, 0x5a, 0x7f, 0x1d, 0x28, 0xf3, 0x13, 0x67, 0xb8, 0xf5, 0x72, + 0x2b, 0xad, 0xed, 0xc3, 0x09, 0xdd, 0xcf, 0xa1, 0xc8, 0x49, 0x83, 0xbd, 0x8f, 0x6f, 0xc9, 0x5c, 0xe5, 0x02, 0x4f, 0x41, 0xba, 0xd3, 0xb4, 0x36, 0x2c, 0xd1, 0x13, 0xf3, 0xa6, 0x5f, 0xf0, 0xf3, + 0x8d, 0x9d, 0xed, 0x67, 0x88, 0x03, 0x9b, 0xa3, 0x47, 0x3b, 0xa7, 0x77, 0xac, 0x7f, 0xf0, 0x87, 0x7b, 0x2d, 0x0e, 0xfb, 0x8b, 0xec, 0x65, 0xfc, 0xef, 0x8d, 0x21, 0x51, 0xd7, 0xd0, 0xf8, 0xc0, + 0x76, 0xa4, 0x06, 0x79, 0x32, 0x4e, 0x62, 0xaa, 0xcf, 0x58, 0x61, 0xe3, 0x1d, 0x76, 0x0e, 0x1e, 0xf4, 0x23, 0x7e, 0x40, 0x3e, 0xce, 0xa8, 0x1a, 0xfb, 0x4d, 0x92, 0x9c, 0xcb, 0xe7, 0x8e, 0xcf, + 0xf1, 0x4a, 0x45, 0xfe, 0x5c, 0x22, 0x7a, 0x99, 0xe7, 0x3c, 0x7a, 0xc6, 0x65, 0xa8, 0x8f, 0x7e, 0x19, 0xc2, 0x97, 0xa0, 0x71, 0x8e, 0xf1, 0xdc, 0x8e, 0xc6, 0xcd, 0xd8, 0xe0, 0xb7, 0xde, 0xe1, + 0x30, 0x15, 0x46, 0x18, 0x8a, 0xcc, 0x26, 0x98, 0xa9, 0xdd, 0x17, 0xd2, 0x8d, 0xaa, 0x71, 0xe0, 0x65, 0xef, 0x39, 0xe5, 0x3e, 0x8c, 0xf6, 0x3f, 0x29, 0x6e, 0x5e, 0x1a, 0xe3, 0xf7, 0x47, 0x5c, + 0x46, 0xf8, 0xbd, 0xff, 0xa2, 0xc1, 0x19, 0xc0, 0x24, 0xf6, 0x15, 0xbd, 0x3f, 0xcd, 0x92, 0xc9, 0x29, 0xda, 0xd1, 0xd2, 0x48, 0xac, 0x76, 0x6e, 0x4a, 0x74, 0xb4, 0xe8, 0x08, 0x47, 0x6b, 0xb7, + 0x5d, 0x57, 0x05, 0xe7, 0x16, 0xc9, 0x42, 0xd3, 0xd9, 0x59, 0x7b, 0x80, 0x22, 0x33, 0x60, 0xbd, 0xd8, 0x23, 0xc1, 0x35, 0x84, 0x62, 0x07, 0xaf, 0xc1, 0x51, 0xa7, 0x97, 0xac, 0xa3, 0xe7, 0x4e, + 0x0e, 0x80, 0xd6, 0x37, 0x1d, 0x58, 0x75, 0x6b, 0x30, 0x2a, 0xd7, 0xf8, 0x80, 0x18, 0x91, 0xef, 0xc6, 0xca, 0xdf, 0x04, 0xe9, 0x1f, 0x96, 0x04, 0xf2, 0x9a, 0x2a, 0xec, 0x42, 0xf3, 0x1d, 0xc2, + 0xb7, 0xc5, 0x80, 0xfc, 0xae, 0xf6, 0x7a, 0xc3, 0x6c, 0xba, 0x04, 0x6b, 0xae, 0x26, 0xd4, 0x05, 0x9b, 0x0a, 0x07, 0x2a, 0x5b, 0x13, 0x70, 0xb8, 0x44, 0x89, 0x02, 0x3e, 0x38, 0x1c, 0xbd, 0x70, + 0x9b, 0x1c, 0xa9, 0xcd, 0x66, 0xc6, 0xab, 0x00, 0x83, 0x6e, 0xa4, 0x16, 0x08, 0xc2, 0xf0, 0x34, 0x01, 0xf3, 0xe9, 0xb4, 0xf1, 0x2d, 0xff, 0xb8, 0x02, 0xd6, 0x2e, 0x83, 0xcd, 0xd6, 0xeb, 0x0a, + 0xe6, 0xfc, 0x32, 0xc3, 0xa7, 0xea, 0x9a, 0x3b, 0xcd, 0x31, 0x42, 0x7b, 0x92, 0x19, 0xea, 0x17, 0x18, 0x6f, 0xb8, 0xc5, 0x8f, 0x95, 0xa9, 0xa3, 0x6a, 0x1c, 0x65, 0x55, 0x6d, 0x25, 0x89, 0xe7, + 0x8e, 0x2f, 0xde, 0x7e, 0xc9, 0x33, 0xd5, 0x1b, 0xf8, 0x52, 0x5c, 0xc1, 0xc3, 0x27, 0x5c, 0xd0, 0xfd, 0xde, 0x7f, 0x8e, 0x60, 0x1b, 0x70, 0x5c, 0xe9, 0x4c, 0xfc, 0x08, 0xed, 0x2b, 0x8c, 0xb5, + 0xc0, 0xd8, 0x73, 0x44, 0x80, 0x64, 0x78, 0x60, 0x32, 0x27, 0xe2, 0x79, 0xda, 0xec, 0x77, 0xd8, 0x56, 0x6c, 0xa5, 0x18, 0x6d, 0x9a, 0xc9, 0x22, 0x39, 0x01, 0x7c, 0x8c, 0x20, 0xc5, 0x49, 0x69, + 0x12, 0xa9, 0xc8, 0x98, 0x25, 0x82, 0x0a, 0xfc, 0x9e, 0x59, 0xee, 0xe6, 0x05, 0xbb, 0xc9, 0x74, 0x44, 0x0a, 0x8d, 0x89, 0xb2, 0xcd, 0x68, 0x52, 0x80, 0xfb, 0xe9, 0x6b, 0x58, 0xdf, 0x3a, 0x62, + 0x3e, 0xce, 0xfd, 0x79, 0xf1, 0x93, 0xcd, 0xaa, 0xc8, 0xfd, 0xf0, 0x6c, 0x7b, 0xea, 0xd7, 0xf9, 0x99, 0x42, 0xf1, 0x19, 0x1b, 0x7c, 0xe9, 0x0b, 0x5c, 0x4a, 0x27, 0x5e, 0x2e, 0xce, 0x4c, 0x6e, + 0x00, 0xc6, 0x8e, 0x60, 0x2e, 0x24, 0x29, 0xef, 0xd5, 0xd0, 0x82, 0x7c, 0x84, 0x3f, 0xae, 0x17, 0x7d, 0x12, 0x70, 0x86, 0xa8, 0x9e, 0xf6, 0x30, 0x5a, 0x44, 0x8e, 0x6b, 0xaa, 0x47, 0x1c, 0x0e, + 0x6d, 0x07, 0xd8, 0xf9, 0x08, 0x07, 0xd4, 0xa6, 0x20, 0xec, 0x14, 0x32, 0xe6, 0x5b, 0x0d, 0x29, 0xb8, 0x28, 0x97, 0x77, 0x4b, 0x6a, 0xbd, 0x92, 0x33, 0x70, 0xc9, 0x63, 0x5a, 0xe1, 0x61, 0xb1, + 0x8c, 0xc1, 0xd0, 0x69, 0x48, 0xa6, 0xb3, 0x07, 0x29, 0x55, 0x9f, 0x81, 0xf1, 0xd2, 0xf2, 0xbe, 0x21, 0x7e, 0x81, 0xe5, 0xa6, 0x6b, 0xa8, 0x59, 0x13, 0xee, 0xd1, 0x55, 0x2f, 0xb5, 0xa6, 0x6c, + 0xcd, 0xe6, 0xb0, 0x81, 0x1d, 0x49, 0xd4, 0x95, 0xa4, 0x14, 0x59, 0x28, 0xaa, 0xa2, 0x6e, 0xb6, 0x7b, 0x8e, 0x35, 0x0c, 0xb5, 0x46, 0x60, 0x04, 0xf5, 0x78, 0x75, 0x95, 0xb2, 0x39, 0x28, 0x8d, + 0xcc, 0x93, 0x50, 0x69, 0x28, 0xba, 0xc3, 0x93, 0x23, 0x07, 0xcd, 0x6d, 0x62, 0x06, 0xbb, 0x0b, 0x2f, 0x48, 0xc4, 0x75, 0x19, 0x76, 0x85, 0x27, 0x73, 0x02, 0xfa, 0xcd, 0x7f, 0xe3, 0xed, 0xed, + 0x8a, 0xe7, 0x41, 0x04, 0x2f, 0xee, 0x8b, 0x59, 0x91, 0xbe, 0x8f, 0xbc, 0x48, 0x87, 0xba, 0xeb, 0xcc, 0x50, 0x9a, 0x64, 0xfd, 0x70, 0x76, 0xac, 0x29, 0x2a, 0x11, 0x4f, 0xc9, 0x46, 0xdc, 0x85, + 0xfd, 0xbe, 0x3a, 0xc5, 0x4c, 0xc5, 0xaf, 0x4c, 0x08, 0x9f, 0x2b, 0x85, 0xb5, 0xed, 0xa5, 0x13, 0x51, 0x22, 0x86, 0xac, 0x3a, 0xfa, 0x5e, 0x6b, 0x7b, 0x8b, 0xb1, 0x4e, 0xd4, 0x9c, 0x56, 0xe0, + 0x5c, 0x03, 0x26, 0x5c, 0x91, 0xec, 0x43, 0x46, 0xdb, 0xd7, 0x8a, 0xbc, 0x89, 0xa8, 0x2e, 0x02, 0x17, 0x60, 0x34, 0x74, 0x42, 0x34, 0xa9, 0xfd, 0xb4, 0xe4, 0x2a, 0xf6, 0x32, 0x0a, 0x67, 0xaa, + 0xef, 0x40, 0x9c, 0xaf, 0xcf, 0x21, 0xf3, 0x03, 0xb0, 0x40, 0x20, 0x32, 0xf2, 0xe3, 0x00, 0xf5, 0x70, 0xf5, 0x94, 0x28, 0x85, 0x5b, 0xab, 0x85, 0xb7, 0xd6, 0xf9, 0x43, 0xab, 0x10, 0xb4, 0xde, + 0xab, 0x75, 0xcd, 0xb4, 0xb4, 0x4c, 0x61, 0x08, 0x34, 0x2a, 0x32, 0x13, 0x9f, 0x6f, 0x5a, 0x10, 0x04, 0x11, 0x5e, 0x5e, 0x23, 0x13, 0x89, 0x13, 0xa9, 0x84, 0x9b, 0x39, 0xcb, 0x76, 0x53, 0xa0, + 0x1b, 0x73, 0x6b, 0x6a, 0x44, 0x62, 0x2f, 0x77, 0xc6, 0xf1, 0x98, 0xfd, 0x15, 0x16, 0xbf, 0x8b, 0xc4, 0x7f, 0x1f, 0x0e, 0x7b, 0x4f, 0xfc, 0x06, 0x99, 0x2b, 0xb1, 0x78, 0x40, 0xd9, 0x2a, 0x59, + 0x03, 0x13, 0x16, 0xc8, 0x66, 0xd3, 0x82, 0xcf, 0x35, 0xae, 0x99, 0xb5, 0x10, 0x61, 0x8a, 0x53, 0x9e, 0x70, 0xcc, 0x66, 0xa3, 0xe8, 0xab, 0x98, 0x8f, 0xe7, 0x4b, 0xd8, 0x5d, 0x1d, 0x48, 0xa4, + 0x87, 0x97, 0x49, 0xbc, 0xd4, 0x36, 0x1e, 0x83, 0xe2, 0x4a, 0xc3, 0x34, 0x04, 0x47, 0x50, 0xc0, 0x6e, 0xe1, 0x8d, 0xd6, 0x8c, 0x39, 0xf2, 0x67, 0x04, 0x17, 0xaf, 0x69, 0x15, 0x05, 0x37, 0x91, + 0xe7, 0x3e, 0x5a, 0x1c, 0x3f, 0x7b, 0x44, 0xbc, 0x34, 0x2d, 0x2e, 0xae, 0x0f, 0xd1, 0x97, 0x8f, 0xc3, 0x80, 0x09, 0xe1, 0x96, 0x07, 0x6a, 0x39, 0x71, 0x6c, 0xa7, 0x3f, 0x1e, 0xe9, 0x95, 0x9c, + 0x0b, 0x3b, 0x47, 0xd8, 0xd7, 0x6e, 0x01, 0xad, 0x80, 0xe4, 0x54, 0x40, 0xe9, 0x26, 0x03, 0x8f, 0x56, 0x9f, 0xc9, 0x15, 0x3e, 0x4a, 0x1b, 0x22, 0x0c, 0x24, 0xa7, 0xcc, 0xec, 0xaa, 0xc8, 0x8f, + 0xd3, 0xdd, 0xd4, 0x17, 0x3a, 0x90, 0xc9, 0xf8, 0xcc, 0xf6, 0xa9, 0xbe, 0xcd, 0x68, 0x9e, 0xae, 0x0f, 0x14, 0xbd, 0xa2, 0x73, 0x7c, 0x88, 0x3b, 0xce, 0xb7, 0xed, 0xe5, 0x11, 0x14, 0x93, 0x97, + 0xfc, 0x61, 0x6f, 0x49, 0x5f, 0x20, 0xb9, 0xea, 0x38, 0xa7, 0xac, 0x1a, 0xa0, 0xb2, 0x58, 0xb8, 0x48, 0x30, 0x27, 0xec, 0xd1, 0xc9, 0x59, 0xce, 0x53, 0x2e, 0x6f, 0x70, 0x8f, 0xf7, 0x6b, 0xb2, + 0x29, 0x94, 0xa8, 0x9c, 0x26, 0xf2, 0xf1, 0xe0, 0x23, 0x16, 0x05, 0xb4, 0x2e, 0xe8, 0x50, 0xf0, 0xc1, 0x41, 0x98, 0x35, 0x88, 0x09, 0x7b, 0xd2, 0x6b, 0x18, 0xbe, 0xc4, 0xe5, 0x1c, 0x21, 0x73, + 0xde, 0xf2, 0x48, 0x8e, 0x22, 0x40, 0x80, 0x26, 0x09, 0x41, 0xdf, 0xee, 0xd5, 0x4e, 0x6b, 0xc5, 0x41, 0xda, 0xf9, 0xea, 0xc7, 0x84, 0xff, 0xaf, 0x55, 0x88, 0xf9, 0x20, 0x7a, 0x81, 0xe3, 0x92, + 0xac, 0x62, 0x60, 0x3d, 0x98, 0x83, 0xa2, 0xef, 0x16, 0x3d, 0x8c, 0x33, 0x3c, 0x76, 0x1a, 0xb1, 0xdb, 0x1d, 0xda, 0xae, 0xc9, 0xca, 0x3b, 0xba, 0x49, 0xdb, 0xab, 0x90, 0xb8, 0xda, 0x2c, 0x14, + 0xa2, 0xb1, 0xa4, 0xb5, 0x34, 0xcd, 0x41, 0x96, 0xee, 0x70, 0x8d, 0x32, 0xb6, 0x28, 0x00, 0x8f, 0x3c, 0x92, 0xd7, 0x4f, 0x6c, 0x65, 0xf3, 0x38, 0xb9, 0x59, 0xef, 0x60, 0x0b, 0x90, 0xb6, 0xa9, + 0x52, 0x9c, 0x8e, 0x06, 0xcd, 0x18, 0xd8, 0xa0, 0xec, 0x98, 0x3f, 0xe7, 0x86, 0xfe, 0x0b, 0x27, 0xb8, 0xcf, 0x24, 0xce, 0xff, 0xaa, 0x74, 0x52, 0x79, 0xef, 0x9c, 0xa6, 0xf2, 0xea, 0xa1, 0xd2, + 0xc9, 0x08, 0x76, 0x32, 0x95, 0x36, 0x3d, 0x63, 0xda, 0x03, 0xd1, 0x6e, 0x69, 0xaf, 0x43, 0xb1, 0x14, 0xe6, 0x16, 0x07, 0xf0, 0x56, 0x33, 0x8d, 0xa7, 0xde, 0xee, 0x30, 0xdb, 0x43, 0x08, 0x59, + 0xc8, 0xaa, 0x5f, 0x1f, 0xc0, 0x62, 0xbe, 0x6a, 0x60, 0xbe, 0xd3, 0x65, 0xc5, 0x0c, 0x4f, 0xe6, 0x96, 0xe8, 0x8f, 0x93, 0x1c, 0xdd, 0x61, 0xb3, 0xe9, 0xba, 0x47, 0x89, 0xc2, 0x46, 0x65, 0x70, + 0xc9, 0xf9, 0x13, 0x6c, 0x20, 0x03, 0xfe, 0xb1, 0x84, 0xe8, 0x8b, 0xb6, 0xcf, 0xea, 0xab, 0x6e, 0xe8, 0xe7, 0xf5, 0x10, 0xeb, 0xe7, 0x59, 0x10, 0x09, 0xdc, 0xde, 0xe6, 0xb4, 0xe6, 0x50, 0x4b, + 0x93, 0xc4, 0xd8, 0x94, 0x9a, 0x2a, 0x19, 0x39, 0x99, 0x88, 0x61, 0x8a, 0xe5, 0x52, 0x83, 0x68, 0x6e, 0xa1, 0x98, 0x7c, 0x01, 0x01, 0xd4, 0x32, 0x88, 0x19, 0x42, 0xc5, 0x69, 0xd8, 0x84, 0x12, + 0xf0, 0xc4, 0xbb, 0x36, 0x4a, 0x21, 0xfd, 0x66, 0x7e, 0xec, 0xa8, 0x88, 0x6f, 0x71, 0xde, 0x6d, 0x12, 0x4e, 0x16, 0x56, 0xcb, 0x4d, 0x02, 0x4a, 0xe0, 0x23, 0x5e, 0xfb, 0x99, 0xbe, 0xf8, 0x5f, + 0xd5, 0xc2, 0x5c, 0xa8, 0xbe, 0x0f, 0xfc, 0x7c, 0x3d, 0x54, 0xf7, 0x42, 0x02, 0xa4, 0x48, 0x1c, 0xb8, 0x6d, 0xd6, 0xba, 0xce, 0xf1, 0xc0, 0xce, 0xe5, 0xe3, 0x49, 0x08, 0x91, 0x16, 0xd2, 0x34, + 0x5a, 0x20, 0x99, 0x22, 0xa0, 0x2c, 0x70, 0x6b, 0x04, 0x05, 0x47, 0x2d, 0xf8, 0xaa, 0x77, 0x4a, 0xd1, 0xf1, 0xfd, 0x60, 0xda, 0x84, 0x9d, 0x12, 0x88, 0xe4, 0x9a, 0x82, 0xb7, 0xdb, 0x63, 0x7a, + 0x40, 0xa3, 0x2a, 0xaa, 0x7a, 0x1c, 0xab, 0x7b, 0x15, 0x84, 0xea, 0x66, 0x19, 0x0e, 0x50, 0x23, 0xff, 0xdd, 0x8a, 0xb9, 0x2d, 0xa3, 0xf7, 0x8c, 0x13, 0xbd, 0xb4, 0x5b, 0x5f, 0x91, 0xbe, 0xe0, + 0x77, 0xd5, 0x71, 0xe6, 0x4a, 0x03, 0x76, 0x6a, 0x65, 0xb4, 0x94, 0xa9, 0x60, 0x95, 0xc8, 0x13, 0xf1, 0x44, 0xdb, 0xd5, 0x0e, 0x58, 0xe4, 0xb6, 0x3b, 0x73, 0x0e, 0x85, 0x49, 0x34, 0xad, 0xa6, + 0x8c, 0x70, 0xab, 0x92, 0x0f, 0x06, 0xc5, 0xaf, 0x49, 0x1b, 0x3e, 0xf0, 0x7d, 0x0d, 0xe5, 0xfd, 0x34, 0x9d, 0xe6, 0x47, 0x89, 0x3c, 0x0a, 0x81, 0x46, 0x1d, 0xa3, 0x6d, 0x25, 0xe8, 0x9b, 0x08, + 0x39, 0x59, 0x8b, 0x11, 0xd0, 0xb4, 0x6e, 0xc2, 0x24, 0x46, 0x33, 0x00, 0x44, 0xab, 0xb5, 0xa2, 0x8b, 0xea, 0xfb, 0xea, 0xa5, 0xab, 0xc7, 0x2c, 0xea, 0xf7, 0x52, 0x12, 0x57, 0xc5, 0x37, 0xce, + 0x5e, 0x46, 0xf8, 0x1f, 0x70, 0x9c, 0x79, 0xc7, 0xfa, 0x2e, 0x49, 0xdc, 0x67, 0x0e, 0x91, 0x07, 0x65, 0x1f, 0xff, 0x22, 0xba, 0xf7, 0x03, 0xe9, 0x9f, 0x3f, 0xea, 0x8b, 0xe2, 0xc7, 0x17, 0xe5, + 0xab, 0x6f, 0xfa, 0xf1, 0x49, 0x7f, 0x15, 0x46, 0xa0, 0xf1, 0x94, 0xc9, 0x58, 0x72, 0xb1, 0xf7, 0x29, 0xa2, 0x92, 0x27, 0x6e, 0x51, 0x48, 0x62, 0x12, 0xd0, 0x7e, 0x6f, 0x29, 0xc5, 0x10, 0xcf, + 0x8e, 0x6a, 0xdc, 0x79, 0x56, 0xfc, 0xf3, 0x19, 0xf4, 0xa5, 0x63, 0xd7, 0x3b, 0xd9, 0xcb, 0x98, 0xde, 0x1b, 0x43, 0x8f, 0x5a, 0x1b, 0x85, 0x90, 0x91, 0x98, 0x99, 0xe6, 0xfa, 0x1e, 0xd2, 0xba, + 0xb6, 0x9d, 0x61, 0x60, 0xd9, 0x68, 0x31, 0xa9, 0x63, 0x02, 0x94, 0xf6, 0x81, 0xbe, 0x10, 0x10, 0xa0, 0xf4, 0x5a, 0xd8, 0x59, 0xcb, 0xae, 0x35, 0x53, 0xd3, 0x19, 0x53, 0xae, 0x31, 0xd0, 0x14, + 0x9b, 0x1a, 0x29, 0x05, 0x26, 0x30, 0xc0, 0xc5, 0xa6, 0xd4, 0x9a, 0x19, 0x41, 0xda, 0xbb, 0x39, 0x5c, 0xb9, 0xd2, 0xe8, 0x08, 0x3a, 0xe1, 0x90, 0x22, 0x39, 0xef, 0xaf, 0xfa, 0xf3, 0xa6, 0xf7, + 0x32, 0x1c, 0x9f, 0x1b, 0xdf, 0x7b, 0x63, 0x28, 0x1c, 0x45, 0x84, 0xb4, 0xa1, 0x1d, 0xea, 0xcc, 0x72, 0x7d, 0xcc, 0x43, 0xad, 0xc3, 0xc4, 0x70, 0x59, 0x35, 0x9e, 0x8a, 0xb4, 0xf2, 0x72, 0x91, + 0xef, 0x42, 0x11, 0x1b, 0xc9, 0xcb, 0x0d, 0xb8, 0xe7, 0xd8, 0x76, 0x36, 0xc2, 0xc5, 0xad, 0x41, 0x4a, 0xea, 0xa1, 0x9e, 0x53, 0x59, 0x50, 0x1e, 0x85, 0x14, 0x0e, 0x10, 0x34, 0xcc, 0x19, 0x70, + 0x14, 0xe0, 0x8d, 0x69, 0x12, 0x3d, 0x5f, 0xb6, 0xfa, 0x92, 0x7a, 0x96, 0xc0, 0xe7, 0x1e, 0x8e, 0xb3, 0x8f, 0xfa, 0x45, 0xe9, 0xf1, 0x83, 0x9e, 0xe8, 0xa5, 0x89, 0x7f, 0x45, 0xfa, 0x02, 0xcb, + 0x55, 0xc7, 0x59, 0x33, 0x34, 0x40, 0x0e, 0xd7, 0xf7, 0x8a, 0x67, 0x03, 0x09, 0x93, 0xc6, 0xf9, 0xc9, 0xc5, 0xcb, 0x93, 0xa8, 0xb3, 0x5c, 0x2b, 0x90, 0x19, 0x42, 0x41, 0x71, 0xce, 0x1f, 0x8c, + 0x51, 0x7b, 0x38, 0xed, 0xf7, 0x9a, 0xef, 0x4c, 0x8e, 0x27, 0xae, 0x16, 0x11, 0xd7, 0x10, 0x8e, 0x3c, 0x82, 0x54, 0x66, 0x99, 0x1d, 0x24, 0xa5, 0x57, 0xdc, 0x6a, 0x72, 0x3c, 0x09, 0xa5, 0xa6, + 0xae, 0x55, 0x72, 0xb6, 0xd6, 0x49, 0x3d, 0x58, 0x67, 0xc1, 0x30, 0x68, 0xfe, 0xff, 0x60, 0x06, 0xf7, 0xf5, 0x25, 0x06, 0x31, 0x80, 0x66, 0xba, 0x71, 0x95, 0x45, 0x50, 0x35, 0xa1, 0xc5, 0x13, + 0xf9, 0x66, 0xa5, 0xa3, 0x3a, 0x27, 0x06, 0x8e, 0xa2, 0x1e, 0xe9, 0xdf, 0xc7, 0xf1, 0x95, 0xb6, 0xfc, 0xb1, 0xc2, 0xe1, 0x15, 0xe3, 0xfc, 0x3b, 0x4d, 0x60, 0xfc, 0x71, 0x35, 0xd4, 0xbb, 0xb9, + 0x2b, 0x8e, 0x66, 0x35, 0xdb, 0xe4, 0x47, 0xd3, 0x5a, 0xd1, 0xca, 0x6a, 0xc9, 0x9a, 0xea, 0x89, 0xa2, 0x2d, 0xa3, 0x48, 0xc0, 0x05, 0xa7, 0xcc, 0x47, 0x0b, 0x62, 0x66, 0xad, 0xa2, 0x93, 0x97, + 0x72, 0x21, 0xdf, 0xc5, 0x47, 0x29, 0x40, 0x27, 0x21, 0xa2, 0x42, 0xdc, 0x2a, 0xd0, 0x96, 0x4c, 0xa1, 0x1e, 0x44, 0x6a, 0x23, 0x3b, 0x69, 0x6a, 0xac, 0x9b, 0xa0, 0x94, 0xf7, 0xab, 0x84, 0xa8, + 0xb7, 0xad, 0x3c, 0x40, 0x0f, 0x6d, 0x95, 0xc1, 0x6d, 0x06, 0xcd, 0x27, 0xfb, 0xc0, 0x39, 0xd7, 0xa6, 0xdd, 0xf8, 0xfe, 0x53, 0xdd, 0xc4, 0xe4, 0xa5, 0x0f, 0x7f, 0x45, 0xf7, 0x0c, 0xda, 0x67, + 0xeb, 0x7c, 0xe6, 0xfa, 0x75, 0x02, 0x6c, 0x8f, 0xf8, 0xd4, 0x6b, 0x8f, 0x10, 0x94, 0x79, 0x33, 0x74, 0xdd, 0xe3, 0x54, 0xec, 0x87, 0x23, 0x4b, 0x34, 0x0f, 0xab, 0x60, 0xc8, 0x04, 0xc8, 0xb3, + 0x71, 0xe5, 0x84, 0x5e, 0x6a, 0x8d, 0xeb, 0xd2, 0x7a, 0x1b, 0xcb, 0xf3, 0x6a, 0x03, 0xaf, 0x24, 0xbc, 0x7d, 0xf4, 0x80, 0x8f, 0x51, 0xde, 0x75, 0x8f, 0xcf, 0x4f, 0xf8, 0x7d, 0x9e, 0x1c, 0x6d, + 0x9b, 0x64, 0xa6, 0x2e, 0x69, 0x68, 0x53, 0x15, 0x5f, 0x3b, 0x74, 0x18, 0x36, 0x21, 0xc6, 0xac, 0x70, 0x9c, 0xd9, 0x35, 0xdb, 0xc9, 0xa1, 0x62, 0x27, 0x06, 0xd8, 0x0b, 0xe6, 0x82, 0xf3, 0x4d, + 0x9a, 0x71, 0x8a, 0x6d, 0xc4, 0x68, 0xc0, 0xea, 0xd8, 0xc7, 0x28, 0x3c, 0x23, 0xca, 0xca, 0xb2, 0x81, 0x94, 0x8f, 0x18, 0xa9, 0x8e, 0x66, 0x1d, 0x2f, 0x8e, 0x70, 0x64, 0x2a, 0x8b, 0xde, 0x44, + 0xff, 0xe6, 0xf4, 0x14, 0x7b, 0xa7, 0xf6, 0xe9, 0x67, 0x7e, 0x65, 0x5d, 0xbc, 0x11, 0x04, 0xc6, 0xe7, 0x3f, 0xe7, 0xcc, 0xee, 0x03, 0x56, 0xc4, 0xec, 0x14, 0xaf, 0x00, 0x04, 0x55, 0x36, 0xc0, + 0x8c, 0x13, 0x79, 0xa0, 0x8a, 0x9c, 0xb0, 0x97, 0x30, 0xa1, 0xdd, 0x9d, 0x96, 0x94, 0xc1, 0x2d, 0x55, 0x8b, 0x4a, 0x38, 0x7e, 0x49, 0xce, 0x93, 0x00, 0xd6, 0x38, 0x9c, 0x93, 0x4f, 0xc8, 0xde, + 0x06, 0x5d, 0xbc, 0x5a, 0x38, 0x23, 0x50, 0xad, 0x41, 0xc3, 0xc8, 0xd4, 0xf0, 0x80, 0xef, 0x60, 0xd9, 0x0c, 0xc8, 0x00, 0x43, 0x64, 0xf1, 0x18, 0x38, 0xfa, 0x6b, 0xe6, 0xdb, 0xdb, 0xc9, 0xff, + 0x9f, 0x1f, 0x42, 0x97, 0x13, 0xab, 0xf6, 0xaa, 0x7a, 0xfc, 0x85, 0xd7, 0x23, 0x08, 0xa7, 0x2f, 0x41, 0x78, 0x4b, 0x1a, 0x18, 0xdf, 0x75, 0x9c, 0x13, 0x40, 0x0c, 0x80, 0xb5, 0xf3, 0xd4, 0x51, + 0x09, 0xc6, 0x6a, 0x2c, 0x4b, 0x2e, 0xe9, 0x1a, 0xe4, 0xa6, 0x8e, 0xf9, 0x6e, 0xbb, 0x93, 0x54, 0x9e, 0xae, 0x3a, 0xae, 0x5c, 0x10, 0x71, 0x8a, 0x38, 0xb1, 0x24, 0xf0, 0x7a, 0x18, 0x1e, 0x42, + 0x96, 0x67, 0x21, 0x4d, 0x85, 0x43, 0x7e, 0x3f, 0x82, 0xa2, 0x28, 0x60, 0xc3, 0x40, 0x31, 0xd3, 0x69, 0xa0, 0xa6, 0xa5, 0xbc, 0x23, 0x36, 0xf9, 0x52, 0x0b, 0x2c, 0xd5, 0x80, 0x8e, 0xaf, 0xc1, + 0x5a, 0x58, 0x4e, 0x6c, 0x05, 0x97, 0x3c, 0xbe, 0x67, 0xfe, 0x83, 0x3e, 0x4f, 0xa7, 0xf8, 0x20, 0xdb, 0xf0, 0x63, 0xae, 0x8d, 0xbd, 0x02, 0xed, 0x1d, 0xf1, 0x37, 0x70, 0xef, 0xba, 0xc6, 0x67, + 0xca, 0xbf, 0xc3, 0xbb, 0x56, 0x2d, 0xdc, 0x30, 0x8b, 0x09, 0x07, 0xcf, 0xb5, 0xe2, 0xa0, 0x65, 0x5d, 0xc7, 0x59, 0xfb, 0x9c, 0x65, 0x9c, 0x8a, 0x13, 0x88, 0xac, 0xef, 0x56, 0x1b, 0x49, 0x29, + 0x63, 0xac, 0xc9, 0xfa, 0x48, 0xec, 0x72, 0x94, 0xdc, 0x0b, 0xc6, 0xfe, 0x24, 0x80, 0x8b, 0x59, 0xe7, 0xc7, 0xc7, 0x45, 0x2b, 0x8e, 0x32, 0xa2, 0x22, 0x97, 0xde, 0xc4, 0xe3, 0xc5, 0xcc, 0x73, + 0xf5, 0x80, 0x65, 0x03, 0x77, 0x3e, 0x20, 0x2e, 0xe1, 0x23, 0x95, 0xfc, 0xb7, 0xaa, 0x1e, 0x4e, 0x9e, 0xc7, 0xd1, 0x47, 0xb6, 0xca, 0xbb, 0x90, 0x85, 0x41, 0x69, 0xa2, 0xdf, 0xa4, 0xb5, 0x0b, + 0x91, 0xf7, 0xc0, 0x94, 0xf7, 0xad, 0x02, 0xb9, 0xda, 0x2a, 0xae, 0xbe, 0xfd, 0xb3, 0xf0, 0x86, 0xcb, 0x0b, 0x7e, 0x75, 0xdc, 0x7e, 0x37, 0xfc, 0x0f, 0x7e, 0x73, 0x7e, 0x19, 0xfe, 0xed, 0xac, + 0xfd, 0x1b, 0x63, 0xb1, 0xf6, 0xed, 0xf8, 0x4c, 0xe3, 0xe6, 0x0b, 0xfd, 0xf3, 0x94, 0x8b, 0xce, 0xf4, 0x66, 0x37, 0x92, 0x81, 0xbd, 0xb3, 0xd8, 0x43, 0x14, 0x93, 0x03, 0x3e, 0x59, 0xcc, 0x66, + 0x5e, 0x15, 0x2c, 0xa9, 0x6d, 0xc4, 0xd0, 0x9b, 0x92, 0x3b, 0x5a, 0x24, 0xbd, 0x69, 0xc8, 0x63, 0x91, 0xf3, 0x64, 0x3a, 0xaf, 0x01, 0x52, 0x20, 0x97, 0x3a, 0xd5, 0xcd, 0xb1, 0x38, 0xf1, 0xe8, + 0x82, 0xee, 0x57, 0x7b, 0x2a, 0x6b, 0xc3, 0xc9, 0x69, 0x99, 0x0b, 0xcd, 0xba, 0x01, 0xa9, 0x3a, 0x49, 0xbe, 0x55, 0xa4, 0x7a, 0xf8, 0xa5, 0xfe, 0xf9, 0xe7, 0x87, 0x74, 0xa4, 0xd0, 0x0d, 0x81, + 0xe7, 0x5b, 0xd4, 0xf7, 0x0c, 0x0b, 0xd7, 0x0f, 0x1c, 0xfb, 0x65, 0x9e, 0x5e, 0xd7, 0x19, 0x83, 0xef, 0x8e, 0x91, 0xe7, 0x9b, 0x9b, 0x32, 0xfa, 0x88, 0x14, 0xbb, 0xd4, 0x17, 0xb8, 0xfa, 0xf9, + 0x7f, 0x7f, 0x5e, 0xff, 0xef, 0xab, 0x99, 0xf0, 0xcb, 0x7e, 0xf9, 0xcf, 0x3f, 0x3f, 0x49, 0x82, 0xff, 0xfc, 0xc5, 0x37, 0xfd, 0x9b, 0x7d, 0xf3, 0xbb, 0x9c, 0xf8, 0xcf, 0xb3, 0xaf, 0xbe, 0xe1, + 0x71, 0x40, 0x9c, 0x65, 0x93, 0xdd, 0x7e, 0x17, 0xb2, 0x66, 0x06, 0x25, 0xeb, 0x30, 0x5e, 0x58, 0x73, 0x52, 0x15, 0x34, 0x59, 0xda, 0xed, 0xb7, 0xa1, 0x8e, 0x10, 0x73, 0x40, 0xce, 0x84, 0x16, + 0x3f, 0xb6, 0xc1, 0xa1, 0x3e, 0x14, 0xf3, 0xdd, 0x8c, 0x15, 0x90, 0x54, 0x96, 0x8e, 0xca, 0x11, 0x92, 0x93, 0x1c, 0xa9, 0x0f, 0xbd, 0x77, 0xb0, 0xc1, 0x4a, 0x48, 0xca, 0xc6, 0x12, 0x4e, 0x13, + 0xb7, 0x09, 0x7e, 0x8f, 0x68, 0x49, 0xf2, 0xbc, 0xb0, 0xbd, 0xec, 0x69, 0x46, 0xcf, 0xd7, 0x02, 0x48, 0x3f, 0xa9, 0xbe, 0x71, 0xab, 0x8f, 0xeb, 0x21, 0x21, 0xa3, 0xd0, 0xd8, 0x0d, 0x96, 0x13, + 0x11, 0x72, 0x56, 0x3e, 0x23, 0x82, 0xab, 0x03, 0xe1, 0xb5, 0x93, 0xc0, 0xaa, 0x47, 0xc5, 0x6a, 0x01, 0xe0, 0xbf, 0x32, 0x9a, 0x8f, 0xfa, 0x54, 0x3f, 0xe6, 0xec, 0xf9, 0x96, 0x80, 0xe4, 0xd9, + 0x49, 0xe1, 0xef, 0x65, 0xaa, 0x5b, 0xd2, 0xe7, 0xb1, 0x5f, 0x77, 0x0c, 0x09, 0xdd, 0x79, 0x9b, 0x0b, 0x4b, 0x78, 0xbd, 0x47, 0xa1, 0x7a, 0x47, 0x65, 0xfa, 0x62, 0x21, 0x44, 0xb8, 0x6e, 0xba, + 0xd5, 0x48, 0xc9, 0xa5, 0x7d, 0x2d, 0x91, 0x13, 0x37, 0xc8, 0x63, 0xce, 0xa5, 0x96, 0x70, 0xaa, 0xa6, 0x50, 0x7d, 0x44, 0xd2, 0x29, 0xb8, 0xd1, 0x18, 0x42, 0x30, 0x15, 0xa2, 0x93, 0x24, 0xe6, + 0x74, 0x02, 0x75, 0x08, 0x9e, 0x83, 0x2b, 0x75, 0x89, 0x44, 0x8e, 0x6f, 0x4a, 0xcc, 0xe8, 0x28, 0x9e, 0x42, 0xfc, 0x99, 0x74, 0x71, 0x0b, 0x4d, 0xd9, 0x5c, 0x22, 0x20, 0x9f, 0xa0, 0x82, 0xbe, + 0x24, 0x46, 0x7f, 0x52, 0x7d, 0x03, 0xe4, 0xe3, 0x7a, 0x8c, 0xfe, 0x2e, 0x42, 0x9f, 0x3d, 0x2d, 0x73, 0xd4, 0x5d, 0x81, 0x08, 0x99, 0x2a, 0xfb, 0xa6, 0xcf, 0xba, 0x95, 0xa2, 0x4c, 0x0a, 0xcd, + 0xdb, 0xa6, 0x2e, 0xc0, 0x80, 0xbe, 0xaf, 0x26, 0xf1, 0x6e, 0x17, 0x74, 0x66, 0x34, 0xf2, 0x0e, 0x90, 0x46, 0xa6, 0x07, 0xa9, 0x23, 0xc3, 0x91, 0xb7, 0xae, 0x0c, 0xc1, 0x20, 0x3b, 0x63, 0x36, + 0x83, 0x22, 0x78, 0x61, 0x85, 0x48, 0x08, 0x11, 0x34, 0x4f, 0x1e, 0x91, 0x83, 0x1a, 0x2e, 0xed, 0x2a, 0x1a, 0x70, 0xf6, 0x38, 0x59, 0x49, 0x12, 0x7d, 0x16, 0x0e, 0x78, 0x2a, 0x53, 0xa5, 0x56, + 0xec, 0x8d, 0xdd, 0xe8, 0xf9, 0xb9, 0xe3, 0x15, 0x69, 0xea, 0x83, 0x28, 0x30, 0xfe, 0xbc, 0x1c, 0x2a, 0x98, 0x06, 0x93, 0x85, 0x27, 0xc2, 0xe0, 0x7a, 0xd3, 0x85, 0xf3, 0xb5, 0x0d, 0xa0, 0x64, + 0x8f, 0x52, 0x2e, 0xb2, 0x80, 0xb3, 0xa0, 0xf7, 0xc0, 0x7d, 0x8f, 0xd5, 0x76, 0x5f, 0x52, 0x70, 0x37, 0xd7, 0x47, 0xf9, 0x6c, 0xe1, 0x6d, 0x18, 0x0f, 0x29, 0xd7, 0xa3, 0x13, 0x07, 0xa7, 0x2e, + 0xb8, 0x02, 0xfc, 0x48, 0xf1, 0xa1, 0xca, 0x82, 0xe6, 0x54, 0xb8, 0x3b, 0x44, 0xd3, 0x51, 0xae, 0x77, 0x02, 0x0f, 0x78, 0xcb, 0xd7, 0x7c, 0x35, 0xaf, 0x2a, 0x1c, 0xa0, 0x37, 0x00, 0x0e, 0xd8, + 0x90, 0x3f, 0xff, 0xf7, 0x19, 0xff, 0x46, 0xef, 0x82, 0x82, 0x86, 0x83, 0x7b, 0x21, 0x0d, 0x8c, 0xdf, 0x2f, 0xc6, 0xe8, 0x37, 0x8d, 0xc6, 0x3f, 0xcf, 0xc0, 0xb5, 0x27, 0x33, 0x95, 0xb0, 0x54, + 0xc5, 0xd7, 0xd1, 0x13, 0x51, 0x5a, 0x85, 0x86, 0xcf, 0x8a, 0xa9, 0xcf, 0x79, 0x31, 0x0d, 0xa7, 0xc0, 0xa6, 0xcb, 0xa8, 0xdc, 0x11, 0xf4, 0xb2, 0x91, 0x16, 0x0a, 0x04, 0xb4, 0x1e, 0x1f, 0xb8, + 0x7d, 0x23, 0x3a, 0x99, 0xc0, 0x4f, 0x10, 0x1e, 0x25, 0xbb, 0xe3, 0x16, 0xdf, 0x33, 0x40, 0x72, 0xa4, 0xad, 0x69, 0x49, 0xe4, 0x94, 0xa7, 0x75, 0xcd, 0x94, 0x61, 0xd4, 0xd7, 0x6b, 0x45, 0xa6, + 0x56, 0xf6, 0x26, 0xa1, 0xfe, 0xe8, 0xc4, 0xff, 0xca, 0x7a, 0xbd, 0xa2, 0x7b, 0x9e, 0x81, 0x9f, 0xad, 0x21, 0x56, 0x58, 0x68, 0x3c, 0xe3, 0x47, 0xb4, 0x8e, 0xc5, 0x29, 0xd6, 0x20, 0x87, 0x00, + 0x5b, 0xf4, 0x1a, 0x21, 0x69, 0x2d, 0x63, 0x97, 0x89, 0xe9, 0xdc, 0x9d, 0xe4, 0x52, 0xaf, 0x0e, 0x73, 0xf7, 0xa7, 0xc8, 0x95, 0xbf, 0x37, 0x64, 0xbd, 0xd3, 0x7c, 0x7b, 0xf1, 0xcb, 0xd5, 0x90, + 0x2a, 0xb2, 0xd0, 0x58, 0x57, 0xd2, 0x18, 0xca, 0x4c, 0x8d, 0x06, 0x31, 0xe7, 0xa8, 0x98, 0xa9, 0x9e, 0x6f, 0x6c, 0x0a, 0xd1, 0x2c, 0x40, 0x40, 0x7e, 0x67, 0x9b, 0xe9, 0xf3, 0x4a, 0x80, 0xd0, + 0x4b, 0x09, 0xcc, 0xd2, 0x4b, 0xf9, 0xbf, 0x73, 0xa2, 0x65, 0x68, 0x58, 0x0a, 0xb3, 0x23, 0xa8, 0x67, 0x78, 0x55, 0xb0, 0xa3, 0xae, 0x59, 0x41, 0x02, 0xaa, 0x60, 0x41, 0x66, 0x5b, 0x52, 0x80, + 0x8b, 0xc7, 0x10, 0xd9, 0x6c, 0x18, 0x1b, 0xe3, 0x14, 0x76, 0x93, 0xd2, 0x5b, 0x2e, 0x12, 0x69, 0x44, 0xe6, 0x84, 0x22, 0x69, 0xa3, 0x7d, 0x36, 0xda, 0xc4, 0xa9, 0x91, 0xa6, 0x72, 0x20, 0xa2, + 0x78, 0xea, 0x60, 0xe0, 0x1e, 0xa6, 0x6d, 0x4f, 0x5d, 0xc8, 0x55, 0x59, 0x75, 0x96, 0xe4, 0x0d, 0xb1, 0xc4, 0x9d, 0x5f, 0xd2, 0x7d, 0xe6, 0xfd, 0x07, 0xfd, 0x41, 0x5e, 0x39, 0xf4, 0xbc, 0x13, + 0xfd, 0xc0, 0xc0, 0xb5, 0xc7, 0x17, 0x42, 0xbf, 0xe3, 0x20, 0x11, 0xe9, 0x1c, 0x58, 0xc2, 0xa7, 0x11, 0xeb, 0x7b, 0x0a, 0x92, 0xc7, 0xb5, 0x57, 0x4f, 0x0e, 0xb2, 0x39, 0x12, 0xa7, 0xb1, 0x18, + 0x92, 0x9c, 0xbc, 0x3b, 0xee, 0x32, 0x89, 0x6e, 0x5c, 0xe3, 0xa0, 0x59, 0x74, 0x94, 0xcf, 0x35, 0x08, 0x58, 0x1f, 0xe0, 0xa6, 0x9a, 0x50, 0x40, 0x0d, 0xad, 0xfc, 0x1c, 0x09, 0xe9, 0x99, 0x4c, + 0x4b, 0x62, 0x69, 0x13, 0x18, 0x37, 0xad, 0x04, 0xa7, 0x5f, 0xe9, 0xec, 0x37, 0x2b, 0xdc, 0x4d, 0x0a, 0xec, 0xc7, 0x2b, 0x0f, 0xfa, 0x33, 0x79, 0x71, 0xdc, 0x67, 0xba, 0x1f, 0x43, 0x3f, 0x37, + 0xc6, 0x17, 0x72, 0xbf, 0x8f, 0xde, 0x29, 0xd3, 0xfd, 0x1c, 0xb1, 0xd7, 0xb5, 0x8c, 0xa7, 0xb3, 0xc3, 0xba, 0x60, 0xda, 0xe0, 0xa8, 0x90, 0xa1, 0x3a, 0xda, 0xe5, 0x4a, 0x62, 0x46, 0xf8, 0x0a, + 0xc9, 0x00, 0x8b, 0x75, 0xb3, 0x49, 0x3f, 0x83, 0x3d, 0x40, 0x43, 0x30, 0x13, 0xd4, 0x81, 0x53, 0x32, 0xda, 0x86, 0xb3, 0x2d, 0x88, 0xa0, 0xcb, 0x60, 0xa1, 0xcf, 0xd3, 0x7c, 0x23, 0x03, 0x7e, + 0xea, 0xda, 0xa6, 0xe1, 0x28, 0x0a, 0xab, 0x79, 0x03, 0xac, 0x48, 0x5f, 0x93, 0xe0, 0xe3, 0x8b, 0x3f, 0xe6, 0x58, 0xf7, 0x79, 0xdd, 0xfe, 0x3d, 0xd1, 0xeb, 0x96, 0xf4, 0x05, 0xbd, 0xab, 0x8e, + 0xa1, 0xa2, 0xd7, 0x7e, 0x4a, 0x3b, 0x75, 0x16, 0x33, 0x98, 0x95, 0xfa, 0x3a, 0x70, 0x98, 0x32, 0x41, 0x9a, 0x5b, 0x09, 0x14, 0xc0, 0x12, 0xb3, 0x58, 0xc9, 0xa5, 0x25, 0xd4, 0xe9, 0x11, 0x5c, + 0x15, 0xec, 0x21, 0x3e, 0x86, 0x44, 0xc8, 0x02, 0xc9, 0x4a, 0x49, 0xa0, 0x8c, 0x2f, 0x24, 0x64, 0x1a, 0xea, 0x56, 0xd9, 0x6d, 0x68, 0x55, 0xc8, 0xb7, 0x74, 0x94, 0x66, 0xae, 0x89, 0x48, 0x1c, + 0x28, 0x33, 0xc7, 0xe6, 0x38, 0xc4, 0x4b, 0xe2, 0x3a, 0xfb, 0xe7, 0x33, 0x0d, 0xe6, 0xdf, 0xdb, 0x75, 0x3f, 0xa9, 0x9e, 0x01, 0x79, 0xbf, 0x3e, 0x6b, 0x2f, 0x07, 0xd8, 0x75, 0x4f, 0x2b, 0x46, + 0x97, 0xe8, 0xf0, 0x74, 0x10, 0xd7, 0x9a, 0x1a, 0xd4, 0x33, 0x02, 0x9f, 0x88, 0xbb, 0x06, 0xdd, 0x4e, 0xca, 0x23, 0xc2, 0xb7, 0x2d, 0xd3, 0x2a, 0x5a, 0xab, 0xe6, 0x79, 0x50, 0x74, 0xf9, 0x92, + 0x12, 0x34, 0x69, 0x74, 0xa2, 0x4a, 0x19, 0x64, 0xe4, 0xbc, 0x1e, 0x9d, 0x04, 0xd2, 0x25, 0x05, 0xac, 0x41, 0xc2, 0xdd, 0xa4, 0xd8, 0xfa, 0x35, 0x1a, 0x6f, 0x09, 0xc2, 0x39, 0x84, 0xa0, 0xf6, + 0x9a, 0x36, 0xc6, 0x2e, 0x2d, 0xc7, 0x1b, 0x7b, 0xc7, 0xc2, 0xca, 0x3e, 0x00, 0x39, 0x27, 0x31, 0x78, 0x92, 0x50, 0xf2, 0x3c, 0xd4, 0xe8, 0xa9, 0x22, 0xe6, 0x6d, 0x3f, 0xf8, 0x7b, 0x43, 0xef, + 0x07, 0xd1, 0x0f, 0x28, 0xa3, 0xaa, 0x3e, 0x9f, 0x68, 0x06, 0x18, 0x77, 0x17, 0xfc, 0x2c, 0xdb, 0x68, 0x46, 0x29, 0x13, 0x73, 0x7a, 0x6d, 0x4a, 0xea, 0xe4, 0xe8, 0x99, 0x12, 0xe6, 0xa7, 0xbc, + 0x40, 0x04, 0x68, 0xb6, 0xdd, 0xa4, 0x2b, 0x4e, 0x75, 0x82, 0x6a, 0xe5, 0x59, 0xeb, 0xaa, 0x16, 0x01, 0x4d, 0xa0, 0xf4, 0x62, 0x59, 0x95, 0x53, 0x21, 0xdc, 0x85, 0xe1, 0x2e, 0x40, 0xfd, 0xd1, + 0xa1, 0x5e, 0xe1, 0x4d, 0x64, 0x8e, 0x44, 0xed, 0x18, 0x53, 0x5b, 0x27, 0x60, 0x77, 0xeb, 0xef, 0x4c, 0xe9, 0x27, 0x66, 0xf4, 0xc2, 0x4e, 0x7a, 0xe6, 0x41, 0x17, 0xde, 0x33, 0xc0, 0x15, 0xa4, + 0x5a, 0xc6, 0xe2, 0x71, 0xa4, 0xef, 0xf9, 0x3a, 0x9d, 0xa3, 0xfc, 0x0e, 0xc6, 0xf2, 0x39, 0xb2, 0x20, 0x16, 0xf4, 0x7a, 0x41, 0x9a, 0x26, 0xa2, 0x20, 0xbb, 0x83, 0xb7, 0x14, 0x76, 0x64, 0x8b, + 0xe2, 0xb5, 0x3a, 0xda, 0xdb, 0x93, 0x36, 0x06, 0xe4, 0x93, 0xc5, 0x6d, 0x45, 0x50, 0x54, 0xb9, 0xd3, 0xb6, 0x4e, 0xd7, 0x0a, 0x0f, 0xda, 0x23, 0xcb, 0xd5, 0x54, 0xba, 0xb5, 0x2b, 0x48, 0xa4, + 0x2d, 0x06, 0xfe, 0x36, 0xc6, 0xfb, 0x8a, 0xad, 0x8f, 0x3f, 0xef, 0xe4, 0x85, 0xcf, 0x7b, 0x43, 0x19, 0x18, 0xdf, 0xb6, 0xcf, 0x21, 0xd0, 0x03, 0x3e, 0xb4, 0xcd, 0xae, 0xd8, 0x24, 0x1e, 0x85, + 0xf3, 0x11, 0x06, 0xcc, 0xd5, 0xac, 0x99, 0x54, 0x12, 0x5f, 0x2f, 0xd0, 0x19, 0x16, 0x75, 0x33, 0x15, 0x58, 0xc5, 0x15, 0x15, 0x72, 0xbc, 0x37, 0x6b, 0xe8, 0xcd, 0x12, 0x14, 0xc2, 0x9e, 0x5d, + 0x62, 0xe1, 0x9a, 0x47, 0x7d, 0xdb, 0x39, 0x35, 0x10, 0x6e, 0x0b, 0x8d, 0xb5, 0x4f, 0x8c, 0x6d, 0xa6, 0x24, 0x7b, 0x90, 0x0d, 0xa9, 0x1c, 0x3e, 0x60, 0x31, 0xe8, 0xd9, 0xdf, 0x34, 0xe0, 0x6f, + 0xaf, 0x96, 0x3e, 0xd5, 0xe0, 0xc2, 0x37, 0xb5, 0xca, 0xfe, 0x66, 0xf8, 0xe9, 0x59, 0x75, 0xfb, 0x7e, 0x75, 0x16, 0xf6, 0x06, 0x44, 0x7d, 0xef, 0x98, 0x9e, 0x43, 0x67, 0xf3, 0x2e, 0xc8, 0x3c, + 0x67, 0xa6, 0xf5, 0x4c, 0x09, 0xc5, 0x0e, 0x4e, 0xe7, 0xa9, 0x14, 0x22, 0xd5, 0x5e, 0x95, 0xf0, 0x5c, 0xf6, 0x71, 0xb5, 0x5a, 0x96, 0x4a, 0xca, 0x50, 0xc7, 0x19, 0xa0, 0xa5, 0xd1, 0x72, 0x39, + 0xa3, 0x81, 0x94, 0x9f, 0x10, 0x8d, 0xea, 0x6f, 0xbc, 0x45, 0xe7, 0x6e, 0x88, 0xb6, 0x3c, 0x48, 0x07, 0x40, 0x66, 0xd6, 0xe0, 0x91, 0xf5, 0x4e, 0x0b, 0xe1, 0x35, 0x2e, 0xe1, 0x84, 0x79, 0x1c, + 0xb9, 0xd6, 0xe5, 0xcc, 0x31, 0xb9, 0xaf, 0x4b, 0xe9, 0x7a, 0x76, 0x13, 0x7c, 0xfe, 0x74, 0x53, 0xd1, 0xe2, 0x51, 0x5a, 0x8f, 0x87, 0x69, 0x49, 0x7f, 0xcc, 0xd0, 0x5c, 0x54, 0x75, 0xe9, 0x79, + 0x7f, 0x4a, 0x2f, 0x3d, 0x5d, 0x31, 0xa8, 0xab, 0x1b, 0xae, 0x4e, 0x44, 0xd3, 0x3f, 0xd8, 0x2d, 0xed, 0xaa, 0x29, 0x8a, 0xbc, 0xac, 0xab, 0xb1, 0x93, 0x27, 0xf9, 0xc7, 0x3d, 0xd3, 0x5b, 0x6d, + 0x67, 0x9d, 0x37, 0x9f, 0xcf, 0xbe, 0xd3, 0xa4, 0x36, 0x99, 0xeb, 0xf9, 0x95, 0xe5, 0x7f, 0xd9, 0xca, 0x6e, 0x52, 0xa6, 0x37, 0xc5, 0x39, 0xa6, 0x2a, 0xcb, 0xeb, 0xc8, 0x8f, 0xde, 0x5f, 0x01, + 0xf9, 0xdb, 0x24, 0x30, 0x1f, 0x00, 0x3e, 0x3b, 0x93, 0xbd, 0xc1, 0x7a, 0x3d, 0xde, 0xe1, 0x93, 0xef, 0x4c, 0x19, 0x18, 0x5f, 0xfe, 0x8e, 0xcf, 0x74, 0x86, 0x9d, 0xc8, 0xc8, 0xc5, 0xbe, 0x37, + 0x8c, 0x79, 0x84, 0xa8, 0xa1, 0x1f, 0x49, 0x6d, 0xd4, 0x97, 0x0b, 0xc9, 0x6b, 0x55, 0x75, 0xc7, 0xd4, 0x19, 0x79, 0xd8, 0xfa, 0x1e, 0x76, 0x84, 0xe6, 0x61, 0x40, 0x57, 0x8e, 0xda, 0xa3, 0xa6, + 0xbd, 0xb6, 0xfd, 0x7c, 0x2d, 0xaf, 0xc5, 0x26, 0x50, 0xa5, 0x13, 0x51, 0x87, 0xa8, 0x8f, 0x9b, 0xb4, 0xac, 0x6b, 0xca, 0x69, 0xcb, 0x2c, 0x28, 0x00, 0xdb, 0x36, 0x48, 0x0d, 0xed, 0xa4, 0xe7, + 0x27, 0xb2, 0xbb, 0xc1, 0x3d, 0x53, 0xa1, 0xa6, 0x1f, 0x41, 0x08, 0x57, 0x11, 0x1f, 0xff, 0x3c, 0x55, 0x5d, 0x3e, 0x48, 0x08, 0xf9, 0xcf, 0x37, 0x68, 0x5f, 0x55, 0x57, 0x3e, 0x4a, 0x0c, 0xf9, + 0xdd, 0x7a, 0xf9, 0xcf, 0x23, 0x80, 0xa1, 0x71, 0xed, 0xca, 0xda, 0x84, 0x5c, 0x9a, 0x65, 0xb4, 0xda, 0xa6, 0xfe, 0x66, 0xe9, 0x27, 0x39, 0x83, 0x63, 0x89, 0xde, 0xb4, 0xe0, 0x80, 0x43, 0xeb, + 0xa3, 0x99, 0xff, 0x6c, 0x80, 0xf7, 0xeb, 0x61, 0xf8, 0x00, 0xef, 0xcf, 0xf3, 0x67, 0x4a, 0xbf, 0x0f, 0xee, 0xbc, 0x65, 0x59, 0x8d, 0x45, 0xf9, 0x80, 0x68, 0xba, 0x7a, 0x50, 0xae, 0xd5, 0x8d, + 0xc1, 0xc8, 0x75, 0xb1, 0xb3, 0xa0, 0x48, 0x8e, 0x38, 0xc7, 0xf2, 0xec, 0x88, 0x93, 0x20, 0x62, 0xe5, 0x16, 0x52, 0xb2, 0x65, 0xe0, 0x84, 0x6c, 0xbd, 0xa3, 0xe4, 0xee, 0xa6, 0xd3, 0x2a, 0x13, + 0x17, 0x27, 0x0e, 0x93, 0xfa, 0xa2, 0x71, 0x0f, 0x36, 0xc9, 0x82, 0x87, 0xdd, 0xc2, 0x17, 0xac, 0x8a, 0x71, 0x4f, 0x1b, 0x6a, 0xf9, 0xc3, 0xec, 0x79, 0x0c, 0xcd, 0xfd, 0xc2, 0x7f, 0x0e, 0xd1, + 0xf4, 0xc5, 0x39, 0x70, 0xfb, 0x88, 0x37, 0xa8, 0x6e, 0x3a, 0xc6, 0x67, 0xca, 0xc3, 0x20, 0x93, 0xf6, 0xfa, 0xbe, 0x73, 0x77, 0x6c, 0x8d, 0x80, 0x38, 0xcf, 0x46, 0xf3, 0x03, 0xb9, 0x43, 0x72, + 0x8d, 0xab, 0x02, 0x0d, 0xa6, 0x0f, 0xf3, 0x65, 0x5f, 0xc1, 0x62, 0x11, 0xa7, 0x88, 0x25, 0x19, 0xf6, 0x3e, 0x1d, 0x99, 0xf4, 0x96, 0x76, 0xb6, 0x88, 0xe2, 0x2f, 0x36, 0x6a, 0x89, 0x34, 0xfc, + 0xc6, 0x4c, 0x2d, 0xd0, 0x3b, 0x21, 0xfe, 0x34, 0x09, 0xd6, 0x65, 0x4c, 0x80, 0xd6, 0x0e, 0x94, 0xf8, 0xfc, 0x07, 0x15, 0xc8, 0xc0, 0x05, 0x77, 0xb5, 0x84, 0xee, 0xb2, 0x37, 0xff, 0x73, 0xbb, + 0xec, 0xfe, 0x9f, 0xeb, 0xbf, 0x5f, 0xfb, 0x69, 0xf1, 0x63, 0x22, 0xa7, 0xbf, 0x3f, 0xc7, 0xbd, 0x51, 0x3c, 0x6f, 0xa5, 0x45, 0x3d, 0x28, 0xda, 0x0f, 0x1a, 0xdb, 0x2e, 0x18, 0xb6, 0x4a, 0x7e, + 0x94, 0x76, 0x8d, 0xe2, 0x64, 0x13, 0x3d, 0xf4, 0xa3, 0x14, 0x9f, 0x18, 0x2c, 0x3a, 0x7a, 0xac, 0x80, 0xf8, 0x65, 0x2b, 0xb4, 0x6c, 0xbb, 0x3c, 0xdf, 0xfb, 0x2c, 0x47, 0x4e, 0x96, 0x97, 0xa9, + 0x95, 0x44, 0xfd, 0x8f, 0xfa, 0xa3, 0xd7, 0xdc, 0x26, 0x6e, 0x49, 0x9f, 0x61, 0xb8, 0xee, 0x18, 0xe2, 0x3c, 0xf1, 0x36, 0xd5, 0x50, 0xcf, 0xac, 0xa6, 0xeb, 0x6a, 0xb2, 0xad, 0xc9, 0xa8, 0x62, + 0xb6, 0xc5, 0x4c, 0x81, 0x97, 0xda, 0x09, 0x77, 0x0f, 0x71, 0xb1, 0x8c, 0x10, 0x42, 0x57, 0xfa, 0xc9, 0xd2, 0x3a, 0x44, 0x34, 0xea, 0xf5, 0x8d, 0x0d, 0x4e, 0x21, 0x98, 0x56, 0xfa, 0x7a, 0xa7, + 0x75, 0x1a, 0x81, 0x92, 0x28, 0xcb, 0xd9, 0x52, 0x6c, 0xc0, 0x62, 0x66, 0x03, 0x29, 0x85, 0x6c, 0x8d, 0x7c, 0x4f, 0xca, 0x9d, 0xd3, 0xad, 0x87, 0x68, 0xc1, 0xbf, 0x5e, 0xb7, 0x29, 0x9f, 0x7b, + 0xe0, 0xbc, 0x52, 0x31, 0xec, 0x86, 0xf2, 0x0d, 0x30, 0x4d, 0x99, 0x8c, 0x91, 0x61, 0x95, 0xc3, 0x66, 0x9a, 0x49, 0x2e, 0x64, 0x46, 0x72, 0x37, 0xa5, 0xaf, 0x16, 0xcb, 0x00, 0x1f, 0x41, 0xec, + 0x86, 0x0d, 0x66, 0x13, 0x02, 0xed, 0x69, 0xd0, 0xda, 0xf1, 0xfa, 0x22, 0xee, 0xa0, 0xed, 0xa2, 0x6b, 0x05, 0x44, 0x49, 0xcc, 0x53, 0xa7, 0xa1, 0xd6, 0x3a, 0x98, 0x0a, 0x3e, 0x38, 0x2f, 0x00, + 0x31, 0x70, 0x6c, 0xa5, 0x43, 0xd6, 0x9b, 0x63, 0xcb, 0x6f, 0x77, 0xbc, 0xd7, 0x04, 0x1d, 0x4f, 0xee, 0xc0, 0xf9, 0x10, 0x5c, 0xde, 0x43, 0x4f, 0xac, 0xaa, 0x8a, 0x82, 0x67, 0xc2, 0x27, 0xf2, + 0x52, 0x00, 0xf4, 0x0d, 0x65, 0x60, 0x7c, 0xdb, 0x3e, 0x7b, 0x29, 0xfd, 0x1a, 0x06, 0xcd, 0x4a, 0x69, 0x7d, 0x9c, 0x9a, 0x46, 0x88, 0x03, 0xf3, 0xdd, 0xba, 0xd5, 0xa4, 0xaa, 0x64, 0x5b, 0xac, + 0x82, 0xc9, 0x25, 0x7f, 0x27, 0x3d, 0xbf, 0x13, 0x8f, 0xb2, 0xaa, 0xf8, 0x31, 0x3b, 0xc7, 0x2b, 0xb1, 0x1a, 0xb7, 0xb4, 0xbf, 0x46, 0xf2, 0xde, 0x31, 0xbe, 0x90, 0xfd, 0xfd, 0x1b, 0x7b, 0xd3, + 0x94, 0x5c, 0x25, 0x0a, 0x83, 0x15, 0xf9, 0x7c, 0xe3, 0x93, 0x78, 0x8f, 0x2b, 0xb3, 0x6a, 0xa6, 0xc0, 0xec, 0x66, 0x0a, 0x20, 0xa6, 0x3d, 0xb1, 0xcc, 0xc9, 0xc4, 0x9f, 0x56, 0xb8, 0x71, 0xc8, + 0xad, 0x9e, 0x5c, 0xf4, 0x9b, 0x75, 0x92, 0xaf, 0x35, 0xbc, 0x9c, 0xea, 0xe4, 0x72, 0xb4, 0xc4, 0xb6, 0xf9, 0x61, 0xdd, 0xce, 0xe7, 0x66, 0xae, 0xf3, 0xce, 0x69, 0x52, 0x17, 0xc0, 0x64, 0x07, + 0x8a, 0xc9, 0xb7, 0xc3, 0xd4, 0xc7, 0xcb, 0xfd, 0xa4, 0x81, 0xfd, 0xfb, 0x83, 0xd4, 0x27, 0xd5, 0xab, 0xe1, 0x57, 0x43, 0xdd, 0xa0, 0x27, 0xce, 0x89, 0xaa, 0x4e, 0x4c, 0x50, 0xa7, 0x11, 0xc6, + 0x62, 0x94, 0xaf, 0x28, 0x2c, 0xbc, 0xa6, 0x0a, 0x54, 0xe1, 0xe0, 0xa4, 0x6b, 0x6b, 0x3b, 0x00, 0x0b, 0x50, 0x86, 0x3c, 0x50, 0x6e, 0xd5, 0xc3, 0x62, 0xea, 0x78, 0xcb, 0xe3, 0x88, 0x83, 0x5d, + 0x5f, 0xd9, 0xa7, 0x90, 0xcd, 0x51, 0xbc, 0x4e, 0x2e, 0x68, 0x6a, 0x2e, 0xb5, 0xa7, 0x51, 0x8e, 0x3b, 0xa8, 0x85, 0xe9, 0xcd, 0x5e, 0x70, 0xdd, 0xd7, 0xec, 0x17, 0xbf, 0x78, 0x3b, 0xbb, 0x9e, + 0x1f, 0x65, 0xde, 0xb8, 0x28, 0xf3, 0xc2, 0x2b, 0xeb, 0x8b, 0xb0, 0xfc, 0x9f, 0x9f, 0x2a, 0x27, 0xbe, 0x63, 0xf1, 0xa3, 0xd1, 0xf1, 0xff, 0x60, 0xf1, 0xbc, 0x5b, 0x1c, 0xaf, 0x5a, 0x43, 0xd3, + 0xc0, 0x6c, 0x9a, 0x39, 0xad, 0x68, 0x82, 0xc6, 0x97, 0x09, 0xbb, 0x13, 0x7c, 0x86, 0xeb, 0x29, 0xd4, 0x2e, 0xc4, 0x66, 0x52, 0x1b, 0xf5, 0xe4, 0xd8, 0xee, 0x37, 0xae, 0xcc, 0x4a, 0xa3, 0x85, + 0xa7, 0x82, 0xc9, 0xc6, 0x46, 0x38, 0x7c, 0x2b, 0x63, 0x20, 0x69, 0x51, 0xc7, 0xb0, 0xd9, 0x04, 0x8d, 0x02, 0xef, 0x96, 0xa3, 0xe5, 0x3e, 0x3e, 0xf1, 0x9d, 0xd0, 0x57, 0x9b, 0xa9, 0x19, 0xd7, + 0x6c, 0xea, 0x87, 0xeb, 0x6f, 0xb9, 0x13, 0x2e, 0x2f, 0xf6, 0xe7, 0x57, 0xee, 0xf1, 0xf7, 0x8a, 0x8a, 0x1b, 0xca, 0x9f, 0x10, 0xfc, 0xb9, 0xe2, 0x1e, 0x03, 0xd4, 0x17, 0xd1, 0x51, 0x85, 0xd7, + 0x53, 0x95, 0xd9, 0x55, 0xf3, 0xe2, 0x14, 0x69, 0xa2, 0xc1, 0xa5, 0xdb, 0x11, 0x4c, 0x33, 0xc5, 0x6e, 0xe7, 0x4d, 0xd9, 0x68, 0xc2, 0x8f, 0x7c, 0xc4, 0x1b, 0x59, 0xab, 0xc5, 0x9c, 0xb1, 0xf2, + 0xa9, 0x95, 0x2e, 0xe4, 0x2d, 0xba, 0x02, 0x05, 0x01, 0x75, 0x80, 0xb5, 0x86, 0x13, 0x1e, 0x82, 0x35, 0x35, 0x79, 0x84, 0x97, 0x6b, 0x7c, 0x16, 0x1e, 0x97, 0x04, 0xba, 0x53, 0x52, 0xae, 0x79, + 0x29, 0x2a, 0x08, 0x1c, 0x3a, 0xcb, 0xae, 0x6e, 0x7b, 0xec, 0x34, 0x7f, 0x75, 0xc3, 0xed, 0xe4, 0xfb, 0xb1, 0x52, 0x41, 0x9e, 0x8d, 0x33, 0xaf, 0x1e, 0x27, 0x51, 0x55, 0x7b, 0xcf, 0x3e, 0xd4, + 0x6b, 0xb6, 0x99, 0x1b, 0xca, 0x6f, 0x1f, 0xea, 0xba, 0x3d, 0xc4, 0x4e, 0x73, 0xd6, 0x4a, 0x42, 0x8c, 0x6c, 0x9c, 0xf0, 0x0a, 0x90, 0x13, 0x87, 0x68, 0x29, 0xad, 0xe3, 0x76, 0x4a, 0x1a, 0x0b, + 0x14, 0xef, 0x1e, 0x11, 0x4e, 0x69, 0xd8, 0x36, 0xc9, 0xc9, 0x4c, 0x32, 0x56, 0xf0, 0xda, 0x25, 0x08, 0x12, 0xb2, 0x2a, 0x03, 0x61, 0x6a, 0x3f, 0xdc, 0x75, 0xde, 0x44, 0xdb, 0xc6, 0xd9, 0xda, + 0x8a, 0xe7, 0xaa, 0x49, 0x65, 0x76, 0x1f, 0xd6, 0x30, 0xbb, 0xef, 0x26, 0x3c, 0x44, 0x1f, 0x16, 0xdf, 0x54, 0x2c, 0xef, 0xd9, 0x07, 0x9f, 0x98, 0x34, 0x5e, 0x10, 0x8a, 0xde, 0x08, 0x9e, 0x87, + 0xec, 0x78, 0x63, 0xe8, 0xf7, 0x1c, 0x31, 0xd0, 0x78, 0x4b, 0x55, 0x56, 0x31, 0xd9, 0x6e, 0x19, 0xad, 0x92, 0x85, 0x6a, 0x31, 0xcb, 0x16, 0x24, 0x8a, 0x4d, 0x27, 0x3b, 0x6b, 0xf6, 0xd8, 0x7d, + 0xf8, 0x97, 0x79, 0xf6, 0x6b, 0xd2, 0xc4, 0xbc, 0xf5, 0xca, 0x24, 0xb7, 0xdc, 0xb7, 0xb9, 0x56, 0x7b, 0x3f, 0xe7, 0xc8, 0x80, 0x5f, 0x61, 0x53, 0xdf, 0xe9, 0xbf, 0xe1, 0xf1, 0xbd, 0xf7, 0xac, + 0x54, 0x1d, 0xc0, 0xb6, 0x2c, 0x56, 0x08, 0x0e, 0xd8, 0x2e, 0x48, 0xdc, 0x98, 0x58, 0xcf, 0x9c, 0x62, 0xba, 0x8f, 0xe7, 0x40, 0xea, 0x6f, 0xe6, 0x4d, 0x14, 0x83, 0x1b, 0xb3, 0xd5, 0x2d, 0x22, + 0x29, 0x56, 0xa1, 0xa2, 0x8e, 0x7c, 0xaf, 0x38, 0x4c, 0x3a, 0x63, 0x9e, 0xe6, 0x92, 0x5c, 0xac, 0xf6, 0xfe, 0x12, 0x9d, 0x1b, 0xd3, 0xae, 0x53, 0xf3, 0x65, 0xae, 0x89, 0x15, 0xea, 0x89, 0x62, + 0xe7, 0xfb, 0x21, 0x74, 0x40, 0xb2, 0xd1, 0x00, 0xcf, 0x00, 0xab, 0xa9, 0x73, 0xc7, 0xca, 0xb2, 0x77, 0x35, 0x34, 0x72, 0xe3, 0x7d, 0x7b, 0xe7, 0x51, 0xf3, 0x91, 0x79, 0xfc, 0x21, 0xe2, 0x77, + 0x15, 0x6c, 0x9e, 0xad, 0xb3, 0xbf, 0x9f, 0x6b, 0xd7, 0x84, 0x81, 0xf1, 0x4d, 0x73, 0x68, 0xf6, 0xbe, 0x0a, 0x9b, 0xec, 0x8e, 0x82, 0x89, 0xf4, 0x45, 0x0d, 0x79, 0xae, 0x69, 0x98, 0x7d, 0x1b, + 0x1e, 0x16, 0x16, 0xda, 0xb4, 0x92, 0x03, 0xb5, 0x9d, 0x66, 0x81, 0x1c, 0x48, 0xb8, 0x35, 0x6b, 0x06, 0x12, 0x3f, 0x5f, 0xed, 0x67, 0xac, 0xed, 0xd9, 0xcc, 0x68, 0x15, 0x07, 0x9c, 0xe9, 0xcc, + 0xc2, 0x11, 0x01, 0x4e, 0x45, 0x8e, 0x59, 0x0b, 0x6a, 0x82, 0x58, 0xfb, 0x25, 0x44, 0xa4, 0x9b, 0x52, 0x37, 0x93, 0x21, 0x0e, 0xfc, 0x77, 0x7e, 0x97, 0x8f, 0x40, 0x41, 0x6f, 0x0e, 0xc2, 0x83, + 0x41, 0xb9, 0x22, 0xfc, 0x06, 0xca, 0x55, 0x73, 0x8c, 0x7e, 0x3b, 0x00, 0x3f, 0x04, 0x25, 0x9e, 0xd8, 0x6e, 0x0a, 0x67, 0xf0, 0xb4, 0x8e, 0x4f, 0x47, 0x67, 0xaf, 0x70, 0x3d, 0x31, 0x3d, 0xe2, + 0xb1, 0xaf, 0x1f, 0x13, 0xde, 0x0d, 0x2a, 0x5b, 0x2c, 0xc1, 0x65, 0x6c, 0x3a, 0x1d, 0x53, 0xad, 0x0b, 0xdb, 0x42, 0x1d, 0x62, 0x7f, 0x20, 0x6b, 0x88, 0x4b, 0x1c, 0x32, 0xe4, 0xe8, 0xf6, 0xc8, + 0xb0, 0x8e, 0x4a, 0x40, 0x0b, 0x9d, 0x6f, 0xba, 0x3c, 0xda, 0x9b, 0x30, 0x7a, 0xf4, 0x8e, 0x53, 0xfe, 0xb5, 0x32, 0x51, 0x97, 0x92, 0x59, 0xff, 0xf9, 0x9f, 0xdb, 0x02, 0x59, 0xe7, 0xdb, 0x2f, + 0x23, 0x1f, 0x5b, 0x4d, 0x1d, 0x8e, 0xeb, 0x3c, 0xf6, 0x3e, 0xa6, 0x29, 0xf8, 0xe4, 0xc6, 0xcb, 0x21, 0xe7, 0x52, 0xe1, 0xfd, 0xce, 0xb9, 0xf2, 0xca, 0x81, 0x03, 0xfe, 0x3b, 0x5d, 0xe1, 0xaf, + 0x0a, 0x9f, 0xff, 0xeb, 0xc0, 0xf1, 0x59, 0x84, 0xe0, 0xa9, 0xde, 0xe1, 0xef, 0x99, 0xec, 0x1b, 0xc5, 0xf3, 0xe4, 0x8e, 0xf3, 0x8b, 0xde, 0x61, 0x00, 0x1f, 0x45, 0xc2, 0x35, 0x81, 0x8b, 0x27, + 0xa4, 0x37, 0x1d, 0x6f, 0x5a, 0x21, 0x27, 0x77, 0xb6, 0xeb, 0xf3, 0xe2, 0xd0, 0xe9, 0x2d, 0x70, 0x5a, 0x6e, 0x42, 0x1d, 0x22, 0x12, 0x7c, 0xa3, 0xa6, 0xe4, 0x01, 0xc2, 0xd0, 0x09, 0xe3, 0x71, + 0xf0, 0x88, 0xee, 0x74, 0xb5, 0x1d, 0x25, 0xde, 0xd2, 0x5b, 0x43, 0x13, 0x2a, 0x0b, 0xe1, 0xce, 0xb7, 0x0f, 0x79, 0xa7, 0x8b, 0x3b, 0x92, 0x15, 0xc0, 0x1e, 0xa9, 0x2d, 0xe3, 0xdb, 0x59, 0xe3, + 0x41, 0x91, 0xc2, 0xa7, 0xe3, 0x7e, 0x61, 0xd8, 0xb7, 0xc4, 0xcf, 0x10, 0xdc, 0x76, 0x0d, 0x31, 0x00, 0x43, 0xe3, 0x05, 0xd8, 0x28, 0x16, 0xb3, 0xd1, 0x37, 0xe2, 0x08, 0xf7, 0xaa, 0x69, 0x39, + 0x53, 0x0b, 0x2b, 0x0b, 0x6b, 0x67, 0x07, 0x0d, 0x28, 0x08, 0x7c, 0x7e, 0xe4, 0x47, 0xc0, 0xca, 0xb3, 0xc1, 0xfd, 0xbd, 0x65, 0xe6, 0x8b, 0xec, 0xc7, 0xb0, 0x2e, 0xc5, 0xca, 0xa0, 0x61, 0xf6, + 0x99, 0x35, 0xb5, 0xea, 0x45, 0x9d, 0xa6, 0x69, 0x51, 0x1e, 0x9d, 0x10, 0xbc, 0x9f, 0x4d, 0xe6, 0x20, 0xed, 0x82, 0xa7, 0x9d, 0x8d, 0x17, 0x73, 0xe2, 0xb4, 0xdc, 0xe6, 0x40, 0x3c, 0x35, 0x0c, + 0xd7, 0x08, 0x0a, 0x03, 0x06, 0x60, 0xba, 0x12, 0xaa, 0xb8, 0x5a, 0x95, 0x07, 0x2c, 0x11, 0x98, 0x63, 0x79, 0x2a, 0x75, 0x21, 0x83, 0xbc, 0xfd, 0x12, 0xcd, 0xe7, 0x05, 0x6e, 0x85, 0xad, 0xc0, + 0x4a, 0x14, 0x3e, 0xa8, 0x42, 0x49, 0x11, 0x39, 0xf9, 0x4f, 0x16, 0x6d, 0xf8, 0xa5, 0x00, 0xb5, 0x4f, 0xaa, 0x6f, 0x60, 0x7c, 0x5c, 0x9f, 0x4b, 0x24, 0x0f, 0x60, 0xe0, 0x89, 0x01, 0x49, 0x80, + 0x18, 0xad, 0x96, 0x24, 0xdc, 0x0b, 0x2d, 0xd0, 0x4f, 0x66, 0xd0, 0x56, 0x50, 0xa9, 0x91, 0x09, 0xc2, 0x36, 0x19, 0x54, 0x0b, 0xbf, 0x3d, 0xe6, 0xbb, 0x9d, 0x8f, 0x86, 0x58, 0xdc, 0xce, 0xf2, + 0xd1, 0x36, 0xad, 0xd2, 0xde, 0x38, 0x94, 0xf3, 0xce, 0x40, 0x27, 0xd5, 0x26, 0x10, 0x8e, 0x34, 0x72, 0xa4, 0xdd, 0x03, 0xb8, 0x3d, 0x69, 0xd9, 0xce, 0xe7, 0x3c, 0xa2, 0x54, 0x5a, 0x63, 0x18, + 0x16, 0xd9, 0xb3, 0x95, 0x8e, 0xfe, 0x81, 0x26, 0x2f, 0x68, 0x1a, 0xde, 0x28, 0x9e, 0x21, 0xc8, 0xf2, 0xf1, 0x85, 0xc4, 0xef, 0xc3, 0xaf, 0x57, 0x27, 0xf4, 0xa0, 0x07, 0x71, 0x38, 0xe3, 0xbb, + 0x4d, 0x70, 0xd8, 0x41, 0x40, 0x6e, 0x44, 0x13, 0x2f, 0xf4, 0x13, 0xd8, 0x98, 0x31, 0x60, 0xc3, 0x9c, 0x68, 0x9a, 0xaf, 0x08, 0x0f, 0x43, 0xb8, 0x28, 0xa3, 0x15, 0x76, 0xef, 0xf2, 0x25, 0x2f, + 0x51, 0xdb, 0xc2, 0x31, 0xc5, 0x42, 0x8c, 0x9c, 0x60, 0xa2, 0xeb, 0x93, 0xa9, 0x0b, 0x2c, 0xd7, 0x92, 0x99, 0xe6, 0x88, 0x14, 0x68, 0xf0, 0x2e, 0x1e, 0xe0, 0x1d, 0x72, 0xf6, 0x28, 0x2f, 0x3d, + 0xf7, 0x23, 0x30, 0xf8, 0xde, 0x9a, 0x71, 0xb9, 0xa1, 0xb2, 0x7c, 0xef, 0xdd, 0x31, 0x3c, 0xf2, 0x2f, 0x16, 0x34, 0xf8, 0x0f, 0xf8, 0x07, 0xbf, 0xbf, 0xf1, 0xd7, 0xa0, 0x00, 0x3f, 0xb1, 0xea, + 0xaa, 0xfe, 0xa8, 0x86, 0x08, 0xfe, 0x81, 0x6e, 0xce, 0xed, 0x67, 0xc4, 0xaa, 0xda, 0x1d, 0x57, 0x5e, 0x19, 0x9d, 0x95, 0x6f, 0xef, 0x29, 0xa3, 0xbe, 0xd9, 0xd4, 0x0e, 0x4d, 0xe4, 0xc4, 0x63, + 0x3f, 0x2f, 0x53, 0xab, 0x1e, 0x37, 0x99, 0x57, 0x39, 0x56, 0x71, 0xf9, 0x2e, 0xe7, 0xdd, 0xf4, 0xe6, 0x00, 0x56, 0xe5, 0x59, 0xe4, 0x8c, 0xed, 0x3c, 0xff, 0xaa, 0x31, 0xf8, 0x24, 0x14, 0xfd, + 0xc9, 0xf3, 0x1f, 0xab, 0x5f, 0x5f, 0xf1, 0xbd, 0x7e, 0xf4, 0x80, 0x8f, 0x99, 0x72, 0xd7, 0x7d, 0x36, 0xb5, 0x0d, 0x58, 0x37, 0xf4, 0x61, 0x87, 0x14, 0x1d, 0x25, 0x96, 0xf5, 0x84, 0x6f, 0x84, + 0xf9, 0x5c, 0x23, 0x78, 0x0d, 0x54, 0xe3, 0x69, 0x2c, 0x03, 0x86, 0x43, 0xf2, 0x53, 0x7f, 0x23, 0xd2, 0x7d, 0x40, 0x0a, 0x70, 0xbf, 0x9a, 0x32, 0xfe, 0x0e, 0x6c, 0xed, 0x88, 0x99, 0x31, 0xf6, + 0x2a, 0x48, 0xb2, 0x93, 0x27, 0x55, 0x9b, 0x19, 0xca, 0xf5, 0x99, 0xe5, 0xa1, 0xfc, 0x96, 0x42, 0xb0, 0xc2, 0x24, 0xa6, 0x56, 0xab, 0x96, 0xdf, 0xce, 0x5c, 0x45, 0x79, 0x16, 0x27, 0xc6, 0x6f, + 0x63, 0x7b, 0xca, 0x33, 0x5e, 0x51, 0x48, 0x5f, 0x13, 0x7e, 0x43, 0xe2, 0xaa, 0x39, 0xcc, 0xa5, 0x11, 0x55, 0x24, 0xb0, 0x45, 0x77, 0x87, 0x3d, 0x91, 0x81, 0xcc, 0x06, 0xd0, 0xe6, 0xae, 0x4b, + 0xe4, 0x78, 0x60, 0xc2, 0x2b, 0x67, 0xc0, 0xda, 0x2f, 0xbd, 0xba, 0x3e, 0x8d, 0xed, 0x53, 0xfd, 0xd4, 0x5b, 0x6c, 0xfa, 0x92, 0x97, 0xe0, 0x35, 0xe1, 0xcb, 0xb0, 0x3e, 0x9b, 0xe3, 0xe9, 0x30, + 0xaf, 0xc1, 0xc5, 0xa2, 0x03, 0x27, 0x33, 0xf5, 0xff, 0x63, 0xef, 0x3d, 0x9a, 0x94, 0x55, 0xbb, 0xfd, 0xe1, 0xf9, 0xf9, 0x14, 0x77, 0xdd, 0x53, 0xca, 0x4d, 0x52, 0xc2, 0x33, 0x43, 0x51, 0x14, + 0x04, 0x54, 0x0c, 0xc0, 0xe0, 0x79, 0x8b, 0x9c, 0x73, 0xb6, 0xea, 0xdd, 0x9f, 0xfd, 0x5f, 0x6a, 0x07, 0xdb, 0xd0, 0xcd, 0xed, 0xde, 0x67, 0x76, 0x06, 0x5d, 0x4d, 0x72, 0xc1, 0xb5, 0xae, 0xb4, + 0xe2, 0x6f, 0x45, 0xf9, 0x38, 0x9b, 0x71, 0x44, 0xa4, 0x81, 0xb8, 0xb8, 0x44, 0x0b, 0xfa, 0x08, 0xee, 0xbb, 0xd2, 0x2c, 0xd9, 0x1c, 0x1a, 0x0e, 0xc1, 0xf5, 0x8e, 0x2d, 0xe7, 0x50, 0xc3, 0x91, + 0xa1, 0x4e, 0xfa, 0xcb, 0x8c, 0x2c, 0xd9, 0x6e, 0xd1, 0xee, 0x9a, 0x72, 0xcd, 0xce, 0x1b, 0x2d, 0x47, 0xc6, 0x59, 0xe9, 0x51, 0x43, 0x6f, 0x72, 0x90, 0x9a, 0x84, 0x64, 0x97, 0xc1, 0xf1, 0x5e, + 0x99, 0x4e, 0xf3, 0xc4, 0xb0, 0x8a, 0xe2, 0x8c, 0x04, 0x70, 0x9a, 0x52, 0x5a, 0xee, 0x3c, 0x0f, 0x55, 0x79, 0x69, 0xff, 0x7f, 0xf0, 0x82, 0x33, 0x47, 0xee, 0x2f, 0xf7, 0x4d, 0xee, 0x46, 0x93, + 0x6a, 0x27, 0xa6, 0x6b, 0xb7, 0x74, 0x72, 0x5d, 0xd4, 0x60, 0x9c, 0xc5, 0x81, 0xaa, 0x15, 0xb7, 0xe9, 0x62, 0xab, 0x1c, 0x34, 0x66, 0x85, 0x83, 0x94, 0x9b, 0x6c, 0x50, 0x80, 0x02, 0x40, 0xd8, + 0x22, 0x8b, 0x20, 0x3f, 0x5a, 0x21, 0xe3, 0x81, 0xa6, 0x7c, 0x9c, 0x2a, 0x5d, 0xad, 0xb7, 0x95, 0x3e, 0x9d, 0x61, 0x87, 0x18, 0xe9, 0xd2, 0xc2, 0xd8, 0x72, 0x1e, 0xc7, 0xce, 0x66, 0x31, 0xac, + 0xf5, 0x89, 0xa7, 0x4c, 0xf3, 0xc4, 0xc9, 0xad, 0xe2, 0x3b, 0x06, 0xbd, 0xb0, 0x5b, 0xbc, 0x11, 0xbd, 0x30, 0xe5, 0x7c, 0x78, 0x66, 0x44, 0x8f, 0x4d, 0x03, 0x5f, 0x79, 0xf3, 0x72, 0x19, 0x86, + 0xa3, 0xa5, 0x19, 0x73, 0x0b, 0xbe, 0x81, 0x21, 0x68, 0x01, 0x10, 0x2d, 0x2b, 0x6f, 0x46, 0xce, 0x01, 0x59, 0x37, 0x07, 0x25, 0xd8, 0x62, 0x1e, 0x5b, 0x6b, 0x90, 0x2e, 0x7b, 0xa5, 0xca, 0x69, + 0xa0, 0xcc, 0xe7, 0x92, 0x6e, 0x46, 0x0e, 0x9a, 0x23, 0x72, 0xac, 0x79, 0xe6, 0x91, 0x5c, 0x57, 0x91, 0x09, 0xed, 0x57, 0x1a, 0x9f, 0xab, 0xe1, 0x8c, 0xdc, 0x93, 0xc5, 0x9d, 0x75, 0x30, 0xcd, + 0x93, 0x68, 0x60, 0x84, 0xde, 0xf3, 0x9a, 0xd4, 0xf0, 0x6b, 0x40, 0x92, 0x57, 0x84, 0x2f, 0x8d, 0x7f, 0x3f, 0x1b, 0xc0, 0x3d, 0x11, 0x25, 0xe7, 0xed, 0x96, 0xca, 0x75, 0xcc, 0x0e, 0xc4, 0xb8, + 0x5c, 0xcf, 0x93, 0x0d, 0x53, 0xd7, 0xc3, 0xcc, 0x04, 0xc7, 0x41, 0x92, 0xfb, 0xa1, 0xe7, 0x55, 0x22, 0x52, 0x49, 0x87, 0x09, 0xc2, 0x4d, 0x60, 0x9c, 0xdf, 0x6d, 0x39, 0xa5, 0x2c, 0x0f, 0x26, + 0x9d, 0xc8, 0x32, 0x58, 0xb7, 0xa2, 0xbb, 0x36, 0x83, 0x64, 0x3a, 0x99, 0xf2, 0xe4, 0x78, 0x3c, 0x87, 0x52, 0x1f, 0x09, 0x09, 0x86, 0x08, 0xac, 0x1a, 0xeb, 0x91, 0x35, 0x57, 0x9a, 0x9e, 0xf3, + 0x5e, 0xad, 0x17, 0x7a, 0x6e, 0xae, 0x4b, 0xf3, 0xa4, 0xed, 0x06, 0x9a, 0x69, 0x3e, 0xcb, 0x41, 0x78, 0x2d, 0x1e, 0xe8, 0x93, 0xec, 0x85, 0x6d, 0x6f, 0x27, 0x7d, 0xa3, 0x82, 0xc2, 0x70, 0x5d, + 0xf0, 0x4b, 0x69, 0x47, 0xef, 0x56, 0xdb, 0xe1, 0xd0, 0x37, 0xf3, 0x1d, 0x28, 0xa2, 0x78, 0x16, 0xc6, 0x9e, 0xed, 0x95, 0xf4, 0x0a, 0x50, 0x9b, 0x3c, 0x8a, 0x54, 0x23, 0x91, 0xb8, 0x6e, 0xc9, + 0xd5, 0xa5, 0xda, 0xa6, 0xdd, 0x1e, 0x8a, 0x11, 0x50, 0xa7, 0x41, 0x61, 0x58, 0x8e, 0x29, 0x4a, 0x05, 0x1d, 0x76, 0x6a, 0xaa, 0x3b, 0x9c, 0xe3, 0x73, 0x2d, 0xe1, 0x60, 0x40, 0x56, 0xa8, 0x3e, + 0xa2, 0x46, 0x92, 0x37, 0x5a, 0x6e, 0x5e, 0x9a, 0x77, 0x27, 0x19, 0x5c, 0x17, 0x8a, 0x78, 0xab, 0x0a, 0xf1, 0x98, 0xa7, 0x5f, 0x22, 0x79, 0x9e, 0x19, 0x66, 0x88, 0x3f, 0x67, 0xea, 0x27, 0xdd, + 0x13, 0x57, 0x3f, 0xcf, 0xce, 0x66, 0x19, 0xe2, 0x67, 0xb6, 0xe2, 0x38, 0xad, 0x36, 0xed, 0x3a, 0x6a, 0xb9, 0xb8, 0x42, 0xb5, 0xcd, 0x68, 0x88, 0xec, 0x00, 0x99, 0x98, 0x75, 0xa9, 0x70, 0xd4, + 0x6d, 0x16, 0x98, 0x8c, 0xe4, 0x35, 0x1d, 0xa0, 0xd5, 0xc1, 0x3f, 0xb4, 0x31, 0x06, 0x8f, 0x60, 0x6d, 0xc1, 0x33, 0xa5, 0x7b, 0x50, 0x36, 0xf2, 0x36, 0xdb, 0xc2, 0xd3, 0x51, 0xc2, 0xd6, 0x0e, + 0x10, 0xfa, 0x9a, 0x86, 0x88, 0xac, 0x07, 0xec, 0xed, 0x7a, 0x22, 0xae, 0x7b, 0xe1, 0x9b, 0xa5, 0x55, 0xf4, 0x6c, 0x4f, 0x7e, 0xcd, 0x49, 0x7c, 0x22, 0x78, 0xe2, 0x41, 0x15, 0xa5, 0x7d, 0x1d, + 0xc2, 0xcb, 0x46, 0xed, 0x80, 0x14, 0x95, 0x66, 0x05, 0xbc, 0xea, 0x4a, 0x13, 0xf4, 0x15, 0xa3, 0x1c, 0x36, 0x69, 0x3d, 0x24, 0xe7, 0x9e, 0x32, 0xc9, 0x4c, 0x72, 0x13, 0x1a, 0x23, 0x75, 0x6f, + 0x06, 0xd0, 0x1e, 0x20, 0x94, 0x63, 0x8d, 0xf9, 0x9b, 0xd1, 0x38, 0x0c, 0xd0, 0xed, 0x26, 0x5a, 0x2d, 0x61, 0xbb, 0xc4, 0xc8, 0x6d, 0xbb, 0x82, 0x16, 0xbc, 0xca, 0xb0, 0xc0, 0x61, 0x35, 0xdb, + 0x21, 0xe3, 0x99, 0xdb, 0xbc, 0xe6, 0x1b, 0x3a, 0x89, 0x0f, 0x89, 0xfd, 0xb5, 0xaa, 0xf4, 0x8d, 0xf4, 0xf8, 0xa5, 0x7e, 0xcd, 0xb3, 0x71, 0x56, 0xc5, 0x9d, 0x91, 0x3c, 0xc5, 0x8b, 0x7b, 0x0d, + 0x4d, 0xfa, 0x9d, 0xe8, 0x99, 0xbb, 0x97, 0xc3, 0x3e, 0x48, 0xd2, 0xe7, 0x58, 0xbe, 0x4d, 0xb1, 0xf1, 0x4d, 0x1b, 0xf0, 0x47, 0x51, 0x08, 0x74, 0x20, 0xc6, 0x70, 0xf3, 0x95, 0xaa, 0xe7, 0x33, + 0x90, 0x48, 0x11, 0xc5, 0xd1, 0x20, 0x76, 0x55, 0x9a, 0xd9, 0x76, 0xa1, 0x20, 0xb2, 0x35, 0x4a, 0x5c, 0x76, 0x45, 0x93, 0x85, 0x46, 0xb3, 0xec, 0x72, 0x55, 0xa7, 0x24, 0x20, 0x48, 0xe3, 0x34, + 0xdf, 0xd7, 0x56, 0x6d, 0xca, 0x6a, 0xa7, 0xc7, 0x3e, 0x62, 0xd4, 0x84, 0x38, 0x35, 0xa1, 0xfb, 0xb5, 0xbe, 0x4a, 0xb5, 0x7f, 0xb9, 0xc5, 0xa9, 0x76, 0x6e, 0x6d, 0xaa, 0xf5, 0x6d, 0x69, 0x08, + 0xfb, 0x02, 0x55, 0xa4, 0x8b, 0xb1, 0x34, 0xcb, 0xf4, 0x2d, 0xd0, 0x01, 0xa3, 0x59, 0x52, 0x24, 0xbe, 0x90, 0xee, 0xd3, 0x19, 0x39, 0x8c, 0xc3, 0x05, 0xd0, 0xd0, 0xbb, 0x34, 0x5b, 0x91, 0x56, + 0xdc, 0x88, 0x5b, 0x7b, 0xde, 0x92, 0x36, 0xe4, 0xb8, 0xa3, 0x78, 0x4c, 0x62, 0x75, 0x08, 0x60, 0xdd, 0x36, 0x2d, 0xd8, 0xa2, 0x4b, 0x2d, 0x21, 0x6f, 0xec, 0xe3, 0x2a, 0xe7, 0xaa, 0xf9, 0x78, + 0x08, 0xbf, 0x16, 0xb5, 0x78, 0xd1, 0x2b, 0x06, 0x4e, 0xa2, 0x5d, 0xd6, 0x7a, 0xe4, 0x79, 0xb6, 0x59, 0xf6, 0x4c, 0x2a, 0xc0, 0xfe, 0x82, 0x5f, 0xd9, 0x1c, 0xb3, 0x93, 0x40, 0x90, 0x15, 0x83, + 0xcb, 0xcf, 0x7f, 0xe6, 0x1a, 0x3f, 0x42, 0x88, 0x79, 0xea, 0x62, 0x4d, 0x21, 0xed, 0xc5, 0xb1, 0xa7, 0xec, 0x62, 0xc6, 0x06, 0x38, 0x10, 0x6f, 0x20, 0x57, 0x28, 0xdc, 0x02, 0x34, 0x2b, 0xa6, + 0x10, 0xe4, 0xd5, 0x6e, 0xb2, 0x9c, 0x8f, 0x64, 0x2a, 0xf3, 0xa7, 0xa5, 0xb7, 0x62, 0x1a, 0x41, 0x14, 0x96, 0x7b, 0xa8, 0x1c, 0xcf, 0x09, 0x21, 0x61, 0x74, 0x28, 0xaa, 0xe9, 0x11, 0x5b, 0xe9, + 0xf1, 0x6e, 0x9b, 0x57, 0x3e, 0x47, 0x6f, 0x7b, 0xac, 0xea, 0x67, 0x9c, 0x43, 0xc3, 0xd5, 0xe2, 0xd8, 0x0a, 0x7f, 0xbf, 0xeb, 0x57, 0xc3, 0x27, 0x3c, 0xaa, 0xac, 0xca, 0x1a, 0x44, 0x9e, 0x91, + 0x27, 0xa5, 0x56, 0x04, 0xdf, 0xf8, 0x30, 0xfe, 0x5c, 0x8c, 0xba, 0xa1, 0x7d, 0x62, 0xde, 0xd7, 0x2b, 0x7d, 0xeb, 0x47, 0x08, 0x95, 0x26, 0x48, 0x1a, 0x66, 0x87, 0xdc, 0x76, 0xc4, 0x6a, 0x92, + 0xb2, 0x3e, 0xb2, 0x49, 0x00, 0x0d, 0xd9, 0xe3, 0x76, 0x09, 0x4f, 0x28, 0x4c, 0x63, 0xdc, 0x7a, 0x94, 0xdb, 0xcb, 0x03, 0xba, 0x72, 0x32, 0x0a, 0xe0, 0x91, 0x89, 0x9b, 0xaa, 0xeb, 0x98, 0x9a, + 0x10, 0x2e, 0xe1, 0x0d, 0xd5, 0x59, 0x30, 0x96, 0x08, 0x79, 0xb4, 0xc9, 0x02, 0x7a, 0x3c, 0xa7, 0xf0, 0x7c, 0xe8, 0x5a, 0x3e, 0xca, 0x91, 0x77, 0x13, 0xed, 0xa9, 0x02, 0xfb, 0x88, 0x23, 0xc3, + 0x97, 0x12, 0x0c, 0x1e, 0xbf, 0xe2, 0xcc, 0x98, 0x47, 0x37, 0xce, 0x20, 0xb7, 0x3d, 0x52, 0x0f, 0x4a, 0x65, 0x02, 0xaf, 0x61, 0xd7, 0xe9, 0x36, 0xd5, 0xdc, 0x09, 0x93, 0x3d, 0xa8, 0xc8, 0x05, + 0xd2, 0xc0, 0xa3, 0x2a, 0x5e, 0xed, 0x5d, 0x22, 0xb3, 0x2b, 0x30, 0x9b, 0x6c, 0x6d, 0x77, 0xab, 0x68, 0x91, 0xd6, 0xe0, 0x76, 0xe7, 0x56, 0x11, 0xa7, 0x21, 0x1d, 0x93, 0x9a, 0x52, 0x42, 0xe0, + 0xb5, 0x82, 0x22, 0xf9, 0xc2, 0x08, 0x7d, 0x60, 0x68, 0x1f, 0x94, 0xb5, 0xbc, 0xe3, 0x0b, 0x72, 0x3a, 0xaf, 0xef, 0xf4, 0x92, 0xdc, 0xf8, 0x66, 0x74, 0xfc, 0xf9, 0xee, 0x9e, 0x1b, 0xe0, 0x00, + 0xcc, 0x8d, 0xf3, 0x18, 0xe8, 0xb1, 0x97, 0x77, 0xa8, 0xce, 0x38, 0x19, 0xe7, 0xa3, 0xeb, 0xb1, 0xd9, 0x2e, 0xf5, 0x65, 0x90, 0x44, 0x61, 0xe2, 0x06, 0x75, 0x41, 0x11, 0x8e, 0x49, 0x79, 0xbb, + 0x75, 0x28, 0x8d, 0xd9, 0x78, 0xec, 0xda, 0x31, 0x30, 0x5e, 0xb5, 0xce, 0x50, 0x37, 0x30, 0xc4, 0x24, 0xb6, 0xc6, 0xf8, 0x00, 0x8f, 0x1a, 0xad, 0xa6, 0x6d, 0xc7, 0x6a, 0x27, 0x8e, 0x61, 0x18, + 0x81, 0x6b, 0xa8, 0x75, 0xd7, 0x74, 0x6b, 0x65, 0x25, 0xbe, 0xb6, 0x9d, 0x5d, 0xb2, 0xfd, 0x3f, 0xb3, 0xa7, 0xa1, 0x5b, 0xaf, 0xc2, 0xa5, 0xb6, 0xd8, 0xef, 0xbf, 0xef, 0x6a, 0xb1, 0x5d, 0x65, + 0x5a, 0x3c, 0xa8, 0xb2, 0x5b, 0x94, 0xb9, 0x97, 0x5e, 0x5c, 0x2c, 0x46, 0x12, 0xbd, 0x97, 0xa9, 0xfa, 0xfd, 0xf7, 0x37, 0x58, 0x3e, 0xb9, 0xa5, 0x99, 0xa6, 0x97, 0x3f, 0x17, 0x36, 0x5e, 0xf1, + 0xfd, 0xbc, 0x13, 0x3d, 0xf5, 0xcf, 0xdb, 0xe1, 0x00, 0xed, 0xe7, 0xf3, 0x31, 0x78, 0xb7, 0xc2, 0x0d, 0x90, 0xc8, 0x4d, 0x37, 0x98, 0xcb, 0x87, 0x42, 0x01, 0x92, 0x62, 0xec, 0xda, 0x52, 0x07, + 0xb1, 0x5e, 0xd0, 0xa4, 0x73, 0x0e, 0x1c, 0x01, 0x5e, 0x94, 0x00, 0xcb, 0xd4, 0xd2, 0x8a, 0xed, 0x8c, 0x48, 0xaa, 0x69, 0x3e, 0xcf, 0x43, 0x25, 0x68, 0xb6, 0x10, 0x00, 0xc4, 0xbe, 0xd7, 0x55, + 0x74, 0x6d, 0xe0, 0xe2, 0x4c, 0x19, 0x6d, 0xd1, 0x2a, 0xa8, 0x55, 0x22, 0x7b, 0x5a, 0xd4, 0xec, 0x87, 0x5e, 0xba, 0x36, 0xa8, 0x9e, 0xb6, 0x09, 0xe4, 0x39, 0x0f, 0x1d, 0xab, 0x4d, 0xff, 0x4a, + 0xf3, 0xa4, 0x4c, 0xca, 0x2e, 0xb5, 0xfe, 0xb2, 0x43, 0xed, 0xa9, 0xc6, 0x7d, 0x11, 0x4f, 0xfe, 0x9c, 0xa3, 0x8f, 0x5e, 0x71, 0xe6, 0xef, 0xa3, 0x1b, 0xe7, 0xfc, 0x89, 0x1e, 0x1b, 0x0c, 0xeb, + 0x8d, 0xcd, 0xcd, 0x38, 0x23, 0xe1, 0x43, 0xa8, 0xe0, 0xd5, 0x86, 0x85, 0xcc, 0x02, 0xdf, 0x00, 0xe6, 0x0e, 0x42, 0x3c, 0x6c, 0xc9, 0x79, 0x44, 0x8e, 0x8e, 0xab, 0xb5, 0x2b, 0xc8, 0x31, 0x10, + 0x44, 0xd6, 0x52, 0x00, 0xa6, 0xf6, 0xdc, 0xb5, 0xfd, 0x8c, 0xdf, 0x78, 0x05, 0x7c, 0x64, 0xdb, 0x38, 0xac, 0x08, 0xc2, 0xcd, 0xc0, 0xa1, 0xd9, 0x42, 0x2b, 0x44, 0x5c, 0xa1, 0xd4, 0x6a, 0xb3, + 0x7d, 0x35, 0x99, 0xe0, 0x5f, 0x0e, 0xff, 0x79, 0xec, 0x98, 0x7b, 0xbc, 0x12, 0xbf, 0xe2, 0x5f, 0x7f, 0x40, 0xff, 0xd2, 0x1d, 0xb7, 0x57, 0x07, 0xc3, 0x7e, 0xfe, 0x75, 0xcc, 0x09, 0x24, 0x7d, + 0xb8, 0xc3, 0xb4, 0x03, 0x3b, 0x1e, 0x4a, 0x33, 0x44, 0xad, 0x97, 0x3a, 0x8e, 0x75, 0x93, 0xb1, 0x6f, 0xd4, 0x95, 0x2d, 0x8f, 0xb3, 0xba, 0x9e, 0xb6, 0xf0, 0x5c, 0x8f, 0xb8, 0x55, 0x50, 0x95, + 0x45, 0xe3, 0x1f, 0xe0, 0x56, 0xd8, 0x6f, 0x14, 0x08, 0x30, 0xb5, 0xd0, 0x5f, 0x28, 0x1b, 0x3d, 0x71, 0x04, 0x5c, 0x84, 0xac, 0x52, 0x91, 0x42, 0xdd, 0xd3, 0xa6, 0xeb, 0x8e, 0xef, 0x5e, 0x5b, + 0x9f, 0xce, 0x0b, 0xf5, 0x65, 0x7d, 0x21, 0x7e, 0xe0, 0xee, 0xf3, 0x90, 0xcd, 0xd7, 0x90, 0x8d, 0xae, 0x09, 0x5f, 0xf3, 0xb3, 0xca, 0xc3, 0xbe, 0xa8, 0x46, 0x84, 0x66, 0x28, 0xb2, 0xbc, 0x5d, + 0x40, 0x54, 0xb0, 0xae, 0xb1, 0x0d, 0x25, 0xfa, 0x53, 0xb4, 0x16, 0xb5, 0x85, 0xac, 0x06, 0x5b, 0xb2, 0x49, 0x86, 0x4b, 0x71, 0xa6, 0x8f, 0x39, 0x65, 0x3d, 0x9d, 0xc6, 0x31, 0x2f, 0x8c, 0x53, + 0x2e, 0x33, 0x77, 0xf9, 0x02, 0x93, 0x86, 0xc2, 0x16, 0xe2, 0x56, 0x8b, 0x04, 0x3c, 0xec, 0x6b, 0x76, 0x54, 0x4e, 0x41, 0x79, 0xb4, 0x9c, 0x81, 0xdb, 0xf5, 0xce, 0x86, 0xac, 0xe0, 0x7f, 0x8f, + 0x91, 0xa7, 0x26, 0xe4, 0xf5, 0x53, 0x5c, 0xc1, 0xd7, 0x42, 0x12, 0x3e, 0xc9, 0x9e, 0x99, 0xf8, 0x7e, 0xd2, 0x27, 0x1c, 0x01, 0x1e, 0xf0, 0xc8, 0xbc, 0x00, 0xfc, 0x2e, 0x6a, 0x14, 0x8e, 0x16, + 0x29, 0x74, 0x5d, 0x8d, 0xf6, 0x0c, 0x31, 0xa2, 0x61, 0x5c, 0xbc, 0xcd, 0x28, 0x7f, 0x0c, 0x32, 0xf3, 0xcc, 0x2a, 0xf2, 0xe7, 0x11, 0x4c, 0x0f, 0xe8, 0x9f, 0xdb, 0x73, 0x77, 0xb5, 0x2f, 0x80, + 0xb2, 0x6c, 0x43, 0xf1, 0xc1, 0xc2, 0x36, 0x85, 0x75, 0xf4, 0x66, 0x7c, 0x05, 0x50, 0x29, 0xa9, 0x7b, 0xde, 0x4e, 0x8f, 0xd2, 0x30, 0xc3, 0x24, 0x12, 0x4c, 0x01, 0xbc, 0xc1, 0x15, 0x79, 0x05, + 0xb2, 0xe3, 0xb9, 0x9b, 0xef, 0x68, 0x7a, 0xe7, 0x36, 0x1a, 0x50, 0x53, 0x42, 0x57, 0xe9, 0x55, 0x66, 0xab, 0x87, 0x6d, 0x6d, 0xed, 0x40, 0x90, 0x56, 0xf6, 0x4c, 0x41, 0x33, 0xf8, 0x86, 0x5b, + 0x82, 0xf5, 0xf4, 0xce, 0xf9, 0xfa, 0xd6, 0xba, 0xef, 0x8c, 0xea, 0x17, 0x98, 0xd6, 0x3f, 0x17, 0x89, 0xdf, 0x1e, 0x3b, 0x73, 0xe1, 0x7c, 0x34, 0xb8, 0x26, 0xf7, 0x33, 0x03, 0x0e, 0xc4, 0xb2, + 0x32, 0xa4, 0x2e, 0xe6, 0x76, 0x0b, 0xba, 0x22, 0xbb, 0x30, 0xd7, 0x34, 0xbc, 0xb2, 0xf6, 0x2a, 0xee, 0x1a, 0x50, 0x45, 0x39, 0xec, 0xb8, 0xdd, 0x17, 0x6b, 0x89, 0x13, 0x65, 0xb1, 0x0b, 0x2d, + 0x42, 0x23, 0xd1, 0x4c, 0x76, 0x8d, 0x23, 0x20, 0x53, 0xb2, 0x4a, 0xe8, 0x8b, 0x0c, 0x31, 0x31, 0x6f, 0x38, 0x75, 0x4d, 0x33, 0xc6, 0xa6, 0x75, 0x09, 0x40, 0xe0, 0xae, 0xe1, 0x02, 0xec, 0xb5, + 0xfd, 0xf5, 0xae, 0x6a, 0xd8, 0x65, 0x93, 0xfd, 0x22, 0xd1, 0x7c, 0xf1, 0xf1, 0x5e, 0xb6, 0x05, 0xec, 0xd9, 0x44, 0xba, 0x64, 0x1e, 0x87, 0x5e, 0xf0, 0x9d, 0x3f, 0xf8, 0x95, 0x31, 0xf8, 0x49, + 0xf8, 0xc2, 0xf6, 0x8f, 0xd3, 0x3e, 0x75, 0x26, 0xe1, 0x41, 0xa0, 0x18, 0x0e, 0x7e, 0x2c, 0xfd, 0xf9, 0x4c, 0x9d, 0xd4, 0x8e, 0xb6, 0x9a, 0x69, 0x68, 0x98, 0x32, 0xe4, 0x32, 0xb1, 0x1e, 0x7b, + 0x33, 0x7e, 0x60, 0xdb, 0x1d, 0x9e, 0xce, 0xb7, 0xc5, 0x82, 0x72, 0xab, 0xa8, 0xa2, 0xa7, 0x38, 0x8d, 0xd0, 0x4b, 0xb6, 0xa4, 0x37, 0x9a, 0x17, 0x66, 0x9c, 0x8e, 0x06, 0xd0, 0xcf, 0x16, 0x25, + 0x78, 0x40, 0x58, 0x3e, 0xa4, 0x58, 0x6b, 0x46, 0xc2, 0x44, 0xcb, 0xc9, 0x08, 0x02, 0x9d, 0x64, 0xbc, 0xb7, 0x85, 0xe6, 0x2a, 0xfc, 0x52, 0xc1, 0xe2, 0xd2, 0xcd, 0x93, 0xca, 0x39, 0x0b, 0x67, + 0x7f, 0x9f, 0x94, 0xc0, 0x27, 0xfa, 0x69, 0xfe, 0x14, 0xc4, 0x16, 0xfa, 0x92, 0xb1, 0xd8, 0xbf, 0xf1, 0xe5, 0xb9, 0xe1, 0xe5, 0xe0, 0xfc, 0xfb, 0x9f, 0x67, 0x1c, 0x0f, 0xe9, 0xa8, 0x72, 0x58, + 0x17, 0xf8, 0x06, 0x55, 0x49, 0x18, 0x3f, 0x6c, 0xd6, 0x1d, 0x3c, 0x9f, 0x53, 0xf8, 0x58, 0xc3, 0x69, 0xc2, 0xad, 0x55, 0x07, 0xdb, 0x4d, 0x47, 0xd1, 0xb2, 0x0b, 0xd8, 0x76, 0xbd, 0x9f, 0x22, + 0x7e, 0x05, 0x2d, 0x64, 0x9d, 0x09, 0xb5, 0xf9, 0x6a, 0x15, 0x06, 0x0a, 0x70, 0x10, 0xf0, 0x66, 0xb6, 0x02, 0x9a, 0x1d, 0x2f, 0x47, 0xe3, 0x19, 0x05, 0x69, 0x7b, 0xac, 0x56, 0x98, 0xbb, 0xda, + 0x85, 0xb9, 0x55, 0x7a, 0xcf, 0xfb, 0xf9, 0x35, 0x3f, 0xde, 0x1b, 0xcd, 0x4b, 0x73, 0x4f, 0x47, 0x7d, 0xbc, 0x77, 0xa7, 0x26, 0x73, 0x4b, 0x59, 0x21, 0x46, 0x87, 0x60, 0x9a, 0x21, 0x7b, 0x44, + 0xe7, 0xac, 0x16, 0x5c, 0x8a, 0x22, 0xbc, 0xf7, 0xe4, 0x7d, 0x8c, 0x70, 0x8c, 0x62, 0x0d, 0x57, 0x4a, 0x57, 0x50, 0xa6, 0x62, 0xfa, 0x51, 0xae, 0x29, 0x8b, 0x5d, 0xb1, 0x0f, 0xe4, 0x8a, 0x10, + 0x87, 0x5a, 0x04, 0x10, 0xc0, 0x68, 0xa7, 0x6b, 0x1a, 0x13, 0xc2, 0x99, 0x9b, 0x0c, 0xb5, 0x8c, 0xa2, 0x56, 0x73, 0x61, 0x3d, 0x64, 0xa4, 0xfb, 0xb4, 0xdc, 0xdc, 0xaa, 0x8a, 0x8b, 0xe7, 0xfa, + 0xd9, 0x64, 0xff, 0x73, 0xfd, 0xfa, 0x8d, 0xe6, 0xb9, 0xc9, 0xe7, 0xa3, 0xbe, 0xa0, 0xec, 0x3b, 0x32, 0x9e, 0x13, 0x84, 0x86, 0xda, 0x06, 0x68, 0x05, 0x93, 0x19, 0x1c, 0x42, 0xe0, 0x6e, 0x05, + 0x2f, 0x92, 0xc2, 0xab, 0x16, 0x7e, 0xb7, 0x75, 0x71, 0x77, 0x5c, 0xcb, 0x7b, 0x7e, 0xae, 0x38, 0x7b, 0xc3, 0x66, 0xea, 0x92, 0x20, 0x71, 0xd9, 0xa9, 0x7c, 0x64, 0x27, 0x2e, 0x69, 0x6b, 0x31, + 0x1a, 0x33, 0x48, 0x84, 0x83, 0x55, 0xd3, 0x69, 0xcb, 0xfd, 0x16, 0xb3, 0xf5, 0x72, 0xd2, 0x6c, 0xbb, 0xe3, 0xfd, 0xc6, 0x62, 0x9b, 0xcf, 0x75, 0xe8, 0x57, 0xc2, 0x3b, 0x4e, 0x04, 0x4f, 0x8d, + 0xb5, 0x4d, 0xe3, 0xac, 0x33, 0xf4, 0xe8, 0xdc, 0x3d, 0xe2, 0x26, 0xb5, 0x79, 0x9c, 0xe9, 0xa2, 0x87, 0xe3, 0xe0, 0x41, 0xf3, 0x35, 0x89, 0x97, 0x03, 0x44, 0x5c, 0x46, 0x40, 0x2b, 0x2c, 0xac, + 0xb5, 0xc9, 0xf3, 0xd5, 0x18, 0xf7, 0x0c, 0x1f, 0xd7, 0x03, 0xec, 0xe8, 0x21, 0x33, 0x82, 0x61, 0xa8, 0xd6, 0x73, 0x8c, 0x98, 0x9e, 0xa5, 0xec, 0x5c, 0x17, 0x3a, 0xc1, 0x70, 0x3a, 0x96, 0xf6, + 0x56, 0x00, 0x11, 0x8b, 0xb9, 0x32, 0x32, 0x54, 0x26, 0xbf, 0xb3, 0xa5, 0x9c, 0xa3, 0x13, 0xbe, 0xc5, 0x98, 0x1d, 0xbd, 0x24, 0xb6, 0x5f, 0xd1, 0x05, 0x07, 0xd7, 0x67, 0x83, 0x51, 0x3f, 0x31, + 0x3d, 0x4f, 0x51, 0x29, 0x81, 0x70, 0xce, 0x30, 0xa3, 0x88, 0xd3, 0x99, 0xda, 0xd1, 0x84, 0x76, 0x2d, 0xb1, 0x39, 0xae, 0x33, 0x7b, 0x69, 0x1f, 0x8c, 0x24, 0x72, 0x9a, 0xc1, 0x33, 0x20, 0x4d, + 0xf5, 0x4d, 0x82, 0x43, 0x80, 0x62, 0x69, 0x74, 0x1b, 0x34, 0x23, 0xda, 0x24, 0x84, 0x95, 0x00, 0x30, 0x34, 0xa6, 0xfb, 0xb1, 0x12, 0x21, 0xfb, 0x6a, 0x55, 0x4d, 0xe4, 0x28, 0xad, 0x94, 0x3a, + 0x9a, 0xc8, 0x77, 0xd3, 0xf9, 0xfc, 0x61, 0x67, 0xdd, 0x0e, 0xf9, 0x57, 0xa7, 0xf4, 0x15, 0xdd, 0xf7, 0xe6, 0x5f, 0xce, 0xfa, 0x4e, 0xed, 0x95, 0xb6, 0x93, 0x66, 0xc5, 0x4e, 0x13, 0x84, 0x8a, + 0x6b, 0x82, 0xb1, 0xe7, 0x27, 0xd4, 0x6a, 0x4e, 0x71, 0x18, 0x68, 0xf1, 0xd8, 0xde, 0xcb, 0xeb, 0x6e, 0x75, 0x08, 0x55, 0x7c, 0x4c, 0xad, 0xbb, 0x21, 0x0d, 0xb8, 0x93, 0xda, 0x1d, 0x8e, 0xb1, + 0x70, 0xc1, 0x00, 0xf1, 0xca, 0x74, 0xf5, 0x99, 0xbd, 0xd0, 0x57, 0x80, 0xb3, 0x65, 0xc6, 0x46, 0x6e, 0x16, 0xa2, 0xb6, 0x2b, 0xa0, 0x19, 0xa0, 0x8e, 0xc5, 0x1e, 0x71, 0xfb, 0x97, 0x65, 0xfc, + 0xf7, 0xdf, 0xd0, 0xf3, 0xf8, 0xde, 0xc2, 0x32, 0xaa, 0xfc, 0x2d, 0xc2, 0xf4, 0xbb, 0xb0, 0xb0, 0xd7, 0x0a, 0x91, 0xde, 0x51, 0x3f, 0x47, 0x44, 0xde, 0x5c, 0xeb, 0x5b, 0x8e, 0x74, 0x3d, 0x52, + 0x41, 0x12, 0x8f, 0x75, 0x51, 0x18, 0x95, 0xe0, 0x12, 0x2c, 0xe6, 0x58, 0xa4, 0x20, 0x53, 0xcd, 0xb0, 0xfd, 0x3d, 0xd3, 0xe4, 0x13, 0x43, 0xf2, 0x46, 0x34, 0xaa, 0x97, 0x1b, 0x11, 0x61, 0x54, + 0x22, 0xb5, 0x61, 0x0e, 0xde, 0x09, 0xb8, 0x4a, 0xce, 0x47, 0xec, 0x08, 0x77, 0xfd, 0xfd, 0x0e, 0x59, 0x1f, 0xdb, 0x1c, 0x6e, 0x45, 0x60, 0x16, 0x8d, 0x5d, 0xb1, 0x9e, 0x06, 0xc7, 0x09, 0x1f, + 0xdd, 0x2d, 0x90, 0x77, 0x41, 0xa1, 0xd7, 0x5c, 0xc0, 0x5f, 0x42, 0x6d, 0xb8, 0x0d, 0x06, 0xc5, 0xfb, 0xe1, 0x34, 0xac, 0x12, 0x8b, 0x61, 0x15, 0x97, 0x98, 0x73, 0xc3, 0xf1, 0x56, 0x04, 0x35, + 0x72, 0x6b, 0x63, 0x2a, 0x83, 0xd6, 0x56, 0x02, 0x52, 0xb8, 0xba, 0x2f, 0x94, 0x5c, 0xa2, 0x30, 0x96, 0x88, 0x3b, 0x32, 0xd6, 0xd1, 0x31, 0xbc, 0xcf, 0xd3, 0xa0, 0x12, 0x80, 0x23, 0x29, 0x4e, + 0x47, 0x8d, 0x3d, 0x1d, 0xa5, 0xd8, 0x7c, 0xb8, 0x34, 0x5c, 0x45, 0x2d, 0x2c, 0xc7, 0x5b, 0x3b, 0x3a, 0x4b, 0x93, 0x43, 0x75, 0xd6, 0x63, 0xd4, 0x5c, 0x03, 0xec, 0xdd, 0xc2, 0xa2, 0x3d, 0x60, + 0xd5, 0xc0, 0xf4, 0x6c, 0xfb, 0xa9, 0x25, 0xec, 0x15, 0x57, 0xc9, 0x15, 0xdd, 0x4f, 0xa6, 0x9d, 0xce, 0xce, 0x00, 0x73, 0x3d, 0x96, 0x1b, 0x46, 0x86, 0x16, 0x2d, 0x38, 0x61, 0x8d, 0x79, 0x37, + 0x26, 0x8c, 0x61, 0x17, 0xa4, 0x73, 0x66, 0x41, 0xd5, 0xcb, 0x4e, 0x6c, 0xc4, 0x44, 0x2f, 0x79, 0x90, 0x30, 0x81, 0xed, 0x3a, 0xa0, 0x4c, 0x02, 0x06, 0xf5, 0xa9, 0xef, 0xac, 0xe6, 0xb9, 0xad, + 0x6b, 0x43, 0x78, 0x9f, 0x5a, 0x45, 0x8e, 0xfb, 0x32, 0x58, 0x12, 0x3b, 0x17, 0xd8, 0xa0, 0x53, 0x99, 0xb4, 0x28, 0x69, 0xa4, 0x5b, 0x80, 0xbf, 0x56, 0x5e, 0xab, 0xf9, 0xf7, 0x25, 0x3e, 0x19, + 0xfd, 0xbf, 0xf8, 0xe4, 0x7f, 0x3d, 0x3e, 0xf9, 0xad, 0x01, 0x45, 0x99, 0xe4, 0xcf, 0xb1, 0xc7, 0x5f, 0xd9, 0xe5, 0xaf, 0x09, 0x7f, 0x32, 0xea, 0x7c, 0xda, 0xb7, 0xc2, 0xc0, 0xd6, 0x50, 0x6b, + 0x86, 0xe7, 0x3b, 0xb2, 0x4e, 0xcc, 0xe9, 0x4c, 0x2a, 0x2c, 0x14, 0x0a, 0x0f, 0x5e, 0x1c, 0xf8, 0x00, 0xeb, 0x88, 0xe3, 0x7a, 0x15, 0x13, 0xcd, 0x66, 0x51, 0xa6, 0xeb, 0x8d, 0xa4, 0x75, 0xae, + 0x01, 0x0c, 0x8b, 0x82, 0x2e, 0x50, 0x74, 0x54, 0x05, 0x61, 0x60, 0xd7, 0xeb, 0x35, 0xeb, 0x2c, 0xc1, 0x43, 0x1d, 0xcd, 0x97, 0x7b, 0x7f, 0xa8, 0x18, 0x35, 0x52, 0xe0, 0xeb, 0xc9, 0x9a, 0x7f, + 0xb0, 0x62, 0xdd, 0xe3, 0x0b, 0x3f, 0x5b, 0xc2, 0xff, 0xdc, 0x61, 0x70, 0x47, 0xfd, 0xcc, 0x8b, 0x9b, 0x6b, 0xe7, 0x25, 0xbc, 0x87, 0x3b, 0xc1, 0x32, 0x37, 0x73, 0x22, 0x1a, 0x73, 0xd3, 0x83, + 0xb0, 0x5f, 0xec, 0x79, 0xce, 0xf2, 0x85, 0xb8, 0x62, 0xdb, 0xd0, 0xca, 0x94, 0x29, 0xa8, 0x4a, 0xa6, 0xb1, 0x25, 0x40, 0xc1, 0x8a, 0x48, 0x30, 0x8a, 0x92, 0xa2, 0x85, 0x91, 0xd4, 0x28, 0x4d, + 0x02, 0x2a, 0x10, 0xb1, 0x83, 0x20, 0x4e, 0x50, 0x8f, 0x79, 0xe2, 0xf0, 0xaa, 0x34, 0x8a, 0xb4, 0x8a, 0x43, 0xc0, 0x2e, 0x5a, 0xc2, 0x7a, 0x1d, 0xde, 0xbb, 0x4c, 0x6e, 0x3c, 0x71, 0xff, 0x9e, + 0xa0, 0x7b, 0x4d, 0xf8, 0xc4, 0x86, 0xab, 0xd3, 0xbe, 0x22, 0x6f, 0x36, 0x92, 0x57, 0x5d, 0x99, 0xcd, 0xa6, 0x0b, 0x6e, 0x1e, 0x30, 0xa6, 0xc7, 0x2f, 0x72, 0x05, 0x86, 0xa2, 0x7a, 0xb9, 0xa9, + 0xe3, 0xb5, 0x3b, 0x44, 0x40, 0x80, 0x49, 0xc6, 0xe1, 0xec, 0x80, 0xea, 0xc8, 0x52, 0x5e, 0x4e, 0x91, 0xb6, 0x65, 0x53, 0x75, 0x66, 0x46, 0xe4, 0xb0, 0xb1, 0xa0, 0xb1, 0x96, 0xec, 0xd1, 0x4d, + 0xc3, 0x76, 0x4c, 0xe6, 0x8c, 0x1a, 0x09, 0xb7, 0xd2, 0x76, 0x5b, 0x43, 0x6a, 0xdd, 0x23, 0x50, 0xe7, 0x87, 0x14, 0x3e, 0xc7, 0x2a, 0x07, 0x5e, 0x5c, 0xe6, 0x5e, 0x5c, 0x78, 0xc6, 0xef, 0x87, + 0xc6, 0xe4, 0xbb, 0x94, 0xe4, 0xd3, 0x33, 0xe4, 0xd3, 0xbd, 0xc1, 0x73, 0x62, 0x2d, 0x1c, 0x58, 0xad, 0xf7, 0x4c, 0x93, 0x7c, 0xad, 0xd0, 0xdc, 0x15, 0xdd, 0x73, 0x0f, 0x7c, 0x9c, 0xf5, 0x2d, + 0x31, 0xb7, 0xdf, 0xb1, 0x43, 0x72, 0x36, 0x21, 0x76, 0xb0, 0xd8, 0x36, 0xea, 0xb2, 0x5d, 0xe8, 0xdb, 0x6d, 0x4e, 0xd7, 0xcb, 0xd8, 0x06, 0xb1, 0x2d, 0xed, 0xb4, 0xaa, 0xc1, 0x11, 0x4d, 0xbb, + 0x21, 0x8e, 0x05, 0x8c, 0xb6, 0x69, 0x8b, 0xb7, 0x3a, 0x83, 0x41, 0xb1, 0x39, 0x0e, 0x5d, 0x21, 0x9f, 0x79, 0xc8, 0x94, 0xaf, 0x66, 0x9b, 0xc4, 0xa2, 0x13, 0x56, 0xc4, 0x9b, 0xd2, 0x95, 0x96, + 0xd9, 0x10, 0x99, 0xfa, 0x7d, 0x32, 0xd3, 0xbf, 0x44, 0xdf, 0x3e, 0x1e, 0x93, 0xaf, 0x94, 0x48, 0xf8, 0x24, 0x7b, 0xe2, 0xc7, 0xc7, 0xc9, 0x39, 0x7f, 0xaf, 0xc7, 0x56, 0xb9, 0xdc, 0xcc, 0x5d, + 0x90, 0x22, 0xca, 0xf4, 0x80, 0xe7, 0x15, 0x41, 0x86, 0x79, 0x18, 0xec, 0x86, 0x54, 0x71, 0x94, 0x4b, 0xd8, 0xd4, 0x1b, 0xc9, 0xdf, 0x1f, 0x9c, 0x8a, 0xc9, 0xa3, 0xb0, 0x9d, 0xe2, 0xa5, 0xd6, + 0xec, 0x23, 0x7a, 0x1c, 0x2e, 0xe0, 0xd5, 0x62, 0xc9, 0x07, 0x32, 0xd5, 0xb2, 0xdb, 0x26, 0x73, 0x9d, 0x62, 0x6a, 0x6d, 0xe7, 0x47, 0x1f, 0xc5, 0xe8, 0xd1, 0x24, 0x9a, 0x3b, 0xeb, 0x48, 0xe8, + 0xe1, 0x2d, 0xd7, 0xca, 0x24, 0xf2, 0x8c, 0x41, 0x11, 0x5a, 0x56, 0xfa, 0x78, 0x48, 0x3e, 0x88, 0x90, 0x7e, 0x3c, 0xd2, 0x2e, 0xb6, 0xcc, 0xc2, 0x8b, 0xbc, 0x50, 0x7b, 0x6b, 0xdd, 0x23, 0xf6, + 0xbe, 0xe6, 0x3b, 0xbe, 0xa3, 0x7e, 0xe2, 0xf2, 0xed, 0xb5, 0xbe, 0x1e, 0x63, 0x30, 0x03, 0x89, 0xf5, 0x70, 0x1c, 0x0e, 0x55, 0x8e, 0x5a, 0xf9, 0x3e, 0x71, 0xb0, 0xf2, 0xc5, 0x98, 0x3d, 0x50, + 0x4b, 0x2e, 0xd0, 0x56, 0x1b, 0x3b, 0xaf, 0x5d, 0x7b, 0x46, 0x04, 0xe0, 0x18, 0x41, 0xbd, 0x61, 0x7c, 0xcc, 0xc3, 0x8d, 0x8f, 0x80, 0x4e, 0x02, 0x47, 0x24, 0xb4, 0x88, 0xf1, 0x98, 0x01, 0x51, + 0x99, 0x96, 0x74, 0x31, 0x81, 0x80, 0xb4, 0xc2, 0x36, 0xf5, 0x64, 0xcb, 0x93, 0x1b, 0x86, 0xbf, 0x57, 0x83, 0x2e, 0x9f, 0x77, 0xae, 0x58, 0xfe, 0x74, 0x2b, 0x78, 0x49, 0x2e, 0xbb, 0x22, 0xfc, + 0xc9, 0x86, 0x4b, 0x65, 0xf4, 0x9e, 0x21, 0x2d, 0xb1, 0x98, 0xcd, 0x47, 0xa4, 0x69, 0x4d, 0x32, 0x52, 0xda, 0xcc, 0xc3, 0x36, 0x83, 0xa9, 0x86, 0x18, 0xb1, 0x71, 0x39, 0x6c, 0x30, 0xae, 0x5e, + 0x72, 0xd9, 0x61, 0xef, 0x05, 0x58, 0x42, 0x91, 0x6a, 0x10, 0xca, 0x4b, 0x61, 0x21, 0x86, 0x99, 0x33, 0x9c, 0x21, 0x5d, 0xbe, 0x85, 0xf9, 0xbd, 0xb6, 0xf5, 0xa9, 0xac, 0xde, 0x37, 0xa6, 0x6d, + 0xa9, 0x78, 0x83, 0x6b, 0x93, 0x9a, 0xa5, 0xf1, 0xca, 0x09, 0x7a, 0x2c, 0x7f, 0xcf, 0x6b, 0xc8, 0xbf, 0xc7, 0xb2, 0x5c, 0x8d, 0xbc, 0x8b, 0x47, 0x58, 0x8b, 0x8b, 0xb3, 0x3f, 0xf9, 0x3b, 0x64, + 0xe5, 0x0b, 0x0b, 0xae, 0x1c, 0x89, 0x65, 0xee, 0x3d, 0x9f, 0xde, 0xc8, 0xcb, 0xe3, 0xef, 0xe6, 0x0d, 0x1f, 0xcc, 0xbf, 0xb9, 0x7e, 0xf6, 0xea, 0xf7, 0x18, 0x87, 0xee, 0x61, 0x12, 0x80, 0x5e, + 0x66, 0xe3, 0x61, 0x0a, 0x81, 0x94, 0xb3, 0x9d, 0xe1, 0xa0, 0x69, 0x8a, 0xf0, 0xe2, 0x50, 0x4a, 0xc2, 0x8a, 0x92, 0xfc, 0xf0, 0x38, 0xf1, 0x8c, 0xfd, 0xc8, 0xcb, 0xa9, 0xbd, 0x39, 0x85, 0x9d, + 0xdc, 0x2f, 0x62, 0x8b, 0x43, 0x30, 0x85, 0xc1, 0x5a, 0x6a, 0xc2, 0x8f, 0xa7, 0xe6, 0xa4, 0x16, 0x09, 0x7b, 0x27, 0x6d, 0xa1, 0xdd, 0x91, 0xe6, 0x5d, 0x10, 0x59, 0x77, 0x00, 0xf9, 0x9a, 0x3d, + 0xfb, 0x1f, 0x78, 0x30, 0xaf, 0x1e, 0xfb, 0xbe, 0xaa, 0x5b, 0xff, 0xae, 0xbb, 0xc4, 0x16, 0xfc, 0x8b, 0x02, 0xc3, 0x93, 0x97, 0x3c, 0xeb, 0x40, 0x2b, 0x36, 0xfb, 0x0a, 0x12, 0x1d, 0xd9, 0x4e, + 0xfc, 0x06, 0x5e, 0x21, 0x28, 0xd5, 0x04, 0xc4, 0xb4, 0xde, 0xa6, 0x46, 0xb7, 0x44, 0x84, 0x45, 0x0e, 0xfb, 0x78, 0xc3, 0xa2, 0xa4, 0x0d, 0x04, 0x58, 0x58, 0x6f, 0x62, 0x89, 0x3f, 0x02, 0xd1, + 0x91, 0x9c, 0x30, 0x47, 0x52, 0x50, 0x56, 0x56, 0x48, 0x07, 0x43, 0x24, 0x10, 0x8f, 0x18, 0x90, 0x85, 0x44, 0xeb, 0xdb, 0x1c, 0x91, 0x28, 0xc7, 0x0e, 0xf5, 0xa9, 0xd5, 0x68, 0xbd, 0x1b, 0xf5, + 0xc8, 0x2c, 0xfe, 0x07, 0x1d, 0xd6, 0xbf, 0x1f, 0x8a, 0x52, 0xcb, 0xbf, 0x43, 0x3b, 0xfa, 0x97, 0x7a, 0xe2, 0xfc, 0x9a, 0x67, 0x7d, 0x71, 0xbe, 0xd9, 0xb7, 0x37, 0x7c, 0x17, 0xb3, 0x48, 0x62, + 0x28, 0x8e, 0xed, 0xba, 0x95, 0x46, 0x50, 0x69, 0x2a, 0x48, 0xbc, 0x51, 0xe3, 0x64, 0x32, 0x02, 0xa3, 0xe5, 0x8c, 0x13, 0x37, 0xd3, 0xb5, 0xdd, 0x10, 0xe5, 0xa8, 0xeb, 0xca, 0x20, 0xd9, 0x15, + 0xec, 0x46, 0x68, 0xeb, 0x05, 0x38, 0x45, 0xc9, 0xac, 0x82, 0x0b, 0x1a, 0x12, 0xcb, 0xc3, 0x02, 0x15, 0x27, 0x90, 0xec, 0x70, 0x52, 0x64, 0x1c, 0x9a, 0xa3, 0xd7, 0x28, 0x95, 0xda, 0x63, 0x5d, + 0xfb, 0xdf, 0xe8, 0x8d, 0x8f, 0xa5, 0xef, 0xd9, 0x2e, 0xfa, 0x82, 0x2e, 0xf5, 0x41, 0xf6, 0x8d, 0xdb, 0x97, 0x93, 0x3e, 0xe5, 0xc4, 0xe1, 0x41, 0x36, 0xb5, 0xd6, 0x8b, 0xaa, 0xd0, 0x1a, 0xc4, + 0x4b, 0x8c, 0xad, 0xa7, 0x2b, 0x30, 0xeb, 0xb5, 0x6b, 0xb9, 0x12, 0x92, 0x9f, 0x8b, 0x2d, 0x9c, 0xdf, 0xf2, 0x5e, 0xd9, 0xf7, 0x06, 0x75, 0xeb, 0x51, 0xcb, 0x6f, 0xc3, 0x80, 0x9e, 0x19, 0x11, + 0x5f, 0xdb, 0x3c, 0x6f, 0xe8, 0x7f, 0xf0, 0xe2, 0xcb, 0xd5, 0x3e, 0xc9, 0x1f, 0xf0, 0x60, 0x35, 0xe3, 0xd5, 0x75, 0x15, 0x2c, 0x9a, 0x28, 0x24, 0xe8, 0x42, 0x98, 0xba, 0x4a, 0x93, 0xe8, 0xf3, + 0xce, 0x49, 0x9d, 0x1e, 0x95, 0x1b, 0x8b, 0x2a, 0xb5, 0x72, 0xcd, 0x79, 0x9e, 0xc7, 0x80, 0xfe, 0x45, 0xbc, 0x22, 0x9b, 0x7f, 0x90, 0xbd, 0xc0, 0xb7, 0xbd, 0x9d, 0x0c, 0xce, 0xd4, 0x7e, 0x9e, + 0x43, 0xcc, 0x72, 0x5d, 0x2e, 0xf9, 0x49, 0x32, 0x5d, 0x70, 0x43, 0x8b, 0xae, 0x31, 0x91, 0x29, 0x03, 0x31, 0x91, 0xf8, 0x12, 0xa5, 0x81, 0x24, 0x83, 0x3a, 0xd4, 0x2c, 0x5a, 0xbe, 0x52, 0x2a, + 0xba, 0xd6, 0x84, 0x5d, 0x5d, 0x6d, 0x09, 0x6b, 0x36, 0xae, 0x96, 0x91, 0xbd, 0x81, 0x3c, 0x45, 0x39, 0xce, 0x27, 0xb0, 0x45, 0xb8, 0xe9, 0x71, 0x82, 0xa9, 0x45, 0xab, 0x57, 0x2b, 0x8c, 0x5e, + 0x68, 0x21, 0x3f, 0x7b, 0x31, 0xae, 0x26, 0x89, 0xd2, 0x24, 0x3e, 0x7d, 0xbb, 0x15, 0x79, 0x65, 0x69, 0xbd, 0x4b, 0xa1, 0x37, 0x8e, 0xd6, 0x8b, 0x0e, 0xec, 0x6b, 0xef, 0x15, 0x7d, 0x6e, 0xa2, + 0xab, 0xaf, 0xc1, 0x3c, 0x6f, 0x6e, 0x5d, 0xc5, 0xb1, 0xdd, 0x27, 0x1a, 0x26, 0x79, 0x34, 0x30, 0xb5, 0x52, 0x7b, 0xa3, 0x8a, 0x7e, 0x85, 0x6e, 0x38, 0xdd, 0xf6, 0xcc, 0x37, 0x3c, 0x86, 0x07, + 0x1f, 0xf5, 0x09, 0x58, 0xff, 0x8e, 0xa0, 0x72, 0x7d, 0xf3, 0x82, 0x02, 0x7f, 0xba, 0x73, 0x83, 0x08, 0x91, 0x5d, 0x7e, 0x81, 0x7d, 0xc1, 0x0c, 0x3b, 0x33, 0x48, 0x3b, 0xbf, 0xec, 0x3a, 0x8e, + 0x1c, 0x39, 0x9b, 0x41, 0xdf, 0xa7, 0xd1, 0x15, 0x7b, 0xff, 0x0f, 0x95, 0xf3, 0xa9, 0x19, 0xeb, 0xa6, 0x71, 0x0f, 0x46, 0xdd, 0xf9, 0xce, 0x9f, 0xa1, 0x72, 0xde, 0x77, 0xce, 0x33, 0x0e, 0x9f, + 0xba, 0xec, 0x35, 0x0e, 0xdf, 0xbc, 0xe3, 0x2d, 0x3c, 0xf1, 0xea, 0xca, 0x39, 0xb1, 0xb9, 0x27, 0xd7, 0xa7, 0xba, 0x9b, 0x10, 0xdc, 0xd0, 0x5f, 0xe8, 0x73, 0xaa, 0x8d, 0xab, 0xd6, 0xc3, 0x93, + 0x21, 0x22, 0xe6, 0xaa, 0x33, 0x03, 0xd5, 0xad, 0x60, 0x14, 0xaa, 0x8f, 0xc5, 0x1b, 0xae, 0xdb, 0x45, 0x81, 0xbb, 0x9c, 0x65, 0xc4, 0x64, 0xbe, 0x28, 0x53, 0xd0, 0xee, 0x30, 0x77, 0xad, 0x56, + 0x6a, 0xb4, 0x02, 0x63, 0xb4, 0x53, 0xc9, 0xfd, 0x78, 0xa7, 0xa7, 0xc3, 0xe3, 0x11, 0x8c, 0x64, 0xc2, 0x8d, 0x94, 0xd5, 0x3f, 0x87, 0x66, 0x3c, 0x87, 0x54, 0x54, 0xa5, 0x17, 0x5e, 0x70, 0xc6, + 0x7e, 0xff, 0x7d, 0xab, 0x8d, 0xbe, 0x35, 0xc8, 0xb5, 0x72, 0xef, 0x2a, 0x3c, 0x14, 0xbd, 0x7b, 0xe2, 0xa3, 0xb2, 0xe7, 0x13, 0x12, 0x4f, 0xb2, 0x0c, 0x2f, 0xe4, 0xee, 0x9e, 0xfe, 0xea, 0xcf, + 0xfb, 0xfd, 0xf7, 0xe8, 0x51, 0x85, 0xab, 0x8b, 0xf0, 0xf2, 0xff, 0x99, 0xd6, 0x49, 0xad, 0xc9, 0xdf, 0x5e, 0xfd, 0xe0, 0xb9, 0x73, 0xf3, 0x4c, 0x2b, 0xcd, 0x2d, 0x43, 0x3b, 0x43, 0x1b, 0x5c, + 0x3e, 0xb1, 0xc7, 0x28, 0x7b, 0xec, 0x56, 0xfc, 0xf5, 0xeb, 0x3e, 0x74, 0xed, 0xb5, 0x0a, 0x64, 0xdf, 0xb9, 0x17, 0x6f, 0xe1, 0x96, 0x7e, 0x3d, 0x1b, 0x59, 0x8c, 0x89, 0xec, 0xd4, 0x31, 0x4b, + 0x07, 0x72, 0xa8, 0xe0, 0x8c, 0xce, 0xb6, 0x76, 0x31, 0x25, 0xc0, 0xb8, 0xe6, 0x82, 0xdd, 0x74, 0x07, 0x33, 0x28, 0x61, 0xc0, 0x85, 0x27, 0x60, 0xeb, 0x15, 0xa6, 0x91, 0xab, 0x2d, 0xc9, 0x47, + 0xf3, 0x31, 0xc1, 0xc4, 0x69, 0x61, 0x48, 0x11, 0xcf, 0x4a, 0xc9, 0x8c, 0x58, 0x8a, 0x8b, 0xbc, 0x24, 0x2a, 0x13, 0x6c, 0x56, 0x65, 0xe2, 0x77, 0xc5, 0x90, 0xc1, 0x00, 0xa7, 0x8f, 0x59, 0xfa, + 0x9a, 0x53, 0xb7, 0x7d, 0xf1, 0x8c, 0x59, 0xf7, 0x3d, 0xd4, 0x9b, 0x59, 0x5f, 0x5e, 0xf1, 0x21, 0xbc, 0xbe, 0x5f, 0x78, 0x80, 0xa7, 0xf6, 0xeb, 0x19, 0xcb, 0x62, 0x50, 0x72, 0xe3, 0x9a, 0xf6, + 0xb0, 0xd9, 0x5c, 0xd7, 0xf7, 0x76, 0xed, 0xe5, 0x09, 0x70, 0x48, 0x7c, 0x6f, 0x76, 0xac, 0x81, 0x82, 0xe0, 0x57, 0xfc, 0x7c, 0x6c, 0x1c, 0xf7, 0xd6, 0xca, 0xde, 0xa5, 0x34, 0xbb, 0x6c, 0x92, + 0xe5, 0x16, 0x72, 0x4b, 0x38, 0x1c, 0x2a, 0xcd, 0x78, 0xa2, 0x7b, 0x44, 0xca, 0x52, 0xb5, 0x35, 0x9d, 0x9a, 0x71, 0x30, 0xef, 0x56, 0xdd, 0x76, 0x05, 0x46, 0xc7, 0x8d, 0xdd, 0x7c, 0xc3, 0xb2, + 0x9e, 0x93, 0xf1, 0xd1, 0xa8, 0xff, 0x23, 0xa8, 0xd4, 0xb3, 0xe8, 0x51, 0x7e, 0x57, 0xe3, 0xf0, 0x95, 0x90, 0xa6, 0x0f, 0xaa, 0xef, 0xc2, 0x4d, 0x79, 0xa9, 0x6a, 0xf8, 0x63, 0x30, 0xd3, 0x89, + 0xd5, 0xf0, 0x98, 0xd2, 0xeb, 0x5c, 0x54, 0x0b, 0x86, 0x42, 0x95, 0xed, 0xe4, 0x90, 0xe9, 0x91, 0x0b, 0x0f, 0x97, 0x90, 0x32, 0xcd, 0xa0, 0x29, 0xb3, 0x98, 0xc8, 0x60, 0x3c, 0x8e, 0xed, 0xc0, + 0xde, 0xb3, 0x31, 0x2e, 0xe5, 0xed, 0x7a, 0x0f, 0x2f, 0xd0, 0x94, 0x57, 0x7c, 0xe9, 0xc8, 0x90, 0x1d, 0x88, 0xab, 0x3b, 0x64, 0x4f, 0x9a, 0x87, 0xac, 0xcb, 0x02, 0x64, 0x25, 0x36, 0x6d, 0xa8, + 0x43, 0xa4, 0x59, 0xbd, 0xa6, 0x71, 0xdf, 0xca, 0x07, 0x5f, 0x14, 0x86, 0x2f, 0x92, 0xe1, 0x49, 0x36, 0x21, 0x9e, 0x6a, 0x0a, 0xcf, 0x20, 0x81, 0xbf, 0xfa, 0x4b, 0x5f, 0x01, 0x07, 0xf8, 0x09, + 0x0a, 0x18, 0xef, 0x07, 0x08, 0x90, 0xa5, 0x13, 0xaa, 0xde, 0x84, 0x64, 0x51, 0x56, 0xe2, 0xbc, 0xb6, 0xb8, 0x22, 0xc6, 0xe7, 0xb1, 0xc1, 0x6e, 0xea, 0x7a, 0x04, 0xc1, 0xd9, 0x42, 0x33, 0xb8, + 0xe3, 0x3a, 0x14, 0x41, 0x60, 0xd9, 0xb4, 0x06, 0x09, 0x40, 0x19, 0xd2, 0x2c, 0xbb, 0x7a, 0x48, 0xdb, 0x75, 0x49, 0x40, 0x20, 0xbd, 0x8a, 0x91, 0x34, 0x13, 0xc7, 0x05, 0x6b, 0xd2, 0x5e, 0xe2, + 0xc8, 0xcc, 0x86, 0x04, 0xc4, 0xba, 0xd9, 0xf4, 0xd0, 0xc9, 0xbe, 0xe0, 0xfc, 0x7e, 0x63, 0x3c, 0x2a, 0xb5, 0xf4, 0x99, 0xc7, 0x6a, 0xf4, 0x52, 0x94, 0xd5, 0x89, 0x20, 0x38, 0x38, 0xff, 0x3b, + 0x07, 0x66, 0xf4, 0x18, 0x97, 0x4e, 0x2e, 0xe7, 0xc7, 0xd5, 0x04, 0x0e, 0x3b, 0x24, 0xe8, 0xb6, 0x3c, 0x67, 0x66, 0xad, 0x3b, 0x62, 0xbc, 0x65, 0xaa, 0x43, 0xe3, 0x54, 0x30, 0xca, 0x49, 0x65, + 0x19, 0xdb, 0x31, 0x94, 0x16, 0x73, 0x79, 0xc8, 0x54, 0x50, 0x6c, 0x00, 0x55, 0x7b, 0xd8, 0x0c, 0x5b, 0xce, 0xdf, 0xba, 0xe0, 0x70, 0x62, 0xaf, 0xc3, 0xf9, 0xf0, 0xe8, 0xd6, 0x5b, 0x1e, 0x01, + 0xa7, 0x72, 0x34, 0x97, 0x53, 0xac, 0x06, 0xab, 0x17, 0x65, 0xee, 0x9f, 0x54, 0xd9, 0x2f, 0xc5, 0x1e, 0x91, 0xdb, 0x92, 0xfc, 0x17, 0x55, 0xf7, 0x89, 0x7b, 0xc3, 0x4c, 0xca, 0x0b, 0x7c, 0xfe, + 0xf9, 0x36, 0x74, 0x3b, 0xea, 0xed, 0x24, 0x1f, 0x7c, 0x14, 0xfb, 0x87, 0xfe, 0x42, 0xbf, 0x1a, 0x97, 0x9c, 0x30, 0x39, 0x17, 0x8d, 0xf9, 0x2f, 0xfe, 0x17, 0xfc, 0x15, 0x92, 0xdf, 0xd5, 0x3e, + 0x43, 0x09, 0xbf, 0xfc, 0xe4, 0x5a, 0x52, 0x38, 0x7f, 0xea, 0x17, 0x0c, 0x7e, 0xaf, 0xb8, 0x52, 0x49, 0xef, 0xa6, 0xe0, 0x5d, 0xb6, 0xca, 0x97, 0x66, 0x3e, 0xf5, 0xc2, 0x3c, 0x78, 0xe6, 0x73, + 0x8e, 0x3f, 0x20, 0xf1, 0x09, 0x72, 0x79, 0x41, 0xd9, 0xff, 0xf2, 0x0d, 0x6f, 0x03, 0xee, 0xe3, 0xf3, 0xef, 0x22, 0x6f, 0x2f, 0xcf, 0xbc, 0x05, 0x49, 0x9e, 0x78, 0xf6, 0xc0, 0x84, 0xfa, 0xc8, + 0x30, 0x7a, 0x69, 0xd1, 0x17, 0x6e, 0x5c, 0x85, 0x24, 0x9e, 0x15, 0x8b, 0x27, 0x31, 0xdf, 0x9f, 0x99, 0xe6, 0x8f, 0x26, 0x0c, 0xf4, 0x92, 0x41, 0xfb, 0x8d, 0xe6, 0x69, 0xce, 0x5c, 0x8e, 0x06, + 0xd0, 0xcf, 0x66, 0x6c, 0x78, 0xb0, 0xf4, 0xbb, 0xae, 0x19, 0x61, 0x81, 0x64, 0xed, 0xcd, 0x79, 0x74, 0x54, 0xa7, 0x1b, 0xab, 0x38, 0x72, 0x1b, 0xc5, 0x99, 0x4c, 0x7f, 0x5c, 0x1c, 0x74, 0x2f, + 0x2e, 0x73, 0xeb, 0x62, 0x88, 0x81, 0x9f, 0x67, 0x18, 0x95, 0x56, 0x1e, 0x0d, 0x0a, 0xef, 0xf8, 0x3c, 0x1c, 0xe7, 0x95, 0x38, 0xae, 0x0f, 0xaa, 0xa7, 0x16, 0xbf, 0x1f, 0x0f, 0x90, 0x7e, 0x31, + 0x5c, 0x0d, 0x07, 0x6d, 0xbc, 0xa1, 0x2d, 0x32, 0x7e, 0x0d, 0xca, 0xab, 0x8e, 0x90, 0xc6, 0x73, 0x75, 0xe2, 0x86, 0xc4, 0x84, 0xc7, 0x2b, 0xde, 0x18, 0xed, 0xf9, 0x25, 0x2e, 0x65, 0xde, 0x1a, + 0x3a, 0x32, 0x38, 0xc0, 0x8e, 0xf6, 0x39, 0xb0, 0xe1, 0xd7, 0x74, 0x32, 0xd7, 0x90, 0x89, 0xb0, 0xc5, 0xb8, 0xf9, 0x2e, 0xde, 0x32, 0x0b, 0x79, 0x8e, 0x0e, 0x77, 0x34, 0x1f, 0xac, 0x8e, 0xd4, + 0xae, 0xd3, 0xd2, 0xb1, 0xda, 0x07, 0x6c, 0xe2, 0x73, 0x80, 0x3c, 0xe6, 0x04, 0xfa, 0x82, 0x57, 0xfb, 0x8d, 0xe6, 0x89, 0x0f, 0x97, 0xa3, 0xb3, 0x12, 0xf3, 0x83, 0x07, 0x1b, 0x1e, 0xd0, 0xe6, + 0x96, 0x05, 0xb1, 0x8c, 0x10, 0xe4, 0xd0, 0x29, 0x74, 0x23, 0x98, 0xee, 0x61, 0x80, 0x4e, 0x34, 0x6f, 0x68, 0xef, 0x7a, 0xb4, 0xc3, 0x8b, 0xac, 0x6f, 0xc3, 0xfd, 0x5f, 0xab, 0x5c, 0xf9, 0x49, + 0xf6, 0xd4, 0x9a, 0x8f, 0x93, 0xbe, 0xb5, 0x2b, 0x1b, 0xde, 0x28, 0xf3, 0x03, 0x8d, 0xcc, 0x55, 0x75, 0x59, 0x2d, 0x42, 0xc3, 0x0d, 0x83, 0x29, 0x62, 0xda, 0x32, 0xeb, 0xe2, 0x2c, 0xc2, 0xd1, + 0x0b, 0x92, 0x6e, 0x42, 0x00, 0xd1, 0xf4, 0x95, 0xe2, 0x40, 0x51, 0xd1, 0xac, 0xe7, 0xb6, 0x48, 0x75, 0xeb, 0x03, 0xea, 0xb3, 0x0e, 0x9c, 0x2a, 0xa3, 0xbd, 0x5d, 0x96, 0xd2, 0x42, 0x50, 0x2b, + 0xce, 0x90, 0x93, 0x31, 0x3a, 0x63, 0xba, 0x74, 0x1f, 0x84, 0x77, 0x91, 0x89, 0xa5, 0x17, 0x77, 0x83, 0x30, 0xaf, 0x9e, 0xca, 0x09, 0xd0, 0xd5, 0xca, 0xda, 0xbf, 0xe5, 0x17, 0xa2, 0xe7, 0x76, + 0x5f, 0x0e, 0x07, 0x67, 0x4a, 0x3f, 0xb7, 0xfa, 0x28, 0x28, 0x22, 0xc4, 0xd5, 0x4e, 0x3c, 0xca, 0xe5, 0xe3, 0x21, 0x5d, 0x42, 0x1d, 0xba, 0x91, 0x20, 0xb2, 0xe0, 0x39, 0x0c, 0xb7, 0x18, 0x6d, + 0xed, 0x93, 0x04, 0x34, 0xf2, 0x43, 0x8e, 0x64, 0xb0, 0x54, 0xd2, 0x4c, 0x3b, 0xf7, 0xb6, 0xc6, 0xf1, 0xb8, 0x9c, 0xcf, 0x64, 0x0d, 0x6c, 0x8d, 0xc3, 0x30, 0x5a, 0x6c, 0xec, 0x28, 0x1c, 0x93, + 0xf3, 0x6e, 0x0d, 0x02, 0x92, 0xb3, 0x84, 0xf6, 0x70, 0x95, 0xdc, 0x45, 0x9e, 0x96, 0xc9, 0xe0, 0xb9, 0x86, 0x7e, 0x6b, 0xd3, 0x7e, 0xa1, 0xe7, 0xef, 0xc8, 0x9f, 0x38, 0x71, 0x77, 0xf1, 0x41, + 0x85, 0xdf, 0x87, 0x3c, 0x59, 0x64, 0xc8, 0x48, 0x1e, 0x97, 0xd8, 0x91, 0x1e, 0xc5, 0xe9, 0xca, 0x0d, 0x97, 0x7b, 0x99, 0x99, 0x09, 0x28, 0xe8, 0x74, 0x1b, 0x04, 0xcc, 0x44, 0xda, 0xe0, 0x04, + 0xa1, 0xdb, 0xf2, 0xe6, 0xb0, 0xd6, 0x23, 0x94, 0x9c, 0xef, 0x34, 0xd1, 0xa3, 0xf8, 0xe1, 0x8a, 0xcf, 0x20, 0x8b, 0xdf, 0x4f, 0xc0, 0x6d, 0xd0, 0x1e, 0x01, 0xd5, 0x37, 0x0b, 0x63, 0x34, 0x72, + 0xc8, 0xae, 0x3b, 0x02, 0x4a, 0x06, 0x41, 0x7d, 0xca, 0x8a, 0x9d, 0x3f, 0xd9, 0xb1, 0xda, 0x41, 0xae, 0xc5, 0xce, 0x73, 0x91, 0xe8, 0x15, 0xab, 0xeb, 0x57, 0xd2, 0xef, 0xec, 0xf9, 0xb8, 0x30, + 0x18, 0xfd, 0x6c, 0x6b, 0x3d, 0xb1, 0x06, 0x1b, 0xad, 0x70, 0xef, 0x88, 0xc9, 0xa3, 0x6e, 0x9a, 0xc3, 0x46, 0x63, 0x38, 0xf5, 0xba, 0xd5, 0xf5, 0x45, 0x83, 0xef, 0x02, 0xd4, 0x11, 0xbb, 0x91, + 0xb9, 0x30, 0x4b, 0x75, 0x98, 0xd3, 0xb5, 0xb5, 0xcc, 0xdc, 0xdc, 0x64, 0x57, 0xc0, 0xd2, 0x03, 0xe7, 0x2d, 0x56, 0x76, 0x1c, 0x24, 0x4c, 0x75, 0x00, 0x61, 0x26, 0x5d, 0x6c, 0x4d, 0x78, 0xd6, + 0x63, 0xb2, 0x9c, 0xa2, 0x27, 0x92, 0x10, 0x10, 0xc5, 0x6b, 0xe2, 0xbb, 0x57, 0x0c, 0xe2, 0x2a, 0xd2, 0xdf, 0x36, 0x5e, 0xfc, 0x1b, 0xf1, 0xf2, 0xad, 0x10, 0xcf, 0x63, 0xfb, 0xee, 0x2b, 0xf9, + 0x51, 0x67, 0x8a, 0x67, 0x1e, 0x56, 0xe7, 0x02, 0x6d, 0x3f, 0x66, 0x45, 0x9d, 0x58, 0x77, 0x18, 0xb7, 0xc4, 0xae, 0x1b, 0x6d, 0x97, 0xa5, 0x28, 0x6d, 0xca, 0x45, 0x06, 0xf0, 0x10, 0x0a, 0x16, + 0x1c, 0x9d, 0xcb, 0x93, 0xe5, 0xbc, 0x6d, 0x68, 0x23, 0xab, 0xa4, 0x15, 0x62, 0x0c, 0xd1, 0xa5, 0x05, 0xa1, 0x20, 0x59, 0x58, 0xb9, 0xbf, 0x1e, 0x2f, 0x8e, 0xa5, 0xbf, 0x39, 0x62, 0xb3, 0x80, + 0xb5, 0x8e, 0x24, 0x0d, 0xba, 0xa1, 0xd5, 0x51, 0xf2, 0x76, 0xcc, 0x2c, 0x9b, 0x46, 0xdd, 0x35, 0x64, 0xf8, 0x9a, 0x84, 0xf9, 0x56, 0x42, 0xe3, 0xcd, 0xee, 0xf1, 0x8c, 0x6d, 0x5d, 0x6a, 0x0d, + 0xec, 0xef, 0x24, 0x0d, 0xe2, 0x95, 0x71, 0xf8, 0x4e, 0xf5, 0xc4, 0xbe, 0xf7, 0xe3, 0xc1, 0x99, 0xd6, 0xcf, 0x2c, 0x1c, 0x9a, 0xfa, 0x71, 0x71, 0xcc, 0x6a, 0xbf, 0x74, 0x3c, 0x7e, 0x94, 0x37, + 0x70, 0x30, 0xca, 0xa7, 0xf3, 0x72, 0x4c, 0x09, 0x5c, 0x64, 0x56, 0xa6, 0xcb, 0x74, 0xe3, 0xa9, 0xe6, 0x0b, 0x10, 0x6c, 0x4f, 0x3b, 0x57, 0xa3, 0x16, 0x6e, 0x91, 0x70, 0x42, 0x87, 0x75, 0x38, + 0xb0, 0x10, 0x48, 0x74, 0x61, 0xa7, 0xb3, 0xb2, 0x51, 0x48, 0x2f, 0xf3, 0xf0, 0x80, 0x06, 0xda, 0x86, 0x73, 0xd7, 0x85, 0xc0, 0xf6, 0x09, 0x59, 0x39, 0x7d, 0xa9, 0x79, 0xb6, 0x68, 0x0d, 0xca, + 0xe4, 0xfb, 0xc0, 0x72, 0xf4, 0x25, 0x18, 0xfe, 0x47, 0x2f, 0x78, 0xe3, 0xd0, 0xed, 0xe5, 0xf3, 0x78, 0xeb, 0x11, 0x35, 0x7b, 0x34, 0x2b, 0x42, 0xe6, 0x85, 0x29, 0x6d, 0xa5, 0x1c, 0xb7, 0x01, + 0x64, 0x45, 0x94, 0xa9, 0xfd, 0xaa, 0x3c, 0x54, 0x1e, 0x14, 0x76, 0x90, 0x50, 0x26, 0xee, 0xae, 0x30, 0x1a, 0x60, 0x17, 0x69, 0x73, 0x8f, 0x3a, 0x6c, 0x09, 0x37, 0xdf, 0xc3, 0x79, 0x0e, 0x82, + 0x73, 0x6c, 0x0f, 0x40, 0x74, 0xcd, 0xa2, 0xe2, 0x1a, 0x26, 0x25, 0x12, 0x27, 0x79, 0x28, 0xd4, 0x96, 0xb6, 0x4c, 0xe4, 0x11, 0x81, 0xbc, 0x3c, 0x55, 0x3f, 0x5b, 0xf2, 0xfb, 0x3f, 0xdf, 0xe7, + 0x1c, 0x55, 0xb1, 0x9e, 0xb4, 0x83, 0x34, 0xf7, 0x22, 0xaf, 0xf4, 0x9e, 0xa6, 0xc1, 0xc1, 0x2f, 0xad, 0x82, 0x37, 0xb4, 0xc1, 0xc1, 0xed, 0x95, 0x3e, 0xc0, 0xa3, 0x27, 0xe6, 0x96, 0xea, 0x0e, + 0x44, 0x85, 0x8c, 0x43, 0x4d, 0x6a, 0xe4, 0xa4, 0x53, 0x98, 0x2b, 0x3b, 0x8f, 0xdd, 0xe5, 0xd3, 0x31, 0x14, 0xb6, 0x31, 0x13, 0xf0, 0xb3, 0x79, 0x5a, 0xb2, 0x78, 0x86, 0x59, 0x8d, 0xa9, 0x12, + 0x05, 0x8c, 0xac, 0x73, 0x91, 0x6e, 0x04, 0xdd, 0x5d, 0xb0, 0x52, 0x19, 0xb1, 0x81, 0x09, 0xaf, 0x69, 0x59, 0x83, 0x85, 0x0d, 0x45, 0x68, 0x33, 0x84, 0x82, 0x8f, 0x01, 0xa8, 0xa4, 0x5d, 0x0f, + 0x95, 0xda, 0xae, 0xe2, 0x0b, 0xec, 0xf6, 0x95, 0x7e, 0x78, 0xe3, 0xd9, 0x38, 0x69, 0xdd, 0xba, 0xe7, 0x78, 0x6f, 0xe9, 0xfb, 0xf7, 0xe8, 0xf2, 0x8f, 0xe0, 0xe7, 0xbf, 0x28, 0x3d, 0x8d, 0xeb, + 0x19, 0xee, 0x40, 0x4f, 0x5a, 0xcb, 0xfc, 0xd2, 0x0f, 0xbf, 0xbf, 0x43, 0x4a, 0xbc, 0xae, 0x69, 0xf6, 0x58, 0x3c, 0x7d, 0x25, 0xca, 0xed, 0x83, 0xea, 0xb9, 0xab, 0xde, 0x8e, 0xfb, 0x82, 0xa1, + 0xc5, 0xb9, 0xac, 0x36, 0x8d, 0x9c, 0xd3, 0xe0, 0x16, 0x64, 0x65, 0xab, 0x73, 0xd8, 0xcc, 0x9c, 0x88, 0x98, 0xa0, 0xaa, 0xf0, 0x12, 0xc3, 0xe6, 0x79, 0xcb, 0x83, 0x2a, 0x1e, 0x2d, 0x32, 0x24, + 0x59, 0x69, 0x71, 0x22, 0x40, 0x33, 0x38, 0x5e, 0xb6, 0x68, 0xd8, 0xb0, 0x7c, 0x85, 0x51, 0x0d, 0xab, 0x60, 0xa4, 0x6b, 0x7a, 0xad, 0x36, 0x5b, 0x8b, 0x55, 0xa2, 0x14, 0xbc, 0x3f, 0x1d, 0x81, + 0x13, 0xe4, 0xb5, 0x15, 0xf7, 0xd3, 0x03, 0x86, 0xfc, 0x29, 0x38, 0xf3, 0x4f, 0x2e, 0x23, 0xe4, 0x2f, 0xec, 0x2f, 0xf2, 0xaa, 0xfb, 0xfa, 0x33, 0xf7, 0xab, 0xcb, 0xe8, 0x4c, 0xa7, 0x9f, 0xbd, + 0x54, 0x9f, 0xe0, 0xd3, 0x30, 0x37, 0x59, 0x8d, 0x8d, 0x57, 0x3a, 0xb5, 0x02, 0xe0, 0x69, 0x52, 0x2a, 0x75, 0xa6, 0x16, 0x3a, 0x6a, 0x19, 0xe1, 0xa8, 0xf1, 0xb0, 0xb1, 0xed, 0x61, 0x63, 0x76, + 0xbb, 0x33, 0x84, 0xa4, 0x49, 0x31, 0xa3, 0x2e, 0x52, 0x07, 0xf2, 0xe5, 0x63, 0xbc, 0xd9, 0x72, 0xb4, 0x1f, 0x81, 0x53, 0x9c, 0x32, 0x9d, 0xd9, 0x78, 0x6f, 0x51, 0xab, 0x3d, 0x2f, 0x18, 0x1c, + 0x53, 0xcc, 0x79, 0xea, 0x1f, 0xdb, 0x4b, 0x2f, 0x2e, 0xa3, 0x2f, 0x88, 0x3c, 0xbf, 0x9e, 0xda, 0xf2, 0xa3, 0x5b, 0x02, 0xb7, 0x83, 0xf5, 0xb5, 0x78, 0xf2, 0xcf, 0x3a, 0x9c, 0x3d, 0xab, 0xb6, + 0xed, 0x1d, 0xaf, 0xca, 0xed, 0x86, 0xaa, 0xa3, 0x26, 0xa5, 0x4c, 0xd2, 0x8e, 0x98, 0xd9, 0xd0, 0xb7, 0xe8, 0x7d, 0x48, 0x38, 0x3d, 0x4c, 0xee, 0x4f, 0xa6, 0xa2, 0x97, 0x55, 0xd6, 0xcf, 0x19, + 0xd5, 0x7f, 0x2e, 0xf8, 0x7c, 0xa1, 0x7c, 0x9e, 0x92, 0x57, 0xe7, 0x7d, 0x93, 0x80, 0x2a, 0x41, 0xb3, 0xbc, 0x7c, 0xba, 0xaa, 0x53, 0xf5, 0x20, 0x39, 0xc7, 0xa6, 0x58, 0x31, 0xe5, 0x0e, 0x39, + 0xee, 0xa5, 0x6d, 0x1e, 0x83, 0xc4, 0x72, 0x94, 0x81, 0x0b, 0xab, 0x55, 0xa3, 0x39, 0x64, 0xcd, 0x31, 0x89, 0xc2, 0xd1, 0x49, 0x44, 0x51, 0xa3, 0xdd, 0x90, 0x69, 0xc4, 0xcd, 0xb6, 0x5d, 0x53, + 0x6a, 0x41, 0x8e, 0xb6, 0x94, 0xbc, 0x14, 0x32, 0x6b, 0x99, 0xac, 0x56, 0x82, 0x38, 0x72, 0x54, 0xfb, 0xf0, 0x5a, 0x52, 0x82, 0x91, 0x77, 0xe9, 0x49, 0x10, 0xd6, 0x62, 0xf3, 0x3a, 0x05, 0xfd, + 0x5b, 0x58, 0xa7, 0xfb, 0xea, 0x8c, 0x8f, 0x4d, 0xeb, 0xf0, 0x2b, 0xcb, 0xdd, 0x57, 0xda, 0x27, 0x0e, 0x7f, 0xbd, 0x72, 0x2e, 0x90, 0xd2, 0x63, 0xe9, 0x53, 0x42, 0x13, 0x53, 0xa1, 0x4d, 0x37, + 0x51, 0x98, 0x31, 0x66, 0x04, 0x0b, 0xdf, 0xb6, 0x19, 0x51, 0x12, 0xa3, 0xb9, 0xec, 0xc3, 0x0e, 0x6f, 0x4d, 0x71, 0x6d, 0x23, 0x1e, 0x87, 0x3c, 0x03, 0xc8, 0x7c, 0x10, 0x79, 0xed, 0x58, 0x1e, + 0xfa, 0xbb, 0xd8, 0xc9, 0x19, 0x59, 0x50, 0x8e, 0x78, 0xb3, 0xe2, 0xc6, 0x51, 0x99, 0xd0, 0x43, 0x3e, 0x1e, 0x6b, 0x08, 0x15, 0x57, 0xf8, 0x46, 0xe2, 0xdc, 0x12, 0x7c, 0x6d, 0xe9, 0x3b, 0xed, + 0x23, 0xef, 0xd6, 0xb5, 0xdb, 0xb0, 0x01, 0x57, 0x0b, 0x83, 0xdf, 0xff, 0x79, 0xe4, 0xfb, 0x37, 0x92, 0xd8, 0xf6, 0x9c, 0xf7, 0x64, 0x86, 0x0b, 0xde, 0xfd, 0xdd, 0x2e, 0xd6, 0x69, 0x79, 0xfc, + 0xfb, 0x3f, 0x8f, 0x22, 0x0e, 0xbc, 0x28, 0x4d, 0xf2, 0x72, 0x10, 0x6a, 0xc7, 0xee, 0xc9, 0x03, 0xc5, 0xc0, 0xf0, 0xae, 0xba, 0xfa, 0xeb, 0x2d, 0x2f, 0x2e, 0x4a, 0x2d, 0x0c, 0x2d, 0x73, 0xe0, + 0x84, 0x89, 0xae, 0x85, 0xe1, 0x85, 0x0a, 0x74, 0x1b, 0x82, 0x70, 0xd2, 0x41, 0xd2, 0xe8, 0xad, 0x71, 0xf7, 0x64, 0x4e, 0xdf, 0xf7, 0x46, 0xe1, 0xe3, 0xf7, 0x5f, 0x9e, 0x09, 0xb5, 0xb3, 0xef, + 0xe4, 0x6a, 0xdc, 0xdc, 0x03, 0xfb, 0xbf, 0x01, 0xb0, 0x5d, 0x3e, 0xf4, 0xcb, 0xdb, 0xbf, 0xa6, 0x1d, 0x5d, 0x82, 0x2b, 0xbe, 0x3c, 0xd0, 0x9a, 0xce, 0x40, 0xd7, 0x0a, 0xcb, 0xf4, 0xf2, 0xab, + 0x6f, 0x7c, 0x1f, 0xd5, 0x3d, 0xf6, 0x9e, 0xf7, 0x0e, 0x7a, 0xb6, 0x4e, 0xbe, 0x5e, 0xe9, 0xf2, 0x4c, 0x19, 0x1c, 0x5c, 0xfe, 0xf7, 0xad, 0x71, 0x79, 0xd6, 0x01, 0x68, 0x74, 0x8c, 0x1d, 0xec, + 0x21, 0xcc, 0x89, 0xca, 0x66, 0x66, 0x16, 0xc7, 0x88, 0xce, 0xf8, 0x09, 0x93, 0x8d, 0xf6, 0x7b, 0xb0, 0xe2, 0xa9, 0x31, 0x82, 0xa3, 0xec, 0x62, 0x19, 0x89, 0x00, 0xea, 0x53, 0xa1, 0x4b, 0xc8, + 0xc3, 0x8c, 0x2e, 0xcd, 0xd2, 0x99, 0x6c, 0x50, 0xbb, 0x2d, 0xf5, 0xe5, 0x94, 0x3f, 0x4a, 0x2d, 0x82, 0xac, 0x4d, 0x37, 0xa6, 0x0d, 0xb6, 0xae, 0x90, 0x0a, 0xb6, 0xf7, 0xff, 0x82, 0xaf, 0xee, + 0x1c, 0x5f, 0x55, 0x94, 0x5d, 0xf8, 0x16, 0x5a, 0x36, 0xbc, 0x19, 0x70, 0xe7, 0x87, 0x1e, 0x94, 0x8d, 0xc5, 0xff, 0xd4, 0xa7, 0x57, 0xe5, 0xde, 0xc0, 0x2f, 0x9e, 0xae, 0x3a, 0xaf, 0x44, 0xce, + 0x5f, 0x48, 0x9e, 0x16, 0x9b, 0xf3, 0xc1, 0x60, 0xd8, 0x2f, 0x62, 0x1e, 0xcf, 0xb9, 0x5d, 0xd7, 0xa1, 0xe8, 0x1a, 0xee, 0x0c, 0x92, 0x48, 0xd7, 0x30, 0x4d, 0x45, 0xcb, 0xb2, 0x91, 0x61, 0x88, + 0x9c, 0xe1, 0xdb, 0x85, 0x7d, 0x08, 0x0f, 0xb0, 0x62, 0x26, 0xc4, 0x21, 0x84, 0x3d, 0x0f, 0x96, 0xac, 0xb9, 0x67, 0x59, 0x2e, 0x34, 0x9f, 0xdb, 0x2b, 0x6b, 0x89, 0xd8, 0xbc, 0xcc, 0x61, 0x47, + 0xa8, 0x20, 0x2c, 0x83, 0x2b, 0x48, 0x3b, 0x9f, 0x54, 0x4b, 0xb6, 0x8e, 0xcd, 0x71, 0x8f, 0x88, 0xf9, 0x2b, 0x1c, 0xc6, 0xf7, 0x89, 0xfd, 0x84, 0x53, 0xe1, 0x5b, 0x5e, 0x65, 0xa8, 0xb5, 0x4f, + 0xb5, 0xb5, 0x97, 0xb6, 0xc1, 0x6b, 0xca, 0x67, 0xbe, 0x5d, 0x9d, 0xf7, 0x01, 0xc8, 0x84, 0x07, 0xb3, 0x5c, 0xe6, 0x40, 0xca, 0xd6, 0x87, 0x88, 0x59, 0x30, 0x6d, 0xa4, 0xce, 0x50, 0xc7, 0x87, + 0x43, 0x0a, 0xeb, 0x9a, 0xe6, 0x95, 0x45, 0xf6, 0x06, 0x8d, 0xfb, 0xfb, 0x0d, 0xac, 0xf4, 0x9e, 0x65, 0x03, 0x41, 0x7f, 0xc1, 0xaf, 0xc4, 0x66, 0x9f, 0x28, 0x9e, 0xd8, 0x50, 0x7a, 0xe1, 0xe0, + 0x42, 0xe2, 0xe7, 0xd1, 0xa3, 0xb7, 0x2a, 0x99, 0x95, 0x52, 0xc8, 0xec, 0x0e, 0x92, 0xd8, 0x91, 0x6b, 0x8d, 0x94, 0x9d, 0x00, 0x86, 0x03, 0xa9, 0x08, 0xd3, 0x4a, 0x6d, 0xb4, 0x76, 0xe2, 0x0c, + 0x0b, 0x61, 0x41, 0xfb, 0xd8, 0x6c, 0x59, 0x19, 0xb4, 0xa6, 0x23, 0x6c, 0x1b, 0xcf, 0x9b, 0x4e, 0xd8, 0x4e, 0xd2, 0x39, 0x5f, 0x72, 0x30, 0xef, 0x27, 0x6b, 0xef, 0xb0, 0xc6, 0x68, 0x6f, 0xc7, + 0xab, 0x8a, 0x2e, 0xe5, 0x22, 0x20, 0xf5, 0xd0, 0xa0, 0xee, 0x3c, 0x52, 0xe8, 0xcd, 0xa2, 0xad, 0xe5, 0x4e, 0xf5, 0x01, 0x7e, 0xf6, 0x5f, 0xf8, 0x81, 0xcf, 0xca, 0xb1, 0x62, 0x2b, 0xd7, 0xca, + 0x24, 0x1f, 0xbc, 0xab, 0x63, 0x1f, 0x8f, 0xe2, 0x37, 0x8f, 0x9e, 0xd5, 0xde, 0xc1, 0xb5, 0xde, 0x7b, 0x13, 0xb0, 0x7d, 0xe3, 0xe3, 0xff, 0xef, 0x6d, 0xf0, 0xc8, 0x9b, 0x32, 0xf6, 0x88, 0xce, + 0x33, 0x45, 0xec, 0x36, 0xbc, 0xe5, 0x99, 0xfa, 0xfc, 0xe7, 0x7e, 0xd5, 0xaf, 0xa4, 0xdf, 0x7b, 0xfc, 0xe3, 0x42, 0x3f, 0x40, 0x93, 0xcd, 0x1a, 0x16, 0x3a, 0x3b, 0x6d, 0xd0, 0x98, 0x8f, 0x95, + 0xba, 0x96, 0x60, 0x8e, 0x63, 0x9d, 0x1d, 0xa3, 0xd1, 0x7c, 0x8f, 0xaa, 0x1d, 0x55, 0xe5, 0x99, 0x4f, 0x9a, 0x44, 0xfc, 0x85, 0xbe, 0xd2, 0xa4, 0xca, 0x33, 0x4f, 0x0d, 0xa9, 0x3c, 0x73, 0x70, + 0xa6, 0xf0, 0xf3, 0xc8, 0x05, 0x04, 0xa5, 0x40, 0xd6, 0x16, 0x7f, 0xe8, 0x00, 0xe6, 0x30, 0x13, 0xa7, 0x11, 0xd9, 0xc6, 0x31, 0x36, 0x9f, 0xd0, 0x29, 0x14, 0xe2, 0xeb, 0x31, 0x8d, 0x47, 0x21, + 0x71, 0x5c, 0xee, 0x22, 0x16, 0x20, 0xd1, 0xf5, 0x48, 0x98, 0x41, 0x42, 0x62, 0x4c, 0xf3, 0xb8, 0x09, 0xb6, 0x81, 0xbc, 0x9f, 0x09, 0x9e, 0x8c, 0x82, 0x76, 0x3a, 0xc1, 0x34, 0x5b, 0x22, 0x68, + 0x57, 0x07, 0x9d, 0x23, 0xbe, 0xc1, 0xad, 0xbb, 0xdc, 0xbd, 0xf3, 0x17, 0x7d, 0x5f, 0x9f, 0xe4, 0x15, 0xd3, 0xe5, 0x27, 0xd9, 0xf7, 0x56, 0xbf, 0xd7, 0x27, 0xe9, 0x65, 0xc4, 0x14, 0xcd, 0x48, + 0x6e, 0x29, 0x22, 0xa7, 0x8b, 0x35, 0xae, 0xa4, 0xc2, 0x5e, 0xe7, 0x24, 0x36, 0x10, 0x8e, 0xdb, 0x06, 0x59, 0x00, 0xd2, 0xe8, 0x50, 0xe8, 0x3c, 0x1d, 0x4f, 0xca, 0xc5, 0x41, 0x5a, 0x6b, 0x49, + 0x21, 0x50, 0xc6, 0xa1, 0x9c, 0x55, 0x0b, 0x50, 0xe1, 0xe0, 0xad, 0x7f, 0xdc, 0x2d, 0xb0, 0x58, 0x0f, 0x1c, 0x2f, 0x9b, 0x76, 0x2e, 0xe1, 0x1c, 0x62, 0xc7, 0x36, 0x6a, 0x82, 0x2a, 0xcc, 0x7b, + 0x28, 0xcc, 0x67, 0x06, 0x88, 0x7f, 0x6f, 0x24, 0x3f, 0x7c, 0x03, 0x38, 0x78, 0x7c, 0xbd, 0xcf, 0xb8, 0x3e, 0x2f, 0x69, 0x8d, 0x6a, 0xd6, 0x10, 0xc5, 0x2d, 0xd3, 0x34, 0x9c, 0x29, 0x08, 0xa7, + 0x6e, 0x64, 0x6c, 0x5b, 0x77, 0x95, 0x80, 0x27, 0xbe, 0x9f, 0xe3, 0x61, 0x13, 0x38, 0x58, 0x14, 0x42, 0x79, 0xb2, 0xe8, 0x48, 0xc5, 0xaa, 0xa4, 0x1c, 0x67, 0x25, 0x14, 0x47, 0xb2, 0x50, 0x38, + 0xc0, 0xc4, 0x6e, 0xad, 0x1c, 0x1d, 0x85, 0x23, 0x8f, 0x1e, 0x63, 0x58, 0xf9, 0x21, 0x53, 0xc5, 0x68, 0x1a, 0x93, 0xfb, 0x3e, 0x29, 0x64, 0xde, 0xbb, 0xc1, 0xe7, 0xf7, 0x43, 0x7b, 0xcf, 0xe9, + 0x76, 0x92, 0x84, 0x96, 0x16, 0x0f, 0x2e, 0x1e, 0xef, 0x8f, 0x15, 0xe4, 0x56, 0x5e, 0xbd, 0xd8, 0xd3, 0xbf, 0x3e, 0x75, 0xbf, 0xfc, 0x5d, 0xa9, 0x49, 0xf0, 0x6d, 0xf0, 0x81, 0xf7, 0x6e, 0x5a, + 0xfa, 0xb8, 0xfd, 0x24, 0x6a, 0xe6, 0xc2, 0x68, 0x23, 0x09, 0xc3, 0x1f, 0xaa, 0xd7, 0xbd, 0x62, 0xe6, 0xbb, 0x25, 0xfe, 0xd1, 0xb1, 0x9f, 0x97, 0xfa, 0x1a, 0xfa, 0x0e, 0x44, 0x6b, 0x6d, 0x77, + 0x8d, 0x16, 0xc6, 0x84, 0x87, 0x72, 0xa0, 0xa1, 0xc0, 0x31, 0x23, 0x1f, 0xcd, 0x78, 0xaf, 0x86, 0x9e, 0x39, 0x36, 0x34, 0xa7, 0x13, 0x66, 0xe5, 0xd8, 0xa4, 0x47, 0x41, 0x1b, 0xeb, 0xc3, 0x6d, + 0xcd, 0x70, 0x1b, 0x7c, 0x66, 0x4b, 0x0b, 0x09, 0x8d, 0x94, 0xb4, 0x39, 0x48, 0xf0, 0x7a, 0x37, 0xa9, 0x4a, 0x9b, 0x3b, 0x12, 0x0b, 0x85, 0xd8, 0xf8, 0x76, 0x39, 0x86, 0x80, 0x17, 0xa1, 0x87, + 0xbd, 0x62, 0x10, 0x69, 0x9f, 0xbb, 0xfb, 0x6d, 0x1f, 0x17, 0x56, 0xf9, 0xf4, 0x5e, 0x63, 0x69, 0xc1, 0x77, 0xbf, 0x3d, 0xdd, 0xff, 0xfa, 0xfb, 0x6f, 0x3a, 0xed, 0xeb, 0x5e, 0xf4, 0x6c, 0x69, + 0xfa, 0x73, 0x29, 0xe2, 0x8e, 0xfa, 0x47, 0xb7, 0x5d, 0x5d, 0x3b, 0x2f, 0x54, 0x3d, 0xc4, 0x8b, 0x21, 0x39, 0x85, 0xa4, 0x74, 0x67, 0x91, 0x90, 0xe1, 0xa7, 0x89, 0x81, 0x8f, 0x45, 0xb6, 0xe9, + 0x56, 0xf3, 0x4d, 0x26, 0x51, 0x26, 0x8c, 0x18, 0x30, 0xb4, 0x8e, 0x10, 0x2d, 0x32, 0xa7, 0x6a, 0xce, 0xae, 0x26, 0x0a, 0x22, 0xd0, 0xad, 0x76, 0x80, 0xe0, 0xe3, 0x7c, 0xb1, 0xcd, 0xad, 0x08, + 0xc8, 0xe3, 0xe9, 0x56, 0x41, 0xcd, 0x26, 0xd7, 0xe7, 0xe8, 0x6e, 0x97, 0xef, 0x1a, 0xcd, 0xb1, 0x27, 0x0a, 0xdd, 0x23, 0x2b, 0x48, 0xab, 0x35, 0xef, 0x52, 0xbb, 0xef, 0xea, 0xa3, 0x9f, 0xd8, + 0x59, 0x7f, 0x48, 0x45, 0xfe, 0x2e, 0x97, 0xeb, 0x36, 0x10, 0xfe, 0x23, 0x68, 0xe7, 0x2e, 0x1c, 0xa8, 0xa7, 0xc5, 0xf8, 0xdb, 0x7a, 0xa4, 0x4f, 0x05, 0x99, 0xc7, 0xa3, 0xc4, 0x33, 0x4f, 0x4a, + 0x6d, 0xe8, 0xc5, 0xcf, 0xd6, 0xec, 0xd7, 0xbc, 0x6e, 0x57, 0x74, 0x4f, 0x23, 0xe3, 0xf3, 0xac, 0xaf, 0x07, 0x4e, 0x28, 0xa2, 0x44, 0xd6, 0xc2, 0xe2, 0xb0, 0xa7, 0x79, 0xa6, 0x4a, 0x5b, 0x75, + 0xb4, 0x81, 0x88, 0x40, 0x23, 0xed, 0x50, 0xf5, 0x7d, 0x6f, 0x59, 0xcf, 0xf7, 0xd4, 0x41, 0x11, 0xb9, 0xd2, 0xe3, 0x78, 0xa2, 0xf2, 0x4b, 0xf5, 0x90, 0x93, 0xc6, 0xc6, 0xb6, 0xb5, 0x00, 0xa8, + 0xa4, 0xe9, 0x90, 0x00, 0x44, 0x9d, 0x10, 0x75, 0x2d, 0x94, 0xd3, 0xa6, 0xb3, 0x76, 0x5e, 0x47, 0xd3, 0xd8, 0x7a, 0xe6, 0xbc, 0x66, 0x78, 0xba, 0x49, 0x4d, 0x7d, 0x41, 0x35, 0xff, 0x92, 0xd0, + 0xf3, 0x4c, 0x3f, 0xbf, 0x35, 0x26, 0xf4, 0x67, 0xf6, 0x27, 0x79, 0x70, 0x70, 0x75, 0x72, 0xf6, 0x13, 0xf7, 0xd4, 0xd4, 0x75, 0x05, 0xb3, 0xfd, 0x11, 0x26, 0xee, 0xd6, 0x90, 0xbb, 0x83, 0x39, + 0x7f, 0x26, 0xd0, 0xeb, 0x8a, 0x9d, 0x59, 0xc7, 0x8c, 0x33, 0x73, 0xaa, 0x9b, 0x99, 0x0b, 0xab, 0xa6, 0x68, 0x2f, 0xcb, 0x0f, 0xf3, 0x46, 0x0a, 0xf5, 0x68, 0x2c, 0xf0, 0xf3, 0x74, 0xa4, 0x05, + 0x88, 0x3d, 0x84, 0x56, 0x11, 0xc1, 0x6e, 0x67, 0x1d, 0x8f, 0x44, 0x59, 0x1b, 0x30, 0x58, 0xec, 0x04, 0x73, 0x11, 0x86, 0x6d, 0x30, 0xfc, 0xd3, 0x40, 0x64, 0x2b, 0x4a, 0xfc, 0x9f, 0xf9, 0x44, + 0xbc, 0xcc, 0xa7, 0x2b, 0xfa, 0xe0, 0xe0, 0xfa, 0x6c, 0x40, 0xf4, 0xe7, 0x14, 0x2f, 0xf9, 0xca, 0xd1, 0x38, 0x08, 0x22, 0x05, 0x59, 0x0d, 0x35, 0x4f, 0x8f, 0x10, 0xdf, 0xa6, 0xca, 0xac, 0x6e, + 0x1c, 0xac, 0xf3, 0x3b, 0x58, 0x60, 0xd0, 0xb6, 0xb4, 0x92, 0xec, 0x88, 0x0d, 0x87, 0xfb, 0x49, 0x02, 0x6e, 0x56, 0x4e, 0x9c, 0xc3, 0x20, 0xc3, 0x94, 0x80, 0x67, 0xa0, 0x1e, 0xbb, 0x3d, 0xae, + 0x89, 0x69, 0x85, 0x6e, 0x4d, 0x1e, 0x1e, 0x4a, 0x5a, 0x13, 0xef, 0x77, 0x11, 0x33, 0xc5, 0xbe, 0xb1, 0xa7, 0x3f, 0xe4, 0xd4, 0xf3, 0xcc, 0xe0, 0x7f, 0xdf, 0xfa, 0xf3, 0xe4, 0x5d, 0xe0, 0xe0, + 0xd9, 0x9d, 0x3f, 0xb1, 0x10, 0x1d, 0xbb, 0x28, 0x1a, 0x01, 0x15, 0x50, 0x4c, 0x0a, 0xe9, 0xd0, 0xd1, 0x64, 0x26, 0x68, 0x96, 0xbf, 0x47, 0xe9, 0x59, 0xed, 0x4e, 0x38, 0x23, 0xe4, 0x4c, 0xef, + 0xa8, 0x68, 0xec, 0xae, 0x9a, 0x53, 0x04, 0xba, 0x59, 0xfa, 0x3a, 0x1e, 0x4b, 0x15, 0x13, 0x9b, 0xe6, 0x64, 0xce, 0xd4, 0x90, 0x1b, 0x00, 0x9c, 0x82, 0x8f, 0x79, 0x2a, 0x2c, 0x0e, 0x16, 0x37, + 0xdc, 0x59, 0x0e, 0x36, 0xdd, 0x63, 0xf2, 0xfa, 0x4f, 0xc7, 0x5d, 0xf1, 0x38, 0xf7, 0xfc, 0xd7, 0xaf, 0x5b, 0x83, 0x0d, 0xf2, 0x6a, 0xae, 0xc0, 0x37, 0x39, 0xe8, 0xc3, 0xbb, 0x98, 0xd7, 0x5f, + 0xcf, 0x98, 0x25, 0x8f, 0x59, 0x7d, 0x8b, 0x0a, 0x43, 0xd6, 0xdd, 0x57, 0x91, 0x3c, 0x85, 0xac, 0x64, 0xb9, 0x23, 0xe9, 0x89, 0x6f, 0x68, 0x33, 0x12, 0xe1, 0x96, 0x42, 0xb6, 0x8d, 0x66, 0x93, + 0x98, 0x81, 0x53, 0x9b, 0x30, 0xab, 0x5d, 0x3b, 0x63, 0x9a, 0x72, 0x85, 0x51, 0x34, 0x16, 0x07, 0x7e, 0x43, 0x6a, 0xe8, 0xc2, 0xf4, 0x36, 0xe5, 0x12, 0x9d, 0x22, 0x0d, 0xca, 0xd2, 0xde, 0x14, + 0x6c, 0x3d, 0xb4, 0x16, 0xad, 0x7f, 0xee, 0xca, 0xf9, 0x3a, 0x6d, 0x7f, 0xff, 0xf7, 0x7e, 0x82, 0x7e, 0x3b, 0x62, 0xef, 0x0d, 0xca, 0xbf, 0x7e, 0xdd, 0xe7, 0xb3, 0x63, 0xfd, 0x3c, 0x45, 0x0f, + 0x53, 0x41, 0x7f, 0xfd, 0xfa, 0x2e, 0x64, 0xed, 0xd7, 0x1f, 0x76, 0xe4, 0xa3, 0x94, 0xd0, 0xfb, 0xb0, 0xb5, 0x5f, 0xcf, 0x3a, 0x91, 0xaa, 0x6a, 0x6e, 0x9b, 0x6f, 0xed, 0xb5, 0xa0, 0x08, 0x0b, + 0xa3, 0xd4, 0x37, 0x30, 0x07, 0x2a, 0xcc, 0x76, 0x03, 0xe3, 0x23, 0x8c, 0xe9, 0x8c, 0x55, 0xe1, 0xe0, 0x3a, 0xa9, 0x9b, 0x7b, 0x92, 0xae, 0xb2, 0x2a, 0x1f, 0x3a, 0x35, 0xa6, 0x71, 0xd9, 0x5c, + 0xd6, 0x5c, 0x0c, 0x57, 0x89, 0x45, 0x24, 0xe1, 0x87, 0xe9, 0x71, 0xb4, 0xde, 0x1b, 0x62, 0x19, 0xda, 0x07, 0x24, 0x57, 0xa7, 0x95, 0x53, 0x62, 0xff, 0x3c, 0x99, 0xe8, 0x26, 0xe7, 0x74, 0xf4, + 0x0d, 0xbb, 0xff, 0xe7, 0xfa, 0xff, 0x87, 0x20, 0xf1, 0x5e, 0x05, 0xfb, 0x5f, 0xd4, 0xfb, 0xce, 0x24, 0x4f, 0xe2, 0xc3, 0xf9, 0xa0, 0x8f, 0x66, 0x07, 0x0f, 0x4a, 0x69, 0x4d, 0xfa, 0x47, 0x7c, + 0x9c, 0xf9, 0x72, 0x2b, 0x04, 0xca, 0xac, 0xa6, 0xa0, 0xb5, 0x50, 0xf1, 0x5c, 0x99, 0xf6, 0xb0, 0x58, 0x34, 0xb9, 0x57, 0x5a, 0x03, 0xdb, 0x0b, 0xad, 0xc1, 0x05, 0xea, 0xe3, 0x1b, 0x4b, 0xe4, + 0x9f, 0x3b, 0x8c, 0xee, 0xa8, 0x9f, 0x9b, 0x76, 0x73, 0xad, 0x2f, 0x22, 0x0c, 0x55, 0xcf, 0x8d, 0x4e, 0x1d, 0xb1, 0xb1, 0x64, 0x67, 0xa8, 0x97, 0x48, 0x9d, 0x9f, 0x8f, 0x83, 0x39, 0xd9, 0x1d, + 0x86, 0x11, 0x4e, 0x75, 0x01, 0x01, 0x92, 0x7c, 0x07, 0xd2, 0x34, 0x99, 0xc4, 0x9c, 0x55, 0x81, 0xe4, 0xd0, 0x6e, 0x72, 0x3e, 0x31, 0xac, 0x48, 0x44, 0xd6, 0x14, 0x3b, 0xa3, 0xc2, 0x38, 0xa6, + 0x05, 0x40, 0xa5, 0x25, 0x40, 0xf5, 0xa9, 0xcd, 0xa8, 0xd2, 0x60, 0x70, 0xb5, 0x07, 0x5f, 0x8c, 0x18, 0x89, 0xaa, 0x3c, 0xaa, 0x72, 0x57, 0x2b, 0xde, 0x63, 0xd1, 0xe1, 0x3b, 0x3d, 0xf4, 0x61, + 0x48, 0xc9, 0xf5, 0xbc, 0xfd, 0x82, 0xbc, 0x73, 0x59, 0x12, 0xbe, 0xc8, 0xdf, 0x4f, 0xa2, 0x7a, 0x2e, 0x8e, 0x94, 0xd1, 0x63, 0xe1, 0xf6, 0xab, 0x4b, 0xe5, 0xb1, 0x0d, 0xfe, 0x15, 0x93, 0xf2, + 0x15, 0x5d, 0x70, 0x70, 0x7d, 0xd6, 0x27, 0x35, 0xfc, 0xd4, 0x79, 0x2b, 0x49, 0x70, 0xa7, 0x2c, 0x6d, 0xf9, 0xaa, 0xb2, 0xc7, 0xdd, 0x11, 0x34, 0x4e, 0xdc, 0x25, 0x44, 0x4e, 0x73, 0x72, 0xaf, + 0x2d, 0x2c, 0x3b, 0x47, 0x96, 0x3c, 0x65, 0xa3, 0xe2, 0x34, 0x4a, 0x27, 0x81, 0x2f, 0x7a, 0xe8, 0xd0, 0x52, 0xba, 0xb5, 0x42, 0xc9, 0xbb, 0xad, 0x3f, 0x5d, 0x97, 0x2a, 0xbb, 0xe5, 0x8c, 0x19, + 0x34, 0x45, 0x76, 0xdc, 0xd6, 0x05, 0x92, 0x82, 0x5e, 0x16, 0x8e, 0xe0, 0x45, 0xcf, 0xa0, 0x2c, 0xbe, 0x72, 0xa4, 0x7c, 0x0e, 0x16, 0xf1, 0x5a, 0x82, 0xd1, 0x99, 0xe2, 0x89, 0x0b, 0xa7, 0xff, + 0x7d, 0x13, 0x8b, 0x96, 0x9c, 0xb2, 0x83, 0x3d, 0x4a, 0x66, 0xe5, 0x9d, 0x43, 0xc9, 0x31, 0xb9, 0xdb, 0xf8, 0x5e, 0x05, 0xf0, 0x07, 0xb7, 0xdb, 0xc9, 0xf3, 0xa2, 0xb6, 0x53, 0x3c, 0x32, 0x2a, + 0x25, 0x22, 0x4d, 0x69, 0xc7, 0x71, 0x10, 0x38, 0xf1, 0xcb, 0x7c, 0xd7, 0xcc, 0xa8, 0x96, 0x26, 0x10, 0x30, 0x9a, 0x1c, 0xf4, 0x72, 0x59, 0x30, 0xfe, 0x6c, 0xa1, 0x99, 0x50, 0xb3, 0x28, 0x12, + 0x73, 0x78, 0xcc, 0xb7, 0xd4, 0xf4, 0x0e, 0x52, 0xa6, 0xd3, 0xc2, 0xd0, 0xfb, 0x36, 0x9f, 0xea, 0xcf, 0xbb, 0xfe, 0x8d, 0x26, 0x38, 0x78, 0x3f, 0xea, 0xdb, 0xe5, 0x68, 0x63, 0x32, 0x9e, 0xa9, + 0x76, 0xd9, 0x68, 0x35, 0x86, 0x88, 0xa1, 0xbc, 0x9c, 0x4a, 0xa3, 0x6d, 0x2a, 0x4a, 0x1b, 0x0a, 0x6d, 0x7c, 0x99, 0x0a, 0x17, 0x07, 0xde, 0xad, 0x22, 0x24, 0xd8, 0x18, 0x35, 0x38, 0x84, 0xa5, + 0x18, 0xb1, 0xa2, 0x35, 0x64, 0x76, 0xc6, 0xfa, 0x30, 0xac, 0x54, 0x79, 0x69, 0xf9, 0x0d, 0x57, 0x3b, 0xd8, 0xb4, 0xa8, 0x75, 0x33, 0xdc, 0x2f, 0x81, 0x99, 0x32, 0x35, 0x4a, 0xfc, 0xd3, 0x18, + 0xf7, 0x3f, 0xa7, 0xbf, 0xff, 0xff, 0x7f, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xba, 0xff, 0xda, 0x05, 0x0a, 0xe7, 0x00, 0x00, 0xca, 0x39, 0x03, 0x00, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x6c, 0x50, 0xb1, 0x6e, 0xc2, 0x30, 0x14, 0xdc, 0xf3, 0x15, 0x4f, 0x19, 0x98, 0x1a, + 0x27, 0x20, 0x3a, 0x94, 0x0d, 0xa9, 0x43, 0xc7, 0x0e, 0x6c, 0x55, 0xa9, 0x8c, 0xfd, 0x20, 0xa6, 0xc9, 0xb3, 0x6b, 0x3f, 0x43, 0xab, 0x8a, 0x7f, 0xaf, 0xec, 0x90, 0x42, 0x51, 0x47, 0xdf, 0xf9, + 0xee, 0xde, 0xdd, 0x77, 0x01, 0x50, 0x92, 0xec, 0xb1, 0x5c, 0x40, 0xd9, 0x32, 0xbb, 0xaa, 0x95, 0xa4, 0x3b, 0xf4, 0xe5, 0x5d, 0x62, 0x0e, 0xe8, 0x83, 0xb1, 0x94, 0xc8, 0x46, 0x4c, 0x45, 0x33, + 0xa0, 0x1a, 0x83, 0xf2, 0xc6, 0xf1, 0x99, 0x59, 0xc2, 0x36, 0x92, 0x4a, 0x2f, 0x38, 0xb6, 0x46, 0xb5, 0xe0, 0x31, 0x38, 0x4b, 0x3a, 0x00, 0x5b, 0x78, 0x5a, 0xad, 0x9e, 0xc1, 0xe3, 0x47, 0xc4, + 0xc0, 0x61, 0x90, 0xf7, 0xd2, 0x64, 0x9d, 0x21, 0x8d, 0x9f, 0x62, 0x7f, 0x46, 0x07, 0xcb, 0x50, 0x2e, 0x20, 0xdd, 0x04, 0x50, 0x32, 0x06, 0x4e, 0xdf, 0xc8, 0x6a, 0x84, 0xf4, 0xa8, 0x23, 0x19, + 0x16, 0xfb, 0x00, 0x93, 0x09, 0x5c, 0x40, 0x43, 0x8c, 0x3b, 0x2f, 0x53, 0xfc, 0xe8, 0x95, 0xdc, 0x58, 0xfa, 0xac, 0xde, 0x4a, 0x19, 0xaa, 0x7d, 0xa8, 0x7c, 0x24, 0x36, 0x3d, 0x82, 0xa8, 0xff, + 0xc4, 0xe6, 0x36, 0x9b, 0xb8, 0x1b, 0x83, 0x7a, 0x4b, 0x50, 0x55, 0x86, 0x82, 0x43, 0xc5, 0x20, 0xea, 0x84, 0xbd, 0xf5, 0x56, 0xc7, 0x0e, 0x43, 0x7d, 0xe3, 0x55, 0x6f, 0x0c, 0xd5, 0xaa, 0x33, + 0xe9, 0xa4, 0x2b, 0xdb, 0x02, 0xe0, 0x94, 0x1b, 0xbd, 0xe3, 0xd7, 0xd1, 0x7a, 0x9d, 0x2a, 0xbd, 0xbc, 0x66, 0x44, 0x46, 0x6e, 0xad, 0x4f, 0x59, 0x43, 0xe7, 0xce, 0x28, 0xa4, 0x90, 0xb7, 0x5f, + 0x3a, 0xa9, 0x5a, 0xac, 0x66, 0x97, 0x8d, 0x1d, 0x92, 0x46, 0x52, 0x06, 0xaf, 0x36, 0xb9, 0xb9, 0x20, 0x09, 0xd7, 0x8d, 0x78, 0x10, 0xcd, 0x25, 0x55, 0xe3, 0xe1, 0xf1, 0x5f, 0xed, 0xb9, 0x5e, + 0xd6, 0xcc, 0x44, 0x23, 0xe6, 0xbf, 0x5b, 0x45, 0x87, 0x7e, 0x5c, 0x7b, 0x3d, 0x17, 0x8d, 0x98, 0x8d, 0x14, 0x4b, 0x37, 0x84, 0xdc, 0x8b, 0x46, 0x4c, 0x73, 0x48, 0x71, 0x2a, 0x7e, 0x02, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x80, 0x10, 0x98, 0x26, 0x31, 0x01, 0x00, 0x00, 0x35, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x6e, 0x6f, + 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0xcc, 0x93, 0xcf, 0x8e, 0xd3, + 0x30, 0x10, 0xc6, 0xef, 0x79, 0x8a, 0xb9, 0xd9, 0x91, 0xd2, 0xb4, 0xac, 0xf6, 0x94, 0xa8, 0x70, 0x58, 0x2d, 0x2c, 0x17, 0xa8, 0x20, 0x3c, 0x80, 0x49, 0xa6, 0x6d, 0x56, 0xad, 0x9d, 0xce, 0x8c, + 0x81, 0xaa, 0xca, 0xbb, 0x23, 0xc7, 0xe9, 0x1f, 0x0a, 0x12, 0x08, 0xed, 0x4a, 0x7b, 0x8a, 0x3c, 0xf9, 0xfc, 0xcd, 0x37, 0xf3, 0x93, 0x95, 0x67, 0x04, 0x16, 0x6a, 0x6b, 0x51, 0x65, 0x92, 0xd4, + 0xce, 0xb2, 0xc0, 0x01, 0x58, 0x0c, 0x09, 0xf4, 0x30, 0x07, 0xc2, 0x9d, 0x6f, 0x09, 0xb5, 0x5a, 0x1a, 0xc3, 0x93, 0x47, 0x9e, 0x90, 0xb7, 0xd2, 0x6e, 0x51, 0xa5, 0xe5, 0xa8, 0x0e, 0x0a, 0x64, + 0xb9, 0xd4, 0xb2, 0xef, 0x90, 0x04, 0x59, 0x82, 0x6a, 0x94, 0x2d, 0xbd, 0xad, 0x2f, 0x35, 0x79, 0xae, 0xd2, 0x7c, 0x6d, 0x6c, 0xb3, 0xc1, 0xa3, 0x93, 0x5c, 0xd9, 0x88, 0xe9, 0xf0, 0xc2, 0x01, + 0x89, 0x1e, 0x06, 0x3d, 0xc1, 0x1c, 0x04, 0xe6, 0xaf, 0x43, 0x25, 0x7c, 0x0e, 0x09, 0x80, 0xe4, 0x48, 0xe4, 0x48, 0x23, 0x51, 0x5a, 0xc6, 0xb3, 0x6d, 0x74, 0x5a, 0x26, 0x7d, 0x99, 0x24, 0xc1, + 0x58, 0xab, 0xf7, 0x56, 0x70, 0x45, 0x46, 0x5a, 0x67, 0x0b, 0x88, 0x9d, 0x19, 0x8c, 0x85, 0x87, 0xaa, 0x5a, 0xc0, 0xbb, 0xfb, 0x4a, 0x65, 0xd1, 0x35, 0xd8, 0x0d, 0x0b, 0xd0, 0x21, 0x73, 0x9a, + 0xcb, 0x1a, 0xad, 0x66, 0xa4, 0x6f, 0x78, 0xea, 0x16, 0xfc, 0xbb, 0x8d, 0xb1, 0xfa, 0x66, 0x68, 0x06, 0xc7, 0x25, 0x8c, 0xb2, 0x74, 0xa8, 0x01, 0xe4, 0x2b, 0x14, 0xad, 0xa6, 0x6f, 0xac, 0xd9, + 0xe2, 0x5c, 0xda, 0x15, 0x92, 0x3a, 0xfd, 0xc2, 0x1f, 0x1d, 0xd6, 0xa2, 0x6f, 0x66, 0xb3, 0xeb, 0x92, 0xba, 0x73, 0x56, 0xd0, 0xca, 0xa4, 0xda, 0x77, 0xa8, 0x32, 0x98, 0x3e, 0xb2, 0xb3, 0xd3, + 0xb3, 0xca, 0x36, 0x3a, 0x8c, 0x99, 0x01, 0x21, 0xa7, 0xe7, 0x44, 0x31, 0xd5, 0x69, 0x0b, 0x19, 0xa8, 0x0f, 0x0e, 0x86, 0xa3, 0x1a, 0x43, 0x46, 0x45, 0x83, 0xd8, 0xdd, 0xef, 0xbc, 0xd9, 0x68, + 0x42, 0xce, 0xbf, 0xba, 0x66, 0x9f, 0xc1, 0x01, 0x76, 0x1e, 0x69, 0x5f, 0xc0, 0x01, 0x42, 0xd6, 0x02, 0x54, 0x4c, 0x0b, 0x3d, 0xf4, 0xbf, 0x5c, 0x1e, 0x97, 0x7a, 0x2c, 0xc4, 0x71, 0xf3, 0x7a, + 0xe3, 0x18, 0xcf, 0xf5, 0x78, 0xa5, 0xcf, 0x2e, 0x88, 0x69, 0x49, 0x03, 0x8b, 0xf4, 0xdf, 0x60, 0x2c, 0x3e, 0x7e, 0x7e, 0x0e, 0x1a, 0x9d, 0x0b, 0x9d, 0xa7, 0x67, 0x06, 0x1c, 0xc6, 0xf9, 0x6d, + 0xe4, 0x97, 0x8a, 0xe8, 0x3a, 0xe6, 0xf3, 0x73, 0x21, 0xe4, 0xce, 0xd9, 0x86, 0xe1, 0x7b, 0x2b, 0xeb, 0x18, 0x14, 0x6a, 0xd7, 0x20, 0xb4, 0x4b, 0xb0, 0xd8, 0xca, 0x1a, 0x29, 0x3c, 0x1c, 0x70, + 0xf4, 0xdf, 0xc8, 0x5e, 0xfd, 0x05, 0x99, 0x7f, 0x09, 0xc4, 0xfe, 0xcc, 0x63, 0x8b, 0xcc, 0x66, 0x15, 0x72, 0x7c, 0x72, 0x5e, 0x10, 0x16, 0x5f, 0xaa, 0x62, 0x0a, 0xd6, 0x09, 0x2c, 0x9d, 0xb7, + 0x8d, 0xca, 0xe2, 0xc6, 0x8a, 0x40, 0x59, 0xe0, 0xed, 0x58, 0x63, 0x31, 0xe2, 0xf9, 0xce, 0x35, 0x58, 0xc0, 0xed, 0xec, 0xf6, 0xc9, 0x39, 0xfe, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x3b, 0xa7, 0x29, 0xe2, 0xc2, 0x01, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, + 0x73, 0xcc, 0x92, 0xc1, 0x8e, 0xd3, 0x30, 0x10, 0x86, 0xef, 0x79, 0x8a, 0xff, 0xe6, 0x54, 0x8a, 0xbc, 0x20, 0xc1, 0x25, 0x51, 0xb9, 0xa0, 0x15, 0x70, 0x58, 0xb1, 0x12, 0xe5, 0x01, 0x4c, 0x3c, + 0xad, 0x2d, 0x5c, 0x4f, 0x6a, 0x8f, 0x29, 0xab, 0x68, 0xdf, 0x1d, 0xb9, 0x89, 0x04, 0x07, 0x76, 0x0b, 0xb7, 0x3d, 0x26, 0x9e, 0xf9, 0xfd, 0x7d, 0xbf, 0xac, 0x4a, 0x26, 0x64, 0x49, 0x7e, 0x14, + 0x35, 0x34, 0xcd, 0xc8, 0x31, 0x0b, 0xf6, 0x25, 0x8e, 0xd8, 0x22, 0xd1, 0xa9, 0xf8, 0x44, 0xad, 0xd2, 0x5a, 0x6d, 0xb4, 0x33, 0xd1, 0x06, 0x1a, 0xd6, 0x11, 0xa1, 0x2c, 0x7f, 0x8e, 0x88, 0x99, + 0x48, 0x6d, 0x7e, 0x27, 0xf8, 0x9f, 0x52, 0x12, 0x61, 0x8b, 0x19, 0x81, 0x0f, 0x3d, 0x66, 0xf8, 0xb8, 0xe7, 0x1e, 0xf5, 0x98, 0x03, 0xe9, 0xc0, 0x07, 0x3c, 0xe2, 0x71, 0x68, 0x9a, 0x9a, 0xd4, + 0xaa, 0xaf, 0xd1, 0x4b, 0x8f, 0xe5, 0x8e, 0x0c, 0x13, 0xf1, 0x71, 0xb7, 0xbb, 0xc7, 0x87, 0xdb, 0x9d, 0xea, 0x60, 0xf2, 0x43, 0x1c, 0x21, 0xd8, 0xbe, 0xc3, 0xdc, 0x00, 0xa2, 0xa7, 0x60, 0x62, + 0xfb, 0x7a, 0x33, 0x34, 0xc0, 0xcd, 0x0d, 0x3e, 0xc5, 0x1f, 0xfc, 0x9d, 0x20, 0x8e, 0x2e, 0xe0, 0xe2, 0x39, 0x76, 0x38, 0x3b, 0x3f, 0x3a, 0x64, 0xc7, 0x25, 0x58, 0x8c, 0x7c, 0x9c, 0x02, 0x09, + 0xe1, 0xec, 0xc5, 0x71, 0x11, 0x50, 0x4a, 0x9c, 0x74, 0x03, 0x2c, 0xb4, 0x89, 0x72, 0x09, 0x55, 0xc7, 0x9c, 0x8d, 0x5f, 0xf4, 0xdb, 0x19, 0x5a, 0xeb, 0x55, 0xa3, 0xc3, 0x91, 0xc4, 0xb1, 0xed, + 0xa1, 0x16, 0xa2, 0x53, 0xa1, 0xf4, 0x50, 0xa5, 0xa2, 0x39, 0x52, 0x0f, 0x25, 0xfe, 0x40, 0x49, 0x55, 0xa1, 0x0b, 0x94, 0x68, 0x4b, 0x34, 0xdd, 0x9e, 0x8a, 0x09, 0xed, 0x92, 0xdd, 0x61, 0xbe, + 0xbe, 0x44, 0xd1, 0xb6, 0x9b, 0xa1, 0xa9, 0x9f, 0xcf, 0xb6, 0x72, 0xff, 0xf9, 0xcb, 0x4b, 0xab, 0x65, 0x45, 0xfa, 0xc6, 0xf6, 0xbf, 0x6b, 0xb9, 0xb6, 0xf3, 0x54, 0x2b, 0x89, 0xf2, 0xc4, 0xd1, + 0xe6, 0x0b, 0xfd, 0x82, 0x8e, 0x91, 0x2d, 0xc1, 0xef, 0x11, 0xc9, 0x8b, 0xa3, 0x54, 0xdf, 0x0f, 0x38, 0xfd, 0x4b, 0x61, 0x4f, 0x1b, 0xaf, 0xb2, 0xcf, 0x18, 0x64, 0x31, 0x52, 0xf2, 0x7b, 0xb6, + 0xd4, 0xe3, 0xcd, 0xab, 0xb7, 0xdd, 0xfa, 0xe3, 0x8e, 0x72, 0x36, 0x87, 0xea, 0x74, 0x77, 0xa9, 0x09, 0x91, 0x05, 0x26, 0x04, 0x3e, 0x93, 0x55, 0x7f, 0xd3, 0xfb, 0x15, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x74, 0x08, 0x91, 0x02, 0x5f, 0x01, 0x00, 0x00, 0x8c, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, + 0x4f, 0x4d, 0xb2, 0x52, 0x28, 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0xd0, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff, + 0xff, 0x50, 0x4b, 0x07, 0x08, 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x84, 0x53, 0xcd, 0x8e, 0xdb, 0x3c, 0x0c, 0xbc, 0xeb, 0x29, 0xe6, 0xc3, 0x5e, 0xb2, 0xdf, 0xc1, 0xde, 0xe3, 0x62, 0xaf, 0xc5, + 0xf6, 0x5c, 0x14, 0x29, 0x8a, 0x22, 0x08, 0x6a, 0x45, 0x62, 0x62, 0x75, 0xb5, 0xa4, 0x21, 0xd2, 0x49, 0xf3, 0xf6, 0x85, 0x9c, 0x38, 0x3f, 0x68, 0x8b, 0x9e, 0x12, 0x90, 0x43, 0x6a, 0x38, 0x33, + 0x7e, 0xc0, 0xa7, 0xa3, 0xf5, 0xc2, 0xf8, 0x90, 0x65, 0x8c, 0xaf, 0x7b, 0x62, 0x53, 0x7c, 0x1c, 0x39, 0x58, 0x12, 0x76, 0xee, 0x2b, 0xe5, 0x20, 0xef, 0x04, 0x13, 0x1c, 0x65, 0x2c, 0x60, 0x3a, + 0xcc, 0x03, 0xdb, 0x33, 0x08, 0x43, 0x91, 0x1f, 0x14, 0xec, 0x3f, 0x2c, 0x7b, 0xc2, 0x46, 0x52, 0xa6, 0x32, 0x64, 0x6f, 0x74, 0x41, 0xb8, 0x20, 0x91, 0x10, 0x3c, 0x63, 0x43, 0xd8, 0xca, 0xc8, + 0x11, 0x89, 0xb1, 0xea, 0x6a, 0xbf, 0x19, 0x8e, 0xdd, 0x7a, 0xd1, 0xb4, 0xe7, 0xff, 0x8f, 0x0d, 0x96, 0x7d, 0xd2, 0xeb, 0xf2, 0xa4, 0x78, 0x27, 0xcf, 0xe6, 0x4c, 0x50, 0x48, 0x07, 0xe1, 0x58, + 0xc9, 0xac, 0x26, 0xba, 0x38, 0xf1, 0x5d, 0x2f, 0x7a, 0xb3, 0x41, 0x5f, 0xda, 0x36, 0xd4, 0x2a, 0x4d, 0xc5, 0x26, 0x49, 0xfb, 0xd8, 0x38, 0xf7, 0xf0, 0x80, 0x57, 0x8e, 0x83, 0x24, 0x36, 0x75, + 0xee, 0xf3, 0xc8, 0x9c, 0x78, 0x07, 0xbb, 0x7b, 0xe4, 0x90, 0x72, 0x06, 0xfd, 0x1c, 0x44, 0x09, 0xd6, 0x17, 0x22, 0xd0, 0x3c, 0xd2, 0x38, 0x07, 0xfc, 0x8f, 0xae, 0xed, 0xa6, 0xf3, 0xe6, 0x3a, + 0xb6, 0x52, 0x4e, 0x8a, 0xcc, 0x4b, 0x9a, 0x33, 0xae, 0x27, 0x9f, 0xad, 0x6f, 0x0b, 0xf9, 0x98, 0x98, 0x54, 0xff, 0x30, 0xe7, 0x71, 0xe9, 0xe2, 0x04, 0x47, 0xe8, 0x29, 0xbc, 0xdd, 0x6f, 0xc8, + 0x69, 0x4f, 0x7f, 0x5d, 0x30, 0x37, 0xef, 0xe7, 0x5d, 0x45, 0xde, 0x56, 0x74, 0x56, 0xdd, 0x87, 0x40, 0xaa, 0x34, 0x09, 0x3f, 0xd1, 0xde, 0x14, 0x39, 0x28, 0x15, 0x78, 0x73, 0xab, 0xaa, 0xde, + 0x4b, 0xdb, 0x66, 0x09, 0x3e, 0xf7, 0xa2, 0xf6, 0xf2, 0xfc, 0xf4, 0xfc, 0xf4, 0xdb, 0x21, 0xeb, 0xc5, 0x23, 0x3c, 0xc7, 0x7f, 0xc0, 0x67, 0x62, 0xeb, 0x45, 0x15, 0xff, 0x9b, 0x8c, 0x13, 0x83, + 0x51, 0x09, 0x93, 0xdd, 0x48, 0xbc, 0x97, 0x37, 0xea, 0xaa, 0x87, 0x4a, 0x1c, 0xe1, 0x19, 0x93, 0x5f, 0xb5, 0x60, 0xfd, 0x35, 0x33, 0x97, 0x83, 0x1b, 0x37, 0x79, 0xb8, 0x24, 0xb5, 0xc4, 0xbb, + 0x7a, 0xe2, 0xad, 0x73, 0xe7, 0xec, 0x21, 0x71, 0xc8, 0x63, 0x24, 0x85, 0xc7, 0x6a, 0xe4, 0x64, 0x30, 0x52, 0xab, 0xb9, 0xaa, 0xbf, 0xdf, 0xaf, 0xe1, 0xfa, 0x32, 0xc4, 0x9a, 0xcc, 0x6a, 0xbf, + 0xf3, 0x5a, 0xa5, 0x80, 0x8f, 0x11, 0x9b, 0x51, 0x4f, 0x76, 0x64, 0xd9, 0xa5, 0x70, 0x49, 0xfb, 0x35, 0x85, 0x0c, 0x29, 0x91, 0xca, 0xc4, 0x92, 0xd4, 0x90, 0x4c, 0xb1, 0xa1, 0xde, 0xef, 0x93, + 0x94, 0xc6, 0xb9, 0xae, 0xeb, 0x82, 0xb0, 0x4a, 0x26, 0x37, 0x9c, 0xbe, 0x8e, 0xdb, 0x77, 0x6b, 0xdb, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x70, 0x13, 0x6b, 0x58, 0xac, + 0x01, 0x00, 0x00, 0x69, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1a, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x54, + 0x90, 0xc1, 0x4e, 0xc3, 0x30, 0x10, 0x44, 0xef, 0xf9, 0x8a, 0x51, 0x7b, 0x01, 0x09, 0xf5, 0x03, 0x7a, 0x02, 0x55, 0xf4, 0x0b, 0x7a, 0x47, 0x9b, 0x78, 0x42, 0x96, 0x3a, 0x76, 0xb0, 0xd7, 0x29, + 0xfd, 0x7b, 0x14, 0x37, 0x41, 0xe2, 0x94, 0xd5, 0x66, 0xde, 0xce, 0x78, 0xfa, 0x14, 0x47, 0x4c, 0x92, 0xbc, 0xca, 0xc8, 0x60, 0xd0, 0x71, 0x8a, 0xc9, 0x70, 0x8a, 0xc1, 0xf8, 0x63, 0x2f, 0xe0, + 0xcc, 0x60, 0x4d, 0xd3, 0xbc, 0x3e, 0x06, 0xc7, 0x1e, 0xa3, 0x68, 0x78, 0xea, 0x1e, 0x82, 0xe3, 0xa6, 0x7c, 0x3e, 0x36, 0x00, 0xb0, 0xdb, 0xed, 0xea, 0xf7, 0x5c, 0x42, 0x67, 0x1a, 0x03, 0x8c, + 0xe3, 0xe4, 0xc5, 0x58, 0xb7, 0x97, 0x81, 0x58, 0xc1, 0xc5, 0x53, 0x46, 0x1a, 0x53, 0xdd, 0x88, 0x86, 0x0c, 0x1b, 0x88, 0xb3, 0x97, 0x7c, 0x45, 0xe2, 0x77, 0x61, 0x36, 0xc4, 0xf6, 0x8b, 0x9d, + 0x41, 0x82, 0x83, 0x84, 0x7b, 0xbd, 0x71, 0xf2, 0xb1, 0xb8, 0xf7, 0x25, 0x0c, 0x12, 0x3b, 0xea, 0x4c, 0x87, 0x9b, 0xda, 0x50, 0xe9, 0x95, 0x3b, 0xfc, 0x65, 0xa9, 0xc3, 0x1e, 0x6f, 0xce, 0xe1, + 0x1e, 0x4b, 0x42, 0x5b, 0xb2, 0x06, 0xe6, 0x0c, 0x1f, 0x3f, 0xb5, 0xc3, 0xc0, 0xc4, 0x4d, 0x73, 0xa9, 0xbc, 0x95, 0x14, 0x30, 0x8b, 0x2f, 0xac, 0x3f, 0x71, 0x53, 0xef, 0xd1, 0x12, 0x32, 0x4d, + 0x5e, 0xe9, 0x20, 0x8f, 0x98, 0x4e, 0x4c, 0x20, 0x66, 0x49, 0xdb, 0xb2, 0x3e, 0x6e, 0x8f, 0xd8, 0x43, 0xfe, 0xe7, 0x5b, 0xae, 0xd1, 0xc1, 0x62, 0x85, 0xfa, 0xad, 0x14, 0x0d, 0x73, 0xbc, 0x32, + 0x55, 0x6c, 0xb5, 0x5c, 0x6b, 0x39, 0x74, 0x0b, 0xfe, 0x51, 0xcb, 0x3e, 0x2c, 0x26, 0xcd, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x87, 0x81, 0xa6, 0x27, 0xf6, 0x00, 0x00, + 0x00, 0xa1, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, + 0x61, 0x6d, 0x6c, 0xca, 0xcc, 0x2b, 0xcb, 0x4f, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf, 0xb3, 0xe2, 0x52, 0x50, 0x48, 0xcb, 0x2f, 0xca, 0x4d, 0x2c, 0xb1, 0x52, 0x50, 0x4a, 0xce, 0xc9, 0x2f, 0x4d, 0x49, + 0x2d, 0x4b, 0xcd, 0x2b, 0x51, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x45, 0xf7, 0x4e, 0x8b, 0x29, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x2a, 0x48, 0x2c, + 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0xd1, 0x4d, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0x2b, 0xb6, 0xb5, 0x35, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x54, 0x52, 0xc1, 0x8e, 0xdb, 0x3a, 0x0c, 0xbc, 0xeb, 0x2b, 0xf8, 0xf4, 0x2e, 0x36, 0x90, 0x2a, 0xed, 0x35, 0x80, 0x4f, + 0xc1, 0x16, 0x3d, 0xf5, 0xb4, 0x40, 0x8f, 0x02, 0xd7, 0xa2, 0x37, 0x42, 0x65, 0xc9, 0x2b, 0xd2, 0x46, 0x83, 0xa2, 0xff, 0x5e, 0x50, 0x4e, 0x76, 0x53, 0x1f, 0x6c, 0x6b, 0x38, 0x33, 0x1c, 0x89, + 0x9a, 0x6a, 0x99, 0x61, 0x4c, 0x65, 0x0d, 0xb4, 0x51, 0x16, 0x76, 0x17, 0x91, 0x05, 0xe2, 0xbc, 0x94, 0x2a, 0x70, 0x56, 0xfc, 0x49, 0x71, 0xd3, 0x78, 0x0b, 0xd6, 0x14, 0x71, 0xa6, 0x2c, 0xef, + 0x8c, 0x92, 0x85, 0x7e, 0x89, 0x31, 0xb7, 0xf5, 0x9a, 0xa3, 0x08, 0xb1, 0x18, 0x33, 0xad, 0x79, 0x84, 0x01, 0xbc, 0xdf, 0x2b, 0xde, 0x77, 0x56, 0x21, 0xdb, 0x1b, 0x33, 0x26, 0x64, 0x86, 0x67, + 0x62, 0xf9, 0xba, 0xe6, 0xb1, 0xbb, 0x6b, 0x9c, 0x22, 0x67, 0x64, 0xea, 0x4f, 0xc6, 0x00, 0x04, 0x9a, 0x40, 0x61, 0xaf, 0xb2, 0x8e, 0x29, 0x4d, 0xfd, 0xc9, 0x00, 0x00, 0xfc, 0x0f, 0xe7, 0x4a, + 0x28, 0x04, 0xf8, 0x18, 0x70, 0xaf, 0x7c, 0x82, 0xe7, 0x0b, 0x3d, 0xc0, 0x60, 0x63, 0xb0, 0x10, 0x19, 0x5e, 0x29, 0x53, 0x45, 0xa1, 0x00, 0x71, 0x82, 0x32, 0x6b, 0xc7, 0xe0, 0xc0, 0xf2, 0x42, + 0xe3, 0x46, 0x95, 0x63, 0xc9, 0x56, 0x3b, 0xe2, 0x9a, 0x84, 0x41, 0x0a, 0xd8, 0x2f, 0xee, 0xb3, 0x75, 0xcd, 0x15, 0x45, 0x6a, 0x7c, 0x59, 0x85, 0x18, 0x06, 0xf8, 0xdd, 0x20, 0x7d, 0xac, 0x5c, + 0x17, 0xb2, 0x27, 0xb0, 0x81, 0x36, 0xf7, 0x33, 0xa3, 0xc4, 0x8d, 0x9c, 0x66, 0x15, 0x35, 0x3b, 0x7c, 0xf0, 0xb8, 0xac, 0x75, 0x6c, 0x4c, 0x3d, 0x5b, 0x3e, 0x1d, 0x8f, 0x77, 0x76, 0xa0, 0xed, + 0xb8, 0x5c, 0xe5, 0x52, 0xb2, 0x6b, 0xa7, 0x7f, 0x53, 0xfd, 0x69, 0xef, 0x80, 0x82, 0xda, 0xd0, 0xce, 0xc4, 0x8c, 0xaf, 0xcd, 0xe0, 0x1b, 0xa5, 0x54, 0xe0, 0x47, 0xa9, 0x29, 0xfc, 0x67, 0x77, + 0x5a, 0x13, 0xc2, 0xf0, 0xb0, 0xe7, 0xee, 0x23, 0xf0, 0xa1, 0xb9, 0xf4, 0x8d, 0x38, 0xee, 0xa3, 0x52, 0xea, 0xfe, 0xd7, 0x55, 0x7a, 0x1b, 0xbe, 0x97, 0x4c, 0xff, 0xd4, 0x5d, 0xbb, 0x0c, 0xfe, + 0x6e, 0xdb, 0xbe, 0xa6, 0x11, 0x5e, 0x4a, 0xb8, 0xc2, 0x00, 0xba, 0x45, 0x37, 0x63, 0xcc, 0xdd, 0x4d, 0xb1, 0xcb, 0x75, 0x40, 0x0e, 0x99, 0xa9, 0xca, 0xd3, 0xdb, 0x8a, 0xa9, 0x53, 0xba, 0xd3, + 0xf6, 0x87, 0x5b, 0x48, 0xb7, 0x67, 0x31, 0x71, 0x02, 0xef, 0x33, 0xce, 0xe4, 0x3d, 0x0c, 0x03, 0x58, 0xef, 0xd5, 0xcd, 0x7b, 0xab, 0xe3, 0x7d, 0xbf, 0x0c, 0xad, 0x43, 0xff, 0x37, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdf, 0xc1, 0x82, 0x54, 0x76, 0x01, 0x00, 0x00, 0x9f, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0x28, 0xa8, 0x2c, 0xc9, 0xc8, 0xcf, 0x53, 0xd0, 0xcd, 0x55, 0x28, 0x48, 0x2c, + 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0x51, 0xd0, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x70, 0x79, + 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x84, 0x93, 0xc1, 0x8e, 0x1a, 0x31, 0x0c, 0x86, 0xef, 0x79, 0x0a, 0x57, 0x5c, + 0xa0, 0x87, 0x61, 0x8f, 0xab, 0xbd, 0x6f, 0xdb, 0x5b, 0x51, 0x3b, 0x55, 0x55, 0x21, 0xd4, 0x09, 0x89, 0x21, 0xe9, 0x66, 0xed, 0x69, 0xec, 0x40, 0x79, 0xfb, 0x2a, 0xc3, 0x0c, 0xb0, 0xda, 0x56, + 0x7b, 0x02, 0xd9, 0xbf, 0x9d, 0xdf, 0xf6, 0x37, 0x33, 0x58, 0x9d, 0x34, 0x30, 0xc1, 0xa7, 0xb6, 0x5d, 0xc1, 0x87, 0x42, 0x4e, 0x23, 0x93, 0x31, 0xdf, 0x31, 0x39, 0x7e, 0x46, 0x50, 0x86, 0x13, + 0x97, 0x0c, 0x84, 0xc7, 0x49, 0xb9, 0x1b, 0x45, 0xd0, 0x67, 0xfe, 0x85, 0x4e, 0xdf, 0x41, 0x1b, 0x10, 0xb6, 0x1c, 0x13, 0xe6, 0x3e, 0x59, 0xc5, 0x8b, 0xc2, 0x38, 0xf6, 0x08, 0xce, 0x12, 0x6c, + 0x11, 0x76, 0x5c, 0xc8, 0x43, 0x24, 0x58, 0x77, 0x35, 0xdf, 0xf4, 0xa7, 0x6e, 0x33, 0x6f, 0x96, 0xe3, 0xff, 0x45, 0x03, 0x6d, 0x88, 0x72, 0x6d, 0x7e, 0x8c, 0x29, 0x41, 0x46, 0xe9, 0x99, 0xbc, + 0x51, 0x86, 0x48, 0x8e, 0x9f, 0x23, 0xed, 0xcf, 0x46, 0x3f, 0x3e, 0xb6, 0x60, 0xc9, 0xc3, 0xea, 0xf3, 0xd7, 0x16, 0x32, 0xfe, 0x2e, 0x28, 0x2a, 0x8d, 0x31, 0xb3, 0x19, 0x3c, 0x92, 0xef, 0x39, + 0x92, 0x8a, 0x31, 0x5f, 0x0a, 0x51, 0x2d, 0xd1, 0xd7, 0x9d, 0xf1, 0x4f, 0xcf, 0x82, 0xa0, 0x21, 0x23, 0x02, 0x4e, 0x25, 0x8d, 0x31, 0x00, 0xef, 0xa1, 0x5b, 0x76, 0xc3, 0x4c, 0x53, 0x1c, 0x76, + 0x9c, 0xcf, 0x6b, 0x98, 0x9a, 0x34, 0xa3, 0x2e, 0xa0, 0x4d, 0x1a, 0x96, 0x19, 0xad, 0x8f, 0x84, 0x22, 0xff, 0xa8, 0xb3, 0x70, 0xc9, 0xc2, 0x59, 0x0e, 0x2e, 0xa0, 0x7b, 0x7a, 0xd9, 0x21, 0xc5, + 0x03, 0xfe, 0xb7, 0xc1, 0x94, 0x7c, 0x59, 0x6f, 0xaa, 0xf2, 0x36, 0x22, 0xd3, 0xaa, 0xad, 0x73, 0x28, 0x82, 0xc3, 0xb6, 0x07, 0xdb, 0xdb, 0xcc, 0x47, 0xc1, 0x0c, 0x56, 0xcd, 0x3a, 0xa8, 0xf6, + 0x0f, 0xcb, 0x65, 0x62, 0x67, 0x53, 0x60, 0xd1, 0x87, 0xfb, 0xbb, 0xfb, 0xbb, 0x57, 0x83, 0x6c, 0xe6, 0x8b, 0xba, 0xe0, 0x37, 0xe4, 0x93, 0xb1, 0xcd, 0x7c, 0xd1, 0x18, 0xf3, 0x83, 0xcb, 0xe0, + 0xa0, 0x08, 0xc2, 0x70, 0x63, 0x88, 0x74, 0xe0, 0x27, 0xec, 0x2a, 0x45, 0x82, 0xe4, 0xc1, 0x8e, 0x9c, 0x8d, 0x17, 0xab, 0x71, 0x0d, 0x57, 0x5e, 0x2e, 0x73, 0x37, 0x66, 0x38, 0x65, 0x8b, 0xa2, + 0x91, 0xf6, 0x75, 0xd2, 0xdb, 0x03, 0x8e, 0xdc, 0x55, 0x24, 0x52, 0xf1, 0x28, 0x60, 0x61, 0x5d, 0x28, 0x2a, 0x28, 0x8a, 0x56, 0xa6, 0xea, 0xef, 0xcf, 0x2b, 0x58, 0xdf, 0x7a, 0x5f, 0xa9, 0xac, + 0x14, 0x18, 0x2b, 0x75, 0x23, 0x60, 0xbd, 0x87, 0x6d, 0x91, 0xf3, 0x55, 0x12, 0xef, 0xa3, 0xbb, 0x90, 0x7e, 0x79, 0x26, 0x12, 0x70, 0xf6, 0x98, 0x07, 0x97, 0xd5, 0x6d, 0x54, 0x81, 0x2d, 0x06, + 0x7b, 0x88, 0x9c, 0x1b, 0x63, 0xba, 0xae, 0x73, 0x4c, 0xc2, 0x09, 0x4d, 0x7f, 0xfe, 0x32, 0x6e, 0xdf, 0xad, 0x69, 0xf3, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x65, 0x8d, 0x58, + 0xbb, 0xa6, 0x01, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x34, 0x8e, 0x41, 0x4e, 0x03, 0x31, + 0x0c, 0x45, 0xf7, 0x39, 0xc5, 0x27, 0x6c, 0x40, 0x42, 0xa8, 0x62, 0xd9, 0x1d, 0xaa, 0xa8, 0x38, 0x00, 0x17, 0x48, 0x27, 0xbf, 0x9d, 0xc0, 0xc4, 0x19, 0x1c, 0xa7, 0x65, 0x84, 0xb8, 0x3b, 0x6a, + 0xda, 0xee, 0xbe, 0x9e, 0xfd, 0xec, 0xbf, 0xd7, 0x92, 0x31, 0x07, 0x9d, 0x52, 0xc8, 0x14, 0x43, 0xca, 0x73, 0x51, 0xc3, 0xa6, 0x88, 0xf1, 0xc7, 0x9c, 0x83, 0x8b, 0xdc, 0x23, 0x87, 0x24, 0x0f, + 0xc3, 0x85, 0xad, 0x6f, 0xc3, 0xc7, 0xb5, 0x03, 0x00, 0xef, 0x3d, 0x7a, 0xd8, 0x36, 0x19, 0x2c, 0x15, 0x81, 0x31, 0xcf, 0x53, 0x30, 0x76, 0xfa, 0x31, 0x12, 0x57, 0xf3, 0xfc, 0x27, 0x64, 0x1a, + 0xb5, 0x93, 0x90, 0xa4, 0xc2, 0x46, 0x62, 0x3b, 0x85, 0xfa, 0x05, 0xe5, 0x77, 0x63, 0x35, 0x94, 0xdd, 0x27, 0x07, 0x43, 0x90, 0x88, 0x20, 0x4b, 0xbf, 0xb1, 0x99, 0x4a, 0x8b, 0x6f, 0xc7, 0x73, + 0x3f, 0xe5, 0xc0, 0x74, 0x64, 0xc4, 0x29, 0xd9, 0xd8, 0xed, 0xab, 0xf7, 0x7c, 0x2b, 0xe3, 0x7a, 0xb8, 0xc7, 0x6b, 0x8c, 0x58, 0x4a, 0x53, 0xec, 0x5a, 0x4d, 0xc2, 0x5a, 0x31, 0x95, 0x43, 0x1a, + 0x30, 0x52, 0x79, 0xd9, 0x51, 0x5a, 0x53, 0xc1, 0x2f, 0x7c, 0x66, 0xad, 0xe1, 0x40, 0xbf, 0x86, 0x7f, 0x2f, 0xa7, 0xb8, 0xdc, 0x79, 0xfc, 0x3d, 0xe1, 0x65, 0xb5, 0x72, 0xff, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x5b, 0x2b, 0x3e, 0x0d, 0xc8, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x2a, 0x48, 0x2c, 0xca, 0xc9, 0x4c, 0xcc, 0x4d, 0xcd, 0x2b, 0xd1, 0x4d, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0x2b, + 0xb6, 0xb5, 0x35, 0xd0, 0x33, 0xd4, 0x33, 0xe0, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x70, 0x79, 0x74, 0x68, + 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x74, 0x8e, 0xc1, 0x4a, 0xc5, 0x30, 0x10, 0x45, 0xf7, 0xf3, 0x15, 0xd7, + 0x59, 0x25, 0x50, 0xca, 0xc3, 0xe5, 0x83, 0xae, 0x44, 0xf1, 0x03, 0xdc, 0x89, 0x0c, 0xa1, 0x9d, 0x4a, 0xa0, 0x49, 0x9f, 0x9d, 0x04, 0x11, 0xf1, 0xdf, 0x65, 0x9e, 0xe8, 0xce, 0xed, 0x3d, 0x67, + 0xe6, 0xde, 0x5c, 0x2e, 0xfb, 0xd1, 0xd0, 0x6b, 0x6e, 0x4d, 0xad, 0x11, 0xad, 0xbd, 0xce, 0x98, 0x20, 0xf2, 0x43, 0x44, 0x02, 0x7b, 0xc4, 0x91, 0x68, 0xde, 0x92, 0x19, 0x9e, 0xd4, 0xda, 0x43, + 0xaf, 0x73, 0xf8, 0xbd, 0x19, 0x3d, 0xb9, 0x4b, 0xa6, 0xf1, 0x4c, 0x04, 0x2c, 0xba, 0xc2, 0x63, 0xf1, 0xb3, 0x60, 0xba, 0xad, 0xf1, 0x4c, 0x00, 0x70, 0xa8, 0x5d, 0x06, 0xcc, 0xfb, 0xa2, 0x98, + 0xe0, 0x70, 0x2c, 0x29, 0xd7, 0xf0, 0xf9, 0x15, 0xaf, 0xd8, 0xcd, 0x31, 0x99, 0xe9, 0xd1, 0xee, 0xdf, 0x7a, 0xda, 0x82, 0xfb, 0xcf, 0x5c, 0xd4, 0x2c, 0xbd, 0x2a, 0xbf, 0x0c, 0xe0, 0xc7, 0xfd, + 0x7d, 0xf9, 0xb8, 0xe1, 0x7f, 0x7c, 0xff, 0x3c, 0xe0, 0xf6, 0x74, 0x8a, 0x44, 0x79, 0x85, 0x48, 0x4d, 0x45, 0x45, 0x30, 0x4d, 0x60, 0x11, 0xef, 0x12, 0x61, 0x9f, 0xf2, 0x37, 0xfc, 0xda, 0x1f, + 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x66, 0x2c, 0x4c, 0x78, 0xb2, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, + 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x3c, 0x90, 0xc1, 0x6a, 0xeb, 0x40, 0x0c, 0x45, 0xf7, 0xfa, 0x0a, 0x43, 0x76, 0x86, 0xa7, 0xfc, 0x43, 0x5e, 0xbb, 0x68, 0xa1, 0xed, + 0xc2, 0x50, 0xba, 0x2b, 0xca, 0x58, 0x71, 0x94, 0x8e, 0x47, 0x83, 0x24, 0x3b, 0xed, 0xdf, 0x97, 0x71, 0x43, 0x36, 0x57, 0xe2, 0x70, 0xc4, 0x05, 0xed, 0xba, 0xc7, 0x94, 0xa5, 0x3a, 0x03, 0x56, + 0xd3, 0x0b, 0xa7, 0x00, 0x4c, 0x99, 0xdc, 0x2b, 0xc5, 0x19, 0xd0, 0x39, 0x42, 0xca, 0xe4, 0x7b, 0x38, 0x4a, 0xd9, 0x03, 0xec, 0xba, 0xa7, 0x12, 0x9c, 0xb3, 0x3c, 0x03, 0xca, 0xc8, 0x04, 0x3d, + 0x4a, 0xb5, 0x96, 0x73, 0x6e, 0x79, 0xf5, 0xe6, 0xbc, 0x72, 0x1c, 0x98, 0x8a, 0x43, 0x39, 0xfe, 0x4b, 0x5a, 0x4e, 0x32, 0x2d, 0x46, 0x21, 0x5a, 0xf0, 0x7b, 0xce, 0x4d, 0x78, 0x17, 0x5f, 0x28, + 0x77, 0x43, 0x2c, 0xa3, 0x68, 0xf7, 0x5f, 0x47, 0x06, 0x5c, 0x3d, 0x6d, 0xf3, 0x44, 0x29, 0xd4, 0x7e, 0xb6, 0x7e, 0xd8, 0x75, 0x6f, 0xc3, 0x07, 0xe0, 0xc3, 0xf0, 0x39, 0x84, 0x1a, 0xff, 0xdd, + 0xce, 0xd0, 0xa3, 0x5f, 0xeb, 0x96, 0xda, 0x50, 0xa5, 0x48, 0x67, 0xe8, 0x51, 0x4d, 0x26, 0xe8, 0xd1, 0xf8, 0xd2, 0xe8, 0x0b, 0xad, 0x5c, 0x20, 0xc8, 0x26, 0x8e, 0x3d, 0x54, 0x9d, 0x5b, 0x3b, + 0x06, 0x4d, 0xf7, 0xdd, 0x38, 0x33, 0x39, 0x1f, 0x28, 0x7d, 0x2d, 0xf5, 0x4e, 0x57, 0x36, 0x17, 0x2d, 0x7e, 0xc3, 0x37, 0xa9, 0xbd, 0xa7, 0xb2, 0x85, 0xb0, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x21, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, + 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x44, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, 0x20, 0x13, 0x92, + 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0xdd, 0x7e, 0x98, 0x21, 0xfd, 0xa3, 0xea, 0xab, + 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, 0x12, 0x5f, 0x73, + 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, 0xf5, 0x4a, 0x1f, + 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, 0x84, 0x2b, 0x58, + 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x57, 0x67, 0x43, 0x2e, 0x35, 0xe3, 0x02, + 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xf9, 0xe7, 0xc1, 0xa0, 0x2c, 0x4b, 0x9f, 0x59, 0xc4, 0xbe, 0xa4, 0xf5, 0x20, 0xad, 0xf6, 0xaa, 0xc1, + 0xdd, 0xf8, 0x76, 0x34, 0x99, 0x8f, 0x2e, 0x3f, 0xf9, 0x57, 0xee, 0xd4, 0x42, 0xa4, 0xa8, 0x14, 0x10, 0xfe, 0xaf, 0xe0, 0x84, 0x31, 0x2c, 0xb7, 0xc0, 0xf2, 0x3c, 0xe5, 0x11, 0x5b, 0xa6, 0x08, + 0x29, 0x2b, 0x2d, 0x3d, 0x6b, 0x42, 0x8c, 0x41, 0x4b, 0x83, 0xba, 0x24, 0xae, 0xb9, 0x58, 0xf7, 0x41, 0xc9, 0x95, 0x2e, 0x19, 0xa1, 0x31, 0x13, 0x73, 0xa5, 0x89, 0x2f, 0x0b, 0x7d, 0x40, 0x5a, + 0x8d, 0x91, 0xab, 0x83, 0x0d, 0x52, 0x00, 0x13, 0xd0, 0x0d, 0xe6, 0x30, 0x9e, 0x77, 0xe1, 0x97, 0x60, 0x3e, 0x9e, 0xf7, 0x8d, 0x91, 0xa7, 0xf1, 0xc3, 0xaf, 0xd3, 0xc5, 0x03, 0x3c, 0x05, 0x61, + 0x18, 0x4c, 0x1e, 0xc6, 0xa3, 0x39, 0x4c, 0x43, 0xb8, 0x9d, 0x4e, 0x86, 0xe3, 0x87, 0xf1, 0x74, 0x32, 0x87, 0xe9, 0x17, 0x08, 0x26, 0x5f, 0xe1, 0x3f, 0xe3, 0xc9, 0xb0, 0x0f, 0xc8, 0x75, 0x82, + 0x04, 0xf8, 0x62, 0x72, 0xab, 0x0c, 0x4c, 0x6e, 0xe8, 0xc4, 0xd8, 0x72, 0x37, 0x47, 0x3c, 0x80, 0xb0, 0x92, 0x15, 0x24, 0x95, 0x63, 0xc4, 0x57, 0x3c, 0x82, 0x94, 0x89, 0x75, 0xc1, 0xd6, 0x08, + 0x6b, 0xb9, 0x41, 0x12, 0x5c, 0xac, 0x21, 0x47, 0xca, 0xb8, 0x32, 0x69, 0x55, 0xc0, 0x44, 0x6c, 0xcc, 0xa4, 0x3c, 0xe3, 0x9a, 0x69, 0x3b, 0x75, 0x12, 0x97, 0x71, 0x34, 0xe8, 0xf0, 0x2c, 0x97, + 0xa4, 0xe1, 0x77, 0xb6, 0x61, 0xbe, 0x40, 0xed, 0x5f, 0x5c, 0x1f, 0x4c, 0x71, 0x79, 0x3c, 0x23, 0xb8, 0xf4, 0xa3, 0x84, 0x09, 0x81, 0xa9, 0x3a, 0x5e, 0x2b, 0x34, 0x4f, 0xfd, 0x19, 0xc9, 0x1c, + 0x49, 0x73, 0x54, 0xd7, 0x9d, 0x4e, 0x5e, 0x2c, 0x53, 0x1e, 0x41, 0x94, 0x32, 0xa5, 0xe0, 0x9e, 0x6d, 0x50, 0x3c, 0x11, 0xcb, 0x73, 0xa4, 0xa1, 0x2c, 0x45, 0x2a, 0x99, 0xc1, 0xf4, 0xa3, 0xd3, + 0x31, 0xc9, 0xcf, 0x89, 0x6f, 0x98, 0x46, 0x50, 0x06, 0x71, 0x04, 0x2b, 0x5b, 0xe4, 0x73, 0x4d, 0x26, 0xb6, 0xa7, 0x30, 0x98, 0xcd, 0x46, 0xe1, 0xf3, 0xe3, 0x28, 0x9c, 0x8f, 0xa7, 0x13, 0xb8, + 0x81, 0xee, 0x95, 0xff, 0x77, 0xff, 0x1f, 0xdd, 0x6b, 0x7b, 0x74, 0x70, 0x71, 0x61, 0xff, 0x87, 0x0b, 0x18, 0xe2, 0x8a, 0x15, 0xa9, 0x86, 0x45, 0x78, 0x67, 0x32, 0x1e, 0x3b, 0x37, 0x36, 0xf0, + 0xcc, 0xf8, 0xbf, 0x2c, 0x2b, 0x00, 0xfe, 0xef, 0x8c, 0x60, 0x45, 0x32, 0xeb, 0x03, 0x5f, 0x81, 0x90, 0xf0, 0xa1, 0xde, 0xbb, 0xa0, 0xf4, 0x83, 0x49, 0x7a, 0x4e, 0x72, 0xc3, 0x63, 0x9b, 0x11, + 0x6b, 0x7b, 0xf0, 0x87, 0x30, 0x87, 0xa3, 0x2f, 0xc1, 0xe2, 0xee, 0xe1, 0x79, 0x38, 0x7d, 0x9a, 0xdc, 0x4d, 0x83, 0xe1, 0xb3, 0x41, 0x71, 0x03, 0x5d, 0x53, 0xd7, 0xea, 0xf3, 0x60, 0x40, 0x98, + 0x4b, 0xdf, 0xa2, 0x68, 0xd6, 0xb7, 0x9d, 0xf8, 0x34, 0xe0, 0x72, 0xa0, 0xd9, 0x77, 0x46, 0x7c, 0x70, 0x80, 0x73, 0xd0, 0xad, 0xdc, 0x03, 0xc0, 0xc7, 0x13, 0x1e, 0x3e, 0x42, 0xf7, 0x70, 0xf7, + 0x65, 0xb7, 0x7d, 0x97, 0x89, 0xb6, 0x7b, 0xdd, 0x39, 0x66, 0x6b, 0xc6, 0x4c, 0xe3, 0xca, 0x16, 0x76, 0xf2, 0x5d, 0x16, 0x6d, 0xdf, 0xf7, 0xa1, 0x4c, 0x78, 0x94, 0x40, 0x66, 0x45, 0x29, 0x92, + 0xc2, 0xf5, 0x74, 0x83, 0x33, 0x70, 0x47, 0xb6, 0xa0, 0x65, 0x6d, 0xdf, 0x68, 0x07, 0x17, 0x4a, 0x23, 0x8b, 0xeb, 0xce, 0x8f, 0x5d, 0x82, 0xa4, 0xc0, 0xf7, 0x13, 0x7b, 0x1f, 0x3c, 0x8e, 0x26, + 0xcf, 0x75, 0x5c, 0xb3, 0x70, 0x3a, 0x1b, 0x85, 0xa6, 0xc3, 0x9e, 0x67, 0xc1, 0xc3, 0xaf, 0x70, 0xb3, 0x63, 0xc8, 0x8c, 0xae, 0x9f, 0x6d, 0xc4, 0xa0, 0x66, 0xef, 0x5c, 0x54, 0xe7, 0xc8, 0x28, + 0x13, 0x24, 0x3c, 0x53, 0x2d, 0x25, 0x4f, 0x53, 0x58, 0x22, 0x28, 0xb6, 0xb1, 0x7a, 0xf2, 0x57, 0xf1, 0xff, 0x3b, 0x08, 0xff, 0x2c, 0xf0, 0xf6, 0xf4, 0x4d, 0x58, 0x86, 0x35, 0xaf, 0x3b, 0xf6, + 0xab, 0x44, 0xa9, 0x44, 0x16, 0x69, 0x6c, 0xd0, 0x16, 0xaa, 0x12, 0x3f, 0x23, 0x14, 0xc4, 0x63, 0x3c, 0xc8, 0xc2, 0xae, 0x3f, 0x0a, 0x4a, 0x77, 0x2a, 0x53, 0x3b, 0x7d, 0x77, 0x78, 0x2e, 0x21, + 0x5f, 0x9f, 0x27, 0xc1, 0xfd, 0x68, 0x17, 0xa6, 0x2b, 0x7e, 0x67, 0x6d, 0x41, 0x69, 0x1d, 0x81, 0x13, 0x05, 0x67, 0x69, 0x23, 0x79, 0x0c, 0x19, 0xe3, 0xc2, 0x73, 0xd6, 0x18, 0xad, 0xd5, 0x6f, + 0xdf, 0x7a, 0xf0, 0x63, 0xc7, 0xce, 0x7c, 0xab, 0x34, 0x66, 0xbe, 0x2c, 0xb4, 0x9f, 0x13, 0x17, 0x3a, 0x15, 0x5e, 0xf7, 0x12, 0x1a, 0x12, 0xa2, 0x34, 0x23, 0x8d, 0xb1, 0xbd, 0xbd, 0xdc, 0xf8, + 0x62, 0x6e, 0xab, 0x25, 0x53, 0x38, 0xe4, 0x84, 0x91, 0x96, 0xb4, 0x85, 0x1b, 0x10, 0x58, 0xda, 0x05, 0xcf, 0xfa, 0xb8, 0xfa, 0xd6, 0xd8, 0xdf, 0xee, 0x63, 0xa1, 0x0c, 0x22, 0x63, 0x06, 0xe2, + 0xda, 0xce, 0x67, 0x30, 0x4d, 0x76, 0x60, 0xda, 0x5f, 0xa3, 0x0e, 0x96, 0x4a, 0xa6, 0x85, 0x46, 0x53, 0x46, 0x5e, 0xaf, 0xe7, 0x62, 0xb5, 0x19, 0x1b, 0xc0, 0x78, 0xf5, 0x76, 0x8f, 0xe1, 0x0b, + 0x57, 0x5a, 0xf5, 0x81, 0x4c, 0xa7, 0x70, 0x6d, 0x04, 0x1c, 0xa2, 0x04, 0xa3, 0xef, 0x46, 0x9c, 0xf8, 0xae, 0xe3, 0x94, 0xb9, 0x46, 0x0b, 0xa5, 0x65, 0xd6, 0x34, 0xbe, 0x67, 0x18, 0x72, 0x46, + 0x2c, 0x43, 0xbd, 0x4b, 0x5e, 0x4d, 0x44, 0xd6, 0x90, 0x5e, 0x27, 0xd0, 0x5b, 0xbb, 0xd0, 0xe0, 0xe4, 0x20, 0xa2, 0xfe, 0xdb, 0x3d, 0xd7, 0x24, 0xae, 0xca, 0x9a, 0x29, 0xa0, 0x9b, 0x56, 0x05, + 0xdc, 0x6f, 0xe5, 0x2b, 0xef, 0x1c, 0x10, 0xbf, 0x62, 0xc0, 0xeb, 0x35, 0xf3, 0x5e, 0xc3, 0x1f, 0x8b, 0xbc, 0xd0, 0x73, 0x4d, 0xc8, 0xb2, 0xb3, 0x91, 0x34, 0xf7, 0xdc, 0x80, 0x28, 0xd2, 0xf4, + 0xfa, 0xc0, 0x8e, 0xa6, 0xed, 0x91, 0x65, 0x33, 0xde, 0x69, 0xcd, 0x51, 0xd4, 0x98, 0x3d, 0x1b, 0x48, 0xef, 0xfa, 0xc4, 0xc9, 0xfe, 0x46, 0x6c, 0xf3, 0x67, 0xa6, 0x2b, 0x17, 0xfb, 0x09, 0xaf, + 0xc5, 0x4a, 0xfb, 0x51, 0xdf, 0x74, 0xc0, 0x59, 0x30, 0x0d, 0xc0, 0x2d, 0x16, 0xab, 0x94, 0x9d, 0xb1, 0xbb, 0x46, 0x5d, 0x5b, 0xf2, 0xce, 0xf6, 0x77, 0xdf, 0xd8, 0x38, 0xb2, 0xfc, 0x0a, 0x11, + 0xd3, 0x51, 0x02, 0xde, 0x78, 0x3a, 0xb2, 0x8f, 0x45, 0xf3, 0xd0, 0xc4, 0xe3, 0xb4, 0xc2, 0xd9, 0x96, 0x1b, 0x85, 0xe1, 0x34, 0x04, 0x13, 0x96, 0x29, 0xab, 0x0f, 0xa6, 0xd7, 0xde, 0x96, 0xff, + 0x8f, 0xd0, 0xfd, 0xd0, 0x3d, 0x01, 0x61, 0x05, 0x2a, 0x6d, 0xcb, 0x79, 0x7b, 0x25, 0xc0, 0xdb, 0xf5, 0xd9, 0x2c, 0x88, 0x9f, 0xaa, 0xfa, 0x6a, 0x0b, 0xa9, 0x1e, 0xef, 0x30, 0xe3, 0x47, 0xa9, + 0x54, 0xd8, 0x96, 0x69, 0x33, 0x5e, 0x4f, 0x66, 0xdf, 0xcf, 0x2b, 0x38, 0xcd, 0x59, 0x0b, 0x49, 0x08, 0xbe, 0xef, 0x9f, 0xda, 0xea, 0xb4, 0xff, 0xf5, 0xfa, 0x4e, 0xc9, 0x35, 0x99, 0x31, 0x6f, + 0xa7, 0x4a, 0x0a, 0xab, 0x1a, 0x38, 0x14, 0x1c, 0x59, 0xe8, 0xbc, 0xd0, 0x6f, 0x4a, 0xcc, 0xa9, 0x68, 0x1e, 0x8b, 0x4e, 0x7d, 0x51, 0xf6, 0x0e, 0x24, 0xe4, 0xa7, 0xbd, 0x6d, 0x5b, 0xa5, 0x8c, + 0x50, 0xd8, 0xbf, 0xbc, 0xde, 0x59, 0x15, 0xf9, 0x83, 0x63, 0xd9, 0xf7, 0x98, 0x53, 0xcb, 0xb1, 0x33, 0x4c, 0x9c, 0x4d, 0xfb, 0xae, 0x7c, 0x23, 0x42, 0x66, 0xbe, 0x33, 0x1c, 0x0f, 0xfb, 0xcb, + 0xa3, 0x2a, 0xe8, 0x37, 0xa0, 0x9c, 0x90, 0xd2, 0x5e, 0xdf, 0x7f, 0x29, 0x65, 0x5a, 0x56, 0x09, 0x3b, 0x74, 0x7f, 0x72, 0x71, 0xd5, 0x06, 0x4f, 0x1b, 0xa5, 0x7e, 0x2e, 0x98, 0xa3, 0x5f, 0x48, + 0x66, 0x8b, 0xf0, 0xce, 0x2b, 0x28, 0xed, 0x37, 0x2c, 0x1e, 0x01, 0x6d, 0x03, 0x35, 0x94, 0x02, 0x8f, 0x03, 0x72, 0xfb, 0xf0, 0x85, 0x6b, 0xef, 0xaa, 0xb1, 0xb6, 0xab, 0xfa, 0x87, 0x84, 0x64, + 0x69, 0x3f, 0xeb, 0x4e, 0x6a, 0xfe, 0x8c, 0x8e, 0x10, 0x49, 0xda, 0x21, 0xe6, 0x62, 0x7d, 0xec, 0x12, 0xab, 0xdd, 0x73, 0xcd, 0xa2, 0xef, 0x0f, 0xc4, 0xa2, 0x93, 0x5e, 0x6c, 0x62, 0xfa, 0x5b, + 0x13, 0x53, 0xa7, 0xfa, 0xd7, 0xfe, 0x77, 0xf4, 0x2e, 0xb2, 0xaf, 0x99, 0x36, 0x9a, 0xf6, 0xd7, 0x64, 0xf5, 0xab, 0x5f, 0xf5, 0x49, 0x8c, 0x4a, 0x73, 0x61, 0xbf, 0xd1, 0x7a, 0xa0, 0x4d, 0x8c, + 0x0a, 0xf6, 0xed, 0xfd, 0xa3, 0x51, 0xf7, 0xe0, 0x39, 0x3c, 0x6b, 0xd4, 0x28, 0x36, 0x5e, 0xf7, 0xfe, 0x71, 0xf2, 0xf4, 0xbc, 0x98, 0x8f, 0x42, 0xa3, 0xca, 0xdd, 0x5e, 0x2d, 0x4b, 0xf0, 0xf3, + 0xcf, 0xd0, 0xb6, 0x73, 0x16, 0xcc, 0xe7, 0x4f, 0xd3, 0x70, 0xb8, 0xdf, 0x79, 0xc2, 0xa3, 0x83, 0xa8, 0x90, 0x84, 0x79, 0x59, 0xde, 0xb4, 0xda, 0xd9, 0x7b, 0x3c, 0x64, 0x2b, 0x4a, 0x18, 0xfd, + 0xf6, 0x0d, 0x72, 0xa6, 0x54, 0x29, 0x29, 0x3e, 0x73, 0x7a, 0x8f, 0xc2, 0xd7, 0xf2, 0x36, 0x61, 0x14, 0x10, 0xb1, 0xed, 0x31, 0xf3, 0x41, 0xa1, 0x13, 0x14, 0x9a, 0x47, 0x4c, 0x4b, 0xf2, 0x15, + 0x6a, 0xf7, 0x59, 0xe7, 0x19, 0x25, 0x39, 0x58, 0xf4, 0xda, 0x5a, 0xf6, 0x5f, 0x53, 0xf7, 0xd6, 0x3d, 0x59, 0xc9, 0x49, 0x6a, 0x8c, 0xcc, 0x67, 0xfc, 0xcc, 0xe1, 0x6c, 0x58, 0x33, 0x8c, 0xdb, + 0x76, 0x6c, 0x5b, 0x69, 0x75, 0x64, 0x06, 0xa1, 0x2e, 0x48, 0x54, 0x17, 0x78, 0xfb, 0xc9, 0x9a, 0xd0, 0xfe, 0x8e, 0x9c, 0x16, 0xd1, 0x3f, 0x92, 0xe4, 0x93, 0x72, 0x33, 0xc3, 0xbc, 0xa8, 0x4b, + 0x5c, 0x2a, 0xae, 0x6b, 0x55, 0x75, 0x0d, 0x58, 0x65, 0xae, 0x71, 0x26, 0x44, 0x16, 0x9b, 0x66, 0xf9, 0x65, 0xab, 0xf1, 0xb6, 0xfa, 0x5a, 0x07, 0x5a, 0x46, 0xfb, 0x0d, 0xb4, 0x8c, 0xe0, 0x06, + 0x6e, 0xeb, 0x0f, 0x79, 0x81, 0xa5, 0xfb, 0xed, 0x39, 0x07, 0xbe, 0xcc, 0x51, 0xb8, 0xb7, 0x4e, 0xef, 0xe8, 0x5d, 0x3d, 0xb5, 0xdd, 0xee, 0x6e, 0xc3, 0x95, 0x54, 0x0d, 0x89, 0x6f, 0x2e, 0x79, + 0xcd, 0xe2, 0xde, 0x5b, 0x58, 0x49, 0xfb, 0xba, 0xa8, 0xfd, 0xf5, 0x7c, 0x4d, 0x4c, 0xa8, 0x15, 0x92, 0x69, 0x15, 0x8f, 0x96, 0x51, 0x1f, 0xae, 0xfa, 0x70, 0x27, 0xc5, 0xda, 0xbf, 0x0f, 0xfe, + 0xfb, 0xfc, 0x18, 0xdc, 0x2d, 0x46, 0x47, 0xc7, 0x4f, 0xae, 0x4e, 0x5a, 0x46, 0x87, 0x93, 0xaf, 0x9d, 0xce, 0x6b, 0xe7, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x25, + 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, + 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x8c, 0xcd, 0x4d, 0x0a, 0xc2, 0x40, 0x0c, 0xc5, 0xf1, 0x7d, 0xef, 0x92, 0x17, 0xb1, 0xd8, 0x85, 0xe0, 0x31, 0x3c, 0x40, 0xaa, 0x83, 0x8d, 0x1f, 0x33, 0x21, 0x8d, 0x0a, 0x9e, 0x5e, 0x9c, + 0xe9, 0xa6, 0x3b, 0x77, 0xf9, 0xff, 0x20, 0xbc, 0xb3, 0xce, 0xe1, 0x3a, 0x3e, 0x43, 0x4b, 0x3e, 0xfa, 0xfd, 0x30, 0x45, 0xd8, 0xbc, 0x67, 0xf6, 0x64, 0x05, 0x0f, 0x79, 0xa5, 0x0c, 0x31, 0x39, + 0x4d, 0x09, 0xc5, 0x2f, 0x5c, 0x61, 0xcb, 0xbf, 0xb3, 0x69, 0x93, 0x25, 0xa8, 0x45, 0x8f, 0x01, 0xfd, 0x8a, 0xa8, 0x12, 0x8d, 0x9a, 0xf1, 0x51, 0xeb, 0xde, 0x2e, 0x66, 0xc9, 0xff, 0x9e, 0xd3, + 0xc2, 0x21, 0x37, 0x71, 0x6d, 0x40, 0xcb, 0x3f, 0x6f, 0xb0, 0xc3, 0xb0, 0x36, 0xaa, 0x86, 0xab, 0x78, 0xf7, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x33, 0xbc, 0x87, 0xa7, 0x76, + 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, + 0x6d, 0x64, 0x94, 0x55, 0x59, 0x6f, 0xdb, 0x38, 0x10, 0x7e, 0xe7, 0xaf, 0x98, 0x95, 0x0b, 0xf4, 0x40, 0x2d, 0x27, 0x0f, 0x05, 0x0a, 0x01, 0x29, 0x90, 0xc3, 0x69, 0xd5, 0x75, 0xb2, 0x5d, 0x47, + 0xee, 0xa2, 0x80, 0x01, 0x8b, 0xa6, 0xc6, 0x12, 0x6d, 0x8a, 0xd4, 0xf2, 0x90, 0x6b, 0x14, 0xdd, 0xdf, 0xbe, 0xa0, 0x24, 0x5f, 0x49, 0xbc, 0xc7, 0x9b, 0xc4, 0xf9, 0x66, 0x38, 0xf3, 0xcd, 0x37, + 0xc3, 0x1e, 0xdc, 0x3a, 0xc9, 0x2c, 0x57, 0x12, 0x2a, 0xad, 0x96, 0xc8, 0x2c, 0x21, 0x7f, 0xa0, 0x60, 0xaa, 0x44, 0xb0, 0x0a, 0x36, 0xca, 0x69, 0x90, 0xb8, 0x86, 0xdf, 0x1d, 0xd5, 0x2b, 0x67, + 0x60, 0xf1, 0x08, 0xfd, 0x0b, 0x21, 0x49, 0xc1, 0x0d, 0x18, 0x5a, 0x56, 0x02, 0xb7, 0xa7, 0xc0, 0x94, 0xb4, 0x94, 0x4b, 0x03, 0x14, 0x0c, 0x97, 0xb9, 0xc0, 0x9d, 0x63, 0x04, 0xe9, 0xf6, 0xd3, + 0x84, 0xdb, 0xbb, 0xc3, 0xed, 0xd1, 0xab, 0xd7, 0xe9, 0x5b, 0x62, 0x8b, 0x3d, 0x1c, 0x96, 0xce, 0x58, 0xd0, 0x68, 0x9d, 0x96, 0x06, 0xb8, 0x35, 0x40, 0x75, 0xee, 0x4a, 0x94, 0x36, 0x24, 0xa4, + 0xd7, 0x83, 0x91, 0x62, 0x54, 0x00, 0x7e, 0x47, 0xe6, 0x3c, 0x9c, 0xdc, 0xd1, 0x15, 0x82, 0x71, 0x1a, 0xc1, 0x16, 0xd4, 0x42, 0xfa, 0x99, 0xd6, 0x14, 0xce, 0xcf, 0xe1, 0xe1, 0xe6, 0xd7, 0x14, + 0xb8, 0x01, 0x2e, 0x8d, 0xa5, 0x42, 0x60, 0x16, 0x12, 0x92, 0x28, 0x30, 0x96, 0x6a, 0x0b, 0x06, 0x75, 0x8d, 0x1a, 0x84, 0x8f, 0x25, 0x36, 0xa0, 0x9d, 0x84, 0x34, 0x1c, 0x94, 0xb5, 0x5c, 0xc3, + 0x9f, 0x6d, 0xdd, 0x51, 0x86, 0x75, 0x1a, 0x92, 0xa4, 0x40, 0x60, 0xaa, 0x2c, 0xa9, 0xcc, 0x5a, 0x57, 0x03, 0x85, 0xb5, 0xd5, 0x36, 0x80, 0x3f, 0xa6, 0xce, 0xaa, 0x92, 0x5a, 0xde, 0x86, 0x5a, + 0x53, 0xcb, 0x0a, 0x34, 0xb0, 0x50, 0x1a, 0x58, 0x41, 0x65, 0x8e, 0x06, 0xd4, 0x02, 0x8c, 0x72, 0x9a, 0xf9, 0x50, 0x19, 0x86, 0x24, 0x3e, 0xfa, 0xdf, 0xc1, 0x3c, 0x0b, 0xed, 0x37, 0xac, 0xb9, + 0x10, 0x30, 0x6f, 0xd8, 0xad, 0x68, 0x4e, 0x2d, 0x66, 0xbe, 0x37, 0xda, 0x49, 0xc9, 0x65, 0xde, 0x5d, 0x1e, 0x42, 0x6c, 0x81, 0x0a, 0xa3, 0x40, 0x55, 0x28, 0x0d, 0x64, 0x38, 0x77, 0x79, 0xee, + 0xed, 0x95, 0xd2, 0x16, 0xd2, 0x77, 0x67, 0x67, 0xef, 0x52, 0x62, 0x54, 0x67, 0x40, 0x0d, 0x8c, 0x4a, 0x1f, 0x94, 0x5a, 0x4b, 0x59, 0x81, 0x19, 0xf0, 0x05, 0x48, 0xc4, 0x6c, 0x4b, 0x8d, 0x67, + 0xc1, 0xa2, 0xb1, 0xcf, 0xd2, 0xe2, 0x0d, 0x69, 0xdb, 0x01, 0xcf, 0x49, 0xd3, 0xd2, 0x14, 0xae, 0x47, 0x31, 0x21, 0xb1, 0x7d, 0x69, 0x40, 0xa3, 0xa7, 0x09, 0x65, 0xd6, 0xa6, 0x6a, 0xd0, 0x42, + 0x7a, 0x3b, 0xb9, 0xbf, 0x9e, 0x8d, 0x87, 0x1f, 0xe3, 0x87, 0x64, 0xfc, 0x2d, 0x05, 0x94, 0x35, 0xd7, 0x4a, 0xfa, 0x56, 0x42, 0x4d, 0x35, 0xa7, 0x73, 0x81, 0x21, 0x49, 0xd3, 0xd4, 0x14, 0x28, + 0x04, 0x18, 0xa6, 0x79, 0x65, 0x49, 0x0f, 0x34, 0x56, 0x82, 0x32, 0x84, 0xbf, 0x06, 0xe1, 0x9c, 0x9a, 0x42, 0x33, 0x98, 0x6f, 0x5a, 0x5d, 0xb6, 0x40, 0xcd, 0x60, 0xc1, 0x05, 0x1e, 0x20, 0x33, + 0xc5, 0x56, 0xa8, 0x43, 0xae, 0x06, 0x4b, 0x55, 0xc8, 0x4c, 0x79, 0x02, 0x6d, 0xd1, 0xfa, 0x68, 0xcc, 0xb9, 0xb1, 0x7a, 0x43, 0xf0, 0x7b, 0xc3, 0xcb, 0x51, 0x52, 0x17, 0x4f, 0x3c, 0x09, 0xb2, + 0x42, 0x41, 0xf0, 0xdf, 0xc0, 0x01, 0x7c, 0xf8, 0x70, 0x90, 0xa6, 0xaf, 0xc5, 0x33, 0xd4, 0x83, 0x2b, 0xc7, 0x45, 0xc6, 0x65, 0xde, 0xcd, 0xca, 0x56, 0x41, 0x73, 0x7f, 0x6c, 0xe0, 0xb7, 0xeb, + 0x18, 0x78, 0x49, 0x73, 0x6c, 0x54, 0x72, 0x28, 0xfe, 0x90, 0x3c, 0xe1, 0xc3, 0x9b, 0x5a, 0xc7, 0x36, 0xfc, 0xd5, 0x06, 0x32, 0x5c, 0x50, 0x27, 0xec, 0x5b, 0xf8, 0xfc, 0xf5, 0xae, 0x35, 0x79, + 0xa1, 0x3b, 0xe3, 0x1b, 0x99, 0x28, 0x40, 0xe9, 0x99, 0x05, 0x49, 0x2d, 0xaf, 0xb1, 0xb3, 0xfb, 0x7e, 0x2c, 0x94, 0x10, 0x6a, 0xed, 0x05, 0xf2, 0x5c, 0x27, 0x8c, 0x6f, 0x5b, 0xd3, 0xd6, 0x70, + 0x43, 0x4b, 0x91, 0x46, 0xfe, 0x3a, 0xff, 0x45, 0x9a, 0x08, 0x43, 0x59, 0x9b, 0x88, 0x00, 0xf4, 0x41, 0xd2, 0x12, 0x23, 0xb8, 0xfa, 0x32, 0xbb, 0xbf, 0x4c, 0xe2, 0xaf, 0xc3, 0x59, 0x7c, 0x77, + 0xf9, 0x71, 0x48, 0x00, 0x00, 0x6a, 0x2a, 0x1c, 0x46, 0x10, 0x58, 0xed, 0x30, 0x38, 0xc6, 0xde, 0x5d, 0x7e, 0x1d, 0xde, 0xcf, 0xae, 0x26, 0xf1, 0x28, 0x99, 0x5d, 0x8e, 0x93, 0xf8, 0xf6, 0xf2, + 0x3a, 0x39, 0xf4, 0xb1, 0x54, 0xe7, 0x68, 0x07, 0x6d, 0xce, 0xfd, 0x76, 0x3a, 0xcc, 0xe0, 0xcd, 0xa9, 0x20, 0x37, 0xb3, 0xcb, 0xf1, 0xc7, 0xc9, 0xdd, 0xf0, 0x3e, 0x79, 0x38, 0x8c, 0x52, 0x51, + 0xb6, 0xf2, 0xb4, 0xf6, 0x6f, 0xcc, 0x8a, 0x57, 0x09, 0x1a, 0x6b, 0x2e, 0x7c, 0x32, 0xd0, 0xbf, 0x29, 0x69, 0x8d, 0x32, 0x5c, 0xd2, 0x9a, 0x66, 0x8a, 0x85, 0xde, 0xbc, 0xb5, 0x74, 0x03, 0x1f, + 0x76, 0xce, 0xa1, 0xdd, 0x54, 0x78, 0x71, 0x9c, 0xc8, 0xe9, 0xba, 0x1f, 0x67, 0x33, 0xbb, 0x8d, 0x47, 0x47, 0x64, 0x74, 0x81, 0x9a, 0x76, 0x87, 0x54, 0xe7, 0xff, 0x16, 0xeb, 0x79, 0x7a, 0x5e, + 0xbe, 0xe9, 0xfb, 0xe1, 0x47, 0x1d, 0x2e, 0xa9, 0x7e, 0xb9, 0xd7, 0xd9, 0xb8, 0xdd, 0x08, 0x8f, 0x64, 0xa6, 0x9d, 0x34, 0x47, 0xb2, 0xda, 0x4d, 0x34, 0x97, 0x40, 0xb7, 0xab, 0x1a, 0x35, 0x71, + 0x7e, 0x55, 0x37, 0xc8, 0x56, 0x8e, 0x4c, 0x63, 0xb3, 0x6b, 0xe8, 0x5c, 0xd5, 0xcf, 0x8c, 0x66, 0x23, 0x45, 0xed, 0xe4, 0xfe, 0xfe, 0x1b, 0xac, 0x84, 0xda, 0x3c, 0xc9, 0xc0, 0x74, 0x0b, 0xac, + 0x91, 0x9e, 0xcf, 0x28, 0x6b, 0x70, 0xc7, 0x39, 0x71, 0x69, 0x15, 0x30, 0xe1, 0x8c, 0x45, 0x7d, 0x4a, 0xf7, 0x9d, 0x5f, 0xaf, 0xdd, 0x73, 0x56, 0x73, 0xbf, 0xc7, 0xcc, 0xe1, 0x38, 0xf4, 0x0e, + 0xde, 0x33, 0x2e, 0x6b, 0xc5, 0x68, 0xf3, 0x2a, 0x90, 0x1b, 0x05, 0x52, 0x79, 0xcd, 0x7b, 0x5d, 0xed, 0x36, 0xd2, 0x64, 0x3c, 0x4a, 0x77, 0x8a, 0xf7, 0xa7, 0x3e, 0x23, 0xad, 0x9c, 0x45, 0xbf, + 0xa4, 0x9b, 0x7d, 0x71, 0x30, 0x8a, 0xdf, 0x94, 0x83, 0xc6, 0x7b, 0x07, 0x9a, 0x6f, 0x0e, 0xa6, 0xa8, 0x2b, 0xf6, 0x04, 0x4f, 0x5c, 0x2e, 0xd4, 0x9e, 0x28, 0x36, 0x19, 0x8f, 0x9e, 0xd6, 0x38, + 0x19, 0x8f, 0x2e, 0xfc, 0x73, 0x12, 0x0d, 0x06, 0x4d, 0x87, 0x0a, 0x65, 0x6c, 0xf4, 0xfe, 0xec, 0xfd, 0xd9, 0x80, 0x30, 0xa7, 0x05, 0xf4, 0x6b, 0x78, 0xf1, 0x63, 0x32, 0x1e, 0xfd, 0x84, 0xa9, + 0x97, 0xcd, 0x27, 0x08, 0xae, 0x95, 0xb4, 0x28, 0x6d, 0x3f, 0xd9, 0x54, 0x18, 0xd1, 0xaa, 0x12, 0xbc, 0x2d, 0x78, 0xb0, 0x34, 0x4a, 0x06, 0x7b, 0x18, 0xf6, 0xe3, 0x2c, 0x3a, 0x3f, 0x3a, 0x78, + 0x68, 0xb4, 0x1c, 0x31, 0xa1, 0x5c, 0xd6, 0xc7, 0xda, 0x47, 0xc1, 0xef, 0xcd, 0x23, 0x7e, 0x04, 0x6b, 0x22, 0x67, 0x58, 0x87, 0xab, 0x56, 0xba, 0xe1, 0x73, 0xa0, 0x87, 0x0a, 0x59, 0x8d, 0xda, + 0xf8, 0xe7, 0xfd, 0x3c, 0x3c, 0xeb, 0x6c, 0x19, 0x04, 0x3f, 0xa6, 0x41, 0x89, 0xc6, 0xd0, 0x1c, 0xa7, 0x41, 0x04, 0xd3, 0xe0, 0xc5, 0xab, 0x75, 0xa1, 0x68, 0xc9, 0x5f, 0x4f, 0x83, 0x9f, 0xd3, + 0x20, 0xd8, 0x13, 0xf2, 0x29, 0x49, 0xbe, 0x70, 0xfc, 0x5f, 0x94, 0x34, 0x0f, 0xef, 0x31, 0x25, 0xff, 0x48, 0x47, 0x8b, 0x68, 0x99, 0xd8, 0x7e, 0x9f, 0x26, 0x61, 0x8b, 0x38, 0x55, 0xff, 0x2e, + 0xc2, 0x71, 0xe9, 0xcd, 0x71, 0x57, 0xf2, 0xc5, 0xae, 0xda, 0xa6, 0xce, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xff, 0xdb, 0x53, 0x2f, 0x30, 0x04, 0x00, 0x00, 0x6a, 0x09, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, + 0x6c, 0xca, 0xcc, 0x2b, 0xcb, 0x4f, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf, 0xb3, 0xe2, 0x52, 0x50, 0x48, 0xcb, 0x2f, 0xca, 0x4d, 0x2c, 0xb1, 0x52, 0x50, 0x4a, 0xce, 0xc9, 0x2f, 0x4d, 0x49, 0x2d, 0x4b, + 0xcd, 0x2b, 0x51, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x45, 0xf7, 0x4e, 0x8b, 0x29, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6d, 0x73, 0xda, 0x48, 0x93, 0xdf, 0xf5, 0x2b, 0x3a, 0x82, 0x8a, 0xed, 0x94, 0x25, + 0xd9, 0xb9, 0xba, 0x7b, 0x9e, 0xb3, 0x8f, 0xad, 0x23, 0x98, 0x24, 0x64, 0x6d, 0x70, 0x81, 0x1d, 0x67, 0x2b, 0xce, 0xc1, 0x20, 0x0d, 0x30, 0xb6, 0x98, 0x51, 0x66, 0x46, 0x60, 0x36, 0xeb, 0xff, + 0x7e, 0xd5, 0x33, 0x12, 0x92, 0x00, 0x67, 0x93, 0x4d, 0xc2, 0xd6, 0xd6, 0x5a, 0xa3, 0x7e, 0x7f, 0x9b, 0xee, 0xd6, 0xd6, 0x9e, 0x05, 0x63, 0xc6, 0x03, 0x35, 0x73, 0x6a, 0xe0, 0xfd, 0xc4, 0x9f, + 0x53, 0x83, 0x73, 0x16, 0x52, 0xae, 0x68, 0x04, 0x5a, 0x80, 0x9e, 0x51, 0x68, 0x26, 0x24, 0x9c, 0x51, 0x18, 0x88, 0x89, 0x5e, 0x12, 0x49, 0xe1, 0xb5, 0x48, 0x79, 0x44, 0x34, 0x13, 0x1c, 0xf6, + 0x9b, 0x83, 0xd7, 0x07, 0x90, 0xf2, 0x88, 0x4a, 0x10, 0x9c, 0x3a, 0x35, 0x10, 0x12, 0xe6, 0x42, 0x52, 0x08, 0x05, 0xd7, 0x92, 0x8d, 0x53, 0x2d, 0x24, 0xc4, 0x96, 0x20, 0x90, 0xa9, 0xa4, 0x74, + 0x4e, 0xb9, 0x56, 0x3e, 0xc0, 0x80, 0x52, 0x43, 0xbd, 0xdb, 0xbb, 0xea, 0xb4, 0xda, 0x30, 0x61, 0x31, 0xa2, 0x47, 0x4c, 0x59, 0x34, 0x1a, 0xc1, 0x92, 0xe9, 0x19, 0xe8, 0x19, 0x53, 0xb0, 0x14, + 0xf2, 0x1e, 0x26, 0x42, 0x02, 0x89, 0x22, 0x86, 0x8c, 0x49, 0x0c, 0x8c, 0x4f, 0x84, 0x9c, 0x1b, 0x31, 0x9c, 0x1a, 0x48, 0x3a, 0x25, 0x32, 0x62, 0x7c, 0x0a, 0xa1, 0x48, 0x56, 0x92, 0x4d, 0x67, + 0x1a, 0xc4, 0x92, 0x53, 0xa9, 0x66, 0x2c, 0xf1, 0x01, 0xae, 0x50, 0x8f, 0xc1, 0xeb, 0x5c, 0x14, 0x65, 0xe9, 0x66, 0x4c, 0xb5, 0x80, 0x95, 0x48, 0x33, 0x35, 0x4a, 0x1a, 0x67, 0x86, 0x38, 0x84, + 0xf7, 0x54, 0x2a, 0x54, 0xf7, 0xa5, 0x7f, 0x04, 0xfb, 0x7a, 0x86, 0x38, 0x6e, 0xf6, 0xd2, 0x3d, 0x38, 0x35, 0xc8, 0x73, 0xb2, 0x02, 0x2e, 0x34, 0xa4, 0x8a, 0x16, 0xb4, 0x81, 0x3e, 0x84, 0x34, + 0xd1, 0xc0, 0x38, 0x84, 0x62, 0x9e, 0xc4, 0x8c, 0xf0, 0x10, 0x91, 0x33, 0xcd, 0xd6, 0x1c, 0x7c, 0x80, 0x3f, 0x32, 0x1a, 0x62, 0xac, 0x09, 0xe3, 0x40, 0x8c, 0x1e, 0x20, 0x26, 0x65, 0x30, 0x20, + 0xda, 0xa9, 0x39, 0x35, 0x00, 0x80, 0x99, 0xd6, 0xc9, 0x49, 0x10, 0x2c, 0x97, 0x4b, 0x9f, 0x18, 0x61, 0x7d, 0x21, 0xa7, 0x41, 0xae, 0x5d, 0x70, 0xde, 0x69, 0xb5, 0xbb, 0x83, 0xb6, 0xf7, 0xd2, + 0x3f, 0x32, 0x18, 0xd7, 0x3c, 0xa6, 0x4a, 0x81, 0xa4, 0x9f, 0x53, 0x26, 0x69, 0x04, 0xe3, 0x15, 0x90, 0x24, 0x89, 0x59, 0x48, 0xc6, 0x31, 0x85, 0x98, 0x2c, 0xd1, 0x6f, 0xc6, 0x3d, 0xc6, 0xeb, + 0x8c, 0xc3, 0x52, 0x32, 0xcd, 0xf8, 0xf4, 0xd0, 0xa9, 0x81, 0xca, 0x1d, 0x5f, 0x76, 0x4e, 0x61, 0xac, 0x5c, 0x38, 0xa6, 0x2a, 0x00, 0x82, 0x03, 0x41, 0xcf, 0xb8, 0xcd, 0x01, 0x74, 0x06, 0x2e, + 0xbc, 0x6a, 0x0e, 0x3a, 0x83, 0x43, 0xb8, 0xe9, 0x5c, 0xbd, 0xed, 0x5d, 0x5f, 0xc1, 0x4d, 0xb3, 0xdf, 0x6f, 0x76, 0xaf, 0x3a, 0xed, 0x01, 0xf4, 0xfa, 0xd0, 0xea, 0x75, 0xcf, 0x3a, 0x57, 0x9d, + 0x5e, 0x77, 0x00, 0xbd, 0xd7, 0xd0, 0xec, 0xfe, 0xe1, 0xd4, 0xe0, 0xf7, 0x4e, 0xf7, 0xec, 0x10, 0x28, 0xd3, 0x33, 0x2a, 0x81, 0x3e, 0x24, 0x12, 0x35, 0x10, 0x12, 0x18, 0x1a, 0x92, 0x46, 0xa5, + 0x10, 0xca, 0x25, 0xc0, 0x08, 0xb1, 0xde, 0x51, 0x09, 0x0d, 0xd9, 0x84, 0x85, 0x10, 0x13, 0x3e, 0x4d, 0xc9, 0x94, 0xc2, 0x54, 0x2c, 0xa8, 0xe4, 0x18, 0x20, 0x09, 0x95, 0x73, 0xa6, 0xd0, 0x9f, + 0x0a, 0x08, 0x8f, 0x20, 0x66, 0x73, 0xa6, 0x4d, 0x1c, 0x29, 0xa7, 0xb6, 0xad, 0x97, 0xff, 0xb3, 0x13, 0xec, 0x67, 0xd3, 0xab, 0xc1, 0x05, 0x59, 0x50, 0x0e, 0x03, 0x4d, 0xa4, 0x86, 0xeb, 0x04, + 0x5e, 0x11, 0x1d, 0xce, 0x40, 0x85, 0x92, 0x25, 0x36, 0x5e, 0xfa, 0xb9, 0xdb, 0xdb, 0xdd, 0xf7, 0xb0, 0x20, 0x52, 0x9d, 0xec, 0x94, 0xc1, 0x44, 0xd6, 0xbb, 0xe6, 0xfb, 0xe6, 0xf0, 0x6d, 0xef, + 0xa2, 0x0d, 0x1e, 0xc4, 0x22, 0xb4, 0x69, 0x2e, 0x26, 0x40, 0xe0, 0xdd, 0xd9, 0xef, 0x30, 0x13, 0x73, 0x0c, 0x03, 0x69, 0xc8, 0xf6, 0x92, 0x2c, 0x15, 0x73, 0xb2, 0xbb, 0xa8, 0x1a, 0xa2, 0x17, + 0x2f, 0x77, 0x91, 0x9c, 0xa3, 0xd8, 0x2f, 0xf7, 0x14, 0x30, 0xae, 0x34, 0x89, 0x63, 0x1a, 0x95, 0xe8, 0x23, 0x56, 0xf3, 0x7d, 0xbb, 0x3b, 0xec, 0x5d, 0x5e, 0x0d, 0xc0, 0x83, 0x84, 0x48, 0x32, + 0xa7, 0x9a, 0x4a, 0x05, 0x09, 0x51, 0xa5, 0xea, 0xf4, 0x8e, 0x2c, 0x08, 0xbc, 0xbf, 0x80, 0xe5, 0x8c, 0x72, 0x90, 0x29, 0x37, 0x3e, 0x36, 0x16, 0xb1, 0x99, 0x02, 0xd4, 0x9f, 0xfa, 0x08, 0x1c, + 0xd1, 0x71, 0x9a, 0xbd, 0x01, 0xa6, 0x15, 0x8d, 0x27, 0x87, 0x98, 0xad, 0x19, 0x14, 0x80, 0xa2, 0xba, 0xc4, 0xb2, 0xe1, 0x7d, 0xb0, 0x08, 0xde, 0x07, 0x99, 0xf2, 0xbb, 0x68, 0x99, 0x9c, 0x68, + 0x49, 0xb8, 0x4a, 0x84, 0xd4, 0x8d, 0x48, 0x0f, 0x95, 0x08, 0xef, 0xa9, 0x3e, 0x54, 0x54, 0x2e, 0xa8, 0x6c, 0xac, 0x0e, 0x55, 0xaa, 0x12, 0xca, 0xa3, 0xc6, 0xea, 0x90, 0x44, 0x11, 0x86, 0x6a, + 0xe3, 0xdf, 0x47, 0x47, 0x47, 0x25, 0x3d, 0x06, 0xbf, 0x77, 0x2e, 0x87, 0xfd, 0x16, 0x78, 0x30, 0x89, 0xc9, 0xd4, 0x08, 0xc4, 0x94, 0x4d, 0x3f, 0x41, 0x4c, 0xe5, 0xca, 0x4d, 0x22, 0x43, 0x53, + 0x3c, 0x76, 0x9a, 0xf3, 0x07, 0x7e, 0x8e, 0xc3, 0x26, 0xf0, 0x11, 0xbc, 0x3f, 0xc1, 0xad, 0x57, 0x44, 0x72, 0xe1, 0x13, 0x9c, 0xa2, 0x2d, 0xb9, 0xe3, 0x00, 0x58, 0xa0, 0x09, 0x04, 0x54, 0x87, + 0x41, 0x2e, 0xcf, 0x1a, 0x00, 0x0d, 0xe5, 0x57, 0xde, 0x39, 0x00, 0x13, 0x56, 0x46, 0x74, 0xeb, 0xe8, 0xeb, 0xc0, 0xcf, 0xde, 0xbb, 0x9b, 0xc8, 0x9b, 0xef, 0x33, 0x02, 0xf8, 0x6f, 0x0d, 0x7a, + 0x83, 0x22, 0x77, 0x55, 0x9a, 0xa0, 0xb5, 0x7d, 0x80, 0xfa, 0x82, 0x48, 0x18, 0xce, 0x53, 0xa5, 0x87, 0x30, 0xa6, 0xc6, 0x53, 0x5a, 0xe4, 0xa5, 0x41, 0xcb, 0x94, 0x62, 0x5d, 0x98, 0x90, 0x18, + 0xb3, 0x35, 0x5c, 0x4d, 0x97, 0x8c, 0x37, 0xcc, 0xd3, 0xa9, 0x13, 0x11, 0x59, 0x7a, 0x9a, 0x33, 0x3e, 0x5d, 0xda, 0x07, 0x27, 0x24, 0x8a, 0x82, 0x3b, 0x4a, 0x39, 0x99, 0xd3, 0x91, 0x0b, 0x0c, + 0xc5, 0x6b, 0xfd, 0xf1, 0xe6, 0xa6, 0xd3, 0x7d, 0x71, 0x00, 0x19, 0x11, 0x43, 0xfa, 0xf4, 0xd4, 0x01, 0xb8, 0xe8, 0x74, 0xdf, 0xdc, 0xbc, 0x38, 0x00, 0x4b, 0x01, 0xcf, 0xcd, 0xf1, 0x99, 0x21, + 0xff, 0xe2, 0x00, 0x32, 0x3e, 0xf8, 0xc2, 0xa8, 0x59, 0x83, 0x6b, 0x45, 0x21, 0x48, 0x95, 0x0c, 0x62, 0x36, 0xa6, 0x0f, 0x34, 0x0c, 0xee, 0xc8, 0x82, 0x0c, 0x4d, 0x80, 0xb3, 0x09, 0x90, 0x05, + 0x61, 0x31, 0x7a, 0xff, 0x10, 0x04, 0x6a, 0xb1, 0x64, 0x58, 0xbf, 0x48, 0x1c, 0xc3, 0x98, 0x84, 0xf7, 0xa8, 0x5d, 0x70, 0xce, 0xc6, 0x92, 0xc8, 0x55, 0x80, 0x01, 0x1e, 0xbc, 0x15, 0xf3, 0x9c, + 0x30, 0x56, 0x3d, 0x2c, 0xff, 0xea, 0x24, 0x08, 0x22, 0xba, 0xa0, 0xb1, 0x48, 0xa8, 0xf4, 0xb1, 0x9c, 0x53, 0x3f, 0x14, 0x73, 0xe4, 0x67, 0xf0, 0xe6, 0x24, 0x0c, 0x3e, 0x93, 0xe0, 0x33, 0x39, + 0x3e, 0xfe, 0xd7, 0x51, 0x30, 0x64, 0x3c, 0xa2, 0x0f, 0xfe, 0x4c, 0xcf, 0x63, 0x43, 0xa7, 0x88, 0x85, 0x75, 0xc6, 0xbb, 0xf0, 0xa9, 0xe4, 0xa8, 0x1c, 0xe4, 0x01, 0xdc, 0xdd, 0x6a, 0x6c, 0x82, + 0x03, 0x16, 0x69, 0x21, 0x75, 0x51, 0x42, 0x1a, 0xee, 0x68, 0x37, 0xea, 0xc8, 0xcd, 0x70, 0x28, 0x7a, 0xe2, 0x69, 0xf4, 0x6d, 0x1b, 0xe4, 0x88, 0x13, 0xe6, 0x94, 0xfe, 0x73, 0x7a, 0xea, 0x50, + 0x45, 0xc2, 0x72, 0x84, 0x97, 0xb5, 0x2a, 0xe2, 0xcf, 0xbe, 0x97, 0x36, 0x80, 0xa7, 0x94, 0x6b, 0x21, 0x3c, 0x49, 0x63, 0x8a, 0xb1, 0x50, 0x09, 0xd3, 0x42, 0x88, 0x11, 0x4a, 0xed, 0x85, 0x82, + 0x4f, 0xd8, 0x14, 0x3c, 0xef, 0x4e, 0x52, 0xcf, 0xa8, 0x60, 0xc3, 0x16, 0xa3, 0xb6, 0x94, 0x56, 0x2f, 0xb7, 0x59, 0xd6, 0xb0, 0x39, 0x51, 0x22, 0x5e, 0x50, 0x88, 0x19, 0xbf, 0x57, 0xe0, 0x41, + 0xfd, 0xc8, 0x5c, 0xf5, 0x63, 0x0a, 0xc4, 0x9c, 0xa1, 0xbb, 0x4d, 0x36, 0xec, 0x29, 0x53, 0x01, 0x1d, 0x80, 0xcb, 0xfe, 0x9b, 0x86, 0x5b, 0x3f, 0x72, 0x31, 0xb1, 0x6a, 0xc0, 0xcd, 0xbd, 0x6c, + 0xba, 0x0a, 0x21, 0x41, 0xd2, 0x98, 0x68, 0xb6, 0xa0, 0xa0, 0x56, 0x73, 0x43, 0xd2, 0x01, 0x58, 0xce, 0xb0, 0xdd, 0xf8, 0x08, 0xde, 0x0c, 0xdc, 0xfa, 0x65, 0xff, 0x8d, 0x15, 0x21, 0x12, 0x46, + 0x99, 0x58, 0x35, 0x46, 0xb1, 0x02, 0x2f, 0x8e, 0xb2, 0x97, 0x23, 0x7b, 0xcc, 0xf8, 0x7d, 0x63, 0x84, 0x37, 0x2b, 0xb8, 0xf5, 0x58, 0xb9, 0x70, 0x02, 0x7b, 0xfe, 0x0b, 0xef, 0x37, 0xb8, 0xdd, + 0xf7, 0x5f, 0xdc, 0x1e, 0xd4, 0xf7, 0x46, 0x79, 0xa4, 0xe4, 0x30, 0x8c, 0xdf, 0x1b, 0xa8, 0xc0, 0x7f, 0xb1, 0x07, 0xbf, 0x01, 0x86, 0x5f, 0xc0, 0xd3, 0x38, 0xae, 0xc4, 0x81, 0x15, 0xdd, 0xc0, + 0x3a, 0x1b, 0x3e, 0x36, 0xaf, 0x46, 0x11, 0x93, 0x98, 0x74, 0xb9, 0x2c, 0x41, 0x09, 0xd6, 0xf8, 0x33, 0xc2, 0x4e, 0xd2, 0x01, 0x50, 0x64, 0x41, 0xa3, 0x88, 0xc9, 0xc6, 0x28, 0x59, 0x46, 0x23, + 0x3c, 0xc9, 0xec, 0xdb, 0xd8, 0x22, 0xe1, 0xfb, 0xd6, 0x50, 0x73, 0x72, 0x4f, 0x81, 0x69, 0x98, 0xa4, 0x71, 0xbc, 0x82, 0xcf, 0x29, 0x89, 0xd9, 0x84, 0xd1, 0xa8, 0x8c, 0x1a, 0x46, 0x65, 0x47, + 0x3d, 0x7f, 0x0e, 0x39, 0x71, 0xf3, 0x22, 0xe7, 0xe9, 0x1a, 0x72, 0x34, 0x9c, 0x09, 0xb8, 0x56, 0x58, 0x9c, 0xe7, 0x2f, 0x81, 0x68, 0xc8, 0x11, 0xb3, 0x6a, 0xf5, 0x5a, 0x48, 0x68, 0x99, 0x52, + 0x71, 0x08, 0x94, 0xab, 0x54, 0x52, 0x48, 0x88, 0x9e, 0x29, 0xc0, 0x6e, 0x89, 0x71, 0xb8, 0xee, 0x76, 0x3e, 0x80, 0x6d, 0x53, 0x61, 0x4c, 0x27, 0xd8, 0x17, 0x13, 0xbe, 0xd2, 0x33, 0x24, 0xc8, + 0x14, 0x68, 0x91, 0x86, 0x33, 0x1a, 0x61, 0x00, 0xd5, 0x6d, 0xc5, 0x29, 0xc2, 0xe6, 0x23, 0x78, 0xbc, 0x1a, 0x51, 0xcf, 0x9f, 0x1b, 0x13, 0x15, 0x8a, 0xac, 0xa6, 0xc8, 0x0c, 0x3c, 0x2f, 0xe5, + 0xec, 0xa1, 0x04, 0x3b, 0x2a, 0xd0, 0x2b, 0x59, 0x90, 0x11, 0x28, 0x85, 0xf6, 0x16, 0x89, 0x02, 0xbe, 0x44, 0xa4, 0x75, 0xde, 0x1c, 0x0c, 0x2e, 0x9b, 0x57, 0x6f, 0x4b, 0x44, 0xd6, 0x67, 0x65, + 0x22, 0x55, 0x5a, 0x05, 0xda, 0xa8, 0x64, 0xae, 0x0b, 0x2c, 0xa0, 0x3f, 0x6c, 0x2d, 0x53, 0x86, 0xbf, 0xc3, 0x58, 0xee, 0x68, 0xbf, 0xe2, 0xf7, 0x53, 0xf4, 0xfa, 0x81, 0x29, 0x43, 0xdf, 0x64, + 0xa9, 0x1c, 0xbf, 0x80, 0x5a, 0x53, 0xa8, 0x56, 0x80, 0x9d, 0xc5, 0x14, 0x2b, 0x48, 0xfb, 0x81, 0x86, 0xa9, 0xc6, 0x8a, 0xdf, 0x70, 0x47, 0xcb, 0x19, 0x0b, 0x67, 0xe6, 0x38, 0x34, 0x32, 0x58, + 0x7c, 0x14, 0xa3, 0x0a, 0x6a, 0x65, 0x81, 0x67, 0xf0, 0x11, 0x5c, 0x9b, 0xa8, 0xb7, 0x9b, 0x20, 0xb7, 0x26, 0x21, 0x6f, 0xf7, 0x3f, 0xfe, 0x1f, 0x7c, 0x7a, 0x71, 0x7b, 0xb0, 0x37, 0x72, 0xa1, + 0x01, 0x2e, 0x17, 0xd5, 0xea, 0x8c, 0x35, 0x88, 0x44, 0x98, 0x67, 0xfb, 0xc7, 0x07, 0x68, 0x4c, 0x1c, 0x55, 0xd6, 0x77, 0x10, 0x10, 0x05, 0x4a, 0x13, 0x1e, 0x11, 0x69, 0xfa, 0xf6, 0x81, 0x88, + 0x89, 0x64, 0x0a, 0x8e, 0x8f, 0x7c, 0x83, 0x8d, 0xb8, 0xe7, 0xa6, 0x58, 0x58, 0xc1, 0x73, 0x5a, 0xa3, 0xe2, 0x26, 0x79, 0x06, 0x79, 0x21, 0xc9, 0x81, 0x37, 0xe5, 0xda, 0x25, 0x96, 0x41, 0xae, + 0xdb, 0xbb, 0x13, 0x36, 0x2e, 0x13, 0x54, 0x13, 0x2b, 0x7e, 0xa9, 0x60, 0xec, 0x50, 0x7e, 0x7d, 0x93, 0xec, 0xb0, 0x72, 0x18, 0xe5, 0x18, 0x48, 0xe7, 0x36, 0x4f, 0x76, 0xf0, 0x2e, 0x47, 0xe6, + 0x2a, 0x0a, 0x77, 0xde, 0x42, 0x5b, 0x64, 0x72, 0x6d, 0xb1, 0xb7, 0xf9, 0x9a, 0x04, 0xd9, 0x5d, 0xf4, 0xdd, 0x92, 0xaf, 0xc1, 0x73, 0x0b, 0xe6, 0x07, 0x99, 0x05, 0xb1, 0x16, 0xe3, 0xac, 0x9f, + 0x95, 0xe3, 0x4a, 0x58, 0x16, 0xb0, 0xb9, 0x2a, 0x1b, 0x77, 0x68, 0x51, 0x55, 0xb7, 0x2e, 0x2b, 0x84, 0x69, 0x5d, 0x9c, 0xed, 0xb8, 0x1f, 0x37, 0xf2, 0xa1, 0x7a, 0x33, 0xae, 0xbb, 0x82, 0x02, + 0x24, 0xb8, 0x93, 0x34, 0x50, 0x33, 0x63, 0xd4, 0x8d, 0x76, 0x0f, 0x43, 0xaf, 0xf3, 0xea, 0x62, 0x4f, 0x99, 0xf1, 0x41, 0x70, 0x68, 0x76, 0x3e, 0x60, 0xd7, 0x8d, 0x01, 0x27, 0x09, 0x9f, 0xd2, + 0xf5, 0x44, 0xa0, 0xf2, 0xf1, 0x0d, 0xe8, 0xda, 0x4a, 0xaa, 0xa4, 0x71, 0xeb, 0xe2, 0xac, 0xf1, 0x14, 0xcf, 0xcd, 0x7b, 0x66, 0x17, 0xfc, 0x98, 0xf1, 0x12, 0xb0, 0x31, 0xc9, 0x1a, 0x63, 0x0d, + 0x5f, 0xca, 0xcc, 0x91, 0xbb, 0x61, 0xb4, 0x67, 0x85, 0xd6, 0x9b, 0x66, 0x33, 0xf7, 0x84, 0xdb, 0x96, 0x52, 0xc8, 0x93, 0xd2, 0x04, 0x95, 0xe5, 0x59, 0x44, 0x27, 0x8c, 0xd3, 0x08, 0x42, 0x21, + 0x25, 0x0d, 0x75, 0xbc, 0xf2, 0x5d, 0xf8, 0xed, 0xf9, 0xcb, 0x35, 0x1e, 0xc0, 0x0d, 0x85, 0x90, 0x70, 0x84, 0xb5, 0xba, 0x53, 0x28, 0xd8, 0x64, 0x90, 0x0f, 0x4c, 0xc3, 0xf1, 0x57, 0x8a, 0xcd, + 0xa6, 0x30, 0x37, 0xc4, 0x4c, 0xbb, 0x65, 0x71, 0x28, 0x5f, 0x30, 0x29, 0xf8, 0x9c, 0x72, 0x8d, 0xe3, 0x1a, 0x33, 0xa9, 0x9f, 0xc9, 0xa8, 0xa8, 0xf6, 0x6d, 0x2d, 0x33, 0x65, 0xfb, 0xa6, 0xd7, + 0x3f, 0x3f, 0x1b, 0x0c, 0xcf, 0x9b, 0xd7, 0xdd, 0xd6, 0xdb, 0x76, 0xbf, 0x21, 0xe4, 0xd4, 0x0f, 0x45, 0x44, 0x67, 0x24, 0x55, 0x7e, 0x12, 0xd3, 0x87, 0x54, 0xf9, 0x61, 0x4c, 0x94, 0x5a, 0x0a, + 0x19, 0x47, 0xca, 0x8f, 0x49, 0xca, 0xc3, 0x19, 0x95, 0xfe, 0x79, 0xf6, 0x07, 0x96, 0x7b, 0x2d, 0xc9, 0x82, 0x4a, 0xf4, 0x75, 0xc4, 0x50, 0x71, 0x21, 0x57, 0xe8, 0xf5, 0x34, 0xd4, 0x58, 0xfa, + 0x27, 0x52, 0xcc, 0x21, 0x91, 0x22, 0xc4, 0xb1, 0xde, 0x2c, 0x78, 0x0a, 0x28, 0x2d, 0xec, 0x04, 0xb4, 0x52, 0x9a, 0xce, 0x41, 0x0a, 0xa1, 0x9d, 0x1a, 0x4c, 0x98, 0x54, 0xba, 0x04, 0x64, 0x96, + 0x28, 0xfe, 0x7c, 0xc1, 0x41, 0xa5, 0xe3, 0xe2, 0x98, 0x29, 0x08, 0x05, 0x57, 0x2c, 0xa2, 0x38, 0xf1, 0x26, 0x52, 0xdc, 0xd1, 0x50, 0xc3, 0x18, 0x3b, 0xbc, 0x35, 0x90, 0x33, 0x61, 0x3c, 0x1a, + 0x9a, 0x96, 0x6b, 0x88, 0x6f, 0x22, 0x26, 0xf7, 0x0f, 0xe0, 0x4b, 0x31, 0xc5, 0xa0, 0x75, 0x8f, 0x5d, 0xf8, 0xe4, 0x40, 0x11, 0xca, 0xd6, 0xae, 0x97, 0x78, 0xc7, 0x19, 0x8b, 0xd9, 0x31, 0xc5, + 0x0e, 0xa2, 0xdb, 0xf4, 0xdc, 0xac, 0x72, 0xea, 0x54, 0x72, 0x38, 0x5e, 0x0f, 0x49, 0xd9, 0xdb, 0x06, 0x92, 0xc7, 0xb6, 0xad, 0xfc, 0x77, 0xd6, 0xc2, 0xb9, 0x75, 0x3c, 0x75, 0xe1, 0x59, 0x03, + 0xf6, 0x82, 0xbd, 0x72, 0x1f, 0x67, 0x65, 0x8b, 0x72, 0x88, 0xc0, 0x28, 0xbf, 0x91, 0x6e, 0x39, 0x03, 0x03, 0x92, 0x9f, 0x49, 0x4a, 0xee, 0x8b, 0xb0, 0xc7, 0x9c, 0x44, 0x83, 0x13, 0x29, 0x52, + 0x1e, 0x99, 0xb4, 0x7b, 0xf7, 0xaa, 0xdd, 0xbc, 0xf4, 0xfe, 0xfd, 0xdf, 0xff, 0xf1, 0x2f, 0xd8, 0xaf, 0x5c, 0x00, 0xc1, 0x20, 0x21, 0x32, 0x3c, 0xd8, 0x60, 0xff, 0x05, 0x89, 0x3f, 0x6e, 0xd6, + 0x72, 0xa3, 0x8c, 0xed, 0xaf, 0xf0, 0xcf, 0xc0, 0xf7, 0xed, 0x2d, 0x39, 0xaa, 0xb2, 0xa6, 0x3c, 0xc2, 0x51, 0xb7, 0x90, 0x20, 0x6f, 0xf9, 0x72, 0x13, 0xd7, 0xbf, 0x64, 0x4a, 0x3c, 0xba, 0xce, + 0x23, 0x06, 0x52, 0x28, 0x78, 0x48, 0x34, 0xe5, 0x44, 0x53, 0x05, 0x38, 0x23, 0xc5, 0x8c, 0x53, 0x65, 0xb7, 0x12, 0x66, 0x85, 0x67, 0x01, 0x86, 0xe6, 0xd8, 0x38, 0xb2, 0x3c, 0x8d, 0x1e, 0x57, + 0xe5, 0xcc, 0x78, 0xec, 0x6b, 0x09, 0x9e, 0x82, 0xbd, 0x5b, 0xbe, 0x07, 0xf8, 0xcf, 0xff, 0x18, 0xc8, 0x83, 0x2c, 0xe9, 0x1f, 0x1d, 0xe7, 0x55, 0x73, 0xd0, 0x1e, 0x9e, 0x75, 0xfa, 0x8d, 0xd1, + 0xb6, 0x73, 0x11, 0x1f, 0xaf, 0x7f, 0x77, 0x54, 0xca, 0xc6, 0x1c, 0xa1, 0xcc, 0xce, 0xa6, 0xed, 0xa9, 0xed, 0x7f, 0x7e, 0xd9, 0xcf, 0xa9, 0x41, 0xfb, 0x41, 0x53, 0x6e, 0x76, 0x94, 0x5a, 0xa0, + 0x89, 0xc4, 0x12, 0x48, 0xaa, 0xc5, 0x9c, 0x68, 0x16, 0x12, 0xec, 0x85, 0x23, 0xb1, 0xe4, 0xf9, 0xa2, 0x01, 0x8b, 0xac, 0xd1, 0xc7, 0x5b, 0x4a, 0x92, 0xe0, 0xf4, 0x78, 0x47, 0xa4, 0x4d, 0x48, + 0xb3, 0x1e, 0xf1, 0x42, 0xca, 0xb5, 0x24, 0xb1, 0x53, 0x83, 0x2b, 0x1c, 0x3a, 0x0c, 0x3d, 0x05, 0xa9, 0xaa, 0x20, 0x43, 0x86, 0x8c, 0xad, 0x5b, 0x96, 0x66, 0x0a, 0xf4, 0x8c, 0x68, 0x7c, 0x9a, + 0xb1, 0x31, 0xd3, 0x10, 0xce, 0x68, 0x78, 0x6f, 0xda, 0x37, 0x0e, 0x63, 0xc6, 0x89, 0x5c, 0x41, 0x44, 0x34, 0xf1, 0x7f, 0xa5, 0x2d, 0xf2, 0x11, 0xaf, 0x70, 0x88, 0xc9, 0x93, 0x20, 0x93, 0x36, + 0xd8, 0x52, 0xbc, 0x1a, 0x1e, 0x06, 0xdd, 0xad, 0x5f, 0xbc, 0xef, 0xde, 0x0c, 0xdf, 0xb7, 0xfb, 0xaf, 0x7a, 0x83, 0x36, 0x76, 0x54, 0x66, 0x13, 0x50, 0x0d, 0x77, 0x1b, 0x48, 0x66, 0x19, 0x0e, + 0x7f, 0xc3, 0x21, 0x4f, 0x80, 0xf5, 0x85, 0xf3, 0xbd, 0x5c, 0x5a, 0x22, 0x8d, 0x23, 0xbe, 0xa7, 0x4d, 0xa1, 0xf9, 0x1b, 0x6e, 0x87, 0x15, 0x5f, 0x33, 0x0d, 0xbe, 0xef, 0xbb, 0xe5, 0x14, 0x2c, + 0x2e, 0x79, 0xc3, 0xbf, 0xdf, 0xbe, 0xec, 0x5d, 0xf7, 0xcf, 0x37, 0xb3, 0xf9, 0x8e, 0xc8, 0x6b, 0x19, 0x37, 0xaa, 0x40, 0x01, 0x13, 0x81, 0x26, 0xf7, 0x44, 0xb2, 0x2a, 0xdf, 0xe0, 0xc8, 0xff, + 0x4f, 0xff, 0xbf, 0xaa, 0x67, 0x9e, 0x39, 0x2b, 0xf4, 0x2f, 0xdd, 0xcf, 0x39, 0xed, 0x7c, 0x8d, 0x21, 0x69, 0x22, 0xec, 0x3e, 0xa8, 0xbc, 0xcd, 0xb6, 0xfb, 0xc1, 0x1f, 0x61, 0x99, 0x29, 0x6c, + 0x2b, 0x6b, 0xe7, 0xf5, 0xa0, 0xe1, 0x36, 0x5c, 0xd3, 0xbd, 0xc2, 0x3d, 0x5d, 0xc1, 0x82, 0xc4, 0x29, 0x5d, 0x17, 0x57, 0x00, 0xbb, 0x11, 0xaa, 0xdf, 0xd3, 0x95, 0x8b, 0x01, 0xbb, 0x9f, 0x11, + 0xbd, 0x96, 0xf1, 0x41, 0x61, 0x0d, 0x83, 0xe4, 0x9e, 0xda, 0x9a, 0x6a, 0x77, 0x43, 0x46, 0x39, 0x45, 0x42, 0xf3, 0x27, 0x56, 0x32, 0x53, 0x4c, 0xbe, 0x25, 0xfa, 0x12, 0x29, 0x12, 0x2a, 0x35, + 0xa3, 0xca, 0xfd, 0x47, 0x61, 0x71, 0x56, 0x72, 0x34, 0xa6, 0xef, 0x09, 0xd4, 0xad, 0xa0, 0x55, 0xf5, 0x2d, 0xb7, 0x77, 0x44, 0xe2, 0xe5, 0xd5, 0xf8, 0x36, 0xd1, 0xd6, 0x36, 0x2c, 0x86, 0xd3, + 0x6a, 0xb1, 0xaf, 0x12, 0xdd, 0x9e, 0x02, 0x97, 0x8c, 0x47, 0x58, 0x35, 0xdc, 0x7a, 0x15, 0xd4, 0x5d, 0x5f, 0x07, 0x39, 0xf9, 0x50, 0xcc, 0xe7, 0x84, 0x47, 0xe0, 0x2d, 0x60, 0x39, 0xa5, 0xfa, + 0xc9, 0xc5, 0xc2, 0xf7, 0xd8, 0x07, 0x36, 0x12, 0xd4, 0x10, 0xf6, 0x7d, 0x3f, 0x2b, 0x62, 0xf8, 0x58, 0x4c, 0x0e, 0xeb, 0xce, 0xbd, 0x7c, 0xfd, 0x1b, 0x26, 0xd7, 0x83, 0x76, 0xbf, 0xdb, 0xb4, + 0x0d, 0xd6, 0x5f, 0x7f, 0x55, 0x5e, 0x5d, 0xda, 0x36, 0xe9, 0x6c, 0x7b, 0x0d, 0x86, 0x3f, 0xc3, 0xcf, 0xcd, 0xbd, 0x01, 0x5e, 0x6f, 0xdb, 0x0e, 0x6b, 0xf8, 0xca, 0xf8, 0xb1, 0x46, 0xf6, 0x3c, + 0xcc, 0x0e, 0x2f, 0x55, 0x54, 0x36, 0xaa, 0xc2, 0xe4, 0xaf, 0x12, 0xdb, 0x7f, 0x45, 0x8d, 0xaa, 0x40, 0xdf, 0xca, 0x36, 0xd3, 0x9a, 0xc6, 0x55, 0x17, 0x84, 0xa9, 0x8c, 0x7f, 0x89, 0x0b, 0x0c, + 0xe1, 0xc2, 0x05, 0xf8, 0xf8, 0x4b, 0x5d, 0x60, 0xf8, 0x79, 0x62, 0xdb, 0x02, 0x65, 0x03, 0x4d, 0x9e, 0xf6, 0x82, 0xc5, 0x37, 0x0e, 0x80, 0xaa, 0x28, 0x27, 0x1b, 0x06, 0xff, 0x76, 0x26, 0x79, + 0xd4, 0x57, 0x98, 0xfd, 0x23, 0x93, 0x92, 0x38, 0x46, 0x2b, 0xe6, 0xdb, 0x62, 0x6b, 0x53, 0xf3, 0x2d, 0x44, 0x8b, 0xf5, 0x05, 0xb0, 0xd3, 0xbe, 0x38, 0xdc, 0xb4, 0xb0, 0x77, 0x7f, 0xb2, 0x12, + 0x98, 0x26, 0xe0, 0xc6, 0x3e, 0xe4, 0x25, 0xc6, 0x94, 0x84, 0x7c, 0x7a, 0x02, 0xd3, 0xc8, 0x95, 0xb7, 0x5f, 0x6a, 0xc9, 0x74, 0x38, 0xcb, 0xf6, 0x39, 0x5a, 0xc0, 0x4d, 0x96, 0xfd, 0xd5, 0x75, + 0x4e, 0xfe, 0x79, 0xc6, 0x4c, 0xdf, 0x65, 0xfd, 0x77, 0x55, 0x98, 0xaa, 0xac, 0x5f, 0x2b, 0x30, 0x6b, 0x28, 0x77, 0xf4, 0x74, 0x40, 0xd1, 0x0a, 0xe0, 0xce, 0x88, 0xc9, 0xc7, 0x3c, 0xfa, 0x64, + 0xf9, 0x7e, 0xc2, 0x32, 0xe1, 0xd3, 0x34, 0xe1, 0xbb, 0x1d, 0x9c, 0xff, 0xb2, 0xe1, 0xd0, 0x83, 0x96, 0x98, 0x27, 0x2c, 0x5e, 0x7f, 0xd6, 0xda, 0xed, 0x98, 0xe2, 0x96, 0x2f, 0xff, 0x4a, 0x56, + 0xc8, 0x7f, 0xb5, 0x12, 0xbd, 0xf5, 0xf7, 0x33, 0xa3, 0xc0, 0x16, 0xe8, 0xfe, 0xae, 0xf9, 0x39, 0x74, 0x2b, 0x86, 0x3c, 0xa8, 0x60, 0x6d, 0xf0, 0x2b, 0x2c, 0xff, 0x33, 0xcd, 0x59, 0x83, 0x7e, + 0x16, 0x47, 0x28, 0x7f, 0xb4, 0xc6, 0xfb, 0xd9, 0x76, 0xef, 0x97, 0x3f, 0x26, 0xfe, 0xa0, 0xd5, 0x77, 0x9a, 0xd2, 0x05, 0x2f, 0x4c, 0x2a, 0xdd, 0xdc, 0x13, 0xbc, 0xd6, 0x5f, 0xec, 0x2e, 0xfb, + 0xbd, 0x77, 0xed, 0xd6, 0x15, 0x5a, 0x13, 0x27, 0x8d, 0x27, 0x8d, 0x5f, 0x7c, 0x1e, 0x99, 0xb0, 0x5f, 0xd9, 0x6c, 0xd7, 0xa0, 0x6d, 0xa7, 0x39, 0x9a, 0xcf, 0x1f, 0xbf, 0x92, 0x9b, 0x93, 0x6d, + 0xb7, 0x76, 0xd9, 0xa2, 0x51, 0xff, 0x62, 0x8f, 0xb3, 0xe7, 0x13, 0xaf, 0x34, 0x91, 0x3d, 0x3a, 0xdf, 0x16, 0x0a, 0xc6, 0xf5, 0x3b, 0x4d, 0x8d, 0x76, 0x2c, 0x7d, 0x1c, 0x76, 0xeb, 0xfb, 0xe5, + 0x99, 0xf3, 0x09, 0xff, 0xd8, 0x60, 0xbf, 0x5b, 0xcc, 0x7d, 0xfb, 0xf9, 0xc8, 0x3d, 0xc8, 0x89, 0x23, 0x11, 0x77, 0xf3, 0x0b, 0xc2, 0xf7, 0xd7, 0x50, 0x67, 0x47, 0xe9, 0xfc, 0xdb, 0x5d, 0xf8, + 0xd7, 0x2a, 0xe9, 0x8f, 0x7c, 0x42, 0xd8, 0x22, 0xf6, 0x53, 0x3e, 0x26, 0x14, 0xe4, 0xca, 0xdf, 0x13, 0x0a, 0x35, 0x77, 0xa5, 0x45, 0x49, 0xe7, 0x5d, 0x91, 0xf2, 0x55, 0x03, 0xec, 0xa2, 0x97, + 0x7f, 0xbf, 0xb8, 0x94, 0x62, 0xc1, 0x22, 0x0a, 0x04, 0xdc, 0x7c, 0x5d, 0xce, 0xfe, 0xa4, 0x91, 0x0b, 0x4b, 0x62, 0x76, 0x56, 0x92, 0x6a, 0xc9, 0xe8, 0xc2, 0xfe, 0x4f, 0x29, 0xad, 0xf3, 0x0e, + 0x10, 0x39, 0xcd, 0x46, 0xe2, 0x25, 0x8b, 0x71, 0x9c, 0x36, 0x7b, 0x2e, 0xb3, 0xb8, 0x1a, 0x0b, 0x3d, 0x5b, 0x7b, 0x18, 0x5b, 0x2f, 0x2e, 0xb8, 0x97, 0x3f, 0xdb, 0x2d, 0x20, 0x13, 0x5c, 0xf9, + 0x59, 0xd4, 0xb5, 0x2e, 0xce, 0x86, 0xe7, 0x9d, 0x6e, 0x7b, 0xd8, 0xec, 0xbf, 0xc1, 0xf0, 0xcb, 0x4e, 0x7b, 0xdd, 0xd7, 0x9d, 0x37, 0x50, 0xff, 0x5f, 0xb7, 0x9a, 0x1a, 0x15, 0x68, 0xc7, 0xb9, + 0xe9, 0x37, 0x2f, 0x2f, 0xdb, 0xfd, 0xea, 0x3a, 0x2f, 0x1b, 0xb4, 0xec, 0xd4, 0x95, 0x77, 0xfd, 0xe5, 0xf2, 0x73, 0x41, 0x18, 0xc7, 0x94, 0xa3, 0x61, 0x79, 0xeb, 0x79, 0xeb, 0x40, 0x39, 0x88, + 0xcd, 0xb3, 0x67, 0x0a, 0xb6, 0xb1, 0xe5, 0xd7, 0x12, 0xe1, 0x2b, 0x13, 0x38, 0x52, 0x71, 0xbd, 0x33, 0x2b, 0xcc, 0x4c, 0xcc, 0x29, 0xa6, 0xb3, 0x8d, 0xc5, 0x47, 0xb7, 0x78, 0x33, 0x4f, 0x63, + 0xcd, 0x2e, 0x44, 0x94, 0xc6, 0xf4, 0xd2, 0x6e, 0x1c, 0xce, 0xf2, 0x95, 0xde, 0x3a, 0xff, 0xab, 0x9c, 0x1f, 0x33, 0x89, 0xbf, 0x6c, 0xda, 0xe0, 0x11, 0xaa, 0x36, 0x74, 0xd1, 0x88, 0xff, 0x1f, + 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc3, 0x6d, 0x0b, 0x80, 0xb4, 0x0c, 0x00, 0x00, 0x55, 0x27, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x58, 0xff, 0x6f, 0xea, 0x46, 0x12, 0xff, 0xb9, 0xfe, 0x2b, 0xa6, 0x56, 0xdd, 0x24, 0x15, 0x38, 0x79, + 0x91, 0xee, 0x74, 0xa2, 0xf2, 0xe9, 0x39, 0x60, 0x1a, 0xd2, 0x04, 0x90, 0x4d, 0x92, 0x57, 0xf5, 0xf5, 0xd0, 0x62, 0x0f, 0xb0, 0x2f, 0x66, 0xd7, 0xdd, 0x5d, 0x20, 0xdc, 0xe9, 0xfe, 0xf7, 0xd3, + 0xae, 0xd7, 0xd8, 0x84, 0x24, 0xbd, 0x9e, 0x5a, 0xe9, 0xde, 0x0f, 0x8f, 0x78, 0x3d, 0xdf, 0xe7, 0x33, 0xb3, 0x33, 0xfe, 0x18, 0x47, 0x77, 0xd0, 0xfe, 0x03, 0xff, 0x39, 0x46, 0xe2, 0x2d, 0x4d, + 0x91, 0x49, 0xcc, 0x40, 0x71, 0x50, 0x4b, 0x84, 0xb0, 0x20, 0xe9, 0x12, 0x21, 0xe1, 0x73, 0xb5, 0x25, 0x02, 0xa1, 0xcf, 0xd7, 0x2c, 0x23, 0x8a, 0x72, 0x06, 0xa7, 0x61, 0xd2, 0x3f, 0x83, 0x35, + 0xcb, 0x50, 0x00, 0x67, 0x58, 0xf2, 0x73, 0x01, 0x2b, 0x2e, 0x10, 0x52, 0xce, 0x94, 0xa0, 0xb3, 0xb5, 0xe2, 0x02, 0xf2, 0x52, 0x26, 0x90, 0x85, 0x40, 0x5c, 0x21, 0x53, 0xd2, 0x07, 0x48, 0x10, + 0x8d, 0x82, 0xe1, 0x68, 0x32, 0xe8, 0x46, 0x30, 0xa7, 0xb9, 0x95, 0x90, 0x51, 0x59, 0x72, 0x62, 0x06, 0x5b, 0xaa, 0x96, 0xa0, 0x96, 0x54, 0xc2, 0x96, 0x8b, 0x27, 0x98, 0x73, 0x01, 0x24, 0xcb, + 0xa8, 0x56, 0x4f, 0x72, 0xa0, 0x6c, 0xce, 0xc5, 0xca, 0x18, 0x53, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x51, 0xb6, 0x80, 0x94, 0x17, 0x3b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xcb, 0x50, 0xc8, 0x25, 0x2d, + 0x7c, 0x80, 0x89, 0x76, 0x28, 0xe9, 0x57, 0x06, 0xc9, 0x52, 0x74, 0xad, 0x5a, 0x71, 0xd8, 0xf1, 0xb5, 0x75, 0xa9, 0xe1, 0xbd, 0x0d, 0x4a, 0x0b, 0x1e, 0x50, 0x48, 0xed, 0xfa, 0xa5, 0x7f, 0x01, + 0xa7, 0x6a, 0x69, 0xd9, 0x5c, 0xfb, 0xde, 0x3d, 0xfb, 0xde, 0xf0, 0xaf, 0xc8, 0x0e, 0x18, 0x57, 0xb0, 0x96, 0x58, 0x6b, 0x00, 0x7c, 0x4e, 0xb1, 0x50, 0x40, 0x19, 0xa4, 0x7c, 0x55, 0xe4, 0x94, + 0xb0, 0xd4, 0xf2, 0x5b, 0x2f, 0xf7, 0x7a, 0x7c, 0x80, 0x9f, 0xac, 0x18, 0x3e, 0x53, 0x84, 0x32, 0x20, 0xc6, 0x21, 0xe0, 0xf3, 0x26, 0x19, 0x10, 0x65, 0xf8, 0x4b, 0x21, 0x00, 0xb0, 0x54, 0xaa, + 0xe8, 0x9c, 0x9f, 0x6f, 0xb7, 0x5b, 0x9f, 0x18, 0xc3, 0x7d, 0x2e, 0x16, 0xe7, 0x95, 0xb3, 0xe7, 0xb7, 0x83, 0x6e, 0x34, 0x4c, 0xa2, 0xf6, 0xa5, 0x7f, 0xd1, 0xe0, 0xbb, 0x67, 0x39, 0x4a, 0x09, + 0x02, 0x7f, 0x5d, 0x53, 0x81, 0x19, 0xcc, 0x76, 0x40, 0x8a, 0x22, 0xa7, 0x29, 0x99, 0xe5, 0x08, 0x39, 0xd9, 0xea, 0x94, 0x9a, 0xcc, 0x19, 0x4c, 0x50, 0x06, 0x5b, 0x41, 0x15, 0x65, 0x8b, 0x56, + 0xc9, 0x2f, 0x2b, 0x64, 0x34, 0xf3, 0x56, 0x47, 0xb0, 0xb2, 0x95, 0xca, 0x03, 0x02, 0xce, 0x80, 0xd8, 0xa4, 0xb9, 0x61, 0x02, 0x83, 0xc4, 0x85, 0xab, 0x30, 0x19, 0x24, 0x2d, 0x78, 0x1c, 0x4c, + 0xae, 0x47, 0xf7, 0x13, 0x78, 0x0c, 0xe3, 0x38, 0x1c, 0x4e, 0x06, 0x51, 0x02, 0xa3, 0x18, 0xba, 0xa3, 0x61, 0x6f, 0x30, 0x19, 0x8c, 0x86, 0x09, 0x8c, 0xfa, 0x10, 0x0e, 0x7f, 0x2a, 0x79, 0x7f, + 0x1c, 0x0c, 0x7b, 0x2d, 0x40, 0xaa, 0x96, 0x28, 0x00, 0x9f, 0x0b, 0xa1, 0x5d, 0xe1, 0x02, 0xa8, 0x0e, 0x30, 0x66, 0x0d, 0x98, 0x55, 0x76, 0x68, 0x08, 0xed, 0x13, 0x27, 0x0b, 0x4c, 0xe9, 0x9c, + 0xa6, 0x90, 0x13, 0xb6, 0x58, 0x93, 0x05, 0xc2, 0x82, 0x6f, 0x50, 0x30, 0x8d, 0xa0, 0x02, 0xc5, 0x8a, 0x4a, 0x9d, 0x6d, 0x09, 0x84, 0x65, 0x90, 0xd3, 0x15, 0x55, 0x06, 0x6b, 0xb2, 0x64, 0x3e, + 0xf2, 0xd1, 0x77, 0xfe, 0xf8, 0x9a, 0xfc, 0x13, 0x44, 0x1a, 0x89, 0x77, 0x64, 0x83, 0x0c, 0x12, 0x45, 0x84, 0x82, 0xfb, 0x02, 0xae, 0x88, 0x4a, 0x97, 0x20, 0x53, 0x41, 0x8b, 0x26, 0xa6, 0xe2, + 0x0a, 0x14, 0xd1, 0xf0, 0x01, 0x36, 0x44, 0xc8, 0x4e, 0x79, 0x7e, 0x13, 0x3e, 0x84, 0xd3, 0xeb, 0xd1, 0x5d, 0x04, 0x6d, 0xc8, 0x79, 0x5a, 0xb6, 0x03, 0x3e, 0x07, 0x02, 0x37, 0xbd, 0x1f, 0x61, + 0xc9, 0x57, 0x1a, 0x0d, 0xa2, 0x21, 0x68, 0x54, 0xd8, 0x92, 0xad, 0x04, 0x59, 0x2b, 0x2e, 0x5f, 0x93, 0xb2, 0xd2, 0xb6, 0x5d, 0x9e, 0x48, 0xa0, 0x4c, 0x2a, 0x92, 0xe7, 0x98, 0x1d, 0x8a, 0x84, + 0xbb, 0xf0, 0x21, 0x1a, 0x4e, 0xaf, 0xc2, 0x49, 0xf7, 0x7a, 0x1a, 0x75, 0xaf, 0x47, 0xd0, 0x06, 0x89, 0x4a, 0xa3, 0xf3, 0x84, 0xb3, 0x13, 0xfd, 0x8b, 0xcc, 0xa0, 0x57, 0x27, 0x07, 0xd3, 0x25, + 0xd7, 0xf9, 0xb4, 0xb5, 0x33, 0x33, 0x9e, 0xa6, 0x7c, 0xb5, 0x22, 0x2c, 0x93, 0xc7, 0xf2, 0xc6, 0xe1, 0x7d, 0x12, 0x1d, 0x0b, 0xdc, 0x12, 0xaa, 0xca, 0xf6, 0x03, 0x4f, 0xb8, 0x93, 0x4a, 0xf0, + 0x27, 0x84, 0x19, 0xce, 0x75, 0xab, 0x43, 0xa6, 0x5b, 0x4e, 0x53, 0xd4, 0x68, 0x3c, 0x49, 0xa0, 0x0d, 0x05, 0x11, 0x64, 0x85, 0x0a, 0x85, 0x84, 0x82, 0xc8, 0x46, 0x53, 0xbd, 0x21, 0x1b, 0x02, + 0x0f, 0x77, 0xb0, 0x5d, 0x22, 0x03, 0xb1, 0x66, 0x06, 0x70, 0x26, 0x25, 0xfb, 0x5a, 0x06, 0xf4, 0x17, 0xbe, 0xa6, 0xcf, 0x70, 0xb6, 0xb6, 0x2f, 0x81, 0x2a, 0x89, 0xf9, 0xbc, 0xa5, 0x1b, 0x8b, + 0x05, 0x30, 0xaa, 0x86, 0xca, 0xa0, 0xfd, 0xa9, 0xa4, 0x6e, 0x7f, 0x12, 0x6b, 0xf6, 0x25, 0xdb, 0x16, 0x1d, 0x25, 0x08, 0x93, 0x05, 0x17, 0x2a, 0xc8, 0xd4, 0x54, 0xf2, 0xf4, 0x09, 0x55, 0x4b, + 0xa2, 0xd8, 0xa0, 0x08, 0x76, 0x2d, 0xb9, 0x96, 0x05, 0xb2, 0x2c, 0xd8, 0xb5, 0x48, 0x96, 0xe9, 0xd2, 0x09, 0xfe, 0x76, 0x71, 0x71, 0xd1, 0x74, 0x24, 0xf9, 0x71, 0x30, 0x9e, 0xc6, 0x5d, 0x68, + 0xc3, 0x3c, 0x27, 0x0b, 0x63, 0x0e, 0x95, 0x65, 0x63, 0xe0, 0x24, 0xb3, 0x61, 0x35, 0xf9, 0x12, 0xa9, 0xe9, 0x72, 0xf2, 0x4f, 0x00, 0x6c, 0x29, 0xf2, 0x0a, 0x17, 0xba, 0x11, 0xe6, 0x39, 0xe8, + 0xa7, 0x9c, 0x32, 0x94, 0x65, 0xe3, 0x3c, 0xf9, 0x78, 0x62, 0x9a, 0x2a, 0x91, 0x78, 0x8c, 0x0c, 0x2a, 0x4d, 0x0a, 0x9d, 0x8f, 0x1a, 0x06, 0xc0, 0xe7, 0xf3, 0x3a, 0x6e, 0x8a, 0xaa, 0x1c, 0xb5, + 0xfd, 0x16, 0x0c, 0xb0, 0xa5, 0x2c, 0xe3, 0x5b, 0xa7, 0x3c, 0xf7, 0x6c, 0x1c, 0x2c, 0x92, 0x2a, 0x14, 0xcd, 0x76, 0x9a, 0x57, 0x99, 0x7c, 0xbd, 0xd4, 0x65, 0xe1, 0xe2, 0x7c, 0xa4, 0x73, 0x70, + 0xbd, 0x97, 0xaf, 0x3d, 0x17, 0x82, 0x00, 0x5c, 0xce, 0x5c, 0x30, 0xd2, 0xe0, 0x98, 0xc2, 0xa9, 0x8d, 0xf3, 0x74, 0x5d, 0x78, 0x06, 0xca, 0xbf, 0xae, 0xe9, 0x86, 0xe4, 0xc8, 0x94, 0xb6, 0xf5, + 0x1b, 0x7d, 0xee, 0x18, 0x05, 0x86, 0xa2, 0x14, 0xea, 0xc2, 0xa9, 0x66, 0x72, 0xf5, 0x51, 0x60, 0x5e, 0xf4, 0xe2, 0xc1, 0x43, 0xe4, 0x99, 0x3f, 0xc7, 0xe1, 0xe4, 0xda, 0x73, 0xcf, 0xac, 0xf0, + 0xe8, 0x19, 0xd3, 0xb5, 0x42, 0x20, 0x1a, 0x44, 0x02, 0x32, 0x9c, 0x53, 0x86, 0x99, 0x2d, 0xfd, 0x0a, 0xd1, 0xe6, 0xd2, 0xd2, 0x57, 0x3a, 0x9d, 0x9b, 0x8b, 0xac, 0xf2, 0xc6, 0xc2, 0x61, 0xaf, + 0x75, 0xc1, 0x15, 0x07, 0xf9, 0x44, 0x8b, 0x38, 0x1d, 0x0b, 0x0b, 0xc9, 0x74, 0x89, 0x69, 0x79, 0x53, 0x17, 0x02, 0xad, 0xdc, 0x16, 0x70, 0x96, 0x62, 0x99, 0xae, 0x1c, 0x17, 0x24, 0xdd, 0x81, + 0x3f, 0x23, 0xca, 0x56, 0x8e, 0x69, 0xaf, 0x35, 0x81, 0x9f, 0xae, 0xb2, 0xaa, 0xa6, 0xe8, 0x1c, 0xf0, 0x99, 0x4a, 0x55, 0xb9, 0xfb, 0xd9, 0x62, 0x6d, 0x5a, 0x08, 0xd4, 0x12, 0x5c, 0x48, 0x35, + 0x22, 0xde, 0x7a, 0xfb, 0x3e, 0x7f, 0xba, 0xca, 0xde, 0xe1, 0xd7, 0x6f, 0x9d, 0x4e, 0xed, 0x9c, 0xf3, 0x51, 0xa2, 0xd2, 0x6d, 0x2a, 0x77, 0x1c, 0x1d, 0xec, 0x28, 0x8e, 0x47, 0xf1, 0xb4, 0x3b, + 0xea, 0x45, 0xc1, 0x85, 0x8d, 0xed, 0x84, 0x03, 0x95, 0x3c, 0x27, 0x0a, 0x81, 0x32, 0x85, 0x42, 0x37, 0xbc, 0x0d, 0x11, 0x54, 0x23, 0x48, 0xc2, 0x5c, 0xf0, 0x15, 0x14, 0x5c, 0x4a, 0xaa, 0x01, + 0x55, 0x70, 0xa9, 0x6c, 0x74, 0x64, 0x0b, 0xb6, 0x68, 0x86, 0x05, 0xc2, 0xb8, 0xb9, 0xc9, 0xf6, 0x9a, 0x1a, 0x3a, 0x8d, 0x86, 0x20, 0x08, 0x02, 0x48, 0x26, 0x61, 0x3c, 0x81, 0x87, 0xf0, 0x76, + 0xd0, 0x0b, 0xf5, 0x95, 0x68, 0x4e, 0xeb, 0x54, 0xed, 0x9b, 0xf3, 0x61, 0x9a, 0x46, 0x4f, 0x37, 0xd7, 0x7c, 0x85, 0x8e, 0xa3, 0xc1, 0xe7, 0x9b, 0xff, 0x21, 0x12, 0x82, 0x8b, 0x4e, 0xa3, 0x9d, + 0x6b, 0x09, 0x73, 0x3d, 0xe1, 0xe9, 0x8a, 0xda, 0xf1, 0xb5, 0x00, 0x64, 0x1b, 0x2a, 0x38, 0xd3, 0x53, 0x9b, 0x0f, 0x7f, 0xff, 0xf6, 0xb2, 0x64, 0x1c, 0xe7, 0xa8, 0xcb, 0xcd, 0x94, 0x91, 0xee, + 0x67, 0x7b, 0x01, 0x95, 0xbb, 0xaf, 0xf1, 0x6b, 0x34, 0xaf, 0x4c, 0xfb, 0xd5, 0x3c, 0x7b, 0x59, 0xcd, 0xd6, 0x6f, 0x58, 0x4c, 0x77, 0xb4, 0xbd, 0xdf, 0xbc, 0xa9, 0x15, 0xfb, 0x8e, 0xf1, 0x05, + 0xb5, 0xdd, 0x8e, 0xd3, 0xa9, 0x7c, 0x6a, 0xa4, 0xb9, 0xf6, 0xfe, 0xf3, 0x8c, 0xb2, 0xcf, 0x5f, 0xc8, 0x86, 0xf8, 0xf8, 0x8c, 0x36, 0x08, 0x94, 0x51, 0xf5, 0x7e, 0x04, 0xa8, 0xac, 0x5a, 0x3f, + 0x61, 0x40, 0xd9, 0x86, 0xe4, 0x34, 0xd3, 0x37, 0x0f, 0xa6, 0x8a, 0x8b, 0x5d, 0x23, 0x04, 0x35, 0x4b, 0xf0, 0x22, 0xe8, 0xff, 0x67, 0x51, 0xaa, 0x81, 0x13, 0x0d, 0x7b, 0x47, 0xb0, 0x71, 0x3a, + 0x65, 0x4c, 0x0c, 0x55, 0x9f, 0xb2, 0xcc, 0xa8, 0x2d, 0x04, 0xff, 0x82, 0xa9, 0x82, 0x99, 0xb6, 0x3f, 0xa3, 0xa2, 0x05, 0xd4, 0x47, 0xdf, 0xbc, 0xda, 0xc7, 0x02, 0xd4, 0x92, 0x28, 0x33, 0xe7, + 0x13, 0xca, 0xa4, 0x79, 0x37, 0xe7, 0xb9, 0x9e, 0x89, 0x5c, 0x7f, 0xb5, 0x61, 0xae, 0x1d, 0x87, 0xfa, 0x24, 0xcf, 0x67, 0x24, 0x7d, 0xd2, 0x7e, 0xa5, 0x6b, 0x21, 0xb4, 0x8b, 0x7a, 0x98, 0xd7, + 0x85, 0x5f, 0xcb, 0xb2, 0xe8, 0x35, 0xd8, 0xf3, 0xcb, 0x02, 0x2b, 0x5b, 0xce, 0x38, 0x1e, 0xdd, 0x44, 0xdd, 0xc9, 0x55, 0x98, 0x44, 0xbd, 0x41, 0x1c, 0xec, 0x9b, 0xa6, 0x79, 0xf4, 0x9c, 0x41, + 0x5f, 0x2f, 0x10, 0xfb, 0x06, 0x75, 0x48, 0xed, 0xb9, 0x41, 0x50, 0xc1, 0x1f, 0x59, 0xd6, 0x43, 0x85, 0xa9, 0xba, 0x22, 0x12, 0x7b, 0x54, 0xd8, 0x22, 0xfe, 0x14, 0x75, 0xa7, 0x46, 0x6e, 0xb7, + 0xe7, 0x99, 0x93, 0x47, 0xf3, 0x54, 0x9d, 0x7b, 0x4e, 0x67, 0x4e, 0x59, 0x56, 0xf1, 0x0c, 0xfa, 0x10, 0x7d, 0x1a, 0x24, 0x5a, 0xdf, 0xa3, 0x91, 0xff, 0x59, 0x7b, 0x5a, 0x2a, 0x98, 0x95, 0x34, + 0x66, 0x3f, 0x72, 0xd2, 0x0c, 0x7c, 0x5f, 0x93, 0x57, 0x84, 0x41, 0xe0, 0x6a, 0x15, 0xee, 0x01, 0xed, 0x90, 0xab, 0x92, 0xbc, 0x56, 0xac, 0xcd, 0x30, 0x24, 0x4d, 0xb5, 0x4e, 0xe7, 0x40, 0xf8, + 0xdb, 0xc1, 0x31, 0xba, 0xb4, 0x72, 0xb7, 0xf6, 0xc0, 0x75, 0xde, 0xf0, 0xbf, 0xf3, 0x9a, 0x15, 0xaf, 0xcb, 0xad, 0xc3, 0xf1, 0x52, 0xb6, 0xd3, 0x39, 0x16, 0x6c, 0x73, 0x52, 0x45, 0xea, 0xd5, + 0xcc, 0x98, 0xc0, 0x7d, 0xfe, 0xb2, 0x59, 0xf9, 0x29, 0x67, 0x73, 0xba, 0xa8, 0xb3, 0x14, 0x23, 0xc9, 0xc2, 0xfd, 0x8e, 0xd7, 0x35, 0x6f, 0x1b, 0xcd, 0x17, 0x22, 0x73, 0x21, 0x47, 0xcf, 0x0a, + 0x59, 0x39, 0x9c, 0x97, 0x07, 0x3d, 0xcc, 0xc9, 0x0e, 0xb3, 0xe8, 0xb9, 0x20, 0xe6, 0xdc, 0xd1, 0x37, 0xd0, 0x79, 0x1f, 0xdc, 0xb5, 0x44, 0x0d, 0xbf, 0x5f, 0x21, 0xc3, 0x9c, 0xae, 0x64, 0xe0, + 0x82, 0xe7, 0xe9, 0xc2, 0x81, 0xd3, 0xff, 0xd6, 0xb4, 0x33, 0xc8, 0xb8, 0x29, 0xe2, 0x9b, 0x87, 0xbb, 0x69, 0x77, 0x34, 0xec, 0x0f, 0x7e, 0x98, 0xee, 0x39, 0xc7, 0x49, 0xf0, 0xf5, 0xeb, 0xe7, + 0x5f, 0x6b, 0x45, 0xce, 0x47, 0x64, 0x59, 0x69, 0xf8, 0xb7, 0xef, 0xc9, 0xf0, 0x5e, 0x3f, 0xf7, 0xca, 0x00, 0xbf, 0x1e, 0x93, 0x24, 0x9a, 0xd8, 0x7c, 0x99, 0xce, 0x12, 0x7d, 0x8a, 0x82, 0xb7, + 0xfb, 0x5f, 0x89, 0xb1, 0x38, 0x1c, 0x8f, 0xa3, 0x78, 0x7a, 0x13, 0xc6, 0xc1, 0xbb, 0xde, 0x6f, 0x05, 0x29, 0x0a, 0x14, 0xe5, 0x85, 0xd8, 0xb6, 0x4f, 0xfe, 0x17, 0x22, 0x0e, 0xe5, 0xdc, 0x86, + 0xf7, 0xc3, 0xee, 0x75, 0x14, 0x07, 0x5c, 0x2c, 0xaa, 0x95, 0xd3, 0xb0, 0xf8, 0x15, 0x8b, 0x99, 0x5b, 0x1f, 0xcb, 0x87, 0x3b, 0x42, 0x59, 0x59, 0x76, 0xbd, 0xd1, 0xe3, 0xf0, 0x76, 0x14, 0xf6, + 0xa6, 0xf7, 0xf1, 0x6d, 0xe0, 0xea, 0xb5, 0x55, 0x76, 0xce, 0xcf, 0x05, 0x16, 0xdc, 0xb2, 0x37, 0xd6, 0xd7, 0x72, 0x1b, 0x38, 0xa7, 0xfc, 0x5c, 0x91, 0x27, 0x22, 0xe8, 0xf9, 0x81, 0x4d, 0xe7, + 0x17, 0xfe, 0x5f, 0xfc, 0xbf, 0x1e, 0x9e, 0xb5, 0xcd, 0x59, 0x69, 0xad, 0xd3, 0x1f, 0xc5, 0x06, 0x06, 0x8a, 0x3f, 0x21, 0x93, 0xc1, 0x87, 0xd6, 0x65, 0x05, 0x04, 0x83, 0x84, 0x10, 0x06, 0xc3, + 0xdf, 0x40, 0xc2, 0xeb, 0xb1, 0x28, 0x04, 0x2f, 0x50, 0x28, 0x8a, 0xd2, 0x3d, 0x83, 0xde, 0x08, 0x4e, 0x1d, 0x3d, 0xb4, 0x9b, 0x8a, 0xf7, 0x42, 0x5d, 0xee, 0x96, 0xf0, 0x5e, 0xe4, 0x2e, 0xe8, + 0x4c, 0x1d, 0xf8, 0xec, 0x79, 0x57, 0x4e, 0x3d, 0x91, 0x59, 0x28, 0x9b, 0x4b, 0x27, 0xcf, 0xf9, 0x16, 0xc8, 0x5a, 0xf1, 0x15, 0x51, 0x54, 0x0f, 0x27, 0x3b, 0xc8, 0xf8, 0x96, 0x55, 0xe3, 0xb6, + 0xee, 0xb2, 0x47, 0x49, 0x29, 0x47, 0x0b, 0x13, 0xea, 0x76, 0x8a, 0x4c, 0x09, 0x3d, 0x39, 0x98, 0x81, 0x44, 0xcf, 0x71, 0x46, 0xa4, 0x84, 0xb5, 0x3c, 0xe0, 0x07, 0xcb, 0xaf, 0x2b, 0xc1, 0x76, + 0x7b, 0x59, 0x76, 0xf4, 0x42, 0xf0, 0x25, 0x9d, 0x51, 0x55, 0x4e, 0x72, 0x9a, 0x89, 0x32, 0x98, 0x51, 0x46, 0xc4, 0x0e, 0x32, 0xa2, 0x88, 0x5f, 0x5f, 0xb7, 0x5e, 0x03, 0x50, 0x9e, 0x0d, 0x41, + 0x39, 0xfc, 0x3e, 0x0c, 0x1f, 0xa7, 0x0f, 0x51, 0x7c, 0x35, 0x4a, 0xaa, 0x31, 0x44, 0x89, 0x35, 0xba, 0x96, 0xc6, 0xec, 0x37, 0xfa, 0x56, 0x33, 0x8d, 0xe7, 0x50, 0x8c, 0x21, 0x38, 0x73, 0xce, + 0x00, 0x73, 0x89, 0xb5, 0x4c, 0x3b, 0x86, 0x6a, 0xb9, 0x71, 0x34, 0x1e, 0xdd, 0xc7, 0xb7, 0xf5, 0xec, 0xbb, 0x97, 0x79, 0x14, 0xe7, 0x17, 0x1c, 0xff, 0x2b, 0x8a, 0x4a, 0x93, 0x7e, 0xb7, 0x77, + 0x5d, 0xbe, 0xce, 0x33, 0x76, 0xa2, 0x4c, 0x33, 0x3f, 0xf4, 0xb2, 0x75, 0x90, 0x55, 0xaa, 0xc0, 0xf7, 0xfd, 0x43, 0xe6, 0x5e, 0xe3, 0xbd, 0xce, 0x6f, 0x07, 0xbc, 0xa6, 0x6b, 0x55, 0x9c, 0xcc, + 0x4f, 0xc1, 0xb7, 0x28, 0xe4, 0x12, 0xf3, 0x1c, 0xda, 0x5d, 0xbb, 0xcd, 0xb8, 0xdf, 0xfe, 0xcb, 0xfd, 0x87, 0xf3, 0xd5, 0x57, 0xee, 0x37, 0x5b, 0x9c, 0xa5, 0x39, 0xd5, 0xf7, 0x6e, 0x00, 0x0c, + 0xb7, 0x6d, 0x3e, 0x33, 0x77, 0x7b, 0xb2, 0x93, 0x0a, 0x57, 0xfe, 0x10, 0x95, 0xff, 0x88, 0xb3, 0xae, 0xa1, 0xf8, 0xbe, 0x64, 0xa1, 0x73, 0x38, 0x6d, 0xeb, 0x88, 0x9f, 0xfe, 0x2c, 0x95, 0xa0, + 0x6c, 0xf1, 0x4b, 0xa7, 0x33, 0x90, 0xc3, 0x75, 0x9e, 0x8f, 0x44, 0xb4, 0x2a, 0xd4, 0xee, 0xf4, 0xa4, 0x0c, 0xc2, 0x7d, 0x12, 0xc5, 0xc3, 0xf0, 0x2e, 0xf2, 0x4e, 0xce, 0xa0, 0xad, 0xb5, 0xfe, + 0x06, 0xfd, 0x38, 0x4c, 0x92, 0xc7, 0x51, 0xdc, 0xf3, 0x4e, 0xce, 0xce, 0xce, 0xe0, 0xc8, 0x40, 0xbf, 0x2b, 0x30, 0x43, 0xa6, 0x28, 0xc9, 0xe5, 0x9b, 0xc6, 0x0e, 0x51, 0xe9, 0xf9, 0xa1, 0x26, + 0x3d, 0x36, 0xa6, 0x05, 0xc7, 0xfa, 0xac, 0x6b, 0xff, 0x2e, 0x7f, 0x7e, 0xd6, 0x92, 0x12, 0x14, 0x1b, 0x9a, 0xe2, 0x98, 0x53, 0xa6, 0xee, 0x08, 0x23, 0x0b, 0x14, 0xbf, 0x74, 0x3a, 0x09, 0xa6, + 0x6b, 0x41, 0xd5, 0x6e, 0x2c, 0xb8, 0xe2, 0x29, 0xcf, 0x21, 0x00, 0x4b, 0x7d, 0x78, 0x3e, 0xd9, 0x15, 0xf8, 0x4b, 0xa7, 0x33, 0xc9, 0xe5, 0x87, 0xcb, 0xef, 0xa1, 0xe1, 0x44, 0x95, 0xb9, 0x3e, + 0xcd, 0xf1, 0xf4, 0xe4, 0x30, 0x6b, 0xc6, 0xb4, 0x26, 0x10, 0x4e, 0xce, 0x2a, 0xbb, 0x7e, 0x3f, 0xbe, 0xfa, 0x94, 0x51, 0xb9, 0xc4, 0xec, 0x00, 0x4b, 0xaf, 0x16, 0x93, 0xed, 0x34, 0x7a, 0xcf, + 0xd2, 0xb5, 0x6b, 0x1b, 0x8e, 0x6d, 0x40, 0x63, 0xc1, 0x37, 0x34, 0xd3, 0x2b, 0xa1, 0x2b, 0x15, 0x61, 0x19, 0x11, 0x19, 0xfd, 0x27, 0x66, 0x2e, 0x6c, 0xc9, 0x4e, 0xf7, 0x24, 0x81, 0x4a, 0x50, + 0xdc, 0x94, 0x9f, 0x53, 0xba, 0xb7, 0x03, 0x20, 0x62, 0x61, 0x7b, 0xc5, 0x96, 0xe6, 0xb6, 0xd5, 0x98, 0xef, 0xb3, 0x66, 0x7f, 0x9b, 0x71, 0xb5, 0x84, 0x47, 0xb3, 0x4b, 0x97, 0x5f, 0xce, 0x18, + 0x67, 0xed, 0xea, 0x19, 0xcd, 0xfa, 0xa9, 0xef, 0x6d, 0xbf, 0x31, 0x6f, 0x74, 0xef, 0x7a, 0xd3, 0xdb, 0xc1, 0x30, 0x9a, 0x86, 0xf1, 0x0f, 0x49, 0xe0, 0x7d, 0xe7, 0x38, 0xde, 0xe1, 0xc5, 0xe6, + 0xc1, 0x5b, 0x17, 0x64, 0xb5, 0x46, 0x8f, 0xc6, 0x93, 0xfa, 0xa1, 0x17, 0x5d, 0xdd, 0xff, 0x60, 0x8f, 0xda, 0x69, 0x4e, 0xa4, 0x2c, 0x88, 0x5a, 0xbe, 0x68, 0x57, 0x6e, 0xbb, 0x57, 0x5e, 0x36, + 0xab, 0x75, 0xae, 0xe8, 0x1d, 0xcf, 0xd6, 0x39, 0x8e, 0xcb, 0x4e, 0xd8, 0xab, 0xe6, 0xd2, 0xe0, 0x8d, 0xb9, 0xb2, 0x16, 0x55, 0x5d, 0x81, 0x7b, 0xdd, 0xa5, 0x8d, 0x1e, 0x78, 0xdf, 0xe9, 0x3e, + 0x69, 0xb6, 0xc4, 0xdb, 0xe8, 0x21, 0xba, 0x85, 0x0f, 0xd0, 0x98, 0xca, 0xab, 0x69, 0x47, 0xdf, 0xef, 0xe6, 0xe0, 0xc5, 0x4a, 0xf9, 0xa1, 0xbc, 0xf8, 0x8f, 0xc6, 0x87, 0x06, 0x89, 0x57, 0xff, + 0xed, 0x39, 0xbf, 0x67, 0x53, 0xe7, 0x52, 0x1d, 0xad, 0xea, 0xf5, 0x36, 0xfa, 0x27, 0xec, 0xea, 0x5c, 0xaa, 0xf7, 0x96, 0xf5, 0xea, 0xf5, 0x6f, 0x48, 0x78, 0x67, 0x5d, 0xaf, 0x5e, 0xef, 0xf7, + 0x75, 0xed, 0x62, 0xe9, 0x63, 0x41, 0xca, 0xaf, 0xf0, 0xd5, 0xa7, 0x08, 0x5d, 0x61, 0xc7, 0xdf, 0xfb, 0xea, 0xad, 0xcf, 0x7c, 0xc1, 0x39, 0xfa, 0x80, 0x63, 0xa8, 0x1a, 0x5f, 0x70, 0x8c, 0x54, + 0xa7, 0x49, 0x37, 0x89, 0xe2, 0xbb, 0xc1, 0x30, 0x9c, 0x44, 0x1a, 0xcc, 0x0d, 0x4a, 0x7c, 0xa6, 0x0a, 0x0e, 0x53, 0x65, 0x8e, 0xce, 0xaf, 0x0e, 0x4f, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0x73, 0x2c, 0x84, 0x18, 0xd1, 0x09, 0x00, 0x00, 0xcf, 0x19, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x57, 0x51, 0x6f, 0xdb, 0x38, 0x0c, 0x7e, 0xcf, 0xaf, 0x30, 0x82, 0xbe, 0x5a, 0x4a, 0xda, 0x1b, 0x50, 0x14, 0x3a, 0x0d, 0xf7, 0x70, 0xc3, + 0x0d, 0x68, 0xb7, 0x02, 0xdd, 0x0d, 0xf7, 0xaa, 0xda, 0xb4, 0xa3, 0xd6, 0x96, 0x3c, 0x49, 0x4e, 0x13, 0x14, 0xf9, 0xef, 0x07, 0x59, 0xb6, 0x63, 0xd9, 0x72, 0xb2, 0x16, 0x77, 0x7b, 0x8b, 0xc8, + 0x8f, 0x34, 0x45, 0x7e, 0xa4, 0x18, 0xf2, 0x71, 0x57, 0x16, 0xd1, 0x16, 0x94, 0xe6, 0x52, 0xfc, 0xbe, 0x5c, 0xa3, 0xd5, 0xf2, 0x23, 0x5d, 0x90, 0x4a, 0xc9, 0x27, 0x48, 0x4c, 0xb4, 0xd3, 0xfc, + 0x46, 0x27, 0x1b, 0x28, 0xd9, 0xad, 0x4c, 0x98, 0x69, 0x30, 0x1b, 0x63, 0xaa, 0x1b, 0x8c, 0x4b, 0xb6, 0x05, 0x81, 0x58, 0xc5, 0x92, 0x0d, 0x20, 0xa9, 0x72, 0x7c, 0xff, 0xf5, 0x0e, 0xff, 0x86, + 0x56, 0x68, 0x15, 0x59, 0x84, 0x0e, 0x41, 0x76, 0x3a, 0x75, 0xc2, 0xb8, 0x01, 0xa2, 0x9d, 0x4e, 0x97, 0xd1, 0xae, 0x2c, 0x84, 0xfe, 0x09, 0xb7, 0xcb, 0x45, 0x14, 0x45, 0x0e, 0x7d, 0xb3, 0xd3, + 0xbc, 0xb7, 0x78, 0x79, 0x79, 0x41, 0x2f, 0x57, 0x0d, 0xf6, 0x72, 0xb5, 0x5a, 0xe3, 0x7f, 0xee, 0x6e, 0x1f, 0x9a, 0x90, 0x63, 0x2e, 0xb4, 0x61, 0x22, 0x81, 0x25, 0x5d, 0x44, 0x11, 0x29, 0x65, + 0x0a, 0xc5, 0x77, 0x77, 0x53, 0xda, 0x78, 0x24, 0xd8, 0x93, 0x59, 0x50, 0xae, 0x64, 0x5d, 0x7d, 0x4e, 0xa9, 0x54, 0x39, 0x62, 0x49, 0x09, 0x04, 0x77, 0x12, 0xab, 0x65, 0xca, 0xf0, 0x8c, 0x25, + 0xe6, 0x73, 0x4a, 0xb3, 0x5a, 0x24, 0x36, 0x1f, 0x04, 0x0f, 0x84, 0x16, 0xd3, 0xe6, 0x92, 0xae, 0xed, 0x17, 0xe2, 0x87, 0x2f, 0x7f, 0xdc, 0x3f, 0xfc, 0xf5, 0xf5, 0x1b, 0xc1, 0xdb, 0xc1, 0x57, + 0x2a, 0x25, 0x2b, 0x50, 0x86, 0x83, 0xa6, 0xcd, 0xa5, 0x48, 0x22, 0xcb, 0x8a, 0x17, 0xa0, 0xe2, 0xaa, 0xa8, 0x73, 0x2e, 0x50, 0x07, 0xbe, 0x42, 0xd7, 0x68, 0x4d, 0xf0, 0x9c, 0xda, 0x19, 0xbb, + 0x94, 0x75, 0x18, 0x54, 0x31, 0xc5, 0x4a, 0x30, 0xa0, 0x34, 0x35, 0xaa, 0x06, 0x82, 0xe7, 0xf5, 0x41, 0x7b, 0x2d, 0x6b, 0x95, 0x00, 0x5d, 0xa3, 0xeb, 0x89, 0x69, 0xab, 0x0a, 0x9a, 0x19, 0xa6, + 0x72, 0x30, 0x41, 0xb3, 0x56, 0xe5, 0xcc, 0x5a, 0x6a, 0xa1, 0xc7, 0x9a, 0x17, 0x69, 0xeb, 0xf1, 0x4f, 0x91, 0xc8, 0x94, 0x8b, 0x9c, 0xfe, 0xfd, 0xed, 0x53, 0x7c, 0x4d, 0xf0, 0x49, 0x8c, 0xef, + 0x46, 0x41, 0x25, 0x95, 0xe1, 0x22, 0x47, 0xb2, 0x36, 0x55, 0x6d, 0xe6, 0x5c, 0xcd, 0xe2, 0x9c, 0xbb, 0x1f, 0x35, 0x53, 0xcf, 0xb5, 0x1e, 0x27, 0xf8, 0x12, 0x5d, 0xa2, 0x2b, 0xf4, 0x89, 0x0b, + 0x56, 0x10, 0x3c, 0x83, 0xf1, 0x1c, 0xa0, 0xaa, 0x60, 0x26, 0x93, 0xaa, 0x44, 0x1d, 0x2d, 0x62, 0x9e, 0xd2, 0xce, 0xb2, 0x16, 0xdc, 0x5a, 0x41, 0xfc, 0x28, 0xcb, 0xde, 0x5f, 0xd8, 0x64, 0xc6, + 0x6b, 0xc3, 0x46, 0xab, 0xe7, 0x12, 0xb5, 0xca, 0x80, 0xa3, 0x1e, 0x35, 0xe3, 0xe5, 0xd4, 0xf5, 0xa6, 0x28, 0xe7, 0x44, 0xd7, 0x0a, 0x32, 0xae, 0x60, 0x4a, 0x51, 0xcb, 0xf3, 0xbb, 0x0f, 0x04, + 0xcf, 0x21, 0x2c, 0xe3, 0xb1, 0x4f, 0x79, 0x92, 0x42, 0x05, 0x22, 0x05, 0x91, 0xec, 0xef, 0x98, 0x60, 0x39, 0x94, 0x20, 0x3a, 0x82, 0xf4, 0xaa, 0xbe, 0x3d, 0x3c, 0x7c, 0x27, 0x1a, 0x34, 0xeb, + 0xc5, 0xeb, 0x6c, 0x06, 0x0e, 0x5e, 0x03, 0xb7, 0x76, 0x83, 0x8e, 0x0d, 0x98, 0x0e, 0xaa, 0x70, 0x18, 0x77, 0x77, 0xeb, 0xa0, 0xbb, 0x59, 0xc0, 0xba, 0x55, 0x1d, 0xbc, 0x86, 0x6f, 0xcd, 0xcc, + 0xbe, 0x02, 0x5a, 0xd9, 0xd2, 0x37, 0xbf, 0x8e, 0x0a, 0x9d, 0xc8, 0x0a, 0x28, 0x2f, 0x2d, 0x45, 0x09, 0x76, 0xa7, 0xee, 0xe6, 0x78, 0x7c, 0xf5, 0x81, 0xa4, 0xcb, 0x26, 0x9e, 0x4b, 0x67, 0x20, + 0x99, 0x81, 0x54, 0xf6, 0x89, 0x1c, 0x92, 0x6a, 0x94, 0xb6, 0x61, 0xd2, 0x3a, 0x3a, 0x67, 0xb5, 0xf8, 0xb1, 0x8f, 0x9f, 0x05, 0x33, 0x7c, 0x0b, 0x31, 0x6c, 0x41, 0x18, 0x3d, 0xcd, 0x58, 0xe0, + 0x06, 0xff, 0x5d, 0x08, 0xba, 0x64, 0x45, 0xa1, 0xf6, 0x10, 0x6f, 0x80, 0x15, 0x66, 0xf3, 0x8b, 0xbf, 0xfe, 0x54, 0x0b, 0x6e, 0x3e, 0x84, 0x48, 0xd2, 0x96, 0xd4, 0x80, 0xf6, 0x0b, 0xfa, 0xe6, + 0x70, 0x14, 0x68, 0x13, 0x33, 0x6d, 0x7b, 0x2b, 0x3d, 0x19, 0x93, 0x0f, 0x7c, 0x7f, 0x44, 0x01, 0x7a, 0x35, 0x63, 0xb8, 0x45, 0xbb, 0xde, 0x3e, 0x36, 0xa6, 0x3b, 0x07, 0x9a, 0xf2, 0x44, 0x2a, + 0xc3, 0xc9, 0x74, 0x8b, 0x81, 0xf3, 0xf7, 0xb3, 0x7d, 0x37, 0x1a, 0x35, 0xc1, 0xae, 0x83, 0x1d, 0x24, 0xb5, 0x7d, 0xaa, 0xf5, 0x51, 0x38, 0x14, 0x0f, 0xa5, 0x36, 0x7e, 0xc9, 0x0a, 0xed, 0xcb, + 0x5a, 0x29, 0xcd, 0x41, 0x80, 0x62, 0x06, 0xe2, 0x44, 0xa6, 0x76, 0x33, 0xb0, 0xb2, 0xf3, 0xc0, 0xd8, 0xa6, 0x5c, 0x9f, 0x82, 0x37, 0xf9, 0x0d, 0x01, 0x9c, 0xcc, 0x8f, 0x1b, 0x07, 0x02, 0x1f, + 0x08, 0x8f, 0x95, 0xc1, 0x7e, 0x69, 0xa6, 0x95, 0x1a, 0xa4, 0xd8, 0xe5, 0x7e, 0xb4, 0x66, 0x9c, 0x2d, 0xc2, 0xcc, 0x5a, 0x32, 0xad, 0xc2, 0x3b, 0x62, 0x19, 0x3d, 0x26, 0x67, 0x63, 0x99, 0x79, + 0x7c, 0x82, 0x8c, 0x48, 0xa4, 0xc8, 0x78, 0x5e, 0x2b, 0x36, 0x2e, 0x3f, 0xd1, 0x7b, 0x6d, 0xa0, 0xbc, 0x77, 0x6f, 0xd5, 0xfe, 0x3b, 0x53, 0x9c, 0x3d, 0x16, 0x30, 0xa2, 0x03, 0x79, 0x62, 0x5b, + 0x86, 0x6a, 0xc3, 0x0b, 0x54, 0xc8, 0x3c, 0xb7, 0x3b, 0x45, 0xd9, 0x4c, 0x5d, 0xd5, 0xac, 0x8d, 0x4f, 0x8f, 0x52, 0x6b, 0xab, 0x69, 0x85, 0xe8, 0x56, 0xe6, 0x6e, 0x2a, 0x2b, 0x82, 0xe7, 0x4d, + 0xfd, 0x4f, 0xb8, 0x0d, 0x6a, 0x23, 0x4b, 0xa0, 0x17, 0xaf, 0xc7, 0xc3, 0xa1, 0xdb, 0xad, 0x1a, 0x8d, 0x47, 0x8b, 0xb3, 0xa1, 0xdb, 0x35, 0x32, 0x70, 0x6f, 0xbf, 0x36, 0xdd, 0xa9, 0x7d, 0x57, + 0xfa, 0xce, 0xb7, 0xfb, 0x56, 0xc6, 0x7b, 0x7f, 0xdd, 0xb1, 0x77, 0xc2, 0x53, 0xea, 0x9e, 0x01, 0x82, 0xf9, 0x60, 0x3c, 0x25, 0x86, 0x6f, 0x47, 0x59, 0xee, 0x96, 0xdf, 0xbd, 0x17, 0xbe, 0x60, + 0x25, 0xf4, 0x1e, 0x9a, 0xc3, 0x20, 0xee, 0xb1, 0x05, 0xc1, 0x53, 0xc7, 0xc3, 0x21, 0x15, 0x45, 0xd3, 0x41, 0x15, 0x85, 0x68, 0x17, 0x05, 0xa9, 0x97, 0x31, 0x5e, 0x68, 0x96, 0x9d, 0xa6, 0x5e, + 0xf4, 0x6e, 0xfa, 0x35, 0x96, 0xe1, 0xa1, 0xe4, 0xab, 0xc6, 0x9a, 0xb9, 0xe1, 0xd4, 0x6b, 0x28, 0x17, 0x06, 0x72, 0x57, 0xde, 0xd8, 0x0d, 0xfa, 0xd0, 0xd0, 0x39, 0xe2, 0xb7, 0xa0, 0x78, 0xb6, + 0x9f, 0x43, 0x05, 0xa6, 0x4f, 0xab, 0x98, 0x6d, 0xa0, 0x1e, 0x71, 0x96, 0x8d, 0x1e, 0xda, 0x15, 0x1e, 0xf1, 0x92, 0xe5, 0x80, 0x2a, 0x66, 0x36, 0xf4, 0xe2, 0xd5, 0xff, 0x0f, 0x90, 0x72, 0x05, + 0x89, 0x91, 0x6a, 0x7f, 0xc0, 0x63, 0x55, 0x66, 0xd7, 0xd7, 0x2f, 0xac, 0x84, 0x43, 0xac, 0x6a, 0x21, 0x6c, 0x97, 0x4d, 0xfd, 0x85, 0xbf, 0xfb, 0xff, 0x37, 0x72, 0xff, 0xa9, 0xb7, 0x36, 0x74, + 0x6f, 0x78, 0xbe, 0xb1, 0x8f, 0xd0, 0x93, 0x75, 0x09, 0xbe, 0x1c, 0x23, 0xc5, 0xe8, 0xa9, 0x99, 0x8c, 0x69, 0x3c, 0x7e, 0xfe, 0xb1, 0xd7, 0x76, 0x93, 0x3f, 0xb6, 0x8d, 0xb0, 0xdf, 0x91, 0x59, + 0xf2, 0x6c, 0x0b, 0xd2, 0x2c, 0xbf, 0x5d, 0xaf, 0x07, 0x95, 0xbd, 0xf7, 0xc9, 0x1f, 0x65, 0x3c, 0x18, 0x3c, 0xfd, 0x41, 0xd3, 0x45, 0xff, 0x47, 0x8f, 0x2e, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x81, 0xdb, 0x3b, 0xda, 0x18, 0x04, 0x00, 0x00, 0xd3, 0x10, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, + 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, + 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, + 0x76, 0x61, 0x9c, 0x91, 0xbf, 0x6e, 0xdb, 0x30, 0x10, 0xc6, 0x77, 0x3e, 0xc5, 0x8d, 0x92, 0x06, 0xea, 0x01, 0xd4, 0x16, 0x6e, 0x8b, 0x1a, 0xe8, 0x50, 0x14, 0x45, 0x93, 0x21, 0x23, 0x2d, 0x9d, + 0x25, 0xc2, 0x14, 0x49, 0xf1, 0x8e, 0x8e, 0x85, 0xc0, 0xef, 0x1e, 0x50, 0x7f, 0x2c, 0x03, 0x49, 0x96, 0x68, 0x21, 0x71, 0xbf, 0xef, 0x3b, 0xde, 0x7d, 0xf2, 0xaa, 0x3e, 0xa9, 0x16, 0xe1, 0x18, + 0x6d, 0xcd, 0xda, 0x59, 0xaa, 0x84, 0xd0, 0xbd, 0x77, 0x81, 0x41, 0x3b, 0x39, 0x44, 0x15, 0x4e, 0x91, 0xe4, 0x31, 0xda, 0x61, 0x94, 0xfb, 0x68, 0x87, 0xea, 0x43, 0x7a, 0xb2, 0x8a, 0xf5, 0x19, + 0x25, 0x9e, 0xd1, 0x32, 0xc9, 0x9f, 0xc6, 0xc5, 0xe6, 0x57, 0xba, 0x7f, 0xc2, 0xf2, 0x23, 0x6a, 0xd3, 0x60, 0xa8, 0x84, 0x28, 0x8b, 0x42, 0x40, 0x01, 0x4f, 0x2e, 0x06, 0xd8, 0x2f, 0x33, 0x42, + 0x6d, 0x14, 0x91, 0x80, 0xa2, 0x14, 0x3e, 0x1e, 0x8c, 0xae, 0xe7, 0xc2, 0xc6, 0x5f, 0x84, 0x00, 0x00, 0x98, 0xbc, 0xe9, 0x2b, 0xe0, 0x91, 0x10, 0xb8, 0x43, 0xf8, 0x37, 0xbf, 0x9f, 0xa4, 0x03, + 0xe0, 0x85, 0xd1, 0x52, 0x32, 0x1c, 0x5d, 0x98, 0xf0, 0x9a, 0x82, 0x84, 0x87, 0x4e, 0x13, 0xe0, 0x45, 0xf5, 0xde, 0xe0, 0xda, 0x64, 0xa5, 0x40, 0xba, 0xf7, 0x66, 0x04, 0xac, 0x3b, 0x87, 0x04, + 0x9a, 0x09, 0xb4, 0xf5, 0x91, 0xa1, 0x51, 0xac, 0xe4, 0xaa, 0xde, 0x79, 0x15, 0x54, 0xbf, 0x10, 0x05, 0xdb, 0x72, 0x37, 0x41, 0x40, 0x8e, 0xc1, 0xbe, 0xc7, 0xca, 0xe9, 0xdc, 0xa5, 0x29, 0xa7, + 0xdb, 0xb2, 0xe6, 0xa6, 0xfb, 0xf2, 0x37, 0xb2, 0x8f, 0xfc, 0xed, 0x36, 0x53, 0x76, 0xc7, 0x7e, 0xdb, 0x09, 0x4d, 0x2f, 0xe7, 0x6b, 0x18, 0x53, 0x20, 0x25, 0x7c, 0x6f, 0x1a, 0x18, 0x53, 0x98, + 0x87, 0x48, 0xda, 0x22, 0x11, 0x18, 0xd7, 0xea, 0x1a, 0x3a, 0x0c, 0xb8, 0x09, 0xff, 0x8f, 0xc4, 0xd8, 0x4b, 0x17, 0x59, 0xfa, 0xa0, 0x2d, 0x1b, 0x9b, 0xcd, 0xdd, 0xaa, 0x9b, 0x64, 0x1e, 0x00, + 0xdc, 0x7c, 0x7c, 0x05, 0x8b, 0xcf, 0x4b, 0x6d, 0x96, 0xca, 0x14, 0x46, 0x96, 0xcb, 0x16, 0xf9, 0x0f, 0x12, 0xa9, 0x16, 0xb3, 0xfc, 0xce, 0xbe, 0xec, 0xfe, 0xe6, 0x97, 0xcb, 0x3a, 0xa0, 0x62, + 0xcc, 0x72, 0x79, 0x48, 0x85, 0x6c, 0xee, 0xbf, 0x18, 0xaf, 0x42, 0x5c, 0xc5, 0x6b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x29, 0x16, 0x23, 0x9b, 0x51, 0x01, 0x00, 0x00, 0xb2, + 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0xa4, 0x90, 0xb1, 0x6e, 0xc4, 0x20, 0x10, 0x44, 0x7b, + 0xbe, 0x62, 0x44, 0xc3, 0x9d, 0x2c, 0xe5, 0x07, 0x4e, 0x27, 0xa5, 0x4d, 0x11, 0xa5, 0x48, 0x9b, 0x86, 0x70, 0x1b, 0x82, 0xe2, 0x60, 0x04, 0x8b, 0x1b, 0xcb, 0xff, 0x1e, 0xd9, 0xe0, 0x38, 0x96, + 0x50, 0x9a, 0xdb, 0x0a, 0xed, 0xcc, 0xbc, 0x1d, 0x11, 0xb4, 0xf9, 0xd2, 0x96, 0xf0, 0x91, 0xbd, 0x61, 0x37, 0xf8, 0x74, 0x11, 0x22, 0xe4, 0xf7, 0xde, 0x19, 0x98, 0x5e, 0xa7, 0x84, 0x27, 0x1f, + 0x32, 0x63, 0x12, 0x00, 0x10, 0xa2, 0x1b, 0x35, 0x13, 0x5e, 0x39, 0x3a, 0x6f, 0xf1, 0x4d, 0x29, 0x69, 0x4b, 0x17, 0x51, 0xc4, 0x92, 0x5a, 0xfd, 0xa7, 0x33, 0xa6, 0xb9, 0xb1, 0x3e, 0x06, 0xcf, + 0x15, 0xbb, 0x0c, 0x7f, 0xba, 0xf4, 0x50, 0xf7, 0xb8, 0xee, 0xe8, 0x45, 0x3b, 0x92, 0x2a, 0xc3, 0x12, 0x3f, 0x17, 0xd3, 0xe9, 0x2f, 0x27, 0x12, 0xe7, 0xe8, 0xff, 0xcb, 0x8f, 0x83, 0xbb, 0x21, + 0xed, 0xe9, 0xbb, 0x3a, 0x3d, 0xbe, 0x8c, 0x14, 0xa3, 0xbb, 0x51, 0xa3, 0x21, 0x0f, 0xe5, 0xd1, 0xea, 0x27, 0xd7, 0xff, 0x98, 0x24, 0xba, 0x5f, 0x65, 0x1b, 0x59, 0xef, 0x5c, 0x95, 0x44, 0xb7, + 0x1d, 0x45, 0x07, 0xf5, 0xa6, 0x54, 0xc3, 0xae, 0x66, 0xb5, 0x35, 0x9a, 0xc5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa6, 0x1f, 0xc2, 0x5d, 0xbc, 0x00, 0x00, 0x00, 0xce, + 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0xa4, 0x90, 0xc1, 0x6a, 0xc4, 0x20, 0x10, 0x86, + 0xef, 0x3e, 0xc5, 0x8f, 0x17, 0x77, 0x09, 0xf4, 0x05, 0x96, 0x85, 0xbe, 0x40, 0xc9, 0xa1, 0xd7, 0x5e, 0xac, 0x99, 0x5a, 0x69, 0x6a, 0x44, 0xc7, 0x5c, 0x42, 0xde, 0xbd, 0x04, 0x4d, 0xd3, 0x80, + 0xf4, 0xb2, 0x73, 0x92, 0x99, 0xf9, 0xbe, 0xf9, 0x31, 0x68, 0xf3, 0xa5, 0x2d, 0xe1, 0x23, 0x7b, 0xc3, 0x6e, 0xf2, 0xe9, 0x26, 0x44, 0xc8, 0xef, 0xa3, 0x33, 0x30, 0xa3, 0x4e, 0x09, 0x7d, 0xe6, + 0x90, 0x19, 0x8b, 0x00, 0x80, 0x10, 0xdd, 0xac, 0x99, 0xf0, 0xca, 0xd1, 0x79, 0x8b, 0x6f, 0x4a, 0x49, 0x5b, 0xba, 0x89, 0x32, 0x2c, 0x58, 0x01, 0x2e, 0x57, 0x2c, 0x6b, 0xab, 0x7f, 0x46, 0xaf, + 0x55, 0xbc, 0x15, 0x7f, 0xba, 0xf4, 0x54, 0xfb, 0xb8, 0x1f, 0xf2, 0x6d, 0x76, 0x56, 0x55, 0x87, 0x25, 0x7e, 0x29, 0x4b, 0x97, 0xbf, 0x9e, 0x48, 0x9c, 0xa3, 0xff, 0x8f, 0x9f, 0x27, 0x37, 0x20, + 0x1d, 0xf4, 0x43, 0x99, 0x9e, 0xfb, 0x99, 0x62, 0x74, 0x03, 0x35, 0x12, 0xf2, 0x54, 0x1e, 0xad, 0x7c, 0xb2, 0x7c, 0xc8, 0x22, 0xd1, 0xfd, 0x8e, 0xf6, 0x92, 0xf5, 0xd0, 0x5d, 0x49, 0x74, 0xfb, + 0x55, 0x74, 0x50, 0x6f, 0x4a, 0x35, 0xd6, 0xd5, 0xaa, 0xf6, 0x48, 0xab, 0xf8, 0x09, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x03, 0xc2, 0xc1, 0xc3, 0xba, 0x00, 0x00, 0x00, 0xd2, 0x01, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, + 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x74, 0x8c, 0x41, 0x12, 0x83, 0x20, 0x10, 0x04, 0xef, 0xfe, 0x45, 0xf2, 0x02, 0x1e, 0x33, 0x45, 0x46, 0x21, 0x6e, 0x00, 0x97, 0x25, 0x15, 0x7e, 0x9f, 0x83, 0xa5, 0x39, 0x79, 0xec, + 0xe9, 0xae, 0xd9, 0x3b, 0x74, 0xeb, 0xcd, 0x2d, 0x3d, 0xef, 0xc3, 0xf1, 0x5b, 0x8b, 0x9a, 0x5f, 0x7a, 0x0e, 0x96, 0x4a, 0x9e, 0x4e, 0x5b, 0x11, 0x36, 0xac, 0x74, 0x36, 0x2a, 0xbd, 0x70, 0x45, + 0x18, 0xf3, 0x0b, 0x7a, 0xf9, 0xf6, 0x86, 0x88, 0x0e, 0xce, 0x91, 0x10, 0x8b, 0x4e, 0x4b, 0xb1, 0xb9, 0xc2, 0xa2, 0x7f, 0x1c, 0xcb, 0x6d, 0x29, 0xe9, 0xc3, 0xcc, 0xd6, 0x8e, 0xfa, 0xa4, 0xfb, + 0x63, 0xe2, 0x99, 0xfe, 0xfd, 0x85, 0xd3, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x16, 0x61, 0x9b, 0xcf, 0x6a, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, + 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, + 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x94, 0x92, 0xcd, 0x6e, + 0xdb, 0x3a, 0x10, 0x85, 0xf7, 0x7a, 0x0a, 0x5e, 0xae, 0x28, 0x20, 0x77, 0x92, 0x06, 0x5d, 0xd5, 0x28, 0x90, 0x34, 0x48, 0xd1, 0x2c, 0xd2, 0xa2, 0x45, 0xd0, 0x95, 0x37, 0x34, 0x35, 0x91, 0x69, + 0xcb, 0x24, 0xcd, 0x19, 0xba, 0x30, 0x0c, 0xbf, 0x7b, 0xa1, 0xdf, 0x28, 0xb5, 0x50, 0xa7, 0xda, 0x88, 0x20, 0xcf, 0x87, 0x39, 0x33, 0x73, 0x82, 0x36, 0x6b, 0x5d, 0xa2, 0x78, 0x4e, 0xce, 0xb0, + 0xf5, 0x8e, 0x66, 0x59, 0x66, 0x37, 0xc1, 0x47, 0x16, 0xd6, 0xc3, 0x36, 0xe9, 0xb8, 0x4e, 0x04, 0xcf, 0xc9, 0x6d, 0xf7, 0xb0, 0x76, 0x9a, 0xed, 0x0e, 0x01, 0x77, 0xe8, 0x98, 0xe0, 0xae, 0xf2, + 0xa9, 0xb8, 0xaf, 0xcf, 0x9f, 0x92, 0xad, 0x0a, 0x8c, 0xb3, 0x09, 0x92, 0x91, 0x18, 0x56, 0xc9, 0x59, 0x86, 0xef, 0xed, 0xd5, 0x13, 0x12, 0x8f, 0x95, 0x11, 0x89, 0x35, 0x51, 0x8a, 0x58, 0xc0, + 0x0f, 0x24, 0xbe, 0x6d, 0xcf, 0x83, 0xc4, 0xc7, 0x12, 0x96, 0x7a, 0x63, 0x6a, 0x1d, 0xdc, 0xf9, 0x88, 0x8f, 0x9a, 0xcd, 0x12, 0x23, 0xbd, 0x52, 0xb4, 0x25, 0x56, 0x29, 0x58, 0xc6, 0x08, 0x3a, + 0x58, 0xb8, 0x25, 0xc2, 0xd8, 0xb5, 0xf4, 0x57, 0x61, 0x6b, 0xa8, 0xd7, 0x10, 0x6b, 0xb6, 0xe6, 0x75, 0xd5, 0xbe, 0x22, 0xe0, 0x36, 0xe9, 0xea, 0xc9, 0xcf, 0xde, 0x24, 0x76, 0x9e, 0xbf, 0xa6, + 0xaa, 0xfa, 0xa9, 0xab, 0x84, 0xb3, 0x2c, 0xbb, 0x19, 0xf5, 0x9f, 0x85, 0xb4, 0xa8, 0xac, 0x11, 0xa6, 0xd2, 0x44, 0xe2, 0x73, 0x37, 0xfb, 0xfa, 0x45, 0x1c, 0xb2, 0x4c, 0x08, 0x21, 0x6e, 0x1a, + 0x59, 0x7d, 0xda, 0x79, 0x5b, 0x88, 0x7a, 0x8c, 0xbd, 0x4c, 0xe5, 0xe2, 0xd0, 0xbc, 0xd4, 0xdf, 0xb7, 0xc4, 0x21, 0xb1, 0xf0, 0xed, 0xef, 0xa3, 0x50, 0x0e, 0x7f, 0x89, 0x17, 0x65, 0x0e, 0xfd, + 0x62, 0xd5, 0xc9, 0xba, 0xc0, 0x44, 0xd4, 0x8c, 0x2a, 0x87, 0x45, 0x7d, 0xd1, 0x90, 0x0f, 0x2e, 0x24, 0x56, 0xf2, 0x0b, 0x56, 0x95, 0xff, 0x4f, 0xe6, 0x79, 0x0e, 0x85, 0x66, 0xad, 0xf2, 0xd9, + 0x50, 0xf0, 0x65, 0xac, 0xa0, 0x9b, 0xe3, 0x7d, 0x3d, 0x13, 0x1a, 0x98, 0x8b, 0xce, 0x0b, 0x94, 0xc8, 0x8f, 0x48, 0xa4, 0x4b, 0x54, 0x79, 0xc7, 0x1f, 0xff, 0xec, 0xad, 0x1b, 0xc3, 0x49, 0x8b, + 0x0f, 0x8e, 0xb1, 0x8c, 0xfa, 0xa4, 0xdb, 0x51, 0x3e, 0xa0, 0xb4, 0x3b, 0x74, 0x2a, 0x07, 0xe3, 0x1d, 0xa3, 0xe3, 0xa7, 0x7d, 0x40, 0x25, 0x75, 0x08, 0x95, 0x35, 0x0d, 0x78, 0xb9, 0x22, 0xef, + 0x64, 0x3e, 0xb0, 0xfd, 0x07, 0x0b, 0x5f, 0xec, 0x95, 0x3c, 0xcc, 0xe5, 0xa6, 0xb5, 0x37, 0x97, 0x1f, 0xc4, 0xbc, 0xb3, 0x3f, 0x97, 0xc7, 0x29, 0x64, 0x89, 0xba, 0xc0, 0xa8, 0xa4, 0xc1, 0xff, + 0x6d, 0x21, 0x2f, 0x84, 0x7c, 0x7f, 0x7d, 0x46, 0x46, 0x01, 0xcd, 0x0e, 0x23, 0x59, 0xef, 0x6a, 0xfd, 0x3b, 0xb8, 0x9a, 0x02, 0x82, 0x27, 0x56, 0xf2, 0x72, 0xea, 0x89, 0x97, 0x4d, 0x77, 0x75, + 0xc2, 0x12, 0xdd, 0xf9, 0x02, 0xd5, 0xf5, 0xd5, 0xd5, 0x1b, 0xac, 0x8d, 0x53, 0xa7, 0xf2, 0x7f, 0x31, 0xd9, 0x85, 0x5b, 0xb5, 0x66, 0xcf, 0x90, 0x3e, 0x45, 0x83, 0x63, 0xa8, 0xcf, 0xd9, 0x39, + 0x92, 0xf7, 0x61, 0x92, 0x83, 0x36, 0x36, 0x93, 0x78, 0xbb, 0xb1, 0x6e, 0x5d, 0x63, 0x78, 0xc8, 0xe9, 0x90, 0xaf, 0x63, 0xf6, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfb, 0x20, + 0x9b, 0xb4, 0xde, 0x01, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x5c, 0x8d, 0x3b, 0x8e, 0x83, 0x40, 0x10, 0x44, 0xf3, 0x3e, 0x45, 0x9d, 0x60, 0x38, 0x00, 0xc9, 0x26, 0xbb, 0x12, 0xc9, 0x46, 0x5c, 0x60, + 0x18, 0x7a, 0xd9, 0x36, 0xcc, 0x0c, 0xa6, 0xbb, 0x2d, 0x24, 0xcb, 0x77, 0xb7, 0xf0, 0x27, 0x71, 0xfa, 0x4a, 0xf5, 0xde, 0x1a, 0xd3, 0x1c, 0x27, 0xc6, 0x9f, 0x97, 0x64, 0x52, 0x8b, 0xb6, 0x44, + 0x92, 0xd7, 0xba, 0x19, 0xa4, 0x86, 0xb3, 0xc7, 0x6d, 0x76, 0x0d, 0xc6, 0x6a, 0xe1, 0xe4, 0x45, 0x2c, 0xfc, 0x46, 0x93, 0x0b, 0x77, 0x39, 0x4e, 0xdc, 0xb3, 0x5a, 0x4b, 0xf4, 0xf5, 0x81, 0x68, + 0xf5, 0x61, 0x91, 0x84, 0xb4, 0x44, 0x55, 0x3c, 0xc7, 0x9f, 0x97, 0xbe, 0xeb, 0xc1, 0xbb, 0x71, 0x19, 0x15, 0x6f, 0x74, 0x5c, 0x70, 0x25, 0x02, 0x80, 0xa6, 0xc1, 0xf7, 0xce, 0xc9, 0x8d, 0x61, + 0xff, 0x0c, 0x8d, 0x99, 0x71, 0xb4, 0x15, 0x83, 0x1b, 0xa4, 0xa0, 0x3c, 0x6c, 0xc8, 0x75, 0xe4, 0x40, 0x37, 0xba, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x3d, 0x12, 0xb7, 0x75, + 0x8f, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, + 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x3c, 0x90, 0xc1, 0x6a, 0xeb, 0x40, 0x0c, 0x45, 0xf7, 0xfa, 0x0a, 0x43, 0x76, 0x86, 0xa7, 0xfc, 0x43, 0x5e, 0xbb, 0x68, 0xa1, 0xed, 0xc2, 0x50, + 0xba, 0x2b, 0xca, 0x58, 0x71, 0x94, 0x8e, 0x47, 0x83, 0x24, 0x3b, 0xed, 0xdf, 0x97, 0x71, 0x43, 0x36, 0x57, 0xe2, 0x70, 0xc4, 0x05, 0xed, 0xba, 0xc7, 0x94, 0xa5, 0x3a, 0x03, 0x56, 0xd3, 0x0b, + 0xa7, 0x00, 0x4c, 0x99, 0xdc, 0x2b, 0xc5, 0x19, 0xd0, 0x39, 0x42, 0xca, 0xe4, 0x7b, 0x38, 0x4a, 0xd9, 0x03, 0xec, 0xba, 0xa7, 0x12, 0x9c, 0xb3, 0x3c, 0x03, 0xca, 0xc8, 0x04, 0x3d, 0x4a, 0xb5, + 0x96, 0x73, 0x6e, 0x79, 0xf5, 0xe6, 0xbc, 0x72, 0x1c, 0x98, 0x8a, 0x43, 0x39, 0xfe, 0x4b, 0x5a, 0x4e, 0x32, 0x2d, 0x46, 0x21, 0x5a, 0xf0, 0x7b, 0xce, 0x4d, 0x78, 0x17, 0x5f, 0x28, 0x77, 0x43, + 0x2c, 0xa3, 0x68, 0xf7, 0x5f, 0x47, 0x06, 0x5c, 0x3d, 0x6d, 0xf3, 0x44, 0x29, 0xd4, 0x7e, 0xb6, 0x7e, 0xd8, 0x75, 0x6f, 0xc3, 0x07, 0xe0, 0xc3, 0xf0, 0x39, 0x84, 0x1a, 0xff, 0xdd, 0xce, 0xd0, + 0xa3, 0x5f, 0xeb, 0x96, 0xda, 0x50, 0xa5, 0x48, 0x67, 0xe8, 0x51, 0x4d, 0x26, 0xe8, 0xd1, 0xf8, 0xd2, 0xe8, 0x0b, 0xad, 0x5c, 0x20, 0xc8, 0x26, 0x8e, 0x3d, 0x54, 0x9d, 0x5b, 0x3b, 0x06, 0x4d, + 0xf7, 0xdd, 0x38, 0x33, 0x39, 0x1f, 0x28, 0x7d, 0x2d, 0xf5, 0x4e, 0x57, 0x36, 0x17, 0x2d, 0x7e, 0xc3, 0x37, 0xa9, 0xbd, 0xa7, 0xb2, 0x85, 0xb0, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, + 0x07, 0x08, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, + 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x44, 0x91, + 0xce, 0x1b, 0x18, 0x2d, 0x77, 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, + 0x9b, 0xdd, 0x7e, 0x98, 0x21, 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, + 0x54, 0x28, 0x34, 0xe8, 0x04, 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, + 0xec, 0xa1, 0x20, 0x67, 0x51, 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, + 0x20, 0xa4, 0x86, 0x42, 0x21, 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, + 0x90, 0xc0, 0x57, 0x67, 0x43, 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xf9, 0xe7, 0xc1, 0xa0, 0x2c, 0x4b, 0x9f, 0x59, + 0xc4, 0xbe, 0xa4, 0xf5, 0x20, 0xad, 0xf6, 0xaa, 0xc1, 0xdd, 0xf8, 0x76, 0x34, 0x99, 0x8f, 0x2e, 0x3f, 0xf9, 0x57, 0xee, 0xd4, 0x42, 0xa4, 0xa8, 0x14, 0x10, 0xfe, 0xaf, 0xe0, 0x84, 0x31, 0x2c, + 0xb7, 0xc0, 0xf2, 0x3c, 0xe5, 0x11, 0x5b, 0xa6, 0x08, 0x29, 0x2b, 0x2d, 0x3d, 0x6b, 0x42, 0x8c, 0x41, 0x4b, 0x83, 0xba, 0x24, 0xae, 0xb9, 0x58, 0xf7, 0x41, 0xc9, 0x95, 0x2e, 0x19, 0xa1, 0x31, + 0x13, 0x73, 0xa5, 0x89, 0x2f, 0x0b, 0x7d, 0x40, 0x5a, 0x8d, 0x91, 0xab, 0x83, 0x0d, 0x52, 0x00, 0x13, 0xd0, 0x0d, 0xe6, 0x30, 0x9e, 0x77, 0xe1, 0x97, 0x60, 0x3e, 0x9e, 0xf7, 0x8d, 0x91, 0xa7, + 0xf1, 0xc3, 0xaf, 0xd3, 0xc5, 0x03, 0x3c, 0x05, 0x61, 0x18, 0x4c, 0x1e, 0xc6, 0xa3, 0x39, 0x4c, 0x43, 0xb8, 0x9d, 0x4e, 0x86, 0xe3, 0x87, 0xf1, 0x74, 0x32, 0x87, 0xe9, 0x17, 0x08, 0x26, 0x5f, + 0xe1, 0x3f, 0xe3, 0xc9, 0xb0, 0x0f, 0xc8, 0x75, 0x82, 0x04, 0xf8, 0x62, 0x72, 0xab, 0x0c, 0x4c, 0x6e, 0xe8, 0xc4, 0xd8, 0x72, 0x37, 0x47, 0x3c, 0x80, 0xb0, 0x92, 0x15, 0x24, 0x95, 0x63, 0xc4, + 0x57, 0x3c, 0x82, 0x94, 0x89, 0x75, 0xc1, 0xd6, 0x08, 0x6b, 0xb9, 0x41, 0x12, 0x5c, 0xac, 0x21, 0x47, 0xca, 0xb8, 0x32, 0x69, 0x55, 0xc0, 0x44, 0x6c, 0xcc, 0xa4, 0x3c, 0xe3, 0x9a, 0x69, 0x3b, + 0x75, 0x12, 0x97, 0x71, 0x34, 0xe8, 0xf0, 0x2c, 0x97, 0xa4, 0xe1, 0x77, 0xb6, 0x61, 0xbe, 0x40, 0xed, 0x5f, 0x5c, 0x1f, 0x4c, 0x71, 0x79, 0x3c, 0x23, 0xb8, 0xf4, 0xa3, 0x84, 0x09, 0x81, 0xa9, + 0x3a, 0x5e, 0x2b, 0x34, 0x4f, 0xfd, 0x19, 0xc9, 0x1c, 0x49, 0x73, 0x54, 0xd7, 0x9d, 0x4e, 0x5e, 0x2c, 0x53, 0x1e, 0x41, 0x94, 0x32, 0xa5, 0xe0, 0x9e, 0x6d, 0x50, 0x3c, 0x11, 0xcb, 0x73, 0xa4, + 0xa1, 0x2c, 0x45, 0x2a, 0x99, 0xc1, 0xf4, 0xa3, 0xd3, 0x31, 0xc9, 0xcf, 0x89, 0x6f, 0x98, 0x46, 0x50, 0x06, 0x71, 0x04, 0x2b, 0x5b, 0xe4, 0x73, 0x4d, 0x26, 0xb6, 0xa7, 0x30, 0x98, 0xcd, 0x46, + 0xe1, 0xf3, 0xe3, 0x28, 0x9c, 0x8f, 0xa7, 0x13, 0xb8, 0x81, 0xee, 0x95, 0xff, 0x77, 0xff, 0x1f, 0xdd, 0x6b, 0x7b, 0x74, 0x70, 0x71, 0x61, 0xff, 0x87, 0x0b, 0x18, 0xe2, 0x8a, 0x15, 0xa9, 0x86, + 0x45, 0x78, 0x67, 0x32, 0x1e, 0x3b, 0x37, 0x36, 0xf0, 0xcc, 0xf8, 0xbf, 0x2c, 0x2b, 0x00, 0xfe, 0xef, 0x8c, 0x60, 0x45, 0x32, 0xeb, 0x03, 0x5f, 0x81, 0x90, 0xf0, 0xa1, 0xde, 0xbb, 0xa0, 0xf4, + 0x83, 0x49, 0x7a, 0x4e, 0x72, 0xc3, 0x63, 0x9b, 0x11, 0x6b, 0x7b, 0xf0, 0x87, 0x30, 0x87, 0xa3, 0x2f, 0xc1, 0xe2, 0xee, 0xe1, 0x79, 0x38, 0x7d, 0x9a, 0xdc, 0x4d, 0x83, 0xe1, 0xb3, 0x41, 0x71, + 0x03, 0x5d, 0x53, 0xd7, 0xea, 0xf3, 0x60, 0x40, 0x98, 0x4b, 0xdf, 0xa2, 0x68, 0xd6, 0xb7, 0x9d, 0xf8, 0x34, 0xe0, 0x72, 0xa0, 0xd9, 0x77, 0x46, 0x7c, 0x70, 0x80, 0x73, 0xd0, 0xad, 0xdc, 0x03, + 0xc0, 0xc7, 0x13, 0x1e, 0x3e, 0x42, 0xf7, 0x70, 0xf7, 0x65, 0xb7, 0x7d, 0x97, 0x89, 0xb6, 0x7b, 0xdd, 0x39, 0x66, 0x6b, 0xc6, 0x4c, 0xe3, 0xca, 0x16, 0x76, 0xf2, 0x5d, 0x16, 0x6d, 0xdf, 0xf7, + 0xa1, 0x4c, 0x78, 0x94, 0x40, 0x66, 0x45, 0x29, 0x92, 0xc2, 0xf5, 0x74, 0x83, 0x33, 0x70, 0x47, 0xb6, 0xa0, 0x65, 0x6d, 0xdf, 0x68, 0x07, 0x17, 0x4a, 0x23, 0x8b, 0xeb, 0xce, 0x8f, 0x5d, 0x82, + 0xa4, 0xc0, 0xf7, 0x13, 0x7b, 0x1f, 0x3c, 0x8e, 0x26, 0xcf, 0x75, 0x5c, 0xb3, 0x70, 0x3a, 0x1b, 0x85, 0xa6, 0xc3, 0x9e, 0x67, 0xc1, 0xc3, 0xaf, 0x70, 0xb3, 0x63, 0xc8, 0x8c, 0xae, 0x9f, 0x6d, + 0xc4, 0xa0, 0x66, 0xef, 0x5c, 0x54, 0xe7, 0xc8, 0x28, 0x13, 0x24, 0x3c, 0x53, 0x2d, 0x25, 0x4f, 0x53, 0x58, 0x22, 0x28, 0xb6, 0xb1, 0x7a, 0xf2, 0x57, 0xf1, 0xff, 0x3b, 0x08, 0xff, 0x2c, 0xf0, + 0xf6, 0xf4, 0x4d, 0x58, 0x86, 0x35, 0xaf, 0x3b, 0xf6, 0xab, 0x44, 0xa9, 0x44, 0x16, 0x69, 0x6c, 0xd0, 0x16, 0xaa, 0x12, 0x3f, 0x23, 0x14, 0xc4, 0x63, 0x3c, 0xc8, 0xc2, 0xae, 0x3f, 0x0a, 0x4a, + 0x77, 0x2a, 0x53, 0x3b, 0x7d, 0x77, 0x78, 0x2e, 0x21, 0x5f, 0x9f, 0x27, 0xc1, 0xfd, 0x68, 0x17, 0xa6, 0x2b, 0x7e, 0x67, 0x6d, 0x41, 0x69, 0x1d, 0x81, 0x13, 0x05, 0x67, 0x69, 0x23, 0x79, 0x0c, + 0x19, 0xe3, 0xc2, 0x73, 0xd6, 0x18, 0xad, 0xd5, 0x6f, 0xdf, 0x7a, 0xf0, 0x63, 0xc7, 0xce, 0x7c, 0xab, 0x34, 0x66, 0xbe, 0x2c, 0xb4, 0x9f, 0x13, 0x17, 0x3a, 0x15, 0x5e, 0xf7, 0x12, 0x1a, 0x12, + 0xa2, 0x34, 0x23, 0x8d, 0xb1, 0xbd, 0xbd, 0xdc, 0xf8, 0x62, 0x6e, 0xab, 0x25, 0x53, 0x38, 0xe4, 0x84, 0x91, 0x96, 0xb4, 0x85, 0x1b, 0x10, 0x58, 0xda, 0x05, 0xcf, 0xfa, 0xb8, 0xfa, 0xd6, 0xd8, + 0xdf, 0xee, 0x63, 0xa1, 0x0c, 0x22, 0x63, 0x06, 0xe2, 0xda, 0xce, 0x67, 0x30, 0x4d, 0x76, 0x60, 0xda, 0x5f, 0xa3, 0x0e, 0x96, 0x4a, 0xa6, 0x85, 0x46, 0x53, 0x46, 0x5e, 0xaf, 0xe7, 0x62, 0xb5, + 0x19, 0x1b, 0xc0, 0x78, 0xf5, 0x76, 0x8f, 0xe1, 0x0b, 0x57, 0x5a, 0xf5, 0x81, 0x4c, 0xa7, 0x70, 0x6d, 0x04, 0x1c, 0xa2, 0x04, 0xa3, 0xef, 0x46, 0x9c, 0xf8, 0xae, 0xe3, 0x94, 0xb9, 0x46, 0x0b, + 0xa5, 0x65, 0xd6, 0x34, 0xbe, 0x67, 0x18, 0x72, 0x46, 0x2c, 0x43, 0xbd, 0x4b, 0x5e, 0x4d, 0x44, 0xd6, 0x90, 0x5e, 0x27, 0xd0, 0x5b, 0xbb, 0xd0, 0xe0, 0xe4, 0x20, 0xa2, 0xfe, 0xdb, 0x3d, 0xd7, + 0x24, 0xae, 0xca, 0x9a, 0x29, 0xa0, 0x9b, 0x56, 0x05, 0xdc, 0x6f, 0xe5, 0x2b, 0xef, 0x1c, 0x10, 0xbf, 0x62, 0xc0, 0xeb, 0x35, 0xf3, 0x5e, 0xc3, 0x1f, 0x8b, 0xbc, 0xd0, 0x73, 0x4d, 0xc8, 0xb2, + 0xb3, 0x91, 0x34, 0xf7, 0xdc, 0x80, 0x28, 0xd2, 0xf4, 0xfa, 0xc0, 0x8e, 0xa6, 0xed, 0x91, 0x65, 0x33, 0xde, 0x69, 0xcd, 0x51, 0xd4, 0x98, 0x3d, 0x1b, 0x48, 0xef, 0xfa, 0xc4, 0xc9, 0xfe, 0x46, + 0x6c, 0xf3, 0x67, 0xa6, 0x2b, 0x17, 0xfb, 0x09, 0xaf, 0xc5, 0x4a, 0xfb, 0x51, 0xdf, 0x74, 0xc0, 0x59, 0x30, 0x0d, 0xc0, 0x2d, 0x16, 0xab, 0x94, 0x9d, 0xb1, 0xbb, 0x46, 0x5d, 0x5b, 0xf2, 0xce, + 0xf6, 0x77, 0xdf, 0xd8, 0x38, 0xb2, 0xfc, 0x0a, 0x11, 0xd3, 0x51, 0x02, 0xde, 0x78, 0x3a, 0xb2, 0x8f, 0x45, 0xf3, 0xd0, 0xc4, 0xe3, 0xb4, 0xc2, 0xd9, 0x96, 0x1b, 0x85, 0xe1, 0x34, 0x04, 0x13, + 0x96, 0x29, 0xab, 0x0f, 0xa6, 0xd7, 0xde, 0x96, 0xff, 0x8f, 0xd0, 0xfd, 0xd0, 0x3d, 0x01, 0x61, 0x05, 0x2a, 0x6d, 0xcb, 0x79, 0x7b, 0x25, 0xc0, 0xdb, 0xf5, 0xd9, 0x2c, 0x88, 0x9f, 0xaa, 0xfa, + 0x6a, 0x0b, 0xa9, 0x1e, 0xef, 0x30, 0xe3, 0x47, 0xa9, 0x54, 0xd8, 0x96, 0x69, 0x33, 0x5e, 0x4f, 0x66, 0xdf, 0xcf, 0x2b, 0x38, 0xcd, 0x59, 0x0b, 0x49, 0x08, 0xbe, 0xef, 0x9f, 0xda, 0xea, 0xb4, + 0xff, 0xf5, 0xfa, 0x4e, 0xc9, 0x35, 0x99, 0x31, 0x6f, 0xa7, 0x4a, 0x0a, 0xab, 0x1a, 0x38, 0x14, 0x1c, 0x59, 0xe8, 0xbc, 0xd0, 0x6f, 0x4a, 0xcc, 0xa9, 0x68, 0x1e, 0x8b, 0x4e, 0x7d, 0x51, 0xf6, + 0x0e, 0x24, 0xe4, 0xa7, 0xbd, 0x6d, 0x5b, 0xa5, 0x8c, 0x50, 0xd8, 0xbf, 0xbc, 0xde, 0x59, 0x15, 0xf9, 0x83, 0x63, 0xd9, 0xf7, 0x98, 0x53, 0xcb, 0xb1, 0x33, 0x4c, 0x9c, 0x4d, 0xfb, 0xae, 0x7c, + 0x23, 0x42, 0x66, 0xbe, 0x33, 0x1c, 0x0f, 0xfb, 0xcb, 0xa3, 0x2a, 0xe8, 0x37, 0xa0, 0x9c, 0x90, 0xd2, 0x5e, 0xdf, 0x7f, 0x29, 0x65, 0x5a, 0x56, 0x09, 0x3b, 0x74, 0x7f, 0x72, 0x71, 0xd5, 0x06, + 0x4f, 0x1b, 0xa5, 0x7e, 0x2e, 0x98, 0xa3, 0x5f, 0x48, 0x66, 0x8b, 0xf0, 0xce, 0x2b, 0x28, 0xed, 0x37, 0x2c, 0x1e, 0x01, 0x6d, 0x03, 0x35, 0x94, 0x02, 0x8f, 0x03, 0x72, 0xfb, 0xf0, 0x85, 0x6b, + 0xef, 0xaa, 0xb1, 0xb6, 0xab, 0xfa, 0x87, 0x84, 0x64, 0x69, 0x3f, 0xeb, 0x4e, 0x6a, 0xfe, 0x8c, 0x8e, 0x10, 0x49, 0xda, 0x21, 0xe6, 0x62, 0x7d, 0xec, 0x12, 0xab, 0xdd, 0x73, 0xcd, 0xa2, 0xef, + 0x0f, 0xc4, 0xa2, 0x93, 0x5e, 0x6c, 0x62, 0xfa, 0x5b, 0x13, 0x53, 0xa7, 0xfa, 0xd7, 0xfe, 0x77, 0xf4, 0x2e, 0xb2, 0xaf, 0x99, 0x36, 0x9a, 0xf6, 0xd7, 0x64, 0xf5, 0xab, 0x5f, 0xf5, 0x49, 0x8c, + 0x4a, 0x73, 0x61, 0xbf, 0xd1, 0x7a, 0xa0, 0x4d, 0x8c, 0x0a, 0xf6, 0xed, 0xfd, 0xa3, 0x51, 0xf7, 0xe0, 0x39, 0x3c, 0x6b, 0xd4, 0x28, 0x36, 0x5e, 0xf7, 0xfe, 0x71, 0xf2, 0xf4, 0xbc, 0x98, 0x8f, + 0x42, 0xa3, 0xca, 0xdd, 0x5e, 0x2d, 0x4b, 0xf0, 0xf3, 0xcf, 0xd0, 0xb6, 0x73, 0x16, 0xcc, 0xe7, 0x4f, 0xd3, 0x70, 0xb8, 0xdf, 0x79, 0xc2, 0xa3, 0x83, 0xa8, 0x90, 0x84, 0x79, 0x59, 0xde, 0xb4, + 0xda, 0xd9, 0x7b, 0x3c, 0x64, 0x2b, 0x4a, 0x18, 0xfd, 0xf6, 0x0d, 0x72, 0xa6, 0x54, 0x29, 0x29, 0x3e, 0x73, 0x7a, 0x8f, 0xc2, 0xd7, 0xf2, 0x36, 0x61, 0x14, 0x10, 0xb1, 0xed, 0x31, 0xf3, 0x41, + 0xa1, 0x13, 0x14, 0x9a, 0x47, 0x4c, 0x4b, 0xf2, 0x15, 0x6a, 0xf7, 0x59, 0xe7, 0x19, 0x25, 0x39, 0x58, 0xf4, 0xda, 0x5a, 0xf6, 0x5f, 0x53, 0xf7, 0xd6, 0x3d, 0x59, 0xc9, 0x49, 0x6a, 0x8c, 0xcc, + 0x67, 0xfc, 0xcc, 0xe1, 0x6c, 0x58, 0x33, 0x8c, 0xdb, 0x76, 0x6c, 0x5b, 0x69, 0x75, 0x64, 0x06, 0xa1, 0x2e, 0x48, 0x54, 0x17, 0x78, 0xfb, 0xc9, 0x9a, 0xd0, 0xfe, 0x8e, 0x9c, 0x16, 0xd1, 0x3f, + 0x92, 0xe4, 0x93, 0x72, 0x33, 0xc3, 0xbc, 0xa8, 0x4b, 0x5c, 0x2a, 0xae, 0x6b, 0x55, 0x75, 0x0d, 0x58, 0x65, 0xae, 0x71, 0x26, 0x44, 0x16, 0x9b, 0x66, 0xf9, 0x65, 0xab, 0xf1, 0xb6, 0xfa, 0x5a, + 0x07, 0x5a, 0x46, 0xfb, 0x0d, 0xb4, 0x8c, 0xe0, 0x06, 0x6e, 0xeb, 0x0f, 0x79, 0x81, 0xa5, 0xfb, 0xed, 0x39, 0x07, 0xbe, 0xcc, 0x51, 0xb8, 0xb7, 0x4e, 0xef, 0xe8, 0x5d, 0x3d, 0xb5, 0xdd, 0xee, + 0x6e, 0xc3, 0x95, 0x54, 0x0d, 0x89, 0x6f, 0x2e, 0x79, 0xcd, 0xe2, 0xde, 0x5b, 0x58, 0x49, 0xfb, 0xba, 0xa8, 0xfd, 0xf5, 0x7c, 0x4d, 0x4c, 0xa8, 0x15, 0x92, 0x69, 0x15, 0x8f, 0x96, 0x51, 0x1f, + 0xae, 0xfa, 0x70, 0x27, 0xc5, 0xda, 0xbf, 0x0f, 0xfe, 0xfb, 0xfc, 0x18, 0xdc, 0x2d, 0x46, 0x47, 0xc7, 0x4f, 0xae, 0x4e, 0x5a, 0x46, 0x87, 0x93, 0xaf, 0x9d, 0xce, 0x6b, 0xe7, 0xff, 0x01, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, + 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4d, 0x0a, 0xc2, 0x40, 0x0c, 0xc5, 0xf1, 0x7d, 0xef, 0x92, 0x17, 0xb1, 0xd8, 0x85, 0xe0, 0x31, 0x3c, 0x40, 0xaa, 0x83, 0x8d, 0x1f, 0x33, 0x21, 0x8d, 0x0a, 0x9e, + 0x5e, 0x9c, 0xe9, 0xa6, 0x3b, 0x77, 0xf9, 0xff, 0x20, 0xbc, 0xb3, 0xce, 0xe1, 0x3a, 0x3e, 0x43, 0x4b, 0x3e, 0xfa, 0xfd, 0x30, 0x45, 0xd8, 0xbc, 0x67, 0xf6, 0x64, 0x05, 0x0f, 0x79, 0xa5, 0x0c, + 0x31, 0x39, 0x4d, 0x09, 0xc5, 0x2f, 0x5c, 0x61, 0xcb, 0xbf, 0xb3, 0x69, 0x93, 0x25, 0xa8, 0x45, 0x8f, 0x01, 0xfd, 0x8a, 0xa8, 0x12, 0x8d, 0x9a, 0xf1, 0x51, 0xeb, 0xde, 0x2e, 0x66, 0xc9, 0xff, + 0x9e, 0xd3, 0xc2, 0x21, 0x37, 0x71, 0x6d, 0x40, 0xcb, 0x3f, 0x6f, 0xb0, 0xc3, 0xb0, 0x36, 0xaa, 0x86, 0xab, 0x78, 0xf7, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x33, 0xbc, 0x87, + 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x9c, 0x55, 0x6d, + 0x6f, 0xdb, 0x46, 0x0c, 0xfe, 0x7e, 0xbf, 0x82, 0x93, 0x0b, 0xf4, 0x05, 0xb5, 0x9c, 0x7e, 0x28, 0x50, 0x18, 0x48, 0x87, 0x24, 0x76, 0x5a, 0x77, 0x4e, 0xda, 0xb9, 0x72, 0x87, 0x02, 0x06, 0x2c, + 0xfa, 0x44, 0x4b, 0xe7, 0x9c, 0xee, 0xb4, 0x7b, 0x91, 0x6b, 0x14, 0xdd, 0x6f, 0x1f, 0x4e, 0xf2, 0x6b, 0x92, 0x0e, 0xdb, 0xbe, 0xd9, 0x47, 0xf2, 0x21, 0xf9, 0xf0, 0x21, 0xd5, 0x81, 0x6b, 0xaf, + 0xb8, 0x13, 0x5a, 0x41, 0x65, 0xf4, 0x8a, 0xb8, 0x63, 0xec, 0x0f, 0x92, 0x5c, 0x97, 0x04, 0x4e, 0xc3, 0x46, 0x7b, 0x03, 0x8a, 0xd6, 0xf0, 0xbb, 0x47, 0x73, 0xe7, 0x2d, 0x2c, 0xef, 0x79, 0xff, + 0xc2, 0x58, 0x52, 0x08, 0x0b, 0x16, 0xcb, 0x4a, 0xd2, 0xee, 0x15, 0xb8, 0x56, 0x0e, 0x85, 0xb2, 0x80, 0x60, 0x85, 0xca, 0x25, 0xed, 0x03, 0xfb, 0x90, 0xee, 0x7e, 0xda, 0x78, 0x97, 0x3b, 0xde, + 0x3d, 0x3d, 0x7b, 0x9e, 0xbe, 0x64, 0xae, 0x38, 0xb8, 0xc3, 0xca, 0x5b, 0x07, 0x86, 0x9c, 0x37, 0xca, 0x82, 0x70, 0x16, 0xd0, 0xe4, 0xbe, 0x24, 0xe5, 0x62, 0xc6, 0x3a, 0x1d, 0x18, 0x6b, 0x8e, + 0x12, 0xe8, 0x1b, 0x71, 0x1f, 0xdc, 0xd9, 0x0d, 0xde, 0x11, 0x58, 0x6f, 0x08, 0x5c, 0x81, 0x0e, 0xd2, 0x0f, 0x58, 0x23, 0xbc, 0x7a, 0x05, 0x9f, 0x07, 0xbf, 0xa5, 0x20, 0x2c, 0x08, 0x65, 0x1d, + 0x4a, 0x49, 0x59, 0xcc, 0x58, 0xa2, 0xc1, 0x3a, 0x34, 0x0e, 0x2c, 0x99, 0x9a, 0x0c, 0xc8, 0x80, 0x25, 0x37, 0x60, 0xbc, 0x82, 0x34, 0xee, 0x95, 0xb5, 0x5a, 0xc3, 0x9f, 0x6d, 0xdf, 0xfd, 0x8c, + 0xea, 0x34, 0x66, 0x49, 0x41, 0xc0, 0x75, 0x59, 0xa2, 0xca, 0xda, 0x50, 0x0b, 0x85, 0x73, 0xd5, 0x0e, 0x20, 0x3c, 0xa3, 0x77, 0xba, 0x44, 0x27, 0x5a, 0xa8, 0x35, 0x3a, 0x5e, 0x90, 0x85, 0xa5, + 0x36, 0xc0, 0x0b, 0x54, 0x39, 0x59, 0xd0, 0x4b, 0xb0, 0xda, 0x1b, 0x1e, 0xa0, 0x32, 0x8a, 0xd9, 0xe8, 0xe4, 0xff, 0xde, 0x2d, 0xb0, 0xd0, 0xfe, 0x86, 0xb5, 0x90, 0x12, 0x16, 0x0d, 0xbb, 0x15, + 0xe6, 0xe8, 0x28, 0x0b, 0xb3, 0x31, 0x5e, 0x29, 0xa1, 0xf2, 0x6d, 0xf2, 0x18, 0x46, 0x0e, 0x50, 0x5a, 0x0d, 0xba, 0x22, 0x65, 0x21, 0xa3, 0x85, 0xcf, 0xf3, 0x60, 0xaf, 0xb4, 0x71, 0x90, 0xbe, + 0x3e, 0x3b, 0x7b, 0x9d, 0x32, 0xab, 0xb7, 0x06, 0x32, 0xc0, 0x51, 0x05, 0x50, 0x74, 0x0e, 0x79, 0x41, 0x19, 0x88, 0x25, 0x28, 0xa2, 0x6c, 0x47, 0x4d, 0x60, 0xc1, 0x91, 0x75, 0x8f, 0xd2, 0x12, + 0x0c, 0x69, 0x3b, 0x81, 0xc0, 0x49, 0x33, 0xd2, 0x14, 0xae, 0xc6, 0x23, 0xc6, 0x46, 0xee, 0xa9, 0x05, 0x43, 0x81, 0x26, 0x52, 0x59, 0x5b, 0xaa, 0x25, 0x07, 0xe9, 0xf5, 0xf4, 0xf6, 0x6a, 0x3e, + 0x19, 0xbe, 0x1b, 0x7d, 0x4e, 0x26, 0x5f, 0x53, 0x20, 0x55, 0x0b, 0xa3, 0x55, 0x18, 0x25, 0xd4, 0x68, 0x04, 0x2e, 0x24, 0xc5, 0x2c, 0x4d, 0x53, 0x5b, 0x90, 0x94, 0x60, 0xb9, 0x11, 0x95, 0x63, + 0x1d, 0x30, 0x54, 0x49, 0xe4, 0x04, 0x7f, 0xf5, 0xe2, 0x05, 0xda, 0xc2, 0x70, 0x58, 0x6c, 0x5a, 0x5d, 0xb6, 0x8e, 0x86, 0xc3, 0x52, 0x48, 0x3a, 0xf2, 0xcc, 0x34, 0xbf, 0x23, 0x13, 0x0b, 0xdd, + 0x5b, 0xe9, 0x42, 0x65, 0x3a, 0x10, 0xe8, 0x8a, 0x36, 0xc6, 0x50, 0x2e, 0xac, 0x33, 0x1b, 0x46, 0xdf, 0x1a, 0x5e, 0x4e, 0x8a, 0x3a, 0x7f, 0x10, 0xc9, 0x88, 0x17, 0x1a, 0xa2, 0x7f, 0xe7, 0x1c, + 0xc1, 0xdb, 0xb7, 0x47, 0x65, 0x86, 0x5e, 0x02, 0x43, 0x1d, 0xb8, 0xf4, 0x42, 0x66, 0x42, 0xe5, 0xdb, 0x5d, 0xd9, 0x29, 0x68, 0x11, 0x9e, 0x2d, 0x7c, 0xbc, 0x1a, 0x81, 0x28, 0x31, 0xa7, 0x46, + 0x25, 0xc7, 0xe2, 0x8f, 0xd9, 0x03, 0x3e, 0x82, 0xa9, 0x0d, 0x6c, 0xe1, 0x2f, 0x37, 0x90, 0xd1, 0x12, 0xbd, 0x74, 0x2f, 0xe1, 0xc3, 0x97, 0x9b, 0xd6, 0x14, 0x84, 0xee, 0x6d, 0x18, 0x64, 0xa2, + 0x81, 0x54, 0x60, 0x16, 0x14, 0x3a, 0x51, 0xd3, 0xd6, 0x1e, 0xe6, 0xb1, 0xd4, 0x52, 0xea, 0x75, 0x10, 0x48, 0x3b, 0x89, 0x52, 0xd1, 0x61, 0x10, 0x36, 0x4c, 0xad, 0x99, 0x6a, 0xbc, 0xc1, 0x52, + 0xa6, 0xfd, 0x90, 0x2d, 0xfc, 0x62, 0x0d, 0xc0, 0x50, 0xd5, 0xb6, 0xcf, 0xba, 0xa0, 0xb0, 0xa4, 0x3e, 0x5c, 0x7e, 0x9a, 0xdf, 0x5e, 0x24, 0xa3, 0x2f, 0xc3, 0xf9, 0xe8, 0xe6, 0xe2, 0xdd, 0x90, + 0x01, 0xd4, 0x28, 0x3d, 0xf5, 0x21, 0x72, 0xc6, 0x53, 0x74, 0xec, 0x77, 0x73, 0xf1, 0x65, 0x78, 0x3b, 0xbf, 0x9c, 0x8e, 0xc6, 0xc9, 0xfc, 0x62, 0x92, 0x8c, 0xae, 0x2f, 0xae, 0x92, 0x83, 0xbf, + 0x43, 0x93, 0x93, 0xeb, 0xb5, 0xa5, 0x76, 0xdb, 0xa5, 0xb0, 0xbd, 0x17, 0x8f, 0x03, 0x0c, 0xe6, 0x17, 0x93, 0x77, 0xd3, 0x9b, 0xe1, 0x6d, 0xf2, 0xf9, 0x80, 0x50, 0x21, 0xbf, 0x0b, 0x4c, 0x76, + 0x07, 0xf6, 0x4e, 0x54, 0x09, 0x59, 0x67, 0xcf, 0x43, 0x11, 0xd0, 0x1d, 0x94, 0x58, 0x93, 0x8a, 0x57, 0x58, 0x63, 0xa6, 0x79, 0x1c, 0xcc, 0x3b, 0xcb, 0x76, 0xc7, 0xe3, 0x6d, 0x70, 0xec, 0x36, + 0x15, 0x9d, 0x9f, 0x16, 0xf1, 0xb3, 0x5e, 0xef, 0x57, 0x32, 0xbf, 0x1e, 0x8d, 0x8f, 0x08, 0xd8, 0x82, 0x34, 0xd3, 0x8d, 0xd1, 0xe4, 0xff, 0x8c, 0xf3, 0x18, 0x25, 0x4f, 0x5f, 0x74, 0xc3, 0x9e, + 0x93, 0x89, 0x57, 0x68, 0x9e, 0xb2, 0x83, 0xa6, 0x26, 0xed, 0xf6, 0xdf, 0x93, 0x94, 0xf1, 0xca, 0xee, 0x25, 0xb4, 0xdf, 0x5c, 0xa1, 0x00, 0x77, 0x27, 0x99, 0x0c, 0xf3, 0xe1, 0x24, 0x37, 0x5e, + 0xad, 0xec, 0xb8, 0xa1, 0xe6, 0xa6, 0xe0, 0x42, 0xd7, 0x8f, 0xac, 0x60, 0x03, 0x65, 0xbc, 0x3a, 0xe4, 0x1e, 0x50, 0x25, 0xf5, 0xe6, 0x41, 0x76, 0xbb, 0x3d, 0x54, 0x8d, 0xc4, 0x42, 0x35, 0x59, + 0xe3, 0x77, 0x22, 0x69, 0x10, 0xca, 0x69, 0xe0, 0xd2, 0x5b, 0x47, 0xe6, 0x67, 0xfa, 0xde, 0xc6, 0x75, 0xda, 0x7b, 0xe6, 0x8c, 0x08, 0xf7, 0xca, 0x1e, 0xcb, 0xbe, 0x73, 0xf4, 0xdd, 0x12, 0xaa, + 0xd6, 0x1c, 0x9b, 0xeb, 0xcf, 0x06, 0x1a, 0x94, 0x0e, 0xda, 0x0e, 0x42, 0xda, 0x5f, 0x9e, 0xe9, 0x64, 0x9c, 0xee, 0xa5, 0x1d, 0x5e, 0x43, 0x45, 0x46, 0x7b, 0x47, 0xe1, 0x18, 0x37, 0x77, 0xe1, + 0x68, 0xe5, 0xbe, 0x6a, 0x0f, 0x4d, 0xf4, 0xde, 0x69, 0xb1, 0x39, 0xda, 0x96, 0x6d, 0xb3, 0x3f, 0xe1, 0x49, 0xa8, 0xa5, 0x3e, 0x10, 0xc5, 0xa7, 0x93, 0xf1, 0xc3, 0x1e, 0xa7, 0x93, 0xf1, 0x79, + 0xf8, 0x6c, 0xf4, 0x7b, 0xbd, 0x66, 0x42, 0x85, 0xb6, 0xae, 0xff, 0xe6, 0xec, 0xcd, 0x59, 0x8f, 0x71, 0x6f, 0x24, 0x74, 0x6b, 0x78, 0xf2, 0x7d, 0x3a, 0x19, 0xff, 0x80, 0x19, 0x03, 0xe8, 0xbe, + 0x87, 0xe8, 0x4a, 0x2b, 0x47, 0xca, 0x75, 0x93, 0x4d, 0x45, 0x7d, 0xac, 0x2a, 0x29, 0xda, 0x86, 0x7b, 0x2b, 0xab, 0x55, 0xd4, 0xba, 0x65, 0x10, 0x7d, 0x9f, 0x45, 0x25, 0x59, 0x8b, 0x39, 0xcd, + 0xa2, 0x3e, 0xcc, 0xa2, 0x27, 0xcf, 0xd6, 0x85, 0xc6, 0x52, 0x3c, 0x9f, 0x45, 0x3f, 0x66, 0x51, 0xc4, 0x3a, 0xf0, 0x71, 0xd2, 0x64, 0x8f, 0x1e, 0x4f, 0xff, 0xeb, 0x36, 0xfa, 0x7c, 0x1f, 0x18, + 0xdd, 0xaf, 0xe8, 0xd0, 0xdb, 0xfb, 0x24, 0xf9, 0x24, 0xe8, 0x3f, 0x75, 0xd7, 0x7c, 0x2b, 0x4f, 0xbb, 0x7b, 0x90, 0xf1, 0x7f, 0x15, 0x79, 0x0a, 0xdc, 0xd4, 0xf8, 0x77, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd5, 0x0a, 0x24, 0xd8, 0x04, 0x04, 0x00, 0x00, 0xd9, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, + 0xb4, 0x3a, 0x6d, 0x73, 0xda, 0x48, 0x93, 0xdf, 0xf5, 0x2b, 0x3a, 0x82, 0x8a, 0xed, 0x94, 0x25, 0xd9, 0xb9, 0xba, 0x7b, 0x9e, 0xb3, 0x8f, 0xad, 0x23, 0x98, 0x24, 0x64, 0x6d, 0x70, 0x81, 0x1d, + 0x67, 0x2b, 0xce, 0xc1, 0x20, 0x0d, 0x30, 0xb6, 0x98, 0x51, 0x66, 0x46, 0x60, 0x36, 0xeb, 0xff, 0x7e, 0xd5, 0x33, 0x12, 0x92, 0x00, 0x67, 0x93, 0x4d, 0xc2, 0xd6, 0xd6, 0x5a, 0xa3, 0x7e, 0x7f, + 0x9b, 0xee, 0xd6, 0xd6, 0x9e, 0x05, 0x63, 0xc6, 0x03, 0x35, 0x73, 0x6a, 0xe0, 0xfd, 0xc4, 0x9f, 0x53, 0x83, 0x73, 0x16, 0x52, 0xae, 0x68, 0x04, 0x5a, 0x80, 0x9e, 0x51, 0x68, 0x26, 0x24, 0x9c, + 0x51, 0x18, 0x88, 0x89, 0x5e, 0x12, 0x49, 0xe1, 0xb5, 0x48, 0x79, 0x44, 0x34, 0x13, 0x1c, 0xf6, 0x9b, 0x83, 0xd7, 0x07, 0x90, 0xf2, 0x88, 0x4a, 0x10, 0x9c, 0x3a, 0x35, 0x10, 0x12, 0xe6, 0x42, + 0x52, 0x08, 0x05, 0xd7, 0x92, 0x8d, 0x53, 0x2d, 0x24, 0xc4, 0x96, 0x20, 0x90, 0xa9, 0xa4, 0x74, 0x4e, 0xb9, 0x56, 0x3e, 0xc0, 0x80, 0x52, 0x43, 0xbd, 0xdb, 0xbb, 0xea, 0xb4, 0xda, 0x30, 0x61, + 0x31, 0xa2, 0x47, 0x4c, 0x59, 0x34, 0x1a, 0xc1, 0x92, 0xe9, 0x19, 0xe8, 0x19, 0x53, 0xb0, 0x14, 0xf2, 0x1e, 0x26, 0x42, 0x02, 0x89, 0x22, 0x86, 0x8c, 0x49, 0x0c, 0x8c, 0x4f, 0x84, 0x9c, 0x1b, + 0x31, 0x9c, 0x1a, 0x48, 0x3a, 0x25, 0x32, 0x62, 0x7c, 0x0a, 0xa1, 0x48, 0x56, 0x92, 0x4d, 0x67, 0x1a, 0xc4, 0x92, 0x53, 0xa9, 0x66, 0x2c, 0xf1, 0x01, 0xae, 0x50, 0x8f, 0xc1, 0xeb, 0x5c, 0x14, + 0x65, 0xe9, 0x66, 0x4c, 0xb5, 0x80, 0x95, 0x48, 0x33, 0x35, 0x4a, 0x1a, 0x67, 0x86, 0x38, 0x84, 0xf7, 0x54, 0x2a, 0x54, 0xf7, 0xa5, 0x7f, 0x04, 0xfb, 0x7a, 0x86, 0x38, 0x6e, 0xf6, 0xd2, 0x3d, + 0x38, 0x35, 0xc8, 0x73, 0xb2, 0x02, 0x2e, 0x34, 0xa4, 0x8a, 0x16, 0xb4, 0x81, 0x3e, 0x84, 0x34, 0xd1, 0xc0, 0x38, 0x84, 0x62, 0x9e, 0xc4, 0x8c, 0xf0, 0x10, 0x91, 0x33, 0xcd, 0xd6, 0x1c, 0x7c, + 0x80, 0x3f, 0x32, 0x1a, 0x62, 0xac, 0x09, 0xe3, 0x40, 0x8c, 0x1e, 0x20, 0x26, 0x65, 0x30, 0x20, 0xda, 0xa9, 0x39, 0x35, 0x00, 0x80, 0x99, 0xd6, 0xc9, 0x49, 0x10, 0x2c, 0x97, 0x4b, 0x9f, 0x18, + 0x61, 0x7d, 0x21, 0xa7, 0x41, 0xae, 0x5d, 0x70, 0xde, 0x69, 0xb5, 0xbb, 0x83, 0xb6, 0xf7, 0xd2, 0x3f, 0x32, 0x18, 0xd7, 0x3c, 0xa6, 0x4a, 0x81, 0xa4, 0x9f, 0x53, 0x26, 0x69, 0x04, 0xe3, 0x15, + 0x90, 0x24, 0x89, 0x59, 0x48, 0xc6, 0x31, 0x85, 0x98, 0x2c, 0xd1, 0x6f, 0xc6, 0x3d, 0xc6, 0xeb, 0x8c, 0xc3, 0x52, 0x32, 0xcd, 0xf8, 0xf4, 0xd0, 0xa9, 0x81, 0xca, 0x1d, 0x5f, 0x76, 0x4e, 0x61, + 0xac, 0x5c, 0x38, 0xa6, 0x2a, 0x00, 0x82, 0x03, 0x41, 0xcf, 0xb8, 0xcd, 0x01, 0x74, 0x06, 0x2e, 0xbc, 0x6a, 0x0e, 0x3a, 0x83, 0x43, 0xb8, 0xe9, 0x5c, 0xbd, 0xed, 0x5d, 0x5f, 0xc1, 0x4d, 0xb3, + 0xdf, 0x6f, 0x76, 0xaf, 0x3a, 0xed, 0x01, 0xf4, 0xfa, 0xd0, 0xea, 0x75, 0xcf, 0x3a, 0x57, 0x9d, 0x5e, 0x77, 0x00, 0xbd, 0xd7, 0xd0, 0xec, 0xfe, 0xe1, 0xd4, 0xe0, 0xf7, 0x4e, 0xf7, 0xec, 0x10, + 0x28, 0xd3, 0x33, 0x2a, 0x81, 0x3e, 0x24, 0x12, 0x35, 0x10, 0x12, 0x18, 0x1a, 0x92, 0x46, 0xa5, 0x10, 0xca, 0x25, 0xc0, 0x08, 0xb1, 0xde, 0x51, 0x09, 0x0d, 0xd9, 0x84, 0x85, 0x10, 0x13, 0x3e, + 0x4d, 0xc9, 0x94, 0xc2, 0x54, 0x2c, 0xa8, 0xe4, 0x18, 0x20, 0x09, 0x95, 0x73, 0xa6, 0xd0, 0x9f, 0x0a, 0x08, 0x8f, 0x20, 0x66, 0x73, 0xa6, 0x4d, 0x1c, 0x29, 0xa7, 0xb6, 0xad, 0x97, 0xff, 0xb3, + 0x13, 0xec, 0x67, 0xd3, 0xab, 0xc1, 0x05, 0x59, 0x50, 0x0e, 0x03, 0x4d, 0xa4, 0x86, 0xeb, 0x04, 0x5e, 0x11, 0x1d, 0xce, 0x40, 0x85, 0x92, 0x25, 0x36, 0x5e, 0xfa, 0xb9, 0xdb, 0xdb, 0xdd, 0xf7, + 0xb0, 0x20, 0x52, 0x9d, 0xec, 0x94, 0xc1, 0x44, 0xd6, 0xbb, 0xe6, 0xfb, 0xe6, 0xf0, 0x6d, 0xef, 0xa2, 0x0d, 0x1e, 0xc4, 0x22, 0xb4, 0x69, 0x2e, 0x26, 0x40, 0xe0, 0xdd, 0xd9, 0xef, 0x30, 0x13, + 0x73, 0x0c, 0x03, 0x69, 0xc8, 0xf6, 0x92, 0x2c, 0x15, 0x73, 0xb2, 0xbb, 0xa8, 0x1a, 0xa2, 0x17, 0x2f, 0x77, 0x91, 0x9c, 0xa3, 0xd8, 0x2f, 0xf7, 0x14, 0x30, 0xae, 0x34, 0x89, 0x63, 0x1a, 0x95, + 0xe8, 0x23, 0x56, 0xf3, 0x7d, 0xbb, 0x3b, 0xec, 0x5d, 0x5e, 0x0d, 0xc0, 0x83, 0x84, 0x48, 0x32, 0xa7, 0x9a, 0x4a, 0x05, 0x09, 0x51, 0xa5, 0xea, 0xf4, 0x8e, 0x2c, 0x08, 0xbc, 0xbf, 0x80, 0xe5, + 0x8c, 0x72, 0x90, 0x29, 0x37, 0x3e, 0x36, 0x16, 0xb1, 0x99, 0x02, 0xd4, 0x9f, 0xfa, 0x08, 0x1c, 0xd1, 0x71, 0x9a, 0xbd, 0x01, 0xa6, 0x15, 0x8d, 0x27, 0x87, 0x98, 0xad, 0x19, 0x14, 0x80, 0xa2, + 0xba, 0xc4, 0xb2, 0xe1, 0x7d, 0xb0, 0x08, 0xde, 0x07, 0x99, 0xf2, 0xbb, 0x68, 0x99, 0x9c, 0x68, 0x49, 0xb8, 0x4a, 0x84, 0xd4, 0x8d, 0x48, 0x0f, 0x95, 0x08, 0xef, 0xa9, 0x3e, 0x54, 0x54, 0x2e, + 0xa8, 0x6c, 0xac, 0x0e, 0x55, 0xaa, 0x12, 0xca, 0xa3, 0xc6, 0xea, 0x90, 0x44, 0x11, 0x86, 0x6a, 0xe3, 0xdf, 0x47, 0x47, 0x47, 0x25, 0x3d, 0x06, 0xbf, 0x77, 0x2e, 0x87, 0xfd, 0x16, 0x78, 0x30, + 0x89, 0xc9, 0xd4, 0x08, 0xc4, 0x94, 0x4d, 0x3f, 0x41, 0x4c, 0xe5, 0xca, 0x4d, 0x22, 0x43, 0x53, 0x3c, 0x76, 0x9a, 0xf3, 0x07, 0x7e, 0x8e, 0xc3, 0x26, 0xf0, 0x11, 0xbc, 0x3f, 0xc1, 0xad, 0x57, + 0x44, 0x72, 0xe1, 0x13, 0x9c, 0xa2, 0x2d, 0xb9, 0xe3, 0x00, 0x58, 0xa0, 0x09, 0x04, 0x54, 0x87, 0x41, 0x2e, 0xcf, 0x1a, 0x00, 0x0d, 0xe5, 0x57, 0xde, 0x39, 0x00, 0x13, 0x56, 0x46, 0x74, 0xeb, + 0xe8, 0xeb, 0xc0, 0xcf, 0xde, 0xbb, 0x9b, 0xc8, 0x9b, 0xef, 0x33, 0x02, 0xf8, 0x6f, 0x0d, 0x7a, 0x83, 0x22, 0x77, 0x55, 0x9a, 0xa0, 0xb5, 0x7d, 0x80, 0xfa, 0x82, 0x48, 0x18, 0xce, 0x53, 0xa5, + 0x87, 0x30, 0xa6, 0xc6, 0x53, 0x5a, 0xe4, 0xa5, 0x41, 0xcb, 0x94, 0x62, 0x5d, 0x98, 0x90, 0x18, 0xb3, 0x35, 0x5c, 0x4d, 0x97, 0x8c, 0x37, 0xcc, 0xd3, 0xa9, 0x13, 0x11, 0x59, 0x7a, 0x9a, 0x33, + 0x3e, 0x5d, 0xda, 0x07, 0x27, 0x24, 0x8a, 0x82, 0x3b, 0x4a, 0x39, 0x99, 0xd3, 0x91, 0x0b, 0x0c, 0xc5, 0x6b, 0xfd, 0xf1, 0xe6, 0xa6, 0xd3, 0x7d, 0x71, 0x00, 0x19, 0x11, 0x43, 0xfa, 0xf4, 0xd4, + 0x01, 0xb8, 0xe8, 0x74, 0xdf, 0xdc, 0xbc, 0x38, 0x00, 0x4b, 0x01, 0xcf, 0xcd, 0xf1, 0x99, 0x21, 0xff, 0xe2, 0x00, 0x32, 0x3e, 0xf8, 0xc2, 0xa8, 0x59, 0x83, 0x6b, 0x45, 0x21, 0x48, 0x95, 0x0c, + 0x62, 0x36, 0xa6, 0x0f, 0x34, 0x0c, 0xee, 0xc8, 0x82, 0x0c, 0x4d, 0x80, 0xb3, 0x09, 0x90, 0x05, 0x61, 0x31, 0x7a, 0xff, 0x10, 0x04, 0x6a, 0xb1, 0x64, 0x58, 0xbf, 0x48, 0x1c, 0xc3, 0x98, 0x84, + 0xf7, 0xa8, 0x5d, 0x70, 0xce, 0xc6, 0x92, 0xc8, 0x55, 0x80, 0x01, 0x1e, 0xbc, 0x15, 0xf3, 0x9c, 0x30, 0x56, 0x3d, 0x2c, 0xff, 0xea, 0x24, 0x08, 0x22, 0xba, 0xa0, 0xb1, 0x48, 0xa8, 0xf4, 0xb1, + 0x9c, 0x53, 0x3f, 0x14, 0x73, 0xe4, 0x67, 0xf0, 0xe6, 0x24, 0x0c, 0x3e, 0x93, 0xe0, 0x33, 0x39, 0x3e, 0xfe, 0xd7, 0x51, 0x30, 0x64, 0x3c, 0xa2, 0x0f, 0xfe, 0x4c, 0xcf, 0x63, 0x43, 0xa7, 0x88, + 0x85, 0x75, 0xc6, 0xbb, 0xf0, 0xa9, 0xe4, 0xa8, 0x1c, 0xe4, 0x01, 0xdc, 0xdd, 0x6a, 0x6c, 0x82, 0x03, 0x16, 0x69, 0x21, 0x75, 0x51, 0x42, 0x1a, 0xee, 0x68, 0x37, 0xea, 0xc8, 0xcd, 0x70, 0x28, + 0x7a, 0xe2, 0x69, 0xf4, 0x6d, 0x1b, 0xe4, 0x88, 0x13, 0xe6, 0x94, 0xfe, 0x73, 0x7a, 0xea, 0x50, 0x45, 0xc2, 0x72, 0x84, 0x97, 0xb5, 0x2a, 0xe2, 0xcf, 0xbe, 0x97, 0x36, 0x80, 0xa7, 0x94, 0x6b, + 0x21, 0x3c, 0x49, 0x63, 0x8a, 0xb1, 0x50, 0x09, 0xd3, 0x42, 0x88, 0x11, 0x4a, 0xed, 0x85, 0x82, 0x4f, 0xd8, 0x14, 0x3c, 0xef, 0x4e, 0x52, 0xcf, 0xa8, 0x60, 0xc3, 0x16, 0xa3, 0xb6, 0x94, 0x56, + 0x2f, 0xb7, 0x59, 0xd6, 0xb0, 0x39, 0x51, 0x22, 0x5e, 0x50, 0x88, 0x19, 0xbf, 0x57, 0xe0, 0x41, 0xfd, 0xc8, 0x5c, 0xf5, 0x63, 0x0a, 0xc4, 0x9c, 0xa1, 0xbb, 0x4d, 0x36, 0xec, 0x29, 0x53, 0x01, + 0x1d, 0x80, 0xcb, 0xfe, 0x9b, 0x86, 0x5b, 0x3f, 0x72, 0x31, 0xb1, 0x6a, 0xc0, 0xcd, 0xbd, 0x6c, 0xba, 0x0a, 0x21, 0x41, 0xd2, 0x98, 0x68, 0xb6, 0xa0, 0xa0, 0x56, 0x73, 0x43, 0xd2, 0x01, 0x58, + 0xce, 0xb0, 0xdd, 0xf8, 0x08, 0xde, 0x0c, 0xdc, 0xfa, 0x65, 0xff, 0x8d, 0x15, 0x21, 0x12, 0x46, 0x99, 0x58, 0x35, 0x46, 0xb1, 0x02, 0x2f, 0x8e, 0xb2, 0x97, 0x23, 0x7b, 0xcc, 0xf8, 0x7d, 0x63, + 0x84, 0x37, 0x2b, 0xb8, 0xf5, 0x58, 0xb9, 0x70, 0x02, 0x7b, 0xfe, 0x0b, 0xef, 0x37, 0xb8, 0xdd, 0xf7, 0x5f, 0xdc, 0x1e, 0xd4, 0xf7, 0x46, 0x79, 0xa4, 0xe4, 0x30, 0x8c, 0xdf, 0x1b, 0xa8, 0xc0, + 0x7f, 0xb1, 0x07, 0xbf, 0x01, 0x86, 0x5f, 0xc0, 0xd3, 0x38, 0xae, 0xc4, 0x81, 0x15, 0xdd, 0xc0, 0x3a, 0x1b, 0x3e, 0x36, 0xaf, 0x46, 0x11, 0x93, 0x98, 0x74, 0xb9, 0x2c, 0x41, 0x09, 0xd6, 0xf8, + 0x33, 0xc2, 0x4e, 0xd2, 0x01, 0x50, 0x64, 0x41, 0xa3, 0x88, 0xc9, 0xc6, 0x28, 0x59, 0x46, 0x23, 0x3c, 0xc9, 0xec, 0xdb, 0xd8, 0x22, 0xe1, 0xfb, 0xd6, 0x50, 0x73, 0x72, 0x4f, 0x81, 0x69, 0x98, + 0xa4, 0x71, 0xbc, 0x82, 0xcf, 0x29, 0x89, 0xd9, 0x84, 0xd1, 0xa8, 0x8c, 0x1a, 0x46, 0x65, 0x47, 0x3d, 0x7f, 0x0e, 0x39, 0x71, 0xf3, 0x22, 0xe7, 0xe9, 0x1a, 0x72, 0x34, 0x9c, 0x09, 0xb8, 0x56, + 0x58, 0x9c, 0xe7, 0x2f, 0x81, 0x68, 0xc8, 0x11, 0xb3, 0x6a, 0xf5, 0x5a, 0x48, 0x68, 0x99, 0x52, 0x71, 0x08, 0x94, 0xab, 0x54, 0x52, 0x48, 0x88, 0x9e, 0x29, 0xc0, 0x6e, 0x89, 0x71, 0xb8, 0xee, + 0x76, 0x3e, 0x80, 0x6d, 0x53, 0x61, 0x4c, 0x27, 0xd8, 0x17, 0x13, 0xbe, 0xd2, 0x33, 0x24, 0xc8, 0x14, 0x68, 0x91, 0x86, 0x33, 0x1a, 0x61, 0x00, 0xd5, 0x6d, 0xc5, 0x29, 0xc2, 0xe6, 0x23, 0x78, + 0xbc, 0x1a, 0x51, 0xcf, 0x9f, 0x1b, 0x13, 0x15, 0x8a, 0xac, 0xa6, 0xc8, 0x0c, 0x3c, 0x2f, 0xe5, 0xec, 0xa1, 0x04, 0x3b, 0x2a, 0xd0, 0x2b, 0x59, 0x90, 0x11, 0x28, 0x85, 0xf6, 0x16, 0x89, 0x02, + 0xbe, 0x44, 0xa4, 0x75, 0xde, 0x1c, 0x0c, 0x2e, 0x9b, 0x57, 0x6f, 0x4b, 0x44, 0xd6, 0x67, 0x65, 0x22, 0x55, 0x5a, 0x05, 0xda, 0xa8, 0x64, 0xae, 0x0b, 0x2c, 0xa0, 0x3f, 0x6c, 0x2d, 0x53, 0x86, + 0xbf, 0xc3, 0x58, 0xee, 0x68, 0xbf, 0xe2, 0xf7, 0x53, 0xf4, 0xfa, 0x81, 0x29, 0x43, 0xdf, 0x64, 0xa9, 0x1c, 0xbf, 0x80, 0x5a, 0x53, 0xa8, 0x56, 0x80, 0x9d, 0xc5, 0x14, 0x2b, 0x48, 0xfb, 0x81, + 0x86, 0xa9, 0xc6, 0x8a, 0xdf, 0x70, 0x47, 0xcb, 0x19, 0x0b, 0x67, 0xe6, 0x38, 0x34, 0x32, 0x58, 0x7c, 0x14, 0xa3, 0x0a, 0x6a, 0x65, 0x81, 0x67, 0xf0, 0x11, 0x5c, 0x9b, 0xa8, 0xb7, 0x9b, 0x20, + 0xb7, 0x26, 0x21, 0x6f, 0xf7, 0x3f, 0xfe, 0x1f, 0x7c, 0x7a, 0x71, 0x7b, 0xb0, 0x37, 0x72, 0xa1, 0x01, 0x2e, 0x17, 0xd5, 0xea, 0x8c, 0x35, 0x88, 0x44, 0x98, 0x67, 0xfb, 0xc7, 0x07, 0x68, 0x4c, + 0x1c, 0x55, 0xd6, 0x77, 0x10, 0x10, 0x05, 0x4a, 0x13, 0x1e, 0x11, 0x69, 0xfa, 0xf6, 0x81, 0x88, 0x89, 0x64, 0x0a, 0x8e, 0x8f, 0x7c, 0x83, 0x8d, 0xb8, 0xe7, 0xa6, 0x58, 0x58, 0xc1, 0x73, 0x5a, + 0xa3, 0xe2, 0x26, 0x79, 0x06, 0x79, 0x21, 0xc9, 0x81, 0x37, 0xe5, 0xda, 0x25, 0x96, 0x41, 0xae, 0xdb, 0xbb, 0x13, 0x36, 0x2e, 0x13, 0x54, 0x13, 0x2b, 0x7e, 0xa9, 0x60, 0xec, 0x50, 0x7e, 0x7d, + 0x93, 0xec, 0xb0, 0x72, 0x18, 0xe5, 0x18, 0x48, 0xe7, 0x36, 0x4f, 0x76, 0xf0, 0x2e, 0x47, 0xe6, 0x2a, 0x0a, 0x77, 0xde, 0x42, 0x5b, 0x64, 0x72, 0x6d, 0xb1, 0xb7, 0xf9, 0x9a, 0x04, 0xd9, 0x5d, + 0xf4, 0xdd, 0x92, 0xaf, 0xc1, 0x73, 0x0b, 0xe6, 0x07, 0x99, 0x05, 0xb1, 0x16, 0xe3, 0xac, 0x9f, 0x95, 0xe3, 0x4a, 0x58, 0x16, 0xb0, 0xb9, 0x2a, 0x1b, 0x77, 0x68, 0x51, 0x55, 0xb7, 0x2e, 0x2b, + 0x84, 0x69, 0x5d, 0x9c, 0xed, 0xb8, 0x1f, 0x37, 0xf2, 0xa1, 0x7a, 0x33, 0xae, 0xbb, 0x82, 0x02, 0x24, 0xb8, 0x93, 0x34, 0x50, 0x33, 0x63, 0xd4, 0x8d, 0x76, 0x0f, 0x43, 0xaf, 0xf3, 0xea, 0x62, + 0x4f, 0x99, 0xf1, 0x41, 0x70, 0x68, 0x76, 0x3e, 0x60, 0xd7, 0x8d, 0x01, 0x27, 0x09, 0x9f, 0xd2, 0xf5, 0x44, 0xa0, 0xf2, 0xf1, 0x0d, 0xe8, 0xda, 0x4a, 0xaa, 0xa4, 0x71, 0xeb, 0xe2, 0xac, 0xf1, + 0x14, 0xcf, 0xcd, 0x7b, 0x66, 0x17, 0xfc, 0x98, 0xf1, 0x12, 0xb0, 0x31, 0xc9, 0x1a, 0x63, 0x0d, 0x5f, 0xca, 0xcc, 0x91, 0xbb, 0x61, 0xb4, 0x67, 0x85, 0xd6, 0x9b, 0x66, 0x33, 0xf7, 0x84, 0xdb, + 0x96, 0x52, 0xc8, 0x93, 0xd2, 0x04, 0x95, 0xe5, 0x59, 0x44, 0x27, 0x8c, 0xd3, 0x08, 0x42, 0x21, 0x25, 0x0d, 0x75, 0xbc, 0xf2, 0x5d, 0xf8, 0xed, 0xf9, 0xcb, 0x35, 0x1e, 0xc0, 0x0d, 0x85, 0x90, + 0x70, 0x84, 0xb5, 0xba, 0x53, 0x28, 0xd8, 0x64, 0x90, 0x0f, 0x4c, 0xc3, 0xf1, 0x57, 0x8a, 0xcd, 0xa6, 0x30, 0x37, 0xc4, 0x4c, 0xbb, 0x65, 0x71, 0x28, 0x5f, 0x30, 0x29, 0xf8, 0x9c, 0x72, 0x8d, + 0xe3, 0x1a, 0x33, 0xa9, 0x9f, 0xc9, 0xa8, 0xa8, 0xf6, 0x6d, 0x2d, 0x33, 0x65, 0xfb, 0xa6, 0xd7, 0x3f, 0x3f, 0x1b, 0x0c, 0xcf, 0x9b, 0xd7, 0xdd, 0xd6, 0xdb, 0x76, 0xbf, 0x21, 0xe4, 0xd4, 0x0f, + 0x45, 0x44, 0x67, 0x24, 0x55, 0x7e, 0x12, 0xd3, 0x87, 0x54, 0xf9, 0x61, 0x4c, 0x94, 0x5a, 0x0a, 0x19, 0x47, 0xca, 0x8f, 0x49, 0xca, 0xc3, 0x19, 0x95, 0xfe, 0x79, 0xf6, 0x07, 0x96, 0x7b, 0x2d, + 0xc9, 0x82, 0x4a, 0xf4, 0x75, 0xc4, 0x50, 0x71, 0x21, 0x57, 0xe8, 0xf5, 0x34, 0xd4, 0x58, 0xfa, 0x27, 0x52, 0xcc, 0x21, 0x91, 0x22, 0xc4, 0xb1, 0xde, 0x2c, 0x78, 0x0a, 0x28, 0x2d, 0xec, 0x04, + 0xb4, 0x52, 0x9a, 0xce, 0x41, 0x0a, 0xa1, 0x9d, 0x1a, 0x4c, 0x98, 0x54, 0xba, 0x04, 0x64, 0x96, 0x28, 0xfe, 0x7c, 0xc1, 0x41, 0xa5, 0xe3, 0xe2, 0x98, 0x29, 0x08, 0x05, 0x57, 0x2c, 0xa2, 0x38, + 0xf1, 0x26, 0x52, 0xdc, 0xd1, 0x50, 0xc3, 0x18, 0x3b, 0xbc, 0x35, 0x90, 0x33, 0x61, 0x3c, 0x1a, 0x9a, 0x96, 0x6b, 0x88, 0x6f, 0x22, 0x26, 0xf7, 0x0f, 0xe0, 0x4b, 0x31, 0xc5, 0xa0, 0x75, 0x8f, + 0x5d, 0xf8, 0xe4, 0x40, 0x11, 0xca, 0xd6, 0xae, 0x97, 0x78, 0xc7, 0x19, 0x8b, 0xd9, 0x31, 0xc5, 0x0e, 0xa2, 0xdb, 0xf4, 0xdc, 0xac, 0x72, 0xea, 0x54, 0x72, 0x38, 0x5e, 0x0f, 0x49, 0xd9, 0xdb, + 0x06, 0x92, 0xc7, 0xb6, 0xad, 0xfc, 0x77, 0xd6, 0xc2, 0xb9, 0x75, 0x3c, 0x75, 0xe1, 0x59, 0x03, 0xf6, 0x82, 0xbd, 0x72, 0x1f, 0x67, 0x65, 0x8b, 0x72, 0x88, 0xc0, 0x28, 0xbf, 0x91, 0x6e, 0x39, + 0x03, 0x03, 0x92, 0x9f, 0x49, 0x4a, 0xee, 0x8b, 0xb0, 0xc7, 0x9c, 0x44, 0x83, 0x13, 0x29, 0x52, 0x1e, 0x99, 0xb4, 0x7b, 0xf7, 0xaa, 0xdd, 0xbc, 0xf4, 0xfe, 0xfd, 0xdf, 0xff, 0xf1, 0x2f, 0xd8, + 0xaf, 0x5c, 0x00, 0xc1, 0x20, 0x21, 0x32, 0x3c, 0xd8, 0x60, 0xff, 0x05, 0x89, 0x3f, 0x6e, 0xd6, 0x72, 0xa3, 0x8c, 0xed, 0xaf, 0xf0, 0xcf, 0xc0, 0xf7, 0xed, 0x2d, 0x39, 0xaa, 0xb2, 0xa6, 0x3c, + 0xc2, 0x51, 0xb7, 0x90, 0x20, 0x6f, 0xf9, 0x72, 0x13, 0xd7, 0xbf, 0x64, 0x4a, 0x3c, 0xba, 0xce, 0x23, 0x06, 0x52, 0x28, 0x78, 0x48, 0x34, 0xe5, 0x44, 0x53, 0x05, 0x38, 0x23, 0xc5, 0x8c, 0x53, + 0x65, 0xb7, 0x12, 0x66, 0x85, 0x67, 0x01, 0x86, 0xe6, 0xd8, 0x38, 0xb2, 0x3c, 0x8d, 0x1e, 0x57, 0xe5, 0xcc, 0x78, 0xec, 0x6b, 0x09, 0x9e, 0x82, 0xbd, 0x5b, 0xbe, 0x07, 0xf8, 0xcf, 0xff, 0x18, + 0xc8, 0x83, 0x2c, 0xe9, 0x1f, 0x1d, 0xe7, 0x55, 0x73, 0xd0, 0x1e, 0x9e, 0x75, 0xfa, 0x8d, 0xd1, 0xb6, 0x73, 0x11, 0x1f, 0xaf, 0x7f, 0x77, 0x54, 0xca, 0xc6, 0x1c, 0xa1, 0xcc, 0xce, 0xa6, 0xed, + 0xa9, 0xed, 0x7f, 0x7e, 0xd9, 0xcf, 0xa9, 0x41, 0xfb, 0x41, 0x53, 0x6e, 0x76, 0x94, 0x5a, 0xa0, 0x89, 0xc4, 0x12, 0x48, 0xaa, 0xc5, 0x9c, 0x68, 0x16, 0x12, 0xec, 0x85, 0x23, 0xb1, 0xe4, 0xf9, + 0xa2, 0x01, 0x8b, 0xac, 0xd1, 0xc7, 0x5b, 0x4a, 0x92, 0xe0, 0xf4, 0x78, 0x47, 0xa4, 0x4d, 0x48, 0xb3, 0x1e, 0xf1, 0x42, 0xca, 0xb5, 0x24, 0xb1, 0x53, 0x83, 0x2b, 0x1c, 0x3a, 0x0c, 0x3d, 0x05, + 0xa9, 0xaa, 0x20, 0x43, 0x86, 0x8c, 0xad, 0x5b, 0x96, 0x66, 0x0a, 0xf4, 0x8c, 0x68, 0x7c, 0x9a, 0xb1, 0x31, 0xd3, 0x10, 0xce, 0x68, 0x78, 0x6f, 0xda, 0x37, 0x0e, 0x63, 0xc6, 0x89, 0x5c, 0x41, + 0x44, 0x34, 0xf1, 0x7f, 0xa5, 0x2d, 0xf2, 0x11, 0xaf, 0x70, 0x88, 0xc9, 0x93, 0x20, 0x93, 0x36, 0xd8, 0x52, 0xbc, 0x1a, 0x1e, 0x06, 0xdd, 0xad, 0x5f, 0xbc, 0xef, 0xde, 0x0c, 0xdf, 0xb7, 0xfb, + 0xaf, 0x7a, 0x83, 0x36, 0x76, 0x54, 0x66, 0x13, 0x50, 0x0d, 0x77, 0x1b, 0x48, 0x66, 0x19, 0x0e, 0x7f, 0xc3, 0x21, 0x4f, 0x80, 0xf5, 0x85, 0xf3, 0xbd, 0x5c, 0x5a, 0x22, 0x8d, 0x23, 0xbe, 0xa7, + 0x4d, 0xa1, 0xf9, 0x1b, 0x6e, 0x87, 0x15, 0x5f, 0x33, 0x0d, 0xbe, 0xef, 0xbb, 0xe5, 0x14, 0x2c, 0x2e, 0x79, 0xc3, 0xbf, 0xdf, 0xbe, 0xec, 0x5d, 0xf7, 0xcf, 0x37, 0xb3, 0xf9, 0x8e, 0xc8, 0x6b, + 0x19, 0x37, 0xaa, 0x40, 0x01, 0x13, 0x81, 0x26, 0xf7, 0x44, 0xb2, 0x2a, 0xdf, 0xe0, 0xc8, 0xff, 0x4f, 0xff, 0xbf, 0xaa, 0x67, 0x9e, 0x39, 0x2b, 0xf4, 0x2f, 0xdd, 0xcf, 0x39, 0xed, 0x7c, 0x8d, + 0x21, 0x69, 0x22, 0xec, 0x3e, 0xa8, 0xbc, 0xcd, 0xb6, 0xfb, 0xc1, 0x1f, 0x61, 0x99, 0x29, 0x6c, 0x2b, 0x6b, 0xe7, 0xf5, 0xa0, 0xe1, 0x36, 0x5c, 0xd3, 0xbd, 0xc2, 0x3d, 0x5d, 0xc1, 0x82, 0xc4, + 0x29, 0x5d, 0x17, 0x57, 0x00, 0xbb, 0x11, 0xaa, 0xdf, 0xd3, 0x95, 0x8b, 0x01, 0xbb, 0x9f, 0x11, 0xbd, 0x96, 0xf1, 0x41, 0x61, 0x0d, 0x83, 0xe4, 0x9e, 0xda, 0x9a, 0x6a, 0x77, 0x43, 0x46, 0x39, + 0x45, 0x42, 0xf3, 0x27, 0x56, 0x32, 0x53, 0x4c, 0xbe, 0x25, 0xfa, 0x12, 0x29, 0x12, 0x2a, 0x35, 0xa3, 0xca, 0xfd, 0x47, 0x61, 0x71, 0x56, 0x72, 0x34, 0xa6, 0xef, 0x09, 0xd4, 0xad, 0xa0, 0x55, + 0xf5, 0x2d, 0xb7, 0x77, 0x44, 0xe2, 0xe5, 0xd5, 0xf8, 0x36, 0xd1, 0xd6, 0x36, 0x2c, 0x86, 0xd3, 0x6a, 0xb1, 0xaf, 0x12, 0xdd, 0x9e, 0x02, 0x97, 0x8c, 0x47, 0x58, 0x35, 0xdc, 0x7a, 0x15, 0xd4, + 0x5d, 0x5f, 0x07, 0x39, 0xf9, 0x50, 0xcc, 0xe7, 0x84, 0x47, 0xe0, 0x2d, 0x60, 0x39, 0xa5, 0xfa, 0xc9, 0xc5, 0xc2, 0xf7, 0xd8, 0x07, 0x36, 0x12, 0xd4, 0x10, 0xf6, 0x7d, 0x3f, 0x2b, 0x62, 0xf8, + 0x58, 0x4c, 0x0e, 0xeb, 0xce, 0xbd, 0x7c, 0xfd, 0x1b, 0x26, 0xd7, 0x83, 0x76, 0xbf, 0xdb, 0xb4, 0x0d, 0xd6, 0x5f, 0x7f, 0x55, 0x5e, 0x5d, 0xda, 0x36, 0xe9, 0x6c, 0x7b, 0x0d, 0x86, 0x3f, 0xc3, + 0xcf, 0xcd, 0xbd, 0x01, 0x5e, 0x6f, 0xdb, 0x0e, 0x6b, 0xf8, 0xca, 0xf8, 0xb1, 0x46, 0xf6, 0x3c, 0xcc, 0x0e, 0x2f, 0x55, 0x54, 0x36, 0xaa, 0xc2, 0xe4, 0xaf, 0x12, 0xdb, 0x7f, 0x45, 0x8d, 0xaa, + 0x40, 0xdf, 0xca, 0x36, 0xd3, 0x9a, 0xc6, 0x55, 0x17, 0x84, 0xa9, 0x8c, 0x7f, 0x89, 0x0b, 0x0c, 0xe1, 0xc2, 0x05, 0xf8, 0xf8, 0x4b, 0x5d, 0x60, 0xf8, 0x79, 0x62, 0xdb, 0x02, 0x65, 0x03, 0x4d, + 0x9e, 0xf6, 0x82, 0xc5, 0x37, 0x0e, 0x80, 0xaa, 0x28, 0x27, 0x1b, 0x06, 0xff, 0x76, 0x26, 0x79, 0xd4, 0x57, 0x98, 0xfd, 0x23, 0x93, 0x92, 0x38, 0x46, 0x2b, 0xe6, 0xdb, 0x62, 0x6b, 0x53, 0xf3, + 0x2d, 0x44, 0x8b, 0xf5, 0x05, 0xb0, 0xd3, 0xbe, 0x38, 0xdc, 0xb4, 0xb0, 0x77, 0x7f, 0xb2, 0x12, 0x98, 0x26, 0xe0, 0xc6, 0x3e, 0xe4, 0x25, 0xc6, 0x94, 0x84, 0x7c, 0x7a, 0x02, 0xd3, 0xc8, 0x95, + 0xb7, 0x5f, 0x6a, 0xc9, 0x74, 0x38, 0xcb, 0xf6, 0x39, 0x5a, 0xc0, 0x4d, 0x96, 0xfd, 0xd5, 0x75, 0x4e, 0xfe, 0x79, 0xc6, 0x4c, 0xdf, 0x65, 0xfd, 0x77, 0x55, 0x98, 0xaa, 0xac, 0x5f, 0x2b, 0x30, + 0x6b, 0x28, 0x77, 0xf4, 0x74, 0x40, 0xd1, 0x0a, 0xe0, 0xce, 0x88, 0xc9, 0xc7, 0x3c, 0xfa, 0x64, 0xf9, 0x7e, 0xc2, 0x32, 0xe1, 0xd3, 0x34, 0xe1, 0xbb, 0x1d, 0x9c, 0xff, 0xb2, 0xe1, 0xd0, 0x83, + 0x96, 0x98, 0x27, 0x2c, 0x5e, 0x7f, 0xd6, 0xda, 0xed, 0x98, 0xe2, 0x96, 0x2f, 0xff, 0x4a, 0x56, 0xc8, 0x7f, 0xb5, 0x12, 0xbd, 0xf5, 0xf7, 0x33, 0xa3, 0xc0, 0x16, 0xe8, 0xfe, 0xae, 0xf9, 0x39, + 0x74, 0x2b, 0x86, 0x3c, 0xa8, 0x60, 0x6d, 0xf0, 0x2b, 0x2c, 0xff, 0x33, 0xcd, 0x59, 0x83, 0x7e, 0x16, 0x47, 0x28, 0x7f, 0xb4, 0xc6, 0xfb, 0xd9, 0x76, 0xef, 0x97, 0x3f, 0x26, 0xfe, 0xa0, 0xd5, + 0x77, 0x9a, 0xd2, 0x05, 0x2f, 0x4c, 0x2a, 0xdd, 0xdc, 0x13, 0xbc, 0xd6, 0x5f, 0xec, 0x2e, 0xfb, 0xbd, 0x77, 0xed, 0xd6, 0x15, 0x5a, 0x13, 0x27, 0x8d, 0x27, 0x8d, 0x5f, 0x7c, 0x1e, 0x99, 0xb0, + 0x5f, 0xd9, 0x6c, 0xd7, 0xa0, 0x6d, 0xa7, 0x39, 0x9a, 0xcf, 0x1f, 0xbf, 0x92, 0x9b, 0x93, 0x6d, 0xb7, 0x76, 0xd9, 0xa2, 0x51, 0xff, 0x62, 0x8f, 0xb3, 0xe7, 0x13, 0xaf, 0x34, 0x91, 0x3d, 0x3a, + 0xdf, 0x16, 0x0a, 0xc6, 0xf5, 0x3b, 0x4d, 0x8d, 0x76, 0x2c, 0x7d, 0x1c, 0x76, 0xeb, 0xfb, 0xe5, 0x99, 0xf3, 0x09, 0xff, 0xd8, 0x60, 0xbf, 0x5b, 0xcc, 0x7d, 0xfb, 0xf9, 0xc8, 0x3d, 0xc8, 0x89, + 0x23, 0x11, 0x77, 0xf3, 0x0b, 0xc2, 0xf7, 0xd7, 0x50, 0x67, 0x47, 0xe9, 0xfc, 0xdb, 0x5d, 0xf8, 0xd7, 0x2a, 0xe9, 0x8f, 0x7c, 0x42, 0xd8, 0x22, 0xf6, 0x53, 0x3e, 0x26, 0x14, 0xe4, 0xca, 0xdf, + 0x13, 0x0a, 0x35, 0x77, 0xa5, 0x45, 0x49, 0xe7, 0x5d, 0x91, 0xf2, 0x55, 0x03, 0xec, 0xa2, 0x97, 0x7f, 0xbf, 0xb8, 0x94, 0x62, 0xc1, 0x22, 0x0a, 0x04, 0xdc, 0x7c, 0x5d, 0xce, 0xfe, 0xa4, 0x91, + 0x0b, 0x4b, 0x62, 0x76, 0x56, 0x92, 0x6a, 0xc9, 0xe8, 0xc2, 0xfe, 0x4f, 0x29, 0xad, 0xf3, 0x0e, 0x10, 0x39, 0xcd, 0x46, 0xe2, 0x25, 0x8b, 0x71, 0x9c, 0x36, 0x7b, 0x2e, 0xb3, 0xb8, 0x1a, 0x0b, + 0x3d, 0x5b, 0x7b, 0x18, 0x5b, 0x2f, 0x2e, 0xb8, 0x97, 0x3f, 0xdb, 0x2d, 0x20, 0x13, 0x5c, 0xf9, 0x59, 0xd4, 0xb5, 0x2e, 0xce, 0x86, 0xe7, 0x9d, 0x6e, 0x7b, 0xd8, 0xec, 0xbf, 0xc1, 0xf0, 0xcb, + 0x4e, 0x7b, 0xdd, 0xd7, 0x9d, 0x37, 0x50, 0xff, 0x5f, 0xb7, 0x9a, 0x1a, 0x15, 0x68, 0xc7, 0xb9, 0xe9, 0x37, 0x2f, 0x2f, 0xdb, 0xfd, 0xea, 0x3a, 0x2f, 0x1b, 0xb4, 0xec, 0xd4, 0x95, 0x77, 0xfd, + 0xe5, 0xf2, 0x73, 0x41, 0x18, 0xc7, 0x94, 0xa3, 0x61, 0x79, 0xeb, 0x79, 0xeb, 0x40, 0x39, 0x88, 0xcd, 0xb3, 0x67, 0x0a, 0xb6, 0xb1, 0xe5, 0xd7, 0x12, 0xe1, 0x2b, 0x13, 0x38, 0x52, 0x71, 0xbd, + 0x33, 0x2b, 0xcc, 0x4c, 0xcc, 0x29, 0xa6, 0xb3, 0x8d, 0xc5, 0x47, 0xb7, 0x78, 0x33, 0x4f, 0x63, 0xcd, 0x2e, 0x44, 0x94, 0xc6, 0xf4, 0xd2, 0x6e, 0x1c, 0xce, 0xf2, 0x95, 0xde, 0x3a, 0xff, 0xab, + 0x9c, 0x1f, 0x33, 0x89, 0xbf, 0x6c, 0xda, 0xe0, 0x11, 0xaa, 0x36, 0x74, 0xd1, 0x88, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc3, 0x6d, 0x0b, 0x80, 0xb4, 0x0c, 0x00, 0x00, + 0x55, 0x27, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x58, 0xff, 0x6f, 0xea, 0x46, 0x12, 0xff, 0xb9, + 0xfe, 0x2b, 0xa6, 0x56, 0xdd, 0x24, 0x15, 0x38, 0x79, 0x91, 0xee, 0x74, 0xa2, 0xf2, 0xe9, 0x39, 0x60, 0x1a, 0xd2, 0x04, 0x90, 0x4d, 0x92, 0x57, 0xf5, 0xf5, 0xd0, 0x62, 0x0f, 0xb0, 0x2f, 0x66, + 0xd7, 0xdd, 0x5d, 0x20, 0xdc, 0xe9, 0xfe, 0xf7, 0xd3, 0xae, 0xd7, 0xd8, 0x84, 0x24, 0xbd, 0x9e, 0x5a, 0xe9, 0xde, 0x0f, 0x8f, 0x78, 0x3d, 0xdf, 0xe7, 0x33, 0xb3, 0x33, 0xfe, 0x18, 0x47, 0x77, + 0xd0, 0xfe, 0x03, 0xff, 0x39, 0x46, 0xe2, 0x2d, 0x4d, 0x91, 0x49, 0xcc, 0x40, 0x71, 0x50, 0x4b, 0x84, 0xb0, 0x20, 0xe9, 0x12, 0x21, 0xe1, 0x73, 0xb5, 0x25, 0x02, 0xa1, 0xcf, 0xd7, 0x2c, 0x23, + 0x8a, 0x72, 0x06, 0xa7, 0x61, 0xd2, 0x3f, 0x83, 0x35, 0xcb, 0x50, 0x00, 0x67, 0x58, 0xf2, 0x73, 0x01, 0x2b, 0x2e, 0x10, 0x52, 0xce, 0x94, 0xa0, 0xb3, 0xb5, 0xe2, 0x02, 0xf2, 0x52, 0x26, 0x90, + 0x85, 0x40, 0x5c, 0x21, 0x53, 0xd2, 0x07, 0x48, 0x10, 0x8d, 0x82, 0xe1, 0x68, 0x32, 0xe8, 0x46, 0x30, 0xa7, 0xb9, 0x95, 0x90, 0x51, 0x59, 0x72, 0x62, 0x06, 0x5b, 0xaa, 0x96, 0xa0, 0x96, 0x54, + 0xc2, 0x96, 0x8b, 0x27, 0x98, 0x73, 0x01, 0x24, 0xcb, 0xa8, 0x56, 0x4f, 0x72, 0xa0, 0x6c, 0xce, 0xc5, 0xca, 0x18, 0x53, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x51, 0xb6, 0x80, 0x94, 0x17, 0x3b, 0x41, + 0x17, 0x4b, 0x05, 0x7c, 0xcb, 0x50, 0xc8, 0x25, 0x2d, 0x7c, 0x80, 0x89, 0x76, 0x28, 0xe9, 0x57, 0x06, 0xc9, 0x52, 0x74, 0xad, 0x5a, 0x71, 0xd8, 0xf1, 0xb5, 0x75, 0xa9, 0xe1, 0xbd, 0x0d, 0x4a, + 0x0b, 0x1e, 0x50, 0x48, 0xed, 0xfa, 0xa5, 0x7f, 0x01, 0xa7, 0x6a, 0x69, 0xd9, 0x5c, 0xfb, 0xde, 0x3d, 0xfb, 0xde, 0xf0, 0xaf, 0xc8, 0x0e, 0x18, 0x57, 0xb0, 0x96, 0x58, 0x6b, 0x00, 0x7c, 0x4e, + 0xb1, 0x50, 0x40, 0x19, 0xa4, 0x7c, 0x55, 0xe4, 0x94, 0xb0, 0xd4, 0xf2, 0x5b, 0x2f, 0xf7, 0x7a, 0x7c, 0x80, 0x9f, 0xac, 0x18, 0x3e, 0x53, 0x84, 0x32, 0x20, 0xc6, 0x21, 0xe0, 0xf3, 0x26, 0x19, + 0x10, 0x65, 0xf8, 0x4b, 0x21, 0x00, 0xb0, 0x54, 0xaa, 0xe8, 0x9c, 0x9f, 0x6f, 0xb7, 0x5b, 0x9f, 0x18, 0xc3, 0x7d, 0x2e, 0x16, 0xe7, 0x95, 0xb3, 0xe7, 0xb7, 0x83, 0x6e, 0x34, 0x4c, 0xa2, 0xf6, + 0xa5, 0x7f, 0xd1, 0xe0, 0xbb, 0x67, 0x39, 0x4a, 0x09, 0x02, 0x7f, 0x5d, 0x53, 0x81, 0x19, 0xcc, 0x76, 0x40, 0x8a, 0x22, 0xa7, 0x29, 0x99, 0xe5, 0x08, 0x39, 0xd9, 0xea, 0x94, 0x9a, 0xcc, 0x19, + 0x4c, 0x50, 0x06, 0x5b, 0x41, 0x15, 0x65, 0x8b, 0x56, 0xc9, 0x2f, 0x2b, 0x64, 0x34, 0xf3, 0x56, 0x47, 0xb0, 0xb2, 0x95, 0xca, 0x03, 0x02, 0xce, 0x80, 0xd8, 0xa4, 0xb9, 0x61, 0x02, 0x83, 0xc4, + 0x85, 0xab, 0x30, 0x19, 0x24, 0x2d, 0x78, 0x1c, 0x4c, 0xae, 0x47, 0xf7, 0x13, 0x78, 0x0c, 0xe3, 0x38, 0x1c, 0x4e, 0x06, 0x51, 0x02, 0xa3, 0x18, 0xba, 0xa3, 0x61, 0x6f, 0x30, 0x19, 0x8c, 0x86, + 0x09, 0x8c, 0xfa, 0x10, 0x0e, 0x7f, 0x2a, 0x79, 0x7f, 0x1c, 0x0c, 0x7b, 0x2d, 0x40, 0xaa, 0x96, 0x28, 0x00, 0x9f, 0x0b, 0xa1, 0x5d, 0xe1, 0x02, 0xa8, 0x0e, 0x30, 0x66, 0x0d, 0x98, 0x55, 0x76, + 0x68, 0x08, 0xed, 0x13, 0x27, 0x0b, 0x4c, 0xe9, 0x9c, 0xa6, 0x90, 0x13, 0xb6, 0x58, 0x93, 0x05, 0xc2, 0x82, 0x6f, 0x50, 0x30, 0x8d, 0xa0, 0x02, 0xc5, 0x8a, 0x4a, 0x9d, 0x6d, 0x09, 0x84, 0x65, + 0x90, 0xd3, 0x15, 0x55, 0x06, 0x6b, 0xb2, 0x64, 0x3e, 0xf2, 0xd1, 0x77, 0xfe, 0xf8, 0x9a, 0xfc, 0x13, 0x44, 0x1a, 0x89, 0x77, 0x64, 0x83, 0x0c, 0x12, 0x45, 0x84, 0x82, 0xfb, 0x02, 0xae, 0x88, + 0x4a, 0x97, 0x20, 0x53, 0x41, 0x8b, 0x26, 0xa6, 0xe2, 0x0a, 0x14, 0xd1, 0xf0, 0x01, 0x36, 0x44, 0xc8, 0x4e, 0x79, 0x7e, 0x13, 0x3e, 0x84, 0xd3, 0xeb, 0xd1, 0x5d, 0x04, 0x6d, 0xc8, 0x79, 0x5a, + 0xb6, 0x03, 0x3e, 0x07, 0x02, 0x37, 0xbd, 0x1f, 0x61, 0xc9, 0x57, 0x1a, 0x0d, 0xa2, 0x21, 0x68, 0x54, 0xd8, 0x92, 0xad, 0x04, 0x59, 0x2b, 0x2e, 0x5f, 0x93, 0xb2, 0xd2, 0xb6, 0x5d, 0x9e, 0x48, + 0xa0, 0x4c, 0x2a, 0x92, 0xe7, 0x98, 0x1d, 0x8a, 0x84, 0xbb, 0xf0, 0x21, 0x1a, 0x4e, 0xaf, 0xc2, 0x49, 0xf7, 0x7a, 0x1a, 0x75, 0xaf, 0x47, 0xd0, 0x06, 0x89, 0x4a, 0xa3, 0xf3, 0x84, 0xb3, 0x13, + 0xfd, 0x8b, 0xcc, 0xa0, 0x57, 0x27, 0x07, 0xd3, 0x25, 0xd7, 0xf9, 0xb4, 0xb5, 0x33, 0x33, 0x9e, 0xa6, 0x7c, 0xb5, 0x22, 0x2c, 0x93, 0xc7, 0xf2, 0xc6, 0xe1, 0x7d, 0x12, 0x1d, 0x0b, 0xdc, 0x12, + 0xaa, 0xca, 0xf6, 0x03, 0x4f, 0xb8, 0x93, 0x4a, 0xf0, 0x27, 0x84, 0x19, 0xce, 0x75, 0xab, 0x43, 0xa6, 0x5b, 0x4e, 0x53, 0xd4, 0x68, 0x3c, 0x49, 0xa0, 0x0d, 0x05, 0x11, 0x64, 0x85, 0x0a, 0x85, + 0x84, 0x82, 0xc8, 0x46, 0x53, 0xbd, 0x21, 0x1b, 0x02, 0x0f, 0x77, 0xb0, 0x5d, 0x22, 0x03, 0xb1, 0x66, 0x06, 0x70, 0x26, 0x25, 0xfb, 0x5a, 0x06, 0xf4, 0x17, 0xbe, 0xa6, 0xcf, 0x70, 0xb6, 0xb6, + 0x2f, 0x81, 0x2a, 0x89, 0xf9, 0xbc, 0xa5, 0x1b, 0x8b, 0x05, 0x30, 0xaa, 0x86, 0xca, 0xa0, 0xfd, 0xa9, 0xa4, 0x6e, 0x7f, 0x12, 0x6b, 0xf6, 0x25, 0xdb, 0x16, 0x1d, 0x25, 0x08, 0x93, 0x05, 0x17, + 0x2a, 0xc8, 0xd4, 0x54, 0xf2, 0xf4, 0x09, 0x55, 0x4b, 0xa2, 0xd8, 0xa0, 0x08, 0x76, 0x2d, 0xb9, 0x96, 0x05, 0xb2, 0x2c, 0xd8, 0xb5, 0x48, 0x96, 0xe9, 0xd2, 0x09, 0xfe, 0x76, 0x71, 0x71, 0xd1, + 0x74, 0x24, 0xf9, 0x71, 0x30, 0x9e, 0xc6, 0x5d, 0x68, 0xc3, 0x3c, 0x27, 0x0b, 0x63, 0x0e, 0x95, 0x65, 0x63, 0xe0, 0x24, 0xb3, 0x61, 0x35, 0xf9, 0x12, 0xa9, 0xe9, 0x72, 0xf2, 0x4f, 0x00, 0x6c, + 0x29, 0xf2, 0x0a, 0x17, 0xba, 0x11, 0xe6, 0x39, 0xe8, 0xa7, 0x9c, 0x32, 0x94, 0x65, 0xe3, 0x3c, 0xf9, 0x78, 0x62, 0x9a, 0x2a, 0x91, 0x78, 0x8c, 0x0c, 0x2a, 0x4d, 0x0a, 0x9d, 0x8f, 0x1a, 0x06, + 0xc0, 0xe7, 0xf3, 0x3a, 0x6e, 0x8a, 0xaa, 0x1c, 0xb5, 0xfd, 0x16, 0x0c, 0xb0, 0xa5, 0x2c, 0xe3, 0x5b, 0xa7, 0x3c, 0xf7, 0x6c, 0x1c, 0x2c, 0x92, 0x2a, 0x14, 0xcd, 0x76, 0x9a, 0x57, 0x99, 0x7c, + 0xbd, 0xd4, 0x65, 0xe1, 0xe2, 0x7c, 0xa4, 0x73, 0x70, 0xbd, 0x97, 0xaf, 0x3d, 0x17, 0x82, 0x00, 0x5c, 0xce, 0x5c, 0x30, 0xd2, 0xe0, 0x98, 0xc2, 0xa9, 0x8d, 0xf3, 0x74, 0x5d, 0x78, 0x06, 0xca, + 0xbf, 0xae, 0xe9, 0x86, 0xe4, 0xc8, 0x94, 0xb6, 0xf5, 0x1b, 0x7d, 0xee, 0x18, 0x05, 0x86, 0xa2, 0x14, 0xea, 0xc2, 0xa9, 0x66, 0x72, 0xf5, 0x51, 0x60, 0x5e, 0xf4, 0xe2, 0xc1, 0x43, 0xe4, 0x99, + 0x3f, 0xc7, 0xe1, 0xe4, 0xda, 0x73, 0xcf, 0xac, 0xf0, 0xe8, 0x19, 0xd3, 0xb5, 0x42, 0x20, 0x1a, 0x44, 0x02, 0x32, 0x9c, 0x53, 0x86, 0x99, 0x2d, 0xfd, 0x0a, 0xd1, 0xe6, 0xd2, 0xd2, 0x57, 0x3a, + 0x9d, 0x9b, 0x8b, 0xac, 0xf2, 0xc6, 0xc2, 0x61, 0xaf, 0x75, 0xc1, 0x15, 0x07, 0xf9, 0x44, 0x8b, 0x38, 0x1d, 0x0b, 0x0b, 0xc9, 0x74, 0x89, 0x69, 0x79, 0x53, 0x17, 0x02, 0xad, 0xdc, 0x16, 0x70, + 0x96, 0x62, 0x99, 0xae, 0x1c, 0x17, 0x24, 0xdd, 0x81, 0x3f, 0x23, 0xca, 0x56, 0x8e, 0x69, 0xaf, 0x35, 0x81, 0x9f, 0xae, 0xb2, 0xaa, 0xa6, 0xe8, 0x1c, 0xf0, 0x99, 0x4a, 0x55, 0xb9, 0xfb, 0xd9, + 0x62, 0x6d, 0x5a, 0x08, 0xd4, 0x12, 0x5c, 0x48, 0x35, 0x22, 0xde, 0x7a, 0xfb, 0x3e, 0x7f, 0xba, 0xca, 0xde, 0xe1, 0xd7, 0x6f, 0x9d, 0x4e, 0xed, 0x9c, 0xf3, 0x51, 0xa2, 0xd2, 0x6d, 0x2a, 0x77, + 0x1c, 0x1d, 0xec, 0x28, 0x8e, 0x47, 0xf1, 0xb4, 0x3b, 0xea, 0x45, 0xc1, 0x85, 0x8d, 0xed, 0x84, 0x03, 0x95, 0x3c, 0x27, 0x0a, 0x81, 0x32, 0x85, 0x42, 0x37, 0xbc, 0x0d, 0x11, 0x54, 0x23, 0x48, + 0xc2, 0x5c, 0xf0, 0x15, 0x14, 0x5c, 0x4a, 0xaa, 0x01, 0x55, 0x70, 0xa9, 0x6c, 0x74, 0x64, 0x0b, 0xb6, 0x68, 0x86, 0x05, 0xc2, 0xb8, 0xb9, 0xc9, 0xf6, 0x9a, 0x1a, 0x3a, 0x8d, 0x86, 0x20, 0x08, + 0x02, 0x48, 0x26, 0x61, 0x3c, 0x81, 0x87, 0xf0, 0x76, 0xd0, 0x0b, 0xf5, 0x95, 0x68, 0x4e, 0xeb, 0x54, 0xed, 0x9b, 0xf3, 0x61, 0x9a, 0x46, 0x4f, 0x37, 0xd7, 0x7c, 0x85, 0x8e, 0xa3, 0xc1, 0xe7, + 0x9b, 0xff, 0x21, 0x12, 0x82, 0x8b, 0x4e, 0xa3, 0x9d, 0x6b, 0x09, 0x73, 0x3d, 0xe1, 0xe9, 0x8a, 0xda, 0xf1, 0xb5, 0x00, 0x64, 0x1b, 0x2a, 0x38, 0xd3, 0x53, 0x9b, 0x0f, 0x7f, 0xff, 0xf6, 0xb2, + 0x64, 0x1c, 0xe7, 0xa8, 0xcb, 0xcd, 0x94, 0x91, 0xee, 0x67, 0x7b, 0x01, 0x95, 0xbb, 0xaf, 0xf1, 0x6b, 0x34, 0xaf, 0x4c, 0xfb, 0xd5, 0x3c, 0x7b, 0x59, 0xcd, 0xd6, 0x6f, 0x58, 0x4c, 0x77, 0xb4, + 0xbd, 0xdf, 0xbc, 0xa9, 0x15, 0xfb, 0x8e, 0xf1, 0x05, 0xb5, 0xdd, 0x8e, 0xd3, 0xa9, 0x7c, 0x6a, 0xa4, 0xb9, 0xf6, 0xfe, 0xf3, 0x8c, 0xb2, 0xcf, 0x5f, 0xc8, 0x86, 0xf8, 0xf8, 0x8c, 0x36, 0x08, + 0x94, 0x51, 0xf5, 0x7e, 0x04, 0xa8, 0xac, 0x5a, 0x3f, 0x61, 0x40, 0xd9, 0x86, 0xe4, 0x34, 0xd3, 0x37, 0x0f, 0xa6, 0x8a, 0x8b, 0x5d, 0x23, 0x04, 0x35, 0x4b, 0xf0, 0x22, 0xe8, 0xff, 0x67, 0x51, + 0xaa, 0x81, 0x13, 0x0d, 0x7b, 0x47, 0xb0, 0x71, 0x3a, 0x65, 0x4c, 0x0c, 0x55, 0x9f, 0xb2, 0xcc, 0xa8, 0x2d, 0x04, 0xff, 0x82, 0xa9, 0x82, 0x99, 0xb6, 0x3f, 0xa3, 0xa2, 0x05, 0xd4, 0x47, 0xdf, + 0xbc, 0xda, 0xc7, 0x02, 0xd4, 0x92, 0x28, 0x33, 0xe7, 0x13, 0xca, 0xa4, 0x79, 0x37, 0xe7, 0xb9, 0x9e, 0x89, 0x5c, 0x7f, 0xb5, 0x61, 0xae, 0x1d, 0x87, 0xfa, 0x24, 0xcf, 0x67, 0x24, 0x7d, 0xd2, + 0x7e, 0xa5, 0x6b, 0x21, 0xb4, 0x8b, 0x7a, 0x98, 0xd7, 0x85, 0x5f, 0xcb, 0xb2, 0xe8, 0x35, 0xd8, 0xf3, 0xcb, 0x02, 0x2b, 0x5b, 0xce, 0x38, 0x1e, 0xdd, 0x44, 0xdd, 0xc9, 0x55, 0x98, 0x44, 0xbd, + 0x41, 0x1c, 0xec, 0x9b, 0xa6, 0x79, 0xf4, 0x9c, 0x41, 0x5f, 0x2f, 0x10, 0xfb, 0x06, 0x75, 0x48, 0xed, 0xb9, 0x41, 0x50, 0xc1, 0x1f, 0x59, 0xd6, 0x43, 0x85, 0xa9, 0xba, 0x22, 0x12, 0x7b, 0x54, + 0xd8, 0x22, 0xfe, 0x14, 0x75, 0xa7, 0x46, 0x6e, 0xb7, 0xe7, 0x99, 0x93, 0x47, 0xf3, 0x54, 0x9d, 0x7b, 0x4e, 0x67, 0x4e, 0x59, 0x56, 0xf1, 0x0c, 0xfa, 0x10, 0x7d, 0x1a, 0x24, 0x5a, 0xdf, 0xa3, + 0x91, 0xff, 0x59, 0x7b, 0x5a, 0x2a, 0x98, 0x95, 0x34, 0x66, 0x3f, 0x72, 0xd2, 0x0c, 0x7c, 0x5f, 0x93, 0x57, 0x84, 0x41, 0xe0, 0x6a, 0x15, 0xee, 0x01, 0xed, 0x90, 0xab, 0x92, 0xbc, 0x56, 0xac, + 0xcd, 0x30, 0x24, 0x4d, 0xb5, 0x4e, 0xe7, 0x40, 0xf8, 0xdb, 0xc1, 0x31, 0xba, 0xb4, 0x72, 0xb7, 0xf6, 0xc0, 0x75, 0xde, 0xf0, 0xbf, 0xf3, 0x9a, 0x15, 0xaf, 0xcb, 0xad, 0xc3, 0xf1, 0x52, 0xb6, + 0xd3, 0x39, 0x16, 0x6c, 0x73, 0x52, 0x45, 0xea, 0xd5, 0xcc, 0x98, 0xc0, 0x7d, 0xfe, 0xb2, 0x59, 0xf9, 0x29, 0x67, 0x73, 0xba, 0xa8, 0xb3, 0x14, 0x23, 0xc9, 0xc2, 0xfd, 0x8e, 0xd7, 0x35, 0x6f, + 0x1b, 0xcd, 0x17, 0x22, 0x73, 0x21, 0x47, 0xcf, 0x0a, 0x59, 0x39, 0x9c, 0x97, 0x07, 0x3d, 0xcc, 0xc9, 0x0e, 0xb3, 0xe8, 0xb9, 0x20, 0xe6, 0xdc, 0xd1, 0x37, 0xd0, 0x79, 0x1f, 0xdc, 0xb5, 0x44, + 0x0d, 0xbf, 0x5f, 0x21, 0xc3, 0x9c, 0xae, 0x64, 0xe0, 0x82, 0xe7, 0xe9, 0xc2, 0x81, 0xd3, 0xff, 0xd6, 0xb4, 0x33, 0xc8, 0xb8, 0x29, 0xe2, 0x9b, 0x87, 0xbb, 0x69, 0x77, 0x34, 0xec, 0x0f, 0x7e, + 0x98, 0xee, 0x39, 0xc7, 0x49, 0xf0, 0xf5, 0xeb, 0xe7, 0x5f, 0x6b, 0x45, 0xce, 0x47, 0x64, 0x59, 0x69, 0xf8, 0xb7, 0xef, 0xc9, 0xf0, 0x5e, 0x3f, 0xf7, 0xca, 0x00, 0xbf, 0x1e, 0x93, 0x24, 0x9a, + 0xd8, 0x7c, 0x99, 0xce, 0x12, 0x7d, 0x8a, 0x82, 0xb7, 0xfb, 0x5f, 0x89, 0xb1, 0x38, 0x1c, 0x8f, 0xa3, 0x78, 0x7a, 0x13, 0xc6, 0xc1, 0xbb, 0xde, 0x6f, 0x05, 0x29, 0x0a, 0x14, 0xe5, 0x85, 0xd8, + 0xb6, 0x4f, 0xfe, 0x17, 0x22, 0x0e, 0xe5, 0xdc, 0x86, 0xf7, 0xc3, 0xee, 0x75, 0x14, 0x07, 0x5c, 0x2c, 0xaa, 0x95, 0xd3, 0xb0, 0xf8, 0x15, 0x8b, 0x99, 0x5b, 0x1f, 0xcb, 0x87, 0x3b, 0x42, 0x59, + 0x59, 0x76, 0xbd, 0xd1, 0xe3, 0xf0, 0x76, 0x14, 0xf6, 0xa6, 0xf7, 0xf1, 0x6d, 0xe0, 0xea, 0xb5, 0x55, 0x76, 0xce, 0xcf, 0x05, 0x16, 0xdc, 0xb2, 0x37, 0xd6, 0xd7, 0x72, 0x1b, 0x38, 0xa7, 0xfc, + 0x5c, 0x91, 0x27, 0x22, 0xe8, 0xf9, 0x81, 0x4d, 0xe7, 0x17, 0xfe, 0x5f, 0xfc, 0xbf, 0x1e, 0x9e, 0xb5, 0xcd, 0x59, 0x69, 0xad, 0xd3, 0x1f, 0xc5, 0x06, 0x06, 0x8a, 0x3f, 0x21, 0x93, 0xc1, 0x87, + 0xd6, 0x65, 0x05, 0x04, 0x83, 0x84, 0x10, 0x06, 0xc3, 0xdf, 0x40, 0xc2, 0xeb, 0xb1, 0x28, 0x04, 0x2f, 0x50, 0x28, 0x8a, 0xd2, 0x3d, 0x83, 0xde, 0x08, 0x4e, 0x1d, 0x3d, 0xb4, 0x9b, 0x8a, 0xf7, + 0x42, 0x5d, 0xee, 0x96, 0xf0, 0x5e, 0xe4, 0x2e, 0xe8, 0x4c, 0x1d, 0xf8, 0xec, 0x79, 0x57, 0x4e, 0x3d, 0x91, 0x59, 0x28, 0x9b, 0x4b, 0x27, 0xcf, 0xf9, 0x16, 0xc8, 0x5a, 0xf1, 0x15, 0x51, 0x54, + 0x0f, 0x27, 0x3b, 0xc8, 0xf8, 0x96, 0x55, 0xe3, 0xb6, 0xee, 0xb2, 0x47, 0x49, 0x29, 0x47, 0x0b, 0x13, 0xea, 0x76, 0x8a, 0x4c, 0x09, 0x3d, 0x39, 0x98, 0x81, 0x44, 0xcf, 0x71, 0x46, 0xa4, 0x84, + 0xb5, 0x3c, 0xe0, 0x07, 0xcb, 0xaf, 0x2b, 0xc1, 0x76, 0x7b, 0x59, 0x76, 0xf4, 0x42, 0xf0, 0x25, 0x9d, 0x51, 0x55, 0x4e, 0x72, 0x9a, 0x89, 0x32, 0x98, 0x51, 0x46, 0xc4, 0x0e, 0x32, 0xa2, 0x88, + 0x5f, 0x5f, 0xb7, 0x5e, 0x03, 0x50, 0x9e, 0x0d, 0x41, 0x39, 0xfc, 0x3e, 0x0c, 0x1f, 0xa7, 0x0f, 0x51, 0x7c, 0x35, 0x4a, 0xaa, 0x31, 0x44, 0x89, 0x35, 0xba, 0x96, 0xc6, 0xec, 0x37, 0xfa, 0x56, + 0x33, 0x8d, 0xe7, 0x50, 0x8c, 0x21, 0x38, 0x73, 0xce, 0x00, 0x73, 0x89, 0xb5, 0x4c, 0x3b, 0x86, 0x6a, 0xb9, 0x71, 0x34, 0x1e, 0xdd, 0xc7, 0xb7, 0xf5, 0xec, 0xbb, 0x97, 0x79, 0x14, 0xe7, 0x17, + 0x1c, 0xff, 0x2b, 0x8a, 0x4a, 0x93, 0x7e, 0xb7, 0x77, 0x5d, 0xbe, 0xce, 0x33, 0x76, 0xa2, 0x4c, 0x33, 0x3f, 0xf4, 0xb2, 0x75, 0x90, 0x55, 0xaa, 0xc0, 0xf7, 0xfd, 0x43, 0xe6, 0x5e, 0xe3, 0xbd, + 0xce, 0x6f, 0x07, 0xbc, 0xa6, 0x6b, 0x55, 0x9c, 0xcc, 0x4f, 0xc1, 0xb7, 0x28, 0xe4, 0x12, 0xf3, 0x1c, 0xda, 0x5d, 0xbb, 0xcd, 0xb8, 0xdf, 0xfe, 0xcb, 0xfd, 0x87, 0xf3, 0xd5, 0x57, 0xee, 0x37, + 0x5b, 0x9c, 0xa5, 0x39, 0xd5, 0xf7, 0x6e, 0x00, 0x0c, 0xb7, 0x6d, 0x3e, 0x33, 0x77, 0x7b, 0xb2, 0x93, 0x0a, 0x57, 0xfe, 0x10, 0x95, 0xff, 0x88, 0xb3, 0xae, 0xa1, 0xf8, 0xbe, 0x64, 0xa1, 0x73, + 0x38, 0x6d, 0xeb, 0x88, 0x9f, 0xfe, 0x2c, 0x95, 0xa0, 0x6c, 0xf1, 0x4b, 0xa7, 0x33, 0x90, 0xc3, 0x75, 0x9e, 0x8f, 0x44, 0xb4, 0x2a, 0xd4, 0xee, 0xf4, 0xa4, 0x0c, 0xc2, 0x7d, 0x12, 0xc5, 0xc3, + 0xf0, 0x2e, 0xf2, 0x4e, 0xce, 0xa0, 0xad, 0xb5, 0xfe, 0x06, 0xfd, 0x38, 0x4c, 0x92, 0xc7, 0x51, 0xdc, 0xf3, 0x4e, 0xce, 0xce, 0xce, 0xe0, 0xc8, 0x40, 0xbf, 0x2b, 0x30, 0x43, 0xa6, 0x28, 0xc9, + 0xe5, 0x9b, 0xc6, 0x0e, 0x51, 0xe9, 0xf9, 0xa1, 0x26, 0x3d, 0x36, 0xa6, 0x05, 0xc7, 0xfa, 0xac, 0x6b, 0xff, 0x2e, 0x7f, 0x7e, 0xd6, 0x92, 0x12, 0x14, 0x1b, 0x9a, 0xe2, 0x98, 0x53, 0xa6, 0xee, + 0x08, 0x23, 0x0b, 0x14, 0xbf, 0x74, 0x3a, 0x09, 0xa6, 0x6b, 0x41, 0xd5, 0x6e, 0x2c, 0xb8, 0xe2, 0x29, 0xcf, 0x21, 0x00, 0x4b, 0x7d, 0x78, 0x3e, 0xd9, 0x15, 0xf8, 0x4b, 0xa7, 0x33, 0xc9, 0xe5, + 0x87, 0xcb, 0xef, 0xa1, 0xe1, 0x44, 0x95, 0xb9, 0x3e, 0xcd, 0xf1, 0xf4, 0xe4, 0x30, 0x6b, 0xc6, 0xb4, 0x26, 0x10, 0x4e, 0xce, 0x2a, 0xbb, 0x7e, 0x3f, 0xbe, 0xfa, 0x94, 0x51, 0xb9, 0xc4, 0xec, + 0x00, 0x4b, 0xaf, 0x16, 0x93, 0xed, 0x34, 0x7a, 0xcf, 0xd2, 0xb5, 0x6b, 0x1b, 0x8e, 0x6d, 0x40, 0x63, 0xc1, 0x37, 0x34, 0xd3, 0x2b, 0xa1, 0x2b, 0x15, 0x61, 0x19, 0x11, 0x19, 0xfd, 0x27, 0x66, + 0x2e, 0x6c, 0xc9, 0x4e, 0xf7, 0x24, 0x81, 0x4a, 0x50, 0xdc, 0x94, 0x9f, 0x53, 0xba, 0xb7, 0x03, 0x20, 0x62, 0x61, 0x7b, 0xc5, 0x96, 0xe6, 0xb6, 0xd5, 0x98, 0xef, 0xb3, 0x66, 0x7f, 0x9b, 0x71, + 0xb5, 0x84, 0x47, 0xb3, 0x4b, 0x97, 0x5f, 0xce, 0x18, 0x67, 0xed, 0xea, 0x19, 0xcd, 0xfa, 0xa9, 0xef, 0x6d, 0xbf, 0x31, 0x6f, 0x74, 0xef, 0x7a, 0xd3, 0xdb, 0xc1, 0x30, 0x9a, 0x86, 0xf1, 0x0f, + 0x49, 0xe0, 0x7d, 0xe7, 0x38, 0xde, 0xe1, 0xc5, 0xe6, 0xc1, 0x5b, 0x17, 0x64, 0xb5, 0x46, 0x8f, 0xc6, 0x93, 0xfa, 0xa1, 0x17, 0x5d, 0xdd, 0xff, 0x60, 0x8f, 0xda, 0x69, 0x4e, 0xa4, 0x2c, 0x88, + 0x5a, 0xbe, 0x68, 0x57, 0x6e, 0xbb, 0x57, 0x5e, 0x36, 0xab, 0x75, 0xae, 0xe8, 0x1d, 0xcf, 0xd6, 0x39, 0x8e, 0xcb, 0x4e, 0xd8, 0xab, 0xe6, 0xd2, 0xe0, 0x8d, 0xb9, 0xb2, 0x16, 0x55, 0x5d, 0x81, + 0x7b, 0xdd, 0xa5, 0x8d, 0x1e, 0x78, 0xdf, 0xe9, 0x3e, 0x69, 0xb6, 0xc4, 0xdb, 0xe8, 0x21, 0xba, 0x85, 0x0f, 0xd0, 0x98, 0xca, 0xab, 0x69, 0x47, 0xdf, 0xef, 0xe6, 0xe0, 0xc5, 0x4a, 0xf9, 0xa1, + 0xbc, 0xf8, 0x8f, 0xc6, 0x87, 0x06, 0x89, 0x57, 0xff, 0xed, 0x39, 0xbf, 0x67, 0x53, 0xe7, 0x52, 0x1d, 0xad, 0xea, 0xf5, 0x36, 0xfa, 0x27, 0xec, 0xea, 0x5c, 0xaa, 0xf7, 0x96, 0xf5, 0xea, 0xf5, + 0x6f, 0x48, 0x78, 0x67, 0x5d, 0xaf, 0x5e, 0xef, 0xf7, 0x75, 0xed, 0x62, 0xe9, 0x63, 0x41, 0xca, 0xaf, 0xf0, 0xd5, 0xa7, 0x08, 0x5d, 0x61, 0xc7, 0xdf, 0xfb, 0xea, 0xad, 0xcf, 0x7c, 0xc1, 0x39, + 0xfa, 0x80, 0x63, 0xa8, 0x1a, 0x5f, 0x70, 0x8c, 0x54, 0xa7, 0x49, 0x37, 0x89, 0xe2, 0xbb, 0xc1, 0x30, 0x9c, 0x44, 0x1a, 0xcc, 0x0d, 0x4a, 0x7c, 0xa6, 0x0a, 0x0e, 0x53, 0x65, 0x8e, 0xce, 0xaf, + 0x0e, 0x4f, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x73, 0x2c, 0x84, 0x18, 0xd1, 0x09, 0x00, 0x00, 0xcf, 0x19, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xbc, 0x57, 0x51, 0x6f, 0xdb, 0x38, 0x0c, 0x7e, 0xcf, 0xaf, 0x30, 0x82, 0xbe, 0x5a, 0x4a, 0xda, 0x1b, 0x50, 0x14, 0x3a, 0x0d, 0xf7, + 0x70, 0xc3, 0x0d, 0x68, 0xb7, 0x02, 0xdd, 0x0d, 0xf7, 0xaa, 0xda, 0xb4, 0xa3, 0xd6, 0x96, 0x3c, 0x49, 0x4e, 0x13, 0x14, 0xf9, 0xef, 0x07, 0x59, 0xb6, 0x63, 0xd9, 0x72, 0xb2, 0x16, 0x77, 0x7b, + 0x8b, 0xc8, 0x8f, 0x34, 0x45, 0x7e, 0xa4, 0x18, 0xf2, 0x71, 0x57, 0x16, 0xd1, 0x16, 0x94, 0xe6, 0x52, 0xfc, 0xbe, 0x5c, 0xa3, 0xd5, 0xf2, 0x23, 0x5d, 0x90, 0x4a, 0xc9, 0x27, 0x48, 0x4c, 0xb4, + 0xd3, 0xfc, 0x46, 0x27, 0x1b, 0x28, 0xd9, 0xad, 0x4c, 0x98, 0x69, 0x30, 0x1b, 0x63, 0xaa, 0x1b, 0x8c, 0x4b, 0xb6, 0x05, 0x81, 0x58, 0xc5, 0x92, 0x0d, 0x20, 0xa9, 0x72, 0x7c, 0xff, 0xf5, 0x0e, + 0xff, 0x86, 0x56, 0x68, 0x15, 0x59, 0x84, 0x0e, 0x41, 0x76, 0x3a, 0x75, 0xc2, 0xb8, 0x01, 0xa2, 0x9d, 0x4e, 0x97, 0xd1, 0xae, 0x2c, 0x84, 0xfe, 0x09, 0xb7, 0xcb, 0x45, 0x14, 0x45, 0x0e, 0x7d, + 0xb3, 0xd3, 0xbc, 0xb7, 0x78, 0x79, 0x79, 0x41, 0x2f, 0x57, 0x0d, 0xf6, 0x72, 0xb5, 0x5a, 0xe3, 0x7f, 0xee, 0x6e, 0x1f, 0x9a, 0x90, 0x63, 0x2e, 0xb4, 0x61, 0x22, 0x81, 0x25, 0x5d, 0x44, 0x11, + 0x29, 0x65, 0x0a, 0xc5, 0x77, 0x77, 0x53, 0xda, 0x78, 0x24, 0xd8, 0x93, 0x59, 0x50, 0xae, 0x64, 0x5d, 0x7d, 0x4e, 0xa9, 0x54, 0x39, 0x62, 0x49, 0x09, 0x04, 0x77, 0x12, 0xab, 0x65, 0xca, 0xf0, + 0x8c, 0x25, 0xe6, 0x73, 0x4a, 0xb3, 0x5a, 0x24, 0x36, 0x1f, 0x04, 0x0f, 0x84, 0x16, 0xd3, 0xe6, 0x92, 0xae, 0xed, 0x17, 0xe2, 0x87, 0x2f, 0x7f, 0xdc, 0x3f, 0xfc, 0xf5, 0xf5, 0x1b, 0xc1, 0xdb, + 0xc1, 0x57, 0x2a, 0x25, 0x2b, 0x50, 0x86, 0x83, 0xa6, 0xcd, 0xa5, 0x48, 0x22, 0xcb, 0x8a, 0x17, 0xa0, 0xe2, 0xaa, 0xa8, 0x73, 0x2e, 0x50, 0x07, 0xbe, 0x42, 0xd7, 0x68, 0x4d, 0xf0, 0x9c, 0xda, + 0x19, 0xbb, 0x94, 0x75, 0x18, 0x54, 0x31, 0xc5, 0x4a, 0x30, 0xa0, 0x34, 0x35, 0xaa, 0x06, 0x82, 0xe7, 0xf5, 0x41, 0x7b, 0x2d, 0x6b, 0x95, 0x00, 0x5d, 0xa3, 0xeb, 0x89, 0x69, 0xab, 0x0a, 0x9a, + 0x19, 0xa6, 0x72, 0x30, 0x41, 0xb3, 0x56, 0xe5, 0xcc, 0x5a, 0x6a, 0xa1, 0xc7, 0x9a, 0x17, 0x69, 0xeb, 0xf1, 0x4f, 0x91, 0xc8, 0x94, 0x8b, 0x9c, 0xfe, 0xfd, 0xed, 0x53, 0x7c, 0x4d, 0xf0, 0x49, + 0x8c, 0xef, 0x46, 0x41, 0x25, 0x95, 0xe1, 0x22, 0x47, 0xb2, 0x36, 0x55, 0x6d, 0xe6, 0x5c, 0xcd, 0xe2, 0x9c, 0xbb, 0x1f, 0x35, 0x53, 0xcf, 0xb5, 0x1e, 0x27, 0xf8, 0x12, 0x5d, 0xa2, 0x2b, 0xf4, + 0x89, 0x0b, 0x56, 0x10, 0x3c, 0x83, 0xf1, 0x1c, 0xa0, 0xaa, 0x60, 0x26, 0x93, 0xaa, 0x44, 0x1d, 0x2d, 0x62, 0x9e, 0xd2, 0xce, 0xb2, 0x16, 0xdc, 0x5a, 0x41, 0xfc, 0x28, 0xcb, 0xde, 0x5f, 0xd8, + 0x64, 0xc6, 0x6b, 0xc3, 0x46, 0xab, 0xe7, 0x12, 0xb5, 0xca, 0x80, 0xa3, 0x1e, 0x35, 0xe3, 0xe5, 0xd4, 0xf5, 0xa6, 0x28, 0xe7, 0x44, 0xd7, 0x0a, 0x32, 0xae, 0x60, 0x4a, 0x51, 0xcb, 0xf3, 0xbb, + 0x0f, 0x04, 0xcf, 0x21, 0x2c, 0xe3, 0xb1, 0x4f, 0x79, 0x92, 0x42, 0x05, 0x22, 0x05, 0x91, 0xec, 0xef, 0x98, 0x60, 0x39, 0x94, 0x20, 0x3a, 0x82, 0xf4, 0xaa, 0xbe, 0x3d, 0x3c, 0x7c, 0x27, 0x1a, + 0x34, 0xeb, 0xc5, 0xeb, 0x6c, 0x06, 0x0e, 0x5e, 0x03, 0xb7, 0x76, 0x83, 0x8e, 0x0d, 0x98, 0x0e, 0xaa, 0x70, 0x18, 0x77, 0x77, 0xeb, 0xa0, 0xbb, 0x59, 0xc0, 0xba, 0x55, 0x1d, 0xbc, 0x86, 0x6f, + 0xcd, 0xcc, 0xbe, 0x02, 0x5a, 0xd9, 0xd2, 0x37, 0xbf, 0x8e, 0x0a, 0x9d, 0xc8, 0x0a, 0x28, 0x2f, 0x2d, 0x45, 0x09, 0x76, 0xa7, 0xee, 0xe6, 0x78, 0x7c, 0xf5, 0x81, 0xa4, 0xcb, 0x26, 0x9e, 0x4b, + 0x67, 0x20, 0x99, 0x81, 0x54, 0xf6, 0x89, 0x1c, 0x92, 0x6a, 0x94, 0xb6, 0x61, 0xd2, 0x3a, 0x3a, 0x67, 0xb5, 0xf8, 0xb1, 0x8f, 0x9f, 0x05, 0x33, 0x7c, 0x0b, 0x31, 0x6c, 0x41, 0x18, 0x3d, 0xcd, + 0x58, 0xe0, 0x06, 0xff, 0x5d, 0x08, 0xba, 0x64, 0x45, 0xa1, 0xf6, 0x10, 0x6f, 0x80, 0x15, 0x66, 0xf3, 0x8b, 0xbf, 0xfe, 0x54, 0x0b, 0x6e, 0x3e, 0x84, 0x48, 0xd2, 0x96, 0xd4, 0x80, 0xf6, 0x0b, + 0xfa, 0xe6, 0x70, 0x14, 0x68, 0x13, 0x33, 0x6d, 0x7b, 0x2b, 0x3d, 0x19, 0x93, 0x0f, 0x7c, 0x7f, 0x44, 0x01, 0x7a, 0x35, 0x63, 0xb8, 0x45, 0xbb, 0xde, 0x3e, 0x36, 0xa6, 0x3b, 0x07, 0x9a, 0xf2, + 0x44, 0x2a, 0xc3, 0xc9, 0x74, 0x8b, 0x81, 0xf3, 0xf7, 0xb3, 0x7d, 0x37, 0x1a, 0x35, 0xc1, 0xae, 0x83, 0x1d, 0x24, 0xb5, 0x7d, 0xaa, 0xf5, 0x51, 0x38, 0x14, 0x0f, 0xa5, 0x36, 0x7e, 0xc9, 0x0a, + 0xed, 0xcb, 0x5a, 0x29, 0xcd, 0x41, 0x80, 0x62, 0x06, 0xe2, 0x44, 0xa6, 0x76, 0x33, 0xb0, 0xb2, 0xf3, 0xc0, 0xd8, 0xa6, 0x5c, 0x9f, 0x82, 0x37, 0xf9, 0x0d, 0x01, 0x9c, 0xcc, 0x8f, 0x1b, 0x07, + 0x02, 0x1f, 0x08, 0x8f, 0x95, 0xc1, 0x7e, 0x69, 0xa6, 0x95, 0x1a, 0xa4, 0xd8, 0xe5, 0x7e, 0xb4, 0x66, 0x9c, 0x2d, 0xc2, 0xcc, 0x5a, 0x32, 0xad, 0xc2, 0x3b, 0x62, 0x19, 0x3d, 0x26, 0x67, 0x63, + 0x99, 0x79, 0x7c, 0x82, 0x8c, 0x48, 0xa4, 0xc8, 0x78, 0x5e, 0x2b, 0x36, 0x2e, 0x3f, 0xd1, 0x7b, 0x6d, 0xa0, 0xbc, 0x77, 0x6f, 0xd5, 0xfe, 0x3b, 0x53, 0x9c, 0x3d, 0x16, 0x30, 0xa2, 0x03, 0x79, + 0x62, 0x5b, 0x86, 0x6a, 0xc3, 0x0b, 0x54, 0xc8, 0x3c, 0xb7, 0x3b, 0x45, 0xd9, 0x4c, 0x5d, 0xd5, 0xac, 0x8d, 0x4f, 0x8f, 0x52, 0x6b, 0xab, 0x69, 0x85, 0xe8, 0x56, 0xe6, 0x6e, 0x2a, 0x2b, 0x82, + 0xe7, 0x4d, 0xfd, 0x4f, 0xb8, 0x0d, 0x6a, 0x23, 0x4b, 0xa0, 0x17, 0xaf, 0xc7, 0xc3, 0xa1, 0xdb, 0xad, 0x1a, 0x8d, 0x47, 0x8b, 0xb3, 0xa1, 0xdb, 0x35, 0x32, 0x70, 0x6f, 0xbf, 0x36, 0xdd, 0xa9, + 0x7d, 0x57, 0xfa, 0xce, 0xb7, 0xfb, 0x56, 0xc6, 0x7b, 0x7f, 0xdd, 0xb1, 0x77, 0xc2, 0x53, 0xea, 0x9e, 0x01, 0x82, 0xf9, 0x60, 0x3c, 0x25, 0x86, 0x6f, 0x47, 0x59, 0xee, 0x96, 0xdf, 0xbd, 0x17, + 0xbe, 0x60, 0x25, 0xf4, 0x1e, 0x9a, 0xc3, 0x20, 0xee, 0xb1, 0x05, 0xc1, 0x53, 0xc7, 0xc3, 0x21, 0x15, 0x45, 0xd3, 0x41, 0x15, 0x85, 0x68, 0x17, 0x05, 0xa9, 0x97, 0x31, 0x5e, 0x68, 0x96, 0x9d, + 0xa6, 0x5e, 0xf4, 0x6e, 0xfa, 0x35, 0x96, 0xe1, 0xa1, 0xe4, 0xab, 0xc6, 0x9a, 0xb9, 0xe1, 0xd4, 0x6b, 0x28, 0x17, 0x06, 0x72, 0x57, 0xde, 0xd8, 0x0d, 0xfa, 0xd0, 0xd0, 0x39, 0xe2, 0xb7, 0xa0, + 0x78, 0xb6, 0x9f, 0x43, 0x05, 0xa6, 0x4f, 0xab, 0x98, 0x6d, 0xa0, 0x1e, 0x71, 0x96, 0x8d, 0x1e, 0xda, 0x15, 0x1e, 0xf1, 0x92, 0xe5, 0x80, 0x2a, 0x66, 0x36, 0xf4, 0xe2, 0xd5, 0xff, 0x0f, 0x90, + 0x72, 0x05, 0x89, 0x91, 0x6a, 0x7f, 0xc0, 0x63, 0x55, 0x66, 0xd7, 0xd7, 0x2f, 0xac, 0x84, 0x43, 0xac, 0x6a, 0x21, 0x6c, 0x97, 0x4d, 0xfd, 0x85, 0xbf, 0xfb, 0xff, 0x37, 0x72, 0xff, 0xa9, 0xb7, + 0x36, 0x74, 0x6f, 0x78, 0xbe, 0xb1, 0x8f, 0xd0, 0x93, 0x75, 0x09, 0xbe, 0x1c, 0x23, 0xc5, 0xe8, 0xa9, 0x99, 0x8c, 0x69, 0x3c, 0x7e, 0xfe, 0xb1, 0xd7, 0x76, 0x93, 0x3f, 0xb6, 0x8d, 0xb0, 0xdf, + 0x91, 0x59, 0xf2, 0x6c, 0x0b, 0xd2, 0x2c, 0xbf, 0x5d, 0xaf, 0x07, 0x95, 0xbd, 0xf7, 0xc9, 0x1f, 0x65, 0x3c, 0x18, 0x3c, 0xfd, 0x41, 0xd3, 0x45, 0xff, 0x47, 0x8f, 0x2e, 0xfe, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x81, 0xdb, 0x3b, 0xda, 0x18, 0x04, 0x00, 0x00, 0xd3, 0x10, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, + 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, + 0x61, 0x6c, 0x8f, 0xb1, 0x6e, 0xf3, 0x30, 0x0c, 0x84, 0x77, 0x3e, 0xc5, 0x8d, 0x89, 0x07, 0xfb, 0x01, 0xb2, 0xe4, 0x5f, 0x02, 0xfc, 0x05, 0x8a, 0xa2, 0x40, 0x3b, 0x74, 0x54, 0x14, 0xda, 0x16, + 0x62, 0x4b, 0xb2, 0x28, 0xb5, 0x35, 0x8a, 0xbc, 0x7b, 0x21, 0xd9, 0x4e, 0x96, 0x6a, 0x91, 0x44, 0xf2, 0xbe, 0xe3, 0x79, 0xa5, 0xaf, 0xaa, 0x63, 0xb4, 0xc9, 0xea, 0x68, 0x9c, 0x95, 0x03, 0x91, + 0x19, 0xbd, 0x0b, 0x11, 0xc6, 0xd5, 0x53, 0x52, 0xe1, 0x9a, 0xa4, 0x6e, 0x93, 0x9d, 0xe6, 0xfa, 0x94, 0xec, 0x74, 0x20, 0x6a, 0xaa, 0x8a, 0x50, 0xe1, 0xc3, 0xa5, 0x80, 0xd3, 0x2a, 0x83, 0x1e, + 0x94, 0x08, 0xa1, 0x6a, 0xc8, 0xa7, 0xf3, 0x60, 0xf4, 0x52, 0x78, 0xf4, 0x7f, 0x88, 0x00, 0xa0, 0x68, 0xf3, 0xa9, 0xf0, 0x2e, 0x8c, 0xd8, 0x33, 0x5e, 0x17, 0x8f, 0x3c, 0x3a, 0xcd, 0xe0, 0xef, + 0xc8, 0x56, 0xb2, 0xa2, 0x75, 0x01, 0xd9, 0x62, 0xdb, 0xac, 0xc6, 0x5b, 0x6f, 0xe4, 0xfe, 0x85, 0x98, 0xd1, 0x0f, 0x33, 0x58, 0xf7, 0x8e, 0x05, 0x26, 0x0a, 0x8c, 0xf5, 0x29, 0x6e, 0xf8, 0xa3, + 0x57, 0x41, 0x8d, 0x4b, 0x0d, 0x0a, 0x4f, 0xea, 0x53, 0xe1, 0xcc, 0xca, 0xde, 0xfb, 0x81, 0x63, 0x0a, 0xf6, 0x8f, 0x56, 0x53, 0xee, 0x63, 0xde, 0xa7, 0xbc, 0xd6, 0x40, 0x2f, 0x29, 0x66, 0xd4, + 0xe6, 0xbf, 0xfb, 0x5f, 0xc8, 0x85, 0xbf, 0xdf, 0xe2, 0x95, 0x88, 0x0d, 0xfe, 0x5d, 0x2e, 0x38, 0x27, 0x31, 0x96, 0x45, 0x30, 0xb8, 0xce, 0x68, 0xf4, 0x1c, 0xf8, 0x31, 0xb3, 0x7a, 0x5b, 0xfe, + 0x5a, 0xb1, 0xbb, 0xc2, 0xa9, 0x3b, 0x8e, 0xcf, 0x2c, 0xa2, 0x3a, 0xde, 0xed, 0xf7, 0x87, 0x32, 0x7e, 0x23, 0xba, 0xd1, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x48, 0x0a, + 0xe7, 0x07, 0xf9, 0x00, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x8e, 0x31, 0x0e, 0xc2, 0x30, 0x0c, 0x45, 0xf7, + 0x9c, 0xe2, 0x8f, 0xed, 0xc2, 0x05, 0x2a, 0x0e, 0xc0, 0xc0, 0xc4, 0x09, 0x42, 0x30, 0xc1, 0xa2, 0xa4, 0x51, 0xec, 0x74, 0xa9, 0x7a, 0x77, 0x54, 0x12, 0xa9, 0x54, 0x42, 0x0c, 0xf5, 0xf8, 0xff, + 0x7f, 0x4f, 0x8e, 0xd6, 0x3d, 0xad, 0x27, 0xdc, 0x73, 0x70, 0xca, 0x43, 0x90, 0xce, 0x98, 0x98, 0xaf, 0x3d, 0x3b, 0xb8, 0xde, 0x8a, 0xe0, 0x14, 0x62, 0x56, 0x4c, 0x06, 0x00, 0x62, 0xe2, 0xd1, + 0x2a, 0xe1, 0xa2, 0x89, 0x83, 0xc7, 0x8b, 0x44, 0xac, 0xa7, 0xce, 0x94, 0xb2, 0x50, 0x9f, 0x7d, 0xd3, 0x62, 0x9a, 0x7f, 0xc4, 0x5b, 0xb0, 0xad, 0xda, 0xe5, 0xf4, 0xc1, 0x72, 0xa8, 0x39, 0x8e, + 0xab, 0x7a, 0xe9, 0xb6, 0xa6, 0xea, 0xf0, 0xa4, 0xe7, 0x32, 0x6a, 0xbe, 0x3d, 0x89, 0x34, 0xa7, 0xf0, 0x8f, 0x1f, 0x07, 0xbe, 0x41, 0x56, 0x7a, 0xef, 0x4f, 0xb3, 0x79, 0x07, 0x00, 0x00, 0xff, + 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdd, 0x4f, 0x11, 0xc3, 0x8a, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, + 0x8e, 0x31, 0x0e, 0xc2, 0x30, 0x0c, 0x45, 0xf7, 0x9c, 0xe2, 0x8f, 0xed, 0xc2, 0x05, 0x2a, 0x8e, 0x80, 0x18, 0x38, 0x41, 0x08, 0x26, 0x58, 0x94, 0x34, 0x8a, 0xed, 0x2e, 0x55, 0xef, 0x8e, 0xaa, + 0x54, 0x2a, 0x95, 0x10, 0x03, 0x1e, 0xff, 0xf7, 0x7b, 0xfa, 0xd9, 0x87, 0xa7, 0x8f, 0x84, 0xbb, 0xa5, 0xa0, 0x3c, 0x24, 0xe9, 0x9c, 0xcb, 0x76, 0xed, 0x39, 0x20, 0xf4, 0x5e, 0x04, 0x67, 0xd3, + 0x6c, 0x8a, 0xc9, 0x01, 0x40, 0x2e, 0x3c, 0x7a, 0x25, 0x5c, 0xb4, 0x70, 0x8a, 0x78, 0x91, 0x88, 0x8f, 0xd4, 0xb9, 0x5a, 0x56, 0xac, 0x02, 0x4d, 0x8b, 0x69, 0xfe, 0x96, 0xef, 0xd1, 0x76, 0x15, + 0x2f, 0xa7, 0x0f, 0x96, 0xc3, 0x9a, 0xe3, 0xb8, 0xc9, 0x97, 0x6e, 0xaf, 0x5a, 0x1d, 0x91, 0xf4, 0x54, 0x9f, 0x9a, 0x4f, 0x4f, 0x21, 0xb5, 0x92, 0x7e, 0xf1, 0xe3, 0xc0, 0x37, 0xc8, 0x46, 0xff, + 0xbb, 0x69, 0x76, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xfa, 0x49, 0xd9, 0x7c, 0x8a, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, + 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x74, 0x8c, 0x41, 0x12, 0x83, 0x20, 0x10, 0x04, 0xef, 0xfe, 0x45, 0xf2, 0x02, 0x1e, 0x33, 0x45, 0x46, 0x21, 0x6e, 0x00, 0x97, + 0x25, 0x15, 0x7e, 0x9f, 0x83, 0xa5, 0x39, 0x79, 0xec, 0xe9, 0xae, 0xd9, 0x3b, 0x74, 0xeb, 0xcd, 0x2d, 0x3d, 0xef, 0xc3, 0xf1, 0x5b, 0x8b, 0x9a, 0x5f, 0x7a, 0x0e, 0x96, 0x4a, 0x9e, 0x4e, 0x5b, + 0x11, 0x36, 0xac, 0x74, 0x36, 0x2a, 0xbd, 0x70, 0x45, 0x18, 0xf3, 0x0b, 0x7a, 0xf9, 0xf6, 0x86, 0x88, 0x0e, 0xce, 0x91, 0x10, 0x8b, 0x4e, 0x4b, 0xb1, 0xb9, 0xc2, 0xa2, 0x7f, 0x1c, 0xcb, 0x6d, + 0x29, 0xe9, 0xc3, 0xcc, 0xd6, 0x8e, 0xfa, 0xa4, 0xfb, 0x63, 0xe2, 0x99, 0xfe, 0xfd, 0x85, 0xd3, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x16, 0x61, 0x9b, 0xcf, 0x6a, 0x00, 0x00, + 0x00, 0xc8, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, + 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x8c, 0x92, 0x4d, 0x6f, 0xdb, 0x30, 0x0c, 0x86, 0xef, 0xfe, 0x15, 0x9c, 0x4e, 0x32, 0x90, 0xb1, 0x59, 0xb1, 0xd3, 0x8c, 0x01, 0x2d, 0x8a, + 0x0d, 0xeb, 0xa1, 0x1b, 0x36, 0x04, 0x3b, 0xe5, 0xa2, 0xca, 0x9c, 0xa3, 0xd4, 0x91, 0x54, 0x91, 0xca, 0x50, 0x04, 0xf9, 0xef, 0x83, 0xbf, 0xd2, 0x74, 0xc9, 0x3e, 0x74, 0x31, 0x61, 0x3e, 0x14, + 0xdf, 0x97, 0x54, 0x34, 0xf6, 0xc1, 0x34, 0x04, 0x3f, 0xb2, 0xb7, 0xe2, 0x82, 0xe7, 0xaa, 0x28, 0xdc, 0x26, 0x86, 0x24, 0xe0, 0x02, 0x3e, 0x66, 0x93, 0x1e, 0x32, 0xa3, 0x10, 0x0b, 0xae, 0xb3, + 0x77, 0x82, 0x5f, 0x87, 0x5f, 0x0b, 0x62, 0xa9, 0x8e, 0xc8, 0x44, 0x2c, 0x86, 0x39, 0x27, 0xaa, 0xf1, 0x1b, 0xb1, 0x5c, 0x0f, 0xf1, 0x01, 0x09, 0xa9, 0xc1, 0x95, 0xd9, 0xd8, 0x8e, 0xc3, 0x9b, + 0x90, 0xe8, 0xce, 0x88, 0x5d, 0x51, 0xe2, 0x17, 0xc4, 0xd0, 0x62, 0x9d, 0xa3, 0x13, 0x4a, 0x68, 0xa2, 0xc3, 0x6b, 0x66, 0x4a, 0xa3, 0xb0, 0xbf, 0x82, 0x83, 0xa0, 0x89, 0x61, 0x31, 0xe2, 0xec, + 0xcb, 0xae, 0x53, 0x47, 0xa4, 0xc7, 0x6c, 0xda, 0x45, 0xa8, 0xfe, 0x0b, 0xf6, 0x41, 0x3e, 0xe7, 0xb6, 0xfd, 0x6e, 0xda, 0x4c, 0x55, 0x51, 0x5c, 0x1d, 0xf9, 0x2f, 0x62, 0xbe, 0x6f, 0x9d, 0x05, + 0xdb, 0x1a, 0x66, 0xf8, 0x38, 0x4e, 0xb0, 0xcb, 0xc0, 0xae, 0x28, 0x00, 0x00, 0xae, 0x7a, 0xac, 0x8b, 0xb6, 0xc1, 0xd5, 0xd0, 0x8d, 0x71, 0xc2, 0x74, 0x09, 0xbb, 0x3e, 0xd3, 0x9d, 0x2f, 0x59, + 0x62, 0x16, 0x08, 0xc3, 0xe7, 0x3d, 0x68, 0x4f, 0x3f, 0xe1, 0x99, 0x2c, 0x71, 0x5a, 0x4f, 0x9f, 0xb8, 0xf5, 0x31, 0x8b, 0x56, 0x9f, 0xa8, 0x6d, 0xc3, 0x2b, 0x55, 0x96, 0xd5, 0xe1, 0x9e, 0xe7, + 0x69, 0xa1, 0xe9, 0xc3, 0x0f, 0x9d, 0x55, 0x3e, 0xb0, 0xb3, 0xb1, 0x05, 0x36, 0x24, 0x77, 0xc4, 0x6c, 0x1a, 0xd2, 0x53, 0xfd, 0xfe, 0x77, 0xc9, 0xa3, 0xbb, 0x13, 0xe5, 0xb7, 0x5e, 0xa8, 0x49, + 0xe6, 0xc4, 0xc4, 0xd1, 0xda, 0xb1, 0x71, 0x5b, 0xf2, 0xba, 0x44, 0x1b, 0xbc, 0x90, 0x97, 0xc5, 0x53, 0x24, 0xad, 0x4c, 0x8c, 0xad, 0xb3, 0x7d, 0xe1, 0xc5, 0x9a, 0x83, 0x57, 0xe5, 0xa1, 0x76, + 0x3a, 0x78, 0x1f, 0xea, 0x27, 0xad, 0x76, 0x4b, 0xb5, 0x19, 0xe4, 0x2d, 0xd5, 0x3b, 0x58, 0x0e, 0xf2, 0x97, 0x6a, 0x7f, 0xae, 0x62, 0x45, 0xa6, 0xa6, 0xa4, 0x95, 0xa5, 0xd7, 0xae, 0x56, 0x33, + 0x50, 0x6f, 0x2f, 0xff, 0x81, 0x71, 0x24, 0xbb, 0xa5, 0xc4, 0x2e, 0xf8, 0x8e, 0x7f, 0x83, 0xf3, 0x73, 0x05, 0x31, 0xb0, 0x68, 0x75, 0x71, 0x2e, 0x25, 0xab, 0xde, 0x5c, 0xf7, 0x6e, 0x32, 0xdf, + 0x84, 0x9a, 0xf4, 0xe5, 0x7c, 0xfe, 0x47, 0x33, 0xa3, 0x13, 0x35, 0x83, 0xf1, 0xe1, 0x8d, 0xeb, 0x50, 0x47, 0x93, 0xdf, 0x17, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe1, + 0x2d, 0xc8, 0x7b, 0x92, 0x01, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, + 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, + 0x61, 0x76, 0x61, 0x5c, 0x8d, 0x3b, 0x8e, 0x83, 0x40, 0x10, 0x44, 0xf3, 0x3e, 0x45, 0x9d, 0x60, 0x38, 0x00, 0xc9, 0x26, 0xbb, 0x12, 0xc9, 0x46, 0x5c, 0x60, 0x18, 0x7a, 0xd9, 0x36, 0xcc, 0x0c, + 0xa6, 0xbb, 0x2d, 0x24, 0xcb, 0x77, 0xb7, 0xf0, 0x27, 0x71, 0xfa, 0x4a, 0xf5, 0xde, 0x1a, 0xd3, 0x1c, 0x27, 0xc6, 0x9f, 0x97, 0x64, 0x52, 0x8b, 0xb6, 0x44, 0x92, 0xd7, 0xba, 0x19, 0xa4, 0x86, + 0xb3, 0xc7, 0x6d, 0x76, 0x0d, 0xc6, 0x6a, 0xe1, 0xe4, 0x45, 0x2c, 0xfc, 0x46, 0x93, 0x0b, 0x77, 0x39, 0x4e, 0xdc, 0xb3, 0x5a, 0x4b, 0xf4, 0xf5, 0x81, 0x68, 0xf5, 0x61, 0x91, 0x84, 0xb4, 0x44, + 0x55, 0x3c, 0xc7, 0x9f, 0x97, 0xbe, 0xeb, 0xc1, 0xbb, 0x71, 0x19, 0x15, 0x6f, 0x74, 0x5c, 0x70, 0x25, 0x02, 0x80, 0xa6, 0xc1, 0xf7, 0xce, 0xc9, 0x8d, 0x61, 0xff, 0x0c, 0x8d, 0x99, 0x71, 0xb4, + 0x15, 0x83, 0x1b, 0xa4, 0xa0, 0x3c, 0x6c, 0xc8, 0x75, 0xe4, 0x40, 0x37, 0xba, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x3d, 0x12, 0xb7, 0x75, 0x8f, 0x00, 0x00, 0x00, 0xbe, 0x00, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0xcb, 0xbd, 0x0a, 0xc2, 0x30, 0x14, 0x06, 0xd0, 0x3d, 0x4f, + 0xf1, 0xd1, 0x51, 0xa8, 0x83, 0x63, 0xb6, 0xd0, 0xde, 0x42, 0xa0, 0x3f, 0x92, 0x44, 0xc1, 0xe9, 0x92, 0x62, 0x90, 0x4a, 0xcc, 0x10, 0x9b, 0x3e, 0xbf, 0xb8, 0x65, 0x3f, 0x67, 0x2d, 0x5b, 0x7c, + 0x52, 0x3a, 0xbe, 0x52, 0x00, 0x2d, 0x92, 0xff, 0x04, 0x89, 0x49, 0xdd, 0x69, 0x66, 0x7b, 0xd1, 0xac, 0x8c, 0xd3, 0x83, 0xea, 0x1c, 0xf7, 0xda, 0x58, 0x01, 0x00, 0x87, 0x8f, 0x25, 0x48, 0xec, + 0x3e, 0xbf, 0xc2, 0x5e, 0x9d, 0xbf, 0xb6, 0xcb, 0xcd, 0x74, 0xc4, 0x3d, 0x5d, 0xc7, 0xe5, 0x31, 0xd1, 0xec, 0x2c, 0x0f, 0x7a, 0x74, 0x64, 0xea, 0xd9, 0x9c, 0xda, 0x5c, 0x52, 0x0a, 0xf9, 0xfc, + 0xf6, 0x19, 0x71, 0x5b, 0x1b, 0xf1, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x70, 0xd9, 0x28, 0xa8, 0x76, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, + 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0xbc, 0xbd, 0xcb, 0x6f, 0x9c, 0xc9, 0x8e, 0x2f, 0xb8, 0xaf, 0xbf, 0xc2, 0xa8, 0xbb, 0xbc, 0x96, 0x3b, 0xc8, 0x60, 0x04, 0x83, 0x03, 0x34, 0x30, 0xc0, 0xac, + 0x66, 0x3f, 0xbb, 0x46, 0xc3, 0xe0, 0xd3, 0x56, 0x97, 0x2c, 0xb9, 0xf5, 0xa8, 0x47, 0xff, 0xf5, 0x83, 0x2f, 0x25, 0xd9, 0x52, 0x2a, 0x53, 0x76, 0xd5, 0x49, 0xdd, 0xb3, 0x38, 0xfe, 0x32, 0xf5, + 0x49, 0x15, 0x64, 0x30, 0x48, 0xfe, 0xf8, 0x8a, 0xff, 0xf5, 0xee, 0xff, 0xfb, 0x7c, 0x7e, 0xf3, 0xae, 0xce, 0x2f, 0xf2, 0xdd, 0xf9, 0xcd, 0x3b, 0xbd, 0xbb, 0xbd, 0xfa, 0xa2, 0xb7, 0xe7, 0xae, + 0x17, 0x17, 0x7f, 0xbd, 0xfb, 0xbf, 0x3f, 0xe5, 0x65, 0x5e, 0xeb, 0x6d, 0xc6, 0x3b, 0xfb, 0xeb, 0xdd, 0xff, 0xa3, 0xd7, 0x9f, 0xae, 0x3e, 0xfc, 0xf2, 0xbf, 0xde, 0xfd, 0xbf, 0xb7, 0xdb, 0xab, + 0x97, 0x57, 0xb7, 0xef, 0xce, 0x2f, 0x6f, 0xf3, 0x32, 0x32, 0xde, 0xd5, 0xd5, 0xf5, 0xbb, 0x2f, 0x7a, 0x79, 0xa7, 0x17, 0xef, 0x32, 0xce, 0x6f, 0xcf, 0x2f, 0x3f, 0x7d, 0xf8, 0xe5, 0xf7, 0xbc, + 0xbe, 0x39, 0xbf, 0xba, 0x7c, 0xf7, 0xef, 0xef, 0xfa, 0x2f, 0xbf, 0xfc, 0xc7, 0x7f, 0x7c, 0x55, 0xff, 0x4d, 0x3f, 0xe5, 0x7f, 0xfe, 0xe7, 0x2f, 0x97, 0xfa, 0x25, 0xdf, 0xfd, 0xfb, 0xbb, 0x5f, + 0xd5, 0x6f, 0xcf, 0xff, 0x3c, 0xf3, 0xab, 0x48, 0xff, 0xf5, 0xc9, 0xdb, 0xbf, 0xb6, 0x0f, 0xfd, 0x43, 0xfb, 0xf5, 0x97, 0x9b, 0xab, 0xbb, 0x6b, 0xdf, 0xbd, 0x78, 0x9d, 0x9f, 0xce, 0x6f, 0x6e, + 0xaf, 0xff, 0xfa, 0xdf, 0x9f, 0x6f, 0x6f, 0xbf, 0xde, 0xfc, 0x5f, 0xff, 0xf6, 0x6f, 0x9f, 0xce, 0x6f, 0x3f, 0xdf, 0xd9, 0x07, 0xbf, 0xfa, 0xf2, 0x6f, 0xd7, 0x77, 0x37, 0xb7, 0x67, 0x17, 0x7a, + 0xf9, 0xe9, 0xdf, 0x7c, 0x5b, 0xe9, 0xcd, 0x87, 0xf3, 0xab, 0xb3, 0xf3, 0xcb, 0xc8, 0x3f, 0x7f, 0xfd, 0xc5, 0x3f, 0xa7, 0xff, 0x76, 0x73, 0xf7, 0x65, 0xfb, 0x13, 0xbc, 0x02, 0x56, 0xef, 0xd6, + 0x57, 0x5f, 0x61, 0x29, 0xd2, 0xa2, 0x5a, 0x41, 0x2d, 0x36, 0xad, 0x49, 0xcd, 0x6b, 0x02, 0xcd, 0x5c, 0xb2, 0x60, 0x4e, 0xad, 0xa4, 0x06, 0xab, 0x4b, 0x80, 0xb5, 0x06, 0x39, 0xb8, 0xfd, 0xfa, + 0x4b, 0xe4, 0xd7, 0x8d, 0xd6, 0x4b, 0x3f, 0xcf, 0x9b, 0x77, 0xff, 0xfe, 0xee, 0x3f, 0x7e, 0x79, 0xf7, 0xab, 0x9d, 0xdf, 0xd6, 0x85, 0x7e, 0xba, 0xf9, 0xf5, 0xfd, 0xf6, 0xe1, 0xaf, 0xdb, 0xbc, + 0x79, 0xd7, 0x3e, 0x8c, 0x0f, 0x73, 0xf7, 0xb9, 0xee, 0x6e, 0xef, 0xae, 0xf3, 0xe6, 0xcc, 0xaf, 0xae, 0xf3, 0xd9, 0x17, 0x37, 0xe7, 0x97, 0xbf, 0xed, 0xbe, 0xb8, 0xb8, 0xfa, 0xb4, 0xfb, 0xf7, + 0xeb, 0xf9, 0xe5, 0xd9, 0xd7, 0xeb, 0xab, 0xff, 0x4a, 0xbf, 0x7d, 0xd7, 0x3e, 0xd0, 0x07, 0x5c, 0xbb, 0xaf, 0x6f, 0xaf, 0x7e, 0x3b, 0xbf, 0xfa, 0xfe, 0x74, 0x76, 0x77, 0x7b, 0x7e, 0xf1, 0xeb, + 0xfb, 0x5f, 0xfe, 0xf3, 0x75, 0x66, 0x5e, 0x5e, 0xa6, 0xdf, 0x3e, 0x63, 0x27, 0x7e, 0x68, 0x27, 0x67, 0x27, 0x30, 0xaf, 0xce, 0x0a, 0x6d, 0xcd, 0x5e, 0x30, 0x4c, 0x57, 0x74, 0xcd, 0x9e, 0x0e, + 0x58, 0xea, 0xd0, 0x44, 0x9a, 0xc8, 0x40, 0xc9, 0xc0, 0xd6, 0x56, 0x57, 0xe4, 0x8a, 0x4a, 0x24, 0xee, 0x0b, 0xa2, 0x85, 0x1f, 0x64, 0xe7, 0x53, 0x79, 0x78, 0xff, 0xed, 0xf3, 0xf5, 0xed, 0x93, + 0x0f, 0x37, 0x79, 0xfd, 0xfb, 0xb9, 0xe7, 0x93, 0x6f, 0x36, 0xae, 0xdc, 0x6f, 0x40, 0xe4, 0xf5, 0xf9, 0xef, 0xf9, 0xf1, 0xcb, 0x23, 0xbf, 0xf3, 0xfc, 0xf6, 0x73, 0x5e, 0x3f, 0x63, 0xfd, 0x03, + 0x0b, 0xdf, 0xfd, 0xba, 0x51, 0xfe, 0x6c, 0x0f, 0x6e, 0x77, 0x84, 0xc7, 0xe5, 0xcd, 0xb6, 0x13, 0xb7, 0x57, 0x7b, 0xdf, 0x5d, 0xe7, 0xcd, 0xd5, 0xc5, 0xef, 0xbb, 0x3f, 0xf6, 0x2a, 0xfb, 0x77, + 0x7f, 0xf6, 0x39, 0xef, 0xf1, 0xe4, 0xbc, 0xa7, 0x81, 0x28, 0x92, 0x8b, 0x17, 0xb0, 0xe6, 0x98, 0xdc, 0x05, 0x5a, 0x8e, 0xee, 0x48, 0x9d, 0x16, 0xb9, 0xf6, 0x65, 0xd9, 0x17, 0xae, 0xb0, 0x05, + 0x62, 0xb3, 0x01, 0x70, 0x9f, 0xe5, 0x53, 0x16, 0xe6, 0x62, 0xfa, 0x1b, 0xbc, 0x7f, 0x14, 0xa7, 0x9f, 0xde, 0x8d, 0xdb, 0xcf, 0xd7, 0xa9, 0xf1, 0xf5, 0xea, 0xea, 0xe2, 0xe0, 0x16, 0x99, 0xde, + 0xe4, 0xa4, 0x77, 0xed, 0x03, 0x6c, 0x27, 0xfc, 0xfd, 0x8b, 0x23, 0x74, 0x7d, 0x75, 0x7b, 0x71, 0x8e, 0x07, 0x8f, 0x93, 0x5f, 0x5d, 0xfd, 0x76, 0x9e, 0x0f, 0x8f, 0x5f, 0xff, 0xba, 0xc8, 0x9b, + 0x1f, 0xee, 0x7a, 0x5e, 0xfa, 0x55, 0x9c, 0x5f, 0x7e, 0xfa, 0x78, 0x7d, 0xff, 0x6a, 0x5d, 0xe8, 0x6d, 0xe2, 0xf3, 0xc3, 0xf9, 0x59, 0x2f, 0x2f, 0xf3, 0xe2, 0xf5, 0x03, 0xfb, 0x4d, 0x6a, 0xea, + 0xcf, 0xcf, 0x7a, 0xf3, 0xf9, 0x5e, 0x80, 0xf0, 0xb9, 0x1c, 0x6d, 0x0f, 0x7a, 0x7d, 0x73, 0xff, 0x8b, 0xbb, 0x4d, 0xfb, 0xa2, 0xf7, 0x3f, 0x39, 0xbf, 0xbd, 0xd2, 0x7b, 0x51, 0xd3, 0xcb, 0x4f, + 0x77, 0xfa, 0x29, 0xcf, 0x6e, 0x1f, 0xe9, 0xbd, 0xd0, 0xff, 0xf9, 0xeb, 0xe3, 0xcd, 0xed, 0xa6, 0x6f, 0x9f, 0x09, 0xe3, 0x97, 0xf3, 0x2f, 0xf7, 0x7f, 0xe8, 0x6b, 0x5e, 0x7b, 0x5e, 0xde, 0x9e, + 0x3d, 0x52, 0x72, 0xff, 0xe5, 0x13, 0x75, 0x01, 0x1f, 0xda, 0x07, 0xde, 0x7d, 0x7b, 0xad, 0x97, 0x71, 0xff, 0x90, 0x9f, 0xf2, 0xcf, 0xdd, 0xd3, 0x4d, 0x5e, 0x47, 0x7e, 0x7f, 0xfa, 0xf8, 0x5f, + 0x37, 0x57, 0x97, 0x4f, 0x3e, 0xde, 0x5d, 0x5f, 0xec, 0xfe, 0x6e, 0xde, 0xff, 0xde, 0xcd, 0x67, 0x3d, 0x83, 0xfb, 0xa7, 0x0b, 0xb5, 0xdd, 0xc3, 0xed, 0xf9, 0x97, 0x7c, 0xd7, 0x3e, 0xe0, 0x07, + 0x9c, 0x3f, 0x92, 0xfc, 0x2f, 0xea, 0xd7, 0x57, 0x37, 0x7b, 0x6a, 0x1c, 0x3e, 0xf4, 0x13, 0xcb, 0xbe, 0x91, 0xeb, 0xf2, 0x6c, 0xcd, 0x70, 0xb2, 0xd6, 0x72, 0x4f, 0xb3, 0x98, 0xc4, 0x91, 0x2d, + 0x26, 0x64, 0x9b, 0x4c, 0x36, 0x73, 0x02, 0xac, 0xe1, 0xce, 0x3a, 0x04, 0xab, 0xd6, 0x62, 0x46, 0xcb, 0x98, 0x63, 0x1c, 0x94, 0xfd, 0xff, 0xbe, 0xbb, 0xba, 0x7d, 0xe0, 0xd3, 0x5f, 0x97, 0x3f, + 0x22, 0xf4, 0xfa, 0xea, 0xee, 0x36, 0xaf, 0xf7, 0x08, 0xc5, 0x0f, 0x7c, 0x62, 0x42, 0x51, 0x03, 0x45, 0xb4, 0xb8, 0x4f, 0x92, 0x84, 0xf2, 0x25, 0x3d, 0x7b, 0xef, 0xee, 0xb5, 0x66, 0x75, 0x66, + 0x1e, 0x90, 0x26, 0xa3, 0x6a, 0xf1, 0x88, 0x26, 0x03, 0x3a, 0x0c, 0x26, 0x9f, 0x45, 0x9d, 0x06, 0x1e, 0x56, 0xb0, 0xbb, 0x33, 0x75, 0x7b, 0xfd, 0x28, 0x48, 0x2f, 0x94, 0xe0, 0x4b, 0xd1, 0x79, + 0x9d, 0x15, 0xcf, 0xed, 0x0c, 0x7c, 0x80, 0x0f, 0x70, 0x62, 0x36, 0x00, 0xf5, 0x72, 0x47, 0x01, 0xcc, 0x16, 0x10, 0x89, 0xe6, 0x45, 0x89, 0xc5, 0xd8, 0x02, 0x75, 0x36, 0xc7, 0x35, 0x07, 0xaa, + 0x11, 0xb0, 0xcc, 0x35, 0x14, 0x32, 0x61, 0x48, 0xb6, 0xb2, 0x1e, 0x86, 0xc8, 0xaf, 0xe8, 0xba, 0x07, 0x89, 0x7d, 0x7f, 0x4c, 0x77, 0x3d, 0xd3, 0x32, 0xaf, 0xe9, 0x8b, 0x6f, 0xea, 0xe1, 0xe6, + 0x8b, 0x5e, 0x5c, 0xfc, 0xfe, 0xa0, 0x40, 0x1f, 0xad, 0xf7, 0xab, 0x1c, 0xdc, 0x14, 0xe8, 0x9e, 0x30, 0x6d, 0x27, 0x9a, 0x4e, 0xcc, 0x45, 0x1a, 0xd4, 0x38, 0x67, 0x4e, 0x46, 0x57, 0x24, 0x5e, + 0x64, 0xaa, 0x73, 0xb2, 0x8f, 0xe8, 0x98, 0x05, 0x4d, 0xdc, 0x23, 0x56, 0x8c, 0x6c, 0x36, 0xd2, 0x4c, 0xb2, 0x96, 0x4e, 0x2e, 0x8a, 0x32, 0x6e, 0x2b, 0xff, 0x86, 0xc5, 0xf8, 0x69, 0x6b, 0xfd, + 0x53, 0x1c, 0xfd, 0xae, 0x10, 0xaf, 0x1e, 0xff, 0x3d, 0xbb, 0x8b, 0xfb, 0x3f, 0x70, 0x79, 0xf7, 0xe5, 0xa3, 0x7f, 0xbd, 0xbb, 0x79, 0xae, 0xb2, 0x6e, 0xae, 0xfc, 0xb7, 0xbc, 0xc5, 0x9f, 0x61, + 0xfc, 0xb6, 0xb2, 0x7d, 0xce, 0xcf, 0x13, 0x73, 0xbe, 0xb5, 0x81, 0xd4, 0x47, 0x8c, 0x05, 0x36, 0x2c, 0x57, 0x1f, 0x01, 0x50, 0x94, 0xd6, 0xcd, 0x93, 0x80, 0x7d, 0x69, 0xc1, 0x8a, 0xc5, 0x11, + 0xb5, 0xd4, 0x53, 0xa4, 0x56, 0x4e, 0xce, 0x21, 0x63, 0x2d, 0x34, 0x3b, 0xc8, 0xf9, 0x17, 0x6c, 0x3a, 0xe8, 0x40, 0xbe, 0x4a, 0xff, 0xa6, 0x07, 0x36, 0x35, 0xb0, 0x4f, 0xff, 0xa9, 0xcf, 0x2f, + 0x31, 0x76, 0xd9, 0x3c, 0x12, 0x16, 0x51, 0x63, 0xca, 0x9c, 0xba, 0x54, 0x28, 0xc0, 0x73, 0x0d, 0x6e, 0x40, 0x86, 0xea, 0x7d, 0x16, 0x12, 0x16, 0xb7, 0xea, 0xc5, 0x43, 0xe7, 0xac, 0x29, 0x90, + 0x2c, 0xf0, 0x9a, 0x9f, 0xf8, 0xe2, 0xfc, 0xbe, 0x10, 0xbd, 0x07, 0x37, 0xe0, 0xa5, 0x2c, 0x3e, 0x8a, 0xd5, 0x4f, 0x0a, 0xcb, 0x13, 0xc5, 0xb0, 0x0f, 0x53, 0x4e, 0x6d, 0xdf, 0x02, 0x9b, 0x54, + 0xa3, 0x68, 0x0d, 0xd7, 0x20, 0x13, 0xad, 0xe8, 0x4c, 0xbd, 0x75, 0x54, 0x64, 0x6b, 0x73, 0xc2, 0x58, 0x6b, 0xd3, 0x75, 0xc3, 0x6a, 0x44, 0xeb, 0x73, 0x21, 0x05, 0x88, 0x3a, 0xba, 0xb7, 0xec, + 0x87, 0x61, 0xca, 0xbe, 0x8b, 0x74, 0xe8, 0xe8, 0x1d, 0x73, 0x45, 0x9e, 0x9d, 0xb2, 0xaf, 0x7a, 0xfd, 0xdb, 0xe6, 0x4f, 0x5d, 0x5c, 0xdd, 0xb3, 0xfa, 0x99, 0xc6, 0x7c, 0x9d, 0x85, 0x17, 0x37, + 0x6f, 0x8e, 0x49, 0x36, 0xc5, 0x26, 0xc6, 0xc1, 0x7d, 0x82, 0xd7, 0x18, 0xad, 0xeb, 0x68, 0x94, 0x96, 0xe0, 0xd0, 0x56, 0x9b, 0x4b, 0x66, 0x4d, 0x48, 0x99, 0xe9, 0x2a, 0xca, 0x7d, 0xb4, 0xc4, + 0xde, 0x1a, 0xa8, 0x2b, 0xc3, 0xa8, 0xc3, 0x67, 0xed, 0xb0, 0x96, 0xfb, 0x19, 0xc5, 0xf6, 0x33, 0x70, 0xed, 0xfe, 0xb7, 0xde, 0x9c, 0x31, 0x29, 0x0d, 0x31, 0xd2, 0xc7, 0x9c, 0x1d, 0x03, 0x82, + 0x85, 0x25, 0x87, 0x68, 0x01, 0x55, 0x1b, 0xc2, 0x8a, 0x4b, 0x57, 0x6f, 0x2a, 0x0e, 0xce, 0x95, 0xbe, 0x0c, 0x3b, 0x72, 0x9a, 0x14, 0x4c, 0x1b, 0xfa, 0x37, 0x18, 0x73, 0x54, 0xfd, 0xbf, 0x0a, + 0x95, 0x0f, 0x20, 0xb5, 0x43, 0x66, 0xe1, 0x1b, 0x70, 0x3e, 0x6a, 0x27, 0x8e, 0x20, 0xe9, 0x07, 0xeb, 0xf0, 0xea, 0x56, 0xfc, 0x91, 0xf6, 0x6c, 0x23, 0xfa, 0x87, 0xfe, 0x01, 0x4f, 0xbc, 0x11, + 0x39, 0x09, 0x82, 0x14, 0x18, 0x93, 0x4b, 0xb5, 0xad, 0x89, 0x48, 0xa0, 0xd8, 0xaa, 0xa8, 0xa0, 0x86, 0x5a, 0x53, 0x63, 0x47, 0x96, 0x6a, 0xcd, 0x31, 0x68, 0x2c, 0x36, 0x66, 0x5a, 0x9d, 0x98, + 0x6d, 0xcd, 0xbf, 0xb1, 0x11, 0xdf, 0x7c, 0xbb, 0x63, 0xca, 0xf2, 0xde, 0x8d, 0xfd, 0x27, 0xda, 0xf3, 0xb9, 0x05, 0x79, 0xff, 0x3a, 0xf6, 0xbb, 0xbd, 0xb8, 0x39, 0x78, 0x4a, 0xbe, 0x31, 0x7d, + 0xb7, 0xf2, 0x4f, 0x79, 0x0f, 0x4c, 0xf4, 0x0f, 0x3f, 0x28, 0x20, 0x2f, 0x40, 0xde, 0x3e, 0xb2, 0xfb, 0x57, 0xe1, 0xdc, 0x4b, 0xe4, 0x75, 0x18, 0x64, 0xfd, 0x53, 0x6c, 0xf5, 0xcd, 0xd0, 0xec, + 0x83, 0xaa, 0xed, 0xf3, 0xe5, 0x5f, 0x8f, 0x4e, 0xe3, 0xdd, 0xf5, 0x0f, 0x55, 0xc6, 0x53, 0x96, 0x3d, 0xb7, 0x46, 0x74, 0x72, 0xc5, 0xa1, 0x81, 0xb3, 0x98, 0x9b, 0xf4, 0xde, 0x7b, 0xb6, 0x64, + 0x9f, 0x55, 0x39, 0x36, 0x9d, 0xda, 0xc7, 0xc2, 0x90, 0xb6, 0x14, 0x1a, 0x25, 0xd1, 0x62, 0xec, 0x99, 0x3e, 0x83, 0x7a, 0xb4, 0x65, 0x8d, 0x37, 0xc7, 0xfd, 0xb0, 0x46, 0xfd, 0x7a, 0x7d, 0xe5, + 0xf7, 0xf2, 0x78, 0xcf, 0x8f, 0x9f, 0x45, 0x5f, 0x71, 0x71, 0xc0, 0x53, 0x3e, 0xf5, 0x09, 0x2d, 0x9c, 0xd8, 0x60, 0x36, 0xf2, 0xc5, 0x06, 0xd9, 0xc0, 0xa2, 0x87, 0xac, 0x5a, 0x31, 0x42, 0x74, + 0x95, 0x9b, 0x2d, 0x18, 0xb9, 0x3c, 0xc3, 0x08, 0xaa, 0xdc, 0x2d, 0x8d, 0xac, 0x86, 0x74, 0xed, 0xa3, 0xf2, 0xd7, 0x23, 0x8b, 0xff, 0x7c, 0xb5, 0xc9, 0xa1, 0xde, 0x9c, 0xfb, 0x6f, 0x7b, 0xbb, + 0xc6, 0x1f, 0x60, 0x9d, 0x98, 0x08, 0xc8, 0xce, 0x5e, 0x31, 0x92, 0xe7, 0x60, 0x0d, 0xa5, 0x51, 0x4c, 0x18, 0x33, 0x45, 0x5c, 0x07, 0xaf, 0x35, 0x56, 0xb3, 0xe1, 0x03, 0x25, 0x9c, 0x57, 0x69, + 0x01, 0xa4, 0xe7, 0x0c, 0xe7, 0x86, 0x73, 0xcc, 0x3a, 0xb8, 0x6d, 0x5f, 0xf2, 0x8b, 0x7f, 0x7e, 0x2d, 0x00, 0x76, 0xf3, 0xd7, 0xa5, 0x9f, 0xdd, 0x5e, 0xeb, 0xf9, 0xed, 0x8b, 0x28, 0xc0, 0x38, + 0xb5, 0x60, 0x36, 0x93, 0x95, 0x8b, 0xcc, 0x8c, 0xdc, 0x3c, 0x42, 0x38, 0x14, 0xa4, 0x99, 0x36, 0x1f, 0x4b, 0xc1, 0xac, 0x45, 0xa2, 0x43, 0x45, 0x4d, 0x8e, 0x0d, 0x10, 0x82, 0x60, 0x06, 0xcf, + 0xa9, 0xe9, 0xca, 0x88, 0x27, 0x15, 0xcc, 0xdb, 0xdb, 0xbf, 0x5e, 0x84, 0x03, 0xe0, 0xd4, 0x10, 0x2e, 0xc4, 0xba, 0x58, 0xc2, 0x62, 0x6e, 0x01, 0x40, 0x08, 0x1e, 0x06, 0x26, 0x42, 0xac, 0x34, + 0x22, 0x7a, 0x75, 0x4e, 0xe9, 0x4d, 0xd0, 0xad, 0x3a, 0xf3, 0x04, 0x5a, 0xb8, 0xb4, 0x83, 0xc4, 0xa8, 0xcc, 0x75, 0x90, 0xe2, 0xcf, 0x79, 0xfd, 0xe5, 0xfc, 0xf6, 0x4c, 0xed, 0xfc, 0x5e, 0x09, + 0x9e, 0xdb, 0xbd, 0x1a, 0xfa, 0xe3, 0xfc, 0x52, 0xbf, 0x9e, 0xbf, 0xdb, 0x1c, 0x5c, 0x79, 0x85, 0xf0, 0xbb, 0xdb, 0x2b, 0xaf, 0xb7, 0xc7, 0x10, 0x1e, 0xd6, 0x3a, 0x44, 0xf0, 0x4a, 0x5c, 0xdc, + 0x61, 0x43, 0x4b, 0x63, 0xba, 0xaf, 0xaa, 0x2c, 0xd2, 0x55, 0x7d, 0xba, 0xe2, 0xf4, 0xbe, 0x2a, 0x31, 0x92, 0x5b, 0x1b, 0xd4, 0x73, 0x22, 0xd7, 0x52, 0x9a, 0xa4, 0xc7, 0xce, 0xe4, 0x1f, 0xfe, + 0xc2, 0xf3, 0x3a, 0xb5, 0x3b, 0x6f, 0x7d, 0x41, 0x92, 0xb4, 0x64, 0x6b, 0x5e, 0xde, 0x39, 0xcd, 0x37, 0x2c, 0x2e, 0xd6, 0x08, 0x7a, 0xac, 0x26, 0x3d, 0x8b, 0x7a, 0x00, 0x29, 0x25, 0x31, 0x71, + 0x5b, 0xbd, 0xb8, 0x94, 0x58, 0x25, 0xa7, 0xc0, 0x3f, 0x37, 0xf8, 0xc7, 0x1d, 0xb1, 0x97, 0x21, 0xd8, 0xfd, 0x48, 0x6b, 0x7d, 0x3a, 0x3b, 0xaf, 0x9d, 0xd5, 0x6b, 0x07, 0xad, 0xef, 0x0b, 0xcb, + 0xfa, 0x73, 0x71, 0xcb, 0x6f, 0x11, 0xca, 0xbf, 0x63, 0x3b, 0x8f, 0xc8, 0xde, 0x46, 0xc5, 0xd9, 0x9f, 0x2f, 0x8e, 0xdd, 0xa9, 0x35, 0xa9, 0xd2, 0x40, 0xa8, 0x9e, 0x3d, 0x5a, 0x87, 0xce, 0x6d, + 0xb2, 0x58, 0x37, 0xa0, 0x66, 0x69, 0x7d, 0x46, 0x25, 0xad, 0x06, 0xd6, 0x44, 0x9d, 0x39, 0x7b, 0xf3, 0x09, 0x42, 0x50, 0xc2, 0x51, 0x3d, 0x0b, 0x97, 0x1d, 0x11, 0xbd, 0xfb, 0x3d, 0xd8, 0x57, + 0x93, 0x78, 0x72, 0xf1, 0xeb, 0x44, 0x50, 0xad, 0xd8, 0x1a, 0xf2, 0x5a, 0x29, 0xb4, 0x92, 0xb8, 0x68, 0xb0, 0x6b, 0x83, 0x82, 0xe0, 0x9c, 0x21, 0xe8, 0x53, 0xba, 0x39, 0x74, 0x74, 0x44, 0x6b, + 0x8b, 0xa3, 0x03, 0x81, 0xb7, 0x5e, 0xf5, 0xb7, 0x96, 0x7f, 0xfa, 0x9c, 0x9d, 0x34, 0x8a, 0x4a, 0xf5, 0xd1, 0xaa, 0x7b, 0xa8, 0x29, 0xae, 0xf2, 0x59, 0x83, 0x2b, 0x3c, 0xc2, 0x78, 0x14, 0x49, + 0xc6, 0x84, 0x4e, 0x73, 0xf2, 0x54, 0x5e, 0x4e, 0x9b, 0x7b, 0x32, 0x16, 0xf3, 0x6a, 0x58, 0x71, 0x6c, 0xf9, 0x8f, 0x50, 0xe4, 0xb9, 0xe2, 0xc2, 0xd3, 0x2b, 0xae, 0x82, 0x48, 0xac, 0x5c, 0xce, + 0xc3, 0x1c, 0x68, 0x28, 0xd6, 0x60, 0xd6, 0x08, 0x19, 0x50, 0x0b, 0x3a, 0xad, 0x25, 0x46, 0x2c, 0x23, 0x88, 0x69, 0x4e, 0x1d, 0xa4, 0xc3, 0x17, 0xcd, 0x98, 0x02, 0x53, 0xfa, 0xb1, 0xf5, 0x5f, + 0x5c, 0xf9, 0x6f, 0x67, 0x76, 0x57, 0xf5, 0x22, 0x0e, 0x2d, 0x27, 0xdf, 0x03, 0x82, 0x81, 0x00, 0xb3, 0x36, 0xef, 0x21, 0x34, 0x0c, 0x05, 0x34, 0x61, 0x95, 0x43, 0x7a, 0x1f, 0x3c, 0x32, 0x66, + 0x2c, 0x72, 0x94, 0x49, 0x18, 0xc2, 0x4b, 0x5a, 0x91, 0x91, 0x76, 0x02, 0x46, 0xe1, 0x3c, 0x9c, 0x6c, 0xda, 0xa5, 0x95, 0xcf, 0xfd, 0x4c, 0xaf, 0xaf, 0xf5, 0xaf, 0x57, 0x0e, 0xf9, 0x2e, 0x1d, + 0x74, 0x76, 0xf3, 0xd7, 0x7e, 0x5e, 0xe1, 0xf4, 0xc8, 0x8c, 0x88, 0x46, 0xa4, 0xca, 0x28, 0x72, 0x34, 0x02, 0x8f, 0x1c, 0xec, 0x2e, 0x95, 0x89, 0x7d, 0x6a, 0x52, 0x98, 0xe6, 0x5a, 0xb1, 0x79, + 0x80, 0x61, 0xc4, 0xa3, 0x95, 0x83, 0xd9, 0x88, 0x35, 0x55, 0xd3, 0xe3, 0x20, 0x99, 0xee, 0x4f, 0xcd, 0xea, 0xab, 0x44, 0xe2, 0x9b, 0x53, 0xd8, 0xdc, 0x5a, 0x9f, 0xde, 0x53, 0x23, 0x7b, 0x93, + 0x05, 0xc3, 0x61, 0x44, 0x98, 0x7a, 0xfa, 0x30, 0x44, 0xa7, 0x80, 0xea, 0xb2, 0xba, 0x32, 0x93, 0x1a, 0xa6, 0x3a, 0x66, 0x4f, 0x49, 0x5d, 0x63, 0xcc, 0x23, 0x31, 0xe0, 0x27, 0x3b, 0xf4, 0x13, + 0x94, 0xde, 0x7d, 0xf9, 0xaa, 0x17, 0x57, 0x7b, 0x28, 0x9b, 0x4f, 0x2e, 0xb2, 0xe2, 0x43, 0x92, 0xb5, 0x1a, 0xa0, 0x33, 0xf4, 0x1a, 0xb8, 0x7d, 0xec, 0xb9, 0xed, 0x68, 0x8a, 0x6d, 0xae, 0x44, + 0xac, 0xb1, 0x82, 0x6c, 0x00, 0x0a, 0xf6, 0xd9, 0xb0, 0x98, 0xe6, 0x06, 0x5b, 0x9a, 0xcc, 0x0e, 0xc7, 0x8e, 0xdd, 0x5f, 0xb7, 0x79, 0x75, 0x1d, 0x2f, 0x40, 0x08, 0x9d, 0x5c, 0x6d, 0x03, 0x39, + 0x2c, 0xf1, 0xd1, 0xa3, 0xc9, 0x12, 0x1a, 0x24, 0xe2, 0x51, 0xca, 0xe9, 0x3e, 0xfb, 0x98, 0xec, 0xd5, 0xd7, 0x9a, 0xd6, 0x7b, 0x47, 0xeb, 0x80, 0x3a, 0x8c, 0xc6, 0x1a, 0xb1, 0xa2, 0xeb, 0xd4, + 0x09, 0xed, 0x15, 0x02, 0xf6, 0x4f, 0xd2, 0x38, 0x7d, 0xc4, 0x3b, 0xc9, 0xd3, 0xe7, 0xaa, 0xd6, 0xab, 0x63, 0x12, 0x09, 0x12, 0xaf, 0xce, 0x32, 0x16, 0xb4, 0xd2, 0xd1, 0x94, 0x5b, 0x1f, 0xb1, + 0x7c, 0xa5, 0x25, 0x6f, 0x50, 0x44, 0x37, 0x3b, 0xe4, 0xdc, 0x7a, 0x99, 0xf6, 0xf5, 0xd3, 0x8b, 0x7f, 0x0b, 0x57, 0xd3, 0xb8, 0x35, 0x4f, 0xea, 0x3c, 0x1b, 0x41, 0x78, 0x34, 0xed, 0xc8, 0x15, + 0xad, 0x09, 0x3b, 0x41, 0x93, 0xc1, 0xd4, 0x9d, 0x7c, 0x69, 0xad, 0xb5, 0x18, 0xe7, 0x10, 0xc2, 0x1d, 0x7e, 0x6a, 0xcd, 0xa2, 0xd1, 0xab, 0x9c, 0xbf, 0xcf, 0xbb, 0xed, 0x53, 0x70, 0x72, 0xe1, + 0x6f, 0xdc, 0xa6, 0x29, 0x48, 0x0a, 0x9b, 0x34, 0x5e, 0x33, 0x41, 0xc2, 0x5b, 0x8c, 0x44, 0xb5, 0x58, 0xad, 0xb5, 0x15, 0x22, 0x41, 0xde, 0x7c, 0x04, 0x68, 0x34, 0x1b, 0xc9, 0xe8, 0xe9, 0xec, + 0x24, 0x74, 0x58, 0x91, 0xdd, 0x7b, 0x88, 0xf7, 0x0c, 0x3f, 0x7a, 0xbc, 0xdd, 0x5f, 0x66, 0x53, 0x4e, 0xed, 0x8f, 0x91, 0x32, 0x3a, 0x12, 0x39, 0x54, 0x91, 0xb0, 0x32, 0x4d, 0xe5, 0x84, 0xb2, + 0xcd, 0x85, 0xb6, 0x68, 0x8b, 0xb0, 0xa5, 0x87, 0x72, 0xf3, 0x55, 0x38, 0x9c, 0x01, 0xb0, 0x90, 0x17, 0xcc, 0x81, 0xc1, 0x8b, 0x8f, 0xec, 0xcf, 0xbd, 0xc7, 0xfb, 0x02, 0xb6, 0xc2, 0xa9, 0x37, + 0x87, 0x78, 0x0d, 0x8b, 0x00, 0x97, 0x69, 0xa8, 0x8b, 0xa6, 0xa1, 0x05, 0xbb, 0x37, 0xcc, 0x35, 0x6d, 0x5a, 0x0f, 0x2b, 0xa0, 0xe4, 0x1c, 0x9d, 0x68, 0x3a, 0xd5, 0x20, 0x17, 0xd4, 0x3e, 0xa1, + 0x51, 0x5b, 0x1b, 0x6c, 0xfd, 0xd9, 0xe5, 0xbf, 0x85, 0x68, 0x99, 0x6e, 0xfe, 0x0c, 0xf5, 0x2e, 0xbc, 0x4b, 0x43, 0x98, 0xb7, 0x09, 0x92, 0xdd, 0xcd, 0x1b, 0x60, 0xcb, 0x1c, 0x0b, 0xd3, 0x8c, + 0xc9, 0x46, 0x37, 0xca, 0xb2, 0x62, 0x01, 0x60, 0x0b, 0x0c, 0xa5, 0x76, 0xd4, 0x1d, 0xf3, 0xcf, 0xd7, 0x57, 0x97, 0x57, 0x2f, 0x62, 0x59, 0x20, 0x27, 0x5e, 0xfe, 0xe4, 0xa6, 0x31, 0x97, 0x4b, + 0x5b, 0xcb, 0x51, 0x65, 0x76, 0x55, 0x45, 0x59, 0x6e, 0x7d, 0xca, 0x5c, 0xcb, 0xab, 0x97, 0xd0, 0x1c, 0x9e, 0x23, 0x31, 0xc8, 0x15, 0x5a, 0xce, 0x6c, 0x4d, 0x96, 0x82, 0x27, 0xf7, 0x83, 0x27, + 0xe3, 0x1b, 0x64, 0xbe, 0xbc, 0xfb, 0x72, 0x76, 0x7e, 0x79, 0x9b, 0x9f, 0x1e, 0xc2, 0xa6, 0xdb, 0xe7, 0x5d, 0x30, 0xe4, 0x66, 0x0f, 0xf2, 0x3c, 0x84, 0xff, 0xe0, 0x03, 0xf5, 0xbf, 0x81, 0xb5, + 0xfd, 0xe2, 0xea, 0x2e, 0xf2, 0xf7, 0xbc, 0xbc, 0xbd, 0x39, 0xbb, 0x89, 0xfd, 0x18, 0xd2, 0xe9, 0x23, 0x7f, 0x50, 0x6b, 0x36, 0x9e, 0x15, 0x3d, 0x96, 0x77, 0xef, 0x44, 0x52, 0x28, 0x1b, 0xe6, + 0x26, 0x88, 0xb1, 0x3a, 0x8c, 0x46, 0x8b, 0xdb, 0xc4, 0xd6, 0x98, 0x7b, 0x63, 0x87, 0x70, 0xd3, 0x94, 0xe2, 0x35, 0xa1, 0xf4, 0x70, 0x1e, 0xea, 0x7b, 0xa0, 0x7d, 0x07, 0x4d, 0x9f, 0x04, 0x8c, + 0x9e, 0x03, 0xd3, 0x0d, 0x08, 0xbd, 0x3f, 0x9c, 0x33, 0x78, 0xd4, 0x41, 0xdf, 0xc4, 0xe6, 0x1e, 0x9f, 0x5e, 0xe4, 0x27, 0xbd, 0xcd, 0x33, 0xbd, 0xbd, 0x7d, 0x96, 0x45, 0xd8, 0x3d, 0x7f, 0xbe, + 0xba, 0xb9, 0xdd, 0xd8, 0x78, 0xef, 0xa1, 0xec, 0xa5, 0xb9, 0x8e, 0x43, 0xd1, 0x4b, 0xad, 0xbb, 0xdd, 0xd3, 0x7d, 0x4c, 0xf6, 0xdd, 0xaf, 0x77, 0x77, 0xe7, 0xf7, 0xf0, 0xf5, 0x8f, 0xb4, 0x07, + 0x8f, 0xe7, 0xd8, 0x66, 0x5d, 0x5d, 0xde, 0xdc, 0x7e, 0xac, 0x97, 0xf1, 0xd9, 0x53, 0xab, 0xc3, 0x12, 0xf4, 0xd2, 0x56, 0x31, 0xa6, 0x34, 0xeb, 0x5e, 0xcb, 0x21, 0x0b, 0x5d, 0xcd, 0x42, 0x8c, + 0xb3, 0x10, 0x4b, 0x47, 0xf7, 0x1a, 0x09, 0x25, 0x68, 0x6d, 0x40, 0xeb, 0x35, 0x63, 0x04, 0x78, 0xcd, 0x3c, 0xaa, 0x0e, 0xaf, 0x2e, 0x7f, 0xcf, 0xeb, 0xdb, 0x8f, 0xae, 0x37, 0xf9, 0xe6, 0x92, + 0x36, 0x91, 0x46, 0x0c, 0xd1, 0x9e, 0x0b, 0x95, 0xcb, 0x11, 0xd8, 0xc7, 0xc2, 0xa5, 0x73, 0x0a, 0x86, 0xf9, 0x8c, 0xb2, 0xd9, 0xb5, 0xf9, 0x76, 0x72, 0x49, 0xc6, 0x44, 0x28, 0x36, 0x09, 0x16, + 0x6e, 0xa4, 0xed, 0x58, 0xc4, 0xf5, 0xa1, 0x5c, 0x6c, 0x4f, 0xa5, 0xd3, 0xc9, 0x4b, 0x2b, 0x5a, 0xd7, 0x11, 0x6c, 0x08, 0x0b, 0xc5, 0x9c, 0x8d, 0xac, 0x88, 0x07, 0xa9, 0xf0, 0x52, 0x24, 0xd0, + 0x1c, 0x94, 0x3a, 0xc6, 0xa6, 0x00, 0x05, 0xcd, 0xb0, 0x21, 0xcc, 0x1c, 0xd4, 0x64, 0x16, 0x99, 0x8c, 0xc3, 0x11, 0x9e, 0x83, 0xe1, 0x93, 0xfd, 0xbc, 0xc1, 0x03, 0x65, 0x1f, 0x77, 0xab, 0x79, + 0x4d, 0x18, 0x1f, 0xca, 0x58, 0x5e, 0x04, 0x65, 0x4f, 0xcc, 0x09, 0xc5, 0x28, 0x99, 0xad, 0x36, 0x4c, 0x24, 0x86, 0x9b, 0x8f, 0xdd, 0x91, 0xa5, 0xd7, 0x66, 0x33, 0xd2, 0x06, 0x21, 0xbb, 0xa7, + 0x01, 0x4e, 0x17, 0x14, 0x26, 0x56, 0x9c, 0x0b, 0xbb, 0x5a, 0xcb, 0xb4, 0xd1, 0xe7, 0xb1, 0x8d, 0xfc, 0x7a, 0x57, 0xa9, 0xf7, 0xc7, 0x79, 0x9f, 0x84, 0x53, 0x6f, 0x66, 0x46, 0x6b, 0x3e, 0xd9, + 0x6d, 0x44, 0x53, 0x8e, 0x49, 0x4a, 0x54, 0x53, 0x03, 0xe7, 0x5c, 0x61, 0x9c, 0x3c, 0x7a, 0xeb, 0x00, 0x11, 0xa3, 0xa7, 0xb2, 0x98, 0x07, 0x95, 0x35, 0x44, 0x9f, 0x24, 0x00, 0x7e, 0x38, 0xc8, + 0xfa, 0x3a, 0x28, 0xf2, 0x6b, 0xef, 0x58, 0x7a, 0xb3, 0x5f, 0x4a, 0x75, 0xfa, 0x68, 0xc4, 0x02, 0x18, 0xb3, 0xd2, 0x73, 0x91, 0xda, 0x54, 0x29, 0xd4, 0x0a, 0x83, 0x26, 0x9e, 0x5d, 0x73, 0x30, + 0x27, 0xa1, 0x01, 0xe2, 0x22, 0x82, 0x8c, 0x0c, 0x11, 0x0b, 0xe6, 0x9a, 0xc8, 0x32, 0xba, 0xc1, 0xe1, 0x2c, 0xf0, 0x5e, 0xac, 0xf0, 0x08, 0x91, 0xcf, 0x15, 0xf4, 0x7e, 0xd0, 0xee, 0xd4, 0x86, + 0x3e, 0x93, 0x93, 0x53, 0x5b, 0x98, 0x52, 0x63, 0x42, 0x89, 0x05, 0x33, 0x57, 0xf6, 0x15, 0xa1, 0xa0, 0x34, 0xd9, 0x83, 0x89, 0x3b, 0x33, 0x62, 0xa1, 0xbb, 0xaf, 0xd4, 0x9c, 0x8d, 0x50, 0x14, + 0xb4, 0xeb, 0x49, 0xb3, 0x56, 0x4f, 0x43, 0xa7, 0x7b, 0xa1, 0x1a, 0x39, 0x7d, 0x92, 0x60, 0xb8, 0xb3, 0x89, 0x67, 0x41, 0xf6, 0x01, 0x73, 0xb6, 0x1c, 0x44, 0x5d, 0x90, 0x92, 0x8a, 0xba, 0x1a, + 0x8e, 0x32, 0xcb, 0xe8, 0x29, 0x3a, 0xaa, 0x0d, 0x8c, 0xea, 0x93, 0x39, 0xd2, 0x28, 0xa6, 0x75, 0x3c, 0x6c, 0xb5, 0x9f, 0x59, 0x83, 0xf7, 0xff, 0x02, 0x2b, 0xce, 0x3f, 0xe5, 0xcd, 0x7e, 0x6e, + 0xe8, 0xf4, 0x01, 0xab, 0xe8, 0x11, 0xb3, 0x05, 0xb4, 0xd5, 0x74, 0xb0, 0xb6, 0xa1, 0xd6, 0x3a, 0x76, 0xe6, 0x46, 0x92, 0x6d, 0x08, 0x10, 0x8c, 0xd8, 0x70, 0xb3, 0x56, 0x70, 0xc3, 0xd5, 0xc7, + 0x0c, 0xab, 0xee, 0x3e, 0xc3, 0xad, 0xcd, 0xc3, 0x39, 0xf6, 0x9f, 0x0c, 0x58, 0xc5, 0xf9, 0x8d, 0xeb, 0x75, 0xbc, 0xf0, 0xc4, 0x4f, 0xbd, 0xcf, 0x08, 0x18, 0xad, 0x06, 0x0f, 0x72, 0x9b, 0x3c, + 0x45, 0x3a, 0x17, 0x8d, 0x06, 0xee, 0x2d, 0x27, 0x17, 0x15, 0xd1, 0xea, 0xbe, 0x02, 0xbd, 0x27, 0xa4, 0x20, 0x66, 0x4a, 0x86, 0x25, 0xa9, 0x91, 0xb3, 0x1f, 0x83, 0xa9, 0x71, 0xe5, 0x67, 0x7e, + 0xf5, 0xe5, 0x4b, 0x5e, 0xee, 0x6f, 0xd3, 0xe9, 0x0b, 0x9d, 0x2a, 0x95, 0xc0, 0x4c, 0x3b, 0x86, 0x4c, 0xb1, 0x01, 0x5d, 0x84, 0x79, 0x20, 0xf7, 0x31, 0xdb, 0x68, 0x83, 0xcc, 0x5b, 0x94, 0x0a, + 0x1a, 0xf9, 0x98, 0x56, 0x00, 0x4b, 0x0a, 0x13, 0x98, 0x2c, 0x59, 0x8f, 0xc6, 0x38, 0x1e, 0x2a, 0x49, 0x9e, 0x6f, 0xc0, 0x3c, 0xb9, 0x2e, 0x4d, 0x5e, 0x41, 0x05, 0xee, 0xa4, 0xd9, 0xbb, 0x59, + 0x39, 0x0c, 0xce, 0x18, 0x31, 0x74, 0x64, 0x75, 0x73, 0x14, 0x44, 0xee, 0xad, 0xc7, 0x90, 0xb1, 0x26, 0x44, 0x1a, 0xf6, 0x55, 0x9e, 0x4e, 0x29, 0x34, 0x8e, 0x39, 0x5e, 0x4f, 0xcb, 0x1a, 0x9e, + 0x6f, 0xc0, 0xfa, 0x80, 0xa7, 0x76, 0x1e, 0x57, 0x8b, 0x6a, 0x48, 0x65, 0x3e, 0xd4, 0x57, 0xab, 0xc5, 0x51, 0x59, 0x2d, 0xa4, 0x06, 0x36, 0x51, 0x1c, 0x58, 0xa8, 0x24, 0x5c, 0x5c, 0x84, 0x42, + 0xe4, 0x55, 0x48, 0xb1, 0x70, 0x74, 0x57, 0x6f, 0xf3, 0x70, 0x29, 0xf5, 0xcf, 0xd9, 0x83, 0xdc, 0xd0, 0x91, 0xde, 0x9c, 0x9d, 0x5f, 0x5e, 0xbe, 0x08, 0x61, 0x9f, 0x5e, 0xd4, 0xd8, 0x47, 0xb5, + 0x26, 0x53, 0x05, 0x02, 0xa1, 0xc1, 0x90, 0xf4, 0x34, 0xac, 0xcd, 0x2b, 0x76, 0x0a, 0x85, 0xd5, 0xd7, 0x52, 0xe0, 0x96, 0x90, 0xdd, 0x53, 0x68, 0xa9, 0xba, 0xf8, 0xaa, 0x30, 0xab, 0x21, 0x87, + 0x09, 0x7d, 0x70, 0xba, 0xfe, 0xb1, 0x36, 0xcc, 0xcb, 0xdf, 0x3f, 0x5e, 0x5c, 0x7d, 0xfa, 0xf4, 0x82, 0x7e, 0x3e, 0xb9, 0xb0, 0x12, 0x8d, 0x4d, 0x46, 0xcd, 0xba, 0x59, 0x77, 0x28, 0x05, 0x8e, + 0xed, 0x2c, 0x51, 0xf6, 0x65, 0x66, 0x5a, 0xab, 0xcb, 0x34, 0x5d, 0x08, 0xd2, 0x9d, 0xdc, 0xc0, 0x26, 0xd1, 0x08, 0x06, 0xd8, 0xfe, 0xe9, 0x47, 0xaa, 0x8e, 0x6e, 0x6f, 0xff, 0xba, 0x87, 0x57, + 0x77, 0x5f, 0xf4, 0xf2, 0xf6, 0x31, 0xf1, 0xf7, 0xb2, 0x92, 0xfc, 0x36, 0xaf, 0xbf, 0xf8, 0xd5, 0xc5, 0xd5, 0x2b, 0xa5, 0x03, 0x0f, 0x7d, 0x19, 0xfb, 0x5a, 0x13, 0x4f, 0x6d, 0x1a, 0x3c, 0xba, + 0xa6, 0x8f, 0x1e, 0x09, 0xad, 0x52, 0x66, 0x70, 0x2c, 0x1f, 0x73, 0xa4, 0x01, 0x17, 0xfa, 0x5c, 0x6c, 0x36, 0x06, 0x2c, 0xc5, 0x74, 0x1a, 0xdd, 0x86, 0x01, 0x0e, 0x94, 0x49, 0x03, 0xa7, 0x5a, + 0x1e, 0x31, 0x8f, 0xfb, 0xd9, 0xd2, 0xef, 0x1e, 0xdd, 0xfb, 0xa7, 0x01, 0x82, 0x2f, 0xe7, 0x97, 0xe7, 0xff, 0xf3, 0xf1, 0xea, 0xcf, 0xf3, 0xd7, 0xea, 0xea, 0xeb, 0xf2, 0xf7, 0x17, 0x6c, 0x38, + 0x75, 0x67, 0x41, 0x2f, 0xc9, 0x74, 0x81, 0x15, 0xbd, 0x90, 0xda, 0x94, 0x48, 0x37, 0xd1, 0x82, 0x31, 0xc8, 0x35, 0xd8, 0xd7, 0x6a, 0x89, 0xa1, 0x48, 0x2a, 0x5a, 0xb1, 0x96, 0xba, 0xb6, 0xd6, + 0x46, 0x07, 0xb5, 0x85, 0x7e, 0x2c, 0x3c, 0x5e, 0x57, 0xd7, 0x5f, 0x9e, 0xa6, 0x6e, 0xdf, 0x3a, 0x54, 0x3b, 0xca, 0x71, 0xe8, 0xe2, 0x52, 0xaa, 0xc0, 0x26, 0x64, 0x55, 0xd6, 0xa6, 0xe0, 0x58, + 0x03, 0x5b, 0xa7, 0x90, 0xa6, 0xc0, 0xd5, 0x02, 0xb2, 0x0d, 0x10, 0x8e, 0x0d, 0x3b, 0x46, 0x1f, 0x63, 0xf0, 0x40, 0x38, 0x92, 0x5a, 0xff, 0xa2, 0xb7, 0xfe, 0xf9, 0x21, 0x6e, 0x70, 0x00, 0x84, + 0x1d, 0xdb, 0xb5, 0x3b, 0xff, 0x7c, 0x73, 0xae, 0x67, 0xff, 0x73, 0x7e, 0xed, 0x57, 0xfb, 0xa8, 0xff, 0xf4, 0xfa, 0x0c, 0x53, 0x78, 0x76, 0x9f, 0x92, 0xa6, 0x9a, 0xb3, 0x37, 0xd3, 0x3e, 0x8a, + 0x69, 0xad, 0x15, 0x46, 0x73, 0x24, 0x49, 0xe2, 0x10, 0x53, 0x30, 0x6f, 0x19, 0xca, 0xd1, 0x66, 0x91, 0xb6, 0xc9, 0x13, 0x46, 0xac, 0xc3, 0xc5, 0x2f, 0xcf, 0x62, 0x2d, 0xcf, 0x09, 0x7a, 0x3d, + 0xd8, 0x71, 0xe0, 0xdd, 0xb7, 0x66, 0x40, 0x0f, 0x57, 0x15, 0x4d, 0x66, 0x1c, 0x01, 0xe8, 0x61, 0x6b, 0x58, 0xd7, 0x10, 0x51, 0xea, 0x14, 0xc6, 0xcd, 0x68, 0x2e, 0x6f, 0x12, 0x19, 0xc0, 0xd9, + 0x00, 0x63, 0x4d, 0x1b, 0x0e, 0x0d, 0x5a, 0xb1, 0x1e, 0xb3, 0xbe, 0x75, 0x77, 0xe9, 0xb7, 0xe7, 0x2f, 0x36, 0x10, 0x3e, 0xbc, 0x16, 0xcd, 0x7a, 0x56, 0x67, 0xf1, 0x18, 0xda, 0xda, 0x8f, 0xd6, + 0xbd, 0xff, 0xe5, 0x99, 0xc2, 0x7f, 0xaa, 0x28, 0x9f, 0x85, 0x9d, 0x8e, 0xb2, 0xf8, 0x10, 0xfc, 0xed, 0x1f, 0xe0, 0xd4, 0x10, 0xbe, 0x25, 0x27, 0x75, 0x5d, 0xad, 0x87, 0x26, 0x96, 0x76, 0x76, + 0xa8, 0xa9, 0xab, 0x12, 0x10, 0x12, 0x8a, 0xad, 0x64, 0xd0, 0x32, 0x8a, 0xf2, 0x36, 0x10, 0x95, 0xb0, 0x3a, 0x01, 0x8d, 0xd0, 0x28, 0x3f, 0xd2, 0x6d, 0xf3, 0xb7, 0x6a, 0x33, 0xf3, 0xcf, 0xf4, + 0xbb, 0xdb, 0xab, 0xe7, 0xb5, 0xc0, 0x0f, 0xcd, 0x1f, 0x47, 0xcb, 0x80, 0x6f, 0xf5, 0xe6, 0x60, 0x5d, 0xf0, 0xeb, 0xec, 0xfc, 0xb6, 0xa0, 0x37, 0x67, 0x6b, 0xce, 0x85, 0x3a, 0x97, 0xa1, 0xe8, + 0x5a, 0x18, 0xd5, 0x06, 0x0d, 0x07, 0xea, 0xe1, 0x7d, 0xd2, 0x0c, 0xcd, 0xca, 0xd5, 0x4c, 0x69, 0x17, 0x51, 0xc8, 0x48, 0xa1, 0x18, 0xca, 0xad, 0x47, 0xe2, 0x62, 0xc8, 0xc3, 0x07, 0xf6, 0x47, + 0xed, 0xc5, 0x3f, 0x22, 0xfe, 0x25, 0x22, 0x7d, 0x03, 0xca, 0x1b, 0x35, 0x2c, 0x9e, 0x23, 0x96, 0x2e, 0x51, 0x9c, 0x8d, 0xba, 0xad, 0x25, 0x86, 0xd3, 0xb3, 0x3b, 0x4d, 0x96, 0xc0, 0xb9, 0x4a, + 0xa7, 0x19, 0xa2, 0x07, 0xfb, 0x54, 0x0d, 0x59, 0x9d, 0x5a, 0x02, 0x4b, 0x1c, 0xb5, 0x35, 0xfb, 0xd2, 0xf2, 0xe6, 0x84, 0x98, 0x86, 0xea, 0x54, 0x69, 0x52, 0xea, 0x92, 0x8c, 0x7d, 0x46, 0x9b, + 0xd8, 0x76, 0x15, 0x1d, 0xc5, 0x73, 0xd2, 0xa4, 0xb6, 0xf9, 0x12, 0x3c, 0x8c, 0x41, 0x79, 0x0c, 0x2c, 0x8b, 0xb9, 0x22, 0xb5, 0xd4, 0x58, 0xfe, 0xde, 0x16, 0xfe, 0x43, 0x81, 0x3e, 0xdf, 0xcf, + 0xa2, 0xbc, 0x01, 0x23, 0xd4, 0x9d, 0x44, 0x22, 0xcb, 0xba, 0x75, 0x5a, 0xb5, 0x62, 0x55, 0xaf, 0x39, 0x09, 0xc6, 0xea, 0x43, 0x05, 0x3a, 0xac, 0x31, 0xab, 0x98, 0x81, 0xac, 0xa0, 0xed, 0x34, + 0x03, 0xa5, 0x93, 0xc5, 0x26, 0xff, 0x3f, 0xda, 0xd1, 0x9d, 0x23, 0xfd, 0x7f, 0x80, 0x0a, 0x72, 0x6a, 0x28, 0x8b, 0xd6, 0xf4, 0xa8, 0x81, 0xee, 0xad, 0x79, 0xcc, 0x98, 0xb2, 0x78, 0x09, 0x9a, + 0x8e, 0x86, 0xce, 0x73, 0x4c, 0x85, 0xa9, 0x04, 0x82, 0x2a, 0x22, 0x68, 0xe0, 0x9e, 0x11, 0x80, 0x47, 0xea, 0xf2, 0x1e, 0xea, 0x21, 0x9f, 0xa3, 0x82, 0xb3, 0xcf, 0xfa, 0xaf, 0x21, 0x85, 0x67, + 0xe7, 0xfa, 0xed, 0x39, 0x33, 0xd8, 0x52, 0xa3, 0x79, 0x56, 0xb5, 0x98, 0x11, 0xb9, 0x6a, 0xf3, 0x29, 0x3c, 0x64, 0xba, 0xf4, 0xbe, 0x00, 0xc1, 0x8c, 0x19, 0x38, 0x7a, 0xb2, 0x41, 0x5b, 0x6d, + 0xc8, 0xe8, 0xb0, 0xb8, 0x39, 0xe1, 0x3a, 0x96, 0xa2, 0x7c, 0x26, 0xd9, 0x6f, 0x4e, 0xc4, 0x52, 0x98, 0x96, 0x25, 0xe5, 0xa0, 0x14, 0x11, 0x36, 0x2c, 0x73, 0x80, 0xcb, 0x92, 0xec, 0x65, 0xa6, + 0x38, 0xc7, 0x14, 0x37, 0x6b, 0xd9, 0xa1, 0x86, 0xf5, 0xd6, 0x1d, 0x16, 0x65, 0x8f, 0xe8, 0x9b, 0xe9, 0xfb, 0x01, 0x11, 0xbb, 0xd3, 0xf8, 0xe6, 0x44, 0x54, 0xda, 0x70, 0xec, 0x2b, 0x90, 0x13, + 0xad, 0x84, 0xaa, 0xa2, 0x02, 0xd9, 0xd0, 0x51, 0xb2, 0x47, 0x91, 0xce, 0xe5, 0x04, 0xd2, 0xcd, 0x26, 0x21, 0xf7, 0x45, 0x38, 0x64, 0x7b, 0x15, 0x04, 0x64, 0x1e, 0x69, 0x7d, 0x7d, 0x22, 0xa3, + 0x7f, 0xcb, 0x30, 0xef, 0xd9, 0xe0, 0xfb, 0x73, 0xfa, 0x73, 0x56, 0xf9, 0x5b, 0xe5, 0xf8, 0xb3, 0xae, 0x8a, 0xb3, 0x8b, 0xf3, 0xdb, 0xfb, 0x7c, 0xc6, 0xfc, 0xf6, 0xa3, 0xef, 0xed, 0x21, 0xaf, + 0x9f, 0x9f, 0xb3, 0xcb, 0xbc, 0xb9, 0x7d, 0x6c, 0xad, 0x78, 0xb5, 0xb7, 0xe7, 0xa1, 0xc5, 0x63, 0x3f, 0xe4, 0x7c, 0x6a, 0x30, 0xe2, 0x1d, 0x6c, 0x06, 0x0f, 0xd0, 0x44, 0xe7, 0x02, 0xe8, 0xb8, + 0x99, 0xbe, 0xe8, 0x94, 0x04, 0x9d, 0x24, 0x02, 0x1a, 0xcc, 0x5d, 0x17, 0x01, 0x8d, 0xa4, 0xe5, 0xd4, 0x01, 0xcd, 0xd7, 0xc4, 0xa1, 0x35, 0xda, 0xf1, 0x6e, 0xed, 0xfb, 0x82, 0xa3, 0xa3, 0xe4, + 0x3d, 0x8f, 0x4b, 0xbe, 0x79, 0xb2, 0x6b, 0x34, 0xa0, 0x39, 0xd3, 0x7d, 0x69, 0x6f, 0x01, 0xd1, 0x8d, 0xcb, 0x05, 0x51, 0x0c, 0x10, 0x0d, 0x3d, 0x57, 0xee, 0xea, 0x04, 0x05, 0xb1, 0x6f, 0x4c, + 0x58, 0x41, 0xa6, 0x66, 0x38, 0x7a, 0x0e, 0x58, 0x70, 0x58, 0x24, 0x6f, 0xff, 0xfa, 0x9a, 0x97, 0x77, 0x5f, 0x76, 0x9b, 0xf9, 0x93, 0x39, 0xad, 0x4f, 0x79, 0x7b, 0xad, 0x97, 0x71, 0xf5, 0xe5, + 0x85, 0xab, 0x0e, 0xa7, 0x2e, 0x67, 0x5a, 0xe5, 0xdd, 0x8d, 0x42, 0xa0, 0x46, 0xb7, 0xd1, 0x60, 0x0c, 0x0b, 0xaf, 0xc0, 0x5e, 0x53, 0xc9, 0xbb, 0x68, 0x82, 0x4c, 0x71, 0xd4, 0x5c, 0x43, 0x16, + 0x1a, 0xf4, 0xc1, 0xa3, 0xb9, 0xbb, 0xd6, 0x28, 0x3f, 0x5c, 0x36, 0xf7, 0x22, 0x66, 0xf0, 0xbd, 0xf2, 0x5e, 0x6f, 0xce, 0xdf, 0xed, 0xc2, 0xe2, 0xff, 0x7b, 0x7b, 0x3c, 0xbb, 0xb9, 0xd4, 0xaf, + 0x37, 0x9f, 0xaf, 0x6e, 0xcf, 0xbe, 0x5e, 0xe7, 0xef, 0xe7, 0xf9, 0xc7, 0x2b, 0xf5, 0x37, 0xc7, 0x98, 0x72, 0xfa, 0xb2, 0x62, 0x2e, 0x0f, 0x11, 0xa1, 0xd9, 0x07, 0x92, 0x0f, 0x9c, 0x43, 0x06, + 0x70, 0x25, 0x7a, 0xaa, 0x2c, 0x92, 0xee, 0x95, 0xb4, 0x46, 0x40, 0x1b, 0x73, 0x24, 0x5b, 0x2b, 0x6b, 0x1c, 0x66, 0xca, 0x1a, 0xc8, 0xe3, 0x70, 0x25, 0xc5, 0x0b, 0x9e, 0xfc, 0xd7, 0xcd, 0x7e, + 0x5d, 0xe1, 0x37, 0xf6, 0x40, 0xfb, 0x80, 0xc7, 0xf9, 0xb3, 0x7b, 0xed, 0xcb, 0x99, 0x9d, 0x5f, 0xc6, 0x7d, 0x5f, 0xd9, 0x11, 0x86, 0x7d, 0xde, 0x2f, 0xba, 0x3c, 0xfd, 0x14, 0x87, 0x91, 0xc4, + 0xb8, 0x2a, 0x00, 0x49, 0x80, 0x34, 0x70, 0xa4, 0x6c, 0xba, 0x1b, 0x86, 0x4a, 0x9f, 0xa0, 0x8b, 0xa5, 0xe6, 0xc4, 0x56, 0xb3, 0xbb, 0x8d, 0x69, 0x66, 0x6d, 0x95, 0x0c, 0x35, 0x13, 0xd6, 0xd1, + 0x0f, 0x87, 0x1e, 0x5f, 0x0c, 0x1a, 0xba, 0xfc, 0xfd, 0x75, 0xdd, 0x7d, 0xbc, 0x6f, 0xf2, 0xf3, 0x63, 0xd3, 0xc0, 0x6e, 0xed, 0x8f, 0x13, 0x4b, 0xbe, 0xcf, 0xff, 0x38, 0x3c, 0x81, 0xe8, 0xdd, + 0xaf, 0xb7, 0xd7, 0xea, 0xdf, 0xf2, 0xd2, 0xf7, 0xcf, 0x67, 0xdf, 0x6b, 0x2e, 0x8e, 0xf1, 0x5b, 0x6f, 0x3e, 0xdb, 0xf5, 0xd5, 0x1f, 0xfb, 0x00, 0x5b, 0x4e, 0xae, 0x8e, 0x83, 0xb5, 0x92, 0x94, + 0xb0, 0x65, 0xaf, 0x64, 0x91, 0xc9, 0xda, 0xda, 0x92, 0xe5, 0x0e, 0x45, 0x61, 0xec, 0x4b, 0x49, 0x54, 0x7a, 0xef, 0x8a, 0x52, 0x4b, 0xc9, 0x82, 0xa7, 0xe2, 0xe8, 0x31, 0x3c, 0x1a, 0x1d, 0xb1, + 0xff, 0x3b, 0xa5, 0xf4, 0xd6, 0xc1, 0x8d, 0x19, 0x13, 0x21, 0xcb, 0x70, 0xae, 0xd9, 0xab, 0xa5, 0x08, 0x92, 0x4f, 0xf5, 0xc1, 0x9c, 0x0b, 0x79, 0xe4, 0xc8, 0x69, 0xcc, 0x34, 0x46, 0xd8, 0xa4, + 0x2a, 0x9d, 0x3e, 0x87, 0x4b, 0xa3, 0x94, 0x84, 0x7e, 0x64, 0xf0, 0xc7, 0xdd, 0xe5, 0xb9, 0x5f, 0x45, 0x9e, 0xdd, 0xe4, 0xa7, 0x2f, 0x79, 0x79, 0xab, 0xbb, 0x30, 0xc7, 0xf1, 0x8d, 0xfa, 0xde, + 0x16, 0xf4, 0x42, 0xbf, 0x9e, 0x3a, 0x0b, 0xd1, 0x11, 0x8b, 0x22, 0x99, 0x65, 0xcc, 0x44, 0xcc, 0x68, 0x39, 0x5a, 0x47, 0xef, 0x43, 0xb4, 0x15, 0x20, 0xf7, 0x82, 0xe2, 0x6a, 0xc1, 0x62, 0xa5, + 0xdd, 0x56, 0x95, 0x39, 0xf7, 0x16, 0x5c, 0xe6, 0x3e, 0x0e, 0x93, 0xfb, 0x7a, 0xca, 0xfd, 0x5b, 0x41, 0xd0, 0x0b, 0x17, 0xee, 0xd4, 0xb4, 0x39, 0x77, 0xf0, 0x9e, 0xd0, 0x46, 0x23, 0xf7, 0x95, + 0xd1, 0x87, 0x57, 0x62, 0x41, 0x18, 0xb9, 0x20, 0x93, 0xf7, 0xe8, 0xa3, 0x94, 0xd6, 0xcc, 0x6e, 0x1d, 0xa2, 0x68, 0x56, 0x9b, 0x2b, 0xab, 0xe7, 0x3a, 0xe2, 0xc1, 0x7d, 0x0f, 0x28, 0xeb, 0xad, + 0x7f, 0xfe, 0xf8, 0xe8, 0xcc, 0xfd, 0x5c, 0x19, 0xd9, 0xe7, 0xfd, 0xf9, 0x54, 0x9b, 0xd2, 0x3b, 0xb9, 0x97, 0x80, 0x9c, 0xcb, 0x45, 0x9d, 0x89, 0x13, 0xd7, 0x20, 0x9c, 0x22, 0x2a, 0x03, 0x06, + 0xb0, 0xaa, 0xe8, 0x14, 0xda, 0x79, 0x3d, 0xd3, 0x03, 0x0a, 0x13, 0x6c, 0x74, 0x1d, 0x3c, 0x1d, 0xd8, 0xa6, 0x3b, 0x1c, 0x06, 0x57, 0xfb, 0xe5, 0x5f, 0x8f, 0x4a, 0xef, 0x61, 0xba, 0xd2, 0x2b, + 0xf4, 0xee, 0xa6, 0x32, 0x3d, 0x8f, 0x46, 0xd3, 0xc9, 0xb7, 0xba, 0xba, 0x2e, 0xb6, 0x09, 0x33, 0x77, 0x6d, 0x78, 0x8e, 0x58, 0x06, 0x62, 0x1e, 0x7d, 0xcd, 0x6a, 0x58, 0x5d, 0x6b, 0x6c, 0xc6, + 0x51, 0x71, 0xec, 0xea, 0x10, 0x5b, 0x79, 0x32, 0xf7, 0x48, 0xec, 0x3e, 0x72, 0x1e, 0xab, 0x7a, 0xfe, 0x9e, 0x5c, 0x79, 0x4e, 0xc0, 0xe9, 0x7b, 0x6d, 0xa2, 0x5a, 0x23, 0x2f, 0xd7, 0xd1, 0xb2, + 0xb0, 0x7b, 0x9f, 0x6b, 0x34, 0x55, 0xd5, 0x21, 0x1a, 0x1b, 0x40, 0xe6, 0x16, 0x2d, 0xa5, 0x21, 0x75, 0xef, 0xce, 0xdc, 0x79, 0x43, 0x56, 0x1d, 0xc3, 0x59, 0xbb, 0xd3, 0xe1, 0x9e, 0xd1, 0xff, + 0xbe, 0x3b, 0xf7, 0xdf, 0xce, 0xf2, 0xfa, 0xfa, 0xb5, 0xec, 0xcf, 0x79, 0x5c, 0xea, 0x9b, 0xbb, 0x2c, 0x04, 0x4b, 0x9b, 0xce, 0x52, 0x5b, 0x08, 0xc4, 0xa3, 0x66, 0xa7, 0xac, 0xec, 0xee, 0x4e, + 0xc3, 0x1b, 0xf4, 0x62, 0xc2, 0xac, 0x6c, 0x3d, 0xd6, 0xe8, 0xb9, 0xa2, 0xf7, 0x31, 0x62, 0xb8, 0xad, 0xd1, 0xd2, 0xeb, 0x70, 0x65, 0xcf, 0xd3, 0x6c, 0xc1, 0xa3, 0x86, 0xb5, 0xf3, 0x38, 0x7f, + 0xf6, 0xc5, 0xe5, 0xd5, 0xf5, 0x17, 0xbd, 0x38, 0xff, 0x9f, 0x1f, 0xe8, 0xdc, 0x6f, 0x06, 0x78, 0x3f, 0x75, 0x7d, 0xea, 0x3e, 0x90, 0x85, 0xb4, 0x68, 0x68, 0xb3, 0x5a, 0xc2, 0x2a, 0x8d, 0xb0, + 0xaf, 0xbe, 0x48, 0xac, 0xa1, 0x83, 0x39, 0x82, 0x6c, 0xa0, 0xb3, 0x33, 0x63, 0x96, 0xc7, 0xf0, 0x59, 0xc2, 0x73, 0x96, 0x92, 0x2d, 0xd0, 0xac, 0xc3, 0xce, 0xdb, 0x53, 0x58, 0xf9, 0xdd, 0xcc, + 0xbf, 0x42, 0xec, 0xcd, 0xad, 0xbe, 0x28, 0x32, 0x80, 0x93, 0x57, 0x02, 0x4d, 0x00, 0xa4, 0xcc, 0xdd, 0x88, 0x30, 0xb1, 0x05, 0xd2, 0xc6, 0x58, 0x51, 0x88, 0x43, 0xa3, 0x38, 0xc9, 0x55, 0xcb, + 0xb3, 0x05, 0x53, 0x17, 0x90, 0x1c, 0x31, 0x0d, 0x64, 0x0e, 0xec, 0x40, 0xe9, 0x23, 0x0f, 0x1b, 0x97, 0x9f, 0x4b, 0x71, 0x9f, 0x5f, 0xfd, 0xfe, 0x62, 0xaa, 0xe5, 0xe9, 0x0b, 0xd6, 0x0c, 0xad, + 0xa7, 0xce, 0x2a, 0x19, 0x09, 0x3c, 0x88, 0x7b, 0xad, 0xaa, 0x9c, 0xca, 0x69, 0xec, 0xad, 0x45, 0x1b, 0x84, 0xd4, 0x3a, 0x82, 0x2d, 0xf2, 0xc1, 0x6d, 0x00, 0xf0, 0xd8, 0xe4, 0x1e, 0xb2, 0xf1, + 0x38, 0x8c, 0x4e, 0x5e, 0xb7, 0x9e, 0xe7, 0x5f, 0xfd, 0xea, 0xb2, 0xce, 0x3f, 0xbd, 0x38, 0xb2, 0xa7, 0x16, 0xd4, 0xe2, 0xcd, 0x52, 0x2e, 0x4d, 0x4f, 0xe1, 0x26, 0x4d, 0x68, 0x70, 0x57, 0x29, + 0xa4, 0xa2, 0xb5, 0xa9, 0x9c, 0x39, 0x5c, 0x95, 0x50, 0x56, 0x62, 0xb1, 0x26, 0x18, 0x83, 0xfb, 0x1c, 0xdb, 0x01, 0x2e, 0x8d, 0xc3, 0xd6, 0xf3, 0xe9, 0x20, 0x86, 0x3f, 0xce, 0xe3, 0xe9, 0x34, + 0xb4, 0x3d, 0x0b, 0xba, 0xfb, 0xe2, 0x3a, 0x5f, 0x49, 0xfb, 0xed, 0x4c, 0xcf, 0x73, 0x2e, 0xd0, 0xc9, 0x11, 0x44, 0x04, 0x8e, 0xd6, 0x67, 0x43, 0xb0, 0x16, 0xb9, 0x36, 0x2d, 0x56, 0x35, 0x37, + 0xb5, 0xd4, 0x06, 0x8c, 0xd9, 0x7d, 0x0e, 0x98, 0xd1, 0xac, 0x46, 0xaf, 0x35, 0xfb, 0x92, 0xbe, 0x32, 0xcc, 0x24, 0x92, 0x3b, 0xf2, 0xd1, 0xaa, 0xca, 0x07, 0x70, 0xb5, 0xef, 0x01, 0x8d, 0x53, + 0xdb, 0xc5, 0xd5, 0x2d, 0xca, 0xd4, 0xb3, 0x6b, 0xcb, 0x05, 0x4a, 0x38, 0x7a, 0x71, 0x37, 0x92, 0x94, 0xd9, 0xac, 0x8d, 0x9e, 0x5d, 0xa6, 0x02, 0x34, 0x40, 0xb7, 0x20, 0x31, 0x31, 0xa6, 0x98, + 0x8a, 0x36, 0xb9, 0xcd, 0xc3, 0xa9, 0x8f, 0x9f, 0x83, 0x77, 0xbf, 0xe5, 0xf5, 0x65, 0x5e, 0x74, 0x3c, 0x40, 0xe8, 0xe9, 0x85, 0x95, 0x47, 0xe3, 0x89, 0x64, 0x28, 0xb4, 0x3a, 0x75, 0xf0, 0x66, + 0x8a, 0xb1, 0x70, 0x93, 0xde, 0xe5, 0x3a, 0x3d, 0x4c, 0xa5, 0x2f, 0xb4, 0x2a, 0x8a, 0x88, 0x56, 0x4c, 0xd2, 0xc6, 0x6c, 0xbe, 0xfd, 0x9f, 0xac, 0xc3, 0x6d, 0x37, 0xdf, 0x24, 0x12, 0x3f, 0xac, + 0x27, 0x22, 0x7a, 0x66, 0x77, 0xe7, 0x17, 0xaf, 0xf4, 0x46, 0x5f, 0x3c, 0x9b, 0x33, 0xf9, 0xd6, 0x94, 0xab, 0x40, 0xac, 0x45, 0x36, 0xe7, 0x64, 0x8f, 0xd9, 0xa6, 0xd9, 0xd0, 0x29, 0xaa, 0xcd, + 0x45, 0x4c, 0x17, 0x80, 0x02, 0x8c, 0xf2, 0xb9, 0x04, 0x46, 0x72, 0x1b, 0x33, 0xbd, 0x2d, 0xa5, 0x99, 0xd2, 0x41, 0xe4, 0x58, 0x77, 0xfe, 0xd3, 0x42, 0xfd, 0x7d, 0xe7, 0xed, 0xd4, 0xbe, 0x4f, + 0xa2, 0x9a, 0x06, 0xf6, 0x32, 0x27, 0xb4, 0xce, 0xad, 0x15, 0x16, 0xb2, 0x2c, 0xa2, 0xf0, 0xd5, 0x51, 0xc3, 0xd0, 0x30, 0xad, 0xed, 0xea, 0x9a, 0x4b, 0x60, 0x15, 0x8d, 0xe1, 0x94, 0xb0, 0xdc, + 0x27, 0x1d, 0x3b, 0x63, 0x3b, 0x3d, 0xba, 0xcf, 0x7e, 0x39, 0x75, 0x98, 0x98, 0x97, 0x84, 0xce, 0x90, 0x5e, 0x60, 0x6b, 0xce, 0xaa, 0xcd, 0x10, 0x68, 0xf9, 0xe8, 0x88, 0x4a, 0xc1, 0xd3, 0x5b, + 0x5f, 0xb3, 0x0d, 0x05, 0xef, 0x1d, 0xc4, 0x6c, 0xf0, 0x46, 0xc8, 0x64, 0xdf, 0xdc, 0xd1, 0xa3, 0x0a, 0xe2, 0xe2, 0xfc, 0xf2, 0xb7, 0x8c, 0xb3, 0xcd, 0x98, 0x9f, 0xed, 0xbb, 0x25, 0xed, 0xc3, + 0x38, 0xb9, 0x25, 0xe3, 0x32, 0xb1, 0xbe, 0xb4, 0x04, 0x67, 0x5b, 0x40, 0xcd, 0xd6, 0xb4, 0x29, 0x7d, 0x36, 0x32, 0xa9, 0x72, 0x1f, 0x0b, 0x37, 0x53, 0xa6, 0xb4, 0x28, 0x20, 0x3d, 0x88, 0x65, + 0x98, 0xba, 0x61, 0xe5, 0x5a, 0x75, 0xac, 0x57, 0xfa, 0xe2, 0xca, 0x7f, 0xfb, 0xa8, 0x5f, 0xf7, 0x81, 0xec, 0xe9, 0x43, 0xa3, 0xad, 0x2f, 0x5c, 0xab, 0xcd, 0x36, 0xa3, 0x6a, 0x06, 0x0c, 0x17, + 0xe2, 0xe9, 0x04, 0x33, 0x60, 0x4d, 0x69, 0xc6, 0xc8, 0x84, 0xaa, 0x6c, 0xb3, 0x0d, 0xb3, 0x19, 0x31, 0xd3, 0xa5, 0xf5, 0x56, 0x56, 0x8d, 0xf3, 0x70, 0xd1, 0xf1, 0x8d, 0x5f, 0x7d, 0xcd, 0x4f, + 0x77, 0x7a, 0xfd, 0xda, 0x69, 0xbf, 0xda, 0x37, 0xc5, 0xf4, 0x06, 0x85, 0xc5, 0x60, 0x62, 0x96, 0xd3, 0x89, 0x63, 0x40, 0x6d, 0x98, 0x56, 0xc5, 0x84, 0x86, 0xcc, 0x21, 0x34, 0x8d, 0x9c, 0x08, + 0x08, 0xd5, 0x16, 0x0b, 0xfa, 0x68, 0xbb, 0x54, 0xe0, 0x6a, 0xd1, 0x27, 0x3a, 0x32, 0xfc, 0x54, 0xe5, 0xd4, 0x31, 0xfa, 0xae, 0xef, 0xce, 0x5c, 0xfd, 0xf3, 0x8b, 0x5e, 0x8e, 0x93, 0x6b, 0xb2, + 0x0e, 0x89, 0x54, 0xa0, 0xb1, 0x3a, 0x82, 0x6f, 0xf6, 0x4a, 0x21, 0x9b, 0x3a, 0xf4, 0x0d, 0x10, 0xd9, 0x9c, 0x2b, 0x67, 0x0d, 0x9a, 0xd3, 0xd1, 0x07, 0x77, 0x90, 0x9a, 0x3a, 0xbc, 0x60, 0x43, + 0xf6, 0xdd, 0x8e, 0xcc, 0x2a, 0xdc, 0x3f, 0x47, 0x47, 0xe9, 0xfc, 0x0e, 0xe7, 0xf7, 0xe9, 0x3c, 0xb5, 0xba, 0xab, 0xb2, 0xcc, 0xb5, 0x01, 0xa0, 0x16, 0x34, 0x02, 0xc7, 0x52, 0x37, 0xa2, 0x95, + 0x9c, 0xaa, 0xd6, 0x37, 0x64, 0xaa, 0x4d, 0x69, 0x72, 0x97, 0x11, 0x14, 0x52, 0x88, 0x6b, 0xf3, 0x18, 0xab, 0x41, 0x19, 0xe6, 0xb1, 0xe8, 0xd8, 0x23, 0x1a, 0xda, 0x5f, 0xfe, 0xa9, 0x23, 0x46, + 0x5c, 0xe5, 0xc3, 0x47, 0xef, 0x8b, 0xa6, 0x04, 0x45, 0x4f, 0x05, 0x0e, 0x9c, 0x52, 0xba, 0x52, 0xfb, 0x00, 0xd4, 0x40, 0x62, 0x24, 0xf6, 0xde, 0x2c, 0x30, 0x6a, 0x4a, 0xce, 0xd5, 0x9b, 0x64, + 0x34, 0x6d, 0xc7, 0xa0, 0xf6, 0x43, 0x96, 0xea, 0xe9, 0xea, 0xf1, 0x0d, 0x6c, 0x8d, 0xc1, 0xb4, 0x20, 0x0e, 0xc9, 0x8e, 0x42, 0x7d, 0x64, 0x6f, 0xe2, 0x63, 0x23, 0xa5, 0xb2, 0xb1, 0x80, 0x63, + 0xb4, 0x00, 0x53, 0xd9, 0xcc, 0xa4, 0x0c, 0x82, 0x81, 0x3a, 0x34, 0xd1, 0x1a, 0xf5, 0xc5, 0xe1, 0xc7, 0x56, 0xbf, 0x1f, 0x23, 0xd8, 0xc5, 0xb3, 0x4e, 0x9d, 0x0c, 0xd9, 0x4d, 0xdc, 0x65, 0xcf, + 0xd1, 0xc0, 0x19, 0xb2, 0x75, 0x15, 0x17, 0x6f, 0xd1, 0x87, 0xad, 0x09, 0x04, 0x5d, 0x53, 0x70, 0x58, 0x08, 0x8b, 0x3b, 0x2b, 0x65, 0x6f, 0xd1, 0x66, 0x6b, 0x9b, 0x3b, 0xa0, 0xbe, 0x8e, 0x75, + 0x80, 0x3e, 0x2d, 0x8d, 0x7c, 0x6b, 0x3d, 0xad, 0x82, 0x03, 0x56, 0xca, 0xf2, 0xc6, 0x6b, 0xac, 0x69, 0x3e, 0x5d, 0x3a, 0x35, 0x5c, 0x1a, 0xee, 0xba, 0xeb, 0xb7, 0x1d, 0x3d, 0xa6, 0xca, 0x58, + 0x20, 0x33, 0x72, 0xf5, 0x01, 0xdc, 0xb4, 0x41, 0x2c, 0x4a, 0x3a, 0x32, 0x24, 0x72, 0x37, 0x9b, 0xec, 0xfd, 0x33, 0x20, 0x7c, 0xec, 0x98, 0xbf, 0x28, 0xd2, 0x98, 0x1f, 0xf0, 0xe4, 0xd1, 0x0e, + 0xad, 0x98, 0xb3, 0x86, 0x09, 0x58, 0xa1, 0xee, 0xa6, 0xbb, 0x94, 0x46, 0xcb, 0x4d, 0xaf, 0x65, 0xa8, 0xc3, 0x5c, 0x1b, 0xad, 0xdc, 0x78, 0x34, 0x4a, 0x1e, 0x63, 0x8d, 0x49, 0x4b, 0x73, 0xb5, + 0x24, 0xf7, 0xc3, 0x43, 0x3b, 0x1e, 0xd4, 0xf5, 0x43, 0x63, 0xf4, 0xfb, 0x17, 0x65, 0x82, 0x07, 0xbe, 0xfa, 0x96, 0xc0, 0xb9, 0x47, 0xc3, 0xdb, 0xd3, 0x33, 0xaf, 0xfc, 0x59, 0x6e, 0xe7, 0xc9, + 0xac, 0xdf, 0x3f, 0x76, 0x0f, 0x97, 0x8f, 0x40, 0xed, 0x5b, 0x3e, 0x62, 0xcf, 0x21, 0x3e, 0xce, 0xe2, 0xdd, 0x90, 0xe0, 0x7d, 0x36, 0x9f, 0x5a, 0x11, 0x69, 0xb9, 0x4d, 0x91, 0x34, 0x9c, 0x41, + 0xbd, 0xe3, 0x24, 0x76, 0x5f, 0xb4, 0x48, 0xd0, 0xcc, 0x61, 0xa4, 0x96, 0xe1, 0xac, 0xb6, 0xa2, 0xf5, 0x46, 0x63, 0xb4, 0x18, 0xaa, 0x50, 0x13, 0x30, 0xdb, 0x9c, 0x75, 0xd8, 0x28, 0x7e, 0xe7, + 0xd4, 0x93, 0xca, 0xe1, 0x57, 0xe6, 0x48, 0xef, 0xb8, 0xf5, 0xd6, 0x3e, 0x7e, 0x5a, 0xac, 0xb6, 0x08, 0x09, 0xe6, 0xec, 0x88, 0x41, 0xda, 0x57, 0xe8, 0xe2, 0xb6, 0xba, 0x55, 0x44, 0x74, 0x75, + 0x72, 0xe8, 0xd0, 0x3b, 0x65, 0xec, 0x84, 0x09, 0x60, 0xe7, 0x2f, 0x07, 0x4d, 0xa1, 0x23, 0x43, 0x05, 0x5e, 0x48, 0xc2, 0xe5, 0x77, 0x60, 0xbe, 0x8f, 0x7b, 0x6e, 0xf0, 0xe3, 0xb7, 0x17, 0x8f, + 0x30, 0x62, 0xf7, 0xdb, 0x2f, 0xc2, 0x88, 0xa7, 0x86, 0xe3, 0x5d, 0x60, 0xf6, 0x16, 0x80, 0x36, 0x57, 0x6b, 0xa8, 0x09, 0x89, 0x23, 0x57, 0x09, 0x53, 0x6f, 0x93, 0x98, 0x64, 0xce, 0x31, 0x9a, + 0xc6, 0xc2, 0x50, 0x9f, 0x6b, 0xcd, 0xb2, 0x25, 0xd0, 0x1c, 0x64, 0xcc, 0xa5, 0xaf, 0xa6, 0x83, 0x9f, 0x9c, 0xac, 0xbf, 0x39, 0x89, 0xed, 0x69, 0xf3, 0xf9, 0x8b, 0x90, 0xd3, 0xa9, 0x35, 0x68, + 0xa0, 0xfb, 0x94, 0xa5, 0xb3, 0xdb, 0x20, 0x51, 0x6e, 0xe6, 0x8d, 0xb8, 0x71, 0x0f, 0x14, 0x12, 0xf7, 0x44, 0xf6, 0x00, 0x67, 0x6b, 0x4a, 0xba, 0x26, 0x46, 0x5b, 0xba, 0x5a, 0x07, 0x73, 0x5c, + 0x0d, 0xe2, 0x88, 0x06, 0x7d, 0x12, 0x40, 0x7c, 0xd6, 0x3a, 0xff, 0x0a, 0xc5, 0x0f, 0xef, 0xec, 0xef, 0xf9, 0xc9, 0x9d, 0x5f, 0xd1, 0x49, 0x06, 0xe9, 0xc3, 0x43, 0x71, 0xac, 0x99, 0xb8, 0x88, + 0x11, 0x69, 0xcd, 0x58, 0x0d, 0xd5, 0x0b, 0x8a, 0xc3, 0xc2, 0x27, 0xf6, 0x44, 0x2b, 0x1f, 0x9c, 0x73, 0xb8, 0x82, 0x47, 0x13, 0x41, 0x39, 0x52, 0x3d, 0xfc, 0x23, 0x43, 0xf1, 0x6d, 0xf0, 0xf2, + 0x73, 0xf4, 0xfb, 0x06, 0x63, 0xb6, 0xda, 0x20, 0x91, 0xea, 0x3c, 0xe6, 0x64, 0x70, 0x18, 0x6b, 0x8d, 0xca, 0x94, 0xd6, 0x89, 0x68, 0xca, 0x98, 0x55, 0xd5, 0x0b, 0xa9, 0xc7, 0x6c, 0xcc, 0x26, + 0x90, 0x83, 0x27, 0x47, 0xc1, 0x84, 0xe2, 0x39, 0xed, 0x70, 0x44, 0xf8, 0xf0, 0x68, 0xc1, 0x23, 0xb4, 0x5e, 0x7d, 0xd5, 0xff, 0xbe, 0xcb, 0xb3, 0x48, 0xbb, 0xdb, 0x77, 0x7f, 0x4f, 0x4f, 0xee, + 0x44, 0xd2, 0xd5, 0xa9, 0x79, 0x5f, 0x0e, 0xb6, 0x5a, 0xc5, 0x20, 0x69, 0x8b, 0x37, 0x51, 0x55, 0x32, 0xa5, 0x9e, 0x6d, 0xad, 0xb1, 0xb4, 0x1a, 0x0e, 0xc3, 0x3e, 0x73, 0x34, 0xb1, 0x39, 0x49, + 0xca, 0xa1, 0xc7, 0x38, 0xe2, 0xc4, 0x3c, 0x9d, 0x8d, 0xbd, 0x77, 0x06, 0x4f, 0x7f, 0x2d, 0xc2, 0x0c, 0x66, 0x22, 0xf5, 0x86, 0x12, 0x85, 0x18, 0xae, 0x13, 0x17, 0x65, 0x25, 0xe5, 0x92, 0x25, + 0x02, 0xb1, 0xb9, 0xec, 0x6d, 0x0d, 0xe7, 0x36, 0x5d, 0x18, 0xcd, 0x83, 0x43, 0x49, 0x91, 0x15, 0xc6, 0x11, 0xb4, 0xf9, 0x18, 0x95, 0xbf, 0x37, 0xc6, 0x0f, 0xb8, 0xf9, 0xfd, 0xf3, 0xb1, 0xdf, + 0x1f, 0x1f, 0x8a, 0x0b, 0x8e, 0x6c, 0xe4, 0x8b, 0x37, 0x9f, 0x73, 0x62, 0x9d, 0x3c, 0xaf, 0x53, 0xca, 0xca, 0x0b, 0xa5, 0xaf, 0x64, 0x1a, 0x3c, 0x7b, 0xe5, 0x94, 0xc6, 0xe5, 0xd3, 0x74, 0x4d, + 0xa1, 0x19, 0x8c, 0x45, 0x52, 0xc9, 0x89, 0x10, 0xd9, 0x98, 0xb2, 0x2d, 0xc0, 0xa5, 0x22, 0x65, 0x0d, 0x0e, 0xe7, 0x75, 0x5e, 0x94, 0xa2, 0x3c, 0xe3, 0xcc, 0xa3, 0x6a, 0xbe, 0xce, 0xb8, 0xfa, + 0xf3, 0xe3, 0xcd, 0x5f, 0x37, 0xae, 0x17, 0x07, 0xee, 0x7f, 0xf8, 0x39, 0xcd, 0xfd, 0xa2, 0xc9, 0xe4, 0x39, 0xfe, 0x38, 0x3d, 0xf8, 0x0b, 0xaa, 0x18, 0x93, 0x20, 0x1a, 0xf8, 0x2a, 0x58, 0x8a, + 0x3d, 0x94, 0x6d, 0x56, 0xa2, 0xa0, 0xac, 0x2a, 0xb2, 0x31, 0xb4, 0xdc, 0x3d, 0x8a, 0x97, 0x70, 0x37, 0x24, 0xaf, 0xbe, 0xcb, 0x1a, 0x64, 0xc7, 0x63, 0xa5, 0x91, 0x4f, 0x0a, 0xfb, 0x5e, 0xb8, + 0xf0, 0x27, 0xef, 0x5c, 0x14, 0x58, 0x20, 0x68, 0xc3, 0x87, 0x00, 0x48, 0x0c, 0xc8, 0xe6, 0x81, 0x08, 0x45, 0x41, 0x12, 0x91, 0x02, 0x80, 0x0b, 0xc9, 0x94, 0x81, 0xfb, 0x94, 0x4d, 0x95, 0xb9, + 0x70, 0x34, 0x9e, 0x6d, 0xf5, 0x68, 0x87, 0x73, 0x95, 0x4f, 0x4b, 0x13, 0x37, 0x5b, 0x7a, 0x7d, 0xa9, 0x17, 0x3f, 0xbc, 0x4c, 0xe1, 0x18, 0xd9, 0x6f, 0xd1, 0xb7, 0xe5, 0x3c, 0x9a, 0xb8, 0x43, + 0x9b, 0x8d, 0xc0, 0xa9, 0x29, 0x0d, 0x58, 0x81, 0x5a, 0xac, 0x13, 0x46, 0x6f, 0x09, 0x99, 0xd1, 0x72, 0xe2, 0x1a, 0x28, 0x53, 0x7b, 0x2c, 0x1f, 0xc4, 0xb8, 0xda, 0x74, 0x77, 0xd2, 0xc3, 0x4e, + 0xfd, 0x41, 0xaa, 0x1f, 0xe7, 0x5d, 0xff, 0x98, 0xe8, 0x6f, 0xbf, 0xf3, 0xf6, 0x9b, 0xde, 0x2d, 0x71, 0x72, 0x6b, 0xbd, 0x35, 0xcb, 0x19, 0x12, 0xb8, 0x79, 0xdc, 0xce, 0x1d, 0x01, 0x62, 0x81, + 0xb4, 0x0d, 0xc6, 0xd8, 0xb4, 0xe1, 0xca, 0x0a, 0x86, 0x0b, 0x7b, 0x6b, 0x38, 0x06, 0x80, 0x6d, 0x10, 0xfa, 0xb0, 0xe7, 0xf5, 0x0f, 0x4b, 0xb2, 0x7f, 0xc8, 0x81, 0xb7, 0xd8, 0x7f, 0x5a, 0x2e, + 0xa3, 0x41, 0xc7, 0xb1, 0xba, 0x8d, 0xd6, 0xc6, 0x98, 0x06, 0x59, 0xc1, 0x10, 0x34, 0xac, 0x83, 0x34, 0x94, 0x42, 0x63, 0xd8, 0xc4, 0x42, 0x58, 0xca, 0x1d, 0xdb, 0x4a, 0x98, 0x46, 0x48, 0x78, + 0x64, 0xaa, 0xf3, 0x09, 0x18, 0x70, 0x71, 0x7e, 0xfb, 0x32, 0x36, 0x07, 0xa7, 0x86, 0x20, 0x38, 0xd8, 0x26, 0x09, 0x0c, 0x6d, 0x0b, 0x8b, 0x17, 0x00, 0xb7, 0x2e, 0x73, 0x6e, 0x3a, 0x0a, 0x17, + 0x70, 0x47, 0x16, 0x8b, 0x34, 0x93, 0x8d, 0x2d, 0xd4, 0xc3, 0x7c, 0x57, 0xa3, 0x59, 0xc2, 0x4d, 0x99, 0x8f, 0xf5, 0x7c, 0xfd, 0x80, 0x10, 0x3c, 0xf9, 0x78, 0xbc, 0xf0, 0x96, 0x50, 0x38, 0xc4, + 0x05, 0x81, 0xd9, 0x7b, 0x53, 0x72, 0x09, 0x60, 0x46, 0x9a, 0x19, 0xd1, 0xb4, 0x8f, 0xb9, 0x0c, 0x07, 0x8f, 0xa9, 0xc2, 0x1c, 0x6d, 0x76, 0xf4, 0x5a, 0xa5, 0x9d, 0x53, 0xda, 0x51, 0xef, 0xe3, + 0x5b, 0xf5, 0xf4, 0x5b, 0x47, 0x0f, 0x97, 0x2d, 0x6e, 0xb1, 0x1c, 0x06, 0xd8, 0x2c, 0x2c, 0x93, 0x9e, 0x8b, 0x14, 0x3a, 0xd0, 0x84, 0xbe, 0xaa, 0x8d, 0x68, 0x98, 0x01, 0xe0, 0x9c, 0xec, 0x83, + 0x6a, 0x2d, 0x9c, 0xaa, 0x5a, 0xec, 0x52, 0xb0, 0x8e, 0x45, 0x0f, 0xbf, 0x7e, 0xfd, 0x7d, 0xb7, 0x01, 0x6b, 0xbe, 0x74, 0xe8, 0x4f, 0x4d, 0x82, 0x3a, 0x93, 0x4f, 0xa4, 0x98, 0x86, 0xb1, 0x99, + 0x0d, 0x1c, 0xc5, 0x03, 0x71, 0x62, 0x11, 0xc2, 0x5a, 0x7d, 0x8e, 0x60, 0x5b, 0x55, 0xa0, 0x55, 0x4c, 0xbe, 0x30, 0x69, 0x40, 0x9f, 0x03, 0x9a, 0xd2, 0x3a, 0xda, 0xbd, 0xbf, 0x5f, 0xb3, 0xbe, + 0x9f, 0x32, 0x39, 0xf9, 0x44, 0xb3, 0xb0, 0x6a, 0x4e, 0xcb, 0x1c, 0x42, 0xa0, 0xf3, 0xd0, 0x1c, 0xde, 0x3d, 0x16, 0x64, 0x67, 0xc4, 0xd8, 0xd6, 0x6f, 0x5e, 0x0b, 0xb4, 0x37, 0x99, 0x0d, 0xa9, + 0x4d, 0x6a, 0x81, 0xd8, 0x6b, 0x48, 0x65, 0xcb, 0xa3, 0xb2, 0xf4, 0xa2, 0xce, 0x7e, 0x5f, 0xa6, 0x4e, 0xad, 0xda, 0xcc, 0xd7, 0x02, 0x43, 0x47, 0x9c, 0x0b, 0x3a, 0x37, 0x9f, 0xca, 0xab, 0x25, + 0xb1, 0x96, 0x2c, 0x6a, 0x59, 0x8b, 0x60, 0x75, 0x36, 0x97, 0x05, 0xb0, 0xa8, 0x43, 0x50, 0xc2, 0x9a, 0xcb, 0xa2, 0x39, 0xb4, 0x75, 0x2c, 0x87, 0xf5, 0x54, 0xb9, 0xed, 0x6b, 0x67, 0x3c, 0x35, + 0x0d, 0xb5, 0x1d, 0x0a, 0x2d, 0x46, 0x59, 0xd3, 0x41, 0x87, 0x2c, 0xc6, 0xa9, 0xe1, 0xb2, 0x96, 0xd9, 0x90, 0x45, 0x2c, 0xb8, 0x11, 0x52, 0x23, 0x73, 0xa8, 0x8e, 0x86, 0x4d, 0x80, 0x46, 0xe6, + 0x6a, 0xcc, 0xad, 0x1f, 0xf6, 0x44, 0x1f, 0x8b, 0x88, 0xfe, 0x3c, 0x7f, 0x25, 0x03, 0xf4, 0xb4, 0xca, 0xea, 0x39, 0x99, 0xa7, 0xaf, 0xa3, 0xd2, 0xcd, 0x71, 0x14, 0x82, 0x58, 0x58, 0x8a, 0x6a, + 0xa3, 0x59, 0x42, 0xb2, 0xe4, 0x64, 0x20, 0x5c, 0x12, 0xc1, 0x1e, 0xc9, 0x2b, 0x4d, 0xc9, 0x1b, 0x93, 0xf9, 0x50, 0xea, 0x4c, 0x35, 0x47, 0x8b, 0xca, 0x63, 0x63, 0x3b, 0xee, 0xcd, 0xce, 0xfe, + 0x1e, 0x9d, 0xfa, 0xbc, 0x78, 0x8f, 0x66, 0xc2, 0x34, 0xc2, 0x31, 0xd2, 0x6a, 0x34, 0xf6, 0x45, 0x88, 0x91, 0x6d, 0x04, 0x23, 0x4e, 0x77, 0xa8, 0x36, 0x89, 0x10, 0x66, 0x54, 0x54, 0x6a, 0xc8, + 0x5a, 0x25, 0x06, 0x6a, 0x1d, 0xf5, 0x70, 0x45, 0xc9, 0x73, 0x0b, 0x7a, 0x64, 0x8b, 0x76, 0xa3, 0xcf, 0x9f, 0x9f, 0x22, 0x3e, 0xf9, 0xde, 0x4c, 0x9d, 0x06, 0x93, 0x25, 0x48, 0x0c, 0xc9, 0xac, + 0xb2, 0xf9, 0x6a, 0x9d, 0x50, 0x54, 0x61, 0x31, 0x11, 0x63, 0x8d, 0x16, 0x62, 0x7d, 0x76, 0xe8, 0x50, 0x2d, 0x97, 0x94, 0xf7, 0x31, 0x6d, 0x10, 0x45, 0x3b, 0x8c, 0xe3, 0xbf, 0x75, 0x15, 0xbc, + 0x7b, 0x68, 0xaf, 0x78, 0x8e, 0x81, 0xf4, 0x32, 0x3e, 0xfa, 0x67, 0xf5, 0xcf, 0xfa, 0xe4, 0xf3, 0x63, 0xfd, 0xf9, 0xee, 0xd3, 0xe7, 0x57, 0x70, 0xff, 0xd3, 0x5f, 0x7f, 0xeb, 0x18, 0x66, 0x91, + 0xaf, 0x8c, 0x35, 0x26, 0xb2, 0xb8, 0x70, 0x67, 0x6c, 0xd3, 0x8a, 0x71, 0x58, 0xf5, 0x29, 0x7d, 0xc4, 0x9a, 0x73, 0xa6, 0x06, 0xab, 0x4e, 0xb1, 0x81, 0x96, 0x1b, 0x0e, 0xea, 0x53, 0x02, 0x76, + 0xf9, 0x81, 0xc3, 0x9b, 0xff, 0xdd, 0x6a, 0xed, 0x93, 0xff, 0x2a, 0xc9, 0x2f, 0xa1, 0xf1, 0x38, 0x79, 0x8c, 0x40, 0x9a, 0x45, 0x6e, 0x50, 0xa0, 0x7c, 0x09, 0x58, 0xf3, 0x2c, 0x40, 0x9d, 0xd1, + 0x7a, 0x84, 0xbb, 0xc3, 0x44, 0x4f, 0x36, 0xd4, 0xaa, 0x41, 0x30, 0x9b, 0x96, 0xf4, 0xbe, 0x6a, 0x05, 0xb5, 0xa8, 0x19, 0x70, 0xb8, 0x65, 0xf5, 0x80, 0x38, 0xbc, 0x46, 0xe8, 0xe7, 0x97, 0x05, + 0x10, 0xa7, 0x36, 0xe6, 0xae, 0x1d, 0x50, 0xb4, 0xd8, 0x04, 0x15, 0x18, 0x00, 0x63, 0x88, 0x06, 0xc9, 0xf2, 0x59, 0x0b, 0x52, 0x8b, 0x66, 0xc7, 0xd1, 0x79, 0x4e, 0x93, 0xcd, 0x65, 0x8c, 0x2e, + 0xa9, 0xac, 0x5d, 0x62, 0x4e, 0xe8, 0x87, 0xb3, 0xb6, 0x3f, 0xb3, 0x91, 0xcf, 0xe0, 0xff, 0x3e, 0x95, 0xa7, 0x46, 0x3f, 0x4c, 0xc8, 0x5d, 0x92, 0xc0, 0x83, 0x84, 0x80, 0x22, 0x17, 0x43, 0xea, + 0xc8, 0x41, 0xa2, 0x65, 0x9c, 0xa8, 0x5d, 0x9d, 0xd9, 0xc6, 0x12, 0x73, 0x4b, 0xcb, 0xe5, 0x9b, 0x8a, 0xb6, 0xce, 0x40, 0x5c, 0x47, 0x1a, 0xcc, 0xbe, 0xcf, 0x7c, 0x38, 0x4a, 0xe4, 0xa7, 0xfc, + 0x73, 0x4f, 0x2f, 0x9f, 0xbe, 0xf6, 0x23, 0x1a, 0xeb, 0x9a, 0x28, 0x7d, 0x48, 0xda, 0x98, 0x05, 0x89, 0x65, 0x30, 0x07, 0x9a, 0x35, 0x42, 0x40, 0x6f, 0x8c, 0xba, 0xd8, 0x74, 0xae, 0x41, 0x53, + 0x1b, 0xb5, 0x39, 0x62, 0xe0, 0x98, 0xdc, 0xd5, 0x69, 0x1e, 0xe9, 0xc6, 0x7d, 0x7a, 0xe5, 0xce, 0xfb, 0xe7, 0x6d, 0x88, 0x3b, 0xb2, 0xce, 0x6e, 0xfe, 0xba, 0xbc, 0xd5, 0x3f, 0x7f, 0x40, 0xfc, + 0xe3, 0x5b, 0x2f, 0x72, 0x76, 0xa7, 0xae, 0xe3, 0x29, 0xda, 0x80, 0xcc, 0x58, 0x8b, 0xaa, 0x97, 0x57, 0x11, 0x52, 0x95, 0x4b, 0xef, 0x39, 0x66, 0xb0, 0x9b, 0xeb, 0x00, 0x88, 0xac, 0xe6, 0xb2, + 0x3a, 0x28, 0x97, 0xd8, 0xa8, 0x0d, 0xf8, 0x67, 0x77, 0x5f, 0x72, 0xec, 0xaa, 0x89, 0xfb, 0x9b, 0xab, 0xcf, 0xfc, 0xea, 0x72, 0x7f, 0xbe, 0xf1, 0xe9, 0x07, 0xaf, 0x0f, 0x4c, 0xa2, 0x2e, 0x14, + 0xd8, 0xd6, 0x8c, 0x06, 0x6d, 0x0c, 0x30, 0xd8, 0x8d, 0x03, 0x86, 0x42, 0xca, 0x0e, 0x93, 0x78, 0x70, 0xf3, 0x80, 0x48, 0x6b, 0x9d, 0x25, 0xd1, 0x11, 0xac, 0xa3, 0xa8, 0x69, 0x3b, 0x1c, 0x28, + 0x7f, 0x36, 0xbe, 0xf5, 0xa7, 0x0a, 0xca, 0xb7, 0xd5, 0xfa, 0xc7, 0x07, 0x5a, 0x5f, 0xa6, 0x84, 0x4e, 0x4c, 0x34, 0xf4, 0x95, 0x3d, 0x9b, 0xba, 0x4d, 0x97, 0x32, 0x1c, 0xcb, 0x40, 0x6c, 0xb2, + 0xdb, 0x52, 0x8b, 0xd9, 0xbd, 0xb5, 0xdd, 0x98, 0x83, 0x35, 0x60, 0xb5, 0x91, 0x0a, 0x03, 0x68, 0x0e, 0x9a, 0x54, 0x29, 0xad, 0xb7, 0xc3, 0x63, 0x15, 0x6f, 0xf2, 0xcb, 0xab, 0xb7, 0x8d, 0x5f, + 0xff, 0x75, 0xf7, 0xc2, 0x5b, 0x3a, 0xb5, 0x40, 0x32, 0x44, 0x6f, 0x10, 0x04, 0xb2, 0xbb, 0xfd, 0x44, 0x2d, 0x82, 0xa5, 0x8a, 0xb3, 0x47, 0x30, 0x02, 0xcc, 0xa5, 0x32, 0x18, 0xb3, 0x7a, 0xe5, + 0x00, 0xdd, 0x75, 0x77, 0x98, 0x62, 0x1f, 0x16, 0xab, 0xd6, 0x3c, 0x16, 0x29, 0x7c, 0x52, 0xd3, 0xb4, 0x97, 0xd9, 0x38, 0xb9, 0x3c, 0xc6, 0x26, 0x57, 0xcd, 0x67, 0xf4, 0xf2, 0x96, 0x29, 0x58, + 0x39, 0x67, 0x62, 0x88, 0x14, 0xb7, 0x96, 0x6a, 0xc0, 0xba, 0x62, 0x70, 0x80, 0xef, 0x7a, 0x59, 0x69, 0xf5, 0xd5, 0xca, 0xb0, 0x99, 0x2a, 0x2f, 0x3f, 0x56, 0xae, 0xf0, 0xb0, 0x39, 0xcf, 0x05, + 0xeb, 0xf4, 0x83, 0x0c, 0x21, 0x38, 0x4d, 0xb2, 0xd0, 0x61, 0xcd, 0x09, 0xd2, 0xd0, 0x9d, 0x38, 0x47, 0x1f, 0x25, 0xe6, 0x03, 0x8c, 0x97, 0x7a, 0xe0, 0xa0, 0xd0, 0x6d, 0xab, 0x78, 0x38, 0xd6, + 0x64, 0x6c, 0x21, 0x4a, 0x8d, 0x8e, 0xb8, 0x73, 0xf7, 0x6b, 0x3f, 0xdb, 0x35, 0xc5, 0xbc, 0x22, 0x5f, 0xcf, 0x5f, 0x7b, 0x6b, 0xbd, 0xb1, 0x1b, 0xbf, 0x16, 0x85, 0xa3, 0xa7, 0x6b, 0x5b, 0x63, + 0x03, 0x15, 0x35, 0x9d, 0xb1, 0x0b, 0x7a, 0x25, 0x7b, 0xdf, 0xa0, 0x92, 0x15, 0x41, 0xd4, 0xc0, 0x29, 0x36, 0x97, 0x5b, 0xcc, 0xaa, 0x55, 0x83, 0x9b, 0x1e, 0xab, 0xfd, 0xbb, 0x9f, 0xed, 0xbc, + 0x7f, 0x4c, 0x00, 0x4f, 0x1d, 0xd2, 0x49, 0xe7, 0xd1, 0x86, 0x5a, 0xaa, 0x6b, 0x3a, 0x93, 0x26, 0x31, 0xaf, 0x90, 0x90, 0x8e, 0xab, 0x72, 0xe8, 0x88, 0x46, 0x38, 0x3a, 0x62, 0xd3, 0x35, 0x9c, + 0x32, 0x1b, 0x22, 0x76, 0x29, 0x17, 0x99, 0xc7, 0xfc, 0xee, 0xfb, 0xb9, 0x40, 0xf7, 0xe3, 0x43, 0x5f, 0xdb, 0xa7, 0x27, 0x6f, 0xbd, 0x3d, 0xa5, 0x32, 0xbb, 0x72, 0x6c, 0x30, 0x5c, 0x86, 0xa6, + 0x3a, 0xab, 0x4b, 0x4b, 0xa6, 0xea, 0xa4, 0x9b, 0x45, 0x9e, 0xb0, 0x70, 0x15, 0x4b, 0x54, 0x1f, 0x6e, 0x19, 0x04, 0x09, 0x0d, 0x96, 0x44, 0x5f, 0x8d, 0x82, 0x0e, 0x53, 0xfa, 0x0f, 0x43, 0x90, + 0x4f, 0x06, 0x27, 0xed, 0x13, 0x3e, 0x4f, 0xed, 0xa0, 0xb0, 0x48, 0x0a, 0x87, 0x4b, 0x85, 0x66, 0x9f, 0x3a, 0x7c, 0xd9, 0x2a, 0x74, 0x4d, 0xf1, 0xc4, 0x4c, 0xa9, 0xf0, 0xc4, 0x36, 0x96, 0x0f, + 0x56, 0xe9, 0x39, 0x9b, 0x48, 0x08, 0x48, 0x85, 0x2c, 0xac, 0x23, 0xd3, 0x5f, 0x1e, 0x3a, 0xd7, 0xee, 0x95, 0xf9, 0xfb, 0x5f, 0x7e, 0x78, 0xe7, 0xfa, 0x8b, 0xcb, 0xb1, 0xde, 0xfa, 0x58, 0x66, + 0x94, 0x0e, 0x56, 0xae, 0x15, 0xe2, 0x10, 0x38, 0x9b, 0x0e, 0x92, 0x64, 0x44, 0x82, 0xd6, 0x6a, 0x3a, 0xf5, 0xa0, 0x5e, 0x02, 0xad, 0x67, 0x9b, 0x11, 0xcb, 0xa8, 0xc9, 0x50, 0x31, 0x34, 0xea, + 0x9e, 0x47, 0x66, 0xde, 0xec, 0x8d, 0x89, 0x7b, 0xff, 0x4f, 0x38, 0xf1, 0x59, 0xcf, 0xe0, 0x85, 0xfe, 0x3d, 0xb5, 0xb0, 0x2f, 0x27, 0x2f, 0x65, 0x02, 0x1f, 0xab, 0x63, 0xb4, 0x2c, 0x2e, 0x35, + 0x9a, 0xae, 0x96, 0x81, 0xe2, 0xa8, 0x9a, 0x82, 0x33, 0xac, 0x19, 0x80, 0x19, 0xb6, 0x29, 0x19, 0xb1, 0xc2, 0x46, 0x4e, 0x4a, 0x38, 0x3c, 0x36, 0xf1, 0xd9, 0xdd, 0x4d, 0xef, 0x0f, 0x8e, 0x0f, + 0x7c, 0x32, 0xef, 0x7a, 0xfb, 0xfc, 0x30, 0x36, 0x77, 0x7b, 0x7c, 0x96, 0x26, 0x7f, 0x8d, 0x3b, 0xfb, 0xcc, 0x99, 0x27, 0x97, 0x0d, 0x1c, 0x2c, 0xb2, 0x46, 0x85, 0x8e, 0xb6, 0xa0, 0x51, 0xf1, + 0x58, 0x3c, 0x97, 0x8c, 0xc6, 0xb2, 0x7a, 0x6a, 0xc4, 0xd4, 0x99, 0x8b, 0x22, 0xfa, 0x88, 0x19, 0x00, 0xa3, 0x4f, 0xa8, 0xb1, 0x29, 0xf2, 0x59, 0xda, 0x8e, 0x9a, 0xd6, 0xf3, 0x4f, 0x97, 0x7a, + 0x71, 0xf6, 0xf9, 0xea, 0xea, 0xb7, 0xb3, 0xc7, 0x55, 0xee, 0x1d, 0xef, 0xd3, 0x97, 0x64, 0xe6, 0x80, 0xe4, 0xde, 0x71, 0x85, 0x93, 0x7a, 0x73, 0x76, 0xb7, 0xd0, 0xae, 0x24, 0x14, 0xa5, 0xad, + 0xc7, 0xfd, 0x35, 0x5e, 0x34, 0x1b, 0x2c, 0x40, 0xae, 0xd9, 0x7c, 0x4a, 0x2f, 0x9c, 0xb4, 0x68, 0x0c, 0x3b, 0xec, 0xb6, 0xbe, 0x5e, 0xf0, 0xb0, 0xab, 0x68, 0xdb, 0x4f, 0x99, 0x9d, 0xda, 0x33, + 0x2d, 0xd8, 0xf0, 0x51, 0x0f, 0x50, 0xce, 0x6e, 0xb8, 0x5a, 0xeb, 0x45, 0x2d, 0xb2, 0xd9, 0xf0, 0xe4, 0x4a, 0x64, 0x68, 0x25, 0x26, 0xe1, 0xbd, 0xbc, 0xaf, 0x39, 0xc9, 0xd3, 0x32, 0x69, 0x5a, + 0xb7, 0x39, 0xf0, 0x58, 0x98, 0xfb, 0x5b, 0x96, 0xfb, 0xf9, 0xbe, 0x9c, 0x7e, 0xc8, 0x6e, 0x65, 0xab, 0xce, 0x2e, 0xb9, 0xaa, 0xfb, 0x50, 0xd2, 0x39, 0x35, 0xe6, 0x18, 0x2a, 0xdd, 0x99, 0x42, + 0xd5, 0x49, 0xa3, 0x35, 0x27, 0x82, 0xd1, 0xbb, 0xd5, 0xf0, 0x99, 0x2c, 0xd2, 0xcc, 0x08, 0x67, 0xa3, 0xa3, 0x0e, 0xe8, 0xee, 0x66, 0x87, 0xfd, 0x03, 0x72, 0xf2, 0x24, 0xc3, 0xe6, 0x5e, 0x62, + 0x74, 0xc7, 0x09, 0x86, 0xbd, 0x2d, 0x6b, 0xb1, 0x9a, 0xe3, 0xac, 0x2a, 0x1b, 0x2b, 0x80, 0xd3, 0x74, 0x81, 0x92, 0xe5, 0xee, 0xd6, 0x34, 0x68, 0x50, 0x04, 0xd3, 0x88, 0x97, 0xb3, 0xf8, 0x91, + 0x60, 0xe3, 0xd3, 0x09, 0xcd, 0xef, 0x1f, 0x6f, 0xa9, 0x38, 0xfb, 0xa1, 0x97, 0xf0, 0xf4, 0xad, 0x37, 0x27, 0x1c, 0x46, 0x5b, 0xb9, 0x9d, 0x1b, 0xef, 0x13, 0x13, 0xfb, 0x02, 0x2e, 0x99, 0x1e, + 0x09, 0x6b, 0xd3, 0x9c, 0x43, 0xa6, 0xe2, 0x40, 0x10, 0x5d, 0x86, 0x3e, 0x67, 0xae, 0xb0, 0xde, 0xbd, 0xf5, 0x41, 0x3d, 0x3a, 0x8c, 0x93, 0x8e, 0x5f, 0x7f, 0x6c, 0xf7, 0x7b, 0x4e, 0x74, 0x3f, + 0x7d, 0x2a, 0x06, 0x10, 0x73, 0x70, 0x03, 0xe8, 0x81, 0x2b, 0x98, 0x7b, 0x9b, 0x9b, 0xb5, 0x40, 0xc2, 0x39, 0x6d, 0x4e, 0x1e, 0xbd, 0x66, 0xaa, 0xc0, 0xe0, 0xb1, 0xe6, 0x80, 0x29, 0xd3, 0x66, + 0xf6, 0x91, 0x24, 0xb5, 0x56, 0xcc, 0xbf, 0x3d, 0x26, 0xe6, 0xa7, 0x8a, 0x4b, 0x6e, 0x6e, 0xf5, 0x32, 0xec, 0x65, 0x2a, 0x0a, 0x3f, 0xc0, 0xa9, 0xb3, 0x1f, 0x09, 0xd0, 0xcb, 0x66, 0xf5, 0xc8, + 0xc6, 0x8a, 0x3b, 0xcf, 0x80, 0x74, 0xcc, 0xf4, 0x59, 0xb0, 0x66, 0x54, 0x0c, 0x70, 0x6b, 0x8b, 0x68, 0x6d, 0x9e, 0x6f, 0xb2, 0xb9, 0x26, 0xf7, 0x5a, 0x5c, 0x85, 0xab, 0x0e, 0x27, 0xa7, 0x1f, + 0x16, 0xfd, 0xa3, 0x69, 0x40, 0x37, 0xb7, 0xb1, 0x7f, 0x79, 0xfb, 0xae, 0x02, 0xe1, 0xd4, 0x82, 0x1d, 0x0d, 0x91, 0x64, 0x1a, 0x4c, 0xdc, 0xdd, 0xdd, 0x68, 0x63, 0xf3, 0x0a, 0x7a, 0xd3, 0x14, + 0xc9, 0x06, 0xca, 0x3d, 0xb8, 0xb3, 0x61, 0xd1, 0x88, 0xbe, 0x2a, 0x83, 0x32, 0x8a, 0xa5, 0xa4, 0xe3, 0x50, 0x88, 0xc3, 0xc3, 0x5c, 0x1e, 0x47, 0xc6, 0xef, 0xdc, 0x9f, 0x67, 0x81, 0x8b, 0x9d, + 0x70, 0xef, 0x48, 0xfb, 0x7e, 0xc0, 0xbf, 0x7d, 0xf3, 0x58, 0x75, 0xf0, 0xf4, 0x62, 0xf7, 0xfd, 0x1f, 0x5d, 0xdf, 0x7d, 0x9f, 0xcb, 0xfc, 0x73, 0x2d, 0x93, 0xcf, 0xff, 0x73, 0xfb, 0x01, 0xea, + 0x53, 0xdb, 0x27, 0x5f, 0xac, 0xb3, 0x29, 0xb5, 0x72, 0xf7, 0x45, 0x96, 0xd5, 0xe6, 0xc0, 0x4e, 0xc3, 0xb6, 0xff, 0x25, 0x36, 0x9d, 0x6d, 0x58, 0x8d, 0x68, 0x9e, 0x0b, 0x18, 0xa4, 0x9c, 0x78, + 0xd6, 0xf0, 0xd6, 0x6d, 0xb4, 0xfc, 0xdb, 0x05, 0x0d, 0x7b, 0x57, 0xfd, 0x3c, 0x65, 0xea, 0xab, 0x3a, 0xe4, 0x30, 0xc7, 0xf7, 0x8f, 0xd4, 0xa9, 0x35, 0xca, 0x58, 0xa5, 0xa3, 0x6a, 0x6a, 0xb4, + 0x90, 0x15, 0x50, 0xa5, 0xcb, 0x0d, 0x60, 0x2c, 0x41, 0x9b, 0x39, 0x25, 0x26, 0xb3, 0x48, 0x4d, 0x9e, 0x3d, 0x61, 0xa2, 0x82, 0x4b, 0x18, 0x21, 0x84, 0x23, 0xe6, 0xb1, 0x29, 0x1a, 0xf7, 0xd7, + 0xe6, 0xbe, 0xff, 0xc7, 0x8c, 0xda, 0xbb, 0x24, 0x69, 0x73, 0x35, 0xff, 0x36, 0x03, 0x1f, 0xe5, 0xf2, 0x39, 0x07, 0x4f, 0x7f, 0x21, 0x0d, 0x42, 0xe7, 0x06, 0xa6, 0xbd, 0x73, 0x63, 0xa2, 0xf0, + 0x00, 0x05, 0x94, 0xd9, 0x5c, 0x95, 0x16, 0x75, 0xeb, 0x31, 0x97, 0x51, 0x80, 0xb7, 0x0d, 0xbd, 0xf2, 0xc8, 0x16, 0x73, 0xd8, 0x86, 0xe7, 0x02, 0xe6, 0xd1, 0x5b, 0x12, 0x36, 0x5a, 0xf7, 0x11, + 0x27, 0x9f, 0x3a, 0x5b, 0xa5, 0x90, 0xcb, 0xc3, 0xb2, 0x8c, 0x45, 0x45, 0x87, 0xce, 0x6d, 0x75, 0xb6, 0x8c, 0xd8, 0x76, 0x57, 0xed, 0x4b, 0x63, 0x63, 0xe7, 0x5a, 0x24, 0xd3, 0x79, 0x2a, 0x30, + 0x6f, 0x7e, 0x5d, 0x87, 0x66, 0x6a, 0x47, 0x66, 0x3c, 0x1f, 0xdf, 0xf2, 0x9f, 0xca, 0x33, 0x7f, 0x9f, 0xe4, 0xbe, 0x1f, 0xb8, 0x3b, 0x35, 0xf5, 0x18, 0x95, 0xb1, 0x44, 0xaa, 0xa5, 0xdd, 0x5f, + 0x23, 0x99, 0xcb, 0xa7, 0x36, 0x55, 0x0b, 0x5b, 0xca, 0x42, 0x32, 0x87, 0x64, 0xa7, 0x39, 0xc7, 0x84, 0xf2, 0xa6, 0x51, 0x83, 0x12, 0x67, 0xac, 0xe5, 0xa3, 0x0e, 0x97, 0xba, 0x3d, 0x34, 0x4f, + 0xbf, 0x3e, 0x4a, 0xf5, 0xf6, 0xf3, 0xf9, 0xcd, 0xa1, 0x4c, 0x7a, 0x7b, 0x83, 0x80, 0xbf, 0xce, 0xe2, 0x49, 0x83, 0x6b, 0xc8, 0x00, 0x72, 0xce, 0x34, 0xca, 0x21, 0xb1, 0x04, 0xba, 0x8c, 0x52, + 0x6b, 0x86, 0x15, 0x10, 0xd4, 0x18, 0xfb, 0x66, 0x2d, 0x39, 0xe6, 0xce, 0xd5, 0x15, 0x4c, 0xf1, 0xc3, 0xf8, 0xf2, 0xdb, 0xfa, 0xcf, 0xce, 0xbf, 0x7c, 0xfd, 0x19, 0x3a, 0xef, 0xdf, 0x7b, 0x73, + 0x62, 0x97, 0xf6, 0xc9, 0x73, 0x79, 0x2b, 0x2b, 0x30, 0x83, 0x91, 0xae, 0xd0, 0x22, 0x4b, 0x51, 0x06, 0x4e, 0x0b, 0xe5, 0xde, 0x14, 0x3b, 0x4f, 0x47, 0x35, 0xea, 0xd2, 0xdd, 0x4b, 0x61, 0x96, + 0x81, 0x76, 0x38, 0xd2, 0x1f, 0xff, 0x0f, 0x9d, 0xc2, 0xdb, 0xcf, 0xd7, 0xa9, 0xf1, 0xf5, 0xea, 0x6a, 0x9f, 0xee, 0x75, 0x72, 0x08, 0x13, 0x6d, 0xb4, 0x9c, 0xcd, 0x7a, 0x0f, 0x02, 0x07, 0x81, + 0xb6, 0xac, 0xa3, 0xa7, 0x76, 0x84, 0x49, 0xad, 0x77, 0x95, 0x06, 0xbd, 0xb2, 0x1b, 0x4d, 0xb7, 0x20, 0x1a, 0x3c, 0x86, 0x58, 0x59, 0x31, 0x6b, 0xe9, 0xe1, 0xe4, 0xc0, 0xb7, 0xce, 0x80, 0xe3, + 0x14, 0x1e, 0x52, 0xaf, 0x74, 0x72, 0xfb, 0xad, 0xeb, 0x61, 0x5a, 0xd0, 0x6c, 0x65, 0x01, 0x99, 0xd6, 0xd2, 0x83, 0x26, 0xcb, 0xd0, 0xc5, 0x0a, 0xd2, 0x90, 0xd2, 0xc8, 0x46, 0xf7, 0x11, 0x2e, + 0x30, 0x5d, 0xa1, 0x42, 0x46, 0xe5, 0x44, 0x3a, 0x52, 0xf1, 0xf2, 0x37, 0x5d, 0xdc, 0x03, 0x94, 0xee, 0x2e, 0x48, 0x3b, 0x2d, 0xa5, 0x6d, 0x6d, 0xb6, 0xb7, 0xac, 0x88, 0x65, 0x0c, 0xe8, 0x18, + 0x0d, 0x1b, 0x06, 0xcc, 0x89, 0xb5, 0x2b, 0xb6, 0xd8, 0xce, 0x67, 0x1f, 0x6b, 0xa2, 0x66, 0x12, 0x43, 0x75, 0x53, 0x32, 0xe8, 0xbd, 0x8f, 0x55, 0x9d, 0x0f, 0x6b, 0xe3, 0x6f, 0xb7, 0x04, 0x3e, + 0xf3, 0xec, 0xbf, 0xfb, 0xec, 0xdf, 0x5d, 0xba, 0xdd, 0xe3, 0x46, 0xe9, 0x53, 0x6f, 0x6f, 0xdf, 0x39, 0xfe, 0x3b, 0x1c, 0x3b, 0xec, 0xc3, 0x9c, 0xbe, 0x4d, 0x41, 0x06, 0x6f, 0x9a, 0x2a, 0x71, + 0x16, 0xa0, 0xdb, 0x8c, 0x16, 0xc1, 0xe5, 0xcc, 0xd3, 0x6c, 0xb2, 0x72, 0x9b, 0x1d, 0x30, 0x19, 0x45, 0x34, 0x83, 0xc9, 0x57, 0xc4, 0xb0, 0x0d, 0x19, 0x1b, 0xee, 0x86, 0xbf, 0xfc, 0xe0, 0xd4, + 0x7f, 0x1f, 0x0d, 0xfb, 0x84, 0xa8, 0x1f, 0x29, 0xbe, 0xfd, 0x37, 0xdf, 0x9a, 0x07, 0x39, 0xbc, 0x5b, 0x42, 0x46, 0x69, 0xcc, 0x86, 0xec, 0x53, 0x6a, 0x90, 0x80, 0x17, 0xb9, 0x75, 0x68, 0x01, + 0xca, 0x90, 0x1e, 0x53, 0x8b, 0x09, 0x79, 0x2d, 0x9f, 0x55, 0xcb, 0x3c, 0x63, 0x4d, 0x5b, 0x75, 0x58, 0x05, 0xfc, 0xcd, 0xf1, 0xd2, 0xcf, 0x65, 0xea, 0x55, 0xdd, 0x78, 0x7e, 0xf9, 0xd7, 0xcb, + 0xd8, 0xce, 0xe9, 0xab, 0x36, 0x86, 0x0d, 0xc4, 0x56, 0x6d, 0x98, 0x71, 0x24, 0x57, 0xaf, 0xd1, 0x9d, 0xbd, 0xcd, 0x91, 0x00, 0x22, 0xd6, 0x81, 0x71, 0xca, 0xac, 0xc4, 0x30, 0x29, 0x71, 0x8a, + 0xa5, 0x21, 0x46, 0x99, 0x4c, 0xde, 0xe9, 0xf0, 0x89, 0x7a, 0x58, 0xfc, 0xc7, 0x6f, 0xa7, 0xe4, 0x75, 0x22, 0x3f, 0x1e, 0x39, 0x05, 0xa7, 0xa6, 0xd5, 0x43, 0x99, 0x42, 0x39, 0x41, 0xe7, 0xa4, + 0x62, 0x19, 0x66, 0x50, 0x4b, 0x17, 0xa7, 0x53, 0xdb, 0x35, 0x08, 0x6a, 0xc3, 0x81, 0xe8, 0x35, 0x73, 0xb4, 0x89, 0x2d, 0x1a, 0x4c, 0x8d, 0x98, 0xbb, 0x0b, 0x88, 0x8e, 0xb5, 0x7c, 0xdf, 0x0f, + 0xe7, 0x7c, 0xa1, 0xfb, 0x4e, 0x6d, 0xb9, 0x27, 0xb7, 0xae, 0xc8, 0x5d, 0x48, 0x76, 0xc6, 0x0a, 0x0c, 0xa5, 0x59, 0xc2, 0x86, 0xe1, 0x5b, 0x97, 0x68, 0xe5, 0x6b, 0x91, 0x2a, 0xc8, 0xa6, 0x00, + 0x5b, 0x94, 0x5b, 0xb6, 0x31, 0x0b, 0x97, 0xc7, 0x6a, 0x72, 0xe4, 0xb6, 0x91, 0xfd, 0x11, 0xa6, 0xfb, 0xa3, 0x4b, 0x9f, 0xb4, 0xc1, 0xee, 0xdd, 0xd8, 0xfa, 0xbd, 0x2d, 0xf6, 0x7b, 0x3d, 0xc7, + 0x97, 0x87, 0x29, 0xa5, 0x8f, 0x9d, 0xbf, 0xef, 0x0f, 0x8f, 0x9a, 0xde, 0x95, 0xa5, 0xef, 0x8e, 0xc0, 0xa1, 0x30, 0xf3, 0xfb, 0x83, 0x9d, 0xc6, 0xaf, 0xeb, 0xd2, 0xef, 0x53, 0x51, 0x5f, 0x44, + 0x98, 0x4e, 0xbc, 0x0d, 0x96, 0x0b, 0x09, 0x97, 0x40, 0xa1, 0x4d, 0xb7, 0x2c, 0x9c, 0x8a, 0xc1, 0xb9, 0x66, 0x1b, 0xd0, 0xbb, 0xa3, 0x8f, 0x41, 0x1e, 0x7d, 0x58, 0x4f, 0x12, 0x5a, 0xa9, 0x4b, + 0x30, 0x66, 0xcc, 0x45, 0x7d, 0x92, 0x1c, 0x4e, 0xc6, 0xfc, 0x70, 0x1b, 0x5e, 0x4c, 0x90, 0x7d, 0x6c, 0xd2, 0x7e, 0x8d, 0xbb, 0x8f, 0x53, 0x63, 0x8f, 0x31, 0xed, 0x61, 0x76, 0xec, 0xfe, 0xb1, + 0x3b, 0xbd, 0xd5, 0x16, 0x8d, 0xb4, 0xe5, 0xc2, 0x44, 0xd2, 0x01, 0xdc, 0x03, 0x97, 0x12, 0x72, 0xc9, 0x2c, 0x1b, 0xb3, 0x27, 0x57, 0x74, 0x50, 0xb5, 0x12, 0x21, 0x58, 0xb2, 0x58, 0x42, 0x42, + 0xb1, 0x0b, 0xd9, 0x92, 0xc3, 0x3e, 0xe7, 0xcb, 0x98, 0xdc, 0x71, 0x8e, 0x3c, 0x8e, 0x36, 0x7f, 0x9c, 0x90, 0xfb, 0x7a, 0x41, 0xd9, 0xb3, 0xb7, 0x5e, 0x58, 0xa5, 0x53, 0x17, 0x94, 0xa9, 0x54, + 0x01, 0x95, 0x2c, 0x03, 0x25, 0xc3, 0x25, 0x3e, 0x91, 0x96, 0x36, 0xec, 0x0e, 0x8e, 0xa5, 0x40, 0x02, 0x6d, 0xa2, 0x4c, 0x4a, 0xa9, 0x8c, 0xc9, 0x6a, 0x28, 0x4e, 0x49, 0xa1, 0xa4, 0x6d, 0x1c, + 0x3e, 0xd6, 0xcf, 0xcf, 0xea, 0x0f, 0xe8, 0x7c, 0x9c, 0x17, 0xbc, 0xaf, 0xc1, 0x4e, 0xad, 0xc0, 0x84, 0xa3, 0xc9, 0xd0, 0x84, 0x91, 0x48, 0x43, 0xdb, 0x60, 0x5f, 0xb9, 0x68, 0x80, 0xa9, 0x89, + 0xf5, 0x4c, 0x48, 0xa8, 0xb9, 0x52, 0x4c, 0xd1, 0xa8, 0xcc, 0x61, 0x45, 0x53, 0x1f, 0xd8, 0x79, 0xf5, 0x51, 0x47, 0xa0, 0xf4, 0xf7, 0xdd, 0xfe, 0xd6, 0x2e, 0xf5, 0x74, 0x2c, 0xf2, 0x51, 0xda, + 0xb7, 0x35, 0xc7, 0xe5, 0xcd, 0xf6, 0xcb, 0xb7, 0xfb, 0xda, 0x1b, 0xe4, 0xe4, 0x95, 0xf5, 0xe0, 0x1a, 0x0c, 0xda, 0xbc, 0xc5, 0x5c, 0x6a, 0x9b, 0x9c, 0x07, 0x96, 0xcd, 0x5c, 0x58, 0xab, 0x0c, + 0x73, 0xcd, 0x10, 0xa1, 0x61, 0x42, 0x09, 0x73, 0x42, 0x44, 0x53, 0x4d, 0x45, 0x5b, 0x0b, 0x61, 0xe8, 0x61, 0xb5, 0xb1, 0x7f, 0x73, 0xf7, 0x8b, 0x33, 0xf1, 0xfc, 0x7e, 0xbf, 0xf7, 0x7b, 0x17, + 0x72, 0xef, 0x06, 0x7e, 0x1e, 0x54, 0xed, 0x8f, 0x97, 0xc7, 0xe9, 0xe5, 0xc3, 0x6c, 0xff, 0xa7, 0x0d, 0x95, 0xdf, 0xa1, 0xf9, 0xfb, 0x67, 0xa3, 0xa9, 0xef, 0xef, 0xe7, 0xfe, 0x21, 0xc3, 0xef, + 0x0b, 0xe1, 0x5e, 0x36, 0xc8, 0x9f, 0x9e, 0xe7, 0x0c, 0xad, 0x86, 0x74, 0xeb, 0x0c, 0xc0, 0x23, 0x6c, 0x74, 0xc5, 0x19, 0xcd, 0xfa, 0xca, 0x40, 0xe1, 0x55, 0x5a, 0x26, 0x29, 0xb9, 0xa2, 0xaf, + 0xb9, 0x9d, 0x3f, 0x0f, 0x1e, 0x3d, 0x15, 0x56, 0x54, 0xf3, 0x23, 0xcd, 0xb9, 0x87, 0xa6, 0x6f, 0x3c, 0x61, 0xe9, 0xe3, 0x50, 0xc6, 0xd7, 0xd8, 0xfa, 0x7d, 0x92, 0xd2, 0x8e, 0xc9, 0x4f, 0x0a, + 0x03, 0x7f, 0x9a, 0xd7, 0xfb, 0xf2, 0x7b, 0x9c, 0xef, 0x0f, 0x43, 0xfd, 0xf7, 0x22, 0x45, 0xa7, 0xef, 0xe6, 0xde, 0x4d, 0x50, 0x97, 0x36, 0x49, 0x50, 0xd9, 0x03, 0x61, 0x58, 0x29, 0x79, 0x0d, + 0x19, 0x36, 0x5b, 0x03, 0x9a, 0xee, 0xb5, 0xcb, 0xea, 0x8a, 0xb9, 0x05, 0x54, 0x6f, 0xad, 0xc1, 0x44, 0xad, 0x91, 0xcb, 0xda, 0xb1, 0xd6, 0x91, 0x67, 0xe3, 0x5c, 0xf7, 0x6d, 0xfb, 0xa9, 0x35, + 0x54, 0xa6, 0x2d, 0x4b, 0x6c, 0x62, 0x06, 0x2e, 0xd3, 0xd8, 0x81, 0xd9, 0x99, 0xb0, 0x05, 0xce, 0x6c, 0x94, 0xee, 0xea, 0xd6, 0x32, 0x35, 0xa7, 0xc9, 0x6a, 0xd9, 0x47, 0xb9, 0x31, 0x4d, 0x5e, + 0xd0, 0xf8, 0xc8, 0xbd, 0x84, 0xdf, 0x87, 0xd3, 0x1e, 0xd9, 0xa2, 0xc3, 0x03, 0x6a, 0x5f, 0x18, 0x9e, 0x53, 0xc7, 0xb5, 0x63, 0xd0, 0x90, 0x26, 0x1d, 0x85, 0x40, 0x25, 0x05, 0xe7, 0xac, 0xb6, + 0x3a, 0x46, 0x66, 0x2c, 0x4a, 0x4b, 0xb0, 0xc2, 0x24, 0x97, 0x24, 0xed, 0x63, 0x50, 0x74, 0xe9, 0x01, 0x6b, 0xdb, 0xae, 0x41, 0x56, 0x87, 0x35, 0xd2, 0x23, 0x6c, 0xf9, 0x21, 0xb1, 0xcf, 0x06, + 0xa0, 0x3f, 0x17, 0xce, 0xd3, 0x5f, 0xbc, 0x69, 0xd6, 0x02, 0x93, 0x2d, 0xa7, 0x66, 0xd7, 0x51, 0x9b, 0xc7, 0x9f, 0x31, 0xca, 0x68, 0x80, 0xd6, 0xe6, 0x85, 0xe0, 0xe0, 0x1e, 0x38, 0x85, 0x84, + 0x30, 0xa9, 0x0d, 0xea, 0x9a, 0xcd, 0x2c, 0x41, 0x9c, 0xe5, 0x47, 0xb2, 0xf9, 0xe7, 0xf9, 0x7e, 0x0d, 0xd0, 0xe9, 0xbb, 0x26, 0x96, 0xbb, 0x2d, 0x8c, 0x09, 0xb5, 0x9a, 0xce, 0xd9, 0xb3, 0x12, + 0x8a, 0x17, 0xeb, 0x00, 0x83, 0x69, 0x43, 0x07, 0x64, 0xef, 0x40, 0x31, 0xd5, 0xfb, 0x1c, 0xd6, 0xd6, 0xec, 0x52, 0x03, 0xfb, 0x62, 0xeb, 0xfd, 0xe8, 0x58, 0xbe, 0x4d, 0x67, 0x3f, 0x5d, 0x3a, + 0xbe, 0xc1, 0xd2, 0x75, 0x34, 0xf6, 0xbe, 0xba, 0x61, 0xf4, 0x6e, 0xa3, 0xbc, 0x8f, 0x80, 0x35, 0x21, 0x99, 0x73, 0x5a, 0x5f, 0x3d, 0x60, 0x2c, 0xc3, 0xd0, 0x91, 0x40, 0x95, 0x03, 0x6c, 0xf5, + 0xa8, 0x8c, 0x9a, 0x15, 0x83, 0xd7, 0xe1, 0x92, 0xf9, 0x83, 0xe5, 0x4b, 0x8f, 0xf6, 0xec, 0x07, 0xb7, 0x47, 0xfe, 0xb0, 0xae, 0xe9, 0xee, 0xee, 0xc5, 0x8e, 0xae, 0x93, 0xb3, 0xc5, 0x7c, 0x78, + 0xc9, 0x8a, 0x05, 0x6b, 0x22, 0x11, 0x01, 0xf9, 0xa2, 0xd5, 0x80, 0xab, 0x25, 0x4e, 0x9e, 0xd6, 0xcb, 0x8d, 0xe6, 0x6a, 0x5c, 0x73, 0xce, 0xa5, 0xc2, 0x51, 0x39, 0xb9, 0x0f, 0xd1, 0xee, 0x64, + 0x87, 0xeb, 0x12, 0x9e, 0xb6, 0x85, 0xe0, 0x87, 0x7e, 0x9c, 0xc4, 0xe7, 0x51, 0xab, 0xe7, 0xb4, 0xca, 0xc9, 0x33, 0x8c, 0xa3, 0xd2, 0xc3, 0x55, 0x74, 0xa0, 0x80, 0x3b, 0xda, 0x0a, 0x2f, 0x0e, + 0x6f, 0x48, 0xa3, 0x57, 0x26, 0x0b, 0x28, 0xae, 0x56, 0x9d, 0xa9, 0xbb, 0x35, 0x69, 0xa3, 0xd6, 0x42, 0xd4, 0xa4, 0xd9, 0xad, 0xd7, 0xb1, 0x0a, 0x92, 0x3f, 0xf4, 0x66, 0xdf, 0x28, 0xbc, 0x72, + 0x61, 0xcb, 0x69, 0x49, 0x72, 0xf7, 0x88, 0xea, 0x38, 0x06, 0x55, 0xba, 0x4f, 0x75, 0x1b, 0x6b, 0xd4, 0x42, 0xed, 0xa8, 0x8c, 0x89, 0xcb, 0x68, 0xd5, 0x72, 0x72, 0x58, 0xab, 0x47, 0x54, 0x66, + 0xaa, 0xca, 0x2c, 0x8e, 0x95, 0x63, 0xd3, 0xe6, 0x3f, 0x4b, 0xd2, 0x6b, 0x97, 0xac, 0x9c, 0x96, 0xa6, 0x8a, 0x59, 0x16, 0xa2, 0x2c, 0x0b, 0x25, 0x02, 0x34, 0x9a, 0x3b, 0xb6, 0x89, 0x6c, 0x05, + 0x19, 0xb3, 0x4d, 0x1e, 0x53, 0xb9, 0x98, 0x33, 0xaa, 0xd8, 0xe6, 0x34, 0x6e, 0x93, 0x4a, 0xdc, 0x3a, 0xb2, 0x1f, 0xd3, 0x93, 0xcf, 0x72, 0xde, 0xfb, 0x8a, 0x92, 0x4f, 0x5d, 0x23, 0x1a, 0x83, + 0x32, 0x21, 0x28, 0x83, 0xd6, 0x2c, 0x5e, 0x6b, 0x17, 0xcd, 0xcb, 0xd9, 0x93, 0xda, 0xdc, 0xdd, 0x44, 0x66, 0x52, 0x53, 0x61, 0xb9, 0x92, 0x60, 0xe3, 0x59, 0x65, 0xd2, 0x7c, 0xa4, 0xa1, 0x08, + 0xd7, 0x4f, 0xa2, 0xcd, 0xa7, 0x34, 0x7d, 0xbb, 0x84, 0xeb, 0xc8, 0x59, 0x7b, 0xf6, 0xae, 0xa9, 0xff, 0x96, 0x2f, 0x9a, 0x10, 0xdf, 0x80, 0x0f, 0x7d, 0xd3, 0xfb, 0x53, 0xdb, 0x14, 0x72, 0xaf, + 0xd4, 0xd1, 0x43, 0x28, 0x6c, 0x19, 0x66, 0x80, 0x77, 0x5d, 0x4a, 0xbe, 0x66, 0x84, 0xf4, 0x69, 0xd0, 0x4d, 0xaa, 0x29, 0x8c, 0x74, 0xd2, 0x0d, 0x91, 0xc9, 0x91, 0x26, 0x10, 0xbb, 0xfb, 0xf2, + 0x55, 0x2f, 0xae, 0x5e, 0x75, 0x6f, 0x7f, 0x94, 0x0d, 0xda, 0x63, 0xc8, 0xcd, 0x67, 0xbd, 0xce, 0x57, 0xb2, 0x9d, 0x07, 0x38, 0xfd, 0xe6, 0xbc, 0x6b, 0x6b, 0xc1, 0x14, 0xd7, 0x09, 0xd4, 0x5b, + 0x25, 0xe4, 0x58, 0xb6, 0x9a, 0x4c, 0x47, 0x12, 0x1e, 0x38, 0x80, 0x5b, 0x4b, 0x36, 0xd8, 0x4c, 0xd4, 0xa6, 0xd0, 0x24, 0x86, 0x58, 0xa3, 0x32, 0x31, 0x58, 0x16, 0x87, 0xf3, 0x9e, 0xdf, 0xf9, + 0xf0, 0x92, 0xa4, 0xb3, 0x9b, 0xbb, 0xaf, 0x5f, 0xaf, 0x76, 0x77, 0xd8, 0xfe, 0x34, 0x1b, 0xbe, 0xfd, 0xce, 0x9b, 0xb3, 0xc3, 0x12, 0x91, 0x60, 0x10, 0x56, 0xf5, 0x90, 0x42, 0x82, 0x1a, 0xb9, + 0xcb, 0x23, 0x44, 0x13, 0xeb, 0x9c, 0x95, 0xbc, 0x66, 0xd4, 0x5a, 0x03, 0x7c, 0x90, 0x0c, 0x9e, 0xab, 0x2b, 0x49, 0x35, 0x59, 0xac, 0xf2, 0x33, 0xfd, 0xba, 0x3f, 0x14, 0x93, 0xc7, 0x73, 0xf3, + 0xaf, 0xc9, 0xcf, 0xc3, 0xcb, 0x6f, 0xce, 0xb1, 0x60, 0xaf, 0x5a, 0x3c, 0x6d, 0x15, 0xac, 0xcc, 0xe0, 0xa1, 0x73, 0x7a, 0x91, 0xd8, 0x1c, 0xc9, 0x25, 0x93, 0xdd, 0xfa, 0x20, 0x65, 0x55, 0x98, + 0xad, 0xf5, 0xb2, 0x31, 0xc2, 0x2a, 0x70, 0x18, 0x91, 0x51, 0x1d, 0xd3, 0xa4, 0x69, 0xff, 0x67, 0xc6, 0xc5, 0xe7, 0xc2, 0x45, 0xc0, 0xd6, 0x59, 0xaa, 0x47, 0x31, 0x00, 0x44, 0x57, 0x54, 0xc9, + 0xc1, 0xa3, 0x73, 0x9b, 0xae, 0x89, 0xe2, 0x04, 0xc5, 0xbb, 0x0b, 0x3c, 0x77, 0xa5, 0xf7, 0xcc, 0xd5, 0xb3, 0x49, 0x8e, 0x23, 0x65, 0x0f, 0x4f, 0x2e, 0x12, 0xfb, 0xb9, 0x32, 0xa8, 0x27, 0x17, + 0x03, 0x3c, 0xa7, 0xf8, 0xf4, 0x35, 0xba, 0x0e, 0x73, 0x09, 0x35, 0x20, 0x8a, 0x40, 0xa8, 0x58, 0x8d, 0xa6, 0x2c, 0x76, 0x98, 0x4a, 0x53, 0x7b, 0x8f, 0x51, 0xbe, 0x28, 0xd3, 0x51, 0xb2, 0x24, + 0x3c, 0xc2, 0x51, 0x5d, 0xb2, 0xc3, 0xc0, 0x0d, 0x28, 0x1e, 0xdb, 0xb0, 0x5d, 0xf8, 0xfa, 0x85, 0xbc, 0x9d, 0x3a, 0x88, 0x08, 0x93, 0xc3, 0x25, 0xe6, 0x2e, 0x37, 0x60, 0x6b, 0x70, 0x75, 0x1a, + 0x80, 0x3c, 0x52, 0x00, 0xbc, 0x17, 0x11, 0x8e, 0xb1, 0x08, 0x1d, 0x8a, 0x95, 0x67, 0xf5, 0xee, 0x63, 0x40, 0xeb, 0x2a, 0x4d, 0xda, 0xe2, 0x63, 0xb3, 0xdf, 0x0f, 0xae, 0xbe, 0x9f, 0xbe, 0xc2, + 0xca, 0x57, 0x17, 0x9d, 0x4c, 0xe5, 0xc1, 0x2a, 0x4b, 0x06, 0xe6, 0x90, 0x8e, 0x84, 0xa9, 0xd4, 0x9a, 0x5a, 0x4a, 0x17, 0xc1, 0x0d, 0x67, 0x4f, 0xc8, 0xbe, 0x26, 0x01, 0xb5, 0x11, 0xb8, 0xac, + 0xb5, 0xa2, 0x23, 0x0d, 0xd2, 0x0f, 0x55, 0x26, 0xe7, 0x73, 0xcd, 0xb3, 0xaf, 0x7e, 0xf6, 0xc7, 0xf9, 0x65, 0x5c, 0xfd, 0x71, 0x73, 0xf6, 0xe9, 0xf2, 0xbe, 0xb3, 0xe1, 0xe1, 0xc7, 0x7f, 0xae, + 0xf9, 0x71, 0xd2, 0xcb, 0x17, 0x8e, 0x0a, 0xe4, 0x93, 0xb9, 0xff, 0x6f, 0x9d, 0xb0, 0xc4, 0xe8, 0x30, 0x32, 0xb3, 0x5b, 0x27, 0x75, 0x25, 0x16, 0xde, 0x50, 0xd2, 0x66, 0xad, 0x33, 0xd6, 0xc2, + 0x39, 0x73, 0xc6, 0x04, 0x1c, 0x13, 0xb5, 0x39, 0xcd, 0x2e, 0x4d, 0x6b, 0xa1, 0x48, 0xf9, 0x14, 0xb1, 0xd7, 0x45, 0xf2, 0x20, 0x63, 0xf6, 0x0f, 0xd9, 0xa9, 0x63, 0x44, 0xea, 0xdd, 0x16, 0xfb, + 0xec, 0x13, 0x1b, 0xe1, 0xe6, 0x7b, 0x98, 0x08, 0xe4, 0xf0, 0x6c, 0x7d, 0x3b, 0x57, 0x35, 0x68, 0x98, 0xbb, 0x99, 0x75, 0xaa, 0x6e, 0xd9, 0xa4, 0x6a, 0x96, 0x4d, 0xb5, 0x01, 0xc6, 0x76, 0xd4, + 0xbf, 0x7c, 0x52, 0x50, 0xb4, 0xbf, 0x29, 0xa7, 0x0e, 0x11, 0x71, 0x4b, 0x9f, 0x9e, 0x6b, 0x98, 0xc1, 0x58, 0x30, 0xc0, 0x35, 0x47, 0x0e, 0x5f, 0x5c, 0x32, 0x74, 0xa5, 0x70, 0xa0, 0x37, 0x27, + 0x6b, 0x0d, 0x10, 0x7b, 0xf5, 0xae, 0xbd, 0x53, 0x76, 0xcf, 0x11, 0x09, 0x7c, 0xb8, 0xd6, 0xe2, 0xe7, 0x92, 0x5c, 0xaf, 0x8a, 0xec, 0x5b, 0x6f, 0x1d, 0x03, 0x26, 0x22, 0x2f, 0x82, 0x68, 0x83, + 0x1d, 0x32, 0xc1, 0x03, 0xcb, 0x10, 0x4b, 0x39, 0x87, 0x0e, 0x9a, 0xa0, 0xb9, 0x92, 0x56, 0x29, 0xba, 0xb2, 0xa4, 0x13, 0x7a, 0x39, 0x48, 0x07, 0x58, 0xfd, 0xa8, 0x41, 0xbb, 0xbf, 0xda, 0xe5, + 0xf9, 0xea, 0x4f, 0x7f, 0xd7, 0x92, 0xa1, 0xac, 0x19, 0x69, 0x63, 0x81, 0x53, 0x25, 0x80, 0x4d, 0x04, 0x91, 0xa5, 0x23, 0x47, 0xef, 0x13, 0xb2, 0x72, 0x1a, 0x2d, 0x85, 0x01, 0xc0, 0x2b, 0x9a, + 0x87, 0x64, 0x56, 0x29, 0xc5, 0x06, 0xec, 0xfc, 0x35, 0x0d, 0xf3, 0xc3, 0x5d, 0xfb, 0x3e, 0x32, 0x77, 0xdf, 0x0a, 0x9c, 0x5a, 0x61, 0xc4, 0x10, 0xcf, 0x4a, 0x8b, 0xe6, 0x4b, 0xb0, 0x14, 0x23, + 0x66, 0xe4, 0x58, 0x90, 0xd2, 0xb9, 0x37, 0x88, 0x35, 0x06, 0xba, 0x11, 0xd1, 0x12, 0x8f, 0xaa, 0xd6, 0x87, 0x4f, 0x58, 0xec, 0x36, 0x7b, 0x1d, 0x9b, 0xcc, 0xf6, 0xe3, 0xbb, 0x4f, 0xfe, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x7d, 0x8b, 0xf7, 0xcc, 0x9f, 0x2c, 0x00, 0x00, 0xba, 0xbc, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x54, 0x8e, 0xcd, 0x4a, 0xc5, 0x30, 0x10, 0x46, 0xf7, 0xf3, 0x14, 0xc3, 0xac, 0xbd, 0xa5, 0x51, 0x41, 0x37, + 0x7d, 0x92, 0x52, 0x2e, 0x31, 0xf9, 0x1a, 0x62, 0xeb, 0xa4, 0x24, 0x69, 0x15, 0xc4, 0x77, 0x97, 0xfe, 0x6c, 0xee, 0x6e, 0xce, 0x61, 0x38, 0x7c, 0xd4, 0x2f, 0xd6, 0x4d, 0x36, 0x60, 0x20, 0xb5, + 0x5f, 0xe0, 0x8e, 0x65, 0x5c, 0xd5, 0xd5, 0x98, 0x54, 0x68, 0x43, 0x2e, 0x31, 0xe9, 0x2e, 0xdb, 0xc6, 0x34, 0xad, 0x10, 0x7c, 0xac, 0x97, 0x79, 0x6e, 0xcd, 0xbb, 0x10, 0xf5, 0x1e, 0x0b, 0xd4, + 0x43, 0x5d, 0x44, 0x19, 0xc8, 0xcd, 0x69, 0xf5, 0xd8, 0xa0, 0xb5, 0xdc, 0x8a, 0x9f, 0xb8, 0xe3, 0x5f, 0x7e, 0xc8, 0xbc, 0xca, 0x13, 0x8f, 0xb0, 0x75, 0xcd, 0x28, 0xdc, 0x71, 0x2f, 0xd6, 0xd5, + 0xf8, 0x23, 0x03, 0xff, 0xd1, 0x71, 0xdd, 0xbe, 0xf1, 0xb1, 0x7f, 0xbe, 0xc8, 0xc5, 0xb9, 0xee, 0x68, 0x84, 0x0a, 0xb2, 0xc7, 0xfd, 0xb3, 0x9c, 0x25, 0x23, 0x34, 0xa7, 0x70, 0x35, 0x8f, 0x69, + 0xba, 0xdd, 0xe7, 0x14, 0x02, 0xf2, 0x29, 0xdf, 0x1a, 0x23, 0xf4, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xcd, 0xea, 0x09, 0xd0, 0xa2, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x72, 0x75, + 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0xd0, 0x2f, 0xcf, 0x2f, + 0xca, 0x2e, 0x2e, 0x48, 0x4c, 0x4e, 0xd5, 0x4f, 0xca, 0xcc, 0xd3, 0x4f, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x6c, 0xcc, + 0x2d, 0x40, 0x23, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, + 0x6d, 0x64, 0xdc, 0x95, 0x6f, 0x6f, 0x1b, 0xb7, 0x0f, 0xc7, 0x9f, 0xeb, 0x55, 0xb0, 0xc9, 0x0f, 0x48, 0xf2, 0x43, 0x7c, 0x4e, 0x9f, 0x15, 0x87, 0x2e, 0x40, 0x97, 0xb5, 0x6b, 0xd0, 0xa1, 0x19, + 0x12, 0x07, 0x43, 0x90, 0x15, 0x3d, 0x59, 0xe2, 0xf9, 0xd4, 0xc8, 0xe2, 0x4d, 0x94, 0xce, 0xf1, 0x86, 0xbd, 0xf7, 0x41, 0xd2, 0xf9, 0x1f, 0xda, 0xf5, 0x05, 0xec, 0x99, 0x4f, 0x22, 0x29, 0xf2, + 0xcb, 0x0f, 0xe9, 0x63, 0xb8, 0x8d, 0x1c, 0xe0, 0xed, 0x80, 0x2e, 0x30, 0xbc, 0x8b, 0x4e, 0x05, 0x43, 0x4e, 0x88, 0xdf, 0xd0, 0x2a, 0x5a, 0x22, 0x04, 0x82, 0x35, 0x45, 0x0f, 0x0e, 0x57, 0xc5, + 0xb2, 0x1d, 0x4d, 0xa0, 0xf7, 0xf4, 0x05, 0x55, 0x78, 0x01, 0xb3, 0x0e, 0x61, 0x4e, 0xc6, 0xa2, 0xef, 0xad, 0x0c, 0x28, 0x1e, 0xa5, 0x0a, 0xe6, 0xf9, 0xd3, 0x69, 0x17, 0x42, 0xcf, 0xf5, 0x74, + 0x9a, 0x3f, 0x2b, 0xcf, 0xd3, 0x33, 0x58, 0xe1, 0x1c, 0x18, 0xfd, 0x80, 0x1e, 0x0c, 0x83, 0x71, 0xe2, 0xb1, 0x61, 0xaf, 0xa6, 0x4b, 0x69, 0x5c, 0xe5, 0xb9, 0xf9, 0x74, 0x5a, 0x4d, 0xf7, 0xbe, + 0xcf, 0x2a, 0xb8, 0x0e, 0x27, 0x0c, 0x8a, 0x5c, 0x6b, 0x16, 0xd1, 0xa3, 0x4e, 0xe9, 0x18, 0x37, 0xd0, 0x13, 0x42, 0xe8, 0x10, 0x9a, 0x4e, 0x3a, 0x6d, 0xb1, 0x11, 0xdb, 0xa4, 0x8c, 0x83, 0x12, + 0xb2, 0xdc, 0xf8, 0xfd, 0xa8, 0xbb, 0xa3, 0xb3, 0x64, 0xe7, 0x91, 0x7b, 0x72, 0x9c, 0x4b, 0x94, 0xf0, 0xeb, 0xcd, 0xdd, 0x4c, 0x78, 0xfc, 0x23, 0x22, 0x87, 0xf4, 0x60, 0x90, 0xc6, 0x19, 0xb7, + 0x00, 0x09, 0x83, 0xb4, 0x46, 0x43, 0x73, 0x65, 0x29, 0xea, 0x2c, 0x53, 0x53, 0xc1, 0x03, 0x45, 0xe0, 0x8e, 0xa2, 0xd5, 0xd0, 0xc7, 0x50, 0x14, 0xd2, 0xc8, 0xc6, 0xa3, 0x16, 0x73, 0xec, 0xe4, + 0x60, 0xc8, 0x83, 0x71, 0x6c, 0x74, 0x4a, 0x54, 0x86, 0x6d, 0xa6, 0x5b, 0xf9, 0x2a, 0xb8, 0x76, 0xa0, 0x24, 0x63, 0x72, 0x06, 0x87, 0xa5, 0xb6, 0x6d, 0xa5, 0x82, 0x93, 0xf8, 0x1e, 0x99, 0xa2, + 0x57, 0xc8, 0xd0, 0x92, 0x2f, 0xaf, 0x6c, 0xfc, 0xcf, 0xb3, 0x9f, 0x92, 0x0e, 0x34, 0x95, 0x27, 0x8c, 0xcb, 0x9a, 0x3c, 0x36, 0xdb, 0x20, 0xbb, 0xd7, 0x36, 0x12, 0x94, 0xab, 0x2c, 0xad, 0x10, + 0xa9, 0x6f, 0xb2, 0xef, 0x61, 0x65, 0xac, 0x05, 0x7c, 0xee, 0x29, 0x69, 0xd1, 0x79, 0x44, 0x40, 0xa7, 0x7b, 0x32, 0x2e, 0x70, 0x2d, 0x04, 0xc0, 0xff, 0xa1, 0x99, 0x36, 0x30, 0xf3, 0x66, 0xb1, + 0x40, 0xcf, 0x07, 0xc2, 0xef, 0x68, 0x48, 0x09, 0x16, 0x15, 0x61, 0x89, 0xa1, 0x23, 0x3d, 0x3a, 0x76, 0x28, 0x6d, 0xe8, 0xa6, 0x1e, 0xa5, 0x36, 0x0e, 0x99, 0x9b, 0x8c, 0xcb, 0xe6, 0x81, 0xd1, + 0x6d, 0x7b, 0x0b, 0xc5, 0x1c, 0x54, 0x87, 0xea, 0xe9, 0x30, 0x82, 0x35, 0x03, 0xfe, 0x6b, 0x80, 0xcd, 0xe5, 0xa1, 0xbf, 0x48, 0x6d, 0x5a, 0xca, 0x35, 0x44, 0x46, 0x90, 0x6e, 0x0d, 0xd4, 0xe6, + 0xec, 0xe5, 0x20, 0x8d, 0x95, 0x73, 0x8b, 0x50, 0x50, 0x15, 0x2d, 0xca, 0x10, 0x3d, 0xf2, 0x37, 0x98, 0xd5, 0xa4, 0x12, 0xb8, 0x81, 0xa0, 0x8d, 0xb6, 0x4d, 0x4a, 0xa5, 0x08, 0x23, 0x28, 0x0c, + 0x32, 0x40, 0xe8, 0x88, 0x51, 0x6c, 0x25, 0xab, 0x84, 0x38, 0x3e, 0x86, 0x9f, 0x70, 0x40, 0x4b, 0xfd, 0x12, 0x5d, 0x48, 0x42, 0x27, 0xd8, 0x19, 0x64, 0x8a, 0x61, 0xd7, 0xc0, 0x68, 0xdb, 0xc9, + 0xc8, 0x18, 0xea, 0xd4, 0x03, 0x6b, 0x94, 0x2c, 0x5d, 0x65, 0xda, 0x35, 0xb6, 0xc4, 0x00, 0x13, 0x40, 0xb2, 0x48, 0xa7, 0xab, 0x4c, 0x5c, 0xae, 0x24, 0x74, 0xe8, 0xcb, 0x40, 0x1e, 0xb8, 0x63, + 0xb5, 0xa8, 0x84, 0x68, 0x9a, 0x86, 0x3b, 0xb4, 0x16, 0x58, 0x79, 0xd3, 0x07, 0xa1, 0xa4, 0x5f, 0x10, 0xcc, 0xa3, 0xb1, 0x7a, 0xfc, 0x1d, 0x90, 0x37, 0xc7, 0x3e, 0xba, 0xe4, 0x20, 0xc4, 0x8d, + 0x53, 0x98, 0xbe, 0x12, 0xf7, 0xe7, 0xb9, 0xcc, 0xdd, 0x58, 0xf1, 0x9e, 0x68, 0x32, 0xc0, 0xeb, 0xa4, 0x53, 0x3d, 0x9d, 0x5a, 0x52, 0xd2, 0x76, 0xc4, 0xa1, 0x7e, 0x75, 0xf1, 0xea, 0xe2, 0x12, + 0xa4, 0xd3, 0x22, 0x39, 0xee, 0xb7, 0x81, 0x41, 0xfa, 0xef, 0x38, 0x7d, 0x45, 0x48, 0x89, 0xf2, 0x7d, 0xe3, 0x4d, 0xbf, 0x2f, 0x2b, 0x98, 0x51, 0xa1, 0x4e, 0x3a, 0xc0, 0x34, 0x9d, 0xa9, 0x55, + 0xa1, 0x43, 0xb1, 0x1b, 0x14, 0x09, 0x31, 0x18, 0x6b, 0xc2, 0x1a, 0x38, 0xaa, 0x0e, 0x24, 0x43, 0xa3, 0xa2, 0xb7, 0x4d, 0x46, 0x63, 0x8e, 0x89, 0x0e, 0x5d, 0x67, 0xd1, 0x14, 0x39, 0x26, 0x8b, + 0x22, 0x5d, 0xc3, 0x64, 0x80, 0x89, 0x86, 0x93, 0xbf, 0x8e, 0x9c, 0x5c, 0xe2, 0x51, 0x0d, 0x47, 0x3f, 0x12, 0x05, 0x5e, 0x1f, 0xfd, 0x7d, 0x02, 0xbf, 0x0b, 0x80, 0xc9, 0xfb, 0x93, 0xd4, 0x42, + 0x74, 0x61, 0x12, 0xd6, 0x3d, 0xd6, 0xfb, 0x7d, 0x98, 0x7e, 0x61, 0x72, 0x3b, 0x33, 0x9c, 0x70, 0x8f, 0x6a, 0x40, 0xcf, 0x86, 0x5c, 0x0d, 0x2f, 0xab, 0x8b, 0xfd, 0x3b, 0xa3, 0x6b, 0x78, 0x79, + 0x60, 0x9c, 0x67, 0xbe, 0x86, 0x51, 0x01, 0x95, 0x16, 0x4f, 0x2e, 0x8d, 0x2b, 0x43, 0xfb, 0x86, 0xe5, 0x5d, 0x8d, 0x43, 0xf5, 0xe4, 0x64, 0x30, 0x03, 0x56, 0xf8, 0x2c, 0x97, 0xbd, 0xc5, 0x62, + 0xf4, 0x4d, 0x05, 0x4b, 0xab, 0x33, 0xa1, 0xbd, 0xa5, 0x75, 0x01, 0xf4, 0x9e, 0x11, 0x9a, 0x24, 0x58, 0x33, 0x2e, 0xa1, 0x4c, 0xa6, 0x37, 0x7f, 0x62, 0x59, 0x3a, 0x07, 0x88, 0xf5, 0x71, 0x6e, + 0x0d, 0x77, 0x09, 0xcb, 0xbc, 0x39, 0x3d, 0x2e, 0x0c, 0x07, 0xbf, 0x16, 0xd2, 0x69, 0xd0, 0x39, 0x6a, 0x41, 0x16, 0x24, 0x7c, 0x28, 0x79, 0xc1, 0x1d, 0xfa, 0xc1, 0x28, 0x4c, 0x3b, 0x2a, 0x07, + 0xfc, 0x10, 0xe7, 0xe8, 0x1d, 0x06, 0x64, 0x50, 0x36, 0x72, 0x40, 0x5f, 0x7f, 0x4d, 0x6d, 0x4a, 0x68, 0x13, 0x70, 0x32, 0xd9, 0x3c, 0xf3, 0x83, 0x26, 0xf5, 0x84, 0xbe, 0x32, 0x34, 0x7d, 0xfd, + 0x70, 0x73, 0x7f, 0xfb, 0xf9, 0xcd, 0xd5, 0xd5, 0xcd, 0xfd, 0xc7, 0xd9, 0x65, 0xa9, 0xec, 0x61, 0x1c, 0x1e, 0x5a, 0xa6, 0xfc, 0xd2, 0xaa, 0xda, 0xb9, 0x36, 0x40, 0x7d, 0xc6, 0x79, 0x9e, 0x66, + 0x30, 0x84, 0xb4, 0xdf, 0xb3, 0xc9, 0xbb, 0xfb, 0x8f, 0x57, 0x9f, 0x6f, 0xdf, 0xfe, 0x7c, 0x7d, 0x37, 0xbb, 0x7d, 0x68, 0x04, 0xba, 0xc1, 0x78, 0x72, 0x49, 0x1b, 0x18, 0xa4, 0x37, 0x89, 0xfa, + 0x0a, 0xde, 0x38, 0x0d, 0xa6, 0xcd, 0xd3, 0xd9, 0x92, 0x5f, 0x60, 0xc8, 0x2b, 0xf8, 0xc4, 0xda, 0xc4, 0x50, 0xef, 0x69, 0xd9, 0x07, 0xd4, 0xe3, 0x5a, 0xa5, 0x18, 0xd2, 0xff, 0x42, 0xeb, 0x69, + 0x09, 0x32, 0x61, 0xa7, 0x90, 0xb9, 0x8d, 0x76, 0x53, 0xce, 0xf8, 0xdf, 0xc1, 0x1d, 0xad, 0x72, 0x06, 0xf7, 0xb7, 0xbf, 0xe4, 0x4d, 0x96, 0xc0, 0xe5, 0xa2, 0xd5, 0x39, 0xac, 0x3a, 0xa3, 0xba, + 0xed, 0x36, 0x90, 0x96, 0x09, 0x16, 0x18, 0x60, 0x30, 0xb2, 0x34, 0x0b, 0x8c, 0x6b, 0xa9, 0xd9, 0x9b, 0xf9, 0xff, 0x16, 0xbe, 0xff, 0x3b, 0xdd, 0x16, 0x09, 0x13, 0x82, 0xe8, 0xed, 0x59, 0x69, + 0xf1, 0x7b, 0x39, 0xe4, 0xd5, 0xf4, 0x42, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xff, 0xc5, 0x70, 0x1e, 0xeb, 0x03, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x90, 0x31, 0x6e, 0xc3, 0x30, 0x0c, + 0x45, 0x77, 0x9f, 0xe2, 0x23, 0x1e, 0xb2, 0xe5, 0x00, 0x59, 0x8b, 0x16, 0xed, 0xd6, 0x21, 0x17, 0x60, 0xa4, 0x6f, 0x5b, 0xa8, 0x4d, 0x19, 0x22, 0xe5, 0xb4, 0xb7, 0x2f, 0xe4, 0xa2, 0x49, 0x46, + 0x91, 0xc0, 0x7b, 0xd4, 0xeb, 0x91, 0x57, 0x4f, 0x59, 0x65, 0x3e, 0x01, 0x1f, 0xba, 0xe5, 0x20, 0xed, 0x89, 0xc8, 0x21, 0x29, 0x0d, 0x53, 0x52, 0x37, 0x0c, 0xb9, 0x60, 0xca, 0x37, 0xbc, 0x55, + 0x0d, 0x6d, 0x6d, 0x08, 0x85, 0xe2, 0x8c, 0xa8, 0x96, 0x74, 0x84, 0x4f, 0xc9, 0xba, 0x1e, 0xce, 0x65, 0x9d, 0xc5, 0x89, 0x20, 0x8a, 0x2b, 0x91, 0x74, 0xcb, 0x5f, 0x8c, 0x27, 0xe0, 0x32, 0xd1, + 0x08, 0xa3, 0x7b, 0xd2, 0xd1, 0xfe, 0xf7, 0x75, 0x8d, 0x3b, 0x24, 0x2b, 0x7c, 0x22, 0x0a, 0xad, 0xce, 0x2e, 0xea, 0x5d, 0x7f, 0x37, 0x41, 0x0c, 0x91, 0x1b, 0xe7, 0xbc, 0x2e, 0x54, 0xc7, 0x5a, + 0xf2, 0x58, 0x68, 0x46, 0x83, 0x67, 0x50, 0xad, 0x16, 0xe2, 0xf8, 0x27, 0x3a, 0xee, 0x5c, 0x99, 0x6f, 0xf2, 0x63, 0xf0, 0x92, 0xc6, 0x91, 0xa5, 0x81, 0xbb, 0x1e, 0xfc, 0x66, 0xa8, 0x3b, 0x2f, + 0x0f, 0x10, 0x94, 0xaa, 0xda, 0xee, 0xbe, 0x5b, 0x92, 0x9a, 0x8b, 0x06, 0xee, 0x3f, 0x75, 0x5a, 0x3b, 0x13, 0xa2, 0xf1, 0xd9, 0x7d, 0xea, 0xd2, 0xbd, 0xcf, 0xb9, 0x03, 0xfa, 0xa7, 0x5e, 0xd6, + 0xb8, 0x8f, 0x3a, 0x43, 0xc9, 0xcb, 0x1e, 0xe5, 0x91, 0x24, 0x19, 0xb6, 0x24, 0xb8, 0x8a, 0xa5, 0x80, 0xf7, 0xcb, 0xe5, 0x13, 0x2f, 0x73, 0xae, 0xf1, 0x75, 0xa3, 0x7a, 0x87, 0xe6, 0x5d, 0xc4, + 0xcf, 0x38, 0x84, 0x36, 0x65, 0x9b, 0x1e, 0xba, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb5, 0x17, 0x55, 0x3f, 0xf5, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0x50, 0x4b, + 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x94, 0x52, 0x41, 0x8f, 0xda, 0x3c, 0x10, 0xbd, 0xe7, 0x57, 0xcc, 0xc7, 0xe1, 0x53, 0x22, 0x51, 0xb8, 0x9b, 0x2d, + 0x52, 0xb5, 0xac, 0xd4, 0x5b, 0xa5, 0xdd, 0xde, 0xc1, 0x71, 0xc6, 0xc1, 0xaa, 0x33, 0x8e, 0xc6, 0x36, 0x2c, 0xaa, 0xf8, 0xef, 0x95, 0x6d, 0x36, 0x1b, 0x24, 0x7a, 0xa8, 0x0f, 0x10, 0x8f, 0xdf, + 0xcc, 0xbc, 0xf7, 0xf4, 0xa2, 0x47, 0x90, 0x2a, 0x98, 0xf7, 0xfd, 0x19, 0x5b, 0x21, 0xce, 0xd8, 0x6e, 0xaa, 0x6a, 0xbd, 0x5e, 0xc3, 0x6b, 0x24, 0x50, 0xd1, 0x07, 0x37, 0x80, 0x72, 0xa4, 0x4d, + 0x1f, 0x59, 0x06, 0xe3, 0x08, 0xa4, 0x87, 0x51, 0x72, 0x00, 0xa7, 0x21, 0x1c, 0x11, 0xe4, 0x38, 0x5a, 0xa3, 0xca, 0x53, 0x1b, 0x8d, 0xed, 0x0c, 0xf5, 0x79, 0xc0, 0xc8, 0x4e, 0xa1, 0xf7, 0xab, + 0x74, 0xc9, 0x85, 0x9f, 0x47, 0xe3, 0x41, 0x47, 0x52, 0x19, 0xeb, 0x8f, 0x2e, 0xda, 0x2e, 0xcd, 0x0e, 0xd2, 0x10, 0x48, 0x6b, 0x1f, 0xaf, 0xd3, 0x8e, 0xe1, 0xe2, 0x22, 0x7f, 0x76, 0xce, 0x36, + 0x7e, 0x0e, 0x3f, 0x1c, 0x0e, 0x1c, 0x7d, 0xc8, 0xdf, 0x9a, 0xa6, 0x19, 0x58, 0x2b, 0xdd, 0x0b, 0xf8, 0x7f, 0x88, 0x01, 0xb2, 0xc0, 0x37, 0xe4, 0x93, 0x51, 0xf8, 0x9c, 0xdf, 0x1b, 0xf8, 0x9d, + 0x1b, 0xd2, 0xb1, 0x18, 0xa0, 0x6b, 0xf7, 0x1d, 0x9b, 0x13, 0x32, 0x7c, 0x85, 0xe1, 0xb2, 0xef, 0xda, 0xba, 0xd9, 0x4c, 0x00, 0xa5, 0xfb, 0x55, 0x27, 0x83, 0xac, 0x27, 0xd4, 0x4a, 0x59, 0x47, + 0x58, 0x37, 0x37, 0xd0, 0xf5, 0x83, 0xc8, 0x4c, 0x31, 0x52, 0x22, 0x0f, 0x4a, 0x12, 0x24, 0xa7, 0x27, 0x5a, 0x1d, 0x30, 0x7a, 0x17, 0x59, 0xa1, 0x07, 0x43, 0xf7, 0x02, 0x1f, 0x8b, 0x1a, 0x63, + 0x0b, 0xd2, 0x5f, 0x48, 0x25, 0x79, 0x47, 0x49, 0x9d, 0xc5, 0x7a, 0xe2, 0x86, 0x27, 0xa4, 0x20, 0xe0, 0x25, 0xfd, 0x2d, 0xa7, 0x6a, 0x61, 0x29, 0x8a, 0xf0, 0x9d, 0x0c, 0xf2, 0x69, 0xd7, 0xee, + 0x72, 0x6d, 0x5b, 0x40, 0x0d, 0x7c, 0xd9, 0xc2, 0x2b, 0xfa, 0x68, 0xc3, 0x53, 0xe9, 0x9d, 0x67, 0xe1, 0x85, 0xd9, 0xf1, 0x76, 0x66, 0xd1, 0x8f, 0x5f, 0x75, 0x46, 0x09, 0xd1, 0xa1, 0x96, 0xd1, + 0x86, 0xba, 0x69, 0x6e, 0xca, 0x13, 0xbb, 0x7f, 0xb2, 0x3d, 0x5b, 0xee, 0x7a, 0x21, 0x0c, 0x69, 0xf7, 0x5f, 0xbd, 0x78, 0xbe, 0x75, 0x1a, 0xea, 0xc1, 0x17, 0xf0, 0xa2, 0xd9, 0x54, 0x77, 0xc6, + 0x7f, 0xcf, 0xaa, 0xb9, 0x40, 0xe7, 0x24, 0x36, 0xd5, 0xb5, 0x84, 0xf6, 0x1b, 0x01, 0xbe, 0xcb, 0x61, 0xb4, 0xf8, 0x11, 0xcf, 0x29, 0x35, 0xf7, 0xa9, 0xf2, 0x81, 0xa3, 0x0a, 0x91, 0x71, 0x95, + 0xa9, 0x97, 0x2b, 0xdc, 0x2d, 0xb8, 0x91, 0x4c, 0xcf, 0x24, 0x07, 0x14, 0xf0, 0x16, 0x12, 0xbb, 0x65, 0xda, 0x65, 0x86, 0xd1, 0xc2, 0xae, 0xec, 0xcf, 0x09, 0x7d, 0xd4, 0xa9, 0x09, 0x26, 0x8a, + 0xc9, 0xe8, 0x47, 0x98, 0x74, 0xfe, 0x56, 0x4f, 0x67, 0xbe, 0x59, 0x08, 0xcd, 0x6e, 0xa8, 0x17, 0x67, 0xc7, 0xb6, 0x5b, 0x34, 0xcb, 0x09, 0x78, 0xad, 0xca, 0xef, 0xb5, 0xfa, 0x13, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb0, 0x68, 0x6c, 0x5f, 0xb5, 0x01, 0x00, 0x00, 0xce, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0xcc, 0x55, 0x4d, 0x6f, 0xe3, 0x36, 0x10, 0xbd, 0xeb, 0x57, 0x30, 0x5a, 0xa0, 0xa5, 0x0a, 0x55, 0x6e, + 0xaf, 0xf4, 0x26, 0xc5, 0x6e, 0x1b, 0xa0, 0xdb, 0x43, 0x0f, 0x9b, 0xa2, 0x97, 0x20, 0x10, 0x68, 0x69, 0x9c, 0xb0, 0xa5, 0x48, 0x85, 0x1c, 0xda, 0x6b, 0x18, 0xfa, 0xef, 0xc5, 0x90, 0x8c, 0x2c, + 0xe7, 0xa3, 0x45, 0x2f, 0x45, 0x7d, 0xb1, 0xc8, 0xf9, 0x7e, 0xef, 0x8d, 0x14, 0x3c, 0xb0, 0xce, 0x49, 0x04, 0x21, 0x3a, 0x6b, 0xb6, 0xea, 0x5e, 0x88, 0x9f, 0xa5, 0xe9, 0x35, 0xb8, 0x1f, 0xe3, + 0x71, 0x5d, 0x90, 0x87, 0xec, 0x50, 0x7d, 0x69, 0xf7, 0xb0, 0x11, 0x62, 0x0f, 0x9b, 0x74, 0xd7, 0x69, 0x1b, 0x7a, 0xd8, 0x81, 0x41, 0x2f, 0xc4, 0x31, 0x3e, 0x08, 0xf1, 0x93, 0x44, 0x59, 0xb3, + 0x6b, 0x3a, 0xe4, 0xbf, 0x8f, 0x41, 0xe9, 0x1e, 0xdc, 0xf9, 0xe9, 0xf7, 0xef, 0xbf, 0x9b, 0x52, 0x16, 0x6d, 0xef, 0x85, 0x50, 0x66, 0x6b, 0xd3, 0xd1, 0x83, 0xeb, 0xa1, 0xfd, 0xc3, 0x5b, 0x23, + 0xc4, 0x71, 0xeb, 0xec, 0xd0, 0x7a, 0xad, 0x3a, 0xa8, 0x59, 0x7a, 0x46, 0x57, 0x33, 0x32, 0x4e, 0xeb, 0xa2, 0x58, 0xad, 0xd8, 0xa7, 0x61, 0xd4, 0x30, 0x80, 0x41, 0x76, 0xb0, 0xc1, 0xb1, 0x6d, + 0x30, 0x1d, 0x2a, 0x6b, 0xbe, 0xf6, 0x94, 0x56, 0x75, 0xec, 0x01, 0x1c, 0x14, 0x63, 0xd8, 0x30, 0xe9, 0x0f, 0xa6, 0x63, 0x5b, 0xc3, 0x1e, 0xe2, 0x6c, 0xbc, 0x60, 0x8c, 0xb1, 0xd4, 0x72, 0x6e, + 0x36, 0xde, 0x64, 0x04, 0x58, 0x1c, 0x94, 0x46, 0x79, 0x7f, 0x86, 0xc5, 0x55, 0x5d, 0x54, 0xec, 0xdb, 0x2b, 0xf6, 0x19, 0x7c, 0xd0, 0xf8, 0x3e, 0x4f, 0xb9, 0xc0, 0xe6, 0xda, 0x39, 0xeb, 0xae, + 0xd8, 0x31, 0x26, 0xa3, 0xa1, 0x2e, 0x78, 0x99, 0xab, 0x1c, 0xa7, 0xb2, 0x4e, 0x15, 0xab, 0x75, 0x11, 0xed, 0x1a, 0x90, 0x29, 0x33, 0x06, 0x64, 0x97, 0x6c, 0x90, 0xd8, 0x3d, 0x24, 0x73, 0xd3, + 0x4b, 0x94, 0xbc, 0xca, 0x49, 0xe8, 0x77, 0x63, 0x07, 0xe0, 0xd4, 0x8d, 0x10, 0x1f, 0x95, 0x91, 0xee, 0xc0, 0x77, 0x55, 0xc5, 0x2e, 0xaf, 0xd8, 0x09, 0x1f, 0xbe, 0xab, 0x7e, 0xa8, 0x5f, 0x0b, + 0xb8, 0x41, 0xa7, 0xcc, 0xfd, 0x79, 0x00, 0xba, 0x37, 0xdd, 0x7f, 0xf1, 0xd6, 0x3c, 0x39, 0xef, 0x1a, 0xb4, 0xad, 0xdd, 0x1b, 0xe8, 0x79, 0x75, 0x72, 0xfe, 0xd5, 0x1a, 0x20, 0x2b, 0xb1, 0x70, + 0xc1, 0x8f, 0xac, 0x34, 0x72, 0x80, 0x52, 0x64, 0xe8, 0x1a, 0x3a, 0xb1, 0x29, 0xfb, 0x4f, 0x79, 0xd2, 0x67, 0xcc, 0x0b, 0x41, 0x7d, 0xf0, 0x04, 0xc6, 0x9c, 0xb8, 0xf1, 0x36, 0xb8, 0x0e, 0x78, + 0x49, 0x2c, 0x8a, 0xd5, 0x2a, 0x31, 0xe5, 0xca, 0x85, 0x07, 0x1e, 0x92, 0xb5, 0x81, 0x2f, 0x92, 0x98, 0x5f, 0xda, 0x22, 0x6a, 0xa5, 0x1c, 0x47, 0xad, 0x3a, 0x49, 0x22, 0x58, 0x51, 0x87, 0x65, + 0x7d, 0x6a, 0xf4, 0x01, 0xb4, 0xb6, 0xa5, 0x48, 0x98, 0xdf, 0xa6, 0xbe, 0xef, 0xd8, 0x54, 0x2d, 0x92, 0x6c, 0xa8, 0x47, 0xbe, 0xb8, 0x18, 0xe4, 0xd8, 0x82, 0x73, 0x7c, 0xc1, 0x31, 0x10, 0xc7, + 0x99, 0xea, 0x4f, 0x06, 0xc1, 0x19, 0xa9, 0x6f, 0xc0, 0xed, 0xc0, 0xc5, 0xab, 0xaa, 0x98, 0x8a, 0xe2, 0xdd, 0x6d, 0xb7, 0xbd, 0xe7, 0x08, 0x1e, 0xab, 0xbb, 0x62, 0xb0, 0x3d, 0xa3, 0x47, 0x9f, + 0x29, 0x8d, 0x32, 0x0f, 0x23, 0x38, 0x21, 0xbe, 0xc9, 0x00, 0x6d, 0x4d, 0xc6, 0x8f, 0x47, 0x7d, 0xbd, 0x25, 0xbf, 0x85, 0x26, 0x66, 0x17, 0x21, 0x0c, 0xec, 0xf9, 0x99, 0x9f, 0x10, 0x3d, 0x6c, + 0x65, 0xd0, 0xc8, 0xf3, 0x6c, 0x53, 0xaa, 0xf2, 0xee, 0x36, 0x8d, 0xe1, 0x50, 0x08, 0x6a, 0xe8, 0x2e, 0xde, 0xce, 0xab, 0xb1, 0x93, 0x5a, 0xf5, 0x6d, 0x44, 0xe7, 0x4c, 0x7e, 0xa4, 0xd3, 0x21, + 0x9c, 0xb4, 0x7a, 0x9d, 0x36, 0x7d, 0xae, 0xb1, 0x9e, 0x3d, 0xa3, 0x47, 0xe3, 0x01, 0xdb, 0x7f, 0x62, 0xe3, 0x49, 0x35, 0xe5, 0xc6, 0x5a, 0xf4, 0x87, 0x72, 0xaa, 0x16, 0x69, 0xa8, 0xa0, 0x03, + 0x3f, 0xb2, 0xcb, 0xa7, 0x75, 0x8d, 0x89, 0xeb, 0x19, 0xa3, 0xaa, 0x91, 0x7b, 0xa9, 0xf0, 0x14, 0x21, 0xbd, 0x07, 0x87, 0x17, 0x9c, 0xa2, 0x1a, 0xe5, 0x5b, 0xfb, 0x27, 0x5f, 0x26, 0x4c, 0xdb, + 0x15, 0x8d, 0xc1, 0xec, 0x9d, 0x1c, 0x79, 0xf5, 0x72, 0xcb, 0xd8, 0x2b, 0x9b, 0x60, 0x03, 0x8e, 0x01, 0xd3, 0x3a, 0xa4, 0x1a, 0x2d, 0x3c, 0x5e, 0xf0, 0xa7, 0xae, 0x6b, 0x96, 0x1c, 0x6e, 0xb3, + 0xb6, 0xee, 0x16, 0x7b, 0x42, 0xbf, 0x96, 0xe2, 0x46, 0x69, 0x54, 0x77, 0xb1, 0x5c, 0xa1, 0xe9, 0x5f, 0x90, 0x62, 0xec, 0x1b, 0x8c, 0x9c, 0x03, 0xf4, 0x9c, 0x93, 0xff, 0x11, 0x56, 0x7b, 0xeb, + 0x74, 0xff, 0x5f, 0x40, 0xa5, 0x4c, 0x52, 0x70, 0x7c, 0xaf, 0x9c, 0xb5, 0xfb, 0xec, 0x0b, 0x76, 0xa4, 0xe0, 0x9a, 0x56, 0xa8, 0x66, 0x1f, 0xc6, 0x71, 0x5a, 0xbf, 0x90, 0xba, 0x1c, 0x09, 0x5b, + 0x72, 0xa3, 0x6f, 0x93, 0xc2, 0xd6, 0x83, 0xdb, 0xd1, 0x6b, 0xf6, 0xc3, 0x38, 0xa6, 0x85, 0xab, 0x1a, 0x67, 0x03, 0x02, 0x2f, 0x57, 0x65, 0x9d, 0x96, 0x71, 0xb4, 0x1e, 0x79, 0xd5, 0xa0, 0xe5, + 0x89, 0x93, 0xea, 0x25, 0xf4, 0x89, 0xb7, 0xc7, 0x39, 0xf5, 0x6f, 0xe0, 0xf1, 0x33, 0x3c, 0x86, 0x78, 0xc8, 0xf1, 0xc1, 0x29, 0x4a, 0x4a, 0x89, 0x5a, 0x97, 0x6c, 0xfc, 0xf5, 0xdd, 0x48, 0x39, + 0x3a, 0xa9, 0xf5, 0xdc, 0xde, 0x57, 0xb9, 0xf9, 0x9a, 0xca, 0xfc, 0x3d, 0xf3, 0x1e, 0x25, 0x06, 0xcf, 0x2b, 0x92, 0x40, 0xa7, 0x15, 0x18, 0x6c, 0xe3, 0x9b, 0x6d, 0x16, 0xc3, 0x54, 0x4c, 0xc5, + 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x36, 0xb0, 0x7a, 0x13, 0x17, 0x03, 0x00, 0x00, 0x1d, 0x08, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x7c, 0x52, 0x4f, 0x8f, 0xda, 0x3e, 0x10, 0xbd, 0xe7, 0x53, 0x8c, 0xf2, 0xbb, 0xd8, 0x52, 0x7e, + 0x01, 0x7a, 0x68, 0x57, 0x43, 0x97, 0x0a, 0x55, 0x2b, 0xed, 0xa1, 0x2d, 0x2b, 0xca, 0xad, 0xaa, 0x22, 0x43, 0x26, 0xc4, 0xc2, 0xd8, 0xd1, 0xd8, 0x49, 0x5a, 0x01, 0xdf, 0xbd, 0xca, 0x1f, 0x51, + 0x96, 0x56, 0x9d, 0x8b, 0x67, 0x9e, 0xe7, 0xf9, 0x8d, 0xde, 0xb8, 0xf6, 0x04, 0x6a, 0x17, 0xf4, 0x8f, 0xac, 0xa5, 0x2d, 0xe2, 0xa9, 0xa5, 0x6d, 0x02, 0xcb, 0xaa, 0x4a, 0xe0, 0x39, 0x84, 0x6a, + 0x4d, 0xbe, 0x72, 0xd6, 0xd3, 0x50, 0x7d, 0x25, 0x6e, 0x88, 0x2f, 0xf3, 0xa8, 0x23, 0x91, 0x6d, 0x32, 0xe3, 0xf6, 0x7b, 0x62, 0x50, 0x1e, 0xc8, 0xb8, 0xfd, 0x3c, 0x8a, 0x8e, 0x2e, 0x87, 0x9d, + 0xb3, 0x85, 0xde, 0xcf, 0xfb, 0xbc, 0x54, 0x36, 0x37, 0xc4, 0xf3, 0x28, 0xfa, 0xef, 0xdb, 0x8d, 0xca, 0x51, 0x69, 0xfb, 0x3d, 0x52, 0xfe, 0xa7, 0xdd, 0x41, 0x61, 0xa1, 0x2b, 0x85, 0x84, 0xff, + 0x17, 0xe0, 0x43, 0x8e, 0xa8, 0x1d, 0xe2, 0x9a, 0x7c, 0x6d, 0xc2, 0x7b, 0x21, 0x17, 0x70, 0x8a, 0x00, 0xa0, 0x17, 0x40, 0x2c, 0xd8, 0x1d, 0x33, 0xb2, 0x8d, 0x18, 0xca, 0x27, 0xdb, 0x20, 0xe6, + 0x54, 0xa8, 0xda, 0x04, 0x21, 0xd3, 0x31, 0xcb, 0x0a, 0x6d, 0x02, 0x71, 0xe6, 0x58, 0xc4, 0xda, 0x16, 0x2e, 0xb9, 0x2a, 0x3f, 0xb6, 0x8a, 0x6d, 0x2c, 0x65, 0xaa, 0xad, 0x0e, 0x42, 0xce, 0xa3, + 0xfe, 0x69, 0x43, 0x01, 0x2a, 0xc7, 0x01, 0xa1, 0x9e, 0xbd, 0x85, 0x47, 0x38, 0xaa, 0xb0, 0x2b, 0x87, 0x51, 0xa8, 0x13, 0x68, 0x14, 0x8b, 0xf8, 0x65, 0xb5, 0xde, 0xc4, 0x72, 0x1c, 0xa6, 0x8b, + 0xd5, 0x41, 0x34, 0x12, 0x1e, 0x17, 0xd0, 0xa4, 0x95, 0x62, 0x4f, 0x42, 0xa6, 0xb5, 0x6d, 0x59, 0x55, 0x42, 0x26, 0xd7, 0xa6, 0x27, 0x66, 0x91, 0xf5, 0x5d, 0x0f, 0xd3, 0x87, 0xe9, 0x80, 0x5f, + 0x46, 0xd9, 0xc9, 0x04, 0x3e, 0x32, 0xa9, 0x40, 0x10, 0x4a, 0x82, 0xe7, 0xcd, 0xe6, 0x05, 0x7c, 0x6f, 0x70, 0x7f, 0xfb, 0xdb, 0x6f, 0x44, 0x4b, 0xad, 0x38, 0x9f, 0x6f, 0xb4, 0x97, 0x55, 0x35, + 0xa0, 0xf2, 0x0a, 0x75, 0x91, 0xf6, 0xf2, 0xb7, 0x3e, 0xeb, 0x3c, 0x37, 0xd4, 0x2a, 0x26, 0xc4, 0x4f, 0xfd, 0xae, 0x6e, 0xec, 0xba, 0xe3, 0x0e, 0x6b, 0xab, 0x99, 0xc4, 0x90, 0x21, 0x5e, 0x91, + 0xbb, 0x4e, 0x76, 0x75, 0x20, 0x11, 0x4f, 0xe2, 0x04, 0x7a, 0x95, 0xca, 0xf9, 0xce, 0xfd, 0xe0, 0xc4, 0xb8, 0x6e, 0xc4, 0x21, 0xb9, 0x97, 0xb8, 0x27, 0xee, 0x69, 0xe4, 0xdd, 0x7e, 0x35, 0xc4, + 0xcf, 0x14, 0x4a, 0x97, 0x7f, 0x71, 0x61, 0x69, 0x8c, 0x6b, 0x29, 0xff, 0xfb, 0x33, 0xaf, 0xb0, 0x2e, 0xe2, 0x49, 0x49, 0xca, 0x84, 0x72, 0x72, 0xca, 0x50, 0x30, 0xa9, 0x5c, 0x5b, 0xf2, 0xfe, + 0x6c, 0x74, 0x43, 0x5d, 0x22, 0x2f, 0x71, 0xf2, 0x07, 0xe7, 0x5f, 0x63, 0xac, 0x0e, 0xf2, 0x35, 0x61, 0x18, 0xe3, 0x32, 0x1c, 0xe9, 0x56, 0xdb, 0x5c, 0x88, 0x78, 0xf6, 0xe6, 0x5d, 0x3a, 0x4d, + 0xa7, 0xe9, 0x2c, 0x4e, 0xfa, 0x4f, 0x24, 0xe5, 0x87, 0xe1, 0xbe, 0x75, 0x7c, 0x20, 0xf6, 0x62, 0x36, 0xf6, 0x73, 0x6d, 0xc7, 0x75, 0xa5, 0xaa, 0x55, 0x3a, 0x44, 0x97, 0xe8, 0x57, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd6, 0x73, 0x95, 0x77, 0xd3, 0x01, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0xbc, 0xbd, 0xcb, 0x6f, 0x9c, 0xc9, 0x8e, 0x2f, 0xb8, 0x3f, 0x7f, 0x85, 0x51, 0x77, 0x79, 0x2d, 0x77, 0x90, 0xc1, + 0x08, 0x06, 0x07, 0xb8, 0xc0, 0x00, 0xb3, 0x9a, 0xfd, 0xec, 0x1a, 0x0d, 0x83, 0x4f, 0x5b, 0xb7, 0x64, 0xc9, 0xad, 0x47, 0x55, 0xb9, 0xff, 0xfa, 0xc1, 0x97, 0x92, 0x6c, 0x29, 0x95, 0x29, 0xbb, + 0xaa, 0x53, 0xf7, 0x2c, 0x8e, 0xbf, 0x4c, 0x7d, 0x52, 0x05, 0x19, 0x7c, 0xfd, 0x48, 0x06, 0xe3, 0x7f, 0xbc, 0xfb, 0xff, 0x3e, 0x9f, 0xdf, 0xbc, 0xab, 0xf3, 0x8b, 0x7c, 0x77, 0x7e, 0xf3, 0x4e, + 0xef, 0x6e, 0xaf, 0xbe, 0xe8, 0xed, 0xb9, 0xeb, 0xc5, 0xc5, 0xb7, 0x77, 0xff, 0xf7, 0xa7, 0xbc, 0xcc, 0x6b, 0xbd, 0xcd, 0x78, 0x67, 0xdf, 0xde, 0xfd, 0x3f, 0x7a, 0xfd, 0xe9, 0xea, 0xc3, 0xbf, + 0xfe, 0xc7, 0xbb, 0xff, 0xf7, 0x76, 0x7b, 0xf5, 0xf2, 0xea, 0xf6, 0xdd, 0xf9, 0xe5, 0x6d, 0x5e, 0x46, 0xc6, 0xbb, 0xba, 0xba, 0x7e, 0xf7, 0x45, 0x2f, 0xef, 0xf4, 0xe2, 0x5d, 0xc6, 0xf9, 0xed, + 0xf9, 0xe5, 0xa7, 0x0f, 0xff, 0xfa, 0xf7, 0x7f, 0xff, 0xaa, 0xfe, 0xbb, 0x7e, 0xca, 0xff, 0xf8, 0x8f, 0x7f, 0x5d, 0xea, 0x97, 0x7c, 0xf7, 0xbf, 0xde, 0xfd, 0xa6, 0x7e, 0x7b, 0xfe, 0xd7, 0x99, + 0x5f, 0x45, 0xfa, 0x6f, 0xff, 0xfa, 0x23, 0xaf, 0x6f, 0xce, 0xaf, 0x2e, 0xb7, 0xef, 0xdb, 0x87, 0xfe, 0xa1, 0xfd, 0xf6, 0xaf, 0x9b, 0xab, 0xbb, 0x6b, 0xdf, 0xbd, 0x78, 0x9d, 0x9f, 0xce, 0x6f, + 0x6e, 0xaf, 0xbf, 0xfd, 0xcf, 0xcf, 0xb7, 0xb7, 0x5f, 0x6f, 0xfe, 0xaf, 0x7f, 0xfb, 0xb7, 0x4f, 0xe7, 0xb7, 0x9f, 0xef, 0xec, 0x83, 0x5f, 0x7d, 0xf9, 0xb7, 0xeb, 0xbb, 0x9b, 0xdb, 0xb3, 0x0b, + 0xbd, 0xfc, 0xf4, 0x6f, 0xbe, 0x2d, 0xee, 0xe6, 0xc3, 0xf9, 0xd5, 0xd9, 0xf9, 0x65, 0xe4, 0x5f, 0xbf, 0xfd, 0xcb, 0x3f, 0xa7, 0xff, 0x7e, 0x73, 0xf7, 0x65, 0xfb, 0x13, 0xbc, 0x02, 0x56, 0xef, + 0xd6, 0x57, 0x5f, 0x61, 0x29, 0xd2, 0xa2, 0x5a, 0x41, 0x2d, 0x36, 0xad, 0x49, 0xcd, 0x6b, 0x02, 0xcd, 0x5c, 0xb2, 0x60, 0x4e, 0xad, 0xa4, 0x06, 0xab, 0x4b, 0x80, 0xb5, 0x06, 0x39, 0xb8, 0xfd, + 0xf6, 0xaf, 0xc8, 0xaf, 0x1b, 0x79, 0x97, 0x7e, 0x9e, 0x37, 0xef, 0xfe, 0xd7, 0xbb, 0x7f, 0xff, 0xd7, 0xbb, 0xdf, 0xec, 0xfc, 0xb6, 0x2e, 0xf4, 0xd3, 0xcd, 0x6f, 0xef, 0xb7, 0x0f, 0xdf, 0x6e, + 0xf3, 0xe6, 0x5d, 0xfb, 0x30, 0x3e, 0xcc, 0xdd, 0xe7, 0xba, 0xbb, 0xbd, 0xbb, 0xce, 0x9b, 0x33, 0xbf, 0xba, 0xce, 0x67, 0x5f, 0xdc, 0x9c, 0x5f, 0xfe, 0xbe, 0xfb, 0xe2, 0xe2, 0xea, 0xd3, 0xee, + 0xdf, 0xaf, 0xe7, 0x97, 0x67, 0x5f, 0xaf, 0xaf, 0xfe, 0x77, 0xfa, 0xed, 0xbb, 0xf6, 0x81, 0x3e, 0xe0, 0xda, 0x7d, 0x7d, 0x7b, 0xf5, 0xfb, 0xf9, 0xd5, 0x8f, 0xa7, 0xb3, 0xbb, 0xdb, 0xf3, 0x8b, + 0xdf, 0xde, 0xff, 0xeb, 0x3f, 0xfe, 0xf5, 0x2a, 0x33, 0x2f, 0x2f, 0xd3, 0x6f, 0x9f, 0xb1, 0x13, 0x3f, 0xb4, 0x93, 0xb3, 0x13, 0x98, 0x57, 0x67, 0x85, 0xb6, 0x66, 0x2f, 0x18, 0xa6, 0x2b, 0xba, + 0x66, 0x4f, 0x07, 0x2c, 0x75, 0x68, 0x22, 0x4d, 0x64, 0xa0, 0x64, 0x60, 0x6b, 0xab, 0x2b, 0x72, 0x45, 0x25, 0x12, 0xf7, 0x05, 0xd1, 0xc2, 0x0f, 0xb2, 0xf3, 0xa9, 0x3c, 0xbc, 0xff, 0xfe, 0xf9, + 0xfa, 0xf6, 0xc9, 0x87, 0x9b, 0xbc, 0xfe, 0xe3, 0xdc, 0xf3, 0xc9, 0x37, 0x1b, 0x57, 0xee, 0x37, 0x20, 0xf2, 0xfa, 0xfc, 0x8f, 0xfc, 0xf8, 0xe5, 0x91, 0xdf, 0x79, 0x7e, 0xfb, 0x39, 0xaf, 0x9f, + 0xb1, 0xfe, 0x81, 0x85, 0xef, 0x7e, 0xdb, 0x28, 0x7f, 0xb6, 0x07, 0xb7, 0x3b, 0xc2, 0xe3, 0xf2, 0x66, 0xdb, 0x89, 0xdb, 0xab, 0xbd, 0xef, 0xae, 0xf3, 0xe6, 0xea, 0xe2, 0x8f, 0xdd, 0x1f, 0x7b, + 0x95, 0xfd, 0xbb, 0x3f, 0xfb, 0x9c, 0xf7, 0x78, 0x72, 0xde, 0xd3, 0x40, 0x14, 0xc9, 0xc5, 0x0b, 0x58, 0x73, 0x4c, 0xee, 0x02, 0x2d, 0x47, 0x77, 0xa4, 0x4e, 0x8b, 0x5c, 0xfb, 0xb2, 0xec, 0x0b, + 0x57, 0xd8, 0x02, 0xb1, 0xd9, 0x00, 0xb8, 0xcf, 0xf2, 0x29, 0x0b, 0x73, 0x31, 0xfd, 0x0d, 0xde, 0x3f, 0x8a, 0xd3, 0x2f, 0xef, 0xc6, 0xed, 0xe7, 0xeb, 0xd4, 0xf8, 0x7a, 0x75, 0x75, 0x71, 0x70, + 0x8b, 0x4c, 0x6f, 0x72, 0xd2, 0xfd, 0xe3, 0x33, 0xdd, 0xb9, 0xbe, 0xba, 0xbd, 0x38, 0xc7, 0x83, 0x7a, 0xe4, 0x57, 0x57, 0xbf, 0x9f, 0xe7, 0xc3, 0xe3, 0xd7, 0x6f, 0x17, 0x79, 0xf3, 0xd3, 0xed, + 0xce, 0x4b, 0xbf, 0x8a, 0xf3, 0xcb, 0x4f, 0x1f, 0xaf, 0xef, 0x5f, 0xad, 0x0b, 0xbd, 0x4d, 0x7c, 0xae, 0x95, 0x9f, 0xf5, 0xf2, 0x32, 0x2f, 0x5e, 0xd7, 0xd4, 0xef, 0xe2, 0x52, 0x7f, 0x7d, 0xd6, + 0x9b, 0xcf, 0xf7, 0x92, 0x83, 0xcf, 0x05, 0x68, 0x7b, 0xd0, 0xeb, 0x9b, 0xfb, 0x5f, 0xdc, 0xed, 0xd6, 0x17, 0xbd, 0xff, 0xc9, 0xf9, 0xed, 0x95, 0xde, 0xcb, 0x98, 0x5e, 0x7e, 0xba, 0xd3, 0x4f, + 0x79, 0x76, 0xfb, 0x48, 0xef, 0x85, 0xfe, 0xd7, 0xb7, 0x8f, 0x37, 0xb7, 0x9b, 0x6d, 0x7d, 0x26, 0x85, 0x5f, 0xce, 0xbf, 0xdc, 0xff, 0xa1, 0xaf, 0x79, 0xed, 0x79, 0x79, 0x7b, 0xf6, 0x48, 0xc9, + 0xfd, 0x97, 0x4f, 0xec, 0x04, 0x7c, 0x68, 0x1f, 0x78, 0xf7, 0xed, 0xb5, 0x5e, 0xc6, 0xfd, 0x43, 0x7e, 0xca, 0xbf, 0x76, 0x4f, 0x37, 0x79, 0x1d, 0xf9, 0xe3, 0xe9, 0xe3, 0xff, 0xbe, 0xb9, 0xba, + 0x7c, 0xf2, 0xf1, 0xee, 0xfa, 0x62, 0xf7, 0x77, 0xf3, 0xfe, 0xf7, 0x6e, 0x3e, 0xeb, 0x19, 0xdc, 0x3f, 0x5d, 0xa8, 0xed, 0x1e, 0x6e, 0xef, 0xd7, 0xf1, 0xaa, 0xac, 0x7f, 0x51, 0xbf, 0xbe, 0xba, + 0xd9, 0x33, 0xdc, 0xf0, 0xa1, 0x9f, 0x58, 0xda, 0x8d, 0x5c, 0x97, 0x67, 0x6b, 0x86, 0x93, 0xb5, 0x96, 0x7b, 0x9a, 0xc5, 0x24, 0x8e, 0x6c, 0x31, 0x21, 0xdb, 0x64, 0xb2, 0x99, 0x13, 0x60, 0x0d, + 0x77, 0xd6, 0x21, 0x58, 0xb5, 0x16, 0x33, 0x5a, 0xc6, 0x1c, 0xe3, 0xa0, 0xb4, 0xff, 0xe7, 0xdd, 0xd5, 0xed, 0x03, 0x83, 0xbe, 0x5d, 0xfe, 0x8c, 0xd0, 0xeb, 0xab, 0xbb, 0xdb, 0xbc, 0xde, 0x23, + 0x14, 0x3f, 0xf0, 0x89, 0x09, 0x45, 0x0d, 0x14, 0xd1, 0xe2, 0x3e, 0x49, 0x12, 0xca, 0x97, 0xf4, 0xec, 0xbd, 0xbb, 0xd7, 0x9a, 0xd5, 0x99, 0x79, 0x40, 0x9a, 0x8c, 0xaa, 0xc5, 0x23, 0x9a, 0x0c, + 0xe8, 0x30, 0x98, 0x7c, 0x16, 0x75, 0x1a, 0x78, 0xd8, 0xa4, 0xee, 0x94, 0xe9, 0xf6, 0xfa, 0x51, 0x82, 0x5e, 0x98, 0xbd, 0x97, 0x32, 0xf3, 0x3a, 0x2b, 0x9e, 0x7b, 0x16, 0xf8, 0x00, 0x1f, 0xe0, + 0xc4, 0x6c, 0x00, 0xea, 0xe5, 0x8e, 0x02, 0x98, 0x2d, 0x20, 0x12, 0xcd, 0x8b, 0x12, 0x8b, 0xb1, 0x05, 0xea, 0x6c, 0x8e, 0x6b, 0x0e, 0x54, 0x23, 0x60, 0x99, 0x6b, 0x28, 0x64, 0xc2, 0x90, 0x6c, + 0x65, 0x3d, 0x0c, 0x91, 0x5f, 0xb1, 0x6e, 0x0f, 0x12, 0xfb, 0xfe, 0x98, 0xb5, 0x7a, 0x66, 0x5e, 0x5e, 0x33, 0x14, 0xdf, 0xed, 0xc2, 0xcd, 0x17, 0xbd, 0xb8, 0xf8, 0xe3, 0xc1, 0x64, 0x3e, 0xfa, + 0xeb, 0x57, 0x39, 0xb8, 0x99, 0xcc, 0x3d, 0x61, 0xda, 0x54, 0x99, 0x4e, 0xcc, 0x45, 0x1a, 0xd4, 0x38, 0x67, 0x4e, 0x46, 0x57, 0x24, 0x5e, 0x64, 0xaa, 0x73, 0xb2, 0x8f, 0xe8, 0x98, 0x05, 0x4d, + 0xdc, 0x23, 0x56, 0x8c, 0x6c, 0x36, 0xd2, 0x4c, 0xb2, 0x96, 0x4e, 0x2e, 0x8a, 0x32, 0x6e, 0x2b, 0xff, 0x86, 0x8f, 0xf8, 0x65, 0xff, 0xfc, 0x4b, 0x1c, 0xfd, 0x61, 0x09, 0xaf, 0x1e, 0xff, 0x3d, + 0xbb, 0x8b, 0xfb, 0x3f, 0x70, 0x79, 0xf7, 0xe5, 0xa3, 0x7f, 0xbd, 0xbb, 0x79, 0x6e, 0xab, 0x6e, 0xae, 0xfc, 0xf7, 0xbc, 0xc5, 0x5f, 0x61, 0xfc, 0xb6, 0xb2, 0x7d, 0xce, 0xcf, 0x13, 0x73, 0xbe, + 0xb5, 0x81, 0xd4, 0x47, 0x8c, 0x05, 0x36, 0x2c, 0x57, 0x1f, 0x01, 0x50, 0x94, 0xd6, 0xcd, 0x93, 0x80, 0x7d, 0x69, 0xc1, 0x8a, 0xc5, 0x11, 0xb5, 0xd4, 0x53, 0xa4, 0x56, 0x4e, 0xce, 0x21, 0x63, + 0x2d, 0x34, 0x3b, 0xc8, 0xf9, 0x17, 0x6c, 0x3a, 0x18, 0x32, 0xbe, 0x4a, 0xff, 0x66, 0x07, 0x36, 0x33, 0xb0, 0x4f, 0xff, 0xa9, 0xf5, 0x97, 0x18, 0xbb, 0x6c, 0x31, 0x08, 0x8b, 0xa8, 0x31, 0x65, + 0x4e, 0x5d, 0x2a, 0x14, 0xe0, 0xb9, 0x06, 0x37, 0x20, 0x43, 0xf5, 0x3e, 0x0b, 0x09, 0x8b, 0x5b, 0xf5, 0xe2, 0xa1, 0x73, 0xd6, 0x14, 0x48, 0x16, 0x78, 0x2d, 0x32, 0x7c, 0xa1, 0xbf, 0x2f, 0x44, + 0xef, 0xc1, 0xff, 0xbf, 0x94, 0xc5, 0x47, 0xb1, 0xfa, 0x45, 0x61, 0x79, 0x62, 0x18, 0xf6, 0x81, 0xc9, 0xa9, 0xfd, 0x5b, 0x60, 0x93, 0x6a, 0x14, 0xad, 0xe1, 0x1a, 0x64, 0xa2, 0x15, 0x9d, 0xa9, + 0xb7, 0x8e, 0x8a, 0x6c, 0x6d, 0x4e, 0x18, 0x6b, 0x6d, 0xb6, 0x6e, 0x58, 0x8d, 0x68, 0x7d, 0x2e, 0xa4, 0x00, 0x51, 0x47, 0xf7, 0x96, 0xfd, 0x30, 0x30, 0xd9, 0x8f, 0x8d, 0x0e, 0xa9, 0xde, 0xb1, + 0x18, 0xe4, 0x99, 0x96, 0x7d, 0xd5, 0xeb, 0xdf, 0xb7, 0x40, 0xea, 0xe2, 0xea, 0x9e, 0xd5, 0xcf, 0x2c, 0xe6, 0xeb, 0x2c, 0xbc, 0xb8, 0x79, 0x73, 0x14, 0xb2, 0x19, 0x36, 0x31, 0x0e, 0xee, 0x13, + 0xbc, 0xc6, 0x68, 0x5d, 0x47, 0xa3, 0xb4, 0x04, 0x87, 0xb6, 0xda, 0x5c, 0x32, 0x6b, 0x42, 0xca, 0x4c, 0x57, 0x51, 0xee, 0xa3, 0x25, 0xf6, 0xd6, 0x40, 0x5d, 0x19, 0x46, 0x1d, 0xd6, 0xb5, 0xc3, + 0x56, 0xee, 0x57, 0x0c, 0xdb, 0xaf, 0x00, 0xb4, 0xfb, 0xdf, 0x7a, 0x73, 0xc6, 0xa4, 0x34, 0xc4, 0x48, 0x1f, 0x73, 0x76, 0x0c, 0x08, 0x16, 0x96, 0x1c, 0xa2, 0x05, 0x54, 0x6d, 0x08, 0x2b, 0x2e, + 0x5d, 0xbd, 0xa9, 0x38, 0x38, 0x57, 0xfa, 0x32, 0xec, 0xc8, 0x69, 0x52, 0x30, 0x6d, 0xe8, 0xdf, 0x60, 0xcc, 0x51, 0xf3, 0xff, 0x2a, 0x38, 0x3e, 0x80, 0xcd, 0x0e, 0xb9, 0x85, 0xef, 0x50, 0xf9, + 0xa8, 0x9f, 0x38, 0x82, 0x9d, 0x1f, 0xbc, 0xc3, 0xab, 0x5b, 0xf1, 0x67, 0xda, 0xb3, 0x8d, 0xe8, 0x1f, 0xfa, 0x07, 0x3c, 0xf1, 0x46, 0xe4, 0x24, 0x08, 0x52, 0x60, 0x4c, 0x2e, 0xd5, 0xb6, 0x26, + 0x22, 0x81, 0x62, 0xab, 0xa2, 0x82, 0x1a, 0x6a, 0x4d, 0x8d, 0x1d, 0x59, 0xaa, 0x35, 0xc7, 0xa0, 0xb1, 0xd8, 0x98, 0x69, 0x75, 0x62, 0xb6, 0x35, 0xff, 0xc6, 0x46, 0x7c, 0x8f, 0xed, 0x8e, 0x19, + 0xcb, 0xfb, 0x30, 0xf6, 0x9f, 0x58, 0xcf, 0xe7, 0x1e, 0xe4, 0xfd, 0xeb, 0x68, 0xef, 0xf6, 0xe2, 0xe6, 0xa0, 0x96, 0x7c, 0x67, 0xfa, 0x6e, 0xe5, 0x9f, 0xf2, 0x1e, 0x91, 0xe8, 0x9f, 0x7e, 0x50, + 0x40, 0x5e, 0xa0, 0xbb, 0x7d, 0x48, 0xf7, 0xdf, 0xc5, 0x71, 0x2f, 0x21, 0xd7, 0x61, 0x74, 0xf5, 0x4f, 0x41, 0xd5, 0x77, 0x47, 0xf3, 0x1d, 0x4d, 0x6d, 0x0f, 0x97, 0xdf, 0x1e, 0xa3, 0xc5, 0xbb, + 0xeb, 0x9f, 0xda, 0x8a, 0xa7, 0xbc, 0x7a, 0xee, 0x86, 0xe8, 0xe4, 0x16, 0x43, 0x03, 0x67, 0x31, 0x37, 0xe9, 0xbd, 0xf7, 0x6c, 0xc9, 0x3e, 0xab, 0x72, 0x6c, 0xc6, 0xb4, 0x8f, 0x85, 0x21, 0x6d, + 0x29, 0x34, 0x4a, 0xa2, 0xc5, 0xd8, 0x33, 0x7d, 0x06, 0xf5, 0x68, 0xcb, 0x1a, 0x6f, 0x11, 0xfb, 0x61, 0x53, 0xfa, 0xf5, 0xfa, 0xca, 0xef, 0x05, 0xf1, 0x9e, 0x11, 0xbf, 0x0a, 0xbb, 0xe2, 0xe2, + 0x40, 0x88, 0x7c, 0x6a, 0xd5, 0x2c, 0x9c, 0xd8, 0x60, 0x36, 0xf2, 0xc5, 0x06, 0xd9, 0xc0, 0xa2, 0x87, 0xac, 0x5a, 0x31, 0x42, 0x74, 0x95, 0x9b, 0x2d, 0x18, 0xb9, 0x3c, 0xc3, 0x08, 0xaa, 0xdc, + 0x2d, 0x8d, 0xac, 0x86, 0x74, 0xed, 0xa3, 0xf2, 0xb7, 0x23, 0x8b, 0xff, 0x7c, 0xb5, 0x09, 0xa0, 0xde, 0x9c, 0xfb, 0xef, 0x7b, 0xbb, 0xc6, 0x1f, 0x60, 0x9d, 0x98, 0x08, 0xc8, 0xce, 0x5e, 0x31, + 0x92, 0xe7, 0x60, 0x0d, 0xa5, 0x51, 0x4c, 0x18, 0x33, 0x45, 0x5c, 0x07, 0xaf, 0x35, 0x56, 0xb3, 0xe1, 0x03, 0x25, 0x9c, 0x57, 0x69, 0x01, 0xa4, 0xe7, 0x0c, 0xe7, 0x86, 0x73, 0xcc, 0x3a, 0xb8, + 0x6d, 0x5f, 0xf2, 0x8b, 0x7f, 0x7e, 0x2d, 0xd7, 0x75, 0xf3, 0xed, 0xd2, 0xcf, 0x6e, 0xaf, 0xf5, 0xfc, 0xf6, 0x05, 0xfc, 0x1f, 0xa7, 0x16, 0xcc, 0x66, 0xb2, 0x72, 0x91, 0x99, 0x91, 0x9b, 0x47, + 0x08, 0x87, 0x82, 0x34, 0xd3, 0xe6, 0x63, 0x29, 0x98, 0xb5, 0x48, 0x74, 0xa8, 0xa8, 0xc9, 0xb1, 0x21, 0x41, 0x10, 0xcc, 0xe0, 0x39, 0x35, 0x5d, 0x19, 0xf1, 0xa4, 0x82, 0x79, 0x7b, 0xfb, 0xed, + 0x45, 0x1e, 0x00, 0x4e, 0x8d, 0xdd, 0x42, 0xac, 0x8b, 0x25, 0x2c, 0xe6, 0x16, 0x00, 0x84, 0xe0, 0x61, 0x60, 0x22, 0xc4, 0x4a, 0x23, 0xa2, 0x57, 0xe7, 0x94, 0xde, 0x04, 0xdd, 0xaa, 0x33, 0x4f, + 0xa0, 0x85, 0x4b, 0x3b, 0x48, 0x8c, 0xca, 0x5c, 0x07, 0x29, 0xfe, 0x9c, 0xd7, 0x5f, 0xce, 0x6f, 0xcf, 0xd4, 0xce, 0xef, 0xad, 0xdf, 0xb9, 0xdd, 0x9b, 0xa1, 0x3f, 0xcf, 0x2f, 0xf5, 0xeb, 0xf9, + 0xbb, 0x2d, 0xb2, 0x95, 0x57, 0x08, 0xbf, 0xbb, 0xbd, 0xf2, 0x7a, 0x7b, 0xf0, 0xe0, 0x61, 0xad, 0x43, 0x04, 0xaf, 0xc4, 0xc5, 0x1d, 0x36, 0x98, 0x34, 0xa6, 0xfb, 0xaa, 0xca, 0x22, 0x5d, 0xd5, + 0xa7, 0x2b, 0x4e, 0xef, 0xab, 0x12, 0x23, 0xb9, 0xb5, 0x41, 0x3d, 0x27, 0x72, 0x2d, 0xa5, 0x49, 0x7a, 0x4c, 0x27, 0xff, 0xf4, 0x17, 0x21, 0xd7, 0xa9, 0xe3, 0x78, 0xeb, 0x0b, 0x92, 0xa4, 0x25, + 0x5b, 0xf3, 0xf2, 0xce, 0x69, 0xbe, 0x81, 0x70, 0xb1, 0x46, 0xd0, 0x63, 0x35, 0xe9, 0x59, 0xd4, 0x03, 0x48, 0x29, 0x89, 0x89, 0xdb, 0xea, 0xc5, 0xa5, 0xc4, 0x2a, 0x39, 0x05, 0xfe, 0xb9, 0xa7, + 0x3f, 0x1e, 0x81, 0x3d, 0xc9, 0xb6, 0xee, 0x27, 0x55, 0xeb, 0xd3, 0xd9, 0x79, 0xed, 0xfc, 0x5c, 0x3b, 0xe8, 0x6f, 0x5f, 0xf8, 0xd2, 0x5f, 0x4b, 0x51, 0x7e, 0x4f, 0x46, 0xfe, 0x1d, 0x6f, 0x79, + 0x44, 0xe8, 0xb6, 0xe5, 0x9f, 0xfd, 0xf5, 0x42, 0xdf, 0x4e, 0x6d, 0x42, 0x95, 0x06, 0x42, 0xf5, 0xec, 0xd1, 0x3a, 0x74, 0x6e, 0x93, 0xc5, 0xba, 0x01, 0x35, 0x4b, 0xeb, 0x33, 0x2a, 0x69, 0x35, + 0xb0, 0x26, 0xea, 0xcc, 0xd9, 0x9b, 0x4f, 0x10, 0x82, 0x12, 0x8e, 0xea, 0x59, 0xb8, 0xec, 0x88, 0xcc, 0x3d, 0x30, 0x7f, 0xcf, 0x3e, 0x9e, 0xbe, 0xb0, 0x25, 0x8d, 0xa2, 0x52, 0x7d, 0xb4, 0xea, + 0x1e, 0x6a, 0x8a, 0xab, 0x7c, 0xd6, 0xe0, 0x0a, 0x8f, 0x30, 0x1e, 0x45, 0x92, 0x31, 0xa1, 0xd3, 0x9c, 0x3c, 0x95, 0x97, 0xd3, 0xe6, 0xd8, 0xc7, 0x62, 0x5e, 0x0d, 0x2b, 0x8e, 0x2d, 0xff, 0x31, + 0x7a, 0x7f, 0xae, 0xf2, 0x78, 0x7a, 0x95, 0x2f, 0x88, 0xc4, 0xca, 0xe5, 0x3c, 0xcc, 0x81, 0x86, 0x62, 0x0d, 0x66, 0x8d, 0x90, 0x01, 0xb5, 0xa0, 0xd3, 0x5a, 0x62, 0xc4, 0x32, 0x82, 0x98, 0xe6, + 0xd4, 0x41, 0x3a, 0x7c, 0xd1, 0x8c, 0x29, 0x30, 0xa5, 0x1f, 0x5b, 0xff, 0xc5, 0x95, 0xff, 0x7e, 0x66, 0x77, 0x55, 0x2f, 0x52, 0xb7, 0x72, 0xf2, 0x3d, 0x20, 0x18, 0x08, 0x30, 0x6b, 0xf3, 0xbb, + 0xa1, 0x61, 0x28, 0xa0, 0x09, 0xab, 0x1c, 0xd2, 0xfb, 0xe0, 0x91, 0x31, 0x63, 0x91, 0xa3, 0x4c, 0xc2, 0x10, 0x5e, 0xd2, 0x8a, 0x8c, 0xb4, 0x13, 0x30, 0x0a, 0xe7, 0xe1, 0x8a, 0xcc, 0xae, 0xdc, + 0x7a, 0xee, 0x67, 0x7a, 0x7d, 0xad, 0xdf, 0x5e, 0xd1, 0x92, 0x5d, 0xe9, 0xe4, 0xec, 0xe6, 0xdb, 0x7e, 0x2a, 0xfe, 0xf4, 0x60, 0x86, 0x88, 0x46, 0xa4, 0xca, 0x28, 0x72, 0x34, 0x02, 0x8f, 0x1c, + 0xec, 0x2e, 0x95, 0x89, 0x7d, 0x6a, 0x52, 0x98, 0xe6, 0x5a, 0xb1, 0xc5, 0x4e, 0x61, 0xc4, 0xa3, 0x95, 0x83, 0xd9, 0x88, 0x35, 0x55, 0xd3, 0xe3, 0x20, 0x99, 0xee, 0x4f, 0x1d, 0xd2, 0xab, 0x44, + 0xe2, 0x9b, 0x53, 0xd8, 0xdc, 0x5a, 0x9f, 0xde, 0x53, 0x23, 0x7b, 0x93, 0x05, 0xc3, 0x61, 0x44, 0x98, 0x7a, 0xfa, 0x30, 0x44, 0xa7, 0x80, 0xea, 0xb2, 0xba, 0x32, 0x93, 0x1a, 0xa6, 0x3a, 0x66, + 0x4f, 0x49, 0x5d, 0x63, 0xcc, 0x23, 0x69, 0xd3, 0x27, 0x3b, 0xf4, 0x0b, 0x94, 0xde, 0x7d, 0xf9, 0xaa, 0x17, 0x57, 0x7b, 0xc0, 0x94, 0x4f, 0x2e, 0xb2, 0xe2, 0x43, 0x92, 0xb5, 0x1a, 0xa0, 0x33, + 0xf4, 0x1a, 0xb8, 0x7d, 0xec, 0xb9, 0xed, 0x68, 0x8a, 0x6d, 0x4e, 0x38, 0xd6, 0x58, 0x41, 0x36, 0x00, 0x05, 0xfb, 0x6c, 0x58, 0x4c, 0x73, 0x0b, 0xf8, 0x9b, 0xcc, 0x0e, 0xc7, 0xd4, 0xee, 0xdb, + 0x6d, 0x5e, 0x5d, 0xc7, 0x8b, 0xf0, 0x9d, 0x4e, 0xee, 0x6f, 0x81, 0x1c, 0x96, 0xf8, 0xe8, 0xd1, 0x64, 0x09, 0x0d, 0x12, 0xf1, 0x28, 0xe5, 0x74, 0x9f, 0x7d, 0x4c, 0xf6, 0xea, 0x6b, 0x4d, 0xeb, + 0xbd, 0xa3, 0x75, 0x40, 0x1d, 0x46, 0x63, 0x8d, 0x58, 0xd1, 0x75, 0xea, 0x84, 0xf6, 0x0a, 0x01, 0xfb, 0x9a, 0x34, 0x4e, 0x9f, 0x24, 0x4e, 0xf2, 0xf4, 0xb9, 0xaa, 0xf5, 0xea, 0x98, 0x44, 0x82, + 0xc4, 0xab, 0xb3, 0x8c, 0x05, 0xad, 0x74, 0x34, 0xe5, 0xd6, 0x47, 0x2c, 0x5f, 0x69, 0xc9, 0x5b, 0x10, 0xaf, 0xc1, 0x39, 0x9d, 0x5b, 0x2f, 0xd3, 0xbe, 0x7e, 0x79, 0xf1, 0x6f, 0x11, 0xa4, 0x19, + 0xb7, 0xe6, 0x49, 0x9d, 0x67, 0x23, 0x08, 0x8f, 0xa6, 0x1d, 0xb9, 0xa2, 0x35, 0x61, 0x27, 0x68, 0x32, 0x98, 0xba, 0x93, 0x2f, 0xad, 0xb5, 0x16, 0xe3, 0x1c, 0x42, 0xb8, 0x43, 0x1e, 0xad, 0x59, + 0x34, 0x7a, 0x95, 0xf3, 0xf7, 0xa5, 0xaa, 0x7d, 0x0a, 0x4e, 0x2e, 0xfc, 0x8d, 0xdb, 0x34, 0x05, 0x49, 0x61, 0x93, 0xc6, 0x6b, 0x26, 0x48, 0x78, 0x8b, 0x91, 0xa8, 0x16, 0xab, 0xb5, 0xb6, 0x42, + 0x24, 0xc8, 0x9b, 0x8f, 0x00, 0x8d, 0x66, 0x23, 0x19, 0x3d, 0x9d, 0x9d, 0x84, 0x0e, 0x1b, 0xb2, 0xfb, 0x10, 0xeb, 0x9e, 0xe1, 0x47, 0xd5, 0xdb, 0xfd, 0x65, 0x01, 0xe2, 0xd4, 0x01, 0x0d, 0x29, + 0xa3, 0x23, 0x91, 0x43, 0x15, 0x09, 0x2b, 0xd3, 0x54, 0x4e, 0x28, 0xdb, 0x82, 0x4f, 0x8b, 0xb6, 0x08, 0x5b, 0x7a, 0x28, 0x37, 0x5f, 0x85, 0xc3, 0x19, 0x00, 0x0b, 0x79, 0xc1, 0x1c, 0x18, 0xbc, + 0xf8, 0xc8, 0xfe, 0xdc, 0x87, 0x8c, 0x2f, 0x00, 0x1f, 0x9c, 0x7a, 0x73, 0x88, 0xd7, 0xb0, 0x08, 0x70, 0x99, 0x86, 0xba, 0x68, 0x1a, 0x5a, 0xb0, 0x7b, 0xc3, 0x5c, 0xd3, 0xa6, 0xf5, 0xb0, 0x02, + 0x4a, 0xce, 0xd1, 0x89, 0xa6, 0x53, 0x0d, 0x72, 0x41, 0xed, 0x13, 0x1a, 0xb5, 0xb5, 0x01, 0xbe, 0x5f, 0x5d, 0xfe, 0x5b, 0x88, 0x96, 0xe9, 0x16, 0xcf, 0x50, 0xef, 0xc2, 0xbb, 0xcc, 0xbd, 0x79, + 0x9b, 0x20, 0xd9, 0xdd, 0xbc, 0x01, 0xb6, 0xcc, 0xb1, 0x30, 0xcd, 0x98, 0x6c, 0x74, 0xa3, 0x2c, 0x2b, 0x16, 0x00, 0xb6, 0xc0, 0x50, 0x6a, 0x47, 0xc3, 0x31, 0xbf, 0xba, 0xbc, 0xb9, 0xfd, 0x58, + 0x2f, 0xf3, 0x40, 0xa7, 0x16, 0x9e, 0x12, 0xf4, 0xd2, 0x56, 0x31, 0xa6, 0x34, 0xeb, 0x5e, 0xcb, 0x21, 0x0b, 0x5d, 0xcd, 0x42, 0x8c, 0xb3, 0x10, 0x4b, 0x47, 0xf7, 0x1a, 0x09, 0x25, 0x68, 0x6d, + 0x40, 0xeb, 0x35, 0x63, 0x04, 0x78, 0xcd, 0x3c, 0x2a, 0x3c, 0x57, 0x97, 0x7f, 0xe4, 0xf5, 0xed, 0x47, 0xd7, 0x9b, 0x7c, 0xf3, 0x5c, 0xd6, 0x44, 0x1a, 0x31, 0x44, 0x7b, 0x2e, 0x54, 0x2e, 0x47, + 0x60, 0x1f, 0x1b, 0x44, 0x9e, 0x53, 0x30, 0xcc, 0x67, 0x94, 0xcd, 0xae, 0xcd, 0x97, 0x4b, 0x23, 0x19, 0x13, 0xa1, 0xd8, 0x24, 0x58, 0xb8, 0x91, 0xb6, 0x63, 0x99, 0x9d, 0x87, 0x46, 0x94, 0x3d, + 0x05, 0xa0, 0x93, 0xd7, 0x6e, 0x5b, 0xd7, 0x11, 0x6c, 0x08, 0x0b, 0xc5, 0x9c, 0x8d, 0xac, 0x88, 0x07, 0xa9, 0xf0, 0x52, 0x24, 0xd0, 0x1c, 0x94, 0x3a, 0xc6, 0x26, 0x2e, 0x82, 0x66, 0xd8, 0x10, + 0x66, 0x0e, 0x6a, 0x32, 0x8b, 0x4c, 0xc6, 0x61, 0x24, 0x79, 0x10, 0xad, 0x7d, 0x4f, 0x4c, 0x3e, 0x90, 0xf4, 0x71, 0xb7, 0x8c, 0x57, 0xac, 0xd7, 0x63, 0x81, 0xfc, 0x45, 0xd6, 0xe7, 0xc4, 0x2c, + 0x50, 0x8c, 0x92, 0xd9, 0x6a, 0x0b, 0x1d, 0xc5, 0x70, 0x0b, 0x45, 0x3a, 0xb2, 0xf4, 0xda, 0x54, 0x2b, 0x6d, 0x10, 0xb2, 0x7b, 0x1a, 0xe0, 0x74, 0x41, 0x61, 0x62, 0xc5, 0xb9, 0xb0, 0xab, 0xb5, + 0x4c, 0x1b, 0x7d, 0x1e, 0xdb, 0xc1, 0xaf, 0x77, 0x95, 0xba, 0x03, 0xb6, 0x2f, 0x48, 0x38, 0xf5, 0x2e, 0x66, 0xb4, 0xe6, 0x93, 0xdd, 0x46, 0x34, 0xe5, 0x98, 0xa4, 0x44, 0x35, 0x35, 0x70, 0xce, + 0x15, 0xc6, 0xc9, 0xa3, 0xb7, 0x0e, 0x10, 0x31, 0x7a, 0x2a, 0x8b, 0x79, 0x50, 0x59, 0x43, 0xf4, 0x49, 0x02, 0xe0, 0x87, 0xb3, 0x38, 0xaf, 0xc7, 0x8e, 0x7e, 0xed, 0x1d, 0x4b, 0x6f, 0xf6, 0x9b, + 0x34, 0x4e, 0x0f, 0xda, 0x16, 0xc0, 0x98, 0x95, 0x9e, 0x8b, 0xd4, 0xa6, 0x4a, 0xa1, 0x56, 0x18, 0x34, 0xf1, 0xec, 0x9a, 0x83, 0x39, 0x09, 0x0d, 0x10, 0x17, 0x11, 0x64, 0x64, 0x88, 0x58, 0x30, + 0xd7, 0x44, 0x96, 0xd1, 0x0d, 0x0e, 0xd7, 0x97, 0xf6, 0x72, 0x12, 0x47, 0x88, 0x7c, 0x9a, 0xa8, 0xd8, 0xc3, 0x75, 0x72, 0xfa, 0x5c, 0xdc, 0x70, 0x67, 0x13, 0xcf, 0x82, 0xec, 0x03, 0xe6, 0x6c, + 0x39, 0x88, 0xba, 0x20, 0x25, 0x15, 0x75, 0x35, 0x1c, 0x65, 0x96, 0xd1, 0x53, 0x74, 0x54, 0x1b, 0x18, 0xd5, 0x27, 0x73, 0xa4, 0x51, 0x4c, 0xeb, 0x78, 0xb8, 0x3a, 0xfb, 0xcc, 0x18, 0xbe, 0xff, + 0xe7, 0xe9, 0xc8, 0x38, 0xff, 0x94, 0x37, 0xfb, 0x29, 0xd8, 0xd3, 0xa3, 0xdb, 0xe8, 0x11, 0xb3, 0x05, 0xb4, 0xd5, 0x74, 0xb0, 0xb6, 0xa1, 0xd6, 0x3a, 0x76, 0xe6, 0x46, 0x92, 0x6d, 0x08, 0x10, + 0x8c, 0xd8, 0x82, 0x6c, 0xad, 0xe0, 0x86, 0xab, 0x8f, 0x19, 0x56, 0xdd, 0x7d, 0x86, 0x5b, 0x9b, 0x87, 0x6b, 0x58, 0xbf, 0x88, 0x6e, 0xe3, 0xfc, 0xc6, 0xf5, 0x3a, 0x5e, 0xb8, 0xed, 0x53, 0xef, + 0x33, 0x02, 0x46, 0xab, 0xc1, 0x83, 0xdc, 0x26, 0x4f, 0x91, 0xce, 0x45, 0xa3, 0x81, 0x7b, 0xcb, 0xc9, 0x45, 0x45, 0xb4, 0xba, 0xaf, 0x40, 0xef, 0x09, 0x29, 0x88, 0x99, 0x92, 0x61, 0x49, 0x6a, + 0xe4, 0xec, 0xc7, 0x62, 0xda, 0x87, 0x32, 0xe7, 0xf3, 0xd5, 0xcf, 0x93, 0xab, 0x63, 0xf2, 0x0a, 0x2a, 0x70, 0x27, 0xcd, 0xde, 0xcd, 0xca, 0x61, 0x70, 0xc6, 0x88, 0xa1, 0x23, 0xab, 0x9b, 0xa3, + 0x20, 0x72, 0x6f, 0x3d, 0x86, 0x8c, 0x35, 0x21, 0xd2, 0xb0, 0xaf, 0xf2, 0x74, 0x4a, 0xa1, 0x71, 0xcc, 0x69, 0x3f, 0xad, 0xb9, 0x3d, 0x17, 0xb2, 0xf5, 0x01, 0x4f, 0x1d, 0x78, 0xac, 0x16, 0xd5, + 0x90, 0xca, 0x7c, 0xa8, 0xaf, 0x56, 0x8b, 0xa3, 0xb2, 0x5a, 0x48, 0x0d, 0x6c, 0xa2, 0x38, 0xb0, 0x50, 0x49, 0xb8, 0xb8, 0x08, 0x85, 0xc8, 0xab, 0x90, 0x62, 0xe1, 0xe8, 0xae, 0xde, 0xe6, 0xe1, + 0x3e, 0xbf, 0x5f, 0x33, 0x29, 0x79, 0x79, 0xf7, 0xe5, 0x4c, 0x6f, 0xce, 0xce, 0x2f, 0x2f, 0x5f, 0x24, 0x8b, 0x4e, 0xdf, 0xf0, 0xc1, 0x3e, 0x6a, 0xc3, 0xd0, 0x2a, 0x10, 0x08, 0x0d, 0x86, 0xa4, + 0xa7, 0x61, 0x6d, 0x11, 0x95, 0x53, 0x28, 0xac, 0xbe, 0x96, 0x02, 0xb7, 0x84, 0xec, 0x9e, 0x42, 0x4b, 0xd5, 0xc5, 0x57, 0x85, 0x59, 0x0d, 0x39, 0x4c, 0xe8, 0x83, 0xdf, 0xfe, 0xc7, 0xa6, 0x24, + 0x2f, 0xff, 0xf8, 0x78, 0x71, 0xf5, 0xe9, 0xd3, 0x0b, 0xfa, 0xf9, 0xe4, 0xc2, 0x4a, 0x34, 0x36, 0x19, 0x35, 0xeb, 0x66, 0xdd, 0xa1, 0x14, 0x38, 0xa4, 0x30, 0x29, 0xfb, 0x32, 0x33, 0xad, 0xd5, + 0x65, 0x9a, 0x2e, 0x04, 0xd9, 0x60, 0xa4, 0x81, 0x4d, 0xa2, 0x11, 0x0c, 0xb0, 0xfd, 0xd3, 0x8f, 0x94, 0xc4, 0x6f, 0x6f, 0xbf, 0xed, 0xa8, 0xfc, 0x7c, 0xf7, 0x45, 0x2f, 0xbf, 0xc7, 0x35, 0x2f, + 0xdb, 0x1c, 0x6f, 0xf3, 0xfa, 0x8b, 0x5f, 0x5d, 0x5c, 0xbd, 0x52, 0xde, 0x7a, 0xe8, 0x16, 0xde, 0x37, 0x39, 0x78, 0x6a, 0xbb, 0xea, 0xd1, 0x35, 0x7d, 0xf4, 0x48, 0x68, 0x95, 0x32, 0x83, 0x63, + 0xf9, 0x98, 0x23, 0x0d, 0xb8, 0xd0, 0xe7, 0x62, 0xb3, 0x31, 0x60, 0x29, 0xa6, 0xd3, 0xe8, 0x36, 0x0c, 0x70, 0xa0, 0x4c, 0x1a, 0x38, 0xd5, 0xf2, 0x88, 0x6f, 0xd9, 0x4f, 0xec, 0xff, 0x08, 0x0a, + 0x9e, 0xd5, 0x7d, 0xbe, 0x9c, 0x5f, 0x9e, 0xff, 0xd7, 0xc7, 0xab, 0xbf, 0xce, 0x5f, 0x6b, 0xfa, 0xac, 0xcb, 0x3f, 0x5e, 0xb0, 0xe1, 0xd4, 0x6d, 0xaf, 0xbd, 0x24, 0xd3, 0x05, 0x56, 0xf4, 0x42, + 0x6a, 0x53, 0x22, 0xdd, 0x44, 0x0b, 0xc6, 0x20, 0xd7, 0x60, 0x5f, 0xab, 0x25, 0x86, 0x22, 0xa9, 0x68, 0xc5, 0x5a, 0xea, 0xda, 0x5a, 0x1b, 0x1d, 0xd4, 0x16, 0xfa, 0xb1, 0x44, 0x54, 0x5d, 0x5d, + 0x7f, 0x79, 0x5a, 0x65, 0x78, 0xeb, 0xa4, 0xc8, 0x28, 0xc7, 0xa1, 0x8b, 0x4b, 0xa9, 0x02, 0x9b, 0x90, 0x55, 0x59, 0x9b, 0x82, 0x63, 0x0d, 0x6c, 0x9d, 0x42, 0x9a, 0x02, 0x57, 0x0b, 0xc8, 0x36, + 0x40, 0x38, 0x36, 0xdc, 0x11, 0x7d, 0x8c, 0xc1, 0x03, 0xe1, 0x48, 0xf9, 0xe7, 0x8b, 0xde, 0xfa, 0xe7, 0xbc, 0x39, 0x56, 0x6e, 0x39, 0xb6, 0x6b, 0x77, 0xfe, 0xf9, 0xe6, 0x5c, 0xcf, 0xfe, 0xeb, + 0xfc, 0xda, 0xaf, 0xf6, 0x11, 0xe3, 0xe9, 0xed, 0x19, 0xa6, 0xf0, 0xec, 0x3e, 0x25, 0x4d, 0x35, 0x67, 0x6f, 0xa6, 0x7d, 0x14, 0xd3, 0x5a, 0x2b, 0x8c, 0xe6, 0x48, 0x92, 0xc4, 0x21, 0xa6, 0x60, + 0xde, 0x32, 0x94, 0xa3, 0xcd, 0x22, 0x6d, 0x73, 0x03, 0xc8, 0xb1, 0x0e, 0x17, 0x68, 0x9f, 0x35, 0x0f, 0x3d, 0x27, 0xe8, 0x21, 0x91, 0xfa, 0x4b, 0xc4, 0x1f, 0x4c, 0x8b, 0x9f, 0x9a, 0x01, 0x3d, + 0x5c, 0x55, 0x34, 0x99, 0x71, 0x04, 0xa0, 0x87, 0xad, 0x61, 0x5d, 0x43, 0x44, 0xa9, 0x53, 0x18, 0x37, 0xa3, 0xb9, 0xbc, 0x49, 0x64, 0x00, 0x67, 0x03, 0x8c, 0x35, 0x6d, 0x38, 0x34, 0x68, 0xc5, + 0x7a, 0xcc, 0xfb, 0xd6, 0xdd, 0xa5, 0xdf, 0x9e, 0xbf, 0xd8, 0x40, 0xf8, 0x70, 0x58, 0xf1, 0x0f, 0xd4, 0x02, 0xff, 0xcc, 0xfb, 0x0e, 0xd9, 0x27, 0xc6, 0xfd, 0x87, 0x51, 0x3c, 0xca, 0xbf, 0x43, + 0xf0, 0xa8, 0x7f, 0x80, 0x53, 0x43, 0xbc, 0x96, 0x9c, 0xd4, 0x75, 0xb5, 0x1e, 0x9a, 0x58, 0xda, 0xd9, 0xa1, 0xa6, 0xae, 0x4a, 0x40, 0xc8, 0x0d, 0x90, 0x97, 0x0c, 0x5a, 0x46, 0x51, 0xde, 0x06, + 0xa2, 0x12, 0x56, 0x27, 0xa0, 0x11, 0x1a, 0xe5, 0x47, 0xfa, 0xbc, 0xff, 0x56, 0x57, 0xd0, 0x43, 0x87, 0xf1, 0xd1, 0x5e, 0xb3, 0x5b, 0xbd, 0x39, 0xd8, 0x7c, 0xf6, 0x3a, 0xe7, 0xbe, 0xff, 0xb7, + 0xdf, 0x9c, 0x83, 0x39, 0x17, 0xea, 0x5c, 0x86, 0xa2, 0x6b, 0x61, 0x54, 0x1b, 0x34, 0x1c, 0xa8, 0x87, 0xf7, 0x49, 0x33, 0x34, 0x2b, 0x57, 0x33, 0xa5, 0x1d, 0xb8, 0xcc, 0x48, 0xa1, 0x18, 0xca, + 0xad, 0x47, 0xe2, 0x62, 0xc8, 0xc3, 0x8a, 0xf7, 0xb3, 0x53, 0x6b, 0x3f, 0x23, 0xfe, 0x25, 0x2c, 0x7b, 0x03, 0xca, 0x1b, 0x35, 0x2c, 0x9e, 0x23, 0x96, 0x2e, 0x51, 0x9c, 0x8d, 0xba, 0xad, 0x25, + 0x86, 0xd3, 0xb3, 0x3b, 0x4d, 0x96, 0xc0, 0xb9, 0x4a, 0xa7, 0x19, 0xa2, 0x07, 0xfb, 0x54, 0x0d, 0x59, 0x9d, 0x5a, 0x02, 0x4b, 0x1c, 0xf5, 0x19, 0x3f, 0x04, 0xe3, 0xcd, 0x49, 0x50, 0x77, 0x12, + 0x89, 0x2c, 0xeb, 0xd6, 0x69, 0xd5, 0x8a, 0x55, 0xbd, 0xe6, 0x24, 0x18, 0xab, 0x0f, 0x15, 0xe8, 0xb0, 0xc6, 0xac, 0x62, 0x06, 0xb2, 0x82, 0xb6, 0x93, 0x7a, 0x4a, 0x27, 0x8b, 0x6d, 0xc3, 0x7f, + 0x46, 0xc2, 0x2e, 0x02, 0xfc, 0x3f, 0x40, 0x05, 0x39, 0x35, 0x94, 0x45, 0x6b, 0x7a, 0xd4, 0x40, 0xf7, 0xd6, 0x3c, 0x66, 0x4c, 0x59, 0xbc, 0x04, 0x4d, 0x47, 0x43, 0xe7, 0x39, 0xa6, 0xc2, 0x54, + 0x02, 0x41, 0x15, 0x11, 0x34, 0x70, 0xcf, 0x08, 0xc0, 0x23, 0x4d, 0x0f, 0x0f, 0xcd, 0x26, 0xcf, 0xc3, 0xd9, 0xb3, 0xcf, 0xfa, 0xdf, 0x0b, 0x71, 0x9f, 0x09, 0xf2, 0xdb, 0x73, 0x66, 0xb0, 0xa5, + 0x46, 0xf3, 0xac, 0x6a, 0x31, 0x23, 0x72, 0xd5, 0xe6, 0x0c, 0x3d, 0x64, 0xba, 0xf4, 0xbe, 0x00, 0xc1, 0x8c, 0x19, 0x38, 0x7a, 0xb2, 0x6d, 0xe0, 0x7a, 0xc8, 0xe8, 0xb0, 0xb8, 0x39, 0xe1, 0x3a, + 0x96, 0xc5, 0x7e, 0x66, 0x9b, 0xde, 0x9c, 0x88, 0xa5, 0x30, 0x2d, 0x4b, 0xca, 0x41, 0x29, 0x22, 0x6c, 0x58, 0xe6, 0x00, 0x97, 0x25, 0xd9, 0xcb, 0x4c, 0x71, 0x8e, 0x29, 0x6e, 0xd6, 0xb2, 0x43, + 0x0d, 0xeb, 0xad, 0x3b, 0x2c, 0xca, 0x1e, 0xd1, 0x37, 0xb3, 0xfe, 0x13, 0x22, 0x76, 0xf6, 0xf4, 0xcd, 0x89, 0xa8, 0xb4, 0xe1, 0xd8, 0x57, 0x20, 0x27, 0x5a, 0x09, 0x55, 0x45, 0x05, 0xb2, 0xa1, + 0xa3, 0x64, 0x8f, 0x22, 0x9d, 0xcb, 0x09, 0xa4, 0x9b, 0x4d, 0x42, 0xee, 0x8b, 0x70, 0xc8, 0xf6, 0x2a, 0x08, 0xc8, 0x3c, 0x72, 0xa0, 0xe8, 0x89, 0x8c, 0xfe, 0x77, 0x9c, 0xce, 0xbd, 0x9e, 0xfe, + 0x9a, 0x1b, 0xfa, 0xde, 0x96, 0xf7, 0xac, 0x57, 0xf5, 0xec, 0xe2, 0xfc, 0x36, 0xdf, 0xb5, 0x0f, 0xf8, 0xd0, 0xd9, 0xb3, 0xfd, 0xe8, 0x47, 0xd3, 0xed, 0xeb, 0xfa, 0x73, 0x76, 0x99, 0x37, 0xb7, + 0x8f, 0x0d, 0xab, 0xaf, 0x76, 0x4c, 0x3f, 0x34, 0xce, 0x3e, 0xdf, 0xac, 0xd3, 0xe7, 0x15, 0xbd, 0x83, 0xcd, 0xe0, 0x01, 0x9a, 0xe8, 0x5c, 0x00, 0x1d, 0x37, 0x5b, 0x1f, 0x9d, 0x92, 0xa0, 0x93, + 0x44, 0x40, 0x83, 0xb9, 0x6b, 0xd1, 0xa4, 0x91, 0xb4, 0x9c, 0x3a, 0xa0, 0xf9, 0x9a, 0x38, 0xb4, 0x46, 0x3b, 0x7e, 0x06, 0xee, 0xbe, 0x26, 0x7d, 0x94, 0xbc, 0xe7, 0xd9, 0xa8, 0x37, 0xcf, 0xf0, + 0x8f, 0x06, 0x34, 0x67, 0xba, 0x2f, 0xed, 0x2d, 0x20, 0xba, 0x71, 0xb9, 0x20, 0x8a, 0x01, 0xa2, 0xa1, 0xe7, 0xca, 0x5d, 0x2b, 0x89, 0x20, 0xf6, 0x8d, 0x09, 0x2b, 0xc8, 0xd4, 0x0c, 0x47, 0xcf, + 0x01, 0x0b, 0x0e, 0x8b, 0xe4, 0xed, 0xb7, 0xaf, 0x79, 0x79, 0xf7, 0x65, 0xb7, 0x99, 0xbf, 0x98, 0xcf, 0xff, 0x94, 0xb7, 0xd7, 0x7a, 0x19, 0x57, 0x5f, 0x5e, 0x56, 0xf5, 0x4e, 0x5d, 0xf1, 0x5e, + 0xe5, 0xdd, 0x8d, 0x42, 0xa0, 0x36, 0x28, 0xdb, 0x60, 0x0c, 0x0b, 0xaf, 0xc0, 0x5e, 0x53, 0xc9, 0xbb, 0x68, 0x82, 0x4c, 0x71, 0xd4, 0x5c, 0x43, 0x16, 0x1a, 0xf4, 0xc1, 0xa3, 0xb9, 0xbb, 0xd6, + 0x28, 0x3f, 0xdc, 0x59, 0xf1, 0x02, 0xec, 0xfe, 0x68, 0x6b, 0xd4, 0x9b, 0xf3, 0xe3, 0x74, 0x7f, 0xde, 0xef, 0x24, 0x39, 0xfd, 0x69, 0xce, 0x91, 0xc4, 0xb8, 0x2a, 0x00, 0x49, 0x80, 0x34, 0x70, + 0xa4, 0x6c, 0xd6, 0x06, 0x86, 0x4a, 0x9f, 0xa0, 0x8b, 0xa5, 0xe6, 0xc4, 0x56, 0xb3, 0xbb, 0x8d, 0x69, 0x66, 0x6d, 0x95, 0x0c, 0x35, 0x13, 0xd6, 0xd1, 0x0f, 0x67, 0x79, 0x5e, 0x8c, 0x18, 0xb8, + 0xfc, 0xe3, 0x75, 0x6b, 0x73, 0xfc, 0xfc, 0xc4, 0xe7, 0xc7, 0x1e, 0xc2, 0xdd, 0xda, 0x1f, 0x8f, 0x2c, 0xff, 0x38, 0x00, 0x7c, 0x78, 0xf6, 0xc0, 0xbb, 0xdf, 0x6e, 0xaf, 0xd5, 0xbf, 0x97, 0x8f, + 0xee, 0x9f, 0xcf, 0x1e, 0x31, 0xc3, 0x71, 0x7e, 0xeb, 0xcd, 0x67, 0xbb, 0xbe, 0xfa, 0x73, 0x1f, 0xcb, 0xc8, 0xc9, 0x0d, 0x48, 0xb0, 0x56, 0x92, 0x12, 0xb6, 0xec, 0x95, 0x2c, 0x32, 0x59, 0x5b, + 0x5b, 0xb2, 0xdc, 0xa1, 0x36, 0x2c, 0xe6, 0x4b, 0x49, 0x54, 0x7a, 0xef, 0x8a, 0x52, 0x4b, 0xc9, 0x82, 0xa7, 0xe2, 0xe8, 0x31, 0x3c, 0x1a, 0x1d, 0xf1, 0x58, 0x3b, 0x35, 0x7a, 0x6b, 0x1c, 0x39, + 0x63, 0x22, 0x64, 0x19, 0xce, 0x35, 0x7b, 0xb5, 0x14, 0x41, 0xf2, 0xa9, 0x3e, 0x98, 0x73, 0x21, 0x8f, 0x1c, 0x39, 0x8d, 0x99, 0xc6, 0x08, 0x9b, 0x54, 0xa5, 0xd3, 0xe7, 0x70, 0x69, 0x94, 0x92, + 0xd0, 0x8f, 0x1c, 0x00, 0xbe, 0xbb, 0x3c, 0xf7, 0xab, 0xc8, 0xb3, 0x9b, 0xfc, 0xf4, 0x25, 0x2f, 0x6f, 0x75, 0x87, 0x28, 0x8f, 0x6f, 0xd4, 0x8f, 0x2e, 0xe1, 0x17, 0x16, 0xe1, 0xd4, 0x09, 0xdf, + 0x8e, 0x58, 0x14, 0xc9, 0x2c, 0x63, 0x26, 0x62, 0x46, 0xcb, 0xd1, 0x3a, 0x7a, 0x1f, 0xa2, 0xad, 0x00, 0xb9, 0x17, 0x14, 0x57, 0x0b, 0x16, 0x2b, 0xed, 0xb6, 0xaa, 0xcc, 0xb9, 0xb7, 0xe0, 0x32, + 0xf7, 0x71, 0x98, 0xdc, 0xd7, 0x0b, 0x64, 0x9f, 0xaf, 0x6e, 0x6e, 0xb7, 0xe7, 0x97, 0x41, 0xc7, 0xa9, 0x69, 0x73, 0xee, 0xe0, 0x3d, 0xa1, 0x8d, 0x46, 0xee, 0x2b, 0xa3, 0x0f, 0xaf, 0xc4, 0x82, + 0x30, 0x72, 0x41, 0x26, 0xef, 0xd1, 0x47, 0x29, 0xad, 0x99, 0xdd, 0x3a, 0x44, 0xd1, 0xac, 0x36, 0x57, 0x56, 0xcf, 0x75, 0x24, 0xe6, 0xf8, 0x91, 0xbb, 0xd3, 0x5b, 0xff, 0xfc, 0xf1, 0x31, 0xfc, + 0xf8, 0xb5, 0x0e, 0xee, 0xcf, 0xfb, 0x93, 0x29, 0x36, 0xa3, 0x77, 0x72, 0xbf, 0x86, 0x9c, 0xcb, 0x45, 0x9d, 0x89, 0x13, 0xd7, 0x20, 0x9c, 0x22, 0x2a, 0x03, 0x06, 0xb0, 0xaa, 0xe8, 0x14, 0xda, + 0xf9, 0xe9, 0xe9, 0x01, 0x85, 0x09, 0x36, 0xba, 0x0e, 0x9e, 0x0e, 0x6c, 0xd3, 0x1d, 0x0e, 0xc3, 0x81, 0xe7, 0x7d, 0x35, 0x3f, 0x8c, 0xde, 0xc3, 0x78, 0x85, 0x57, 0xe8, 0xdd, 0x8d, 0x65, 0x78, + 0x9e, 0xf8, 0xa3, 0x93, 0x6f, 0x75, 0x75, 0x5d, 0x6c, 0x13, 0x66, 0xee, 0xba, 0xf2, 0x1d, 0xb1, 0x0c, 0x36, 0xc4, 0xdd, 0xd7, 0xac, 0x86, 0xd5, 0xb5, 0x46, 0xaa, 0x2c, 0xc5, 0x31, 0xb9, 0x69, + 0xb4, 0xf2, 0x64, 0xde, 0x40, 0x78, 0xf7, 0x91, 0xf3, 0x58, 0x2b, 0xd7, 0x8f, 0x3c, 0xf6, 0x73, 0x02, 0x4e, 0xdf, 0x40, 0x1c, 0xd5, 0x1a, 0x79, 0xb9, 0x8e, 0x96, 0x85, 0xdd, 0xfb, 0x5c, 0xa3, + 0xa9, 0xaa, 0x0e, 0xd1, 0xd8, 0x20, 0x1d, 0xb7, 0x68, 0x29, 0x0d, 0xa9, 0x7b, 0x77, 0xe6, 0xce, 0x1b, 0x16, 0xe8, 0x18, 0xce, 0xda, 0x9d, 0x0e, 0x1f, 0x21, 0xf9, 0xcf, 0xbb, 0x73, 0xff, 0xfd, + 0x2c, 0xaf, 0xaf, 0x5f, 0x4b, 0xb4, 0x9f, 0xc7, 0xa5, 0xbe, 0x90, 0xc9, 0x53, 0x5b, 0x55, 0x82, 0xa5, 0x4d, 0x67, 0xa9, 0x2d, 0x04, 0xe2, 0x51, 0xb3, 0x53, 0x56, 0x76, 0x77, 0xa7, 0xe1, 0x0d, + 0x7a, 0x31, 0x61, 0x56, 0xb6, 0x1e, 0x6b, 0xf4, 0x5c, 0xd1, 0xfb, 0x18, 0x31, 0xdc, 0xd6, 0x68, 0xe9, 0x75, 0xb8, 0x0e, 0xff, 0x34, 0x31, 0xfb, 0x68, 0x61, 0xed, 0x3c, 0xce, 0x9f, 0x7d, 0x71, + 0x79, 0x75, 0xfd, 0x45, 0x2f, 0xce, 0xff, 0xeb, 0x27, 0x36, 0xf7, 0xbb, 0x03, 0xde, 0xaf, 0x12, 0x9e, 0xba, 0xb9, 0x75, 0x21, 0x2d, 0x1a, 0xda, 0xac, 0x96, 0xb0, 0x4a, 0x23, 0xec, 0xab, 0x2f, + 0x12, 0x6b, 0xe8, 0x60, 0x8e, 0x20, 0x1b, 0x4c, 0xea, 0xcc, 0x98, 0xe5, 0x31, 0x7c, 0x96, 0xf0, 0x9c, 0xa5, 0x64, 0x0b, 0x34, 0xab, 0xff, 0x14, 0x08, 0xfd, 0x70, 0xf3, 0xaf, 0x10, 0x7b, 0x73, + 0xab, 0x97, 0x2f, 0x8f, 0x0d, 0xc9, 0x89, 0x69, 0x9d, 0x00, 0x48, 0x99, 0xbb, 0x51, 0x21, 0x62, 0x0b, 0xa4, 0x8d, 0xb1, 0xa2, 0x10, 0x87, 0x46, 0x71, 0x92, 0xab, 0x96, 0x67, 0x0b, 0xa6, 0x2e, + 0x20, 0x39, 0x62, 0x1a, 0xc8, 0x1c, 0xd8, 0x81, 0xd2, 0x47, 0x1e, 0x76, 0x2e, 0xbf, 0x56, 0x4d, 0x3c, 0xbf, 0xfa, 0xe3, 0xc5, 0x3c, 0xab, 0xd3, 0xb7, 0x97, 0x18, 0x5a, 0x4f, 0x9d, 0x55, 0x32, + 0x12, 0x78, 0x10, 0xf7, 0x5a, 0x55, 0x39, 0x95, 0xd3, 0xd8, 0x5b, 0x8b, 0x36, 0x08, 0xa9, 0x75, 0x04, 0x5b, 0xe4, 0x83, 0xdb, 0x00, 0xe0, 0xb1, 0xc9, 0x3d, 0x64, 0xe3, 0x71, 0x38, 0x9e, 0x7e, + 0xdd, 0x7b, 0x9e, 0x7f, 0xf5, 0xab, 0xcb, 0x3a, 0xff, 0xf4, 0x42, 0x65, 0x4f, 0x2d, 0xa8, 0xc5, 0x9b, 0xa7, 0x5c, 0x9a, 0x9e, 0xc2, 0x4d, 0x9a, 0xd0, 0xe0, 0xae, 0x52, 0x48, 0x45, 0x6b, 0x33, + 0x39, 0x73, 0xb8, 0x2a, 0xa1, 0xac, 0xc4, 0x62, 0x4d, 0x30, 0x06, 0xf7, 0x39, 0x36, 0x05, 0x2e, 0x8d, 0xc3, 0xde, 0xf3, 0xe9, 0x81, 0xcc, 0x3f, 0xcf, 0xe3, 0xe9, 0x54, 0x94, 0x3d, 0x0f, 0xba, + 0xfb, 0xe2, 0x3a, 0x5f, 0x49, 0x92, 0xef, 0x5c, 0xcf, 0x73, 0x2e, 0xd0, 0xc9, 0x11, 0x44, 0x04, 0x8e, 0xd6, 0x67, 0x43, 0xb0, 0x16, 0xb9, 0x36, 0x2b, 0x56, 0x35, 0x37, 0xb3, 0xd4, 0x06, 0x8c, + 0xd9, 0x7d, 0x0e, 0x98, 0xd1, 0xac, 0x46, 0xaf, 0x35, 0xfb, 0x92, 0xbe, 0x32, 0xcc, 0x24, 0x92, 0x3b, 0xf2, 0xd1, 0x1e, 0xa8, 0xdf, 0xf3, 0xfa, 0x32, 0x2f, 0x3a, 0x1e, 0x28, 0x8d, 0x9c, 0x7e, + 0x27, 0x79, 0x34, 0x9e, 0x48, 0x86, 0x42, 0xab, 0x53, 0x07, 0x6f, 0xa6, 0x18, 0x0b, 0xb7, 0xad, 0x5d, 0xae, 0xd3, 0xc3, 0x54, 0xfa, 0x42, 0xab, 0xa2, 0x88, 0x68, 0xc5, 0x24, 0x6d, 0xcc, 0xe6, + 0xdb, 0xff, 0xc9, 0x3a, 0xdc, 0x68, 0xfb, 0x7d, 0xbb, 0xf0, 0xc3, 0x7a, 0xb2, 0x7f, 0x67, 0x76, 0x77, 0x7e, 0xf1, 0xca, 0x71, 0xa2, 0x8b, 0x67, 0x53, 0x98, 0xde, 0x9a, 0x72, 0x15, 0x88, 0xb5, + 0xc8, 0xe6, 0x9c, 0xec, 0x31, 0xdb, 0x34, 0x1b, 0x3a, 0x45, 0xb5, 0xb9, 0x88, 0xe9, 0x02, 0x50, 0x80, 0x51, 0x3e, 0x97, 0xc0, 0x48, 0x6e, 0x63, 0xa6, 0xb7, 0xa5, 0x34, 0x53, 0x3a, 0x88, 0x1c, + 0x3b, 0xc9, 0xf6, 0x74, 0x68, 0xc3, 0x7e, 0x64, 0x73, 0xea, 0xc0, 0x20, 0x51, 0x4d, 0x37, 0x80, 0x6e, 0x4e, 0x68, 0x9d, 0x5b, 0x2b, 0x2c, 0x64, 0x59, 0x44, 0xe1, 0xab, 0xa3, 0x86, 0xa1, 0x61, + 0x5a, 0xdb, 0xb5, 0xe8, 0x95, 0xc0, 0x2a, 0x1a, 0xc3, 0x29, 0x61, 0xb9, 0x4f, 0x3a, 0x26, 0x80, 0x3b, 0x23, 0xb3, 0xcf, 0x7e, 0x39, 0x75, 0xd6, 0x8f, 0x97, 0x84, 0xce, 0x90, 0x5e, 0x60, 0x6b, + 0xce, 0xaa, 0xcd, 0x4a, 0x6a, 0xf9, 0xe8, 0x88, 0x4a, 0xc1, 0xd3, 0x5b, 0x5f, 0xb3, 0x0d, 0x05, 0xef, 0x1d, 0xc4, 0x6c, 0xf0, 0x46, 0xc8, 0x64, 0xdf, 0x62, 0xb5, 0xa3, 0xda, 0x73, 0x71, 0x7e, + 0xf9, 0x7b, 0xc6, 0xd9, 0xe6, 0xe9, 0xce, 0xf6, 0x7d, 0xf6, 0x86, 0xcb, 0x4f, 0x6d, 0xe6, 0xb9, 0x4c, 0xac, 0x2f, 0x2d, 0xc1, 0xd9, 0x16, 0x50, 0xb3, 0x35, 0x6d, 0x4a, 0x9f, 0x8d, 0x4c, 0xaa, + 0xdc, 0xc7, 0xc2, 0xcd, 0xce, 0x2b, 0x2d, 0x0a, 0x48, 0x0f, 0x62, 0x19, 0xa6, 0x6e, 0x58, 0xb9, 0x56, 0x1d, 0x3b, 0x1d, 0x75, 0x71, 0xe5, 0xbf, 0x7f, 0xd4, 0xaf, 0xfb, 0x28, 0xef, 0xf4, 0x99, + 0xae, 0xd6, 0x17, 0xae, 0xd5, 0x66, 0x9b, 0x51, 0x35, 0x03, 0x86, 0x0b, 0xf1, 0x74, 0x82, 0x19, 0xb0, 0xa6, 0x34, 0x63, 0x64, 0x42, 0x55, 0xb6, 0xd9, 0x86, 0xd9, 0x8c, 0x98, 0xe9, 0xd2, 0x7a, + 0x2b, 0xab, 0xc6, 0x79, 0xf8, 0x58, 0xf9, 0x8d, 0x5f, 0x7d, 0xcd, 0x4f, 0x77, 0x7a, 0xfd, 0x9a, 0xb6, 0x5f, 0xed, 0xfb, 0x29, 0x7a, 0x83, 0xee, 0x40, 0x30, 0x31, 0xcb, 0xe9, 0xc4, 0x31, 0xa0, + 0x36, 0xc0, 0xa7, 0x62, 0x42, 0x43, 0xe6, 0x10, 0x9a, 0x46, 0x4e, 0x04, 0x84, 0x6a, 0x8b, 0x05, 0x7d, 0xb4, 0x5d, 0x65, 0x67, 0xb5, 0xe8, 0x13, 0x1d, 0x19, 0x7e, 0xa9, 0x83, 0xe3, 0x18, 0x7d, + 0xd7, 0x77, 0x67, 0xae, 0xfe, 0xf9, 0x45, 0x3f, 0xf2, 0xc9, 0x2d, 0x59, 0x87, 0x44, 0x2a, 0xd0, 0x58, 0x1d, 0xc1, 0xb5, 0xe5, 0x52, 0xc8, 0xa6, 0x0e, 0x7d, 0x43, 0x0b, 0x36, 0xe7, 0xca, 0x59, + 0x83, 0xe6, 0x74, 0xf4, 0xc1, 0x1d, 0xa4, 0xa6, 0x0e, 0x2f, 0xd8, 0x60, 0x6f, 0xb7, 0x23, 0x03, 0x7d, 0xf6, 0xf5, 0xe8, 0x28, 0x9d, 0x3f, 0xb0, 0xee, 0x3e, 0x9d, 0xa7, 0x36, 0x77, 0x55, 0x96, + 0xb9, 0x36, 0x74, 0xd0, 0x82, 0x46, 0xe0, 0x58, 0xea, 0x46, 0xb4, 0x92, 0x53, 0xd5, 0xfa, 0x06, 0xdb, 0xb4, 0x29, 0x4d, 0xee, 0x32, 0x82, 0x42, 0x0a, 0x71, 0x6d, 0xe1, 0x54, 0x35, 0x28, 0xc3, + 0x3c, 0x96, 0x3a, 0x7a, 0x84, 0x0a, 0xfb, 0xcb, 0x3f, 0x75, 0x3a, 0x85, 0xab, 0x7c, 0xf8, 0xe8, 0x7d, 0xd1, 0x94, 0xa0, 0xe8, 0xa9, 0xc0, 0x81, 0x53, 0x4a, 0x57, 0x6a, 0x1f, 0x80, 0x1a, 0x48, + 0x8c, 0xc4, 0xde, 0x9b, 0x05, 0x46, 0x4d, 0xc9, 0xb9, 0x7a, 0x93, 0x8c, 0xa6, 0xed, 0x18, 0x0e, 0x7d, 0x28, 0x3a, 0x3c, 0x5d, 0x3d, 0xbe, 0x81, 0xaf, 0x31, 0x98, 0x16, 0xc4, 0x21, 0xd9, 0x51, + 0xa8, 0x8f, 0xec, 0x4d, 0x7c, 0x6c, 0xa4, 0x54, 0x36, 0x16, 0x70, 0x8c, 0x16, 0x60, 0x2a, 0x9b, 0x9b, 0x94, 0x41, 0x30, 0x50, 0x87, 0x26, 0x5a, 0xa3, 0xbe, 0x38, 0xfc, 0xd8, 0xea, 0xf7, 0x01, + 0xf4, 0x2e, 0xd9, 0x73, 0xea, 0xdc, 0xf6, 0x6e, 0x2c, 0x1d, 0x7b, 0x8e, 0x06, 0xce, 0x90, 0xad, 0xab, 0xb8, 0x78, 0x8b, 0x3e, 0x6c, 0x4d, 0x20, 0xe8, 0x9a, 0x82, 0xc3, 0x42, 0x58, 0xdc, 0x59, + 0x29, 0x7b, 0x8b, 0x36, 0x5b, 0xdb, 0xc2, 0x01, 0xf5, 0x75, 0xec, 0xcc, 0xc7, 0xd3, 0x16, 0xad, 0xb7, 0xb6, 0xd3, 0x2a, 0x38, 0x60, 0xa5, 0x2c, 0x6f, 0xbc, 0xc6, 0x9a, 0xe6, 0xd3, 0xa5, 0x53, + 0xc3, 0xa5, 0xe1, 0xae, 0xbb, 0x13, 0x36, 0xa3, 0xc7, 0x54, 0x19, 0x0b, 0x64, 0x46, 0xae, 0x3e, 0x80, 0x9b, 0x36, 0x88, 0x45, 0x49, 0x47, 0x26, 0x29, 0xed, 0xe6, 0x78, 0xbc, 0x7f, 0x86, 0x12, + 0x8f, 0xa9, 0xf9, 0x8b, 0x9a, 0xfb, 0xfc, 0x80, 0x27, 0x4f, 0x05, 0x68, 0xc5, 0x9c, 0x35, 0x4c, 0xc0, 0x0a, 0xb5, 0xdb, 0x66, 0xc3, 0x34, 0x5a, 0x6e, 0x76, 0x2d, 0x43, 0x1d, 0xe6, 0xda, 0x68, + 0xe5, 0xc6, 0xa3, 0x51, 0xf2, 0x18, 0x6b, 0x4c, 0x5a, 0x9a, 0xab, 0x25, 0xb9, 0x1f, 0x3e, 0xa6, 0xfb, 0x60, 0xae, 0x1f, 0x8e, 0x42, 0xbd, 0x7f, 0xd1, 0xae, 0x74, 0xe0, 0xab, 0xef, 0x47, 0x41, + 0xef, 0xa1, 0xe2, 0xf6, 0xf4, 0x2c, 0x2a, 0x7f, 0x56, 0xc9, 0x78, 0x32, 0x10, 0xef, 0xcf, 0xdd, 0xc3, 0xe5, 0x23, 0x8a, 0xf9, 0x9e, 0xac, 0xdf, 0x0b, 0x88, 0x8f, 0xb3, 0x78, 0x37, 0x49, 0x6f, + 0x9f, 0xcd, 0xa7, 0x36, 0x44, 0x5a, 0x6e, 0x53, 0x24, 0x0d, 0x67, 0x50, 0xef, 0x38, 0x89, 0xdd, 0x17, 0x2d, 0x12, 0x34, 0x73, 0x18, 0xa9, 0x65, 0x38, 0xab, 0xad, 0x68, 0xbd, 0xd1, 0x18, 0x2d, + 0x86, 0x2a, 0xd4, 0x04, 0xcc, 0x36, 0x67, 0x1d, 0x76, 0x8a, 0x3f, 0x38, 0xf5, 0xa4, 0x83, 0xf1, 0x95, 0x61, 0x8b, 0x3b, 0x6e, 0xbd, 0x75, 0x8c, 0x9f, 0x16, 0xab, 0x2d, 0x42, 0x82, 0x39, 0x3b, + 0x62, 0x90, 0xf6, 0x15, 0xba, 0xb8, 0xad, 0x6e, 0x15, 0x11, 0x5d, 0x9d, 0x1c, 0x3a, 0xf4, 0x4e, 0x19, 0x3b, 0x61, 0x02, 0xd8, 0xc5, 0xcb, 0x41, 0x53, 0xe8, 0xc8, 0x31, 0xc2, 0x17, 0x92, 0x70, + 0xf9, 0x03, 0xb5, 0xee, 0xe3, 0x9e, 0x1b, 0xfc, 0xf8, 0xfd, 0xc5, 0x23, 0x8c, 0xd8, 0xfd, 0xf6, 0x8b, 0x1c, 0xdb, 0xa9, 0xb1, 0x6a, 0x17, 0x98, 0xbd, 0x05, 0xa0, 0xcd, 0xd5, 0x1a, 0x6a, 0x42, + 0xe2, 0xc8, 0x55, 0xc2, 0xd4, 0xdb, 0x24, 0x26, 0x99, 0x73, 0x8c, 0xa6, 0xb1, 0x30, 0xd4, 0xe7, 0x5a, 0xb3, 0x6c, 0x09, 0x34, 0x07, 0x19, 0x73, 0xe9, 0xab, 0xd5, 0xbd, 0x27, 0x9a, 0xf5, 0x37, + 0xa7, 0x96, 0x7c, 0x9f, 0x64, 0xf7, 0x1c, 0x29, 0xbd, 0xc1, 0x10, 0x86, 0x36, 0x48, 0xa4, 0x3a, 0x8f, 0x39, 0x19, 0x1c, 0xc6, 0x5a, 0xa3, 0x32, 0xa5, 0x75, 0x22, 0x9a, 0x32, 0x66, 0x55, 0xf5, + 0x42, 0xea, 0x31, 0x1b, 0xb3, 0x09, 0xe4, 0xe0, 0xc9, 0x51, 0x30, 0xa1, 0x78, 0x4e, 0x3b, 0x9c, 0x5a, 0x3b, 0x3c, 0xb2, 0xe5, 0x08, 0xad, 0x57, 0x5f, 0xf5, 0x3f, 0xef, 0xf2, 0x2c, 0xd2, 0xee, + 0xf6, 0x43, 0xa5, 0xd3, 0x93, 0x3b, 0x91, 0x74, 0x75, 0x6a, 0xde, 0x97, 0x83, 0xad, 0x56, 0x31, 0x48, 0xda, 0xe2, 0x35, 0x31, 0x94, 0x4c, 0xa9, 0x67, 0x5b, 0x6b, 0x2c, 0xad, 0x86, 0xc3, 0xb0, + 0xcf, 0x1c, 0x4d, 0x6c, 0x4e, 0x92, 0x72, 0xe8, 0x31, 0x8e, 0x38, 0xbc, 0xa7, 0xc3, 0x06, 0xf7, 0xc2, 0xa5, 0xd3, 0xcf, 0x99, 0x9d, 0xc1, 0x4c, 0xa4, 0xde, 0x50, 0xa2, 0x10, 0xc3, 0x75, 0xe2, + 0xa2, 0xac, 0xa4, 0x5c, 0xb2, 0x44, 0x20, 0xb6, 0xf0, 0xae, 0xad, 0xe1, 0xdc, 0xa6, 0x0b, 0xa3, 0x79, 0x70, 0x28, 0x29, 0xb2, 0xc2, 0x38, 0x82, 0x4c, 0x1e, 0xd3, 0x9b, 0xf7, 0x86, 0xfb, 0x01, + 0x63, 0xbd, 0x7f, 0x3e, 0x47, 0xf1, 0xe3, 0x43, 0x95, 0xf6, 0xc8, 0x46, 0xbe, 0x78, 0xf3, 0x39, 0x27, 0xd6, 0xc9, 0x13, 0xe4, 0xa5, 0xac, 0xbc, 0x50, 0xfa, 0x4a, 0xa6, 0xc1, 0xb3, 0x57, 0x4e, + 0x69, 0x5c, 0x3e, 0x4d, 0xd7, 0x14, 0x9a, 0xc1, 0x58, 0x24, 0x95, 0x9c, 0x08, 0x91, 0x8d, 0x29, 0xdb, 0x02, 0x5c, 0x2a, 0x52, 0xd6, 0xe0, 0x70, 0x82, 0xfc, 0x45, 0x65, 0xfe, 0x19, 0x67, 0x1e, + 0xd5, 0xf8, 0x3a, 0xe3, 0xea, 0xaf, 0x8f, 0x37, 0xdf, 0x6e, 0x5c, 0x2f, 0x0e, 0x0c, 0xd4, 0xfd, 0x35, 0x2d, 0x7f, 0xd1, 0x18, 0xfd, 0x3c, 0x56, 0x3d, 0x3d, 0x50, 0x08, 0xaa, 0x18, 0x93, 0x20, + 0x1a, 0xf8, 0x2a, 0x58, 0x8a, 0x3d, 0x36, 0x00, 0x5b, 0x89, 0x82, 0xb2, 0xaa, 0xc8, 0xc6, 0xd0, 0x72, 0xf7, 0x28, 0x5e, 0xc2, 0xdd, 0x90, 0xbc, 0xfa, 0x2e, 0xfd, 0x9a, 0x1d, 0x8f, 0x75, 0x45, + 0x3d, 0xe9, 0xe9, 0x79, 0x11, 0xee, 0x9d, 0xfc, 0xb4, 0x8d, 0xc0, 0x02, 0x41, 0x1b, 0x3e, 0x04, 0x40, 0x62, 0x40, 0x36, 0x0f, 0x44, 0x28, 0x0a, 0x92, 0x88, 0x14, 0x00, 0x5c, 0x48, 0xa6, 0x0c, + 0xdc, 0xa7, 0x6c, 0xa6, 0xcc, 0x85, 0xa3, 0xf1, 0x6c, 0xab, 0x47, 0x3b, 0x5c, 0xf4, 0x79, 0xda, 0x95, 0x74, 0x7e, 0x79, 0x9b, 0xd7, 0x97, 0x7a, 0xf1, 0xd3, 0xe9, 0xb4, 0xc7, 0xc8, 0x7e, 0x8b, + 0xb3, 0x06, 0xce, 0xa3, 0x89, 0x3b, 0xb4, 0xd9, 0x08, 0x9c, 0x9a, 0xd2, 0x80, 0x15, 0xa8, 0xc5, 0x3a, 0x61, 0xf4, 0x96, 0x90, 0x19, 0x2d, 0x27, 0xae, 0x81, 0x32, 0xb5, 0xc7, 0xf2, 0x41, 0x8c, + 0xab, 0x4d, 0x77, 0x27, 0x3d, 0x1c, 0x00, 0x1e, 0xa4, 0xfa, 0x71, 0x80, 0xe0, 0xcf, 0x89, 0xfe, 0xfe, 0x3b, 0x6f, 0xbf, 0xe9, 0xdd, 0x12, 0x27, 0xb7, 0xd6, 0x5b, 0xb3, 0x9c, 0x21, 0x81, 0x5b, + 0x74, 0xe6, 0xdc, 0x11, 0x20, 0x16, 0x48, 0xdb, 0x42, 0x5e, 0x9b, 0x36, 0x5c, 0x59, 0xc1, 0x70, 0x61, 0x6f, 0x0d, 0xc7, 0x00, 0xb0, 0x0d, 0x6e, 0x1d, 0xf6, 0xd2, 0xff, 0xb0, 0x1b, 0xf3, 0xa7, + 0x1c, 0x78, 0x8b, 0xfd, 0xa7, 0xe5, 0x32, 0x1a, 0x74, 0x1c, 0xab, 0xdb, 0x68, 0x6d, 0x8c, 0x69, 0x90, 0x15, 0x0c, 0x41, 0xc3, 0x3a, 0x48, 0x43, 0x29, 0x34, 0x86, 0x4d, 0x2c, 0x84, 0xa5, 0xdc, + 0xb1, 0xad, 0x84, 0x69, 0x84, 0x84, 0x47, 0xa6, 0xe5, 0x9d, 0x80, 0x01, 0x17, 0xe7, 0xb7, 0x2f, 0xf3, 0x38, 0x70, 0xea, 0x70, 0x15, 0x07, 0xdb, 0x24, 0x81, 0xa1, 0x6d, 0x61, 0xf1, 0x02, 0xe0, + 0xd6, 0x65, 0xce, 0xcd, 0x46, 0xe1, 0x02, 0xee, 0xc8, 0x62, 0x91, 0x66, 0xb2, 0xb1, 0x85, 0x7a, 0x98, 0xef, 0xda, 0xb3, 0x4a, 0xb8, 0x29, 0xf3, 0xb1, 0x73, 0x0a, 0x3f, 0x21, 0x04, 0x4f, 0x3e, + 0x3c, 0x25, 0xbc, 0x25, 0x14, 0x0e, 0x71, 0x41, 0x60, 0xf6, 0xde, 0x36, 0x7c, 0x1a, 0xc0, 0x8c, 0x34, 0x33, 0xa2, 0x69, 0x1f, 0x73, 0x19, 0x0e, 0x1e, 0x53, 0x85, 0x39, 0xda, 0xec, 0xe8, 0xb5, + 0x4a, 0x3b, 0xa7, 0xb4, 0xa3, 0xd1, 0xc7, 0xf7, 0xc6, 0xc9, 0xb7, 0xce, 0x34, 0x2d, 0x5b, 0xdc, 0x62, 0x39, 0x0c, 0xb0, 0x59, 0x58, 0x26, 0x3d, 0x17, 0x29, 0x74, 0xa0, 0x09, 0x7d, 0x55, 0x1b, + 0xd1, 0x30, 0x03, 0xc0, 0x39, 0xd9, 0x07, 0xd5, 0x5a, 0x38, 0x55, 0xb5, 0xd8, 0xa5, 0x60, 0x1d, 0xcb, 0x34, 0x7d, 0xfd, 0xfa, 0xc7, 0x6e, 0x03, 0xd6, 0x7c, 0xb1, 0x05, 0x27, 0x1f, 0xd2, 0xa1, + 0xce, 0xe4, 0x13, 0x29, 0xa6, 0x61, 0x6c, 0x6e, 0x03, 0x47, 0xf1, 0x40, 0x9c, 0x58, 0x84, 0xb0, 0x56, 0x9f, 0x23, 0xd8, 0x56, 0x15, 0x68, 0x15, 0x93, 0x2f, 0x4c, 0x1a, 0xd0, 0xe7, 0x80, 0xa6, + 0xb4, 0x8e, 0x9e, 0x38, 0xdd, 0x6f, 0x57, 0xdd, 0x4f, 0xaf, 0xc3, 0xa9, 0xeb, 0xc4, 0x61, 0xd5, 0x9c, 0x96, 0x39, 0x84, 0x40, 0xe7, 0xa1, 0x39, 0xbc, 0x7b, 0x2c, 0xc8, 0xce, 0x88, 0xb1, 0xad, + 0xdf, 0xbc, 0x16, 0x68, 0x6f, 0x32, 0x1b, 0x52, 0x9b, 0xd4, 0x02, 0xb1, 0xd7, 0x90, 0xca, 0x96, 0x47, 0x65, 0xe9, 0x45, 0x8b, 0xed, 0xbe, 0x4c, 0x9d, 0xda, 0xb4, 0x99, 0xaf, 0x05, 0x86, 0x8e, + 0x38, 0x17, 0x74, 0x6e, 0x3e, 0x95, 0x57, 0x4b, 0x62, 0x2d, 0x59, 0xd4, 0xb2, 0x16, 0xc1, 0xea, 0x6c, 0x2e, 0x0b, 0x60, 0x51, 0x87, 0xa0, 0x84, 0x35, 0x97, 0x45, 0x73, 0x68, 0xeb, 0x58, 0xbd, + 0xe3, 0xa9, 0x71, 0xdb, 0xb7, 0xce, 0x78, 0x6a, 0x1a, 0x6a, 0x53, 0x0a, 0x2d, 0x46, 0x59, 0xd3, 0x41, 0x87, 0x2c, 0xc6, 0xa9, 0xe1, 0xb2, 0x96, 0xd9, 0x90, 0x45, 0x2c, 0xb8, 0x11, 0x52, 0x23, + 0x73, 0xa8, 0x8e, 0x86, 0x4d, 0x80, 0x46, 0xe6, 0x6a, 0xcc, 0xad, 0x1f, 0x8e, 0x44, 0x1f, 0xbb, 0x31, 0xfe, 0x3a, 0x7f, 0xa5, 0x5a, 0xf0, 0xb4, 0x5d, 0xe5, 0x39, 0x99, 0xa7, 0x6f, 0x48, 0xd1, + 0x2d, 0x70, 0x14, 0x82, 0x58, 0x58, 0x8a, 0x6a, 0xa3, 0x59, 0x42, 0xb2, 0xe4, 0x64, 0x20, 0x5c, 0x12, 0xc1, 0x1e, 0xc9, 0x2b, 0x4d, 0xc9, 0x1b, 0x93, 0xf9, 0x50, 0xea, 0x4c, 0x35, 0x47, 0x8b, + 0xca, 0x63, 0x47, 0xcd, 0xef, 0xdd, 0xce, 0xfe, 0x1e, 0x9d, 0x5a, 0x5f, 0xbc, 0x47, 0x33, 0x61, 0x1a, 0xe1, 0x18, 0x69, 0x35, 0x1a, 0xfb, 0x22, 0xc4, 0xc8, 0x36, 0x82, 0x11, 0xa7, 0x3b, 0x54, + 0x9b, 0x44, 0x08, 0x33, 0x2a, 0x2a, 0x35, 0x64, 0xad, 0x12, 0x03, 0xb5, 0x8e, 0x7a, 0xb8, 0x34, 0xff, 0xdc, 0x83, 0x1e, 0xd9, 0xa2, 0xdd, 0x64, 0xc9, 0xe7, 0x5a, 0xc4, 0x27, 0xdf, 0x9b, 0xa9, + 0xd3, 0x60, 0xb2, 0x04, 0x89, 0x21, 0x99, 0x55, 0x36, 0x5f, 0xad, 0x13, 0x8a, 0x2a, 0x2c, 0x26, 0x62, 0xac, 0xd1, 0x42, 0xac, 0xcf, 0x0e, 0x1d, 0xaa, 0xe5, 0x92, 0xf2, 0x3e, 0xa6, 0x0d, 0xa2, + 0x68, 0x87, 0x71, 0xfc, 0x8f, 0x2e, 0xeb, 0xe7, 0xe0, 0x47, 0x2f, 0xe3, 0xa3, 0x7f, 0x56, 0xff, 0xac, 0x4f, 0x3e, 0x3f, 0x76, 0xf0, 0xee, 0x3e, 0x7d, 0x7e, 0x05, 0xf0, 0x3f, 0xfd, 0xf5, 0xb7, + 0x4e, 0x74, 0x15, 0xf9, 0xca, 0x58, 0x63, 0x22, 0x8b, 0x0b, 0x77, 0xc6, 0x36, 0xad, 0x18, 0x87, 0x55, 0x9f, 0xd2, 0x47, 0xac, 0x39, 0x67, 0x6a, 0xb0, 0xea, 0x14, 0x1b, 0x68, 0xb9, 0x01, 0xa0, + 0x3e, 0x25, 0x60, 0x97, 0x44, 0x3e, 0xbc, 0xeb, 0x3f, 0xdc, 0xd5, 0x3e, 0xf9, 0xaf, 0x92, 0xfc, 0x12, 0x13, 0x8f, 0x93, 0x27, 0x07, 0xa4, 0x59, 0xe4, 0x86, 0x01, 0xca, 0x97, 0x80, 0x35, 0xcf, + 0x02, 0xd4, 0x19, 0xad, 0x47, 0xb8, 0x3b, 0x4c, 0xf4, 0x64, 0x43, 0xad, 0x1a, 0x04, 0xb3, 0x69, 0x49, 0xef, 0xab, 0x56, 0x50, 0x8b, 0x9a, 0xb1, 0x79, 0xa9, 0x9f, 0xc8, 0xc1, 0x6b, 0x14, 0x7e, + 0x7e, 0x59, 0x1e, 0x3f, 0xb5, 0xfb, 0x76, 0xed, 0x80, 0xa2, 0xc5, 0x26, 0xa8, 0xc0, 0x00, 0x18, 0x43, 0x34, 0x48, 0x96, 0xcf, 0x5a, 0x90, 0x5a, 0x34, 0x3b, 0x8e, 0xce, 0x73, 0x9a, 0x6c, 0x41, + 0x62, 0x74, 0x49, 0x65, 0xed, 0x12, 0x73, 0x42, 0x3f, 0x5c, 0xd3, 0xfb, 0x95, 0x1d, 0x7c, 0x06, 0xf8, 0xf7, 0xa9, 0x3c, 0x35, 0xde, 0x61, 0x42, 0xee, 0x92, 0x04, 0x1e, 0x24, 0x04, 0x14, 0xb9, + 0x18, 0x52, 0x47, 0x0e, 0x12, 0x2d, 0xe3, 0x44, 0xed, 0xea, 0xcc, 0x36, 0x96, 0x98, 0x5b, 0x5a, 0x2e, 0xdf, 0x8c, 0xb2, 0x75, 0x06, 0xe2, 0x3a, 0x72, 0x9a, 0xe4, 0xc7, 0xc9, 0xe4, 0xa3, 0x44, + 0x7e, 0xca, 0xbf, 0xf6, 0x2c, 0xf1, 0xe9, 0x3b, 0x03, 0xa2, 0xb1, 0xae, 0x89, 0xd2, 0x87, 0xa4, 0x8d, 0x59, 0x90, 0x58, 0x06, 0x73, 0xa0, 0x59, 0x23, 0x04, 0xf4, 0xc6, 0xa8, 0x8b, 0x4d, 0xe7, + 0x1a, 0x34, 0xb5, 0x51, 0x9b, 0x23, 0x06, 0x8e, 0xc9, 0x5d, 0x9d, 0xe6, 0x91, 0xa3, 0x77, 0x4f, 0x87, 0x97, 0xbf, 0x7f, 0x7e, 0xe6, 0x68, 0x47, 0xd6, 0xd9, 0xcd, 0xb7, 0xcb, 0x5b, 0xfd, 0xeb, + 0x27, 0xc4, 0x3f, 0xbe, 0xf5, 0xa2, 0xa2, 0x73, 0xea, 0x2e, 0x8f, 0xa2, 0x0d, 0xba, 0x8c, 0xb5, 0xa8, 0x7a, 0x79, 0x15, 0x21, 0x55, 0xb9, 0xf4, 0x9e, 0x63, 0x06, 0xbb, 0xb9, 0x0e, 0x80, 0xc8, + 0x6a, 0x2e, 0xab, 0x83, 0x72, 0x89, 0x8d, 0xda, 0xa0, 0x7e, 0x76, 0xf7, 0x25, 0xc7, 0x66, 0xf7, 0xde, 0x5f, 0xf7, 0x77, 0xe6, 0x57, 0x97, 0xfb, 0xf3, 0xee, 0x4e, 0x3f, 0x88, 0x73, 0x60, 0x12, + 0x75, 0xa1, 0xc0, 0xb6, 0x66, 0x34, 0x68, 0x63, 0x80, 0xc1, 0x6e, 0x3c, 0x1c, 0x14, 0x52, 0x76, 0x98, 0xc4, 0x83, 0x9b, 0x07, 0x44, 0x5a, 0xeb, 0x2c, 0x89, 0x8e, 0x60, 0x1d, 0x45, 0x4d, 0xdb, + 0xe1, 0x72, 0xc9, 0xf7, 0x46, 0xf7, 0xf7, 0xbf, 0xda, 0x8b, 0xbb, 0xad, 0xd6, 0x3f, 0x3e, 0xd0, 0xfa, 0xb2, 0x60, 0x70, 0x62, 0xa2, 0xa1, 0xaf, 0xec, 0xd9, 0xd4, 0x6d, 0xba, 0x94, 0xe1, 0x58, + 0x06, 0x62, 0x93, 0xdd, 0x96, 0x5a, 0xcc, 0xee, 0xad, 0xed, 0x0e, 0xf1, 0xae, 0x01, 0xab, 0x8d, 0x54, 0x18, 0x40, 0x73, 0xd0, 0xa4, 0x4a, 0x69, 0xbd, 0x1d, 0x9e, 0x1f, 0x75, 0x93, 0x5f, 0x5e, + 0xbd, 0xa2, 0xf1, 0xfa, 0xdb, 0xdd, 0x8b, 0xf8, 0xe8, 0xd4, 0x02, 0xc9, 0x10, 0xbd, 0x41, 0x10, 0xc8, 0x6e, 0x9c, 0xb4, 0x5a, 0x04, 0x4b, 0x15, 0x67, 0x8f, 0x60, 0x04, 0x98, 0x4b, 0x65, 0x30, + 0x66, 0xf5, 0xca, 0x01, 0xba, 0x6b, 0x8c, 0x37, 0xc5, 0x3e, 0x2c, 0x56, 0xad, 0x79, 0x2c, 0x37, 0xf8, 0xa4, 0xe3, 0x65, 0xaf, 0x96, 0x71, 0x72, 0x79, 0x8c, 0x4d, 0xae, 0x9a, 0xcf, 0xe8, 0xe5, + 0x2d, 0x53, 0xb0, 0x72, 0xce, 0xc4, 0x10, 0x29, 0x6e, 0x2d, 0xd5, 0x80, 0x75, 0xc5, 0xe0, 0x00, 0xdf, 0x1d, 0x5c, 0xa3, 0xd5, 0x57, 0x2b, 0xc3, 0x66, 0xaa, 0xbc, 0xfc, 0x58, 0x31, 0xfb, 0x61, + 0x73, 0x9e, 0x0b, 0xd6, 0xe9, 0x67, 0x55, 0x41, 0x70, 0x9a, 0x64, 0xa1, 0xc3, 0x9a, 0x13, 0xa4, 0xa1, 0x3b, 0x71, 0x8e, 0x3e, 0x4a, 0xcc, 0x07, 0x18, 0x2f, 0xf5, 0xc0, 0x41, 0xa1, 0xdb, 0x56, + 0xf1, 0x70, 0xac, 0xc9, 0xd8, 0x42, 0x94, 0x1a, 0x1d, 0x09, 0xe0, 0xee, 0xd7, 0x7e, 0xb6, 0x3b, 0x4f, 0xf0, 0x8a, 0x7c, 0x3d, 0x7f, 0xed, 0xad, 0xed, 0xc6, 0x6e, 0x48, 0x50, 0x14, 0x8e, 0x9e, + 0xae, 0x6d, 0x8d, 0x0d, 0x46, 0xd4, 0x74, 0xc6, 0x2e, 0xe8, 0x95, 0xec, 0x7d, 0x03, 0x47, 0x56, 0x04, 0x51, 0x03, 0xa7, 0xd8, 0x5c, 0x6e, 0x31, 0xab, 0x56, 0x0d, 0x6e, 0x7a, 0xac, 0x33, 0xec, + 0x7e, 0x6e, 0xfb, 0xbe, 0x9a, 0x00, 0x9e, 0x3a, 0x89, 0x93, 0xce, 0xa3, 0x0d, 0xb5, 0x54, 0xd7, 0x74, 0x26, 0x4d, 0x62, 0x5e, 0x21, 0x21, 0x1d, 0x57, 0xe5, 0xd0, 0x11, 0x8d, 0x70, 0x74, 0xc4, + 0xa6, 0x6b, 0x38, 0x65, 0x36, 0x44, 0xec, 0x52, 0x2e, 0x32, 0x8f, 0x45, 0xda, 0xf7, 0xb3, 0xe5, 0xef, 0x27, 0xc4, 0xbd, 0xb6, 0x4f, 0x4f, 0xde, 0x7a, 0x7b, 0x4a, 0x65, 0x76, 0xe5, 0xd8, 0x80, + 0xb7, 0x0c, 0x4d, 0x75, 0x56, 0x97, 0x96, 0x4c, 0xd5, 0x49, 0x37, 0x8f, 0x3c, 0x61, 0xe1, 0x2a, 0x96, 0xa8, 0x3e, 0xdc, 0x32, 0x08, 0x12, 0x1a, 0x2c, 0x89, 0xbe, 0x1a, 0x05, 0x1d, 0xa6, 0xf4, + 0x1f, 0x26, 0x1d, 0x9f, 0xcc, 0xe2, 0xdf, 0x27, 0x7c, 0x9e, 0x3a, 0x40, 0x61, 0x91, 0x14, 0x0e, 0x97, 0x0a, 0xcd, 0x3e, 0x75, 0xf8, 0xb2, 0x55, 0xe8, 0x9a, 0xe2, 0x89, 0x99, 0x52, 0xe1, 0x89, + 0x6d, 0x2c, 0x1f, 0xac, 0xd2, 0x73, 0x36, 0x91, 0x10, 0x90, 0x0a, 0x59, 0x58, 0x7c, 0x38, 0x86, 0xfe, 0x7e, 0xa7, 0xea, 0x66, 0xcc, 0xdf, 0xff, 0xfc, 0xda, 0xca, 0x17, 0xb7, 0x0d, 0xbc, 0xb5, + 0x5a, 0x66, 0x94, 0x0e, 0x56, 0xae, 0x15, 0xe2, 0x10, 0x38, 0x9b, 0x0e, 0x92, 0x64, 0x44, 0x82, 0xd6, 0x6a, 0x3a, 0xf5, 0xa0, 0x5e, 0x02, 0xad, 0x67, 0x9b, 0x11, 0xcb, 0xa8, 0xc9, 0x50, 0x31, + 0x34, 0xea, 0x9e, 0x87, 0xa9, 0xde, 0x1f, 0x66, 0xf4, 0xfe, 0x9f, 0x70, 0x62, 0x77, 0xcb, 0xeb, 0xbe, 0xfd, 0x3d, 0xb5, 0xb0, 0x2f, 0x27, 0x2f, 0x65, 0x02, 0x1f, 0xab, 0x63, 0xb4, 0x2c, 0x2e, + 0x35, 0x9a, 0xae, 0x96, 0x81, 0xe2, 0xa8, 0x9a, 0x82, 0x33, 0xac, 0x19, 0x80, 0x19, 0xb6, 0x29, 0x19, 0xb1, 0xc2, 0x46, 0x4e, 0x4a, 0x38, 0x3c, 0xdc, 0xeb, 0xd9, 0x2c, 0xff, 0xf7, 0x07, 0x87, + 0x5c, 0x3d, 0x19, 0xec, 0xb9, 0x7d, 0x7e, 0x98, 0x8c, 0xb8, 0x3d, 0x3e, 0x2b, 0x8c, 0xbf, 0xc6, 0x9d, 0x7d, 0xe6, 0xcc, 0x93, 0xcb, 0x06, 0x0e, 0x16, 0x59, 0xa3, 0x42, 0x47, 0x5b, 0xd0, 0xa8, + 0x78, 0x2c, 0x9e, 0x4b, 0x46, 0x63, 0x59, 0x3d, 0x35, 0x62, 0xea, 0xcc, 0x45, 0x11, 0x7d, 0xc4, 0x0c, 0x80, 0xd1, 0x27, 0xd4, 0xd8, 0x0c, 0xf9, 0x2c, 0x6d, 0x47, 0x5d, 0xeb, 0xf9, 0xa7, 0x4b, + 0xbd, 0x38, 0xfb, 0x7c, 0x75, 0xf5, 0xfb, 0xd9, 0xe3, 0x2a, 0xf7, 0xd4, 0xfb, 0xf4, 0x0d, 0x7b, 0x39, 0x20, 0xb9, 0x77, 0x5c, 0xe1, 0xa4, 0xde, 0x9c, 0xdd, 0x2d, 0xb4, 0x2b, 0x09, 0x45, 0x69, + 0xeb, 0x71, 0x7f, 0xad, 0x03, 0xcd, 0x06, 0x0b, 0x90, 0x6b, 0x36, 0x9f, 0xd2, 0x0b, 0x27, 0x2d, 0x1a, 0xc3, 0x0e, 0x87, 0xad, 0xaf, 0xb7, 0x38, 0xec, 0xfa, 0x9d, 0xf6, 0x8b, 0x64, 0xa7, 0x8e, + 0x4c, 0x0b, 0x36, 0x7c, 0xd4, 0x03, 0x94, 0xb3, 0x1b, 0xae, 0xd6, 0x7a, 0x51, 0x8b, 0x6c, 0x36, 0x3c, 0xb9, 0x12, 0x19, 0x5a, 0x89, 0x49, 0x78, 0x2f, 0xef, 0x6b, 0x4e, 0xf2, 0xb4, 0x4c, 0x9a, + 0xd6, 0x6d, 0x0e, 0x3c, 0x96, 0xd8, 0xfe, 0x5e, 0xd7, 0x7e, 0xbe, 0x2f, 0xa7, 0x1f, 0x05, 0x59, 0xd9, 0xaa, 0xb3, 0x4b, 0xae, 0xea, 0x3e, 0x94, 0x74, 0x4e, 0x8d, 0x39, 0x86, 0x4a, 0x77, 0xa6, + 0x50, 0x75, 0xd2, 0x68, 0xcd, 0x89, 0x60, 0xf4, 0x6e, 0x35, 0x7c, 0x26, 0x8b, 0x34, 0x33, 0xc2, 0xd9, 0xe8, 0x68, 0x00, 0xfa, 0x70, 0x7a, 0xe6, 0x39, 0xfb, 0xfb, 0xe9, 0x13, 0xf2, 0x80, 0x98, + 0x83, 0x1b, 0x40, 0x0f, 0x5c, 0xc1, 0xdc, 0xdb, 0xdc, 0x2c, 0x08, 0x12, 0xce, 0x69, 0x73, 0xf2, 0xe8, 0x35, 0x53, 0x05, 0x06, 0x8f, 0x35, 0x07, 0x4c, 0x99, 0x36, 0xb3, 0x8f, 0x24, 0xa9, 0xb5, + 0x62, 0xfe, 0xed, 0x39, 0x01, 0xbf, 0xd4, 0x62, 0x70, 0x73, 0xab, 0x97, 0x61, 0x2f, 0x0b, 0x12, 0xf8, 0x01, 0x4e, 0x9d, 0x03, 0x4f, 0x80, 0x5e, 0x36, 0xab, 0x47, 0x36, 0x56, 0xdc, 0x79, 0x0b, + 0xd2, 0x31, 0xd3, 0x67, 0xc1, 0x9a, 0x51, 0x31, 0xc0, 0xad, 0x2d, 0xa2, 0xb5, 0x45, 0x43, 0xc9, 0xe6, 0x9a, 0xdc, 0x6b, 0x71, 0x15, 0xae, 0x3a, 0x5c, 0xa2, 0x7c, 0x58, 0xf4, 0xcf, 0xc6, 0x41, + 0xdc, 0xdc, 0xc6, 0xfe, 0x9d, 0x88, 0xbb, 0x3a, 0xf4, 0xa9, 0x6d, 0x47, 0x34, 0x44, 0x92, 0x69, 0x30, 0x71, 0x77, 0xbf, 0x8b, 0x8d, 0xcd, 0x53, 0xf4, 0xa6, 0x29, 0x92, 0x0d, 0x94, 0x7b, 0x70, + 0x67, 0xc3, 0xa2, 0x11, 0x7d, 0x55, 0x06, 0x65, 0x14, 0x4b, 0x49, 0xc7, 0xa1, 0x10, 0x87, 0x67, 0x23, 0x3c, 0x4e, 0x8a, 0xdd, 0xb9, 0xc4, 0x67, 0x60, 0x76, 0xe7, 0x1c, 0x77, 0xa4, 0x9d, 0x7d, + 0x0f, 0x0d, 0xbf, 0x7f, 0xf3, 0x58, 0x7b, 0x7e, 0x7a, 0x5f, 0xe2, 0xfe, 0x8f, 0xae, 0xef, 0x7e, 0x4c, 0x94, 0xfc, 0x53, 0x6f, 0xbe, 0x9c, 0xd9, 0xf9, 0x65, 0xdc, 0x5f, 0x60, 0xf8, 0x2a, 0x27, + 0xcf, 0x0e, 0xc4, 0x98, 0xed, 0xc3, 0x38, 0xb9, 0xcd, 0xf2, 0xc5, 0x3a, 0x9b, 0x52, 0x2b, 0x77, 0x5f, 0x64, 0x59, 0x6d, 0x0e, 0xec, 0x34, 0x6c, 0xfb, 0x5f, 0x62, 0xd3, 0xd9, 0xee, 0x6f, 0x8f, + 0xf5, 0x5c, 0xc0, 0x20, 0xe5, 0xc4, 0xb3, 0x86, 0xb7, 0x6e, 0xa3, 0xe5, 0xdf, 0x2e, 0x6b, 0xef, 0x5d, 0xed, 0xf4, 0x94, 0xa9, 0xaf, 0x06, 0x9f, 0x87, 0x39, 0xbe, 0xaf, 0x52, 0xa7, 0xb6, 0x28, + 0x63, 0x95, 0x8e, 0xaa, 0xa9, 0xd1, 0x42, 0x56, 0x40, 0x95, 0x2e, 0x37, 0x80, 0xb1, 0x04, 0x6d, 0xe6, 0x94, 0x98, 0xcc, 0x22, 0x35, 0x79, 0xf6, 0x84, 0x89, 0x0a, 0x2e, 0x61, 0x84, 0x10, 0x8e, + 0x98, 0xc7, 0x0e, 0xa5, 0xdf, 0xdf, 0x4d, 0xf5, 0xfe, 0x1f, 0x33, 0x6a, 0xef, 0x52, 0xac, 0x2d, 0xfc, 0xf8, 0xdb, 0x0c, 0x7c, 0x94, 0xcb, 0xfd, 0xda, 0xe2, 0xa9, 0x93, 0x1a, 0x08, 0x9d, 0x1b, + 0x98, 0xf6, 0xce, 0x8d, 0x89, 0xc2, 0x03, 0x14, 0x50, 0x66, 0x73, 0x55, 0x5a, 0xd4, 0xad, 0xc7, 0x5c, 0x46, 0x01, 0xde, 0x36, 0x44, 0xc3, 0x23, 0x5b, 0xcc, 0x61, 0x5b, 0x8c, 0x1f, 0x30, 0x8f, + 0x0e, 0x47, 0xde, 0x68, 0xdd, 0x47, 0x21, 0x7c, 0xea, 0xd2, 0x85, 0x42, 0x2e, 0x0f, 0xcb, 0x32, 0x16, 0x15, 0x1d, 0x3a, 0xb7, 0xd5, 0xd9, 0x32, 0x62, 0xdb, 0x5d, 0x64, 0x29, 0x8d, 0x8d, 0x9d, + 0x6b, 0x91, 0x4c, 0xe7, 0xa9, 0xc0, 0xbc, 0xf9, 0xfa, 0x0e, 0xcd, 0xd4, 0x8e, 0x4c, 0xa7, 0x3c, 0xbe, 0xe5, 0xbf, 0x54, 0x6d, 0xfc, 0x31, 0x83, 0x76, 0x3f, 0x99, 0x73, 0x6a, 0xea, 0x31, 0x2a, + 0x63, 0x89, 0x54, 0x4b, 0xbb, 0xbf, 0x6a, 0x26, 0x97, 0x4f, 0x6d, 0xaa, 0x16, 0xb6, 0x94, 0x85, 0x64, 0x0e, 0xc9, 0x4e, 0x73, 0x8e, 0x09, 0xe5, 0x4d, 0xa3, 0x06, 0x25, 0xce, 0x58, 0xcb, 0x47, + 0x1d, 0x6e, 0x78, 0x7a, 0x38, 0x6e, 0xf9, 0xfa, 0x34, 0xc4, 0xdb, 0xcf, 0xe7, 0x37, 0x87, 0xea, 0xa9, 0xed, 0x0d, 0x92, 0xc0, 0x3a, 0x8b, 0x27, 0x0d, 0xae, 0x21, 0x03, 0xc8, 0x39, 0xd3, 0x28, + 0x87, 0xc4, 0x12, 0xe8, 0x32, 0x4a, 0xad, 0x19, 0x56, 0x40, 0x50, 0x63, 0xec, 0x9b, 0xb7, 0xe4, 0x98, 0xbb, 0xf0, 0x47, 0x30, 0xc5, 0x0f, 0x63, 0x8e, 0xef, 0xeb, 0x3f, 0x3b, 0xff, 0xf2, 0xf5, + 0x57, 0xe8, 0xbc, 0x7f, 0xef, 0xcd, 0x89, 0x5d, 0xda, 0x27, 0xcf, 0xe5, 0xad, 0xac, 0xc0, 0x0c, 0x46, 0xba, 0x42, 0x8b, 0x2c, 0x45, 0x19, 0x38, 0x2d, 0x94, 0x7b, 0x53, 0xec, 0x3c, 0x1d, 0xd5, + 0xa8, 0x4b, 0x77, 0x2f, 0x85, 0x59, 0x06, 0xda, 0xe1, 0xc8, 0x89, 0xda, 0x7f, 0x98, 0x4d, 0x38, 0x72, 0x4b, 0x3a, 0x7c, 0x58, 0x27, 0x0f, 0x6b, 0xa3, 0x8d, 0x96, 0xb3, 0x59, 0xef, 0x41, 0xe0, + 0x20, 0xd0, 0x96, 0x75, 0xf4, 0xd4, 0x8e, 0x30, 0xa9, 0xf5, 0xae, 0xd2, 0xa0, 0x57, 0xf6, 0x0d, 0x6b, 0x5a, 0x10, 0x0d, 0x1e, 0x43, 0xac, 0xac, 0x98, 0xb5, 0xf4, 0x70, 0xc2, 0xf8, 0xc9, 0x4d, + 0xe7, 0xc7, 0x28, 0x7c, 0x69, 0x5e, 0xf1, 0xc3, 0xc9, 0x33, 0x44, 0x6d, 0x6d, 0x1e, 0xa9, 0xac, 0x88, 0x65, 0x0c, 0xd8, 0x70, 0x33, 0x36, 0x0c, 0x98, 0x13, 0x6b, 0x57, 0x88, 0xde, 0xa4, 0xb6, + 0x8f, 0x35, 0x51, 0x33, 0x89, 0xa1, 0xba, 0x29, 0x19, 0xf4, 0xde, 0xc7, 0xaa, 0xce, 0x87, 0x6d, 0xd4, 0xf7, 0x1b, 0x63, 0x9e, 0xc5, 0xbb, 0x3f, 0x22, 0xd9, 0x1f, 0x81, 0xce, 0xee, 0x71, 0xa3, + 0xf4, 0x69, 0x0c, 0xb4, 0x1f, 0x32, 0xfe, 0x6a, 0xa8, 0xfc, 0xf4, 0xef, 0xec, 0xfb, 0xa5, 0x53, 0x0b, 0x85, 0x0c, 0xde, 0xf4, 0x37, 0x71, 0x16, 0xa0, 0xdb, 0x8c, 0x16, 0xc1, 0xe5, 0xcc, 0xd3, + 0x6c, 0xb2, 0x72, 0x9b, 0x1d, 0x30, 0x19, 0x45, 0x34, 0x83, 0xc9, 0x57, 0xc4, 0x30, 0xe0, 0x34, 0xc3, 0xdd, 0x84, 0x81, 0x9f, 0xe8, 0xc2, 0x8f, 0x89, 0x79, 0x4f, 0x88, 0xfa, 0x99, 0x39, 0xd8, + 0x7f, 0xf3, 0xad, 0x79, 0x90, 0xc3, 0xbb, 0x25, 0x64, 0x94, 0xc6, 0x6c, 0xc8, 0x3e, 0xa5, 0x06, 0x09, 0x78, 0x91, 0x5b, 0x87, 0xb6, 0x01, 0x59, 0x48, 0x8f, 0xa9, 0xc5, 0x84, 0xbc, 0x96, 0xcf, + 0xaa, 0x65, 0x9e, 0xb1, 0xa6, 0xad, 0x3a, 0xac, 0x18, 0x7f, 0x73, 0xea, 0xe6, 0x73, 0x99, 0x7a, 0xd5, 0x62, 0x3c, 0x5c, 0x80, 0xfd, 0xdc, 0x5c, 0x9c, 0xbe, 0xbe, 0x3d, 0x6c, 0x20, 0xb6, 0x6a, + 0xc3, 0x8c, 0x23, 0xb9, 0x7a, 0x8d, 0xee, 0xec, 0x6d, 0x8e, 0x04, 0x10, 0xb1, 0x0e, 0x8c, 0x53, 0x66, 0x25, 0x86, 0x49, 0x89, 0x53, 0x2c, 0x0d, 0x31, 0xca, 0x64, 0xf2, 0x4e, 0x87, 0x35, 0xea, + 0x61, 0xf1, 0x1f, 0xbf, 0x6b, 0xc9, 0xeb, 0x44, 0x7e, 0x3c, 0xa2, 0x05, 0xa7, 0xa6, 0xd5, 0x43, 0x37, 0x60, 0xcf, 0x09, 0x3a, 0x27, 0x15, 0xcb, 0x30, 0x83, 0x5a, 0xba, 0x38, 0x9d, 0xda, 0xee, + 0xa0, 0x8d, 0x36, 0x1c, 0x88, 0x5e, 0x33, 0x47, 0x9b, 0xd8, 0xa2, 0xc1, 0xd4, 0x88, 0xb9, 0xbb, 0x50, 0xe0, 0xd8, 0xd1, 0xc9, 0xfb, 0x09, 0x70, 0x2f, 0x6c, 0xdf, 0xa9, 0xfd, 0xd9, 0xe4, 0xd6, + 0x15, 0xb9, 0x0b, 0xc9, 0xce, 0x84, 0x83, 0xa1, 0x34, 0x4b, 0xd8, 0x90, 0x6d, 0xeb, 0x12, 0xad, 0x7c, 0x2d, 0x52, 0x05, 0xd9, 0x0c, 0x60, 0x8b, 0x72, 0xcb, 0x36, 0x66, 0xe1, 0xf2, 0x58, 0x4d, + 0x8e, 0x4c, 0x0f, 0xdf, 0x9f, 0x93, 0xb7, 0x3f, 0x1f, 0xef, 0xc9, 0x71, 0xb2, 0x27, 0x03, 0x15, 0x9e, 0x59, 0xca, 0x27, 0x95, 0xef, 0x2f, 0x0f, 0xa3, 0xf0, 0x1e, 0x4f, 0xd0, 0xbd, 0x3f, 0x3c, + 0x81, 0x73, 0xd7, 0xb2, 0xbb, 0x53, 0x81, 0x43, 0x09, 0xb9, 0xf7, 0x07, 0x4f, 0xec, 0xbd, 0x6e, 0x4b, 0x7f, 0x8c, 0xde, 0x7b, 0x91, 0x77, 0x39, 0xf1, 0x36, 0x58, 0x2e, 0x24, 0x5c, 0x02, 0x85, + 0x36, 0xdd, 0xb2, 0x70, 0x2a, 0x06, 0xe7, 0x9a, 0x6d, 0x40, 0xef, 0x8e, 0x3e, 0x06, 0x79, 0xf4, 0x61, 0x3d, 0x49, 0x68, 0xa5, 0x2e, 0xc1, 0x98, 0x31, 0x17, 0xf5, 0x49, 0x72, 0x38, 0x6d, 0xfd, + 0xd3, 0x6d, 0x78, 0x31, 0xa6, 0xf0, 0xf1, 0xb0, 0xe3, 0x6b, 0xdc, 0x7d, 0x1c, 0x4d, 0x78, 0x8c, 0x69, 0x0f, 0x03, 0x0a, 0xf7, 0xd5, 0xee, 0xf4, 0x5e, 0x5b, 0x34, 0xd2, 0x96, 0x0b, 0x13, 0x49, + 0x07, 0x70, 0x0f, 0x5c, 0x4a, 0xc8, 0x25, 0xb3, 0x6c, 0xcc, 0x9e, 0x5c, 0xd1, 0x41, 0xd5, 0x4a, 0x84, 0x60, 0xc9, 0x62, 0x09, 0x09, 0xc5, 0x2e, 0x64, 0x4b, 0x8e, 0xdc, 0x86, 0xfa, 0x22, 0x53, + 0x75, 0x9c, 0x23, 0x8f, 0x13, 0x5f, 0x1f, 0xc7, 0x30, 0xbe, 0xde, 0x7a, 0xf3, 0xec, 0xad, 0x17, 0x5e, 0xe9, 0xd4, 0xad, 0x37, 0x2a, 0x55, 0x40, 0x25, 0xcb, 0x40, 0xc9, 0x70, 0x89, 0x4f, 0xa4, + 0xa5, 0x0d, 0xbb, 0x83, 0x63, 0x29, 0x90, 0x40, 0x9b, 0x28, 0x93, 0x52, 0x2a, 0x63, 0xb2, 0x1a, 0x8a, 0x53, 0x52, 0x28, 0x69, 0x1b, 0x87, 0xd5, 0xfa, 0xb9, 0xae, 0xfe, 0x84, 0xce, 0xc3, 0x83, + 0xec, 0xf1, 0xe4, 0xe0, 0x58, 0x38, 0x9a, 0x0c, 0x4d, 0x18, 0x89, 0x34, 0xb4, 0x0d, 0xf6, 0x95, 0x8b, 0x06, 0x98, 0x9a, 0x58, 0xcf, 0x84, 0x84, 0x9a, 0x2b, 0xc5, 0x14, 0x8d, 0xca, 0x1c, 0x56, + 0x34, 0xf5, 0x81, 0x9d, 0x57, 0x1f, 0x75, 0x04, 0x60, 0xfe, 0xd8, 0xed, 0xef, 0x47, 0x49, 0x9e, 0xce, 0xde, 0x3c, 0x4a, 0xfb, 0xb6, 0xe6, 0xb8, 0xbc, 0xd9, 0x7e, 0xf9, 0x76, 0xdf, 0x7a, 0x83, + 0x9c, 0xbc, 0xeb, 0x18, 0x5c, 0x83, 0x41, 0x9b, 0xb7, 0x98, 0x4b, 0x6d, 0x93, 0xf3, 0xc0, 0xb2, 0x99, 0x0b, 0x6b, 0x95, 0x61, 0xae, 0x19, 0x22, 0x34, 0x4c, 0x28, 0x61, 0x4e, 0x88, 0x68, 0xaa, + 0xa9, 0x68, 0x6b, 0x21, 0x0c, 0x3d, 0x6c, 0x36, 0xf4, 0xe6, 0xdb, 0xa5, 0x9f, 0xdd, 0x5e, 0xeb, 0xf9, 0x7d, 0x05, 0xe7, 0x85, 0x4e, 0x3c, 0xbf, 0xaf, 0xe7, 0x89, 0x21, 0xb9, 0xb7, 0xed, 0x71, + 0xa9, 0x87, 0x4d, 0xfb, 0xd5, 0xfe, 0x1d, 0xe5, 0x4f, 0x0f, 0x9b, 0xfd, 0x00, 0xac, 0xef, 0x9f, 0xcd, 0x3f, 0xbd, 0xbb, 0x7e, 0x2d, 0xdc, 0xfb, 0xce, 0xf0, 0xfb, 0x96, 0xa1, 0x17, 0x75, 0xff, + 0x37, 0xe0, 0x39, 0x43, 0xab, 0x21, 0xdd, 0x3a, 0x03, 0xf0, 0x08, 0x1b, 0x5d, 0x71, 0x46, 0xb3, 0xbe, 0x32, 0x50, 0x78, 0x95, 0x96, 0x49, 0x4a, 0xae, 0xe8, 0x6b, 0x6e, 0xfa, 0xe7, 0xc1, 0xa3, + 0xa7, 0xc2, 0x8a, 0x6a, 0x7e, 0xe4, 0xe0, 0xe2, 0xa1, 0x53, 0xec, 0x4f, 0x58, 0xfa, 0x38, 0xf9, 0xeb, 0x35, 0xb6, 0xfe, 0x98, 0x48, 0xb2, 0x63, 0xf2, 0x93, 0x16, 0xaa, 0x5f, 0xe6, 0xf5, 0xbe, + 0xfc, 0x1e, 0xe7, 0xfb, 0xc3, 0xac, 0xe3, 0xbd, 0xfc, 0xc9, 0xe9, 0x4f, 0xba, 0xee, 0xc6, 0xf4, 0x4a, 0x9b, 0x24, 0xa8, 0xec, 0x81, 0x30, 0xac, 0x94, 0xbc, 0x86, 0x0c, 0x9b, 0xad, 0x01, 0xcd, + 0x0d, 0x5e, 0x7b, 0x73, 0x16, 0x73, 0x0b, 0xa8, 0xde, 0x5a, 0x83, 0x89, 0x5a, 0x23, 0x97, 0xb5, 0x63, 0x6d, 0xf5, 0xcf, 0x66, 0x06, 0xee, 0xfb, 0xf6, 0x53, 0x5b, 0xa8, 0x4c, 0x5b, 0x96, 0xd8, + 0xc4, 0x6c, 0x77, 0xa9, 0x2a, 0x3b, 0x30, 0x3b, 0x13, 0xb6, 0xc0, 0x99, 0x8d, 0xd2, 0x5d, 0xdd, 0x5a, 0xa6, 0xe6, 0x34, 0x59, 0x2d, 0xfb, 0x28, 0x37, 0xa6, 0xc9, 0x0b, 0x1a, 0x1f, 0xb9, 0x67, + 0xe8, 0xc7, 0x04, 0xc4, 0x23, 0x5b, 0x74, 0x78, 0x0a, 0xe2, 0x0b, 0xc7, 0x73, 0xea, 0x6c, 0x6f, 0x0c, 0x1a, 0xd2, 0xa4, 0xa3, 0x10, 0xa8, 0xa4, 0xe0, 0x9c, 0xd5, 0x56, 0xc7, 0xc8, 0x8c, 0x45, + 0x69, 0x09, 0x56, 0x98, 0xe4, 0x92, 0xa4, 0x7d, 0x0c, 0x8a, 0x2e, 0x3d, 0x60, 0x6d, 0xdb, 0x35, 0xc8, 0xea, 0xb0, 0x45, 0x7a, 0x84, 0x2d, 0x3f, 0x25, 0xf6, 0xd9, 0x94, 0xdd, 0xe7, 0xc2, 0x79, + 0xfa, 0x8b, 0xb4, 0xcc, 0x5a, 0x60, 0xb2, 0xe5, 0xd4, 0xec, 0x3a, 0x6a, 0x8b, 0xf8, 0x33, 0x46, 0x19, 0x0d, 0xd0, 0xda, 0xa2, 0x10, 0x1c, 0xdc, 0x03, 0xa7, 0x90, 0x10, 0x26, 0xb5, 0x41, 0x5d, + 0xb3, 0x99, 0x25, 0x88, 0xb3, 0xfc, 0x4c, 0x36, 0xff, 0x3a, 0xdf, 0xef, 0x96, 0x38, 0x7d, 0x63, 0xf9, 0x72, 0xb7, 0x85, 0x31, 0xa1, 0x56, 0xd3, 0x39, 0x7b, 0x56, 0x42, 0xf1, 0x62, 0x1d, 0x60, + 0x30, 0x6d, 0xe8, 0x80, 0xec, 0x1d, 0x28, 0xa6, 0x7a, 0x9f, 0xc3, 0xda, 0x9a, 0x5d, 0x6a, 0x60, 0x5f, 0x6c, 0xbd, 0x1f, 0x1d, 0x6f, 0xb5, 0xd9, 0xec, 0xa7, 0x4b, 0xc7, 0x37, 0x58, 0xba, 0x8e, + 0xc6, 0xde, 0x57, 0x37, 0x8c, 0xde, 0x6d, 0x94, 0xf7, 0x11, 0xb0, 0x26, 0x24, 0x73, 0x4e, 0xeb, 0xab, 0x07, 0x8c, 0x65, 0x18, 0x3a, 0x12, 0xa8, 0x72, 0x80, 0xad, 0x1e, 0x95, 0x51, 0xb3, 0x62, + 0xf0, 0x3a, 0xdc, 0x5c, 0x7c, 0xb0, 0xd1, 0xe3, 0xd1, 0x9f, 0xfd, 0xb3, 0xdb, 0xa0, 0x9e, 0x27, 0x72, 0x9e, 0x6f, 0xa8, 0x9c, 0xbc, 0x14, 0x35, 0x2a, 0x3d, 0x5c, 0x45, 0x07, 0x0a, 0xb8, 0xa3, + 0xad, 0xf0, 0xe2, 0xf0, 0x86, 0x34, 0x7a, 0x65, 0xb2, 0x80, 0xe2, 0x6a, 0xd5, 0x99, 0xba, 0x5b, 0x93, 0x36, 0x6a, 0x2d, 0x44, 0x4d, 0x9a, 0xdd, 0x7a, 0x1d, 0x2b, 0x3f, 0xef, 0xc6, 0xb9, 0xef, + 0xaf, 0xbd, 0xfd, 0xcf, 0xed, 0xeb, 0xb3, 0x9b, 0x4b, 0xfd, 0x7a, 0xf3, 0xf9, 0xea, 0xf6, 0xec, 0xeb, 0x75, 0xfe, 0x71, 0x9e, 0x7f, 0x9e, 0x5a, 0xcd, 0xdc, 0x3d, 0xa2, 0x3a, 0x8e, 0x41, 0x95, + 0xee, 0x53, 0xdd, 0xc6, 0x1a, 0xb5, 0x50, 0x3b, 0x2a, 0x63, 0xe2, 0x32, 0x5a, 0xb5, 0x9c, 0x1c, 0xd6, 0xea, 0x11, 0x95, 0x99, 0xaa, 0x32, 0x8b, 0x63, 0xe5, 0xd8, 0x0c, 0xdc, 0x31, 0x92, 0x7e, + 0x14, 0x12, 0xf7, 0xf5, 0x8c, 0x4f, 0xdd, 0x8c, 0x15, 0x83, 0x32, 0x21, 0x28, 0x83, 0xd6, 0x2c, 0x5e, 0x6b, 0x97, 0x0c, 0xca, 0xd9, 0x93, 0xda, 0xdc, 0xdd, 0xef, 0x61, 0x52, 0x53, 0x61, 0xb9, + 0x92, 0x60, 0xe3, 0x59, 0x65, 0xd2, 0x7c, 0xa4, 0xa1, 0x08, 0xd7, 0x2f, 0x82, 0x95, 0xa7, 0x34, 0x7d, 0xbf, 0xda, 0xe2, 0x88, 0x5c, 0x3e, 0x7b, 0xd7, 0xd4, 0x7f, 0xcf, 0x17, 0xe7, 0x7b, 0xde, + 0x80, 0x0f, 0x7d, 0x33, 0x1b, 0x53, 0xdb, 0x14, 0x72, 0xaf, 0xd4, 0xd1, 0x43, 0x28, 0x6c, 0x19, 0x66, 0x80, 0x77, 0x5d, 0x4a, 0xbe, 0x66, 0x84, 0xf4, 0x69, 0xd0, 0x4d, 0xaa, 0x29, 0x8c, 0x74, + 0xd2, 0x2d, 0xa0, 0x97, 0x23, 0xdd, 0xd6, 0x76, 0xf7, 0xe5, 0xab, 0x5e, 0x5c, 0xbd, 0x1a, 0x1d, 0xfd, 0x2c, 0xc5, 0xbe, 0xc7, 0x90, 0x9b, 0xcf, 0x7a, 0x9d, 0xaf, 0x94, 0x90, 0x0e, 0x70, 0xfa, + 0xcd, 0x79, 0xd7, 0xd6, 0x82, 0x29, 0xae, 0x13, 0xa8, 0xb7, 0x4a, 0xc8, 0xb1, 0x6c, 0x35, 0x99, 0x8e, 0x24, 0x3c, 0x70, 0x00, 0xb7, 0x96, 0x6c, 0xb0, 0x59, 0xb8, 0x4d, 0xf9, 0x25, 0x86, 0x58, + 0xa3, 0x32, 0x31, 0x58, 0x16, 0x87, 0x8b, 0x49, 0x3f, 0xf8, 0xf0, 0x92, 0xa4, 0xb3, 0x9b, 0xbb, 0xaf, 0x5f, 0xaf, 0x76, 0x57, 0x9a, 0xfd, 0x32, 0x1b, 0xbe, 0xff, 0xce, 0x9b, 0xb3, 0xc3, 0x12, + 0x91, 0x60, 0x10, 0x56, 0xf5, 0x90, 0x42, 0x82, 0x1a, 0xb9, 0x4b, 0x43, 0x47, 0x13, 0xeb, 0x9c, 0x95, 0xbc, 0x66, 0xd4, 0x5a, 0x03, 0x7c, 0x90, 0x0c, 0x9e, 0xab, 0x2b, 0x49, 0x35, 0x59, 0xac, + 0xf2, 0x2b, 0x47, 0xe1, 0x7e, 0x2a, 0x26, 0x8f, 0x7a, 0xf3, 0xdf, 0x93, 0x9f, 0x87, 0x97, 0xdf, 0x9c, 0x63, 0xc1, 0x5e, 0xb5, 0x78, 0xda, 0x2a, 0x58, 0x99, 0xc1, 0x43, 0xe7, 0xf4, 0x22, 0xb1, + 0x39, 0x92, 0x4b, 0x26, 0xbb, 0xf5, 0x41, 0xca, 0xaa, 0x30, 0x5b, 0xeb, 0x65, 0x63, 0x84, 0x55, 0xe0, 0x30, 0x22, 0xa3, 0x3a, 0x66, 0x49, 0x7f, 0x4c, 0xf3, 0x7d, 0x4e, 0xc2, 0xe9, 0xbb, 0xc3, + 0x1c, 0xe6, 0x12, 0x6a, 0x40, 0x14, 0x81, 0x50, 0xb1, 0x1a, 0x4d, 0x59, 0xec, 0x30, 0x95, 0xa6, 0xf6, 0x1e, 0xa3, 0x7c, 0x51, 0xa6, 0xa3, 0x64, 0x49, 0x78, 0x84, 0xa3, 0xba, 0x64, 0x87, 0x81, + 0x5b, 0xe0, 0x7d, 0x94, 0x82, 0xcb, 0x97, 0xc3, 0x38, 0x4f, 0x7f, 0x1e, 0x0a, 0x26, 0x87, 0x4b, 0xcc, 0x5d, 0xae, 0xd5, 0xd6, 0xe0, 0xea, 0x34, 0x00, 0x79, 0xa4, 0x00, 0x78, 0x2f, 0x22, 0x1c, + 0x63, 0x11, 0x3a, 0x14, 0x2b, 0xcf, 0xea, 0xdd, 0xc7, 0x80, 0xd6, 0x55, 0x9a, 0xb4, 0xc5, 0xc7, 0x66, 0xd2, 0x1e, 0x5c, 0x7d, 0x3f, 0x7d, 0x1f, 0x87, 0xaf, 0x2e, 0x3a, 0x99, 0xca, 0x83, 0x55, + 0x96, 0x0c, 0xcc, 0x21, 0x1d, 0x09, 0x53, 0xa9, 0x35, 0xb5, 0x94, 0x2e, 0x82, 0x1b, 0x6e, 0x99, 0x90, 0x7d, 0x4d, 0x02, 0x6a, 0x23, 0x70, 0x59, 0x6b, 0x45, 0x47, 0xce, 0xe4, 0x3d, 0xd4, 0xb2, + 0xcf, 0xe7, 0x9a, 0x67, 0x5f, 0xfd, 0xec, 0xcf, 0xf3, 0xcb, 0xb8, 0xfa, 0xf3, 0xe6, 0xec, 0xd3, 0xe5, 0x7d, 0x4f, 0xed, 0xc3, 0x8f, 0xff, 0x5a, 0xf3, 0xe3, 0xa4, 0x97, 0x2f, 0x1c, 0x53, 0xae, + 0xa7, 0xf3, 0x88, 0xdf, 0xba, 0x00, 0x84, 0xd1, 0x61, 0x64, 0x66, 0xb7, 0x4e, 0xea, 0x4a, 0x2c, 0xbc, 0x45, 0x9d, 0x9b, 0xfb, 0xca, 0x58, 0x0b, 0xe7, 0xcc, 0x19, 0x13, 0x70, 0x4c, 0xd4, 0xe6, + 0x34, 0xbb, 0x34, 0xad, 0x85, 0x22, 0xe5, 0x53, 0xc4, 0x5e, 0x17, 0xc9, 0x83, 0x8c, 0xd9, 0x57, 0xb2, 0x53, 0x63, 0x6e, 0xf5, 0x6e, 0x8b, 0x7d, 0xf6, 0x89, 0x8d, 0x70, 0x73, 0xc6, 0x26, 0x02, + 0x39, 0x3c, 0x5b, 0xdf, 0xf4, 0xaa, 0x06, 0x0d, 0x73, 0x37, 0xb3, 0x4e, 0xd5, 0x2d, 0x9b, 0x54, 0xcd, 0xb2, 0xa9, 0x36, 0xc0, 0xd8, 0x8e, 0xe1, 0x9a, 0xa7, 0x6d, 0x0b, 0xfb, 0x9b, 0x72, 0x6a, + 0xc8, 0xcd, 0x2d, 0x7d, 0x7a, 0xae, 0x61, 0x06, 0x63, 0xc1, 0x00, 0xd7, 0x1c, 0x39, 0x7c, 0x71, 0xc9, 0xd0, 0x95, 0xc2, 0x81, 0xde, 0x9c, 0xac, 0x35, 0x40, 0xec, 0xd5, 0xbb, 0xf6, 0x4e, 0xd9, + 0x3d, 0x47, 0x24, 0xf0, 0xe1, 0x93, 0xec, 0xbf, 0x56, 0x34, 0x78, 0x55, 0x64, 0xdf, 0x7a, 0xeb, 0x18, 0x30, 0x11, 0x79, 0x11, 0x44, 0x1b, 0xec, 0x90, 0x09, 0x1e, 0x58, 0x86, 0x58, 0xca, 0x39, + 0x74, 0xd0, 0x04, 0xcd, 0x95, 0xb4, 0x4a, 0xd1, 0x95, 0x25, 0x9d, 0xd0, 0xcb, 0x41, 0x3a, 0xc0, 0xea, 0xc7, 0x2d, 0xfc, 0x6e, 0x1e, 0xfb, 0xf3, 0xd5, 0x9f, 0xfe, 0x82, 0x04, 0x43, 0x59, 0x33, + 0xd2, 0xc6, 0x02, 0xa7, 0x4a, 0x00, 0x9b, 0x08, 0x22, 0x4b, 0x47, 0x8e, 0xde, 0x27, 0x64, 0xe5, 0x34, 0x5a, 0x0a, 0x03, 0x80, 0x57, 0x34, 0x0f, 0xc9, 0xac, 0x52, 0x8a, 0x0d, 0x15, 0xf8, 0x6b, + 0x16, 0xe6, 0xa7, 0xbb, 0xf6, 0x63, 0x94, 0xdf, 0xbe, 0x17, 0x38, 0xb5, 0xc1, 0x88, 0x21, 0x9e, 0x95, 0x16, 0xcd, 0x97, 0x60, 0x29, 0x46, 0xcc, 0xc8, 0xb1, 0x20, 0xa5, 0x73, 0x6f, 0x10, 0x6b, + 0x0c, 0x74, 0x23, 0xa2, 0x25, 0x1e, 0x55, 0xad, 0x0f, 0x9f, 0xb0, 0xd8, 0x6d, 0xf6, 0x3a, 0x36, 0x05, 0xe8, 0xe7, 0x33, 0xd9, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, + 0xc3, 0x39, 0x21, 0xec, 0xef, 0x28, 0x00, 0x00, 0x5c, 0xac, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x2c, 0xcc, + 0x41, 0x0a, 0xc2, 0x30, 0x10, 0x85, 0xe1, 0xfd, 0x9c, 0xa2, 0xcc, 0xde, 0x90, 0xa8, 0xa0, 0x1b, 0x4f, 0x52, 0x8a, 0xc4, 0xe4, 0x19, 0x06, 0xeb, 0xa4, 0xa4, 0xb1, 0x7a, 0x7c, 0x49, 0xdb, 0xe5, + 0xfb, 0x78, 0xfc, 0xd4, 0x4f, 0x3e, 0xbc, 0x7c, 0xc2, 0x40, 0xea, 0xdf, 0xe8, 0x6e, 0x1d, 0x3f, 0x3f, 0x1a, 0xaa, 0x64, 0x65, 0x5a, 0x50, 0x66, 0xc9, 0xda, 0xd0, 0x1a, 0x67, 0x2c, 0x13, 0xa2, + 0xd4, 0x5d, 0x8e, 0xd6, 0x5d, 0x99, 0xa8, 0x8f, 0x98, 0xa0, 0x11, 0x1a, 0x04, 0xf3, 0x40, 0x3e, 0x54, 0xf9, 0x1d, 0xbe, 0x78, 0xb4, 0xcb, 0x89, 0xf7, 0x5d, 0x6a, 0x9b, 0x8e, 0x69, 0xcc, 0x69, + 0xab, 0x9d, 0xd7, 0x9a, 0x2e, 0xf7, 0x31, 0xa7, 0x84, 0xb2, 0xe1, 0xc5, 0x38, 0xa6, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd6, 0xe8, 0xd8, 0xdd, 0x76, 0x00, 0x00, 0x00, + 0x92, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x2a, 0x4f, 0x4d, 0xb2, 0x52, 0xd0, 0x2f, 0xcf, 0x2f, 0xca, 0x2e, 0x2e, + 0x48, 0x4c, 0x4e, 0xd5, 0x4f, 0xca, 0xcc, 0xd3, 0x4f, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0xe3, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x6c, 0xcc, 0x2d, 0x40, 0x23, + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x7c, 0x54, 0xe1, 0x6f, 0x1b, 0xb7, 0x0f, 0xfd, + 0xae, 0xbf, 0x82, 0x4d, 0x7f, 0x40, 0x9a, 0x1f, 0xe2, 0x73, 0x3f, 0x16, 0x46, 0x57, 0xa0, 0xc8, 0xda, 0x26, 0xe8, 0xd0, 0x14, 0x89, 0x83, 0x21, 0xc8, 0x8a, 0x9e, 0xac, 0xe3, 0x59, 0x6a, 0x64, + 0xf1, 0x26, 0x52, 0xe7, 0x78, 0xc3, 0xfe, 0xf7, 0x41, 0x92, 0xed, 0x38, 0x68, 0xd7, 0x6f, 0x77, 0x12, 0xf9, 0x44, 0xbe, 0xf7, 0xc8, 0xe7, 0x70, 0x95, 0x58, 0xe0, 0x7c, 0x3e, 0xff, 0x0c, 0xef, + 0x53, 0x30, 0xe2, 0x28, 0x28, 0xf5, 0x3b, 0x7a, 0x43, 0x2b, 0x04, 0x21, 0xd8, 0x50, 0x8a, 0x10, 0x70, 0x5d, 0xe3, 0xfa, 0x6d, 0x08, 0x0c, 0x91, 0xbe, 0xa1, 0x91, 0x67, 0x30, 0xb7, 0x08, 0x0b, + 0x72, 0x1e, 0xe3, 0xe0, 0xb5, 0xa0, 0xba, 0xd3, 0x46, 0xdc, 0xc3, 0x97, 0x17, 0x56, 0x64, 0xe0, 0xd9, 0x74, 0x5a, 0x7e, 0x9b, 0xc8, 0xd3, 0x13, 0x58, 0xe3, 0x02, 0x18, 0xe3, 0x88, 0x11, 0x1c, + 0x83, 0x0b, 0xea, 0xae, 0xe5, 0x68, 0xa6, 0x2b, 0xed, 0x42, 0x13, 0xb9, 0xfd, 0xf2, 0xa2, 0x99, 0x1e, 0xfc, 0x9f, 0x34, 0x70, 0x21, 0xc7, 0x0c, 0x86, 0x42, 0xef, 0x96, 0x29, 0x62, 0x97, 0xcb, + 0x71, 0x61, 0xa4, 0x7b, 0x04, 0xb1, 0x08, 0xad, 0x0b, 0x1d, 0x3e, 0xb4, 0x6a, 0x5f, 0x93, 0x0b, 0x50, 0x11, 0xad, 0x0e, 0x9d, 0xc7, 0x78, 0x08, 0xfa, 0x78, 0x74, 0x92, 0xe3, 0x22, 0xf2, 0x40, + 0x81, 0x4b, 0x87, 0x0b, 0x12, 0xab, 0x3e, 0xbc, 0x9b, 0x83, 0x0e, 0x1d, 0x7c, 0xbe, 0xbc, 0x9e, 0x43, 0xc4, 0x3f, 0x13, 0xb2, 0x70, 0x03, 0xb7, 0x94, 0x80, 0x2d, 0x25, 0xdf, 0xc1, 0x90, 0xa4, + 0x92, 0xd1, 0x21, 0xbb, 0x5c, 0xcd, 0x02, 0xad, 0x1e, 0x1d, 0x45, 0x70, 0x81, 0x5d, 0x87, 0x4a, 0xac, 0x96, 0x5d, 0x51, 0x7b, 0xa2, 0x1a, 0xb8, 0x08, 0x60, 0x34, 0x63, 0xce, 0x85, 0x80, 0xb5, + 0x8b, 0x7d, 0x4f, 0x8a, 0x33, 0xcd, 0x11, 0x99, 0x52, 0x34, 0xc8, 0xd0, 0x53, 0xac, 0x8f, 0xec, 0xf2, 0x4f, 0x4b, 0x9e, 0xd1, 0x01, 0x3a, 0x82, 0xf2, 0x82, 0x0b, 0xa5, 0xfb, 0xbb, 0x76, 0x0f, + 0xf2, 0xf8, 0xda, 0xae, 0xdb, 0x7a, 0x55, 0x48, 0x54, 0x2a, 0x2b, 0xa4, 0x87, 0x01, 0xd6, 0xce, 0x7b, 0xc0, 0x87, 0x81, 0x72, 0xdb, 0x36, 0x22, 0x02, 0x86, 0x6e, 0x20, 0x17, 0x84, 0x67, 0x4a, + 0x01, 0xfc, 0x1f, 0xda, 0x69, 0x0b, 0xf3, 0xe8, 0x96, 0x4b, 0x8c, 0x7c, 0x48, 0xf1, 0x41, 0x35, 0xb9, 0x40, 0x74, 0x62, 0x31, 0x42, 0xa6, 0x8c, 0x62, 0x65, 0x6c, 0x85, 0x62, 0xa9, 0xe3, 0x2d, + 0x8a, 0x45, 0xed, 0xc5, 0x4e, 0x23, 0xea, 0xce, 0x05, 0x64, 0x6e, 0x8b, 0x4b, 0x76, 0xaf, 0x15, 0x0c, 0x0d, 0xfb, 0x5b, 0xa8, 0xe1, 0x60, 0x2c, 0x9a, 0xfb, 0xa7, 0x08, 0xde, 0x8d, 0xf8, 0x9f, + 0x00, 0xbb, 0xcb, 0xa7, 0xf9, 0x2a, 0x4b, 0xb6, 0xd2, 0x1b, 0x48, 0x8c, 0xa0, 0xc3, 0x06, 0xa8, 0x2f, 0xad, 0xe8, 0x51, 0x3b, 0xaf, 0x17, 0x1e, 0xa1, 0x3a, 0x54, 0xf5, 0xa8, 0x25, 0x45, 0xe4, + 0x1f, 0x58, 0xb5, 0x23, 0x93, 0xfd, 0x2a, 0x04, 0x7d, 0xf2, 0x7d, 0xa6, 0x2d, 0x23, 0xec, 0x5c, 0x01, 0x5a, 0x40, 0x2c, 0x31, 0xaa, 0x3d, 0x7f, 0x8d, 0x52, 0xcf, 0x9f, 0xc3, 0xaf, 0x38, 0xa2, + 0xa7, 0x61, 0x85, 0x41, 0x32, 0xeb, 0xd9, 0xe3, 0x0c, 0x3a, 0x63, 0xf8, 0x0d, 0x30, 0xfa, 0x7e, 0x62, 0x28, 0x88, 0x76, 0x01, 0xbb, 0x2c, 0x88, 0x77, 0x46, 0x57, 0x52, 0x99, 0x1e, 0x55, 0xae, + 0x18, 0xe0, 0x04, 0x34, 0xab, 0x7c, 0xba, 0x2e, 0xee, 0x2b, 0x9d, 0x14, 0xda, 0xcb, 0x1c, 0x3e, 0x49, 0xc7, 0x66, 0xd9, 0x28, 0xd5, 0xb6, 0x2d, 0x5b, 0xf4, 0x1e, 0xd8, 0x44, 0x37, 0x88, 0x32, + 0x3a, 0x2e, 0x09, 0x16, 0xc9, 0xf9, 0x6e, 0xfb, 0x2d, 0xc8, 0xbb, 0xe3, 0x98, 0x42, 0x4e, 0x50, 0xea, 0x32, 0x18, 0xcc, 0x7f, 0xc1, 0x85, 0xe5, 0x69, 0x69, 0xf3, 0x71, 0x9c, 0xf8, 0x80, 0x34, + 0x2d, 0xf0, 0x3a, 0xf3, 0x34, 0x9b, 0x4e, 0x3d, 0x19, 0xed, 0x2d, 0xb1, 0xcc, 0x5e, 0xbd, 0x7c, 0xf5, 0xf2, 0x4d, 0x1e, 0x1b, 0x95, 0x13, 0x0f, 0x65, 0x60, 0xd0, 0xf1, 0x27, 0x49, 0xdf, 0x39, + 0xa4, 0xa2, 0xfc, 0x3c, 0x78, 0xa7, 0xf7, 0x9b, 0x06, 0xe6, 0x54, 0x6d, 0xd7, 0x69, 0xd1, 0x59, 0xa6, 0xc3, 0xba, 0x4f, 0x95, 0x86, 0x24, 0xce, 0x3b, 0xd9, 0x00, 0x27, 0x63, 0x41, 0x33, 0xb4, + 0x26, 0x45, 0xdf, 0x16, 0x5b, 0x2c, 0x30, 0x3b, 0xa3, 0x9b, 0x15, 0xc2, 0x0c, 0x05, 0x26, 0x8f, 0x2a, 0x5f, 0xc3, 0xa4, 0x83, 0xe3, 0xbf, 0x8f, 0x32, 0x85, 0x74, 0x34, 0x83, 0xa3, 0x35, 0x45, + 0xdf, 0x1d, 0xfd, 0x73, 0x0c, 0x7f, 0x28, 0x80, 0xc9, 0xf9, 0x71, 0xd6, 0x0e, 0x83, 0x4c, 0x64, 0x33, 0xe0, 0xec, 0x50, 0x80, 0xe9, 0x37, 0xa6, 0x50, 0xc3, 0x7e, 0x58, 0x7f, 0x25, 0xba, 0xf8, + 0x63, 0xf0, 0xb4, 0xa9, 0xf6, 0xb8, 0x61, 0x84, 0x36, 0x97, 0xdc, 0x6e, 0xf7, 0x41, 0xf1, 0x45, 0x74, 0x7f, 0x61, 0x9d, 0xff, 0x27, 0x02, 0x0f, 0x69, 0xe1, 0x1d, 0xdb, 0x6c, 0x0a, 0xa1, 0x32, + 0x3a, 0x4b, 0xc7, 0x12, 0x37, 0x2a, 0x6f, 0xac, 0xae, 0xa0, 0x56, 0xc3, 0x80, 0x86, 0x8f, 0x41, 0x8b, 0x1b, 0x11, 0xae, 0x31, 0x8e, 0xce, 0x60, 0x5e, 0x17, 0x05, 0xf0, 0x63, 0x5a, 0x60, 0x0c, + 0x28, 0xc8, 0x60, 0x7c, 0x62, 0xc1, 0x38, 0xfb, 0xde, 0x33, 0xb9, 0xa0, 0x1d, 0xe0, 0x64, 0xb2, 0x7b, 0xe6, 0x97, 0x8e, 0xcc, 0x3d, 0xc6, 0xc6, 0xd1, 0xf4, 0xf5, 0xed, 0xe5, 0xcd, 0xd5, 0xd7, + 0xb7, 0x67, 0x67, 0x97, 0x37, 0x9f, 0xe6, 0x6f, 0x6a, 0x67, 0xb7, 0x5b, 0xeb, 0xd2, 0x2a, 0xd7, 0x97, 0xb7, 0xc6, 0x63, 0x6a, 0x0b, 0x34, 0x14, 0x33, 0x2d, 0xf2, 0x04, 0x88, 0xb8, 0xb0, 0xac, + 0x21, 0xef, 0x6f, 0x3e, 0x9d, 0x7d, 0xbd, 0x7a, 0xf7, 0xe1, 0xe2, 0x7a, 0x7e, 0x75, 0xdb, 0x2a, 0x0c, 0xa3, 0x8b, 0x14, 0x32, 0x37, 0x30, 0xea, 0xe8, 0xb2, 0xe7, 0x1a, 0x78, 0x1b, 0x3a, 0x70, + 0x7d, 0x99, 0x8d, 0x9e, 0xe2, 0x12, 0xa5, 0x6c, 0xc3, 0x63, 0xef, 0xb3, 0x8a, 0x43, 0xa4, 0xd5, 0x20, 0xd8, 0x6d, 0x37, 0x1c, 0x25, 0xc9, 0x1b, 0xba, 0x8f, 0xb4, 0x02, 0x9d, 0x85, 0x37, 0xc8, + 0xdc, 0x27, 0xbf, 0x6b, 0x67, 0xbb, 0xc5, 0xd9, 0xd2, 0xba, 0x54, 0x70, 0x73, 0xf5, 0x5b, 0xd9, 0x23, 0x62, 0x51, 0x71, 0xe5, 0xea, 0x14, 0xd6, 0xd6, 0x19, 0xbb, 0x9f, 0x45, 0xed, 0x99, 0x60, + 0x89, 0x02, 0xa3, 0xd3, 0x55, 0x2c, 0x70, 0xa1, 0xa7, 0xf6, 0x60, 0xe2, 0x9e, 0x18, 0xe8, 0x7f, 0x2f, 0xf6, 0x31, 0x30, 0x21, 0x48, 0xd1, 0x9f, 0x54, 0x86, 0xce, 0xf5, 0x58, 0xfc, 0xf9, 0x4c, + 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xa5, 0x86, 0xa7, 0x33, 0xae, 0x03, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, + 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x94, 0x52, 0xc1, 0x6e, 0xdb, 0x30, 0x0c, 0xbd, 0xfb, + 0x2b, 0xb8, 0x0c, 0x18, 0x6c, 0x20, 0x4b, 0xee, 0xca, 0x56, 0x60, 0x48, 0x0e, 0x3d, 0xed, 0xd0, 0xee, 0x36, 0x0c, 0x89, 0x2c, 0x51, 0x8e, 0x00, 0x99, 0x72, 0x25, 0xaa, 0x49, 0x30, 0xe4, 0xdf, + 0x07, 0xc9, 0xa9, 0x9b, 0x00, 0xd9, 0xa1, 0x3c, 0x18, 0x36, 0xf9, 0x48, 0xbe, 0xf7, 0xcc, 0x14, 0x11, 0xa4, 0x62, 0x7b, 0xdc, 0x1e, 0xb0, 0x15, 0xe2, 0x80, 0xed, 0xaa, 0xaa, 0x96, 0xcb, 0x25, + 0x3c, 0x25, 0x02, 0x95, 0x22, 0xfb, 0x1e, 0x94, 0x27, 0x63, 0xbb, 0x14, 0x24, 0x5b, 0x4f, 0x20, 0x23, 0x0c, 0x32, 0x30, 0x78, 0x03, 0xbc, 0x47, 0x90, 0xc3, 0xe0, 0xac, 0x1a, 0x4b, 0x6d, 0xb2, + 0x4e, 0x5b, 0xea, 0xca, 0x80, 0x21, 0x78, 0x85, 0x31, 0x2e, 0xf2, 0x47, 0x49, 0xfc, 0xda, 0xdb, 0x08, 0x26, 0x91, 0x2a, 0xd8, 0xb8, 0xf7, 0xc9, 0xe9, 0x3c, 0x9b, 0xa5, 0x25, 0x90, 0xce, 0xdd, + 0x5f, 0x67, 0x7c, 0x80, 0x93, 0x4f, 0xe1, 0xbd, 0xf3, 0x6a, 0xe3, 0xfb, 0xf0, 0xdd, 0x6e, 0x17, 0x52, 0xe4, 0xf2, 0x6e, 0x68, 0x9a, 0x81, 0xb5, 0x32, 0x9d, 0x80, 0x2f, 0x7d, 0x62, 0x28, 0x02, + 0x9f, 0x31, 0xbc, 0x5a, 0x85, 0xeb, 0x52, 0x6f, 0xe0, 0x6f, 0x69, 0xc8, 0xe1, 0x90, 0x41, 0xb7, 0x5b, 0x1d, 0xec, 0x2b, 0x06, 0xf8, 0x0e, 0xfd, 0x69, 0xab, 0xdb, 0xba, 0x59, 0x4d, 0x00, 0x65, + 0xba, 0x85, 0x96, 0x2c, 0xeb, 0x09, 0xb5, 0x50, 0xce, 0x13, 0xd6, 0xcd, 0x05, 0x74, 0x7e, 0x23, 0x72, 0xa5, 0x18, 0x29, 0x93, 0x07, 0x25, 0x09, 0xb2, 0xd3, 0x13, 0x2d, 0x0d, 0x01, 0xa3, 0x4f, + 0x41, 0x61, 0x04, 0x4b, 0xb7, 0x02, 0xef, 0x8b, 0x1a, 0x52, 0x0b, 0x32, 0x9e, 0x48, 0x65, 0x79, 0x96, 0x34, 0x1e, 0xeb, 0x89, 0x5a, 0xc0, 0x17, 0x01, 0x8f, 0xcc, 0xc3, 0x13, 0xbe, 0x24, 0x8c, + 0x3c, 0x9f, 0x2a, 0x23, 0x51, 0x31, 0x6a, 0xdf, 0x48, 0x96, 0xdf, 0x36, 0xed, 0xa6, 0xe4, 0x1e, 0x46, 0x50, 0x03, 0x5f, 0x1f, 0x2e, 0xad, 0x71, 0xf0, 0x14, 0xf1, 0xca, 0x92, 0xeb, 0xb4, 0x10, + 0x3f, 0xfd, 0xda, 0x13, 0x23, 0x71, 0xdd, 0x5c, 0xe4, 0x66, 0x4a, 0x1f, 0xf2, 0xba, 0xf8, 0xec, 0x3b, 0x21, 0x2c, 0x19, 0xff, 0xa9, 0x9e, 0xad, 0x2f, 0x9d, 0x96, 0x3a, 0x88, 0x23, 0x78, 0xd6, + 0xac, 0xaa, 0x1b, 0xb7, 0x1f, 0x25, 0x69, 0x87, 0x61, 0x84, 0x0a, 0xa1, 0xd1, 0xc8, 0xe4, 0xb8, 0x98, 0x7e, 0x1e, 0x2f, 0xf5, 0x07, 0x01, 0x1e, 0x65, 0x3f, 0x38, 0x7c, 0xbb, 0xc9, 0xe9, 0x54, + 0x6e, 0x4f, 0x29, 0x72, 0x48, 0x8a, 0x53, 0xc0, 0x45, 0xf5, 0xf9, 0xb7, 0xc6, 0x6c, 0x43, 0xbd, 0xce, 0xbf, 0xb0, 0xf9, 0x53, 0xb4, 0x8c, 0x75, 0xb8, 0xd9, 0x78, 0x61, 0x9d, 0xcb, 0x24, 0x7b, + 0x14, 0xf0, 0xcc, 0x99, 0xee, 0x3c, 0x2f, 0xb7, 0xfd, 0xe0, 0x60, 0x33, 0x12, 0x2a, 0x77, 0x7a, 0xaf, 0xd3, 0x10, 0x4c, 0x9c, 0x8b, 0xd7, 0x77, 0x30, 0xc5, 0xec, 0xff, 0xe4, 0x73, 0x5c, 0x6f, + 0x16, 0xc2, 0x04, 0xdf, 0xd7, 0xb3, 0x83, 0x0f, 0x4e, 0xcf, 0x9a, 0xf9, 0x04, 0x3c, 0x57, 0xe3, 0xf3, 0x5c, 0xfd, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x4c, 0xb7, 0x30, 0xd8, + 0xc1, 0x01, 0x00, 0x00, 0xd4, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0xac, 0x53, + 0x41, 0x6b, 0xdb, 0x4c, 0x10, 0xbd, 0xeb, 0x57, 0x8c, 0x1d, 0xf8, 0xbe, 0xdd, 0xa2, 0x2a, 0xf7, 0x71, 0x9d, 0x42, 0xd2, 0xd2, 0x94, 0x52, 0x0a, 0x6d, 0x6e, 0x69, 0x10, 0x6b, 0x69, 0x64, 0x8b, + 0x48, 0xbb, 0xf2, 0xee, 0x08, 0xc5, 0x18, 0xfd, 0xf7, 0xb2, 0x2b, 0x45, 0xb6, 0x43, 0x53, 0xd2, 0x92, 0xbd, 0xd8, 0x33, 0x7e, 0x33, 0xef, 0xcd, 0x9b, 0x71, 0xeb, 0x08, 0x32, 0xab, 0x98, 0x10, + 0x33, 0xa3, 0x8b, 0x72, 0x8d, 0x78, 0xad, 0x74, 0x5e, 0x91, 0xbd, 0x0a, 0xe1, 0x22, 0xf2, 0x08, 0x95, 0x71, 0xf9, 0x90, 0x76, 0xb4, 0x42, 0xdc, 0x6f, 0x98, 0x1b, 0xc4, 0xaf, 0xc4, 0x1b, 0x93, + 0xc7, 0xd0, 0xd1, 0x2a, 0x86, 0x6b, 0xe6, 0xe6, 0x3b, 0x6d, 0x5b, 0x72, 0xfc, 0x18, 0xb8, 0xc6, 0x68, 0x47, 0xfd, 0x50, 0x5e, 0x99, 0x35, 0x62, 0xa9, 0x0b, 0xb3, 0x88, 0xa2, 0xf3, 0x73, 0xf8, + 0x5c, 0x37, 0x15, 0xd5, 0xa4, 0x19, 0x76, 0xa6, 0xb5, 0x50, 0xb4, 0x3a, 0xe3, 0xd2, 0xe8, 0xff, 0x9d, 0x07, 0x96, 0x19, 0x6c, 0xc8, 0x52, 0xd4, 0xb4, 0x2b, 0x50, 0x6e, 0xa7, 0x33, 0x28, 0x34, + 0x94, 0x3a, 0xa7, 0x07, 0x61, 0x69, 0x8b, 0xa7, 0x5c, 0xa3, 0x64, 0x08, 0xca, 0x3e, 0x28, 0x56, 0xef, 0x4e, 0xc4, 0x5f, 0x48, 0x78, 0x7b, 0x71, 0x22, 0x08, 0xf6, 0x11, 0x00, 0x80, 0xd7, 0x32, + 0x13, 0xf3, 0x3d, 0x9e, 0xbd, 0xef, 0xe7, 0x31, 0x58, 0xda, 0xca, 0xc5, 0xf0, 0x43, 0xe1, 0x83, 0xa4, 0x0e, 0xd3, 0x09, 0x09, 0xcb, 0x25, 0x0c, 0x93, 0x22, 0x7e, 0xfa, 0x78, 0x33, 0x56, 0xfb, + 0x77, 0xdc, 0x14, 0xf1, 0xdb, 0xbd, 0x90, 0xc9, 0xca, 0xe4, 0x3b, 0x51, 0x18, 0x5b, 0x2b, 0x9e, 0x89, 0xf9, 0x35, 0x55, 0x95, 0x81, 0x7d, 0x3f, 0xfb, 0xa9, 0xe7, 0x8f, 0x42, 0x13, 0xad, 0x6a, + 0x92, 0x32, 0x34, 0xe9, 0x81, 0xaa, 0x49, 0xcf, 0x8b, 0x3a, 0xde, 0x6c, 0x94, 0xbe, 0x77, 0x7f, 0x6a, 0x19, 0xf5, 0x51, 0x74, 0x76, 0x9b, 0x15, 0x6b, 0xc1, 0xe4, 0x58, 0xde, 0x45, 0xb5, 0xc9, + 0xc1, 0x7f, 0x75, 0x23, 0x8f, 0x5f, 0x86, 0x6b, 0x1b, 0xb2, 0x88, 0x6f, 0x16, 0x53, 0xe6, 0x78, 0xbb, 0x9e, 0x12, 0xf1, 0xd2, 0xe4, 0xbb, 0x18, 0xfc, 0xa6, 0xe3, 0x50, 0xdf, 0x2f, 0xa2, 0x80, + 0x2e, 0xf4, 0x48, 0x2b, 0x82, 0xb3, 0xcf, 0xd9, 0x7e, 0x34, 0xd5, 0x04, 0x41, 0xd4, 0xd4, 0x89, 0x13, 0x1c, 0x62, 0x4e, 0x85, 0x6a, 0x2b, 0x16, 0xd3, 0x00, 0xe1, 0xe3, 0xec, 0x76, 0x50, 0x64, + 0x19, 0xd1, 0xb3, 0xdf, 0x85, 0xec, 0x74, 0x0c, 0x6b, 0x62, 0x21, 0x8f, 0x28, 0x2a, 0x62, 0xbf, 0x34, 0x58, 0x06, 0xa9, 0x88, 0x37, 0xe4, 0x78, 0xbc, 0x10, 0xc4, 0x00, 0x4e, 0xd8, 0xa4, 0x7e, + 0x98, 0xd4, 0x0e, 0x69, 0x31, 0x6e, 0xfb, 0x50, 0xed, 0x1a, 0x58, 0x1e, 0xae, 0x2c, 0x9e, 0xa6, 0x94, 0x89, 0xea, 0x54, 0xc9, 0x07, 0xb8, 0x72, 0x8e, 0x2c, 0xa7, 0xb4, 0x9d, 0x09, 0x5f, 0x95, + 0x38, 0x56, 0xdc, 0x3a, 0x21, 0x07, 0xb7, 0x10, 0x7f, 0x84, 0xf8, 0xca, 0xe4, 0x7e, 0x87, 0x5f, 0xe4, 0x6f, 0x0b, 0xa7, 0x9c, 0x7f, 0xff, 0x5d, 0x06, 0xc7, 0x0b, 0x6b, 0xea, 0xe7, 0x8e, 0x67, + 0xde, 0x19, 0x5b, 0xe5, 0x73, 0x29, 0xe3, 0x93, 0xca, 0xc0, 0x1f, 0x4e, 0x44, 0x26, 0xca, 0xa5, 0x96, 0x0a, 0x21, 0x93, 0x56, 0x77, 0x56, 0x35, 0x42, 0x4e, 0xc8, 0x51, 0xc2, 0xcb, 0xac, 0x6d, + 0x8c, 0xfb, 0x0b, 0x6f, 0x07, 0xf4, 0xab, 0x9b, 0xfb, 0xc4, 0xd9, 0xa4, 0x74, 0xa9, 0x6b, 0xb3, 0x8c, 0x9c, 0x13, 0xf2, 0x5f, 0x0d, 0x7d, 0xf2, 0xdf, 0x79, 0x1d, 0x47, 0xfb, 0xe8, 0x57, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x76, 0xef, 0xae, 0xee, 0x06, 0x02, 0x00, 0x00, 0x3e, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x94, 0x52, 0xc1, 0x8a, 0xdb, 0x30, 0x10, 0xbd, 0xfb, 0x2b, 0x06, 0xf7, 0x22, 0x81, 0xeb, 0x24, 0x3d, 0xb4, 0xcb, 0xa4, 0x9b, 0xb2, 0x94, 0x85, 0x3d, + 0x14, 0xb2, 0xa4, 0xb9, 0x95, 0x62, 0x94, 0x78, 0x9c, 0x88, 0x38, 0x92, 0x19, 0xc9, 0xf6, 0x96, 0x24, 0xff, 0x5e, 0x6c, 0x99, 0xd4, 0x49, 0x4f, 0x3b, 0x17, 0xcd, 0x3c, 0xcd, 0xd3, 0x13, 0x6f, + 0xa6, 0x76, 0x04, 0x6a, 0xeb, 0xf5, 0x5b, 0xd6, 0xd2, 0x06, 0xf1, 0xd4, 0xd2, 0x26, 0x81, 0xa7, 0xaa, 0x4a, 0xe0, 0xc5, 0xfb, 0x6a, 0x45, 0xae, 0xb2, 0xc6, 0x51, 0xa8, 0x7e, 0x12, 0x37, 0xc4, + 0x97, 0x79, 0xd4, 0x91, 0xc8, 0x34, 0x59, 0x69, 0x77, 0x3b, 0x62, 0x50, 0x0e, 0xa8, 0xb4, 0xbb, 0x79, 0x14, 0x1d, 0x6d, 0x0e, 0x5b, 0x6b, 0x0a, 0xbd, 0x9b, 0xf7, 0xf9, 0x5e, 0x99, 0xbc, 0x24, + 0x9e, 0x47, 0xd1, 0x87, 0x5f, 0x23, 0x95, 0xa3, 0xd2, 0xe6, 0x77, 0xa4, 0xdc, 0x1f, 0xb3, 0x85, 0xc2, 0x40, 0x57, 0x0a, 0x09, 0x1f, 0x17, 0xe0, 0x7c, 0x8e, 0xa8, 0x2d, 0xe2, 0x8a, 0x5c, 0x5d, + 0xfa, 0xaf, 0x42, 0x2e, 0xe0, 0x14, 0x01, 0x40, 0x2f, 0x80, 0x58, 0xb0, 0x3d, 0x66, 0x64, 0x1a, 0x11, 0xca, 0x67, 0xd3, 0x20, 0xe6, 0x54, 0xa8, 0xba, 0xf4, 0x42, 0xa6, 0x43, 0x96, 0x15, 0xba, + 0xf4, 0xc4, 0x99, 0x65, 0x11, 0x6b, 0x53, 0xd8, 0x58, 0xca, 0x54, 0x1b, 0xed, 0x85, 0x9c, 0x47, 0xfd, 0x5b, 0x25, 0x79, 0xa8, 0x2c, 0x7b, 0x84, 0x7a, 0xf6, 0x19, 0x1e, 0xe1, 0xa8, 0xfc, 0x76, + 0x1f, 0xb4, 0xa9, 0x7b, 0xb1, 0x51, 0x2c, 0xe2, 0xd7, 0xe5, 0x6a, 0x1d, 0xcb, 0x41, 0xbd, 0x8b, 0xe5, 0x41, 0x34, 0x12, 0x1e, 0x17, 0xd0, 0xa4, 0x95, 0x62, 0x47, 0x42, 0xa6, 0xb5, 0x69, 0x59, + 0x55, 0x42, 0x26, 0xd7, 0xa6, 0x67, 0x66, 0x91, 0xf5, 0x5d, 0x0f, 0xd3, 0x87, 0x69, 0xc0, 0x2f, 0x83, 0xec, 0x64, 0x02, 0xdf, 0x99, 0x94, 0x27, 0xf0, 0x7b, 0x82, 0x97, 0xf5, 0xfa, 0x15, 0x5c, + 0xef, 0x68, 0x7f, 0xfb, 0xcf, 0x60, 0x44, 0x43, 0xad, 0x38, 0x9f, 0x47, 0xda, 0x4f, 0x55, 0x15, 0x50, 0x79, 0x85, 0xba, 0x48, 0x7b, 0xf9, 0xb1, 0xb1, 0x3a, 0xcf, 0x4b, 0x6a, 0x15, 0x13, 0xe2, + 0x8f, 0x7e, 0x38, 0x23, 0x7f, 0xee, 0xb8, 0x61, 0x4e, 0x35, 0x93, 0x08, 0x19, 0xe2, 0x15, 0xb9, 0xeb, 0x64, 0x5b, 0x7b, 0x12, 0xf1, 0x24, 0x4e, 0xa0, 0x57, 0xd9, 0x51, 0xe7, 0xb6, 0xb7, 0x62, + 0x18, 0x2f, 0xa2, 0x36, 0x39, 0xbd, 0xdd, 0x0b, 0xdc, 0xd3, 0x2a, 0xeb, 0xde, 0xc1, 0xbb, 0xc1, 0xba, 0x88, 0x27, 0x7b, 0x52, 0xa5, 0xdf, 0x4f, 0x4e, 0x19, 0x0a, 0x26, 0x95, 0x6b, 0x43, 0xce, + 0x9d, 0x4b, 0xdd, 0x50, 0x97, 0xc8, 0x4b, 0x9c, 0xfc, 0xc7, 0xb9, 0xfd, 0xee, 0x78, 0xa3, 0x11, 0x97, 0x07, 0x79, 0x4b, 0x08, 0xdf, 0xb8, 0x84, 0x23, 0xdd, 0x68, 0x93, 0x0b, 0x11, 0xcf, 0x3e, + 0x7d, 0x49, 0xa7, 0xe9, 0x34, 0x9d, 0xc5, 0x49, 0xbf, 0x33, 0x52, 0x7e, 0x0b, 0xf7, 0xad, 0xe5, 0x03, 0xb1, 0x13, 0xb3, 0xa1, 0x9f, 0x6b, 0x33, 0x4c, 0x27, 0x55, 0xad, 0xd2, 0x3e, 0xba, 0x44, + 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x90, 0xa7, 0xfe, 0xff, 0xbf, 0x01, 0x00, 0x00, 0x5c, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, + 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0xcc, 0x31, 0x0a, 0x02, 0x41, 0x0c, 0x85, 0xe1, 0x3e, + 0xa7, 0x48, 0x2d, 0xd8, 0x58, 0xd9, 0xcc, 0x49, 0x44, 0x42, 0x58, 0x33, 0x6e, 0x20, 0x66, 0x25, 0xc9, 0x32, 0xe8, 0xe9, 0x65, 0x2c, 0xb4, 0xfd, 0x1f, 0xdf, 0x8b, 0x6d, 0x2b, 0x6c, 0x58, 0xb1, + 0x0b, 0xc0, 0xe5, 0x70, 0x05, 0xf5, 0x9b, 0x78, 0x51, 0xd6, 0xcb, 0x04, 0x1b, 0xe6, 0x93, 0x17, 0xf9, 0x45, 0x7d, 0xcf, 0x76, 0x82, 0x65, 0xe5, 0x48, 0x99, 0x70, 0xaf, 0x7e, 0x3c, 0x43, 0x85, + 0x3e, 0xa8, 0x82, 0xd5, 0xd4, 0xef, 0x34, 0x56, 0x2d, 0xf9, 0x42, 0x6c, 0xd8, 0xd9, 0x72, 0x1e, 0xa4, 0x44, 0x51, 0x57, 0x67, 0x23, 0x97, 0x61, 0xea, 0xff, 0xf1, 0x13, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5c, 0x90, 0xcd, 0x6a, 0xc4, 0x30, 0x0c, 0x84, 0xef, 0x7a, 0x8a, 0x2c, 0xbe, 0x05, 0xd6, 0xba, 0xf4, + 0x05, 0xfa, 0xb3, 0xd0, 0x2d, 0xa5, 0x14, 0x52, 0x7a, 0x2d, 0x8a, 0xad, 0x66, 0xbd, 0x38, 0x8e, 0x91, 0xd5, 0x2c, 0x7d, 0xfb, 0x92, 0xc4, 0x2d, 0x65, 0x2f, 0xc2, 0xf3, 0x31, 0x96, 0x86, 0x79, + 0x3c, 0x3c, 0xbf, 0xda, 0xd1, 0x83, 0x92, 0x0c, 0xac, 0x08, 0x3b, 0x3b, 0xce, 0x09, 0x2f, 0x42, 0x39, 0xb3, 0xe0, 0x48, 0x33, 0xa7, 0x7d, 0x55, 0xf6, 0x4c, 0x02, 0xbb, 0xb6, 0xc5, 0x22, 0x0e, + 0x47, 0x0a, 0x09, 0xdb, 0x16, 0xff, 0xfe, 0x55, 0xae, 0x5c, 0xf4, 0x3f, 0x07, 0x63, 0x4c, 0xd3, 0xbd, 0x75, 0x8d, 0x31, 0x06, 0x2c, 0x65, 0xfd, 0x18, 0x38, 0xb1, 0x90, 0xb2, 0x07, 0xeb, 0x22, + 0x95, 0x92, 0x49, 0x4f, 0x60, 0x3f, 0xc9, 0xe9, 0x24, 0xdf, 0x9b, 0xc8, 0x32, 0x9d, 0xd9, 0x29, 0xd8, 0xc2, 0xaa, 0x21, 0x0d, 0x05, 0x6c, 0xc9, 0x12, 0xd2, 0x70, 0xc7, 0x94, 0x16, 0xa1, 0xe5, + 0x66, 0xef, 0xc8, 0x9d, 0x78, 0xdb, 0x7f, 0x4c, 0xca, 0x31, 0x86, 0xa7, 0xe6, 0xf8, 0x70, 0xb8, 0xdd, 0x2e, 0x05, 0xcf, 0x04, 0xad, 0x0d, 0x97, 0xb2, 0xcc, 0x31, 0x2e, 0x33, 0xcb, 0x66, 0x7f, + 0x61, 0x5d, 0x17, 0xad, 0x4e, 0x4c, 0x7d, 0x3d, 0x87, 0x59, 0xc2, 0x4c, 0xca, 0xb8, 0xb0, 0xfe, 0x2b, 0x44, 0x8f, 0x80, 0x3e, 0x14, 0x5d, 0x41, 0x7d, 0xd8, 0xd4, 0xef, 0x07, 0x21, 0x1f, 0x19, + 0xa1, 0x7a, 0xae, 0x2b, 0xb9, 0xc2, 0xbf, 0x8d, 0x54, 0xbc, 0x26, 0x78, 0xef, 0x9a, 0xfb, 0xc9, 0xf3, 0x16, 0x75, 0x2e, 0x6e, 0xf2, 0x8c, 0xf0, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, + 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, + 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x46, 0x91, 0xce, 0x1b, 0x18, + 0x2d, 0x77, 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0x9d, 0x7e, + 0x98, 0x21, 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, + 0xe8, 0x04, 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, + 0x67, 0x51, 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, + 0x42, 0x21, 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x17, + 0x67, 0x43, 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xb9, 0xfa, 0x65, 0x30, 0x28, 0xcb, 0xd2, 0x67, 0x16, 0xb2, 0x2f, + 0x69, 0x3d, 0x48, 0xab, 0xcd, 0x6a, 0x70, 0x37, 0xbe, 0x1d, 0x4d, 0xe6, 0xa3, 0xcb, 0x4f, 0xfe, 0x95, 0x3b, 0xb6, 0x10, 0x29, 0x2a, 0x05, 0x84, 0xff, 0x2b, 0x38, 0x61, 0x0c, 0xcb, 0x2d, 0xb0, + 0x3c, 0x4f, 0x79, 0xc4, 0x96, 0x29, 0x42, 0xca, 0x4a, 0xcb, 0xcf, 0x9a, 0x10, 0x63, 0xd0, 0xd2, 0xc0, 0x2e, 0x89, 0x6b, 0x2e, 0xd6, 0x7d, 0x50, 0x72, 0xa5, 0x4b, 0x46, 0x68, 0xcc, 0xc4, 0x5c, + 0x69, 0xe2, 0xcb, 0x42, 0x1f, 0xb0, 0x56, 0x83, 0xe4, 0xea, 0x60, 0x83, 0x14, 0xc0, 0x04, 0x74, 0x83, 0x39, 0x8c, 0xe7, 0x5d, 0xf8, 0x35, 0x98, 0x8f, 0xe7, 0x7d, 0x63, 0xe4, 0x69, 0xfc, 0xf0, + 0xdb, 0x74, 0xf1, 0x00, 0x4f, 0x41, 0x18, 0x06, 0x93, 0x87, 0xf1, 0x68, 0x0e, 0xd3, 0x10, 0x6e, 0xa7, 0x93, 0xe1, 0xf8, 0x61, 0x3c, 0x9d, 0xcc, 0x61, 0xfa, 0x19, 0x82, 0xc9, 0x17, 0xf8, 0xcf, + 0x78, 0x32, 0xec, 0x03, 0x72, 0x9d, 0x20, 0x01, 0xbe, 0x98, 0xe4, 0x2a, 0x03, 0x93, 0x1b, 0x3e, 0x31, 0xb6, 0xe4, 0xcd, 0x11, 0x0f, 0x20, 0xac, 0x64, 0x05, 0x49, 0xe5, 0x18, 0xf1, 0x15, 0x8f, + 0x20, 0x65, 0x62, 0x5d, 0xb0, 0x35, 0xc2, 0x5a, 0x6e, 0x90, 0x04, 0x17, 0x6b, 0xc8, 0x91, 0x32, 0xae, 0x4c, 0x5e, 0x15, 0x30, 0x11, 0x1b, 0x33, 0x29, 0xcf, 0xb8, 0x66, 0xda, 0x4e, 0x9d, 0xc4, + 0x65, 0x1c, 0x0d, 0x3a, 0x3c, 0xcb, 0x25, 0x69, 0xf8, 0x83, 0x6d, 0x98, 0x2f, 0x50, 0xfb, 0x17, 0xd7, 0x07, 0x53, 0x5c, 0x1e, 0xcf, 0x08, 0x2e, 0xfd, 0x28, 0x61, 0x42, 0x60, 0xaa, 0x8e, 0xd7, + 0x0a, 0xcd, 0x53, 0x7f, 0x46, 0x32, 0x47, 0xd2, 0x1c, 0xd5, 0x75, 0xa7, 0x93, 0x17, 0xcb, 0x94, 0x47, 0x10, 0xa5, 0x4c, 0x29, 0xb8, 0x67, 0x1b, 0x14, 0x4f, 0xc4, 0xf2, 0x1c, 0x69, 0x28, 0x4b, + 0x91, 0x4a, 0x66, 0x30, 0x7d, 0xef, 0x74, 0x4c, 0xf6, 0x73, 0xe2, 0x1b, 0xa6, 0x11, 0x94, 0x41, 0x1c, 0xc1, 0xca, 0x56, 0xf9, 0x5c, 0x93, 0x89, 0xed, 0x29, 0x0c, 0x66, 0xb3, 0x51, 0xf8, 0xfc, + 0x38, 0x0a, 0xe7, 0xe3, 0xe9, 0x04, 0x6e, 0xa0, 0x7b, 0xe5, 0xff, 0xdd, 0xff, 0x47, 0xf7, 0xda, 0x1e, 0x1d, 0x5c, 0x5c, 0xd8, 0xff, 0xe1, 0x02, 0x86, 0xb8, 0x62, 0x45, 0xaa, 0x61, 0x11, 0xde, + 0x99, 0x8c, 0xc7, 0xce, 0x8d, 0x0d, 0x3c, 0x33, 0xfe, 0x2f, 0xcb, 0x0a, 0x80, 0xff, 0x07, 0x23, 0x58, 0x91, 0xcc, 0xfa, 0xc0, 0x57, 0x20, 0x24, 0x7c, 0xa8, 0xf7, 0x2e, 0x28, 0xfd, 0x60, 0x92, + 0x9e, 0x93, 0xdc, 0xf0, 0xd8, 0x66, 0xc4, 0xda, 0x1e, 0xfc, 0x29, 0xcc, 0xe1, 0xe8, 0x73, 0xb0, 0xb8, 0x7b, 0x78, 0x1e, 0x4e, 0x9f, 0x26, 0x77, 0xd3, 0x60, 0xf8, 0x6c, 0x50, 0xdc, 0x40, 0xb7, + 0x2e, 0x6c, 0xc2, 0x5c, 0xfa, 0x16, 0x45, 0xb3, 0xbe, 0xed, 0xc4, 0xa7, 0x01, 0x97, 0x03, 0xcd, 0xbe, 0x31, 0xe2, 0x83, 0x03, 0x9c, 0x83, 0x6e, 0xe5, 0x1e, 0x00, 0x3e, 0x9e, 0xf0, 0xf0, 0x11, + 0xba, 0x87, 0xbb, 0x2f, 0xbb, 0xed, 0xbb, 0x4c, 0xb4, 0xdd, 0xeb, 0xce, 0x31, 0x5b, 0x33, 0x66, 0x3a, 0x57, 0xb6, 0xb0, 0x93, 0xef, 0xb2, 0x68, 0x1b, 0xbf, 0x0f, 0x65, 0xc2, 0xa3, 0x04, 0x32, + 0xab, 0x4a, 0x91, 0x14, 0xae, 0xa9, 0x1b, 0x9c, 0x81, 0x3b, 0xb2, 0x05, 0x2d, 0x6b, 0xfb, 0x46, 0x3c, 0xb8, 0x50, 0x1a, 0x59, 0x5c, 0xb7, 0x7e, 0xec, 0x12, 0x24, 0x05, 0xbe, 0x9f, 0xd8, 0xfb, + 0xe0, 0x71, 0x34, 0x79, 0xae, 0xe3, 0x9a, 0x85, 0xd3, 0xd9, 0x28, 0x34, 0x1d, 0xf6, 0x3c, 0x0b, 0x1e, 0x7e, 0x83, 0x9b, 0x1d, 0x43, 0x66, 0x74, 0xfd, 0x6c, 0x23, 0x06, 0x35, 0x7b, 0xe7, 0xa2, + 0x3a, 0x47, 0x46, 0x99, 0x20, 0xe1, 0x99, 0x6a, 0x29, 0x79, 0x9a, 0xc2, 0x12, 0x41, 0xb1, 0x8d, 0xd5, 0x93, 0x1f, 0xc5, 0xff, 0xef, 0x20, 0xfc, 0xab, 0xc0, 0xdb, 0xd3, 0x37, 0x61, 0x19, 0xd6, + 0xbc, 0xee, 0xd8, 0xaf, 0x12, 0xa5, 0x12, 0x59, 0xa4, 0xb1, 0x41, 0x5b, 0xa8, 0x4a, 0xfc, 0x8c, 0x50, 0x10, 0x8f, 0xf1, 0x20, 0x0b, 0xbb, 0xfe, 0x28, 0x28, 0xdd, 0xa9, 0x4c, 0xed, 0xf4, 0xdd, + 0xe1, 0xb9, 0x84, 0x7c, 0x79, 0x9e, 0x04, 0xf7, 0xa3, 0x5d, 0x98, 0xae, 0xf8, 0x9d, 0xb5, 0x05, 0xa5, 0x75, 0x04, 0x4e, 0x14, 0x9c, 0xa5, 0x8d, 0xe4, 0x31, 0x64, 0x8c, 0x0b, 0xcf, 0x59, 0x63, + 0xb4, 0x56, 0xbf, 0x7f, 0xed, 0xc1, 0xf7, 0x1d, 0x3b, 0xf3, 0xad, 0xd2, 0x98, 0xf9, 0xb2, 0xd0, 0x7e, 0x4e, 0x5c, 0xe8, 0x54, 0x78, 0xdd, 0x4b, 0x68, 0x48, 0x88, 0xd2, 0x8c, 0x34, 0xc6, 0xf6, + 0xfa, 0x72, 0xe3, 0xb3, 0xb9, 0xae, 0x96, 0x4c, 0xe1, 0x90, 0x13, 0x46, 0x5a, 0xd2, 0x16, 0x6e, 0x40, 0x60, 0x69, 0x17, 0x3c, 0xeb, 0xe3, 0xea, 0x6b, 0x63, 0x7f, 0xbb, 0x8f, 0x85, 0x32, 0x88, + 0x8c, 0x19, 0x88, 0x6b, 0x3b, 0xbf, 0x80, 0x69, 0xb2, 0x03, 0xd3, 0xfe, 0x1a, 0x75, 0xb0, 0x54, 0x32, 0x2d, 0x34, 0x9a, 0x32, 0xf2, 0x7a, 0x3d, 0x17, 0xab, 0xcd, 0xd8, 0x00, 0xc6, 0xab, 0xb7, + 0x7b, 0x0c, 0x5f, 0xb8, 0xd2, 0xaa, 0x0f, 0x64, 0x3a, 0x85, 0x6b, 0x23, 0xe0, 0x10, 0x25, 0x18, 0x7d, 0x33, 0xe2, 0xc4, 0x77, 0x1d, 0xa7, 0xcc, 0x3d, 0x5a, 0x28, 0x2d, 0xb3, 0xa6, 0xf1, 0x3d, + 0xc3, 0x90, 0x33, 0x62, 0x19, 0xea, 0x5d, 0xf2, 0x6a, 0x22, 0xb2, 0x86, 0xf4, 0x3a, 0x81, 0xde, 0xda, 0x85, 0x06, 0x27, 0x07, 0x11, 0xf5, 0xdf, 0xee, 0xb9, 0x26, 0x71, 0x55, 0xd6, 0x4c, 0x01, + 0xdd, 0xb4, 0x2a, 0xe0, 0x7e, 0x2b, 0x5f, 0x79, 0xe7, 0x80, 0xf8, 0x15, 0x03, 0x5e, 0xaf, 0x99, 0xf7, 0x1a, 0xfe, 0x58, 0xe4, 0x85, 0x9e, 0x6b, 0x42, 0x96, 0x9d, 0x8d, 0xa4, 0xb9, 0xe7, 0x06, + 0x44, 0x91, 0xa6, 0xd7, 0x07, 0x76, 0x34, 0x6d, 0x8f, 0x2c, 0x9b, 0xf1, 0x4e, 0x6b, 0x8e, 0xa2, 0xc6, 0xec, 0xd9, 0x40, 0x7a, 0xd7, 0x27, 0x4e, 0xf6, 0x37, 0x62, 0x9b, 0x3f, 0x33, 0x5d, 0xb9, + 0xd8, 0x4f, 0x78, 0x2d, 0x56, 0xda, 0x8f, 0xfa, 0xa6, 0x03, 0xce, 0x82, 0x69, 0x00, 0x6e, 0xb1, 0x58, 0xa5, 0xec, 0x8c, 0xdd, 0x35, 0xea, 0xda, 0x92, 0x77, 0xb6, 0xbf, 0xfb, 0xc6, 0xc6, 0x91, + 0xe5, 0x57, 0x88, 0x98, 0x8e, 0x12, 0xf0, 0xc6, 0xd3, 0x91, 0x7d, 0x2d, 0x9a, 0x97, 0x26, 0x1e, 0xa7, 0x15, 0xce, 0xb6, 0xdc, 0x28, 0x0c, 0xa7, 0x21, 0x98, 0xb0, 0x4c, 0x59, 0x7d, 0x30, 0xbd, + 0xf6, 0xb6, 0xfc, 0x7f, 0x84, 0xee, 0x87, 0xee, 0x09, 0x08, 0x2b, 0x50, 0x69, 0x5b, 0xce, 0xdb, 0x2b, 0x01, 0xde, 0xae, 0xcf, 0x66, 0x41, 0xfc, 0x54, 0xd5, 0x57, 0x5b, 0x48, 0xf5, 0x78, 0x87, + 0x19, 0x3f, 0x4a, 0xa5, 0xc2, 0xb6, 0x4c, 0x9b, 0xf1, 0x7a, 0x32, 0xfb, 0x7e, 0x5e, 0xc1, 0x69, 0xce, 0x5a, 0x48, 0x42, 0xf0, 0x7d, 0xff, 0xd4, 0x56, 0xa7, 0xfd, 0xaf, 0xd7, 0x77, 0x4a, 0xae, + 0xc9, 0x8c, 0x79, 0x3b, 0x55, 0x52, 0x58, 0xd5, 0xc0, 0xa1, 0xe0, 0xc8, 0x42, 0xe7, 0x85, 0x7e, 0x53, 0x62, 0x4e, 0x45, 0xf3, 0x58, 0x74, 0xea, 0x8b, 0xb2, 0x77, 0x20, 0x21, 0x3f, 0xed, 0x6d, + 0xdb, 0x2a, 0x65, 0x84, 0xc2, 0xfe, 0xe5, 0xf5, 0xce, 0xaa, 0xc8, 0x9f, 0x1c, 0xcb, 0xbe, 0xc5, 0x9c, 0x5a, 0x8e, 0x9d, 0x61, 0xe2, 0x6c, 0xda, 0x77, 0xe5, 0x1b, 0x11, 0x32, 0xf3, 0x9d, 0xe1, + 0x78, 0xd8, 0x5f, 0x1e, 0x55, 0x41, 0xbf, 0x01, 0xe5, 0x84, 0x94, 0xf6, 0xfa, 0xfe, 0xa1, 0x94, 0x69, 0x59, 0x25, 0xec, 0xd0, 0xfd, 0xc9, 0xc5, 0x55, 0x1b, 0x3c, 0x6d, 0x94, 0xfa, 0xb9, 0x60, + 0x8e, 0x7e, 0x26, 0x99, 0x2d, 0xc2, 0x3b, 0xaf, 0xa0, 0xb4, 0xdf, 0xb0, 0x78, 0x04, 0xb4, 0x0d, 0xd4, 0x50, 0x0a, 0x3c, 0x0e, 0xc8, 0xed, 0xc3, 0x17, 0xae, 0xbd, 0xab, 0xc6, 0xda, 0xae, 0xea, + 0x1f, 0x12, 0x92, 0xa5, 0xfd, 0xac, 0x3b, 0xa9, 0xf9, 0x33, 0x3a, 0x42, 0x24, 0x69, 0x87, 0x98, 0x8b, 0xf5, 0xb1, 0x4b, 0xac, 0x76, 0xcf, 0x35, 0x8b, 0xbe, 0x3d, 0x10, 0x8b, 0x4e, 0x7a, 0xb1, + 0x89, 0xe9, 0x6f, 0x4d, 0x4c, 0x9d, 0xea, 0x5f, 0xfb, 0xdf, 0xd1, 0xbb, 0xc8, 0xbe, 0x66, 0xda, 0x68, 0xda, 0x5f, 0x93, 0xd5, 0xaf, 0x7e, 0xd5, 0x27, 0x31, 0x2a, 0xcd, 0x85, 0xfd, 0x46, 0xeb, + 0x81, 0x36, 0x31, 0x2a, 0xd8, 0xb7, 0xf7, 0xf7, 0x46, 0xdd, 0x83, 0xe7, 0xf0, 0xac, 0x51, 0xa3, 0xd8, 0x78, 0xdd, 0xfb, 0xc7, 0xc9, 0xd3, 0xf3, 0x62, 0x3e, 0x0a, 0x8d, 0x2a, 0x77, 0x7b, 0xb5, + 0x2c, 0xc1, 0xcf, 0x3f, 0x43, 0xdb, 0xce, 0x59, 0x30, 0x9f, 0x3f, 0x4d, 0xc3, 0xe1, 0x7e, 0xe7, 0x09, 0x8f, 0x0e, 0xa2, 0x42, 0x12, 0xe6, 0x65, 0x79, 0xd3, 0x6a, 0x67, 0xef, 0xf1, 0x90, 0xad, + 0x28, 0x61, 0xf4, 0xfb, 0x57, 0xc8, 0x99, 0x52, 0xa5, 0xa4, 0xf8, 0xcc, 0xe9, 0x3d, 0x0a, 0x5f, 0xcb, 0xdb, 0x84, 0x51, 0x40, 0xc4, 0xb6, 0xc7, 0xcc, 0x07, 0x85, 0x4e, 0x50, 0x68, 0x1e, 0x31, + 0x2d, 0xc9, 0x57, 0xa8, 0xdd, 0x67, 0x9d, 0x67, 0x94, 0xe4, 0x60, 0xd1, 0x6b, 0x6b, 0xd9, 0x7f, 0x4d, 0xdd, 0x5b, 0xf7, 0x64, 0x25, 0x27, 0xa9, 0x31, 0x32, 0x9f, 0xf1, 0x33, 0x87, 0xb3, 0x61, + 0xcd, 0x30, 0x6e, 0xdb, 0xb1, 0x6d, 0xa5, 0xd5, 0x91, 0x19, 0x84, 0xba, 0x20, 0x51, 0x5d, 0xe0, 0xed, 0x27, 0x6b, 0x42, 0xfb, 0x3b, 0x72, 0x5a, 0x44, 0xff, 0x48, 0x92, 0x4f, 0xca, 0xcd, 0x0c, + 0xf3, 0xa2, 0x2e, 0x71, 0xa9, 0xb8, 0xae, 0x55, 0xd5, 0x35, 0x60, 0x95, 0xb9, 0xc6, 0x99, 0x10, 0x59, 0x6c, 0x9a, 0xe5, 0xd7, 0xad, 0xc6, 0xdb, 0xea, 0x6b, 0x1d, 0x68, 0x19, 0xed, 0x37, 0xd0, + 0x32, 0x82, 0x1b, 0xb8, 0xad, 0x3f, 0xe4, 0x05, 0x96, 0xee, 0xb7, 0xe7, 0x1c, 0xf8, 0x32, 0x47, 0xe1, 0xde, 0x3a, 0xbd, 0xa3, 0x77, 0xf5, 0xd4, 0x76, 0xbb, 0xbb, 0x0d, 0x57, 0x52, 0x35, 0x24, + 0xbe, 0xb9, 0xe4, 0x35, 0x8b, 0x7b, 0x6f, 0x61, 0x25, 0xed, 0xeb, 0xa2, 0xf6, 0xd7, 0xf3, 0x35, 0x31, 0xa1, 0x56, 0x48, 0xa6, 0x55, 0x3c, 0x5a, 0x46, 0x7d, 0xb8, 0xea, 0xc3, 0x9d, 0x14, 0x6b, + 0xff, 0x3e, 0xf8, 0xef, 0xf3, 0x63, 0x70, 0xb7, 0x18, 0x1d, 0x1d, 0x3f, 0xb9, 0x3a, 0x69, 0x19, 0x1d, 0x4e, 0xbe, 0x76, 0x3a, 0xaf, 0x9d, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0xe8, 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, 0x4d, 0x0a, 0xc2, 0x40, 0x0c, 0xc5, 0xf1, 0x7d, 0xef, 0x92, 0x17, 0xb1, 0xd8, 0x85, 0xe0, 0x31, 0x3c, 0x40, 0xaa, 0x83, 0x8d, 0x1f, 0x33, + 0x21, 0x8d, 0x0a, 0x9e, 0x5e, 0x9c, 0xe9, 0xa6, 0x3b, 0x77, 0xf9, 0xff, 0x20, 0xbc, 0xb3, 0xce, 0xe1, 0x3a, 0x3e, 0x43, 0x4b, 0x3e, 0xfa, 0xfd, 0x30, 0x45, 0xd8, 0xbc, 0x67, 0xf6, 0x64, 0x05, + 0x0f, 0x79, 0xa5, 0x0c, 0x31, 0x39, 0x4d, 0x09, 0xc5, 0x2f, 0x5c, 0x61, 0xcb, 0xbf, 0xb3, 0x69, 0x93, 0x25, 0xa8, 0x45, 0x8f, 0x01, 0xfd, 0x8a, 0xa8, 0x12, 0x8d, 0x9a, 0xf1, 0x51, 0xeb, 0xde, + 0x2e, 0x66, 0xc9, 0xff, 0x9e, 0xd3, 0xc2, 0x21, 0x37, 0x71, 0x6d, 0x40, 0xcb, 0x3f, 0x6f, 0xb0, 0xc3, 0xb0, 0x36, 0xaa, 0x86, 0xab, 0x78, 0xf7, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xd4, 0x57, 0x5b, 0x6f, 0x1b, 0xbb, 0x11, 0x7e, 0xe7, 0xaf, 0x98, 0x4a, 0x06, 0x9a, 0x08, 0xd2, 0x2a, 0x7e, 0xc8, 0x8b, 0xd0, + 0x04, 0x88, 0x15, 0x27, 0x51, 0x6a, 0xbb, 0x86, 0x2c, 0x27, 0x08, 0x10, 0xc0, 0x4b, 0x71, 0x67, 0xb5, 0x8c, 0x29, 0x72, 0xc1, 0xcb, 0x2a, 0x02, 0x8a, 0xfe, 0xf6, 0x62, 0xc8, 0x5d, 0x5d, 0x7c, + 0x69, 0x93, 0xf3, 0x74, 0x4e, 0x9e, 0x94, 0xe5, 0x5c, 0x38, 0xdf, 0x7c, 0xf3, 0x0d, 0xdd, 0x87, 0x0f, 0x41, 0x0b, 0x2f, 0x8d, 0x86, 0xda, 0x9a, 0x1f, 0x28, 0x3c, 0x63, 0x5f, 0x51, 0x09, 0xb3, + 0x46, 0xf0, 0x06, 0xb6, 0x26, 0x58, 0xd0, 0xb8, 0x79, 0x64, 0xf5, 0x37, 0xc6, 0x16, 0x95, 0x74, 0xe0, 0xf8, 0xba, 0x56, 0xd8, 0x7d, 0x05, 0x61, 0xb4, 0xe7, 0x52, 0x3b, 0xe0, 0xe0, 0xa4, 0x5e, + 0x29, 0x84, 0xb2, 0x73, 0x5c, 0x72, 0x87, 0x05, 0x18, 0x0d, 0x37, 0xb5, 0x95, 0x7a, 0x05, 0x53, 0x65, 0x42, 0xb1, 0x8b, 0x3b, 0x81, 0x1c, 0x45, 0x65, 0xb2, 0x73, 0x51, 0x99, 0xee, 0x5b, 0x3e, + 0x84, 0x4d, 0x25, 0x45, 0x05, 0x16, 0x7d, 0xb0, 0x14, 0x54, 0x03, 0x19, 0x81, 0x29, 0xc1, 0x57, 0x08, 0x05, 0xf7, 0x1c, 0x6a, 0xee, 0x28, 0x6e, 0x23, 0x79, 0x8a, 0x78, 0xde, 0xa0, 0xf6, 0x2e, + 0x63, 0xac, 0xdf, 0x87, 0x0b, 0x23, 0xb8, 0x02, 0xfc, 0x89, 0x22, 0x50, 0x3c, 0xc6, 0x2e, 0xf9, 0x3d, 0x82, 0x0b, 0x16, 0xc1, 0x57, 0xdc, 0x43, 0xfe, 0x99, 0x37, 0x1c, 0x4e, 0x4f, 0xe1, 0xe6, + 0xfd, 0x3f, 0x73, 0x90, 0x0e, 0xa4, 0x76, 0x9e, 0x2b, 0x85, 0x45, 0xc6, 0xd8, 0xc2, 0x80, 0xf3, 0xdc, 0x7a, 0x70, 0x68, 0x1b, 0xb4, 0xa0, 0x28, 0x98, 0xda, 0x82, 0x0d, 0x1a, 0xf2, 0x6c, 0xbc, + 0x6e, 0xf4, 0x06, 0x5c, 0x2c, 0x65, 0xb4, 0x34, 0xc6, 0x4f, 0x6c, 0xd0, 0x79, 0xc6, 0x16, 0x15, 0x82, 0x30, 0xeb, 0x35, 0xd7, 0x45, 0x72, 0x77, 0x50, 0x79, 0x5f, 0x77, 0x41, 0xe8, 0x33, 0x0f, + 0xde, 0xac, 0xb9, 0x97, 0x29, 0xdc, 0x86, 0x7b, 0x51, 0xa1, 0x83, 0xd2, 0x58, 0x10, 0x15, 0xd7, 0x2b, 0x74, 0x54, 0x9f, 0x33, 0xc1, 0x0a, 0x0a, 0x55, 0x60, 0xc6, 0x66, 0x47, 0xff, 0xdf, 0x99, + 0x11, 0x06, 0xe9, 0x37, 0x6c, 0xa4, 0x52, 0xb0, 0x8c, 0x7d, 0xa8, 0xf9, 0x8a, 0x7b, 0x2c, 0xa8, 0x7b, 0x36, 0x68, 0x4d, 0x50, 0xa7, 0xe4, 0x19, 0xcc, 0x3c, 0x70, 0xe5, 0x0c, 0x98, 0x1a, 0xb5, + 0x83, 0x02, 0x97, 0x61, 0xb5, 0xa2, 0xf3, 0xda, 0x58, 0x0f, 0xf9, 0xeb, 0x57, 0xaf, 0x5e, 0xe7, 0xcc, 0x19, 0xe0, 0xed, 0x11, 0x5a, 0x10, 0x5c, 0x53, 0x58, 0xee, 0x3d, 0x17, 0x15, 0x16, 0x20, + 0x4b, 0xd0, 0x88, 0x45, 0x07, 0x10, 0x61, 0xe1, 0xd1, 0x79, 0xf7, 0x24, 0x3a, 0x74, 0x92, 0xa7, 0x4e, 0x10, 0x2c, 0x39, 0x51, 0x21, 0x87, 0xe9, 0xc5, 0x8c, 0xb1, 0x99, 0xff, 0xbb, 0x03, 0x8b, + 0x84, 0x14, 0xea, 0x22, 0xdd, 0xd6, 0xa1, 0x87, 0xfc, 0xc3, 0xed, 0xd5, 0xf4, 0x6e, 0x7e, 0xfe, 0x71, 0x76, 0xb3, 0x98, 0x7f, 0xcb, 0x01, 0x75, 0x23, 0xad, 0xd1, 0x6b, 0xd4, 0x1e, 0x1a, 0x6e, + 0x25, 0x5f, 0x2a, 0xcc, 0x18, 0xcb, 0xf3, 0xdc, 0x55, 0xa8, 0x14, 0x38, 0x61, 0x65, 0xed, 0x59, 0x1f, 0x2c, 0xd6, 0x8a, 0x0b, 0x84, 0xff, 0x8c, 0xb3, 0x25, 0x77, 0x95, 0x15, 0xb0, 0xdc, 0x26, + 0xf6, 0x26, 0x43, 0x2b, 0xa0, 0x94, 0x0a, 0x0f, 0x2c, 0x0b, 0x23, 0xee, 0xd1, 0x66, 0xd2, 0x8c, 0x7f, 0x98, 0x4a, 0x17, 0x86, 0x40, 0xf4, 0x55, 0xf2, 0xb1, 0xb8, 0x92, 0xce, 0xdb, 0x2d, 0xc3, + 0x9f, 0x11, 0x9b, 0xa3, 0x5b, 0xbd, 0x79, 0xe4, 0xc9, 0x22, 0x2b, 0x7b, 0xbf, 0x66, 0xdc, 0x83, 0xb7, 0x6f, 0xf7, 0xd7, 0xa4, 0x52, 0x08, 0xa1, 0x3e, 0x9c, 0x05, 0xa9, 0x0a, 0xa9, 0x57, 0xed, + 0x60, 0x75, 0x24, 0x5a, 0xd2, 0xe7, 0x48, 0xfd, 0x7f, 0x4d, 0x67, 0x20, 0xd7, 0x7c, 0x85, 0x91, 0x2b, 0xd4, 0xfc, 0x6e, 0xb6, 0x32, 0x38, 0xdb, 0x42, 0x81, 0x25, 0x0f, 0xca, 0x0f, 0xc1, 0x93, + 0x7b, 0x22, 0x04, 0xf9, 0x02, 0x87, 0xcf, 0x5f, 0x2e, 0x93, 0xe7, 0x13, 0xd0, 0x51, 0x8c, 0xd6, 0x70, 0xd4, 0xc0, 0xa3, 0x7f, 0xfd, 0xf6, 0x2c, 0xba, 0xa7, 0xcb, 0x0e, 0x06, 0x57, 0xc6, 0xe3, + 0x60, 0x30, 0x81, 0x59, 0x49, 0x70, 0xc1, 0x86, 0x6b, 0x4f, 0x0d, 0x44, 0x4d, 0xed, 0x89, 0x37, 0xd3, 0xdc, 0xcb, 0x06, 0x93, 0xef, 0x30, 0x1a, 0x11, 0x6d, 0xa2, 0x51, 0x21, 0x7d, 0x34, 0x89, + 0x74, 0xc8, 0xb6, 0x7c, 0xad, 0xf2, 0xd8, 0x1a, 0x9a, 0x0d, 0x46, 0x1c, 0x88, 0x95, 0x19, 0xa5, 0xcc, 0x86, 0xb8, 0x19, 0x61, 0x41, 0x7b, 0xae, 0x9b, 0x1d, 0x01, 0x26, 0xb1, 0x0a, 0xf2, 0x64, + 0x31, 0xc1, 0xb9, 0x6e, 0xdc, 0x84, 0x01, 0x8c, 0x40, 0xf3, 0x35, 0x4e, 0xe0, 0xec, 0xfa, 0xee, 0xea, 0xdd, 0x62, 0xf6, 0xe5, 0xfc, 0x6e, 0x76, 0xf9, 0xee, 0xe3, 0x39, 0xa3, 0x3a, 0x1a, 0xae, + 0x02, 0x4e, 0xa0, 0xe7, 0x6d, 0xc0, 0xde, 0x1e, 0xf4, 0x79, 0x9a, 0x90, 0x07, 0x98, 0xdb, 0xa0, 0xdd, 0x0e, 0xe0, 0x1d, 0xb5, 0xa5, 0x06, 0xde, 0x09, 0x1c, 0x5a, 0x16, 0x48, 0xe0, 0xa2, 0x55, + 0x6a, 0x8a, 0xb0, 0x18, 0xe7, 0x8e, 0x2f, 0x4d, 0xf3, 0x2c, 0xd0, 0x36, 0xe8, 0x7d, 0xf2, 0xf7, 0x58, 0x2b, 0xb3, 0x7d, 0x9c, 0xfe, 0xb0, 0x77, 0xba, 0x80, 0x22, 0x9a, 0x1d, 0x35, 0x1c, 0xa4, + 0xf6, 0x06, 0x84, 0x0a, 0xce, 0xa3, 0x7d, 0x2e, 0x57, 0xeb, 0x37, 0x6a, 0xa0, 0x9f, 0xc6, 0xde, 0x5b, 0x49, 0x43, 0xed, 0x52, 0xec, 0xee, 0x1e, 0x7b, 0x69, 0x97, 0xba, 0x31, 0x82, 0x27, 0xa5, + 0x7c, 0x52, 0xa4, 0x1d, 0x70, 0x6a, 0x8b, 0x8b, 0x0d, 0x25, 0x7d, 0x31, 0xc1, 0xe3, 0xa1, 0xec, 0xc6, 0x31, 0xae, 0x51, 0xc8, 0x52, 0x8a, 0xdd, 0x65, 0x1d, 0xec, 0xa1, 0xca, 0xa7, 0x38, 0x5a, + 0x6c, 0x6b, 0xcc, 0x49, 0x52, 0xac, 0x5c, 0x06, 0x8f, 0x19, 0xfb, 0x10, 0xe9, 0x2c, 0x1d, 0xe0, 0xcf, 0xb8, 0x4d, 0x86, 0xd1, 0x74, 0x1f, 0x96, 0x94, 0x39, 0xa6, 0x8a, 0x04, 0x8a, 0x61, 0x68, + 0xe0, 0xf2, 0x03, 0xfe, 0x7f, 0x33, 0x21, 0x6a, 0x55, 0x81, 0xa5, 0xd4, 0x08, 0xeb, 0xa0, 0xbc, 0xac, 0x0f, 0xb6, 0x4f, 0x94, 0x76, 0x59, 0x60, 0xca, 0xd3, 0x6d, 0x3a, 0x42, 0xd7, 0x57, 0xa8, + 0x21, 0x38, 0x7c, 0xee, 0x7a, 0xfb, 0x3a, 0x0b, 0x59, 0x96, 0x68, 0xe9, 0x3e, 0x0f, 0x2a, 0xde, 0x1f, 0xec, 0x80, 0xca, 0xd8, 0xb4, 0x42, 0x71, 0x9f, 0x82, 0x3a, 0x2b, 0xc6, 0x6b, 0x2e, 0xf5, + 0xd8, 0x62, 0x92, 0x71, 0x37, 0xe6, 0x75, 0xad, 0x64, 0xc2, 0x3a, 0x23, 0xcd, 0x46, 0xeb, 0x25, 0xba, 0x76, 0x10, 0xba, 0xf1, 0xce, 0xbb, 0xdb, 0xcf, 0x29, 0xbf, 0xcd, 0x89, 0x7c, 0xa5, 0x5c, + 0x05, 0xcb, 0xdb, 0x1c, 0x57, 0xc6, 0x4b, 0xd1, 0xee, 0xb2, 0x6d, 0x8b, 0x40, 0xec, 0x34, 0xd5, 0x93, 0xd7, 0xdc, 0x57, 0xa3, 0xb8, 0x75, 0xf3, 0x58, 0x01, 0xf5, 0x20, 0xae, 0x25, 0x4c, 0x65, + 0x03, 0xd7, 0x5b, 0xc0, 0x08, 0xb0, 0xdf, 0xd6, 0x48, 0x82, 0x99, 0x7a, 0xb7, 0xed, 0xba, 0xb5, 0xa3, 0x1b, 0x85, 0x1a, 0xb2, 0xf2, 0x41, 0x9f, 0x26, 0xd0, 0x3b, 0xb9, 0x9d, 0x5f, 0x8c, 0xa9, + 0x19, 0xbd, 0x8c, 0xb5, 0x7d, 0xc4, 0xee, 0xd8, 0xc1, 0x12, 0x95, 0xd9, 0x0c, 0xa1, 0x56, 0xc8, 0x1d, 0xd2, 0x1e, 0x49, 0xab, 0x37, 0x49, 0x7d, 0xac, 0xf0, 0x76, 0x7e, 0x91, 0xef, 0xe6, 0xba, + 0xeb, 0x6e, 0x82, 0xdb, 0x94, 0x49, 0x8b, 0x77, 0x4d, 0x66, 0x8c, 0xba, 0xbc, 0x6a, 0x5d, 0x93, 0xd1, 0x72, 0x7b, 0x20, 0x15, 0xed, 0xfc, 0x3c, 0x37, 0x0f, 0x52, 0x97, 0x26, 0x91, 0x9e, 0xf4, + 0x2b, 0x06, 0x89, 0xaa, 0x40, 0x99, 0x06, 0x83, 0x88, 0xb1, 0x9b, 0x0c, 0x06, 0x50, 0x5a, 0xb3, 0x8e, 0xa7, 0x26, 0xf8, 0x3a, 0xf8, 0x61, 0x5a, 0x4c, 0x27, 0xf1, 0xaa, 0xde, 0x80, 0xf4, 0x2e, + 0xf9, 0x65, 0x8c, 0xdd, 0xdd, 0x2d, 0x66, 0xd7, 0x77, 0x77, 0x13, 0xc6, 0x5a, 0x29, 0x8c, 0xc0, 0xdf, 0xeb, 0x3c, 0xd1, 0xaa, 0xeb, 0x49, 0x57, 0x6e, 0xb0, 0x0a, 0x96, 0xdb, 0xc9, 0x53, 0xfb, + 0xeb, 0x5e, 0xc7, 0x2d, 0x4d, 0xed, 0x2c, 0x90, 0xbe, 0x2e, 0x11, 0xfe, 0xb1, 0xc3, 0x9f, 0x74, 0xed, 0x6d, 0x6a, 0x5e, 0x65, 0x36, 0x6d, 0xed, 0xc1, 0xaa, 0x6e, 0x3f, 0xdd, 0xce, 0x2f, 0xde, + 0x9c, 0xbc, 0x78, 0x2a, 0xc6, 0xc9, 0x0b, 0x62, 0x00, 0xf9, 0xc3, 0xc9, 0xf5, 0xd7, 0xf7, 0x2f, 0x61, 0x64, 0x82, 0x55, 0x2f, 0xf7, 0x22, 0x44, 0x39, 0x18, 0xbb, 0x8d, 0x13, 0x9a, 0xb7, 0x38, + 0x35, 0xe6, 0x1e, 0xf3, 0x03, 0x39, 0xf2, 0xd5, 0x11, 0xe5, 0xf7, 0x53, 0xd2, 0xd2, 0xea, 0x89, 0x8a, 0x0e, 0x22, 0xc1, 0x68, 0x14, 0xf9, 0xd5, 0x8b, 0x3c, 0x49, 0x99, 0x53, 0xbe, 0x6b, 0x62, + 0xe8, 0x59, 0x7c, 0x17, 0xfe, 0x72, 0x24, 0x6e, 0x89, 0x01, 0x07, 0xc4, 0xdb, 0x97, 0x22, 0x6e, 0xe7, 0x17, 0x5d, 0xe8, 0xdf, 0xbd, 0xaf, 0xa0, 0xde, 0x8c, 0x9a, 0x36, 0x70, 0x0f, 0xbe, 0xd3, + 0x3e, 0xf9, 0x04, 0xbd, 0xa9, 0xd1, 0x1e, 0xb5, 0x8f, 0xfe, 0x93, 0x83, 0xa9, 0x1d, 0xff, 0x70, 0x46, 0x1f, 0x98, 0xe1, 0x68, 0x56, 0x4c, 0x4e, 0x8f, 0x3e, 0xdc, 0x84, 0x25, 0xa9, 0xcc, 0x84, + 0x9e, 0xb4, 0xc7, 0x07, 0x51, 0x04, 0x26, 0x82, 0xae, 0x38, 0x8a, 0x03, 0x38, 0x6a, 0x47, 0xe6, 0xc8, 0x2c, 0xa6, 0xc4, 0x47, 0xce, 0x35, 0x8a, 0x06, 0xad, 0xa3, 0x37, 0xf3, 0x69, 0xf6, 0xaa, + 0x3d, 0xdb, 0x40, 0xef, 0x7b, 0x77, 0x9d, 0x02, 0x7a, 0x54, 0xd9, 0x1f, 0x80, 0xfa, 0x18, 0x84, 0x07, 0xa9, 0xff, 0xf2, 0x40, 0x10, 0x45, 0x3e, 0x2d, 0x16, 0xd7, 0x12, 0x7f, 0x91, 0x24, 0x0f, + 0xe1, 0x89, 0xaf, 0xbc, 0x18, 0x11, 0xfe, 0x9d, 0x5e, 0xf5, 0x0f, 0x08, 0xf3, 0x3f, 0x31, 0x4a, 0x16, 0x09, 0x9e, 0xee, 0xf7, 0x21, 0x32, 0xbb, 0x6f, 0xcf, 0x82, 0xd2, 0x59, 0xc4, 0xf0, 0x97, + 0xdb, 0xb4, 0x1b, 0x3b, 0xaf, 0x63, 0x34, 0xfe, 0x5f, 0xeb, 0x7f, 0xa3, 0xb4, 0x3d, 0xf0, 0x7f, 0xb6, 0xf2, 0xfa, 0x7d, 0x98, 0x2a, 0xe4, 0x3a, 0xd4, 0xe9, 0x8f, 0x11, 0x5c, 0x9b, 0x26, 0xe9, + 0x7a, 0x7a, 0xfa, 0x60, 0xb1, 0xdf, 0x60, 0x51, 0xd4, 0xe3, 0x3e, 0x69, 0x5f, 0x4d, 0x43, 0x7a, 0x8b, 0x1d, 0xcc, 0x40, 0xf7, 0x66, 0x52, 0xe8, 0xd3, 0x3b, 0xf7, 0xbf, 0x01, 0x00, 0x00, 0xff, + 0xff, 0x50, 0x4b, 0x07, 0x08, 0x1b, 0x07, 0xfa, 0xc4, 0xb6, 0x05, 0x00, 0x00, 0x1a, 0x0f, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x4c, 0x90, 0x31, 0x6e, 0xc3, 0x30, 0x0c, 0x45, 0x77, 0x9f, 0xe2, 0x23, 0x1e, + 0xb2, 0xe5, 0x00, 0x59, 0x8b, 0x16, 0xed, 0xd6, 0x21, 0x17, 0x60, 0xa4, 0x6f, 0x5b, 0xa8, 0x4d, 0x19, 0x22, 0xe5, 0xb4, 0xb7, 0x2f, 0xe4, 0xa2, 0x49, 0x46, 0x91, 0xc0, 0x7b, 0xd4, 0xeb, 0x91, + 0x57, 0x4f, 0x59, 0x65, 0x3e, 0x01, 0x1f, 0xba, 0xe5, 0x20, 0xed, 0x89, 0xc8, 0x21, 0x29, 0x0d, 0x53, 0x52, 0x37, 0x0c, 0xb9, 0x60, 0xca, 0x37, 0xbc, 0x55, 0x0d, 0x6d, 0x6d, 0x08, 0x85, 0xe2, + 0x8c, 0xa8, 0x96, 0x74, 0x84, 0x4f, 0xc9, 0xba, 0x1e, 0xce, 0x65, 0x9d, 0xc5, 0x89, 0x20, 0x8a, 0x2b, 0x91, 0x74, 0xcb, 0x5f, 0x8c, 0x27, 0xe0, 0x32, 0xd1, 0x08, 0xa3, 0x7b, 0xd2, 0xd1, 0xfe, + 0xf7, 0x75, 0x8d, 0x3b, 0x24, 0x2b, 0x7c, 0x22, 0x0a, 0xad, 0xce, 0x2e, 0xea, 0x5d, 0x7f, 0x37, 0x41, 0x0c, 0x91, 0x1b, 0xe7, 0xbc, 0x2e, 0x54, 0xc7, 0x5a, 0xf2, 0x58, 0x68, 0x46, 0x83, 0x67, + 0x50, 0xad, 0x16, 0xe2, 0xf8, 0x27, 0x3a, 0xee, 0x5c, 0x99, 0x6f, 0xf2, 0x63, 0xf0, 0x92, 0xc6, 0x91, 0xa5, 0x81, 0xbb, 0x1e, 0xfc, 0x66, 0xa8, 0x3b, 0x2f, 0x0f, 0x10, 0x94, 0xaa, 0xda, 0xee, + 0xbe, 0x5b, 0x92, 0x9a, 0x8b, 0x06, 0xee, 0x3f, 0x75, 0x5a, 0x3b, 0x13, 0xa2, 0xf1, 0xd9, 0x7d, 0xea, 0xd2, 0xbd, 0xcf, 0xb9, 0x03, 0xfa, 0xa7, 0x5e, 0xd6, 0xb8, 0x8f, 0x3a, 0x43, 0xc9, 0xcb, + 0x1e, 0xe5, 0x91, 0x24, 0x19, 0xb6, 0x24, 0xb8, 0x8a, 0xa5, 0x80, 0xf7, 0xcb, 0xe5, 0x13, 0x2f, 0x73, 0xae, 0xf1, 0x75, 0xa3, 0x7a, 0x87, 0xe6, 0x5d, 0xc4, 0xcf, 0x38, 0x84, 0x36, 0x65, 0x9b, + 0x1e, 0xba, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb5, 0x17, 0x55, 0x3f, 0xf5, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0xb4, 0x3a, 0x6d, 0x73, 0xda, 0x48, 0x93, 0xdf, 0xf5, 0x2b, 0x3a, 0x82, 0x8a, 0xed, 0x94, + 0x25, 0xd9, 0xb9, 0xba, 0x7b, 0x9e, 0xb3, 0x8f, 0xad, 0x23, 0x98, 0x24, 0x64, 0x6d, 0x70, 0x81, 0x1d, 0x67, 0x2b, 0xce, 0xc1, 0x20, 0x0d, 0x30, 0xb6, 0x98, 0x51, 0x66, 0x46, 0x60, 0x36, 0xeb, + 0xff, 0x7e, 0xd5, 0x33, 0x12, 0x92, 0x00, 0x67, 0x93, 0x4d, 0xc2, 0xd6, 0xd6, 0x5a, 0xa3, 0x7e, 0x7f, 0x9b, 0xee, 0xd6, 0xd6, 0x9e, 0x05, 0x63, 0xc6, 0x03, 0x35, 0x73, 0x6a, 0xe0, 0xfd, 0xc4, + 0x9f, 0x53, 0x83, 0x73, 0x16, 0x52, 0xae, 0x68, 0x04, 0x5a, 0x80, 0x9e, 0x51, 0x68, 0x26, 0x24, 0x9c, 0x51, 0x18, 0x88, 0x89, 0x5e, 0x12, 0x49, 0xe1, 0xb5, 0x48, 0x79, 0x44, 0x34, 0x13, 0x1c, + 0xf6, 0x9b, 0x83, 0xd7, 0x07, 0x90, 0xf2, 0x88, 0x4a, 0x10, 0x9c, 0x3a, 0x35, 0x10, 0x12, 0xe6, 0x42, 0x52, 0x08, 0x05, 0xd7, 0x92, 0x8d, 0x53, 0x2d, 0x24, 0xc4, 0x96, 0x20, 0x90, 0xa9, 0xa4, + 0x74, 0x4e, 0xb9, 0x56, 0x3e, 0xc0, 0x80, 0x52, 0x43, 0xbd, 0xdb, 0xbb, 0xea, 0xb4, 0xda, 0x30, 0x61, 0x31, 0xa2, 0x47, 0x4c, 0x59, 0x34, 0x1a, 0xc1, 0x92, 0xe9, 0x19, 0xe8, 0x19, 0x53, 0xb0, + 0x14, 0xf2, 0x1e, 0x26, 0x42, 0x02, 0x89, 0x22, 0x86, 0x8c, 0x49, 0x0c, 0x8c, 0x4f, 0x84, 0x9c, 0x1b, 0x31, 0x9c, 0x1a, 0x48, 0x3a, 0x25, 0x32, 0x62, 0x7c, 0x0a, 0xa1, 0x48, 0x56, 0x92, 0x4d, + 0x67, 0x1a, 0xc4, 0x92, 0x53, 0xa9, 0x66, 0x2c, 0xf1, 0x01, 0xae, 0x50, 0x8f, 0xc1, 0xeb, 0x5c, 0x14, 0x65, 0xe9, 0x66, 0x4c, 0xb5, 0x80, 0x95, 0x48, 0x33, 0x35, 0x4a, 0x1a, 0x67, 0x86, 0x38, + 0x84, 0xf7, 0x54, 0x2a, 0x54, 0xf7, 0xa5, 0x7f, 0x04, 0xfb, 0x7a, 0x86, 0x38, 0x6e, 0xf6, 0xd2, 0x3d, 0x38, 0x35, 0xc8, 0x73, 0xb2, 0x02, 0x2e, 0x34, 0xa4, 0x8a, 0x16, 0xb4, 0x81, 0x3e, 0x84, + 0x34, 0xd1, 0xc0, 0x38, 0x84, 0x62, 0x9e, 0xc4, 0x8c, 0xf0, 0x10, 0x91, 0x33, 0xcd, 0xd6, 0x1c, 0x7c, 0x80, 0x3f, 0x32, 0x1a, 0x62, 0xac, 0x09, 0xe3, 0x40, 0x8c, 0x1e, 0x20, 0x26, 0x65, 0x30, + 0x20, 0xda, 0xa9, 0x39, 0x35, 0x00, 0x80, 0x99, 0xd6, 0x89, 0x3a, 0x09, 0x82, 0xe5, 0x72, 0xe9, 0x13, 0x23, 0xad, 0x2f, 0xe4, 0x34, 0xc8, 0xd5, 0x0b, 0xce, 0x3b, 0xad, 0x76, 0x77, 0xd0, 0xf6, + 0x5e, 0xfa, 0x47, 0x06, 0xe5, 0x9a, 0xc7, 0x54, 0x29, 0x90, 0xf4, 0x73, 0xca, 0x24, 0x8d, 0x60, 0xbc, 0x02, 0x92, 0x24, 0x31, 0x0b, 0xc9, 0x38, 0xa6, 0x10, 0x93, 0x25, 0x3a, 0xce, 0xf8, 0xc7, + 0xb8, 0x9d, 0x71, 0x58, 0x4a, 0xa6, 0x19, 0x9f, 0x1e, 0x3a, 0x35, 0x50, 0xb9, 0xe7, 0xcb, 0xde, 0x29, 0xac, 0x95, 0x4b, 0xc7, 0x54, 0x05, 0x40, 0x70, 0x20, 0xe8, 0x1a, 0xb7, 0x39, 0x80, 0xce, + 0xc0, 0x85, 0x57, 0xcd, 0x41, 0x67, 0x70, 0x08, 0x37, 0x9d, 0xab, 0xb7, 0xbd, 0xeb, 0x2b, 0xb8, 0x69, 0xf6, 0xfb, 0xcd, 0xee, 0x55, 0xa7, 0x3d, 0x80, 0x5e, 0x1f, 0x5a, 0xbd, 0xee, 0x59, 0xe7, + 0xaa, 0xd3, 0xeb, 0x0e, 0xa0, 0xf7, 0x1a, 0x9a, 0xdd, 0x3f, 0x9c, 0x1a, 0xfc, 0xde, 0xe9, 0x9e, 0x1d, 0x02, 0x65, 0x7a, 0x46, 0x25, 0xd0, 0x87, 0x44, 0xa2, 0x06, 0x42, 0x02, 0x43, 0x4b, 0xd2, + 0xa8, 0x14, 0x43, 0xb9, 0x04, 0x18, 0x22, 0xd6, 0x3d, 0x2a, 0xa1, 0x21, 0x9b, 0xb0, 0x10, 0x62, 0xc2, 0xa7, 0x29, 0x99, 0x52, 0x98, 0x8a, 0x05, 0x95, 0x1c, 0x23, 0x24, 0xa1, 0x72, 0xce, 0x14, + 0x3a, 0x54, 0x01, 0xe1, 0x11, 0xc4, 0x6c, 0xce, 0xb4, 0x09, 0x24, 0xe5, 0xd4, 0xb6, 0xf5, 0xf2, 0x7f, 0x76, 0x86, 0xfd, 0x6c, 0x7a, 0x35, 0xb8, 0x20, 0x0b, 0xca, 0x61, 0xa0, 0x89, 0xd4, 0x70, + 0x9d, 0xc0, 0x2b, 0xa2, 0xc3, 0x19, 0xa8, 0x50, 0xb2, 0xc4, 0x06, 0x4c, 0x3f, 0x77, 0x7b, 0xbb, 0xfb, 0x1e, 0x16, 0x44, 0xaa, 0x93, 0x9d, 0x32, 0x98, 0xd0, 0x7a, 0xd7, 0x7c, 0xdf, 0x1c, 0xbe, + 0xed, 0x5d, 0xb4, 0xc1, 0x83, 0x58, 0x84, 0x36, 0xcf, 0xc5, 0x04, 0x08, 0xbc, 0x3b, 0xfb, 0x1d, 0x66, 0x62, 0x8e, 0x61, 0x20, 0x0d, 0xd9, 0x5e, 0x92, 0xe5, 0x62, 0x4e, 0x76, 0x17, 0x55, 0x43, + 0xf4, 0xe2, 0xe5, 0x2e, 0x92, 0x73, 0x14, 0xfb, 0xe5, 0x9e, 0x02, 0xc6, 0x95, 0x26, 0x71, 0x4c, 0xa3, 0x12, 0x7d, 0xc4, 0x6a, 0xbe, 0x6f, 0x77, 0x87, 0xbd, 0xcb, 0xab, 0x01, 0x78, 0x90, 0x10, + 0x49, 0xe6, 0x54, 0x53, 0xa9, 0x20, 0x21, 0xaa, 0x54, 0x9e, 0xde, 0x91, 0x05, 0x81, 0xf7, 0x17, 0xb0, 0x9c, 0x51, 0x0e, 0x32, 0xe5, 0xc6, 0xc7, 0xc6, 0x22, 0x36, 0x55, 0x80, 0xfa, 0x53, 0x1f, + 0x81, 0x23, 0x3a, 0x4e, 0xb3, 0x37, 0xc0, 0xb4, 0xa2, 0xf1, 0xe4, 0x10, 0xd3, 0x35, 0x83, 0x02, 0x50, 0x54, 0x97, 0x58, 0x36, 0xbc, 0x0f, 0x16, 0xc1, 0xfb, 0x20, 0x53, 0x7e, 0x17, 0x2d, 0x93, + 0x13, 0x2d, 0x09, 0x57, 0x89, 0x90, 0xba, 0x11, 0xe9, 0xa1, 0x12, 0xe1, 0x3d, 0xd5, 0x87, 0x8a, 0xca, 0x05, 0x95, 0x8d, 0xd5, 0xa1, 0x4a, 0x55, 0x42, 0x79, 0xd4, 0x58, 0x1d, 0x92, 0x28, 0xc2, + 0x50, 0x6d, 0xfc, 0xfb, 0xe8, 0xe8, 0xa8, 0xa4, 0xc7, 0xe0, 0xf7, 0xce, 0xe5, 0xb0, 0xdf, 0x02, 0x0f, 0x26, 0x31, 0x99, 0x1a, 0x81, 0x98, 0xb2, 0xe9, 0x27, 0x88, 0x29, 0x5d, 0xb9, 0x49, 0x64, + 0x68, 0xaa, 0xc7, 0x4e, 0x73, 0xfe, 0xc0, 0xcf, 0x71, 0xd8, 0x04, 0x3e, 0x82, 0xf7, 0x27, 0xb8, 0xf5, 0x8a, 0x48, 0x2e, 0x7c, 0x82, 0x53, 0xb4, 0x25, 0x77, 0x1c, 0x00, 0x0b, 0x34, 0x81, 0x80, + 0xea, 0x30, 0xc8, 0xe5, 0x59, 0x03, 0xa0, 0xa1, 0xfc, 0xca, 0x3b, 0x07, 0x60, 0xc2, 0xca, 0x88, 0x6e, 0x1d, 0x7d, 0x1d, 0xf8, 0xd9, 0x7b, 0x77, 0x13, 0x79, 0xf3, 0x7d, 0x46, 0x00, 0xff, 0xad, + 0x41, 0x6f, 0x50, 0xe4, 0xae, 0x4a, 0x13, 0xb4, 0xb6, 0x0f, 0x50, 0x5f, 0x10, 0x09, 0xc3, 0x79, 0xaa, 0xf4, 0x10, 0xc6, 0xd4, 0x78, 0x4a, 0x8b, 0xbc, 0x34, 0x68, 0x99, 0x52, 0xac, 0x0b, 0x13, + 0x12, 0x63, 0xb6, 0x86, 0xab, 0xe9, 0x92, 0xf1, 0x86, 0x79, 0x3a, 0x75, 0x22, 0x22, 0x4b, 0x4f, 0x73, 0xc6, 0xa7, 0x4b, 0xfb, 0xe0, 0x84, 0x44, 0x51, 0x70, 0x47, 0x29, 0x27, 0x73, 0x3a, 0x72, + 0x81, 0xa1, 0x78, 0xad, 0x3f, 0xde, 0xdc, 0x74, 0xba, 0x2f, 0x0e, 0x20, 0x23, 0x62, 0x48, 0x9f, 0x9e, 0x3a, 0x00, 0x17, 0x9d, 0xee, 0x9b, 0x9b, 0x17, 0x07, 0x60, 0x29, 0xe0, 0xb9, 0x39, 0x3e, + 0x33, 0xe4, 0x5f, 0x1c, 0x40, 0xc6, 0x07, 0x5f, 0x18, 0x35, 0x6b, 0x70, 0xad, 0x28, 0x04, 0xa9, 0x92, 0x41, 0xcc, 0xc6, 0xf4, 0x81, 0x86, 0xc1, 0x1d, 0x59, 0x90, 0xa1, 0x09, 0x70, 0x36, 0x01, + 0xb2, 0x20, 0x2c, 0x46, 0xef, 0x1f, 0x82, 0x40, 0x2d, 0x96, 0x0c, 0xeb, 0x17, 0x89, 0x63, 0x18, 0x93, 0xf0, 0x1e, 0xb5, 0x0b, 0xce, 0xd9, 0x58, 0x12, 0xb9, 0x0a, 0x30, 0xc0, 0x83, 0xb7, 0x62, + 0x9e, 0x13, 0xc6, 0xaa, 0x97, 0xd7, 0xff, 0x88, 0x2e, 0x68, 0x2c, 0x12, 0x2a, 0x7d, 0x2c, 0xe7, 0xd4, 0x0f, 0xc5, 0x1c, 0xf9, 0x19, 0xbc, 0x39, 0x09, 0x83, 0xcf, 0x24, 0xf8, 0x4c, 0x8e, 0x8f, + 0xff, 0x75, 0x14, 0x0c, 0x19, 0x8f, 0xe8, 0x83, 0x3f, 0xd3, 0xf3, 0xd8, 0xd0, 0x29, 0x62, 0x61, 0x9d, 0xf1, 0x2e, 0x7c, 0x2a, 0x39, 0x2a, 0x07, 0x79, 0x00, 0x77, 0xb7, 0x1a, 0x9b, 0xe0, 0x80, + 0x45, 0x5a, 0x48, 0x5d, 0x94, 0x90, 0x86, 0x3b, 0xda, 0x8d, 0x3a, 0x72, 0x33, 0x1c, 0x8a, 0x9e, 0x78, 0x1a, 0x7d, 0xdb, 0x06, 0x39, 0xe2, 0x84, 0x39, 0xa5, 0xff, 0x9c, 0x9e, 0x3a, 0x54, 0x91, + 0xb0, 0x1c, 0xe1, 0x65, 0xad, 0x8a, 0xf8, 0xb3, 0xef, 0xa5, 0x0d, 0xe0, 0x29, 0xe5, 0x5a, 0x08, 0x4f, 0xd2, 0x98, 0x62, 0x2c, 0x54, 0xc2, 0xb4, 0x10, 0x62, 0x84, 0x52, 0x7b, 0xa1, 0xe0, 0x13, + 0x36, 0x05, 0xcf, 0xbb, 0x93, 0xd4, 0x33, 0x2a, 0xd8, 0xb0, 0xc5, 0xa8, 0x2d, 0xa5, 0xd5, 0xcb, 0x6d, 0x96, 0x35, 0xec, 0x4e, 0x94, 0x88, 0x17, 0x14, 0x62, 0xc6, 0xef, 0x15, 0x78, 0x50, 0x3f, + 0x32, 0x77, 0xfd, 0x98, 0x02, 0x31, 0x67, 0xe8, 0x6e, 0x93, 0x0d, 0x7b, 0xca, 0x54, 0x40, 0x07, 0xe0, 0xb2, 0xff, 0xa6, 0xe1, 0xd6, 0x8f, 0x5c, 0x4c, 0xac, 0x1a, 0x70, 0x73, 0x2f, 0x9b, 0xb6, + 0x42, 0x48, 0x90, 0x34, 0x26, 0x9a, 0x2d, 0x28, 0xa8, 0xd5, 0xdc, 0x90, 0x74, 0x00, 0x96, 0x33, 0xec, 0x37, 0x3e, 0x82, 0x37, 0x03, 0xb7, 0x7e, 0xd9, 0x7f, 0x63, 0x45, 0x88, 0x84, 0x51, 0x26, + 0x56, 0x8d, 0x51, 0xac, 0xc0, 0x8b, 0xa3, 0xec, 0xe5, 0xc8, 0x1e, 0x33, 0x7e, 0xdf, 0x18, 0xe1, 0xcd, 0x0a, 0x6e, 0x3d, 0x56, 0x2e, 0x9c, 0xc0, 0x9e, 0xff, 0xc2, 0xfb, 0x0d, 0x6e, 0xf7, 0xfd, + 0x17, 0xb7, 0x07, 0xf5, 0xbd, 0x51, 0x1e, 0x29, 0x39, 0x0c, 0xe3, 0xf7, 0x06, 0x2a, 0xf0, 0x5f, 0xec, 0xc1, 0x6f, 0x80, 0xe1, 0x17, 0xf0, 0x34, 0x8e, 0x2b, 0x71, 0x60, 0x45, 0x37, 0xb0, 0xce, + 0x86, 0x8f, 0xcd, 0xab, 0x51, 0xc4, 0x24, 0x26, 0x5d, 0x2e, 0x4b, 0x50, 0x82, 0x35, 0xfe, 0x8c, 0xb0, 0x95, 0x74, 0x00, 0x14, 0x59, 0xd0, 0x28, 0x62, 0xb2, 0x31, 0x4a, 0x96, 0xd1, 0x08, 0x4f, + 0x32, 0xfb, 0x36, 0xb6, 0x48, 0xf8, 0xbe, 0x35, 0xd4, 0x9c, 0xdc, 0x53, 0x60, 0x1a, 0x26, 0x69, 0x1c, 0xaf, 0xe0, 0x73, 0x4a, 0x62, 0x36, 0x61, 0x34, 0x2a, 0xa3, 0x86, 0x51, 0xd9, 0x51, 0xcf, + 0x9f, 0x43, 0x4e, 0xdc, 0xbc, 0xc8, 0x79, 0xba, 0x86, 0x1c, 0x0d, 0x67, 0x02, 0xae, 0x15, 0x16, 0xe7, 0xf9, 0x4b, 0x20, 0x1a, 0x72, 0xc4, 0xac, 0x5a, 0xbd, 0x16, 0x12, 0x5a, 0xa6, 0x54, 0x1c, + 0x02, 0xe5, 0x2a, 0x95, 0x14, 0x12, 0xa2, 0x67, 0x0a, 0xb0, 0x5b, 0x62, 0x1c, 0xae, 0xbb, 0x9d, 0x0f, 0x60, 0xfb, 0x54, 0x18, 0xd3, 0x09, 0x36, 0xc6, 0x84, 0xaf, 0xf4, 0x0c, 0x09, 0x32, 0x05, + 0x5a, 0xa4, 0xe1, 0x8c, 0x46, 0x18, 0x40, 0x75, 0x5b, 0x71, 0x8a, 0xb0, 0xf9, 0x08, 0x1e, 0xaf, 0x46, 0xd4, 0xf3, 0xe7, 0xc6, 0x44, 0x85, 0x22, 0xab, 0x29, 0x32, 0x03, 0xcf, 0x4b, 0x39, 0x7b, + 0x28, 0xc1, 0x8e, 0x0a, 0xf4, 0x4a, 0x16, 0x64, 0x04, 0x4a, 0xa1, 0xbd, 0x45, 0xa2, 0x80, 0x2f, 0x11, 0x69, 0x9d, 0x37, 0x07, 0x83, 0xcb, 0xe6, 0xd5, 0xdb, 0x12, 0x91, 0xf5, 0x59, 0x99, 0x48, + 0x95, 0x56, 0x81, 0x36, 0x2a, 0x99, 0xeb, 0x02, 0x0b, 0xe8, 0x0f, 0x5b, 0xcb, 0x94, 0xe1, 0xef, 0x30, 0x96, 0x3b, 0xda, 0xaf, 0xf8, 0xfd, 0x14, 0xbd, 0x7e, 0x60, 0xca, 0xd0, 0x37, 0x59, 0x2a, + 0xc7, 0x2f, 0xa0, 0xd6, 0x14, 0xaa, 0x15, 0x60, 0x67, 0x31, 0xc5, 0x0a, 0xd2, 0x7e, 0xa0, 0x61, 0xaa, 0xb1, 0xe2, 0x37, 0xdc, 0xd1, 0x72, 0xc6, 0xc2, 0x99, 0x39, 0x0e, 0x8d, 0x0c, 0x16, 0x1f, + 0xc5, 0xa8, 0x82, 0x5a, 0x59, 0xe0, 0x19, 0x7c, 0x04, 0xd7, 0x26, 0xea, 0xed, 0x26, 0xc8, 0xad, 0x49, 0xc8, 0xdb, 0xfd, 0x8f, 0xff, 0x07, 0x9f, 0x5e, 0xdc, 0x1e, 0xec, 0x8d, 0x5c, 0x68, 0x80, + 0xcb, 0x45, 0xb5, 0x3a, 0x63, 0x0d, 0x22, 0x11, 0xe6, 0xd9, 0xfe, 0xf1, 0x01, 0x1a, 0x13, 0x67, 0x95, 0xf5, 0x1d, 0x04, 0x44, 0x81, 0xd2, 0x84, 0x47, 0x44, 0x9a, 0xbe, 0x7d, 0x20, 0x62, 0x22, + 0x99, 0x82, 0xe3, 0x23, 0xdf, 0x60, 0x23, 0xee, 0xb9, 0x29, 0x16, 0x56, 0xf0, 0x9c, 0xd6, 0xa8, 0xb8, 0x49, 0x9e, 0x41, 0x5e, 0x48, 0x72, 0xe0, 0x4d, 0xb9, 0x76, 0x89, 0x65, 0x90, 0xeb, 0xf6, + 0xee, 0x84, 0x8d, 0xcb, 0x04, 0xd5, 0xc4, 0x8a, 0x5f, 0x2a, 0x18, 0x3b, 0x94, 0x5f, 0xdf, 0x24, 0x3b, 0xac, 0x1c, 0x46, 0x39, 0x06, 0xd2, 0xb9, 0xcd, 0x93, 0x1d, 0xbc, 0xcb, 0x91, 0xb9, 0x8a, + 0xc2, 0x9d, 0xb7, 0xd0, 0x16, 0x99, 0x5c, 0x5b, 0xec, 0x6d, 0xbe, 0x26, 0x41, 0x76, 0x17, 0x7d, 0xb7, 0xe4, 0x6b, 0xf0, 0xdc, 0x82, 0xf9, 0x41, 0x66, 0x41, 0xac, 0xc5, 0x38, 0xec, 0x67, 0xe5, + 0xb8, 0x12, 0x96, 0x05, 0x6c, 0xae, 0xca, 0xc6, 0x1d, 0x5a, 0x54, 0xd5, 0xad, 0xcb, 0x0a, 0x61, 0x5a, 0x17, 0x67, 0x3b, 0xee, 0xc7, 0x8d, 0x7c, 0xa8, 0xde, 0x8c, 0xeb, 0xae, 0xa0, 0x00, 0x09, + 0xee, 0x24, 0x0d, 0xd4, 0xcc, 0x18, 0x75, 0xa3, 0xdd, 0xc3, 0xd0, 0xeb, 0xbc, 0xba, 0xd8, 0x53, 0x66, 0x7c, 0x10, 0x1c, 0x9a, 0x9d, 0x0f, 0xd8, 0x75, 0x63, 0xc0, 0x49, 0xc2, 0xa7, 0x74, 0x3d, + 0x11, 0xa8, 0x7c, 0x7c, 0x03, 0xba, 0xb6, 0x92, 0x2a, 0x69, 0xdc, 0xba, 0x38, 0x6b, 0x3c, 0xc5, 0x73, 0xf3, 0x9e, 0xd9, 0x05, 0x3f, 0x66, 0xbc, 0x04, 0x6c, 0x4c, 0xb2, 0xc6, 0x58, 0xc3, 0x97, + 0x32, 0x73, 0xe4, 0x6e, 0x18, 0xed, 0x59, 0xa1, 0xf5, 0xa6, 0xd9, 0xcc, 0x3d, 0xe1, 0xb6, 0xa5, 0x14, 0xf2, 0xa4, 0x34, 0x41, 0x65, 0x79, 0x16, 0xd1, 0x09, 0xe3, 0x34, 0x82, 0x50, 0x48, 0x49, + 0x43, 0x1d, 0xaf, 0x7c, 0x17, 0x7e, 0x7b, 0xfe, 0x72, 0x8d, 0x07, 0x70, 0x43, 0x21, 0x24, 0x1c, 0x61, 0xad, 0xee, 0x14, 0x0a, 0x36, 0x19, 0xe4, 0x03, 0xd3, 0x70, 0xfc, 0x95, 0x62, 0xb3, 0x29, + 0xcc, 0x0d, 0x31, 0xd3, 0x6e, 0x59, 0x1c, 0xca, 0x17, 0x4c, 0x0a, 0x3e, 0xa7, 0x5c, 0xe3, 0xb8, 0xc6, 0x4c, 0xea, 0x67, 0x32, 0x2a, 0xaa, 0x7d, 0x5b, 0xcb, 0x4c, 0xd9, 0xbe, 0xe9, 0xf5, 0xcf, + 0xcf, 0x06, 0xc3, 0xf3, 0xe6, 0x75, 0xb7, 0xf5, 0xb6, 0xdd, 0x6f, 0x08, 0x39, 0xf5, 0x43, 0x11, 0xd1, 0x19, 0x49, 0x95, 0x9f, 0xc4, 0xf4, 0x21, 0x55, 0x7e, 0x18, 0x13, 0xa5, 0x96, 0x42, 0xc6, + 0x91, 0xf2, 0x63, 0x92, 0xf2, 0x70, 0x46, 0xa5, 0x7f, 0x9e, 0xfd, 0x81, 0xe5, 0x5e, 0x4b, 0xb2, 0xa0, 0x12, 0x7d, 0x1d, 0x31, 0x54, 0x5c, 0xc8, 0x15, 0x7a, 0x3d, 0x0d, 0x35, 0x96, 0xfe, 0x89, + 0x14, 0x73, 0x48, 0xa4, 0x08, 0x71, 0xac, 0x37, 0x1b, 0x9e, 0x02, 0x4a, 0x0b, 0x3b, 0x01, 0xad, 0x94, 0xa6, 0x73, 0x90, 0x42, 0x68, 0xa7, 0x06, 0x13, 0x26, 0x95, 0x2e, 0x01, 0x99, 0x2d, 0x8a, + 0x3f, 0x5f, 0x70, 0x50, 0xe9, 0xb8, 0x38, 0x66, 0x0a, 0x42, 0xc1, 0x15, 0x8b, 0x28, 0x4e, 0xbc, 0x89, 0x14, 0x77, 0x34, 0xd4, 0x30, 0xc6, 0x0e, 0x6f, 0x0d, 0xe4, 0x4c, 0x18, 0x8f, 0x86, 0xa6, + 0xe5, 0x1a, 0xe2, 0x9b, 0x88, 0xc9, 0xfd, 0x03, 0xf8, 0x52, 0x4c, 0x31, 0x68, 0xdd, 0x63, 0x17, 0x3e, 0x39, 0x50, 0x84, 0xb2, 0xb5, 0xeb, 0x25, 0xde, 0x71, 0xc6, 0x62, 0x76, 0x4c, 0xb1, 0x83, + 0xe8, 0x36, 0x3d, 0x37, 0xab, 0x9c, 0x3a, 0x95, 0x1c, 0x8e, 0xd7, 0x43, 0x52, 0xf6, 0xb6, 0x81, 0xe4, 0xb1, 0x6d, 0x2b, 0xff, 0x9d, 0xb5, 0x70, 0x6e, 0x1d, 0x4f, 0x5d, 0x78, 0xd6, 0x80, 0xbd, + 0x60, 0xaf, 0xdc, 0xc7, 0x59, 0xd9, 0xa2, 0x1c, 0x22, 0x30, 0xca, 0x6f, 0xa4, 0x5b, 0xce, 0xc0, 0x80, 0xe4, 0x67, 0x92, 0x92, 0xfb, 0x22, 0xec, 0x31, 0x27, 0xd1, 0xe0, 0x44, 0x8a, 0x94, 0x47, + 0x26, 0xed, 0xde, 0xbd, 0x6a, 0x37, 0x2f, 0xbd, 0x7f, 0xff, 0xf7, 0x7f, 0xfc, 0x0b, 0xf6, 0x2b, 0x17, 0x40, 0x30, 0x48, 0x88, 0x0c, 0x0f, 0x36, 0xd8, 0x7f, 0x41, 0xe2, 0x8f, 0x9b, 0xb5, 0xdc, + 0x28, 0x63, 0xfb, 0x2b, 0xfc, 0x33, 0xf0, 0x7d, 0x7b, 0x4b, 0x8e, 0xaa, 0xac, 0x29, 0x8f, 0x70, 0xd4, 0x2d, 0x24, 0xc8, 0x5b, 0xbe, 0xdc, 0xc4, 0xf5, 0x2f, 0x99, 0x12, 0x8f, 0xae, 0xf3, 0x88, + 0x81, 0x14, 0x0a, 0x1e, 0x12, 0x4d, 0x39, 0xd1, 0x54, 0x01, 0xce, 0x48, 0x31, 0xe3, 0x54, 0xd9, 0xad, 0x84, 0xd9, 0xe1, 0x59, 0x80, 0xa1, 0x39, 0x36, 0x8e, 0x2c, 0x4f, 0xa3, 0xc7, 0x55, 0x39, + 0x33, 0x1e, 0xfb, 0x5a, 0x82, 0xa7, 0x60, 0xef, 0x96, 0xef, 0x01, 0xfe, 0xf3, 0x3f, 0x06, 0xf2, 0x20, 0x4b, 0xfa, 0x47, 0xc7, 0x79, 0xd5, 0x1c, 0xb4, 0x87, 0x67, 0x9d, 0x7e, 0x63, 0xb4, 0xed, + 0x5c, 0xc4, 0xc7, 0xeb, 0xdf, 0x1d, 0x95, 0xb2, 0x31, 0x47, 0x28, 0xb3, 0xb3, 0x69, 0x7b, 0x6a, 0xfb, 0x9f, 0x5f, 0xf6, 0x73, 0x6a, 0xd0, 0x7e, 0xd0, 0x94, 0x9b, 0x25, 0xa5, 0x16, 0x68, 0x22, + 0xb1, 0x04, 0x92, 0x6a, 0x31, 0x27, 0x9a, 0x85, 0x04, 0x7b, 0xe1, 0x48, 0x2c, 0x79, 0xbe, 0x68, 0xc0, 0x22, 0x6b, 0xf4, 0xf1, 0x96, 0x92, 0x24, 0x38, 0x3d, 0xde, 0x11, 0x69, 0x13, 0xd2, 0xac, + 0x47, 0xbc, 0x90, 0x72, 0x2d, 0x49, 0xec, 0xd4, 0xe0, 0x0a, 0x87, 0x0e, 0x43, 0x4f, 0x41, 0xaa, 0x2a, 0xc8, 0x90, 0x21, 0x63, 0xeb, 0x96, 0xa5, 0x99, 0x02, 0x3d, 0x23, 0x1a, 0x9f, 0x66, 0x6c, + 0xcc, 0x34, 0x84, 0x33, 0x1a, 0xde, 0x9b, 0xf6, 0x8d, 0xc3, 0x98, 0x71, 0x22, 0x57, 0x10, 0x11, 0x4d, 0xfc, 0x5f, 0x69, 0x8b, 0x7c, 0xc4, 0x2b, 0x1c, 0x62, 0xf2, 0x24, 0xc8, 0xa4, 0x0d, 0xb6, + 0x14, 0xaf, 0x86, 0x87, 0x41, 0x77, 0xeb, 0x17, 0xef, 0xbb, 0x37, 0xc3, 0xf7, 0xed, 0xfe, 0xab, 0xde, 0xa0, 0x8d, 0x1d, 0x95, 0xd9, 0x04, 0x54, 0xc3, 0xdd, 0x06, 0x92, 0xd9, 0x86, 0xc3, 0xdf, + 0x70, 0xc8, 0x13, 0x60, 0x7d, 0xe1, 0x7c, 0x2f, 0x97, 0x96, 0x48, 0xe3, 0x88, 0xef, 0x69, 0x53, 0x68, 0xfe, 0x86, 0xdb, 0x61, 0xc5, 0xd7, 0x4c, 0x83, 0xef, 0xfb, 0x6e, 0x39, 0x05, 0x8b, 0x4b, + 0xde, 0xf0, 0xef, 0xb7, 0x2f, 0x7b, 0xd7, 0xfd, 0xf3, 0xcd, 0x6c, 0xbe, 0x23, 0xf2, 0x5a, 0xc6, 0x8d, 0x2a, 0x50, 0xc0, 0x44, 0xa0, 0xc9, 0x3d, 0x91, 0xac, 0xca, 0x37, 0x38, 0xf2, 0xff, 0xd3, + 0xff, 0xaf, 0xea, 0x99, 0x67, 0xce, 0x0a, 0xfd, 0x4b, 0xf7, 0x73, 0x4e, 0x3b, 0x5f, 0x63, 0x48, 0x9a, 0x08, 0xbb, 0x0f, 0x2a, 0x6f, 0xb3, 0xed, 0x7e, 0xf0, 0x47, 0x58, 0x66, 0x0a, 0xdb, 0xca, + 0xda, 0x79, 0x3d, 0x68, 0xb8, 0x0d, 0xd7, 0x74, 0xaf, 0x70, 0x4f, 0x57, 0xb0, 0x20, 0x71, 0x4a, 0xd7, 0xc5, 0x15, 0xc0, 0x6e, 0x84, 0xea, 0xf7, 0x74, 0xe5, 0x62, 0xc0, 0xee, 0x67, 0x44, 0xaf, + 0x65, 0x7c, 0x50, 0x58, 0xc3, 0x20, 0xb9, 0xa7, 0xb6, 0xa6, 0xda, 0xdd, 0x90, 0x51, 0x4e, 0x91, 0xd0, 0xfc, 0x89, 0x95, 0xcc, 0x14, 0x93, 0x6f, 0x89, 0xbe, 0x44, 0x8a, 0x84, 0x4a, 0xcd, 0xa8, + 0x72, 0xff, 0x51, 0x58, 0x9c, 0x95, 0x1c, 0x8d, 0xe9, 0x7b, 0x02, 0x75, 0x2b, 0x68, 0x55, 0x7d, 0xcb, 0xed, 0x1d, 0x91, 0x78, 0x79, 0x35, 0xbe, 0x4d, 0xb4, 0xb5, 0x0d, 0x8b, 0xe1, 0xb4, 0x5a, + 0xec, 0xab, 0x44, 0xb7, 0xa7, 0xc0, 0x25, 0xe3, 0x11, 0x56, 0x0d, 0xb7, 0x5e, 0x05, 0x75, 0xd7, 0xd7, 0x41, 0x4e, 0x3e, 0x14, 0xf3, 0x39, 0xe1, 0x11, 0x78, 0x0b, 0x58, 0x4e, 0xa9, 0x7e, 0x72, + 0xb1, 0xf0, 0x3d, 0xf6, 0x81, 0x8d, 0x04, 0x35, 0x84, 0x7d, 0xdf, 0xcf, 0x8a, 0x18, 0x3e, 0x16, 0x93, 0xc3, 0xba, 0x73, 0x2f, 0x5f, 0xff, 0x86, 0xc9, 0xf5, 0xa0, 0xdd, 0xef, 0x36, 0x6d, 0x83, + 0xf5, 0xd7, 0x5f, 0x95, 0x57, 0x97, 0xb6, 0x4d, 0x3a, 0xdb, 0x5e, 0x83, 0xe1, 0xcf, 0xf0, 0x73, 0x73, 0x6f, 0x80, 0xd7, 0xdb, 0xb6, 0xc3, 0x1a, 0xbe, 0x32, 0x7e, 0xac, 0x91, 0x3d, 0x0f, 0xb3, + 0xc3, 0x4b, 0x15, 0x95, 0x8d, 0xaa, 0x30, 0xf9, 0xab, 0xc4, 0xf6, 0x5f, 0x51, 0xa3, 0x2a, 0xd0, 0xb7, 0xb2, 0xcd, 0xb4, 0xa6, 0x71, 0xd5, 0x05, 0x61, 0x2a, 0xe3, 0x5f, 0xe2, 0x02, 0x43, 0xb8, + 0x70, 0x01, 0x3e, 0xfe, 0x52, 0x17, 0x18, 0x7e, 0x9e, 0xd8, 0xb6, 0x40, 0xd9, 0x40, 0x93, 0xa7, 0xbd, 0x60, 0xf1, 0x8d, 0x03, 0xa0, 0x2a, 0xca, 0xc9, 0x86, 0xc1, 0xbf, 0x9d, 0x49, 0x1e, 0xf5, + 0x15, 0x66, 0xff, 0xc8, 0xa4, 0x24, 0x8e, 0xd1, 0x8a, 0xf9, 0xb6, 0xd8, 0xda, 0xd4, 0x7c, 0x0b, 0xd1, 0x62, 0x7d, 0x01, 0xec, 0xb4, 0x2f, 0x0e, 0x37, 0x2d, 0xec, 0xdd, 0x9f, 0xac, 0x04, 0xa6, + 0x09, 0xb8, 0xb1, 0x0f, 0x79, 0x89, 0x31, 0x25, 0x21, 0x9f, 0x9e, 0xc0, 0x34, 0x72, 0xe5, 0xed, 0x97, 0x5a, 0x32, 0x1d, 0xce, 0xb2, 0x7d, 0x8e, 0x16, 0x70, 0x93, 0x65, 0x7f, 0x75, 0x9d, 0x93, + 0x7f, 0x9e, 0x31, 0xd3, 0x77, 0x59, 0xff, 0x5d, 0x15, 0xa6, 0x2a, 0xeb, 0xd7, 0x0a, 0xcc, 0x1a, 0xca, 0x1d, 0x3d, 0x1d, 0x50, 0xb4, 0x02, 0xb8, 0x33, 0x62, 0xf2, 0x31, 0x8f, 0x3e, 0x59, 0xbe, + 0x9f, 0xb0, 0x4c, 0xf8, 0x34, 0x4d, 0xf8, 0x6e, 0x07, 0xe7, 0xbf, 0x6c, 0x38, 0xf4, 0xa0, 0x25, 0xe6, 0x09, 0x8b, 0xd7, 0x9f, 0xb5, 0x76, 0x3b, 0xa6, 0xb8, 0xe5, 0xcb, 0xbf, 0x92, 0x15, 0xf2, + 0x5f, 0xad, 0x44, 0x6f, 0xfd, 0xfd, 0xcc, 0x28, 0xb0, 0x05, 0xba, 0xbf, 0x6b, 0x7e, 0x0e, 0xdd, 0x8a, 0x21, 0x0f, 0x2a, 0x58, 0x1b, 0xfc, 0x0a, 0xcb, 0xff, 0x4c, 0x73, 0xd6, 0xa0, 0x9f, 0xc5, + 0x11, 0xca, 0x1f, 0xad, 0xf1, 0x7e, 0xb6, 0xdd, 0xfb, 0xe5, 0x8f, 0x89, 0x3f, 0x68, 0xf5, 0x9d, 0xa6, 0x74, 0xc1, 0x0b, 0x93, 0x4a, 0x37, 0xf7, 0x04, 0xaf, 0xf5, 0x17, 0xbb, 0xcb, 0x7e, 0xef, + 0x5d, 0xbb, 0x75, 0x85, 0xd6, 0xc4, 0x49, 0xe3, 0x49, 0xe3, 0x17, 0x9f, 0x47, 0x26, 0xec, 0x57, 0x36, 0xdb, 0x35, 0x68, 0xdb, 0x69, 0x8e, 0xe6, 0xf3, 0xc7, 0xaf, 0xe4, 0xe6, 0x64, 0xdb, 0xad, + 0x5d, 0xb6, 0x68, 0xd4, 0xbf, 0xd8, 0xe3, 0xec, 0xf9, 0xc4, 0x2b, 0x4d, 0x64, 0x8f, 0xce, 0xb7, 0x85, 0x82, 0x71, 0xfd, 0x4e, 0x53, 0xa3, 0x1d, 0x4b, 0x1f, 0x87, 0xdd, 0xfa, 0x7e, 0x79, 0xe6, + 0x7c, 0xc2, 0x3f, 0x36, 0xd8, 0xef, 0x16, 0x73, 0xdf, 0x7e, 0x3e, 0x72, 0x0f, 0x72, 0xe2, 0x48, 0xc4, 0xdd, 0xfc, 0x82, 0xf0, 0xfd, 0x35, 0xd4, 0xd9, 0x51, 0x3a, 0xff, 0x76, 0x17, 0xfe, 0xb5, + 0x4a, 0xfa, 0x23, 0x9f, 0x10, 0xb6, 0x88, 0xfd, 0x94, 0x8f, 0x09, 0x05, 0xb9, 0xf2, 0xf7, 0x84, 0x42, 0xcd, 0x5d, 0x69, 0x51, 0xd2, 0x79, 0x57, 0xa4, 0x7c, 0xd5, 0x00, 0xbb, 0xe8, 0xe5, 0xdf, + 0x2f, 0x2e, 0xa5, 0x58, 0xb0, 0x88, 0x02, 0x01, 0x37, 0x5f, 0x97, 0xb3, 0x3f, 0x69, 0xe4, 0xc2, 0x92, 0x98, 0x9d, 0x95, 0xa4, 0x5a, 0x32, 0xba, 0xb0, 0xff, 0x53, 0x4a, 0xeb, 0xbc, 0x03, 0x44, + 0x4e, 0xb3, 0x91, 0x78, 0xc9, 0x62, 0x1c, 0xa7, 0xcd, 0x9e, 0xcb, 0x2c, 0xae, 0xc6, 0x42, 0xcf, 0xd6, 0x1e, 0xc6, 0xd6, 0x8b, 0x0b, 0xee, 0xe5, 0xcf, 0x76, 0x0b, 0xc8, 0x04, 0x57, 0x7e, 0x16, + 0x75, 0xad, 0x8b, 0xb3, 0xe1, 0x79, 0xa7, 0xdb, 0x1e, 0x36, 0xfb, 0x6f, 0x30, 0xfc, 0xb2, 0xd3, 0x5e, 0xf7, 0x75, 0xe7, 0x0d, 0xd4, 0xff, 0xd7, 0xad, 0xa6, 0x46, 0x05, 0xda, 0x71, 0x6e, 0xfa, + 0xcd, 0xcb, 0xcb, 0x76, 0xbf, 0xba, 0xce, 0xcb, 0x06, 0x2d, 0x3b, 0x75, 0xe5, 0x5d, 0x7f, 0xb9, 0xfc, 0x5c, 0x10, 0xc6, 0x31, 0xe5, 0x68, 0x58, 0xde, 0x7a, 0xde, 0x3a, 0x50, 0x0e, 0x62, 0xf3, + 0xec, 0x99, 0x82, 0x6d, 0x6c, 0xf9, 0xb5, 0x44, 0xf8, 0xca, 0x04, 0x8e, 0x54, 0x5c, 0xef, 0xcc, 0x0a, 0x33, 0x13, 0x73, 0x8a, 0xe9, 0x6c, 0x63, 0xf1, 0xd1, 0x2d, 0xde, 0xcc, 0xd3, 0x58, 0xb3, + 0x0b, 0x11, 0xa5, 0x31, 0xbd, 0xb4, 0x1b, 0x87, 0xb3, 0x7c, 0xa5, 0xb7, 0xce, 0xff, 0x2a, 0xe7, 0xc7, 0x4c, 0xe2, 0x2f, 0x9b, 0x36, 0x78, 0x84, 0xaa, 0x0d, 0x5d, 0x34, 0xe2, 0xff, 0x07, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, 0x00, 0x56, 0x27, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x58, 0xff, 0x6f, 0xea, 0x46, 0x12, 0xff, 0xb9, 0xfe, 0x2b, 0xa6, 0x56, 0xdd, 0x24, 0x15, + 0x38, 0x79, 0x91, 0xee, 0x74, 0xa2, 0xf2, 0xe9, 0x39, 0x60, 0x1a, 0xd2, 0x04, 0x90, 0x4d, 0x92, 0x57, 0xf5, 0xf5, 0xd0, 0x62, 0x0f, 0xb0, 0x2f, 0x66, 0xd7, 0xdd, 0x5d, 0x20, 0xdc, 0xe9, 0xfe, + 0xf7, 0xd3, 0xae, 0xd7, 0xd8, 0x84, 0x24, 0xbd, 0x9e, 0x5a, 0xe9, 0xde, 0x0f, 0x8f, 0x78, 0x3d, 0xdf, 0xe7, 0x33, 0xb3, 0x33, 0xfe, 0x18, 0x47, 0x77, 0xd0, 0xfe, 0x03, 0xff, 0x39, 0x46, 0xe2, + 0x2d, 0x4d, 0x91, 0x49, 0xcc, 0x40, 0x71, 0x50, 0x4b, 0x84, 0xb0, 0x20, 0xe9, 0x12, 0x21, 0xe1, 0x73, 0xb5, 0x25, 0x02, 0xa1, 0xcf, 0xd7, 0x2c, 0x23, 0x8a, 0x72, 0x06, 0xa7, 0x61, 0xd2, 0x3f, + 0x83, 0x35, 0xcb, 0x50, 0x00, 0x67, 0x58, 0xf2, 0x73, 0x01, 0x2b, 0x2e, 0x10, 0x52, 0xce, 0x94, 0xa0, 0xb3, 0xb5, 0xe2, 0x02, 0xf2, 0x52, 0x26, 0x90, 0x85, 0x40, 0x5c, 0x21, 0x53, 0xd2, 0x07, + 0x48, 0x10, 0x8d, 0x82, 0xe1, 0x68, 0x32, 0xe8, 0x46, 0x30, 0xa7, 0xb9, 0x95, 0x90, 0x51, 0x59, 0x72, 0x62, 0x06, 0x5b, 0xaa, 0x96, 0xa0, 0x96, 0x54, 0xc2, 0x96, 0x8b, 0x27, 0x98, 0x73, 0x01, + 0x24, 0xcb, 0xa8, 0x56, 0x4f, 0x72, 0xa0, 0x6c, 0xce, 0xc5, 0xca, 0x18, 0x53, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x51, 0xb6, 0x80, 0x94, 0x17, 0x3b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xcb, 0x50, 0xc8, + 0x25, 0x2d, 0x7c, 0x80, 0x89, 0x76, 0x28, 0xe9, 0x57, 0x06, 0xc9, 0x52, 0x74, 0xad, 0x5a, 0x71, 0xd8, 0xf1, 0xb5, 0x75, 0xa9, 0xe1, 0xbd, 0x0d, 0x4a, 0x0b, 0x1e, 0x50, 0x48, 0xed, 0xfa, 0xa5, + 0x7f, 0x01, 0xa7, 0x6a, 0x69, 0xd9, 0x5c, 0xfb, 0xde, 0x3d, 0xfb, 0xde, 0xf0, 0xaf, 0xc8, 0x0e, 0x18, 0x57, 0xb0, 0x96, 0x58, 0x6b, 0x00, 0x7c, 0x4e, 0xb1, 0x50, 0x40, 0x19, 0xa4, 0x7c, 0x55, + 0xe4, 0x94, 0xb0, 0xd4, 0xf2, 0x5b, 0x2f, 0xf7, 0x7a, 0x7c, 0x80, 0x9f, 0xac, 0x18, 0x3e, 0x53, 0x84, 0x32, 0x20, 0xc6, 0x21, 0xe0, 0xf3, 0x26, 0x19, 0x10, 0x65, 0xf8, 0x4b, 0x21, 0x00, 0xb0, + 0x54, 0xaa, 0x90, 0x9d, 0xf3, 0xf3, 0xed, 0x76, 0xeb, 0x13, 0x63, 0xb9, 0xcf, 0xc5, 0xe2, 0xbc, 0xf2, 0xf6, 0xfc, 0x76, 0xd0, 0x8d, 0x86, 0x49, 0xd4, 0xbe, 0xf4, 0x2f, 0x1a, 0x8c, 0xf7, 0x2c, + 0x47, 0x29, 0x41, 0xe0, 0xaf, 0x6b, 0x2a, 0x30, 0x83, 0xd9, 0x0e, 0x48, 0x51, 0xe4, 0x34, 0x25, 0xb3, 0x1c, 0x21, 0x27, 0x5b, 0x9d, 0x53, 0x93, 0x3a, 0x03, 0x0a, 0xca, 0x60, 0x2b, 0xa8, 0xa2, + 0x6c, 0xd1, 0x2a, 0xf9, 0x65, 0x05, 0x8d, 0x66, 0xe2, 0xea, 0x10, 0x56, 0xc6, 0x52, 0x79, 0x40, 0xc0, 0x19, 0x10, 0x9b, 0x35, 0x37, 0x4c, 0x60, 0x90, 0xb8, 0x70, 0x15, 0x26, 0x83, 0xa4, 0x05, + 0x8f, 0x83, 0xc9, 0xf5, 0xe8, 0x7e, 0x02, 0x8f, 0x61, 0x1c, 0x87, 0xc3, 0xc9, 0x20, 0x4a, 0x60, 0x14, 0x43, 0x77, 0x34, 0xec, 0x0d, 0x26, 0x83, 0xd1, 0x30, 0x81, 0x51, 0x1f, 0xc2, 0xe1, 0x4f, + 0x25, 0xef, 0x8f, 0x83, 0x61, 0xaf, 0x05, 0x48, 0xd5, 0x12, 0x05, 0xe0, 0x73, 0x21, 0xb4, 0x2b, 0x5c, 0x00, 0xd5, 0x11, 0xc6, 0xac, 0x81, 0xb3, 0xca, 0x0e, 0x8d, 0xa1, 0x7d, 0xe6, 0x64, 0x81, + 0x29, 0x9d, 0xd3, 0x14, 0x72, 0xc2, 0x16, 0x6b, 0xb2, 0x40, 0x58, 0xf0, 0x0d, 0x0a, 0xa6, 0x21, 0x54, 0xa0, 0x58, 0x51, 0xa9, 0xd3, 0x2d, 0x81, 0xb0, 0x0c, 0x72, 0xba, 0xa2, 0xca, 0x80, 0x4d, + 0x96, 0xcc, 0x47, 0x3e, 0xfa, 0xce, 0x1f, 0x5f, 0x94, 0x7f, 0x82, 0x48, 0x23, 0xf1, 0x8e, 0x6c, 0x90, 0x41, 0xa2, 0x88, 0x50, 0x70, 0x5f, 0xc0, 0x15, 0x51, 0xe9, 0x12, 0x64, 0x2a, 0x68, 0xd1, + 0x04, 0x55, 0x5c, 0x81, 0x22, 0x1a, 0x3e, 0xc0, 0x86, 0x08, 0xd9, 0x29, 0xcf, 0x6f, 0xc2, 0x87, 0x70, 0x7a, 0x3d, 0xba, 0x8b, 0xa0, 0x0d, 0x39, 0x4f, 0xcb, 0x7e, 0xc0, 0xe7, 0x40, 0xe0, 0xa6, + 0xf7, 0x23, 0x2c, 0xf9, 0x4a, 0xa3, 0x41, 0x34, 0x04, 0x8d, 0x0a, 0x5b, 0xb3, 0x95, 0x20, 0x6b, 0xc5, 0xe5, 0x6b, 0x52, 0x56, 0xda, 0xb6, 0xcb, 0x13, 0x09, 0x94, 0x49, 0x45, 0xf2, 0x1c, 0xb3, + 0x43, 0x91, 0x70, 0x17, 0x3e, 0x44, 0xc3, 0xe9, 0x55, 0x38, 0xe9, 0x5e, 0x4f, 0xa3, 0xee, 0xf5, 0x08, 0xda, 0x20, 0x51, 0x69, 0x74, 0x9e, 0x70, 0x76, 0xa2, 0x7f, 0x91, 0x19, 0xf4, 0xea, 0xe4, + 0x60, 0xba, 0xe4, 0x3a, 0x9f, 0xb6, 0x78, 0x66, 0xc6, 0xd3, 0x94, 0xaf, 0x56, 0x84, 0x65, 0xf2, 0x58, 0xde, 0x38, 0xbc, 0x4f, 0xa2, 0x63, 0x81, 0x5b, 0x42, 0x55, 0xd9, 0x7f, 0xe0, 0x09, 0x77, + 0x52, 0x09, 0xfe, 0x84, 0x30, 0xc3, 0xb9, 0xee, 0x75, 0xc8, 0x74, 0xcf, 0x69, 0x8a, 0x1a, 0x8d, 0x27, 0x09, 0xb4, 0xa1, 0x20, 0x82, 0xac, 0x50, 0xa1, 0x90, 0x50, 0x10, 0xd9, 0xe8, 0xaa, 0x37, + 0x64, 0x43, 0xe0, 0xe1, 0x0e, 0xb6, 0x4b, 0x64, 0x20, 0xd6, 0xcc, 0x00, 0xce, 0xa4, 0x64, 0x5f, 0xcc, 0x80, 0xfe, 0xc2, 0xd7, 0xf4, 0x19, 0xce, 0xd6, 0xf6, 0x25, 0x50, 0x25, 0x31, 0x9f, 0xb7, + 0x74, 0x67, 0xb1, 0x00, 0x46, 0xd5, 0x50, 0x19, 0xb4, 0x3f, 0x95, 0xd4, 0xed, 0x4f, 0x62, 0xcd, 0xbe, 0x64, 0xdb, 0xa2, 0xa3, 0x04, 0x61, 0xb2, 0xe0, 0x42, 0x05, 0x99, 0x9a, 0x4a, 0x9e, 0x3e, + 0xa1, 0x6a, 0x49, 0x14, 0x1b, 0x14, 0xc1, 0xae, 0x25, 0xd7, 0xb2, 0x40, 0x96, 0x05, 0xbb, 0x16, 0xc9, 0x32, 0x5d, 0x3a, 0xc1, 0xdf, 0x2e, 0x2e, 0x2e, 0x9a, 0x8e, 0x24, 0x3f, 0x0e, 0xc6, 0xd3, + 0xb8, 0x0b, 0x6d, 0x98, 0xe7, 0x64, 0x61, 0xcc, 0xa1, 0xb2, 0x6c, 0x0c, 0x9c, 0x64, 0x36, 0xac, 0x26, 0x5f, 0x22, 0x35, 0x6d, 0x4e, 0xfe, 0x09, 0x80, 0x2d, 0x45, 0x5e, 0xe1, 0x42, 0x77, 0xc2, + 0x3c, 0x07, 0xfd, 0x94, 0x53, 0x86, 0xb2, 0xec, 0x9c, 0x27, 0x1f, 0x4f, 0x4c, 0x57, 0x25, 0x12, 0x8f, 0x91, 0x41, 0xa5, 0x49, 0xa1, 0xf3, 0x51, 0xc3, 0x00, 0xf8, 0x7c, 0x5e, 0xc7, 0x4d, 0x51, + 0x95, 0xa3, 0xb6, 0xdf, 0x82, 0x01, 0xb6, 0x94, 0x65, 0x7c, 0xeb, 0x94, 0xe7, 0x9e, 0x8d, 0x83, 0x45, 0x52, 0x85, 0xa2, 0xd9, 0x4e, 0xf3, 0x2a, 0x93, 0xaf, 0x97, 0xba, 0x2c, 0x5c, 0x9c, 0x8f, + 0x74, 0x0e, 0xae, 0xf7, 0xf2, 0xb5, 0xe7, 0x42, 0x10, 0x80, 0xcb, 0x99, 0x0b, 0x46, 0x1a, 0x1c, 0x53, 0x38, 0xb5, 0x71, 0x9e, 0xae, 0x0b, 0xcf, 0x40, 0xf9, 0xd7, 0x35, 0xdd, 0x90, 0x1c, 0x99, + 0xd2, 0xb6, 0x7e, 0xa3, 0xcf, 0x1d, 0xa3, 0xc0, 0x50, 0x94, 0x42, 0x5d, 0x38, 0xd5, 0x4c, 0xae, 0x3e, 0x0a, 0xcc, 0x8b, 0x5e, 0x3c, 0x78, 0x88, 0x3c, 0xf3, 0xe7, 0x38, 0x9c, 0x5c, 0x7b, 0xee, + 0x99, 0x15, 0x1e, 0x3d, 0x63, 0xba, 0x56, 0x08, 0x44, 0x83, 0x48, 0x40, 0x86, 0x73, 0xca, 0x30, 0xb3, 0xa5, 0x5f, 0x21, 0xda, 0xdc, 0x5a, 0xfa, 0x4e, 0xa7, 0x73, 0x73, 0x93, 0x55, 0xde, 0x58, + 0x38, 0xec, 0xb5, 0x2e, 0xb8, 0xe2, 0x20, 0x9f, 0x68, 0x11, 0xa7, 0x63, 0x61, 0x21, 0x99, 0x2e, 0x31, 0x2d, 0xaf, 0xea, 0x42, 0xa0, 0x95, 0xdb, 0x02, 0xce, 0x52, 0x2c, 0xd3, 0x95, 0xe3, 0x82, + 0xa4, 0x3b, 0xf0, 0x67, 0x44, 0xd9, 0xca, 0x31, 0xed, 0xb5, 0x26, 0xf0, 0xd3, 0x55, 0x56, 0xd5, 0x14, 0x9d, 0x03, 0x3e, 0x53, 0xa9, 0x2a, 0x77, 0x3f, 0x5b, 0xac, 0x4d, 0x0b, 0x81, 0x5a, 0x82, + 0x0b, 0xa9, 0x46, 0xc4, 0x5b, 0x6f, 0xdf, 0xe7, 0x4f, 0x57, 0xd9, 0x3b, 0xfc, 0xfa, 0xad, 0xd3, 0xa9, 0x9d, 0x73, 0x3e, 0x4a, 0x54, 0xba, 0x4d, 0xe5, 0x8e, 0xa3, 0x83, 0x1d, 0xc5, 0xf1, 0x28, + 0x9e, 0x76, 0x47, 0xbd, 0x28, 0xb8, 0xb0, 0xb1, 0x9d, 0x70, 0xa0, 0x92, 0xe7, 0x44, 0x21, 0x50, 0xa6, 0x50, 0xe8, 0x86, 0xb7, 0x21, 0x82, 0x6a, 0x04, 0x49, 0x98, 0x0b, 0xbe, 0x82, 0x82, 0x4b, + 0x49, 0x35, 0xa0, 0x0a, 0x2e, 0x95, 0x8d, 0x8e, 0x6c, 0xc1, 0x16, 0xcd, 0xb4, 0x40, 0x18, 0x37, 0x37, 0xd9, 0x5e, 0x53, 0x43, 0xa7, 0xd1, 0x10, 0x04, 0x41, 0x00, 0xc9, 0x24, 0x8c, 0x27, 0xf0, + 0x10, 0xde, 0x0e, 0x7a, 0xa1, 0xbe, 0x12, 0xcd, 0x69, 0x9d, 0xaa, 0x7d, 0x73, 0x3e, 0x4c, 0xd3, 0xe8, 0xe9, 0xe6, 0x9a, 0xaf, 0xd0, 0x71, 0x34, 0xf8, 0x7c, 0xf3, 0x3f, 0x44, 0x42, 0x70, 0xd1, + 0x69, 0xb4, 0x73, 0x2d, 0x61, 0xae, 0x47, 0x3c, 0x5d, 0x51, 0x3b, 0xbe, 0x16, 0x80, 0x6c, 0x43, 0x05, 0x67, 0x7a, 0x6c, 0xf3, 0xe1, 0xef, 0xdf, 0x5e, 0x96, 0x8c, 0xe3, 0x1c, 0x75, 0xb9, 0x99, + 0x32, 0xd2, 0xfd, 0x6c, 0x2f, 0xa0, 0x72, 0xf7, 0x35, 0x7e, 0x8d, 0xe6, 0x95, 0x69, 0xbf, 0x9a, 0x67, 0x2f, 0xab, 0xd9, 0xfa, 0x0d, 0x8b, 0xe9, 0x8e, 0xb6, 0xf7, 0x9b, 0x37, 0xb5, 0x62, 0xdf, + 0x31, 0xbe, 0xa0, 0xb6, 0xdb, 0x71, 0x3a, 0x95, 0x4f, 0x8d, 0x34, 0xd7, 0xde, 0x7f, 0x9e, 0x51, 0xf6, 0xf9, 0x0b, 0xd9, 0x10, 0x1f, 0x9f, 0xd1, 0x06, 0x81, 0x32, 0xaa, 0xde, 0x8f, 0x00, 0x95, + 0x55, 0xeb, 0x27, 0x0c, 0x28, 0xdb, 0x90, 0x9c, 0x66, 0xfa, 0xe6, 0xc1, 0x54, 0x71, 0xb1, 0x6b, 0x84, 0xa0, 0x66, 0x09, 0x5e, 0x04, 0xfd, 0xff, 0x2c, 0x4a, 0x35, 0x70, 0xa2, 0x61, 0xef, 0x08, + 0x36, 0x4e, 0xa7, 0x8c, 0x89, 0xa1, 0xea, 0x53, 0x96, 0x19, 0xb5, 0x85, 0xe0, 0x5f, 0x30, 0x55, 0x30, 0xd3, 0xf6, 0x67, 0x54, 0xb4, 0x80, 0xfa, 0xe8, 0x9b, 0x57, 0xfb, 0x58, 0x80, 0x5a, 0x12, + 0x65, 0x06, 0x7d, 0x42, 0x99, 0x34, 0xef, 0xe6, 0x3c, 0xd7, 0x33, 0x91, 0xeb, 0xaf, 0x36, 0xcc, 0xb5, 0xe3, 0x50, 0x9f, 0xe4, 0xf9, 0x8c, 0xa4, 0x4f, 0xda, 0xaf, 0x74, 0x2d, 0x84, 0x76, 0x51, + 0x4f, 0xf3, 0xba, 0xf0, 0x6b, 0x59, 0x16, 0xbd, 0x06, 0x7b, 0x7e, 0x59, 0x60, 0x65, 0xcb, 0x19, 0xc7, 0xa3, 0x9b, 0xa8, 0x3b, 0xb9, 0x0a, 0x93, 0xa8, 0x37, 0x88, 0x83, 0x7d, 0xd3, 0x34, 0x8f, + 0x9e, 0x33, 0xe8, 0xeb, 0x0d, 0x62, 0xdf, 0xa0, 0x0e, 0xa9, 0x3d, 0x37, 0x08, 0x2a, 0xf8, 0x23, 0xcb, 0x7a, 0xa8, 0x30, 0x55, 0x57, 0x44, 0x62, 0x8f, 0x0a, 0x5b, 0xc4, 0x9f, 0xa2, 0xee, 0xd4, + 0xc8, 0xed, 0xf6, 0x3c, 0x73, 0xf2, 0x68, 0x9e, 0xaa, 0x73, 0xcf, 0xe9, 0xcc, 0x29, 0xcb, 0x2a, 0x9e, 0x41, 0x1f, 0xa2, 0x4f, 0x83, 0x44, 0xeb, 0x7b, 0x34, 0xf2, 0x3f, 0x6b, 0x4f, 0x4b, 0x05, + 0xb3, 0x92, 0xc6, 0x2c, 0x48, 0x4e, 0x9a, 0x81, 0xef, 0x6b, 0xf2, 0x8a, 0x30, 0x08, 0x5c, 0xad, 0xc2, 0x3d, 0xa0, 0x1d, 0x72, 0x55, 0x92, 0xd7, 0x8a, 0xb5, 0x19, 0x86, 0xa4, 0xa9, 0xd6, 0xe9, + 0x1c, 0x08, 0x7f, 0x3b, 0x38, 0x46, 0x97, 0x56, 0xee, 0xd6, 0x1e, 0xb8, 0xce, 0x1b, 0xfe, 0x77, 0x5e, 0xb3, 0xe2, 0x75, 0xb9, 0x75, 0x38, 0x5e, 0xca, 0x76, 0x3a, 0xc7, 0x82, 0x6d, 0x4e, 0xaa, + 0x48, 0xbd, 0x9a, 0x19, 0x13, 0xb8, 0xcf, 0x5f, 0x36, 0x2b, 0x3f, 0xe5, 0x6c, 0x4e, 0x17, 0x75, 0x96, 0x62, 0x24, 0x59, 0xb8, 0x5f, 0xf2, 0xba, 0xe6, 0x6d, 0xa3, 0xf9, 0x42, 0x64, 0x2e, 0xe4, + 0xe8, 0x59, 0x21, 0x2b, 0x87, 0xf3, 0xf2, 0xa0, 0x87, 0x39, 0xd9, 0x61, 0x16, 0x3d, 0x17, 0xc4, 0x9c, 0x3b, 0xfa, 0x06, 0x3a, 0xef, 0x83, 0xbb, 0x96, 0xa8, 0xe1, 0xf7, 0x2b, 0x64, 0x98, 0xd3, + 0x95, 0x0c, 0x5c, 0xf0, 0x3c, 0x5d, 0x38, 0x70, 0xfa, 0xdf, 0x9a, 0x76, 0x06, 0x19, 0x37, 0x45, 0x7c, 0xf3, 0x70, 0x37, 0xed, 0x8e, 0x86, 0xfd, 0xc1, 0x0f, 0xd3, 0x3d, 0xe7, 0x38, 0x09, 0xbe, + 0x7e, 0xfd, 0xfc, 0x6b, 0xad, 0xc8, 0xf9, 0x88, 0x2c, 0x2b, 0x0d, 0xff, 0xf6, 0x3d, 0x19, 0xde, 0xeb, 0xe7, 0x5e, 0x19, 0xe0, 0xd7, 0x63, 0x92, 0x44, 0x13, 0x9b, 0x2f, 0xd3, 0x59, 0xa2, 0x4f, + 0x51, 0xf0, 0x76, 0xff, 0x2b, 0x31, 0x16, 0x87, 0xe3, 0x71, 0x14, 0x4f, 0x6f, 0xc2, 0x38, 0x78, 0xd7, 0xfb, 0xad, 0x20, 0x45, 0x81, 0xa2, 0xbc, 0x10, 0xdb, 0xf6, 0xc9, 0xff, 0x42, 0xc4, 0xa1, + 0x9c, 0xdb, 0xf0, 0x7e, 0xd8, 0xbd, 0x8e, 0xe2, 0x80, 0x8b, 0x45, 0xb5, 0x72, 0x1a, 0x16, 0xbf, 0x62, 0x31, 0x73, 0xeb, 0x63, 0xf9, 0x70, 0x47, 0x28, 0x2b, 0xcb, 0xae, 0x37, 0x7a, 0x1c, 0xde, + 0x8e, 0xc2, 0xde, 0xf4, 0x3e, 0xbe, 0x0d, 0xdc, 0x6a, 0x6f, 0x15, 0x58, 0x70, 0xcb, 0xde, 0x58, 0x5f, 0xcb, 0x6d, 0xe0, 0x9c, 0xf2, 0x73, 0x45, 0x9e, 0x88, 0xa0, 0xe7, 0x07, 0x36, 0x9d, 0x5f, + 0xf8, 0x7f, 0xf1, 0xff, 0x7a, 0x78, 0xd6, 0x36, 0x67, 0xa5, 0xb5, 0x4e, 0x7f, 0x14, 0x1b, 0x18, 0x28, 0xfe, 0x84, 0x4c, 0x06, 0x1f, 0x5a, 0x97, 0x15, 0x10, 0x0c, 0x12, 0x42, 0x18, 0x0c, 0x7f, + 0x03, 0x09, 0xaf, 0xc7, 0xa2, 0x10, 0xbc, 0x40, 0xa1, 0x28, 0x4a, 0xf7, 0x0c, 0x7a, 0x23, 0x38, 0x75, 0xf4, 0xd0, 0x6e, 0x2a, 0xde, 0x0b, 0x75, 0xb9, 0x5b, 0xc2, 0x7b, 0x91, 0xbb, 0xa0, 0x33, + 0x75, 0xe0, 0xb3, 0xe7, 0x5d, 0x39, 0xf5, 0x44, 0x66, 0xa1, 0x6c, 0x2e, 0x9d, 0x3c, 0xe7, 0x5b, 0x20, 0x6b, 0xc5, 0x57, 0x44, 0x51, 0x3d, 0x9c, 0xec, 0x20, 0xe3, 0x5b, 0x56, 0x8d, 0xdb, 0xba, + 0xcb, 0x1e, 0x25, 0xa5, 0x1c, 0x2d, 0x4c, 0xa8, 0xdb, 0x29, 0x32, 0x25, 0xf4, 0xe4, 0x60, 0x06, 0x12, 0x3d, 0xc7, 0x19, 0x91, 0x12, 0xd6, 0xf2, 0x80, 0x1f, 0x2c, 0xbf, 0xae, 0x04, 0xdb, 0xed, + 0x65, 0xd9, 0xd1, 0x0b, 0xc1, 0x97, 0x74, 0x46, 0x55, 0x39, 0xc9, 0x69, 0x26, 0xca, 0x60, 0x46, 0x19, 0x11, 0x3b, 0xc8, 0x88, 0x22, 0x7e, 0x7d, 0xdd, 0x7a, 0x0d, 0x40, 0x79, 0x36, 0x04, 0xe5, + 0xf0, 0xfb, 0x30, 0x7c, 0x9c, 0x3e, 0x44, 0xf1, 0xd5, 0x28, 0xa9, 0xc6, 0x10, 0x25, 0xd6, 0xe8, 0x5a, 0x1a, 0xb3, 0xdf, 0xe8, 0x5b, 0xcd, 0x34, 0x9e, 0x43, 0x31, 0x86, 0xe0, 0xcc, 0x39, 0x03, + 0xcc, 0x25, 0xd6, 0x32, 0xed, 0x18, 0xaa, 0xe5, 0xc6, 0xd1, 0x78, 0x74, 0x1f, 0xdf, 0xd6, 0xb3, 0xef, 0x5e, 0xe6, 0x51, 0x9c, 0x5f, 0x70, 0xfc, 0xaf, 0x28, 0x2a, 0x4d, 0xfa, 0xdd, 0xde, 0x75, + 0xf9, 0x3a, 0xcf, 0xd8, 0x89, 0x32, 0xcd, 0xfc, 0xd0, 0xcb, 0xd6, 0x41, 0x56, 0xa9, 0x02, 0xdf, 0xf7, 0x0f, 0x99, 0x7b, 0x8d, 0xf7, 0x3a, 0xbf, 0x1d, 0xf0, 0x9a, 0xae, 0x55, 0x71, 0x32, 0x3f, + 0x05, 0xdf, 0xa2, 0x90, 0x4b, 0xcc, 0x73, 0x68, 0x77, 0xed, 0x36, 0xe3, 0x7e, 0xfb, 0x2f, 0xf7, 0x1f, 0xce, 0x57, 0x5f, 0xb9, 0xdf, 0x6c, 0x71, 0x96, 0xe6, 0x54, 0xdf, 0xbb, 0x01, 0x30, 0xdc, + 0xb6, 0xf9, 0xcc, 0xdc, 0xed, 0xc9, 0x4e, 0x2a, 0x5c, 0xf9, 0x43, 0x54, 0xfe, 0x23, 0xce, 0xba, 0x86, 0xe2, 0xfb, 0x92, 0x85, 0xce, 0xe1, 0xb4, 0xad, 0x23, 0x7e, 0xfa, 0xb3, 0x54, 0x82, 0xb2, + 0xc5, 0x2f, 0x9d, 0xce, 0x40, 0x0e, 0xd7, 0x79, 0x3e, 0x12, 0xd1, 0xaa, 0x50, 0xbb, 0xd3, 0x93, 0x32, 0x08, 0xf7, 0x49, 0x14, 0x0f, 0xc3, 0xbb, 0xc8, 0x3b, 0x39, 0x83, 0xb6, 0xd6, 0xfa, 0x1b, + 0xf4, 0xe3, 0x30, 0x49, 0x1e, 0x47, 0x71, 0xcf, 0x3b, 0x39, 0x3b, 0x3b, 0x83, 0x23, 0x03, 0xfd, 0xae, 0xc0, 0x0c, 0x99, 0xa2, 0x24, 0x97, 0x6f, 0x1a, 0x3b, 0x44, 0xa5, 0xe7, 0x87, 0x9a, 0xf4, + 0xd8, 0x98, 0x16, 0x1c, 0xeb, 0xb3, 0xae, 0xfd, 0xbb, 0xfc, 0xf9, 0x59, 0x4b, 0x4a, 0x50, 0x6c, 0x68, 0x8a, 0x63, 0x4e, 0x99, 0xba, 0x23, 0x8c, 0x2c, 0x50, 0xfc, 0xd2, 0xe9, 0x24, 0x98, 0xae, + 0x05, 0x55, 0xbb, 0xb1, 0xe0, 0x8a, 0xa7, 0x3c, 0x87, 0x00, 0x2c, 0xf5, 0xe1, 0xf9, 0x64, 0x57, 0xe0, 0x2f, 0x9d, 0xce, 0x24, 0x97, 0x1f, 0x2e, 0xbf, 0x87, 0x86, 0x13, 0x55, 0xe6, 0xfa, 0x34, + 0xc7, 0xd3, 0x93, 0xc3, 0xac, 0x19, 0xd3, 0x9a, 0x40, 0x38, 0x39, 0xab, 0xec, 0xfa, 0xfd, 0xf8, 0xea, 0x53, 0x46, 0xe5, 0x12, 0xb3, 0x03, 0x2c, 0xbd, 0x5a, 0x4c, 0xb6, 0xd3, 0xe8, 0x3d, 0x4b, + 0xd7, 0xae, 0x6d, 0x38, 0xb6, 0x01, 0x8d, 0x05, 0xdf, 0xd0, 0x4c, 0xaf, 0x84, 0xae, 0x54, 0x84, 0x65, 0x44, 0x64, 0xf4, 0x9f, 0x98, 0xb9, 0xb0, 0x25, 0x3b, 0xdd, 0x93, 0x04, 0x2a, 0x41, 0x71, + 0x53, 0x7e, 0x4e, 0xe9, 0xde, 0x0e, 0x80, 0x88, 0x85, 0xed, 0x15, 0x5b, 0x9a, 0xdb, 0x56, 0x63, 0x3e, 0xd0, 0x9a, 0xfd, 0x6d, 0xc6, 0xd5, 0x12, 0x1e, 0xcd, 0x2e, 0x5d, 0x7e, 0x39, 0x63, 0x9c, + 0xb5, 0xab, 0x67, 0x34, 0xeb, 0xa7, 0xbe, 0xb7, 0xfd, 0xc6, 0xbc, 0xd1, 0xbd, 0xeb, 0x4d, 0x6f, 0x07, 0xc3, 0x68, 0x1a, 0xc6, 0x3f, 0x24, 0x81, 0xf7, 0x9d, 0xe3, 0x78, 0x87, 0x17, 0x9b, 0x07, + 0x6f, 0x5d, 0x90, 0xd5, 0x1a, 0x3d, 0x1a, 0x4f, 0xea, 0x87, 0x5e, 0x74, 0x75, 0xff, 0x83, 0x3d, 0x6a, 0xa7, 0x39, 0x91, 0xb2, 0x20, 0x6a, 0xf9, 0xa2, 0x5d, 0xb9, 0xed, 0x5e, 0x79, 0xd9, 0xac, + 0xd6, 0xb9, 0xa2, 0x77, 0x3c, 0x5b, 0xe7, 0x38, 0x2e, 0x3b, 0x61, 0xaf, 0x9a, 0x4b, 0x83, 0x37, 0xe6, 0xca, 0x5a, 0x54, 0x75, 0x05, 0xee, 0x75, 0x97, 0x36, 0x7a, 0xe0, 0x7d, 0xa7, 0xfb, 0xa4, + 0xd9, 0x12, 0x6f, 0xa3, 0x87, 0xe8, 0x16, 0x3e, 0x40, 0x63, 0x2a, 0xaf, 0xa6, 0x1d, 0x7d, 0xbf, 0x9b, 0x83, 0x17, 0x2b, 0xe5, 0x87, 0xf2, 0xe2, 0x3f, 0x1a, 0x1f, 0x1a, 0x24, 0x5e, 0xfd, 0xb7, + 0xe7, 0xfc, 0x9e, 0x4d, 0x9d, 0x4b, 0x75, 0xb4, 0xaa, 0xd7, 0xdb, 0xe8, 0x9f, 0xb0, 0xab, 0x73, 0xa9, 0xde, 0x5b, 0xd6, 0xab, 0xd7, 0xbf, 0x21, 0xe1, 0x9d, 0x75, 0xbd, 0x7a, 0xbd, 0xdf, 0xd7, + 0xb5, 0x8b, 0xa5, 0x8f, 0x05, 0x29, 0x3f, 0xc3, 0x57, 0x9f, 0x22, 0x74, 0x85, 0x1d, 0x7f, 0xef, 0xab, 0xb7, 0x3e, 0xf3, 0x05, 0xe7, 0xe8, 0x03, 0x8e, 0xa1, 0x6a, 0x7c, 0xc1, 0x31, 0x52, 0x9d, + 0x26, 0xdd, 0x24, 0x8a, 0xef, 0x06, 0xc3, 0x70, 0x12, 0x69, 0x30, 0x37, 0x28, 0xf1, 0x99, 0x2a, 0x38, 0x4c, 0x95, 0x39, 0x3a, 0xbf, 0x3a, 0x3c, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xd4, 0x57, 0x5f, 0x8f, 0xd4, 0x36, 0x10, 0x7f, 0xdf, 0x4f, 0x11, 0xad, 0x78, 0x6c, 0xec, 0xdb, 0x03, 0xb5, 0xf4, 0x64, 0x82, + 0xae, 0xd5, 0xd1, 0x9e, 0xc4, 0xc1, 0x89, 0xa3, 0xa8, 0x6f, 0xc8, 0x97, 0xcc, 0x66, 0x0d, 0x89, 0x6d, 0xd9, 0xce, 0xee, 0x22, 0xc4, 0x77, 0xaf, 0x6c, 0xe7, 0x8f, 0x93, 0x38, 0x77, 0x07, 0x85, + 0x4a, 0xdd, 0xa7, 0xf5, 0xcc, 0x6f, 0xec, 0xf9, 0xe7, 0xdf, 0x38, 0xe4, 0xf9, 0xb1, 0xae, 0x92, 0x3d, 0x28, 0xcd, 0x04, 0x7f, 0xb6, 0xde, 0xa0, 0x93, 0x75, 0x02, 0x3c, 0x17, 0x05, 0xe3, 0xe5, + 0xb3, 0xf5, 0x5f, 0x6f, 0x5f, 0xa4, 0x4f, 0xd7, 0xcf, 0xb3, 0x15, 0x91, 0x4a, 0x7c, 0x80, 0xdc, 0x24, 0xc7, 0xba, 0xe2, 0xfa, 0xd9, 0x7a, 0x67, 0x8c, 0x3c, 0xc3, 0xb8, 0xa6, 0x7b, 0xe0, 0x88, + 0x4a, 0x9a, 0xef, 0x00, 0x09, 0x55, 0xe2, 0xeb, 0xd7, 0x57, 0xf8, 0x09, 0x3a, 0xb1, 0xbb, 0x38, 0xe4, 0xd9, 0x51, 0xb3, 0x1e, 0x7d, 0x38, 0x1c, 0xd0, 0xe1, 0xb1, 0xc3, 0x9d, 0x9e, 0x9c, 0x6c, + 0xf0, 0xdf, 0x57, 0x2f, 0x6f, 0xf2, 0x1d, 0xd4, 0x34, 0x65, 0x5c, 0x1b, 0xca, 0x73, 0x58, 0xaf, 0x92, 0xee, 0x77, 0xd4, 0xec, 0x4c, 0x3b, 0xed, 0x4b, 0x91, 0x53, 0xe3, 0xbc, 0xbb, 0xf7, 0xd4, + 0xc4, 0x22, 0x74, 0x0c, 0x72, 0xd4, 0x85, 0x17, 0xa6, 0x0e, 0x88, 0x8e, 0xba, 0x58, 0x67, 0xab, 0x24, 0x21, 0xb5, 0x28, 0xa0, 0x7a, 0xe7, 0xe3, 0xcf, 0x9c, 0x8e, 0xe0, 0x91, 0x6c, 0x65, 0x51, + 0x92, 0x2a, 0xe0, 0x26, 0x73, 0xee, 0x91, 0x52, 0x89, 0x46, 0x5e, 0x16, 0x99, 0x50, 0x25, 0xd2, 0x52, 0x31, 0x5e, 0x6e, 0x15, 0xad, 0xe1, 0x20, 0xd4, 0x47, 0x74, 0x2b, 0x84, 0x21, 0xb8, 0x43, + 0x78, 0x3c, 0x55, 0x86, 0x6d, 0x69, 0x6e, 0x2e, 0x8b, 0xcc, 0xc3, 0x53, 0x8b, 0x4a, 0xb5, 0xa1, 0xca, 0x80, 0x4a, 0xfd, 0xde, 0x04, 0x07, 0x30, 0x6f, 0xd7, 0x56, 0x25, 0x3b, 0x45, 0x3f, 0xa3, + 0x5f, 0x08, 0xee, 0x96, 0x5e, 0xa9, 0xa0, 0xa2, 0x86, 0xed, 0xe1, 0x9a, 0x9a, 0x1d, 0x76, 0x91, 0xe0, 0xce, 0xc9, 0x55, 0xe0, 0x63, 0x2e, 0x6a, 0x04, 0x47, 0x5a, 0xcb, 0x0a, 0x10, 0xec, 0x81, + 0x1b, 0x3d, 0xf2, 0x2e, 0xf4, 0x6d, 0xdb, 0xf0, 0xdc, 0xe6, 0x79, 0xea, 0x49, 0xef, 0x87, 0xcd, 0xdb, 0x26, 0xbd, 0x79, 0x75, 0x7e, 0x7d, 0xf3, 0xe7, 0xeb, 0xb7, 0x23, 0x87, 0x08, 0xa7, 0x35, + 0x64, 0x37, 0x2e, 0xba, 0xe4, 0xf7, 0x4a, 0x34, 0x45, 0xf2, 0xa2, 0xdd, 0xee, 0xec, 0xec, 0xc2, 0x9d, 0x9b, 0x5c, 0x78, 0x37, 0x08, 0x76, 0x58, 0x6b, 0x54, 0x80, 0xce, 0x15, 0x93, 0x16, 0x95, + 0x9d, 0x27, 0x51, 0xeb, 0x9f, 0x92, 0x46, 0x0f, 0xd2, 0x8b, 0x36, 0x82, 0xd0, 0xd0, 0xd7, 0x47, 0x09, 0x09, 0xca, 0x30, 0xd0, 0x6d, 0x7a, 0x3e, 0xd0, 0x3d, 0x45, 0x9d, 0x83, 0x9b, 0x0d, 0xc1, + 0x23, 0x81, 0xc7, 0xb4, 0xc5, 0xc8, 0xed, 0xd6, 0xbd, 0xea, 0xf4, 0xe4, 0x74, 0x83, 0x4e, 0xd0, 0x29, 0xc1, 0x51, 0xf5, 0xc8, 0x92, 0xbb, 0x0a, 0xa0, 0x21, 0x3f, 0x9b, 0x0d, 0x7a, 0xd2, 0x1b, + 0x4e, 0xb4, 0xde, 0x32, 0x17, 0xb5, 0x64, 0x95, 0xad, 0x7a, 0xd5, 0x94, 0x8c, 0xf7, 0xda, 0xc7, 0xe8, 0x29, 0xda, 0x10, 0xbc, 0xa4, 0xf6, 0xc6, 0xbe, 0xab, 0x3b, 0x0c, 0x92, 0xd4, 0xb6, 0x9d, + 0x01, 0xa5, 0x33, 0xa3, 0x1a, 0x20, 0x78, 0x59, 0x1f, 0xb5, 0xd7, 0xa2, 0x51, 0x39, 0xb8, 0xec, 0xc4, 0x35, 0x51, 0x2b, 0x43, 0x55, 0x09, 0x26, 0x66, 0xd5, 0x6a, 0xbc, 0x55, 0x4b, 0x18, 0xe8, + 0xb6, 0x61, 0x55, 0xd1, 0x6e, 0x78, 0xd1, 0x12, 0x4b, 0xe6, 0x78, 0x85, 0xe0, 0x3b, 0x31, 0xe3, 0x6d, 0x14, 0x48, 0xa1, 0x0c, 0xe3, 0x25, 0x12, 0x8d, 0x91, 0x8d, 0x59, 0xda, 0x6a, 0x11, 0xe7, + 0x6f, 0x48, 0xd0, 0x26, 0xbe, 0x01, 0x25, 0xf0, 0x02, 0x78, 0xfe, 0xe9, 0x8a, 0x72, 0x5a, 0x42, 0x3d, 0x5c, 0xf2, 0x5e, 0xd5, 0xf7, 0xd4, 0x08, 0x9f, 0xf5, 0x4c, 0x75, 0x27, 0x1d, 0xb8, 0xe6, + 0x99, 0xf0, 0xc1, 0x02, 0x27, 0x38, 0x68, 0x1a, 0x1e, 0x3b, 0xa7, 0x84, 0x11, 0x2d, 0x3c, 0xfa, 0x1c, 0xeb, 0xd0, 0x2f, 0x13, 0xa2, 0x70, 0x26, 0xe6, 0x93, 0x84, 0x4c, 0x8a, 0x9a, 0x60, 0xf7, + 0x6f, 0x50, 0xe8, 0x5c, 0x48, 0xc8, 0x58, 0x6d, 0x93, 0x46, 0xb0, 0x5f, 0x75, 0xc1, 0xe2, 0x69, 0xb4, 0x81, 0xa4, 0x4d, 0x4a, 0x88, 0x09, 0x33, 0xb8, 0x8a, 0x26, 0x30, 0x92, 0xbe, 0xaf, 0xe5, + 0xd2, 0xfb, 0xd9, 0x94, 0xe6, 0xa6, 0xa1, 0x46, 0xa8, 0x08, 0x9f, 0xce, 0x03, 0xfa, 0x2f, 0x1c, 0x3a, 0xc0, 0xed, 0xb6, 0x6a, 0x8e, 0x3f, 0xc2, 0x9f, 0x78, 0x77, 0x2d, 0xf6, 0x56, 0xe7, 0x51, + 0x47, 0xf4, 0xd6, 0xb5, 0x1f, 0xe1, 0x16, 0x1c, 0x25, 0x28, 0x66, 0x3b, 0x81, 0x56, 0x0f, 0xf1, 0xce, 0x13, 0x65, 0xac, 0xdb, 0xe7, 0xbd, 0x3e, 0x26, 0xd5, 0x69, 0xb3, 0xff, 0x7b, 0xdf, 0xbf, + 0xa9, 0xc4, 0x06, 0x74, 0x64, 0x7e, 0xf7, 0xd7, 0xcb, 0xab, 0x83, 0xcb, 0x35, 0x75, 0x73, 0x7a, 0xb1, 0xac, 0xc8, 0x71, 0x62, 0x0b, 0xf7, 0xc3, 0x60, 0xa0, 0x21, 0xbf, 0xce, 0x1e, 0x46, 0x41, + 0xd1, 0x88, 0x96, 0x63, 0xf2, 0x8f, 0x24, 0x7f, 0xc2, 0x02, 0x01, 0xe5, 0x82, 0x6f, 0x59, 0xd9, 0x28, 0x6a, 0x46, 0x2c, 0x63, 0x35, 0x15, 0xd5, 0x9a, 0x6d, 0x19, 0xa8, 0xec, 0xd1, 0x67, 0x05, + 0x92, 0xe6, 0x1f, 0x69, 0x09, 0x68, 0x10, 0x7f, 0x21, 0x38, 0xc0, 0x84, 0xa6, 0xac, 0xa6, 0x25, 0x84, 0x92, 0x2e, 0x07, 0xa0, 0x32, 0x49, 0x3f, 0x82, 0x11, 0x6e, 0x65, 0xb7, 0xd4, 0xb8, 0x55, + 0x9c, 0x19, 0xc6, 0x3f, 0x91, 0x6e, 0x35, 0x31, 0x06, 0xbe, 0x1f, 0x4b, 0x92, 0x84, 0xfc, 0x76, 0xfd, 0xfe, 0xd5, 0xf9, 0xdb, 0xcb, 0x77, 0x17, 0xef, 0x2f, 0xaf, 0xce, 0xff, 0xb8, 0xc8, 0xb6, + 0xb4, 0xd2, 0x40, 0xf0, 0x54, 0x3c, 0xde, 0x08, 0x4f, 0x76, 0x22, 0x78, 0xe2, 0xab, 0x1d, 0xdb, 0x91, 0x8c, 0x10, 0x3c, 0xae, 0xd3, 0xd7, 0x95, 0xed, 0xce, 0x4b, 0x14, 0x2d, 0x1f, 0x7d, 0x58, + 0xf5, 0xbe, 0xf2, 0x4a, 0x39, 0x1b, 0x38, 0x42, 0xde, 0xd8, 0xd8, 0xf4, 0x28, 0x11, 0xbd, 0x78, 0x92, 0x31, 0x56, 0xb8, 0x9e, 0x4f, 0x4b, 0xe0, 0xa0, 0xa8, 0x01, 0x82, 0x59, 0x31, 0x81, 0x94, + 0x82, 0x56, 0x7a, 0x56, 0x1f, 0x2b, 0x9d, 0x9a, 0x3a, 0xd9, 0xa4, 0x22, 0x33, 0x6b, 0x82, 0xa3, 0xbe, 0xdc, 0xe5, 0xe1, 0xb7, 0x39, 0xf7, 0x3d, 0xfc, 0x0a, 0x84, 0x3a, 0xde, 0x2c, 0xdd, 0xaa, + 0x1d, 0xb2, 0x2d, 0x17, 0xac, 0xdc, 0xb3, 0x5f, 0x0a, 0xcd, 0x8c, 0x50, 0xc3, 0x54, 0xed, 0x45, 0x03, 0xc3, 0xb1, 0xbe, 0x29, 0x14, 0x54, 0x40, 0xb5, 0x7d, 0x4b, 0x0c, 0x51, 0x8e, 0x1e, 0xeb, + 0x6f, 0x7a, 0x40, 0xf7, 0x2c, 0x77, 0x90, 0x46, 0x55, 0x59, 0xf7, 0x31, 0x65, 0x0f, 0x68, 0xfb, 0x13, 0x31, 0x81, 0xdb, 0x2d, 0x09, 0xb6, 0x98, 0x0e, 0xaf, 0x39, 0x95, 0x7a, 0x27, 0x8c, 0x0e, + 0xbb, 0x86, 0xd3, 0xdb, 0x0a, 0x8a, 0xee, 0x96, 0x75, 0xcb, 0x3e, 0xe2, 0x89, 0x0d, 0xc1, 0xe3, 0x48, 0x82, 0x75, 0xf7, 0xdc, 0xf0, 0x59, 0x79, 0x33, 0xcf, 0xc1, 0x44, 0xf1, 0xbf, 0xcf, 0x44, + 0x2c, 0x9e, 0x99, 0xb4, 0x9f, 0x15, 0x52, 0x89, 0x2d, 0xab, 0x86, 0x64, 0xf8, 0x65, 0x98, 0x83, 0x6e, 0xc4, 0x06, 0xa1, 0x4f, 0x3f, 0x99, 0x92, 0xb6, 0x97, 0x66, 0x9c, 0x9d, 0xd9, 0x6e, 0x75, + 0xc5, 0x98, 0xab, 0x06, 0x4b, 0x7f, 0x42, 0xea, 0x5a, 0xd5, 0x08, 0x51, 0xe9, 0xe0, 0xb3, 0xe8, 0x57, 0x64, 0xbf, 0x16, 0x96, 0x11, 0xc3, 0x1d, 0x98, 0xf9, 0x14, 0x7d, 0x87, 0x2f, 0xbc, 0xc4, + 0x27, 0x8c, 0xfa, 0xa1, 0xe1, 0xcc, 0x20, 0x59, 0x51, 0xb3, 0x15, 0xaa, 0x8e, 0x70, 0xe8, 0x98, 0x45, 0x1d, 0x3c, 0xed, 0xe0, 0x69, 0x45, 0x1b, 0x9e, 0xef, 0x20, 0xf2, 0x8e, 0x6c, 0x4d, 0x17, + 0x66, 0xbb, 0xd3, 0xcd, 0x9e, 0x21, 0xb1, 0xc7, 0xb3, 0x93, 0x06, 0x63, 0x3e, 0x49, 0xe6, 0xa3, 0x3e, 0x90, 0x85, 0xa2, 0x49, 0xa4, 0xa5, 0xa2, 0xb4, 0xda, 0xd7, 0x68, 0x48, 0x6d, 0x34, 0xda, + 0x71, 0xbc, 0x6d, 0x39, 0xee, 0x9f, 0x18, 0xce, 0x70, 0x98, 0x1a, 0x8b, 0x65, 0x8c, 0x4d, 0x0e, 0x67, 0x0b, 0x47, 0x03, 0x5c, 0x3b, 0xb6, 0xf3, 0xdf, 0xa9, 0x81, 0x60, 0x8a, 0x8c, 0xcd, 0x99, + 0xb1, 0x6a, 0xaa, 0x09, 0xe6, 0xcd, 0xbc, 0xcb, 0x03, 0x90, 0xdc, 0x51, 0xdd, 0xd5, 0xcb, 0xff, 0x9f, 0x63, 0xa2, 0xc4, 0xdf, 0x6b, 0x5a, 0xe3, 0x39, 0xf1, 0x3b, 0xc4, 0x9c, 0xfc, 0xbd, 0x78, + 0xd1, 0xf1, 0xfb, 0x42, 0x72, 0x19, 0x7e, 0x48, 0x4c, 0xed, 0xbd, 0xfc, 0xe6, 0xb0, 0xdc, 0x41, 0xdf, 0x2b, 0xae, 0xd8, 0x70, 0xf3, 0xf2, 0xd9, 0xf3, 0x07, 0x4f, 0xdf, 0xb5, 0x38, 0x7c, 0xf4, + 0xe2, 0x80, 0xc6, 0xfa, 0x85, 0xce, 0x56, 0xfd, 0xb7, 0x7e, 0xb6, 0xfa, 0x27, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x2b, 0x71, 0x30, 0x6c, 0xe6, 0x04, 0x00, 0x00, 0xbd, 0x14, 0x00, + 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x73, + 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, + 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, + 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, + 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, + 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x45, 0x63, 0x68, 0x6f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x94, 0x54, 0x4d, 0x4f, + 0xe3, 0x30, 0x10, 0xbd, 0xe7, 0x57, 0x8c, 0x72, 0x4a, 0x50, 0xe5, 0x70, 0xa6, 0x80, 0x80, 0x36, 0x40, 0x56, 0x2c, 0x45, 0x6d, 0x83, 0xb4, 0xb7, 0xba, 0xce, 0x34, 0x35, 0x24, 0xb6, 0x65, 0x3b, + 0x65, 0x2b, 0xd4, 0xff, 0xbe, 0x72, 0x3e, 0x4a, 0xa9, 0xd8, 0x08, 0x7a, 0xe9, 0x78, 0x32, 0x7e, 0xf3, 0xe6, 0xcd, 0x8c, 0x15, 0x65, 0xaf, 0x34, 0x47, 0x40, 0xb6, 0x96, 0x43, 0xcf, 0xe3, 0xa5, + 0x92, 0xda, 0x82, 0xd4, 0x39, 0x31, 0x4a, 0x73, 0x91, 0xaf, 0x34, 0x2d, 0xf1, 0x4d, 0xea, 0x57, 0xc2, 0x0a, 0x59, 0x65, 0x64, 0x55, 0x09, 0x66, 0xb9, 0x14, 0xcd, 0x11, 0x37, 0x28, 0x2c, 0x19, + 0x39, 0x33, 0x76, 0xe6, 0x6f, 0x34, 0x86, 0xe6, 0x78, 0x53, 0xf1, 0x22, 0x43, 0x3d, 0xfc, 0x01, 0xdc, 0x1b, 0x2e, 0x49, 0x65, 0x79, 0x41, 0xee, 0x91, 0x66, 0xa8, 0x53, 0xcb, 0x0b, 0xd3, 0x7b, + 0x7f, 0x6d, 0xad, 0x22, 0xf7, 0xd6, 0xaa, 0xe6, 0x42, 0x7f, 0x70, 0x59, 0xf3, 0xe2, 0x22, 0x27, 0x2d, 0xc3, 0xde, 0x68, 0x63, 0x51, 0xa3, 0xb4, 0x5b, 0x85, 0x64, 0x24, 0x4b, 0x25, 0x05, 0x0a, + 0xfb, 0xa1, 0xcd, 0x0b, 0xdd, 0x50, 0x22, 0xd0, 0x92, 0x74, 0x9a, 0x0c, 0x3f, 0x39, 0x6b, 0xfe, 0x69, 0x9a, 0x8c, 0xbf, 0x70, 0xef, 0x0b, 0xbd, 0x6d, 0x8d, 0x2f, 0x62, 0x0a, 0x99, 0xd7, 0x1c, + 0x1f, 0x70, 0x83, 0x45, 0xdf, 0x77, 0x99, 0xe7, 0x4e, 0xdd, 0x2e, 0xc2, 0x58, 0x6a, 0x39, 0xfb, 0x8e, 0xca, 0x7d, 0x4d, 0xab, 0x25, 0x27, 0x27, 0x43, 0xcf, 0xbb, 0xda, 0x57, 0x1d, 0xf8, 0x6e, + 0x2e, 0xfc, 0xd0, 0x53, 0xd5, 0xb2, 0xe0, 0x0c, 0x58, 0x41, 0x8d, 0x81, 0x98, 0xad, 0x65, 0x57, 0x06, 0xf0, 0x52, 0x15, 0x58, 0xa2, 0xb0, 0x06, 0x3a, 0xdf, 0x79, 0x8b, 0x78, 0x3e, 0xb3, 0x8e, + 0xcd, 0xe5, 0x00, 0x8e, 0x1c, 0x97, 0xf0, 0xee, 0x01, 0x28, 0xcd, 0x37, 0xd4, 0x62, 0x47, 0x7f, 0xc5, 0x05, 0x2d, 0xa0, 0xa9, 0x0d, 0x1e, 0x26, 0x77, 0x77, 0xf1, 0x14, 0x2e, 0xda, 0x33, 0xc9, + 0xd1, 0x36, 0x56, 0xe0, 0x41, 0xfd, 0x3b, 0xe4, 0x40, 0x6a, 0x5a, 0x2e, 0xe6, 0x91, 0x96, 0x18, 0x84, 0xe1, 0xd0, 0xf3, 0x00, 0xae, 0x26, 0x1b, 0xd4, 0x9a, 0x67, 0xe8, 0x52, 0x35, 0xf4, 0x8f, + 0x68, 0x00, 0x55, 0xaa, 0xd8, 0x06, 0xc7, 0x5e, 0x2e, 0x54, 0xd5, 0x89, 0x12, 0xd6, 0x4c, 0x01, 0xa2, 0x93, 0x26, 0xef, 0x09, 0xfc, 0x99, 0xa4, 0x53, 0x18, 0x4d, 0xc6, 0x31, 0xdc, 0xc7, 0xd3, + 0xb8, 0xf5, 0x76, 0x1f, 0xe7, 0x7a, 0x0b, 0xba, 0x12, 0x82, 0x8b, 0x1c, 0x16, 0xe5, 0x46, 0x80, 0x45, 0x63, 0x17, 0x04, 0xe0, 0x3a, 0xcb, 0xa0, 0x94, 0x1a, 0x6b, 0x07, 0x50, 0x03, 0x5b, 0x59, + 0x01, 0x93, 0x19, 0x02, 0x17, 0xb0, 0x70, 0xce, 0xc8, 0xf5, 0x39, 0x72, 0x72, 0x47, 0xb3, 0xba, 0x89, 0x1f, 0x0d, 0x32, 0xd7, 0x4a, 0x15, 0x9c, 0x51, 0x57, 0xeb, 0x1c, 0x8d, 0x35, 0x0b, 0xd2, + 0x26, 0x8c, 0x9a, 0xff, 0x83, 0x35, 0x80, 0xf5, 0x81, 0x7d, 0x01, 0x07, 0xdb, 0x44, 0x56, 0x5a, 0x96, 0x6d, 0x59, 0xc1, 0x61, 0x8d, 0x4e, 0xb8, 0xf6, 0x46, 0xa7, 0x1d, 0x40, 0xdb, 0x01, 0x37, + 0x73, 0x41, 0x3d, 0x8f, 0x24, 0x79, 0xbc, 0x9d, 0x0c, 0xc0, 0x4f, 0xdc, 0x4d, 0x18, 0xc5, 0x90, 0x64, 0x67, 0xef, 0xa7, 0x3b, 0x7f, 0x70, 0x98, 0xd1, 0x41, 0xdd, 0x72, 0x6d, 0x6c, 0x90, 0x8c, + 0x1d, 0xd4, 0xf7, 0x90, 0x66, 0x0a, 0x19, 0x3c, 0xa3, 0x36, 0x5c, 0x8a, 0x3e, 0xcc, 0xd9, 0x53, 0x3c, 0x7a, 0x8e, 0xa7, 0xb3, 0x64, 0xf2, 0xf8, 0x03, 0x70, 0x59, 0x69, 0x86, 0xbd, 0xb0, 0x93, + 0x74, 0x3a, 0x8a, 0x7f, 0x80, 0x58, 0x2d, 0x5f, 0x90, 0xd9, 0x5e, 0xc8, 0xf4, 0xe6, 0x57, 0x3c, 0x9a, 0xef, 0x31, 0x9b, 0xd1, 0x6a, 0x26, 0x0b, 0x2e, 0xe0, 0x58, 0xfd, 0x27, 0xba, 0x2d, 0x24, + 0xcd, 0x82, 0xef, 0x51, 0x78, 0x3f, 0xdd, 0x81, 0x3f, 0x68, 0x40, 0xf6, 0xed, 0xd2, 0x68, 0x2b, 0x2d, 0xe0, 0x7f, 0x4f, 0x31, 0x79, 0xe3, 0x76, 0x3d, 0xa6, 0x96, 0x36, 0x9d, 0x0f, 0xdb, 0x2d, + 0x02, 0x20, 0x06, 0xed, 0x7c, 0xab, 0xb0, 0xdb, 0x74, 0x77, 0x4e, 0xb2, 0xc0, 0xbd, 0x62, 0x44, 0x53, 0x91, 0xc9, 0xd2, 0x99, 0x41, 0x48, 0xac, 0x6c, 0x8a, 0x08, 0xc2, 0xcf, 0x97, 0x5b, 0x35, + 0x02, 0xdf, 0x6d, 0x24, 0xd4, 0x6f, 0x8b, 0x7f, 0x14, 0x51, 0x77, 0x20, 0x48, 0xa7, 0x09, 0x61, 0x1a, 0xa9, 0xc5, 0xc0, 0x77, 0xa2, 0x9d, 0x45, 0x11, 0xfe, 0xa5, 0xee, 0xf5, 0x20, 0x4c, 0x96, + 0x51, 0x93, 0x3e, 0x24, 0x4b, 0x47, 0xb8, 0x51, 0x62, 0xe7, 0xed, 0xbc, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x49, 0x1e, 0xc2, 0x1b, 0x96, 0x02, 0x00, 0x00, 0xa0, 0x06, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, + 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, + 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x84, 0x8f, 0x3d, 0x4e, 0xc0, 0x30, 0x0c, 0x85, 0x77, 0x9f, 0xc2, 0x63, 0x91, 0x50, 0x2e, 0xd0, 0x85, 0x1f, 0x71, 0x82, 0x8e, + 0x88, 0xc1, 0x4d, 0xd3, 0x60, 0x35, 0x8d, 0x23, 0xc7, 0x29, 0x03, 0xea, 0xdd, 0x11, 0x6d, 0x07, 0x10, 0x08, 0x56, 0xfb, 0x7b, 0x9f, 0xfd, 0x0a, 0xf9, 0x85, 0x62, 0xc0, 0xe0, 0x5f, 0xa5, 0x07, + 0xe0, 0xb5, 0x88, 0x1a, 0x8a, 0x46, 0x57, 0x8b, 0x72, 0x8e, 0xb3, 0xd2, 0x1a, 0xde, 0x44, 0x17, 0x37, 0x8a, 0x98, 0x1b, 0x8e, 0xe1, 0x7d, 0x29, 0x89, 0x3d, 0x19, 0x4b, 0xee, 0xff, 0x8d, 0x50, + 0x33, 0xf1, 0x92, 0x67, 0x8e, 0x4d, 0xc3, 0x25, 0x78, 0x10, 0xb1, 0x6f, 0x12, 0xb8, 0xfb, 0x75, 0x01, 0xa5, 0x8d, 0x89, 0x3d, 0xfa, 0x44, 0xb5, 0xe2, 0x89, 0x3c, 0x26, 0x69, 0xd3, 0xd3, 0x16, + 0xb2, 0xd5, 0x2f, 0x24, 0xbe, 0x03, 0xe2, 0x45, 0x57, 0x23, 0x63, 0x8f, 0x9b, 0xf0, 0x84, 0x2b, 0x71, 0xee, 0x06, 0xfb, 0x0c, 0x3e, 0xbf, 0x20, 0x69, 0xac, 0x37, 0x07, 0x8a, 0xf8, 0xa3, 0x8a, + 0xd3, 0x96, 0xbb, 0xbf, 0x6e, 0xb8, 0xe3, 0x8d, 0xdb, 0xd3, 0xd2, 0x03, 0xe2, 0x0e, 0x3b, 0x7c, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x0a, 0x4c, 0x84, 0x0a, 0xaa, 0x00, 0x00, + 0x00, 0x41, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2a, 0x2e, 0x28, 0xca, 0xcc, 0x4b, 0xd7, 0x4b, 0xce, 0xc9, 0x2f, 0x4d, 0xd1, 0x4b, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, + 0xd3, 0x4b, 0x49, 0x4d, 0xcb, 0xcc, 0xcb, 0x04, 0x31, 0x6d, 0x61, 0x62, 0x41, 0xf9, 0xa5, 0x25, 0xa9, 0x45, 0x5c, 0xd8, 0xd5, 0x17, 0xe5, 0x97, 0x96, 0x64, 0xe6, 0xa5, 0xeb, 0xa6, 0x56, 0x14, + 0x14, 0xa5, 0x16, 0x17, 0x83, 0xf4, 0x65, 0xa4, 0x26, 0xa6, 0xa4, 0x16, 0x15, 0x47, 0xab, 0x27, 0xa7, 0xea, 0x96, 0x54, 0x16, 0xa4, 0xaa, 0xc7, 0x72, 0x01, 0x02, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0xfd, 0x80, 0x5f, 0x6d, 0x54, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, + 0x53, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x73, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0xdc, 0x55, 0x5d, 0x6f, 0x22, 0x37, 0x14, 0x7d, 0x9f, 0x5f, 0x71, 0xc5, 0xd3, 0x20, 0x8d, 0x1c, 0xda, 0xa7, 0xd5, 0x52, 0xaa, 0x25, 0x64, 0xa4, 0x65, 0xd5, + 0x00, 0x1a, 0x86, 0xad, 0xfa, 0xb4, 0x32, 0x9e, 0x1b, 0xc6, 0x59, 0x63, 0x7b, 0xed, 0x3b, 0x90, 0x68, 0xb5, 0xff, 0xbd, 0xf2, 0x0c, 0x90, 0x21, 0x45, 0x84, 0xaa, 0x42, 0x6a, 0x9b, 0x97, 0x98, + 0xf1, 0xb9, 0xdf, 0xe7, 0xf8, 0x5a, 0x2e, 0xbe, 0xf2, 0x15, 0x02, 0x8a, 0xd2, 0xf4, 0xa3, 0x48, 0xae, 0xad, 0x71, 0x04, 0x9e, 0x38, 0x49, 0x01, 0xc6, 0xad, 0x58, 0xc9, 0xd7, 0xc2, 0xa1, 0x27, + 0x76, 0xcf, 0x49, 0x94, 0xe8, 0x86, 0xde, 0xa3, 0x23, 0xc6, 0xeb, 0x7f, 0x79, 0xc9, 0xa9, 0x7f, 0x81, 0x91, 0x67, 0xf8, 0xad, 0xe2, 0x2a, 0x37, 0x97, 0x81, 0xb5, 0xa1, 0x49, 0xa5, 0xd4, 0x67, + 0xae, 0x2a, 0x3c, 0x65, 0xe1, 0xad, 0x93, 0x7a, 0xf5, 0xe0, 0xf8, 0x1a, 0xb7, 0xc6, 0x7d, 0x65, 0x42, 0x99, 0xaa, 0x60, 0x0f, 0x95, 0x16, 0x24, 0x8d, 0x6e, 0x7e, 0xe2, 0x06, 0x35, 0xb1, 0x51, + 0x38, 0xa6, 0xe1, 0x78, 0x8f, 0xde, 0xf3, 0x15, 0x2e, 0x48, 0x2a, 0xcf, 0xc6, 0x77, 0x57, 0x71, 0x3b, 0x9f, 0x2e, 0xb2, 0x51, 0x7a, 0x1d, 0xd7, 0xb3, 0x74, 0xf4, 0x39, 0xcd, 0xe6, 0xe3, 0xe9, + 0xe4, 0x3a, 0xfe, 0x17, 0xb7, 0x9f, 0xd2, 0x51, 0x7e, 0x15, 0xdf, 0xf9, 0x1f, 0xb3, 0xf4, 0x85, 0x5b, 0x8f, 0x7c, 0xc3, 0x99, 0x46, 0x62, 0x8b, 0x6c, 0xdc, 0x3f, 0xfa, 0x58, 0x91, 0x54, 0x6c, + 0xb1, 0x68, 0x0d, 0x27, 0x84, 0x7f, 0xac, 0xb4, 0x24, 0xf6, 0x58, 0x59, 0x49, 0xe8, 0x18, 0xb7, 0x92, 0xe5, 0xe8, 0xe9, 0x08, 0xf2, 0x3a, 0xc3, 0x25, 0x72, 0xed, 0xd9, 0x03, 0x17, 0x64, 0xdc, + 0x33, 0xe3, 0x5a, 0x9b, 0x50, 0x8d, 0xd1, 0x6c, 0x58, 0x91, 0xd9, 0x4a, 0x87, 0xc5, 0x79, 0x73, 0x63, 0x88, 0x51, 0x60, 0xa4, 0x30, 0x9a, 0xf0, 0x89, 0xd8, 0xbc, 0x46, 0xdc, 0x1a, 0x43, 0x6f, + 0xc7, 0x7e, 0xc3, 0x98, 0xfd, 0x8e, 0xcb, 0x54, 0x6f, 0xa4, 0x33, 0x7a, 0x8d, 0xfa, 0x52, 0x5f, 0x5b, 0x5c, 0x32, 0xa1, 0x64, 0x68, 0x72, 0x70, 0x92, 0xa1, 0xa7, 0x1c, 0xd7, 0x56, 0x71, 0xc2, + 0xb3, 0x1e, 0x4a, 0x22, 0xcb, 0x3e, 0x12, 0xd9, 0x8f, 0xc8, 0x0b, 0x74, 0xfe, 0x6d, 0xf0, 0x3d, 0x16, 0x92, 0xe7, 0xcf, 0xf6, 0x02, 0xbf, 0x19, 0x7e, 0xab, 0xd0, 0x53, 0xaa, 0x49, 0xd2, 0xf3, + 0x25, 0x70, 0x6f, 0x8d, 0xf6, 0xb8, 0xc7, 0x47, 0x1f, 0x8e, 0x3b, 0x13, 0x0b, 0x15, 0x5e, 0x15, 0x0f, 0x03, 0x68, 0x2e, 0x5e, 0xe8, 0xe4, 0x87, 0xd6, 0x2a, 0x29, 0xf8, 0x8e, 0x70, 0xdc, 0xfb, + 0x24, 0x02, 0x00, 0xd8, 0x1e, 0xf5, 0x12, 0x06, 0x70, 0xdc, 0x5c, 0x96, 0x0d, 0x27, 0x77, 0xd3, 0xfb, 0x2f, 0xb3, 0x69, 0x96, 0x77, 0x23, 0x5b, 0x2d, 0x95, 0x14, 0x50, 0x9b, 0x9f, 0x8d, 0x10, + 0x92, 0xf1, 0xf0, 0x3d, 0x02, 0x88, 0x00, 0x3e, 0x1c, 0x38, 0x13, 0x01, 0x58, 0x27, 0x37, 0x9c, 0x10, 0x5e, 0xcf, 0x00, 0x5c, 0x4d, 0x8b, 0x00, 0x0f, 0x57, 0x01, 0xd9, 0x04, 0xdb, 0x18, 0x59, + 0x40, 0x98, 0x60, 0x2a, 0x4a, 0x33, 0xd6, 0xb6, 0xa2, 0xb8, 0x0b, 0x54, 0x3a, 0xb3, 0xf5, 0x90, 0x3e, 0x09, 0xb4, 0x21, 0x1e, 0x7c, 0x8f, 0xea, 0x6a, 0xe6, 0x14, 0x72, 0x02, 0x19, 0x60, 0x30, + 0xe8, 0x94, 0xa8, 0x94, 0xe9, 0xf4, 0x9b, 0xbb, 0xd6, 0x0c, 0x41, 0xe0, 0xfe, 0x34, 0x00, 0x8d, 0xdb, 0xf6, 0x5d, 0xdc, 0xed, 0xd7, 0xf0, 0x03, 0x84, 0xf1, 0xa2, 0x88, 0x5b, 0x8f, 0x47, 0x02, + 0x9d, 0x9f, 0x58, 0xaf, 0x73, 0x12, 0x36, 0xbe, 0x4b, 0x20, 0xc8, 0x8f, 0x39, 0xae, 0x0b, 0xb3, 0x0e, 0xc7, 0xb8, 0x5b, 0xe3, 0xc2, 0x1f, 0x23, 0xd3, 0x24, 0x18, 0x77, 0x4f, 0x5a, 0x07, 0x95, + 0x27, 0xd0, 0x09, 0x8b, 0xe4, 0xb4, 0xfb, 0xe6, 0x75, 0x4c, 0xa0, 0x13, 0xd8, 0xf0, 0xfe, 0xe6, 0x46, 0x19, 0xc1, 0x55, 0x69, 0x3c, 0xbd, 0x7f, 0xd7, 0x7b, 0xd7, 0xbb, 0x39, 0x63, 0xd8, 0xbc, + 0x4d, 0x09, 0x74, 0x42, 0x17, 0xa1, 0xd6, 0x95, 0xa6, 0x80, 0xad, 0xc1, 0xc7, 0xbc, 0xfa, 0xa5, 0x49, 0xf2, 0xd7, 0x30, 0x92, 0xfa, 0x33, 0x0c, 0x80, 0x4a, 0xe9, 0x59, 0xbd, 0x62, 0xf0, 0x49, + 0x94, 0x5c, 0xaf, 0x30, 0x3e, 0x94, 0x75, 0x44, 0x62, 0x66, 0x8d, 0xa7, 0x38, 0xf4, 0x74, 0x91, 0x8d, 0xe3, 0xce, 0x2e, 0xa7, 0x97, 0x1e, 0xd4, 0x7d, 0xd8, 0xc5, 0x0f, 0x1a, 0x89, 0x0f, 0x6a, + 0x61, 0xc3, 0xd9, 0xec, 0xb7, 0xf1, 0x68, 0x98, 0x8f, 0xa7, 0x93, 0x2f, 0x9f, 0xe6, 0xd3, 0xc9, 0x2b, 0xa3, 0x72, 0x37, 0x9f, 0x43, 0x65, 0xaf, 0xee, 0x97, 0xa6, 0x78, 0x8e, 0xeb, 0xc9, 0x77, + 0x93, 0xc3, 0x4d, 0x53, 0x4a, 0x43, 0xf8, 0x7d, 0xb5, 0x2f, 0x8b, 0x37, 0xde, 0x57, 0xc8, 0x56, 0x48, 0x73, 0xe2, 0x54, 0xf9, 0x91, 0x29, 0xb0, 0x3d, 0xb2, 0x4d, 0xd8, 0xa0, 0x71, 0x37, 0x81, + 0xdd, 0xfa, 0x8d, 0x7f, 0xee, 0xf5, 0xf6, 0xd3, 0xdb, 0xb1, 0x2d, 0x04, 0x86, 0x01, 0xb4, 0x7d, 0xdd, 0x86, 0x5c, 0x76, 0xa8, 0x56, 0xb8, 0x80, 0x4c, 0xa0, 0xbd, 0x9b, 0x0f, 0x4c, 0xf8, 0x0b, + 0x6a, 0x1f, 0xaf, 0xa9, 0xa8, 0x46, 0xfd, 0x78, 0x4b, 0x1e, 0x99, 0xa9, 0x28, 0x3c, 0x07, 0xdc, 0x63, 0x31, 0xd5, 0x75, 0x7b, 0xff, 0x9b, 0x5a, 0xf9, 0x5f, 0x2a, 0xe5, 0xac, 0x4e, 0xda, 0x1a, + 0xf9, 0xdb, 0xfa, 0x38, 0xa7, 0x8d, 0x53, 0xba, 0xf8, 0x67, 0xaa, 0xf8, 0x97, 0x69, 0xe2, 0x47, 0xf4, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xea, 0x65, 0xb0, 0x9a, 0x11, + 0x03, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0xcc, 0x31, 0x0a, 0x02, 0x41, 0x0c, 0x85, 0xe1, 0x3e, 0xa7, 0x48, 0x2d, 0xd8, 0x58, 0xd9, + 0xcc, 0x49, 0x44, 0x42, 0x58, 0x33, 0x6e, 0x20, 0x66, 0x25, 0xc9, 0x32, 0xe8, 0xe9, 0x65, 0x2c, 0xb4, 0xfd, 0x1f, 0xdf, 0x8b, 0x6d, 0x2b, 0x6c, 0x58, 0xb1, 0x0b, 0xc0, 0xe5, 0x70, 0x05, 0xf5, + 0x9b, 0x78, 0x51, 0xd6, 0xcb, 0x04, 0x1b, 0xe6, 0x93, 0x17, 0xf9, 0x45, 0x7d, 0xcf, 0x76, 0x82, 0x65, 0xe5, 0x48, 0x99, 0x70, 0xaf, 0x7e, 0x3c, 0x43, 0x85, 0x3e, 0xa8, 0x82, 0xd5, 0xd4, 0xef, + 0x34, 0x56, 0x2d, 0xf9, 0x42, 0x6c, 0xd8, 0xd9, 0x72, 0x1e, 0xa4, 0x44, 0x51, 0x57, 0x67, 0x23, 0x97, 0x61, 0xea, 0xff, 0xf1, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x7b, 0x8c, + 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x5c, 0x90, 0xcd, 0x6a, 0xc4, 0x30, 0x0c, 0x84, 0xef, 0x7a, 0x8a, 0x2c, 0xbe, 0x05, 0xd6, 0xba, 0xf4, 0x05, 0xfa, 0xb3, 0xd0, 0x2d, 0xa5, 0x14, 0x52, 0x7a, 0x2d, 0x8a, 0xad, 0x66, + 0xbd, 0x38, 0x8e, 0x91, 0xd5, 0x2c, 0x7d, 0xfb, 0x92, 0xc4, 0x2d, 0x65, 0x2f, 0xc2, 0xf3, 0x31, 0x96, 0x86, 0x79, 0x3c, 0x3c, 0xbf, 0xda, 0xd1, 0x83, 0x92, 0x0c, 0xac, 0x08, 0x3b, 0x3b, 0xce, + 0x09, 0x2f, 0x42, 0x39, 0xb3, 0xe0, 0x48, 0x33, 0xa7, 0x7d, 0x55, 0xf6, 0x4c, 0x02, 0xbb, 0xb6, 0xc5, 0x22, 0x0e, 0x47, 0x0a, 0x09, 0xdb, 0x16, 0xff, 0xfe, 0x55, 0xae, 0x5c, 0xf4, 0x3f, 0x07, + 0x63, 0x4c, 0xd3, 0xbd, 0x75, 0x8d, 0x31, 0x06, 0x2c, 0x65, 0xfd, 0x18, 0x38, 0xb1, 0x90, 0xb2, 0x07, 0xeb, 0x22, 0x95, 0x92, 0x49, 0x4f, 0x60, 0x3f, 0xc9, 0xe9, 0x24, 0xdf, 0x9b, 0xc8, 0x32, + 0x9d, 0xd9, 0x29, 0xd8, 0xc2, 0xaa, 0x21, 0x0d, 0x05, 0x6c, 0xc9, 0x12, 0xd2, 0x70, 0xc7, 0x94, 0x16, 0xa1, 0xe5, 0x66, 0xef, 0xc8, 0x9d, 0x78, 0xdb, 0x7f, 0x4c, 0xca, 0x31, 0x86, 0xa7, 0xe6, + 0xf8, 0x70, 0xb8, 0xdd, 0x2e, 0x05, 0xcf, 0x04, 0xad, 0x0d, 0x97, 0xb2, 0xcc, 0x31, 0x2e, 0x33, 0xcb, 0x66, 0x7f, 0x61, 0x5d, 0x17, 0xad, 0x4e, 0x4c, 0x7d, 0x3d, 0x87, 0x59, 0xc2, 0x4c, 0xca, + 0xb8, 0xb0, 0xfe, 0x2b, 0x44, 0x8f, 0x80, 0x3e, 0x14, 0x5d, 0x41, 0x7d, 0xd8, 0xd4, 0xef, 0x07, 0x21, 0x1f, 0x19, 0xa1, 0x7a, 0xae, 0x2b, 0xb9, 0xc2, 0xbf, 0x8d, 0x54, 0xbc, 0x26, 0x78, 0xef, + 0x9a, 0xfb, 0xc9, 0xf3, 0x16, 0x75, 0x2e, 0x6e, 0xf2, 0x8c, 0xf0, 0x13, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x73, 0x70, + 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, + 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, + 0x6a, 0x61, 0x76, 0x61, 0x9c, 0x57, 0xdf, 0x6f, 0xe2, 0x48, 0x12, 0x7e, 0xe7, 0xaf, 0xa8, 0xe5, 0x61, 0xc7, 0x64, 0x88, 0xc9, 0x8d, 0x74, 0x77, 0xd2, 0x46, 0x91, 0xce, 0x1b, 0x18, 0x2d, 0x77, + 0x09, 0x20, 0x13, 0x92, 0x1b, 0xad, 0x46, 0x51, 0x63, 0x17, 0xb8, 0x77, 0xec, 0x6e, 0x5f, 0x75, 0x1b, 0x07, 0x8d, 0xf2, 0xbf, 0x9f, 0xba, 0xdd, 0x06, 0x03, 0x26, 0x9b, 0x9d, 0x7e, 0x98, 0x21, + 0xfd, 0xa3, 0xea, 0xab, 0xaf, 0xaa, 0xbe, 0x6e, 0x0f, 0x2e, 0x3a, 0x70, 0x01, 0xb7, 0x32, 0xdf, 0x12, 0x5f, 0x27, 0x1a, 0x3e, 0x5d, 0x5d, 0xfd, 0xf3, 0x32, 0x27, 0x54, 0x28, 0x34, 0xe8, 0x04, + 0x41, 0x12, 0x5f, 0x73, 0xc1, 0x52, 0x60, 0x85, 0x4e, 0x24, 0x81, 0x24, 0xf7, 0x4b, 0xf9, 0x1d, 0xb0, 0x87, 0xef, 0x78, 0x84, 0x42, 0x61, 0x0c, 0x85, 0x88, 0x91, 0xec, 0xa1, 0x20, 0x67, 0x51, + 0x82, 0xf5, 0x4a, 0x1f, 0x1e, 0x91, 0x14, 0x97, 0x02, 0x3e, 0xf9, 0x57, 0xe0, 0x99, 0x0d, 0x5d, 0xb7, 0xd4, 0xed, 0x5d, 0x1b, 0x13, 0x5b, 0x59, 0x40, 0xc6, 0xb6, 0x20, 0xa4, 0x86, 0x42, 0x21, + 0xe8, 0x84, 0x2b, 0x58, 0xf1, 0x14, 0x01, 0x5f, 0x22, 0xcc, 0x35, 0x70, 0x01, 0x91, 0xcc, 0xf2, 0x94, 0x33, 0x11, 0x21, 0x94, 0x5c, 0x27, 0xd6, 0x8f, 0xb3, 0x62, 0x90, 0xc0, 0x17, 0x67, 0x43, + 0x2e, 0x35, 0xe3, 0x02, 0x18, 0x44, 0x32, 0xdf, 0x82, 0x5c, 0x35, 0x37, 0x02, 0xd3, 0x0e, 0xb4, 0x1d, 0x89, 0xd6, 0xb9, 0xfa, 0x65, 0x30, 0x28, 0xcb, 0xd2, 0x67, 0x16, 0xb2, 0x2f, 0x69, 0x3d, + 0x48, 0xab, 0xcd, 0x6a, 0x70, 0x37, 0xbe, 0x1d, 0x4d, 0xe6, 0xa3, 0xcb, 0x4f, 0xfe, 0x95, 0x3b, 0xb6, 0x10, 0x29, 0x2a, 0x05, 0x84, 0xff, 0x2b, 0x38, 0x61, 0x0c, 0xcb, 0x2d, 0xb0, 0x3c, 0x4f, + 0x79, 0xc4, 0x96, 0x29, 0x42, 0xca, 0x4a, 0xcb, 0xcf, 0x9a, 0x10, 0x63, 0xd0, 0xd2, 0xc0, 0x2e, 0x89, 0x6b, 0x2e, 0xd6, 0x7d, 0x50, 0x72, 0xa5, 0x4b, 0x46, 0x68, 0xcc, 0xc4, 0x5c, 0x69, 0xe2, + 0xcb, 0x42, 0x1f, 0xb0, 0x56, 0x83, 0xe4, 0xea, 0x60, 0x83, 0x14, 0xc0, 0x04, 0x74, 0x83, 0x39, 0x8c, 0xe7, 0x5d, 0xf8, 0x35, 0x98, 0x8f, 0xe7, 0x7d, 0x63, 0xe4, 0x69, 0xfc, 0xf0, 0xdb, 0x74, + 0xf1, 0x00, 0x4f, 0x41, 0x18, 0x06, 0x93, 0x87, 0xf1, 0x68, 0x0e, 0xd3, 0x10, 0x6e, 0xa7, 0x93, 0xe1, 0xf8, 0x61, 0x3c, 0x9d, 0xcc, 0x61, 0xfa, 0x19, 0x82, 0xc9, 0x17, 0xf8, 0xcf, 0x78, 0x32, + 0xec, 0x03, 0x72, 0x9d, 0x20, 0x01, 0xbe, 0x98, 0xe4, 0x2a, 0x03, 0x93, 0x1b, 0x3e, 0x31, 0xb6, 0xe4, 0xcd, 0x11, 0x0f, 0x20, 0xac, 0x64, 0x05, 0x49, 0xe5, 0x18, 0xf1, 0x15, 0x8f, 0x20, 0x65, + 0x62, 0x5d, 0xb0, 0x35, 0xc2, 0x5a, 0x6e, 0x90, 0x04, 0x17, 0x6b, 0xc8, 0x91, 0x32, 0xae, 0x4c, 0x5e, 0x15, 0x30, 0x11, 0x1b, 0x33, 0x29, 0xcf, 0xb8, 0x66, 0xda, 0x4e, 0x9d, 0xc4, 0x65, 0x1c, + 0x0d, 0x3a, 0x3c, 0xcb, 0x25, 0x69, 0xf8, 0x83, 0x6d, 0x98, 0x2f, 0x50, 0xfb, 0x17, 0xd7, 0x07, 0x53, 0x5c, 0x1e, 0xcf, 0x08, 0x2e, 0xfd, 0x28, 0x61, 0x42, 0x60, 0xaa, 0x8e, 0xd7, 0x0a, 0xcd, + 0x53, 0x7f, 0x46, 0x32, 0x47, 0xd2, 0x1c, 0xd5, 0x75, 0xa7, 0x93, 0x17, 0xcb, 0x94, 0x47, 0x10, 0xa5, 0x4c, 0x29, 0xb8, 0x67, 0x1b, 0x14, 0x4f, 0xc4, 0xf2, 0x1c, 0x69, 0x28, 0x4b, 0x91, 0x4a, + 0x66, 0x30, 0x7d, 0xef, 0x74, 0x4c, 0xf6, 0x73, 0xe2, 0x1b, 0xa6, 0x11, 0x94, 0x41, 0x1c, 0xc1, 0xca, 0x56, 0xf9, 0x5c, 0x93, 0x89, 0xed, 0x29, 0x0c, 0x66, 0xb3, 0x51, 0xf8, 0xfc, 0x38, 0x0a, + 0xe7, 0xe3, 0xe9, 0x04, 0x6e, 0xa0, 0x7b, 0xe5, 0xff, 0xdd, 0xff, 0x47, 0xf7, 0xda, 0x1e, 0x1d, 0x5c, 0x5c, 0xd8, 0xff, 0xe1, 0x02, 0x86, 0xb8, 0x62, 0x45, 0xaa, 0x61, 0x11, 0xde, 0x99, 0x8c, + 0xc7, 0xce, 0x8d, 0x0d, 0x3c, 0x33, 0xfe, 0x2f, 0xcb, 0x0a, 0x80, 0xff, 0x07, 0x23, 0x58, 0x91, 0xcc, 0xfa, 0xc0, 0x57, 0x20, 0x24, 0x7c, 0xa8, 0xf7, 0x2e, 0x28, 0xfd, 0x60, 0x92, 0x9e, 0x93, + 0xdc, 0xf0, 0xd8, 0x66, 0xc4, 0xda, 0x1e, 0xfc, 0x29, 0xcc, 0xe1, 0xe8, 0x73, 0xb0, 0xb8, 0x7b, 0x78, 0x1e, 0x4e, 0x9f, 0x26, 0x77, 0xd3, 0x60, 0xf8, 0x6c, 0x50, 0xdc, 0x40, 0xb7, 0x2e, 0x6c, + 0xc2, 0x5c, 0xfa, 0x16, 0x45, 0xb3, 0xbe, 0xed, 0xc4, 0xa7, 0x01, 0x97, 0x03, 0xcd, 0xbe, 0x31, 0xe2, 0x83, 0x03, 0x9c, 0x83, 0x6e, 0xe5, 0x1e, 0x00, 0x3e, 0x9e, 0xf0, 0xf0, 0x11, 0xba, 0x87, + 0xbb, 0x2f, 0xbb, 0xed, 0xbb, 0x4c, 0xb4, 0xdd, 0xeb, 0xce, 0x31, 0x5b, 0x33, 0x66, 0x3a, 0x57, 0xb6, 0xb0, 0x93, 0xef, 0xb2, 0x68, 0x1b, 0xbf, 0x0f, 0x65, 0xc2, 0xa3, 0x04, 0x32, 0xab, 0x4a, + 0x91, 0x14, 0xae, 0xa9, 0x1b, 0x9c, 0x81, 0x3b, 0xb2, 0x05, 0x2d, 0x6b, 0xfb, 0x46, 0x3c, 0xb8, 0x50, 0x1a, 0x59, 0x5c, 0xb7, 0x7e, 0xec, 0x12, 0x24, 0x05, 0xbe, 0x9f, 0xd8, 0xfb, 0xe0, 0x71, + 0x34, 0x79, 0xae, 0xe3, 0x9a, 0x85, 0xd3, 0xd9, 0x28, 0x34, 0x1d, 0xf6, 0x3c, 0x0b, 0x1e, 0x7e, 0x83, 0x9b, 0x1d, 0x43, 0x66, 0x74, 0xfd, 0x6c, 0x23, 0x06, 0x35, 0x7b, 0xe7, 0xa2, 0x3a, 0x47, + 0x46, 0x99, 0x20, 0xe1, 0x99, 0x6a, 0x29, 0x79, 0x9a, 0xc2, 0x12, 0x41, 0xb1, 0x8d, 0xd5, 0x93, 0x1f, 0xc5, 0xff, 0xef, 0x20, 0xfc, 0xab, 0xc0, 0xdb, 0xd3, 0x37, 0x61, 0x19, 0xd6, 0xbc, 0xee, + 0xd8, 0xaf, 0x12, 0xa5, 0x12, 0x59, 0xa4, 0xb1, 0x41, 0x5b, 0xa8, 0x4a, 0xfc, 0x8c, 0x50, 0x10, 0x8f, 0xf1, 0x20, 0x0b, 0xbb, 0xfe, 0x28, 0x28, 0xdd, 0xa9, 0x4c, 0xed, 0xf4, 0xdd, 0xe1, 0xb9, + 0x84, 0x7c, 0x79, 0x9e, 0x04, 0xf7, 0xa3, 0x5d, 0x98, 0xae, 0xf8, 0x9d, 0xb5, 0x05, 0xa5, 0x75, 0x04, 0x4e, 0x14, 0x9c, 0xa5, 0x8d, 0xe4, 0x31, 0x64, 0x8c, 0x0b, 0xcf, 0x59, 0x63, 0xb4, 0x56, + 0xbf, 0x7f, 0xed, 0xc1, 0xf7, 0x1d, 0x3b, 0xf3, 0xad, 0xd2, 0x98, 0xf9, 0xb2, 0xd0, 0x7e, 0x4e, 0x5c, 0xe8, 0x54, 0x78, 0xdd, 0x4b, 0x68, 0x48, 0x88, 0xd2, 0x8c, 0x34, 0xc6, 0xf6, 0xfa, 0x72, + 0xe3, 0xb3, 0xb9, 0xae, 0x96, 0x4c, 0xe1, 0x90, 0x13, 0x46, 0x5a, 0xd2, 0x16, 0x6e, 0x40, 0x60, 0x69, 0x17, 0x3c, 0xeb, 0xe3, 0xea, 0x6b, 0x63, 0x7f, 0xbb, 0x8f, 0x85, 0x32, 0x88, 0x8c, 0x19, + 0x88, 0x6b, 0x3b, 0xbf, 0x80, 0x69, 0xb2, 0x03, 0xd3, 0xfe, 0x1a, 0x75, 0xb0, 0x54, 0x32, 0x2d, 0x34, 0x9a, 0x32, 0xf2, 0x7a, 0x3d, 0x17, 0xab, 0xcd, 0xd8, 0x00, 0xc6, 0xab, 0xb7, 0x7b, 0x0c, + 0x5f, 0xb8, 0xd2, 0xaa, 0x0f, 0x64, 0x3a, 0x85, 0x6b, 0x23, 0xe0, 0x10, 0x25, 0x18, 0x7d, 0x33, 0xe2, 0xc4, 0x77, 0x1d, 0xa7, 0xcc, 0x3d, 0x5a, 0x28, 0x2d, 0xb3, 0xa6, 0xf1, 0x3d, 0xc3, 0x90, + 0x33, 0x62, 0x19, 0xea, 0x5d, 0xf2, 0x6a, 0x22, 0xb2, 0x86, 0xf4, 0x3a, 0x81, 0xde, 0xda, 0x85, 0x06, 0x27, 0x07, 0x11, 0xf5, 0xdf, 0xee, 0xb9, 0x26, 0x71, 0x55, 0xd6, 0x4c, 0x01, 0xdd, 0xb4, + 0x2a, 0xe0, 0x7e, 0x2b, 0x5f, 0x79, 0xe7, 0x80, 0xf8, 0x15, 0x03, 0x5e, 0xaf, 0x99, 0xf7, 0x1a, 0xfe, 0x58, 0xe4, 0x85, 0x9e, 0x6b, 0x42, 0x96, 0x9d, 0x8d, 0xa4, 0xb9, 0xe7, 0x06, 0x44, 0x91, + 0xa6, 0xd7, 0x07, 0x76, 0x34, 0x6d, 0x8f, 0x2c, 0x9b, 0xf1, 0x4e, 0x6b, 0x8e, 0xa2, 0xc6, 0xec, 0xd9, 0x40, 0x7a, 0xd7, 0x27, 0x4e, 0xf6, 0x37, 0x62, 0x9b, 0x3f, 0x33, 0x5d, 0xb9, 0xd8, 0x4f, + 0x78, 0x2d, 0x56, 0xda, 0x8f, 0xfa, 0xa6, 0x03, 0xce, 0x82, 0x69, 0x00, 0x6e, 0xb1, 0x58, 0xa5, 0xec, 0x8c, 0xdd, 0x35, 0xea, 0xda, 0x92, 0x77, 0xb6, 0xbf, 0xfb, 0xc6, 0xc6, 0x91, 0xe5, 0x57, + 0x88, 0x98, 0x8e, 0x12, 0xf0, 0xc6, 0xd3, 0x91, 0x7d, 0x2d, 0x9a, 0x97, 0x26, 0x1e, 0xa7, 0x15, 0xce, 0xb6, 0xdc, 0x28, 0x0c, 0xa7, 0x21, 0x98, 0xb0, 0x4c, 0x59, 0x7d, 0x30, 0xbd, 0xf6, 0xb6, + 0xfc, 0x7f, 0x84, 0xee, 0x87, 0xee, 0x09, 0x08, 0x2b, 0x50, 0x69, 0x5b, 0xce, 0xdb, 0x2b, 0x01, 0xde, 0xae, 0xcf, 0x66, 0x41, 0xfc, 0x54, 0xd5, 0x57, 0x5b, 0x48, 0xf5, 0x78, 0x87, 0x19, 0x3f, + 0x4a, 0xa5, 0xc2, 0xb6, 0x4c, 0x9b, 0xf1, 0x7a, 0x32, 0xfb, 0x7e, 0x5e, 0xc1, 0x69, 0xce, 0x5a, 0x48, 0x42, 0xf0, 0x7d, 0xff, 0xd4, 0x56, 0xa7, 0xfd, 0xaf, 0xd7, 0x77, 0x4a, 0xae, 0xc9, 0x8c, + 0x79, 0x3b, 0x55, 0x52, 0x58, 0xd5, 0xc0, 0xa1, 0xe0, 0xc8, 0x42, 0xe7, 0x85, 0x7e, 0x53, 0x62, 0x4e, 0x45, 0xf3, 0x58, 0x74, 0xea, 0x8b, 0xb2, 0x77, 0x20, 0x21, 0x3f, 0xed, 0x6d, 0xdb, 0x2a, + 0x65, 0x84, 0xc2, 0xfe, 0xe5, 0xf5, 0xce, 0xaa, 0xc8, 0x9f, 0x1c, 0xcb, 0xbe, 0xc5, 0x9c, 0x5a, 0x8e, 0x9d, 0x61, 0xe2, 0x6c, 0xda, 0x77, 0xe5, 0x1b, 0x11, 0x32, 0xf3, 0x9d, 0xe1, 0x78, 0xd8, + 0x5f, 0x1e, 0x55, 0x41, 0xbf, 0x01, 0xe5, 0x84, 0x94, 0xf6, 0xfa, 0xfe, 0xa1, 0x94, 0x69, 0x59, 0x25, 0xec, 0xd0, 0xfd, 0xc9, 0xc5, 0x55, 0x1b, 0x3c, 0x6d, 0x94, 0xfa, 0xb9, 0x60, 0x8e, 0x7e, + 0x26, 0x99, 0x2d, 0xc2, 0x3b, 0xaf, 0xa0, 0xb4, 0xdf, 0xb0, 0x78, 0x04, 0xb4, 0x0d, 0xd4, 0x50, 0x0a, 0x3c, 0x0e, 0xc8, 0xed, 0xc3, 0x17, 0xae, 0xbd, 0xab, 0xc6, 0xda, 0xae, 0xea, 0x1f, 0x12, + 0x92, 0xa5, 0xfd, 0xac, 0x3b, 0xa9, 0xf9, 0x33, 0x3a, 0x42, 0x24, 0x69, 0x87, 0x98, 0x8b, 0xf5, 0xb1, 0x4b, 0xac, 0x76, 0xcf, 0x35, 0x8b, 0xbe, 0x3d, 0x10, 0x8b, 0x4e, 0x7a, 0xb1, 0x89, 0xe9, + 0x6f, 0x4d, 0x4c, 0x9d, 0xea, 0x5f, 0xfb, 0xdf, 0xd1, 0xbb, 0xc8, 0xbe, 0x66, 0xda, 0x68, 0xda, 0x5f, 0x93, 0xd5, 0xaf, 0x7e, 0xd5, 0x27, 0x31, 0x2a, 0xcd, 0x85, 0xfd, 0x46, 0xeb, 0x81, 0x36, + 0x31, 0x2a, 0xd8, 0xb7, 0xf7, 0xf7, 0x46, 0xdd, 0x83, 0xe7, 0xf0, 0xac, 0x51, 0xa3, 0xd8, 0x78, 0xdd, 0xfb, 0xc7, 0xc9, 0xd3, 0xf3, 0x62, 0x3e, 0x0a, 0x8d, 0x2a, 0x77, 0x7b, 0xb5, 0x2c, 0xc1, + 0xcf, 0x3f, 0x43, 0xdb, 0xce, 0x59, 0x30, 0x9f, 0x3f, 0x4d, 0xc3, 0xe1, 0x7e, 0xe7, 0x09, 0x8f, 0x0e, 0xa2, 0x42, 0x12, 0xe6, 0x65, 0x79, 0xd3, 0x6a, 0x67, 0xef, 0xf1, 0x90, 0xad, 0x28, 0x61, + 0xf4, 0xfb, 0x57, 0xc8, 0x99, 0x52, 0xa5, 0xa4, 0xf8, 0xcc, 0xe9, 0x3d, 0x0a, 0x5f, 0xcb, 0xdb, 0x84, 0x51, 0x40, 0xc4, 0xb6, 0xc7, 0xcc, 0x07, 0x85, 0x4e, 0x50, 0x68, 0x1e, 0x31, 0x2d, 0xc9, + 0x57, 0xa8, 0xdd, 0x67, 0x9d, 0x67, 0x94, 0xe4, 0x60, 0xd1, 0x6b, 0x6b, 0xd9, 0x7f, 0x4d, 0xdd, 0x5b, 0xf7, 0x64, 0x25, 0x27, 0xa9, 0x31, 0x32, 0x9f, 0xf1, 0x33, 0x87, 0xb3, 0x61, 0xcd, 0x30, + 0x6e, 0xdb, 0xb1, 0x6d, 0xa5, 0xd5, 0x91, 0x19, 0x84, 0xba, 0x20, 0x51, 0x5d, 0xe0, 0xed, 0x27, 0x6b, 0x42, 0xfb, 0x3b, 0x72, 0x5a, 0x44, 0xff, 0x48, 0x92, 0x4f, 0xca, 0xcd, 0x0c, 0xf3, 0xa2, + 0x2e, 0x71, 0xa9, 0xb8, 0xae, 0x55, 0xd5, 0x35, 0x60, 0x95, 0xb9, 0xc6, 0x99, 0x10, 0x59, 0x6c, 0x9a, 0xe5, 0xd7, 0xad, 0xc6, 0xdb, 0xea, 0x6b, 0x1d, 0x68, 0x19, 0xed, 0x37, 0xd0, 0x32, 0x82, + 0x1b, 0xb8, 0xad, 0x3f, 0xe4, 0x05, 0x96, 0xee, 0xb7, 0xe7, 0x1c, 0xf8, 0x32, 0x47, 0xe1, 0xde, 0x3a, 0xbd, 0xa3, 0x77, 0xf5, 0xd4, 0x76, 0xbb, 0xbb, 0x0d, 0x57, 0x52, 0x35, 0x24, 0xbe, 0xb9, + 0xe4, 0x35, 0x8b, 0x7b, 0x6f, 0x61, 0x25, 0xed, 0xeb, 0xa2, 0xf6, 0xd7, 0xf3, 0x35, 0x31, 0xa1, 0x56, 0x48, 0xa6, 0x55, 0x3c, 0x5a, 0x46, 0x7d, 0xb8, 0xea, 0xc3, 0x9d, 0x14, 0x6b, 0xff, 0x3e, + 0xf8, 0xef, 0xf3, 0x63, 0x70, 0xb7, 0x18, 0x1d, 0x1d, 0x3f, 0xb9, 0x3a, 0x69, 0x19, 0x1d, 0x4e, 0xbe, 0x76, 0x3a, 0xaf, 0x9d, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe8, + 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x8c, 0xcd, + 0x4d, 0x0a, 0xc2, 0x40, 0x0c, 0xc5, 0xf1, 0x7d, 0xef, 0x92, 0x17, 0xb1, 0xd8, 0x85, 0xe0, 0x31, 0x3c, 0x40, 0xaa, 0x83, 0x8d, 0x1f, 0x33, 0x21, 0x8d, 0x0a, 0x9e, 0x5e, 0x9c, 0xe9, 0xa6, 0x3b, + 0x77, 0xf9, 0xff, 0x20, 0xbc, 0xb3, 0xce, 0xe1, 0x3a, 0x3e, 0x43, 0x4b, 0x3e, 0xfa, 0xfd, 0x30, 0x45, 0xd8, 0xbc, 0x67, 0xf6, 0x64, 0x05, 0x0f, 0x79, 0xa5, 0x0c, 0x31, 0x39, 0x4d, 0x09, 0xc5, + 0x2f, 0x5c, 0x61, 0xcb, 0xbf, 0xb3, 0x69, 0x93, 0x25, 0xa8, 0x45, 0x8f, 0x01, 0xfd, 0x8a, 0xa8, 0x12, 0x8d, 0x9a, 0xf1, 0x51, 0xeb, 0xde, 0x2e, 0x66, 0xc9, 0xff, 0x9e, 0xd3, 0xc2, 0x21, 0x37, + 0x71, 0x6d, 0x40, 0xcb, 0x3f, 0x6f, 0xb0, 0xc3, 0xb0, 0x36, 0xaa, 0x86, 0xab, 0x78, 0xf7, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, + 0xda, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, + 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0xc4, 0x56, 0x4d, 0x6f, 0x1b, + 0x37, 0x10, 0xbd, 0xf3, 0x57, 0x4c, 0x65, 0x03, 0xb5, 0x05, 0x4b, 0x4e, 0x0e, 0xb9, 0x08, 0x4d, 0x80, 0xd8, 0x71, 0x12, 0xa5, 0x4e, 0x6a, 0x38, 0x72, 0x82, 0x00, 0x01, 0xbc, 0x5c, 0xee, 0x48, + 0xcb, 0x98, 0x22, 0x17, 0xe4, 0x70, 0x65, 0x01, 0x45, 0x7f, 0x7b, 0x31, 0xe4, 0xae, 0x64, 0x47, 0x0a, 0xd2, 0x43, 0xd1, 0xfa, 0x24, 0x93, 0xf3, 0xf9, 0xde, 0x9b, 0xe1, 0x1e, 0xc0, 0xeb, 0x68, + 0x15, 0x69, 0x67, 0xa1, 0xf1, 0xee, 0x1b, 0x2a, 0x12, 0xe2, 0x33, 0x1a, 0xe5, 0x96, 0x08, 0xe4, 0x60, 0xed, 0xa2, 0x07, 0x8b, 0xab, 0x1d, 0xab, 0x5f, 0x84, 0x98, 0xd5, 0x3a, 0x40, 0x90, 0xcb, + 0xc6, 0x60, 0x7f, 0x0a, 0xca, 0x59, 0x92, 0xda, 0x06, 0x90, 0x10, 0xb4, 0x5d, 0x18, 0x84, 0x79, 0xef, 0x58, 0xca, 0x80, 0x15, 0x38, 0x0b, 0x1f, 0x1b, 0xaf, 0xed, 0x02, 0xce, 0x8d, 0x8b, 0xd5, + 0x26, 0xee, 0x04, 0x8a, 0xde, 0x32, 0x8c, 0xd3, 0x55, 0x7f, 0xf3, 0xb2, 0x69, 0x8c, 0x56, 0x92, 0x7f, 0x8e, 0x63, 0xd3, 0xa0, 0x57, 0x32, 0xe0, 0xd1, 0x71, 0x71, 0x02, 0xab, 0x5a, 0xab, 0x1a, + 0x3c, 0x52, 0xf4, 0x36, 0x00, 0xd5, 0x08, 0x9b, 0x7b, 0x70, 0xf3, 0x74, 0x50, 0x49, 0x92, 0xd0, 0xc8, 0x10, 0xb0, 0x1a, 0x0b, 0x71, 0x70, 0x00, 0x97, 0x4e, 0x49, 0x03, 0x78, 0x8f, 0x2a, 0x72, + 0x44, 0x21, 0xde, 0xcb, 0x3b, 0x84, 0x10, 0x3d, 0x02, 0xd5, 0x92, 0xa0, 0x78, 0x27, 0x5b, 0x09, 0x4f, 0x9f, 0xc2, 0xc7, 0x57, 0xbf, 0x17, 0xa0, 0x03, 0x68, 0x1b, 0x48, 0x1a, 0x93, 0xfc, 0x67, + 0x0e, 0x02, 0x49, 0x4f, 0x10, 0xd0, 0xb7, 0xe8, 0xc1, 0x70, 0x30, 0xb3, 0x06, 0x1f, 0x2d, 0x14, 0xe3, 0xd3, 0x65, 0x6b, 0x57, 0x10, 0x52, 0x77, 0xa3, 0xd2, 0x39, 0x9a, 0xf8, 0x68, 0x8b, 0xb1, + 0x98, 0xd5, 0x08, 0xca, 0x2d, 0x97, 0xd2, 0x56, 0xd9, 0x3d, 0x40, 0x4d, 0xd4, 0xf4, 0x41, 0xf8, 0x58, 0x46, 0x72, 0x4b, 0x49, 0x3a, 0x87, 0x5b, 0x49, 0x52, 0x35, 0x06, 0x98, 0x3b, 0x0f, 0xaa, + 0x96, 0x76, 0x81, 0x81, 0xfb, 0x09, 0x2e, 0x7a, 0xc5, 0xa1, 0x2a, 0x1c, 0x8b, 0xe9, 0xa3, 0xff, 0x37, 0x66, 0xdc, 0x73, 0xfe, 0x0d, 0x2b, 0x6d, 0x0c, 0x94, 0x89, 0x9a, 0x46, 0x2e, 0x24, 0x61, + 0xc5, 0x84, 0xfa, 0x68, 0x2d, 0xa3, 0x9f, 0x93, 0x8f, 0x61, 0x4a, 0x20, 0x4d, 0x70, 0xe0, 0x1a, 0xb4, 0x01, 0x2a, 0x2c, 0xe3, 0x62, 0xc1, 0xf7, 0x8d, 0xf3, 0x04, 0xc5, 0xb3, 0x27, 0x4f, 0x9e, + 0x15, 0x22, 0x38, 0x90, 0xdd, 0x15, 0x7a, 0x50, 0xd2, 0x72, 0x58, 0x49, 0x24, 0x55, 0x8d, 0x15, 0xe8, 0x39, 0x58, 0xc4, 0xaa, 0x07, 0x88, 0xb1, 0x20, 0x0c, 0x14, 0xf6, 0xa2, 0xc3, 0x37, 0x45, + 0x66, 0x82, 0x61, 0x49, 0x9c, 0x17, 0x70, 0x7e, 0x39, 0x15, 0x62, 0x4a, 0xbf, 0x06, 0xf0, 0xc8, 0x48, 0xa1, 0xad, 0x72, 0xb5, 0x01, 0x09, 0x8a, 0xd7, 0x37, 0x1f, 0xce, 0x6f, 0xaf, 0x2f, 0xde, + 0x4c, 0x3f, 0xce, 0xae, 0xbf, 0x14, 0x80, 0xb6, 0xd5, 0xde, 0xd9, 0x25, 0x5a, 0x82, 0x56, 0x7a, 0x2d, 0x4b, 0x83, 0x63, 0x21, 0x8a, 0xa2, 0x08, 0x35, 0x1a, 0x03, 0x41, 0x79, 0xdd, 0x90, 0x38, + 0x00, 0x8f, 0x8d, 0x91, 0x0a, 0xe1, 0xaf, 0xd3, 0x71, 0x29, 0x43, 0xed, 0x15, 0x94, 0xeb, 0x2c, 0xe8, 0x6c, 0xe8, 0x15, 0xcc, 0xb5, 0xc1, 0x07, 0x96, 0x95, 0x53, 0x77, 0xe8, 0xc7, 0xda, 0x9d, + 0x7e, 0x73, 0xb5, 0xad, 0x1c, 0x83, 0x48, 0x75, 0xf6, 0xf1, 0xb8, 0xd0, 0x81, 0xfc, 0x5a, 0xe0, 0x7d, 0xc2, 0xe6, 0x51, 0x55, 0xcf, 0x77, 0x3c, 0x05, 0xaa, 0xda, 0xc1, 0xe0, 0x9f, 0x19, 0x0f, + 0xe0, 0xc5, 0x8b, 0x6d, 0x99, 0xdc, 0x0a, 0x23, 0x74, 0x00, 0x67, 0x51, 0x9b, 0x4a, 0xdb, 0x45, 0x37, 0x6b, 0xbd, 0x88, 0x4a, 0x3e, 0x0e, 0x20, 0x2d, 0xfc, 0x71, 0x3e, 0x05, 0xbd, 0x94, 0x0b, + 0x4c, 0x5a, 0x61, 0xf2, 0xfb, 0x21, 0x1a, 0xc3, 0xd9, 0x1a, 0x2a, 0x9c, 0xcb, 0x68, 0xe8, 0x04, 0x88, 0xdd, 0xb3, 0x20, 0xd8, 0x17, 0x24, 0xbc, 0xfb, 0xf4, 0x3e, 0x7b, 0xee, 0x81, 0x8e, 0x63, + 0x74, 0x86, 0xa3, 0x16, 0x76, 0xfe, 0x0e, 0xba, 0xbb, 0xe4, 0x9e, 0x8b, 0x1d, 0x0e, 0x3f, 0x38, 0xc2, 0xe1, 0x70, 0x02, 0xd3, 0x39, 0xc3, 0x05, 0x2b, 0x69, 0x89, 0x09, 0x44, 0xcb, 0xf4, 0xa4, + 0xca, 0xac, 0x24, 0xdd, 0x62, 0xf6, 0x3d, 0x49, 0x46, 0x2c, 0x9b, 0x64, 0x54, 0x69, 0x4a, 0x26, 0x49, 0x0e, 0xe3, 0xb5, 0x5c, 0x9a, 0x22, 0x51, 0xc3, 0xb3, 0x21, 0x58, 0x03, 0xa9, 0x33, 0x67, + 0x8c, 0x5b, 0xb1, 0x36, 0x13, 0x2c, 0xe8, 0x2f, 0x6c, 0xbb, 0x11, 0xc0, 0x24, 0x75, 0xc1, 0x9e, 0x22, 0x25, 0xb8, 0xb0, 0x6d, 0x98, 0x08, 0x80, 0x11, 0x58, 0xb9, 0xc4, 0x09, 0x9c, 0x5d, 0xdd, + 0x7e, 0x78, 0x39, 0x9b, 0x7e, 0xba, 0xb8, 0x9d, 0xbe, 0x7f, 0xf9, 0xe6, 0x42, 0x70, 0x1f, 0xad, 0x34, 0x11, 0x27, 0x30, 0x20, 0x1f, 0x71, 0xb0, 0x05, 0xfd, 0x3a, 0x4f, 0xc8, 0x77, 0x98, 0xfb, + 0xd8, 0xad, 0x98, 0x04, 0x4e, 0x2f, 0x6d, 0x6d, 0x41, 0xf6, 0x3b, 0x0f, 0xbd, 0x88, 0xbc, 0xf3, 0x92, 0x55, 0x26, 0x45, 0x79, 0x4c, 0x73, 0x27, 0x4b, 0xd7, 0xfe, 0x10, 0x68, 0x1f, 0xed, 0x36, + 0xf9, 0x2b, 0x6c, 0x8c, 0x5b, 0xef, 0xa6, 0x7f, 0xc8, 0x9d, 0xad, 0xa0, 0x4a, 0x66, 0x8f, 0x08, 0x07, 0x6d, 0xc9, 0x81, 0x32, 0x31, 0x10, 0xfa, 0x1f, 0xe5, 0xea, 0xfc, 0x46, 0x2d, 0x1c, 0xe4, + 0xb1, 0x27, 0xaf, 0x79, 0xa8, 0x43, 0x8e, 0xdd, 0xd7, 0xb1, 0xdd, 0xf6, 0xda, 0xb6, 0x2e, 0xef, 0x5e, 0x21, 0x5e, 0x77, 0x12, 0xc3, 0xfb, 0xb4, 0xf3, 0x03, 0x94, 0x68, 0xdc, 0xea, 0x04, 0x1a, + 0x83, 0xbc, 0x71, 0xcb, 0x7e, 0x8d, 0xe6, 0xb1, 0x4d, 0x7c, 0xde, 0x5c, 0x5f, 0x16, 0x1b, 0x8e, 0xf8, 0x86, 0x4f, 0xbd, 0x8b, 0x94, 0x16, 0x74, 0x9a, 0xab, 0x8d, 0x60, 0x85, 0xf8, 0xe2, 0x22, + 0x2c, 0x3a, 0xd7, 0x6c, 0x54, 0xae, 0x1f, 0xd0, 0xde, 0x61, 0xf1, 0xa3, 0xde, 0xb4, 0x9d, 0xbb, 0xdc, 0x00, 0x6b, 0x31, 0x05, 0x49, 0x0c, 0x73, 0xa6, 0xe1, 0xf0, 0x9a, 0xe3, 0x85, 0xc9, 0x70, + 0x08, 0x73, 0xef, 0x96, 0xe9, 0xd6, 0x45, 0x6a, 0x22, 0x9d, 0xe4, 0x25, 0x73, 0x98, 0x4a, 0x25, 0x07, 0x9a, 0x42, 0xf6, 0x1b, 0x0b, 0x71, 0x7b, 0x3b, 0x9b, 0x5e, 0xdd, 0xde, 0x4e, 0x84, 0xe8, + 0x64, 0x1d, 0x03, 0x42, 0x71, 0x67, 0x0b, 0xf6, 0xb7, 0xe9, 0x84, 0xb7, 0x61, 0xdf, 0x6e, 0xf4, 0x06, 0xca, 0xf5, 0x64, 0xdf, 0x2e, 0xba, 0xb3, 0x69, 0xe3, 0x6a, 0x5e, 0x32, 0xc8, 0xa7, 0x25, + 0xc2, 0x6f, 0x1b, 0xea, 0x58, 0xa3, 0x2f, 0x12, 0xb1, 0xa1, 0x76, 0xab, 0xae, 0xf7, 0xe8, 0x4d, 0xbf, 0x6b, 0x6e, 0xae, 0x2f, 0x9f, 0x1f, 0x1e, 0xed, 0x8b, 0x71, 0x78, 0xc4, 0xcf, 0x2a, 0xfb, + 0xc3, 0xe1, 0xd5, 0xe7, 0x57, 0xc7, 0x30, 0x72, 0xd1, 0x9b, 0xe3, 0xad, 0xa0, 0x38, 0x87, 0x10, 0x37, 0x49, 0x98, 0x45, 0x87, 0x53, 0xeb, 0xee, 0xb0, 0x78, 0x20, 0x2d, 0xaa, 0xe1, 0x4a, 0x52, + 0x3d, 0x3a, 0x4b, 0x2f, 0x34, 0x67, 0xd7, 0x76, 0xb1, 0xa7, 0x8d, 0x07, 0xee, 0x30, 0x1a, 0x91, 0xf4, 0x4c, 0xd6, 0x80, 0x91, 0x3b, 0xdd, 0x3c, 0xbc, 0x03, 0x18, 0x8d, 0xd2, 0xa3, 0x3b, 0x38, + 0x3c, 0x5a, 0xd5, 0x4e, 0x2e, 0xf5, 0x71, 0x37, 0x5b, 0xd3, 0xef, 0x08, 0x07, 0x65, 0x64, 0x08, 0xe0, 0xac, 0x59, 0x6f, 0x3f, 0x1b, 0x9c, 0xdd, 0x2a, 0xfa, 0xe4, 0x31, 0xca, 0x06, 0x65, 0x9b, + 0x48, 0x4b, 0x58, 0x77, 0xd9, 0x1b, 0x49, 0xf5, 0x4f, 0x2b, 0xdd, 0x5f, 0x0f, 0xa3, 0xa3, 0x6e, 0xae, 0x2f, 0x77, 0xbd, 0x15, 0x13, 0x39, 0x6a, 0x77, 0x5b, 0xfb, 0xca, 0x1b, 0xe5, 0x2d, 0x0c, + 0xce, 0x9d, 0x25, 0xb4, 0x34, 0x9a, 0xad, 0x1b, 0x9c, 0x10, 0xde, 0xd3, 0x69, 0x63, 0xa4, 0xb6, 0x9d, 0xc1, 0x0a, 0x06, 0x5f, 0xfb, 0xdf, 0xd5, 0xff, 0x8b, 0xc3, 0xa3, 0x4e, 0xfe, 0xa5, 0xfa, + 0x19, 0xb7, 0xb7, 0xb3, 0xd9, 0x95, 0xc6, 0xdd, 0x7c, 0xf9, 0xd1, 0xdb, 0x7a, 0xc0, 0x9f, 0xf9, 0x53, 0x67, 0x0f, 0x98, 0xff, 0x3d, 0x18, 0x3f, 0x2b, 0x6e, 0xd3, 0x1f, 0x9c, 0x1b, 0x94, 0x36, + 0x36, 0xe9, 0x7b, 0x46, 0xf1, 0xef, 0xfc, 0x2d, 0x99, 0x96, 0x27, 0x56, 0xdb, 0x62, 0x7d, 0xb4, 0x0f, 0xf2, 0xf4, 0x2b, 0xd6, 0x20, 0xe5, 0x67, 0xf1, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0xbd, 0xf1, 0x0d, 0x9f, 0xa4, 0x04, 0x00, 0x00, 0x5c, 0x0b, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, + 0x77, 0xb4, 0x3a, 0x6d, 0x73, 0xda, 0x48, 0x93, 0xdf, 0xf5, 0x2b, 0x3a, 0x82, 0x8a, 0xed, 0x94, 0x25, 0xd9, 0xb9, 0xba, 0x7b, 0x9e, 0xb3, 0x8f, 0xad, 0x23, 0x98, 0x24, 0x64, 0x6d, 0x70, 0x81, + 0x1d, 0x67, 0x2b, 0xce, 0xc1, 0x20, 0x0d, 0x30, 0xb6, 0x98, 0x51, 0x66, 0x46, 0x60, 0x36, 0xeb, 0xff, 0x7e, 0xd5, 0x33, 0x12, 0x92, 0x00, 0x67, 0x93, 0x4d, 0xc2, 0xd6, 0xd6, 0x5a, 0xa3, 0x7e, + 0x7f, 0x9b, 0xee, 0xd6, 0xd6, 0x9e, 0x05, 0x63, 0xc6, 0x03, 0x35, 0x73, 0x6a, 0xe0, 0xfd, 0xc4, 0x9f, 0x53, 0x83, 0x73, 0x16, 0x52, 0xae, 0x68, 0x04, 0x5a, 0x80, 0x9e, 0x51, 0x68, 0x26, 0x24, + 0x9c, 0x51, 0x18, 0x88, 0x89, 0x5e, 0x12, 0x49, 0xe1, 0xb5, 0x48, 0x79, 0x44, 0x34, 0x13, 0x1c, 0xf6, 0x9b, 0x83, 0xd7, 0x07, 0x90, 0xf2, 0x88, 0x4a, 0x10, 0x9c, 0x3a, 0x35, 0x10, 0x12, 0xe6, + 0x42, 0x52, 0x08, 0x05, 0xd7, 0x92, 0x8d, 0x53, 0x2d, 0x24, 0xc4, 0x96, 0x20, 0x90, 0xa9, 0xa4, 0x74, 0x4e, 0xb9, 0x56, 0x3e, 0xc0, 0x80, 0x52, 0x43, 0xbd, 0xdb, 0xbb, 0xea, 0xb4, 0xda, 0x30, + 0x61, 0x31, 0xa2, 0x47, 0x4c, 0x59, 0x34, 0x1a, 0xc1, 0x92, 0xe9, 0x19, 0xe8, 0x19, 0x53, 0xb0, 0x14, 0xf2, 0x1e, 0x26, 0x42, 0x02, 0x89, 0x22, 0x86, 0x8c, 0x49, 0x0c, 0x8c, 0x4f, 0x84, 0x9c, + 0x1b, 0x31, 0x9c, 0x1a, 0x48, 0x3a, 0x25, 0x32, 0x62, 0x7c, 0x0a, 0xa1, 0x48, 0x56, 0x92, 0x4d, 0x67, 0x1a, 0xc4, 0x92, 0x53, 0xa9, 0x66, 0x2c, 0xf1, 0x01, 0xae, 0x50, 0x8f, 0xc1, 0xeb, 0x5c, + 0x14, 0x65, 0xe9, 0x66, 0x4c, 0xb5, 0x80, 0x95, 0x48, 0x33, 0x35, 0x4a, 0x1a, 0x67, 0x86, 0x38, 0x84, 0xf7, 0x54, 0x2a, 0x54, 0xf7, 0xa5, 0x7f, 0x04, 0xfb, 0x7a, 0x86, 0x38, 0x6e, 0xf6, 0xd2, + 0x3d, 0x38, 0x35, 0xc8, 0x73, 0xb2, 0x02, 0x2e, 0x34, 0xa4, 0x8a, 0x16, 0xb4, 0x81, 0x3e, 0x84, 0x34, 0xd1, 0xc0, 0x38, 0x84, 0x62, 0x9e, 0xc4, 0x8c, 0xf0, 0x10, 0x91, 0x33, 0xcd, 0xd6, 0x1c, + 0x7c, 0x80, 0x3f, 0x32, 0x1a, 0x62, 0xac, 0x09, 0xe3, 0x40, 0x8c, 0x1e, 0x20, 0x26, 0x65, 0x30, 0x20, 0xda, 0xa9, 0x39, 0x35, 0x00, 0x80, 0x99, 0xd6, 0x89, 0x3a, 0x09, 0x82, 0xe5, 0x72, 0xe9, + 0x13, 0x23, 0xad, 0x2f, 0xe4, 0x34, 0xc8, 0xd5, 0x0b, 0xce, 0x3b, 0xad, 0x76, 0x77, 0xd0, 0xf6, 0x5e, 0xfa, 0x47, 0x06, 0xe5, 0x9a, 0xc7, 0x54, 0x29, 0x90, 0xf4, 0x73, 0xca, 0x24, 0x8d, 0x60, + 0xbc, 0x02, 0x92, 0x24, 0x31, 0x0b, 0xc9, 0x38, 0xa6, 0x10, 0x93, 0x25, 0x3a, 0xce, 0xf8, 0xc7, 0xb8, 0x9d, 0x71, 0x58, 0x4a, 0xa6, 0x19, 0x9f, 0x1e, 0x3a, 0x35, 0x50, 0xb9, 0xe7, 0xcb, 0xde, + 0x29, 0xac, 0x95, 0x4b, 0xc7, 0x54, 0x05, 0x40, 0x70, 0x20, 0xe8, 0x1a, 0xb7, 0x39, 0x80, 0xce, 0xc0, 0x85, 0x57, 0xcd, 0x41, 0x67, 0x70, 0x08, 0x37, 0x9d, 0xab, 0xb7, 0xbd, 0xeb, 0x2b, 0xb8, + 0x69, 0xf6, 0xfb, 0xcd, 0xee, 0x55, 0xa7, 0x3d, 0x80, 0x5e, 0x1f, 0x5a, 0xbd, 0xee, 0x59, 0xe7, 0xaa, 0xd3, 0xeb, 0x0e, 0xa0, 0xf7, 0x1a, 0x9a, 0xdd, 0x3f, 0x9c, 0x1a, 0xfc, 0xde, 0xe9, 0x9e, + 0x1d, 0x02, 0x65, 0x7a, 0x46, 0x25, 0xd0, 0x87, 0x44, 0xa2, 0x06, 0x42, 0x02, 0x43, 0x4b, 0xd2, 0xa8, 0x14, 0x43, 0xb9, 0x04, 0x18, 0x22, 0xd6, 0x3d, 0x2a, 0xa1, 0x21, 0x9b, 0xb0, 0x10, 0x62, + 0xc2, 0xa7, 0x29, 0x99, 0x52, 0x98, 0x8a, 0x05, 0x95, 0x1c, 0x23, 0x24, 0xa1, 0x72, 0xce, 0x14, 0x3a, 0x54, 0x01, 0xe1, 0x11, 0xc4, 0x6c, 0xce, 0xb4, 0x09, 0x24, 0xe5, 0xd4, 0xb6, 0xf5, 0xf2, + 0x7f, 0x76, 0x86, 0xfd, 0x6c, 0x7a, 0x35, 0xb8, 0x20, 0x0b, 0xca, 0x61, 0xa0, 0x89, 0xd4, 0x70, 0x9d, 0xc0, 0x2b, 0xa2, 0xc3, 0x19, 0xa8, 0x50, 0xb2, 0xc4, 0x06, 0x4c, 0x3f, 0x77, 0x7b, 0xbb, + 0xfb, 0x1e, 0x16, 0x44, 0xaa, 0x93, 0x9d, 0x32, 0x98, 0xd0, 0x7a, 0xd7, 0x7c, 0xdf, 0x1c, 0xbe, 0xed, 0x5d, 0xb4, 0xc1, 0x83, 0x58, 0x84, 0x36, 0xcf, 0xc5, 0x04, 0x08, 0xbc, 0x3b, 0xfb, 0x1d, + 0x66, 0x62, 0x8e, 0x61, 0x20, 0x0d, 0xd9, 0x5e, 0x92, 0xe5, 0x62, 0x4e, 0x76, 0x17, 0x55, 0x43, 0xf4, 0xe2, 0xe5, 0x2e, 0x92, 0x73, 0x14, 0xfb, 0xe5, 0x9e, 0x02, 0xc6, 0x95, 0x26, 0x71, 0x4c, + 0xa3, 0x12, 0x7d, 0xc4, 0x6a, 0xbe, 0x6f, 0x77, 0x87, 0xbd, 0xcb, 0xab, 0x01, 0x78, 0x90, 0x10, 0x49, 0xe6, 0x54, 0x53, 0xa9, 0x20, 0x21, 0xaa, 0x54, 0x9e, 0xde, 0x91, 0x05, 0x81, 0xf7, 0x17, + 0xb0, 0x9c, 0x51, 0x0e, 0x32, 0xe5, 0xc6, 0xc7, 0xc6, 0x22, 0x36, 0x55, 0x80, 0xfa, 0x53, 0x1f, 0x81, 0x23, 0x3a, 0x4e, 0xb3, 0x37, 0xc0, 0xb4, 0xa2, 0xf1, 0xe4, 0x10, 0xd3, 0x35, 0x83, 0x02, + 0x50, 0x54, 0x97, 0x58, 0x36, 0xbc, 0x0f, 0x16, 0xc1, 0xfb, 0x20, 0x53, 0x7e, 0x17, 0x2d, 0x93, 0x13, 0x2d, 0x09, 0x57, 0x89, 0x90, 0xba, 0x11, 0xe9, 0xa1, 0x12, 0xe1, 0x3d, 0xd5, 0x87, 0x8a, + 0xca, 0x05, 0x95, 0x8d, 0xd5, 0xa1, 0x4a, 0x55, 0x42, 0x79, 0xd4, 0x58, 0x1d, 0x92, 0x28, 0xc2, 0x50, 0x6d, 0xfc, 0xfb, 0xe8, 0xe8, 0xa8, 0xa4, 0xc7, 0xe0, 0xf7, 0xce, 0xe5, 0xb0, 0xdf, 0x02, + 0x0f, 0x26, 0x31, 0x99, 0x1a, 0x81, 0x98, 0xb2, 0xe9, 0x27, 0x88, 0x29, 0x5d, 0xb9, 0x49, 0x64, 0x68, 0xaa, 0xc7, 0x4e, 0x73, 0xfe, 0xc0, 0xcf, 0x71, 0xd8, 0x04, 0x3e, 0x82, 0xf7, 0x27, 0xb8, + 0xf5, 0x8a, 0x48, 0x2e, 0x7c, 0x82, 0x53, 0xb4, 0x25, 0x77, 0x1c, 0x00, 0x0b, 0x34, 0x81, 0x80, 0xea, 0x30, 0xc8, 0xe5, 0x59, 0x03, 0xa0, 0xa1, 0xfc, 0xca, 0x3b, 0x07, 0x60, 0xc2, 0xca, 0x88, + 0x6e, 0x1d, 0x7d, 0x1d, 0xf8, 0xd9, 0x7b, 0x77, 0x13, 0x79, 0xf3, 0x7d, 0x46, 0x00, 0xff, 0xad, 0x41, 0x6f, 0x50, 0xe4, 0xae, 0x4a, 0x13, 0xb4, 0xb6, 0x0f, 0x50, 0x5f, 0x10, 0x09, 0xc3, 0x79, + 0xaa, 0xf4, 0x10, 0xc6, 0xd4, 0x78, 0x4a, 0x8b, 0xbc, 0x34, 0x68, 0x99, 0x52, 0xac, 0x0b, 0x13, 0x12, 0x63, 0xb6, 0x86, 0xab, 0xe9, 0x92, 0xf1, 0x86, 0x79, 0x3a, 0x75, 0x22, 0x22, 0x4b, 0x4f, + 0x73, 0xc6, 0xa7, 0x4b, 0xfb, 0xe0, 0x84, 0x44, 0x51, 0x70, 0x47, 0x29, 0x27, 0x73, 0x3a, 0x72, 0x81, 0xa1, 0x78, 0xad, 0x3f, 0xde, 0xdc, 0x74, 0xba, 0x2f, 0x0e, 0x20, 0x23, 0x62, 0x48, 0x9f, + 0x9e, 0x3a, 0x00, 0x17, 0x9d, 0xee, 0x9b, 0x9b, 0x17, 0x07, 0x60, 0x29, 0xe0, 0xb9, 0x39, 0x3e, 0x33, 0xe4, 0x5f, 0x1c, 0x40, 0xc6, 0x07, 0x5f, 0x18, 0x35, 0x6b, 0x70, 0xad, 0x28, 0x04, 0xa9, + 0x92, 0x41, 0xcc, 0xc6, 0xf4, 0x81, 0x86, 0xc1, 0x1d, 0x59, 0x90, 0xa1, 0x09, 0x70, 0x36, 0x01, 0xb2, 0x20, 0x2c, 0x46, 0xef, 0x1f, 0x82, 0x40, 0x2d, 0x96, 0x0c, 0xeb, 0x17, 0x89, 0x63, 0x18, + 0x93, 0xf0, 0x1e, 0xb5, 0x0b, 0xce, 0xd9, 0x58, 0x12, 0xb9, 0x0a, 0x30, 0xc0, 0x83, 0xb7, 0x62, 0x9e, 0x13, 0xc6, 0xaa, 0x97, 0xd7, 0xff, 0x88, 0x2e, 0x68, 0x2c, 0x12, 0x2a, 0x7d, 0x2c, 0xe7, + 0xd4, 0x0f, 0xc5, 0x1c, 0xf9, 0x19, 0xbc, 0x39, 0x09, 0x83, 0xcf, 0x24, 0xf8, 0x4c, 0x8e, 0x8f, 0xff, 0x75, 0x14, 0x0c, 0x19, 0x8f, 0xe8, 0x83, 0x3f, 0xd3, 0xf3, 0xd8, 0xd0, 0x29, 0x62, 0x61, + 0x9d, 0xf1, 0x2e, 0x7c, 0x2a, 0x39, 0x2a, 0x07, 0x79, 0x00, 0x77, 0xb7, 0x1a, 0x9b, 0xe0, 0x80, 0x45, 0x5a, 0x48, 0x5d, 0x94, 0x90, 0x86, 0x3b, 0xda, 0x8d, 0x3a, 0x72, 0x33, 0x1c, 0x8a, 0x9e, + 0x78, 0x1a, 0x7d, 0xdb, 0x06, 0x39, 0xe2, 0x84, 0x39, 0xa5, 0xff, 0x9c, 0x9e, 0x3a, 0x54, 0x91, 0xb0, 0x1c, 0xe1, 0x65, 0xad, 0x8a, 0xf8, 0xb3, 0xef, 0xa5, 0x0d, 0xe0, 0x29, 0xe5, 0x5a, 0x08, + 0x4f, 0xd2, 0x98, 0x62, 0x2c, 0x54, 0xc2, 0xb4, 0x10, 0x62, 0x84, 0x52, 0x7b, 0xa1, 0xe0, 0x13, 0x36, 0x05, 0xcf, 0xbb, 0x93, 0xd4, 0x33, 0x2a, 0xd8, 0xb0, 0xc5, 0xa8, 0x2d, 0xa5, 0xd5, 0xcb, + 0x6d, 0x96, 0x35, 0xec, 0x4e, 0x94, 0x88, 0x17, 0x14, 0x62, 0xc6, 0xef, 0x15, 0x78, 0x50, 0x3f, 0x32, 0x77, 0xfd, 0x98, 0x02, 0x31, 0x67, 0xe8, 0x6e, 0x93, 0x0d, 0x7b, 0xca, 0x54, 0x40, 0x07, + 0xe0, 0xb2, 0xff, 0xa6, 0xe1, 0xd6, 0x8f, 0x5c, 0x4c, 0xac, 0x1a, 0x70, 0x73, 0x2f, 0x9b, 0xb6, 0x42, 0x48, 0x90, 0x34, 0x26, 0x9a, 0x2d, 0x28, 0xa8, 0xd5, 0xdc, 0x90, 0x74, 0x00, 0x96, 0x33, + 0xec, 0x37, 0x3e, 0x82, 0x37, 0x03, 0xb7, 0x7e, 0xd9, 0x7f, 0x63, 0x45, 0x88, 0x84, 0x51, 0x26, 0x56, 0x8d, 0x51, 0xac, 0xc0, 0x8b, 0xa3, 0xec, 0xe5, 0xc8, 0x1e, 0x33, 0x7e, 0xdf, 0x18, 0xe1, + 0xcd, 0x0a, 0x6e, 0x3d, 0x56, 0x2e, 0x9c, 0xc0, 0x9e, 0xff, 0xc2, 0xfb, 0x0d, 0x6e, 0xf7, 0xfd, 0x17, 0xb7, 0x07, 0xf5, 0xbd, 0x51, 0x1e, 0x29, 0x39, 0x0c, 0xe3, 0xf7, 0x06, 0x2a, 0xf0, 0x5f, + 0xec, 0xc1, 0x6f, 0x80, 0xe1, 0x17, 0xf0, 0x34, 0x8e, 0x2b, 0x71, 0x60, 0x45, 0x37, 0xb0, 0xce, 0x86, 0x8f, 0xcd, 0xab, 0x51, 0xc4, 0x24, 0x26, 0x5d, 0x2e, 0x4b, 0x50, 0x82, 0x35, 0xfe, 0x8c, + 0xb0, 0x95, 0x74, 0x00, 0x14, 0x59, 0xd0, 0x28, 0x62, 0xb2, 0x31, 0x4a, 0x96, 0xd1, 0x08, 0x4f, 0x32, 0xfb, 0x36, 0xb6, 0x48, 0xf8, 0xbe, 0x35, 0xd4, 0x9c, 0xdc, 0x53, 0x60, 0x1a, 0x26, 0x69, + 0x1c, 0xaf, 0xe0, 0x73, 0x4a, 0x62, 0x36, 0x61, 0x34, 0x2a, 0xa3, 0x86, 0x51, 0xd9, 0x51, 0xcf, 0x9f, 0x43, 0x4e, 0xdc, 0xbc, 0xc8, 0x79, 0xba, 0x86, 0x1c, 0x0d, 0x67, 0x02, 0xae, 0x15, 0x16, + 0xe7, 0xf9, 0x4b, 0x20, 0x1a, 0x72, 0xc4, 0xac, 0x5a, 0xbd, 0x16, 0x12, 0x5a, 0xa6, 0x54, 0x1c, 0x02, 0xe5, 0x2a, 0x95, 0x14, 0x12, 0xa2, 0x67, 0x0a, 0xb0, 0x5b, 0x62, 0x1c, 0xae, 0xbb, 0x9d, + 0x0f, 0x60, 0xfb, 0x54, 0x18, 0xd3, 0x09, 0x36, 0xc6, 0x84, 0xaf, 0xf4, 0x0c, 0x09, 0x32, 0x05, 0x5a, 0xa4, 0xe1, 0x8c, 0x46, 0x18, 0x40, 0x75, 0x5b, 0x71, 0x8a, 0xb0, 0xf9, 0x08, 0x1e, 0xaf, + 0x46, 0xd4, 0xf3, 0xe7, 0xc6, 0x44, 0x85, 0x22, 0xab, 0x29, 0x32, 0x03, 0xcf, 0x4b, 0x39, 0x7b, 0x28, 0xc1, 0x8e, 0x0a, 0xf4, 0x4a, 0x16, 0x64, 0x04, 0x4a, 0xa1, 0xbd, 0x45, 0xa2, 0x80, 0x2f, + 0x11, 0x69, 0x9d, 0x37, 0x07, 0x83, 0xcb, 0xe6, 0xd5, 0xdb, 0x12, 0x91, 0xf5, 0x59, 0x99, 0x48, 0x95, 0x56, 0x81, 0x36, 0x2a, 0x99, 0xeb, 0x02, 0x0b, 0xe8, 0x0f, 0x5b, 0xcb, 0x94, 0xe1, 0xef, + 0x30, 0x96, 0x3b, 0xda, 0xaf, 0xf8, 0xfd, 0x14, 0xbd, 0x7e, 0x60, 0xca, 0xd0, 0x37, 0x59, 0x2a, 0xc7, 0x2f, 0xa0, 0xd6, 0x14, 0xaa, 0x15, 0x60, 0x67, 0x31, 0xc5, 0x0a, 0xd2, 0x7e, 0xa0, 0x61, + 0xaa, 0xb1, 0xe2, 0x37, 0xdc, 0xd1, 0x72, 0xc6, 0xc2, 0x99, 0x39, 0x0e, 0x8d, 0x0c, 0x16, 0x1f, 0xc5, 0xa8, 0x82, 0x5a, 0x59, 0xe0, 0x19, 0x7c, 0x04, 0xd7, 0x26, 0xea, 0xed, 0x26, 0xc8, 0xad, + 0x49, 0xc8, 0xdb, 0xfd, 0x8f, 0xff, 0x07, 0x9f, 0x5e, 0xdc, 0x1e, 0xec, 0x8d, 0x5c, 0x68, 0x80, 0xcb, 0x45, 0xb5, 0x3a, 0x63, 0x0d, 0x22, 0x11, 0xe6, 0xd9, 0xfe, 0xf1, 0x01, 0x1a, 0x13, 0x67, + 0x95, 0xf5, 0x1d, 0x04, 0x44, 0x81, 0xd2, 0x84, 0x47, 0x44, 0x9a, 0xbe, 0x7d, 0x20, 0x62, 0x22, 0x99, 0x82, 0xe3, 0x23, 0xdf, 0x60, 0x23, 0xee, 0xb9, 0x29, 0x16, 0x56, 0xf0, 0x9c, 0xd6, 0xa8, + 0xb8, 0x49, 0x9e, 0x41, 0x5e, 0x48, 0x72, 0xe0, 0x4d, 0xb9, 0x76, 0x89, 0x65, 0x90, 0xeb, 0xf6, 0xee, 0x84, 0x8d, 0xcb, 0x04, 0xd5, 0xc4, 0x8a, 0x5f, 0x2a, 0x18, 0x3b, 0x94, 0x5f, 0xdf, 0x24, + 0x3b, 0xac, 0x1c, 0x46, 0x39, 0x06, 0xd2, 0xb9, 0xcd, 0x93, 0x1d, 0xbc, 0xcb, 0x91, 0xb9, 0x8a, 0xc2, 0x9d, 0xb7, 0xd0, 0x16, 0x99, 0x5c, 0x5b, 0xec, 0x6d, 0xbe, 0x26, 0x41, 0x76, 0x17, 0x7d, + 0xb7, 0xe4, 0x6b, 0xf0, 0xdc, 0x82, 0xf9, 0x41, 0x66, 0x41, 0xac, 0xc5, 0x38, 0xec, 0x67, 0xe5, 0xb8, 0x12, 0x96, 0x05, 0x6c, 0xae, 0xca, 0xc6, 0x1d, 0x5a, 0x54, 0xd5, 0xad, 0xcb, 0x0a, 0x61, + 0x5a, 0x17, 0x67, 0x3b, 0xee, 0xc7, 0x8d, 0x7c, 0xa8, 0xde, 0x8c, 0xeb, 0xae, 0xa0, 0x00, 0x09, 0xee, 0x24, 0x0d, 0xd4, 0xcc, 0x18, 0x75, 0xa3, 0xdd, 0xc3, 0xd0, 0xeb, 0xbc, 0xba, 0xd8, 0x53, + 0x66, 0x7c, 0x10, 0x1c, 0x9a, 0x9d, 0x0f, 0xd8, 0x75, 0x63, 0xc0, 0x49, 0xc2, 0xa7, 0x74, 0x3d, 0x11, 0xa8, 0x7c, 0x7c, 0x03, 0xba, 0xb6, 0x92, 0x2a, 0x69, 0xdc, 0xba, 0x38, 0x6b, 0x3c, 0xc5, + 0x73, 0xf3, 0x9e, 0xd9, 0x05, 0x3f, 0x66, 0xbc, 0x04, 0x6c, 0x4c, 0xb2, 0xc6, 0x58, 0xc3, 0x97, 0x32, 0x73, 0xe4, 0x6e, 0x18, 0xed, 0x59, 0xa1, 0xf5, 0xa6, 0xd9, 0xcc, 0x3d, 0xe1, 0xb6, 0xa5, + 0x14, 0xf2, 0xa4, 0x34, 0x41, 0x65, 0x79, 0x16, 0xd1, 0x09, 0xe3, 0x34, 0x82, 0x50, 0x48, 0x49, 0x43, 0x1d, 0xaf, 0x7c, 0x17, 0x7e, 0x7b, 0xfe, 0x72, 0x8d, 0x07, 0x70, 0x43, 0x21, 0x24, 0x1c, + 0x61, 0xad, 0xee, 0x14, 0x0a, 0x36, 0x19, 0xe4, 0x03, 0xd3, 0x70, 0xfc, 0x95, 0x62, 0xb3, 0x29, 0xcc, 0x0d, 0x31, 0xd3, 0x6e, 0x59, 0x1c, 0xca, 0x17, 0x4c, 0x0a, 0x3e, 0xa7, 0x5c, 0xe3, 0xb8, + 0xc6, 0x4c, 0xea, 0x67, 0x32, 0x2a, 0xaa, 0x7d, 0x5b, 0xcb, 0x4c, 0xd9, 0xbe, 0xe9, 0xf5, 0xcf, 0xcf, 0x06, 0xc3, 0xf3, 0xe6, 0x75, 0xb7, 0xf5, 0xb6, 0xdd, 0x6f, 0x08, 0x39, 0xf5, 0x43, 0x11, + 0xd1, 0x19, 0x49, 0x95, 0x9f, 0xc4, 0xf4, 0x21, 0x55, 0x7e, 0x18, 0x13, 0xa5, 0x96, 0x42, 0xc6, 0x91, 0xf2, 0x63, 0x92, 0xf2, 0x70, 0x46, 0xa5, 0x7f, 0x9e, 0xfd, 0x81, 0xe5, 0x5e, 0x4b, 0xb2, + 0xa0, 0x12, 0x7d, 0x1d, 0x31, 0x54, 0x5c, 0xc8, 0x15, 0x7a, 0x3d, 0x0d, 0x35, 0x96, 0xfe, 0x89, 0x14, 0x73, 0x48, 0xa4, 0x08, 0x71, 0xac, 0x37, 0x1b, 0x9e, 0x02, 0x4a, 0x0b, 0x3b, 0x01, 0xad, + 0x94, 0xa6, 0x73, 0x90, 0x42, 0x68, 0xa7, 0x06, 0x13, 0x26, 0x95, 0x2e, 0x01, 0x99, 0x2d, 0x8a, 0x3f, 0x5f, 0x70, 0x50, 0xe9, 0xb8, 0x38, 0x66, 0x0a, 0x42, 0xc1, 0x15, 0x8b, 0x28, 0x4e, 0xbc, + 0x89, 0x14, 0x77, 0x34, 0xd4, 0x30, 0xc6, 0x0e, 0x6f, 0x0d, 0xe4, 0x4c, 0x18, 0x8f, 0x86, 0xa6, 0xe5, 0x1a, 0xe2, 0x9b, 0x88, 0xc9, 0xfd, 0x03, 0xf8, 0x52, 0x4c, 0x31, 0x68, 0xdd, 0x63, 0x17, + 0x3e, 0x39, 0x50, 0x84, 0xb2, 0xb5, 0xeb, 0x25, 0xde, 0x71, 0xc6, 0x62, 0x76, 0x4c, 0xb1, 0x83, 0xe8, 0x36, 0x3d, 0x37, 0xab, 0x9c, 0x3a, 0x95, 0x1c, 0x8e, 0xd7, 0x43, 0x52, 0xf6, 0xb6, 0x81, + 0xe4, 0xb1, 0x6d, 0x2b, 0xff, 0x9d, 0xb5, 0x70, 0x6e, 0x1d, 0x4f, 0x5d, 0x78, 0xd6, 0x80, 0xbd, 0x60, 0xaf, 0xdc, 0xc7, 0x59, 0xd9, 0xa2, 0x1c, 0x22, 0x30, 0xca, 0x6f, 0xa4, 0x5b, 0xce, 0xc0, + 0x80, 0xe4, 0x67, 0x92, 0x92, 0xfb, 0x22, 0xec, 0x31, 0x27, 0xd1, 0xe0, 0x44, 0x8a, 0x94, 0x47, 0x26, 0xed, 0xde, 0xbd, 0x6a, 0x37, 0x2f, 0xbd, 0x7f, 0xff, 0xf7, 0x7f, 0xfc, 0x0b, 0xf6, 0x2b, + 0x17, 0x40, 0x30, 0x48, 0x88, 0x0c, 0x0f, 0x36, 0xd8, 0x7f, 0x41, 0xe2, 0x8f, 0x9b, 0xb5, 0xdc, 0x28, 0x63, 0xfb, 0x2b, 0xfc, 0x33, 0xf0, 0x7d, 0x7b, 0x4b, 0x8e, 0xaa, 0xac, 0x29, 0x8f, 0x70, + 0xd4, 0x2d, 0x24, 0xc8, 0x5b, 0xbe, 0xdc, 0xc4, 0xf5, 0x2f, 0x99, 0x12, 0x8f, 0xae, 0xf3, 0x88, 0x81, 0x14, 0x0a, 0x1e, 0x12, 0x4d, 0x39, 0xd1, 0x54, 0x01, 0xce, 0x48, 0x31, 0xe3, 0x54, 0xd9, + 0xad, 0x84, 0xd9, 0xe1, 0x59, 0x80, 0xa1, 0x39, 0x36, 0x8e, 0x2c, 0x4f, 0xa3, 0xc7, 0x55, 0x39, 0x33, 0x1e, 0xfb, 0x5a, 0x82, 0xa7, 0x60, 0xef, 0x96, 0xef, 0x01, 0xfe, 0xf3, 0x3f, 0x06, 0xf2, + 0x20, 0x4b, 0xfa, 0x47, 0xc7, 0x79, 0xd5, 0x1c, 0xb4, 0x87, 0x67, 0x9d, 0x7e, 0x63, 0xb4, 0xed, 0x5c, 0xc4, 0xc7, 0xeb, 0xdf, 0x1d, 0x95, 0xb2, 0x31, 0x47, 0x28, 0xb3, 0xb3, 0x69, 0x7b, 0x6a, + 0xfb, 0x9f, 0x5f, 0xf6, 0x73, 0x6a, 0xd0, 0x7e, 0xd0, 0x94, 0x9b, 0x25, 0xa5, 0x16, 0x68, 0x22, 0xb1, 0x04, 0x92, 0x6a, 0x31, 0x27, 0x9a, 0x85, 0x04, 0x7b, 0xe1, 0x48, 0x2c, 0x79, 0xbe, 0x68, + 0xc0, 0x22, 0x6b, 0xf4, 0xf1, 0x96, 0x92, 0x24, 0x38, 0x3d, 0xde, 0x11, 0x69, 0x13, 0xd2, 0xac, 0x47, 0xbc, 0x90, 0x72, 0x2d, 0x49, 0xec, 0xd4, 0xe0, 0x0a, 0x87, 0x0e, 0x43, 0x4f, 0x41, 0xaa, + 0x2a, 0xc8, 0x90, 0x21, 0x63, 0xeb, 0x96, 0xa5, 0x99, 0x02, 0x3d, 0x23, 0x1a, 0x9f, 0x66, 0x6c, 0xcc, 0x34, 0x84, 0x33, 0x1a, 0xde, 0x9b, 0xf6, 0x8d, 0xc3, 0x98, 0x71, 0x22, 0x57, 0x10, 0x11, + 0x4d, 0xfc, 0x5f, 0x69, 0x8b, 0x7c, 0xc4, 0x2b, 0x1c, 0x62, 0xf2, 0x24, 0xc8, 0xa4, 0x0d, 0xb6, 0x14, 0xaf, 0x86, 0x87, 0x41, 0x77, 0xeb, 0x17, 0xef, 0xbb, 0x37, 0xc3, 0xf7, 0xed, 0xfe, 0xab, + 0xde, 0xa0, 0x8d, 0x1d, 0x95, 0xd9, 0x04, 0x54, 0xc3, 0xdd, 0x06, 0x92, 0xd9, 0x86, 0xc3, 0xdf, 0x70, 0xc8, 0x13, 0x60, 0x7d, 0xe1, 0x7c, 0x2f, 0x97, 0x96, 0x48, 0xe3, 0x88, 0xef, 0x69, 0x53, + 0x68, 0xfe, 0x86, 0xdb, 0x61, 0xc5, 0xd7, 0x4c, 0x83, 0xef, 0xfb, 0x6e, 0x39, 0x05, 0x8b, 0x4b, 0xde, 0xf0, 0xef, 0xb7, 0x2f, 0x7b, 0xd7, 0xfd, 0xf3, 0xcd, 0x6c, 0xbe, 0x23, 0xf2, 0x5a, 0xc6, + 0x8d, 0x2a, 0x50, 0xc0, 0x44, 0xa0, 0xc9, 0x3d, 0x91, 0xac, 0xca, 0x37, 0x38, 0xf2, 0xff, 0xd3, 0xff, 0xaf, 0xea, 0x99, 0x67, 0xce, 0x0a, 0xfd, 0x4b, 0xf7, 0x73, 0x4e, 0x3b, 0x5f, 0x63, 0x48, + 0x9a, 0x08, 0xbb, 0x0f, 0x2a, 0x6f, 0xb3, 0xed, 0x7e, 0xf0, 0x47, 0x58, 0x66, 0x0a, 0xdb, 0xca, 0xda, 0x79, 0x3d, 0x68, 0xb8, 0x0d, 0xd7, 0x74, 0xaf, 0x70, 0x4f, 0x57, 0xb0, 0x20, 0x71, 0x4a, + 0xd7, 0xc5, 0x15, 0xc0, 0x6e, 0x84, 0xea, 0xf7, 0x74, 0xe5, 0x62, 0xc0, 0xee, 0x67, 0x44, 0xaf, 0x65, 0x7c, 0x50, 0x58, 0xc3, 0x20, 0xb9, 0xa7, 0xb6, 0xa6, 0xda, 0xdd, 0x90, 0x51, 0x4e, 0x91, + 0xd0, 0xfc, 0x89, 0x95, 0xcc, 0x14, 0x93, 0x6f, 0x89, 0xbe, 0x44, 0x8a, 0x84, 0x4a, 0xcd, 0xa8, 0x72, 0xff, 0x51, 0x58, 0x9c, 0x95, 0x1c, 0x8d, 0xe9, 0x7b, 0x02, 0x75, 0x2b, 0x68, 0x55, 0x7d, + 0xcb, 0xed, 0x1d, 0x91, 0x78, 0x79, 0x35, 0xbe, 0x4d, 0xb4, 0xb5, 0x0d, 0x8b, 0xe1, 0xb4, 0x5a, 0xec, 0xab, 0x44, 0xb7, 0xa7, 0xc0, 0x25, 0xe3, 0x11, 0x56, 0x0d, 0xb7, 0x5e, 0x05, 0x75, 0xd7, + 0xd7, 0x41, 0x4e, 0x3e, 0x14, 0xf3, 0x39, 0xe1, 0x11, 0x78, 0x0b, 0x58, 0x4e, 0xa9, 0x7e, 0x72, 0xb1, 0xf0, 0x3d, 0xf6, 0x81, 0x8d, 0x04, 0x35, 0x84, 0x7d, 0xdf, 0xcf, 0x8a, 0x18, 0x3e, 0x16, + 0x93, 0xc3, 0xba, 0x73, 0x2f, 0x5f, 0xff, 0x86, 0xc9, 0xf5, 0xa0, 0xdd, 0xef, 0x36, 0x6d, 0x83, 0xf5, 0xd7, 0x5f, 0x95, 0x57, 0x97, 0xb6, 0x4d, 0x3a, 0xdb, 0x5e, 0x83, 0xe1, 0xcf, 0xf0, 0x73, + 0x73, 0x6f, 0x80, 0xd7, 0xdb, 0xb6, 0xc3, 0x1a, 0xbe, 0x32, 0x7e, 0xac, 0x91, 0x3d, 0x0f, 0xb3, 0xc3, 0x4b, 0x15, 0x95, 0x8d, 0xaa, 0x30, 0xf9, 0xab, 0xc4, 0xf6, 0x5f, 0x51, 0xa3, 0x2a, 0xd0, + 0xb7, 0xb2, 0xcd, 0xb4, 0xa6, 0x71, 0xd5, 0x05, 0x61, 0x2a, 0xe3, 0x5f, 0xe2, 0x02, 0x43, 0xb8, 0x70, 0x01, 0x3e, 0xfe, 0x52, 0x17, 0x18, 0x7e, 0x9e, 0xd8, 0xb6, 0x40, 0xd9, 0x40, 0x93, 0xa7, + 0xbd, 0x60, 0xf1, 0x8d, 0x03, 0xa0, 0x2a, 0xca, 0xc9, 0x86, 0xc1, 0xbf, 0x9d, 0x49, 0x1e, 0xf5, 0x15, 0x66, 0xff, 0xc8, 0xa4, 0x24, 0x8e, 0xd1, 0x8a, 0xf9, 0xb6, 0xd8, 0xda, 0xd4, 0x7c, 0x0b, + 0xd1, 0x62, 0x7d, 0x01, 0xec, 0xb4, 0x2f, 0x0e, 0x37, 0x2d, 0xec, 0xdd, 0x9f, 0xac, 0x04, 0xa6, 0x09, 0xb8, 0xb1, 0x0f, 0x79, 0x89, 0x31, 0x25, 0x21, 0x9f, 0x9e, 0xc0, 0x34, 0x72, 0xe5, 0xed, + 0x97, 0x5a, 0x32, 0x1d, 0xce, 0xb2, 0x7d, 0x8e, 0x16, 0x70, 0x93, 0x65, 0x7f, 0x75, 0x9d, 0x93, 0x7f, 0x9e, 0x31, 0xd3, 0x77, 0x59, 0xff, 0x5d, 0x15, 0xa6, 0x2a, 0xeb, 0xd7, 0x0a, 0xcc, 0x1a, + 0xca, 0x1d, 0x3d, 0x1d, 0x50, 0xb4, 0x02, 0xb8, 0x33, 0x62, 0xf2, 0x31, 0x8f, 0x3e, 0x59, 0xbe, 0x9f, 0xb0, 0x4c, 0xf8, 0x34, 0x4d, 0xf8, 0x6e, 0x07, 0xe7, 0xbf, 0x6c, 0x38, 0xf4, 0xa0, 0x25, + 0xe6, 0x09, 0x8b, 0xd7, 0x9f, 0xb5, 0x76, 0x3b, 0xa6, 0xb8, 0xe5, 0xcb, 0xbf, 0x92, 0x15, 0xf2, 0x5f, 0xad, 0x44, 0x6f, 0xfd, 0xfd, 0xcc, 0x28, 0xb0, 0x05, 0xba, 0xbf, 0x6b, 0x7e, 0x0e, 0xdd, + 0x8a, 0x21, 0x0f, 0x2a, 0x58, 0x1b, 0xfc, 0x0a, 0xcb, 0xff, 0x4c, 0x73, 0xd6, 0xa0, 0x9f, 0xc5, 0x11, 0xca, 0x1f, 0xad, 0xf1, 0x7e, 0xb6, 0xdd, 0xfb, 0xe5, 0x8f, 0x89, 0x3f, 0x68, 0xf5, 0x9d, + 0xa6, 0x74, 0xc1, 0x0b, 0x93, 0x4a, 0x37, 0xf7, 0x04, 0xaf, 0xf5, 0x17, 0xbb, 0xcb, 0x7e, 0xef, 0x5d, 0xbb, 0x75, 0x85, 0xd6, 0xc4, 0x49, 0xe3, 0x49, 0xe3, 0x17, 0x9f, 0x47, 0x26, 0xec, 0x57, + 0x36, 0xdb, 0x35, 0x68, 0xdb, 0x69, 0x8e, 0xe6, 0xf3, 0xc7, 0xaf, 0xe4, 0xe6, 0x64, 0xdb, 0xad, 0x5d, 0xb6, 0x68, 0xd4, 0xbf, 0xd8, 0xe3, 0xec, 0xf9, 0xc4, 0x2b, 0x4d, 0x64, 0x8f, 0xce, 0xb7, + 0x85, 0x82, 0x71, 0xfd, 0x4e, 0x53, 0xa3, 0x1d, 0x4b, 0x1f, 0x87, 0xdd, 0xfa, 0x7e, 0x79, 0xe6, 0x7c, 0xc2, 0x3f, 0x36, 0xd8, 0xef, 0x16, 0x73, 0xdf, 0x7e, 0x3e, 0x72, 0x0f, 0x72, 0xe2, 0x48, + 0xc4, 0xdd, 0xfc, 0x82, 0xf0, 0xfd, 0x35, 0xd4, 0xd9, 0x51, 0x3a, 0xff, 0x76, 0x17, 0xfe, 0xb5, 0x4a, 0xfa, 0x23, 0x9f, 0x10, 0xb6, 0x88, 0xfd, 0x94, 0x8f, 0x09, 0x05, 0xb9, 0xf2, 0xf7, 0x84, + 0x42, 0xcd, 0x5d, 0x69, 0x51, 0xd2, 0x79, 0x57, 0xa4, 0x7c, 0xd5, 0x00, 0xbb, 0xe8, 0xe5, 0xdf, 0x2f, 0x2e, 0xa5, 0x58, 0xb0, 0x88, 0x02, 0x01, 0x37, 0x5f, 0x97, 0xb3, 0x3f, 0x69, 0xe4, 0xc2, + 0x92, 0x98, 0x9d, 0x95, 0xa4, 0x5a, 0x32, 0xba, 0xb0, 0xff, 0x53, 0x4a, 0xeb, 0xbc, 0x03, 0x44, 0x4e, 0xb3, 0x91, 0x78, 0xc9, 0x62, 0x1c, 0xa7, 0xcd, 0x9e, 0xcb, 0x2c, 0xae, 0xc6, 0x42, 0xcf, + 0xd6, 0x1e, 0xc6, 0xd6, 0x8b, 0x0b, 0xee, 0xe5, 0xcf, 0x76, 0x0b, 0xc8, 0x04, 0x57, 0x7e, 0x16, 0x75, 0xad, 0x8b, 0xb3, 0xe1, 0x79, 0xa7, 0xdb, 0x1e, 0x36, 0xfb, 0x6f, 0x30, 0xfc, 0xb2, 0xd3, + 0x5e, 0xf7, 0x75, 0xe7, 0x0d, 0xd4, 0xff, 0xd7, 0xad, 0xa6, 0x46, 0x05, 0xda, 0x71, 0x6e, 0xfa, 0xcd, 0xcb, 0xcb, 0x76, 0xbf, 0xba, 0xce, 0xcb, 0x06, 0x2d, 0x3b, 0x75, 0xe5, 0x5d, 0x7f, 0xb9, + 0xfc, 0x5c, 0x10, 0xc6, 0x31, 0xe5, 0x68, 0x58, 0xde, 0x7a, 0xde, 0x3a, 0x50, 0x0e, 0x62, 0xf3, 0xec, 0x99, 0x82, 0x6d, 0x6c, 0xf9, 0xb5, 0x44, 0xf8, 0xca, 0x04, 0x8e, 0x54, 0x5c, 0xef, 0xcc, + 0x0a, 0x33, 0x13, 0x73, 0x8a, 0xe9, 0x6c, 0x63, 0xf1, 0xd1, 0x2d, 0xde, 0xcc, 0xd3, 0x58, 0xb3, 0x0b, 0x11, 0xa5, 0x31, 0xbd, 0xb4, 0x1b, 0x87, 0xb3, 0x7c, 0xa5, 0xb7, 0xce, 0xff, 0x2a, 0xe7, + 0xc7, 0x4c, 0xe2, 0x2f, 0x9b, 0x36, 0x78, 0x84, 0xaa, 0x0d, 0x5d, 0x34, 0xe2, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, 0x00, 0x56, + 0x27, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0xcc, 0x58, 0xff, 0x6f, 0xea, 0x46, 0x12, + 0xff, 0xb9, 0xfe, 0x2b, 0xa6, 0x56, 0xdd, 0x24, 0x15, 0x38, 0x79, 0x91, 0xee, 0x74, 0xa2, 0xf2, 0xe9, 0x39, 0x60, 0x1a, 0xd2, 0x04, 0x90, 0x4d, 0x92, 0x57, 0xf5, 0xf5, 0xd0, 0x62, 0x0f, 0xb0, + 0x2f, 0x66, 0xd7, 0xdd, 0x5d, 0x20, 0xdc, 0xe9, 0xfe, 0xf7, 0xd3, 0xae, 0xd7, 0xd8, 0x84, 0x24, 0xbd, 0x9e, 0x5a, 0xe9, 0xde, 0x0f, 0x8f, 0x78, 0x3d, 0xdf, 0xe7, 0x33, 0xb3, 0x33, 0xfe, 0x18, + 0x47, 0x77, 0xd0, 0xfe, 0x03, 0xff, 0x39, 0x46, 0xe2, 0x2d, 0x4d, 0x91, 0x49, 0xcc, 0x40, 0x71, 0x50, 0x4b, 0x84, 0xb0, 0x20, 0xe9, 0x12, 0x21, 0xe1, 0x73, 0xb5, 0x25, 0x02, 0xa1, 0xcf, 0xd7, + 0x2c, 0x23, 0x8a, 0x72, 0x06, 0xa7, 0x61, 0xd2, 0x3f, 0x83, 0x35, 0xcb, 0x50, 0x00, 0x67, 0x58, 0xf2, 0x73, 0x01, 0x2b, 0x2e, 0x10, 0x52, 0xce, 0x94, 0xa0, 0xb3, 0xb5, 0xe2, 0x02, 0xf2, 0x52, + 0x26, 0x90, 0x85, 0x40, 0x5c, 0x21, 0x53, 0xd2, 0x07, 0x48, 0x10, 0x8d, 0x82, 0xe1, 0x68, 0x32, 0xe8, 0x46, 0x30, 0xa7, 0xb9, 0x95, 0x90, 0x51, 0x59, 0x72, 0x62, 0x06, 0x5b, 0xaa, 0x96, 0xa0, + 0x96, 0x54, 0xc2, 0x96, 0x8b, 0x27, 0x98, 0x73, 0x01, 0x24, 0xcb, 0xa8, 0x56, 0x4f, 0x72, 0xa0, 0x6c, 0xce, 0xc5, 0xca, 0x18, 0x53, 0xb2, 0x0a, 0x5c, 0x10, 0x91, 0x51, 0xb6, 0x80, 0x94, 0x17, + 0x3b, 0x41, 0x17, 0x4b, 0x05, 0x7c, 0xcb, 0x50, 0xc8, 0x25, 0x2d, 0x7c, 0x80, 0x89, 0x76, 0x28, 0xe9, 0x57, 0x06, 0xc9, 0x52, 0x74, 0xad, 0x5a, 0x71, 0xd8, 0xf1, 0xb5, 0x75, 0xa9, 0xe1, 0xbd, + 0x0d, 0x4a, 0x0b, 0x1e, 0x50, 0x48, 0xed, 0xfa, 0xa5, 0x7f, 0x01, 0xa7, 0x6a, 0x69, 0xd9, 0x5c, 0xfb, 0xde, 0x3d, 0xfb, 0xde, 0xf0, 0xaf, 0xc8, 0x0e, 0x18, 0x57, 0xb0, 0x96, 0x58, 0x6b, 0x00, + 0x7c, 0x4e, 0xb1, 0x50, 0x40, 0x19, 0xa4, 0x7c, 0x55, 0xe4, 0x94, 0xb0, 0xd4, 0xf2, 0x5b, 0x2f, 0xf7, 0x7a, 0x7c, 0x80, 0x9f, 0xac, 0x18, 0x3e, 0x53, 0x84, 0x32, 0x20, 0xc6, 0x21, 0xe0, 0xf3, + 0x26, 0x19, 0x10, 0x65, 0xf8, 0x4b, 0x21, 0x00, 0xb0, 0x54, 0xaa, 0x90, 0x9d, 0xf3, 0xf3, 0xed, 0x76, 0xeb, 0x13, 0x63, 0xb9, 0xcf, 0xc5, 0xe2, 0xbc, 0xf2, 0xf6, 0xfc, 0x76, 0xd0, 0x8d, 0x86, + 0x49, 0xd4, 0xbe, 0xf4, 0x2f, 0x1a, 0x8c, 0xf7, 0x2c, 0x47, 0x29, 0x41, 0xe0, 0xaf, 0x6b, 0x2a, 0x30, 0x83, 0xd9, 0x0e, 0x48, 0x51, 0xe4, 0x34, 0x25, 0xb3, 0x1c, 0x21, 0x27, 0x5b, 0x9d, 0x53, + 0x93, 0x3a, 0x03, 0x0a, 0xca, 0x60, 0x2b, 0xa8, 0xa2, 0x6c, 0xd1, 0x2a, 0xf9, 0x65, 0x05, 0x8d, 0x66, 0xe2, 0xea, 0x10, 0x56, 0xc6, 0x52, 0x79, 0x40, 0xc0, 0x19, 0x10, 0x9b, 0x35, 0x37, 0x4c, + 0x60, 0x90, 0xb8, 0x70, 0x15, 0x26, 0x83, 0xa4, 0x05, 0x8f, 0x83, 0xc9, 0xf5, 0xe8, 0x7e, 0x02, 0x8f, 0x61, 0x1c, 0x87, 0xc3, 0xc9, 0x20, 0x4a, 0x60, 0x14, 0x43, 0x77, 0x34, 0xec, 0x0d, 0x26, + 0x83, 0xd1, 0x30, 0x81, 0x51, 0x1f, 0xc2, 0xe1, 0x4f, 0x25, 0xef, 0x8f, 0x83, 0x61, 0xaf, 0x05, 0x48, 0xd5, 0x12, 0x05, 0xe0, 0x73, 0x21, 0xb4, 0x2b, 0x5c, 0x00, 0xd5, 0x11, 0xc6, 0xac, 0x81, + 0xb3, 0xca, 0x0e, 0x8d, 0xa1, 0x7d, 0xe6, 0x64, 0x81, 0x29, 0x9d, 0xd3, 0x14, 0x72, 0xc2, 0x16, 0x6b, 0xb2, 0x40, 0x58, 0xf0, 0x0d, 0x0a, 0xa6, 0x21, 0x54, 0xa0, 0x58, 0x51, 0xa9, 0xd3, 0x2d, + 0x81, 0xb0, 0x0c, 0x72, 0xba, 0xa2, 0xca, 0x80, 0x4d, 0x96, 0xcc, 0x47, 0x3e, 0xfa, 0xce, 0x1f, 0x5f, 0x94, 0x7f, 0x82, 0x48, 0x23, 0xf1, 0x8e, 0x6c, 0x90, 0x41, 0xa2, 0x88, 0x50, 0x70, 0x5f, + 0xc0, 0x15, 0x51, 0xe9, 0x12, 0x64, 0x2a, 0x68, 0xd1, 0x04, 0x55, 0x5c, 0x81, 0x22, 0x1a, 0x3e, 0xc0, 0x86, 0x08, 0xd9, 0x29, 0xcf, 0x6f, 0xc2, 0x87, 0x70, 0x7a, 0x3d, 0xba, 0x8b, 0xa0, 0x0d, + 0x39, 0x4f, 0xcb, 0x7e, 0xc0, 0xe7, 0x40, 0xe0, 0xa6, 0xf7, 0x23, 0x2c, 0xf9, 0x4a, 0xa3, 0x41, 0x34, 0x04, 0x8d, 0x0a, 0x5b, 0xb3, 0x95, 0x20, 0x6b, 0xc5, 0xe5, 0x6b, 0x52, 0x56, 0xda, 0xb6, + 0xcb, 0x13, 0x09, 0x94, 0x49, 0x45, 0xf2, 0x1c, 0xb3, 0x43, 0x91, 0x70, 0x17, 0x3e, 0x44, 0xc3, 0xe9, 0x55, 0x38, 0xe9, 0x5e, 0x4f, 0xa3, 0xee, 0xf5, 0x08, 0xda, 0x20, 0x51, 0x69, 0x74, 0x9e, + 0x70, 0x76, 0xa2, 0x7f, 0x91, 0x19, 0xf4, 0xea, 0xe4, 0x60, 0xba, 0xe4, 0x3a, 0x9f, 0xb6, 0x78, 0x66, 0xc6, 0xd3, 0x94, 0xaf, 0x56, 0x84, 0x65, 0xf2, 0x58, 0xde, 0x38, 0xbc, 0x4f, 0xa2, 0x63, + 0x81, 0x5b, 0x42, 0x55, 0xd9, 0x7f, 0xe0, 0x09, 0x77, 0x52, 0x09, 0xfe, 0x84, 0x30, 0xc3, 0xb9, 0xee, 0x75, 0xc8, 0x74, 0xcf, 0x69, 0x8a, 0x1a, 0x8d, 0x27, 0x09, 0xb4, 0xa1, 0x20, 0x82, 0xac, + 0x50, 0xa1, 0x90, 0x50, 0x10, 0xd9, 0xe8, 0xaa, 0x37, 0x64, 0x43, 0xe0, 0xe1, 0x0e, 0xb6, 0x4b, 0x64, 0x20, 0xd6, 0xcc, 0x00, 0xce, 0xa4, 0x64, 0x5f, 0xcc, 0x80, 0xfe, 0xc2, 0xd7, 0xf4, 0x19, + 0xce, 0xd6, 0xf6, 0x25, 0x50, 0x25, 0x31, 0x9f, 0xb7, 0x74, 0x67, 0xb1, 0x00, 0x46, 0xd5, 0x50, 0x19, 0xb4, 0x3f, 0x95, 0xd4, 0xed, 0x4f, 0x62, 0xcd, 0xbe, 0x64, 0xdb, 0xa2, 0xa3, 0x04, 0x61, + 0xb2, 0xe0, 0x42, 0x05, 0x99, 0x9a, 0x4a, 0x9e, 0x3e, 0xa1, 0x6a, 0x49, 0x14, 0x1b, 0x14, 0xc1, 0xae, 0x25, 0xd7, 0xb2, 0x40, 0x96, 0x05, 0xbb, 0x16, 0xc9, 0x32, 0x5d, 0x3a, 0xc1, 0xdf, 0x2e, + 0x2e, 0x2e, 0x9a, 0x8e, 0x24, 0x3f, 0x0e, 0xc6, 0xd3, 0xb8, 0x0b, 0x6d, 0x98, 0xe7, 0x64, 0x61, 0xcc, 0xa1, 0xb2, 0x6c, 0x0c, 0x9c, 0x64, 0x36, 0xac, 0x26, 0x5f, 0x22, 0x35, 0x6d, 0x4e, 0xfe, + 0x09, 0x80, 0x2d, 0x45, 0x5e, 0xe1, 0x42, 0x77, 0xc2, 0x3c, 0x07, 0xfd, 0x94, 0x53, 0x86, 0xb2, 0xec, 0x9c, 0x27, 0x1f, 0x4f, 0x4c, 0x57, 0x25, 0x12, 0x8f, 0x91, 0x41, 0xa5, 0x49, 0xa1, 0xf3, + 0x51, 0xc3, 0x00, 0xf8, 0x7c, 0x5e, 0xc7, 0x4d, 0x51, 0x95, 0xa3, 0xb6, 0xdf, 0x82, 0x01, 0xb6, 0x94, 0x65, 0x7c, 0xeb, 0x94, 0xe7, 0x9e, 0x8d, 0x83, 0x45, 0x52, 0x85, 0xa2, 0xd9, 0x4e, 0xf3, + 0x2a, 0x93, 0xaf, 0x97, 0xba, 0x2c, 0x5c, 0x9c, 0x8f, 0x74, 0x0e, 0xae, 0xf7, 0xf2, 0xb5, 0xe7, 0x42, 0x10, 0x80, 0xcb, 0x99, 0x0b, 0x46, 0x1a, 0x1c, 0x53, 0x38, 0xb5, 0x71, 0x9e, 0xae, 0x0b, + 0xcf, 0x40, 0xf9, 0xd7, 0x35, 0xdd, 0x90, 0x1c, 0x99, 0xd2, 0xb6, 0x7e, 0xa3, 0xcf, 0x1d, 0xa3, 0xc0, 0x50, 0x94, 0x42, 0x5d, 0x38, 0xd5, 0x4c, 0xae, 0x3e, 0x0a, 0xcc, 0x8b, 0x5e, 0x3c, 0x78, + 0x88, 0x3c, 0xf3, 0xe7, 0x38, 0x9c, 0x5c, 0x7b, 0xee, 0x99, 0x15, 0x1e, 0x3d, 0x63, 0xba, 0x56, 0x08, 0x44, 0x83, 0x48, 0x40, 0x86, 0x73, 0xca, 0x30, 0xb3, 0xa5, 0x5f, 0x21, 0xda, 0xdc, 0x5a, + 0xfa, 0x4e, 0xa7, 0x73, 0x73, 0x93, 0x55, 0xde, 0x58, 0x38, 0xec, 0xb5, 0x2e, 0xb8, 0xe2, 0x20, 0x9f, 0x68, 0x11, 0xa7, 0x63, 0x61, 0x21, 0x99, 0x2e, 0x31, 0x2d, 0xaf, 0xea, 0x42, 0xa0, 0x95, + 0xdb, 0x02, 0xce, 0x52, 0x2c, 0xd3, 0x95, 0xe3, 0x82, 0xa4, 0x3b, 0xf0, 0x67, 0x44, 0xd9, 0xca, 0x31, 0xed, 0xb5, 0x26, 0xf0, 0xd3, 0x55, 0x56, 0xd5, 0x14, 0x9d, 0x03, 0x3e, 0x53, 0xa9, 0x2a, + 0x77, 0x3f, 0x5b, 0xac, 0x4d, 0x0b, 0x81, 0x5a, 0x82, 0x0b, 0xa9, 0x46, 0xc4, 0x5b, 0x6f, 0xdf, 0xe7, 0x4f, 0x57, 0xd9, 0x3b, 0xfc, 0xfa, 0xad, 0xd3, 0xa9, 0x9d, 0x73, 0x3e, 0x4a, 0x54, 0xba, + 0x4d, 0xe5, 0x8e, 0xa3, 0x83, 0x1d, 0xc5, 0xf1, 0x28, 0x9e, 0x76, 0x47, 0xbd, 0x28, 0xb8, 0xb0, 0xb1, 0x9d, 0x70, 0xa0, 0x92, 0xe7, 0x44, 0x21, 0x50, 0xa6, 0x50, 0xe8, 0x86, 0xb7, 0x21, 0x82, + 0x6a, 0x04, 0x49, 0x98, 0x0b, 0xbe, 0x82, 0x82, 0x4b, 0x49, 0x35, 0xa0, 0x0a, 0x2e, 0x95, 0x8d, 0x8e, 0x6c, 0xc1, 0x16, 0xcd, 0xb4, 0x40, 0x18, 0x37, 0x37, 0xd9, 0x5e, 0x53, 0x43, 0xa7, 0xd1, + 0x10, 0x04, 0x41, 0x00, 0xc9, 0x24, 0x8c, 0x27, 0xf0, 0x10, 0xde, 0x0e, 0x7a, 0xa1, 0xbe, 0x12, 0xcd, 0x69, 0x9d, 0xaa, 0x7d, 0x73, 0x3e, 0x4c, 0xd3, 0xe8, 0xe9, 0xe6, 0x9a, 0xaf, 0xd0, 0x71, + 0x34, 0xf8, 0x7c, 0xf3, 0x3f, 0x44, 0x42, 0x70, 0xd1, 0x69, 0xb4, 0x73, 0x2d, 0x61, 0xae, 0x47, 0x3c, 0x5d, 0x51, 0x3b, 0xbe, 0x16, 0x80, 0x6c, 0x43, 0x05, 0x67, 0x7a, 0x6c, 0xf3, 0xe1, 0xef, + 0xdf, 0x5e, 0x96, 0x8c, 0xe3, 0x1c, 0x75, 0xb9, 0x99, 0x32, 0xd2, 0xfd, 0x6c, 0x2f, 0xa0, 0x72, 0xf7, 0x35, 0x7e, 0x8d, 0xe6, 0x95, 0x69, 0xbf, 0x9a, 0x67, 0x2f, 0xab, 0xd9, 0xfa, 0x0d, 0x8b, + 0xe9, 0x8e, 0xb6, 0xf7, 0x9b, 0x37, 0xb5, 0x62, 0xdf, 0x31, 0xbe, 0xa0, 0xb6, 0xdb, 0x71, 0x3a, 0x95, 0x4f, 0x8d, 0x34, 0xd7, 0xde, 0x7f, 0x9e, 0x51, 0xf6, 0xf9, 0x0b, 0xd9, 0x10, 0x1f, 0x9f, + 0xd1, 0x06, 0x81, 0x32, 0xaa, 0xde, 0x8f, 0x00, 0x95, 0x55, 0xeb, 0x27, 0x0c, 0x28, 0xdb, 0x90, 0x9c, 0x66, 0xfa, 0xe6, 0xc1, 0x54, 0x71, 0xb1, 0x6b, 0x84, 0xa0, 0x66, 0x09, 0x5e, 0x04, 0xfd, + 0xff, 0x2c, 0x4a, 0x35, 0x70, 0xa2, 0x61, 0xef, 0x08, 0x36, 0x4e, 0xa7, 0x8c, 0x89, 0xa1, 0xea, 0x53, 0x96, 0x19, 0xb5, 0x85, 0xe0, 0x5f, 0x30, 0x55, 0x30, 0xd3, 0xf6, 0x67, 0x54, 0xb4, 0x80, + 0xfa, 0xe8, 0x9b, 0x57, 0xfb, 0x58, 0x80, 0x5a, 0x12, 0x65, 0x06, 0x7d, 0x42, 0x99, 0x34, 0xef, 0xe6, 0x3c, 0xd7, 0x33, 0x91, 0xeb, 0xaf, 0x36, 0xcc, 0xb5, 0xe3, 0x50, 0x9f, 0xe4, 0xf9, 0x8c, + 0xa4, 0x4f, 0xda, 0xaf, 0x74, 0x2d, 0x84, 0x76, 0x51, 0x4f, 0xf3, 0xba, 0xf0, 0x6b, 0x59, 0x16, 0xbd, 0x06, 0x7b, 0x7e, 0x59, 0x60, 0x65, 0xcb, 0x19, 0xc7, 0xa3, 0x9b, 0xa8, 0x3b, 0xb9, 0x0a, + 0x93, 0xa8, 0x37, 0x88, 0x83, 0x7d, 0xd3, 0x34, 0x8f, 0x9e, 0x33, 0xe8, 0xeb, 0x0d, 0x62, 0xdf, 0xa0, 0x0e, 0xa9, 0x3d, 0x37, 0x08, 0x2a, 0xf8, 0x23, 0xcb, 0x7a, 0xa8, 0x30, 0x55, 0x57, 0x44, + 0x62, 0x8f, 0x0a, 0x5b, 0xc4, 0x9f, 0xa2, 0xee, 0xd4, 0xc8, 0xed, 0xf6, 0x3c, 0x73, 0xf2, 0x68, 0x9e, 0xaa, 0x73, 0xcf, 0xe9, 0xcc, 0x29, 0xcb, 0x2a, 0x9e, 0x41, 0x1f, 0xa2, 0x4f, 0x83, 0x44, + 0xeb, 0x7b, 0x34, 0xf2, 0x3f, 0x6b, 0x4f, 0x4b, 0x05, 0xb3, 0x92, 0xc6, 0x2c, 0x48, 0x4e, 0x9a, 0x81, 0xef, 0x6b, 0xf2, 0x8a, 0x30, 0x08, 0x5c, 0xad, 0xc2, 0x3d, 0xa0, 0x1d, 0x72, 0x55, 0x92, + 0xd7, 0x8a, 0xb5, 0x19, 0x86, 0xa4, 0xa9, 0xd6, 0xe9, 0x1c, 0x08, 0x7f, 0x3b, 0x38, 0x46, 0x97, 0x56, 0xee, 0xd6, 0x1e, 0xb8, 0xce, 0x1b, 0xfe, 0x77, 0x5e, 0xb3, 0xe2, 0x75, 0xb9, 0x75, 0x38, + 0x5e, 0xca, 0x76, 0x3a, 0xc7, 0x82, 0x6d, 0x4e, 0xaa, 0x48, 0xbd, 0x9a, 0x19, 0x13, 0xb8, 0xcf, 0x5f, 0x36, 0x2b, 0x3f, 0xe5, 0x6c, 0x4e, 0x17, 0x75, 0x96, 0x62, 0x24, 0x59, 0xb8, 0x5f, 0xf2, + 0xba, 0xe6, 0x6d, 0xa3, 0xf9, 0x42, 0x64, 0x2e, 0xe4, 0xe8, 0x59, 0x21, 0x2b, 0x87, 0xf3, 0xf2, 0xa0, 0x87, 0x39, 0xd9, 0x61, 0x16, 0x3d, 0x17, 0xc4, 0x9c, 0x3b, 0xfa, 0x06, 0x3a, 0xef, 0x83, + 0xbb, 0x96, 0xa8, 0xe1, 0xf7, 0x2b, 0x64, 0x98, 0xd3, 0x95, 0x0c, 0x5c, 0xf0, 0x3c, 0x5d, 0x38, 0x70, 0xfa, 0xdf, 0x9a, 0x76, 0x06, 0x19, 0x37, 0x45, 0x7c, 0xf3, 0x70, 0x37, 0xed, 0x8e, 0x86, + 0xfd, 0xc1, 0x0f, 0xd3, 0x3d, 0xe7, 0x38, 0x09, 0xbe, 0x7e, 0xfd, 0xfc, 0x6b, 0xad, 0xc8, 0xf9, 0x88, 0x2c, 0x2b, 0x0d, 0xff, 0xf6, 0x3d, 0x19, 0xde, 0xeb, 0xe7, 0x5e, 0x19, 0xe0, 0xd7, 0x63, + 0x92, 0x44, 0x13, 0x9b, 0x2f, 0xd3, 0x59, 0xa2, 0x4f, 0x51, 0xf0, 0x76, 0xff, 0x2b, 0x31, 0x16, 0x87, 0xe3, 0x71, 0x14, 0x4f, 0x6f, 0xc2, 0x38, 0x78, 0xd7, 0xfb, 0xad, 0x20, 0x45, 0x81, 0xa2, + 0xbc, 0x10, 0xdb, 0xf6, 0xc9, 0xff, 0x42, 0xc4, 0xa1, 0x9c, 0xdb, 0xf0, 0x7e, 0xd8, 0xbd, 0x8e, 0xe2, 0x80, 0x8b, 0x45, 0xb5, 0x72, 0x1a, 0x16, 0xbf, 0x62, 0x31, 0x73, 0xeb, 0x63, 0xf9, 0x70, + 0x47, 0x28, 0x2b, 0xcb, 0xae, 0x37, 0x7a, 0x1c, 0xde, 0x8e, 0xc2, 0xde, 0xf4, 0x3e, 0xbe, 0x0d, 0xdc, 0x6a, 0x6f, 0x15, 0x58, 0x70, 0xcb, 0xde, 0x58, 0x5f, 0xcb, 0x6d, 0xe0, 0x9c, 0xf2, 0x73, + 0x45, 0x9e, 0x88, 0xa0, 0xe7, 0x07, 0x36, 0x9d, 0x5f, 0xf8, 0x7f, 0xf1, 0xff, 0x7a, 0x78, 0xd6, 0x36, 0x67, 0xa5, 0xb5, 0x4e, 0x7f, 0x14, 0x1b, 0x18, 0x28, 0xfe, 0x84, 0x4c, 0x06, 0x1f, 0x5a, + 0x97, 0x15, 0x10, 0x0c, 0x12, 0x42, 0x18, 0x0c, 0x7f, 0x03, 0x09, 0xaf, 0xc7, 0xa2, 0x10, 0xbc, 0x40, 0xa1, 0x28, 0x4a, 0xf7, 0x0c, 0x7a, 0x23, 0x38, 0x75, 0xf4, 0xd0, 0x6e, 0x2a, 0xde, 0x0b, + 0x75, 0xb9, 0x5b, 0xc2, 0x7b, 0x91, 0xbb, 0xa0, 0x33, 0x75, 0xe0, 0xb3, 0xe7, 0x5d, 0x39, 0xf5, 0x44, 0x66, 0xa1, 0x6c, 0x2e, 0x9d, 0x3c, 0xe7, 0x5b, 0x20, 0x6b, 0xc5, 0x57, 0x44, 0x51, 0x3d, + 0x9c, 0xec, 0x20, 0xe3, 0x5b, 0x56, 0x8d, 0xdb, 0xba, 0xcb, 0x1e, 0x25, 0xa5, 0x1c, 0x2d, 0x4c, 0xa8, 0xdb, 0x29, 0x32, 0x25, 0xf4, 0xe4, 0x60, 0x06, 0x12, 0x3d, 0xc7, 0x19, 0x91, 0x12, 0xd6, + 0xf2, 0x80, 0x1f, 0x2c, 0xbf, 0xae, 0x04, 0xdb, 0xed, 0x65, 0xd9, 0xd1, 0x0b, 0xc1, 0x97, 0x74, 0x46, 0x55, 0x39, 0xc9, 0x69, 0x26, 0xca, 0x60, 0x46, 0x19, 0x11, 0x3b, 0xc8, 0x88, 0x22, 0x7e, + 0x7d, 0xdd, 0x7a, 0x0d, 0x40, 0x79, 0x36, 0x04, 0xe5, 0xf0, 0xfb, 0x30, 0x7c, 0x9c, 0x3e, 0x44, 0xf1, 0xd5, 0x28, 0xa9, 0xc6, 0x10, 0x25, 0xd6, 0xe8, 0x5a, 0x1a, 0xb3, 0xdf, 0xe8, 0x5b, 0xcd, + 0x34, 0x9e, 0x43, 0x31, 0x86, 0xe0, 0xcc, 0x39, 0x03, 0xcc, 0x25, 0xd6, 0x32, 0xed, 0x18, 0xaa, 0xe5, 0xc6, 0xd1, 0x78, 0x74, 0x1f, 0xdf, 0xd6, 0xb3, 0xef, 0x5e, 0xe6, 0x51, 0x9c, 0x5f, 0x70, + 0xfc, 0xaf, 0x28, 0x2a, 0x4d, 0xfa, 0xdd, 0xde, 0x75, 0xf9, 0x3a, 0xcf, 0xd8, 0x89, 0x32, 0xcd, 0xfc, 0xd0, 0xcb, 0xd6, 0x41, 0x56, 0xa9, 0x02, 0xdf, 0xf7, 0x0f, 0x99, 0x7b, 0x8d, 0xf7, 0x3a, + 0xbf, 0x1d, 0xf0, 0x9a, 0xae, 0x55, 0x71, 0x32, 0x3f, 0x05, 0xdf, 0xa2, 0x90, 0x4b, 0xcc, 0x73, 0x68, 0x77, 0xed, 0x36, 0xe3, 0x7e, 0xfb, 0x2f, 0xf7, 0x1f, 0xce, 0x57, 0x5f, 0xb9, 0xdf, 0x6c, + 0x71, 0x96, 0xe6, 0x54, 0xdf, 0xbb, 0x01, 0x30, 0xdc, 0xb6, 0xf9, 0xcc, 0xdc, 0xed, 0xc9, 0x4e, 0x2a, 0x5c, 0xf9, 0x43, 0x54, 0xfe, 0x23, 0xce, 0xba, 0x86, 0xe2, 0xfb, 0x92, 0x85, 0xce, 0xe1, + 0xb4, 0xad, 0x23, 0x7e, 0xfa, 0xb3, 0x54, 0x82, 0xb2, 0xc5, 0x2f, 0x9d, 0xce, 0x40, 0x0e, 0xd7, 0x79, 0x3e, 0x12, 0xd1, 0xaa, 0x50, 0xbb, 0xd3, 0x93, 0x32, 0x08, 0xf7, 0x49, 0x14, 0x0f, 0xc3, + 0xbb, 0xc8, 0x3b, 0x39, 0x83, 0xb6, 0xd6, 0xfa, 0x1b, 0xf4, 0xe3, 0x30, 0x49, 0x1e, 0x47, 0x71, 0xcf, 0x3b, 0x39, 0x3b, 0x3b, 0x83, 0x23, 0x03, 0xfd, 0xae, 0xc0, 0x0c, 0x99, 0xa2, 0x24, 0x97, + 0x6f, 0x1a, 0x3b, 0x44, 0xa5, 0xe7, 0x87, 0x9a, 0xf4, 0xd8, 0x98, 0x16, 0x1c, 0xeb, 0xb3, 0xae, 0xfd, 0xbb, 0xfc, 0xf9, 0x59, 0x4b, 0x4a, 0x50, 0x6c, 0x68, 0x8a, 0x63, 0x4e, 0x99, 0xba, 0x23, + 0x8c, 0x2c, 0x50, 0xfc, 0xd2, 0xe9, 0x24, 0x98, 0xae, 0x05, 0x55, 0xbb, 0xb1, 0xe0, 0x8a, 0xa7, 0x3c, 0x87, 0x00, 0x2c, 0xf5, 0xe1, 0xf9, 0x64, 0x57, 0xe0, 0x2f, 0x9d, 0xce, 0x24, 0x97, 0x1f, + 0x2e, 0xbf, 0x87, 0x86, 0x13, 0x55, 0xe6, 0xfa, 0x34, 0xc7, 0xd3, 0x93, 0xc3, 0xac, 0x19, 0xd3, 0x9a, 0x40, 0x38, 0x39, 0xab, 0xec, 0xfa, 0xfd, 0xf8, 0xea, 0x53, 0x46, 0xe5, 0x12, 0xb3, 0x03, + 0x2c, 0xbd, 0x5a, 0x4c, 0xb6, 0xd3, 0xe8, 0x3d, 0x4b, 0xd7, 0xae, 0x6d, 0x38, 0xb6, 0x01, 0x8d, 0x05, 0xdf, 0xd0, 0x4c, 0xaf, 0x84, 0xae, 0x54, 0x84, 0x65, 0x44, 0x64, 0xf4, 0x9f, 0x98, 0xb9, + 0xb0, 0x25, 0x3b, 0xdd, 0x93, 0x04, 0x2a, 0x41, 0x71, 0x53, 0x7e, 0x4e, 0xe9, 0xde, 0x0e, 0x80, 0x88, 0x85, 0xed, 0x15, 0x5b, 0x9a, 0xdb, 0x56, 0x63, 0x3e, 0xd0, 0x9a, 0xfd, 0x6d, 0xc6, 0xd5, + 0x12, 0x1e, 0xcd, 0x2e, 0x5d, 0x7e, 0x39, 0x63, 0x9c, 0xb5, 0xab, 0x67, 0x34, 0xeb, 0xa7, 0xbe, 0xb7, 0xfd, 0xc6, 0xbc, 0xd1, 0xbd, 0xeb, 0x4d, 0x6f, 0x07, 0xc3, 0x68, 0x1a, 0xc6, 0x3f, 0x24, + 0x81, 0xf7, 0x9d, 0xe3, 0x78, 0x87, 0x17, 0x9b, 0x07, 0x6f, 0x5d, 0x90, 0xd5, 0x1a, 0x3d, 0x1a, 0x4f, 0xea, 0x87, 0x5e, 0x74, 0x75, 0xff, 0x83, 0x3d, 0x6a, 0xa7, 0x39, 0x91, 0xb2, 0x20, 0x6a, + 0xf9, 0xa2, 0x5d, 0xb9, 0xed, 0x5e, 0x79, 0xd9, 0xac, 0xd6, 0xb9, 0xa2, 0x77, 0x3c, 0x5b, 0xe7, 0x38, 0x2e, 0x3b, 0x61, 0xaf, 0x9a, 0x4b, 0x83, 0x37, 0xe6, 0xca, 0x5a, 0x54, 0x75, 0x05, 0xee, + 0x75, 0x97, 0x36, 0x7a, 0xe0, 0x7d, 0xa7, 0xfb, 0xa4, 0xd9, 0x12, 0x6f, 0xa3, 0x87, 0xe8, 0x16, 0x3e, 0x40, 0x63, 0x2a, 0xaf, 0xa6, 0x1d, 0x7d, 0xbf, 0x9b, 0x83, 0x17, 0x2b, 0xe5, 0x87, 0xf2, + 0xe2, 0x3f, 0x1a, 0x1f, 0x1a, 0x24, 0x5e, 0xfd, 0xb7, 0xe7, 0xfc, 0x9e, 0x4d, 0x9d, 0x4b, 0x75, 0xb4, 0xaa, 0xd7, 0xdb, 0xe8, 0x9f, 0xb0, 0xab, 0x73, 0xa9, 0xde, 0x5b, 0xd6, 0xab, 0xd7, 0xbf, + 0x21, 0xe1, 0x9d, 0x75, 0xbd, 0x7a, 0xbd, 0xdf, 0xd7, 0xb5, 0x8b, 0xa5, 0x8f, 0x05, 0x29, 0x3f, 0xc3, 0x57, 0x9f, 0x22, 0x74, 0x85, 0x1d, 0x7f, 0xef, 0xab, 0xb7, 0x3e, 0xf3, 0x05, 0xe7, 0xe8, + 0x03, 0x8e, 0xa1, 0x6a, 0x7c, 0xc1, 0x31, 0x52, 0x9d, 0x26, 0xdd, 0x24, 0x8a, 0xef, 0x06, 0xc3, 0x70, 0x12, 0x69, 0x30, 0x37, 0x28, 0xf1, 0x99, 0x2a, 0x38, 0x4c, 0x95, 0x39, 0x3a, 0xbf, 0x3a, + 0x3c, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0xd4, 0x57, 0x5d, 0x6f, 0xd4, 0x38, 0x17, 0xbe, 0x9f, 0x5f, 0x11, 0x8d, 0xb8, 0x7c, 0x63, 0x77, 0x0a, 0x7a, 0x97, + 0xad, 0x4c, 0x50, 0x77, 0x55, 0x96, 0x4a, 0x14, 0x2a, 0xca, 0xa2, 0xbd, 0x43, 0x6e, 0x72, 0x26, 0x63, 0x48, 0x6c, 0xcb, 0x76, 0x66, 0x06, 0x21, 0xfe, 0xfb, 0xca, 0x76, 0x3e, 0x9c, 0xc4, 0x69, + 0x0b, 0x0b, 0x2b, 0xed, 0x5c, 0x8d, 0xcf, 0x79, 0x8e, 0x7d, 0xbe, 0xfc, 0x1c, 0x87, 0x3c, 0x3f, 0xd6, 0x55, 0xb2, 0x07, 0xa5, 0x99, 0xe0, 0xcf, 0xd6, 0x1b, 0x74, 0xb2, 0x4e, 0x80, 0xe7, 0xa2, + 0x60, 0xbc, 0x7c, 0xb6, 0xfe, 0xf3, 0xdd, 0x8b, 0xf4, 0xe9, 0xfa, 0x79, 0xb6, 0x22, 0x52, 0x89, 0x8f, 0x90, 0x9b, 0xe4, 0x58, 0x57, 0x5c, 0x3f, 0x5b, 0xef, 0x8c, 0x91, 0x67, 0x18, 0xd7, 0x74, + 0x0f, 0x1c, 0x51, 0x49, 0xf3, 0x1d, 0x20, 0xa1, 0x4a, 0x7c, 0xfd, 0xe6, 0x0a, 0x3f, 0x41, 0x27, 0x76, 0x17, 0x87, 0x3c, 0x3b, 0x6a, 0xd6, 0xa3, 0x0f, 0x87, 0x03, 0x3a, 0x3c, 0x76, 0xb8, 0xd3, + 0x93, 0x93, 0x0d, 0xfe, 0xeb, 0xea, 0xd5, 0x4d, 0xbe, 0x83, 0x9a, 0xa6, 0x8c, 0x6b, 0x43, 0x79, 0x0e, 0xeb, 0x55, 0xd2, 0xfd, 0x8e, 0x9a, 0x9d, 0x69, 0xa7, 0x7d, 0x25, 0x72, 0x6a, 0x9c, 0x77, + 0xf7, 0x9e, 0x9a, 0x58, 0x84, 0x8e, 0x41, 0x8e, 0xba, 0xf0, 0xc2, 0xd4, 0x01, 0xd1, 0x51, 0x17, 0xeb, 0x6c, 0x95, 0x24, 0xa4, 0x16, 0x05, 0x54, 0xef, 0x7d, 0xfc, 0x99, 0xd3, 0x11, 0x3c, 0x92, + 0xad, 0x2c, 0x4a, 0x52, 0x05, 0xdc, 0x64, 0xce, 0x3d, 0x52, 0x2a, 0xd1, 0xc8, 0xcb, 0x22, 0x13, 0xaa, 0x44, 0x5a, 0x2a, 0xc6, 0xcb, 0xad, 0xa2, 0x35, 0x1c, 0x84, 0xfa, 0x84, 0x6e, 0x85, 0x30, + 0x04, 0x77, 0x08, 0x8f, 0xa7, 0xca, 0xb0, 0x2d, 0xcd, 0xcd, 0x65, 0x91, 0x79, 0x78, 0x6a, 0x51, 0xa9, 0x36, 0x54, 0x19, 0x50, 0xa9, 0xdf, 0x9b, 0xe0, 0x00, 0xe6, 0xed, 0xda, 0xaa, 0x64, 0xa7, + 0xe8, 0xff, 0xe8, 0x17, 0x82, 0xbb, 0xa5, 0x57, 0x2a, 0xa8, 0xa8, 0x61, 0x7b, 0xb8, 0xa6, 0x66, 0x87, 0x5d, 0x24, 0xb8, 0x73, 0x72, 0x15, 0xf8, 0x98, 0x8b, 0x1a, 0xc1, 0x91, 0xd6, 0xb2, 0x02, + 0x04, 0x7b, 0xe0, 0x46, 0x8f, 0xbc, 0x0b, 0x7d, 0xdb, 0x36, 0x3c, 0xb7, 0x79, 0x9e, 0x7a, 0xd2, 0xfb, 0x61, 0xf3, 0xb6, 0x49, 0x6f, 0x5e, 0x9f, 0x5f, 0xdf, 0xbc, 0x7c, 0xf3, 0x6e, 0xe4, 0x10, + 0xe1, 0xb4, 0x86, 0xec, 0xc6, 0x45, 0x97, 0xfc, 0x5e, 0x89, 0xa6, 0x48, 0x5e, 0xb4, 0xdb, 0x9d, 0x9d, 0xbd, 0x34, 0x46, 0x26, 0x17, 0xde, 0x09, 0x82, 0x1d, 0xd2, 0x9a, 0x14, 0xa0, 0x73, 0xc5, + 0xa4, 0xc5, 0x64, 0xe7, 0x49, 0xd4, 0xf6, 0x7f, 0xc9, 0xd8, 0x36, 0x34, 0xf1, 0x75, 0x51, 0x42, 0x82, 0x32, 0x0c, 0x74, 0x9b, 0x96, 0x8f, 0x74, 0x4f, 0x51, 0xe7, 0xd8, 0x66, 0x43, 0xf0, 0x48, + 0xe0, 0x31, 0x6d, 0x11, 0x72, 0x7b, 0x54, 0xaf, 0x3a, 0x3d, 0x39, 0xdd, 0xa0, 0x13, 0x74, 0x4a, 0x70, 0x54, 0x3d, 0xb2, 0xe4, 0x2e, 0xf3, 0x68, 0xc8, 0xcb, 0x66, 0x83, 0x9e, 0xf4, 0x86, 0x13, + 0xad, 0xb7, 0xcc, 0x45, 0x2d, 0x59, 0x65, 0xab, 0x5d, 0x35, 0x25, 0xe3, 0xbd, 0xf6, 0x31, 0x7a, 0x8a, 0x36, 0x04, 0x2f, 0xa9, 0xbd, 0xb1, 0xef, 0xe6, 0x0e, 0x83, 0x24, 0xb5, 0xed, 0x66, 0x40, + 0xe9, 0xcc, 0xa8, 0x06, 0x08, 0x5e, 0xd6, 0x47, 0xed, 0xb5, 0x68, 0x54, 0x0e, 0x2e, 0x3b, 0x71, 0x4d, 0xd4, 0xca, 0x50, 0x55, 0x82, 0x89, 0x59, 0xb5, 0x1a, 0x6f, 0xd5, 0x12, 0x05, 0xba, 0x6d, + 0x58, 0x55, 0xb4, 0x1b, 0x5e, 0xb4, 0x84, 0x92, 0x39, 0x3e, 0x21, 0xf8, 0x4e, 0xcc, 0x78, 0x1b, 0x05, 0x52, 0x28, 0xc3, 0x78, 0x89, 0x44, 0x63, 0x64, 0x63, 0x96, 0xb6, 0x5a, 0xc4, 0xf9, 0x9b, + 0x11, 0xb4, 0x89, 0x6f, 0x3d, 0x09, 0xbc, 0x00, 0x9e, 0x7f, 0xbe, 0xa2, 0x9c, 0x96, 0x50, 0x0f, 0x97, 0xbb, 0x57, 0xf5, 0x3d, 0x35, 0xc2, 0x67, 0x3d, 0x43, 0xdd, 0x49, 0x03, 0xae, 0x79, 0x26, + 0x3c, 0xb0, 0xc0, 0x05, 0x0e, 0x9a, 0x86, 0xc7, 0xce, 0xa9, 0x60, 0x44, 0x07, 0x8f, 0xbe, 0xc4, 0x3a, 0xf4, 0xeb, 0x84, 0x20, 0x9c, 0x89, 0xf9, 0x2c, 0x21, 0x93, 0xa2, 0x26, 0xd8, 0xfd, 0x1b, + 0x14, 0x3a, 0x17, 0x12, 0x32, 0x56, 0xdb, 0xa4, 0x11, 0xec, 0x57, 0x5d, 0xb0, 0x78, 0x1a, 0x6d, 0x20, 0x69, 0x93, 0x12, 0x62, 0xc2, 0x0c, 0xae, 0xa2, 0x09, 0x8c, 0xa4, 0xef, 0x5b, 0x39, 0xf4, + 0x7e, 0x16, 0xa5, 0xb9, 0x69, 0xa8, 0x11, 0x2a, 0xc2, 0xa3, 0xf3, 0x80, 0xfe, 0x0d, 0x87, 0x0e, 0x70, 0xbb, 0xad, 0x9a, 0xe3, 0xcf, 0xf0, 0x27, 0xde, 0x5d, 0x8b, 0xbd, 0xd5, 0x79, 0xd4, 0x11, + 0xbc, 0x75, 0xed, 0x67, 0xb8, 0x05, 0x47, 0x09, 0x8a, 0xd9, 0x4e, 0xa0, 0xd5, 0x43, 0xbc, 0xf3, 0x44, 0x19, 0xeb, 0xf6, 0x79, 0xaf, 0x8f, 0x49, 0x75, 0xda, 0xec, 0xff, 0xdc, 0xf7, 0xef, 0x2a, + 0xb1, 0x01, 0x1d, 0x99, 0xdb, 0xfd, 0xf5, 0xf2, 0xea, 0xe0, 0x72, 0x4d, 0xdd, 0x9c, 0x5e, 0x2c, 0x2b, 0x72, 0x9c, 0xd8, 0xc2, 0xfd, 0x30, 0x18, 0x68, 0xc8, 0xaf, 0xb3, 0x87, 0x51, 0x50, 0x34, + 0xa2, 0xe5, 0x98, 0xfc, 0xe3, 0xc8, 0x9f, 0xb0, 0x40, 0x40, 0xb9, 0xe0, 0x5b, 0x56, 0x36, 0x8a, 0x9a, 0x11, 0xcb, 0x58, 0x4d, 0x45, 0xb5, 0x66, 0x5b, 0x06, 0x2a, 0x7b, 0xf4, 0x45, 0x81, 0xa4, + 0xf9, 0x27, 0x5a, 0x02, 0x1a, 0xc4, 0x5f, 0x09, 0x0e, 0x30, 0xa1, 0x29, 0xab, 0x69, 0x09, 0xa1, 0xa4, 0xcb, 0x01, 0xa8, 0x4c, 0xd2, 0x4f, 0x60, 0x84, 0x5b, 0xd9, 0x2d, 0x35, 0x6e, 0x15, 0x67, + 0x86, 0xf1, 0xcf, 0xa4, 0x5b, 0x4d, 0x8c, 0x81, 0xef, 0xc7, 0x92, 0x24, 0x21, 0xbf, 0x5d, 0x7f, 0x78, 0x7d, 0xfe, 0xee, 0xf2, 0xfd, 0xc5, 0x87, 0xcb, 0xab, 0xf3, 0x3f, 0x2e, 0xda, 0xb1, 0x39, + 0x95, 0x8e, 0xf7, 0xc1, 0x93, 0x8d, 0x08, 0x9e, 0xb8, 0x6a, 0xa7, 0x76, 0x24, 0x21, 0x04, 0x8f, 0xcb, 0xf4, 0x6d, 0x55, 0xbb, 0xf3, 0x0e, 0x45, 0xab, 0x47, 0x1f, 0x56, 0xbc, 0x6f, 0xbc, 0x51, + 0xce, 0x06, 0x8e, 0x90, 0x37, 0x36, 0x36, 0x3d, 0x4a, 0x44, 0x2f, 0x9e, 0x64, 0x8c, 0x15, 0xae, 0xe5, 0xd3, 0x12, 0x38, 0x28, 0x6a, 0x80, 0x60, 0x56, 0x4c, 0x20, 0xa5, 0xa0, 0x95, 0x9e, 0x95, + 0xc7, 0x4a, 0xa7, 0xa6, 0x4e, 0x36, 0xa9, 0xc8, 0xcc, 0x9a, 0xe0, 0xa8, 0x2f, 0x77, 0x79, 0xf8, 0x7d, 0xce, 0xfd, 0x08, 0xbf, 0x02, 0xa1, 0x8e, 0x37, 0x4b, 0xb7, 0x6a, 0x67, 0x6c, 0x4b, 0x05, + 0x2b, 0xf7, 0xda, 0x97, 0x42, 0x33, 0x23, 0xd4, 0x30, 0x54, 0x7b, 0xd1, 0x40, 0x70, 0xac, 0x6f, 0x0a, 0x05, 0x15, 0x50, 0x6d, 0x9f, 0x12, 0x43, 0x94, 0xa3, 0x37, 0xfa, 0xdb, 0x1e, 0xd0, 0xbd, + 0xc7, 0x1d, 0xa4, 0x51, 0x55, 0xd6, 0x7d, 0x43, 0xd9, 0x03, 0xda, 0xfe, 0x44, 0x4c, 0xe0, 0x76, 0x4b, 0x82, 0x2d, 0xa6, 0xc3, 0x6b, 0x4e, 0xa5, 0xde, 0x09, 0xa3, 0xc3, 0xae, 0xe1, 0xf4, 0xb6, + 0x82, 0x22, 0xdb, 0xd2, 0xca, 0xc2, 0xbb, 0x65, 0x1f, 0xf1, 0xc4, 0x86, 0xe0, 0x71, 0x24, 0xc1, 0xba, 0x7b, 0x6d, 0xf8, 0xac, 0xbc, 0x9d, 0xe7, 0x60, 0xa2, 0xf8, 0xcf, 0x67, 0x22, 0x16, 0xcf, + 0x4c, 0xda, 0x8f, 0x0a, 0xa9, 0xc4, 0x96, 0x55, 0x43, 0x32, 0xfc, 0x32, 0xcc, 0x41, 0x37, 0x61, 0x83, 0xd0, 0xa7, 0x5f, 0x4c, 0x49, 0xdb, 0x4b, 0x33, 0xca, 0xce, 0x6c, 0xb7, 0xba, 0x62, 0xcc, + 0x55, 0x83, 0xa5, 0x3f, 0x21, 0x75, 0xad, 0x6a, 0x84, 0xa8, 0x74, 0xf0, 0x55, 0xf4, 0x2b, 0xb2, 0x1f, 0x0b, 0xcb, 0x88, 0xe1, 0x0e, 0xcc, 0x7c, 0x8a, 0x3e, 0xc3, 0x17, 0x1e, 0xe2, 0x13, 0x46, + 0xfd, 0xd8, 0x70, 0x66, 0x90, 0xac, 0xa8, 0xd9, 0x0a, 0x55, 0x47, 0x38, 0x74, 0xcc, 0xa2, 0x0e, 0x9e, 0x76, 0xf0, 0xb4, 0xa2, 0x0d, 0xcf, 0x77, 0x10, 0x79, 0x46, 0xb6, 0xa6, 0x0b, 0xa3, 0xdd, + 0xe9, 0x66, 0xaf, 0x90, 0xd8, 0xdb, 0xd9, 0x49, 0x83, 0x29, 0x9f, 0x24, 0xf3, 0x49, 0x1f, 0xc8, 0x42, 0xd1, 0x24, 0xd2, 0x52, 0x51, 0x5a, 0xed, 0x6b, 0x34, 0xa4, 0x36, 0x1a, 0xed, 0x38, 0xde, + 0xb6, 0x1c, 0xf7, 0x4f, 0x0c, 0x67, 0x38, 0x4c, 0x8d, 0xc5, 0x32, 0xc6, 0x26, 0x87, 0xb3, 0x85, 0xa3, 0x01, 0xae, 0x1d, 0xdb, 0xf9, 0x79, 0x1b, 0x08, 0xa6, 0xc8, 0xd8, 0x9c, 0x19, 0xab, 0xa6, + 0x9a, 0x60, 0xde, 0xcc, 0xbb, 0x3c, 0x00, 0xc9, 0x1d, 0xd5, 0x5d, 0xbd, 0xfc, 0xff, 0x39, 0x26, 0x4a, 0xfc, 0xbd, 0xa6, 0x35, 0x9e, 0x13, 0xbf, 0x43, 0xcc, 0xc9, 0xdf, 0x8b, 0x17, 0x1d, 0xbf, + 0x2f, 0x24, 0x97, 0xe1, 0x87, 0xc4, 0xd4, 0xde, 0xcb, 0xef, 0x0e, 0xcb, 0x1d, 0xf4, 0xa3, 0xe2, 0x8a, 0x0d, 0x37, 0x2f, 0x9f, 0x3d, 0x7f, 0xf0, 0xf4, 0x59, 0x8b, 0xc3, 0x37, 0x2f, 0x0e, 0x68, + 0xac, 0x5f, 0xe8, 0x6c, 0xd5, 0x7f, 0xea, 0x67, 0xab, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc9, 0x30, 0x68, 0xac, 0xe2, 0x04, 0x00, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, + 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, + 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, + 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x8c, 0x8f, 0xcd, 0x6a, 0xc3, 0x30, 0x0c, 0x80, 0xef, 0x7e, 0x0a, 0x1d, 0x33, 0x28, 0x7a, 0x80, 0x66, 0x8c, 0xae, + 0x85, 0xbd, 0x40, 0xd9, 0x69, 0xec, 0xa0, 0xba, 0x4e, 0xf0, 0x9a, 0x48, 0x46, 0x96, 0xbb, 0x41, 0xe9, 0xbb, 0x8f, 0xfc, 0xb1, 0xc1, 0x56, 0xe8, 0x29, 0xc1, 0xfe, 0xf4, 0x7d, 0x56, 0x22, 0x7f, + 0xa2, 0x36, 0x40, 0x53, 0xd8, 0x5b, 0x14, 0xce, 0xb5, 0x73, 0xb1, 0x4f, 0xa2, 0x06, 0x1f, 0x74, 0x26, 0x2c, 0x16, 0x3b, 0x5c, 0x2e, 0xf1, 0x65, 0xfe, 0xa9, 0x17, 0x46, 0xb4, 0xc5, 0x9c, 0x34, + 0x72, 0xdb, 0x28, 0xf5, 0xe1, 0x53, 0xf4, 0x84, 0x07, 0x11, 0xc3, 0xfd, 0x78, 0xf8, 0x9c, 0x52, 0x17, 0x3d, 0xdd, 0x37, 0x42, 0xc5, 0xc4, 0x0b, 0x37, 0xb1, 0x2d, 0x1a, 0x66, 0xc1, 0x56, 0xc4, + 0xee, 0x95, 0x78, 0x61, 0x0b, 0x5f, 0x86, 0xc4, 0x2c, 0x36, 0xe2, 0xb8, 0x0d, 0xc4, 0xb5, 0x73, 0x9b, 0x7f, 0x65, 0x2e, 0x95, 0x43, 0x17, 0x3d, 0xf8, 0x8e, 0x72, 0x86, 0x5d, 0x27, 0xe5, 0xb8, + 0xec, 0xf7, 0x8b, 0x82, 0x8b, 0x73, 0x00, 0x33, 0x9a, 0x07, 0xaf, 0x87, 0xb3, 0xc4, 0x23, 0xf4, 0x14, 0xb9, 0xda, 0xdb, 0x20, 0x7e, 0x7b, 0x07, 0xd2, 0x36, 0x3f, 0xc0, 0xc5, 0x01, 0x00, 0xfc, + 0xd9, 0x1d, 0xb5, 0x70, 0x75, 0x2b, 0x80, 0x63, 0x7f, 0x35, 0x19, 0x6a, 0x07, 0x70, 0x1d, 0x82, 0x9b, 0xe1, 0xe9, 0x3f, 0xe1, 0x65, 0xee, 0x71, 0x0a, 0xae, 0x60, 0xfa, 0x3e, 0x41, 0x49, 0x29, + 0xa8, 0xa7, 0x1c, 0xaa, 0xa5, 0xae, 0xc1, 0x8a, 0xf2, 0x0c, 0xac, 0xd7, 0x26, 0xaf, 0x03, 0xb2, 0xa3, 0x1c, 0x66, 0xf9, 0xd5, 0x7d, 0x07, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x64, + 0xdf, 0x4e, 0x84, 0xee, 0x00, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, + 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x56, 0x08, 0x2e, 0x28, 0xca, 0xcc, 0x4b, 0x57, 0x70, 0x2b, 0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0x2b, 0x56, 0x70, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0x2f, 0x2d, 0x4a, 0x04, + 0x71, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xcf, 0x6e, 0x70, 0x95, 0x24, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, + 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x8c, 0x92, 0x41, 0x6f, 0x1a, 0x31, 0x10, 0x85, 0xef, 0xfe, 0x15, 0xa3, 0x3d, 0xed, 0x56, 0x68, + 0x1a, 0xf5, 0x4a, 0xa9, 0x42, 0x28, 0x55, 0x23, 0x25, 0xa5, 0x5a, 0x40, 0x3d, 0x56, 0xc6, 0x0c, 0xac, 0xc9, 0x62, 0x3b, 0xf6, 0x2c, 0x0b, 0x8a, 0xf2, 0xdf, 0x2b, 0x9b, 0x90, 0x64, 0xab, 0x88, + 0x84, 0x0b, 0x92, 0xf7, 0x7d, 0xef, 0xd9, 0x6f, 0xc6, 0x49, 0x75, 0x27, 0xd7, 0x04, 0xab, 0xc6, 0x28, 0xd6, 0xd6, 0x84, 0xbe, 0x10, 0x7a, 0xeb, 0xac, 0x67, 0xd8, 0xc8, 0x9d, 0x44, 0x43, 0x8c, + 0xf3, 0xf2, 0xba, 0x7f, 0x3a, 0xb4, 0x7e, 0x8d, 0x9b, 0xc6, 0x68, 0xc6, 0x4d, 0xe3, 0x34, 0x93, 0x47, 0xe9, 0x34, 0xce, 0x28, 0x70, 0x47, 0x12, 0x9c, 0xd7, 0x66, 0xbd, 0xf2, 0x72, 0x4b, 0xad, + 0xf5, 0x77, 0xb8, 0x20, 0x69, 0x02, 0xae, 0xa4, 0x62, 0xeb, 0x0f, 0x28, 0x8d, 0xb1, 0x2c, 0x63, 0x1c, 0x0e, 0x1b, 0xb6, 0xad, 0xf6, 0xb4, 0x3c, 0x8f, 0x5b, 0xcb, 0xc8, 0x14, 0x18, 0x95, 0x35, + 0x4c, 0x7b, 0xc6, 0x69, 0x52, 0x5c, 0x59, 0xcb, 0xef, 0x67, 0xbf, 0x03, 0xe3, 0x1f, 0x5a, 0x8c, 0xcd, 0x4e, 0x7b, 0x6b, 0xb6, 0x64, 0x3e, 0xea, 0xd5, 0xd2, 0x02, 0x55, 0xad, 0xc9, 0x70, 0x7a, + 0x7d, 0x49, 0x81, 0x67, 0xb4, 0x75, 0xb5, 0x64, 0x3a, 0xeb, 0x50, 0x31, 0x3b, 0x2c, 0xe9, 0xbe, 0xa1, 0xc0, 0x63, 0xc3, 0x9a, 0x0f, 0x1f, 0x91, 0x07, 0x67, 0x4d, 0xa0, 0x93, 0xfe, 0x04, 0x84, + 0x58, 0xa2, 0x4a, 0x5c, 0x25, 0xb7, 0xca, 0xc7, 0x7b, 0xdd, 0x4a, 0x56, 0x15, 0xf9, 0x61, 0x08, 0xe4, 0x19, 0x65, 0xfa, 0x9b, 0x55, 0xf2, 0xe5, 0x59, 0x67, 0xa0, 0x80, 0x9f, 0xfa, 0x42, 0x5c, + 0x76, 0xeb, 0xc9, 0x55, 0x1d, 0x5d, 0x02, 0x0c, 0x60, 0x54, 0xdb, 0x66, 0xf9, 0xe3, 0x69, 0x53, 0x86, 0xce, 0xd5, 0x5a, 0x1d, 0xa7, 0x98, 0x24, 0x3d, 0x01, 0xd0, 0x76, 0xaa, 0x84, 0x01, 0x74, + 0xbb, 0xc5, 0x72, 0xf8, 0xeb, 0xfb, 0xe4, 0xf6, 0xef, 0xef, 0x49, 0x39, 0x2b, 0x84, 0x6b, 0x16, 0xb5, 0x56, 0x90, 0x60, 0x98, 0x3b, 0x47, 0x7e, 0x24, 0x03, 0x9d, 0xfc, 0x63, 0x36, 0x3c, 0x08, + 0x01, 0x70, 0xf9, 0xbc, 0x24, 0x02, 0xc0, 0x79, 0xbd, 0x93, 0x4c, 0xf0, 0x7f, 0xe9, 0xe0, 0xd3, 0x1e, 0x44, 0x79, 0xfc, 0x14, 0x95, 0x47, 0xfb, 0x9d, 0xd5, 0x4b, 0x88, 0x23, 0x7b, 0x4e, 0xc8, + 0x0b, 0xe0, 0xca, 0xdb, 0x36, 0xc0, 0x78, 0xaf, 0xc8, 0xc5, 0x30, 0x78, 0x10, 0x00, 0x00, 0xdd, 0xa2, 0xbf, 0x4e, 0x39, 0x16, 0xf1, 0x2d, 0x5a, 0xa7, 0x63, 0x18, 0x00, 0x57, 0x3a, 0x60, 0xea, + 0x8c, 0xf6, 0xaa, 0x92, 0x66, 0x4d, 0x79, 0x22, 0x23, 0xfb, 0x6a, 0xa6, 0xe8, 0x6c, 0xe0, 0xdc, 0x50, 0x0b, 0xf3, 0xf2, 0x3a, 0xcf, 0x3e, 0x37, 0x31, 0x5b, 0xc9, 0x40, 0x59, 0x51, 0x3c, 0xe9, + 0x3b, 0x3f, 0x5c, 0xd8, 0xe5, 0x21, 0xcf, 0x2a, 0xaa, 0x6b, 0x9b, 0x15, 0x3d, 0x38, 0x26, 0x1f, 0x7b, 0x2d, 0xfa, 0x89, 0x78, 0x19, 0x65, 0x7e, 0xba, 0x0f, 0xae, 0x89, 0xa7, 0x2c, 0xb9, 0x09, + 0x23, 0xbb, 0xa4, 0xfc, 0x4d, 0xe7, 0xe4, 0xbe, 0x93, 0x75, 0x43, 0x79, 0xd1, 0x03, 0xba, 0x6f, 0x64, 0x3d, 0xb3, 0xf9, 0x97, 0x8b, 0x8b, 0xe2, 0xbc, 0xef, 0x55, 0xbc, 0xd0, 0x2b, 0x22, 0xfb, + 0x39, 0xbe, 0xb9, 0x99, 0x64, 0x47, 0xea, 0x51, 0x3c, 0x8a, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd6, 0x6b, 0x01, 0x26, 0xe0, 0x01, 0x00, 0x00, 0x3a, 0x04, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x73, 0x70, + 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x74, 0xcb, 0xb1, 0x0a, 0xc2, 0x30, 0x10, 0x87, 0xf1, 0x3d, + 0x4f, 0xf1, 0xa7, 0xbb, 0x74, 0xcf, 0x56, 0x21, 0x48, 0x07, 0xc5, 0x41, 0x5c, 0xcb, 0x69, 0x4e, 0x1a, 0x38, 0xaf, 0x92, 0xbb, 0xe4, 0xf9, 0x05, 0x9d, 0x3b, 0x7f, 0xdf, 0xef, 0xd1, 0x8a, 0xe4, + 0xa4, 0xdd, 0x62, 0x00, 0x0e, 0x50, 0x7a, 0x73, 0xc4, 0xf1, 0xba, 0x5c, 0xa6, 0xdb, 0x7c, 0x4f, 0xcb, 0x7c, 0x9e, 0x4e, 0x29, 0x00, 0x40, 0x27, 0x69, 0x1c, 0x31, 0xbc, 0x48, 0x8c, 0x87, 0xb0, + 0x32, 0x89, 0xaf, 0x49, 0xf3, 0x67, 0x2b, 0xea, 0x3f, 0x2d, 0xa5, 0xb3, 0xb2, 0x59, 0xc4, 0x48, 0x4f, 0x6f, 0xe4, 0x5b, 0x1d, 0xff, 0x5b, 0x00, 0x2a, 0x53, 0x2e, 0x3b, 0xf5, 0x1b, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x07, 0x36, 0x8a, 0x9d, 0x6c, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x94, 0x91, 0xb1, 0x6a, 0xc4, 0x30, 0x0c, 0x86, 0x77, 0x3f, 0x85, 0xd0, 0x7c, 0xe1, 0xe8, 0xea, 0xa9, 0x0f, + 0x70, 0xd0, 0xa5, 0xdb, 0x91, 0xc1, 0x24, 0xea, 0x61, 0x70, 0xac, 0x54, 0x96, 0x69, 0x4b, 0xc8, 0xbb, 0x17, 0xdb, 0x69, 0x28, 0x21, 0xcb, 0x4d, 0xc6, 0xe8, 0xfb, 0xa4, 0x5f, 0x68, 0x31, 0x00, + 0x28, 0xcc, 0x8a, 0x16, 0x54, 0x32, 0x5d, 0xca, 0x7f, 0x76, 0x92, 0x48, 0xd0, 0x02, 0xbe, 0xea, 0xcf, 0x4c, 0x69, 0x10, 0x3f, 0x6b, 0x47, 0x29, 0xf8, 0xa8, 0xd7, 0xad, 0xd8, 0xc0, 0x90, 0x1f, + 0x3e, 0x26, 0xb4, 0x70, 0x37, 0x00, 0x70, 0xc6, 0x57, 0xb0, 0xa0, 0x42, 0xaa, 0x9e, 0x04, 0x01, 0xfa, 0xea, 0xd2, 0xb7, 0x52, 0x1c, 0xff, 0xb9, 0x8d, 0xb7, 0x42, 0x03, 0x4f, 0x13, 0xc5, 0x91, + 0xc6, 0xdd, 0xad, 0x63, 0xec, 0x49, 0x98, 0xf6, 0x74, 0x4f, 0x39, 0x67, 0xf0, 0x31, 0x9c, 0xe4, 0x40, 0x25, 0xda, 0xd2, 0xea, 0x91, 0xbb, 0x81, 0x63, 0xe2, 0x40, 0x68, 0xe1, 0xe5, 0x20, 0x5d, + 0x77, 0xfb, 0x6f, 0x95, 0xb2, 0x8c, 0x08, 0x0b, 0x5e, 0x60, 0x01, 0xa4, 0x38, 0xbe, 0x7d, 0xdc, 0x7c, 0x2c, 0x2e, 0xba, 0xac, 0x8c, 0xb0, 0x56, 0xac, 0xdf, 0x1a, 0x7d, 0x66, 0xd6, 0x3a, 0xed, + 0xbe, 0x6b, 0x98, 0x7c, 0x7c, 0x04, 0x6a, 0x0d, 0x5c, 0x08, 0xfc, 0xf5, 0x4e, 0xd3, 0x1c, 0x9c, 0xd2, 0xcd, 0x2b, 0x89, 0x0b, 0x69, 0xbb, 0x17, 0xac, 0xbd, 0x81, 0xd5, 0xac, 0xe6, 0x37, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd2, 0x54, 0xc9, 0x2d, 0xd5, 0x00, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0xaa, 0xe6, 0x52, 0x50, 0x50, 0x2a, 0x4e, 0xcd, 0xcd, 0x54, 0xb2, 0x52, 0x28, + 0x29, 0x2a, 0x4d, 0xd5, 0x01, 0xf1, 0x4b, 0x8a, 0x12, 0x33, 0x73, 0x32, 0xf3, 0xd2, 0x9d, 0xf3, 0x73, 0x73, 0x13, 0x95, 0xac, 0x14, 0x94, 0xf2, 0xf2, 0xf3, 0x52, 0x95, 0xc0, 0x52, 0xc5, 0x99, + 0x79, 0xe9, 0x39, 0xa9, 0x81, 0xa5, 0xf9, 0x25, 0xa9, 0xc8, 0x3a, 0x0a, 0x8a, 0x32, 0xf3, 0x4a, 0xc2, 0x33, 0x53, 0x4a, 0x32, 0x94, 0xac, 0x14, 0x2c, 0x0c, 0xb8, 0x6a, 0xb9, 0x00, 0x01, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xbe, 0x97, 0xda, 0x64, 0x50, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x84, 0x54, 0x5d, 0x6f, 0xeb, 0x44, 0x10, 0x7d, 0xf7, 0xaf, 0x18, 0xd2, 0x87, 0xb6, 0xa8, + 0xb1, 0x5b, 0x2e, 0x17, 0x4a, 0x5e, 0x2b, 0xd0, 0x45, 0x02, 0x71, 0x45, 0x83, 0x00, 0x85, 0x4a, 0x5e, 0xef, 0x4e, 0x92, 0x69, 0xd7, 0x33, 0xcb, 0x7e, 0x38, 0x89, 0x10, 0xff, 0x1d, 0xed, 0xba, + 0xf9, 0xd2, 0x2d, 0xba, 0x0f, 0x51, 0xec, 0xd9, 0x33, 0xeb, 0x33, 0x73, 0xce, 0xcc, 0x05, 0xcc, 0x77, 0x0e, 0x1f, 0xb5, 0x27, 0x17, 0xe1, 0xc1, 0x4a, 0x32, 0xdf, 0x0f, 0xc8, 0x11, 0x7e, 0x48, + 0xac, 0x23, 0x09, 0x57, 0xd5, 0xef, 0x68, 0xb5, 0xf4, 0x08, 0x51, 0x60, 0x27, 0xc9, 0x03, 0xe3, 0xe6, 0x34, 0x67, 0xf9, 0x0a, 0x04, 0xe7, 0xe5, 0x19, 0x75, 0xfc, 0x02, 0xe6, 0x6b, 0x84, 0x4e, + 0xc8, 0xa2, 0x77, 0x56, 0x45, 0x3c, 0x22, 0xb4, 0x18, 0x04, 0xad, 0xb8, 0xea, 0x10, 0x96, 0x92, 0xd8, 0x00, 0x31, 0x2c, 0x5a, 0x62, 0x83, 0xdb, 0x3a, 0x86, 0xf6, 0xe9, 0xaa, 0x6e, 0xf6, 0x2f, + 0xd7, 0x35, 0xcc, 0xd7, 0x14, 0x8e, 0xc9, 0x14, 0xa0, 0x47, 0xc5, 0x31, 0xf3, 0xf0, 0x18, 0x9c, 0xb0, 0xa9, 0x70, 0xab, 0x6d, 0x0a, 0x34, 0xa0, 0xdd, 0xe5, 0xf0, 0xa2, 0xf0, 0x87, 0x52, 0x40, + 0x78, 0xba, 0x5a, 0xc7, 0xe8, 0xc2, 0xac, 0x69, 0x74, 0x8e, 0x62, 0x09, 0xd6, 0x24, 0xcd, 0xf5, 0x0d, 0x74, 0x29, 0xe6, 0x5a, 0x32, 0x17, 0xf0, 0xd8, 0xcb, 0x80, 0x10, 0xd7, 0x58, 0xe9, 0x35, + 0xea, 0x17, 0x58, 0x8a, 0x87, 0x98, 0x3f, 0x4d, 0x9c, 0xa3, 0x47, 0x06, 0x2a, 0x13, 0x8e, 0xb0, 0x21, 0x6b, 0xf7, 0x0c, 0xe0, 0x39, 0x85, 0x08, 0x4b, 0xe2, 0xd2, 0x1e, 0x67, 0x15, 0x31, 0x0c, + 0x8a, 0xc9, 0x5a, 0x55, 0x11, 0x6b, 0xe9, 0x89, 0x57, 0xf0, 0x61, 0x3e, 0xff, 0x08, 0x1e, 0xff, 0x4e, 0x18, 0x62, 0xa8, 0xab, 0xea, 0xe2, 0x02, 0x7e, 0x12, 0xad, 0x2c, 0xe0, 0x16, 0x75, 0x1a, + 0x9b, 0x3c, 0x17, 0xf0, 0x89, 0xc1, 0xe6, 0xb8, 0xdd, 0x55, 0x55, 0xdb, 0xb6, 0x5a, 0x38, 0x88, 0xc5, 0x8a, 0x5d, 0x0f, 0xc4, 0x21, 0x2a, 0x6b, 0xcb, 0x73, 0xc6, 0x75, 0x89, 0xac, 0x39, 0xbc, + 0x95, 0xac, 0x9c, 0x52, 0x55, 0xb9, 0xf7, 0x3e, 0x71, 0xa4, 0x1e, 0x47, 0xa2, 0xb8, 0x75, 0x12, 0x72, 0x79, 0x1e, 0x11, 0x90, 0x8d, 0x13, 0xe2, 0xc2, 0x02, 0xe0, 0x4b, 0x68, 0x9b, 0xb6, 0xa8, + 0xb5, 0x8f, 0x97, 0xda, 0x8b, 0xc8, 0xfb, 0xa2, 0xeb, 0x57, 0xdc, 0x1a, 0x95, 0x8d, 0xeb, 0xc6, 0xa3, 0x32, 0xc4, 0x18, 0xc2, 0x1b, 0x79, 0x0a, 0x0e, 0xa7, 0x30, 0xc2, 0xa1, 0x34, 0xf4, 0xfc, + 0x06, 0x4b, 0x03, 0xfe, 0xef, 0x05, 0xfb, 0xc3, 0xf3, 0xfc, 0x52, 0xd4, 0x69, 0x24, 0x14, 0xe1, 0x3a, 0x04, 0xa5, 0x35, 0x86, 0x80, 0xc5, 0x47, 0x85, 0x76, 0xe7, 0x65, 0x13, 0xd0, 0x83, 0x8a, + 0xd5, 0x22, 0xcb, 0x3f, 0x6b, 0x9a, 0xd2, 0x9c, 0xb5, 0x84, 0x38, 0xbb, 0xbf, 0xbd, 0xbf, 0xfd, 0xa4, 0x90, 0xa7, 0xab, 0xeb, 0x2c, 0xec, 0x67, 0xe0, 0x7b, 0x62, 0x4f, 0x57, 0xd7, 0x35, 0xfc, + 0xf9, 0xea, 0x9c, 0x14, 0x10, 0x5a, 0x9d, 0xbc, 0x6d, 0xb3, 0xf8, 0xed, 0xc7, 0x5f, 0x1e, 0xe7, 0x2d, 0x28, 0x86, 0x62, 0xb5, 0x2a, 0xca, 0xb9, 0x7b, 0xf6, 0xa5, 0xce, 0xce, 0xc4, 0xcd, 0xe9, + 0x30, 0xfd, 0x03, 0x72, 0x32, 0x4c, 0x0d, 0x5c, 0xfe, 0x33, 0x61, 0xd5, 0xe3, 0x64, 0x06, 0x93, 0x39, 0xad, 0xd0, 0x4f, 0x6e, 0x60, 0xa2, 0x53, 0x88, 0xd2, 0xa3, 0xff, 0xd1, 0xe4, 0xf0, 0xed, + 0xdd, 0x57, 0xef, 0xbe, 0x7e, 0xff, 0xcd, 0xb7, 0xf7, 0xdf, 0x4d, 0xfe, 0xbd, 0x84, 0xbf, 0x2a, 0x80, 0xe9, 0x87, 0xcb, 0x07, 0xe1, 0x88, 0x1c, 0xa7, 0x71, 0xe7, 0x70, 0x06, 0xca, 0x39, 0x4b, + 0x5a, 0xe5, 0xcf, 0x36, 0xcf, 0x41, 0xf8, 0x08, 0xc3, 0x29, 0x99, 0x19, 0xdc, 0x9d, 0x06, 0x82, 0x24, 0xaf, 0x71, 0x06, 0x65, 0x4a, 0xa6, 0x85, 0xfb, 0x14, 0xb7, 0xaa, 0x77, 0x16, 0x4f, 0x61, + 0xe3, 0xcd, 0x06, 0x87, 0xfa, 0x85, 0x55, 0xa4, 0x01, 0xeb, 0x37, 0x40, 0xc1, 0xa1, 0x1e, 0xd0, 0x07, 0x12, 0x9e, 0xc1, 0x5d, 0x7d, 0x3b, 0x9e, 0xbd, 0xd9, 0xd9, 0x13, 0xbb, 0x1e, 0x5c, 0x93, + 0x07, 0xec, 0x60, 0x81, 0x83, 0x57, 0x73, 0x9f, 0xab, 0x85, 0x0c, 0xe8, 0xad, 0x28, 0x33, 0x75, 0x5e, 0x22, 0x96, 0x96, 0x1e, 0x27, 0x7c, 0xb3, 0xd9, 0xd4, 0xec, 0xfa, 0xe7, 0x50, 0x6b, 0xe9, + 0x1b, 0xa7, 0xf4, 0x8b, 0x5a, 0x61, 0xf3, 0x46, 0xca, 0xa8, 0xf5, 0xd9, 0x04, 0x6f, 0x28, 0xae, 0xa1, 0x2d, 0x33, 0xfa, 0xfe, 0xf6, 0x1d, 0x3c, 0xa2, 0x1f, 0x48, 0x23, 0xfc, 0xc6, 0x6a, 0x50, + 0x64, 0x55, 0x67, 0xb1, 0x1d, 0x31, 0x0a, 0xda, 0x07, 0x4b, 0xb9, 0x3d, 0xbf, 0x62, 0xf4, 0xbb, 0x36, 0x5b, 0xd2, 0xa0, 0x07, 0x5a, 0x56, 0x67, 0x23, 0x93, 0x37, 0x95, 0xc1, 0x88, 0xbe, 0x27, + 0x46, 0x93, 0xad, 0xd1, 0x21, 0xec, 0xb9, 0xa0, 0xb9, 0x81, 0x4e, 0x65, 0xcb, 0xca, 0xb8, 0x5d, 0x7a, 0xec, 0xc5, 0xef, 0x20, 0x05, 0xb5, 0xc2, 0x42, 0xae, 0x28, 0x00, 0x56, 0xc4, 0x81, 0x41, + 0xab, 0x76, 0xe3, 0xc2, 0x98, 0x63, 0x88, 0xc4, 0xab, 0xdc, 0xb1, 0xd3, 0xa5, 0xf8, 0xba, 0x73, 0x81, 0x58, 0xdb, 0x64, 0x30, 0x80, 0x82, 0x45, 0x62, 0x8a, 0x10, 0x31, 0xc4, 0xbc, 0x4e, 0xf3, + 0x7f, 0x93, 0x23, 0x79, 0xa5, 0x96, 0x06, 0x2b, 0xae, 0x16, 0xc4, 0x11, 0x57, 0xbe, 0x18, 0xe4, 0x1c, 0x79, 0x72, 0x30, 0xee, 0x60, 0xf8, 0x59, 0x0c, 0x2d, 0x77, 0x99, 0x6a, 0xc0, 0x1b, 0xc8, + 0x53, 0x6a, 0x4c, 0xfe, 0x51, 0xc6, 0x28, 0x5b, 0xd2, 0xc3, 0x71, 0x6f, 0x74, 0x29, 0x8c, 0x5a, 0x5a, 0x59, 0x91, 0xae, 0x3f, 0x59, 0x64, 0x19, 0x5e, 0xa4, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x0e, 0x85, 0x04, 0x59, 0x2f, 0x03, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0xca, 0xcc, 0x2b, 0xcb, 0x4f, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf, 0xb3, 0xe2, 0x52, 0x50, + 0x48, 0xcb, 0x2f, 0xca, 0x4d, 0x2c, 0xb1, 0x52, 0x50, 0x4a, 0xce, 0xc9, 0x2f, 0x4d, 0x49, 0x2d, 0x4b, 0xcd, 0x2b, 0x51, 0xe2, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x45, + 0xf7, 0x4e, 0x8b, 0x29, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0xec, 0xfd, 0x59, 0x93, 0xba, 0xdc, 0xb2, 0x38, 0x0c, 0xde, 0xbf, 0x9f, 0xe2, 0x89, 0xdf, + 0x65, 0xf3, 0xa7, 0x98, 0x07, 0x4f, 0xc4, 0x3e, 0x7d, 0x04, 0x1c, 0x11, 0x14, 0x67, 0xe9, 0xe8, 0xdd, 0xc1, 0x3c, 0xc8, 0x3c, 0x0a, 0xef, 0xe9, 0xfd, 0xd9, 0xdf, 0x10, 0xcb, 0x2a, 0xb5, 0xb4, + 0xa4, 0xfc, 0x3d, 0xcf, 0x19, 0xf7, 0x4d, 0x15, 0xb0, 0x30, 0x81, 0xcc, 0x5c, 0x39, 0xad, 0xcc, 0x5c, 0xff, 0xf7, 0xff, 0xf5, 0xc7, 0x1f, 0xbf, 0x02, 0xc5, 0x37, 0x7e, 0xfd, 0xcb, 0x1f, 0xbf, + 0x8c, 0xc2, 0x08, 0x32, 0xd0, 0x56, 0x02, 0xdd, 0x33, 0x92, 0x5f, 0xff, 0xe7, 0x38, 0x54, 0x18, 0x49, 0xea, 0x84, 0xc1, 0x71, 0x14, 0x7e, 0x43, 0xde, 0xe0, 0xd3, 0x55, 0x2f, 0xd4, 0xf6, 0xa6, + 0xe3, 0x19, 0xeb, 0x8f, 0x51, 0xb4, 0xb9, 0x9e, 0x18, 0x71, 0xee, 0x24, 0x46, 0xfa, 0xeb, 0x5f, 0xfe, 0xc8, 0x92, 0xdc, 0x68, 0xae, 0x45, 0x8a, 0xb6, 0x57, 0xac, 0xe6, 0xda, 0xf1, 0x61, 0x7f, + 0xfc, 0xf1, 0xeb, 0xe3, 0xe8, 0xdb, 0x47, 0x37, 0xc3, 0x77, 0x1f, 0xdf, 0x8c, 0x78, 0x8e, 0x66, 0x04, 0x69, 0xf3, 0xdb, 0x6e, 0xa4, 0x68, 0xb6, 0x01, 0xa2, 0x97, 0xc3, 0xba, 0x11, 0x19, 0x81, + 0x6e, 0x04, 0x9a, 0x73, 0xf1, 0xe4, 0x66, 0xe4, 0xdf, 0xb2, 0x2a, 0x32, 0x52, 0x28, 0x08, 0xf5, 0xe6, 0xc7, 0x7f, 0x47, 0xc8, 0x37, 0x04, 0x79, 0x43, 0xd0, 0x8f, 0xdf, 0xfe, 0xf1, 0xc7, 0x2f, + 0xcd, 0x0b, 0x73, 0xbd, 0x79, 0xa5, 0xb4, 0xb9, 0x87, 0x78, 0xbb, 0x04, 0xfe, 0xc7, 0x1f, 0xbf, 0x4c, 0x45, 0x49, 0x41, 0x37, 0x05, 0x93, 0x3c, 0xc8, 0x9c, 0xd3, 0x17, 0xfc, 0x1d, 0x7e, 0xeb, + 0xbc, 0xc1, 0xbf, 0xde, 0xef, 0xf9, 0xff, 0x5f, 0xbc, 0x49, 0xc1, 0x3d, 0x7b, 0x99, 0x4c, 0x89, 0x4e, 0x30, 0xf0, 0x37, 0x04, 0xbb, 0x7e, 0xd2, 0xe9, 0x0e, 0x2d, 0x71, 0xa2, 0x0c, 0x34, 0x52, + 0xcf, 0x09, 0x32, 0xe8, 0xf4, 0x0f, 0x8c, 0xbc, 0xdc, 0x72, 0x82, 0xf7, 0x9f, 0xa1, 0xf8, 0xd3, 0x9f, 0x45, 0x4a, 0x92, 0x1a, 0xc9, 0x83, 0xfb, 0x4f, 0xf7, 0x34, 0x83, 0xd4, 0x1b, 0x4a, 0xde, + 0x1b, 0x04, 0xb5, 0x30, 0x30, 0x1d, 0x0b, 0x8c, 0x12, 0x23, 0xcb, 0x9c, 0x77, 0x48, 0xf4, 0x1b, 0x76, 0xf7, 0xde, 0xd3, 0xcb, 0x5d, 0xdf, 0x8b, 0xbd, 0xdd, 0x3c, 0xf4, 0x48, 0x03, 0xff, 0x44, + 0xdd, 0xbf, 0xa3, 0x6f, 0xf0, 0x1b, 0x7e, 0x39, 0x78, 0xf5, 0x53, 0xf4, 0xf6, 0x31, 0x69, 0x1e, 0x19, 0x49, 0x66, 0xa4, 0xd9, 0xfb, 0xf7, 0xc0, 0x6f, 0x57, 0x04, 0xfc, 0x06, 0xa1, 0x59, 0x0a, + 0x7e, 0xd0, 0xbe, 0xf3, 0x86, 0xbc, 0x21, 0xd7, 0x83, 0x0f, 0xbf, 0x14, 0x79, 0x43, 0xe8, 0x1b, 0x48, 0x1f, 0x28, 0x3e, 0x23, 0xf5, 0x0d, 0xff, 0xa0, 0x7f, 0xf3, 0xff, 0x9d, 0x0b, 0x9a, 0x0f, + 0xfd, 0xff, 0xf9, 0xa1, 0x9e, 0x7b, 0x46, 0x0a, 0xfd, 0x9b, 0xaa, 0xa8, 0x86, 0x07, 0x69, 0xa1, 0x6e, 0x80, 0x66, 0x72, 0xe2, 0xff, 0xff, 0xfb, 0x0e, 0xc3, 0x53, 0x6f, 0x08, 0xfa, 0x86, 0x7c, + 0xbe, 0xde, 0xaf, 0xc4, 0x48, 0x43, 0xaf, 0x30, 0xf4, 0xe3, 0xa0, 0x9d, 0x65, 0x51, 0xfa, 0x2f, 0x10, 0x94, 0x18, 0x96, 0x93, 0x66, 0x49, 0xf5, 0x16, 0x44, 0xbe, 0x9b, 0xbe, 0x85, 0x89, 0xf5, + 0x15, 0x3e, 0x04, 0x5e, 0x9c, 0x80, 0xef, 0x60, 0xdf, 0x32, 0xab, 0xfe, 0x04, 0xed, 0x04, 0x99, 0x61, 0x25, 0x4e, 0x56, 0x1d, 0x61, 0xa7, 0xb6, 0x42, 0x20, 0x28, 0x28, 0x67, 0x48, 0x15, 0xea, + 0xcc, 0x01, 0x59, 0x69, 0x95, 0x63, 0xcc, 0x84, 0xc5, 0x7e, 0x13, 0xac, 0x70, 0x7b, 0x16, 0xdb, 0x65, 0x4c, 0xd9, 0x03, 0x07, 0x0d, 0xfa, 0x13, 0x64, 0x62, 0x74, 0xb1, 0xde, 0xca, 0x03, 0x62, + 0x74, 0x22, 0x1d, 0x10, 0x52, 0x18, 0x2d, 0xac, 0x31, 0x0c, 0xd4, 0x94, 0x1e, 0xf8, 0x56, 0x31, 0xeb, 0x48, 0xd9, 0xc8, 0x33, 0xf2, 0xde, 0x72, 0x30, 0x75, 0xa6, 0x43, 0x64, 0xae, 0x8d, 0xca, + 0xbf, 0xfd, 0xed, 0x72, 0x92, 0x16, 0x17, 0x92, 0xe2, 0x8f, 0x27, 0xf3, 0xf6, 0xf4, 0x59, 0xb6, 0x63, 0xd9, 0x9e, 0x63, 0xd9, 0x67, 0x5e, 0x45, 0xe0, 0x9f, 0x20, 0xdd, 0x36, 0xbc, 0xc8, 0x48, + 0xc0, 0x42, 0xf1, 0x1c, 0x5d, 0xc9, 0xc2, 0x04, 0x74, 0x74, 0x23, 0xc8, 0x1c, 0xf3, 0x44, 0xe4, 0x07, 0x54, 0xb8, 0xe4, 0xda, 0x1f, 0x12, 0xe1, 0x9b, 0xe7, 0x41, 0xe0, 0x77, 0xa3, 0xe0, 0xe9, + 0xb9, 0xcf, 0xa9, 0xb4, 0xc6, 0xb2, 0x94, 0xaa, 0x85, 0x45, 0x4e, 0x78, 0xa6, 0x53, 0x6e, 0xb8, 0xf5, 0xa6, 0x9e, 0x73, 0x83, 0x91, 0x08, 0x78, 0x01, 0xdb, 0x5b, 0xe9, 0xca, 0xd6, 0xca, 0xd6, + 0xc3, 0xb1, 0x35, 0x51, 0x91, 0x64, 0xa0, 0x74, 0x49, 0x57, 0x48, 0x32, 0xa6, 0xd3, 0xf3, 0x7b, 0xd4, 0x04, 0xa1, 0xcd, 0x70, 0x3b, 0x1e, 0xf5, 0xe8, 0x55, 0x00, 0x75, 0x21, 0x9b, 0x14, 0xc7, + 0xe6, 0x40, 0x8a, 0x20, 0x03, 0x19, 0xe3, 0xdd, 0xfb, 0x54, 0x7a, 0x8e, 0xde, 0x0b, 0xe2, 0xfc, 0x05, 0xc8, 0x3c, 0x43, 0x3f, 0xa2, 0xee, 0x7c, 0xdc, 0x1a, 0x51, 0xbb, 0x05, 0x3b, 0x2d, 0x0f, + 0xc5, 0x72, 0xd7, 0x1b, 0x09, 0x8b, 0x81, 0xc2, 0x48, 0x2a, 0xb1, 0xe7, 0xb8, 0x94, 0x0d, 0x23, 0x4e, 0x77, 0x56, 0x83, 0x34, 0x8e, 0x94, 0x2c, 0xc2, 0xcc, 0xa9, 0x37, 0xc2, 0x01, 0x74, 0x28, + 0x2d, 0xf6, 0x4b, 0xbf, 0xb7, 0xde, 0x04, 0xeb, 0xbc, 0x5a, 0xe8, 0x5d, 0x96, 0xe8, 0x6d, 0xd8, 0x78, 0xb1, 0xd9, 0x2c, 0x0b, 0xd8, 0x51, 0x49, 0x6c, 0xee, 0xce, 0x29, 0x7d, 0xc9, 0xe8, 0xd6, + 0x6f, 0xb3, 0xf3, 0xb7, 0x0c, 0xd9, 0x30, 0xf8, 0x8d, 0xd0, 0xd4, 0x6c, 0xc5, 0xdb, 0x7f, 0x88, 0xcc, 0xab, 0x21, 0x37, 0x05, 0xb3, 0x70, 0x6f, 0x04, 0xe9, 0x87, 0x50, 0x84, 0x7f, 0x30, 0x35, + 0x3e, 0xb0, 0x7b, 0x35, 0xaa, 0x04, 0xa9, 0x03, 0xa6, 0x59, 0xe5, 0x5d, 0x7d, 0xc0, 0x25, 0x51, 0xb1, 0x37, 0xf4, 0xed, 0xe7, 0x52, 0xea, 0x02, 0x2e, 0x04, 0x5e, 0x9e, 0x81, 0x0d, 0xbc, 0xe7, + 0xf4, 0x5c, 0x2f, 0x61, 0x79, 0x44, 0xee, 0xe5, 0xb9, 0xbe, 0xb4, 0xe9, 0x5d, 0x35, 0x2e, 0xb1, 0x85, 0xa0, 0xee, 0x7c, 0x28, 0x07, 0xc4, 0xd8, 0x4c, 0xbb, 0x87, 0x5e, 0xb4, 0x99, 0xc2, 0x33, + 0xb3, 0x93, 0xc6, 0x34, 0x64, 0x74, 0xf0, 0xcd, 0xe1, 0x30, 0x8d, 0x66, 0xfc, 0xa1, 0xd3, 0x9f, 0x23, 0x7d, 0xaf, 0x62, 0xb3, 0xe9, 0x9a, 0x13, 0xa7, 0x12, 0x40, 0x07, 0x99, 0x17, 0xf7, 0x0f, + 0xce, 0x5c, 0x03, 0x12, 0x22, 0x7e, 0xc0, 0xf8, 0x2d, 0xe8, 0xa9, 0x85, 0x5e, 0x98, 0x1c, 0x15, 0x47, 0x61, 0x24, 0xd9, 0xbb, 0xc2, 0xb8, 0x6b, 0x0f, 0x18, 0x81, 0xe5, 0x04, 0xb7, 0xbf, 0x3e, + 0x6b, 0xa4, 0x7f, 0xfd, 0xdb, 0x4f, 0x84, 0xd9, 0x7d, 0x8a, 0x9d, 0x19, 0xe4, 0x1e, 0xad, 0xd0, 0x37, 0xfc, 0x42, 0x51, 0xb6, 0xa5, 0x55, 0x03, 0xf1, 0xa8, 0x45, 0x8e, 0xff, 0xc1, 0x06, 0xc6, + 0x73, 0xfa, 0x08, 0x99, 0x03, 0x98, 0x1d, 0x2f, 0x1a, 0x8b, 0x5a, 0xd9, 0xc7, 0xb3, 0xcd, 0x9a, 0x86, 0xa6, 0xc9, 0x72, 0x99, 0xf5, 0x11, 0x4b, 0x76, 0x00, 0x93, 0xee, 0xc7, 0x5e, 0xd5, 0xd5, + 0xc3, 0x3c, 0x51, 0x3c, 0xad, 0xbf, 0xe9, 0x4b, 0x9b, 0x3e, 0x0a, 0x88, 0x16, 0x3b, 0x5c, 0xd8, 0xee, 0x9e, 0x55, 0x81, 0x51, 0x9f, 0x99, 0xc4, 0x1d, 0x35, 0x97, 0xcb, 0x1e, 0x72, 0xd0, 0xf6, + 0xd2, 0x0a, 0x8f, 0x8c, 0x45, 0x2e, 0xbd, 0x4c, 0x9f, 0x6b, 0x3e, 0x3e, 0x1a, 0x23, 0xe8, 0xb5, 0xea, 0x37, 0x52, 0x4d, 0x89, 0x0c, 0x30, 0xcd, 0x12, 0x27, 0xb0, 0xc0, 0xc4, 0xb0, 0x8c, 0x43, + 0xf4, 0x4e, 0x47, 0xf8, 0x8d, 0xb8, 0xb1, 0x3d, 0xa2, 0x30, 0xc9, 0x52, 0xb0, 0xa1, 0xf9, 0xaf, 0x93, 0x81, 0x88, 0xfd, 0xe7, 0xd0, 0xfa, 0x86, 0xeb, 0xee, 0xd1, 0xfc, 0xc8, 0x87, 0xd8, 0xcf, + 0x69, 0x7e, 0x09, 0xb9, 0xb1, 0x20, 0x2e, 0xce, 0xc1, 0x06, 0xe6, 0x73, 0x1e, 0x90, 0xcc, 0xee, 0x2a, 0xd3, 0x81, 0xa2, 0xaf, 0x77, 0xb3, 0xbe, 0xa4, 0xb1, 0x34, 0xcb, 0x56, 0xbb, 0x0c, 0x31, + 0x77, 0x9b, 0xc3, 0x22, 0xee, 0x3a, 0x3c, 0xaa, 0x2d, 0x38, 0xb2, 0xe6, 0x18, 0x5a, 0xc4, 0xb4, 0x28, 0xed, 0x31, 0xdd, 0x62, 0x7e, 0x88, 0x3a, 0xf5, 0x74, 0x60, 0x91, 0x03, 0x68, 0x31, 0x1c, + 0x8e, 0x77, 0xdd, 0x25, 0x4d, 0x43, 0x4a, 0x0d, 0x8d, 0x72, 0x6e, 0xd0, 0x9d, 0xa4, 0xe2, 0x5a, 0x1d, 0xbc, 0x2e, 0x73, 0x4f, 0xdf, 0x70, 0x76, 0x39, 0x90, 0x37, 0xe4, 0x0d, 0xfb, 0x93, 0x28, + 0x10, 0x3c, 0x36, 0xe3, 0x4e, 0x8f, 0x79, 0x0d, 0xfd, 0xc1, 0xd9, 0x7a, 0x3b, 0x9f, 0x80, 0x0d, 0xb4, 0xef, 0x11, 0x8f, 0x80, 0x51, 0x87, 0x59, 0x3b, 0x1d, 0x47, 0x93, 0x0a, 0x63, 0x8d, 0xad, + 0x46, 0x95, 0x8b, 0x49, 0x23, 0x41, 0x8b, 0x96, 0x05, 0xbb, 0xfa, 0x4d, 0xbd, 0x7e, 0xfd, 0xed, 0xb6, 0x92, 0x82, 0xa6, 0xa7, 0x58, 0x0f, 0x15, 0x03, 0xfc, 0x82, 0xb2, 0x3f, 0x03, 0x3d, 0x2a, + 0xf9, 0xf7, 0x43, 0xb0, 0x81, 0xf4, 0xec, 0xab, 0x33, 0x7d, 0xbe, 0xc2, 0xd8, 0x81, 0x9c, 0x38, 0xe3, 0x8d, 0x6f, 0x8a, 0x03, 0xd3, 0x0b, 0x87, 0x34, 0xe5, 0xad, 0xf3, 0x02, 0xfe, 0x9e, 0x61, + 0xfe, 0xf2, 0x59, 0xfa, 0x45, 0x60, 0xdc, 0xc3, 0x16, 0xf1, 0x46, 0xbc, 0x80, 0xad, 0x6b, 0xd0, 0x10, 0x78, 0x73, 0x01, 0x6c, 0xa0, 0xb6, 0x98, 0xa8, 0xee, 0xda, 0x2d, 0xf5, 0xed, 0x28, 0xc3, + 0x61, 0x5a, 0x18, 0x39, 0xdd, 0x98, 0xdd, 0xe2, 0xe1, 0x8a, 0x4f, 0xad, 0x15, 0xda, 0x8b, 0xbb, 0x83, 0x3a, 0x45, 0x67, 0xd1, 0xde, 0xc7, 0x15, 0x69, 0xa7, 0xba, 0x3e, 0x20, 0xf7, 0x36, 0x3d, + 0x6d, 0x83, 0x2f, 0xcc, 0xbe, 0xb8, 0x4c, 0xf0, 0x5c, 0x10, 0x65, 0x5f, 0x81, 0x8d, 0x0a, 0x37, 0x09, 0xcf, 0x9a, 0x24, 0x7b, 0x06, 0x56, 0xb6, 0xb0, 0x24, 0x84, 0xaf, 0xdb, 0xfa, 0x17, 0x8c, + 0x75, 0x94, 0xd4, 0xf0, 0x5f, 0x25, 0x5b, 0xaf, 0x1c, 0xea, 0x44, 0x7b, 0x40, 0x19, 0xf8, 0x0d, 0x7f, 0xc1, 0xc0, 0xb9, 0x05, 0x0e, 0x81, 0x1f, 0x87, 0x60, 0x03, 0xf1, 0x39, 0x55, 0x88, 0x82, + 0x5a, 0x72, 0xbd, 0x4e, 0xe4, 0xad, 0xed, 0xe2, 0x20, 0x19, 0x9b, 0xc9, 0x96, 0x5b, 0x16, 0xfd, 0x62, 0xcc, 0xe8, 0x43, 0x32, 0xea, 0xa5, 0x7a, 0xe0, 0xa1, 0x16, 0xa4, 0x77, 0xa3, 0xcc, 0xcf, + 0xfb, 0xbd, 0x99, 0xa1, 0x4b, 0x78, 0x2f, 0x89, 0x89, 0x24, 0xe5, 0xd2, 0x2d, 0xe0, 0x17, 0x5d, 0x81, 0x44, 0xe0, 0x91, 0x2d, 0x2a, 0x53, 0x74, 0x43, 0xac, 0x11, 0x7d, 0x3a, 0x0d, 0x38, 0xfe, + 0xb0, 0xff, 0x0d, 0x15, 0xea, 0x16, 0x0d, 0x41, 0xc8, 0xa3, 0x07, 0x79, 0xe5, 0xab, 0xeb, 0x86, 0x9a, 0x9f, 0x88, 0x85, 0xdf, 0x7a, 0xd4, 0x46, 0x1a, 0x25, 0xc6, 0xc9, 0xdb, 0xa6, 0x6e, 0x9d, + 0x78, 0xcb, 0x0b, 0x55, 0xc5, 0x3b, 0xe9, 0xe3, 0xa3, 0x53, 0x7a, 0x3d, 0xea, 0x58, 0x41, 0x98, 0x9c, 0xbd, 0x78, 0xf8, 0x8d, 0xbc, 0x1a, 0xf3, 0x8f, 0x4c, 0x0e, 0x9a, 0x89, 0x91, 0xda, 0xf7, + 0xd5, 0xb9, 0x9b, 0x82, 0x95, 0xe2, 0x7b, 0xef, 0x83, 0x08, 0x76, 0x3d, 0xea, 0x3b, 0x81, 0xe3, 0x2b, 0x99, 0x66, 0x7f, 0x70, 0xd8, 0xd5, 0xf7, 0x1c, 0x8d, 0x80, 0x08, 0x74, 0xd3, 0x30, 0x00, + 0xb5, 0xd0, 0xf7, 0x3f, 0xe2, 0x40, 0x58, 0xf3, 0x75, 0x3f, 0x63, 0xc5, 0xbf, 0x23, 0xf0, 0x11, 0x5f, 0xf0, 0x1f, 0xff, 0xfe, 0xef, 0x7f, 0xfc, 0xeb, 0xdf, 0x10, 0xb4, 0xad, 0x55, 0x7e, 0xcb, + 0x3e, 0x57, 0xa3, 0x67, 0x84, 0xdf, 0x63, 0x57, 0xfc, 0x0d, 0x7b, 0x81, 0x5d, 0x1b, 0x88, 0x10, 0x78, 0xfa, 0x0f, 0x36, 0x30, 0x9e, 0x33, 0xa8, 0x1e, 0xf6, 0x4a, 0xbd, 0xf0, 0xf1, 0x19, 0x6b, + 0xf0, 0x38, 0x8f, 0xcd, 0x25, 0x11, 0x95, 0x59, 0x94, 0xd9, 0xad, 0x18, 0xe5, 0x50, 0x4e, 0xba, 0x73, 0x36, 0x96, 0x7d, 0xc1, 0xcd, 0xfa, 0xb4, 0x42, 0x20, 0x63, 0x74, 0xae, 0xc2, 0x87, 0x68, + 0xed, 0x85, 0xfd, 0x79, 0xc0, 0x4e, 0xb9, 0x32, 0x76, 0xa3, 0x32, 0xe8, 0x86, 0x4a, 0x88, 0x47, 0x86, 0x27, 0xd2, 0x1e, 0x36, 0x1f, 0xeb, 0x05, 0x66, 0xcd, 0x5f, 0x67, 0x50, 0xbf, 0xa1, 0xd2, + 0x91, 0x91, 0xd0, 0x1f, 0x12, 0xe9, 0x5f, 0xff, 0x46, 0xde, 0x93, 0x31, 0x91, 0x61, 0x24, 0x97, 0xc1, 0x3b, 0xc1, 0xc8, 0x94, 0x6b, 0x00, 0x0f, 0x45, 0x7b, 0x33, 0x1a, 0x46, 0x99, 0x13, 0x06, + 0x8a, 0x77, 0xa9, 0x67, 0xff, 0xf8, 0xa0, 0xfb, 0x6f, 0xd0, 0xff, 0x73, 0xe6, 0xdc, 0x35, 0x39, 0xd0, 0xb7, 0x57, 0xdc, 0xec, 0x77, 0xa0, 0x10, 0x78, 0x3e, 0x02, 0x4f, 0x80, 0x9e, 0xf3, 0x01, + 0xb3, 0x19, 0xb1, 0x79, 0x5d, 0x73, 0x05, 0x17, 0x0e, 0x09, 0x5c, 0x1c, 0xf2, 0x6c, 0x6a, 0x70, 0x4a, 0xd0, 0xb5, 0x7b, 0x18, 0x6b, 0x70, 0x61, 0x62, 0x71, 0x13, 0x42, 0x58, 0x92, 0x13, 0x61, + 0xbb, 0x75, 0xd1, 0x0d, 0x1b, 0xe8, 0x9d, 0x15, 0x8b, 0xa6, 0xb5, 0xbe, 0xc7, 0xbb, 0x9b, 0x89, 0xe9, 0xea, 0x96, 0xc8, 0xb0, 0xdb, 0xc9, 0x4a, 0x09, 0xb6, 0x3b, 0x2d, 0x62, 0x18, 0x7e, 0xba, + 0xd8, 0x0c, 0xca, 0xd7, 0xed, 0xbc, 0xac, 0x8a, 0x0c, 0xd0, 0x3c, 0x07, 0x07, 0xe1, 0x37, 0xfa, 0xc7, 0x93, 0xf6, 0x5f, 0xff, 0x46, 0x7f, 0xfd, 0x85, 0x99, 0x07, 0xba, 0x13, 0x58, 0xd7, 0xbf, + 0xc8, 0x13, 0xef, 0x12, 0xad, 0x96, 0x93, 0xd9, 0xb9, 0xfa, 0xa6, 0x85, 0x3e, 0x94, 0x46, 0x61, 0x90, 0x86, 0x49, 0x0a, 0xa5, 0x4e, 0xa0, 0x1f, 0x49, 0x90, 0xd8, 0x79, 0xfa, 0xdb, 0x33, 0xdf, + 0x7f, 0x44, 0xf4, 0x13, 0xdb, 0xff, 0x94, 0xe6, 0xfe, 0x91, 0xdc, 0x7e, 0x0a, 0x36, 0xbf, 0x7e, 0x4e, 0xe8, 0x74, 0xb0, 0x9f, 0x1d, 0x80, 0xb5, 0x2b, 0x64, 0x7e, 0x97, 0x14, 0xb6, 0x28, 0x15, + 0x76, 0xf1, 0x3e, 0xd3, 0xef, 0x4d, 0xfa, 0xac, 0x2c, 0xe3, 0x0b, 0x7c, 0x1b, 0x1b, 0x83, 0xe9, 0x96, 0x2d, 0x48, 0x3a, 0x5b, 0x02, 0xae, 0x8a, 0x15, 0x7b, 0x68, 0x5e, 0x29, 0xfc, 0x66, 0x06, + 0xcf, 0x96, 0x7c, 0xb5, 0xc9, 0xfc, 0xc9, 0x42, 0x80, 0x55, 0x40, 0xd1, 0x57, 0xcb, 0x5e, 0xa1, 0xa6, 0xc8, 0xac, 0xa7, 0x0c, 0xd1, 0x07, 0x76, 0xc2, 0xab, 0x18, 0xba, 0x2f, 0xbc, 0xef, 0x1b, + 0xa8, 0xc8, 0x0b, 0x92, 0xf2, 0x0e, 0xfc, 0xa3, 0xdd, 0xf5, 0xf5, 0x2a, 0xd8, 0xc0, 0x7f, 0x8e, 0x54, 0xd2, 0x9c, 0x69, 0xc0, 0x1c, 0x77, 0xec, 0x32, 0x9e, 0x91, 0x22, 0xa4, 0x8c, 0x0a, 0xd4, + 0x44, 0x2c, 0x61, 0x48, 0x7b, 0xd3, 0x75, 0xb6, 0x91, 0x86, 0x61, 0xcc, 0xe2, 0x15, 0x4f, 0x86, 0x0b, 0x6e, 0xbd, 0x0e, 0xb5, 0xdc, 0xef, 0xa6, 0x26, 0x1b, 0xbb, 0xfb, 0x6d, 0x10, 0x3b, 0x3b, + 0xc1, 0xf6, 0x85, 0x72, 0x01, 0xf9, 0xbd, 0xe1, 0x24, 0xa2, 0xd6, 0x86, 0xed, 0x65, 0x58, 0xec, 0x91, 0x5e, 0xcf, 0x79, 0x36, 0x7b, 0xfe, 0xeb, 0xb2, 0xbf, 0xa9, 0xa4, 0x99, 0x63, 0x56, 0x90, + 0xe2, 0x16, 0x47, 0x54, 0x46, 0x8e, 0xf7, 0x30, 0x38, 0x8b, 0x5c, 0xaf, 0x09, 0xb5, 0x24, 0xe0, 0xdd, 0x27, 0x40, 0xe0, 0xd5, 0x69, 0xe3, 0x68, 0xb5, 0x90, 0x7c, 0x56, 0xc1, 0x4e, 0x57, 0x62, + 0xb4, 0x4d, 0x37, 0xc9, 0x48, 0xc2, 0xba, 0xb8, 0xb2, 0x65, 0x27, 0x23, 0x5d, 0xf5, 0x26, 0x70, 0xc6, 0xc5, 0x38, 0xca, 0x0c, 0x20, 0x74, 0x5b, 0x52, 0xe1, 0x41, 0x75, 0xbc, 0x8e, 0x8d, 0x20, + 0x79, 0x58, 0x22, 0x70, 0x9d, 0x2d, 0xd0, 0x41, 0xde, 0x57, 0x6a, 0x91, 0x31, 0x5d, 0x35, 0x49, 0x65, 0x22, 0xf0, 0x80, 0x60, 0xe6, 0x11, 0x2e, 0xb7, 0x70, 0x5d, 0x62, 0xb9, 0xb8, 0xa1, 0x5d, + 0x2b, 0x7b, 0x8c, 0x6c, 0x83, 0xda, 0xe3, 0x99, 0xe7, 0xa8, 0x90, 0x99, 0xbe, 0xa5, 0x9a, 0x12, 0xe8, 0xce, 0x23, 0xc4, 0x1e, 0xc5, 0x01, 0xfe, 0x73, 0xc4, 0x7e, 0x85, 0x0f, 0x81, 0x17, 0x27, + 0x8d, 0x94, 0xc1, 0x9f, 0x23, 0x15, 0xc3, 0x2c, 0x2c, 0x12, 0xc6, 0x7b, 0x4c, 0xb5, 0x88, 0x60, 0xab, 0x4e, 0x20, 0x80, 0xdd, 0x91, 0x23, 0xd4, 0x18, 0x73, 0xb5, 0xdc, 0x0d, 0x1c, 0xbc, 0x33, + 0x33, 0xc7, 0xc1, 0x84, 0x30, 0x2d, 0x7b, 0xb6, 0xb4, 0xac, 0x59, 0xc1, 0xe8, 0x50, 0xd4, 0x17, 0x17, 0xd6, 0x38, 0xd5, 0xbb, 0xd6, 0x26, 0xca, 0xf2, 0x7e, 0x4e, 0xc5, 0x31, 0xd4, 0x9b, 0x17, + 0xd3, 0x5d, 0xdf, 0xb3, 0x8b, 0x74, 0xb2, 0x64, 0xf9, 0xd7, 0x43, 0x7b, 0x57, 0x9f, 0x95, 0x29, 0xd9, 0x09, 0x41, 0x37, 0x26, 0x63, 0x92, 0x07, 0x60, 0xa4, 0x24, 0x8a, 0xe7, 0x19, 0x27, 0xa3, + 0xf3, 0xc8, 0x40, 0x9d, 0x1f, 0xab, 0x9d, 0x3f, 0xe8, 0x9f, 0xd2, 0xf1, 0xf4, 0x42, 0xf7, 0x89, 0x08, 0xff, 0x2e, 0x11, 0x33, 0x25, 0x7b, 0xa7, 0x60, 0xa6, 0x64, 0x60, 0x03, 0xf0, 0x39, 0xf9, + 0x46, 0x3b, 0x6f, 0x38, 0xee, 0xc2, 0x9a, 0x97, 0xa1, 0xc0, 0xda, 0xa2, 0x54, 0x4d, 0x8b, 0x81, 0x65, 0x3d, 0xd7, 0xc7, 0x45, 0x81, 0x74, 0x34, 0x74, 0x24, 0xc6, 0xcc, 0x22, 0x0d, 0xa7, 0x93, + 0x08, 0x71, 0x0d, 0xea, 0xe0, 0x66, 0x09, 0x35, 0x46, 0x49, 0x60, 0xb3, 0x9d, 0x53, 0xa8, 0xc0, 0xea, 0xc5, 0xaa, 0x13, 0x23, 0xf1, 0xb2, 0x1e, 0x6d, 0x38, 0xd3, 0x16, 0x4c, 0x80, 0x9b, 0x17, + 0xd2, 0x98, 0xc7, 0x9f, 0x59, 0x85, 0x7f, 0x36, 0x5e, 0xcb, 0xc7, 0x41, 0xd4, 0xa3, 0xa6, 0x24, 0x7f, 0x0b, 0xaf, 0xe5, 0x29, 0x9e, 0xfa, 0x7e, 0x04, 0x36, 0x00, 0x9f, 0xe3, 0x95, 0x66, 0x92, + 0x50, 0x49, 0xc9, 0x62, 0x99, 0x6d, 0xf0, 0xc1, 0x68, 0xbb, 0xec, 0x0e, 0xb9, 0xb0, 0x87, 0xa1, 0x76, 0x20, 0xa2, 0x02, 0x51, 0xed, 0x2d, 0x36, 0xda, 0x0c, 0xd4, 0x7c, 0x3b, 0x94, 0x10, 0xa2, + 0xe8, 0x09, 0x71, 0x82, 0x62, 0x11, 0x43, 0x91, 0x06, 0x34, 0x90, 0xb5, 0x5d, 0x2a, 0xb3, 0xc3, 0xee, 0xa4, 0x20, 0xe0, 0x7d, 0xa6, 0xa3, 0x78, 0x6c, 0xf7, 0x2a, 0x3e, 0x21, 0x4b, 0x26, 0xfb, + 0x0d, 0x27, 0xfd, 0xbe, 0x34, 0xb9, 0x11, 0x1d, 0xcd, 0x5a, 0x79, 0x9a, 0xc5, 0xef, 0x53, 0xe2, 0xae, 0x95, 0xfd, 0xa7, 0x90, 0xee, 0x52, 0xcb, 0x40, 0xce, 0x23, 0x8d, 0x0f, 0xbf, 0xb8, 0x00, + 0x75, 0x03, 0x1d, 0x02, 0x21, 0x27, 0x05, 0xe1, 0x96, 0x2b, 0x4f, 0x1d, 0xb1, 0xb7, 0xec, 0x20, 0x30, 0x27, 0x2a, 0xa3, 0x59, 0x60, 0xed, 0x82, 0xc9, 0x64, 0x66, 0x58, 0xc0, 0xd4, 0xaa, 0xe3, + 0xd4, 0xe9, 0xe4, 0x02, 0xee, 0x2f, 0xd4, 0x70, 0x45, 0x54, 0x64, 0x44, 0x2f, 0x08, 0xae, 0x16, 0x96, 0xeb, 0x5e, 0x3a, 0x96, 0x13, 0xa5, 0x74, 0x00, 0x26, 0xe4, 0xc4, 0xd5, 0x9a, 0x51, 0x50, + 0xce, 0x1e, 0xc7, 0xd2, 0x6e, 0xd5, 0x2f, 0x04, 0xce, 0xb4, 0x56, 0x30, 0x89, 0x4e, 0x7e, 0x73, 0x3e, 0xb4, 0x52, 0x17, 0x69, 0xed, 0x2b, 0x89, 0x56, 0x2b, 0x7b, 0xe8, 0x88, 0x1b, 0x30, 0x73, + 0xfc, 0x6f, 0x35, 0xf1, 0xcf, 0xad, 0xcf, 0xbb, 0x4f, 0x80, 0xc0, 0x8b, 0x93, 0x46, 0x0f, 0xb7, 0x30, 0x4c, 0xb7, 0x23, 0x06, 0xdd, 0xaa, 0xf5, 0x70, 0x29, 0x92, 0x8e, 0x31, 0x72, 0xcd, 0x91, + 0xb0, 0xee, 0xd8, 0xde, 0x5a, 0x33, 0x67, 0x2b, 0x94, 0x4c, 0xd1, 0x42, 0x31, 0x77, 0x1b, 0x49, 0x93, 0x87, 0x9b, 0xed, 0x70, 0x7a, 0x70, 0x94, 0xb9, 0xbc, 0xeb, 0x71, 0x7c, 0xaf, 0xd4, 0x3d, + 0x04, 0xed, 0xc8, 0x95, 0x45, 0xc0, 0x80, 0x19, 0xee, 0xd6, 0xa8, 0xcb, 0x5a, 0x59, 0x12, 0x2f, 0xba, 0x64, 0x2c, 0xe6, 0xe2, 0xe2, 0x75, 0x95, 0xa1, 0x1b, 0xa6, 0x91, 0x80, 0x59, 0x08, 0x6a, + 0x61, 0x10, 0x18, 0xda, 0x79, 0x41, 0x08, 0x7e, 0xc1, 0x11, 0x69, 0x45, 0xa9, 0x53, 0x1a, 0x49, 0x63, 0x7d, 0xa6, 0x9a, 0x6d, 0xf8, 0xca, 0x03, 0x32, 0x51, 0x6f, 0xf0, 0x1b, 0xf5, 0x73, 0x32, + 0x7d, 0x01, 0x0f, 0x81, 0x97, 0x67, 0x60, 0x03, 0xf6, 0x39, 0x91, 0xb4, 0xc3, 0xa6, 0x2f, 0xad, 0x53, 0x83, 0xf1, 0xc9, 0x69, 0x67, 0xa0, 0x96, 0xc8, 0x68, 0xa3, 0xd2, 0x09, 0x39, 0x5d, 0xe0, + 0x53, 0x7b, 0x91, 0x61, 0xf6, 0x4c, 0x9e, 0xec, 0xfb, 0xdd, 0x68, 0xe2, 0x0a, 0xf4, 0xb2, 0xb7, 0x9d, 0x4f, 0x99, 0x5c, 0x1a, 0x4c, 0xba, 0x43, 0xd4, 0x41, 0x2d, 0x39, 0xd2, 0xb6, 0xfa, 0x84, + 0x19, 0x25, 0xd1, 0x36, 0x5f, 0x72, 0xf6, 0x90, 0x5a, 0xab, 0x3e, 0xe2, 0x6c, 0x7d, 0x71, 0xf0, 0xf3, 0xb5, 0xea, 0xab, 0x04, 0xa0, 0xbb, 0xcc, 0x7c, 0x9b, 0x12, 0xf4, 0x43, 0x44, 0x1d, 0x41, + 0x43, 0x60, 0xf3, 0x0f, 0x3c, 0xc3, 0x7a, 0x8e, 0x1d, 0x00, 0x1d, 0x59, 0x56, 0x69, 0x51, 0xb3, 0x43, 0x38, 0x25, 0xf8, 0xca, 0x2e, 0xd2, 0xb8, 0xb3, 0x56, 0x12, 0x7f, 0xa6, 0x8e, 0x0c, 0x6f, + 0x3b, 0x83, 0x29, 0x78, 0x28, 0x8c, 0xfc, 0x5e, 0xa4, 0x66, 0x03, 0x36, 0xac, 0x36, 0xe2, 0x48, 0x94, 0x5c, 0xbc, 0xac, 0x5d, 0x55, 0x62, 0xb7, 0xb5, 0x3e, 0x5c, 0xce, 0xb7, 0x41, 0x9c, 0x9b, + 0x79, 0x36, 0x56, 0x09, 0xbe, 0xbb, 0x9a, 0xcb, 0x5d, 0x51, 0x64, 0xba, 0x47, 0xf1, 0xfe, 0x14, 0x15, 0xef, 0xd9, 0x32, 0xf7, 0x83, 0x49, 0x57, 0xf9, 0x33, 0x3f, 0x44, 0xc4, 0x11, 0x30, 0x04, + 0x36, 0xff, 0xc0, 0x13, 0xa4, 0xe7, 0x68, 0x80, 0xd7, 0xb4, 0xc6, 0x87, 0x25, 0xa3, 0xa7, 0x4e, 0xb7, 0x13, 0xa8, 0x87, 0xae, 0x45, 0x11, 0x18, 0x92, 0xf6, 0x51, 0x4d, 0x9f, 0xc9, 0xa2, 0xb3, + 0x0a, 0x2d, 0xcd, 0x1c, 0xad, 0x8c, 0xd5, 0xc0, 0x07, 0x54, 0xc3, 0x5d, 0x31, 0x3d, 0x48, 0x2d, 0x1c, 0xb5, 0xc6, 0x92, 0x21, 0x46, 0x3a, 0xd2, 0xac, 0xa3, 0x4a, 0xee, 0x14, 0x4a, 0xa7, 0x75, + 0xbf, 0x5c, 0x75, 0x28, 0x28, 0x67, 0x09, 0x9f, 0xad, 0xc2, 0xd7, 0x67, 0xf2, 0x4d, 0xba, 0xd8, 0xff, 0xab, 0xf5, 0x6c, 0xfc, 0x36, 0x65, 0xeb, 0x3e, 0xaa, 0xd1, 0x97, 0x74, 0xd3, 0x93, 0xa7, + 0x7d, 0xc4, 0x9d, 0xcf, 0x39, 0x59, 0xa7, 0xe7, 0x3c, 0x27, 0x44, 0xac, 0xb2, 0xd6, 0x7e, 0x26, 0x50, 0xdc, 0x66, 0x99, 0xee, 0xa4, 0x81, 0x7b, 0xe8, 0xcc, 0x97, 0xb9, 0x34, 0x48, 0x4b, 0x07, + 0x50, 0x7b, 0x19, 0xec, 0xa4, 0x31, 0xc7, 0x18, 0x21, 0xc0, 0xf2, 0x6b, 0xb8, 0x43, 0x60, 0x75, 0x3c, 0x82, 0x97, 0x11, 0xc5, 0xca, 0x54, 0xdf, 0xe9, 0x38, 0x91, 0xd5, 0xef, 0x92, 0xbe, 0x26, + 0xc5, 0x7d, 0x5c, 0x9c, 0xae, 0xc5, 0x72, 0x01, 0x99, 0x68, 0x42, 0x1e, 0x16, 0xf6, 0x6f, 0x98, 0x1b, 0x77, 0xbe, 0xf3, 0x10, 0x19, 0x89, 0x73, 0xf4, 0xb5, 0x15, 0x0f, 0xcc, 0x33, 0xe7, 0x14, + 0x4a, 0x6e, 0x95, 0x0c, 0x97, 0x6a, 0x61, 0x64, 0x80, 0xbe, 0x12, 0x28, 0xd6, 0x29, 0xd3, 0xe2, 0xeb, 0xaf, 0xbe, 0x09, 0x6a, 0x9b, 0x79, 0xa0, 0x9d, 0x22, 0x7b, 0x60, 0x62, 0xe8, 0xa0, 0xea, + 0x29, 0xda, 0x1e, 0xcc, 0xce, 0x71, 0xee, 0x93, 0x9c, 0xbf, 0xb8, 0xdd, 0x0b, 0x75, 0xe5, 0x3d, 0x4e, 0x8d, 0xbf, 0x21, 0xd4, 0x1b, 0x72, 0xb5, 0x9c, 0x7c, 0x5a, 0x6a, 0x3e, 0xad, 0x35, 0x63, + 0xb7, 0x29, 0x1d, 0xa9, 0xe1, 0x17, 0x1f, 0xa9, 0x20, 0xd8, 0x4d, 0x92, 0x5b, 0xfa, 0xf1, 0xcd, 0x7f, 0xc7, 0x1a, 0xb8, 0x3f, 0x54, 0x2e, 0xdf, 0x86, 0xa6, 0x3f, 0x40, 0xdc, 0xf5, 0xfb, 0x8f, + 0x18, 0x3d, 0x82, 0x08, 0x23, 0x23, 0xd0, 0x42, 0xcf, 0x33, 0xb4, 0xcc, 0x29, 0x8c, 0xcb, 0xb7, 0xbb, 0x89, 0x0c, 0x5c, 0xdf, 0xd8, 0x44, 0x08, 0xbe, 0x50, 0xe5, 0x79, 0x00, 0xf6, 0x29, 0x4b, + 0x5c, 0x25, 0x39, 0xc2, 0x0f, 0x73, 0x1c, 0x89, 0xe3, 0xd8, 0xf1, 0xb3, 0xff, 0x4e, 0x7e, 0x1c, 0x51, 0xf7, 0x3f, 0xff, 0x79, 0x0c, 0xf8, 0x2a, 0x0f, 0xf0, 0xf3, 0xfa, 0x6f, 0xc6, 0x7f, 0x9f, + 0x4d, 0xeb, 0xe0, 0x9f, 0xeb, 0x01, 0xe7, 0x4b, 0xff, 0x2b, 0xd6, 0x03, 0x7e, 0xc4, 0x0f, 0xff, 0x8c, 0x12, 0xdf, 0xc7, 0xd8, 0x3d, 0x85, 0xf1, 0x17, 0xeb, 0xe2, 0x2f, 0x8f, 0x3c, 0x2a, 0xe4, + 0x2f, 0x17, 0x5b, 0x6b, 0xe5, 0x51, 0xb9, 0x5c, 0xa2, 0x6b, 0x91, 0xe3, 0x87, 0x88, 0x4d, 0xcf, 0xe5, 0xd4, 0x10, 0x86, 0x38, 0xab, 0xed, 0x98, 0x9a, 0xf4, 0x96, 0xc5, 0x3c, 0x9c, 0x4e, 0xb8, + 0x3c, 0x8f, 0x45, 0x59, 0x0e, 0x97, 0x76, 0x61, 0x0e, 0x7b, 0xf6, 0xd4, 0x91, 0x67, 0x12, 0x1b, 0x96, 0x00, 0xd1, 0xf3, 0xb0, 0x59, 0x56, 0x1d, 0xc6, 0x88, 0xc3, 0x25, 0xe4, 0x6a, 0x2b, 0x97, + 0xbb, 0xac, 0x87, 0x55, 0xb2, 0xe4, 0xda, 0xda, 0xef, 0x6a, 0xe5, 0x1b, 0xcf, 0xe3, 0x57, 0x23, 0x4b, 0xb1, 0xdf, 0x57, 0xc1, 0x77, 0x7e, 0xd5, 0x5c, 0xf9, 0xd9, 0xdd, 0xe7, 0x2b, 0x67, 0x05, + 0xfd, 0x28, 0xfb, 0x1d, 0x6c, 0xde, 0xe8, 0x53, 0x3f, 0xdc, 0xb9, 0xe3, 0x53, 0xe1, 0x3e, 0x50, 0x96, 0xff, 0xa3, 0xf5, 0xed, 0xa7, 0x02, 0x7d, 0xd1, 0x0c, 0xfe, 0xd0, 0xce, 0x7f, 0xed, 0x9c, + 0x3b, 0x3d, 0x06, 0x02, 0xdf, 0x0f, 0x5a, 0xcf, 0x2d, 0xdd, 0x45, 0xe4, 0x91, 0x0d, 0xe1, 0x12, 0x6f, 0xf4, 0xd8, 0x89, 0x8a, 0x9a, 0x90, 0xe4, 0xce, 0x4b, 0xc1, 0xe7, 0xba, 0x89, 0x56, 0x6a, + 0xe8, 0x26, 0x4c, 0x36, 0xb3, 0xb9, 0xc7, 0xd0, 0x2b, 0x71, 0x29, 0x7b, 0x3b, 0x84, 0x8f, 0x96, 0xeb, 0x54, 0xdd, 0x52, 0x06, 0x26, 0xcb, 0x7a, 0x64, 0x9b, 0xf3, 0x12, 0xed, 0x28, 0xcb, 0xfe, + 0x6a, 0x21, 0xe6, 0x03, 0x86, 0x2e, 0x3b, 0x5b, 0x22, 0x5d, 0x74, 0xa8, 0xdf, 0x9d, 0x5b, 0xff, 0x55, 0xe7, 0xcc, 0xad, 0x79, 0xfc, 0xbf, 0x75, 0x2a, 0xfc, 0xf7, 0xb4, 0x25, 0xdf, 0xa7, 0xc8, + 0x3f, 0x8d, 0xc8, 0x8f, 0x4b, 0xff, 0x4b, 0x8d, 0xc8, 0x7b, 0x8c, 0xf0, 0x4f, 0xeb, 0xf1, 0x2e, 0xaa, 0x6e, 0x85, 0xef, 0x5f, 0xab, 0xc4, 0xae, 0x9e, 0x06, 0x81, 0xd7, 0xe7, 0xad, 0x55, 0x5a, + 0x07, 0xd8, 0xec, 0xc6, 0x03, 0x2e, 0xc8, 0xd9, 0xce, 0x3a, 0xdb, 0x4d, 0x62, 0xc6, 0xd6, 0x16, 0xb9, 0x40, 0xe9, 0x39, 0x45, 0x98, 0x15, 0xbb, 0x80, 0xaa, 0x88, 0xa5, 0x35, 0xc2, 0xa2, 0x16, + 0x7a, 0x49, 0x45, 0x83, 0x09, 0x2e, 0x72, 0x4b, 0xd5, 0x18, 0x62, 0xb4, 0x31, 0x9e, 0x99, 0xf5, 0xa8, 0xd2, 0xd9, 0xa1, 0xcc, 0x85, 0x53, 0xcb, 0xf5, 0xc2, 0xc3, 0xa2, 0xdb, 0xc5, 0x00, 0xdc, + 0x83, 0xea, 0xf4, 0x77, 0xa3, 0x69, 0xbf, 0xa1, 0x9c, 0x0a, 0x27, 0x75, 0xb2, 0x30, 0x01, 0xf7, 0x46, 0x75, 0xf9, 0xa3, 0x9f, 0x4d, 0xcc, 0xbf, 0xd3, 0x6f, 0xc8, 0x59, 0x52, 0x1f, 0xf5, 0x10, + 0xf6, 0xa1, 0x87, 0x90, 0xe3, 0xc0, 0x1d, 0x5d, 0xf6, 0x9f, 0xa0, 0x88, 0x7e, 0xc4, 0x9a, 0x67, 0x24, 0xfe, 0xb5, 0x2c, 0x79, 0xb2, 0xf5, 0xc1, 0xd3, 0xff, 0xd6, 0x2c, 0x98, 0xed, 0xe5, 0x15, + 0x63, 0x71, 0x12, 0xaf, 0x17, 0x66, 0x4a, 0x4f, 0x70, 0x6a, 0xa2, 0xc4, 0x87, 0xd0, 0xe5, 0xb9, 0x1e, 0xe0, 0x8f, 0x56, 0xfe, 0xb4, 0xd6, 0x6b, 0x2a, 0x01, 0x72, 0x60, 0x45, 0xe0, 0x1e, 0x36, + 0xe0, 0xf6, 0xcb, 0xa8, 0xa7, 0x4a, 0xc8, 0x38, 0xc2, 0x34, 0x31, 0x8e, 0xbb, 0xab, 0x4e, 0x21, 0xac, 0x58, 0xa6, 0x8b, 0x98, 0x4e, 0x96, 0x8e, 0x6c, 0x9f, 0xaa, 0x44, 0xb8, 0x38, 0x74, 0x9e, + 0xc9, 0xf3, 0xff, 0x8d, 0xf4, 0xbf, 0xb1, 0xd9, 0xfe, 0x03, 0x78, 0xe1, 0xf2, 0x89, 0x67, 0xbe, 0xb8, 0xbc, 0xd6, 0x9a, 0x47, 0xf6, 0x0c, 0xe7, 0x64, 0x13, 0x48, 0xad, 0xa0, 0x21, 0x4f, 0x59, + 0x34, 0xbb, 0x9b, 0x2c, 0x29, 0x85, 0x8f, 0xba, 0xa5, 0x37, 0xa7, 0xf5, 0x30, 0xb5, 0xcd, 0x4d, 0x4d, 0xeb, 0x14, 0xe2, 0x76, 0xa8, 0x80, 0xd8, 0xaf, 0x14, 0x42, 0x53, 0x86, 0x9b, 0x62, 0x07, + 0xcf, 0x8b, 0xde, 0xaa, 0xa7, 0x04, 0x13, 0xa8, 0x17, 0x33, 0xe3, 0xb0, 0x2b, 0x1a, 0x05, 0xbd, 0xd5, 0x20, 0x5f, 0x22, 0x27, 0x93, 0x72, 0xfb, 0x68, 0x65, 0xe8, 0x3f, 0x51, 0x4c, 0x5d, 0xfc, + 0xe8, 0x9b, 0xe8, 0xb2, 0xe5, 0x85, 0xaa, 0x5a, 0x9d, 0xac, 0xe4, 0x2f, 0xb1, 0x64, 0x27, 0x05, 0x8f, 0xe3, 0xbf, 0xce, 0x11, 0xce, 0xab, 0xc1, 0x7f, 0x46, 0x8b, 0xff, 0x8b, 0x98, 0xd7, 0x5f, + 0x67, 0xc7, 0x3f, 0x2d, 0xed, 0x8f, 0x4b, 0xff, 0x4b, 0x2d, 0xed, 0x27, 0x3c, 0xf1, 0x4f, 0xa3, 0xfb, 0x2e, 0xd6, 0x6e, 0x24, 0xe9, 0x5f, 0xab, 0xd4, 0x2e, 0x1f, 0x06, 0x81, 0x57, 0xa7, 0xad, + 0x55, 0x19, 0x1e, 0x1e, 0x90, 0xd4, 0xf5, 0x07, 0xc3, 0xd1, 0xc1, 0xed, 0x71, 0x4c, 0x20, 0xb0, 0xd9, 0xa6, 0xdf, 0xb7, 0x7b, 0xc9, 0x36, 0xe3, 0xbb, 0x48, 0x4f, 0x83, 0x53, 0x26, 0xca, 0x6b, + 0xd8, 0x8c, 0x4d, 0x6c, 0x06, 0x58, 0xd8, 0xb8, 0x3f, 0xa8, 0x96, 0x87, 0x83, 0xda, 0x87, 0x49, 0xb5, 0x2a, 0xe1, 0xfe, 0x3c, 0x9d, 0x05, 0x81, 0x1a, 0xe3, 0xb8, 0xc6, 0x3b, 0xc5, 0x90, 0xe2, + 0x53, 0x04, 0x82, 0x53, 0xf2, 0x59, 0x36, 0xef, 0x9f, 0xa5, 0xca, 0xde, 0xc3, 0x9c, 0xb7, 0xea, 0xeb, 0xb5, 0x68, 0xe7, 0x7f, 0x6f, 0x2b, 0x4b, 0x51, 0xd5, 0xa4, 0x41, 0xf4, 0x3d, 0x96, 0x43, + 0x5e, 0xca, 0x1c, 0x3f, 0x81, 0x84, 0xc0, 0xf7, 0x83, 0x26, 0xb7, 0xa9, 0x85, 0x98, 0x0e, 0x02, 0xa3, 0x03, 0x8d, 0x1c, 0x09, 0xb2, 0xeb, 0x91, 0xbd, 0x23, 0x23, 0x9d, 0x0b, 0x54, 0x26, 0xab, + 0x29, 0xce, 0x9d, 0x2d, 0xf9, 0x64, 0x07, 0xc3, 0x33, 0xa8, 0x2e, 0x66, 0x0b, 0x9f, 0x88, 0xa6, 0xfd, 0xbd, 0x47, 0x1e, 0xf2, 0x41, 0x32, 0x08, 0xb6, 0x01, 0xb4, 0xce, 0x96, 0xa2, 0x68, 0x8a, + 0x59, 0xd7, 0x94, 0x3b, 0x10, 0x32, 0xcf, 0x0c, 0x7b, 0x9f, 0xd6, 0xab, 0x4e, 0xac, 0x2d, 0x1d, 0x07, 0x7e, 0x20, 0xa6, 0xbf, 0xc3, 0x47, 0x9a, 0x25, 0x8a, 0x96, 0x81, 0x5e, 0x68, 0x59, 0xd7, + 0x54, 0xba, 0x4d, 0x3a, 0x7d, 0x05, 0x33, 0xd7, 0xc0, 0x1b, 0x1c, 0x5d, 0x5f, 0x6a, 0xb2, 0x4f, 0x5b, 0x60, 0x0b, 0x65, 0xdc, 0xf9, 0x52, 0x3e, 0x2c, 0x67, 0x85, 0x6d, 0x4c, 0x8b, 0x81, 0xca, + 0xa4, 0x5e, 0x7f, 0xb1, 0x9b, 0xae, 0xf6, 0x09, 0xb0, 0x70, 0x67, 0xd9, 0x34, 0x48, 0x26, 0x33, 0x0c, 0x33, 0x81, 0xf5, 0x68, 0x33, 0xa9, 0x8d, 0x5a, 0x8a, 0x64, 0x2d, 0x5e, 0x5b, 0x94, 0xab, + 0x60, 0x13, 0x5c, 0x67, 0xb6, 0x7e, 0x5d, 0x5b, 0xe5, 0x12, 0x50, 0x60, 0xb4, 0xe3, 0xce, 0x0f, 0xc4, 0x8c, 0x75, 0xb0, 0x71, 0xee, 0x74, 0xbf, 0x4d, 0xa3, 0x51, 0xb4, 0x30, 0x79, 0x94, 0xd5, + 0x41, 0xbd, 0x54, 0x3c, 0xd8, 0x40, 0x3c, 0x22, 0xe1, 0xf8, 0x1f, 0xa4, 0xda, 0x95, 0x0b, 0x06, 0x52, 0x15, 0xc1, 0x21, 0x02, 0xf9, 0xa2, 0xae, 0x2e, 0xa7, 0xc8, 0x6c, 0x4a, 0xee, 0x87, 0xfb, + 0x72, 0x91, 0xf8, 0x96, 0x0c, 0x0b, 0x4b, 0xc8, 0x65, 0xd9, 0x48, 0x74, 0x4a, 0x75, 0xe5, 0x0e, 0xc2, 0xb9, 0x88, 0xeb, 0x1e, 0x63, 0xc7, 0xe3, 0x2c, 0x94, 0x72, 0x36, 0xe8, 0x4d, 0xf9, 0xda, + 0x5a, 0xae, 0x4b, 0x0b, 0x96, 0x37, 0x0e, 0x1b, 0x4a, 0x15, 0xb9, 0x38, 0x08, 0x86, 0x2a, 0xad, 0x6d, 0xfa, 0x99, 0x11, 0xad, 0x5e, 0xe5, 0xb3, 0xfc, 0xf1, 0xc7, 0xaf, 0x33, 0x32, 0x8e, 0x23, + 0xef, 0x98, 0xf9, 0x99, 0xdc, 0xf8, 0xd7, 0xbf, 0xc1, 0x6f, 0x78, 0xab, 0x1a, 0xb9, 0x13, 0x76, 0xdc, 0xf4, 0xf0, 0x00, 0xf7, 0xc4, 0x4b, 0xa6, 0xd4, 0x07, 0xd4, 0x0f, 0xfc, 0xbb, 0xe9, 0x01, + 0x24, 0xda, 0x99, 0x54, 0x3c, 0x3c, 0xcb, 0x7c, 0x08, 0xa7, 0xa6, 0xbc, 0x29, 0xcd, 0x23, 0x51, 0x42, 0xc7, 0x50, 0x38, 0x12, 0x21, 0x4c, 0xda, 0x39, 0x3c, 0xd9, 0x2f, 0x37, 0x80, 0x31, 0x56, + 0x47, 0x13, 0x3b, 0xd5, 0x0f, 0x36, 0xba, 0x59, 0x4e, 0x74, 0x0f, 0xc0, 0xe0, 0x90, 0x56, 0x06, 0xfa, 0x52, 0xf5, 0x89, 0xb1, 0x6a, 0x9a, 0x51, 0xbf, 0xdf, 0xb5, 0x20, 0x0b, 0xa8, 0x1d, 0xa4, + 0x07, 0xb8, 0xc5, 0xd8, 0x56, 0x88, 0xe0, 0x99, 0xf4, 0xff, 0x3e, 0x54, 0xfd, 0x41, 0x90, 0xdb, 0xf8, 0x74, 0x73, 0x44, 0xb7, 0xac, 0x47, 0x3c, 0x15, 0x1b, 0xdc, 0xc3, 0xf2, 0x7b, 0xf9, 0xc1, + 0x8f, 0xd1, 0xec, 0x16, 0xef, 0x35, 0x17, 0x27, 0x00, 0xcf, 0x71, 0xeb, 0x62, 0xe6, 0x7a, 0x62, 0x15, 0xcb, 0x90, 0x40, 0x29, 0x25, 0xa8, 0x76, 0xd5, 0x78, 0x3a, 0x58, 0xee, 0xc6, 0xea, 0x00, + 0x28, 0x82, 0x40, 0xda, 0x15, 0x3d, 0xd8, 0x27, 0x7c, 0x7f, 0xaf, 0x21, 0x4b, 0x1e, 0x08, 0x0e, 0xdd, 0x28, 0xda, 0xb3, 0x13, 0x61, 0x34, 0x81, 0x15, 0x19, 0xd7, 0x55, 0x6f, 0xcd, 0x8a, 0xe1, + 0x60, 0x61, 0xdb, 0x3e, 0xb0, 0xaf, 0x7b, 0xb8, 0xbc, 0xaa, 0xf6, 0x4c, 0x28, 0x58, 0x78, 0xcb, 0x5a, 0x0b, 0x53, 0x49, 0x33, 0x50, 0x37, 0x8c, 0x08, 0x34, 0xe2, 0x5c, 0xf9, 0x28, 0x2b, 0xbd, + 0x49, 0x0b, 0x3a, 0xde, 0x74, 0x5a, 0x0a, 0xcd, 0x14, 0xd5, 0x3b, 0x37, 0x93, 0x70, 0xcc, 0xea, 0x42, 0x89, 0x5e, 0xdc, 0x7f, 0x99, 0x42, 0x99, 0x25, 0xca, 0x11, 0xa7, 0x27, 0xcd, 0x79, 0x5d, + 0x71, 0xdc, 0xa8, 0x38, 0x07, 0x74, 0x4f, 0xaa, 0x18, 0x7f, 0x43, 0xef, 0xd9, 0xc7, 0xdf, 0xea, 0xce, 0x53, 0x59, 0xce, 0x37, 0x3a, 0xf3, 0x5e, 0xdd, 0x8e, 0x11, 0x85, 0xaa, 0x91, 0x18, 0xf5, + 0xde, 0x09, 0xda, 0xf0, 0x47, 0x90, 0x3a, 0xa0, 0xe2, 0x39, 0xd6, 0x23, 0x41, 0xf8, 0x5a, 0x37, 0x80, 0x4f, 0xb0, 0xe7, 0x2e, 0x31, 0xcd, 0x49, 0x9b, 0x8e, 0x00, 0x47, 0x96, 0x91, 0x23, 0xd6, + 0x5b, 0xf3, 0xf1, 0x56, 0xc4, 0xe6, 0x03, 0xc6, 0xe7, 0x1d, 0x55, 0x37, 0x37, 0x75, 0xcc, 0xee, 0x70, 0x2f, 0x70, 0x7b, 0x79, 0x28, 0xd6, 0x2b, 0x62, 0x09, 0x87, 0xbd, 0x7e, 0x64, 0xea, 0x50, + 0x4d, 0xc4, 0xe3, 0xe1, 0x5a, 0x49, 0xf2, 0x7d, 0xe2, 0xe8, 0x1c, 0xee, 0xe6, 0x93, 0x29, 0xda, 0xdf, 0x0a, 0x4e, 0xb9, 0x92, 0x0e, 0x49, 0x67, 0x13, 0x4b, 0x99, 0xb2, 0x53, 0xe8, 0xed, 0x7c, + 0xf7, 0xfa, 0x8a, 0xde, 0x7b, 0x73, 0x91, 0xd2, 0xd1, 0xb3, 0xcf, 0xca, 0xe3, 0x56, 0xb3, 0xef, 0x13, 0x0d, 0x5f, 0xaf, 0x37, 0x09, 0x64, 0x0f, 0x6d, 0xe3, 0x57, 0x2a, 0xa4, 0x3e, 0xc1, 0x9e, + 0xb1, 0xde, 0x9c, 0x80, 0x78, 0xbb, 0xa2, 0x28, 0x44, 0x89, 0x8c, 0x99, 0xb9, 0x15, 0x90, 0xd5, 0x74, 0x11, 0x97, 0x70, 0xd8, 0x19, 0x39, 0xfd, 0x6e, 0x58, 0xac, 0xeb, 0x8e, 0x40, 0x2c, 0x10, + 0xce, 0x02, 0xf0, 0x65, 0xc2, 0x95, 0xa6, 0x60, 0x94, 0x12, 0x19, 0x41, 0x89, 0x2f, 0xe4, 0x86, 0x4a, 0x65, 0x1b, 0xd9, 0x95, 0x90, 0xe4, 0x80, 0x4f, 0xc2, 0x0a, 0xe9, 0x26, 0x8c, 0x65, 0x85, + 0xf1, 0x20, 0x32, 0xe3, 0x58, 0x1f, 0xe1, 0x49, 0x18, 0x3c, 0x6d, 0xb5, 0xf4, 0xcc, 0x41, 0xfc, 0x0d, 0x2c, 0xdf, 0x90, 0xed, 0x3e, 0x77, 0xbf, 0x82, 0xe7, 0x4b, 0xc0, 0xef, 0x35, 0x84, 0xe7, + 0xd3, 0xa6, 0x78, 0xb0, 0x05, 0xae, 0x0b, 0xc5, 0xd4, 0x0a, 0x92, 0x77, 0xd7, 0x32, 0xbf, 0xb0, 0x6a, 0x98, 0x0c, 0x05, 0x68, 0x48, 0x0e, 0x38, 0x26, 0xe9, 0x66, 0x35, 0x5d, 0xe8, 0xb6, 0xa4, + 0xec, 0x07, 0x6e, 0x7f, 0x54, 0x88, 0xc9, 0xb0, 0x4b, 0x56, 0xd8, 0x90, 0xed, 0x23, 0xec, 0x28, 0x98, 0x54, 0x80, 0x34, 0x89, 0x69, 0x7d, 0x39, 0x9e, 0x49, 0x88, 0x0a, 0xf0, 0xdc, 0x2a, 0xe6, + 0xfa, 0x5a, 0xb6, 0xd7, 0xe7, 0x1b, 0x1c, 0x37, 0x90, 0xd7, 0x39, 0xdc, 0xf0, 0x43, 0xf7, 0x93, 0x23, 0x4f, 0x89, 0x20, 0xb7, 0xf1, 0x2b, 0x33, 0xf7, 0xbc, 0xd3, 0x37, 0x36, 0x6d, 0xe9, 0xa2, + 0xf0, 0xbc, 0x92, 0xfa, 0x45, 0x40, 0x9e, 0x8a, 0x2a, 0x8f, 0x64, 0xf9, 0x75, 0x5a, 0x69, 0x45, 0x7e, 0xec, 0x85, 0xfc, 0x3e, 0xe5, 0x3f, 0x5e, 0xe0, 0xbe, 0x89, 0x81, 0xbe, 0x48, 0xf7, 0x13, + 0xd8, 0x8f, 0xca, 0xd1, 0xe6, 0x0d, 0x1a, 0x68, 0xcf, 0x69, 0xce, 0xe5, 0xf3, 0x14, 0xb1, 0x78, 0x95, 0x89, 0x53, 0x81, 0x1f, 0xc9, 0x5e, 0x62, 0x9a, 0xa5, 0x97, 0x5b, 0xb4, 0x30, 0xdc, 0x6b, + 0x41, 0xe4, 0xa6, 0xc4, 0x7a, 0xe6, 0x4f, 0x90, 0x59, 0xd7, 0x06, 0xfc, 0x2e, 0x06, 0xaf, 0x60, 0x6e, 0x19, 0x66, 0x26, 0x27, 0xc3, 0x3a, 0xba, 0x5a, 0xa5, 0xdb, 0x68, 0xe6, 0xcf, 0x7c, 0x41, + 0x18, 0x93, 0x1b, 0x8a, 0xc2, 0x04, 0xa5, 0x8b, 0x8d, 0x01, 0x4f, 0x75, 0x36, 0xcf, 0x0c, 0xbd, 0x27, 0xad, 0x95, 0x3e, 0x49, 0x8e, 0xff, 0xb5, 0x54, 0x6a, 0x22, 0x35, 0x8f, 0x43, 0x01, 0x2f, + 0xf9, 0x65, 0x9f, 0x70, 0xcf, 0xf2, 0xee, 0x74, 0xd6, 0x08, 0xbc, 0x16, 0x56, 0xdf, 0x38, 0xdc, 0xc2, 0x4a, 0x34, 0x50, 0x87, 0xca, 0x6a, 0xcc, 0x88, 0x1e, 0x59, 0xf5, 0x81, 0x88, 0x1c, 0x77, + 0xfb, 0x3b, 0x99, 0x24, 0x49, 0xc8, 0xb6, 0xd9, 0x01, 0x2f, 0x12, 0x59, 0x47, 0xea, 0xbb, 0xea, 0x58, 0xe2, 0x57, 0x2b, 0xc8, 0xa2, 0x05, 0x51, 0xed, 0x73, 0x6a, 0x61, 0x26, 0x16, 0xbf, 0x2d, + 0x46, 0x88, 0x14, 0xc9, 0x91, 0x37, 0x9b, 0x06, 0xe5, 0x28, 0xec, 0x74, 0xbc, 0x2d, 0xd4, 0xed, 0xfa, 0xcf, 0x08, 0xf2, 0x67, 0x21, 0xf4, 0x3b, 0xf5, 0xf1, 0x1b, 0x4a, 0xfb, 0x8e, 0xfa, 0x68, + 0xa1, 0xb4, 0x11, 0x90, 0x92, 0x84, 0x6d, 0x59, 0x8d, 0x06, 0x4b, 0xcc, 0x1b, 0xa8, 0x5d, 0x7e, 0xa3, 0x74, 0x50, 0x94, 0x51, 0x52, 0x0c, 0x95, 0xad, 0x0b, 0x7c, 0xfc, 0x09, 0xdd, 0x5f, 0x9e, + 0x77, 0xb6, 0xc3, 0xdf, 0x5e, 0xa9, 0x7d, 0x78, 0xdc, 0xd9, 0xae, 0x81, 0xf7, 0x9c, 0x9b, 0x6a, 0x95, 0xe9, 0x24, 0xec, 0xb8, 0xbb, 0x44, 0x12, 0xd5, 0x75, 0xd6, 0x9c, 0x8a, 0xda, 0x31, 0xdf, + 0x1f, 0x8a, 0xbb, 0xc9, 0xc1, 0xca, 0xf6, 0xb4, 0xb8, 0x9a, 0x1f, 0x64, 0x6c, 0x24, 0x97, 0x1c, 0xd6, 0x27, 0xc5, 0xec, 0xa0, 0x6e, 0x65, 0x89, 0x0d, 0x82, 0x85, 0x83, 0x4c, 0xf6, 0x07, 0x60, + 0xc4, 0x85, 0xb6, 0x3e, 0xf3, 0xfa, 0x11, 0x8a, 0xa2, 0xe5, 0xba, 0x3b, 0x19, 0xd9, 0x86, 0x3c, 0x96, 0x16, 0xbd, 0x96, 0x76, 0xee, 0xd7, 0x36, 0x76, 0xe8, 0x4b, 0x55, 0x4b, 0xbf, 0x5f, 0x3f, + 0x7e, 0x6a, 0x3a, 0x77, 0x81, 0xbe, 0xff, 0xf7, 0xbb, 0x65, 0xfa, 0x37, 0xa4, 0x15, 0x71, 0xab, 0x73, 0x7f, 0x97, 0x47, 0xea, 0xfa, 0x15, 0x39, 0x71, 0x02, 0xda, 0x90, 0xf5, 0x74, 0xd8, 0xb6, + 0xc6, 0xdf, 0x17, 0x68, 0x02, 0x45, 0xa3, 0x74, 0xce, 0xc6, 0xf5, 0x1a, 0x20, 0x27, 0x76, 0xe8, 0x6f, 0x89, 0xd2, 0x8a, 0x50, 0x62, 0xb7, 0x76, 0x54, 0xd7, 0xa6, 0x37, 0x2e, 0x8a, 0x8d, 0x88, + 0xf9, 0x6c, 0x3f, 0x8b, 0xa2, 0xc5, 0x7a, 0xe1, 0x56, 0x3c, 0x87, 0x76, 0x51, 0x9f, 0x19, 0xfb, 0x9b, 0x81, 0x02, 0xf0, 0x22, 0x65, 0xa2, 0x1c, 0x39, 0x11, 0xed, 0x8e, 0xbb, 0x67, 0x58, 0xa3, + 0x9a, 0xec, 0xb3, 0xda, 0x7d, 0x66, 0x12, 0x3d, 0x26, 0x73, 0x10, 0x26, 0xbe, 0xe2, 0x39, 0xb5, 0x01, 0x46, 0xca, 0x95, 0x29, 0x7a, 0xa1, 0x7c, 0x23, 0x47, 0x0b, 0x3f, 0x7b, 0xe4, 0x9c, 0x8a, + 0x89, 0x7f, 0xca, 0x06, 0xad, 0x6a, 0x37, 0x95, 0x44, 0xb3, 0xab, 0x87, 0x81, 0xb6, 0x97, 0x04, 0xd0, 0x11, 0xe2, 0x91, 0x4a, 0xc7, 0xff, 0x20, 0xd2, 0x46, 0xec, 0x00, 0x9a, 0xcb, 0x88, 0x88, + 0x29, 0x0c, 0x75, 0x83, 0x16, 0x89, 0x64, 0x68, 0x54, 0x07, 0x27, 0xd2, 0xf8, 0x81, 0xdb, 0xeb, 0x7e, 0x1b, 0xfa, 0x49, 0x1e, 0xaf, 0xe3, 0xbc, 0xd2, 0xf7, 0x4d, 0x49, 0x9a, 0xd8, 0x57, 0x62, + 0x35, 0xaa, 0xa7, 0x45, 0x8b, 0x3d, 0x82, 0x5e, 0x74, 0x24, 0x2e, 0x1e, 0xc0, 0xdb, 0x03, 0x4a, 0xed, 0xca, 0xd9, 0x22, 0xeb, 0x98, 0xe3, 0x83, 0x53, 0xb8, 0x3b, 0x0f, 0xc7, 0xd0, 0x1d, 0x5b, + 0x9a, 0x9c, 0x60, 0xca, 0x00, 0x85, 0xcc, 0xbb, 0xf1, 0x2a, 0x91, 0x0d, 0x93, 0x9a, 0x24, 0xbc, 0x24, 0x63, 0x93, 0xe1, 0x64, 0x5a, 0xb2, 0x0b, 0xbc, 0x3f, 0x11, 0x99, 0xc8, 0x9b, 0x11, 0x18, + 0x26, 0x1f, 0xe8, 0x0e, 0xb1, 0x30, 0xa6, 0xec, 0xb0, 0xf8, 0x71, 0x4d, 0x9d, 0x92, 0x58, 0x4d, 0x22, 0xd1, 0x37, 0x54, 0x44, 0x5e, 0x21, 0xe3, 0x09, 0xea, 0x09, 0x23, 0xcd, 0x21, 0x78, 0x02, + 0xf5, 0x1c, 0x2f, 0x21, 0x31, 0x0f, 0x2b, 0x32, 0x13, 0x07, 0xf8, 0x62, 0x02, 0xf5, 0xa7, 0x7b, 0xb6, 0x2b, 0x92, 0xf3, 0xda, 0x75, 0x94, 0xbd, 0xbc, 0x40, 0x89, 0xf9, 0x64, 0xd7, 0x4f, 0x34, + 0x21, 0xcb, 0xc6, 0xb1, 0xaa, 0xeb, 0x34, 0xb3, 0x49, 0x82, 0x2e, 0x60, 0x0e, 0x6a, 0x82, 0x72, 0x44, 0x62, 0xa6, 0xc2, 0x64, 0x54, 0x30, 0x83, 0xc2, 0x23, 0x2c, 0x09, 0x66, 0x70, 0x5a, 0x1f, + 0x7b, 0xa9, 0xb7, 0x2d, 0xc2, 0xe5, 0xeb, 0x13, 0x2e, 0x8d, 0x12, 0x27, 0xc8, 0xcc, 0x77, 0x27, 0xfe, 0x1f, 0x48, 0xd3, 0xb0, 0xba, 0xcd, 0xd4, 0x48, 0x94, 0x0a, 0xcc, 0x83, 0x13, 0x1e, 0xef, + 0xa1, 0x16, 0x7d, 0xc9, 0xf1, 0xb8, 0x80, 0xdb, 0x20, 0xf7, 0xe3, 0xac, 0x59, 0x2f, 0x6a, 0x81, 0xde, 0xe1, 0xa0, 0x3a, 0x84, 0xd3, 0xe5, 0x6e, 0x55, 0xb1, 0x02, 0x99, 0x66, 0x2b, 0x83, 0xec, + 0x8d, 0xad, 0x40, 0xc7, 0x7b, 0xa1, 0x51, 0x76, 0x47, 0x54, 0x2d, 0xe8, 0x66, 0x3c, 0x05, 0xf6, 0x03, 0x37, 0xf0, 0x64, 0x9f, 0xe1, 0x6a, 0x48, 0x9b, 0x13, 0x91, 0x49, 0x27, 0x90, 0x36, 0xc7, + 0x37, 0x31, 0x09, 0xa7, 0x13, 0x28, 0x82, 0x47, 0x7b, 0xcd, 0x5d, 0xf5, 0x7a, 0xb3, 0x72, 0x81, 0x0d, 0xfa, 0xc9, 0xa8, 0x7a, 0xe6, 0x76, 0xb4, 0xd6, 0x39, 0xdf, 0x20, 0x34, 0xcd, 0x92, 0xa6, + 0x6a, 0xeb, 0xb1, 0xcd, 0x83, 0xbe, 0x26, 0x72, 0x2e, 0x00, 0x1f, 0x51, 0x7a, 0x71, 0xda, 0x44, 0xae, 0x5b, 0xe0, 0x54, 0xa6, 0x32, 0xa1, 0x44, 0xaa, 0x6c, 0xb9, 0xcd, 0x08, 0x37, 0x16, 0xb4, + 0xe9, 0x0c, 0x98, 0x4a, 0x99, 0xb1, 0x42, 0xd6, 0xb9, 0xc8, 0x77, 0x76, 0x30, 0x9a, 0xe7, 0xe3, 0x8c, 0x97, 0x90, 0x45, 0x41, 0x76, 0xdc, 0xad, 0xc4, 0xf3, 0x16, 0xa1, 0x39, 0xea, 0xa4, 0x1c, + 0x8c, 0xc3, 0x92, 0xae, 0x6a, 0x79, 0x06, 0x18, 0x5d, 0x0d, 0xa1, 0x7b, 0xfe, 0x64, 0x30, 0x53, 0x3c, 0x58, 0x8d, 0x30, 0x32, 0x29, 0x9e, 0x2d, 0xc7, 0xfe, 0x29, 0x38, 0xad, 0x02, 0x6d, 0xef, + 0x3c, 0x6a, 0x43, 0x01, 0xbf, 0xd4, 0x8c, 0xea, 0x0c, 0xb4, 0xc1, 0xe5, 0xe9, 0xb0, 0x69, 0x9b, 0xf7, 0x54, 0x90, 0x1f, 0x08, 0x4a, 0x36, 0x31, 0x1a, 0xae, 0x70, 0x3a, 0x09, 0xd5, 0x6a, 0xbb, + 0x9f, 0xd4, 0x9c, 0xbc, 0xd7, 0x27, 0x0b, 0x6c, 0xff, 0xad, 0x20, 0xcf, 0x42, 0xdf, 0xd1, 0xc0, 0xd4, 0x33, 0x8c, 0xe8, 0xcf, 0xd5, 0x45, 0x17, 0x80, 0x8f, 0x1f, 0x73, 0x71, 0xda, 0x46, 0x33, + 0x35, 0xd9, 0x31, 0xe2, 0xd4, 0xe5, 0xe2, 0xae, 0x4d, 0x45, 0x07, 0x78, 0xbb, 0x11, 0x47, 0x00, 0x2e, 0xa9, 0x75, 0xe8, 0xcc, 0xa1, 0x60, 0xb9, 0x1f, 0x76, 0x37, 0x62, 0xae, 0xa3, 0x79, 0x11, + 0x8c, 0xe3, 0x9c, 0x43, 0xa0, 0x03, 0xa1, 0x50, 0x3d, 0x49, 0x16, 0xc6, 0x4b, 0xb8, 0xab, 0xd5, 0x31, 0x0f, 0x4b, 0x01, 0x49, 0x85, 0x3b, 0x68, 0xb9, 0x94, 0x90, 0x89, 0xba, 0xe2, 0x15, 0x57, + 0x8e, 0x22, 0x6c, 0xd4, 0xc9, 0xae, 0x18, 0xe3, 0x19, 0x17, 0xb4, 0x0d, 0x53, 0xe5, 0x59, 0xa8, 0x29, 0x41, 0xf0, 0x50, 0x5a, 0xe1, 0x6f, 0xe4, 0x2b, 0x28, 0xfc, 0x00, 0x7b, 0x44, 0xe0, 0xc7, + 0x09, 0xd8, 0x40, 0x7b, 0x8e, 0xbe, 0x68, 0x33, 0xec, 0x31, 0x63, 0xbb, 0xa3, 0xee, 0x25, 0x83, 0xdb, 0xee, 0x5c, 0x44, 0x9c, 0xa0, 0x0c, 0xb3, 0x33, 0xb6, 0x4b, 0x65, 0xb2, 0x57, 0xe7, 0x4e, + 0x85, 0x89, 0x32, 0x55, 0x88, 0x73, 0x44, 0x8d, 0xa9, 0x62, 0x73, 0x18, 0xce, 0xe8, 0x39, 0xe0, 0xb0, 0x3e, 0x57, 0x31, 0x6c, 0x96, 0xdb, 0xe8, 0x4c, 0x18, 0x3b, 0x1b, 0x6f, 0xe0, 0x39, 0xfb, + 0xad, 0x82, 0x44, 0xf0, 0x64, 0xb5, 0xda, 0x61, 0x4b, 0xbd, 0x6c, 0x69, 0x4f, 0x7f, 0x74, 0xeb, 0xfe, 0x62, 0x5f, 0x69, 0x9e, 0x03, 0x36, 0x61, 0x62, 0xec, 0xd7, 0x29, 0xe6, 0x4b, 0x5c, 0x47, + 0x4a, 0x34, 0x2f, 0x0c, 0x8c, 0x77, 0xdb, 0x0b, 0xb9, 0xce, 0xe5, 0x39, 0x59, 0xe9, 0xef, 0xc9, 0x0b, 0xcd, 0x2d, 0xc8, 0x6d, 0x2c, 0x5a, 0x4b, 0xc2, 0x34, 0x05, 0x95, 0xc4, 0x2a, 0xde, 0xc7, + 0x6f, 0x9e, 0x6e, 0x86, 0x89, 0x0f, 0xea, 0x4a, 0xa6, 0xbc, 0x3f, 0xe1, 0xe6, 0xe1, 0xb6, 0x92, 0x82, 0xcd, 0xbc, 0x03, 0xed, 0x30, 0xdc, 0xa7, 0xf7, 0x61, 0xd8, 0x7a, 0x02, 0xda, 0x4e, 0x9a, + 0x85, 0x56, 0xa2, 0xf8, 0xe7, 0xf8, 0x34, 0x72, 0xdb, 0xff, 0xe3, 0xfa, 0xae, 0xc8, 0x48, 0x34, 0x23, 0xc8, 0x9c, 0xa3, 0x3f, 0x14, 0xaa, 0xee, 0xaf, 0xbb, 0x71, 0x9f, 0x23, 0x2f, 0x80, 0xef, + 0xc5, 0x1b, 0xef, 0x60, 0x8f, 0xe8, 0xb9, 0xc2, 0x81, 0x5d, 0x45, 0x46, 0xe2, 0xe8, 0x1f, 0x00, 0xae, 0xca, 0x8d, 0x4e, 0x69, 0xb2, 0x9f, 0xc6, 0xed, 0x97, 0x27, 0x34, 0x0d, 0x20, 0x9d, 0xf4, + 0x8c, 0xbc, 0x9b, 0xed, 0x3d, 0xc2, 0x00, 0x0c, 0x8c, 0x0c, 0xf4, 0x9c, 0x34, 0x33, 0x82, 0xfb, 0xf8, 0x6d, 0xf6, 0x86, 0xa8, 0x40, 0xb5, 0xca, 0x4e, 0x6b, 0xe9, 0xef, 0x2d, 0xa0, 0xaf, 0xee, + 0x08, 0xad, 0xc4, 0x48, 0xd3, 0xfb, 0x6f, 0x98, 0x18, 0x47, 0x56, 0x4d, 0x0a, 0xe5, 0xb3, 0x5b, 0x10, 0x7c, 0x3d, 0x7e, 0x6e, 0xb7, 0x71, 0xe7, 0xed, 0x8f, 0x43, 0xa7, 0x60, 0xe1, 0xaf, 0x8f, + 0x75, 0x9d, 0xaf, 0xb6, 0xf9, 0xd7, 0xa5, 0xb9, 0xcb, 0xe9, 0x79, 0x71, 0xf6, 0xe6, 0xb6, 0x69, 0xcc, 0x75, 0x31, 0x0b, 0xaf, 0xae, 0x7f, 0xd7, 0x6f, 0xfc, 0xb5, 0xf8, 0xc1, 0x75, 0xbf, 0xf1, + 0x16, 0x51, 0x83, 0x26, 0xef, 0x82, 0xc3, 0x18, 0x72, 0x63, 0xe2, 0x08, 0x3f, 0xdd, 0xcd, 0xfb, 0x7a, 0x5a, 0xfb, 0x5c, 0x2c, 0xb0, 0x83, 0x98, 0x58, 0xaf, 0xa1, 0x5c, 0xe8, 0x32, 0x28, 0x85, + 0x8d, 0x47, 0x13, 0x7f, 0x0a, 0x60, 0x6e, 0xd7, 0xb3, 0xe9, 0x2d, 0x1e, 0x73, 0x99, 0x9e, 0x59, 0xec, 0x1c, 0x33, 0x0f, 0x99, 0x3a, 0xe9, 0x09, 0xf5, 0xe2, 0x80, 0xa2, 0x92, 0x6e, 0x07, 0x9c, + 0x36, 0x2e, 0x72, 0x34, 0x47, 0xcc, 0xf5, 0x6d, 0x0f, 0xc2, 0x6f, 0x23, 0x60, 0x17, 0xcd, 0xc5, 0xf1, 0x5b, 0x6a, 0xde, 0x69, 0x19, 0x4e, 0xbd, 0x14, 0x26, 0x6b, 0xa5, 0x8f, 0x0b, 0xc5, 0xf1, + 0x9a, 0xf5, 0xa7, 0xac, 0x8a, 0x0c, 0x1d, 0x6c, 0xcc, 0xbb, 0x47, 0x31, 0x8e, 0xeb, 0xee, 0xe6, 0x6d, 0x29, 0x74, 0xff, 0x11, 0x47, 0xe9, 0x7c, 0x77, 0xa0, 0x51, 0x74, 0xc4, 0x73, 0x1a, 0x72, + 0x02, 0x07, 0xf3, 0x8e, 0x88, 0x93, 0x86, 0x13, 0x19, 0xb5, 0xb3, 0x58, 0x22, 0x93, 0xd9, 0x0c, 0x5a, 0x2c, 0x4d, 0x6e, 0x05, 0xa7, 0xb9, 0x39, 0x5a, 0x6c, 0x7d, 0x77, 0x61, 0x15, 0xeb, 0x34, + 0x5c, 0xa1, 0x59, 0x7c, 0xd0, 0x32, 0xc9, 0xe8, 0x2e, 0x0c, 0x77, 0xa3, 0x99, 0x62, 0x76, 0xd8, 0xf1, 0x71, 0x6f, 0x29, 0x20, 0xab, 0x83, 0x44, 0xa7, 0x11, 0x3a, 0x4d, 0x16, 0xcc, 0x26, 0x1a, + 0xee, 0xc8, 0xb4, 0xfc, 0x81, 0xa2, 0xfb, 0xe3, 0xae, 0x93, 0xfb, 0xc3, 0xc8, 0xc5, 0xc7, 0x0a, 0x9a, 0xe7, 0xda, 0x4a, 0xa2, 0xb6, 0xa2, 0x58, 0xe1, 0x84, 0x0f, 0x08, 0x44, 0x35, 0xeb, 0x7d, + 0x3f, 0x27, 0x50, 0xe1, 0x84, 0x0d, 0x3d, 0x0a, 0x27, 0x04, 0x1b, 0x18, 0xcf, 0xd1, 0xbf, 0xdd, 0xa0, 0xac, 0xc0, 0xfa, 0xb2, 0xc2, 0xfa, 0x2c, 0x9b, 0x8e, 0x94, 0xb1, 0x32, 0xe1, 0x0f, 0xdd, + 0x7a, 0x56, 0xf6, 0x31, 0xca, 0xdc, 0x3a, 0x08, 0x3f, 0x38, 0x88, 0xd3, 0xc2, 0xd0, 0xa7, 0x91, 0xe1, 0xa4, 0x13, 0xdd, 0x3f, 0xc8, 0x81, 0xea, 0x0d, 0x34, 0xcc, 0x8e, 0x86, 0x9b, 0x5d, 0xe0, + 0xcd, 0x00, 0x7e, 0xba, 0x3a, 0xc8, 0xa9, 0x52, 0xdb, 0x38, 0xb6, 0xd9, 0x8a, 0x43, 0x6b, 0x1b, 0xa9, 0x71, 0x4b, 0x45, 0x79, 0x0e, 0x02, 0xdc, 0x51, 0x33, 0x97, 0xa9, 0xb2, 0xb7, 0x5a, 0xec, + 0xaa, 0xb7, 0xd4, 0x95, 0x80, 0x8e, 0x73, 0x23, 0x37, 0x40, 0xdf, 0xd1, 0x92, 0x30, 0x53, 0xd2, 0xfd, 0x87, 0x94, 0x6d, 0xe5, 0x76, 0x35, 0xd8, 0xbb, 0xba, 0xf4, 0x2c, 0x65, 0xf3, 0xe7, 0xae, + 0xfe, 0xd7, 0x94, 0xcd, 0x16, 0xee, 0x3e, 0x54, 0x1f, 0x4a, 0x02, 0x28, 0x6c, 0x64, 0x69, 0x16, 0x00, 0x2e, 0x05, 0x94, 0x42, 0x04, 0xa9, 0xaa, 0x8d, 0xf9, 0x99, 0xb2, 0x28, 0x58, 0xce, 0x0e, + 0xdd, 0x80, 0xec, 0xf7, 0xbc, 0x4e, 0x91, 0x47, 0x25, 0x8f, 0xae, 0xd9, 0x05, 0x97, 0xf5, 0x9c, 0x5e, 0x16, 0x27, 0x34, 0xd7, 0xcf, 0xea, 0x5d, 0x7f, 0xaa, 0xd7, 0x24, 0x36, 0x61, 0xf6, 0x07, + 0x43, 0xa3, 0xb8, 0x5d, 0xae, 0xa1, 0x6e, 0x18, 0x90, 0x52, 0x3b, 0x12, 0xfd, 0x4f, 0xca, 0xcf, 0xbc, 0x43, 0xe1, 0xff, 0xa1, 0x09, 0x98, 0x8f, 0x71, 0xa0, 0x2a, 0x9e, 0x12, 0x68, 0x86, 0x0e, + 0x7e, 0x17, 0x29, 0x7d, 0xcd, 0xe9, 0xb9, 0x06, 0x0d, 0x81, 0x37, 0x17, 0xda, 0x38, 0x3e, 0x08, 0xe8, 0xa8, 0xcb, 0xb9, 0xaf, 0xa4, 0x09, 0xb5, 0x0f, 0x8c, 0xfe, 0x9e, 0xb4, 0x78, 0x3c, 0x98, + 0xce, 0x1d, 0xe4, 0x90, 0xa1, 0xda, 0x0f, 0xc3, 0x53, 0xaa, 0x92, 0x1a, 0x24, 0x7e, 0x32, 0x25, 0xef, 0x7f, 0x24, 0xf1, 0x42, 0x38, 0xf8, 0x03, 0x6a, 0xf3, 0x7d, 0xef, 0xc7, 0x60, 0x03, 0xeb, + 0x39, 0xbd, 0xbb, 0x7c, 0xa4, 0xec, 0xbc, 0x61, 0x40, 0x67, 0xf8, 0x62, 0xad, 0x4e, 0x87, 0x6c, 0x05, 0xa8, 0x04, 0xc0, 0xf3, 0x56, 0x31, 0xc7, 0x8b, 0x24, 0xe5, 0xe8, 0x42, 0x2d, 0x12, 0xd5, + 0x91, 0xc6, 0x51, 0x4a, 0x99, 0x3c, 0xb7, 0xdc, 0xbb, 0x7b, 0x2e, 0xa9, 0x48, 0xd7, 0x81, 0x93, 0xd5, 0xd8, 0x65, 0xe1, 0x7d, 0xad, 0x8a, 0xc6, 0x6c, 0x52, 0xd6, 0x87, 0x98, 0x76, 0xaa, 0x28, + 0xc4, 0x91, 0xd8, 0xd8, 0x5c, 0xc5, 0xed, 0x3e, 0xb5, 0xd6, 0xff, 0xe7, 0x63, 0x66, 0x5c, 0x4d, 0x9f, 0x87, 0xd9, 0x21, 0xed, 0xb4, 0x9b, 0x69, 0x1c, 0x5d, 0x8c, 0x5f, 0x9f, 0xb3, 0xee, 0xff, + 0x7c, 0xff, 0x98, 0x48, 0xc9, 0x12, 0x23, 0x0c, 0xbe, 0x7d, 0x4e, 0x59, 0x96, 0x6f, 0xef, 0xf7, 0x35, 0x0f, 0xfb, 0xe9, 0x33, 0xb4, 0x30, 0x48, 0x73, 0x2f, 0x3b, 0x7e, 0xf6, 0x77, 0x8f, 0x39, + 0x81, 0x3d, 0x2d, 0xc5, 0xbe, 0x3b, 0x51, 0x5f, 0x84, 0xc7, 0xff, 0xf7, 0x1b, 0x76, 0x72, 0x02, 0x25, 0xa9, 0x40, 0xe3, 0x90, 0x19, 0xc1, 0x91, 0x85, 0xbe, 0x13, 0x1c, 0x2f, 0xcc, 0x9d, 0x5b, + 0xe8, 0x47, 0xf6, 0xba, 0xbd, 0xd6, 0x36, 0x4e, 0x87, 0xec, 0x5c, 0xda, 0xee, 0x48, 0x80, 0xc4, 0xf5, 0x89, 0x7e, 0x6d, 0x0b, 0x29, 0xa4, 0x75, 0x00, 0x72, 0x15, 0x64, 0x2a, 0x47, 0x08, 0xfb, + 0xb9, 0x39, 0x2f, 0x15, 0x8d, 0xe6, 0xc2, 0x9e, 0xdf, 0x91, 0xcd, 0x15, 0x23, 0x53, 0x99, 0x4c, 0x10, 0x3b, 0x6d, 0xb0, 0xee, 0xd6, 0x3d, 0x03, 0x57, 0xb7, 0xa9, 0x2e, 0x0d, 0x7b, 0x7b, 0x20, + 0xed, 0x2c, 0x88, 0x32, 0x9d, 0xf2, 0x6b, 0x5d, 0x4e, 0x4a, 0x38, 0xfb, 0x0f, 0x88, 0x29, 0xa9, 0x4e, 0x90, 0x25, 0xc6, 0xc3, 0x95, 0x39, 0xe4, 0xa5, 0x2c, 0xd3, 0x33, 0xd0, 0x13, 0x42, 0x9b, + 0xc3, 0x53, 0x3c, 0xf9, 0x99, 0x24, 0xe2, 0xfc, 0xb5, 0xe6, 0x13, 0xe5, 0x5e, 0x34, 0xe2, 0x44, 0x99, 0x74, 0xba, 0xe3, 0x6a, 0x9c, 0xf1, 0xc8, 0xc6, 0x9d, 0x2f, 0xa4, 0x6f, 0x05, 0x6c, 0x78, + 0x30, 0x1e, 0x47, 0x42, 0x5e, 0x49, 0x1c, 0x68, 0x20, 0x1e, 0x5f, 0xff, 0xf8, 0x1f, 0xc4, 0xdb, 0xa5, 0x0b, 0x18, 0x0c, 0x9e, 0x2f, 0x3b, 0xf3, 0x41, 0x6d, 0xa1, 0xa1, 0x1e, 0xf5, 0xe6, 0x24, + 0xaa, 0x32, 0xe5, 0x62, 0x52, 0xac, 0x8c, 0x01, 0x0b, 0x6c, 0xd4, 0xb9, 0xeb, 0x56, 0x55, 0xdf, 0x1e, 0xa4, 0x7c, 0xa0, 0xd1, 0x65, 0x04, 0xf9, 0x30, 0x60, 0x4b, 0xa9, 0xb0, 0x2a, 0x56, 0x06, + 0x36, 0x44, 0xd7, 0x30, 0x47, 0x14, 0x25, 0x1c, 0x30, 0xfa, 0x14, 0xb1, 0xd9, 0x71, 0x28, 0x87, 0x84, 0xcf, 0x1b, 0xf9, 0xe8, 0x19, 0x0f, 0x3c, 0x71, 0x96, 0xce, 0x99, 0x62, 0xf7, 0xe2, 0x22, + 0x8a, 0x6f, 0x78, 0x9a, 0xf2, 0x9e, 0x0a, 0x77, 0x9d, 0xc3, 0xf9, 0x3c, 0xa2, 0x72, 0xc4, 0xcc, 0xd9, 0xe5, 0x46, 0xbf, 0x66, 0x93, 0x5c, 0x65, 0x5f, 0x7d, 0x71, 0xd3, 0x32, 0x23, 0xf1, 0xc1, + 0xd4, 0xa9, 0x3f, 0xc3, 0x2e, 0xd7, 0xc3, 0x77, 0xfa, 0xca, 0x5f, 0x0c, 0x97, 0x8e, 0x6e, 0xa4, 0x19, 0xe8, 0x39, 0xef, 0x61, 0x1b, 0xec, 0x37, 0x3d, 0xbc, 0x3b, 0x92, 0xfc, 0x67, 0xfe, 0xc7, + 0x0f, 0x3b, 0x6f, 0x9f, 0x98, 0x2b, 0xf8, 0x51, 0x82, 0x00, 0xf1, 0x92, 0x79, 0xf0, 0x28, 0x41, 0x80, 0x78, 0x6e, 0x16, 0x1c, 0x19, 0x5a, 0xdd, 0x91, 0xa6, 0x4b, 0x90, 0xd3, 0x95, 0x04, 0xdb, + 0x2b, 0x84, 0x77, 0xfb, 0x22, 0x27, 0xe5, 0xe3, 0xbe, 0x51, 0xc7, 0xbc, 0x9e, 0x74, 0xab, 0xbe, 0x3e, 0x32, 0x8a, 0x2e, 0xe7, 0xc4, 0xc9, 0x66, 0x58, 0x2e, 0x3c, 0xd5, 0x67, 0x44, 0x61, 0x18, + 0x11, 0xca, 0x1e, 0x35, 0x71, 0x78, 0xe6, 0xd3, 0xe3, 0x65, 0xbf, 0x12, 0x50, 0x3f, 0x3e, 0xec, 0x07, 0x64, 0x60, 0xed, 0x87, 0x53, 0x04, 0x31, 0x21, 0xef, 0xd9, 0xda, 0x4e, 0x6b, 0xb2, 0xfd, + 0x08, 0xc1, 0xff, 0x8b, 0x82, 0x27, 0x3f, 0x15, 0x11, 0xff, 0x65, 0xe2, 0x29, 0x77, 0xc8, 0x76, 0x9d, 0xe6, 0x76, 0x8f, 0x78, 0xf4, 0x4b, 0xc4, 0xbb, 0x80, 0x0b, 0x81, 0x97, 0x67, 0x20, 0xdd, + 0x8e, 0x90, 0xc2, 0xc2, 0xdd, 0xd5, 0xda, 0x46, 0x9c, 0x76, 0x61, 0xa3, 0xec, 0x0e, 0xa3, 0x1a, 0x16, 0x0e, 0xd1, 0xae, 0x5f, 0x94, 0x16, 0x59, 0xb9, 0x15, 0x22, 0x0e, 0xb0, 0x43, 0x66, 0x84, + 0x71, 0x4d, 0xe2, 0xf8, 0x9a, 0x0d, 0xa1, 0xf9, 0xcc, 0x0a, 0x12, 0x04, 0x1a, 0x0c, 0x32, 0xc0, 0xd1, 0x30, 0x67, 0xbc, 0xac, 0x25, 0xba, 0x97, 0x63, 0x4b, 0x5d, 0x40, 0xf0, 0x85, 0x52, 0x06, + 0xeb, 0x95, 0x3f, 0xe8, 0x91, 0x3f, 0x5e, 0x0e, 0xbe, 0x83, 0xb1, 0xc7, 0x79, 0x7f, 0x7f, 0x1e, 0xeb, 0x3f, 0x78, 0xc6, 0xa9, 0x5b, 0xf3, 0xbd, 0x91, 0xb6, 0xd3, 0xa3, 0xae, 0x7c, 0x9f, 0x00, + 0x72, 0x20, 0x65, 0xd3, 0xc5, 0xa6, 0xe2, 0x3a, 0xb1, 0xa8, 0x18, 0xee, 0x1a, 0xe3, 0xfa, 0x85, 0xcd, 0xf2, 0x9a, 0xc7, 0xeb, 0x4e, 0xbd, 0x53, 0xc6, 0xab, 0x7c, 0xd8, 0xa5, 0xb1, 0xf9, 0xc4, + 0x55, 0xa9, 0x60, 0x91, 0x0f, 0x02, 0x5d, 0x67, 0x87, 0x83, 0x02, 0xb6, 0xf7, 0x00, 0xbf, 0xa3, 0x18, 0xa1, 0xeb, 0xa5, 0x1b, 0x83, 0xc7, 0x57, 0x86, 0x45, 0xf6, 0xd6, 0xe4, 0x56, 0x7a, 0x36, + 0x3d, 0xfe, 0x1a, 0xce, 0x6d, 0x91, 0xcb, 0xfa, 0x9a, 0x69, 0xf2, 0x5d, 0x2e, 0x6b, 0x4b, 0x43, 0xa5, 0x5e, 0xd5, 0xc4, 0x98, 0x03, 0x32, 0x2b, 0xce, 0x72, 0xce, 0x15, 0xec, 0x72, 0x64, 0x11, + 0x79, 0x7f, 0xbd, 0xc6, 0xf4, 0x2c, 0x96, 0x3b, 0x95, 0x34, 0xf6, 0xe4, 0xb5, 0x19, 0xe3, 0x23, 0x18, 0x81, 0x78, 0x62, 0xa6, 0xb8, 0xc4, 0x6a, 0xe8, 0x52, 0xeb, 0x2a, 0x91, 0xa6, 0xe3, 0xa2, + 0x56, 0xca, 0xc5, 0xda, 0xe3, 0xa3, 0xa9, 0xda, 0x8d, 0x54, 0x93, 0x83, 0x7b, 0x3a, 0x59, 0x8d, 0x35, 0x00, 0x31, 0x9e, 0xa1, 0xb9, 0x7d, 0x2e, 0x2b, 0x7d, 0x6b, 0x6f, 0x7c, 0x97, 0xcb, 0xfa, + 0xb5, 0x93, 0xe7, 0x75, 0x2e, 0xeb, 0x83, 0x98, 0xfd, 0x5f, 0x47, 0xf4, 0x6f, 0xd3, 0x58, 0xc9, 0x97, 0xe6, 0xdb, 0xa3, 0x34, 0x56, 0xb2, 0xdd, 0xac, 0xea, 0xe6, 0x05, 0xbf, 0x4c, 0x96, 0xa6, + 0x24, 0xee, 0xc4, 0x91, 0x96, 0xa9, 0x73, 0x84, 0x87, 0x76, 0x83, 0xe5, 0x1c, 0xa1, 0x08, 0x72, 0x50, 0x69, 0xb3, 0xd4, 0xa2, 0xd4, 0x8e, 0xaa, 0xaf, 0x3b, 0x5c, 0x1e, 0xe7, 0x09, 0x6e, 0x15, + 0xa4, 0xc2, 0xc7, 0xc3, 0xad, 0x62, 0x93, 0x94, 0x4c, 0x8f, 0xfc, 0x05, 0xb5, 0xe9, 0xd5, 0x84, 0xb4, 0xd6, 0xa6, 0x99, 0x67, 0x6e, 0xd0, 0x44, 0xee, 0xe5, 0x56, 0x46, 0x3e, 0xcb, 0x21, 0x68, + 0x9d, 0xc6, 0x4a, 0xfc, 0x75, 0x04, 0x4a, 0x14, 0xcd, 0x00, 0x8d, 0x43, 0xa4, 0x04, 0xe9, 0xe3, 0xc4, 0x8e, 0x66, 0xc5, 0xe9, 0x05, 0x1f, 0xe7, 0x1a, 0xf8, 0xd1, 0x57, 0xb8, 0xbe, 0x72, 0xaa, + 0x3a, 0x6c, 0x11, 0xa1, 0x70, 0xd8, 0x7c, 0x36, 0xe4, 0xfa, 0x56, 0x32, 0xdc, 0x52, 0x43, 0xb4, 0xe8, 0x8d, 0x20, 0xe2, 0x10, 0xd5, 0x30, 0x55, 0x2f, 0x86, 0x0c, 0x0c, 0x2f, 0xa3, 0xdc, 0x8a, + 0x6d, 0x7f, 0x97, 0xad, 0x7d, 0x61, 0x4a, 0x12, 0x08, 0xed, 0xb3, 0xf9, 0x5c, 0x08, 0xa7, 0xbb, 0xbe, 0xa7, 0xf7, 0x18, 0x0f, 0xb6, 0x10, 0x9a, 0xca, 0xcd, 0xb0, 0xd6, 0x95, 0xa1, 0xb5, 0xe1, + 0xb5, 0x5d, 0x5f, 0x25, 0x91, 0x78, 0xe0, 0x3c, 0x4b, 0x6a, 0x7d, 0x4c, 0x9e, 0x2f, 0xd1, 0xaa, 0x3b, 0x91, 0x62, 0x2d, 0x0c, 0x34, 0x25, 0x03, 0x7d, 0xa5, 0xe9, 0xa6, 0x0b, 0x5f, 0x65, 0x2e, + 0x3e, 0xa1, 0xc7, 0x23, 0x4f, 0x13, 0xbb, 0xda, 0x5a, 0xfe, 0x47, 0x54, 0x48, 0xcf, 0xc8, 0x4f, 0x1b, 0x3d, 0xd3, 0x22, 0x08, 0xa8, 0xd2, 0xb9, 0x0f, 0x4c, 0x90, 0x79, 0x2d, 0x60, 0x1b, 0x6e, + 0x51, 0x17, 0xb6, 0x4f, 0x5a, 0xa3, 0x1a, 0xa9, 0xcc, 0xa5, 0xca, 0x64, 0xe4, 0x6e, 0xe9, 0x69, 0x3d, 0xbe, 0x5b, 0xa4, 0x7e, 0xcc, 0xca, 0x72, 0xbf, 0xc4, 0xc9, 0x9a, 0x44, 0x49, 0x6f, 0xed, + 0x76, 0x5c, 0xa4, 0xea, 0xcd, 0x36, 0x18, 0x36, 0x24, 0x86, 0x80, 0xc7, 0x48, 0x91, 0x2c, 0xcc, 0x90, 0x3d, 0xed, 0x01, 0x14, 0x3d, 0x54, 0xe0, 0xd7, 0x51, 0x6e, 0x3a, 0x9e, 0x07, 0x26, 0x4a, + 0x60, 0x19, 0xef, 0x16, 0xd6, 0xef, 0x65, 0x82, 0x7e, 0x43, 0x81, 0xdc, 0x34, 0x8d, 0x04, 0x34, 0x93, 0xd0, 0xff, 0x6e, 0x36, 0xfc, 0x9c, 0x0c, 0x9f, 0x70, 0x8f, 0xb4, 0xf8, 0x3c, 0x6b, 0x5b, + 0x7a, 0x2b, 0x48, 0xda, 0xb6, 0xb7, 0x52, 0x59, 0x3e, 0xeb, 0x85, 0x94, 0x6a, 0xc7, 0xbd, 0x94, 0x24, 0x48, 0x78, 0x58, 0xe9, 0xf8, 0x56, 0x09, 0x0b, 0xd9, 0x9b, 0x42, 0xfb, 0xce, 0x1a, 0xb3, + 0xdd, 0xf5, 0xaa, 0x0f, 0xd5, 0xe5, 0x86, 0xe2, 0x99, 0xb5, 0xbe, 0xe0, 0x71, 0x6b, 0x94, 0x41, 0x6a, 0x5d, 0x2e, 0x3a, 0x82, 0x3a, 0x27, 0xe2, 0x50, 0x05, 0xfa, 0x84, 0x9b, 0xa7, 0x72, 0xaa, + 0xc2, 0x3b, 0x89, 0x47, 0x7f, 0x6c, 0x4e, 0x69, 0x8a, 0x66, 0x1b, 0xcd, 0xa2, 0x5a, 0x62, 0xc4, 0xf9, 0xc9, 0xff, 0xbc, 0x2f, 0xc5, 0x5f, 0x89, 0x37, 0x7d, 0x81, 0x7e, 0x74, 0x1e, 0x6e, 0xaf, + 0x81, 0x64, 0xbb, 0x78, 0xd3, 0xd4, 0xc5, 0xb4, 0xee, 0x60, 0xc6, 0xc6, 0x53, 0x79, 0x4b, 0xcd, 0x6b, 0x12, 0x5f, 0x05, 0x15, 0x3a, 0xd8, 0x75, 0x65, 0xd1, 0x73, 0xa4, 0x45, 0x6c, 0xaa, 0xc6, + 0x2c, 0xb1, 0xba, 0x12, 0x52, 0xf2, 0x5d, 0xc7, 0xde, 0xf9, 0xec, 0x2a, 0x48, 0x14, 0x26, 0x1b, 0x67, 0xbc, 0x36, 0x98, 0xe3, 0x87, 0x9a, 0x2a, 0xfb, 0xc0, 0x24, 0x1c, 0xb3, 0x40, 0x9a, 0xf6, + 0xe5, 0xa2, 0x20, 0x18, 0xab, 0xdf, 0x19, 0x59, 0xaf, 0xab, 0xf0, 0x26, 0x87, 0x02, 0x4c, 0x8c, 0xc6, 0x25, 0x36, 0x3e, 0x84, 0xc6, 0x55, 0x22, 0x81, 0x65, 0x64, 0x60, 0x9a, 0x25, 0x86, 0xe2, + 0xbf, 0xcb, 0x7d, 0xe4, 0x4e, 0x32, 0x42, 0x83, 0x10, 0x30, 0x35, 0x7c, 0x25, 0xc8, 0x1c, 0xed, 0xec, 0x95, 0xdc, 0x88, 0x9f, 0xbd, 0x51, 0x15, 0xf7, 0x95, 0xbf, 0x17, 0x96, 0x46, 0xa2, 0x29, + 0xa9, 0x71, 0x5b, 0x52, 0xff, 0x7f, 0x2e, 0xa7, 0xcc, 0x39, 0x27, 0xf7, 0xdd, 0xb5, 0xff, 0xea, 0xf6, 0x9c, 0x3f, 0xc4, 0x73, 0xf6, 0x97, 0x1f, 0xf3, 0x57, 0x4c, 0xc9, 0xaf, 0x5c, 0x71, 0x35, + 0x7c, 0x85, 0xb4, 0xfb, 0x81, 0x81, 0x57, 0x8c, 0xc8, 0x4f, 0xb0, 0x10, 0x78, 0x71, 0xd2, 0xb6, 0x30, 0x26, 0x60, 0xfa, 0x40, 0x1f, 0x49, 0xba, 0xf2, 0x9a, 0xcd, 0xa1, 0x88, 0x4a, 0xdc, 0xda, + 0xea, 0x02, 0x3b, 0x15, 0xf7, 0xcc, 0xdd, 0x36, 0x89, 0x3c, 0x4a, 0x21, 0xd7, 0xfe, 0x38, 0x59, 0xd1, 0x65, 0xbf, 0x33, 0x42, 0x58, 0xbe, 0x98, 0x41, 0x52, 0x39, 0x13, 0xe5, 0x61, 0x30, 0xf5, + 0x4a, 0x75, 0xb9, 0xdf, 0x91, 0x7a, 0x91, 0xf5, 0x47, 0x75, 0x5f, 0x58, 0x54, 0xd2, 0x56, 0x9d, 0x84, 0x4b, 0x69, 0x36, 0x8f, 0x5e, 0x97, 0x9f, 0x51, 0xee, 0x5f, 0xb6, 0x75, 0x7f, 0x9d, 0x4c, + 0x1f, 0xbf, 0xf8, 0x0f, 0x8a, 0x04, 0x3d, 0x21, 0xfe, 0x17, 0x6e, 0xbe, 0xc7, 0x00, 0xaf, 0xa5, 0x51, 0x5e, 0x83, 0x86, 0xc0, 0x9b, 0x0b, 0x6d, 0x53, 0x29, 0xb3, 0x58, 0xdc, 0x26, 0x0b, 0x8a, + 0x0e, 0x85, 0x69, 0x8f, 0xc2, 0x44, 0xe1, 0xc0, 0xe3, 0x3d, 0x61, 0x22, 0xa5, 0x52, 0x58, 0x6e, 0x4c, 0xda, 0xe5, 0xc3, 0x70, 0xd8, 0xb1, 0xa8, 0xc3, 0x4c, 0x29, 0xe6, 0x4b, 0x0a, 0x26, 0xe7, + 0xa4, 0xba, 0x97, 0xc6, 0x24, 0xb7, 0x43, 0x97, 0x06, 0x25, 0xe5, 0x7b, 0x45, 0x4e, 0x73, 0xef, 0xa0, 0x60, 0x70, 0x29, 0x51, 0xea, 0x1e, 0x8e, 0x7c, 0x7c, 0xeb, 0x0c, 0x7f, 0xb7, 0x20, 0xa7, + 0xdd, 0xac, 0xf3, 0x3c, 0x50, 0x75, 0x02, 0xfd, 0xa1, 0x1a, 0x7c, 0xc5, 0x1a, 0xf9, 0x80, 0xda, 0x48, 0xf6, 0xf7, 0xe3, 0x26, 0xf2, 0xdd, 0xc2, 0x26, 0xa1, 0xa6, 0x40, 0x5f, 0x65, 0x1d, 0x3b, + 0x61, 0x88, 0xcd, 0x40, 0xed, 0xef, 0x8c, 0x54, 0xcb, 0x4a, 0x7f, 0xc9, 0x2b, 0x06, 0x99, 0x4c, 0x9d, 0x51, 0xed, 0xd7, 0x88, 0xa3, 0x25, 0xc6, 0x66, 0x0c, 0xc0, 0x4a, 0x97, 0x9a, 0x8c, 0xcd, + 0x3c, 0xb6, 0x7b, 0x69, 0x88, 0x2e, 0x3b, 0x81, 0x16, 0x69, 0xfd, 0xac, 0x16, 0xa4, 0xac, 0xde, 0x9a, 0xa8, 0x34, 0x18, 0xe4, 0xc6, 0x66, 0x3c, 0x58, 0xee, 0xd2, 0x38, 0xe9, 0xb6, 0x5b, 0x71, + 0x3e, 0xef, 0xb3, 0x70, 0x46, 0xc9, 0x9d, 0x3c, 0xac, 0xa3, 0x90, 0x70, 0x82, 0xa3, 0xb3, 0x99, 0x3a, 0xda, 0x77, 0x32, 0xf1, 0xd5, 0xa9, 0xd3, 0x3a, 0x89, 0xe3, 0x88, 0xd9, 0xd4, 0xc9, 0xbe, + 0xb1, 0x24, 0x5f, 0xd3, 0xce, 0xef, 0x50, 0xdf, 0x69, 0xd7, 0x1c, 0xb7, 0x2d, 0x0e, 0x9d, 0xd1, 0x8c, 0xdb, 0x4d, 0xb7, 0x85, 0xbc, 0x00, 0xd6, 0x23, 0x6e, 0x35, 0x42, 0x10, 0x7b, 0xc8, 0x4a, + 0xbd, 0x82, 0xc2, 0x77, 0x4b, 0x92, 0xda, 0xad, 0x1c, 0x62, 0x3c, 0xee, 0x8b, 0x9b, 0x51, 0x3c, 0x41, 0x31, 0x22, 0x65, 0x7c, 0x77, 0x8b, 0x03, 0xf1, 0xa1, 0x23, 0xe4, 0x85, 0x97, 0x12, 0x4e, + 0x51, 0x89, 0x3d, 0x51, 0xcb, 0x0e, 0x38, 0x79, 0x90, 0x26, 0x12, 0xa6, 0x2c, 0xf3, 0x1e, 0x95, 0xa6, 0xca, 0xb3, 0xc8, 0xff, 0xb3, 0x4c, 0x80, 0x56, 0xa8, 0xfc, 0x5c, 0x02, 0xb8, 0xaf, 0x5c, + 0x5e, 0x69, 0xec, 0xf0, 0x01, 0xb5, 0x41, 0xe5, 0xfb, 0x71, 0xdb, 0xc6, 0x0e, 0x13, 0x94, 0x5e, 0x2c, 0x19, 0x84, 0x82, 0x83, 0x72, 0xb3, 0x20, 0xb1, 0x95, 0x9b, 0x79, 0xbd, 0x69, 0x0f, 0xd3, + 0x3d, 0x5d, 0xea, 0x46, 0xca, 0x78, 0x2b, 0xef, 0xa7, 0x23, 0x24, 0x17, 0xfa, 0x66, 0x6d, 0x62, 0xc9, 0x3c, 0x9f, 0x19, 0xd6, 0x50, 0x19, 0x1a, 0x69, 0x65, 0x18, 0xc0, 0xee, 0x20, 0x01, 0x1b, + 0x72, 0x51, 0xcc, 0x39, 0x69, 0x4d, 0xae, 0x12, 0x7d, 0xaa, 0xcf, 0x9d, 0x39, 0x42, 0x60, 0xe5, 0xf8, 0x99, 0x61, 0xf3, 0x67, 0xa0, 0xf2, 0x9b, 0x00, 0x33, 0xfe, 0x52, 0x62, 0xc3, 0x75, 0x80, + 0x19, 0x6f, 0x97, 0xde, 0x10, 0xf2, 0x81, 0x6a, 0xf7, 0xab, 0xf9, 0x68, 0x1b, 0xad, 0x72, 0xa3, 0xa6, 0x1d, 0x46, 0xf0, 0xab, 0x9e, 0x82, 0x07, 0xaa, 0x8b, 0x8f, 0xa6, 0x52, 0x95, 0xdb, 0x1a, + 0x54, 0x56, 0x9d, 0xfd, 0x8e, 0x82, 0x36, 0xeb, 0x99, 0x56, 0x8e, 0xa6, 0x9d, 0x75, 0x97, 0x24, 0xe9, 0x59, 0x4e, 0xcf, 0xf7, 0x53, 0x0a, 0x80, 0x07, 0x14, 0xb9, 0x98, 0xcc, 0xa7, 0x46, 0x55, + 0x76, 0xd8, 0x48, 0x82, 0x49, 0xc4, 0xc1, 0x6f, 0x05, 0xf2, 0x7f, 0x7e, 0x34, 0x19, 0x69, 0xdb, 0x10, 0xef, 0x59, 0xd9, 0x5b, 0xf3, 0xf7, 0x47, 0x05, 0x6f, 0x9a, 0x1d, 0xee, 0x1d, 0x5d, 0x79, + 0xd4, 0x97, 0x16, 0x7b, 0xc3, 0x5f, 0x48, 0x51, 0x3a, 0x03, 0x6d, 0xa8, 0x7d, 0x3a, 0x04, 0x1b, 0x48, 0xcf, 0x09, 0xce, 0x65, 0x02, 0x66, 0x51, 0x6e, 0xce, 0x6e, 0xa5, 0x43, 0x7f, 0xbd, 0x10, + 0x67, 0x22, 0x53, 0xf5, 0x58, 0x14, 0x10, 0x47, 0x7e, 0xc6, 0xe4, 0x07, 0x49, 0x2a, 0x36, 0xde, 0x30, 0x0f, 0xa2, 0xf1, 0x68, 0x41, 0x4c, 0xb5, 0x04, 0xf6, 0x06, 0x18, 0x4c, 0x6a, 0x2c, 0xd5, + 0x67, 0x1d, 0x4a, 0xeb, 0x75, 0x61, 0xb3, 0xf6, 0x2b, 0x75, 0xb6, 0x1a, 0x79, 0x78, 0x76, 0x60, 0x46, 0xa1, 0xba, 0x47, 0xac, 0xc1, 0xf4, 0x99, 0xe8, 0xf9, 0x8e, 0x07, 0x3e, 0xea, 0x01, 0x7f, + 0xfd, 0xe3, 0x4b, 0xe3, 0x8e, 0x8f, 0x08, 0xc0, 0x71, 0xec, 0xd6, 0x3d, 0xf0, 0x42, 0x15, 0x8c, 0x94, 0xc4, 0x38, 0x05, 0xf6, 0xfe, 0xf1, 0xc5, 0x3f, 0x70, 0x52, 0xf0, 0x7d, 0x79, 0xfe, 0x9c, + 0x6e, 0xfc, 0x8f, 0xaf, 0x7b, 0xd9, 0x7f, 0x76, 0x6d, 0xfc, 0xc7, 0x97, 0xae, 0x8d, 0x5f, 0x8b, 0xf1, 0xfe, 0xf1, 0xc5, 0x81, 0x48, 0x0c, 0x45, 0xd7, 0x9d, 0x24, 0x7a, 0x1f, 0x25, 0x5e, 0x60, + 0xce, 0x3f, 0x4e, 0xfd, 0xb8, 0xbe, 0xfe, 0xee, 0x9c, 0x46, 0xf5, 0xb8, 0x85, 0x8c, 0x99, 0x1a, 0xc5, 0x79, 0x13, 0xfc, 0x7f, 0xa0, 0x2d, 0x93, 0xe8, 0x34, 0x07, 0x74, 0x02, 0xf3, 0x51, 0x5a, + 0xe3, 0x6b, 0xe6, 0xe1, 0x3b, 0xcc, 0x23, 0x3f, 0x9e, 0x8e, 0xda, 0x1a, 0x84, 0x44, 0xc6, 0x53, 0xbd, 0x2c, 0x91, 0x61, 0x11, 0x98, 0x4e, 0xfa, 0x42, 0x66, 0x67, 0xf1, 0xd4, 0xc5, 0xcd, 0x11, + 0x3a, 0x36, 0x54, 0x9a, 0x66, 0x71, 0xb6, 0x2b, 0xcf, 0x72, 0x94, 0x98, 0x70, 0xeb, 0x95, 0xb5, 0x1d, 0xc3, 0x5d, 0x6c, 0x9c, 0xe2, 0x33, 0x61, 0x10, 0x27, 0x01, 0x3c, 0x5e, 0x21, 0x1b, 0x58, + 0xb0, 0x11, 0x48, 0xa6, 0x4b, 0xb9, 0xde, 0xcd, 0x0e, 0xf1, 0x2a, 0xd9, 0x1a, 0x8c, 0x1a, 0xb2, 0x3f, 0xee, 0xa1, 0x75, 0xb9, 0x40, 0x7d, 0x1f, 0x29, 0xe8, 0x2b, 0x7a, 0xed, 0x0c, 0xf5, 0x88, + 0x96, 0xf3, 0x31, 0xd8, 0xc0, 0x7a, 0x8e, 0x98, 0x0a, 0xd7, 0x42, 0x41, 0xab, 0x3c, 0x6b, 0xc1, 0xea, 0x6b, 0x27, 0x70, 0x1d, 0x8e, 0xc9, 0xe7, 0xf4, 0x8c, 0x65, 0x51, 0x75, 0xe2, 0x56, 0x83, + 0x65, 0xd9, 0xf3, 0x67, 0x6a, 0x47, 0x1c, 0xce, 0x21, 0x49, 0x11, 0x57, 0x64, 0x6f, 0x35, 0xdd, 0x6a, 0xcb, 0x1d, 0x94, 0x92, 0x6b, 0x77, 0x20, 0x70, 0x64, 0x4f, 0x5c, 0xf4, 0x14, 0x43, 0xda, + 0x0d, 0xd9, 0x1d, 0x3c, 0x10, 0x07, 0x0b, 0xc2, 0x35, 0x85, 0x72, 0xf6, 0x2c, 0x08, 0xdb, 0x5a, 0xaf, 0xbd, 0x2a, 0x45, 0x5f, 0x76, 0x7c, 0x2e, 0x6b, 0x32, 0xee, 0x51, 0x08, 0x7e, 0x29, 0x53, + 0xec, 0x13, 0xec, 0x3b, 0x89, 0x4e, 0x27, 0x20, 0xdc, 0x2e, 0x57, 0x8c, 0x92, 0x2c, 0x74, 0x9c, 0x18, 0x11, 0xb2, 0x80, 0x00, 0x09, 0xeb, 0x69, 0x86, 0x23, 0x67, 0x92, 0xc6, 0xcd, 0x36, 0x07, + 0xbb, 0x5b, 0x30, 0x25, 0xd0, 0x9b, 0x9b, 0x08, 0x42, 0xa2, 0x05, 0x9e, 0x3a, 0xfb, 0x71, 0x52, 0x84, 0xae, 0x30, 0xec, 0xc7, 0xdb, 0x8c, 0x96, 0x46, 0x6b, 0x5b, 0xa1, 0x57, 0xde, 0xb0, 0x93, + 0x58, 0x2b, 0x98, 0x31, 0x36, 0xb3, 0x2a, 0x93, 0x3b, 0xd0, 0xb2, 0xde, 0xc5, 0xde, 0xaa, 0x65, 0x5e, 0x6e, 0xa8, 0xba, 0x86, 0x96, 0x81, 0x4a, 0x9a, 0x9e, 0x13, 0x36, 0xbe, 0xaa, 0xcf, 0xdb, + 0xbc, 0x0a, 0xf4, 0x85, 0x0d, 0x21, 0xee, 0x52, 0xfd, 0xb9, 0x64, 0xfa, 0xe8, 0x06, 0xd1, 0x3e, 0xb9, 0xf7, 0x5c, 0x57, 0x73, 0x7f, 0x02, 0xbe, 0x64, 0x11, 0x1d, 0x21, 0x36, 0x94, 0x0d, 0x03, + 0xa3, 0x4d, 0xc2, 0x27, 0x02, 0x0e, 0xb0, 0xce, 0x24, 0x40, 0xf6, 0xe6, 0x30, 0x04, 0x38, 0xb9, 0x94, 0x98, 0x5d, 0x57, 0xec, 0x87, 0xac, 0x33, 0x94, 0x10, 0xba, 0x7d, 0xb6, 0x3a, 0xfc, 0xd6, + 0xca, 0xa7, 0xbc, 0x8d, 0x81, 0xfd, 0x89, 0x8e, 0xe5, 0x15, 0xe8, 0x0f, 0x0c, 0x9c, 0x2f, 0xb4, 0x71, 0x31, 0x11, 0x10, 0xd6, 0xab, 0xed, 0x74, 0xd1, 0x3d, 0x2c, 0x4d, 0x19, 0x2a, 0x12, 0x8f, + 0x1d, 0x51, 0xcb, 0x5c, 0x94, 0x46, 0x04, 0xb9, 0x49, 0x5f, 0xd5, 0xf6, 0xbe, 0xe3, 0x3b, 0xda, 0xd7, 0xb0, 0x5f, 0x9b, 0x12, 0x36, 0xcd, 0x0b, 0x73, 0xfd, 0x43, 0xdb, 0x3d, 0x72, 0x3e, 0x5e, + 0x42, 0xd5, 0x19, 0xee, 0x09, 0x4f, 0xe7, 0xb3, 0xc6, 0x01, 0x69, 0x61, 0x41, 0xcb, 0x6e, 0xaf, 0xef, 0x1e, 0x60, 0x66, 0x1c, 0x38, 0x21, 0xbd, 0xe8, 0x71, 0xc8, 0xb2, 0xe6, 0xa8, 0xc1, 0xb0, + 0x8b, 0x20, 0x74, 0xcd, 0xee, 0x61, 0x5c, 0xa8, 0x49, 0x85, 0x13, 0x04, 0xc7, 0x01, 0x70, 0x48, 0x2e, 0xb6, 0xc4, 0x64, 0x66, 0x05, 0x08, 0x87, 0x7b, 0x4b, 0x62, 0xec, 0x52, 0xc3, 0x50, 0x67, + 0x55, 0xdd, 0x98, 0x2f, 0x48, 0x7d, 0x4b, 0xd3, 0x79, 0x30, 0x84, 0x49, 0x49, 0xc3, 0xfc, 0x7d, 0x5b, 0x0b, 0xfa, 0xb4, 0xd3, 0xfc, 0x3f, 0x9a, 0x4e, 0x6d, 0x57, 0x65, 0x4c, 0x79, 0xe6, 0x9c, + 0x62, 0x95, 0x4d, 0x6f, 0xe8, 0xab, 0xba, 0xaf, 0x3c, 0x3f, 0x55, 0x67, 0xfd, 0x83, 0x6e, 0x2a, 0xa3, 0x5a, 0xa0, 0xfe, 0xa6, 0xf7, 0xc4, 0x23, 0xb3, 0xe1, 0x05, 0xf9, 0x7b, 0x09, 0xf9, 0x88, + 0xfe, 0xcb, 0xf3, 0xb6, 0x8d, 0x25, 0xe7, 0xf3, 0x1e, 0x3b, 0x4b, 0x5d, 0xca, 0xc9, 0xa1, 0x83, 0x4a, 0x84, 0xfc, 0x4e, 0x4b, 0xfb, 0xc3, 0x45, 0x14, 0xf5, 0xc5, 0x20, 0x75, 0x21, 0x02, 0x9d, + 0xae, 0x97, 0x73, 0x5e, 0xc5, 0xeb, 0x19, 0x11, 0x06, 0xdb, 0x72, 0xdd, 0xc7, 0xea, 0xb5, 0xef, 0x2f, 0x43, 0x51, 0x9b, 0x9a, 0x03, 0x16, 0x60, 0xe7, 0x5c, 0x64, 0xf2, 0xd0, 0x8a, 0xa0, 0x71, + 0x53, 0xb0, 0x30, 0x5a, 0x1e, 0xb2, 0x4a, 0xcf, 0xe3, 0x5b, 0xa6, 0xde, 0x9f, 0x5e, 0x38, 0x50, 0xfc, 0x86, 0x99, 0xff, 0x71, 0xaa, 0xb1, 0x3b, 0x63, 0xb4, 0xad, 0xb8, 0xa0, 0xda, 0x4e, 0x81, + 0xcb, 0x87, 0xdd, 0x17, 0x16, 0xc8, 0x0b, 0x1b, 0xcb, 0x7f, 0x82, 0xfd, 0xa0, 0xc0, 0xf1, 0xa4, 0x59, 0x8a, 0x69, 0xb1, 0xab, 0xbc, 0x3e, 0xad, 0x00, 0xac, 0x9b, 0x6f, 0x30, 0x05, 0x2d, 0x45, + 0x55, 0x1e, 0x8e, 0x72, 0x41, 0x8e, 0x96, 0x9a, 0xe5, 0x0e, 0xf2, 0xc9, 0x0a, 0xca, 0x99, 0x09, 0x94, 0xab, 0x9a, 0xdc, 0xef, 0x4c, 0xb7, 0x2a, 0x17, 0xd2, 0xa6, 0x89, 0x4f, 0xe9, 0x6a, 0x1d, + 0x11, 0x8c, 0x09, 0x1b, 0xe6, 0x82, 0xce, 0x7b, 0xe1, 0x2e, 0x24, 0x62, 0xbc, 0x7f, 0xa0, 0xf4, 0x5d, 0x67, 0x6a, 0x49, 0x83, 0xad, 0xd5, 0x4d, 0xa5, 0xef, 0xfb, 0x7a, 0xde, 0x96, 0x59, 0x3e, + 0xc2, 0xc5, 0x0b, 0x8e, 0xd5, 0x25, 0xe4, 0x0f, 0x74, 0xbc, 0x9f, 0x37, 0x18, 0x69, 0xe1, 0x62, 0xc5, 0x0e, 0xe3, 0xee, 0x23, 0x55, 0x98, 0x4c, 0xa1, 0xe1, 0x84, 0xa4, 0x2b, 0xc0, 0xb3, 0xf1, + 0x18, 0x86, 0xa6, 0x88, 0x20, 0xf7, 0x5d, 0x74, 0xbe, 0x25, 0xb7, 0x10, 0xef, 0x0b, 0x0a, 0x06, 0x58, 0x63, 0x0e, 0xab, 0x81, 0x4d, 0x39, 0x42, 0xe4, 0x9a, 0x1b, 0x56, 0x69, 0x11, 0x0f, 0x07, + 0x0b, 0xcc, 0x9f, 0x91, 0x7e, 0x1d, 0xcc, 0xb4, 0x7d, 0xb4, 0xf5, 0x4b, 0x24, 0x18, 0x75, 0xb4, 0xb1, 0x5b, 0xcd, 0xaf, 0x42, 0x12, 0x5f, 0x2a, 0x08, 0xbf, 0x14, 0x9e, 0xaa, 0x4e, 0xcb, 0xea, + 0xc1, 0x6f, 0xdb, 0x36, 0x21, 0x2f, 0x95, 0x88, 0x7f, 0x74, 0x6c, 0x7a, 0x6f, 0xd6, 0x84, 0x3c, 0x2f, 0x0f, 0x3f, 0xa2, 0x4d, 0x01, 0x56, 0xf1, 0xd2, 0xc6, 0xf7, 0x96, 0x6c, 0x41, 0x0b, 0x6f, + 0x50, 0x98, 0x6a, 0xcd, 0x0d, 0x23, 0x6b, 0x9e, 0x53, 0xdd, 0xae, 0x34, 0xf5, 0xfd, 0x78, 0x3e, 0x1c, 0x07, 0x07, 0x7b, 0x2e, 0x8f, 0x58, 0xbe, 0xbf, 0x5a, 0x76, 0x10, 0x35, 0x59, 0xdb, 0xa2, + 0x98, 0x11, 0x34, 0x2b, 0x6c, 0x56, 0x9d, 0x59, 0xca, 0xa8, 0x05, 0x36, 0xe3, 0x58, 0x79, 0x35, 0x54, 0xd7, 0x87, 0x9c, 0x73, 0x86, 0xa8, 0x9f, 0x5d, 0x09, 0xd2, 0x9b, 0xba, 0x94, 0xb6, 0xf3, + 0xf3, 0x28, 0x85, 0x3a, 0xed, 0x26, 0xa8, 0xaf, 0x3a, 0x81, 0xa1, 0x7f, 0xbf, 0x02, 0x73, 0xd4, 0x78, 0xf4, 0x0b, 0x48, 0xbd, 0x82, 0xdd, 0x60, 0xf7, 0xea, 0x4a, 0xa3, 0xd4, 0xe9, 0xe7, 0x68, + 0xee, 0x4b, 0x22, 0x2e, 0xcc, 0xcd, 0x7c, 0x6c, 0x0c, 0x4d, 0x4a, 0x63, 0x54, 0x46, 0x18, 0xf7, 0xb7, 0x36, 0xbf, 0xe0, 0x62, 0x00, 0xdd, 0x77, 0xbb, 0x09, 0xe3, 0xf9, 0x73, 0xa6, 0xd0, 0x8a, + 0x7e, 0x8f, 0x60, 0x18, 0x64, 0x28, 0xf3, 0xdb, 0x6c, 0xd1, 0xef, 0x2e, 0x38, 0x5b, 0xf7, 0xea, 0x4e, 0x3d, 0xdd, 0x95, 0x07, 0x9b, 0xf6, 0x38, 0x3d, 0x28, 0x7c, 0x61, 0x6a, 0x40, 0x00, 0xa1, + 0xe9, 0x61, 0xef, 0xb6, 0x09, 0xe0, 0x23, 0x71, 0xa9, 0x1b, 0x9e, 0x52, 0x5d, 0xe2, 0xe7, 0xd4, 0x71, 0xe3, 0x05, 0x9f, 0xb9, 0xa5, 0x89, 0x15, 0xfa, 0xbe, 0x12, 0xe8, 0x0f, 0x77, 0x05, 0xa2, + 0x5f, 0x6a, 0x24, 0xf5, 0x01, 0xf5, 0x44, 0x84, 0xd3, 0x31, 0x48, 0xb7, 0x6b, 0x22, 0x35, 0xdd, 0x2f, 0x27, 0x9d, 0xdc, 0x37, 0x81, 0xa1, 0x81, 0x72, 0xf2, 0x7e, 0x15, 0xd3, 0x26, 0x3d, 0xee, + 0x84, 0x26, 0x55, 0x4d, 0xc8, 0xf9, 0x98, 0x1f, 0xa1, 0xb8, 0xbe, 0x1e, 0x2d, 0x19, 0x5f, 0x34, 0x65, 0xc6, 0x4f, 0x9c, 0x4e, 0xbd, 0x93, 0xa5, 0x84, 0xdf, 0xe7, 0x5b, 0x87, 0xb7, 0x2b, 0x73, + 0xb6, 0xc8, 0xe9, 0x6c, 0x65, 0x07, 0x6b, 0x86, 0x41, 0x1c, 0x7e, 0x6b, 0x14, 0x45, 0xe0, 0xcd, 0xf1, 0xcd, 0x8f, 0x4a, 0x29, 0x91, 0x56, 0xc6, 0x78, 0xe8, 0x47, 0x61, 0x60, 0x04, 0x19, 0x68, + 0xf8, 0x4e, 0x96, 0x3d, 0xc4, 0x20, 0xf2, 0x2a, 0x06, 0xaf, 0xa1, 0x9f, 0x30, 0x79, 0x7d, 0x0d, 0x44, 0xda, 0x61, 0x74, 0xae, 0x63, 0xa9, 0x41, 0x4a, 0x0c, 0x90, 0x4e, 0x91, 0x65, 0x19, 0xcb, + 0x6e, 0xaa, 0x49, 0x49, 0x9e, 0x44, 0xbd, 0xd9, 0xc8, 0x9c, 0xc2, 0x50, 0xb5, 0x0b, 0x16, 0x4e, 0x40, 0x4a, 0x50, 0xc2, 0x61, 0xfe, 0x34, 0xcf, 0x86, 0xc5, 0x2a, 0x61, 0xbb, 0xf6, 0x38, 0x57, + 0xb1, 0xa4, 0x03, 0xe7, 0xa2, 0x0a, 0x2c, 0x7a, 0x0b, 0x26, 0xef, 0xc1, 0xd2, 0x2e, 0x64, 0x3a, 0xf0, 0x4e, 0x37, 0x95, 0x2c, 0x9d, 0x3f, 0x88, 0x00, 0x7f, 0x87, 0xb0, 0x8b, 0x14, 0x97, 0xfb, + 0x1e, 0xea, 0x6b, 0x16, 0xd2, 0x19, 0x6c, 0x83, 0xa2, 0xf3, 0x09, 0x08, 0x3f, 0xb7, 0x8d, 0x10, 0x10, 0xe5, 0xbd, 0x04, 0xc1, 0xa0, 0x8d, 0x6b, 0xea, 0xc4, 0x34, 0x10, 0x38, 0xc5, 0xcd, 0x2d, + 0x64, 0xc5, 0xe8, 0x73, 0xec, 0xbe, 0x05, 0xff, 0xed, 0xd7, 0x99, 0x8e, 0x95, 0x66, 0x61, 0xf2, 0x38, 0xf4, 0xff, 0xe2, 0xe7, 0x9d, 0xe1, 0x9e, 0xbe, 0xef, 0x7c, 0xd6, 0xa4, 0x9c, 0xb7, 0x30, + 0xfe, 0x14, 0x81, 0x8f, 0x12, 0x6b, 0x4f, 0xec, 0x6c, 0x46, 0xac, 0x86, 0x28, 0x61, 0xbb, 0x74, 0x39, 0xc8, 0x50, 0x80, 0x23, 0xd0, 0x45, 0x89, 0x70, 0xf3, 0xf9, 0xa8, 0x8e, 0x99, 0x72, 0x12, + 0xa1, 0x3b, 0xa5, 0xe3, 0xf7, 0xfd, 0x1d, 0xcd, 0xcf, 0x8a, 0x22, 0x2b, 0xfc, 0x40, 0xa1, 0x17, 0x87, 0xf5, 0xbc, 0x33, 0x16, 0x64, 0x7c, 0x5f, 0x0b, 0x1c, 0x49, 0x8b, 0x28, 0x5a, 0x78, 0xca, + 0x3c, 0xda, 0x1b, 0xfd, 0x67, 0x0b, 0x8a, 0xdf, 0x08, 0xb8, 0x30, 0x03, 0xa3, 0x24, 0x3c, 0xad, 0x2e, 0x13, 0xb7, 0x85, 0x0e, 0x56, 0xa2, 0x68, 0x86, 0x99, 0x7b, 0xa0, 0xf9, 0x19, 0xf0, 0xbe, + 0x8a, 0x69, 0xfa, 0xca, 0xde, 0x00, 0x75, 0xe7, 0x14, 0xea, 0xfe, 0x12, 0x6b, 0xcc, 0x03, 0x27, 0xce, 0xcf, 0xcd, 0x8b, 0x7f, 0xdd, 0xcd, 0x55, 0x28, 0x13, 0x27, 0x33, 0x40, 0xd3, 0xf1, 0x0c, + 0xf0, 0xd4, 0xd0, 0xe4, 0x3e, 0xa4, 0x83, 0x6e, 0x81, 0xaa, 0x92, 0x1a, 0xe7, 0x47, 0xe1, 0x2f, 0x09, 0xe1, 0x76, 0x12, 0x38, 0xdc, 0x3b, 0x8f, 0x78, 0x06, 0x7e, 0xa9, 0x07, 0xfb, 0x09, 0x64, + 0xc3, 0x2e, 0xc7, 0x83, 0xa6, 0xfb, 0x4c, 0x0b, 0x4e, 0x91, 0xcb, 0xa4, 0xbf, 0x1f, 0x8c, 0x0f, 0xab, 0x39, 0xd6, 0x1b, 0x85, 0xdb, 0x6c, 0x0a, 0x54, 0xeb, 0x1e, 0xd9, 0xe9, 0xa9, 0x14, 0xef, + 0x39, 0x07, 0x55, 0x31, 0xba, 0x1b, 0x93, 0x91, 0x98, 0x4e, 0xb1, 0x4e, 0xc5, 0x00, 0x0a, 0x81, 0x5d, 0x49, 0x76, 0x2c, 0x66, 0xb3, 0x58, 0x70, 0x3c, 0x8d, 0x12, 0xb6, 0x24, 0xea, 0x22, 0x50, + 0xf6, 0xe9, 0xba, 0x37, 0x31, 0x31, 0xbd, 0x2f, 0x7a, 0xd0, 0xfe, 0xb0, 0x5f, 0x75, 0x7f, 0x22, 0x78, 0xe1, 0xb7, 0x56, 0x0b, 0x43, 0xcd, 0x57, 0xb9, 0x0f, 0x57, 0x0c, 0x5e, 0x0c, 0x85, 0x9c, + 0xa1, 0x7e, 0xe0, 0xcd, 0x55, 0x92, 0x36, 0x21, 0x91, 0x26, 0xdb, 0xaa, 0x04, 0x14, 0x5d, 0x33, 0xeb, 0xd9, 0x41, 0x9b, 0x19, 0x23, 0x00, 0xde, 0x78, 0xc5, 0x3c, 0x49, 0x20, 0xcc, 0x1b, 0xac, + 0xa7, 0xb0, 0xca, 0x51, 0xc4, 0xe2, 0xb0, 0x25, 0x69, 0x04, 0xd1, 0x0e, 0x0b, 0x1b, 0xd9, 0xa8, 0x87, 0x03, 0x75, 0x90, 0x99, 0x01, 0x8f, 0x18, 0xeb, 0x8c, 0x33, 0xc9, 0xd4, 0xa1, 0x13, 0x0b, + 0xf5, 0xec, 0x60, 0xe5, 0xa6, 0xeb, 0x89, 0xd0, 0x17, 0x4c, 0x75, 0x3e, 0xca, 0xcb, 0x9f, 0x67, 0x5b, 0x1d, 0xc5, 0xc2, 0xd1, 0xaf, 0x05, 0x9d, 0xc7, 0xf6, 0xea, 0x4b, 0xd1, 0x92, 0x0b, 0xc0, + 0x0d, 0x7a, 0x3e, 0x4f, 0xdb, 0x45, 0x4a, 0x32, 0x13, 0x59, 0x8d, 0xac, 0xd8, 0x29, 0xfa, 0x31, 0x62, 0xc4, 0xd9, 0x41, 0x12, 0xbc, 0xae, 0xbe, 0x5a, 0x71, 0xa5, 0xf2, 0xd3, 0x82, 0x58, 0x2d, + 0x31, 0x94, 0xec, 0x94, 0xdd, 0xe1, 0x3c, 0x14, 0xb5, 0xaf, 0xe5, 0xdc, 0x5d, 0x83, 0x3e, 0x7e, 0xe7, 0xd5, 0x85, 0xb6, 0x99, 0x77, 0xba, 0xc6, 0xf7, 0xb7, 0x98, 0x1b, 0xc0, 0x42, 0x34, 0x52, + 0xb6, 0xae, 0x93, 0x86, 0xf3, 0xc2, 0x38, 0x8c, 0xc6, 0xeb, 0x1e, 0x5f, 0x2b, 0x31, 0x55, 0xa3, 0x89, 0xcc, 0x1f, 0x4c, 0x40, 0x58, 0x24, 0x9d, 0xe5, 0x5e, 0xf7, 0x87, 0x7e, 0xba, 0xc2, 0x7d, + 0xd4, 0xd3, 0x26, 0xa1, 0x9b, 0xb8, 0x50, 0x7f, 0xe8, 0xd1, 0xfe, 0x9e, 0x58, 0x1f, 0x04, 0x7f, 0xd7, 0x05, 0xcc, 0x6c, 0xbe, 0x9f, 0x41, 0x58, 0x78, 0xeb, 0x6d, 0xb7, 0xc1, 0xd3, 0x45, 0x17, + 0x9d, 0x47, 0x9c, 0xf0, 0x82, 0x5d, 0xf2, 0x01, 0xb6, 0xc1, 0xcf, 0xf9, 0xa4, 0x4d, 0x59, 0xf4, 0x11, 0x37, 0x79, 0x77, 0x6d, 0x40, 0xaa, 0x25, 0x0e, 0xbd, 0x99, 0x3e, 0x43, 0xd6, 0x3d, 0x7c, + 0xb1, 0x87, 0xe9, 0xbc, 0x13, 0x75, 0xc7, 0x54, 0x88, 0x1c, 0xa0, 0x6c, 0x2d, 0x65, 0x5b, 0x8a, 0x5a, 0x12, 0xb5, 0x67, 0xef, 0xec, 0xbc, 0x9c, 0x6e, 0xb2, 0xf5, 0x7e, 0xc6, 0xf4, 0xb2, 0xa1, + 0x5e, 0xf4, 0x09, 0x2d, 0xc6, 0xe9, 0x75, 0x6d, 0xb0, 0x03, 0xc2, 0x41, 0x6a, 0x11, 0xd7, 0x25, 0x8d, 0x8e, 0xca, 0xc9, 0x2e, 0xf9, 0xbe, 0x56, 0xfc, 0xf4, 0x92, 0x69, 0xa4, 0x94, 0xc1, 0x03, + 0x4c, 0x5c, 0x6f, 0xf9, 0xfd, 0x33, 0x4c, 0x34, 0x70, 0x3f, 0x50, 0xd1, 0x9c, 0x81, 0x0d, 0xbc, 0xe7, 0xb8, 0x70, 0xe6, 0xdc, 0x6c, 0xcc, 0xaf, 0x66, 0xeb, 0x9e, 0xc8, 0x51, 0xfa, 0x70, 0x36, + 0xa5, 0x93, 0xbd, 0x3a, 0x0d, 0x66, 0x51, 0xc5, 0x55, 0x96, 0xc6, 0xf5, 0xb3, 0x8d, 0x1b, 0x19, 0x1b, 0x91, 0xb5, 0x2a, 0x7a, 0x33, 0x43, 0x93, 0xad, 0x76, 0xd8, 0x4e, 0xe8, 0x65, 0xba, 0x9f, + 0x1b, 0x92, 0x47, 0x4e, 0x13, 0x06, 0x1d, 0x50, 0xc0, 0x6a, 0x9c, 0x28, 0x56, 0x8a, 0xc4, 0x08, 0xd1, 0xcf, 0x75, 0x8d, 0x1a, 0xfc, 0x46, 0x12, 0x79, 0xa4, 0x64, 0x36, 0xb8, 0x37, 0xaa, 0x5f, + 0x9f, 0x05, 0x80, 0x17, 0xfa, 0x30, 0xb5, 0x0d, 0x55, 0x09, 0x2c, 0xf0, 0xdd, 0x9a, 0x7f, 0xa0, 0x5b, 0x6d, 0xe7, 0xa2, 0xe7, 0xe6, 0xcf, 0xe3, 0xe8, 0xad, 0x7a, 0x6e, 0x6a, 0x49, 0x15, 0x65, + 0x21, 0x98, 0x28, 0x81, 0x1e, 0xfa, 0x9f, 0xaa, 0xfe, 0x51, 0xc8, 0xed, 0x15, 0x16, 0xff, 0xfa, 0x80, 0x86, 0xc2, 0x5f, 0x2f, 0xb7, 0x5d, 0xc3, 0x2b, 0x90, 0xc8, 0x1b, 0x71, 0x58, 0xd5, 0x49, + 0x20, 0x6f, 0x66, 0x17, 0xce, 0x18, 0x29, 0x93, 0x6d, 0x34, 0x31, 0xaa, 0xd5, 0x68, 0xd0, 0x95, 0xd1, 0xc5, 0x50, 0xdc, 0x2d, 0x7b, 0x4a, 0xe4, 0x53, 0x10, 0xdd, 0xed, 0x04, 0x93, 0x59, 0x58, + 0x15, 0xeb, 0x08, 0x9b, 0xf3, 0x50, 0x6f, 0xd6, 0x8f, 0x03, 0x62, 0xdf, 0xab, 0x83, 0x6a, 0x63, 0xed, 0x64, 0x31, 0x9d, 0x67, 0xbb, 0xdd, 0x68, 0xa3, 0xe6, 0x03, 0x9a, 0x7f, 0x66, 0x83, 0xfd, + 0x09, 0xb6, 0x89, 0x6e, 0x28, 0x0f, 0x6b, 0x6d, 0x90, 0x97, 0x92, 0x82, 0x1a, 0x88, 0x4d, 0xeb, 0x90, 0x23, 0xbb, 0x21, 0xcf, 0x93, 0x81, 0x10, 0xb0, 0xab, 0xc4, 0x9a, 0xc4, 0x50, 0xfa, 0x3e, + 0x58, 0xf5, 0xfb, 0x3d, 0x6d, 0x62, 0xf9, 0x3b, 0x82, 0x1b, 0xa8, 0x03, 0xed, 0x60, 0x7d, 0x37, 0xef, 0xbf, 0x6b, 0x7b, 0xf2, 0x5a, 0x42, 0xd3, 0x75, 0xdb, 0x93, 0x96, 0x89, 0x4c, 0xd3, 0x2d, + 0xbd, 0x8d, 0x67, 0x14, 0x84, 0x28, 0x1d, 0x2d, 0xde, 0x1f, 0x76, 0x25, 0x5a, 0x6d, 0xd3, 0x14, 0x21, 0x4c, 0x94, 0x14, 0xf9, 0x0d, 0x13, 0x71, 0x5b, 0x49, 0x87, 0xa1, 0x9c, 0x87, 0xf8, 0x59, + 0xac, 0x4b, 0xf6, 0x41, 0x9d, 0x29, 0x9d, 0x0e, 0x6e, 0x07, 0xb5, 0xab, 0xf5, 0xd0, 0x75, 0x2c, 0x45, 0x5c, 0xea, 0x99, 0x04, 0x41, 0xa1, 0x98, 0xc6, 0xcf, 0x56, 0xd3, 0xc1, 0xc2, 0x17, 0x76, + 0xd8, 0xb3, 0xec, 0x9b, 0xe7, 0x9d, 0x50, 0xda, 0xc5, 0x53, 0x75, 0xe3, 0xe8, 0x73, 0x26, 0x46, 0x9a, 0x3e, 0x5b, 0x85, 0xc1, 0x5e, 0xf2, 0x72, 0xef, 0xc0, 0x6f, 0xf0, 0xfb, 0xe5, 0x2a, 0x88, + 0x3d, 0xf7, 0x74, 0x11, 0xd0, 0xe2, 0x97, 0xba, 0xe0, 0xea, 0xa3, 0x69, 0xaf, 0x20, 0xc7, 0x23, 0x96, 0xdb, 0x39, 0x49, 0x46, 0x8d, 0xad, 0x18, 0x83, 0x84, 0x97, 0xf1, 0xf5, 0x6c, 0x3d, 0xa6, + 0xed, 0x74, 0x6b, 0xd3, 0xd7, 0xfb, 0x6a, 0x97, 0x96, 0x3f, 0xcf, 0xae, 0xf9, 0x04, 0xdb, 0x20, 0xf7, 0x7c, 0xd2, 0xd6, 0x9e, 0xa9, 0xf4, 0x8e, 0x46, 0x74, 0x75, 0x27, 0x5e, 0x6b, 0x73, 0x60, + 0xec, 0x6a, 0xe5, 0x4a, 0x52, 0x3b, 0xdc, 0xde, 0x1e, 0x6b, 0x74, 0x60, 0x89, 0x09, 0x2c, 0x28, 0x76, 0x8f, 0x19, 0x14, 0x9c, 0x33, 0x2e, 0xe9, 0x28, 0xdf, 0x28, 0x2a, 0x5a, 0xc9, 0x9e, 0x0d, + 0x04, 0x7b, 0x25, 0x9d, 0x06, 0xf2, 0x0c, 0xe8, 0x0d, 0x96, 0xdd, 0x19, 0x99, 0xcc, 0x23, 0x74, 0x5c, 0x8f, 0xed, 0xb1, 0x5c, 0x17, 0x62, 0x9f, 0x7e, 0x9d, 0x83, 0x9d, 0xc6, 0xe2, 0xc8, 0xfd, + 0x73, 0x56, 0x47, 0x43, 0x8f, 0xab, 0xe5, 0x1b, 0x27, 0x05, 0xf5, 0xa3, 0xdd, 0x76, 0x5a, 0x00, 0xfe, 0xb8, 0xe7, 0x76, 0x33, 0x87, 0xcf, 0x82, 0xa9, 0x2f, 0x10, 0xde, 0x97, 0x8e, 0x9d, 0xf4, + 0xfe, 0x8f, 0xdf, 0x87, 0x3f, 0x12, 0xe2, 0xbf, 0xa4, 0x76, 0x36, 0xa0, 0xa3, 0xb7, 0x28, 0x09, 0xb3, 0x30, 0xab, 0x22, 0xe3, 0xcd, 0xf4, 0x14, 0xeb, 0x7c, 0x2f, 0xda, 0x7a, 0xf3, 0xd1, 0x16, + 0x59, 0x02, 0xad, 0x73, 0x3c, 0x4f, 0x74, 0x3f, 0x64, 0xc6, 0xc3, 0x0c, 0x5d, 0xf8, 0xa5, 0x0e, 0x97, 0x17, 0x70, 0x3f, 0xb8, 0xab, 0x39, 0x03, 0xe1, 0x76, 0x3d, 0x2e, 0x27, 0xd3, 0xe1, 0x61, + 0x34, 0x55, 0x66, 0x3b, 0x7d, 0xe8, 0x8d, 0xe7, 0x19, 0x2b, 0x99, 0xdc, 0x68, 0x2d, 0x67, 0x66, 0x09, 0xe5, 0xa6, 0x40, 0x03, 0xc9, 0xda, 0x25, 0xf1, 0xce, 0x7c, 0x34, 0xac, 0x35, 0x1f, 0x2a, + 0x06, 0xa5, 0x34, 0xdf, 0xf6, 0x33, 0x72, 0x3a, 0x8b, 0x47, 0xfd, 0x4d, 0xea, 0xa3, 0xdb, 0x9e, 0x90, 0x88, 0xa3, 0x5e, 0xb6, 0x99, 0x93, 0x78, 0xba, 0x43, 0x26, 0x3d, 0x9e, 0x43, 0x8b, 0xee, + 0xf4, 0x37, 0x75, 0x23, 0xde, 0x5a, 0x3e, 0x1a, 0xd1, 0x63, 0x5f, 0x0b, 0x7e, 0x69, 0x81, 0xe5, 0x1d, 0xe6, 0x19, 0x99, 0x4e, 0x0a, 0xc2, 0xcf, 0x17, 0x55, 0x10, 0x30, 0x45, 0x83, 0x0d, 0x80, + 0xa0, 0x74, 0x0f, 0xa0, 0x66, 0xab, 0x3d, 0x30, 0x4f, 0x87, 0x1c, 0x40, 0x69, 0xe2, 0xb6, 0xae, 0xa5, 0x1f, 0x7a, 0x0e, 0xc7, 0xc7, 0xfa, 0x46, 0x62, 0x3d, 0x12, 0xf5, 0xf8, 0x4b, 0x6d, 0xdd, + 0x3e, 0xa0, 0xbe, 0x7f, 0x58, 0x73, 0xdc, 0x94, 0xd7, 0xb6, 0x70, 0xaf, 0xfb, 0x63, 0x6c, 0x65, 0x8d, 0x70, 0x6b, 0xe4, 0x01, 0xb3, 0xa1, 0xec, 0x13, 0xd8, 0x3e, 0x48, 0xf3, 0x45, 0x3f, 0xea, + 0x01, 0x41, 0x6f, 0x21, 0x24, 0x94, 0x80, 0x17, 0x1d, 0x49, 0xb3, 0x18, 0x6a, 0x41, 0x62, 0xbc, 0x0b, 0x91, 0x9b, 0x58, 0x70, 0xfa, 0xd2, 0x38, 0x62, 0x98, 0x5d, 0x8d, 0xcc, 0x32, 0x80, 0x24, + 0x55, 0x39, 0x9a, 0x61, 0x12, 0x35, 0xa9, 0x0c, 0x78, 0x1a, 0x76, 0x84, 0x19, 0x7f, 0x13, 0x91, 0x7f, 0xbe, 0xc0, 0xd1, 0x96, 0x23, 0x4c, 0x23, 0x01, 0xb3, 0x10, 0xd4, 0xc2, 0x20, 0x38, 0x49, + 0x9f, 0x47, 0x82, 0xfc, 0x15, 0xd6, 0xb8, 0x06, 0xde, 0xa0, 0xf2, 0xfa, 0x52, 0xdb, 0x15, 0x38, 0x78, 0xb4, 0xd0, 0xc5, 0x30, 0x4f, 0x87, 0x85, 0xbc, 0x44, 0x7b, 0x4e, 0xdf, 0x93, 0x0d, 0xb9, + 0x3b, 0x64, 0x56, 0xc5, 0xe2, 0xe0, 0xf3, 0x69, 0xb9, 0x66, 0x7b, 0x26, 0x6d, 0x6f, 0x28, 0x7e, 0x63, 0x0d, 0x70, 0x85, 0x16, 0xd6, 0xbd, 0x1c, 0xc2, 0xd6, 0x2a, 0x99, 0x6f, 0x76, 0x61, 0xbd, + 0x77, 0x2b, 0xaf, 0x62, 0x0f, 0x06, 0x3c, 0x66, 0x46, 0xce, 0x9c, 0x41, 0xdc, 0x35, 0x4e, 0x2c, 0x28, 0x78, 0xb3, 0xfe, 0xb1, 0x93, 0xaa, 0x1b, 0xa6, 0x13, 0x18, 0x4d, 0x3c, 0xd0, 0x48, 0x32, + 0xe7, 0x61, 0x76, 0xd9, 0xcb, 0xe8, 0xba, 0x86, 0x7e, 0xc2, 0xd7, 0xf5, 0xb5, 0xb6, 0x08, 0xc3, 0x84, 0xd8, 0xdc, 0xf1, 0x2e, 0xea, 0x4d, 0x6a, 0x5d, 0x58, 0x98, 0xb4, 0x3c, 0x92, 0x7b, 0xd0, + 0x1a, 0x90, 0xf3, 0x0a, 0x60, 0x2c, 0x8e, 0x34, 0x11, 0x12, 0x37, 0x68, 0x1e, 0x2d, 0x29, 0xdd, 0x0a, 0x22, 0xbe, 0x9b, 0x30, 0x9c, 0x91, 0x0c, 0x76, 0x91, 0x80, 0x93, 0xa3, 0xdd, 0x4e, 0x73, + 0x83, 0xbd, 0x3e, 0x13, 0x05, 0x77, 0xb6, 0xef, 0x74, 0xc9, 0x75, 0x9f, 0xa1, 0x01, 0x6c, 0xc1, 0x7b, 0xdb, 0x96, 0x6b, 0xe8, 0x5f, 0xf5, 0x0d, 0xfc, 0x86, 0xfc, 0xbc, 0x78, 0xea, 0xaa, 0x45, + 0xe4, 0x33, 0xa2, 0x3c, 0xd2, 0x12, 0xaf, 0x85, 0x0d, 0xde, 0x61, 0x7e, 0x10, 0x40, 0x6f, 0x13, 0x30, 0x40, 0xc0, 0x6a, 0x87, 0xaa, 0x75, 0xa1, 0x6f, 0x74, 0xc6, 0x99, 0xf6, 0x24, 0x2f, 0xea, + 0xcf, 0x07, 0x32, 0x4e, 0xa4, 0x66, 0x14, 0xdd, 0x37, 0xe8, 0xbe, 0xfb, 0xa8, 0x9b, 0x75, 0xb5, 0x3f, 0xf3, 0xdb, 0x2e, 0x41, 0x37, 0x9f, 0x78, 0x79, 0xa1, 0xdd, 0x97, 0x62, 0x75, 0x62, 0xfb, + 0x4a, 0x95, 0x01, 0x18, 0xd2, 0x63, 0xe3, 0xc4, 0x4a, 0x23, 0xdc, 0xd1, 0x92, 0xf1, 0xf4, 0x60, 0xef, 0x7f, 0x22, 0xa5, 0xda, 0xed, 0x3e, 0xa9, 0x3b, 0xa6, 0xf9, 0x50, 0xb8, 0xbf, 0x12, 0x1f, + 0x3c, 0x02, 0x3c, 0x7e, 0xb8, 0x63, 0x9a, 0x20, 0xfe, 0x3c, 0x1e, 0xd8, 0xa4, 0xb5, 0xd2, 0x9e, 0x7f, 0xe0, 0x17, 0x5d, 0x9c, 0x11, 0xab, 0x49, 0x0d, 0x0c, 0x87, 0xc2, 0xaa, 0xf6, 0xa6, 0xbd, + 0xc8, 0x82, 0x3b, 0xfd, 0x35, 0x60, 0x14, 0xa4, 0x2c, 0x18, 0x58, 0x31, 0x76, 0x6c, 0x4b, 0x3f, 0xd4, 0x96, 0x56, 0xca, 0xf4, 0x3a, 0xec, 0xf5, 0x66, 0x7e, 0x77, 0xc2, 0xca, 0x83, 0xce, 0xc4, + 0x8f, 0xcd, 0x75, 0x28, 0x0a, 0x02, 0x1f, 0x65, 0xd9, 0x68, 0xb7, 0x5c, 0x0f, 0xc8, 0x9c, 0xdb, 0x51, 0xbf, 0xa9, 0xf6, 0xe1, 0xa6, 0x38, 0xa3, 0x0d, 0xfe, 0x92, 0x73, 0x52, 0xf4, 0x7d, 0x5f, + 0xe8, 0x95, 0x85, 0x9e, 0x33, 0xd0, 0x06, 0x8f, 0xa7, 0xc3, 0xa6, 0xf8, 0xba, 0x85, 0x85, 0xbe, 0xd9, 0x27, 0x9b, 0xa8, 0x33, 0x98, 0xe3, 0xfc, 0xd6, 0xe4, 0x07, 0xbb, 0x7a, 0x3a, 0xf1, 0x97, + 0xf9, 0x60, 0xed, 0x20, 0xab, 0x4d, 0xdf, 0x2c, 0x53, 0x8c, 0xa2, 0x82, 0x8e, 0xa6, 0x11, 0x04, 0x94, 0xa9, 0x24, 0x97, 0xc7, 0x55, 0x9f, 0x8c, 0x34, 0x89, 0xe8, 0xaa, 0xce, 0xb0, 0x97, 0xda, + 0x0a, 0x17, 0xed, 0x3a, 0x05, 0x19, 0x2a, 0x8b, 0x04, 0xdd, 0xb2, 0x9c, 0xa3, 0x0f, 0x7c, 0xa1, 0xd4, 0xeb, 0xd1, 0x33, 0x5c, 0x3e, 0x89, 0x24, 0x9d, 0xfb, 0xda, 0xfd, 0x85, 0x2b, 0x27, 0x7a, + 0xa8, 0x65, 0x89, 0xf3, 0x30, 0x23, 0xf2, 0xb5, 0x4e, 0x2c, 0x67, 0xa0, 0x47, 0x32, 0xbc, 0x1f, 0xb6, 0xed, 0xb5, 0x52, 0x2d, 0x00, 0x89, 0x70, 0x30, 0x9b, 0x31, 0xa9, 0x01, 0xb3, 0xd7, 0x71, + 0x7e, 0x40, 0x2b, 0x94, 0xc1, 0x88, 0xe2, 0x46, 0x1c, 0x4c, 0x96, 0x4a, 0xaf, 0x2c, 0x77, 0x9b, 0x95, 0xe3, 0x8e, 0x76, 0x02, 0x55, 0x27, 0xde, 0x8e, 0x13, 0x60, 0xa6, 0xbf, 0x1d, 0xba, 0xee, + 0x6c, 0xe3, 0x6d, 0x64, 0x64, 0x6e, 0x51, 0x2b, 0x45, 0xd7, 0x65, 0x63, 0xc4, 0xf9, 0x4e, 0xc7, 0xed, 0x63, 0x43, 0x3f, 0x76, 0xa4, 0x47, 0x3b, 0x91, 0xb7, 0x20, 0x83, 0x91, 0xe6, 0x99, 0xe3, + 0x9d, 0x34, 0x06, 0xfa, 0x52, 0xb5, 0x2d, 0xd9, 0xd6, 0x0c, 0xfe, 0x5c, 0xd3, 0xbb, 0x47, 0x08, 0xe2, 0xb5, 0xd8, 0xc0, 0x3b, 0xd0, 0x86, 0x10, 0xa7, 0xc3, 0x26, 0xe1, 0xb0, 0x05, 0x21, 0x24, + 0x81, 0x8e, 0xb1, 0x9a, 0x33, 0x08, 0xda, 0x8e, 0x57, 0xb1, 0x9b, 0x28, 0xd2, 0xd4, 0xaf, 0x65, 0x64, 0x32, 0x1a, 0x76, 0x16, 0x1b, 0x69, 0xbc, 0xf4, 0x7a, 0x3c, 0x3b, 0xc4, 0xf7, 0x63, 0x34, + 0x94, 0x8a, 0x89, 0xbc, 0xa7, 0xe6, 0xaa, 0xb4, 0x2d, 0x32, 0x4e, 0x40, 0xb7, 0xbd, 0x18, 0x33, 0xcb, 0xfd, 0xba, 0xc3, 0xb2, 0x45, 0x31, 0xc4, 0x27, 0x5d, 0xb8, 0xbb, 0x06, 0x42, 0xab, 0x9f, + 0x32, 0x02, 0xfa, 0x7a, 0x05, 0x87, 0x73, 0xdb, 0x2f, 0xfe, 0xa7, 0x74, 0x68, 0x37, 0x19, 0x32, 0xc7, 0x0a, 0x1e, 0xaf, 0x3e, 0xc3, 0x2f, 0x2d, 0x8a, 0x7d, 0x40, 0x3d, 0x51, 0xe1, 0x74, 0xdc, + 0x38, 0x24, 0x2d, 0x44, 0xfc, 0x6a, 0x30, 0x18, 0x6c, 0xcc, 0x85, 0x92, 0xe7, 0xa9, 0xb2, 0x1e, 0xb3, 0x00, 0x6d, 0x5a, 0x6b, 0x40, 0x5c, 0x17, 0xcc, 0x76, 0xcf, 0x2e, 0xfd, 0x75, 0x41, 0xa5, + 0x7b, 0x32, 0x08, 0x5d, 0x4e, 0x96, 0x8b, 0x7c, 0xba, 0x12, 0x07, 0xab, 0x0a, 0x96, 0xf7, 0xf8, 0x2a, 0x1a, 0x4a, 0x1c, 0xd9, 0xe3, 0xdc, 0x05, 0xec, 0x46, 0x4c, 0xa9, 0x75, 0xd9, 0x62, 0x88, + 0x1b, 0xa1, 0x59, 0x54, 0x35, 0xa3, 0xcd, 0xb9, 0xd7, 0xe7, 0x43, 0xd3, 0x38, 0xff, 0xa3, 0x03, 0x07, 0x76, 0x7f, 0x57, 0xa8, 0x2f, 0x79, 0x63, 0xa7, 0x4f, 0x6e, 0xf0, 0xa4, 0x3a, 0x01, 0x74, + 0x3e, 0x6d, 0x41, 0x90, 0x3c, 0xf2, 0x8c, 0x83, 0x91, 0x3c, 0xce, 0xc7, 0x7f, 0x25, 0x15, 0xf1, 0x03, 0xea, 0x91, 0x20, 0xe7, 0xe3, 0x86, 0x20, 0x4f, 0x12, 0x11, 0x11, 0x90, 0xb2, 0x86, 0xfa, + 0x90, 0x2f, 0xa7, 0x30, 0x5d, 0x0c, 0x21, 0x95, 0x74, 0x4d, 0x8d, 0x0d, 0x69, 0x0d, 0xef, 0x4e, 0xa6, 0xa3, 0x1f, 0x1a, 0x53, 0xcf, 0x7b, 0x88, 0xbd, 0xb6, 0xa4, 0xf2, 0xb8, 0x87, 0x58, 0xcb, + 0x25, 0x15, 0xb6, 0x64, 0x26, 0xf3, 0xde, 0x48, 0xa2, 0x26, 0xc5, 0xae, 0xcf, 0xc0, 0x9b, 0x6a, 0x5e, 0x94, 0x76, 0x4c, 0x88, 0x44, 0x3c, 0xb3, 0x35, 0x72, 0x26, 0xb8, 0x1c, 0xa9, 0xee, 0x2c, + 0xab, 0xef, 0x8d, 0x88, 0x5d, 0xc5, 0x59, 0x1e, 0x00, 0x17, 0x87, 0x98, 0x58, 0x0f, 0x55, 0x61, 0xda, 0x8f, 0x27, 0x16, 0x65, 0x9b, 0x9b, 0xda, 0xcf, 0xe9, 0x25, 0x21, 0x23, 0x52, 0x68, 0xda, + 0xfe, 0x72, 0x64, 0x8f, 0xb2, 0x1f, 0x2f, 0xc3, 0x1a, 0x81, 0x0e, 0x86, 0xe6, 0x33, 0x53, 0x13, 0x7f, 0x81, 0xfa, 0x57, 0x90, 0x8f, 0x28, 0xba, 0x3c, 0x6f, 0xb2, 0x08, 0x5b, 0xa4, 0xa3, 0x02, + 0x79, 0x89, 0x38, 0xc1, 0x68, 0xb8, 0x9e, 0x49, 0xa1, 0xb2, 0xce, 0x87, 0xf5, 0xbc, 0xda, 0xea, 0x28, 0xe2, 0x68, 0x02, 0xa0, 0x05, 0x19, 0xce, 0xd6, 0x1c, 0x91, 0x6c, 0x00, 0x91, 0x45, 0x4a, + 0x77, 0xba, 0x5a, 0x2c, 0xa7, 0x29, 0xb0, 0x34, 0xa8, 0xfe, 0xb4, 0xa0, 0xba, 0xb6, 0x48, 0x15, 0x8b, 0xce, 0x01, 0x0a, 0x47, 0x95, 0x3d, 0x99, 0x11, 0xb3, 0x39, 0x32, 0x04, 0x22, 0x5b, 0xea, + 0x0e, 0x73, 0xe2, 0x75, 0xe9, 0x18, 0x06, 0xda, 0x39, 0xae, 0xda, 0xce, 0x7a, 0x35, 0x82, 0x66, 0x39, 0xf6, 0xf1, 0xea, 0x3f, 0xf6, 0xc2, 0x9e, 0xde, 0x67, 0xa0, 0x0d, 0x52, 0x4f, 0x87, 0x60, + 0x03, 0xe9, 0x39, 0x3e, 0x2b, 0x57, 0x0c, 0x66, 0x09, 0x86, 0x10, 0x50, 0xdf, 0x5d, 0xe0, 0xf5, 0x28, 0x5d, 0x1d, 0x76, 0x56, 0xbe, 0x5b, 0xcd, 0x66, 0xa8, 0x81, 0x88, 0x3c, 0xae, 0x53, 0x3d, + 0x4a, 0x9e, 0x4e, 0x9c, 0x6a, 0xc7, 0x6a, 0x6a, 0x9f, 0x71, 0x96, 0x42, 0x35, 0xe2, 0x00, 0xb4, 0x2c, 0x7c, 0xb4, 0x24, 0x81, 0x48, 0x86, 0x42, 0x5d, 0xe8, 0x52, 0xda, 0x7c, 0xef, 0xda, 0xe9, + 0x4c, 0xf5, 0xb2, 0x92, 0x99, 0x26, 0x93, 0xd7, 0xe3, 0xa3, 0xd7, 0x5b, 0x8d, 0x9e, 0x52, 0x68, 0x7e, 0xbe, 0x14, 0x47, 0xb7, 0xca, 0xc4, 0x30, 0x52, 0x50, 0x51, 0xd3, 0x2c, 0x51, 0xbe, 0x0b, + 0x74, 0x74, 0x5e, 0xd8, 0xa5, 0xe1, 0x02, 0xf0, 0x91, 0x22, 0x9f, 0x67, 0xe0, 0x09, 0xe0, 0x73, 0xaa, 0x74, 0x15, 0x74, 0x80, 0x02, 0x73, 0x1d, 0x53, 0xc9, 0xfd, 0xa1, 0xb7, 0xe2, 0x97, 0x7d, + 0x7c, 0xa9, 0x6c, 0x48, 0x4a, 0xab, 0x99, 0x49, 0xd5, 0x2d, 0xb0, 0x9a, 0x5a, 0x4f, 0xed, 0xdd, 0x7c, 0x45, 0xc0, 0x3b, 0xe6, 0x00, 0xa8, 0x6a, 0xba, 0x93, 0x3b, 0x07, 0x69, 0x86, 0x7b, 0x82, + 0xa8, 0xd4, 0xc6, 0x2c, 0xef, 0x7b, 0x95, 0xba, 0x1d, 0xc1, 0x6b, 0x5c, 0x48, 0xf2, 0x59, 0x98, 0x52, 0xf1, 0x2a, 0x24, 0xcc, 0x96, 0x45, 0x07, 0x97, 0xbd, 0x10, 0xee, 0xb4, 0x6d, 0x31, 0x52, + 0x30, 0x0b, 0xc1, 0x28, 0x71, 0x7c, 0x27, 0x73, 0x8a, 0x33, 0xf3, 0xa3, 0x37, 0x3b, 0xb2, 0xbf, 0xd6, 0x40, 0xe0, 0xce, 0x2d, 0x69, 0xe5, 0xab, 0xa1, 0x07, 0xea, 0x46, 0xaa, 0x25, 0x4e, 0x93, + 0xdf, 0xfb, 0xeb, 0x5f, 0xee, 0xee, 0x89, 0xa3, 0x7c, 0x46, 0x17, 0xb0, 0x9b, 0x81, 0x77, 0x20, 0x0f, 0x6e, 0x38, 0xe2, 0x3f, 0x09, 0x14, 0x0f, 0x4c, 0xbd, 0x30, 0x7b, 0x70, 0x4b, 0x0a, 0x1e, + 0xb1, 0xa2, 0xa8, 0xde, 0xe7, 0xf7, 0xde, 0x06, 0xed, 0x03, 0xc3, 0x52, 0x8e, 0x08, 0x01, 0x6b, 0x23, 0x09, 0x7f, 0x7d, 0x9a, 0xad, 0xd7, 0x77, 0x5d, 0x86, 0xed, 0x91, 0x2f, 0x30, 0x52, 0x5b, + 0x49, 0xce, 0x9b, 0x77, 0x80, 0xa7, 0xb6, 0x49, 0xf7, 0x89, 0x70, 0xbc, 0xf7, 0x33, 0x4d, 0xec, 0x38, 0x4c, 0xdd, 0x0c, 0x97, 0x86, 0xb2, 0x4f, 0x0c, 0xf3, 0xfe, 0xcf, 0xcf, 0x2b, 0x04, 0x41, + 0x1a, 0x7d, 0xae, 0x31, 0x20, 0xb7, 0x9b, 0xf1, 0x3c, 0x5b, 0x27, 0x38, 0xdd, 0xf0, 0x76, 0x53, 0xa2, 0x76, 0xf5, 0xa0, 0xd3, 0x4b, 0x5e, 0x2c, 0x25, 0x64, 0x89, 0xe3, 0x1b, 0x17, 0xac, 0x85, + 0x3f, 0xbd, 0x3b, 0xcd, 0x94, 0x24, 0xbb, 0x7f, 0x7f, 0x1e, 0xa8, 0xe1, 0xe1, 0x0b, 0x2b, 0xbe, 0xb4, 0x76, 0xff, 0x9f, 0xb3, 0xff, 0xc8, 0xa5, 0xa0, 0xb8, 0x1a, 0xb8, 0xe0, 0x94, 0x47, 0x11, + 0xc5, 0x9f, 0xeb, 0xdf, 0x33, 0xd0, 0x53, 0x5f, 0xce, 0x93, 0x69, 0xd2, 0xb2, 0x08, 0x64, 0x5f, 0xcc, 0xf5, 0x03, 0x97, 0x1e, 0x64, 0xd7, 0xae, 0x57, 0x5b, 0x98, 0x92, 0x83, 0x49, 0xa5, 0xd7, + 0x0b, 0x64, 0xb9, 0x82, 0x96, 0x63, 0x6f, 0xb9, 0x1a, 0x0e, 0x77, 0xf8, 0x6e, 0x32, 0xa1, 0x29, 0x03, 0xa3, 0xc2, 0x55, 0x17, 0xef, 0x70, 0xe6, 0x7e, 0x12, 0x5b, 0x15, 0xb0, 0x76, 0xfb, 0xa1, + 0x16, 0x96, 0x15, 0xda, 0xd1, 0xf8, 0x42, 0x5b, 0x38, 0x39, 0xb0, 0x1f, 0x15, 0x14, 0x4a, 0xbb, 0xcb, 0xe5, 0xba, 0x65, 0x52, 0xf9, 0x13, 0x79, 0x74, 0x9c, 0xdf, 0x59, 0x78, 0x62, 0x9d, 0x4c, + 0xb1, 0x2e, 0xa4, 0xc3, 0x7f, 0x77, 0x26, 0xf8, 0x32, 0x4b, 0x1f, 0xb0, 0xc2, 0x2b, 0x0d, 0x9f, 0xae, 0x61, 0x43, 0xe0, 0xcd, 0x05, 0xf0, 0x04, 0xf6, 0x39, 0x63, 0x0c, 0x43, 0xb4, 0xa6, 0x61, + 0x75, 0x3d, 0x2a, 0xc6, 0x5e, 0x38, 0x04, 0x76, 0xf5, 0xdc, 0x8f, 0xe4, 0xb5, 0x64, 0xd0, 0x14, 0x10, 0x77, 0x17, 0x3e, 0xb3, 0xe2, 0x65, 0x6e, 0x63, 0x1d, 0x3a, 0x5a, 0x0e, 0xf0, 0x5c, 0xb2, + 0x45, 0x65, 0x6e, 0x08, 0x61, 0x99, 0x50, 0x01, 0xd6, 0x56, 0x95, 0x7b, 0xcb, 0xf5, 0x20, 0x45, 0x05, 0x7a, 0xa7, 0x1f, 0xa6, 0xea, 0xd4, 0xa6, 0xb6, 0xdd, 0xcc, 0xf1, 0x3b, 0x3b, 0xf8, 0x8a, + 0x31, 0xfe, 0x23, 0xf0, 0x7f, 0xa3, 0xd0, 0xee, 0xe3, 0xf9, 0x95, 0x12, 0xf1, 0x1b, 0xd8, 0x27, 0x6b, 0xe0, 0xf2, 0x0a, 0x88, 0xb4, 0x2b, 0x17, 0x97, 0xd8, 0xa9, 0xe7, 0x59, 0xf2, 0x38, 0x53, + 0x56, 0x61, 0xc7, 0x77, 0x76, 0x8c, 0x36, 0x61, 0xed, 0xe5, 0x4a, 0x19, 0x8a, 0xee, 0xb8, 0x8f, 0xcd, 0x76, 0x29, 0xb2, 0x76, 0x74, 0x8e, 0xea, 0x96, 0x4e, 0xcf, 0x45, 0xf6, 0xbb, 0x03, 0x6f, + 0x48, 0x4b, 0x2d, 0x9b, 0x74, 0x8d, 0xba, 0x3b, 0x1d, 0x12, 0x32, 0x3f, 0x1f, 0xc2, 0x16, 0x3a, 0xb2, 0x66, 0x01, 0xc9, 0x97, 0x0c, 0x3e, 0x5a, 0xd2, 0xce, 0x3c, 0xba, 0xdd, 0x6e, 0xf6, 0x9b, + 0x08, 0xc0, 0x8d, 0xf6, 0xfb, 0xaa, 0xb9, 0xda, 0x2c, 0x59, 0x9f, 0xb4, 0xf0, 0xc5, 0x2c, 0xfe, 0x6f, 0x33, 0x41, 0x35, 0x25, 0x32, 0x40, 0x2b, 0x54, 0x1e, 0x57, 0x47, 0xbe, 0x92, 0xd9, 0x70, + 0x01, 0xb7, 0x61, 0x8c, 0x8f, 0xb3, 0x26, 0x6f, 0xb7, 0x05, 0x53, 0xd0, 0x50, 0x3e, 0xb2, 0xd5, 0x01, 0x82, 0xb2, 0xa9, 0x5b, 0xa1, 0xe3, 0xde, 0x86, 0xe2, 0x3a, 0xd1, 0x50, 0x4d, 0x0c, 0x65, + 0xad, 0x2c, 0xa0, 0x69, 0x24, 0x62, 0x95, 0x16, 0x54, 0x45, 0xcf, 0x5b, 0xea, 0xa5, 0x40, 0x04, 0xe4, 0x60, 0x47, 0x6e, 0x48, 0x03, 0x1d, 0xcd, 0x0c, 0xdf, 0x2c, 0x06, 0xb2, 0xb1, 0x12, 0x62, + 0xb9, 0xd3, 0x85, 0xb0, 0x41, 0x3c, 0x92, 0x05, 0x8b, 0x0f, 0x18, 0xbb, 0x5b, 0x42, 0xcf, 0x7c, 0xa1, 0x67, 0xa6, 0x77, 0x7b, 0x84, 0xbe, 0x67, 0xa1, 0x9d, 0xd2, 0x0d, 0x1e, 0x4e, 0xbb, 0x57, + 0xb6, 0x49, 0xbb, 0xf7, 0x80, 0x4f, 0x14, 0x5f, 0x5d, 0x6e, 0xb3, 0x45, 0x1a, 0x02, 0x0e, 0xd0, 0x61, 0x77, 0xed, 0x0c, 0xa4, 0x58, 0x84, 0xd0, 0xc4, 0xcd, 0xab, 0xba, 0x1c, 0x75, 0x2b, 0x5b, + 0x98, 0xd8, 0xd9, 0xfd, 0xf5, 0xe9, 0xb6, 0xd8, 0x82, 0xdf, 0xe8, 0x76, 0x5e, 0x63, 0xea, 0x3d, 0x6e, 0xda, 0x4d, 0xbd, 0xa1, 0xaf, 0xe4, 0x3e, 0x9c, 0x60, 0x36, 0x68, 0x39, 0x1e, 0x80, 0x27, + 0x30, 0xcf, 0xb9, 0x0e, 0x9f, 0x23, 0x8e, 0x31, 0x37, 0x09, 0x14, 0x72, 0x6a, 0x4d, 0xee, 0x51, 0x5d, 0x6f, 0x52, 0x11, 0x64, 0x3e, 0x1a, 0x0e, 0xb9, 0xc9, 0x92, 0xc2, 0x77, 0x75, 0x8d, 0x8e, + 0x0a, 0xd4, 0x23, 0xf7, 0x9c, 0xb2, 0x2b, 0x7a, 0x79, 0xe7, 0x00, 0x94, 0x02, 0x43, 0xe8, 0x72, 0x37, 0x59, 0x4f, 0xe8, 0xc5, 0x6e, 0xb0, 0x5d, 0xec, 0xd6, 0xe8, 0xae, 0x6b, 0x51, 0x70, 0x5f, + 0xdb, 0x10, 0x3b, 0x22, 0x18, 0x0c, 0xc4, 0xd1, 0xeb, 0x1e, 0xe3, 0xbf, 0xa9, 0x8a, 0x6a, 0x78, 0x50, 0xd3, 0x06, 0xda, 0x4c, 0xde, 0x2b, 0x75, 0xa9, 0xa3, 0xfa, 0x42, 0xae, 0x04, 0xd0, 0xbf, + 0xbd, 0x7f, 0xef, 0xe9, 0x5f, 0x72, 0x72, 0x39, 0xae, 0x2b, 0x14, 0x3e, 0x2b, 0xae, 0xff, 0x4e, 0x9e, 0x96, 0xcc, 0x2f, 0x46, 0x3e, 0xf7, 0xbf, 0xf8, 0xd2, 0x7f, 0xf2, 0x3a, 0x49, 0xf7, 0xd4, + 0xb0, 0xf5, 0xca, 0x46, 0xb9, 0xde, 0x49, 0xed, 0xea, 0x81, 0x17, 0xcb, 0x00, 0x77, 0x0a, 0x39, 0x2e, 0xa2, 0x05, 0x47, 0x7f, 0x02, 0xbb, 0x98, 0x0b, 0x8d, 0x2b, 0xd6, 0x10, 0x2e, 0xd5, 0xc2, + 0xf7, 0xd5, 0x0a, 0xe2, 0xd6, 0x44, 0x7f, 0xbf, 0xe3, 0x32, 0x94, 0x7e, 0x93, 0x1a, 0xfb, 0x7e, 0x47, 0xe1, 0xa4, 0x4e, 0x16, 0x26, 0xdf, 0xb4, 0xc9, 0x34, 0xd2, 0x28, 0x31, 0x8c, 0xf7, 0xef, + 0xc3, 0x6e, 0x1f, 0x13, 0xe7, 0x46, 0x52, 0xbd, 0x8b, 0x76, 0xfc, 0xf6, 0x87, 0xb7, 0x91, 0xfc, 0x8b, 0xc1, 0xa6, 0x94, 0xc5, 0x08, 0xb2, 0xa4, 0x3a, 0xb5, 0xfa, 0x7c, 0x47, 0x3e, 0x7c, 0xdf, + 0x9d, 0x6c, 0x76, 0x76, 0xd6, 0x41, 0xd5, 0x53, 0xb4, 0x3d, 0x98, 0x9d, 0x5f, 0xe7, 0x8b, 0xae, 0xb9, 0x69, 0x1d, 0xf4, 0x77, 0xe2, 0xf6, 0x5b, 0x8e, 0x37, 0x28, 0x67, 0x7f, 0x10, 0xbb, 0xca, + 0x1c, 0xfa, 0x08, 0x9a, 0x7e, 0x90, 0x8b, 0xbc, 0x1a, 0xf3, 0x9b, 0x4a, 0x61, 0x33, 0x31, 0xd2, 0x07, 0xdb, 0xf7, 0x3b, 0x7e, 0x9e, 0xf8, 0x79, 0x62, 0x2b, 0xef, 0x37, 0xc0, 0x77, 0xb4, 0xe5, + 0xb9, 0x27, 0xd1, 0x57, 0x56, 0x72, 0x53, 0xb0, 0x52, 0x7c, 0xef, 0x1d, 0x34, 0x72, 0x83, 0x67, 0x37, 0x0d, 0x03, 0x30, 0x6d, 0x9a, 0x98, 0xbc, 0x4b, 0x31, 0xc7, 0xac, 0xc0, 0xd2, 0xc9, 0xec, + 0x30, 0xcf, 0xc0, 0xe3, 0xa8, 0x63, 0x56, 0xf7, 0x71, 0xe2, 0x19, 0x45, 0x70, 0x9f, 0xe5, 0xbd, 0x50, 0x3f, 0xbf, 0x2b, 0xfe, 0x86, 0x50, 0x6f, 0xe8, 0xd5, 0xe8, 0xbd, 0xb8, 0xf3, 0xc5, 0x70, + 0xa0, 0x64, 0x79, 0xa2, 0x78, 0xa0, 0x16, 0xfa, 0x47, 0x84, 0xdf, 0xe7, 0x80, 0xf7, 0xba, 0xdc, 0xec, 0xbd, 0xc7, 0x17, 0xfc, 0xd6, 0xb9, 0x7e, 0x83, 0x2f, 0x3b, 0xb6, 0x5e, 0xfd, 0xfa, 0x24, + 0xa7, 0xcf, 0x0d, 0x3d, 0x6f, 0x33, 0xbb, 0x0d, 0xbf, 0x30, 0xce, 0xad, 0xc3, 0x6e, 0x82, 0x10, 0x77, 0x3b, 0xbf, 0x7f, 0x19, 0x6f, 0x70, 0xaa, 0x85, 0xfe, 0x67, 0x4a, 0xde, 0x97, 0x87, 0x64, + 0x1f, 0xa6, 0x0f, 0x79, 0xfb, 0xfd, 0x99, 0x71, 0xc8, 0xc0, 0xcf, 0x71, 0xf8, 0xb6, 0x24, 0xac, 0xa0, 0x1b, 0xd4, 0x1c, 0xb9, 0xfc, 0x93, 0xbf, 0x4f, 0x9b, 0xd2, 0xbe, 0xdf, 0xf4, 0x4d, 0xf4, + 0xfe, 0x43, 0xea, 0x37, 0xc1, 0xfb, 0xd3, 0xd9, 0x65, 0xd5, 0xf7, 0xc7, 0x2f, 0xbf, 0xd5, 0x32, 0x7f, 0x47, 0x9a, 0x1e, 0x11, 0xf0, 0x1f, 0xff, 0xfe, 0xef, 0x7f, 0xfc, 0xeb, 0xdf, 0x90, 0x07, + 0x8b, 0x38, 0x6d, 0xac, 0xa8, 0x30, 0x32, 0x02, 0x2d, 0xf4, 0x3c, 0x43, 0x3b, 0x9a, 0xae, 0x8d, 0x35, 0xf5, 0xfe, 0x8a, 0x67, 0x70, 0xff, 0xd7, 0x1f, 0xdf, 0x6b, 0x30, 0xf0, 0x54, 0x02, 0x08, + 0x36, 0xbb, 0xf8, 0x3a, 0x7f, 0x72, 0xdd, 0xee, 0xfd, 0x47, 0x7c, 0x2a, 0xb8, 0x9b, 0x81, 0xb6, 0x15, 0xbd, 0x8c, 0x25, 0xe7, 0x93, 0xd5, 0xc2, 0xe0, 0xeb, 0xc2, 0x9b, 0x40, 0xeb, 0x95, 0x7b, + 0x80, 0x76, 0x2a, 0x45, 0x53, 0x6b, 0x09, 0x25, 0xe7, 0x2b, 0xcc, 0x1a, 0xb8, 0x5d, 0xcc, 0x71, 0xfa, 0x85, 0x9e, 0x46, 0x10, 0xaa, 0x0a, 0xe6, 0x7a, 0xb4, 0x59, 0xad, 0x67, 0x54, 0xe6, 0x1e, + 0x32, 0x77, 0x01, 0x1b, 0xc0, 0x70, 0x86, 0xc3, 0x1d, 0x6d, 0xe6, 0xcd, 0x0a, 0x71, 0x2f, 0x79, 0x61, 0x4d, 0xb3, 0x1d, 0xc4, 0x78, 0xb6, 0x10, 0xf4, 0x80, 0x17, 0xee, 0xe0, 0xaf, 0xe1, 0x0d, + 0xcd, 0x73, 0xee, 0x32, 0xc6, 0xed, 0x4e, 0x8f, 0x8f, 0xf8, 0xab, 0x7d, 0x93, 0x8a, 0xf7, 0xf7, 0x88, 0xbc, 0xdc, 0x72, 0x82, 0x67, 0x74, 0xc4, 0x5e, 0xea, 0x2f, 0x70, 0xff, 0x11, 0x9f, 0x74, + 0xbc, 0x19, 0x68, 0x3a, 0xe3, 0xb5, 0xa0, 0xe3, 0x8a, 0xe3, 0xc9, 0x64, 0xbc, 0x24, 0x47, 0xe2, 0xc2, 0xd4, 0xa6, 0x21, 0x81, 0x13, 0xae, 0xa3, 0x4c, 0x4b, 0x86, 0x82, 0x91, 0xbc, 0x3b, 0xca, + 0x50, 0x48, 0x9f, 0x53, 0x9b, 0xa0, 0x2f, 0x85, 0x03, 0x76, 0xed, 0x21, 0x50, 0x4f, 0x88, 0xf5, 0xae, 0xc8, 0xf8, 0xe5, 0x4a, 0x89, 0x63, 0x09, 0x27, 0x94, 0x6d, 0x94, 0xa4, 0xcb, 0x41, 0xbd, + 0x50, 0xb0, 0xce, 0x64, 0x84, 0xcc, 0xaa, 0x7c, 0xce, 0x1c, 0x0e, 0xcf, 0xe8, 0xf8, 0x4d, 0x9e, 0xc1, 0xf9, 0xf5, 0xbd, 0x26, 0x00, 0x09, 0xda, 0x86, 0x17, 0x19, 0xc9, 0x67, 0x8c, 0xf2, 0xe7, + 0xf1, 0x8b, 0x07, 0x5b, 0x5b, 0xb4, 0xe7, 0x81, 0x2f, 0x7a, 0xf2, 0x92, 0xcd, 0xfe, 0xf5, 0x6f, 0xc8, 0x51, 0x1f, 0xb5, 0x78, 0xc0, 0xd7, 0xed, 0x44, 0x9f, 0x4e, 0xfe, 0xe6, 0xae, 0xdf, 0xd8, + 0x56, 0xf4, 0xc6, 0x12, 0xba, 0xc7, 0x8b, 0xc4, 0x8b, 0x3e, 0xda, 0x27, 0xe0, 0x4f, 0x0e, 0x6c, 0x4e, 0x41, 0xa2, 0x9d, 0x97, 0x86, 0x8a, 0x87, 0x52, 0xed, 0x43, 0xb6, 0x0c, 0xf3, 0x91, 0x11, + 0xed, 0x44, 0x58, 0x13, 0xd5, 0x10, 0xe8, 0x8b, 0xe4, 0x36, 0xe4, 0xa9, 0x81, 0x32, 0xf4, 0x24, 0xdb, 0x3a, 0x40, 0xf6, 0x48, 0xf6, 0xc8, 0xb5, 0x02, 0xab, 0x7d, 0x9c, 0x98, 0x4b, 0xd3, 0x69, + 0x69, 0x4f, 0x46, 0x15, 0xed, 0x49, 0x9c, 0x9a, 0xb3, 0x8e, 0xa2, 0x2f, 0x26, 0x2c, 0x13, 0x0c, 0x51, 0xb6, 0xbf, 0x8b, 0x73, 0x27, 0x23, 0xd4, 0xd7, 0xf9, 0xce, 0x48, 0x13, 0x43, 0xcb, 0x93, + 0xf4, 0x6c, 0xe0, 0x60, 0xb7, 0xd6, 0x5a, 0x96, 0x28, 0x47, 0xb4, 0x9d, 0xc7, 0x5f, 0x5b, 0x7f, 0xf9, 0x91, 0x30, 0x39, 0xdb, 0x87, 0x8f, 0x5c, 0xeb, 0x97, 0x45, 0x48, 0x03, 0xf8, 0x93, 0x6c, + 0xcd, 0x69, 0xdb, 0x1d, 0x1c, 0xcb, 0x0e, 0xae, 0x4b, 0xbb, 0x50, 0xc9, 0xab, 0xc2, 0xe3, 0x34, 0x1c, 0xdb, 0x06, 0x03, 0x86, 0xf6, 0x56, 0x98, 0x9c, 0x51, 0x08, 0x56, 0x88, 0xac, 0x6d, 0x65, + 0x78, 0x6f, 0x53, 0xda, 0xdb, 0xee, 0x0c, 0xdd, 0xee, 0x99, 0x22, 0xd0, 0xcd, 0x43, 0x1f, 0xee, 0x5a, 0xa3, 0x98, 0x9f, 0x4e, 0x95, 0xd4, 0x9d, 0x8d, 0x66, 0xb5, 0xdb, 0x19, 0xc7, 0x56, 0xb9, + 0x2f, 0x55, 0x76, 0xc7, 0xc1, 0xd0, 0x1a, 0x93, 0x5f, 0x77, 0x73, 0x1e, 0xd9, 0xe9, 0xc8, 0x4b, 0x0d, 0x53, 0xff, 0xc4, 0x4e, 0x7f, 0x7e, 0x95, 0x66, 0x8e, 0xa6, 0x64, 0x86, 0xf2, 0x43, 0x82, + 0x43, 0xf7, 0x46, 0x6e, 0xbe, 0xef, 0x7e, 0x48, 0xe0, 0x37, 0x8c, 0x83, 0x4b, 0xf8, 0x9f, 0x8c, 0x71, 0x79, 0xb5, 0x6d, 0x5b, 0x0a, 0x72, 0x4c, 0xa1, 0x22, 0xbd, 0x12, 0x15, 0x9c, 0x44, 0x4b, + 0x05, 0xe2, 0xfb, 0x53, 0x2e, 0x83, 0x66, 0x63, 0x6c, 0xb4, 0x22, 0xe1, 0x05, 0x17, 0xb1, 0x98, 0xb4, 0x65, 0x91, 0xa1, 0xab, 0x21, 0xcc, 0x76, 0x1b, 0x99, 0x13, 0x94, 0xed, 0xcc, 0x09, 0xa0, + 0xbb, 0xa2, 0x5c, 0xdb, 0x80, 0xfb, 0xe4, 0x60, 0xde, 0x8b, 0xd7, 0x82, 0x8d, 0x8f, 0xf3, 0x1c, 0x10, 0x77, 0xd4, 0x21, 0x00, 0x48, 0xdd, 0x89, 0x56, 0xbf, 0x19, 0x7c, 0x69, 0x93, 0x20, 0xdb, + 0x1e, 0xd1, 0xbf, 0x35, 0xf5, 0x5a, 0x20, 0xba, 0xe5, 0x44, 0x84, 0x93, 0x85, 0x3f, 0x67, 0xea, 0xad, 0xc5, 0xd5, 0xa3, 0x94, 0x23, 0xfd, 0x81, 0x3e, 0xb6, 0x8c, 0xa2, 0xb6, 0x8c, 0x7a, 0x44, + 0x60, 0x38, 0x6b, 0x24, 0xc4, 0x04, 0x2a, 0x2a, 0x61, 0x0b, 0xef, 0x87, 0xf5, 0x12, 0x72, 0x1d, 0x06, 0xc7, 0xdc, 0xb9, 0xad, 0x77, 0x76, 0x2b, 0x4f, 0x18, 0xec, 0x26, 0x52, 0x85, 0xd6, 0x51, + 0x22, 0xfa, 0xe1, 0x92, 0x8e, 0x95, 0x94, 0x1d, 0x64, 0x3b, 0x40, 0x52, 0xf8, 0x67, 0xf2, 0xf3, 0x09, 0xa2, 0x91, 0xf6, 0xd2, 0xed, 0x9f, 0x1b, 0x3b, 0xbe, 0x86, 0xe2, 0x76, 0x81, 0xc4, 0xaf, + 0x18, 0x7e, 0xb6, 0x61, 0xfc, 0xcf, 0x6d, 0x80, 0xaf, 0x1b, 0xc6, 0xb7, 0xd0, 0xfa, 0x7a, 0xd8, 0x2b, 0xf5, 0xc2, 0xc7, 0x67, 0xac, 0xc1, 0xe3, 0x3c, 0x36, 0x97, 0x44, 0x54, 0x66, 0x51, 0x66, + 0xb7, 0x62, 0x94, 0x43, 0x39, 0xe9, 0xce, 0xd9, 0x58, 0xf6, 0x05, 0x37, 0xeb, 0xd3, 0x0a, 0x81, 0x8c, 0xd1, 0xb9, 0x0a, 0x1f, 0xa2, 0xb5, 0x17, 0xf6, 0xe7, 0x01, 0x3b, 0xe5, 0xca, 0xd8, 0x8d, + 0xca, 0xa0, 0x1b, 0x2a, 0x21, 0x1e, 0x19, 0x9e, 0x48, 0x7b, 0xd8, 0x7c, 0xac, 0x17, 0x98, 0x35, 0x7f, 0x26, 0x1e, 0x9e, 0x57, 0x4e, 0xfe, 0x4f, 0xd8, 0x43, 0xfe, 0x1e, 0xd5, 0xff, 0x87, 0x6e, + 0x22, 0x7f, 0x87, 0xd8, 0x3f, 0xc3, 0xcb, 0x3f, 0x77, 0xa0, 0x6b, 0x31, 0x39, 0xfe, 0xc3, 0x76, 0xa0, 0x7b, 0x4c, 0xa1, 0xdb, 0x28, 0xd4, 0x7d, 0x6f, 0xfa, 0x15, 0x0f, 0xe6, 0x0e, 0xfc, 0x0f, + 0x9a, 0x5d, 0x5d, 0x6d, 0x6a, 0xc2, 0x5b, 0x48, 0x36, 0xd2, 0x9c, 0x69, 0xc0, 0x1c, 0x77, 0xec, 0x32, 0x9e, 0x91, 0x22, 0xa4, 0x8c, 0x0a, 0xd4, 0x44, 0x2c, 0x61, 0x48, 0x7b, 0xd3, 0x75, 0xb6, + 0x91, 0x86, 0x61, 0xcc, 0xe2, 0x15, 0x4f, 0x86, 0x0b, 0x6e, 0xbd, 0x0e, 0xb5, 0xdc, 0xef, 0xa6, 0x26, 0x1b, 0xbb, 0xfb, 0x6d, 0x10, 0x3b, 0x3b, 0xc1, 0xf6, 0x85, 0x72, 0x01, 0xf9, 0xbd, 0xe1, + 0x24, 0xa2, 0xd6, 0x86, 0xed, 0x65, 0x58, 0xec, 0x91, 0x5e, 0xcf, 0xf9, 0xd3, 0x94, 0xc5, 0xc7, 0x2f, 0x5e, 0xb5, 0x67, 0x7f, 0xd8, 0xb9, 0xfa, 0x23, 0x2c, 0x7e, 0x8f, 0x62, 0xd4, 0x4b, 0xfa, + 0xe6, 0x04, 0xb2, 0x31, 0x9a, 0x8e, 0x07, 0x20, 0xd5, 0x4e, 0xe3, 0x14, 0xd8, 0x98, 0x15, 0xd9, 0x1e, 0x89, 0xe7, 0xfe, 0xbe, 0x1f, 0xf9, 0xfb, 0xfe, 0x20, 0xae, 0xd7, 0x7c, 0x3a, 0x5d, 0xc2, + 0x99, 0x88, 0xc8, 0x09, 0x90, 0x1b, 0xf1, 0x44, 0x36, 0xa3, 0x35, 0x32, 0x55, 0x69, 0x03, 0x60, 0x7b, 0xd6, 0x6c, 0xa3, 0x00, 0xd3, 0x03, 0x1b, 0x0e, 0x86, 0x58, 0x16, 0xd8, 0x8e, 0x2f, 0xf0, + 0x23, 0x85, 0xf1, 0x71, 0x1f, 0x2a, 0x94, 0x79, 0x34, 0x86, 0xf6, 0xc9, 0xbc, 0x46, 0x9f, 0xd1, 0xe5, 0x9b, 0x49, 0xa5, 0x85, 0xc9, 0x79, 0x39, 0xe4, 0x26, 0x1e, 0xdc, 0x0c, 0x81, 0x6e, 0x7a, + 0x9e, 0x6e, 0x5f, 0x56, 0x13, 0x1e, 0xb9, 0x3a, 0x77, 0xc3, 0x0f, 0xaf, 0x07, 0x3f, 0x9f, 0x51, 0xf5, 0x9f, 0x1e, 0xca, 0x7f, 0x92, 0x87, 0x12, 0x25, 0x8e, 0xaf, 0x3c, 0xb4, 0xe1, 0x5e, 0xa9, + 0x4f, 0x7a, 0x87, 0xf9, 0x3e, 0xa9, 0x1c, 0x5f, 0x69, 0x2a, 0xbd, 0x5a, 0xcc, 0x2a, 0x63, 0x90, 0xf7, 0xfb, 0x25, 0xb5, 0x8a, 0x74, 0x05, 0xb0, 0xf0, 0x08, 0x90, 0x86, 0x45, 0xb0, 0x81, 0xe7, + 0xd5, 0x72, 0x0b, 0x2d, 0xd6, 0xc6, 0x98, 0xe1, 0x04, 0xc8, 0x62, 0x33, 0xa1, 0x3b, 0x9f, 0xc2, 0xda, 0x24, 0x5f, 0xa2, 0x43, 0xad, 0xc7, 0x07, 0xcb, 0x59, 0x61, 0xbb, 0x6b, 0x52, 0x19, 0x18, + 0x71, 0xc2, 0x32, 0x50, 0xaa, 0x8a, 0x61, 0x04, 0xf3, 0x69, 0xed, 0xc3, 0x6e, 0xaa, 0x6c, 0x56, 0xf8, 0xb3, 0xea, 0xa4, 0x3b, 0xd1, 0xdf, 0x48, 0x79, 0x0f, 0xc9, 0x9c, 0x96, 0x02, 0x9a, 0xd3, + 0x37, 0x37, 0xbd, 0x9e, 0x37, 0x85, 0xe2, 0x39, 0xba, 0x92, 0x5d, 0xdc, 0x77, 0xbe, 0xf2, 0xf3, 0x65, 0x83, 0xb6, 0xb4, 0x3a, 0xaf, 0xfc, 0xdd, 0x9f, 0x08, 0xaf, 0xc5, 0x7f, 0x1b, 0x98, 0x0d, + 0xad, 0x9a, 0xa3, 0xb6, 0x1d, 0x66, 0x35, 0x96, 0x73, 0xd2, 0x68, 0x93, 0x11, 0xc5, 0x70, 0x98, 0x95, 0xc2, 0x0e, 0xdd, 0x25, 0x5d, 0x09, 0x77, 0xd4, 0xfe, 0xbe, 0x3b, 0xa1, 0xe7, 0xea, 0x90, + 0xd8, 0x0d, 0x98, 0x40, 0x66, 0xb4, 0x0e, 0x2c, 0x84, 0x5e, 0x51, 0x98, 0xfb, 0xbd, 0xa4, 0x8d, 0x93, 0x10, 0x52, 0x64, 0xa7, 0x2b, 0xad, 0x3c, 0x09, 0x8b, 0xad, 0x64, 0xb7, 0x20, 0x39, 0xb2, + 0xa0, 0x07, 0x1a, 0x31, 0x20, 0x58, 0x29, 0xd5, 0x3a, 0xaf, 0x9b, 0x15, 0x37, 0xa1, 0x34, 0xe2, 0xa5, 0x48, 0x0d, 0xfc, 0xd6, 0xd2, 0xd7, 0x3c, 0xe1, 0xec, 0xe6, 0xe2, 0xc5, 0x0b, 0xdc, 0x77, + 0x36, 0x5f, 0xc9, 0x1d, 0xfb, 0x04, 0xdb, 0x90, 0xe8, 0x7c, 0xd2, 0x76, 0xb3, 0x40, 0xe6, 0xa0, 0x8a, 0x83, 0x81, 0xe8, 0xc3, 0xf3, 0x6a, 0xbe, 0x2b, 0x56, 0xfa, 0x30, 0x1a, 0x95, 0x45, 0x67, + 0xb4, 0xa9, 0x0d, 0xa1, 0xb3, 0x65, 0x3d, 0x75, 0x7a, 0x28, 0xc3, 0xee, 0x32, 0xef, 0xeb, 0xd3, 0x1e, 0x25, 0xf7, 0xc8, 0x72, 0x38, 0x01, 0x86, 0x12, 0xb1, 0xa4, 0xed, 0x70, 0x26, 0x00, 0xf5, + 0xb0, 0xf0, 0xf9, 0xba, 0x4e, 0x7b, 0xb1, 0x6d, 0x55, 0xf0, 0x20, 0x91, 0x88, 0x2d, 0x82, 0x29, 0xa6, 0xf3, 0xbb, 0x62, 0xa9, 0xa5, 0x56, 0xf8, 0x0c, 0x9d, 0x3e, 0x72, 0x2f, 0x5f, 0x41, 0xe7, + 0x3b, 0xd4, 0x06, 0x9b, 0xef, 0xc7, 0x8d, 0x9b, 0xd9, 0x02, 0x99, 0xbc, 0x6f, 0xf2, 0x13, 0x4c, 0x25, 0x07, 0xc0, 0x7c, 0x5b, 0xcc, 0x68, 0x11, 0x29, 0x12, 0x6c, 0x19, 0x23, 0xfb, 0x09, 0x14, + 0xb2, 0x7d, 0x2b, 0x40, 0xc5, 0xdd, 0xb6, 0x97, 0xc5, 0x33, 0x1a, 0x9a, 0x60, 0x11, 0xaf, 0x44, 0xab, 0x2e, 0x3e, 0xa0, 0xb5, 0xfe, 0x5a, 0x09, 0xfb, 0xd8, 0x62, 0x85, 0xa1, 0x18, 0xcb, 0xe1, + 0xdb, 0x2a, 0x9a, 0x43, 0xa6, 0xe9, 0x84, 0x43, 0x7f, 0x9f, 0x39, 0x24, 0xb4, 0x54, 0x5e, 0x57, 0xfa, 0x5f, 0x58, 0xfe, 0x6e, 0xbb, 0x90, 0x3f, 0x97, 0x18, 0xff, 0xe4, 0xf9, 0xbf, 0x96, 0xe7, + 0x9f, 0xe0, 0xf3, 0x55, 0xa6, 0xbf, 0x8f, 0xcf, 0x96, 0x6c, 0x8f, 0x75, 0x82, 0x80, 0x37, 0xcd, 0x4d, 0x4d, 0x1f, 0x44, 0x84, 0x59, 0x41, 0xa8, 0x46, 0x75, 0x82, 0x4e, 0xc0, 0x74, 0x86, 0x5c, + 0x1d, 0xc2, 0x81, 0xb3, 0x5b, 0xc5, 0x07, 0xf2, 0x50, 0xc5, 0xab, 0xa0, 0x0a, 0xbb, 0x81, 0x54, 0x55, 0x9b, 0x68, 0xba, 0xd4, 0xe5, 0x9e, 0xe1, 0xb0, 0x9a, 0x4d, 0x33, 0x4c, 0x4e, 0x20, 0x44, + 0x86, 0x97, 0x51, 0x47, 0xf6, 0xad, 0xb5, 0xb9, 0xb6, 0x83, 0x4e, 0x8f, 0x89, 0x9e, 0x49, 0xfa, 0x3f, 0x09, 0x9f, 0xdf, 0xaf, 0x76, 0xbc, 0x54, 0x79, 0x96, 0x7e, 0x2e, 0x74, 0x9c, 0xd7, 0x38, + 0x5a, 0x55, 0x9c, 0xed, 0xd7, 0xa9, 0x16, 0x6f, 0xf7, 0xf8, 0x94, 0x8d, 0x48, 0x7a, 0x21, 0xc3, 0xfa, 0xde, 0xea, 0xf1, 0x6b, 0x87, 0x84, 0x68, 0xc7, 0xc5, 0x60, 0x98, 0x67, 0x36, 0xcb, 0x71, + 0x8c, 0xa1, 0x33, 0x48, 0xdf, 0x19, 0x9b, 0xe5, 0xa2, 0xe4, 0x71, 0x64, 0x53, 0x2d, 0x0f, 0x8a, 0x27, 0x22, 0xc6, 0xdc, 0xef, 0x12, 0x72, 0x67, 0xb5, 0x82, 0x26, 0xdb, 0x0e, 0x47, 0xf5, 0x37, + 0x0b, 0x7f, 0xdd, 0x59, 0x74, 0x77, 0x07, 0xf2, 0x99, 0xf4, 0x68, 0xa1, 0xf0, 0xda, 0x61, 0xf2, 0xbb, 0x76, 0x40, 0xaf, 0x6d, 0x1f, 0xfe, 0xd1, 0x09, 0xe8, 0xbd, 0x09, 0x50, 0xcb, 0xed, 0xc3, + 0x4d, 0x37, 0xce, 0x59, 0xa2, 0xa3, 0x71, 0x14, 0x5b, 0x6d, 0xc8, 0x3c, 0x11, 0xb7, 0x3c, 0xdc, 0x67, 0x72, 0x73, 0x2f, 0x6b, 0xa1, 0x33, 0x18, 0xd0, 0x70, 0xb9, 0xcc, 0x67, 0xb9, 0xbb, 0x25, + 0x3a, 0xb0, 0xc6, 0x10, 0xcb, 0xcc, 0x0b, 0x50, 0xb8, 0x87, 0xae, 0x18, 0x7c, 0x01, 0x6d, 0xba, 0xf3, 0x75, 0x6c, 0x6f, 0x4d, 0x53, 0xf6, 0xd0, 0x89, 0x68, 0x2d, 0x00, 0x4b, 0xd2, 0x67, 0xa3, + 0x91, 0xe3, 0x43, 0x3f, 0xee, 0x50, 0x6d, 0x2a, 0x4a, 0x0a, 0xba, 0x29, 0x98, 0xe4, 0x41, 0xe6, 0x3c, 0xdc, 0x43, 0x02, 0x7e, 0xeb, 0xbc, 0x30, 0x5d, 0x6f, 0x60, 0x43, 0xe0, 0xed, 0x15, 0xb0, + 0x81, 0xfb, 0x1c, 0x55, 0x50, 0xbf, 0x5b, 0xba, 0x50, 0x34, 0xde, 0x90, 0x65, 0x67, 0x4b, 0x1b, 0x29, 0x0b, 0x30, 0x48, 0x10, 0xba, 0xce, 0x48, 0x44, 0xa6, 0xc6, 0x10, 0x9e, 0xf3, 0x6c, 0x58, + 0x1f, 0x20, 0x33, 0x56, 0x5d, 0x0d, 0x5d, 0x58, 0x7b, 0x3f, 0xe5, 0x11, 0x58, 0xeb, 0x53, 0x9d, 0x61, 0x16, 0x0d, 0x0d, 0xcf, 0x53, 0x66, 0xfa, 0x2a, 0x45, 0xc3, 0x31, 0x3d, 0x63, 0xf0, 0x02, + 0x9e, 0x0f, 0x51, 0x65, 0x51, 0x2e, 0x6f, 0xf7, 0x03, 0x7b, 0x58, 0x48, 0x70, 0x91, 0xc1, 0x77, 0x53, 0xa7, 0x72, 0xbd, 0xfb, 0xcc, 0x1d, 0x9f, 0xf4, 0xb2, 0xd3, 0xfc, 0xaf, 0xbf, 0xd3, 0xb7, + 0x19, 0x42, 0xe7, 0x56, 0x83, 0xe7, 0xf5, 0xb8, 0x8b, 0x21, 0x53, 0x49, 0xb3, 0x73, 0x56, 0x16, 0xf6, 0x86, 0xc2, 0xb7, 0x19, 0x5d, 0x9f, 0xf9, 0x5e, 0x5f, 0x36, 0x78, 0x3a, 0x92, 0x17, 0x0c, + 0xd3, 0x8b, 0xf4, 0x3d, 0xe4, 0x36, 0x05, 0x30, 0x2c, 0x8c, 0xc4, 0x0b, 0x15, 0x1d, 0x8c, 0x92, 0x30, 0x33, 0xb4, 0x8b, 0xfa, 0x28, 0xf4, 0x76, 0x29, 0x3f, 0xf4, 0x41, 0xcd, 0x73, 0xce, 0x39, + 0x71, 0xc8, 0x97, 0xd4, 0xb3, 0xf8, 0xf4, 0x88, 0x26, 0xf3, 0xf1, 0xce, 0x92, 0xef, 0x17, 0x9f, 0xe4, 0x2b, 0xbf, 0xdd, 0x4b, 0x45, 0x69, 0xcd, 0xaf, 0x37, 0xeb, 0x24, 0x89, 0x75, 0xf6, 0x78, + 0x1e, 0xc9, 0xc9, 0x9f, 0x3b, 0x81, 0x67, 0xa0, 0x10, 0xf8, 0x71, 0xd8, 0x76, 0x13, 0x1a, 0x1a, 0xe8, 0x6c, 0x62, 0x43, 0x55, 0xfb, 0x75, 0xb4, 0xed, 0x4c, 0xe7, 0xc0, 0x46, 0x21, 0xa7, 0x68, + 0x47, 0x49, 0x47, 0xa1, 0x65, 0xcc, 0x85, 0x5a, 0x1b, 0x64, 0xdd, 0x91, 0xa8, 0x47, 0xc2, 0x70, 0x58, 0x75, 0x2d, 0x04, 0x36, 0x61, 0x42, 0x59, 0xf4, 0xd7, 0x8c, 0xaa, 0xf5, 0xe2, 0x81, 0x09, + 0xcd, 0xb6, 0x25, 0xd2, 0x73, 0xbb, 0x32, 0x10, 0xa3, 0x90, 0xda, 0x63, 0x2c, 0x8c, 0x2b, 0xf2, 0x84, 0xc7, 0xa4, 0x6f, 0x5b, 0xbf, 0x7e, 0x8b, 0x9f, 0x4f, 0xbe, 0xb9, 0xaf, 0x93, 0x5f, 0x59, + 0xb9, 0x7b, 0x87, 0x09, 0x81, 0xe7, 0xa3, 0x66, 0x93, 0xd1, 0x16, 0x93, 0xba, 0x8c, 0x0e, 0x72, 0xda, 0x11, 0xc3, 0x83, 0xac, 0x8c, 0x7b, 0x8b, 0xf1, 0x60, 0x24, 0x2f, 0x2b, 0xae, 0xa7, 0xec, + 0x22, 0x0f, 0xee, 0xf3, 0x8b, 0x2e, 0xd0, 0x67, 0x3a, 0xca, 0xd8, 0xa9, 0x0c, 0x9f, 0xb7, 0x85, 0x72, 0x7f, 0x90, 0x2c, 0x12, 0xb3, 0xf1, 0x25, 0xc2, 0x8f, 0xad, 0xd5, 0x60, 0x18, 0x2d, 0xe3, + 0x19, 0x27, 0xce, 0x35, 0xdf, 0xdf, 0x4d, 0x72, 0x2b, 0x99, 0xbb, 0x63, 0x8f, 0xc9, 0x36, 0xc5, 0xbc, 0x65, 0x71, 0xc2, 0x05, 0xa3, 0x3c, 0x6c, 0xdc, 0xfa, 0x85, 0x75, 0x2f, 0x66, 0xdd, 0x91, + 0x65, 0xdf, 0x4f, 0xdb, 0xb2, 0x6d, 0x9a, 0x81, 0xba, 0xd1, 0xe4, 0x1b, 0xe7, 0x89, 0x03, 0x7e, 0xec, 0x6b, 0xf0, 0xd0, 0x07, 0x7e, 0x85, 0x55, 0x1f, 0x3e, 0xa5, 0x11, 0xbd, 0x0f, 0xc6, 0x9a, + 0x5c, 0xf6, 0x16, 0xcc, 0xbc, 0xe1, 0x2d, 0x7e, 0x63, 0x11, 0xc6, 0xea, 0x50, 0xcc, 0xe5, 0x41, 0xb9, 0xa1, 0xfb, 0x85, 0xa9, 0x2a, 0x43, 0xaa, 0xbb, 0x5d, 0xd8, 0xa8, 0x36, 0x01, 0x30, 0x97, + 0x30, 0x85, 0x41, 0xbd, 0x12, 0xd8, 0xc3, 0x86, 0x19, 0x63, 0xfa, 0x1a, 0x53, 0xa8, 0x4d, 0x4d, 0x57, 0xa8, 0x09, 0xe5, 0x12, 0x6c, 0x60, 0x0c, 0xb9, 0xf1, 0x43, 0x9d, 0xc3, 0xc2, 0x05, 0x81, + 0xbb, 0x4b, 0xa9, 0x33, 0x5c, 0x2f, 0x47, 0x4d, 0x06, 0xf7, 0x53, 0xac, 0x3d, 0xe9, 0x10, 0x89, 0xbd, 0xd4, 0x29, 0xeb, 0x06, 0xf6, 0x27, 0x86, 0x3e, 0x7a, 0x45, 0x62, 0xed, 0xba, 0x64, 0x99, + 0x58, 0x2c, 0x75, 0x42, 0xa9, 0xea, 0xb8, 0x68, 0xd7, 0x66, 0x0c, 0x68, 0xd8, 0x59, 0xb3, 0x1d, 0xa4, 0x9c, 0xf8, 0x3c, 0xc3, 0xb2, 0x2b, 0xc8, 0xe2, 0xa6, 0x01, 0x2f, 0x76, 0x77, 0x03, 0xc2, + 0x4e, 0xcb, 0x29, 0xc5, 0x4c, 0x78, 0x17, 0xee, 0x0c, 0x35, 0x62, 0xb8, 0x13, 0xeb, 0x8e, 0x36, 0x18, 0x01, 0xc0, 0xc1, 0x8b, 0x38, 0x76, 0x64, 0x71, 0x8a, 0x93, 0xad, 0x53, 0x18, 0xeb, 0x2e, + 0xe7, 0x34, 0xfe, 0x6c, 0x92, 0x1f, 0xdf, 0xf4, 0x71, 0x47, 0x23, 0xe4, 0x25, 0x6f, 0xe5, 0x03, 0xea, 0x07, 0x2e, 0x1c, 0xd3, 0x6c, 0x4a, 0x8d, 0x5a, 0xcc, 0xe6, 0xc3, 0x38, 0x0f, 0x97, 0x04, + 0x30, 0xe9, 0x74, 0xb6, 0x9e, 0x4c, 0x67, 0xa5, 0xa1, 0x2b, 0x73, 0x93, 0xec, 0x1e, 0xd0, 0xa5, 0x25, 0xad, 0x0f, 0x85, 0x25, 0x4f, 0x77, 0xe1, 0x8c, 0x8f, 0xe5, 0xdc, 0xf4, 0xc7, 0x8e, 0x0a, + 0x67, 0x13, 0x34, 0x33, 0xac, 0x19, 0x33, 0x95, 0x55, 0x24, 0x5a, 0x8b, 0xd6, 0xc8, 0xf6, 0x62, 0xce, 0xeb, 0xc2, 0xc6, 0x14, 0xd6, 0xb0, 0x92, 0x29, 0x24, 0xcd, 0xaf, 0x0f, 0xf8, 0x8f, 0x17, + 0xb3, 0x9a, 0xd7, 0xfe, 0xb6, 0x4d, 0x11, 0xfa, 0x42, 0x61, 0xc8, 0x07, 0xd4, 0x33, 0x62, 0xde, 0x1b, 0x15, 0xa1, 0xcf, 0x4a, 0x40, 0x9a, 0x44, 0x2e, 0x2e, 0xeb, 0x6b, 0xd6, 0x92, 0xa4, 0x4b, + 0x67, 0xb9, 0x74, 0x4a, 0x19, 0xb5, 0x45, 0x7d, 0x6c, 0x6a, 0x43, 0x71, 0x6f, 0x74, 0xb6, 0x53, 0x33, 0x28, 0x7d, 0x66, 0xbe, 0xd9, 0xda, 0xbe, 0xc1, 0x0b, 0x74, 0xd2, 0x87, 0x97, 0x83, 0xd2, + 0x67, 0x21, 0x29, 0x0b, 0xb1, 0x05, 0x35, 0x0f, 0x65, 0x3e, 0x22, 0x34, 0xc7, 0x93, 0xd5, 0x43, 0x3d, 0x25, 0x9c, 0xa5, 0xb8, 0x94, 0xd2, 0x31, 0xd0, 0x33, 0xb8, 0x67, 0xd6, 0xf2, 0x37, 0x85, + 0x0f, 0x47, 0x7c, 0x79, 0x8e, 0x0a, 0x99, 0xe9, 0x5b, 0x9a, 0x29, 0xd9, 0x87, 0x04, 0xbc, 0xb2, 0x6c, 0x2e, 0xef, 0x2a, 0xcf, 0xf6, 0xcf, 0x91, 0x13, 0xae, 0x0a, 0x9c, 0xbf, 0x66, 0xcc, 0xdf, + 0x98, 0x22, 0x4d, 0xc3, 0x43, 0xf4, 0xd7, 0x67, 0x18, 0xfe, 0x72, 0xcc, 0xd1, 0x92, 0xf0, 0x33, 0x47, 0x1c, 0xbf, 0x7d, 0x85, 0xc8, 0xd1, 0x2e, 0x86, 0x4f, 0x7b, 0xad, 0x9e, 0xe5, 0xec, 0xc7, + 0x77, 0xb6, 0x5e, 0xe0, 0x79, 0xc2, 0x32, 0x77, 0x53, 0xe4, 0x1f, 0x5a, 0x11, 0xaf, 0xa8, 0xc9, 0xc7, 0x8f, 0x39, 0x33, 0xd5, 0xfd, 0x34, 0xfd, 0x96, 0xe9, 0x2e, 0x9e, 0xad, 0x43, 0x65, 0x1f, + 0x98, 0xec, 0x3b, 0xf4, 0x50, 0x0e, 0x97, 0x6c, 0xe6, 0xad, 0x13, 0x65, 0x98, 0x99, 0x36, 0xb1, 0xdd, 0x39, 0xee, 0xc8, 0x55, 0xbc, 0xad, 0xb6, 0xa7, 0x52, 0x65, 0x95, 0xe5, 0x4a, 0xb0, 0xe0, + 0xaa, 0x89, 0x70, 0x08, 0x86, 0xf6, 0x62, 0xdb, 0xe3, 0xc6, 0xf1, 0xf0, 0xc0, 0x51, 0x7e, 0x3a, 0xa7, 0x39, 0x38, 0x67, 0xfd, 0xd8, 0xdb, 0x97, 0x2e, 0xbb, 0xa6, 0x0f, 0x45, 0x39, 0xfc, 0xbe, + 0xc9, 0xfc, 0xe5, 0x4b, 0x3f, 0xc3, 0x18, 0xf5, 0x86, 0xfc, 0xdc, 0xaf, 0xba, 0xf3, 0x80, 0x1b, 0x5c, 0x7d, 0x22, 0xa9, 0x29, 0xdd, 0x79, 0x8a, 0x25, 0xdc, 0x76, 0x4b, 0x99, 0x9b, 0xf9, 0x96, + 0x0b, 0xc9, 0x2b, 0x7e, 0x6b, 0xf7, 0x36, 0x61, 0x31, 0x98, 0x69, 0x4e, 0x0f, 0x22, 0xfc, 0x4d, 0xd6, 0x1d, 0x49, 0xd2, 0x41, 0x04, 0xd0, 0x35, 0xc3, 0xf5, 0xf3, 0x80, 0xe2, 0xe6, 0xcb, 0x3d, + 0x1a, 0x4e, 0x47, 0x99, 0x9a, 0x77, 0x64, 0x39, 0x22, 0xf7, 0xb1, 0x0b, 0x18, 0x32, 0x94, 0x53, 0x35, 0xa0, 0x5b, 0x8c, 0x25, 0x50, 0xb8, 0x66, 0x0e, 0xe6, 0x01, 0xd3, 0xd2, 0x8f, 0xb8, 0xa8, + 0x11, 0xfa, 0xe2, 0x06, 0x7c, 0x36, 0x1f, 0x3d, 0x4e, 0x04, 0xf4, 0x7a, 0x22, 0x24, 0xa6, 0xae, 0xfd, 0xba, 0x6b, 0x9d, 0xbf, 0x97, 0xa4, 0xa5, 0x8e, 0xef, 0x78, 0xca, 0xf9, 0x53, 0xdf, 0x8b, + 0x85, 0x7e, 0x3a, 0x55, 0xfe, 0x38, 0xfa, 0xcf, 0xad, 0x3c, 0xe8, 0x86, 0x00, 0xde, 0xd1, 0xed, 0x49, 0xed, 0xcc, 0xb8, 0x32, 0x92, 0x6e, 0x8d, 0xed, 0x9f, 0xf7, 0x24, 0xb9, 0x05, 0x7e, 0x26, + 0xf8, 0xc5, 0xa5, 0xc6, 0xf8, 0x7e, 0xd2, 0xa3, 0x04, 0x01, 0x67, 0xbb, 0x48, 0x93, 0x43, 0x8b, 0xec, 0xc7, 0x82, 0x10, 0x0f, 0x24, 0xc0, 0x9e, 0xd3, 0x72, 0x1e, 0xeb, 0x84, 0x31, 0xff, 0xe9, + 0xee, 0x1b, 0xcd, 0xf3, 0x13, 0x43, 0x7f, 0xdc, 0xf0, 0xe3, 0xb5, 0xb0, 0xc1, 0x05, 0xdc, 0xf3, 0x57, 0x9e, 0xce, 0xda, 0x06, 0x10, 0x76, 0x22, 0xc0, 0xee, 0x4c, 0x76, 0x3d, 0x5f, 0x0b, 0x2b, + 0x79, 0xba, 0x9a, 0x19, 0x4e, 0x30, 0x14, 0x79, 0xab, 0xca, 0x04, 0xa4, 0x9c, 0x8d, 0x20, 0x16, 0x5a, 0xb1, 0x93, 0xde, 0xff, 0xc3, 0xde, 0x9f, 0x36, 0x29, 0xcb, 0x45, 0xfb, 0xe1, 0xf0, 0x57, + 0xe9, 0xba, 0x5f, 0x25, 0x31, 0x5e, 0xcc, 0x83, 0x4f, 0x25, 0xa9, 0x88, 0xa2, 0xa0, 0x08, 0x28, 0x8a, 0x42, 0x92, 0x53, 0xc5, 0x3c, 0x0f, 0x32, 0x43, 0x9d, 0xca, 0x67, 0x7f, 0xca, 0xa1, 0x07, + 0xfb, 0x6a, 0x5b, 0xda, 0xfb, 0x3a, 0x75, 0xe7, 0x9c, 0xfa, 0xbf, 0x6a, 0x36, 0xda, 0x0b, 0xf9, 0xad, 0xbd, 0xd7, 0x5e, 0x7b, 0x8d, 0x1e, 0x86, 0xd3, 0xb9, 0x02, 0x9b, 0x75, 0x5d, 0xb1, 0x20, + 0x18, 0xb0, 0x0b, 0x66, 0x91, 0xb0, 0x44, 0xba, 0x92, 0x8f, 0xf3, 0x64, 0x65, 0xd5, 0xa4, 0xb4, 0x52, 0x61, 0x49, 0xb2, 0x99, 0x25, 0xb3, 0xe3, 0x98, 0xc3, 0x34, 0xff, 0x49, 0x85, 0xd8, 0x3e, + 0xe5, 0x52, 0xce, 0xef, 0x95, 0x6b, 0x76, 0x3f, 0xb9, 0xfa, 0xa4, 0xca, 0x7b, 0x4b, 0xff, 0x15, 0xcd, 0xdb, 0xbb, 0x7d, 0xd3, 0x63, 0xf7, 0x83, 0xe5, 0xc2, 0x80, 0xcd, 0x88, 0xe5, 0x42, 0x31, + 0x0d, 0xa7, 0x00, 0x83, 0x2e, 0x47, 0xe1, 0x88, 0x33, 0xc6, 0xcc, 0xd8, 0x16, 0x0b, 0x11, 0xa7, 0x14, 0x12, 0x2d, 0x65, 0xee, 0xb0, 0xc6, 0xe9, 0xca, 0xe8, 0x46, 0x9c, 0xe1, 0x20, 0x88, 0x02, + 0x77, 0x10, 0x2b, 0xeb, 0xe1, 0x16, 0x6f, 0x4c, 0x05, 0x43, 0xc5, 0x83, 0x22, 0x33, 0x74, 0x35, 0x00, 0xf7, 0xe9, 0x91, 0x64, 0x13, 0xbc, 0x0b, 0xbe, 0xef, 0x5c, 0xf9, 0x7e, 0xd8, 0xbf, 0xa3, + 0xb3, 0x3c, 0xd3, 0x10, 0xe9, 0x4a, 0xf4, 0x0a, 0xc6, 0x09, 0x80, 0x0b, 0xa1, 0xc7, 0x08, 0xa8, 0x1c, 0x28, 0xe3, 0x25, 0x42, 0x98, 0x38, 0x56, 0x8c, 0x15, 0x32, 0x5c, 0xd5, 0xf2, 0x6a, 0x56, + 0xcc, 0xaa, 0x98, 0xb6, 0x16, 0xc6, 0x9c, 0x04, 0xd7, 0x14, 0x2f, 0x99, 0x13, 0xf7, 0x38, 0x89, 0x50, 0x0f, 0x6d, 0x06, 0x5e, 0x0e, 0x20, 0xa4, 0xb0, 0x83, 0x50, 0xa7, 0x5b, 0x94, 0x9b, 0x83, + 0x9b, 0x5a, 0xf1, 0x96, 0x1b, 0xa4, 0xdb, 0x45, 0xc7, 0x1b, 0x25, 0xb6, 0x8c, 0xa1, 0xa4, 0xec, 0x56, 0x48, 0x4f, 0x29, 0xf9, 0x3f, 0x5f, 0x7f, 0xb6, 0xe6, 0x57, 0xaf, 0x39, 0x50, 0xef, 0xd5, + 0x4c, 0x6e, 0xe3, 0x01, 0x5e, 0xcb, 0xe3, 0x84, 0x89, 0xe3, 0xdc, 0xed, 0x7d, 0xa5, 0x55, 0x95, 0x77, 0x29, 0xac, 0x42, 0x7c, 0x36, 0xdf, 0x7c, 0xbd, 0x81, 0x9d, 0x68, 0x60, 0xbf, 0x7f, 0xf1, + 0x04, 0xa0, 0x95, 0x65, 0x6f, 0xc9, 0x68, 0xc8, 0x97, 0xf6, 0x9a, 0x61, 0xad, 0x65, 0xf1, 0xeb, 0x6f, 0xf9, 0x2d, 0xad, 0xcb, 0xf6, 0x62, 0x73, 0x18, 0x9d, 0xbe, 0xf4, 0x2a, 0xa9, 0x3f, 0x5b, + 0x7d, 0x42, 0xad, 0xc8, 0x8b, 0xf7, 0xf7, 0x85, 0x6e, 0x7e, 0x46, 0xe8, 0x39, 0x6e, 0x71, 0xfa, 0xff, 0xcc, 0x3a, 0x96, 0x56, 0x5e, 0xbc, 0x6d, 0x17, 0xb7, 0x26, 0x1b, 0x2f, 0x4e, 0x5e, 0x37, + 0x1a, 0xe4, 0x37, 0x6b, 0x4e, 0xd3, 0x0e, 0x35, 0xd3, 0xcc, 0xde, 0xb0, 0x22, 0xee, 0xec, 0x34, 0x9f, 0xb2, 0x0f, 0x73, 0xcb, 0x28, 0x33, 0xeb, 0x02, 0xd6, 0xed, 0xc1, 0xf9, 0x76, 0x43, 0xfa, + 0x98, 0x57, 0x87, 0xdc, 0x82, 0x58, 0x78, 0x71, 0x3b, 0x0c, 0xb3, 0xf2, 0xfa, 0x69, 0xff, 0xbd, 0xe6, 0x23, 0xf2, 0x5f, 0xdb, 0x26, 0x9f, 0x09, 0x97, 0xb9, 0xa1, 0xfc, 0x61, 0x91, 0x9c, 0xc7, + 0x43, 0xb0, 0x5f, 0xf0, 0x4c, 0x32, 0xb1, 0x53, 0x23, 0x9f, 0xc6, 0xa6, 0x13, 0x4f, 0x65, 0xc7, 0x63, 0x09, 0xbd, 0x9e, 0x2d, 0xc7, 0x65, 0x0c, 0x9b, 0xc2, 0x00, 0x75, 0x49, 0xb4, 0xa2, 0xc2, + 0x60, 0x9f, 0xef, 0xe3, 0x0e, 0x10, 0x76, 0xcb, 0xd1, 0xc6, 0xb2, 0x6d, 0x6c, 0x37, 0x4b, 0x66, 0x21, 0x8c, 0x42, 0xcd, 0xd6, 0xe3, 0x2c, 0x66, 0x7f, 0x00, 0xaa, 0xdd, 0xa8, 0x0b, 0xa6, 0xf2, + 0xe1, 0xa8, 0xec, 0x1a, 0x5f, 0xa8, 0x19, 0xe3, 0xf1, 0xd1, 0xef, 0x76, 0xa2, 0x7d, 0x8d, 0xc9, 0xb3, 0x07, 0xc0, 0x0f, 0xb4, 0x3f, 0xa0, 0x72, 0xbd, 0x33, 0x04, 0xfb, 0x1d, 0x06, 0x73, 0x88, + 0x5e, 0x3b, 0x25, 0x55, 0x03, 0xa3, 0x63, 0x61, 0x40, 0x29, 0xb0, 0xdf, 0x2a, 0xa8, 0x75, 0x1c, 0xed, 0x57, 0x1b, 0x76, 0x3c, 0x09, 0xfc, 0x01, 0xb3, 0x35, 0x04, 0x76, 0x09, 0x79, 0x31, 0xba, + 0x92, 0x31, 0x6d, 0xa6, 0xad, 0x27, 0x23, 0x75, 0xc2, 0x16, 0xa0, 0xb9, 0x20, 0xd2, 0x0c, 0xd3, 0x59, 0x1b, 0x0d, 0xc5, 0x94, 0xa9, 0xc6, 0x85, 0x08, 0xb7, 0x75, 0xba, 0xe5, 0x9d, 0x9c, 0x70, + 0x8f, 0x8f, 0xb5, 0xd1, 0xe3, 0xdd, 0xe3, 0x30, 0xf4, 0xac, 0xca, 0x7e, 0xbc, 0x82, 0x70, 0x1c, 0x5e, 0x88, 0x3c, 0x7e, 0x77, 0x82, 0x36, 0xba, 0x9c, 0x74, 0x58, 0x71, 0x9a, 0xc9, 0xdd, 0x76, + 0x40, 0x07, 0xb9, 0x42, 0x19, 0x65, 0x7a, 0x5c, 0xb5, 0x8d, 0xc4, 0x1c, 0x0e, 0x19, 0x23, 0x70, 0x9b, 0x4d, 0xb3, 0x83, 0x81, 0xa9, 0x67, 0xc8, 0x24, 0x41, 0x8e, 0x56, 0x1b, 0x6a, 0xb3, 0x21, + 0x07, 0x8c, 0x01, 0x97, 0xfb, 0x6e, 0x57, 0xa6, 0x42, 0x8e, 0x2a, 0x12, 0xba, 0xe8, 0xa8, 0x88, 0x6a, 0x7c, 0x7f, 0x22, 0x53, 0xcd, 0xf4, 0xb3, 0x59, 0xff, 0x9e, 0xf4, 0xcc, 0xac, 0x32, 0xff, + 0x98, 0xcb, 0xdb, 0x27, 0x16, 0xe3, 0x8b, 0x5c, 0xea, 0xaf, 0x30, 0xc4, 0x9f, 0x33, 0x48, 0x7d, 0x22, 0x7e, 0x42, 0xf3, 0xd3, 0xad, 0x73, 0xf4, 0x67, 0x8f, 0xb5, 0x46, 0xcc, 0xd3, 0x1c, 0x38, + 0xec, 0xdb, 0x48, 0xe7, 0x02, 0x78, 0xcd, 0x29, 0x4b, 0x94, 0xef, 0xd2, 0x95, 0x90, 0x29, 0xfe, 0xca, 0x35, 0xd9, 0xe6, 0x50, 0xb2, 0x55, 0x0b, 0xaf, 0xa9, 0x9c, 0xa3, 0xf1, 0xd0, 0x2f, 0x13, + 0x73, 0x59, 0x99, 0xc1, 0x3e, 0x07, 0x8c, 0xb4, 0x5d, 0x2c, 0x90, 0x89, 0xcc, 0xca, 0x29, 0x03, 0x0a, 0x1e, 0xc4, 0x54, 0x0e, 0x94, 0x54, 0xfa, 0xaa, 0xe3, 0xcc, 0x19, 0x45, 0x3d, 0x7f, 0x8e, + 0x3e, 0x89, 0xea, 0x0f, 0xc9, 0xb9, 0x77, 0x4a, 0x6b, 0xfe, 0x5b, 0x44, 0x99, 0xd9, 0x5e, 0x18, 0x0e, 0x33, 0x2d, 0xbe, 0xdb, 0xac, 0x80, 0x78, 0x96, 0x55, 0x57, 0xb2, 0x17, 0x26, 0x5d, 0x07, + 0xe7, 0x32, 0x94, 0x3d, 0xd8, 0x73, 0x14, 0x92, 0xd1, 0x6c, 0x60, 0xae, 0x76, 0xd1, 0x04, 0xe6, 0x0c, 0x1d, 0xa5, 0x74, 0xb9, 0x8a, 0x97, 0x8b, 0x66, 0x2b, 0xfa, 0x93, 0x68, 0xb0, 0xd9, 0xa4, + 0x16, 0xea, 0x4c, 0xcb, 0x79, 0xd6, 0x05, 0x1c, 0x11, 0xd1, 0x72, 0x08, 0x98, 0xbe, 0x22, 0x95, 0xb0, 0x60, 0xae, 0x61, 0x51, 0x43, 0x40, 0x98, 0x47, 0x93, 0x63, 0x20, 0x39, 0x23, 0x2f, 0xc3, + 0x7d, 0x8d, 0xdb, 0x2f, 0xe0, 0x9d, 0x24, 0xa7, 0x8f, 0x7c, 0xd5, 0xf7, 0xd9, 0x53, 0x24, 0xd7, 0x5c, 0x86, 0x57, 0xa0, 0x2e, 0x01, 0xba, 0x3f, 0x3f, 0x17, 0xf5, 0x32, 0x21, 0xdc, 0xec, 0xeb, + 0x5f, 0x9b, 0xd6, 0x9f, 0x09, 0x69, 0xfa, 0x40, 0xf7, 0xcc, 0x93, 0xb7, 0xd1, 0x10, 0xed, 0x17, 0xda, 0xe4, 0xa6, 0x71, 0xc1, 0x54, 0x4b, 0xd0, 0x13, 0x98, 0x14, 0x49, 0x8f, 0xfb, 0xcd, 0x66, + 0x47, 0x77, 0x5e, 0xa2, 0x65, 0x68, 0x91, 0x92, 0x56, 0x49, 0x4d, 0xc9, 0x69, 0x20, 0xce, 0x11, 0x59, 0x2b, 0x85, 0xcc, 0x53, 0x39, 0xa7, 0x9e, 0xab, 0xdc, 0x96, 0x4f, 0xf1, 0x56, 0x95, 0x32, + 0xd3, 0x28, 0x16, 0xe4, 0x66, 0x32, 0x95, 0x88, 0xce, 0x55, 0xa5, 0x0d, 0x2c, 0x0f, 0x5a, 0x41, 0xa3, 0x74, 0x3e, 0xa9, 0xfb, 0xc9, 0x22, 0xfb, 0x1b, 0x8b, 0xf7, 0x17, 0x95, 0x06, 0xec, 0xdf, + 0x4c, 0xbd, 0x97, 0x94, 0xfa, 0x1b, 0x83, 0xd3, 0x59, 0xa3, 0x3f, 0xf3, 0x15, 0xfe, 0x4e, 0x01, 0x19, 0xbe, 0xb6, 0xa4, 0x7d, 0x55, 0xd4, 0x7e, 0xca, 0xf4, 0x5e, 0xc1, 0x53, 0x37, 0x12, 0xe0, + 0xde, 0xb1, 0xf0, 0xe7, 0xf5, 0xd6, 0xde, 0xc9, 0x9e, 0x78, 0xfe, 0x36, 0x38, 0x1f, 0x0a, 0x7b, 0xd4, 0x5c, 0x33, 0xa3, 0x51, 0x8e, 0x89, 0x35, 0xb1, 0x30, 0xc0, 0x79, 0xb5, 0x52, 0xf4, 0xdc, + 0xe5, 0xf1, 0xce, 0x70, 0x27, 0xe3, 0xd1, 0xc6, 0x59, 0x87, 0x5d, 0x47, 0xab, 0x07, 0xa4, 0x6a, 0xc3, 0xcd, 0x88, 0x3d, 0xce, 0x6c, 0x89, 0x3c, 0x18, 0x9e, 0x1e, 0xee, 0x0e, 0xc2, 0xd2, 0xde, + 0xe3, 0x92, 0x57, 0x2e, 0x40, 0x0b, 0x42, 0xac, 0xa9, 0xa2, 0x26, 0xaa, 0x8c, 0xd5, 0x66, 0x66, 0x55, 0x84, 0x88, 0xf0, 0xf5, 0xdf, 0x13, 0x93, 0xc5, 0xe5, 0x9d, 0x7f, 0xaf, 0x90, 0x90, 0x79, + 0x51, 0xa6, 0xd9, 0x6f, 0xf2, 0xf3, 0xa7, 0x39, 0x26, 0xcf, 0xca, 0xcf, 0x37, 0x25, 0xfb, 0xae, 0xe3, 0xe5, 0x89, 0xc3, 0xfc, 0x85, 0xe8, 0x95, 0x65, 0x79, 0x91, 0x5d, 0xbc, 0x2a, 0x3d, 0x4e, + 0xf1, 0x68, 0x27, 0x36, 0xd3, 0xd6, 0x9d, 0xb4, 0x1e, 0x0f, 0xd7, 0xec, 0xb8, 0x90, 0x38, 0x16, 0x77, 0x0c, 0x12, 0x06, 0x68, 0xff, 0xa8, 0x1a, 0x50, 0x12, 0xb3, 0xe8, 0xaa, 0x03, 0x42, 0x30, + 0xdd, 0x67, 0xe3, 0x30, 0x97, 0x6c, 0x85, 0x01, 0x60, 0x95, 0x35, 0x76, 0x03, 0x0b, 0x49, 0xc6, 0x70, 0x3d, 0xad, 0xf5, 0x8e, 0xdd, 0xf3, 0xcb, 0x5a, 0x83, 0x91, 0x19, 0x99, 0xb9, 0xf8, 0x60, + 0xba, 0xd9, 0x07, 0x0f, 0x74, 0xa5, 0x37, 0xa6, 0xdc, 0x73, 0xa7, 0x3c, 0xb1, 0x7d, 0x5c, 0x68, 0x5e, 0x01, 0x28, 0x2c, 0xb3, 0x6f, 0x62, 0x40, 0x37, 0x4e, 0xc6, 0x6b, 0xaf, 0x34, 0xdb, 0x41, + 0x86, 0x49, 0x55, 0x2c, 0xd5, 0xc8, 0x72, 0xd1, 0x62, 0x49, 0x0e, 0x24, 0x9b, 0x85, 0xc2, 0x74, 0x59, 0xe7, 0x6b, 0x40, 0x41, 0x4d, 0x8f, 0x99, 0x5a, 0xf0, 0xee, 0xae, 0x26, 0xf5, 0x02, 0x6f, + 0x49, 0x81, 0xea, 0x56, 0x7b, 0xc3, 0xdf, 0x67, 0x03, 0x32, 0xf4, 0x64, 0x92, 0xd6, 0xf1, 0x56, 0x70, 0x6b, 0x72, 0xaf, 0x12, 0xf2, 0x4c, 0xc5, 0xd4, 0xee, 0xc7, 0xf5, 0x8b, 0xed, 0x24, 0x1b, + 0x5a, 0x9a, 0x71, 0xaf, 0xf1, 0xdf, 0x49, 0x8c, 0x3c, 0xe1, 0x62, 0xba, 0x12, 0x3d, 0x81, 0x72, 0xbd, 0x3c, 0x9f, 0x2c, 0x7a, 0x38, 0x95, 0xfc, 0xa3, 0x62, 0x73, 0x29, 0x11, 0x25, 0xa3, 0x8a, + 0x6d, 0xd7, 0x36, 0xd9, 0x06, 0x7b, 0xb8, 0x22, 0xc6, 0x03, 0x98, 0x47, 0xd7, 0xbe, 0x35, 0xb1, 0x58, 0x6c, 0x30, 0xed, 0x46, 0x87, 0x4c, 0xf3, 0x04, 0xc8, 0x73, 0x62, 0x12, 0xaa, 0x7d, 0x8f, + 0x21, 0x66, 0xfa, 0xa8, 0x92, 0x84, 0x7d, 0xb5, 0xb6, 0xf9, 0x22, 0x92, 0x34, 0x94, 0x81, 0x37, 0xc9, 0x7a, 0x9b, 0x65, 0x07, 0xaf, 0x32, 0x77, 0x6a, 0xf4, 0x28, 0x54, 0xe9, 0x67, 0xc5, 0xdc, + 0x90, 0x3e, 0x6b, 0x2d, 0xc9, 0xbe, 0x41, 0x15, 0x7e, 0xaa, 0x4c, 0xd7, 0x95, 0xe6, 0x05, 0xd4, 0x33, 0xa6, 0x70, 0x9f, 0x62, 0x5c, 0x93, 0x01, 0x3a, 0xde, 0x51, 0x5e, 0x99, 0x47, 0xd3, 0x75, + 0x82, 0x93, 0x38, 0x16, 0xfa, 0xe6, 0x78, 0xab, 0xe7, 0x73, 0x2c, 0xf8, 0x76, 0xad, 0x24, 0x59, 0x34, 0x34, 0xb5, 0xe2, 0x5e, 0x60, 0x39, 0xfc, 0x0b, 0x7b, 0x66, 0xb5, 0xbc, 0x52, 0xbd, 0xbc, + 0xc5, 0xe5, 0x7a, 0x78, 0xa6, 0xf5, 0x78, 0x6e, 0x44, 0x30, 0xc4, 0x23, 0x7b, 0x21, 0xa2, 0xe9, 0xdd, 0xc6, 0x09, 0x70, 0x6a, 0x34, 0xe7, 0x04, 0x1a, 0xdd, 0x94, 0x7b, 0x61, 0x66, 0xc3, 0x24, + 0xe7, 0xba, 0xa3, 0xe3, 0x5c, 0xb1, 0xf8, 0x70, 0x7e, 0x44, 0xe5, 0xe9, 0x61, 0x17, 0x2e, 0x5a, 0xb8, 0x70, 0xe1, 0x3c, 0xa4, 0xf8, 0x1d, 0x39, 0x4f, 0x49, 0xba, 0x0b, 0x13, 0x45, 0x15, 0x3c, + 0x5d, 0x5d, 0x10, 0x05, 0x66, 0x19, 0x6c, 0x36, 0x93, 0x7c, 0xb9, 0xaf, 0xe3, 0x3c, 0x6f, 0x63, 0x23, 0xf0, 0x8a, 0xeb, 0xe6, 0xfa, 0x29, 0x45, 0xc3, 0x48, 0x22, 0xfd, 0xdc, 0xe9, 0xe6, 0xad, + 0x0e, 0xf8, 0x65, 0xa7, 0xbf, 0x29, 0x86, 0x14, 0x79, 0x91, 0x75, 0x6e, 0x95, 0x91, 0x5f, 0xf7, 0x70, 0xe8, 0xc9, 0xc6, 0x3e, 0x1f, 0xfe, 0xeb, 0x7b, 0xfe, 0x79, 0xe6, 0x75, 0xe2, 0x7e, 0x2d, + 0xf0, 0x9f, 0x69, 0xed, 0xf5, 0x4e, 0xf6, 0xca, 0xc1, 0xcb, 0xe0, 0xec, 0x2d, 0xed, 0x21, 0xf4, 0x65, 0xd2, 0xe1, 0xa2, 0x01, 0x0a, 0xb1, 0x00, 0x19, 0x38, 0xe5, 0x1a, 0x05, 0x12, 0x68, 0x8a, + 0x6c, 0x58, 0x66, 0x13, 0xb9, 0xca, 0x6c, 0x8e, 0xa6, 0x31, 0xdf, 0x26, 0x71, 0x55, 0x6a, 0x03, 0x14, 0xcc, 0x8e, 0x06, 0x1d, 0x6d, 0xd1, 0x81, 0x4c, 0x40, 0xad, 0xa6, 0x22, 0x14, 0x8a, 0x11, + 0x8d, 0xae, 0x3b, 0x93, 0x7c, 0x62, 0xfb, 0x92, 0xe8, 0xe1, 0x58, 0x09, 0xec, 0xf1, 0x6a, 0x09, 0xed, 0x1e, 0xd6, 0x23, 0xef, 0x93, 0xdb, 0x14, 0x24, 0x43, 0xdb, 0x3b, 0xa7, 0x36, 0x15, 0x65, + 0x1c, 0x1b, 0x41, 0x32, 0x49, 0x32, 0x0b, 0x30, 0x92, 0x28, 0xf2, 0xf2, 0x13, 0x62, 0xbd, 0x62, 0x1d, 0x92, 0xac, 0xd6, 0x32, 0xf3, 0xee, 0x06, 0xf3, 0xa4, 0x71, 0xe2, 0x95, 0xea, 0x05, 0xf0, + 0xcb, 0x75, 0x5f, 0x83, 0x84, 0x5e, 0x6e, 0xe6, 0xa0, 0x9d, 0x52, 0xc5, 0x86, 0x91, 0xb6, 0x13, 0x61, 0x2c, 0x59, 0xb8, 0x3b, 0x85, 0x31, 0xb2, 0xa0, 0x4b, 0x7d, 0x96, 0x6c, 0x38, 0x1d, 0x55, + 0xf9, 0x31, 0xce, 0x37, 0x2b, 0x99, 0xe1, 0x6b, 0xd8, 0x11, 0x8c, 0x9a, 0x49, 0x46, 0x75, 0xab, 0xe9, 0x61, 0xb7, 0xea, 0x84, 0x31, 0xd6, 0x8d, 0x9a, 0xf1, 0x88, 0x83, 0x96, 0xbc, 0x1f, 0x00, + 0x7c, 0x81, 0xaf, 0xb6, 0x23, 0x4d, 0xb9, 0x55, 0x84, 0x1f, 0x4f, 0xd7, 0x5e, 0xd6, 0xf2, 0xfc, 0x57, 0x66, 0x69, 0x61, 0xfa, 0x5d, 0x0b, 0xda, 0x67, 0x32, 0x2f, 0x3f, 0xd0, 0x3d, 0xc1, 0xf7, + 0x3e, 0xea, 0xd7, 0xa9, 0x69, 0xb6, 0x96, 0x8a, 0x85, 0xb4, 0x92, 0xfd, 0x65, 0x3a, 0x86, 0xc1, 0x24, 0x76, 0xc9, 0x9c, 0x5a, 0x6f, 0xa2, 0x1d, 0x1e, 0x90, 0x3f, 0xdd, 0x67, 0xf3, 0xb7, 0x78, + 0xb9, 0x7b, 0x3e, 0x80, 0x27, 0xf6, 0xd9, 0x2b, 0xd1, 0xf3, 0xab, 0x5d, 0x2e, 0xcf, 0xd6, 0xfe, 0x1e, 0xfb, 0xec, 0xb8, 0xac, 0x47, 0x1a, 0x3a, 0x6e, 0x8e, 0xfb, 0x54, 0x1b, 0xcd, 0x77, 0xb6, + 0x8f, 0x10, 0x20, 0xb5, 0x12, 0xbb, 0xae, 0x8d, 0x0d, 0x9b, 0x1a, 0x53, 0x7b, 0x72, 0xa5, 0xe9, 0x04, 0x35, 0xdf, 0x53, 0xca, 0xd4, 0x47, 0xd9, 0xdc, 0x39, 0x0e, 0x8c, 0xe9, 0xb2, 0x68, 0x40, + 0x0f, 0x2f, 0x47, 0xbe, 0x71, 0x18, 0xa5, 0xeb, 0x69, 0x9c, 0xd7, 0xb9, 0xa6, 0x09, 0x5b, 0x67, 0x1b, 0x8d, 0xb1, 0x94, 0xf6, 0xcb, 0xcf, 0xb6, 0xee, 0xcc, 0x32, 0xb4, 0xab, 0x12, 0xfc, 0xbf, + 0xff, 0x12, 0x43, 0x4b, 0xcb, 0xad, 0x97, 0x32, 0x35, 0xb5, 0xc2, 0x7a, 0x29, 0x92, 0x97, 0x50, 0x2b, 0xac, 0xbc, 0x78, 0xa9, 0xe0, 0x5f, 0xc8, 0x4b, 0x92, 0x9d, 0xfe, 0xc2, 0xff, 0xfb, 0xaf, + 0x6f, 0x17, 0xb2, 0xab, 0xe5, 0x6c, 0x9c, 0x17, 0x5a, 0x18, 0x4a, 0xe7, 0xf2, 0xe6, 0x9f, 0x3f, 0xff, 0x94, 0x25, 0xfd, 0x7e, 0xff, 0x04, 0xfb, 0xff, 0x7a, 0x9f, 0x9e, 0xa6, 0x96, 0xd5, 0x5e, + 0xfc, 0x3a, 0x2d, 0xff, 0x4f, 0xbf, 0xb9, 0xfc, 0x2f, 0xe4, 0x2f, 0x08, 0xbf, 0x28, 0xdd, 0x27, 0x05, 0x1c, 0x7f, 0xd3, 0xbf, 0xa1, 0xbe, 0xfa, 0xf7, 0xa7, 0x2a, 0xef, 0x77, 0x2c, 0x76, 0xcf, + 0xec, 0xaa, 0x1f, 0x29, 0x9f, 0x26, 0xc3, 0xc7, 0x71, 0xef, 0xd6, 0xaf, 0x6c, 0x52, 0x8d, 0xbb, 0xd5, 0x01, 0x1d, 0xe5, 0x33, 0x52, 0x09, 0x31, 0xd2, 0x96, 0x26, 0xfb, 0x05, 0x96, 0x57, 0x12, + 0x57, 0x6a, 0x9e, 0x2e, 0x36, 0x87, 0xf5, 0x62, 0xc6, 0x45, 0x94, 0xa0, 0x6f, 0xcb, 0x49, 0x06, 0xae, 0x6c, 0x68, 0xe9, 0x89, 0x49, 0x3a, 0x5f, 0x8d, 0x78, 0x6f, 0xe6, 0x7b, 0x0a, 0x35, 0xd1, + 0x6d, 0x4d, 0x83, 0x67, 0x2e, 0xae, 0x67, 0xd6, 0x1a, 0x1f, 0xf3, 0xf2, 0x96, 0x05, 0x1f, 0xf8, 0x7f, 0xbe, 0x29, 0x54, 0x78, 0xf7, 0x8c, 0xf2, 0x34, 0x3a, 0xbf, 0x3d, 0xe5, 0x03, 0x52, 0xbf, + 0x7d, 0xd6, 0x27, 0x38, 0x0c, 0x1a, 0xce, 0xeb, 0x63, 0x57, 0xc9, 0x3b, 0x62, 0xe9, 0x40, 0x7e, 0x64, 0x2e, 0x8d, 0xa9, 0x8f, 0x3b, 0x79, 0xc8, 0x32, 0x4e, 0xfb, 0x53, 0x67, 0xeb, 0xe7, 0xfa, + 0xfe, 0x7f, 0x6e, 0x72, 0xdc, 0x50, 0x06, 0x86, 0xb7, 0xe3, 0xbe, 0x93, 0x23, 0xd8, 0xab, 0x59, 0x2c, 0xaf, 0x50, 0x78, 0x3d, 0xf1, 0xe8, 0x31, 0xcc, 0x3a, 0x90, 0x3e, 0x27, 0x3b, 0x3f, 0x61, + 0x57, 0x82, 0xd3, 0xec, 0x6b, 0x65, 0x42, 0x5b, 0xbc, 0x59, 0x2b, 0xf8, 0xb6, 0x02, 0x0c, 0x41, 0xb2, 0xe6, 0xa9, 0x91, 0x1c, 0xd0, 0xf4, 0xc0, 0xd8, 0xcb, 0x5d, 0xc3, 0x2f, 0xe5, 0x64, 0x9c, + 0xc5, 0x19, 0x9d, 0xc1, 0xd6, 0x28, 0xcf, 0xe2, 0x71, 0xd3, 0xcc, 0xd9, 0x4c, 0x93, 0x46, 0x3d, 0x5d, 0x63, 0x3d, 0xba, 0x23, 0xfc, 0xa8, 0x9d, 0xc1, 0x17, 0xb6, 0xb0, 0x3e, 0x1a, 0xc2, 0xdf, + 0x2a, 0x8a, 0x7c, 0xee, 0xcd, 0xf0, 0x5d, 0x8f, 0x98, 0xe7, 0x62, 0x50, 0xdf, 0xc9, 0x5e, 0x19, 0x7b, 0xed, 0x0e, 0xd3, 0x33, 0x12, 0x75, 0xbe, 0xd2, 0x0a, 0x94, 0x5e, 0x60, 0x10, 0x0e, 0x05, + 0x6c, 0x0b, 0x33, 0x56, 0xc5, 0x85, 0x19, 0x1a, 0x96, 0xbc, 0x4f, 0x39, 0x55, 0xe4, 0xa3, 0x10, 0xb2, 0xd4, 0xd6, 0x63, 0xc2, 0x2f, 0x50, 0x99, 0xa4, 0xd0, 0xcd, 0x34, 0xb7, 0x53, 0x26, 0x20, + 0xf6, 0xeb, 0xd1, 0x5c, 0x3e, 0xda, 0x4a, 0xdb, 0x36, 0xa4, 0x20, 0x01, 0x1c, 0x8e, 0x2f, 0x93, 0x66, 0x90, 0x2d, 0x36, 0x7c, 0x10, 0x72, 0x4b, 0xe2, 0xf9, 0xc3, 0x56, 0x5a, 0x46, 0xaf, 0x75, + 0x2b, 0x9f, 0x29, 0x29, 0xd0, 0x47, 0xcf, 0xb8, 0xdb, 0x23, 0xe3, 0xcf, 0xa9, 0x1c, 0x5f, 0x3f, 0xe2, 0x95, 0x3f, 0xbf, 0x7d, 0xd0, 0x47, 0x11, 0x39, 0x87, 0xd3, 0xd1, 0x91, 0xc9, 0x40, 0x4a, + 0xc5, 0xae, 0x3d, 0x35, 0x0d, 0x8b, 0x09, 0xef, 0x04, 0xa5, 0xb7, 0x8b, 0xdb, 0x32, 0xe8, 0x9a, 0x15, 0xb0, 0xc1, 0xf9, 0xe9, 0xe2, 0x80, 0x40, 0x4b, 0x0b, 0xa1, 0xe6, 0x10, 0x7f, 0xc4, 0x74, + 0x50, 0x82, 0x45, 0xf7, 0x80, 0x8d, 0x76, 0x4b, 0x6f, 0x54, 0xa9, 0xa9, 0x38, 0x5d, 0xcb, 0xe6, 0x31, 0x1e, 0x40, 0xac, 0xa1, 0x8d, 0xeb, 0xb8, 0xdb, 0x6e, 0xb1, 0x6a, 0xe2, 0xf7, 0x34, 0x69, + 0x3e, 0xe8, 0x29, 0x70, 0xaf, 0x37, 0xc9, 0x4f, 0x19, 0xf8, 0x0f, 0x15, 0x2c, 0xff, 0x26, 0x6c, 0x92, 0xf8, 0x05, 0x3d, 0x11, 0xcb, 0x73, 0x8d, 0x98, 0x3c, 0x47, 0x09, 0x9e, 0x29, 0x3c, 0xe6, + 0x2e, 0x57, 0x6b, 0x4d, 0xdd, 0xaa, 0x04, 0xcc, 0x05, 0x44, 0xa5, 0xb2, 0x7c, 0xc1, 0xf3, 0x59, 0x5b, 0x1f, 0x40, 0xb5, 0xe4, 0x5a, 0xa9, 0xc8, 0xcc, 0x69, 0xa1, 0xe9, 0x96, 0xad, 0x2e, 0xc7, + 0x0a, 0xa6, 0xce, 0x17, 0xae, 0x5c, 0x38, 0x66, 0x17, 0x87, 0xe5, 0xc6, 0xca, 0x1b, 0x3e, 0x12, 0xbd, 0x82, 0x06, 0xa5, 0xb1, 0x30, 0x10, 0x60, 0x3c, 0xdf, 0x6f, 0x19, 0x6b, 0x29, 0xb1, 0x70, + 0xbd, 0xa2, 0x1e, 0xe5, 0x4d, 0x7f, 0x23, 0x72, 0x6f, 0xd4, 0xf1, 0x2f, 0x62, 0x10, 0xbc, 0xd8, 0x3e, 0x7b, 0xe5, 0xff, 0x7a, 0xf7, 0xb8, 0xdd, 0x7c, 0xea, 0x5a, 0x99, 0x77, 0x49, 0x0e, 0xb9, + 0x99, 0x29, 0x0f, 0xca, 0xe3, 0x7e, 0x68, 0x0f, 0xf5, 0xd9, 0x83, 0x7f, 0x52, 0xd9, 0xbd, 0x73, 0xeb, 0x87, 0x24, 0x2c, 0x0b, 0xeb, 0xc3, 0xaf, 0xfa, 0xd9, 0x2c, 0xfb, 0x2f, 0x7f, 0x6e, 0x82, + 0x79, 0xb9, 0xa6, 0x19, 0x7d, 0xce, 0x85, 0xb7, 0xe1, 0xa2, 0x5f, 0xcd, 0x33, 0xec, 0xa9, 0xb2, 0x3b, 0x1f, 0xe8, 0xbe, 0x4e, 0xb7, 0xcb, 0xe8, 0x5c, 0x6b, 0xb1, 0xc7, 0x69, 0x7c, 0x2c, 0xb0, + 0x8e, 0xb4, 0x9e, 0x58, 0xa9, 0xb7, 0x50, 0x6a, 0x11, 0x19, 0x6f, 0xe2, 0x79, 0x33, 0xc0, 0xe4, 0x78, 0x5b, 0xc2, 0x0c, 0xa5, 0x98, 0x9d, 0x3e, 0x17, 0x51, 0xcc, 0xe2, 0x6a, 0xa8, 0xca, 0x90, + 0x8e, 0x42, 0x2a, 0x95, 0xb3, 0x5a, 0xcb, 0x84, 0xf2, 0xc9, 0xc8, 0x8d, 0x75, 0x43, 0x30, 0x46, 0x80, 0x94, 0xad, 0xda, 0x15, 0xb6, 0x11, 0xd7, 0x59, 0x30, 0xef, 0x50, 0x4d, 0x1a, 0xa9, 0x9f, + 0xdd, 0x24, 0x3f, 0x98, 0x75, 0x9f, 0x4b, 0x3d, 0x3f, 0x21, 0x41, 0x7a, 0xed, 0x01, 0xe7, 0x72, 0xd6, 0x43, 0xd3, 0xcb, 0xee, 0x9f, 0xc6, 0x9e, 0xd1, 0x33, 0x3f, 0xd0, 0xbd, 0xb2, 0xe3, 0x3a, + 0xea, 0x9b, 0x35, 0x83, 0x31, 0xc7, 0xdd, 0xd1, 0x74, 0x03, 0x3a, 0xa9, 0x7c, 0x58, 0xb0, 0x81, 0x28, 0x47, 0x58, 0x4b, 0x02, 0x68, 0x2b, 0x30, 0x04, 0x0c, 0x6d, 0x0b, 0x66, 0xc3, 0xc9, 0xa8, + 0x48, 0x2b, 0x70, 0xe6, 0x6e, 0xea, 0x8c, 0x39, 0x70, 0x6b, 0xdf, 0x92, 0x69, 0x5a, 0x02, 0x39, 0x37, 0xd0, 0xc0, 0xa6, 0xe6, 0xa7, 0xc5, 0x5c, 0x89, 0x31, 0xb2, 0x6e, 0x27, 0x68, 0x8e, 0x0d, + 0x56, 0x4c, 0x2e, 0x08, 0xf8, 0xf3, 0x42, 0xc0, 0x8b, 0xbd, 0xb7, 0xc5, 0x88, 0xfd, 0x98, 0x15, 0x7d, 0xfc, 0x87, 0xef, 0x85, 0xc5, 0xbf, 0xdc, 0x7e, 0x91, 0x73, 0xb9, 0xff, 0xe7, 0xd8, 0xf0, + 0xce, 0x82, 0x7c, 0x78, 0x21, 0xf4, 0x18, 0xff, 0x8c, 0x29, 0xcc, 0x31, 0x3e, 0x10, 0xa7, 0x14, 0xeb, 0x5b, 0x74, 0x35, 0x1e, 0x41, 0x59, 0x7a, 0xec, 0xe8, 0x2a, 0x00, 0x02, 0x04, 0xf0, 0x08, + 0xda, 0xe2, 0xd7, 0x5e, 0xd6, 0x7a, 0xfb, 0x72, 0xc1, 0x80, 0x4c, 0x3d, 0x32, 0xd2, 0x76, 0xb1, 0x1a, 0x17, 0xb0, 0x5f, 0xe8, 0xe3, 0x7a, 0xa7, 0x6d, 0x4c, 0x77, 0x3a, 0xc0, 0x08, 0xe4, 0x80, + 0x56, 0xfb, 0x1a, 0x67, 0x0d, 0x7f, 0x29, 0x6a, 0xb9, 0xf7, 0x59, 0xc9, 0xfd, 0x01, 0xfe, 0x45, 0x9b, 0x5a, 0x43, 0xfb, 0x35, 0xde, 0x09, 0xfc, 0x05, 0xff, 0xdc, 0x53, 0xf4, 0x4f, 0x96, 0xfa, + 0x79, 0xe5, 0xc3, 0xcd, 0xcd, 0x8f, 0xef, 0x74, 0xc7, 0x44, 0xf6, 0x4c, 0x48, 0xe9, 0x1b, 0x59, 0x60, 0xf8, 0x7e, 0x3d, 0xbc, 0x10, 0x7b, 0xcc, 0x77, 0xde, 0x1a, 0x58, 0x34, 0x9a, 0x81, 0x80, + 0xb7, 0x8f, 0xd3, 0x71, 0x33, 0x25, 0x31, 0xb8, 0x43, 0xc6, 0x03, 0x1e, 0xa4, 0x0a, 0x6c, 0xc3, 0x03, 0x00, 0xef, 0x2f, 0xea, 0x8d, 0x09, 0xcb, 0x33, 0x86, 0x8e, 0xb2, 0xb6, 0x6e, 0x6c, 0xac, + 0xca, 0xd5, 0xd0, 0x45, 0x37, 0x78, 0xe8, 0x35, 0x21, 0x4e, 0x0d, 0xea, 0x0e, 0x20, 0xcd, 0x41, 0xa4, 0x6d, 0xa5, 0x71, 0xc0, 0x43, 0x33, 0x36, 0x60, 0x11, 0xee, 0x11, 0xdf, 0xfb, 0x7b, 0x62, + 0xff, 0x09, 0xc6, 0xe9, 0xf7, 0x1c, 0xfa, 0x10, 0xf4, 0x54, 0xce, 0xf5, 0x85, 0xe6, 0x75, 0x4d, 0xea, 0xed, 0xf0, 0x42, 0xe6, 0x31, 0x6b, 0x6c, 0xdb, 0x8c, 0x92, 0xdc, 0x1f, 0x93, 0x20, 0xd1, + 0x12, 0x83, 0x70, 0x0c, 0xf1, 0x2b, 0xd0, 0xa7, 0xb9, 0xf1, 0x46, 0x8e, 0x94, 0x32, 0x04, 0x08, 0x08, 0x6b, 0x3c, 0x96, 0xa3, 0xfd, 0x04, 0x71, 0x29, 0x4e, 0xdc, 0x1a, 0x5e, 0xe6, 0xac, 0xf9, + 0xf8, 0x40, 0x4f, 0x62, 0xcc, 0x41, 0xa2, 0x62, 0x43, 0x6e, 0x05, 0x6e, 0x22, 0xeb, 0x81, 0x5d, 0x6a, 0x10, 0x93, 0x5a, 0x31, 0x8c, 0x01, 0x07, 0xe3, 0x79, 0xaf, 0xee, 0xa5, 0xd5, 0x5c, 0x19, + 0x5f, 0xc1, 0xf8, 0xbd, 0x3f, 0xc4, 0x87, 0x6e, 0xe1, 0x17, 0xfd, 0xe6, 0x77, 0x5f, 0xff, 0x87, 0x8f, 0x3f, 0x9d, 0x62, 0x3f, 0x74, 0x52, 0xc0, 0x3e, 0x07, 0x22, 0x7e, 0x97, 0x51, 0x92, 0x87, + 0xda, 0x4d, 0x7b, 0x85, 0x9f, 0xca, 0x88, 0x7f, 0x7c, 0xae, 0x7d, 0xea, 0xe6, 0xf6, 0x5d, 0x6b, 0xe3, 0x13, 0x30, 0xe4, 0x8f, 0xa7, 0xdf, 0x5b, 0x5f, 0xe3, 0x6b, 0x53, 0xe3, 0x33, 0x95, 0xc7, + 0xb3, 0x8f, 0x5a, 0xa5, 0xf6, 0x94, 0x10, 0x53, 0x8f, 0xde, 0xa6, 0x54, 0x08, 0x8c, 0x71, 0x09, 0x1d, 0x91, 0x94, 0xc6, 0x2e, 0x70, 0x05, 0x18, 0x53, 0xdb, 0x11, 0x42, 0x6f, 0x75, 0xbd, 0x85, + 0x6d, 0x11, 0x04, 0x2b, 0x94, 0xd6, 0x2b, 0x91, 0x3a, 0xec, 0xe9, 0x44, 0xdb, 0x40, 0x3b, 0x4a, 0x5c, 0xe6, 0x88, 0xb7, 0xc1, 0x90, 0x74, 0xa1, 0x10, 0x74, 0xa1, 0x06, 0xd8, 0x72, 0x3c, 0x61, + 0x31, 0xc2, 0x83, 0x76, 0x8f, 0xf4, 0xa3, 0x47, 0x2a, 0x4e, 0x9f, 0xd8, 0x36, 0x27, 0xb9, 0x27, 0x60, 0x47, 0xbf, 0x9e, 0x69, 0x7e, 0xe3, 0x24, 0x67, 0x0d, 0x33, 0x29, 0x86, 0xe7, 0xff, 0x7f, + 0x8c, 0xdc, 0x86, 0xb0, 0xf6, 0x69, 0x71, 0x28, 0xe7, 0x4a, 0x53, 0x7b, 0x7e, 0x0e, 0x5a, 0xf2, 0xa0, 0x42, 0x12, 0x7c, 0x70, 0x60, 0x20, 0xf6, 0x28, 0x2f, 0x49, 0x73, 0x21, 0xd0, 0x96, 0xb1, + 0xb6, 0xb7, 0x51, 0x10, 0x1b, 0xf5, 0x68, 0x2c, 0xa3, 0xa6, 0x51, 0x03, 0x53, 0xb7, 0xf1, 0xc8, 0x95, 0x19, 0x1e, 0xc5, 0xc2, 0x6d, 0x9a, 0x54, 0x6d, 0xbd, 0x6e, 0xd5, 0xb5, 0x0e, 0xb9, 0xd9, + 0x46, 0x74, 0x3e, 0x1f, 0x3c, 0x12, 0xa9, 0xdf, 0x44, 0x57, 0x7f, 0x9c, 0x96, 0x80, 0x97, 0x5f, 0x77, 0x54, 0xe8, 0x93, 0x1b, 0xef, 0x7f, 0xe6, 0x5d, 0xa4, 0x65, 0x46, 0xa7, 0x05, 0xc0, 0x09, + 0x8c, 0x61, 0xe1, 0x45, 0x6f, 0x41, 0xd8, 0x9f, 0x53, 0xe0, 0x35, 0xc3, 0xb5, 0xce, 0x9e, 0xaf, 0x8f, 0x41, 0xc9, 0xbf, 0x35, 0xcd, 0x30, 0x2d, 0x23, 0x89, 0xd2, 0xcc, 0xca, 0xf3, 0x61, 0x66, + 0x9d, 0x17, 0xc9, 0x6b, 0xd8, 0xdc, 0xa7, 0x35, 0xfc, 0xb1, 0x83, 0xf4, 0x17, 0x5d, 0x50, 0x6e, 0xec, 0x47, 0x5f, 0x04, 0x50, 0x87, 0x49, 0x6d, 0x65, 0x86, 0x96, 0x5b, 0x1f, 0xeb, 0xbf, 0x7d, + 0x92, 0x3e, 0x91, 0x17, 0x79, 0xc6, 0xed, 0xcf, 0xf8, 0xed, 0x3b, 0xe9, 0xd0, 0xd0, 0x62, 0xc3, 0xfa, 0xe8, 0xf0, 0xfe, 0xf4, 0x46, 0xe7, 0x00, 0x33, 0xcd, 0x7c, 0xcd, 0xd6, 0xfa, 0xe8, 0xed, + 0xbc, 0xf9, 0x5e, 0x99, 0x85, 0x97, 0x88, 0xe9, 0x61, 0xa8, 0x35, 0x7f, 0x43, 0x38, 0xf5, 0x6b, 0x4e, 0xeb, 0x64, 0x9a, 0x61, 0xd9, 0x65, 0x38, 0xb4, 0xef, 0x69, 0x93, 0xe8, 0x4d, 0x13, 0xd2, + 0xde, 0x13, 0xff, 0x9d, 0xee, 0x69, 0x01, 0xbc, 0x8f, 0x86, 0x67, 0x7a, 0x8f, 0x17, 0xc2, 0xde, 0x5f, 0x8a, 0xfc, 0x62, 0x46, 0x8c, 0xcc, 0x62, 0x31, 0x96, 0x63, 0x6f, 0x17, 0xce, 0xe7, 0x7b, + 0x46, 0x99, 0x77, 0xb0, 0xbf, 0x6f, 0xb6, 0xb8, 0xec, 0xf2, 0x00, 0x1a, 0x41, 0xbc, 0x19, 0xe8, 0x2a, 0x1c, 0x0b, 0x39, 0x3d, 0x1b, 0x18, 0x2c, 0x44, 0x9b, 0xce, 0x31, 0xc4, 0xba, 0xc9, 0xc6, + 0xcd, 0x01, 0x39, 0x5f, 0x2b, 0x9b, 0x2a, 0x3b, 0x18, 0x45, 0x13, 0x14, 0xf2, 0x41, 0xdd, 0x05, 0xde, 0xbd, 0x36, 0x0a, 0xf7, 0xe1, 0xb9, 0xd8, 0x47, 0xef, 0xd9, 0xb8, 0x7e, 0xbe, 0x9d, 0xbb, + 0xda, 0x09, 0x0e, 0x57, 0xcb, 0x87, 0x7d, 0xf7, 0x71, 0xd8, 0xac, 0x04, 0x50, 0xde, 0xe1, 0x82, 0xe5, 0x13, 0x9b, 0x60, 0xbf, 0x98, 0x67, 0x96, 0xeb, 0xeb, 0xdd, 0x6a, 0xec, 0xcf, 0x52, 0x0c, + 0x90, 0x97, 0x62, 0x8a, 0x15, 0xdb, 0x74, 0xcf, 0xca, 0xe8, 0x82, 0x61, 0xd4, 0x25, 0x04, 0x50, 0x8d, 0x3e, 0xdb, 0x14, 0x36, 0x90, 0x7b, 0x63, 0x58, 0xda, 0x6f, 0x2d, 0x70, 0x64, 0x68, 0xd3, + 0x48, 0x2e, 0x14, 0xa5, 0xdb, 0xd3, 0xac, 0x4e, 0x49, 0x68, 0xd7, 0xd3, 0x7a, 0x75, 0xcf, 0x7e, 0xfc, 0xd3, 0x99, 0xf8, 0x02, 0xf6, 0x6c, 0x5a, 0x7d, 0xc2, 0xe5, 0x1c, 0x2f, 0x30, 0x74, 0x93, + 0x24, 0xf8, 0x0e, 0xf9, 0x9f, 0x4b, 0xe2, 0x4f, 0xb4, 0xaf, 0x5c, 0xf8, 0x70, 0xa7, 0xaf, 0x3d, 0x51, 0x99, 0x81, 0xb2, 0x38, 0xf7, 0x83, 0x26, 0x23, 0xc6, 0x6d, 0xbb, 0x5e, 0xf3, 0x6d, 0x70, + 0x20, 0xbb, 0x25, 0x2a, 0x56, 0x05, 0x3d, 0xcd, 0x77, 0x8b, 0xb1, 0x78, 0xac, 0x4b, 0x10, 0xdf, 0xcd, 0x3a, 0x28, 0xd4, 0x71, 0xba, 0x62, 0x31, 0x24, 0x17, 0x5d, 0x8c, 0x81, 0x82, 0x7d, 0xe3, + 0x90, 0xfc, 0x81, 0xc5, 0xb8, 0xdc, 0xde, 0x4c, 0x54, 0xb2, 0x3c, 0x8c, 0xf8, 0x40, 0x99, 0xaa, 0x94, 0x0e, 0x44, 0xdf, 0x87, 0x5f, 0x9d, 0x7e, 0xa9, 0xee, 0x39, 0xde, 0x7d, 0x37, 0x28, 0xf4, + 0x54, 0x42, 0xd9, 0x07, 0xba, 0x57, 0x3c, 0xae, 0xa3, 0x33, 0x16, 0x3d, 0x0e, 0x00, 0x85, 0x54, 0x4d, 0x96, 0x05, 0x95, 0x8d, 0xc2, 0x60, 0x06, 0xd2, 0x0d, 0xa8, 0xad, 0x3d, 0x71, 0xc4, 0x0f, + 0x84, 0x54, 0x46, 0x3b, 0x0f, 0xce, 0x00, 0xde, 0xb2, 0x30, 0x39, 0xd8, 0x4c, 0x75, 0xed, 0x58, 0x21, 0xd8, 0x86, 0x53, 0x56, 0x9d, 0x5e, 0xaf, 0xed, 0x99, 0xa4, 0xaa, 0x0c, 0x18, 0x6c, 0x06, + 0x1b, 0x13, 0x47, 0x40, 0x78, 0xb7, 0x50, 0xe1, 0x14, 0xd0, 0x17, 0x13, 0x3a, 0xd9, 0x20, 0x72, 0x72, 0xb3, 0x5b, 0x3d, 0xab, 0x4e, 0xf5, 0x36, 0x62, 0x9e, 0xde, 0xda, 0x0e, 0xb5, 0xfb, 0xa5, + 0xbc, 0x9f, 0x9d, 0x6c, 0x27, 0xa2, 0x57, 0x54, 0x4f, 0x97, 0xe7, 0x42, 0x90, 0x3d, 0xa6, 0x17, 0xdd, 0x06, 0x8b, 0x2d, 0xb0, 0x86, 0x96, 0xfe, 0x76, 0x6f, 0x14, 0x69, 0xea, 0xb0, 0x63, 0xc7, + 0x96, 0x04, 0xb0, 0x58, 0xca, 0xa5, 0xba, 0xf3, 0x5d, 0x67, 0x95, 0x41, 0x44, 0x70, 0xdc, 0x96, 0xd1, 0x2a, 0xc4, 0xc7, 0x76, 0x85, 0xd0, 0xac, 0x14, 0x5a, 0x3b, 0xe2, 0xa8, 0xee, 0xba, 0xe4, + 0x30, 0x9d, 0x6d, 0xc7, 0xcc, 0x76, 0x3a, 0x41, 0x79, 0x21, 0x99, 0x03, 0x6a, 0xb3, 0x43, 0xe8, 0x2a, 0x5c, 0x89, 0xeb, 0x1f, 0x04, 0x1e, 0xf4, 0xb1, 0x3f, 0xdc, 0x7a, 0x87, 0xfe, 0xa8, 0x78, + 0x7c, 0xa5, 0x7b, 0x85, 0xee, 0x3a, 0xea, 0x2b, 0x2e, 0x43, 0x84, 0x9b, 0x94, 0x33, 0x7c, 0xe5, 0x4c, 0xf9, 0x7a, 0x3b, 0x5d, 0x06, 0xa6, 0x32, 0xa7, 0x3d, 0x57, 0xf1, 0x0b, 0x2c, 0xdd, 0x88, + 0x3a, 0xed, 0xa0, 0x78, 0x56, 0x84, 0x51, 0x2c, 0x89, 0xe1, 0x4e, 0x77, 0x22, 0x8a, 0xe4, 0x04, 0x36, 0x5b, 0x2e, 0x74, 0x45, 0x99, 0x51, 0x92, 0x1e, 0x8b, 0xda, 0xc2, 0x6a, 0x56, 0xcb, 0xc2, + 0x13, 0x05, 0xd2, 0x8d, 0xac, 0x8d, 0xbf, 0xe9, 0xe0, 0xad, 0x39, 0x18, 0xff, 0x00, 0xbd, 0x7f, 0xc8, 0x14, 0xff, 0x7b, 0x77, 0xe2, 0x3f, 0x2b, 0x39, 0x3f, 0xd0, 0xbe, 0x32, 0xe6, 0xc3, 0x9d, + 0xbe, 0x92, 0x33, 0x98, 0xf9, 0x86, 0xc4, 0xbb, 0x71, 0x38, 0x97, 0xa1, 0xa0, 0x4d, 0xe6, 0x01, 0x21, 0x1c, 0x96, 0x92, 0x56, 0x33, 0xd8, 0x42, 0xd0, 0x01, 0xae, 0xdb, 0x19, 0x58, 0x3d, 0xa2, + 0x40, 0xd8, 0x15, 0xb6, 0x02, 0x68, 0xda, 0xb3, 0x8d, 0xaf, 0x33, 0xeb, 0x65, 0xe5, 0x40, 0x26, 0x6e, 0xd8, 0x08, 0xa3, 0x5b, 0xbb, 0xa8, 0xd8, 0x8d, 0x64, 0x5d, 0x97, 0x91, 0x63, 0xa7, 0xc2, + 0x5b, 0xcb, 0x1d, 0x11, 0xfb, 0x9e, 0xbe, 0xd0, 0xaf, 0xfc, 0x99, 0x3f, 0x37, 0x0a, 0xfd, 0x83, 0xdc, 0x6d, 0xb5, 0xec, 0x9e, 0xbb, 0xed, 0xb9, 0xfa, 0x02, 0xaf, 0x44, 0xaf, 0xfc, 0x3c, 0x5d, + 0xf6, 0xad, 0x1d, 0xb0, 0x3b, 0x52, 0x9b, 0xa3, 0x87, 0xfa, 0x25, 0xb1, 0x1d, 0x6c, 0x8f, 0x73, 0xde, 0x3c, 0x8e, 0x05, 0x50, 0xd4, 0x24, 0x79, 0x9e, 0x4f, 0xe7, 0x8b, 0x1d, 0xb5, 0xae, 0x82, + 0x91, 0xb5, 0xdb, 0xf3, 0xf3, 0x8d, 0x02, 0x4d, 0x66, 0xf3, 0x69, 0xa7, 0xb8, 0xdc, 0x3e, 0x59, 0x11, 0x8b, 0x35, 0x6d, 0x45, 0x71, 0x58, 0xc9, 0x46, 0x05, 0x28, 0x74, 0x64, 0xc0, 0x35, 0xbf, + 0x27, 0xa9, 0x09, 0x8c, 0xd2, 0xf1, 0x2e, 0xff, 0x9b, 0xc7, 0xbb, 0x5e, 0x62, 0xcb, 0xcc, 0x86, 0xae, 0x97, 0x17, 0x89, 0x93, 0x69, 0xd1, 0xd0, 0xbf, 0x2f, 0xbb, 0x9e, 0x09, 0x37, 0xfb, 0x4c, + 0xfc, 0x84, 0xeb, 0xa7, 0x5b, 0x7d, 0x4b, 0xa3, 0xb8, 0xa0, 0xb2, 0x4d, 0x16, 0x88, 0x55, 0x1f, 0x73, 0x4d, 0x45, 0xe2, 0xd9, 0x76, 0xab, 0xe1, 0x26, 0x27, 0x4c, 0x89, 0xfc, 0xd8, 0x0c, 0x68, + 0xc7, 0x9c, 0xa0, 0x03, 0xc1, 0x58, 0x8c, 0x84, 0x92, 0xe8, 0xd4, 0x69, 0xb8, 0x05, 0xf3, 0x83, 0x24, 0x32, 0x4c, 0x86, 0x18, 0xad, 0x15, 0xaf, 0x73, 0xf1, 0x78, 0xd4, 0x65, 0x66, 0x1e, 0x03, + 0xc9, 0x4c, 0xc1, 0x3b, 0xdf, 0xa6, 0x97, 0x87, 0x79, 0xd5, 0x45, 0x3d, 0x17, 0x8a, 0xae, 0xe5, 0x16, 0x8e, 0x5e, 0xc0, 0xf9, 0xaa, 0xbe, 0x97, 0x16, 0x24, 0x6f, 0x0b, 0xa8, 0x4f, 0x40, 0xef, + 0x2d, 0x06, 0xa9, 0x95, 0x19, 0x56, 0x5c, 0x78, 0xa1, 0x95, 0x0f, 0x13, 0xdd, 0xbf, 0x3b, 0xa1, 0x9f, 0x71, 0x23, 0x7c, 0xfb, 0xa4, 0xdf, 0xb8, 0xf1, 0xe9, 0xf3, 0xbe, 0xae, 0x86, 0x35, 0x55, + 0xe9, 0xdb, 0x46, 0x0c, 0xe7, 0x35, 0xe3, 0x23, 0x38, 0xbb, 0x99, 0x41, 0xf8, 0x81, 0x4b, 0x14, 0x5a, 0xdf, 0x55, 0x98, 0x42, 0xb7, 0x02, 0x42, 0x62, 0x81, 0x27, 0x81, 0xac, 0x84, 0x90, 0x08, + 0x64, 0x1b, 0xd2, 0x96, 0x3f, 0x6c, 0x37, 0x04, 0x89, 0xc9, 0xc5, 0x6c, 0xa6, 0xc2, 0x9a, 0xab, 0x10, 0x08, 0xd2, 0x81, 0x41, 0x4b, 0x2e, 0x2a, 0xd4, 0xc4, 0xd9, 0x78, 0x20, 0xe5, 0x83, 0xba, + 0x27, 0x6b, 0xbe, 0x98, 0xbe, 0x9f, 0x7d, 0x79, 0xdf, 0xf0, 0xe1, 0x74, 0x2e, 0xbf, 0x24, 0x86, 0xe4, 0x56, 0xa4, 0xc5, 0x85, 0x67, 0xdc, 0x3f, 0xf1, 0x3d, 0x25, 0x4f, 0xbe, 0x78, 0xc0, 0x09, + 0xf5, 0x2f, 0x6e, 0xf7, 0x0d, 0xb3, 0x30, 0xb4, 0x4c, 0x0c, 0x42, 0x63, 0xe7, 0x12, 0x1b, 0x61, 0xbf, 0x59, 0x12, 0x93, 0x0a, 0x26, 0x36, 0x62, 0x61, 0xba, 0x8a, 0xbb, 0xcb, 0xad, 0x50, 0x03, + 0x4a, 0x0b, 0x03, 0xfc, 0x65, 0xe7, 0x5b, 0x8e, 0x5c, 0x1d, 0xa6, 0xc7, 0x15, 0xcc, 0x72, 0xf4, 0x68, 0x0d, 0x53, 0xf3, 0x78, 0xb4, 0x50, 0x17, 0x2e, 0xe4, 0x90, 0x84, 0x91, 0x62, 0x78, 0x5e, + 0x02, 0x33, 0x67, 0x2d, 0x75, 0xc6, 0x5e, 0x22, 0x8d, 0x3b, 0xc6, 0x90, 0x07, 0xc8, 0x9d, 0x4f, 0xe4, 0xd9, 0x7d, 0x99, 0x01, 0xfe, 0xc2, 0x9e, 0xd1, 0x77, 0x6e, 0x48, 0xbf, 0xa2, 0xf5, 0x76, + 0x63, 0x78, 0xa6, 0xfa, 0x18, 0xa7, 0x82, 0x70, 0xfd, 0xca, 0xb2, 0x01, 0x8c, 0xa1, 0x97, 0xc4, 0x66, 0xbf, 0x35, 0x77, 0x9d, 0xbc, 0x73, 0x43, 0xb2, 0x0b, 0xe8, 0x72, 0xc0, 0x85, 0x1a, 0x0d, + 0xb2, 0x4a, 0x67, 0xae, 0xca, 0x4a, 0x97, 0xa6, 0x5e, 0xda, 0x50, 0x9b, 0x54, 0x88, 0xd1, 0x9d, 0x5b, 0x93, 0x6a, 0x4b, 0x4f, 0x68, 0x8d, 0x04, 0x49, 0x4f, 0xde, 0x92, 0x87, 0x89, 0xdf, 0x25, + 0x78, 0x13, 0x29, 0x05, 0x3a, 0xf1, 0x38, 0xf5, 0xfb, 0x42, 0x5b, 0x6e, 0x9b, 0x5a, 0x99, 0x77, 0x2f, 0x1a, 0xef, 0xc9, 0x1d, 0xe9, 0x42, 0xf3, 0x04, 0xc3, 0xe5, 0xaa, 0xef, 0x7e, 0x64, 0x48, + 0x5a, 0xe0, 0x36, 0xfa, 0x2e, 0xd7, 0xd8, 0xf2, 0xe8, 0xdb, 0x55, 0x65, 0xec, 0xca, 0x2a, 0x04, 0x66, 0x21, 0x82, 0xc2, 0x0b, 0x1c, 0x6b, 0x1c, 0x8e, 0x53, 0x32, 0xa5, 0x91, 0xa4, 0x6c, 0x74, + 0x8c, 0x16, 0x00, 0xbd, 0x58, 0x0e, 0x24, 0xd2, 0xc8, 0x24, 0x3c, 0x62, 0xc3, 0xb5, 0x09, 0x68, 0x84, 0x37, 0x10, 0x2d, 0x74, 0x0a, 0xae, 0x1c, 0x29, 0x2b, 0x54, 0x91, 0xeb, 0xac, 0x81, 0x36, + 0xe9, 0x79, 0x48, 0x2e, 0x4b, 0xef, 0x72, 0x36, 0x46, 0x3e, 0xc7, 0xb6, 0x9f, 0x3e, 0xf9, 0x90, 0xfb, 0x7e, 0xdb, 0x41, 0xed, 0x21, 0xb2, 0xb7, 0xa6, 0xdd, 0xeb, 0x53, 0xbe, 0xc2, 0xfa, 0xb9, + 0xe6, 0x97, 0x27, 0x82, 0xc0, 0xf0, 0xfc, 0xa7, 0x6f, 0x63, 0x4b, 0xc6, 0x97, 0xa6, 0x9b, 0x1a, 0x77, 0x54, 0x1a, 0x5b, 0xac, 0x1c, 0xc7, 0x28, 0x18, 0xca, 0xf0, 0x65, 0x2d, 0x00, 0xc9, 0xc1, + 0x92, 0x96, 0x5d, 0x89, 0xf5, 0xa6, 0xdd, 0x2c, 0xde, 0x8e, 0xa4, 0x91, 0x66, 0x39, 0x51, 0x4a, 0x62, 0x12, 0xa0, 0x6f, 0x2c, 0x4a, 0xde, 0xea, 0xe8, 0x7a, 0x3b, 0xd3, 0x36, 0x7c, 0x5a, 0x2c, + 0x46, 0x41, 0xa9, 0x68, 0xbc, 0x1b, 0xeb, 0x3c, 0x2d, 0x04, 0xfa, 0x52, 0x07, 0x3e, 0x67, 0x11, 0x7c, 0x88, 0x7c, 0x7d, 0x8b, 0x7b, 0x75, 0x32, 0xcd, 0xb4, 0x5e, 0x5e, 0x8a, 0xe4, 0xe5, 0xfa, + 0xda, 0x2f, 0xc4, 0x4b, 0x92, 0xbd, 0xb8, 0x9e, 0xe3, 0x5a, 0xd9, 0xaf, 0x97, 0x17, 0x21, 0x34, 0xad, 0xec, 0xf5, 0xb3, 0xfc, 0x25, 0xd2, 0xda, 0x97, 0x32, 0xb7, 0x5e, 0x56, 0x5a, 0xe1, 0xfe, + 0xca, 0xb4, 0xd8, 0x4c, 0xa2, 0xff, 0xf4, 0x9f, 0x5f, 0xbc, 0xf8, 0xc5, 0xb0, 0xb2, 0x42, 0x3b, 0xfd, 0xf5, 0x32, 0xa3, 0x8c, 0xf2, 0x42, 0x8b, 0x0d, 0x2b, 0xff, 0xaf, 0x2f, 0xb5, 0xeb, 0x19, + 0xee, 0x8b, 0x97, 0xbf, 0x04, 0x71, 0x52, 0xc7, 0xa7, 0xc7, 0xe8, 0xd6, 0x4b, 0x9a, 0x25, 0x7a, 0x68, 0x45, 0x5a, 0xe1, 0x19, 0xbf, 0x5e, 0x5e, 0x24, 0xcb, 0x7a, 0x79, 0x05, 0xb3, 0x22, 0x7f, + 0x99, 0x56, 0x05, 0xe8, 0x61, 0xe2, 0x00, 0x91, 0x56, 0xb8, 0xc3, 0xcb, 0x23, 0x5e, 0xec, 0x24, 0x7b, 0x31, 0xad, 0x42, 0xf3, 0xc2, 0xfc, 0xd7, 0xfb, 0x2b, 0xfd, 0x56, 0x13, 0xf0, 0x75, 0xbe, + 0xe8, 0x5e, 0x7c, 0xe1, 0xea, 0xe3, 0x19, 0xf1, 0xad, 0x5d, 0x1f, 0x7d, 0xaa, 0x6a, 0xce, 0x67, 0xbb, 0x3e, 0xfa, 0xb8, 0x42, 0xce, 0x79, 0xa1, 0xb5, 0xb3, 0xe9, 0x32, 0x3b, 0x1a, 0x80, 0x62, + 0x1a, 0xfb, 0x59, 0xec, 0x2d, 0xdc, 0x8e, 0x45, 0xe1, 0xc1, 0xb8, 0x93, 0x06, 0x0e, 0x5f, 0x47, 0xbb, 0x4e, 0x90, 0x66, 0xc6, 0x66, 0xb2, 0x56, 0xea, 0x56, 0x2a, 0x29, 0x8a, 0x6a, 0x81, 0xa5, + 0x5f, 0x36, 0x7b, 0x4e, 0x05, 0x66, 0x0c, 0xcd, 0xe0, 0xab, 0xe4, 0x08, 0xf1, 0x5e, 0xb7, 0x12, 0xa8, 0x7d, 0xbb, 0x35, 0x2a, 0x52, 0x40, 0x05, 0x95, 0x5d, 0x3d, 0xf2, 0x2a, 0x3d, 0xd2, 0xc9, + 0xfb, 0xd8, 0xf5, 0xaf, 0xaf, 0xa9, 0xb7, 0x43, 0xd3, 0xb2, 0xb5, 0x32, 0xfc, 0xb3, 0x55, 0x14, 0x7f, 0xa3, 0xfe, 0x0e, 0xec, 0xfb, 0xbd, 0x7e, 0x81, 0xb1, 0xd2, 0x2a, 0x2d, 0x8c, 0x4a, 0x9f, + 0x27, 0x38, 0x39, 0x3e, 0x6a, 0xd0, 0x12, 0x4b, 0xcc, 0x0c, 0x45, 0x3d, 0x6b, 0x59, 0x07, 0x3f, 0xdc, 0xb6, 0x3e, 0xb5, 0x10, 0xff, 0x5a, 0x74, 0x3c, 0x53, 0x53, 0xfb, 0x23, 0xe1, 0xd3, 0x8b, + 0x7e, 0x18, 0x0e, 0x91, 0x7e, 0x75, 0xb5, 0x2b, 0x4b, 0x51, 0xdc, 0xb5, 0x36, 0x98, 0x42, 0x6b, 0x6a, 0xd9, 0xc5, 0x95, 0xbb, 0x63, 0x1a, 0x9d, 0xb4, 0xb5, 0x26, 0xcc, 0xea, 0x5d, 0xdc, 0xe4, + 0xd6, 0x74, 0xac, 0x8f, 0x53, 0x14, 0x23, 0x68, 0xb0, 0xe6, 0x78, 0x2f, 0x81, 0x75, 0x41, 0x5a, 0xc6, 0xbe, 0x32, 0x75, 0x57, 0xfe, 0x40, 0xf1, 0xc6, 0x47, 0x1c, 0x6a, 0xb2, 0xd5, 0xdc, 0x5d, + 0x07, 0x23, 0xef, 0x20, 0x07, 0xd8, 0xac, 0x73, 0xd6, 0xab, 0x47, 0x07, 0x88, 0x6f, 0xe2, 0x27, 0x2f, 0xc1, 0x3f, 0x17, 0xe4, 0xfe, 0xfa, 0xd2, 0x2a, 0x7f, 0xc5, 0x66, 0x68, 0x67, 0xc9, 0xab, + 0x27, 0xe1, 0x19, 0xa3, 0xfc, 0x1f, 0x6c, 0x88, 0xf9, 0x43, 0x87, 0xe1, 0x95, 0x4d, 0xa1, 0xd6, 0xdd, 0xf3, 0x50, 0x3f, 0xb7, 0x69, 0x7f, 0xa0, 0xfb, 0x3e, 0x19, 0x4e, 0xa3, 0x3e, 0x9b, 0x37, + 0x34, 0xa4, 0xf6, 0x91, 0x20, 0xee, 0x0e, 0xac, 0x9f, 0x40, 0x83, 0x58, 0xe5, 0x38, 0x4a, 0xd9, 0xc6, 0x76, 0x1d, 0x56, 0x62, 0xb0, 0xfa, 0x5b, 0x52, 0xa1, 0x97, 0x50, 0xb8, 0x69, 0xa1, 0xff, + 0xb5, 0x56, 0x07, 0x3d, 0xe1, 0xfb, 0xf8, 0x40, 0xf7, 0x0c, 0xc9, 0xdb, 0x68, 0x78, 0xa6, 0xf7, 0x08, 0x92, 0xc0, 0xf5, 0xb0, 0x3c, 0x0b, 0x92, 0xc4, 0xf7, 0x1a, 0xd1, 0xd8, 0x12, 0x1a, 0x0c, + 0x1d, 0xf4, 0x76, 0xb5, 0xdb, 0x0d, 0x92, 0xbf, 0x05, 0x09, 0xf8, 0x8b, 0xfc, 0x05, 0x8d, 0xfa, 0xe0, 0xf2, 0x1e, 0xa3, 0x78, 0x4f, 0x46, 0x3e, 0xb1, 0xe3, 0x5c, 0x89, 0x9e, 0x10, 0xb9, 0x5e, + 0x9e, 0x25, 0xe2, 0xc3, 0xba, 0x6c, 0x92, 0x0e, 0xf9, 0x2b, 0xd3, 0x5e, 0x73, 0xeb, 0x7a, 0x51, 0x2d, 0xe8, 0x25, 0xcd, 0xec, 0x71, 0x67, 0xbf, 0x87, 0x74, 0xfb, 0x6b, 0x89, 0xd8, 0x63, 0xbd, + 0xdf, 0x0f, 0x97, 0xac, 0x33, 0x2d, 0x4d, 0xcf, 0xcf, 0x86, 0x7a, 0x01, 0xf5, 0x16, 0xae, 0x79, 0xef, 0x18, 0xfb, 0xc4, 0xec, 0xb9, 0x12, 0x3d, 0x03, 0x75, 0xb9, 0x3c, 0x1f, 0x4e, 0x7b, 0xf8, + 0xcc, 0x02, 0xa0, 0x9a, 0x6b, 0x07, 0x14, 0x50, 0x42, 0x0d, 0xd9, 0x77, 0xed, 0x6a, 0x52, 0x6d, 0xd7, 0xc2, 0x41, 0xb1, 0x58, 0xa6, 0x3a, 0x0a, 0xcb, 0x22, 0x3e, 0x52, 0x66, 0xd9, 0x6d, 0x99, + 0xb4, 0x4b, 0xd7, 0x6a, 0x37, 0xce, 0x83, 0xe5, 0xca, 0x55, 0xe1, 0xe5, 0x80, 0x8e, 0x29, 0x4f, 0x5a, 0x8d, 0xba, 0xb9, 0x94, 0xb0, 0x33, 0x6b, 0x95, 0x1e, 0x96, 0x8d, 0x86, 0x9a, 0x8a, 0xa5, + 0xb2, 0xeb, 0xa3, 0x55, 0x7f, 0x5f, 0x5d, 0xe8, 0x12, 0xeb, 0xf6, 0xf5, 0x34, 0x41, 0x9e, 0x09, 0x38, 0x88, 0xbd, 0xf3, 0x8b, 0x7b, 0xe7, 0xee, 0x53, 0x3d, 0x42, 0x0d, 0x16, 0x32, 0xd0, 0x96, + 0x8e, 0x0c, 0x97, 0xdd, 0x1e, 0xf3, 0x56, 0x1b, 0xc9, 0x53, 0xc7, 0xed, 0xb4, 0x58, 0x9b, 0x83, 0xb8, 0x29, 0x76, 0xb1, 0x6f, 0x71, 0x05, 0xa8, 0x19, 0xbc, 0x59, 0x8f, 0xc8, 0x60, 0xc9, 0x65, + 0x55, 0xb9, 0x91, 0x5b, 0x8a, 0x04, 0x8b, 0x7c, 0x43, 0x0b, 0x34, 0xd1, 0x56, 0x73, 0xd9, 0xd1, 0x42, 0x57, 0xc5, 0x37, 0xfc, 0x61, 0x12, 0xd1, 0x4c, 0xb0, 0x5b, 0x52, 0xcb, 0xe6, 0x5e, 0xdb, + 0xfc, 0xef, 0x60, 0x28, 0xac, 0x2c, 0xd6, 0xc2, 0x61, 0x1e, 0xde, 0x8d, 0x20, 0x78, 0xce, 0x24, 0x7e, 0x43, 0xf9, 0x0c, 0xcd, 0x87, 0x71, 0x5f, 0xb3, 0xb8, 0x00, 0x4e, 0x29, 0x68, 0x31, 0x01, + 0x72, 0xb1, 0x55, 0x43, 0xc2, 0x60, 0x13, 0x82, 0x8c, 0x31, 0x73, 0x43, 0x58, 0x3b, 0xa9, 0xae, 0x53, 0x45, 0xf4, 0x0e, 0x1b, 0x77, 0xdb, 0xf1, 0x8d, 0x2a, 0x8f, 0x57, 0xbb, 0x92, 0x22, 0xab, + 0x30, 0xde, 0xcc, 0x5a, 0xae, 0x31, 0x33, 0x79, 0x9b, 0x04, 0x39, 0x7e, 0x10, 0x39, 0x39, 0x9e, 0xd9, 0x7a, 0xa7, 0xc9, 0x26, 0xb6, 0xe7, 0x7c, 0xd7, 0x71, 0x06, 0x55, 0xcf, 0x04, 0xe0, 0xaf, + 0x83, 0xdc, 0x6f, 0x56, 0xdd, 0xdd, 0x2c, 0x94, 0xdc, 0x33, 0xad, 0xa1, 0xe1, 0x6a, 0x71, 0x6c, 0x85, 0x6f, 0xdf, 0xf8, 0x69, 0xd5, 0x9c, 0x4f, 0x66, 0xdb, 0x6f, 0x98, 0x98, 0x6a, 0xa6, 0x99, + 0xfd, 0xfa, 0xc6, 0x2e, 0x38, 0x7a, 0x46, 0x39, 0x7c, 0xa5, 0x7a, 0x62, 0xde, 0xeb, 0xf5, 0xf0, 0x4c, 0xeb, 0x31, 0xe3, 0xc0, 0x25, 0x0b, 0xe0, 0x20, 0xd1, 0x24, 0x8d, 0xb4, 0x4d, 0x18, 0x62, + 0xee, 0xf3, 0xd0, 0xcc, 0x96, 0x74, 0x2e, 0xd9, 0x81, 0x03, 0xbd, 0xd8, 0x7a, 0x86, 0x9f, 0xaf, 0xa5, 0xfd, 0x3a, 0x74, 0x01, 0x57, 0x6d, 0x03, 0x9e, 0x5c, 0xa6, 0xd1, 0xca, 0x26, 0x4a, 0xa5, + 0x16, 0xf7, 0xc8, 0x66, 0xa0, 0x05, 0x2a, 0xbe, 0x01, 0x6a, 0x88, 0x54, 0xc3, 0x83, 0xc4, 0x50, 0xca, 0xc1, 0x53, 0x76, 0xa2, 0x80, 0xfc, 0xa4, 0x62, 0xe3, 0x4b, 0xcf, 0xc6, 0x50, 0x5e, 0x3e, + 0xd4, 0x32, 0xa7, 0xfc, 0xae, 0xaf, 0x24, 0xf4, 0x9c, 0x38, 0xfc, 0x40, 0xf8, 0x84, 0xe0, 0x87, 0xe1, 0x79, 0xf6, 0xf7, 0x10, 0x8b, 0x8d, 0xe8, 0x82, 0x9b, 0xa8, 0x20, 0x79, 0x1a, 0xc7, 0x72, + 0xbe, 0xab, 0xda, 0x5d, 0xb4, 0x77, 0x58, 0xa8, 0xe8, 0x90, 0x68, 0x79, 0x24, 0xd0, 0x70, 0x3e, 0x06, 0x23, 0x8e, 0xe4, 0x14, 0xd5, 0x48, 0xd8, 0x6e, 0x29, 0x74, 0x53, 0x17, 0x67, 0xa2, 0x4c, + 0x89, 0x10, 0x13, 0x22, 0x03, 0x1c, 0x8c, 0x19, 0x2b, 0x9b, 0x90, 0xe3, 0xd1, 0x32, 0x22, 0x03, 0xa5, 0x24, 0x89, 0xce, 0x96, 0x66, 0x31, 0xf7, 0xb4, 0x53, 0xe8, 0x5b, 0x0c, 0x2f, 0xfe, 0xd7, + 0x3f, 0x0d, 0xe0, 0x85, 0xea, 0x05, 0xbd, 0xcb, 0x75, 0x5f, 0xe8, 0x3a, 0x6a, 0x34, 0xc9, 0xca, 0x95, 0x16, 0xf9, 0x6d, 0x44, 0x42, 0x1e, 0xbc, 0x50, 0x91, 0xdd, 0x2a, 0xc6, 0x50, 0x71, 0x39, + 0xcf, 0xd7, 0x5d, 0xbe, 0xb0, 0x12, 0xbc, 0xa9, 0x78, 0x84, 0x59, 0x2c, 0xd0, 0xc9, 0x38, 0x5f, 0xf3, 0x14, 0xee, 0x6d, 0xca, 0x22, 0x85, 0xb7, 0x09, 0x41, 0x08, 0xf6, 0x84, 0x2f, 0x93, 0x26, + 0x4f, 0x73, 0xd6, 0xed, 0x34, 0x31, 0x11, 0xa0, 0xae, 0x9d, 0xd0, 0xee, 0x4c, 0xe8, 0x59, 0x9b, 0xec, 0xd6, 0xeb, 0xfd, 0xcf, 0xa5, 0xa0, 0x9d, 0x41, 0x8b, 0xb5, 0xac, 0x1d, 0x7e, 0x93, 0x65, + 0xfd, 0xa4, 0xf2, 0x7c, 0x43, 0xfa, 0x95, 0x41, 0x6f, 0x37, 0xfa, 0xa8, 0xd0, 0x27, 0x2e, 0xa9, 0x2b, 0x7a, 0xa3, 0x58, 0x39, 0x9e, 0x4e, 0x5b, 0xb3, 0x2d, 0xe7, 0x9e, 0x99, 0x5b, 0x84, 0x90, + 0x33, 0x4d, 0xa1, 0xb3, 0xc4, 0x5e, 0xb6, 0x76, 0x74, 0xd2, 0x39, 0x1b, 0xc0, 0x21, 0x32, 0x13, 0x6c, 0x76, 0x5e, 0xa4, 0xf0, 0x61, 0xa5, 0x6e, 0x68, 0x60, 0x09, 0xaf, 0x1c, 0x75, 0xeb, 0xef, + 0x5b, 0x02, 0xc6, 0x58, 0xdb, 0x0a, 0x39, 0x4b, 0x36, 0xe8, 0xd5, 0x88, 0x88, 0xa2, 0x62, 0x33, 0x3f, 0x3c, 0x7f, 0x9c, 0xba, 0xbe, 0xc1, 0xb9, 0xb9, 0xcd, 0xd9, 0x24, 0xf3, 0xd7, 0xff, 0xef, + 0xad, 0xf4, 0xd2, 0x6f, 0xec, 0xfb, 0x03, 0x6e, 0x9d, 0x13, 0x68, 0x49, 0x12, 0x5a, 0x5a, 0x3c, 0x4c, 0x74, 0xdf, 0xba, 0x5b, 0x75, 0x17, 0x7a, 0x2a, 0x59, 0xe4, 0x37, 0xea, 0x57, 0x36, 0xdd, + 0xdc, 0x3b, 0xa7, 0x83, 0xf6, 0x08, 0x98, 0x70, 0xa6, 0x8a, 0xb6, 0x64, 0x16, 0x51, 0xec, 0xa3, 0xda, 0xbe, 0x69, 0x7d, 0x5c, 0x61, 0xda, 0x83, 0x9c, 0x9a, 0x6b, 0xad, 0x2e, 0x64, 0x8e, 0xd9, + 0x61, 0x86, 0x3e, 0xb0, 0xba, 0x42, 0x9c, 0x1b, 0x9d, 0x8d, 0x1b, 0x7e, 0xb9, 0x35, 0xeb, 0xca, 0xc2, 0x54, 0x96, 0xb6, 0x9d, 0xc3, 0x91, 0x41, 0x2d, 0x8c, 0x18, 0xc7, 0xd0, 0x14, 0x1a, 0x2f, + 0x6d, 0x72, 0xa2, 0x22, 0x81, 0x92, 0xad, 0x37, 0x47, 0xa5, 0xe7, 0x46, 0xfc, 0x20, 0x19, 0xed, 0x77, 0x17, 0xf2, 0x73, 0x89, 0x42, 0xff, 0x98, 0x97, 0xf4, 0xb6, 0xe4, 0xcc, 0xd7, 0x13, 0xe0, + 0x99, 0x50, 0xb6, 0x0f, 0x74, 0x2f, 0xac, 0x7f, 0x1d, 0x9d, 0xdd, 0x79, 0x3d, 0x84, 0x68, 0x9c, 0x97, 0x75, 0xd1, 0xa8, 0xf6, 0xea, 0x80, 0x13, 0x42, 0xd6, 0x86, 0x23, 0x6e, 0xb2, 0x1e, 0x94, + 0x69, 0x3c, 0x01, 0x55, 0x90, 0x72, 0xd2, 0x3a, 0x2e, 0x52, 0x89, 0x1c, 0x45, 0x10, 0x03, 0x6c, 0xb9, 0x19, 0xd8, 0xf1, 0x76, 0x67, 0x73, 0x2b, 0x19, 0x18, 0xed, 0x35, 0x00, 0x5f, 0xa9, 0xb9, + 0x0f, 0x6a, 0x46, 0x4a, 0xfb, 0x63, 0x01, 0x5c, 0xce, 0xa0, 0x66, 0x8b, 0xab, 0x26, 0x17, 0x8e, 0xb0, 0x1f, 0xd6, 0x92, 0xf8, 0xa7, 0x18, 0x72, 0xef, 0x74, 0x00, 0x3f, 0x15, 0x8a, 0x70, 0xa6, + 0x78, 0x65, 0x82, 0x77, 0x3e, 0x15, 0xf5, 0x90, 0x8e, 0x8a, 0xbd, 0xd8, 0x12, 0x59, 0x90, 0xae, 0x29, 0xb0, 0x4c, 0xcd, 0xdc, 0x64, 0xb8, 0xf9, 0x3e, 0xab, 0x5c, 0x6a, 0x61, 0x1b, 0x76, 0xc7, + 0xf3, 0x5a, 0xad, 0x4c, 0x79, 0xb6, 0x5d, 0x1f, 0x16, 0x1d, 0xc8, 0xca, 0xde, 0xdc, 0x26, 0x30, 0x81, 0xa4, 0x29, 0x71, 0x29, 0x99, 0x55, 0x0d, 0x67, 0xb3, 0x01, 0x37, 0x9f, 0xe4, 0x07, 0x74, + 0xa6, 0x92, 0x85, 0x91, 0x21, 0x3a, 0x34, 0xe2, 0x0c, 0xf5, 0x78, 0xaf, 0xd1, 0x44, 0x9f, 0x65, 0xe8, 0x0d, 0xbd, 0xd8, 0x4e, 0xbe, 0x93, 0x89, 0xbf, 0x19, 0x8d, 0x5f, 0x91, 0x3c, 0x7d, 0xd2, + 0xaf, 0x7d, 0x8c, 0x97, 0x0f, 0x4d, 0xad, 0xb0, 0x1e, 0x09, 0xc4, 0x67, 0xa2, 0xc6, 0x6e, 0x49, 0x5f, 0xb8, 0xf1, 0xe1, 0x46, 0xdf, 0xd8, 0xb1, 0x9d, 0x14, 0x4e, 0xb7, 0x18, 0x8c, 0xd6, 0xc9, + 0x1a, 0x24, 0xb5, 0x44, 0x9d, 0x75, 0x2e, 0x02, 0xa8, 0xb8, 0xe1, 0x8e, 0x14, 0x80, 0xde, 0x1f, 0x68, 0x66, 0x0d, 0x8c, 0xb5, 0x0d, 0x0f, 0x4a, 0xc1, 0xf2, 0x88, 0x16, 0xf0, 0xa2, 0x86, 0x37, + 0x30, 0x82, 0x8c, 0x0a, 0xe9, 0x10, 0xd5, 0xa5, 0x9c, 0x28, 0x04, 0xc7, 0x85, 0xd4, 0x44, 0x17, 0xd8, 0xb0, 0x81, 0xa3, 0x56, 0x04, 0x38, 0xac, 0x0b, 0xc0, 0x1f, 0xaa, 0xb6, 0xff, 0xd0, 0xaa, + 0xb0, 0x9a, 0xe2, 0x9b, 0xdc, 0xd9, 0xe7, 0xca, 0x9a, 0xbf, 0x93, 0xbd, 0x70, 0xe4, 0x3a, 0xe8, 0x53, 0xc4, 0x1c, 0x1a, 0x1e, 0xd9, 0x7a, 0xb2, 0x83, 0xac, 0x0d, 0x39, 0x21, 0xb6, 0x36, 0xa3, + 0xb9, 0xa5, 0x75, 0x3c, 0x18, 0xa4, 0xd3, 0x0d, 0x56, 0xec, 0xdf, 0x34, 0x39, 0xf5, 0x6c, 0xb2, 0xe7, 0xe5, 0x43, 0xbb, 0x0c, 0xc3, 0xda, 0x33, 0x0b, 0x77, 0x78, 0xae, 0x00, 0x99, 0x26, 0xf7, + 0x15, 0xe1, 0xa7, 0x85, 0xc7, 0x57, 0xcf, 0xb8, 0xc0, 0xf5, 0xd5, 0x27, 0x7d, 0x04, 0x0c, 0x34, 0x4c, 0x88, 0xd5, 0xf2, 0x40, 0x93, 0x6a, 0xa0, 0xac, 0xf6, 0xd6, 0xf1, 0x88, 0x09, 0x03, 0x02, + 0x47, 0x47, 0x08, 0xa1, 0xee, 0xc8, 0xfe, 0x73, 0xb1, 0xe7, 0xf1, 0xc0, 0xb1, 0x62, 0x2b, 0xd3, 0x8a, 0x24, 0x1b, 0xbe, 0xc6, 0xe6, 0x7e, 0xb3, 0xb2, 0xa1, 0xa7, 0x20, 0xfa, 0xfd, 0x11, 0x17, + 0x80, 0x7e, 0xbf, 0x7f, 0x71, 0x68, 0xf4, 0x10, 0xc0, 0x7e, 0x4e, 0xfb, 0xed, 0x28, 0x44, 0x5a, 0xef, 0x40, 0xaf, 0x07, 0x62, 0x7e, 0x30, 0x23, 0xaa, 0xa6, 0x45, 0x43, 0x68, 0xb4, 0xc3, 0x9e, + 0xcb, 0xd3, 0xa5, 0x99, 0x86, 0xb3, 0x9d, 0xcc, 0x8e, 0xaa, 0x23, 0xe4, 0xa9, 0x0e, 0x6b, 0x05, 0xd6, 0x04, 0xe4, 0x20, 0x9c, 0x38, 0x5a, 0x25, 0x89, 0x1b, 0xdd, 0x5a, 0x6b, 0x2c, 0x13, 0x39, + 0x02, 0xbb, 0xae, 0xac, 0xc1, 0xbc, 0xe6, 0x40, 0x2f, 0xe3, 0xc8, 0x9e, 0x4a, 0xcf, 0x7f, 0x04, 0xad, 0xe6, 0x1b, 0x59, 0xf1, 0x5c, 0x97, 0xf2, 0x2b, 0xcd, 0x2b, 0x63, 0x4f, 0x52, 0xa2, 0x67, + 0x97, 0x72, 0x6c, 0x0e, 0x16, 0xcb, 0x82, 0xda, 0xce, 0xd8, 0x48, 0x38, 0x4e, 0x63, 0x8e, 0x82, 0xdd, 0x39, 0x4e, 0xa5, 0xf0, 0xd1, 0x58, 0xd2, 0x33, 0xb3, 0x4c, 0xd0, 0x42, 0x2d, 0x47, 0xab, + 0x2d, 0xc0, 0xe0, 0xfc, 0xba, 0x02, 0x1c, 0xd7, 0x6d, 0x11, 0x30, 0xc1, 0xb0, 0xd2, 0xd6, 0xec, 0x66, 0x01, 0x70, 0x26, 0x43, 0x8c, 0x38, 0x2e, 0x87, 0x97, 0x76, 0x16, 0x93, 0xd8, 0x96, 0x5b, + 0xb6, 0x63, 0x82, 0xda, 0x3d, 0xf2, 0xff, 0x7d, 0x9b, 0xf7, 0xfc, 0x2e, 0x4a, 0xaf, 0x85, 0xe1, 0x7e, 0xcc, 0xd7, 0x9f, 0xc8, 0x28, 0xef, 0x52, 0x44, 0xc9, 0x32, 0x87, 0x97, 0x24, 0xcd, 0xf0, + 0x9e, 0x2f, 0x05, 0xbc, 0x29, 0x66, 0xff, 0x03, 0xbe, 0xfc, 0xfe, 0x84, 0x0b, 0x97, 0x7e, 0xbf, 0x7f, 0x2e, 0x0c, 0xd9, 0x63, 0x9f, 0xad, 0x55, 0xb2, 0x81, 0xfc, 0x9c, 0x60, 0x35, 0x30, 0xb0, + 0x0c, 0x11, 0x98, 0x30, 0x2b, 0x00, 0x19, 0x53, 0xc1, 0x38, 0x2a, 0xfd, 0x03, 0xb1, 0x17, 0xab, 0x75, 0x80, 0x97, 0x25, 0x32, 0x0b, 0x5b, 0x60, 0x15, 0xa0, 0x68, 0xda, 0x4a, 0x65, 0xb8, 0x4e, + 0x63, 0x66, 0x8e, 0xe2, 0xc2, 0xca, 0x67, 0xe6, 0x87, 0x71, 0xca, 0xf2, 0xb1, 0x8c, 0xae, 0x5d, 0x05, 0x91, 0xf6, 0x31, 0x3d, 0x11, 0xe0, 0x0e, 0x7b, 0x9e, 0x67, 0xb7, 0x49, 0xe4, 0xaf, 0xbd, + 0xf4, 0xfe, 0xeb, 0x0d, 0x53, 0x2f, 0x45, 0x0b, 0xe2, 0xdc, 0x33, 0x5f, 0x93, 0x7e, 0x9e, 0xc9, 0x69, 0xff, 0xe7, 0x32, 0x78, 0xbd, 0x7c, 0x18, 0x5b, 0x8e, 0x56, 0x78, 0x95, 0x35, 0xec, 0xac, + 0x2c, 0xf9, 0x66, 0x1b, 0x7b, 0x6a, 0x92, 0xdc, 0x10, 0xbf, 0xcc, 0x8f, 0x9b, 0x5b, 0xe7, 0x8d, 0xab, 0xc7, 0xd4, 0x30, 0x8f, 0x8b, 0x4a, 0xcb, 0x38, 0xad, 0x3e, 0xe4, 0x33, 0x9d, 0x9f, 0x5a, + 0x8b, 0x3d, 0xd1, 0x8d, 0x3b, 0x92, 0x2d, 0x16, 0x23, 0xc3, 0x84, 0x49, 0xa5, 0xb4, 0xcb, 0x72, 0xd6, 0xb9, 0xe0, 0x9c, 0x4c, 0x79, 0xc6, 0x5f, 0xac, 0x62, 0x05, 0x24, 0xa7, 0x15, 0x91, 0x2b, + 0x07, 0xb8, 0x9c, 0x61, 0xbb, 0x74, 0x2d, 0xd4, 0x9e, 0x35, 0xb6, 0x04, 0xba, 0xa1, 0x95, 0xf1, 0x7e, 0x6f, 0x97, 0x84, 0xaa, 0xee, 0x9e, 0x36, 0x8c, 0xfd, 0x6d, 0x2e, 0xfd, 0x44, 0xa6, 0xc6, + 0xe9, 0xfd, 0x82, 0x42, 0x4f, 0x2a, 0x17, 0x71, 0x1a, 0x5d, 0x79, 0x91, 0x46, 0x7d, 0xa3, 0xfd, 0x47, 0x38, 0x3d, 0x61, 0x6d, 0x77, 0xd4, 0x14, 0xd3, 0x69, 0x28, 0xb6, 0x21, 0x2f, 0x1e, 0xdc, + 0xce, 0xcf, 0xdb, 0x80, 0xc9, 0x57, 0x0b, 0x15, 0x22, 0xc7, 0x52, 0xaa, 0xed, 0xbb, 0x75, 0x4b, 0x65, 0xa8, 0xb2, 0xd9, 0x1a, 0xb2, 0xbf, 0xab, 0x3a, 0x8d, 0xd1, 0xda, 0xe9, 0x98, 0x96, 0xe0, + 0x64, 0x07, 0x20, 0xcb, 0x34, 0xf4, 0x5d, 0x66, 0xe7, 0x17, 0xd2, 0x86, 0xf7, 0xa6, 0xb5, 0x07, 0xce, 0x40, 0xef, 0xd1, 0xe2, 0xec, 0xbd, 0x6e, 0xbe, 0x47, 0xb0, 0x8c, 0x74, 0xeb, 0x5e, 0x51, + 0x64, 0xe2, 0x69, 0x10, 0xcf, 0x54, 0xaf, 0x38, 0x9e, 0xaf, 0xcf, 0xf5, 0xe4, 0x7b, 0x40, 0x89, 0x42, 0x13, 0xcf, 0x0e, 0x1c, 0xdc, 0x22, 0xb7, 0x6d, 0x28, 0xa5, 0x66, 0xb1, 0x4d, 0x2d, 0x4e, + 0x5e, 0x1d, 0x2b, 0x89, 0xa2, 0xe5, 0x6e, 0x5b, 0x14, 0x4c, 0x45, 0x6f, 0xa6, 0x04, 0x0a, 0x0d, 0xd2, 0x58, 0x25, 0xc7, 0x7c, 0x05, 0x82, 0x20, 0xba, 0xda, 0x70, 0x28, 0xb2, 0x5e, 0x8a, 0xd3, + 0x70, 0x39, 0x32, 0xe6, 0x15, 0x9f, 0xe2, 0xbc, 0xba, 0x57, 0x77, 0x54, 0xa8, 0xcf, 0x0f, 0x4a, 0xd3, 0xc4, 0x7f, 0x13, 0xca, 0x4b, 0xb9, 0xe9, 0x9f, 0xe0, 0xf9, 0xf8, 0xc0, 0x46, 0x3c, 0x0f, + 0xeb, 0xcd, 0x91, 0xed, 0xe6, 0xd6, 0x59, 0x97, 0x23, 0x1e, 0x83, 0x1c, 0x40, 0x3b, 0x90, 0xdd, 0x74, 0xdc, 0x2a, 0x21, 0xd4, 0x50, 0x61, 0xed, 0x6e, 0x53, 0xc2, 0x88, 0xe0, 0xe2, 0x2b, 0x8f, + 0x9d, 0x69, 0xb9, 0x93, 0xea, 0xa3, 0x03, 0x81, 0x5b, 0x47, 0x7b, 0xa6, 0x8e, 0x8f, 0x35, 0x83, 0xa2, 0x3b, 0x16, 0x5d, 0x6e, 0xa9, 0x8a, 0x52, 0x58, 0x15, 0x32, 0x25, 0x6e, 0xa4, 0x76, 0x13, + 0x77, 0x4b, 0x8d, 0x24, 0x97, 0xb1, 0xb9, 0x60, 0x83, 0xa6, 0xe6, 0x1e, 0x0b, 0xb2, 0xbe, 0xe1, 0xaf, 0xff, 0x01, 0x54, 0xb9, 0xef, 0x63, 0x9e, 0x9f, 0x5a, 0x31, 0x97, 0xe0, 0x66, 0xef, 0x3d, + 0x8a, 0xb9, 0xc7, 0x5a, 0x31, 0xb3, 0xe3, 0x74, 0x8e, 0x18, 0xba, 0xd1, 0x35, 0x0d, 0xbd, 0xd8, 0x24, 0xc2, 0xc1, 0x10, 0xfc, 0xc2, 0x4c, 0xa1, 0x05, 0x10, 0xb6, 0x29, 0x14, 0xf1, 0x31, 0xd8, + 0x68, 0x5d, 0xbc, 0xc9, 0xc9, 0x41, 0x54, 0x52, 0xae, 0xb3, 0x36, 0xb2, 0x58, 0xcf, 0xd3, 0xa4, 0xc1, 0x0e, 0x98, 0x2d, 0xd4, 0x20, 0x13, 0xaf, 0x62, 0xdd, 0x9e, 0x76, 0x55, 0x4c, 0xaf, 0xe8, + 0xe2, 0x38, 0xa5, 0x17, 0x74, 0x42, 0x3e, 0x32, 0x89, 0xfc, 0x19, 0xb1, 0x73, 0xab, 0x1b, 0x7c, 0x85, 0xe4, 0x73, 0xcd, 0xd5, 0x6e, 0x49, 0x5f, 0x10, 0xfd, 0x70, 0xa3, 0x6f, 0x8b, 0x35, 0x00, + 0xde, 0xcd, 0x45, 0xc9, 0x89, 0x8a, 0x63, 0x9d, 0x40, 0x41, 0xd1, 0x90, 0xfc, 0x94, 0xf1, 0x4b, 0xb1, 0x56, 0xf7, 0x11, 0xe3, 0x0a, 0x03, 0xc7, 0x07, 0xed, 0x11, 0x42, 0x07, 0x2e, 0x47, 0x61, + 0x1b, 0x67, 0x3f, 0xda, 0xa8, 0x56, 0xb5, 0x57, 0x94, 0x90, 0x0d, 0x24, 0xbc, 0xb3, 0x44, 0x03, 0xdf, 0xc1, 0xfb, 0x54, 0x30, 0xd7, 0x0a, 0x5b, 0x33, 0xd6, 0x48, 0x99, 0xa0, 0xd3, 0x3d, 0x4d, + 0xc9, 0x7f, 0x53, 0x0a, 0xf5, 0x44, 0xf6, 0xdc, 0x26, 0xe1, 0x1b, 0xc1, 0xf3, 0xf3, 0xc2, 0xdb, 0xaf, 0x44, 0x2f, 0x68, 0x5e, 0xda, 0x6b, 0x40, 0x8f, 0x4b, 0x6f, 0x9f, 0x23, 0xc4, 0xc2, 0xe5, + 0x1e, 0x22, 0x24, 0xfe, 0x88, 0xa2, 0x49, 0x5d, 0x61, 0xe3, 0xf5, 0x06, 0x99, 0x1c, 0x41, 0x7d, 0x2d, 0xd2, 0x3a, 0x39, 0x08, 0x66, 0xc8, 0x6e, 0xa9, 0xc2, 0xb6, 0xa7, 0xf2, 0xc2, 0xbe, 0xe8, + 0x0a, 0x85, 0xc6, 0x3c, 0x70, 0xd2, 0x4d, 0xd4, 0x66, 0x36, 0xad, 0x05, 0x8c, 0x3c, 0x8e, 0x85, 0x7d, 0xd1, 0x98, 0xd4, 0x46, 0x16, 0x00, 0x19, 0x5b, 0x7b, 0x31, 0x54, 0xfb, 0x93, 0xe3, 0x4c, + 0x79, 0x3e, 0x0f, 0xfe, 0xd6, 0x43, 0xfd, 0x9b, 0xe8, 0xf8, 0x7f, 0x56, 0xde, 0xe4, 0xae, 0x96, 0x59, 0xe6, 0xf0, 0x52, 0x7e, 0x43, 0x2f, 0x6d, 0xfb, 0xee, 0x8e, 0xfd, 0xb4, 0x2d, 0xf0, 0x8b, + 0x47, 0x5c, 0xf8, 0xfd, 0xc5, 0x07, 0x7d, 0x6d, 0x83, 0xf9, 0x91, 0x87, 0x77, 0xd3, 0x12, 0x02, 0xc0, 0x16, 0x2f, 0xab, 0x43, 0x2b, 0x15, 0x13, 0xa1, 0x6b, 0xdd, 0xb1, 0x3f, 0x91, 0x42, 0xc6, + 0xb0, 0x66, 0xc9, 0x6a, 0xb9, 0xd8, 0x93, 0xfb, 0x11, 0xbd, 0x1b, 0x19, 0x95, 0x67, 0x00, 0x6b, 0x33, 0x57, 0xc1, 0x80, 0xde, 0x8d, 0x10, 0x86, 0x6e, 0x11, 0x76, 0x47, 0xcf, 0x54, 0xd6, 0x63, + 0x00, 0xa4, 0x1e, 0x8c, 0x19, 0x60, 0xb7, 0xd6, 0x45, 0x86, 0x37, 0xdd, 0x9e, 0x16, 0x83, 0xaf, 0xdc, 0x24, 0xff, 0x0c, 0xef, 0xce, 0x3b, 0xdd, 0x9f, 0xd6, 0x04, 0x2e, 0x54, 0xaf, 0x1c, 0xba, + 0xb4, 0x03, 0xed, 0xb9, 0xf7, 0x17, 0x34, 0xbc, 0x3b, 0x74, 0x5e, 0xe5, 0x5b, 0x78, 0x62, 0x8b, 0x7b, 0x22, 0x84, 0x11, 0xc3, 0x9f, 0x0a, 0x2b, 0x0d, 0x1c, 0x39, 0x3a, 0xd1, 0x84, 0xe3, 0xe3, + 0x1c, 0xf7, 0xe7, 0x98, 0xe5, 0xe3, 0xa5, 0x28, 0x23, 0xf0, 0x36, 0xdc, 0x8b, 0x08, 0xbf, 0x14, 0x3d, 0xa7, 0xd0, 0xe6, 0x16, 0xc3, 0x97, 0x23, 0x3b, 0x71, 0x0d, 0x63, 0xa3, 0x54, 0xac, 0xa7, + 0xae, 0x6c, 0x41, 0x88, 0x05, 0x65, 0x57, 0xfc, 0xc0, 0x17, 0xfc, 0xef, 0x7d, 0xef, 0xbf, 0xa4, 0x1f, 0x7e, 0xc3, 0xcf, 0x27, 0x82, 0x83, 0x5e, 0xa9, 0x5e, 0xf9, 0x79, 0x29, 0x92, 0xd9, 0x37, + 0x28, 0xa8, 0xf6, 0x7c, 0x57, 0xdb, 0x48, 0xce, 0xb1, 0x72, 0x23, 0x00, 0x54, 0xcd, 0xb1, 0x71, 0xe0, 0xd5, 0x62, 0x14, 0x2a, 0xe6, 0x72, 0x96, 0x1a, 0x9b, 0xe9, 0x16, 0xdb, 0x71, 0xbb, 0x52, + 0x39, 0x88, 0xc9, 0x96, 0x18, 0xa1, 0x3b, 0x5e, 0x30, 0x77, 0x03, 0x27, 0xdd, 0xe2, 0x9b, 0x2e, 0x21, 0x74, 0x54, 0x86, 0x99, 0x5d, 0x08, 0x24, 0x29, 0x3e, 0x3f, 0x2a, 0xe4, 0x08, 0x1d, 0xab, + 0x75, 0x35, 0xb2, 0xb5, 0x1f, 0xe8, 0x72, 0x3d, 0xca, 0xcb, 0xfe, 0x3f, 0xcb, 0xcb, 0xa2, 0x4d, 0x5f, 0x45, 0xdb, 0x5d, 0x86, 0x3e, 0x55, 0x6f, 0xe7, 0x86, 0xf4, 0x85, 0xab, 0x1f, 0x6e, 0x9c, + 0xdd, 0xcc, 0x3d, 0x82, 0xe2, 0x98, 0x23, 0x83, 0x42, 0x5b, 0x5e, 0x3d, 0xc2, 0xb6, 0x53, 0xcc, 0xb7, 0xe4, 0x9e, 0x91, 0x67, 0xf2, 0xc2, 0xa5, 0xe4, 0x79, 0xa9, 0x20, 0xe3, 0x58, 0x44, 0xd6, + 0x08, 0xbe, 0x24, 0x17, 0xcb, 0xc3, 0xae, 0x91, 0x9a, 0x8d, 0x13, 0x00, 0xe6, 0x80, 0xe0, 0xfd, 0xa8, 0x9e, 0xc3, 0x55, 0x02, 0x47, 0x4a, 0x74, 0x58, 0x92, 0x3b, 0x45, 0x5d, 0x96, 0xe0, 0x91, + 0x21, 0x75, 0x59, 0xc4, 0x1c, 0xda, 0xcb, 0xfd, 0x9e, 0xf2, 0x53, 0xab, 0x34, 0xef, 0xe2, 0x1e, 0xfd, 0xf0, 0xc3, 0xdf, 0xb9, 0xfc, 0xae, 0x45, 0x3c, 0x76, 0x49, 0x5b, 0xe7, 0xba, 0x95, 0xe7, + 0x9e, 0x9d, 0xd7, 0x2f, 0x40, 0xe4, 0x2d, 0x81, 0xf7, 0x76, 0x21, 0x17, 0x4b, 0xd2, 0xcd, 0x87, 0xff, 0x11, 0x84, 0xc6, 0x19, 0xc3, 0xef, 0xe7, 0xd9, 0x93, 0xe7, 0x86, 0x77, 0xca, 0x1f, 0xa6, + 0xd9, 0xeb, 0x2c, 0x7b, 0x78, 0x8a, 0x80, 0x86, 0x18, 0x13, 0xb3, 0x93, 0x99, 0x6f, 0x4f, 0xa9, 0x7c, 0x83, 0x98, 0x69, 0xba, 0x16, 0x43, 0x87, 0xb6, 0x3b, 0x4d, 0x4a, 0xbf, 0x0e, 0x53, 0xfe, + 0xf6, 0x35, 0x6b, 0x4b, 0x0b, 0x32, 0xcb, 0xfe, 0xd3, 0xba, 0xc9, 0x95, 0xec, 0xe5, 0x05, 0xaf, 0x83, 0xbe, 0x3a, 0xc8, 0xd1, 0x28, 0xf2, 0x92, 0x53, 0x23, 0x76, 0x0d, 0x0e, 0x2a, 0x49, 0x5a, + 0xd9, 0x89, 0x5c, 0xb5, 0x33, 0x0b, 0x1e, 0xcc, 0x25, 0xba, 0x8a, 0x23, 0x15, 0xb6, 0xba, 0x6d, 0x99, 0x42, 0x12, 0x95, 0x5b, 0xa3, 0x41, 0x51, 0x4f, 0x26, 0x96, 0xa7, 0x85, 0x38, 0x4d, 0x7b, + 0x08, 0x6f, 0xc0, 0xcb, 0x99, 0x61, 0xe3, 0x83, 0x63, 0x07, 0xcf, 0x28, 0x31, 0xf6, 0x0f, 0x79, 0x40, 0x36, 0xee, 0x52, 0xd2, 0xc4, 0x9e, 0xe2, 0xf1, 0xff, 0x19, 0x1d, 0xe4, 0x9c, 0x15, 0x7e, + 0x31, 0xd9, 0xde, 0xe1, 0x0d, 0xf8, 0x5c, 0x0e, 0xc9, 0x0d, 0xe9, 0x0b, 0x7f, 0x3e, 0xdc, 0x38, 0xdb, 0xb6, 0x7b, 0x9c, 0x63, 0x65, 0x5f, 0xb2, 0x74, 0x20, 0x64, 0xa2, 0x20, 0x69, 0x4d, 0x32, + 0x6b, 0x45, 0x99, 0x5d, 0x56, 0xc2, 0x24, 0x46, 0xa7, 0x50, 0x90, 0xac, 0x8e, 0xca, 0xa0, 0x3a, 0xb6, 0xbe, 0xbf, 0xb3, 0x0d, 0xa4, 0x69, 0x97, 0x85, 0x88, 0x9a, 0x8a, 0xd0, 0xac, 0x50, 0x34, + 0x57, 0xb3, 0xf8, 0xb8, 0x96, 0x3a, 0xc9, 0xcc, 0x91, 0xa6, 0x15, 0xb2, 0xdd, 0x96, 0xdb, 0x4e, 0x46, 0x9c, 0x3c, 0x91, 0x1d, 0x2e, 0x76, 0x7e, 0x1e, 0xfc, 0x9b, 0xff, 0x5b, 0x2c, 0xd0, 0xf7, + 0xa5, 0xf9, 0x83, 0x45, 0x59, 0x62, 0xbc, 0x29, 0xcd, 0x9c, 0xbc, 0x74, 0xb5, 0x15, 0x95, 0xf0, 0x0b, 0x19, 0x97, 0x97, 0xa2, 0x63, 0x48, 0xdb, 0x86, 0xfe, 0xf1, 0x4b, 0x59, 0xcd, 0xbd, 0x13, + 0xf6, 0xb3, 0xb6, 0x0a, 0xab, 0xb9, 0x1c, 0xac, 0xad, 0xc6, 0xea, 0x63, 0xa9, 0x80, 0x86, 0xb8, 0x58, 0x75, 0x26, 0xdf, 0xc8, 0x3a, 0xe0, 0xed, 0x2c, 0x77, 0x6a, 0xe4, 0x33, 0xa3, 0x50, 0x3a, + 0x32, 0x1f, 0xb8, 0xe3, 0x1f, 0xbe, 0x8e, 0x7f, 0xda, 0x0a, 0x02, 0x2b, 0xce, 0xef, 0xbc, 0xd2, 0x73, 0x56, 0xdf, 0x37, 0xaa, 0xc0, 0xf0, 0xfd, 0xba, 0xaf, 0xed, 0x77, 0x63, 0x2e, 0x76, 0x76, + 0x68, 0xd0, 0x88, 0xb1, 0xeb, 0x96, 0xde, 0xea, 0xb8, 0x76, 0xf2, 0x49, 0x09, 0xe2, 0x33, 0xb1, 0x1c, 0xed, 0x4c, 0x76, 0x21, 0x80, 0xba, 0xa5, 0xe8, 0xa2, 0xcb, 0xf0, 0x68, 0x80, 0x6b, 0xa9, + 0xb3, 0x28, 0x3c, 0xdb, 0x48, 0x26, 0xc5, 0x76, 0xa4, 0x1b, 0x8d, 0x90, 0x2a, 0x54, 0x91, 0x4e, 0xe1, 0x60, 0xb2, 0xc2, 0x25, 0xbd, 0x73, 0xd0, 0x89, 0x56, 0xe6, 0x7b, 0x40, 0x5c, 0xfe, 0x38, + 0xbb, 0xd9, 0x3f, 0x2d, 0xbc, 0xe8, 0xde, 0xea, 0x46, 0x7e, 0x41, 0xcf, 0xb4, 0x12, 0xbf, 0x12, 0xbd, 0xa0, 0x72, 0xba, 0x1a, 0x5e, 0x08, 0x3d, 0x06, 0x25, 0x09, 0x56, 0x0c, 0x21, 0x1c, 0x0e, + 0x0b, 0x42, 0xc9, 0xf8, 0x91, 0x10, 0x20, 0x80, 0x74, 0xc8, 0xe2, 0x12, 0xf5, 0x0e, 0xa3, 0x56, 0x08, 0x06, 0x30, 0x16, 0x1f, 0x0f, 0xa8, 0x17, 0x49, 0x70, 0x9c, 0x96, 0xd5, 0x56, 0x99, 0x46, + 0x09, 0xb0, 0xa6, 0xd5, 0xe4, 0x58, 0xab, 0x81, 0xa2, 0xb1, 0xd3, 0x00, 0xf1, 0xe5, 0x8a, 0x12, 0xb6, 0x02, 0x4b, 0x3b, 0xb4, 0xab, 0x71, 0x42, 0x1b, 0x53, 0xd2, 0xe8, 0x91, 0xfd, 0xe4, 0xbb, + 0xba, 0x95, 0xce, 0xc7, 0x0c, 0xde, 0x4f, 0xed, 0xaf, 0xad, 0x3c, 0xcd, 0xbc, 0x48, 0xfb, 0xeb, 0x9b, 0x7c, 0xb0, 0xdf, 0x42, 0x79, 0xde, 0xf1, 0x3e, 0xa7, 0x80, 0x5e, 0x87, 0xfd, 0x82, 0x7a, + 0xce, 0xdd, 0xb4, 0xbf, 0x3d, 0xc5, 0x23, 0x4f, 0x4e, 0xe3, 0x37, 0xba, 0x67, 0x96, 0xbd, 0x8d, 0xce, 0x56, 0xaf, 0x87, 0xab, 0x74, 0xdf, 0x90, 0x98, 0x55, 0x35, 0x10, 0x14, 0x5b, 0x23, 0x9c, + 0xeb, 0xc8, 0x69, 0x60, 0xbb, 0x03, 0x4d, 0x54, 0x8f, 0x0b, 0xe7, 0xc7, 0x93, 0x31, 0x89, 0x87, 0xb9, 0xe1, 0x5a, 0x91, 0x36, 0x2c, 0x32, 0xed, 0xf4, 0x62, 0xf7, 0x64, 0x10, 0xf8, 0xeb, 0xb9, + 0x89, 0xf9, 0xfb, 0x03, 0x5e, 0x5f, 0xf9, 0xd3, 0xed, 0xe1, 0xf9, 0x09, 0x8f, 0x67, 0x6c, 0xa3, 0xeb, 0x13, 0x06, 0x33, 0x27, 0xca, 0x0e, 0xdb, 0x92, 0x9c, 0x41, 0xbb, 0x6e, 0xe9, 0x12, 0xcc, + 0x82, 0x24, 0x99, 0x43, 0xb9, 0x47, 0x8e, 0x39, 0x8b, 0x28, 0x60, 0x27, 0xa8, 0xb3, 0xa5, 0xad, 0xd2, 0x8c, 0x91, 0xee, 0x3d, 0x66, 0x07, 0x2c, 0x9a, 0x2e, 0xc0, 0xe1, 0x11, 0x95, 0xe5, 0x9a, + 0x0e, 0x44, 0x2b, 0x8f, 0x59, 0x17, 0xde, 0xa8, 0x5e, 0x89, 0x03, 0x12, 0xc5, 0x36, 0xa2, 0x85, 0xc8, 0xdf, 0x27, 0xdf, 0x5f, 0x5b, 0xd0, 0xbf, 0x96, 0x12, 0xbc, 0x74, 0xa2, 0x1f, 0xd6, 0x5e, + 0xe1, 0x26, 0xe5, 0xa5, 0x41, 0xfd, 0xa5, 0xa7, 0xf3, 0xbd, 0xed, 0xe8, 0x59, 0xdc, 0x1e, 0x3c, 0xf1, 0x0d, 0xc8, 0x07, 0xdf, 0xeb, 0x97, 0x09, 0x1b, 0xeb, 0x16, 0x14, 0x2e, 0xb4, 0x42, 0xec, + 0xba, 0x01, 0x59, 0xa7, 0xd0, 0x6c, 0x02, 0x16, 0x41, 0x9d, 0x1d, 0x16, 0xe1, 0x4f, 0xb7, 0xb2, 0xc0, 0x6a, 0xab, 0xfb, 0xf2, 0xed, 0x89, 0xf5, 0x72, 0x22, 0x08, 0x0c, 0xcf, 0x7f, 0xce, 0x4d, + 0x2b, 0x7b, 0x08, 0xfb, 0x51, 0x1b, 0x2c, 0x00, 0x14, 0x97, 0x78, 0x60, 0xb4, 0x14, 0x57, 0x40, 0xee, 0x19, 0x6e, 0xb7, 0x26, 0x84, 0xea, 0xd0, 0xce, 0xa7, 0xca, 0x72, 0xbe, 0xd5, 0xa6, 0xe1, + 0x72, 0x35, 0x9f, 0x8c, 0x43, 0x07, 0xde, 0x2d, 0xc9, 0xe5, 0xa6, 0x45, 0x7d, 0x1d, 0x34, 0xc9, 0x7c, 0x66, 0x0c, 0xc0, 0x6d, 0x01, 0x2a, 0x4a, 0xbc, 0x75, 0x8f, 0xe4, 0x01, 0xde, 0xa8, 0xce, + 0xc4, 0x21, 0xd0, 0x8d, 0xd8, 0x38, 0xc6, 0xe7, 0x16, 0x7c, 0x3f, 0x90, 0x6b, 0xb7, 0x92, 0xe4, 0x2f, 0xa4, 0x67, 0x11, 0x91, 0x4b, 0xe7, 0xa9, 0xe1, 0x3b, 0x80, 0x5f, 0x61, 0x8a, 0x3d, 0x85, + 0xe9, 0x2d, 0x69, 0x60, 0xf8, 0xe9, 0xc6, 0xb9, 0xf2, 0x6c, 0x0f, 0x9c, 0x6b, 0x6b, 0x3b, 0xc8, 0xc0, 0x60, 0x1b, 0x6c, 0xd6, 0xe6, 0xc4, 0x54, 0x26, 0x7c, 0x11, 0xac, 0xea, 0xfd, 0x61, 0xbd, + 0x5d, 0xd1, 0x79, 0xbd, 0xcc, 0x66, 0x54, 0x10, 0xa1, 0x46, 0xb0, 0x16, 0x56, 0xb2, 0xeb, 0x1e, 0x5d, 0x76, 0xc5, 0x42, 0xbb, 0x2d, 0xec, 0xae, 0xfc, 0x01, 0xe4, 0x79, 0x0e, 0xeb, 0x3a, 0x92, + 0x1a, 0x61, 0xce, 0x36, 0xca, 0x36, 0x07, 0x8a, 0x4f, 0xe6, 0x3b, 0x47, 0xdb, 0x2a, 0x50, 0xf3, 0x3c, 0xce, 0xa9, 0x66, 0x04, 0x9a, 0x63, 0x9d, 0x67, 0xfe, 0x79, 0x9b, 0xc0, 0x9f, 0x6a, 0x2f, + 0xdc, 0xc7, 0x82, 0x1f, 0x5a, 0xd5, 0x3d, 0x8e, 0x3c, 0x27, 0x2b, 0x4f, 0x04, 0x4f, 0x7c, 0xb0, 0xaa, 0xb8, 0xaf, 0x2c, 0x1c, 0xe8, 0x5b, 0xb8, 0x64, 0x50, 0x1a, 0xe3, 0xe6, 0x34, 0xe1, 0x02, + 0x31, 0x62, 0x55, 0x86, 0x04, 0xe4, 0xeb, 0x70, 0x71, 0x98, 0xa4, 0x6c, 0x8a, 0xb7, 0x11, 0x29, 0xec, 0x17, 0x98, 0x25, 0xe3, 0x03, 0x9c, 0x98, 0xe6, 0xc7, 0x10, 0xe0, 0x34, 0x6d, 0x4b, 0x1c, + 0x17, 0xd4, 0xb8, 0x80, 0xb3, 0xce, 0x4e, 0x34, 0x00, 0x5b, 0x53, 0x73, 0xca, 0x6d, 0xa6, 0x5e, 0x03, 0x99, 0xab, 0x02, 0x0e, 0xd6, 0xf7, 0x54, 0x9a, 0x3e, 0xe8, 0x67, 0x56, 0x58, 0x9a, 0xd6, + 0xf0, 0xcd, 0xc8, 0x04, 0xdf, 0x86, 0x9a, 0x9c, 0x2b, 0x9e, 0x1b, 0xae, 0x65, 0x04, 0xa7, 0xcf, 0xff, 0xef, 0x6d, 0x99, 0xca, 0xbe, 0xbc, 0x79, 0x01, 0xcf, 0xd5, 0xf6, 0x7b, 0x30, 0xe8, 0x9c, + 0xf3, 0x1a, 0xb5, 0x1f, 0x0a, 0xdf, 0x7e, 0xad, 0x89, 0x12, 0xcf, 0x2c, 0x9f, 0x4f, 0xc4, 0x4f, 0x8c, 0xfb, 0x74, 0x6b, 0x78, 0xa6, 0xfc, 0x98, 0x89, 0xdc, 0x56, 0x23, 0x15, 0x35, 0x45, 0x96, + 0xf0, 0x78, 0x97, 0x1e, 0x77, 0x71, 0x5d, 0x2f, 0x35, 0x3f, 0x61, 0x19, 0x23, 0x5f, 0x0a, 0x54, 0xdc, 0xd5, 0x0b, 0x7e, 0x2d, 0x65, 0x01, 0x51, 0xc6, 0x9d, 0x27, 0xd6, 0x09, 0x3e, 0xf1, 0x05, + 0xc5, 0x6f, 0x05, 0x70, 0x36, 0xaa, 0xed, 0xa0, 0x99, 0x55, 0xe2, 0x20, 0xa6, 0xf2, 0xc9, 0xdc, 0x42, 0xac, 0x95, 0x18, 0x5b, 0xa6, 0xec, 0xb0, 0xac, 0x63, 0x8e, 0x7b, 0x56, 0x53, 0xd1, 0xfc, + 0xea, 0xcc, 0x2a, 0xf2, 0x73, 0x8a, 0xa0, 0x91, 0x24, 0x81, 0x77, 0x51, 0xc3, 0x7e, 0x6b, 0x22, 0x6a, 0x6b, 0x79, 0x71, 0xde, 0x66, 0xb4, 0x2c, 0xbe, 0x1c, 0x88, 0xcf, 0x55, 0xff, 0x6f, 0xbf, + 0x94, 0x5b, 0xc5, 0xf0, 0x42, 0xe4, 0x5a, 0x5f, 0xe7, 0xaf, 0x8b, 0xcd, 0x08, 0xfd, 0xd5, 0x27, 0xd3, 0xf7, 0x37, 0x78, 0x6f, 0x3e, 0xbd, 0xfc, 0xea, 0xaf, 0x98, 0x49, 0xfe, 0x22, 0x9f, 0xb0, + 0x5c, 0x68, 0xfe, 0x69, 0x7b, 0xd1, 0xfc, 0x6a, 0x78, 0xfe, 0xff, 0xc7, 0x2c, 0x6b, 0x46, 0x72, 0x79, 0x18, 0x6c, 0x00, 0xdf, 0x98, 0xf9, 0xd0, 0x94, 0x49, 0x00, 0x7b, 0x92, 0x8e, 0x46, 0x56, + 0xee, 0xcc, 0xa7, 0x7b, 0x8f, 0xa1, 0xf9, 0x6c, 0xd9, 0x68, 0x13, 0x9a, 0x2f, 0x27, 0x4d, 0x9a, 0xac, 0x26, 0xd1, 0xb8, 0x00, 0x26, 0xc2, 0x64, 0x2e, 0x4f, 0xeb, 0x31, 0x11, 0x84, 0x16, 0x9d, + 0xd2, 0xdd, 0xc2, 0x9f, 0xc6, 0x95, 0x8b, 0xb4, 0xf3, 0x44, 0x28, 0xb9, 0x12, 0x9c, 0x16, 0x61, 0xd8, 0x93, 0x65, 0xf7, 0xfa, 0xb0, 0xdf, 0xac, 0xb4, 0x3b, 0x8a, 0xdd, 0x97, 0x85, 0x16, 0x8e, + 0xa5, 0x97, 0x5d, 0x0a, 0x2d, 0xbc, 0xbb, 0x40, 0x2e, 0xd6, 0xbd, 0x1b, 0xe3, 0x60, 0x99, 0x79, 0xaf, 0x35, 0xb0, 0xd0, 0x73, 0x47, 0xd6, 0xdf, 0x16, 0xee, 0x97, 0x06, 0x92, 0xd3, 0x9a, 0x3f, + 0xfd, 0xd3, 0xc5, 0x32, 0x72, 0x4b, 0xf0, 0xa1, 0xe9, 0xc4, 0x4a, 0x13, 0xdd, 0xca, 0xac, 0x2e, 0x78, 0x6f, 0x82, 0xf8, 0xf4, 0xa4, 0xf9, 0x81, 0xae, 0xfb, 0x9c, 0x09, 0xe1, 0x27, 0xba, 0x6e, + 0x0f, 0xe3, 0xc2, 0x69, 0x9e, 0xf1, 0x2b, 0x12, 0x10, 0x47, 0x31, 0x72, 0xf0, 0x0f, 0x2e, 0xab, 0xc6, 0x50, 0xc8, 0xb9, 0xc1, 0x4c, 0x1b, 0x4f, 0xb6, 0xc2, 0x6e, 0xb3, 0x3e, 0xf8, 0x7b, 0x57, + 0x46, 0xa9, 0x31, 0xb0, 0x89, 0x85, 0x8a, 0x6c, 0x2a, 0xe7, 0x58, 0x1c, 0xd3, 0xf1, 0x61, 0xc4, 0x0a, 0x68, 0xb4, 0x59, 0x37, 0x52, 0x03, 0x6d, 0xc2, 0x04, 0x2d, 0x8e, 0x9d, 0x75, 0xd4, 0xc1, + 0x5c, 0x08, 0xb3, 0x52, 0x13, 0x5a, 0xc4, 0x2c, 0xbf, 0xd7, 0x75, 0xc3, 0xc4, 0xbc, 0x5f, 0x9f, 0x01, 0xfd, 0x05, 0x11, 0xbf, 0xe0, 0x27, 0xb6, 0xb6, 0x33, 0xd1, 0x93, 0x8c, 0x3c, 0x5f, 0x0c, + 0xaf, 0x74, 0x1e, 0x03, 0x50, 0xc1, 0xc1, 0x94, 0xb6, 0x30, 0x22, 0xb4, 0x8c, 0x6d, 0x19, 0x6a, 0x53, 0xb6, 0xe4, 0xb7, 0x62, 0x8b, 0x6c, 0x5a, 0xd4, 0xe1, 0xe6, 0x0b, 0x5c, 0x85, 0x04, 0xa4, + 0xa2, 0xa1, 0x20, 0x73, 0x0e, 0x2a, 0x9f, 0xe5, 0xeb, 0x01, 0x37, 0xdb, 0xce, 0x19, 0xb9, 0x91, 0x7d, 0xe3, 0x20, 0xe6, 0x10, 0xc1, 0xb9, 0xba, 0x2a, 0xcf, 0x2d, 0x73, 0xbc, 0xa8, 0xc8, 0x83, + 0x0a, 0x15, 0x95, 0x8f, 0xcd, 0x2a, 0xe9, 0xce, 0xf1, 0xf4, 0x11, 0x26, 0xbf, 0x8c, 0x30, 0x89, 0xad, 0xd3, 0xca, 0xbb, 0x8b, 0x0e, 0xf6, 0xc4, 0xb4, 0xf9, 0x4c, 0xfc, 0x0d, 0xa5, 0xf7, 0x5b, + 0xc3, 0x33, 0xe5, 0x47, 0x0a, 0x3c, 0xea, 0x93, 0x40, 0x4c, 0x0f, 0xc4, 0xca, 0xc4, 0x99, 0x85, 0x14, 0x53, 0x54, 0xe3, 0x1e, 0x12, 0x56, 0x0f, 0x3b, 0xe1, 0xa7, 0x3d, 0x60, 0xaf, 0xcf, 0x2f, + 0xb2, 0x32, 0x36, 0xb4, 0xe2, 0xde, 0x2a, 0x41, 0x7f, 0xa1, 0x4f, 0xc8, 0xda, 0x4f, 0xb4, 0xdf, 0xdf, 0xf6, 0xf5, 0xce, 0xf0, 0x4c, 0xf7, 0xd1, 0xcb, 0xee, 0xfd, 0x1d, 0x9f, 0x70, 0xf4, 0x46, + 0x40, 0xf9, 0x41, 0x07, 0x00, 0xb2, 0x23, 0xb5, 0x83, 0x3d, 0xaf, 0x1f, 0x51, 0xf5, 0xeb, 0x3a, 0x26, 0xdf, 0xbd, 0x6c, 0x92, 0xea, 0x56, 0x7c, 0xb7, 0x07, 0xfa, 0x73, 0xd5, 0x29, 0xdf, 0xa8, + 0x9e, 0x5f, 0xf0, 0x7a, 0xdd, 0xa7, 0x1e, 0x25, 0x34, 0x34, 0x9d, 0x39, 0x22, 0x42, 0xc6, 0xc2, 0x66, 0x44, 0x70, 0x71, 0xa4, 0xac, 0x0a, 0x71, 0xb4, 0x62, 0x90, 0x2e, 0x66, 0x00, 0xd9, 0x6b, + 0x83, 0x68, 0x0a, 0xeb, 0x6a, 0xc8, 0xbe, 0xed, 0x4d, 0xf5, 0x1d, 0x04, 0x9f, 0x8a, 0xf2, 0xff, 0xb9, 0x83, 0xec, 0x2d, 0xe9, 0x33, 0x18, 0x1f, 0x6f, 0xf4, 0x39, 0x9a, 0x9e, 0xe4, 0xc0, 0x1c, + 0xe6, 0x7c, 0x1c, 0x2a, 0x0e, 0xd3, 0x58, 0x9e, 0xcd, 0x04, 0x8f, 0x94, 0x55, 0x33, 0x1f, 0x48, 0xc9, 0xda, 0x2f, 0xd6, 0x13, 0xc4, 0x74, 0x92, 0x60, 0x69, 0x4e, 0xe7, 0x70, 0xb4, 0x8d, 0xa0, + 0xa2, 0x41, 0x23, 0x0c, 0xe4, 0x77, 0x0c, 0x25, 0xa8, 0x12, 0x55, 0xaf, 0xd7, 0x4c, 0xdb, 0x82, 0x32, 0x04, 0x8f, 0xc1, 0xc5, 0x76, 0x8e, 0x7a, 0x86, 0xad, 0xae, 0x99, 0x41, 0x23, 0xb6, 0x2e, + 0xf9, 0xf0, 0x38, 0xf7, 0x38, 0xd8, 0xb0, 0xe7, 0x29, 0x2e, 0x2b, 0x2f, 0x15, 0x19, 0xef, 0x20, 0x8b, 0x3f, 0xb5, 0xdd, 0xbc, 0x51, 0x3d, 0x81, 0xfa, 0x7a, 0x3d, 0xc4, 0xfb, 0x6d, 0x2c, 0x8b, + 0x04, 0x37, 0x17, 0x20, 0x3a, 0x89, 0x24, 0xbf, 0xec, 0xe2, 0x7a, 0x21, 0x49, 0x48, 0xba, 0xb3, 0xf6, 0x91, 0x09, 0x30, 0xa0, 0x6d, 0x6f, 0xc3, 0xe0, 0x70, 0x70, 0x6a, 0xd5, 0x1b, 0x58, 0x47, + 0x68, 0x37, 0x89, 0x8e, 0xeb, 0x7a, 0xe2, 0x0e, 0x2c, 0x2e, 0x57, 0x04, 0x65, 0x52, 0x2b, 0xa3, 0x11, 0xe4, 0xc1, 0x33, 0xcd, 0x45, 0x5d, 0x88, 0xa2, 0x57, 0x93, 0x06, 0x3d, 0x6e, 0xdd, 0xb9, + 0x9e, 0x7b, 0x3d, 0x1d, 0x96, 0xad, 0x16, 0x86, 0xde, 0xb5, 0x0f, 0xc5, 0x73, 0x55, 0x9d, 0x7a, 0x55, 0x48, 0x88, 0xb4, 0xc0, 0x1a, 0x9a, 0xde, 0x7d, 0xcb, 0xdd, 0x33, 0xa7, 0xe6, 0x57, 0xa2, + 0xc0, 0xf0, 0xed, 0xb2, 0xaf, 0x45, 0xc2, 0x41, 0x66, 0x96, 0x08, 0x83, 0x1c, 0x5f, 0xbb, 0x63, 0x4e, 0x07, 0xf0, 0x49, 0x87, 0x4f, 0x4d, 0x74, 0x06, 0xc7, 0x4e, 0x67, 0x81, 0x7e, 0x47, 0x14, + 0x7a, 0x97, 0x4d, 0xe1, 0x7a, 0x2c, 0x0f, 0x92, 0xd1, 0xcc, 0xe2, 0x19, 0x0b, 0xcd, 0xb8, 0x41, 0xbb, 0x84, 0x23, 0x13, 0x5c, 0x00, 0xb6, 0x27, 0xd9, 0x50, 0xae, 0x41, 0xe3, 0xa9, 0x7b, 0x38, + 0x7a, 0xd8, 0x20, 0x91, 0x6b, 0x61, 0x05, 0x58, 0xf3, 0x47, 0x31, 0x80, 0xf7, 0xb9, 0x90, 0x5b, 0x51, 0x75, 0x55, 0xca, 0xf1, 0xa7, 0x98, 0xf0, 0xcf, 0x85, 0xfb, 0xbf, 0x31, 0xe1, 0xe6, 0xee, + 0xdb, 0x0b, 0x7d, 0xbd, 0xc4, 0x9e, 0xf1, 0x9a, 0x5d, 0x48, 0x02, 0xc3, 0xeb, 0xc5, 0x10, 0xef, 0xe7, 0x25, 0xd3, 0x91, 0xd1, 0x96, 0xd2, 0xb6, 0x92, 0x2d, 0xe3, 0x2d, 0x95, 0x69, 0xe9, 0x8e, + 0x1c, 0xa5, 0x98, 0xbd, 0xb4, 0x02, 0x1a, 0x8e, 0x00, 0xbe, 0x8e, 0xa7, 0x89, 0x21, 0xc8, 0x59, 0xb9, 0x9e, 0x49, 0x10, 0x50, 0x59, 0x2b, 0xc7, 0xec, 0x4a, 0xd1, 0x88, 0x85, 0x15, 0x82, 0xae, + 0xf0, 0x49, 0xdd, 0xec, 0x49, 0x9f, 0x01, 0xc2, 0x86, 0xd6, 0xb0, 0x8c, 0x4a, 0xa6, 0xd6, 0xae, 0x2e, 0x31, 0x86, 0xd9, 0x3e, 0xe2, 0xf4, 0x6f, 0x86, 0xef, 0x77, 0x06, 0xeb, 0x5e, 0x7c, 0x7d, + 0x83, 0x7e, 0x66, 0xef, 0x33, 0xbe, 0x56, 0x96, 0x25, 0xf7, 0x63, 0xd7, 0x90, 0x27, 0x2a, 0x52, 0xbd, 0x93, 0x7d, 0x5d, 0x3d, 0xe7, 0xc1, 0xb9, 0xf0, 0x50, 0x8f, 0x5a, 0x88, 0x39, 0xb9, 0x73, + 0x43, 0xde, 0x22, 0x2a, 0x71, 0x99, 0x44, 0x6b, 0x77, 0x02, 0x1d, 0x67, 0x56, 0xb8, 0x4a, 0x82, 0x0c, 0x90, 0x0c, 0x64, 0xec, 0xf0, 0x7a, 0x9e, 0x20, 0x31, 0x81, 0x46, 0xb2, 0x38, 0xc6, 0xb8, + 0xad, 0x5a, 0x07, 0xd4, 0x88, 0x0f, 0x0f, 0x36, 0x7a, 0x10, 0xb5, 0x88, 0x6b, 0x16, 0x34, 0xe9, 0x82, 0x8e, 0x4b, 0x20, 0xd9, 0x6a, 0x84, 0x36, 0x55, 0xbd, 0xd9, 0xc2, 0x13, 0x99, 0x8d, 0x7f, + 0xec, 0x7b, 0x8c, 0xb4, 0x58, 0x73, 0xac, 0xef, 0x2b, 0x53, 0x3c, 0x23, 0xcd, 0x3f, 0xd0, 0x3d, 0xa3, 0xf3, 0x36, 0xea, 0xe7, 0xb8, 0x1b, 0xad, 0x06, 0xb4, 0x4c, 0x04, 0x11, 0x51, 0xa2, 0x47, + 0x87, 0x98, 0x75, 0x3b, 0x6a, 0xbd, 0xab, 0x18, 0x3d, 0x0b, 0x55, 0xe3, 0x3b, 0x65, 0xff, 0xad, 0x59, 0xd7, 0xd7, 0x5c, 0x7e, 0xc6, 0x8a, 0x75, 0x21, 0x79, 0x7a, 0x87, 0xf3, 0xc5, 0x10, 0xea, + 0x67, 0xc9, 0x22, 0x8f, 0x84, 0x4c, 0x3b, 0xab, 0xc5, 0x1e, 0x5d, 0x90, 0x85, 0x61, 0xcb, 0x62, 0x4b, 0x3a, 0xe0, 0x88, 0x37, 0xd6, 0xb5, 0x6a, 0xea, 0xf5, 0x8c, 0x3e, 0xba, 0x16, 0xb0, 0x57, + 0x83, 0x84, 0xed, 0xfc, 0x18, 0x40, 0xb6, 0xf3, 0x69, 0x5d, 0x08, 0x13, 0xa5, 0x38, 0xcc, 0x9b, 0x31, 0x22, 0x90, 0x85, 0xd8, 0xa5, 0x46, 0x37, 0x99, 0x4c, 0x9d, 0x6a, 0x20, 0xc2, 0x22, 0xd6, + 0x82, 0xa0, 0xba, 0x10, 0x3e, 0x17, 0x3e, 0xf9, 0xe9, 0x06, 0xff, 0xd2, 0xc7, 0x0c, 0x18, 0x59, 0x85, 0x9b, 0x98, 0xf7, 0x95, 0xa6, 0x67, 0x4a, 0x60, 0x5c, 0x69, 0x9e, 0x41, 0x3c, 0x5f, 0xf5, + 0x29, 0x77, 0x01, 0x0d, 0x65, 0x29, 0x0a, 0xa0, 0x58, 0xdd, 0xd1, 0x20, 0x61, 0x34, 0x92, 0x1a, 0xc9, 0x09, 0xaf, 0x4f, 0xd1, 0x9d, 0x06, 0x08, 0xe8, 0xdf, 0xc3, 0x01, 0xec, 0xd5, 0xda, 0x28, + 0xf2, 0x8c, 0x2c, 0x79, 0x6d, 0x9a, 0xfb, 0xf5, 0x81, 0xe1, 0x99, 0x7a, 0x3a, 0xef, 0x64, 0x4f, 0x78, 0xbc, 0x0d, 0xce, 0x5e, 0xdf, 0x1e, 0xc5, 0x20, 0xd2, 0x4d, 0xd4, 0xd5, 0xc0, 0x61, 0x67, + 0xd4, 0x87, 0x79, 0x3a, 0x1d, 0x69, 0xec, 0xe8, 0x08, 0x80, 0x07, 0xa1, 0xe6, 0xf8, 0xd6, 0xf1, 0xe9, 0xed, 0x82, 0x6c, 0x41, 0x2d, 0x01, 0x6b, 0xf3, 0x98, 0x66, 0x59, 0x37, 0xd5, 0x50, 0x25, + 0x6e, 0x38, 0xa3, 0x23, 0xec, 0xf5, 0x46, 0xcd, 0xc8, 0x2a, 0x71, 0x49, 0x19, 0x02, 0x83, 0xb9, 0x3b, 0xa6, 0x74, 0xde, 0x60, 0xe4, 0x00, 0xab, 0x19, 0x67, 0x5f, 0x3f, 0x9a, 0x58, 0xdf, 0xd4, + 0x6a, 0xc9, 0x34, 0xc3, 0xba, 0x58, 0x51, 0x7e, 0xeb, 0xba, 0x97, 0x7a, 0x46, 0xf2, 0xde, 0x74, 0x18, 0xfe, 0x05, 0x3f, 0x11, 0xfa, 0xdc, 0xaf, 0x0b, 0xd5, 0x07, 0x4c, 0x6f, 0xee, 0x7f, 0xfc, + 0x05, 0x5f, 0xcb, 0x36, 0xf8, 0x89, 0xa8, 0xc9, 0x37, 0xaa, 0xc0, 0xf0, 0xfd, 0x7a, 0x78, 0xa6, 0xf5, 0x98, 0x7f, 0xcb, 0x94, 0xe6, 0x7c, 0xbb, 0x36, 0x26, 0xd3, 0x9d, 0x3e, 0x12, 0x2d, 0xcf, + 0xd9, 0xe6, 0x70, 0x44, 0x2d, 0xba, 0xc3, 0x4e, 0xec, 0xc6, 0xa5, 0x08, 0x27, 0xa2, 0x31, 0x1e, 0x91, 0x23, 0xc6, 0x22, 0x37, 0x85, 0x05, 0x0e, 0x94, 0xdd, 0xd8, 0xaf, 0xa1, 0x85, 0x6c, 0x99, + 0x53, 0xb7, 0xdc, 0x2e, 0xc5, 0x80, 0xf1, 0x25, 0xa5, 0x5b, 0xf1, 0x48, 0x9c, 0x4e, 0x46, 0x61, 0xb9, 0x75, 0xe7, 0x0a, 0xbd, 0x34, 0x1f, 0xf1, 0xef, 0x07, 0x20, 0xbf, 0xfd, 0xcf, 0xb3, 0xca, + 0x8f, 0x9f, 0xc4, 0xb9, 0xe1, 0x86, 0x5e, 0x1c, 0x58, 0x59, 0xd1, 0x8b, 0x77, 0xd1, 0x7d, 0xbb, 0xd5, 0x33, 0x3d, 0xf3, 0x4e, 0x04, 0xcf, 0x4b, 0x2b, 0xb2, 0x86, 0x50, 0xbf, 0xae, 0x79, 0x0d, + 0x28, 0xc7, 0x64, 0x9e, 0xb2, 0x83, 0xba, 0x5c, 0x40, 0x02, 0x2e, 0x11, 0x4e, 0xac, 0x6b, 0x6b, 0x87, 0x14, 0x1b, 0x17, 0xe5, 0x79, 0x46, 0x27, 0x96, 0x12, 0xcb, 0x47, 0xf4, 0x7e, 0xe9, 0x89, + 0x34, 0xba, 0x59, 0x0a, 0x69, 0x58, 0x79, 0x7e, 0x3c, 0xe0, 0x83, 0x48, 0x89, 0xa2, 0x8d, 0x23, 0xe2, 0x64, 0x64, 0x10, 0xa0, 0x0f, 0xd3, 0xba, 0xb5, 0x9d, 0x6d, 0xf2, 0x2c, 0xaf, 0xb5, 0xb5, + 0xf5, 0x88, 0x29, 0xbf, 0x69, 0x38, 0x57, 0x24, 0xfe, 0x32, 0x42, 0xef, 0xa3, 0x62, 0xd3, 0x97, 0x8b, 0x7d, 0x6a, 0x00, 0x9c, 0x41, 0x31, 0xef, 0x65, 0x83, 0x43, 0xbf, 0xd0, 0x67, 0x6a, 0x81, + 0x5f, 0x89, 0xbe, 0x62, 0x6e, 0xea, 0xc3, 0x0b, 0xa1, 0xc7, 0xb8, 0x03, 0xbc, 0xb0, 0xb5, 0xb9, 0x2c, 0x17, 0x29, 0xd9, 0x62, 0x08, 0xa5, 0x98, 0x89, 0x4e, 0x2e, 0xef, 0x2b, 0xab, 0xe4, 0x06, + 0xa8, 0xe4, 0xfb, 0x4a, 0xa3, 0xad, 0xa1, 0xa6, 0x58, 0x41, 0xcb, 0xd5, 0xcc, 0x27, 0x18, 0xb3, 0x09, 0xa9, 0xb0, 0xb1, 0x5a, 0x9e, 0xeb, 0xdc, 0x76, 0x21, 0x37, 0x44, 0x86, 0x66, 0xea, 0x7c, + 0x31, 0x56, 0x01, 0x3c, 0x0c, 0x96, 0x13, 0xaf, 0x90, 0x0c, 0x80, 0x8f, 0xd2, 0x1f, 0xd6, 0xf0, 0xe8, 0x27, 0x5f, 0xa2, 0x4b, 0x38, 0xea, 0xbd, 0x7d, 0x11, 0x3e, 0xed, 0x67, 0x3f, 0x8f, 0xa7, + 0x7f, 0xa7, 0xfb, 0x0a, 0xde, 0x79, 0x30, 0xbc, 0x90, 0x7b, 0x8c, 0xdf, 0x82, 0x75, 0x8f, 0xf1, 0x44, 0xcb, 0xd9, 0x51, 0x3b, 0x1d, 0x48, 0x79, 0x14, 0x1c, 0x4b, 0x86, 0x6a, 0xb6, 0x12, 0x5d, + 0xaa, 0xe6, 0xfa, 0x80, 0x51, 0xe5, 0x3a, 0x96, 0x60, 0xd9, 0x20, 0xd2, 0x72, 0xbd, 0x5e, 0x0f, 0xc8, 0xd6, 0x13, 0xb1, 0xb1, 0x82, 0x95, 0x7b, 0x37, 0x35, 0x2b, 0x54, 0xe1, 0x50, 0x79, 0x85, + 0x19, 0xb8, 0x17, 0x7a, 0x9e, 0xb2, 0x17, 0x9d, 0x05, 0x10, 0x2f, 0xd6, 0x5c, 0x4a, 0xf4, 0xb4, 0xdb, 0xbf, 0x4f, 0xa5, 0xd7, 0x79, 0xf3, 0xd3, 0x09, 0xdb, 0x1f, 0xfc, 0xdb, 0xf6, 0x89, 0x7f, + 0xce, 0x9a, 0x73, 0x4b, 0xfa, 0xc2, 0x83, 0x0f, 0x37, 0xfa, 0x5a, 0x73, 0x7c, 0x8c, 0x36, 0x8a, 0x38, 0x60, 0x08, 0x2d, 0xb2, 0x65, 0xe0, 0x88, 0x31, 0x4e, 0x94, 0x68, 0x21, 0xe4, 0xc0, 0x6b, + 0x66, 0xb6, 0xd8, 0x64, 0x9a, 0x50, 0x44, 0x0d, 0xb8, 0x48, 0xd9, 0x63, 0xd0, 0xb8, 0x94, 0xcb, 0x02, 0xe1, 0x42, 0x0a, 0xa1, 0x78, 0x95, 0xae, 0x51, 0xcc, 0x95, 0xb5, 0xac, 0xe6, 0xe9, 0xad, + 0x90, 0xec, 0x69, 0x2f, 0x8a, 0x4d, 0x15, 0x5d, 0x2f, 0xc1, 0x0d, 0xd3, 0x94, 0xcd, 0x23, 0xb7, 0xe5, 0x1f, 0x91, 0x06, 0xb1, 0xf7, 0xdd, 0xf6, 0x88, 0x3c, 0xa9, 0xe0, 0x5c, 0xa9, 0x9e, 0xf1, + 0xbc, 0x5e, 0x9f, 0x23, 0x81, 0x7a, 0xa8, 0x37, 0xed, 0x82, 0x91, 0xd7, 0xb4, 0xdb, 0x1e, 0x45, 0x6e, 0xb7, 0x75, 0x8a, 0x11, 0x45, 0x22, 0xe2, 0xa1, 0xc4, 0xf7, 0x48, 0xd6, 0xa0, 0xab, 0xaa, + 0x62, 0x2a, 0x69, 0x57, 0x6d, 0x93, 0xc4, 0x49, 0xeb, 0x64, 0x3e, 0x15, 0x76, 0xeb, 0x41, 0x3b, 0xcd, 0x36, 0x20, 0xb3, 0x49, 0x8a, 0x41, 0x2b, 0x4c, 0xcc, 0x89, 0x40, 0x94, 0xa8, 0x7b, 0x40, + 0xd2, 0xbd, 0x5d, 0xe0, 0xc1, 0x9e, 0xa2, 0x8c, 0xa3, 0x0b, 0xee, 0x1e, 0x19, 0xc6, 0x1e, 0xa8, 0x37, 0x43, 0xab, 0x49, 0xb5, 0xf8, 0x15, 0x94, 0x73, 0xf9, 0x51, 0xe2, 0x87, 0x93, 0xfd, 0xbf, + 0xf4, 0xe5, 0x86, 0x77, 0xd7, 0xaf, 0x7b, 0x52, 0x98, 0x7f, 0x9e, 0x42, 0xf7, 0x4a, 0xf4, 0x95, 0x17, 0x5e, 0x5e, 0x9c, 0xad, 0xb6, 0x3d, 0x52, 0xe8, 0x66, 0xab, 0x51, 0xcc, 0xef, 0x94, 0x6c, + 0x43, 0x8d, 0x69, 0x4e, 0x5d, 0x6f, 0x91, 0xc6, 0x52, 0xd7, 0x84, 0x1d, 0xad, 0x04, 0xca, 0xc1, 0xe3, 0x3d, 0x1f, 0x2d, 0x96, 0x5b, 0xc3, 0xc9, 0x17, 0x96, 0xc6, 0xe5, 0x85, 0x08, 0xec, 0x84, + 0xa9, 0x9c, 0xce, 0xf3, 0x0c, 0x13, 0xdc, 0x83, 0xeb, 0x1e, 0x1c, 0xdc, 0x1e, 0x1c, 0x8b, 0x05, 0x59, 0x7a, 0xea, 0x40, 0xdc, 0x35, 0xc1, 0x74, 0x6f, 0x38, 0xec, 0x81, 0xfb, 0xbe, 0x51, 0x61, + 0x74, 0x5f, 0xbe, 0x3e, 0x75, 0x08, 0x3d, 0x8b, 0xd5, 0xbc, 0xdf, 0x91, 0x53, 0x76, 0xbc, 0x32, 0xb3, 0xeb, 0x71, 0x15, 0xd5, 0xe9, 0xd8, 0x1c, 0xd9, 0xd1, 0x7c, 0x86, 0xfa, 0xd6, 0x54, 0x0e, + 0xc9, 0x9f, 0x46, 0xa1, 0xc5, 0x5a, 0x51, 0x66, 0x5a, 0x38, 0x34, 0x92, 0x28, 0xd5, 0xee, 0x36, 0x5e, 0x80, 0x9e, 0xea, 0xbb, 0xf1, 0x89, 0x36, 0x30, 0xfc, 0x7c, 0xe7, 0x7c, 0x40, 0x7d, 0xf8, + 0xb2, 0x52, 0x86, 0x03, 0x44, 0x61, 0xee, 0x98, 0xb6, 0x8e, 0x33, 0x31, 0x4f, 0x2b, 0xbd, 0xda, 0x1c, 0x58, 0x48, 0x4f, 0x45, 0xe3, 0xa7, 0x2f, 0x9b, 0x98, 0xd6, 0x30, 0xc9, 0x87, 0x65, 0xe1, + 0x7d, 0xd3, 0xcc, 0x0f, 0x79, 0x62, 0xea, 0xde, 0x50, 0x3e, 0xbd, 0xe8, 0xc7, 0xf1, 0xd9, 0xca, 0xd2, 0x63, 0x12, 0xeb, 0xec, 0x82, 0x0d, 0x83, 0x81, 0x3b, 0x1e, 0x10, 0xc0, 0x78, 0x1b, 0x97, + 0x48, 0xbe, 0x5e, 0x15, 0x33, 0x7c, 0x44, 0x78, 0xf5, 0x68, 0x0b, 0x2c, 0x82, 0x7c, 0xea, 0x2e, 0x57, 0xd6, 0xa8, 0xa4, 0xf9, 0x39, 0x28, 0xb8, 0x1d, 0x3b, 0x27, 0x5c, 0x6e, 0x85, 0xdb, 0xba, + 0xd1, 0x96, 0x10, 0xa9, 0x0b, 0xa5, 0xe6, 0x87, 0xca, 0x3e, 0x96, 0x42, 0x1f, 0x64, 0xdd, 0x69, 0x02, 0x1f, 0x89, 0x00, 0xb4, 0xf4, 0xef, 0x3d, 0x8e, 0xa7, 0x41, 0x74, 0x37, 0xba, 0x09, 0x7e, + 0x2a, 0x13, 0xf6, 0x4a, 0xf3, 0x8a, 0x42, 0x94, 0xc4, 0xe7, 0x39, 0xdd, 0xe3, 0xfd, 0x71, 0xc0, 0x3f, 0x16, 0x6a, 0xb5, 0x30, 0x03, 0x70, 0x04, 0xa7, 0x72, 0x3c, 0x85, 0xc7, 0x2c, 0x03, 0x8d, + 0x96, 0xeb, 0xd1, 0x7c, 0xad, 0x8e, 0x97, 0x82, 0x2a, 0xb7, 0x40, 0xbb, 0x85, 0x4a, 0x8b, 0xc3, 0xb5, 0x44, 0x1e, 0xb0, 0x0d, 0xa1, 0x41, 0xa1, 0xac, 0x4a, 0xc5, 0xa1, 0xab, 0x68, 0x17, 0xb4, + 0x45, 0xb4, 0xa3, 0x51, 0x68, 0x3a, 0xdd, 0x87, 0x81, 0x9c, 0x30, 0xfe, 0x06, 0xdf, 0x87, 0x49, 0xf7, 0x48, 0x9e, 0xba, 0x5a, 0xce, 0x5e, 0xea, 0xcd, 0x48, 0x46, 0xe6, 0xa5, 0x45, 0x7f, 0x79, + 0x6b, 0xb8, 0x49, 0xe0, 0x99, 0xda, 0xc5, 0x8e, 0x8b, 0x9c, 0xdd, 0xf2, 0xff, 0xf5, 0xfd, 0x53, 0xd3, 0xd2, 0x4b, 0xe7, 0xed, 0x23, 0xfc, 0xe3, 0x47, 0x5f, 0x35, 0xe8, 0xf8, 0xa2, 0xcd, 0xf2, + 0xc7, 0x1d, 0xef, 0x72, 0x62, 0xbd, 0xe9, 0xf6, 0x9c, 0xe6, 0x45, 0x66, 0x59, 0xbf, 0x32, 0x2b, 0x6a, 0x3f, 0x88, 0xfa, 0x0f, 0x5f, 0xf8, 0x60, 0x65, 0xc6, 0x7e, 0x11, 0xb7, 0xb4, 0xf3, 0x32, + 0x4d, 0x93, 0xac, 0xc8, 0x87, 0x46, 0x12, 0x26, 0xaf, 0xdf, 0xc1, 0x6e, 0xa3, 0x13, 0x8a, 0xa4, 0x7c, 0x7b, 0xf6, 0xa7, 0x08, 0x95, 0x32, 0x36, 0x2d, 0x3b, 0xd7, 0xec, 0x4b, 0x5c, 0x03, 0xfc, + 0xb9, 0x94, 0x75, 0x99, 0x9e, 0x6b, 0xe4, 0xc5, 0x49, 0xe1, 0xd9, 0xde, 0xf5, 0x27, 0xa0, 0x37, 0x2d, 0x81, 0xde, 0xe0, 0xfd, 0xed, 0x60, 0xf1, 0x3e, 0x23, 0xcf, 0xb6, 0xd3, 0xeb, 0xf0, 0x99, + 0x33, 0x06, 0x79, 0xeb, 0x23, 0x7a, 0xfb, 0xb7, 0x6f, 0x43, 0x25, 0x92, 0xd4, 0x8a, 0x8d, 0x24, 0x0c, 0x2d, 0xa3, 0xf0, 0x2a, 0xeb, 0xe6, 0xa5, 0x6e, 0x8f, 0x93, 0xb7, 0x5f, 0x3c, 0x1f, 0x2b, + 0x5f, 0x7f, 0xfa, 0xeb, 0x13, 0x1f, 0x2e, 0xbb, 0x5b, 0x03, 0xc0, 0xeb, 0x8c, 0xf9, 0x5a, 0xbb, 0x81, 0x9f, 0xb0, 0xfa, 0x9e, 0x29, 0x02, 0xc3, 0xcb, 0xdf, 0xe1, 0x99, 0xc6, 0xe3, 0x55, 0x18, + 0x59, 0xe1, 0xc0, 0xb7, 0x89, 0x38, 0x2b, 0xe8, 0x10, 0x13, 0x63, 0x68, 0xdd, 0xa0, 0x78, 0x37, 0xde, 0x1c, 0x96, 0xd3, 0x94, 0xd2, 0xab, 0xce, 0xea, 0x72, 0x8b, 0x48, 0x09, 0xee, 0xc8, 0xf2, + 0x91, 0x99, 0xb0, 0x01, 0x29, 0x2a, 0x22, 0x26, 0xb5, 0x92, 0xd6, 0xd0, 0x91, 0x52, 0xe1, 0x5b, 0x15, 0x5c, 0xb4, 0xf4, 0x72, 0x0c, 0xb9, 0xf9, 0x84, 0x35, 0xf1, 0x29, 0xeb, 0x3a, 0xec, 0xb6, + 0xf8, 0xad, 0x73, 0xe5, 0x87, 0xd6, 0x47, 0xd3, 0xd3, 0x8f, 0x7b, 0xef, 0x68, 0xf4, 0x3f, 0xfe, 0xfb, 0xe9, 0x77, 0x82, 0x2f, 0xff, 0xed, 0xf4, 0x87, 0x78, 0xf9, 0xd7, 0x7f, 0x7d, 0xf9, 0x1f, + 0xff, 0x1d, 0x7d, 0xf9, 0x6f, 0xe8, 0x2f, 0xe4, 0x17, 0xf4, 0xe2, 0x6a, 0x95, 0xf5, 0xa2, 0xbd, 0x84, 0x49, 0x3d, 0xcc, 0xad, 0xca, 0x3a, 0xfd, 0xf2, 0x97, 0x8d, 0x35, 0x4d, 0xf2, 0x97, 0xcc, + 0x72, 0x32, 0x2b, 0x3f, 0x91, 0x78, 0xa9, 0x5d, 0x2b, 0x7e, 0x29, 0x73, 0xcb, 0x7c, 0xf1, 0xe2, 0x17, 0xed, 0x85, 0x4f, 0x4c, 0xeb, 0x97, 0x9f, 0xbf, 0x58, 0x71, 0xe5, 0x65, 0x49, 0x1c, 0x59, + 0x71, 0xf1, 0xeb, 0x85, 0x2d, 0x5e, 0xbc, 0xd3, 0x3f, 0x19, 0x49, 0x14, 0x9d, 0x96, 0xb7, 0xf9, 0xd2, 0x26, 0xe5, 0x5b, 0xfb, 0xa5, 0x22, 0x79, 0xb9, 0x3c, 0x3d, 0xc9, 0x5e, 0xce, 0x0f, 0xfe, + 0xf5, 0xf2, 0x9f, 0xbe, 0x30, 0x23, 0x54, 0xde, 0xe9, 0x79, 0x91, 0x65, 0x7a, 0xda, 0x15, 0x6a, 0x2f, 0xcf, 0x4b, 0x2b, 0x07, 0x88, 0x11, 0xf1, 0x9f, 0x9f, 0x54, 0xe2, 0xa2, 0xfc, 0xba, 0xa4, + 0xa0, 0x5e, 0xde, 0xe3, 0x2f, 0x27, 0xd2, 0x83, 0x36, 0xbf, 0xcf, 0xc5, 0xcd, 0x7f, 0xd5, 0xe6, 0xb7, 0x57, 0xc4, 0x7c, 0x61, 0x6e, 0x76, 0xc8, 0x64, 0xae, 0x66, 0xde, 0x62, 0x1f, 0xd9, 0xfc, + 0xdc, 0x0e, 0x13, 0x86, 0x24, 0x42, 0xb9, 0xac, 0xc0, 0x7f, 0xf3, 0x43, 0xc3, 0x97, 0xf0, 0x7c, 0xa3, 0xb8, 0x3d, 0x65, 0x30, 0x7e, 0x53, 0xdc, 0x1e, 0x9a, 0x89, 0xcf, 0xae, 0x94, 0x79, 0x20, + 0x36, 0x03, 0xd9, 0x5f, 0x15, 0xd1, 0x18, 0x5f, 0x1d, 0x60, 0x22, 0x19, 0xa3, 0x33, 0x6a, 0x46, 0x73, 0xb3, 0x89, 0xaa, 0xa2, 0x12, 0x7a, 0x38, 0x5a, 0x73, 0xe1, 0x30, 0xa9, 0x70, 0xb2, 0xd8, + 0x0e, 0x7c, 0x1d, 0xa9, 0x02, 0x60, 0xd3, 0x6a, 0xcb, 0xbd, 0x08, 0x8a, 0xdb, 0x65, 0xbb, 0x2f, 0x22, 0x4e, 0x5a, 0x81, 0xfa, 0x40, 0x33, 0x77, 0x5b, 0xba, 0xd2, 0x73, 0x48, 0xa4, 0x35, 0x06, + 0xfe, 0xb1, 0x2b, 0xe5, 0x4b, 0x60, 0xbe, 0xf5, 0xe2, 0xdd, 0x6e, 0x21, 0x7d, 0xc1, 0xf9, 0xec, 0xc5, 0x3b, 0x53, 0xe9, 0x01, 0x92, 0x56, 0x6a, 0x53, 0x1b, 0x10, 0x55, 0x53, 0x76, 0x32, 0x6e, + 0xcb, 0x2b, 0xcc, 0xa6, 0x48, 0x0f, 0x1a, 0xe4, 0x6d, 0xbc, 0xa5, 0xa1, 0x59, 0xba, 0xb7, 0x5c, 0x43, 0xd4, 0xc2, 0x4c, 0xd7, 0xe1, 0x9e, 0x81, 0xc3, 0x49, 0x65, 0x35, 0x6b, 0xf3, 0x80, 0x61, + 0x79, 0x2c, 0xce, 0xda, 0x25, 0xb1, 0xee, 0xd2, 0xd2, 0x3c, 0xea, 0x13, 0x16, 0x3c, 0x1e, 0x66, 0xb6, 0xa0, 0xe5, 0x8c, 0xd9, 0xf2, 0xd3, 0xf9, 0xa3, 0x43, 0x6a, 0x2f, 0x2f, 0xde, 0xb3, 0x93, + 0xee, 0xb7, 0x0d, 0xf7, 0x6b, 0x8c, 0x9f, 0x09, 0x62, 0xba, 0x25, 0x7d, 0xc2, 0xfa, 0xe6, 0xc6, 0x10, 0x7b, 0x1c, 0xc0, 0x74, 0xc2, 0x7c, 0xed, 0xcb, 0x7e, 0x6d, 0x1e, 0xd8, 0x02, 0x05, 0xc9, + 0x15, 0xeb, 0x8d, 0x8f, 0x93, 0x03, 0x9a, 0xec, 0x96, 0xb9, 0xb3, 0x83, 0xe9, 0xe3, 0x78, 0xde, 0xe5, 0xb0, 0x98, 0x06, 0x11, 0xaa, 0xad, 0x15, 0xdd, 0x8f, 0x06, 0x2a, 0xbd, 0xa7, 0x8d, 0x3d, + 0x2a, 0xd9, 0x33, 0x7e, 0x9b, 0xa1, 0xe5, 0x8a, 0x57, 0x23, 0x0d, 0xb4, 0x5a, 0xd4, 0xc6, 0x42, 0x87, 0xcb, 0x02, 0x0a, 0xd4, 0x0e, 0xe0, 0x7a, 0x95, 0x3c, 0xf2, 0x9c, 0x7e, 0x9f, 0x35, 0x7f, + 0x15, 0x62, 0x17, 0xe5, 0xe7, 0xe7, 0x36, 0x9b, 0x7e, 0x12, 0x22, 0xfd, 0xb6, 0x3f, 0xda, 0xcf, 0xd9, 0x71, 0xa2, 0x78, 0xd6, 0x7d, 0xd3, 0xa2, 0x57, 0xd5, 0x50, 0x68, 0xa8, 0x9b, 0xa0, 0x5b, + 0x49, 0x49, 0xb3, 0x3e, 0x94, 0x92, 0x11, 0x23, 0xb2, 0x6b, 0x7b, 0x11, 0x89, 0x28, 0x2c, 0x3e, 0x78, 0xe0, 0x3b, 0xfa, 0x26, 0xb6, 0x58, 0xd7, 0xb3, 0xf3, 0xf7, 0xff, 0xfa, 0xa2, 0xd2, 0xc0, + 0x17, 0x3a, 0xd7, 0x19, 0x84, 0xab, 0xc2, 0x95, 0x16, 0x3f, 0xd7, 0xb6, 0xfa, 0xd8, 0x0c, 0xe2, 0x24, 0x8b, 0xb4, 0xd0, 0xeb, 0xbe, 0xf5, 0xe0, 0x3e, 0xb7, 0x39, 0xdd, 0x92, 0x3e, 0xa3, 0xff, + 0xf1, 0x46, 0x9f, 0x8d, 0xea, 0x7c, 0x00, 0xb1, 0xd4, 0x1c, 0xe3, 0x72, 0x64, 0x5f, 0x4c, 0xbc, 0x9c, 0xd9, 0xa7, 0x23, 0x09, 0x9e, 0xef, 0x5a, 0xd2, 0x3c, 0x06, 0xe9, 0xdc, 0x43, 0x29, 0x59, + 0xea, 0x90, 0xb9, 0x76, 0xf4, 0x68, 0xdc, 0xea, 0x4a, 0x1d, 0xc4, 0x20, 0x98, 0x96, 0xba, 0xe2, 0xb0, 0xab, 0x77, 0x14, 0x3e, 0xc1, 0xd9, 0xa5, 0xbe, 0x0e, 0x14, 0x58, 0x8c, 0x75, 0x20, 0x9a, + 0xa2, 0x7b, 0x25, 0xf1, 0x27, 0x9b, 0xda, 0xa8, 0xb9, 0x47, 0x07, 0x90, 0x3f, 0x15, 0xe9, 0xf4, 0xfe, 0xca, 0x17, 0x4d, 0xf5, 0x2b, 0x74, 0xd1, 0x5f, 0xd8, 0x13, 0x42, 0xfc, 0x86, 0xf2, 0x0d, + 0xb8, 0x65, 0x16, 0x9e, 0xe3, 0x23, 0x7b, 0x88, 0xf4, 0xd1, 0x4e, 0x9d, 0xcc, 0x36, 0xcc, 0xda, 0xe4, 0x33, 0x7b, 0x9b, 0xce, 0x1d, 0x72, 0x00, 0xb1, 0x3c, 0xeb, 0x8c, 0x10, 0x0a, 0xef, 0x68, + 0x50, 0x3b, 0xac, 0xe4, 0x59, 0x50, 0x43, 0xfb, 0x59, 0x5d, 0x09, 0xa8, 0x14, 0xaa, 0x6d, 0xbd, 0xc3, 0x35, 0xce, 0xc1, 0x04, 0x1b, 0x1c, 0xa7, 0x80, 0xe8, 0x18, 0xba, 0x54, 0xa3, 0x1c, 0xdf, + 0x54, 0xab, 0xfd, 0x61, 0x65, 0x95, 0x4e, 0xbd, 0x9a, 0x1c, 0xc0, 0xf1, 0xdf, 0xc4, 0xb6, 0x8f, 0x8f, 0xf9, 0x5a, 0x33, 0x4e, 0xcb, 0x73, 0xcf, 0xb9, 0x77, 0x4e, 0x46, 0x9f, 0xaa, 0x62, 0x7d, + 0x43, 0x19, 0x18, 0xde, 0x8e, 0xcf, 0x6d, 0x83, 0x1f, 0xe6, 0x8d, 0xb1, 0xeb, 0xa8, 0x68, 0x30, 0x55, 0x71, 0x49, 0x60, 0x7c, 0xe0, 0xaa, 0xdd, 0x3a, 0xcf, 0xd8, 0x8a, 0xc8, 0xe1, 0xc9, 0x7c, + 0xd5, 0xdf, 0xaf, 0xd0, 0x7b, 0x86, 0x5d, 0x7f, 0xa0, 0x17, 0xe7, 0xe9, 0x77, 0x65, 0xfb, 0x9e, 0x49, 0xe9, 0xb8, 0x25, 0xfd, 0x0e, 0xc6, 0xf5, 0xc6, 0x10, 0xea, 0x97, 0xce, 0xa1, 0x11, 0x29, + 0xcd, 0x98, 0x2e, 0xd4, 0x2c, 0xd9, 0xb1, 0xb3, 0x6d, 0xa5, 0xdd, 0xdc, 0xe1, 0x56, 0x0d, 0xd0, 0xd4, 0x53, 0x35, 0x0f, 0x78, 0x68, 0x67, 0xe2, 0x96, 0xa3, 0x28, 0x3c, 0x42, 0x9b, 0x9b, 0x3d, + 0xaa, 0xae, 0x44, 0x9e, 0x9e, 0xee, 0xb6, 0xb3, 0x81, 0x5b, 0xb7, 0x30, 0xb7, 0x9b, 0x0c, 0xa8, 0x70, 0x20, 0xb5, 0xdc, 0x61, 0xcc, 0xc7, 0x75, 0x07, 0xf8, 0xad, 0x0b, 0x1c, 0xcb, 0x62, 0xb9, + 0x7b, 0xb4, 0x87, 0x3d, 0xeb, 0x7c, 0xec, 0x5d, 0x9b, 0xe0, 0x15, 0x8b, 0xef, 0x02, 0x1d, 0x7e, 0xee, 0x19, 0x7e, 0xa3, 0xfa, 0x01, 0xed, 0x4b, 0xb0, 0x43, 0x0f, 0xcf, 0x70, 0x61, 0xb5, 0x47, + 0xae, 0x9a, 0xed, 0x3b, 0x2e, 0x38, 0x62, 0xd4, 0x28, 0xf0, 0xc8, 0x99, 0xbc, 0x1f, 0x8f, 0x40, 0x78, 0x47, 0x6f, 0xe0, 0x63, 0xd0, 0x44, 0xe6, 0x18, 0x8d, 0x39, 0x7b, 0x50, 0xfb, 0x02, 0x37, + 0xde, 0x3b, 0x4d, 0x37, 0xd9, 0xab, 0xfc, 0xa4, 0x49, 0xa7, 0xc7, 0xd1, 0xaa, 0xa2, 0xc9, 0x55, 0xe4, 0xee, 0xf9, 0x6c, 0xc0, 0x92, 0x35, 0x42, 0xf1, 0xe8, 0x48, 0x6e, 0x10, 0x5c, 0xc1, 0x0f, + 0x8f, 0x9c, 0x90, 0xf7, 0xb7, 0x3b, 0xd3, 0xb2, 0xbd, 0xd8, 0x1a, 0xa6, 0x59, 0x92, 0x5a, 0x59, 0xe1, 0x5d, 0x9d, 0xfc, 0xb7, 0xb8, 0xdc, 0xab, 0xb1, 0x02, 0x0e, 0x63, 0xab, 0x29, 0xfe, 0xfd, + 0x54, 0xe4, 0xb9, 0xf2, 0xea, 0xdb, 0x68, 0xe1, 0xbf, 0x21, 0x8e, 0xae, 0xa1, 0xc2, 0x1f, 0x46, 0xe7, 0x39, 0xd1, 0x43, 0xc2, 0xf3, 0xe5, 0x98, 0x96, 0x76, 0xc2, 0x6e, 0x95, 0x85, 0xec, 0x41, + 0xb0, 0x99, 0x65, 0x37, 0xc5, 0xf5, 0x54, 0x2c, 0x91, 0x42, 0x29, 0x90, 0xa6, 0xf2, 0x79, 0x73, 0xc3, 0xae, 0x07, 0x33, 0x6b, 0x0b, 0x86, 0xbc, 0x8e, 0x2e, 0xc9, 0xfd, 0x86, 0x00, 0x27, 0xda, + 0xb4, 0x71, 0x4b, 0xde, 0x29, 0x25, 0xf8, 0x30, 0x1f, 0xcc, 0xfd, 0xa0, 0x5d, 0xd5, 0x42, 0x97, 0xf3, 0x98, 0x1a, 0x14, 0x6c, 0x64, 0xbb, 0xff, 0x16, 0xad, 0xa7, 0x2e, 0xaf, 0xf6, 0xeb, 0xa1, + 0x44, 0xff, 0xf9, 0x51, 0xf0, 0x86, 0xf2, 0x1b, 0x88, 0xbf, 0x3e, 0x48, 0xf4, 0x1e, 0x07, 0x44, 0xaf, 0xd9, 0xc2, 0x1c, 0xb6, 0x65, 0x0e, 0xf9, 0x38, 0x6d, 0xbd, 0x9d, 0xa8, 0x2c, 0xa3, 0xfd, + 0x00, 0xa6, 0x99, 0xf4, 0x70, 0xb0, 0x30, 0xd6, 0x43, 0x56, 0x03, 0x1b, 0xb5, 0x06, 0xda, 0x62, 0x36, 0x66, 0xb4, 0x04, 0xd3, 0xa2, 0xd9, 0x66, 0x8f, 0x2f, 0x40, 0x41, 0xc0, 0x0d, 0x80, 0xdb, + 0x91, 0x94, 0x85, 0x12, 0x65, 0x31, 0x69, 0xe0, 0x39, 0x47, 0x8e, 0xdc, 0x66, 0x4e, 0xe1, 0x07, 0x29, 0x5a, 0x96, 0x4f, 0xd7, 0x62, 0xb9, 0x31, 0xfb, 0xf5, 0x5c, 0x66, 0x5f, 0x17, 0xbc, 0xfa, + 0xf0, 0x85, 0xdb, 0x29, 0x7c, 0xa1, 0xf0, 0xef, 0x67, 0xfd, 0xc5, 0xc3, 0xd8, 0x2a, 0x86, 0xa1, 0x97, 0x17, 0xd6, 0xbd, 0xe9, 0xf3, 0x5c, 0xe8, 0xd9, 0x0d, 0xe5, 0xd3, 0xf4, 0xf9, 0x38, 0xee, + 0x13, 0x86, 0x76, 0x76, 0x4a, 0x42, 0xcc, 0x46, 0x69, 0xc9, 0x1c, 0xd8, 0x84, 0x06, 0x55, 0x4d, 0x77, 0xf5, 0xf2, 0x20, 0x45, 0x81, 0x30, 0x5d, 0x99, 0x0d, 0xba, 0x94, 0x4a, 0xb6, 0x0a, 0x93, + 0x49, 0xbc, 0x56, 0x16, 0x30, 0x67, 0x52, 0xd4, 0x04, 0xd2, 0x72, 0x05, 0x65, 0x0a, 0xdb, 0x3d, 0xd4, 0x16, 0xb2, 0xdb, 0x07, 0x31, 0xa7, 0x05, 0xe3, 0xad, 0x3a, 0x8d, 0xf5, 0xce, 0x2d, 0x60, + 0xd6, 0xaf, 0x91, 0x15, 0x44, 0x1f, 0x67, 0x3f, 0x09, 0x53, 0x18, 0xfd, 0x42, 0x7f, 0x81, 0x2f, 0xff, 0xfa, 0xaf, 0x2f, 0xff, 0x42, 0xfe, 0x1a, 0xf5, 0x5b, 0x90, 0x97, 0x16, 0xa5, 0x5f, 0x03, + 0xf9, 0x8c, 0xe3, 0xe9, 0x44, 0xf0, 0x8c, 0x9f, 0xd1, 0xd3, 0xc5, 0xb4, 0x9f, 0xe6, 0x5a, 0x8a, 0xec, 0xf7, 0xcc, 0x2e, 0xdf, 0x08, 0xf9, 0x6c, 0x14, 0xcf, 0x26, 0x38, 0x81, 0x21, 0x07, 0x6d, + 0xf4, 0x75, 0xfe, 0x7d, 0x8f, 0xa5, 0xf4, 0xb3, 0xee, 0xaa, 0x49, 0x5a, 0x78, 0x49, 0xac, 0x15, 0x77, 0x4d, 0x03, 0xe0, 0x53, 0xfd, 0x18, 0xdf, 0xc9, 0x9e, 0xe0, 0x78, 0x1b, 0x0c, 0xc1, 0x7e, + 0x1d, 0x19, 0x09, 0x74, 0x13, 0x2a, 0xd8, 0x6c, 0x12, 0xbb, 0x47, 0xd4, 0xdf, 0x34, 0xf2, 0x4e, 0x5c, 0x4e, 0xb5, 0x4d, 0x9d, 0xc9, 0xfc, 0x61, 0x75, 0xcc, 0xe7, 0xb9, 0xb7, 0xc7, 0xc7, 0x8b, + 0x1a, 0x3d, 0x2c, 0x49, 0x37, 0x2a, 0x22, 0x08, 0xac, 0x27, 0x60, 0x9b, 0xaa, 0x14, 0x57, 0x63, 0x2c, 0x9b, 0x92, 0x18, 0xaf, 0xae, 0xb2, 0x11, 0x34, 0x38, 0x9a, 0xd0, 0xa6, 0xaa, 0x68, 0xbe, + 0x76, 0x08, 0xdf, 0xdf, 0xcc, 0x1e, 0xa9, 0x53, 0xdf, 0xed, 0xf2, 0x56, 0x7a, 0xd1, 0x82, 0xfe, 0xfa, 0x17, 0xf0, 0xb3, 0xd0, 0x39, 0xa7, 0x66, 0x86, 0x56, 0x65, 0xc5, 0xb9, 0x5b, 0x58, 0xde, + 0xc5, 0xfd, 0x0d, 0xdf, 0xb4, 0xef, 0x7d, 0x79, 0xf9, 0xeb, 0x9a, 0x38, 0x7e, 0x49, 0xac, 0xbd, 0x0d, 0x00, 0xfc, 0x51, 0xfe, 0xf4, 0xef, 0x89, 0xb9, 0x75, 0x92, 0x99, 0xc3, 0x13, 0xd3, 0xdf, + 0xfe, 0xfd, 0xe7, 0x01, 0x84, 0xbd, 0xd3, 0xab, 0x93, 0xca, 0xca, 0xc2, 0x44, 0x33, 0x4f, 0xa2, 0xb8, 0xb0, 0xbe, 0x6f, 0x8e, 0x02, 0x3f, 0x33, 0x6f, 0x7e, 0xa7, 0x7f, 0x9a, 0x40, 0xbf, 0xdf, + 0x3d, 0xfb, 0xe7, 0x7b, 0xcc, 0x24, 0x8d, 0x15, 0x9c, 0x23, 0x71, 0x70, 0x42, 0x33, 0xa0, 0xb8, 0x91, 0x91, 0x62, 0x7e, 0x30, 0x06, 0x22, 0x9b, 0x1f, 0x97, 0x5e, 0x00, 0xf2, 0x6a, 0x25, 0x6b, + 0x54, 0x98, 0x2e, 0x5c, 0x69, 0x3b, 0xb0, 0xad, 0xf4, 0x88, 0xd4, 0xca, 0x38, 0x4a, 0xd6, 0x9b, 0x74, 0xe1, 0xdb, 0x73, 0x7c, 0xac, 0x60, 0x75, 0xbd, 0x4d, 0xe6, 0xc9, 0x4e, 0xcc, 0x71, 0x4b, + 0x14, 0x6b, 0xdb, 0x76, 0xa1, 0x23, 0x1a, 0x0f, 0x7a, 0xe6, 0xbc, 0x68, 0x65, 0x91, 0x18, 0x5a, 0x1c, 0x5f, 0x43, 0x22, 0xd0, 0xcf, 0x9c, 0xff, 0x98, 0x84, 0x76, 0xe1, 0x5c, 0x1f, 0x16, 0xa4, + 0x43, 0x43, 0x8b, 0x0d, 0xeb, 0xfb, 0x16, 0x6c, 0xcf, 0xa4, 0xb9, 0x7c, 0x24, 0x0c, 0x0c, 0x6f, 0x86, 0xe7, 0x3d, 0xa0, 0xc7, 0x31, 0x28, 0x27, 0x90, 0x43, 0x23, 0xa8, 0x68, 0x97, 0x16, 0x90, + 0x65, 0xaa, 0x8a, 0xda, 0x55, 0xee, 0x71, 0xa6, 0xe1, 0x65, 0xb5, 0x36, 0xa0, 0xaa, 0xde, 0x69, 0xe0, 0x12, 0xa4, 0xcc, 0x82, 0x55, 0x9d, 0xf5, 0x6a, 0xbc, 0xf0, 0x47, 0xac, 0x6e, 0xe9, 0xcc, + 0x60, 0x11, 0x38, 0x4b, 0xd5, 0x18, 0xb9, 0x03, 0x0a, 0xc4, 0xc4, 0x25, 0xc3, 0x09, 0xdb, 0x10, 0xd5, 0xfc, 0x39, 0x44, 0x45, 0x7c, 0x26, 0xab, 0x9f, 0x53, 0xa4, 0x7f, 0x7a, 0xd6, 0xee, 0x13, + 0x3d, 0xf5, 0xa9, 0x82, 0xc4, 0x57, 0x98, 0xe2, 0x4f, 0x99, 0x48, 0x3f, 0x12, 0x3e, 0x61, 0xfa, 0x61, 0x38, 0xc4, 0xfb, 0x99, 0x47, 0x03, 0x44, 0x37, 0x23, 0x38, 0x86, 0xb1, 0x22, 0x68, 0x1b, + 0xc3, 0x97, 0x96, 0x1d, 0x85, 0x35, 0x64, 0x60, 0xcb, 0x4d, 0xb8, 0x32, 0x9d, 0x5c, 0x17, 0x33, 0x70, 0x1e, 0xa8, 0x46, 0xcd, 0xe4, 0x5c, 0xaa, 0x6b, 0xb8, 0x41, 0xf9, 0xc7, 0x49, 0x01, 0x2d, + 0x43, 0x63, 0xe2, 0x2e, 0xe9, 0xaa, 0x61, 0x58, 0x63, 0x4b, 0x41, 0x33, 0x79, 0x55, 0xd6, 0x89, 0xe7, 0xab, 0x30, 0xde, 0x58, 0x0d, 0xb6, 0x7a, 0x64, 0x92, 0xfe, 0xa6, 0xb5, 0x48, 0x72, 0x39, + 0xc2, 0x8c, 0x6e, 0xc2, 0x4e, 0xcf, 0x88, 0x5c, 0xde, 0x7e, 0xa8, 0x95, 0x85, 0x7b, 0xa9, 0xd2, 0xf5, 0xd7, 0x7b, 0xb6, 0xd7, 0x57, 0x5f, 0xbc, 0x2a, 0x47, 0xff, 0x82, 0x7d, 0xfe, 0xc6, 0x4d, + 0x9a, 0x12, 0xfc, 0x84, 0x01, 0xb6, 0x8f, 0x7d, 0xe5, 0x86, 0x35, 0xfd, 0xdd, 0x11, 0xff, 0x5f, 0x52, 0xd1, 0x0f, 0x92, 0x8a, 0x52, 0x2d, 0xb8, 0xd7, 0x97, 0xe5, 0xac, 0x9b, 0xff, 0x7c, 0x83, + 0x38, 0x51, 0x3c, 0x2f, 0xa4, 0x20, 0xb9, 0x18, 0xb9, 0x7b, 0xec, 0x01, 0xa8, 0xcb, 0x51, 0xa4, 0xd8, 0xa2, 0x9d, 0x6a, 0x58, 0x58, 0x8e, 0xb6, 0xe6, 0xe8, 0xd0, 0x25, 0xe9, 0xb1, 0x96, 0x2b, + 0xa0, 0x9d, 0xf3, 0xae, 0x0c, 0x51, 0x21, 0xc9, 0x6f, 0xa3, 0xc9, 0x11, 0x22, 0x70, 0x84, 0xb1, 0x96, 0xf0, 0x80, 0xae, 0xe5, 0x6d, 0x35, 0x08, 0xad, 0xb9, 0xc5, 0x41, 0xc8, 0x34, 0x76, 0xe1, + 0xda, 0xd6, 0x8f, 0x49, 0x2d, 0x8b, 0x87, 0x09, 0x2b, 0x80, 0x1d, 0x5a, 0x68, 0xca, 0xf7, 0x31, 0x5a, 0xa9, 0x96, 0x59, 0x71, 0x31, 0xbc, 0x0c, 0xbf, 0x43, 0xe0, 0x09, 0x00, 0x3e, 0x50, 0x3e, + 0x23, 0xf1, 0x61, 0xdc, 0x37, 0x16, 0x73, 0xbe, 0x86, 0xe9, 0xfd, 0x26, 0x5d, 0xcb, 0x24, 0x90, 0x0c, 0xc6, 0x35, 0xa9, 0x1c, 0x0b, 0x5b, 0x55, 0x45, 0x9b, 0xdf, 0xec, 0x55, 0x25, 0xd0, 0x3d, + 0x93, 0x1e, 0x05, 0x58, 0x96, 0x86, 0x80, 0x3b, 0x41, 0xaa, 0x82, 0x61, 0x28, 0x7b, 0x1e, 0xc1, 0xac, 0xed, 0xe1, 0xc7, 0xbd, 0x3c, 0x30, 0x92, 0xe9, 0x3c, 0xc8, 0x76, 0x4b, 0x75, 0xdc, 0xd0, + 0x08, 0x97, 0x14, 0x58, 0x60, 0xe4, 0x9b, 0xd0, 0x1d, 0x3c, 0x6f, 0x45, 0x39, 0x9d, 0xfe, 0x72, 0xaf, 0xb8, 0x1e, 0xeb, 0x9e, 0xf3, 0xb9, 0xf4, 0x13, 0xf3, 0x85, 0x3b, 0xf4, 0xce, 0xb6, 0x98, + 0x24, 0x2c, 0xef, 0xe6, 0xb8, 0x3f, 0xcb, 0x98, 0x5b, 0xe2, 0x67, 0xde, 0xdc, 0xde, 0xea, 0xc3, 0x1e, 0x68, 0x38, 0x03, 0x4b, 0x49, 0x63, 0x78, 0x99, 0x17, 0x07, 0xa4, 0x95, 0x63, 0xd9, 0x68, + 0x9b, 0x6a, 0xb1, 0x5b, 0x18, 0x07, 0xe8, 0xeb, 0x94, 0xfe, 0xbe, 0x08, 0xf5, 0x36, 0xb7, 0x9e, 0x7f, 0x76, 0x60, 0xb5, 0x77, 0xe0, 0x41, 0x9e, 0xb2, 0xf2, 0xbc, 0x12, 0x7d, 0x85, 0x25, 0xb0, + 0xda, 0x73, 0x12, 0x6d, 0x8f, 0xd9, 0x9a, 0xf8, 0x91, 0xc5, 0x83, 0x47, 0x73, 0xd0, 0x82, 0x7e, 0xde, 0xd1, 0x45, 0xa2, 0xa0, 0x64, 0x06, 0x8a, 0xd6, 0x11, 0x33, 0xeb, 0x15, 0x1d, 0xb0, 0xe1, + 0x44, 0x28, 0xf1, 0x35, 0x66, 0xa3, 0x50, 0x68, 0x07, 0x79, 0x7d, 0x28, 0x97, 0x85, 0x92, 0xb9, 0x4e, 0xb2, 0x4d, 0xb9, 0xb8, 0x65, 0x0d, 0x26, 0x82, 0xd1, 0x9d, 0x7b, 0x6c, 0x06, 0xd8, 0xf6, + 0x18, 0xc1, 0x6c, 0x2c, 0xd5, 0x9c, 0x4b, 0xe3, 0x8f, 0x76, 0xc0, 0x3f, 0xb2, 0xc3, 0x14, 0xee, 0xf0, 0xb5, 0xb2, 0xe1, 0xbd, 0x89, 0xf6, 0xf3, 0xe0, 0x9a, 0x77, 0xb2, 0xaf, 0x58, 0x9e, 0x07, + 0xe7, 0xc9, 0xd5, 0x23, 0xcc, 0x66, 0x2e, 0x45, 0xc2, 0x16, 0xa6, 0x75, 0x26, 0x63, 0x79, 0xca, 0x1e, 0x49, 0x1b, 0x62, 0x32, 0xa5, 0xb9, 0x3a, 0x5c, 0x90, 0x63, 0x9a, 0x0f, 0x90, 0x75, 0x4c, + 0x08, 0x5e, 0xb0, 0x44, 0xe3, 0x99, 0x32, 0x2e, 0x11, 0xa1, 0xb0, 0xe0, 0xc1, 0x42, 0xe1, 0xe5, 0x2a, 0x48, 0xc7, 0xf4, 0x3a, 0x42, 0x80, 0x2d, 0xc7, 0xd3, 0x8b, 0xd9, 0x14, 0x68, 0xd4, 0x85, + 0xdf, 0xb5, 0x8d, 0x83, 0x2c, 0xa9, 0xbd, 0xd0, 0xfd, 0x38, 0x0e, 0xe0, 0xfc, 0xbb, 0xaf, 0xb1, 0x4f, 0x5f, 0xdb, 0xc1, 0x9e, 0x71, 0xc7, 0xbd, 0x51, 0x7d, 0x45, 0xe6, 0x7c, 0x78, 0xea, 0x59, + 0x2a, 0xd4, 0x99, 0x2e, 0x75, 0x52, 0x53, 0x57, 0x53, 0x6b, 0x0a, 0x14, 0xea, 0x3e, 0x1f, 0x89, 0xf8, 0xe0, 0x08, 0x2e, 0x46, 0xab, 0x3a, 0x30, 0x43, 0xbc, 0x59, 0xc9, 0xe4, 0xd6, 0x8f, 0xe7, + 0x22, 0x72, 0x5c, 0xc8, 0x0b, 0x10, 0xd7, 0xcd, 0x95, 0x13, 0xe8, 0x54, 0xc8, 0xed, 0x48, 0xd6, 0xb4, 0x85, 0x9c, 0xcd, 0x67, 0x1d, 0x4c, 0xed, 0xa1, 0x8c, 0x97, 0xb7, 0xc8, 0xa1, 0xe4, 0xe9, + 0x90, 0xec, 0xc4, 0x71, 0xf5, 0x68, 0xb3, 0xfd, 0x13, 0xd3, 0xac, 0x47, 0xfe, 0xd6, 0xcf, 0x6d, 0x42, 0xf7, 0xf3, 0xb7, 0x7a, 0xd8, 0x82, 0x8e, 0xe0, 0x0a, 0x18, 0x59, 0x2a, 0xd3, 0x45, 0x19, + 0x38, 0x2e, 0xc3, 0x43, 0x2b, 0xd6, 0xbc, 0xad, 0xfa, 0x45, 0xad, 0x02, 0x1b, 0x4a, 0x0d, 0x75, 0x1e, 0x59, 0x22, 0x13, 0x3a, 0x93, 0xb3, 0x00, 0x03, 0xb7, 0xf0, 0x58, 0x52, 0x58, 0x82, 0x6a, + 0x2d, 0x90, 0xae, 0xac, 0x60, 0xa6, 0x20, 0xac, 0x08, 0xf1, 0x05, 0x3c, 0x65, 0x4a, 0x30, 0xb3, 0x06, 0x32, 0xac, 0x32, 0x6c, 0xba, 0x0a, 0xca, 0xfd, 0xa3, 0xfd, 0xe5, 0x11, 0x94, 0xff, 0x64, + 0xfe, 0x56, 0xea, 0xc5, 0xf7, 0x14, 0x21, 0xfc, 0x17, 0x84, 0x3c, 0xe1, 0x45, 0x39, 0x51, 0x3c, 0xb3, 0x26, 0x4e, 0x86, 0x17, 0x12, 0x8f, 0xd9, 0x52, 0x2c, 0x5a, 0xfc, 0x28, 0x3b, 0x81, 0x3b, + 0x5a, 0xd5, 0xbc, 0x73, 0x3c, 0x40, 0x40, 0xa2, 0x78, 0x88, 0xe5, 0xda, 0x21, 0xac, 0x8c, 0x18, 0xb0, 0x64, 0x5a, 0x9a, 0x5e, 0xe5, 0x94, 0x45, 0xa0, 0x4b, 0x2f, 0xa6, 0x25, 0xd6, 0x37, 0x57, + 0xd9, 0x6a, 0x3d, 0xdd, 0xa7, 0x86, 0x2a, 0xa6, 0xa2, 0x67, 0x38, 0x88, 0x2c, 0x23, 0x98, 0x09, 0xcc, 0xb9, 0xb5, 0x1a, 0x25, 0xe8, 0xda, 0xd9, 0xc1, 0x87, 0xa0, 0x67, 0x73, 0x89, 0xb3, 0x99, + 0x24, 0xb3, 0xcc, 0x57, 0x17, 0x08, 0xf2, 0x59, 0xe9, 0x3f, 0x7f, 0x21, 0xd7, 0xec, 0x0f, 0x35, 0x2d, 0xff, 0x7a, 0x35, 0xa5, 0x90, 0x9f, 0xbf, 0xf8, 0xb0, 0x12, 0x99, 0x1d, 0x6a, 0x45, 0x5e, + 0x5c, 0xce, 0x10, 0xe7, 0x5d, 0xf7, 0x26, 0x46, 0xf6, 0x8c, 0x5a, 0x5e, 0x98, 0xc3, 0xdc, 0xca, 0xbc, 0xb3, 0x47, 0x39, 0x7b, 0xd5, 0x3d, 0x3e, 0x05, 0x9c, 0x1e, 0x4b, 0xcf, 0x08, 0x86, 0x76, + 0x92, 0x45, 0x5a, 0x31, 0x2c, 0x63, 0x2b, 0x37, 0xb4, 0xf4, 0xc2, 0x9b, 0xf3, 0xc1, 0xe6, 0xc6, 0x12, 0x94, 0x27, 0xb1, 0x67, 0x0c, 0xf5, 0x24, 0x89, 0xde, 0x1e, 0xfb, 0x45, 0xc1, 0xac, 0xdf, + 0xd4, 0xeb, 0xeb, 0xdc, 0xe8, 0xdf, 0x76, 0xfa, 0xce, 0xaf, 0xff, 0x7a, 0xaf, 0x7e, 0xa6, 0x8e, 0xcd, 0x57, 0x0f, 0x78, 0x9d, 0x6b, 0x9f, 0x6e, 0x9f, 0x83, 0x3b, 0x7b, 0x08, 0x57, 0xfa, 0x78, + 0x40, 0xd3, 0x7a, 0x2a, 0x66, 0x05, 0xb2, 0x2a, 0x85, 0xf1, 0x78, 0x47, 0xad, 0x76, 0xe0, 0x36, 0xc0, 0x82, 0x0d, 0xa0, 0x18, 0x93, 0x15, 0x66, 0xf3, 0x22, 0xdd, 0x39, 0x13, 0x01, 0xee, 0x16, + 0x18, 0x63, 0x1f, 0xc0, 0x4a, 0xf7, 0x98, 0x11, 0xa3, 0x2f, 0x9c, 0x30, 0x6e, 0xad, 0x75, 0xce, 0x8f, 0xf0, 0x65, 0x17, 0x6b, 0x16, 0xbe, 0xda, 0x4f, 0x51, 0x22, 0x55, 0x29, 0x4c, 0xab, 0xb6, + 0xd9, 0xf7, 0x21, 0xe6, 0x37, 0x86, 0xb5, 0x3f, 0x67, 0xa2, 0x7a, 0x27, 0x7b, 0x82, 0xe4, 0x6d, 0xd0, 0xd7, 0x20, 0x55, 0x05, 0xc6, 0x54, 0xcc, 0x36, 0x6a, 0x02, 0xad, 0x55, 0x4e, 0x8f, 0xb1, + 0x0d, 0x37, 0x17, 0x53, 0x07, 0xd8, 0x47, 0xec, 0x1a, 0xc7, 0x8e, 0xc9, 0x7e, 0xef, 0x1a, 0xf3, 0xa5, 0x0d, 0xe8, 0x98, 0x95, 0x86, 0x41, 0xa0, 0x65, 0x07, 0x30, 0x1a, 0x75, 0x64, 0x9a, 0x4e, + 0xb4, 0x02, 0x8d, 0x42, 0xe1, 0xb8, 0xcb, 0xf7, 0x69, 0xcb, 0x97, 0x8a, 0x23, 0x20, 0xf2, 0xa6, 0xcd, 0x14, 0x46, 0xea, 0x0e, 0x0f, 0x3b, 0x85, 0xfe, 0x29, 0xf3, 0x5f, 0x9a, 0x9d, 0xd7, 0xf7, + 0xf0, 0x04, 0xcf, 0xdd, 0xdd, 0xe6, 0xa9, 0x8d, 0xfb, 0x03, 0xe1, 0x0b, 0xac, 0x6f, 0xc3, 0x7e, 0x89, 0x29, 0xb8, 0xb4, 0x06, 0x2b, 0xfc, 0x70, 0xf4, 0xa9, 0x18, 0x64, 0x78, 0x60, 0x37, 0x36, + 0x4d, 0x2a, 0x21, 0x1d, 0x15, 0x5e, 0x7c, 0x9d, 0xab, 0xd1, 0x17, 0x9a, 0x3e, 0x6e, 0x84, 0x34, 0xb3, 0x8a, 0xc2, 0xbb, 0x6b, 0x31, 0x80, 0x9f, 0xb2, 0x18, 0xbc, 0x12, 0xbd, 0xa0, 0x71, 0xbe, + 0x1c, 0xc2, 0xfd, 0xac, 0x06, 0xc1, 0xa1, 0x10, 0xd0, 0x1c, 0xe4, 0x3a, 0x60, 0xba, 0x07, 0xd8, 0xc5, 0x68, 0x6d, 0xee, 0xdd, 0xb1, 0x4d, 0x00, 0x7c, 0x24, 0xee, 0xd7, 0x87, 0x60, 0x96, 0x01, + 0x19, 0xb0, 0x0f, 0x36, 0x48, 0xd5, 0xb2, 0x03, 0xb0, 0x22, 0xb5, 0x68, 0x3b, 0x6d, 0x3c, 0x6d, 0x2d, 0x71, 0x5d, 0x4e, 0xf2, 0x54, 0xd8, 0x16, 0x36, 0xb7, 0x3f, 0x00, 0x44, 0xb9, 0xde, 0xad, + 0xd8, 0x3d, 0x4e, 0x10, 0x2d, 0xb7, 0x0c, 0x1f, 0xf6, 0xe2, 0xff, 0x5d, 0xac, 0xbd, 0xa3, 0x72, 0xfa, 0x70, 0xf8, 0x3a, 0xfe, 0x79, 0x8c, 0xd7, 0xff, 0xf8, 0xef, 0x10, 0x78, 0xda, 0xe1, 0x7a, + 0xce, 0xd0, 0x0b, 0x56, 0xe1, 0x09, 0x99, 0x6c, 0xe8, 0x5a, 0x61, 0x7a, 0x5f, 0x3c, 0x3e, 0x57, 0xf3, 0xef, 0xce, 0x33, 0x3e, 0x72, 0xea, 0xf6, 0x93, 0xbe, 0x95, 0xff, 0xe6, 0xfa, 0x12, 0x36, + 0xc4, 0x51, 0x9c, 0x69, 0x92, 0xb4, 0x9b, 0x8d, 0x78, 0xf8, 0x50, 0xef, 0xea, 0xa3, 0xdd, 0x85, 0xe3, 0x59, 0xb8, 0xe2, 0x15, 0x25, 0x1c, 0x48, 0x2e, 0x0d, 0xc8, 0x03, 0x86, 0xd4, 0x46, 0x25, + 0x1f, 0x02, 0xc9, 0xee, 0x48, 0x41, 0x35, 0x4c, 0x73, 0x18, 0xba, 0x70, 0x41, 0x21, 0x6c, 0x37, 0x92, 0x49, 0x6e, 0xec, 0xbd, 0xb2, 0x40, 0x8c, 0x44, 0x96, 0xd0, 0xed, 0x46, 0x10, 0xef, 0x85, + 0xe8, 0xf6, 0xdd, 0xb2, 0x4d, 0xcf, 0xb6, 0xff, 0x7a, 0xf5, 0x95, 0x7e, 0xb1, 0x9d, 0x3d, 0x3a, 0x96, 0xf7, 0x2c, 0x7a, 0x7c, 0x46, 0xae, 0x1d, 0xea, 0x6d, 0x61, 0xdd, 0x63, 0x16, 0xf6, 0x54, + 0xa2, 0xfb, 0x47, 0xc2, 0xaf, 0x1c, 0xba, 0x0e, 0x87, 0x58, 0xbf, 0xc4, 0xf7, 0xd9, 0xac, 0x06, 0x91, 0xd1, 0x36, 0xca, 0xa8, 0xe3, 0x6c, 0x49, 0x46, 0x1a, 0x40, 0x08, 0x1c, 0x92, 0x4f, 0x3b, + 0x40, 0x6e, 0x0b, 0xb3, 0x58, 0x64, 0x20, 0x8a, 0x02, 0xeb, 0xdd, 0xa2, 0x60, 0xc0, 0x7a, 0x39, 0x0a, 0xf5, 0x91, 0xcf, 0x1d, 0x47, 0xc5, 0xa2, 0x65, 0x9b, 0x5d, 0x5d, 0xac, 0x17, 0x4c, 0xad, + 0x65, 0x30, 0x75, 0x2c, 0xbc, 0x31, 0xea, 0x4d, 0xf6, 0x52, 0x9d, 0x8c, 0x16, 0x5c, 0xd0, 0xfd, 0xc8, 0xb3, 0xf9, 0x07, 0x15, 0xd7, 0x1f, 0x56, 0x5d, 0x4a, 0xb3, 0xc4, 0xb0, 0xf2, 0xfc, 0x1c, + 0xa9, 0x72, 0x52, 0x84, 0xb4, 0xcc, 0xb9, 0xc7, 0x1e, 0xf8, 0x39, 0xab, 0xc9, 0x17, 0x0f, 0x38, 0xb3, 0xe9, 0xf7, 0xdb, 0xe7, 0x8d, 0xa0, 0xc7, 0x0e, 0x8b, 0x24, 0xe5, 0x4e, 0x48, 0xd7, 0x6e, + 0xe1, 0x64, 0xba, 0xa0, 0x41, 0xc4, 0x82, 0x18, 0x94, 0x8d, 0xb0, 0x4d, 0xd9, 0xad, 0xb2, 0xd7, 0xe6, 0x22, 0x01, 0x8c, 0xdd, 0x64, 0x83, 0x0c, 0xc6, 0x03, 0x00, 0xb2, 0x46, 0x79, 0x90, 0x75, + 0x56, 0x38, 0xf7, 0x00, 0xf3, 0xd0, 0xd1, 0x4a, 0x5b, 0xe9, 0x4d, 0xa9, 0xd3, 0x33, 0x7c, 0x1f, 0xc3, 0x6d, 0x9a, 0x1b, 0xdb, 0xa5, 0xb7, 0x5c, 0xcc, 0x66, 0x31, 0xa4, 0xfd, 0xb8, 0x7c, 0x64, + 0x9a, 0x25, 0xe7, 0xc4, 0x90, 0x6f, 0xd0, 0x7a, 0x42, 0xe9, 0xbf, 0x12, 0xbd, 0x20, 0x74, 0xbe, 0x3c, 0xa3, 0xd2, 0x43, 0xf7, 0x27, 0x44, 0x8f, 0x29, 0xb8, 0x30, 0xc4, 0x38, 0x33, 0x5e, 0xb2, + 0xab, 0x1a, 0x02, 0x41, 0x76, 0x40, 0x36, 0x8b, 0xc3, 0x06, 0x73, 0xf6, 0xf0, 0xba, 0xde, 0x2b, 0xc1, 0x16, 0xf7, 0x16, 0x95, 0x06, 0xea, 0x07, 0xaf, 0x50, 0x97, 0x1a, 0x70, 0x58, 0x65, 0x92, + 0x6e, 0x46, 0x0e, 0x92, 0xc1, 0x87, 0x58, 0xf3, 0xcc, 0x6e, 0xb4, 0x2e, 0x23, 0x13, 0x94, 0x45, 0x6d, 0x95, 0xa9, 0xe1, 0x6c, 0x24, 0x8f, 0xf2, 0x9f, 0x04, 0xc9, 0xdc, 0x16, 0x7e, 0xfe, 0x16, + 0xb8, 0x68, 0x68, 0x84, 0x9e, 0x15, 0xdf, 0x8d, 0xf4, 0x7b, 0xae, 0x21, 0xff, 0x07, 0xc2, 0x17, 0xfc, 0x5e, 0x47, 0x43, 0xa8, 0x67, 0x67, 0x7e, 0xa6, 0xd9, 0x8e, 0x33, 0x1d, 0xb7, 0x03, 0x21, + 0x2e, 0xd6, 0x4c, 0xb2, 0x99, 0x57, 0x15, 0x7a, 0x34, 0x01, 0x2a, 0x48, 0x32, 0x3f, 0xf4, 0xbc, 0x52, 0x80, 0x4b, 0x69, 0x3f, 0x81, 0x97, 0x13, 0x88, 0x58, 0xed, 0xb6, 0x4b, 0xa5, 0x28, 0xf6, + 0xe6, 0x34, 0x39, 0x1c, 0x80, 0xaa, 0x11, 0xdc, 0xb5, 0x19, 0x24, 0xf4, 0x84, 0x5e, 0x8d, 0x28, 0x8a, 0x01, 0x53, 0x1f, 0x0e, 0xc9, 0x39, 0x19, 0x58, 0x15, 0xde, 0xb3, 0x92, 0x40, 0x61, 0x7a, + 0x8e, 0x75, 0x2d, 0xa0, 0x07, 0x3e, 0x15, 0xb6, 0xd2, 0xab, 0x80, 0x5e, 0x9a, 0x25, 0x4d, 0x3b, 0xd4, 0x4c, 0xf3, 0xbe, 0x36, 0xf3, 0x4c, 0x4f, 0xc4, 0x77, 0xb2, 0x17, 0xe8, 0xaf, 0x83, 0xf3, + 0xe4, 0xed, 0x51, 0xc2, 0x21, 0x0c, 0xd7, 0xf9, 0x8a, 0x93, 0x76, 0xd3, 0x9d, 0xb8, 0x45, 0x51, 0xdf, 0xcc, 0x76, 0x80, 0x80, 0x10, 0xc7, 0x30, 0xf6, 0x6c, 0xaf, 0x98, 0x8a, 0x03, 0xb5, 0xce, + 0xa2, 0x48, 0x35, 0x12, 0x69, 0xd9, 0x72, 0xcb, 0xaa, 0x50, 0x9b, 0xb4, 0x95, 0xc1, 0x18, 0x06, 0xf4, 0x29, 0xc0, 0xa3, 0x05, 0x35, 0x1e, 0xab, 0x80, 0xb3, 0xa0, 0x4d, 0x75, 0x47, 0x2c, 0x57, + 0x99, 0x96, 0x2c, 0xa1, 0xc1, 0x41, 0x19, 0xf7, 0x3d, 0xb8, 0x26, 0x59, 0xad, 0x65, 0xe6, 0xe5, 0x15, 0x7f, 0x3b, 0x67, 0x7a, 0xe9, 0xe9, 0x3d, 0x7e, 0x5d, 0x6a, 0x24, 0x43, 0xe7, 0x58, 0x89, + 0x9f, 0xf2, 0xe5, 0xe5, 0x1c, 0xed, 0xdf, 0x83, 0x35, 0x37, 0x79, 0x97, 0x5f, 0xab, 0x33, 0xcf, 0xb4, 0xc3, 0xfb, 0x40, 0xf7, 0xc4, 0x9c, 0xf7, 0x51, 0xdf, 0x46, 0x78, 0x04, 0x31, 0x55, 0xeb, + 0x66, 0x1d, 0x35, 0xcb, 0xb8, 0x44, 0xb4, 0x0d, 0x86, 0xc2, 0xbb, 0xc1, 0x81, 0x9c, 0xb5, 0x29, 0xdf, 0xe9, 0xf6, 0x62, 0x30, 0xc1, 0x0e, 0xeb, 0x69, 0x80, 0x94, 0x7b, 0x7f, 0xdf, 0xc4, 0x38, + 0x84, 0x41, 0x1a, 0xbb, 0x9a, 0x17, 0xee, 0x5e, 0xd9, 0x1c, 0xb6, 0xc7, 0x2d, 0x44, 0x63, 0xc9, 0xa2, 0x72, 0x06, 0xa1, 0xaf, 0x69, 0xb0, 0xb0, 0xf0, 0x06, 0xb2, 0x5d, 0x4d, 0x84, 0xf5, 0xbd, + 0x46, 0xc7, 0xdf, 0xc0, 0x53, 0x46, 0xf7, 0xce, 0x24, 0xcf, 0xc5, 0xf6, 0x9f, 0x08, 0x9e, 0x00, 0x29, 0xa3, 0xb4, 0x6f, 0x1c, 0x3f, 0x57, 0xab, 0xed, 0x20, 0x45, 0xa4, 0x59, 0x0e, 0x89, 0x6d, + 0x61, 0x02, 0xbe, 0x62, 0x14, 0x68, 0x9d, 0x56, 0xe8, 0x88, 0xf1, 0x94, 0xc9, 0xd1, 0x1c, 0x6d, 0x42, 0x03, 0x53, 0x65, 0x33, 0x00, 0xe5, 0x01, 0xa9, 0x74, 0x15, 0xee, 0x6f, 0x30, 0x2a, 0x0c, + 0x90, 0xed, 0x26, 0x12, 0x39, 0xc8, 0x2e, 0xf0, 0xd1, 0xb6, 0x11, 0x41, 0x76, 0xa5, 0xce, 0x17, 0x83, 0xbd, 0x38, 0xdb, 0xc1, 0xd4, 0xcc, 0xad, 0x9f, 0x57, 0xe0, 0x4e, 0x47, 0xa8, 0xc4, 0x1e, + 0x9e, 0x38, 0xaa, 0x45, 0x6f, 0x4a, 0xdc, 0xcd, 0xfc, 0xbd, 0x86, 0x40, 0x9d, 0x3e, 0x41, 0x7a, 0x25, 0xfe, 0xa5, 0x65, 0xdc, 0x1a, 0x97, 0xb9, 0xfb, 0xb5, 0x78, 0x78, 0xca, 0x39, 0x70, 0x25, + 0x7a, 0x86, 0xfb, 0x72, 0x79, 0x4e, 0x6b, 0xeb, 0x21, 0x93, 0x0f, 0x9b, 0x7c, 0xe3, 0x9b, 0xf6, 0xc0, 0xc7, 0xa2, 0x70, 0xd0, 0x02, 0xf8, 0x7c, 0xc9, 0x88, 0xaa, 0x9e, 0xcd, 0x00, 0x32, 0x85, + 0x15, 0x47, 0x03, 0x17, 0x62, 0x61, 0x1e, 0xb7, 0xac, 0x02, 0x1f, 0x2c, 0x2c, 0x71, 0x17, 0xe2, 0x74, 0x94, 0x6b, 0xd3, 0xc5, 0x82, 0x13, 0xab, 0x74, 0x34, 0xe0, 0x25, 0x2a, 0xcd, 0xe4, 0xca, + 0xaa, 0xcc, 0x83, 0xda, 0xea, 0xb1, 0x0f, 0x1b, 0x15, 0x29, 0xd0, 0x26, 0xf8, 0x93, 0x7d, 0xad, 0x97, 0xe3, 0xa9, 0x4c, 0xb5, 0x3f, 0xab, 0x36, 0x95, 0xa9, 0x76, 0x06, 0x2b, 0xd5, 0xfa, 0xaa, + 0x45, 0x2e, 0xbd, 0x60, 0xc0, 0x9c, 0x14, 0x0f, 0x9c, 0x02, 0x18, 0xe6, 0xc1, 0xc5, 0xf1, 0x82, 0xa7, 0xd7, 0xf3, 0xd8, 0x9c, 0x66, 0xec, 0x92, 0x3f, 0xf2, 0x13, 0xac, 0x89, 0xb2, 0x36, 0x57, + 0x5b, 0xc4, 0xc3, 0x26, 0x48, 0x42, 0x27, 0x5c, 0xac, 0x11, 0xca, 0x58, 0xd0, 0xcc, 0x01, 0x51, 0x42, 0x30, 0x36, 0xe8, 0x18, 0x88, 0xe1, 0x0f, 0xbb, 0x68, 0x4e, 0x07, 0x99, 0xab, 0x23, 0x06, + 0x2c, 0x67, 0x9f, 0xab, 0xbf, 0xfe, 0x64, 0x6e, 0x9e, 0x2d, 0x69, 0x43, 0x27, 0xd1, 0x2e, 0x7b, 0x1a, 0xfc, 0x94, 0xd7, 0xaf, 0x8f, 0x7d, 0xfc, 0x78, 0x4f, 0x07, 0xc3, 0x7f, 0x41, 0xcf, 0xb4, + 0x3c, 0x3c, 0x9e, 0xd4, 0xaf, 0x63, 0x3e, 0xbc, 0xfc, 0xfb, 0x63, 0xe0, 0x23, 0x89, 0x35, 0xfd, 0xee, 0xd8, 0xc5, 0x7b, 0xc7, 0x36, 0xd1, 0x74, 0xe5, 0x79, 0x44, 0xce, 0x14, 0x9a, 0x32, 0x23, + 0xb3, 0x86, 0x24, 0x71, 0xc8, 0xa5, 0x04, 0x12, 0x94, 0x32, 0x4d, 0xc1, 0xe6, 0x5b, 0xf0, 0xb0, 0xf6, 0xf4, 0xbd, 0xba, 0x5f, 0x48, 0x9e, 0x09, 0x6a, 0x55, 0xc7, 0xcc, 0x83, 0x29, 0xab, 0x72, + 0x6c, 0x54, 0x36, 0xb0, 0x84, 0x45, 0x07, 0x01, 0x64, 0x6c, 0xa3, 0x80, 0xd7, 0x93, 0x9e, 0x5a, 0xc3, 0xb9, 0xab, 0xba, 0xe1, 0x6a, 0x71, 0x6c, 0x85, 0x7f, 0xbd, 0x1a, 0x25, 0xbf, 0x08, 0x5e, + 0x7d, 0xa8, 0xbb, 0xfd, 0xc1, 0x23, 0x48, 0xef, 0x80, 0xd7, 0x63, 0x69, 0x95, 0xd6, 0xf0, 0x5c, 0xb6, 0xae, 0xd0, 0xf2, 0xe0, 0xee, 0xa6, 0xf7, 0x4c, 0x79, 0xba, 0x4f, 0xb4, 0x4f, 0x1c, 0xbd, + 0xbd, 0x73, 0xb6, 0xe7, 0xf5, 0xd0, 0xab, 0xf9, 0x52, 0xe3, 0x25, 0x0d, 0xb7, 0xc3, 0xe5, 0x16, 0x5b, 0x68, 0x92, 0xb2, 0xee, 0x16, 0x49, 0x00, 0xa2, 0x8b, 0x6e, 0xcb, 0x41, 0x93, 0x31, 0xae, + 0xcd, 0xdd, 0x0a, 0xcb, 0x6c, 0x6e, 0x8f, 0x88, 0xce, 0x71, 0x3c, 0x58, 0xc1, 0x13, 0x37, 0x55, 0xd7, 0xf1, 0x78, 0x42, 0xba, 0xa4, 0x87, 0xaa, 0xb3, 0x80, 0x92, 0xc8, 0x03, 0xb6, 0x39, 0x06, + 0x53, 0x8a, 0x19, 0x13, 0x19, 0xea, 0x5a, 0x3e, 0xb2, 0x1c, 0xdd, 0x2c, 0xab, 0x77, 0x9c, 0xff, 0xd7, 0x1b, 0xce, 0xef, 0x88, 0x7f, 0xd7, 0x6d, 0xa1, 0x1f, 0x3f, 0x6c, 0x2b, 0x4b, 0xf2, 0xb7, + 0xc3, 0xe0, 0x07, 0x0e, 0xdf, 0x79, 0x4c, 0xaa, 0x15, 0x99, 0x95, 0xc4, 0xdf, 0x3e, 0xa7, 0xae, 0xeb, 0x5f, 0xd7, 0xef, 0x9d, 0x1f, 0xf6, 0xd3, 0x67, 0x18, 0x49, 0x9c, 0x97, 0x61, 0x71, 0x7a, + 0xed, 0xef, 0x1e, 0x73, 0x21, 0x7b, 0x89, 0xb0, 0xb9, 0xe4, 0x9e, 0x7e, 0x78, 0xc4, 0xf5, 0xea, 0xff, 0x7c, 0x37, 0xc1, 0xee, 0x18, 0xf7, 0xbf, 0x9a, 0x67, 0xcf, 0x15, 0xb2, 0xfc, 0xfa, 0x11, + 0xe7, 0xe9, 0xf6, 0xd5, 0x07, 0x7d, 0x0b, 0x5c, 0x16, 0xca, 0x04, 0x5a, 0x43, 0xae, 0xd3, 0x6e, 0x4a, 0xc6, 0x09, 0x13, 0x19, 0x50, 0x0e, 0x39, 0x5c, 0x43, 0x58, 0x19, 0x8b, 0xb2, 0x4b, 0x1e, + 0xed, 0x12, 0x38, 0x4e, 0xb6, 0xb6, 0xbb, 0x55, 0xb4, 0x48, 0xab, 0x09, 0xbb, 0x75, 0xcb, 0x68, 0xa9, 0xc1, 0xed, 0x3c, 0x35, 0xa5, 0x84, 0x24, 0x2a, 0x05, 0x81, 0x33, 0xd6, 0x08, 0xfd, 0x01, + 0x6a, 0xef, 0x95, 0xf5, 0x61, 0xb7, 0xca, 0x47, 0x34, 0x53, 0x7d, 0x6f, 0x4e, 0xcf, 0x8c, 0x6f, 0x16, 0xe0, 0xcf, 0xb5, 0xce, 0xcc, 0x00, 0x86, 0x40, 0x66, 0x9c, 0x97, 0x59, 0x0f, 0x1d, 0xb3, + 0x45, 0xf4, 0xb9, 0x73, 0x5c, 0xfa, 0xc8, 0x9a, 0x32, 0x1b, 0x4e, 0xe7, 0x82, 0x24, 0x0a, 0x13, 0x37, 0xa8, 0xf2, 0x31, 0xe9, 0x98, 0x63, 0x6f, 0xb7, 0x0e, 0x25, 0x6a, 0x11, 0x53, 0xae, 0x1d, + 0x0f, 0x28, 0xb1, 0x71, 0x50, 0xdd, 0xc0, 0x61, 0x93, 0xdc, 0x1a, 0xd4, 0x1e, 0xc2, 0x6a, 0xad, 0x9a, 0xda, 0x8e, 0xd5, 0x4c, 0x1c, 0xc3, 0x30, 0x02, 0xd7, 0x50, 0xab, 0xb6, 0x6e, 0xd7, 0x8a, + 0x28, 0x3c, 0xaf, 0x59, 0x5d, 0x5a, 0xb1, 0xbc, 0x17, 0xdd, 0x07, 0x3f, 0x47, 0xc3, 0x79, 0xb1, 0x77, 0xfa, 0xe0, 0xff, 0x42, 0x37, 0xc6, 0xdf, 0xd7, 0xe2, 0x2a, 0xaf, 0x95, 0xd0, 0xa1, 0xdf, + 0x1a, 0xe8, 0x14, 0x99, 0x97, 0x5e, 0xc2, 0x03, 0x2f, 0x15, 0x22, 0x8a, 0xf3, 0xc1, 0xe2, 0xff, 0xc2, 0x5f, 0xb7, 0xee, 0xfe, 0xcd, 0xe8, 0x7a, 0x66, 0xd2, 0xe7, 0xda, 0x88, 0xdf, 0xf0, 0xd4, + 0xd2, 0x4c, 0xd3, 0xcb, 0xee, 0xeb, 0xcd, 0xcf, 0xc4, 0x3c, 0xbe, 0x12, 0x3d, 0xf1, 0xf7, 0x7a, 0x39, 0x44, 0xfa, 0xc5, 0x3a, 0x1a, 0x2b, 0xb7, 0x24, 0x0c, 0x80, 0xcc, 0x4c, 0x37, 0x60, 0x0e, + 0xfb, 0x5c, 0x19, 0x24, 0x39, 0xe5, 0xda, 0x52, 0x0b, 0x2e, 0xbc, 0xa0, 0x4e, 0x99, 0x25, 0x80, 0x0d, 0xbc, 0x28, 0x19, 0x70, 0xa9, 0xa5, 0xe5, 0xdb, 0x19, 0x99, 0x94, 0x74, 0xc6, 0x64, 0xa1, + 0x12, 0xd4, 0x5b, 0x70, 0x30, 0x88, 0x7d, 0xaf, 0x2d, 0xa7, 0x95, 0x41, 0x08, 0x33, 0x05, 0xdb, 0x22, 0x65, 0x50, 0xa9, 0xe4, 0x31, 0x9a, 0x3d, 0x8a, 0xf4, 0xf8, 0xa6, 0xb5, 0xd5, 0x6f, 0xb5, + 0x59, 0x7f, 0x7e, 0xba, 0x23, 0xfb, 0x46, 0xdd, 0x64, 0x96, 0x63, 0x35, 0xe9, 0xaf, 0x34, 0x4b, 0x8a, 0xe4, 0x24, 0x06, 0x7f, 0xd9, 0xa1, 0x76, 0xd7, 0xd8, 0x06, 0x3d, 0xe5, 0x53, 0xf8, 0xfa, + 0x11, 0x67, 0x3e, 0x7d, 0xf5, 0xc1, 0xb9, 0x7c, 0x54, 0x0f, 0xae, 0xc1, 0x83, 0x35, 0x38, 0xc1, 0x9c, 0x11, 0x06, 0x09, 0xa1, 0x12, 0x2e, 0x3a, 0xbc, 0x2d, 0x31, 0x60, 0x85, 0x20, 0xac, 0x91, + 0xd3, 0x12, 0x17, 0x72, 0x76, 0xde, 0xb2, 0x1a, 0xb7, 0xd0, 0xe6, 0xe8, 0x6c, 0x0c, 0x67, 0x68, 0x2b, 0x92, 0xab, 0x4a, 0x5e, 0x2d, 0x76, 0x3b, 0x11, 0xb0, 0x65, 0x2a, 0x90, 0x52, 0x5d, 0xd7, + 0xd5, 0x50, 0xc2, 0x9c, 0x36, 0xd6, 0xe9, 0x3d, 0xe7, 0xa5, 0x9e, 0x77, 0xf0, 0x9e, 0xe7, 0x5a, 0xcf, 0x64, 0xa1, 0x2f, 0x72, 0xf2, 0x88, 0x7f, 0x77, 0x39, 0x79, 0x17, 0xc6, 0xdd, 0x5f, 0xbf, + 0xcf, 0xc4, 0x81, 0x5f, 0x69, 0xbe, 0x4d, 0x8b, 0xb4, 0x6f, 0xb3, 0x03, 0x55, 0x60, 0x3b, 0x93, 0x6c, 0xe5, 0xff, 0x3f, 0x7b, 0x6f, 0xd6, 0xa4, 0xb8, 0xb3, 0xe4, 0x0b, 0xbe, 0xf7, 0xa7, 0x48, + 0xab, 0xc7, 0xe1, 0x52, 0xda, 0x17, 0xda, 0xac, 0x7b, 0x5a, 0x42, 0x20, 0x40, 0x0b, 0x88, 0x5d, 0x7a, 0x38, 0x63, 0xda, 0x17, 0xb4, 0xaf, 0x48, 0x76, 0xed, 0x7c, 0xf6, 0x31, 0x20, 0xc9, 0x02, + 0x12, 0x12, 0x25, 0x55, 0xff, 0x3e, 0x3d, 0x77, 0xfe, 0x2f, 0x99, 0x0a, 0x49, 0xb8, 0x24, 0xf7, 0x08, 0x0f, 0x0f, 0x0f, 0xf7, 0x9f, 0x67, 0x92, 0x44, 0x11, 0x1e, 0xc9, 0xf6, 0x17, 0xfe, 0x8c, + 0xdd, 0x56, 0x36, 0x36, 0xb3, 0x02, 0x0a, 0x0a, 0xd2, 0x04, 0x9c, 0xcc, 0xd0, 0x90, 0x75, 0x1c, 0x0c, 0xe5, 0x55, 0x4e, 0x44, 0xf6, 0x86, 0xea, 0x02, 0xe5, 0x68, 0xc5, 0x14, 0x04, 0x1a, 0x73, + 0xd5, 0x9a, 0x9c, 0xee, 0x33, 0x53, 0x58, 0xe0, 0x58, 0x01, 0x8b, 0xe3, 0x20, 0xca, 0x24, 0x7d, 0xc1, 0x80, 0xcf, 0xfa, 0xc1, 0xb3, 0xe1, 0xf7, 0xe7, 0x84, 0x12, 0xd4, 0x59, 0xee, 0xea, 0x6a, + 0x6e, 0xaa, 0xed, 0x04, 0x73, 0x27, 0x1a, 0xfa, 0xbe, 0x5d, 0xf1, 0xca, 0x16, 0xfd, 0x1d, 0xfa, 0x27, 0x81, 0xdd, 0x9e, 0xed, 0xa2, 0xed, 0x36, 0xe8, 0x67, 0x1d, 0x7f, 0xd3, 0xcc, 0xd2, 0xcc, + 0xb6, 0xc4, 0xce, 0x6a, 0x10, 0x33, 0x0b, 0x64, 0x45, 0x52, 0x12, 0x67, 0x03, 0x2b, 0x4f, 0xd9, 0xe2, 0x81, 0xb4, 0x98, 0x14, 0xa6, 0xe2, 0x21, 0x03, 0xae, 0x53, 0x8a, 0x83, 0x45, 0x94, 0xd0, + 0x8b, 0x98, 0x5e, 0x31, 0x88, 0x1d, 0x14, 0x68, 0x36, 0xec, 0xf9, 0xd3, 0xcc, 0xdb, 0x6e, 0xbc, 0x21, 0x04, 0x19, 0x12, 0xb7, 0x4a, 0xcc, 0xc0, 0x42, 0x4a, 0x33, 0x81, 0x5e, 0x9f, 0x60, 0x4f, + 0x13, 0xd9, 0x3f, 0x4e, 0xb6, 0xc5, 0x77, 0x07, 0x63, 0xdb, 0x4d, 0xa7, 0x0f, 0x76, 0x3d, 0x06, 0x2e, 0x78, 0xad, 0xce, 0xe6, 0x25, 0xe1, 0x4b, 0xb1, 0x14, 0xa9, 0xdf, 0xb6, 0xc6, 0x26, 0xa9, + 0xea, 0xf2, 0x76, 0xbb, 0x1c, 0x83, 0xd4, 0x4e, 0x2a, 0xf1, 0x39, 0x35, 0xf5, 0x06, 0x48, 0x39, 0x55, 0xc7, 0x5b, 0x65, 0xb7, 0xec, 0x55, 0x11, 0xca, 0x4f, 0x87, 0x1a, 0xcd, 0xc9, 0xd2, 0x60, + 0x10, 0x86, 0x82, 0x48, 0xc7, 0x5c, 0x62, 0xac, 0xd2, 0x31, 0xbe, 0x40, 0xc5, 0x25, 0xc8, 0xcd, 0xc6, 0x11, 0xb0, 0x59, 0x97, 0x13, 0x2c, 0x1f, 0x00, 0x5b, 0x8c, 0x1f, 0x02, 0x4b, 0x69, 0x65, + 0x81, 0xe6, 0xee, 0x5f, 0x24, 0x8f, 0x36, 0xab, 0xf4, 0xd4, 0x3c, 0x6e, 0x99, 0x96, 0x0f, 0x6b, 0xe0, 0xbf, 0x96, 0xd4, 0xf2, 0x8b, 0xec, 0x51, 0x0e, 0xe7, 0x46, 0x9b, 0x84, 0x16, 0xa8, 0x2b, + 0xc0, 0xa3, 0xac, 0xe3, 0xd5, 0x41, 0x25, 0x73, 0xcc, 0x94, 0x42, 0xa4, 0x02, 0x5b, 0xb3, 0x24, 0xc6, 0x40, 0xc4, 0xf4, 0xcb, 0x02, 0x0b, 0xf7, 0xab, 0xeb, 0x3d, 0x72, 0xfe, 0x7c, 0xdf, 0x01, + 0x71, 0x87, 0xfe, 0xf1, 0xe3, 0x3e, 0x9d, 0x3d, 0xba, 0x86, 0x5a, 0x78, 0x28, 0xb6, 0x16, 0x18, 0x6e, 0x4c, 0x7c, 0x9e, 0x99, 0x8d, 0x3b, 0x14, 0x8a, 0x0e, 0x15, 0xf7, 0x34, 0xd7, 0x5d, 0x69, + 0x41, 0xec, 0x27, 0xf8, 0xa2, 0x07, 0xc4, 0x1d, 0xa2, 0x22, 0xe4, 0xed, 0x0c, 0x98, 0xd0, 0x23, 0x27, 0x5d, 0x31, 0xcc, 0xca, 0xa9, 0xd4, 0x4e, 0x49, 0x89, 0x75, 0xa1, 0x15, 0x89, 0xa5, 0x6c, + 0x96, 0xa5, 0xb9, 0x02, 0x00, 0x46, 0x5e, 0xb3, 0x19, 0xc3, 0x12, 0x73, 0x8e, 0x07, 0xca, 0x41, 0xf5, 0x0d, 0x1f, 0x5a, 0xeb, 0xd0, 0xe4, 0x77, 0x0e, 0x3d, 0xee, 0x22, 0xaf, 0x60, 0x40, 0xbc, + 0xdf, 0x76, 0xe4, 0xe1, 0xf1, 0xa8, 0x7b, 0x22, 0xf4, 0x9c, 0x71, 0xae, 0xde, 0x21, 0x26, 0xb2, 0xbb, 0x26, 0xd7, 0x2e, 0x5c, 0x37, 0x12, 0x3b, 0xdc, 0x4c, 0x77, 0xae, 0xc2, 0x60, 0x4a, 0xaf, + 0x21, 0xa6, 0xb0, 0xe2, 0x04, 0xbd, 0xad, 0xa0, 0x2e, 0xf7, 0xc6, 0x64, 0xb0, 0xe7, 0xd4, 0xcc, 0x35, 0x87, 0xfd, 0xb4, 0x53, 0x6f, 0x15, 0x60, 0x13, 0x6c, 0x33, 0x7d, 0x37, 0x72, 0x39, 0x1f, + 0x82, 0xd5, 0x14, 0xac, 0xf1, 0xad, 0xbb, 0x65, 0xf6, 0x48, 0x80, 0xce, 0x47, 0xe1, 0x6f, 0x28, 0xcd, 0xab, 0x80, 0xe3, 0x93, 0xaf, 0xe7, 0x5f, 0xe1, 0xb7, 0x39, 0x73, 0xf1, 0xd0, 0x13, 0xbf, + 0x58, 0x4c, 0xbf, 0x2c, 0xa8, 0x23, 0xe1, 0x0b, 0x69, 0x1d, 0x7b, 0x7c, 0xcb, 0x20, 0xdf, 0x58, 0x03, 0x04, 0x39, 0xd8, 0x66, 0x39, 0xb5, 0xab, 0xb3, 0xf9, 0x70, 0x4f, 0xc6, 0xae, 0x38, 0x86, + 0x72, 0x76, 0x28, 0x4a, 0xe3, 0x21, 0x85, 0x94, 0xbb, 0x01, 0xc2, 0x26, 0xe8, 0xa0, 0xa0, 0x20, 0x63, 0x88, 0xdb, 0xa3, 0x18, 0xe8, 0x94, 0xb6, 0x92, 0x64, 0x7d, 0x76, 0xa2, 0xc6, 0x65, 0x4d, + 0x8a, 0x88, 0xd4, 0x41, 0x23, 0x62, 0x58, 0x95, 0x49, 0x31, 0x9b, 0xe8, 0xa1, 0x42, 0xcc, 0xe5, 0x1a, 0xfd, 0xcd, 0xf0, 0xab, 0x36, 0x31, 0x46, 0x67, 0xb4, 0x6d, 0xdf, 0xdd, 0x7d, 0x15, 0x4d, + 0xfe, 0x8a, 0x32, 0xf9, 0x45, 0xf8, 0xc4, 0xd3, 0x8f, 0xe6, 0x31, 0x6c, 0xe5, 0x69, 0x01, 0x92, 0x9d, 0xac, 0xdb, 0x44, 0x93, 0x7b, 0xa3, 0xa1, 0xd2, 0x2f, 0x6d, 0x75, 0x36, 0x54, 0x11, 0x3f, + 0x66, 0x7b, 0x7c, 0x64, 0x3e, 0x89, 0xbc, 0x7a, 0xdc, 0x8f, 0x3f, 0x95, 0xa6, 0x3b, 0x43, 0x02, 0xb4, 0xe2, 0x53, 0x11, 0x3c, 0x0c, 0xc5, 0x02, 0x5f, 0xed, 0x76, 0x07, 0x9a, 0x27, 0xee, 0x1c, + 0x8e, 0xba, 0xe0, 0xf3, 0xce, 0x06, 0x75, 0x49, 0xd3, 0x03, 0x65, 0x53, 0x62, 0x17, 0xf8, 0xd4, 0xb4, 0x13, 0x92, 0x44, 0xfa, 0x89, 0xe0, 0x2e, 0xc1, 0x91, 0x02, 0xed, 0x5e, 0x65, 0x4c, 0xee, + 0xa4, 0x51, 0x61, 0x1f, 0x97, 0xa3, 0xff, 0x84, 0x7f, 0x22, 0xad, 0x92, 0xdc, 0x53, 0xf3, 0xd1, 0x3e, 0x3a, 0xf8, 0x52, 0x60, 0x78, 0x6a, 0xe6, 0x47, 0x4e, 0xe4, 0x5d, 0xb0, 0x5d, 0x30, 0xb8, + 0x00, 0x6a, 0x88, 0xbc, 0x91, 0x32, 0x62, 0x8e, 0x28, 0x3d, 0x88, 0xd8, 0xcc, 0xa5, 0x1a, 0x1a, 0x8d, 0x28, 0x82, 0x56, 0x09, 0x86, 0x74, 0x4a, 0xc5, 0xc6, 0x57, 0x03, 0x2c, 0xe0, 0xeb, 0xdd, + 0x64, 0x2f, 0xad, 0x07, 0xb0, 0x57, 0x80, 0xe3, 0xad, 0xc6, 0xfa, 0xea, 0x68, 0x36, 0xf3, 0x77, 0x72, 0x67, 0x23, 0x12, 0xd5, 0x70, 0xd6, 0xa9, 0x56, 0xc2, 0x36, 0xa0, 0x87, 0x14, 0xa8, 0xae, + 0xf1, 0x52, 0xbe, 0xc6, 0xd4, 0xfb, 0x23, 0xe3, 0x2b, 0x77, 0x1f, 0xf7, 0x9b, 0xd7, 0x82, 0x1a, 0xdf, 0x69, 0x9e, 0xb8, 0x75, 0x38, 0x6a, 0x13, 0xca, 0x78, 0xe0, 0x18, 0xc7, 0x6f, 0x65, 0x12, + 0xdb, 0xec, 0x06, 0x09, 0xbc, 0x86, 0x35, 0xce, 0xdc, 0x03, 0xfc, 0x74, 0x0a, 0xad, 0xdd, 0xed, 0x3a, 0x84, 0x39, 0x56, 0x36, 0xd1, 0x99, 0x5c, 0x67, 0x94, 0x21, 0x1b, 0x5e, 0x90, 0xaa, 0xf2, + 0x78, 0x95, 0xad, 0x77, 0xdb, 0x82, 0x9c, 0xa2, 0x6a, 0xd0, 0x21, 0x3b, 0xd8, 0x4a, 0x53, 0x55, 0xd6, 0x87, 0x12, 0x27, 0x42, 0xd5, 0x84, 0xa2, 0x66, 0x23, 0x51, 0x42, 0xd9, 0xc5, 0x13, 0x3c, + 0xe6, 0xd4, 0x2c, 0xb2, 0x53, 0xc4, 0xf5, 0x23, 0xd5, 0xf2, 0x7d, 0xdf, 0xe7, 0x3b, 0xcd, 0xe3, 0xf7, 0x1f, 0x8f, 0x8e, 0x0a, 0xa5, 0x85, 0x77, 0x73, 0xd5, 0x0b, 0x47, 0x24, 0xa9, 0x22, 0x96, + 0x0e, 0x98, 0xbb, 0xfe, 0x10, 0xf2, 0x41, 0x60, 0x35, 0x83, 0xc6, 0x51, 0xe6, 0x16, 0x63, 0xaf, 0x5e, 0x3a, 0x84, 0x43, 0x97, 0xdb, 0xb5, 0x30, 0x92, 0xed, 0xb5, 0x6e, 0xb1, 0x65, 0x4e, 0xf6, + 0x88, 0xad, 0x5d, 0x78, 0xf0, 0x6a, 0xca, 0x33, 0xe6, 0x18, 0xa3, 0x59, 0x38, 0x20, 0x80, 0xa2, 0xaa, 0x55, 0x7e, 0xbd, 0xc4, 0x2d, 0x2d, 0xef, 0x57, 0xcb, 0xba, 0x79, 0x6e, 0x8f, 0xb8, 0xd1, + 0x69, 0x1b, 0xff, 0x3f, 0xff, 0xe3, 0x13, 0x00, 0xc9, 0x2b, 0xa6, 0x8a, 0x65, 0x3c, 0xf6, 0x98, 0xbe, 0xe4, 0xbd, 0xb1, 0x8c, 0xa3, 0xcf, 0xd4, 0x32, 0xf4, 0xb6, 0x9e, 0x99, 0x35, 0xec, 0x44, + 0xa5, 0xd1, 0x0c, 0xb5, 0xa9, 0x4b, 0x10, 0xc0, 0x46, 0xf5, 0xd4, 0x85, 0xb0, 0xdd, 0xc1, 0x53, 0x3e, 0xe8, 0xec, 0xc5, 0xb1, 0x29, 0x19, 0x82, 0x50, 0xd0, 0x84, 0xab, 0x7b, 0x84, 0xb6, 0xc3, + 0x1b, 0x17, 0x1e, 0x92, 0x2c, 0x4b, 0xed, 0x5d, 0x5b, 0x0f, 0x99, 0x61, 0x3c, 0x19, 0x69, 0x62, 0x2d, 0xea, 0x76, 0x3d, 0x61, 0xdc, 0x59, 0x87, 0x0c, 0xa7, 0xa9, 0x8c, 0xe9, 0x0a, 0x9b, 0x52, + 0x5f, 0x77, 0x24, 0x37, 0x48, 0x55, 0xeb, 0xa1, 0x43, 0xe2, 0xa5, 0x29, 0xea, 0x48, 0xf2, 0xf0, 0xe9, 0xc7, 0x83, 0xe3, 0x66, 0x7c, 0x0b, 0xbd, 0x33, 0x51, 0x76, 0x13, 0x41, 0xd9, 0x51, 0xec, + 0x70, 0x38, 0x9b, 0xc1, 0x72, 0xb2, 0x55, 0xb6, 0x33, 0x4d, 0xf0, 0x05, 0xda, 0xce, 0xf6, 0xcd, 0x80, 0x1c, 0xf3, 0x19, 0xea, 0x0b, 0xe3, 0x2d, 0x00, 0x47, 0x20, 0xdf, 0x5b, 0xd1, 0x55, 0x6f, + 0x0a, 0xc8, 0x48, 0x84, 0x57, 0xc3, 0x0a, 0x70, 0x7b, 0x32, 0xaf, 0xc6, 0xfa, 0x6a, 0xb2, 0xa9, 0x12, 0xcd, 0x45, 0x76, 0xc6, 0x7e, 0x3c, 0x33, 0xfa, 0x38, 0xbc, 0x1c, 0xbf, 0xbe, 0xe1, 0x69, + 0xfb, 0xd1, 0xb1, 0x0e, 0xc8, 0x3f, 0x88, 0xa3, 0x27, 0xea, 0xdc, 0x81, 0x3e, 0x7e, 0xf9, 0xd9, 0x97, 0x7b, 0xe6, 0xe4, 0x6d, 0x66, 0xc0, 0xc7, 0x4f, 0x5e, 0xb5, 0xe4, 0xdc, 0x4c, 0x55, 0xf5, + 0x56, 0xfe, 0xe1, 0x22, 0x3c, 0xd8, 0x93, 0xaa, 0xef, 0x9b, 0x8f, 0x97, 0x65, 0x2f, 0xb9, 0x2f, 0x2e, 0x08, 0x1f, 0x04, 0x7b, 0xd1, 0x6c, 0x53, 0x2f, 0xf7, 0x20, 0x5e, 0xcc, 0x47, 0xd7, 0xb5, + 0x32, 0x27, 0x71, 0x5e, 0x01, 0x7c, 0x66, 0xaf, 0x2c, 0xe7, 0xb8, 0x97, 0xf0, 0x24, 0x35, 0x1c, 0xc0, 0x0b, 0x70, 0x3c, 0xe4, 0x85, 0x19, 0x8c, 0x53, 0x9a, 0x97, 0xf1, 0x6b, 0x8a, 0xd9, 0x8f, + 0x0c, 0x87, 0x06, 0x74, 0x90, 0x5d, 0x65, 0xa3, 0x4e, 0x8d, 0xf4, 0x56, 0x56, 0xdf, 0x45, 0x8c, 0xa6, 0x21, 0xa7, 0xbe, 0x54, 0xcc, 0x82, 0x50, 0x9d, 0x4c, 0x85, 0x88, 0x19, 0x49, 0xf4, 0x33, + 0xf1, 0xfe, 0xbd, 0x17, 0xf7, 0xf0, 0x31, 0xad, 0xf6, 0xe2, 0x5a, 0x8c, 0x93, 0xcf, 0xbb, 0xbe, 0x27, 0xb7, 0x03, 0xdc, 0xa2, 0xbf, 0x1e, 0xd3, 0x87, 0xb4, 0xc2, 0xb2, 0xbe, 0x40, 0x13, 0x7e, + 0x25, 0xe7, 0xe3, 0x82, 0x2e, 0xd0, 0xbd, 0x6c, 0x75, 0xb1, 0x76, 0x59, 0x1f, 0x69, 0x8c, 0x2c, 0x22, 0x90, 0xe0, 0x74, 0x23, 0x08, 0x38, 0x8d, 0x2d, 0x6d, 0x55, 0xdc, 0x4b, 0x8b, 0x49, 0x4a, + 0x68, 0xec, 0x7a, 0xb1, 0xde, 0x61, 0x8b, 0xde, 0x20, 0x81, 0x86, 0x9d, 0x38, 0xd6, 0xe6, 0x11, 0x01, 0x76, 0x64, 0x53, 0x65, 0xf6, 0xbb, 0x0a, 0x63, 0x0c, 0x52, 0x9c, 0x89, 0x1d, 0x96, 0xc1, + 0x35, 0x2f, 0x94, 0x03, 0x78, 0x5d, 0xcc, 0x8a, 0xfe, 0x36, 0x88, 0x0b, 0xb9, 0x0c, 0xfa, 0x5b, 0xe9, 0xef, 0x5d, 0xe2, 0x3f, 0xd7, 0x33, 0x9f, 0x74, 0xaa, 0xa3, 0x2b, 0xfc, 0x51, 0xd1, 0xcc, + 0xd7, 0xcc, 0xc3, 0x0b, 0xba, 0xe7, 0x4e, 0x75, 0x6a, 0xb5, 0x35, 0x13, 0x67, 0xea, 0x6a, 0x31, 0xcc, 0x56, 0xaa, 0x28, 0x16, 0x5c, 0xb5, 0xa3, 0x5d, 0x2f, 0xa2, 0x66, 0x23, 0x8a, 0xc3, 0x01, + 0x53, 0xc0, 0xd7, 0x6e, 0x5a, 0xd6, 0xb3, 0x8d, 0xaf, 0x10, 0x34, 0x25, 0xd5, 0x28, 0xd3, 0x71, 0xfa, 0xa5, 0x83, 0xd2, 0xb8, 0x3f, 0x66, 0x3b, 0xe1, 0xcc, 0x70, 0xb4, 0xa1, 0x35, 0xd6, 0x66, + 0x1d, 0x7b, 0xc9, 0xd2, 0x7a, 0x6a, 0x64, 0x53, 0x75, 0x95, 0x81, 0xc3, 0x8e, 0x42, 0x4f, 0x5b, 0x02, 0xb6, 0x9d, 0x56, 0x15, 0x3f, 0xfe, 0x09, 0xb6, 0x44, 0xad, 0xc9, 0x4c, 0xbd, 0x48, 0xdf, + 0x81, 0x4f, 0xbe, 0x4a, 0x89, 0x86, 0x5f, 0xc2, 0xdd, 0xfa, 0x44, 0xfd, 0x88, 0xb4, 0x71, 0x73, 0xae, 0x0b, 0x3f, 0x47, 0xe4, 0x3a, 0xb0, 0x55, 0xc2, 0x14, 0xa0, 0x47, 0x84, 0xda, 0x54, 0xc4, + 0x72, 0x80, 0x07, 0xb2, 0x11, 0x1e, 0xc8, 0xf0, 0x40, 0xd5, 0x2d, 0x6f, 0xcd, 0x56, 0x69, 0x5f, 0x5f, 0xb8, 0x18, 0x83, 0x68, 0xf9, 0x7c, 0x0a, 0xb3, 0x0a, 0x19, 0x5b, 0x10, 0x07, 0xad, 0x44, + 0x42, 0xe9, 0x8d, 0xb0, 0x09, 0x46, 0x38, 0xde, 0x7a, 0x05, 0x4b, 0xcd, 0x3e, 0x85, 0xf6, 0xd3, 0xce, 0x30, 0xa0, 0x9d, 0x69, 0x39, 0xd8, 0x35, 0x7d, 0x21, 0xf8, 0xda, 0xfa, 0xfe, 0x12, 0x71, + 0x84, 0x78, 0xa9, 0x30, 0xcc, 0x2d, 0xe2, 0x08, 0xd1, 0xae, 0x14, 0xcc, 0x2c, 0x32, 0xd9, 0x89, 0xec, 0x90, 0x23, 0x0e, 0xa5, 0x97, 0x53, 0x40, 0xed, 0x2d, 0x2d, 0x5c, 0x61, 0x91, 0xd2, 0x8c, + 0x00, 0x8a, 0x50, 0xd6, 0x99, 0x9c, 0x2e, 0x28, 0x7c, 0x42, 0x86, 0x75, 0x2f, 0xd4, 0x10, 0x1a, 0x5a, 0xa7, 0xf1, 0xae, 0x10, 0x3b, 0x4d, 0x6f, 0x3a, 0xc0, 0x2a, 0x6b, 0x80, 0xc5, 0xf8, 0x08, + 0xe5, 0x75, 0x47, 0x56, 0x32, 0xd3, 0x76, 0x25, 0x5b, 0x9b, 0x30, 0x3d, 0x54, 0xb9, 0xdd, 0x81, 0x7d, 0xb8, 0xec, 0xbf, 0x28, 0x99, 0xfe, 0xb0, 0x40, 0xf5, 0xb7, 0xd1, 0x49, 0x3e, 0x7e, 0xf9, + 0x27, 0xc2, 0xa3, 0xdf, 0x99, 0xf9, 0x9e, 0x14, 0x73, 0xdf, 0xc4, 0x7d, 0x25, 0x00, 0xf2, 0x82, 0xee, 0x2f, 0x91, 0x1d, 0x5a, 0x6d, 0x31, 0x12, 0xd8, 0x2d, 0x38, 0xde, 0x03, 0xfd, 0x89, 0x3e, + 0xaa, 0x69, 0x52, 0x47, 0xeb, 0x5d, 0x3c, 0x62, 0xc7, 0x54, 0xc9, 0xd7, 0xd3, 0x6a, 0x1a, 0x69, 0xb9, 0x00, 0x90, 0x46, 0x67, 0x29, 0xed, 0x28, 0x83, 0x84, 0x00, 0x6d, 0xe0, 0xd9, 0xb3, 0x51, + 0x6a, 0x69, 0x2a, 0x0a, 0xad, 0x63, 0x33, 0x4b, 0x09, 0x6f, 0x0b, 0xe4, 0xe4, 0xca, 0xe9, 0xcc, 0x91, 0xc1, 0xb6, 0x67, 0x52, 0x0b, 0x4c, 0x33, 0x3b, 0x9e, 0x24, 0x3f, 0xf3, 0x6b, 0x7d, 0x11, + 0x77, 0x76, 0x89, 0xe0, 0x83, 0xfc, 0x45, 0x81, 0x7d, 0x97, 0x4c, 0x6b, 0x3f, 0x9c, 0xfe, 0x06, 0xf0, 0xf9, 0x06, 0x80, 0xcf, 0xfb, 0xd7, 0x66, 0x79, 0xf4, 0xb0, 0x44, 0x17, 0xf8, 0x1b, 0xfc, + 0x3c, 0x11, 0xfe, 0xc5, 0xd5, 0x63, 0xb3, 0x0b, 0xb6, 0xe3, 0xed, 0x52, 0x57, 0x4a, 0x56, 0x10, 0xea, 0x5e, 0x19, 0x19, 0x83, 0xe1, 0x22, 0x33, 0x11, 0xd0, 0xdf, 0xb8, 0xe1, 0xce, 0xeb, 0x4c, + 0xec, 0x29, 0x5d, 0xce, 0x42, 0xb2, 0x9a, 0x8f, 0xf3, 0x58, 0x9a, 0x2f, 0xd4, 0xda, 0xd1, 0x3b, 0x68, 0x96, 0x31, 0x19, 0x82, 0x60, 0xc5, 0xce, 0xdf, 0x59, 0xa5, 0x24, 0x4d, 0x6c, 0x1e, 0xd8, + 0x94, 0xc1, 0x88, 0x5f, 0x7b, 0xa8, 0xac, 0x97, 0x70, 0x46, 0x48, 0x7d, 0x49, 0x78, 0xa6, 0xa7, 0xf3, 0xae, 0x1e, 0x45, 0x3b, 0xd7, 0x3c, 0x4d, 0x29, 0x8f, 0xfd, 0x45, 0xe8, 0x0b, 0x21, 0x51, + 0x9f, 0xa8, 0x1f, 0x19, 0x73, 0x73, 0xee, 0x38, 0x8b, 0xb5, 0x08, 0x98, 0x32, 0x8d, 0xf9, 0x88, 0x0c, 0x68, 0x6e, 0xb0, 0x11, 0xd7, 0xe3, 0xb5, 0xc0, 0x99, 0x9e, 0x18, 0x16, 0x93, 0xbd, 0x6f, + 0x26, 0xf2, 0x00, 0x50, 0x16, 0x86, 0xbe, 0x24, 0x01, 0xd1, 0x0c, 0x7a, 0x40, 0x10, 0x44, 0xd9, 0x1e, 0x82, 0x63, 0x3d, 0x37, 0x48, 0x30, 0x83, 0xa7, 0x35, 0x08, 0x72, 0xa2, 0xd2, 0xa4, 0x91, + 0x2d, 0x28, 0x0b, 0x2c, 0x50, 0x0b, 0x0e, 0x06, 0xea, 0x80, 0x87, 0xb4, 0xd2, 0x7f, 0x12, 0x21, 0x96, 0x39, 0xa6, 0xa6, 0x86, 0xf6, 0x31, 0x72, 0x49, 0x0d, 0x1f, 0xc5, 0xd1, 0xbd, 0x68, 0x2c, + 0x5d, 0xd3, 0x3e, 0x70, 0xe6, 0xfa, 0x4c, 0x5b, 0xa3, 0x69, 0x37, 0xda, 0xa7, 0x70, 0xa3, 0xc4, 0x72, 0x6e, 0x04, 0xa9, 0x08, 0x25, 0x8c, 0x97, 0xa6, 0x5b, 0x40, 0x81, 0xd2, 0x39, 0xb4, 0x63, + 0x49, 0x66, 0xdf, 0xb1, 0x77, 0x31, 0x07, 0xb1, 0xa8, 0xb9, 0x0d, 0xca, 0x6d, 0x56, 0x05, 0xfa, 0x00, 0x72, 0x96, 0x1b, 0x7a, 0x23, 0xaf, 0x1a, 0x3f, 0x55, 0xe5, 0x0a, 0x02, 0x6a, 0x25, 0xc6, + 0xe5, 0x82, 0x91, 0x09, 0x42, 0xce, 0x4b, 0x4d, 0x04, 0x8d, 0x80, 0x79, 0xb6, 0x6c, 0xfc, 0x42, 0x51, 0xbe, 0x7f, 0xc5, 0xd1, 0xf2, 0xfb, 0xf1, 0x3a, 0xfc, 0x51, 0x2b, 0x7d, 0x79, 0xf3, 0xac, + 0x47, 0x1e, 0x9a, 0xd7, 0xa5, 0x73, 0xa4, 0x7c, 0x21, 0x9b, 0x63, 0xbb, 0x6d, 0xf2, 0x04, 0xd1, 0xe9, 0x18, 0x43, 0x27, 0xd7, 0xf7, 0x08, 0x82, 0x21, 0x05, 0xad, 0x26, 0x24, 0xc3, 0xcc, 0x51, + 0xb1, 0xd8, 0xd3, 0x66, 0x4e, 0x37, 0x7d, 0x42, 0x91, 0xa6, 0x4e, 0xb0, 0x94, 0xc6, 0xe1, 0x68, 0x60, 0xe0, 0xda, 0x22, 0xdd, 0x1a, 0xee, 0xa0, 0x6e, 0xfa, 0x25, 0x0b, 0x12, 0x0a, 0x8a, 0xae, + 0x64, 0x83, 0x5f, 0x38, 0x9b, 0x55, 0xbd, 0xcd, 0x31, 0x01, 0xa8, 0x9d, 0x86, 0x34, 0x77, 0xba, 0x06, 0x3d, 0x93, 0xcc, 0x9f, 0x60, 0xeb, 0x75, 0x8c, 0xf5, 0x7d, 0x27, 0xc9, 0x2b, 0xfe, 0xd3, + 0x4b, 0xc2, 0x07, 0xa6, 0x5e, 0x34, 0xdb, 0x7a, 0x52, 0x13, 0x6c, 0x3b, 0xab, 0xf3, 0x64, 0x38, 0x18, 0x73, 0xa3, 0x1d, 0x6b, 0xb8, 0xc2, 0x38, 0x95, 0x21, 0x30, 0x28, 0xf9, 0x79, 0x19, 0x4a, + 0x0e, 0x0a, 0x03, 0x1d, 0x36, 0xa2, 0xfd, 0xe1, 0x06, 0xd1, 0x60, 0x7e, 0xcb, 0x0f, 0xe0, 0xfd, 0x7e, 0x12, 0x2b, 0x43, 0x23, 0xe8, 0xa1, 0x95, 0x09, 0xd2, 0x6a, 0xb4, 0x46, 0xe6, 0xd5, 0xa4, + 0x66, 0x13, 0x1b, 0xab, 0x16, 0x84, 0x19, 0xef, 0x97, 0x25, 0xa8, 0xdc, 0x62, 0xda, 0xbc, 0x88, 0xe9, 0x6c, 0x9b, 0x79, 0xd7, 0x0d, 0xf3, 0xd4, 0x0d, 0x33, 0x57, 0xff, 0xf1, 0x0b, 0x30, 0xe3, + 0xe2, 0x96, 0x4f, 0xb8, 0xff, 0x87, 0x7b, 0x7a, 0xad, 0x4b, 0xab, 0xb5, 0x58, 0xd5, 0xb6, 0xde, 0xd3, 0xbc, 0x92, 0xc5, 0xd5, 0x95, 0x96, 0xc5, 0x09, 0xa0, 0x57, 0xcc, 0xc2, 0xe7, 0xd5, 0x09, + 0xa0, 0x56, 0xd6, 0xe1, 0xd8, 0x22, 0x68, 0x6f, 0xe8, 0xc7, 0xbb, 0xa6, 0xa1, 0xcd, 0x35, 0xa4, 0x27, 0xf6, 0x12, 0x99, 0x2e, 0x36, 0x4b, 0x44, 0x6d, 0xea, 0x68, 0xcf, 0xb0, 0xaa, 0x37, 0xef, + 0xb8, 0x6c, 0x38, 0xa4, 0xad, 0xf5, 0x1a, 0x1e, 0x6c, 0x6a, 0xa6, 0xde, 0xa8, 0x8a, 0xb2, 0x81, 0x07, 0x73, 0xc6, 0x5b, 0xa9, 0x32, 0x2c, 0x09, 0xa4, 0x8b, 0x79, 0x63, 0x64, 0xe1, 0x11, 0x81, + 0x93, 0x09, 0x28, 0xc3, 0x50, 0xc9, 0xe6, 0x41, 0x90, 0xfa, 0x5f, 0x26, 0x00, 0x3b, 0x54, 0xfd, 0xae, 0xb9, 0x77, 0x1f, 0xf1, 0x18, 0x79, 0x29, 0xa5, 0xf6, 0x82, 0xee, 0x71, 0x8c, 0x7d, 0xb4, + 0x8e, 0x6a, 0xab, 0x45, 0x02, 0xc0, 0x7a, 0x35, 0x41, 0x7b, 0xc3, 0x3e, 0xb9, 0x82, 0xa6, 0xfb, 0x4a, 0xe1, 0xf7, 0x63, 0x6d, 0xb9, 0x4c, 0x99, 0x92, 0x0f, 0x2d, 0x00, 0x5f, 0x32, 0xf6, 0x5e, + 0xd1, 0x39, 0xb2, 0xda, 0xcf, 0xc9, 0x26, 0x83, 0x90, 0x7d, 0xbc, 0x27, 0xf6, 0x1a, 0x8b, 0x83, 0xa1, 0x41, 0xfb, 0x8e, 0x98, 0x0e, 0x5d, 0x78, 0x20, 0x14, 0xc3, 0x79, 0x64, 0x32, 0xd1, 0x64, + 0x4a, 0x54, 0xb9, 0xb3, 0xe0, 0x13, 0x14, 0x1e, 0x78, 0x0f, 0xd4, 0xd6, 0x17, 0xec, 0xf1, 0xd5, 0xec, 0xcf, 0x96, 0xb6, 0x39, 0x52, 0x3c, 0xb0, 0xe4, 0xf0, 0xbf, 0xad, 0x0e, 0xb7, 0x7b, 0x12, + 0xe4, 0xa8, 0xa6, 0x56, 0x23, 0xf8, 0x74, 0xb1, 0xc8, 0x2b, 0x0d, 0x0d, 0xf3, 0x3e, 0xcb, 0xb2, 0x2a, 0x97, 0xa9, 0xeb, 0x85, 0x27, 0xe1, 0xa4, 0x45, 0xef, 0x23, 0x49, 0x2f, 0x72, 0x1f, 0xb3, + 0x16, 0x50, 0x59, 0xc8, 0x10, 0x39, 0x42, 0xaa, 0x45, 0x8e, 0x78, 0xc3, 0x7a, 0x98, 0xa7, 0xbb, 0x7d, 0x87, 0x6b, 0xc0, 0x35, 0xc4, 0x92, 0x18, 0x85, 0x0a, 0x35, 0x65, 0x30, 0x82, 0x0b, 0xff, + 0xb1, 0x10, 0xc0, 0xaf, 0xd8, 0xe7, 0xea, 0x66, 0x57, 0x0d, 0x33, 0xf7, 0x01, 0x0f, 0x5f, 0x0b, 0x58, 0xf8, 0x45, 0xf6, 0xc8, 0xc8, 0x73, 0xa3, 0x6d, 0xb0, 0x42, 0x22, 0xf4, 0x05, 0xcb, 0x91, + 0x41, 0x14, 0xd4, 0xd7, 0xa3, 0x25, 0x8a, 0x70, 0x3d, 0x7a, 0x58, 0xdb, 0x89, 0xac, 0xad, 0x66, 0x43, 0x85, 0x1b, 0x4d, 0x6d, 0x82, 0x23, 0x90, 0x20, 0x5f, 0x6e, 0x26, 0x73, 0x8d, 0x8c, 0xeb, + 0x19, 0x62, 0x35, 0x16, 0x3a, 0xde, 0x1b, 0xd8, 0xa2, 0x31, 0x06, 0x13, 0x09, 0x17, 0xe6, 0x2b, 0x1b, 0xd8, 0xd0, 0xe1, 0x94, 0xdf, 0xdb, 0x8e, 0x92, 0x73, 0x5c, 0x91, 0x0e, 0xc4, 0x67, 0xdc, + 0xfc, 0x02, 0xcf, 0xf8, 0xf0, 0xea, 0x59, 0x5e, 0xfb, 0xef, 0x21, 0xb5, 0x9f, 0x90, 0x5d, 0xd5, 0x2c, 0x4f, 0x55, 0xff, 0xc2, 0x96, 0x81, 0x6f, 0xef, 0x70, 0xb3, 0xae, 0x55, 0xf8, 0x7e, 0xe5, + 0x1a, 0xb9, 0xd3, 0x3d, 0xa6, 0xf9, 0xc5, 0x91, 0x1b, 0xe6, 0xbf, 0x61, 0xf8, 0x40, 0xbf, 0x3f, 0x1b, 0xe8, 0x8e, 0xea, 0xef, 0x2e, 0xc4, 0xf3, 0x7f, 0xbf, 0x6b, 0xa7, 0xff, 0x68, 0x93, 0x0f, + 0x79, 0x21, 0xe2, 0xab, 0xf3, 0x8f, 0xbf, 0xf4, 0xcf, 0x0d, 0xd1, 0x07, 0xcf, 0x00, 0xba, 0x8f, 0xae, 0xb4, 0x1d, 0xc6, 0x4d, 0x1d, 0x04, 0x58, 0xa7, 0xe8, 0x64, 0xfd, 0x6c, 0xb1, 0xa9, 0x99, + 0x5e, 0x22, 0xaa, 0xa6, 0xb7, 0x46, 0x98, 0x61, 0xe9, 0xf4, 0x39, 0xdd, 0xe7, 0x0c, 0xb7, 0x91, 0xd5, 0xc9, 0xaa, 0x18, 0x51, 0x24, 0x32, 0xe7, 0x3d, 0x8d, 0x08, 0x17, 0x05, 0x1b, 0x1a, 0x46, + 0x7f, 0xc4, 0x96, 0xa0, 0xb3, 0xeb, 0x70, 0x32, 0x41, 0x0b, 0x94, 0x9f, 0x6d, 0x4c, 0x0e, 0x5d, 0x99, 0x36, 0x3e, 0x58, 0xe3, 0x5b, 0xe9, 0x99, 0x37, 0xe1, 0x4f, 0x0c, 0xe3, 0x4b, 0x04, 0xae, + 0xfb, 0xf3, 0x30, 0xfa, 0xc2, 0x34, 0xfc, 0x8b, 0xec, 0x61, 0x18, 0x7f, 0x34, 0x8e, 0x10, 0xff, 0x2d, 0x66, 0x5f, 0x7e, 0x3e, 0x72, 0x00, 0x8a, 0xcc, 0xe3, 0x0d, 0x91, 0x16, 0x64, 0xcf, 0x4f, + 0xfd, 0xdd, 0x0a, 0xa5, 0xb2, 0x66, 0x9b, 0x43, 0x86, 0x56, 0x2d, 0xbc, 0xf5, 0xc6, 0x2e, 0xd8, 0x34, 0xf0, 0xf7, 0x03, 0x22, 0x57, 0xab, 0x75, 0xc0, 0xd0, 0xfe, 0x18, 0x9a, 0x8d, 0x79, 0x61, + 0xb7, 0xa5, 0xf6, 0x93, 0x65, 0x95, 0x38, 0x76, 0x36, 0x30, 0x97, 0xa3, 0xc6, 0x43, 0x70, 0x06, 0xeb, 0x07, 0x23, 0x5b, 0x0a, 0xc4, 0x96, 0xd9, 0xeb, 0x6a, 0x1e, 0x05, 0xae, 0xde, 0xcd, 0x7c, + 0xd3, 0x8c, 0xef, 0xdb, 0x61, 0x77, 0x90, 0xd2, 0xda, 0x30, 0xba, 0x48, 0x75, 0xb3, 0x1b, 0xa8, 0x8f, 0x42, 0xcf, 0xc1, 0x9f, 0xf8, 0x4b, 0x8c, 0x3e, 0x93, 0x3d, 0x32, 0xfa, 0xdc, 0xe8, 0x1e, + 0xa9, 0x3d, 0x67, 0xf4, 0xca, 0xb3, 0xd5, 0xb8, 0x08, 0x36, 0xbe, 0x26, 0x38, 0x3b, 0xda, 0x6e, 0x96, 0x84, 0xbc, 0xd3, 0x31, 0x79, 0xbb, 0x5a, 0xa2, 0xf8, 0x10, 0x74, 0xb9, 0x82, 0x5c, 0xb0, + 0xdb, 0x04, 0xd4, 0xf4, 0x6a, 0x86, 0x19, 0x0d, 0xe0, 0x80, 0x33, 0xdf, 0xc3, 0xcd, 0x70, 0x92, 0x78, 0x0d, 0xa4, 0x68, 0x09, 0xec, 0x63, 0x1b, 0x35, 0x91, 0xc3, 0x74, 0xad, 0x55, 0x9b, 0xe9, + 0x46, 0xa8, 0x87, 0xc8, 0x10, 0x25, 0x7e, 0xb3, 0xdb, 0xb6, 0x8e, 0x17, 0xb8, 0xf8, 0xdc, 0xf3, 0x2e, 0xc5, 0x23, 0xd6, 0x62, 0x3f, 0xa1, 0xde, 0x6f, 0xf0, 0xf6, 0x4c, 0xff, 0x9a, 0xc7, 0xef, + 0x27, 0xbb, 0x27, 0xf2, 0xcf, 0x99, 0xbd, 0x89, 0xc2, 0x80, 0x68, 0xa6, 0xfd, 0xf1, 0xa4, 0xa1, 0x59, 0xc9, 0xa0, 0x3b, 0xb9, 0x93, 0xcd, 0xd4, 0x14, 0xdc, 0xc9, 0x45, 0x7f, 0xdc, 0xc8, 0xe5, + 0x5e, 0xa9, 0x7c, 0x5a, 0x25, 0x89, 0xda, 0x05, 0x04, 0xc3, 0x2b, 0x89, 0xa5, 0x1b, 0xc3, 0x7a, 0xbd, 0xd6, 0x78, 0x0f, 0x8b, 0x40, 0x7d, 0x38, 0x13, 0xd1, 0xc1, 0x7a, 0x57, 0x2c, 0x2b, 0x0d, + 0x61, 0x19, 0xa6, 0x5e, 0xed, 0x61, 0x86, 0x0d, 0xd9, 0x67, 0xae, 0xad, 0xc7, 0x1d, 0xfd, 0x7d, 0x3f, 0xee, 0x3d, 0xe6, 0xf0, 0x4e, 0x3f, 0xbf, 0xea, 0xb2, 0xe7, 0x8c, 0xad, 0x16, 0x62, 0x89, + 0x53, 0x37, 0xcc, 0xad, 0xae, 0x97, 0x7d, 0xb1, 0xb6, 0x7b, 0xc1, 0xec, 0xfc, 0x20, 0x7b, 0x90, 0xc2, 0x47, 0xe3, 0xb8, 0xae, 0x7b, 0x62, 0x74, 0x42, 0x5d, 0x7a, 0xaa, 0x2e, 0x34, 0x58, 0x8e, + 0xfc, 0xe5, 0x7a, 0x36, 0x33, 0xa8, 0xf5, 0x98, 0x91, 0x9b, 0x62, 0xa8, 0xc7, 0x96, 0x5b, 0x7d, 0xd7, 0x6c, 0x3c, 0xc5, 0x09, 0x67, 0x6e, 0xe0, 0xfa, 0xea, 0xfb, 0x33, 0x1e, 0x99, 0x3f, 0x2f, + 0x2c, 0x60, 0x6f, 0xa9, 0x1f, 0xbe, 0xf5, 0xf6, 0x5c, 0xdb, 0x94, 0x47, 0x20, 0x01, 0x48, 0x09, 0xa5, 0x7d, 0x54, 0xe1, 0xa8, 0x99, 0xe7, 0x91, 0x1b, 0x33, 0x1d, 0xd3, 0x93, 0x0d, 0xc5, 0x73, + 0x3b, 0x75, 0x36, 0xb7, 0xd2, 0xd2, 0xb1, 0x86, 0xe4, 0x0e, 0xa0, 0x61, 0xc4, 0x45, 0xc3, 0x26, 0xf5, 0xe7, 0x1e, 0x0c, 0xd8, 0x11, 0x14, 0xf4, 0xc0, 0x71, 0x48, 0x84, 0x2c, 0x80, 0x6c, 0x99, + 0x85, 0x36, 0x8d, 0xc0, 0x4e, 0x5c, 0xe0, 0xf3, 0xb2, 0xbf, 0x14, 0x7a, 0x73, 0xf6, 0x88, 0x83, 0xff, 0x94, 0x3b, 0xc7, 0x59, 0xf4, 0xa1, 0x37, 0xeb, 0x95, 0x75, 0xdd, 0x25, 0xe1, 0x5f, 0x3c, + 0x39, 0xcd, 0xd6, 0x2d, 0x71, 0x0f, 0xc2, 0x69, 0x32, 0xc2, 0x7a, 0x86, 0xd9, 0x4f, 0x7a, 0x8b, 0xf9, 0xc8, 0xdf, 0x27, 0x10, 0x55, 0x91, 0xd8, 0x24, 0xcc, 0xd1, 0x0a, 0xe7, 0x4a, 0x9e, 0x4b, + 0x36, 0x6b, 0x77, 0x87, 0x47, 0x54, 0x4f, 0xd9, 0xf9, 0x5b, 0x5e, 0x1c, 0x4f, 0xfd, 0xc4, 0x46, 0x87, 0x70, 0x9d, 0x2e, 0x21, 0x61, 0xad, 0x2e, 0x3d, 0x2a, 0x29, 0xd7, 0x95, 0x61, 0x99, 0x0a, + 0x51, 0x11, 0x6a, 0xbf, 0x9c, 0x30, 0x44, 0x61, 0xdf, 0xe6, 0x07, 0x3c, 0x1a, 0x6b, 0x5f, 0x59, 0x71, 0x9f, 0x4c, 0xbe, 0x53, 0x4a, 0xe3, 0xbb, 0x69, 0x7d, 0x36, 0x1a, 0xcf, 0xe3, 0xae, 0xad, + 0x16, 0x6d, 0x13, 0xc2, 0x77, 0xe2, 0xe2, 0x45, 0x12, 0x5b, 0x9e, 0xba, 0x8f, 0xed, 0x80, 0x57, 0x42, 0x1f, 0xef, 0x3e, 0xe1, 0x43, 0x7e, 0x37, 0xe7, 0x8f, 0x71, 0x2c, 0x2d, 0xc2, 0x94, 0x34, + 0xac, 0x4e, 0x35, 0x1f, 0xa1, 0xb7, 0x63, 0x6f, 0xa4, 0x16, 0xbd, 0x59, 0xba, 0x23, 0x56, 0xe0, 0x7c, 0x2e, 0xeb, 0x2b, 0xd9, 0x10, 0xd1, 0x8a, 0x5d, 0xac, 0xd5, 0x24, 0xa2, 0xa5, 0x05, 0x06, + 0xf6, 0xfb, 0x03, 0x84, 0xa3, 0x0b, 0x79, 0x05, 0x2e, 0xe5, 0xb9, 0x38, 0x1b, 0xf6, 0x67, 0x84, 0xba, 0x8e, 0x44, 0x61, 0x4b, 0x12, 0x23, 0x6e, 0xe9, 0x18, 0xc2, 0x7c, 0x3d, 0x9e, 0x21, 0xb6, + 0xab, 0xfb, 0xdc, 0xb3, 0x49, 0xeb, 0xaf, 0xc8, 0x9e, 0xfb, 0xa8, 0x68, 0xf7, 0x7d, 0xf1, 0xfe, 0x8b, 0xb2, 0xe7, 0xee, 0xca, 0xcd, 0x7c, 0xe8, 0xb9, 0x7e, 0xd1, 0x8b, 0xf7, 0xe0, 0x21, 0x8f, + 0xfa, 0x8d, 0x19, 0x1a, 0x6d, 0xbd, 0x7b, 0x75, 0x6f, 0xdf, 0xf7, 0x2a, 0x68, 0x06, 0x23, 0x54, 0xb5, 0x23, 0x07, 0xe5, 0x32, 0xd6, 0x6b, 0x1e, 0x16, 0xc7, 0x29, 0xe4, 0x11, 0xd5, 0x04, 0xe9, + 0x59, 0x9d, 0x1d, 0xee, 0x97, 0xf3, 0x70, 0x21, 0x34, 0x9d, 0xa0, 0xe9, 0xf5, 0xd9, 0xa6, 0x27, 0xca, 0x33, 0xd3, 0x67, 0x76, 0x28, 0xbc, 0x9b, 0x36, 0x78, 0x27, 0xf1, 0xc9, 0xbd, 0x67, 0x71, + 0x64, 0x24, 0x37, 0x35, 0xe2, 0x51, 0x33, 0x4c, 0x5a, 0x61, 0x2d, 0x8b, 0xdb, 0x7c, 0xf6, 0xee, 0x5d, 0xb9, 0xee, 0xbe, 0xea, 0x46, 0xff, 0x43, 0x04, 0x9d, 0xe5, 0xea, 0x43, 0x1b, 0xeb, 0x0f, + 0x8a, 0xfa, 0xf8, 0x98, 0x47, 0xc2, 0x3e, 0x5e, 0x6c, 0x2b, 0x6e, 0xcf, 0xc1, 0xcd, 0x1e, 0x89, 0x4e, 0x69, 0xab, 0xdc, 0x2f, 0x30, 0x30, 0x37, 0x64, 0x38, 0x9c, 0x2b, 0x61, 0xd4, 0xc7, 0x80, + 0x80, 0x1f, 0x72, 0xd3, 0xf9, 0x40, 0xb2, 0x2a, 0x32, 0xc7, 0xea, 0x3a, 0xdf, 0x45, 0xab, 0x6c, 0x32, 0x17, 0xf7, 0xe5, 0x18, 0x18, 0x20, 0xbd, 0xa4, 0x80, 0x32, 0x06, 0x9c, 0xe6, 0x9b, 0x31, + 0x32, 0xed, 0x83, 0x5b, 0x9b, 0x5b, 0x04, 0xfa, 0xa6, 0x6a, 0xdc, 0x4a, 0x2e, 0x94, 0x96, 0x2a, 0xff, 0xff, 0x73, 0xe2, 0x8e, 0xff, 0x02, 0x6f, 0xce, 0x07, 0xd9, 0x77, 0x71, 0xc6, 0xad, 0xbd, + 0x39, 0x50, 0x37, 0x19, 0x98, 0xd2, 0xb8, 0xc8, 0xd4, 0x0a, 0x76, 0x23, 0x7d, 0xe9, 0x6a, 0x32, 0x34, 0x71, 0xf7, 0xd2, 0xb6, 0x10, 0x23, 0xb2, 0x95, 0x00, 0x8e, 0x4f, 0xfa, 0xdd, 0x5d, 0xa2, + 0xb6, 0xd3, 0xe8, 0x67, 0x08, 0x82, 0xfb, 0xb6, 0xcf, 0x2b, 0xd0, 0x45, 0x77, 0xe8, 0x7f, 0xb0, 0xf3, 0xea, 0x6c, 0x1b, 0x60, 0x23, 0xa8, 0x3b, 0x1b, 0x0a, 0x8a, 0x54, 0xec, 0xc6, 0x55, 0xe0, + 0x93, 0x4c, 0x26, 0x0e, 0x1c, 0xb9, 0x8a, 0xb4, 0x51, 0x6d, 0xc7, 0x76, 0xf4, 0xdf, 0xb4, 0x6e, 0x2b, 0x62, 0x33, 0x55, 0xed, 0xc7, 0x70, 0x85, 0xc8, 0x4f, 0xf2, 0x95, 0x05, 0xc2, 0x07, 0xd9, + 0x53, 0x61, 0xfd, 0xf7, 0x46, 0xf7, 0x48, 0xed, 0xb9, 0xae, 0x60, 0x79, 0x29, 0xe7, 0x85, 0x7e, 0x34, 0x18, 0x73, 0xa8, 0xc9, 0x94, 0xf8, 0x94, 0xcd, 0x77, 0xd3, 0x68, 0x21, 0xe4, 0x08, 0xd3, + 0x89, 0x12, 0xb0, 0x46, 0x8c, 0x6c, 0x2f, 0x14, 0x72, 0xc1, 0x94, 0xaa, 0xb8, 0x2a, 0x8b, 0x25, 0x69, 0x0e, 0xe9, 0x82, 0x0f, 0xac, 0x39, 0xe8, 0xca, 0x72, 0x33, 0xea, 0x43, 0x26, 0xe9, 0xc4, + 0x4d, 0x1f, 0x57, 0xb2, 0xbd, 0x56, 0xcc, 0x70, 0x66, 0xac, 0xfa, 0xc2, 0xf0, 0xd9, 0x66, 0xda, 0x17, 0xea, 0x23, 0x0a, 0xe2, 0x28, 0x3c, 0xbc, 0xbf, 0x19, 0xb8, 0x79, 0x6e, 0x9e, 0xdd, 0x0d, + 0x37, 0xf0, 0x17, 0xa7, 0x9d, 0x6e, 0x4f, 0x3d, 0x5d, 0x86, 0x6f, 0xc1, 0xca, 0x0c, 0x53, 0x2b, 0xce, 0x75, 0xf9, 0x6f, 0x2e, 0x5d, 0x60, 0x71, 0x7c, 0x46, 0x96, 0x8f, 0xd2, 0xa0, 0x6b, 0xa8, + 0xb9, 0xfa, 0x4e, 0x15, 0xb9, 0x2e, 0xc3, 0x76, 0xb8, 0xec, 0x1a, 0xef, 0xe5, 0xd4, 0xee, 0xbc, 0x54, 0x60, 0xe6, 0x4e, 0x64, 0xfc, 0xd2, 0x68, 0x57, 0x3f, 0x0e, 0xdc, 0xe0, 0xfc, 0xb3, 0x9b, + 0xea, 0x6e, 0xc9, 0xe9, 0x17, 0xf8, 0x55, 0xe5, 0xf3, 0xa3, 0xfc, 0xd5, 0xe3, 0xc3, 0xba, 0x17, 0xb0, 0x6c, 0xf0, 0x31, 0xc4, 0xeb, 0xbb, 0xa3, 0xf9, 0xad, 0x1d, 0xa0, 0xe6, 0x45, 0x4f, 0xba, + 0x3a, 0xff, 0xf9, 0x45, 0xee, 0x0f, 0x72, 0xe4, 0x05, 0xbc, 0xc7, 0x1b, 0xda, 0xef, 0x50, 0x20, 0x17, 0x67, 0x8e, 0x58, 0xd6, 0x2d, 0x90, 0x1f, 0x07, 0x9a, 0x13, 0x91, 0x1c, 0xea, 0x8d, 0xb5, + 0x11, 0xb5, 0x0f, 0x8b, 0xbd, 0x4b, 0x44, 0x28, 0x3c, 0x4d, 0x15, 0x7b, 0x08, 0x28, 0x4b, 0x51, 0xcf, 0x14, 0x0f, 0x0f, 0xe7, 0x5c, 0xbd, 0x0a, 0x76, 0x0e, 0x3f, 0x4c, 0xc8, 0xfe, 0x68, 0x9c, + 0xc7, 0x80, 0x55, 0xe3, 0x8e, 0xa4, 0x14, 0x4a, 0x30, 0x03, 0x42, 0xa4, 0x56, 0x7a, 0x6b, 0x7a, 0xa5, 0xc5, 0x68, 0xd3, 0x00, 0xc1, 0x96, 0x74, 0x02, 0x79, 0xf6, 0xba, 0x97, 0x41, 0x8f, 0x52, + 0xb3, 0x5b, 0xe4, 0xae, 0xff, 0x5e, 0x0e, 0xf2, 0x9f, 0x9f, 0xdc, 0x0c, 0x6e, 0xe8, 0x98, 0xa9, 0x7b, 0x01, 0xdb, 0x72, 0x65, 0x36, 0xbb, 0x99, 0x9a, 0xa6, 0x6a, 0x7d, 0xff, 0xa7, 0x0f, 0xc0, + 0x76, 0x4f, 0x64, 0xae, 0xd7, 0x54, 0x57, 0x71, 0xce, 0x3f, 0xfe, 0x89, 0xdd, 0x76, 0xcb, 0x93, 0xb1, 0xf1, 0xff, 0x18, 0xe6, 0x61, 0x75, 0x96, 0xbe, 0x3f, 0xee, 0xe6, 0x9e, 0xe3, 0x67, 0x18, + 0x66, 0x9c, 0x9a, 0xba, 0x7a, 0xac, 0x85, 0x74, 0x7a, 0xa5, 0x56, 0x4e, 0xef, 0x07, 0x5d, 0xaa, 0x4d, 0xfc, 0xf5, 0x2b, 0x05, 0x6a, 0xbf, 0x8a, 0xbf, 0x6e, 0x55, 0x9c, 0x96, 0x35, 0xe0, 0x95, + 0x42, 0x4f, 0x98, 0xdd, 0xd6, 0x97, 0x09, 0x56, 0x9b, 0xec, 0xad, 0x6c, 0x40, 0x02, 0x61, 0xc9, 0xed, 0x56, 0x83, 0x15, 0xc4, 0x22, 0xa4, 0x0e, 0x65, 0xae, 0x88, 0x4b, 0x33, 0x5c, 0xed, 0xcd, + 0x96, 0x3d, 0x21, 0x18, 0xd1, 0x24, 0x1b, 0xc6, 0x99, 0xbe, 0x08, 0x84, 0xc9, 0x22, 0x1a, 0x92, 0xfc, 0x74, 0x9c, 0xe6, 0x64, 0x61, 0x00, 0xd5, 0x2c, 0x8f, 0xbc, 0x3a, 0x43, 0x59, 0xfc, 0x51, + 0xc1, 0xab, 0x17, 0xd8, 0x76, 0x2b, 0xad, 0xfb, 0x26, 0xe9, 0xeb, 0x9e, 0x86, 0x33, 0xe9, 0x0f, 0x33, 0xf4, 0x7c, 0xa2, 0x6d, 0x89, 0xed, 0x10, 0x58, 0x38, 0x61, 0xc9, 0xb8, 0xf8, 0x70, 0xa4, + 0x69, 0x6b, 0xab, 0x74, 0xd3, 0xa8, 0xb3, 0x89, 0x3c, 0x77, 0xd8, 0x94, 0x9d, 0x8c, 0x14, 0x66, 0xc2, 0x88, 0xd6, 0x9b, 0xb5, 0x39, 0xb3, 0x56, 0x31, 0x33, 0xe1, 0xab, 0x88, 0x5f, 0x82, 0x4e, + 0x0e, 0xf9, 0xa8, 0x5c, 0xd1, 0x7d, 0xcd, 0x25, 0xe3, 0x09, 0x55, 0x9a, 0x83, 0x81, 0x11, 0xee, 0x46, 0xf5, 0xac, 0x5e, 0xce, 0x80, 0xa0, 0x99, 0x5b, 0xd5, 0xeb, 0x8b, 0xd4, 0x7b, 0xfd, 0xbf, + 0xb5, 0x2a, 0xcc, 0x4f, 0x30, 0xba, 0x8f, 0xec, 0xc2, 0x17, 0x7a, 0xe7, 0x99, 0xea, 0x79, 0xa6, 0x3e, 0x1c, 0x1f, 0xad, 0xc2, 0x16, 0x3d, 0x13, 0xa2, 0x29, 0xad, 0x4c, 0xa7, 0x4a, 0xc6, 0x52, + 0x88, 0xbc, 0xec, 0x6f, 0x12, 0x2d, 0x70, 0x20, 0x94, 0x07, 0xe5, 0x41, 0x02, 0x0e, 0xd8, 0x71, 0x7f, 0x0b, 0x84, 0x74, 0x68, 0xed, 0xac, 0xf5, 0x24, 0x24, 0x16, 0xe9, 0x5e, 0x5a, 0x43, 0x63, + 0x24, 0x16, 0x64, 0x6f, 0xd1, 0xb0, 0xbd, 0x1a, 0x20, 0x94, 0x15, 0xbc, 0xee, 0x19, 0x9b, 0xa4, 0x4e, 0x76, 0xf0, 0x6c, 0x5a, 0xed, 0x7d, 0x0d, 0xec, 0x19, 0xb7, 0x55, 0xb7, 0xbf, 0xc1, 0xd9, + 0xdb, 0xc9, 0xee, 0xca, 0xca, 0xbf, 0x32, 0x75, 0x0e, 0x13, 0x2d, 0xf9, 0x42, 0xad, 0xd9, 0xb6, 0xe0, 0x1c, 0xef, 0xfe, 0xe8, 0xac, 0xab, 0x47, 0xfe, 0xc3, 0xea, 0xc4, 0xc4, 0x4b, 0xd9, 0x47, + 0xd7, 0xa4, 0x4f, 0x52, 0xbb, 0x38, 0xd1, 0x25, 0xda, 0x65, 0x20, 0x25, 0x71, 0x9f, 0x2a, 0xe7, 0x7e, 0x2f, 0xcb, 0x8b, 0xe9, 0xa8, 0x34, 0xb9, 0x2c, 0x24, 0x46, 0xa1, 0x3e, 0x99, 0x97, 0x25, + 0x06, 0x42, 0xc9, 0x58, 0xd5, 0xb9, 0x46, 0xf2, 0xa7, 0x40, 0x87, 0xaf, 0xf6, 0x7a, 0xaf, 0x03, 0x26, 0x70, 0xc5, 0xd7, 0x25, 0xca, 0x58, 0x65, 0x4e, 0x82, 0x00, 0x33, 0x0b, 0xe1, 0x38, 0x99, + 0xd2, 0xd9, 0xc4, 0x60, 0xdc, 0xc8, 0xde, 0xb2, 0xf3, 0x5e, 0x67, 0x5a, 0x56, 0xf3, 0x96, 0xeb, 0x31, 0x47, 0xcd, 0xba, 0x96, 0xaf, 0x9e, 0xac, 0xa1, 0xd7, 0x7c, 0x6a, 0x6d, 0x36, 0xd4, 0xf2, + 0x2f, 0xaa, 0xcc, 0xe2, 0x3f, 0x89, 0x17, 0x14, 0x52, 0xfe, 0x5e, 0x5e, 0xf6, 0xf8, 0xbf, 0x7b, 0xa4, 0xf1, 0x9c, 0xd3, 0x0a, 0x5b, 0x04, 0x28, 0x21, 0xbb, 0x38, 0x37, 0x9d, 0x0e, 0x99, 0x01, + 0x19, 0xc0, 0x30, 0x92, 0x1b, 0x18, 0xa2, 0xe6, 0x0e, 0x6c, 0x86, 0x23, 0x5d, 0xe6, 0xed, 0x69, 0xdf, 0x63, 0x53, 0x2c, 0xb4, 0x0b, 0x52, 0x33, 0xc6, 0xd4, 0x5c, 0xda, 0xe1, 0x81, 0x08, 0x54, + 0x73, 0xa1, 0x44, 0x6b, 0x61, 0xae, 0x8f, 0xc2, 0xfe, 0x22, 0x1c, 0x69, 0xfd, 0x81, 0xa3, 0xa2, 0x59, 0xa4, 0x49, 0x7b, 0xac, 0x7e, 0x5a, 0x4f, 0xea, 0x8b, 0xb5, 0x98, 0x57, 0x1e, 0xf9, 0x4e, + 0xde, 0xd6, 0x97, 0xf7, 0x23, 0x43, 0xcd, 0x9c, 0x9f, 0xba, 0x1f, 0x85, 0xa6, 0x71, 0xde, 0x71, 0x43, 0xaf, 0x50, 0xd4, 0x7e, 0xdd, 0x95, 0xa7, 0x45, 0x78, 0x9e, 0x79, 0x8f, 0xc5, 0x81, 0xaf, + 0xc7, 0xda, 0x65, 0x44, 0xc2, 0x9d, 0xbd, 0xf6, 0x1b, 0xdf, 0xf4, 0xe1, 0x8e, 0xbb, 0x58, 0x72, 0x1f, 0x14, 0x1e, 0xc4, 0xd3, 0x3f, 0xdd, 0x5e, 0x6f, 0x39, 0x5c, 0x4f, 0x72, 0xbd, 0x3a, 0x75, + 0x62, 0xd3, 0xbd, 0xae, 0x43, 0xbe, 0x94, 0xe5, 0xa1, 0x7a, 0x25, 0xd0, 0x3d, 0xfc, 0xed, 0x92, 0xed, 0x32, 0x39, 0x08, 0x89, 0x81, 0x7d, 0xbc, 0xc3, 0xd1, 0x0b, 0xbe, 0xb2, 0x3a, 0x84, 0x50, + 0xc8, 0x91, 0xae, 0x6d, 0xca, 0xf9, 0xcc, 0x98, 0x16, 0x38, 0x02, 0xe4, 0xe9, 0xdc, 0x5c, 0xf2, 0x05, 0xcc, 0x0d, 0xab, 0x9d, 0xad, 0xe7, 0x61, 0xa1, 0x41, 0x6a, 0x11, 0x0d, 0x3b, 0x32, 0xb4, + 0x91, 0xf5, 0x00, 0xec, 0xf5, 0x97, 0x02, 0x91, 0x14, 0x45, 0xa6, 0xa7, 0x4d, 0x12, 0x50, 0x0b, 0x95, 0x1f, 0xf5, 0x01, 0x0e, 0x7d, 0x5d, 0xb7, 0x9e, 0xea, 0x69, 0x1c, 0x91, 0x03, 0x93, 0x42, + 0xf5, 0x7f, 0x9c, 0x17, 0x32, 0x57, 0x5d, 0xe8, 0xb8, 0x04, 0xce, 0x74, 0xc7, 0x0c, 0xd4, 0x6e, 0x9e, 0xaa, 0x07, 0xa6, 0x9d, 0x17, 0x18, 0x37, 0x3d, 0xe0, 0x3e, 0xcc, 0xcc, 0xc9, 0x03, 0x7f, + 0xd5, 0x95, 0x8a, 0xd4, 0x3d, 0x6d, 0x5f, 0x9d, 0x3a, 0xc9, 0x9d, 0x22, 0x1e, 0x77, 0x3d, 0x32, 0x0f, 0x13, 0xc6, 0xda, 0xf8, 0x6a, 0xcc, 0x38, 0xd2, 0xcc, 0xd4, 0x6c, 0x76, 0x6e, 0xf8, 0x62, + 0xe7, 0xb9, 0xf4, 0x77, 0xdc, 0xb7, 0x24, 0x5f, 0xf1, 0xe1, 0xfc, 0x22, 0x7b, 0xe8, 0x4a, 0x1f, 0x8d, 0x2e, 0xf6, 0xdc, 0x87, 0x73, 0x74, 0xd6, 0xcb, 0xb8, 0xe5, 0x61, 0xf8, 0x74, 0x25, 0x81, + 0xce, 0x0a, 0xe2, 0xbc, 0xa1, 0xc8, 0x48, 0xc5, 0x64, 0x68, 0x36, 0x09, 0x67, 0xa4, 0x54, 0x3d, 0x34, 0xc6, 0x66, 0x49, 0x31, 0x6e, 0x92, 0x6e, 0x46, 0xd5, 0xc2, 0xd7, 0x02, 0x5a, 0x14, 0x46, + 0x31, 0xa6, 0xee, 0x60, 0x0b, 0x05, 0x67, 0x01, 0x39, 0x59, 0x0e, 0x6b, 0x01, 0x0e, 0x92, 0xfd, 0x8e, 0xc5, 0x43, 0x7b, 0x37, 0x9a, 0x42, 0x90, 0x05, 0xf8, 0xcf, 0x14, 0xd1, 0x9f, 0xd2, 0xe3, + 0xd7, 0x0c, 0x36, 0x83, 0xc8, 0xfb, 0x9a, 0xc3, 0xe4, 0x4b, 0x1c, 0xbe, 0xa0, 0x0b, 0x74, 0x2f, 0x5b, 0x5d, 0xb2, 0x1d, 0x8f, 0x85, 0x85, 0x27, 0x37, 0xfa, 0x46, 0x9c, 0x52, 0xa0, 0x59, 0x51, + 0xa3, 0xb8, 0x01, 0x85, 0x7d, 0x2c, 0x0f, 0xcb, 0xca, 0xc6, 0x6b, 0xaf, 0x86, 0x44, 0x16, 0xd9, 0xe7, 0x66, 0x94, 0x34, 0x38, 0x8a, 0xae, 0xfb, 0x11, 0x30, 0x9f, 0xd9, 0x61, 0x0a, 0x01, 0x2c, + 0x9b, 0x77, 0x5c, 0x1d, 0x71, 0x27, 0xcb, 0x46, 0x22, 0x07, 0x05, 0xb2, 0x34, 0x04, 0x08, 0x5d, 0xa8, 0x55, 0xb8, 0x5e, 0x05, 0xec, 0x00, 0xff, 0x76, 0x40, 0xdd, 0x1d, 0x8e, 0xfd, 0x1d, 0xd2, + 0xf3, 0x2f, 0x08, 0xe9, 0xb9, 0x23, 0x87, 0x07, 0x2a, 0xf2, 0xfe, 0xa2, 0xe9, 0x15, 0x21, 0xdc, 0x7b, 0x00, 0xd0, 0xbd, 0x7b, 0xba, 0x6d, 0x69, 0x27, 0x51, 0x20, 0x81, 0x59, 0x2f, 0x44, 0xb6, + 0xde, 0xd6, 0x19, 0x2b, 0x21, 0xe4, 0xf3, 0xce, 0x6e, 0xa8, 0x52, 0xfd, 0xe5, 0x74, 0x35, 0x97, 0xb6, 0xde, 0xc6, 0x59, 0xa3, 0x34, 0x05, 0xcc, 0xc3, 0x69, 0x49, 0xee, 0x4b, 0x3b, 0xc9, 0x93, + 0x98, 0xda, 0xf6, 0xc6, 0x53, 0x34, 0x98, 0x4b, 0xfb, 0xc5, 0x1e, 0x9a, 0xfb, 0x11, 0x9a, 0x27, 0x8d, 0x99, 0x68, 0x60, 0x36, 0xf5, 0xd3, 0x42, 0x9d, 0xd6, 0x88, 0x51, 0x7c, 0x7b, 0x01, 0x7a, + 0x87, 0x99, 0x2d, 0xf6, 0xb8, 0xd1, 0xdf, 0xd8, 0x2c, 0xbd, 0xbf, 0xc7, 0x8d, 0xb6, 0xdb, 0x1a, 0xdd, 0xd2, 0x13, 0x6d, 0x89, 0x88, 0xe8, 0xc4, 0x59, 0x17, 0xc1, 0x76, 0x00, 0x9a, 0x11, 0xbf, + 0xea, 0x31, 0x7d, 0x4f, 0x57, 0x87, 0x3d, 0x98, 0xe3, 0xc5, 0x64, 0x19, 0x0c, 0xfb, 0x21, 0x0b, 0xc5, 0x16, 0x69, 0x14, 0xab, 0xfd, 0x90, 0xad, 0xf2, 0x19, 0x4e, 0x31, 0x78, 0xb8, 0xf3, 0xaa, + 0x9e, 0x8a, 0x8c, 0x0d, 0x77, 0x9e, 0xf3, 0xc8, 0x00, 0xae, 0x90, 0x09, 0xe3, 0x0e, 0x80, 0xbd, 0x8b, 0x94, 0x53, 0xf3, 0x75, 0x27, 0xe6, 0xb5, 0xc6, 0x3c, 0x99, 0x7f, 0xdf, 0x8c, 0x6e, 0xbc, + 0xb8, 0xf9, 0x8f, 0x98, 0x67, 0x2f, 0x8e, 0xa0, 0xa7, 0x1b, 0x24, 0xf8, 0x4b, 0xe3, 0xe6, 0xd1, 0x06, 0x09, 0xde, 0x6e, 0x8c, 0x50, 0x45, 0xc9, 0x2d, 0xd3, 0xa5, 0x25, 0x89, 0xb2, 0x38, 0xd6, + 0x73, 0x6d, 0x0e, 0x71, 0x80, 0xcc, 0x2e, 0xe7, 0x10, 0x81, 0xe1, 0x6c, 0xad, 0xcf, 0x32, 0x9b, 0xd0, 0x7a, 0x9a, 0xb1, 0xee, 0x31, 0x45, 0x52, 0xa4, 0xa8, 0x5d, 0xe2, 0x2a, 0x97, 0x8c, 0xb6, + 0xaa, 0x83, 0x13, 0x0a, 0x39, 0x0e, 0x16, 0xc4, 0x66, 0xd0, 0x60, 0xd2, 0x5a, 0x9f, 0xe6, 0xbe, 0xb5, 0x81, 0x53, 0x65, 0x50, 0xd8, 0xf9, 0x6d, 0x79, 0x9d, 0x6f, 0x88, 0xfb, 0x66, 0xc7, 0x05, + 0xfb, 0x0b, 0x05, 0xf4, 0x45, 0x19, 0xe4, 0x97, 0x8a, 0xc3, 0x1e, 0x28, 0x1e, 0xd7, 0x58, 0xc7, 0xea, 0xc7, 0xed, 0x8a, 0xc3, 0x82, 0x80, 0x0c, 0x83, 0xb3, 0x6a, 0x3e, 0x5e, 0xed, 0x24, 0x7d, + 0xd9, 0x5f, 0xb8, 0x28, 0x45, 0x2d, 0xb2, 0xce, 0x94, 0x12, 0x15, 0xa5, 0x4a, 0x66, 0x9c, 0xea, 0xc6, 0x6c, 0x7f, 0x50, 0xc5, 0x10, 0x68, 0x48, 0x82, 0x1b, 0xaf, 0xcb, 0x85, 0x52, 0xad, 0x56, + 0x7d, 0x17, 0x84, 0x64, 0x60, 0xba, 0xf3, 0xc7, 0x6c, 0x3d, 0xe2, 0x86, 0xce, 0x58, 0xf7, 0x22, 0x7d, 0xd7, 0x61, 0xb8, 0x90, 0xb6, 0x78, 0x6a, 0xf8, 0x3a, 0xf7, 0xaf, 0xed, 0xe4, 0xcf, 0xde, + 0xcb, 0xd3, 0x8e, 0xa3, 0xf1, 0xe3, 0xae, 0x27, 0xd5, 0x88, 0x72, 0xd7, 0x0e, 0x4f, 0x39, 0x8b, 0x3f, 0xfe, 0x09, 0xde, 0xfa, 0x31, 0xac, 0x28, 0xed, 0x9a, 0xea, 0x09, 0xd6, 0xf9, 0x9f, 0xe0, + 0x4f, 0xe4, 0xda, 0x47, 0x6b, 0x15, 0xa1, 0x9e, 0xbb, 0x51, 0xf8, 0xb1, 0xdd, 0xf9, 0xf9, 0xe1, 0x67, 0x2c, 0x97, 0x7f, 0x1e, 0x56, 0xaf, 0xf8, 0xe5, 0x15, 0x47, 0xfd, 0xe5, 0x17, 0xbe, 0xf6, + 0xfc, 0xde, 0xfa, 0x85, 0xd1, 0x1b, 0xcd, 0xf1, 0xd1, 0xd3, 0x8e, 0xbf, 0xc5, 0x2e, 0xaf, 0x5e, 0x62, 0x86, 0xff, 0x13, 0xfa, 0x09, 0x5f, 0x5f, 0xfd, 0x9c, 0x25, 0xf3, 0x4f, 0xe8, 0x27, 0x71, + 0xbb, 0x56, 0x38, 0xf6, 0x9b, 0xf3, 0xd7, 0x7c, 0xbe, 0xfa, 0x0e, 0x9a, 0x76, 0x60, 0xc7, 0xdd, 0x85, 0xe6, 0xe7, 0xb0, 0x9a, 0xd3, 0x9b, 0x5c, 0xb1, 0xe5, 0x16, 0x9e, 0xec, 0x0e, 0x52, 0xe8, + 0xa7, 0xdc, 0xd4, 0xf7, 0xce, 0x7f, 0xcc, 0x4c, 0x3d, 0x1e, 0xb7, 0x18, 0x2f, 0x1f, 0xa5, 0xb0, 0xee, 0x0d, 0x19, 0xf0, 0x25, 0x3f, 0xe9, 0x3b, 0xcd, 0xc3, 0xa0, 0x39, 0x1d, 0x75, 0xc1, 0xe7, + 0x9e, 0x51, 0xa8, 0xcb, 0x7b, 0x75, 0x5d, 0x61, 0xf8, 0x6e, 0x61, 0xae, 0x8d, 0x51, 0xd0, 0x28, 0x83, 0xb9, 0x99, 0x35, 0xdc, 0x5c, 0xb6, 0xfb, 0x83, 0x56, 0x6e, 0x1c, 0xcd, 0x0d, 0xf3, 0xd4, + 0x3c, 0x6d, 0x97, 0xb7, 0x75, 0xbe, 0xe7, 0x66, 0x1a, 0x74, 0x33, 0xb7, 0x79, 0xa4, 0x33, 0xe0, 0x97, 0x7c, 0x62, 0x1f, 0x54, 0x0f, 0x2c, 0x38, 0x1f, 0x1f, 0xeb, 0x7d, 0xb7, 0xd0, 0xdc, 0x2a, + 0x9e, 0x15, 0x01, 0xe3, 0x37, 0xf5, 0x68, 0x3d, 0xd9, 0x68, 0x64, 0x47, 0x8e, 0x2c, 0x19, 0x5d, 0x6e, 0x20, 0x08, 0x66, 0xf1, 0x18, 0x1e, 0xf6, 0x67, 0x03, 0x6a, 0xb8, 0xeb, 0x60, 0x3d, 0x7b, + 0x2c, 0x8f, 0x4a, 0x64, 0x3b, 0x9a, 0x3b, 0x41, 0xcf, 0xcf, 0xd7, 0x52, 0x6f, 0xe7, 0xbb, 0xa8, 0x23, 0x6e, 0x4c, 0x89, 0xae, 0x16, 0xb1, 0x49, 0xea, 0x73, 0x11, 0xc6, 0xf6, 0xe0, 0x7c, 0x5a, + 0x84, 0xc2, 0x53, 0x74, 0xfe, 0xd6, 0x9a, 0xf7, 0xe3, 0x17, 0xaf, 0x06, 0x1e, 0x7c, 0xb3, 0x68, 0x62, 0x6e, 0xee, 0xf3, 0xee, 0x57, 0x9e, 0x33, 0xf0, 0x45, 0x09, 0x9d, 0xc9, 0x1e, 0x45, 0x74, + 0x6e, 0x1c, 0x61, 0xf8, 0x9e, 0x86, 0x1f, 0x58, 0x10, 0x11, 0x8d, 0x71, 0x9c, 0x5a, 0xd9, 0x16, 0xd5, 0x2f, 0x79, 0x6b, 0x11, 0x2d, 0xb3, 0x19, 0xd9, 0xf1, 0x75, 0x5e, 0xfa, 0xae, 0x0d, 0xf9, + 0x31, 0xc8, 0xef, 0x77, 0x3e, 0xe4, 0x85, 0xcc, 0xe7, 0x77, 0x9a, 0x87, 0xef, 0x3a, 0x1d, 0x1d, 0xb7, 0x07, 0x9f, 0x64, 0x39, 0x43, 0x5d, 0xc6, 0x58, 0x4e, 0x00, 0x3c, 0x21, 0xc5, 0xad, 0x6f, + 0x67, 0x9a, 0xbe, 0x1b, 0xac, 0xa1, 0x0e, 0x13, 0xa9, 0x2e, 0x6a, 0xad, 0xbe, 0xfb, 0x51, 0x6e, 0x60, 0x66, 0x5f, 0x21, 0xf5, 0xbe, 0x66, 0x10, 0xfd, 0x22, 0x7b, 0xf8, 0xb4, 0x8f, 0x46, 0x5b, + 0x83, 0xa8, 0x12, 0xf4, 0x3c, 0xdd, 0x30, 0xf0, 0x48, 0x51, 0xf8, 0x62, 0xec, 0xeb, 0x8e, 0xbf, 0x1b, 0xc0, 0x86, 0xb5, 0x9d, 0x38, 0xc4, 0x04, 0xe6, 0x98, 0x71, 0x8f, 0xa9, 0xfc, 0x0e, 0xac, + 0x6a, 0x33, 0xd9, 0x06, 0x83, 0xac, 0x92, 0x46, 0xd6, 0x94, 0xaa, 0xa5, 0x0d, 0xe2, 0x4d, 0x6c, 0x28, 0x96, 0xb1, 0xb5, 0x95, 0xe7, 0x8b, 0xb1, 0xa8, 0x14, 0x9c, 0xbe, 0x8d, 0x68, 0x64, 0xc8, + 0xd6, 0xf1, 0x7a, 0xe7, 0x7f, 0xa7, 0xb6, 0x55, 0x2b, 0xeb, 0xc5, 0x0d, 0xeb, 0xae, 0x9f, 0x16, 0x0f, 0x18, 0x47, 0x1c, 0x41, 0x68, 0xbf, 0xcf, 0xb8, 0x13, 0xd1, 0x23, 0xdb, 0x4e, 0x87, 0xdd, + 0x23, 0xa5, 0xe7, 0x4c, 0x6b, 0x44, 0x79, 0x0a, 0x72, 0xa5, 0x1d, 0x62, 0xe9, 0xb6, 0xd9, 0xc4, 0x3c, 0x58, 0x23, 0xf3, 0x05, 0xd8, 0xcb, 0x04, 0x0e, 0x27, 0x4c, 0x56, 0x95, 0xbc, 0x1e, 0x09, + 0x62, 0x9e, 0xcf, 0xf5, 0x58, 0x3c, 0x5e, 0xa8, 0x86, 0x95, 0xba, 0x4b, 0xbd, 0x69, 0xf8, 0xd1, 0x70, 0xab, 0x02, 0x7b, 0x7d, 0x83, 0x06, 0xe3, 0xb9, 0x15, 0xf8, 0x74, 0x6f, 0x54, 0x4b, 0x40, + 0x67, 0x61, 0xf3, 0xe0, 0x1a, 0x2a, 0xa2, 0xe7, 0xe0, 0x81, 0x17, 0x1b, 0x1c, 0x6d, 0x98, 0x16, 0x75, 0xdb, 0x6d, 0xbf, 0xbf, 0xb6, 0x80, 0xfd, 0x4c, 0xfe, 0xc0, 0xc8, 0x4f, 0x27, 0xdb, 0x2e, + 0x5e, 0xc7, 0x09, 0x8c, 0x6d, 0xe9, 0x1c, 0x6f, 0x18, 0x2c, 0x8c, 0x67, 0x8e, 0xcf, 0xaf, 0xb7, 0xec, 0x50, 0x44, 0x00, 0xbb, 0x9e, 0xc3, 0x40, 0x32, 0x65, 0x74, 0x4e, 0x14, 0xeb, 0xa5, 0x60, + 0xa0, 0xa5, 0x16, 0x20, 0xbd, 0xd1, 0x4a, 0x9d, 0xba, 0x94, 0x80, 0xce, 0x84, 0x04, 0x34, 0x85, 0x75, 0x1f, 0x58, 0xee, 0xf6, 0x4d, 0x47, 0xf1, 0x8c, 0x4c, 0xc7, 0x30, 0xbb, 0x57, 0xd7, 0x4d, + 0x47, 0x4e, 0xc0, 0xdf, 0x05, 0xf6, 0x6f, 0xcd, 0x65, 0xdb, 0xdc, 0x77, 0x53, 0x35, 0xb4, 0x1f, 0x29, 0x63, 0xec, 0xa5, 0x28, 0xa6, 0x6b, 0xd2, 0x67, 0xee, 0x7e, 0x9c, 0x38, 0xfa, 0x13, 0x5b, + 0x6c, 0x6c, 0xe0, 0xd8, 0x8c, 0x70, 0x1b, 0x7c, 0x8b, 0xd5, 0x83, 0x14, 0xd2, 0x2b, 0xdd, 0x2e, 0xa5, 0xbd, 0xa6, 0x8d, 0x2b, 0x62, 0xb5, 0x43, 0xec, 0x69, 0x8d, 0x19, 0x63, 0x23, 0x57, 0xd0, + 0x94, 0x29, 0x4d, 0x3e, 0x71, 0x52, 0x63, 0x32, 0xeb, 0xf0, 0x2e, 0x30, 0xda, 0xe3, 0x79, 0xcd, 0x81, 0xe2, 0x40, 0xeb, 0xc0, 0x6c, 0xbf, 0x0e, 0xcd, 0xbe, 0x30, 0x71, 0xd9, 0x24, 0xa5, 0x98, + 0xfe, 0x42, 0xdc, 0x91, 0xd9, 0x33, 0xce, 0x7e, 0x19, 0xd8, 0x1d, 0x16, 0x81, 0xf6, 0x1e, 0x9e, 0x43, 0xbc, 0xb6, 0xe2, 0x69, 0xb7, 0x5d, 0x10, 0x15, 0xfa, 0xe3, 0x7c, 0xd5, 0x57, 0x90, 0xde, + 0x8f, 0x14, 0x8f, 0x82, 0x28, 0x74, 0xa7, 0x6d, 0xc9, 0x8a, 0x0d, 0xbd, 0x27, 0x57, 0x35, 0xb6, 0xe4, 0xf3, 0xe9, 0x62, 0x9e, 0x8f, 0x93, 0x8e, 0x00, 0x22, 0x40, 0xc6, 0x31, 0xe9, 0xb6, 0xcf, + 0x8f, 0xf6, 0x15, 0xa3, 0x27, 0xc5, 0x62, 0x06, 0xeb, 0x28, 0xc2, 0x9b, 0x20, 0x02, 0xf4, 0x32, 0x33, 0xf5, 0x24, 0x7a, 0xdc, 0xe4, 0xde, 0xbc, 0xc1, 0x87, 0xbb, 0x89, 0xd9, 0xf4, 0x18, 0xc0, + 0xf1, 0xcd, 0x9a, 0xda, 0x2e, 0x69, 0x96, 0xaf, 0x2a, 0x65, 0x55, 0xf5, 0xfc, 0xd7, 0x3d, 0x0c, 0x61, 0x14, 0x9f, 0x0d, 0xf8, 0xab, 0xa2, 0xa0, 0x1f, 0x3f, 0xfd, 0x64, 0x3e, 0x1f, 0x98, 0x7a, + 0xe6, 0xe5, 0xd1, 0x86, 0xfe, 0x38, 0xd1, 0x0e, 0xe0, 0x25, 0xcf, 0xba, 0xef, 0xa2, 0xbb, 0x27, 0x89, 0xde, 0x6b, 0xb6, 0xf4, 0x89, 0xe6, 0x41, 0x16, 0xa7, 0xa3, 0x6e, 0xef, 0xb9, 0x2d, 0x7d, + 0x90, 0x86, 0x33, 0xf3, 0x73, 0x42, 0xa1, 0xfa, 0x83, 0xb9, 0xc4, 0x5a, 0x20, 0x22, 0xc0, 0x18, 0x52, 0xe7, 0xbc, 0x8c, 0x18, 0x23, 0x8d, 0x15, 0xd9, 0x94, 0x4a, 0x7a, 0xc9, 0x78, 0xb4, 0x59, + 0xc9, 0xbd, 0xed, 0x48, 0xf6, 0xa1, 0x86, 0xa8, 0xe4, 0xd0, 0x5e, 0xa4, 0xc8, 0x54, 0xc2, 0xf6, 0x41, 0xe1, 0x92, 0x11, 0x4c, 0xa9, 0xfb, 0x6c, 0x2a, 0xee, 0xc7, 0x8d, 0xa7, 0x5a, 0xfc, 0xca, + 0xdd, 0xd0, 0x11, 0x34, 0x7c, 0xe6, 0xa3, 0xfc, 0xc2, 0x01, 0x90, 0x9e, 0xb7, 0x57, 0x6f, 0x82, 0xcd, 0xf4, 0xd4, 0x54, 0x73, 0xb3, 0xfb, 0xbe, 0x01, 0xf3, 0xe3, 0xdf, 0xef, 0x15, 0xd6, 0xfc, + 0xa8, 0x9b, 0x8e, 0xde, 0x6e, 0x12, 0x06, 0xea, 0xce, 0xec, 0x9a, 0x69, 0x1a, 0xa5, 0x3f, 0xee, 0x86, 0x94, 0xdd, 0x4d, 0x04, 0xfb, 0xf1, 0x8f, 0x63, 0x5e, 0x16, 0x71, 0x79, 0x63, 0xfd, 0x31, + 0x5a, 0xda, 0x94, 0x86, 0xfa, 0x25, 0xe9, 0x1f, 0x86, 0x9b, 0xe5, 0xc0, 0x3b, 0xa8, 0xe8, 0xff, 0xfa, 0x74, 0x47, 0x37, 0xd3, 0x53, 0xf7, 0xd4, 0x0f, 0xcf, 0x37, 0xbe, 0x9f, 0x7a, 0x70, 0x7f, + 0x9e, 0xaa, 0x61, 0x16, 0xbb, 0xbe, 0xd9, 0x8d, 0x42, 0xbf, 0xbe, 0xfa, 0xdd, 0xc7, 0xa5, 0xcf, 0x3f, 0x7d, 0xf8, 0x94, 0x5f, 0x31, 0x49, 0xc6, 0x6b, 0x38, 0x5e, 0xf7, 0xd5, 0x56, 0x6c, 0x9a, + 0x29, 0xf3, 0x18, 0x59, 0xbb, 0x8e, 0xcd, 0x5f, 0x6f, 0xf4, 0x9f, 0xff, 0x01, 0xff, 0x24, 0x5a, 0x8d, 0x1e, 0xdf, 0xd5, 0x1e, 0xce, 0xdc, 0xd0, 0x2b, 0xb9, 0xa6, 0x47, 0x92, 0xc7, 0xa1, 0xe3, + 0xbb, 0x5a, 0xf7, 0x44, 0xe4, 0xf9, 0xc8, 0xd9, 0x86, 0x2e, 0x82, 0x89, 0x5c, 0xe3, 0xd9, 0x42, 0x5a, 0x99, 0x65, 0x9d, 0x8d, 0x96, 0x7d, 0x2a, 0xcd, 0x79, 0x26, 0x9e, 0x95, 0xb5, 0x49, 0x36, + 0x6b, 0x00, 0x1c, 0xa0, 0x83, 0x5a, 0x0e, 0x51, 0x64, 0x46, 0x00, 0x44, 0x52, 0x4a, 0xd5, 0xcc, 0xe9, 0xd1, 0xec, 0x6e, 0x64, 0x56, 0x9a, 0x50, 0xf8, 0xeb, 0x30, 0xd7, 0x5c, 0x3b, 0xd0, 0x97, + 0x44, 0x6a, 0x6c, 0x11, 0x5a, 0x8c, 0x7a, 0xd5, 0x7c, 0xf2, 0x7d, 0xf7, 0x72, 0xe6, 0xbb, 0x61, 0xde, 0xd5, 0xa3, 0xd0, 0x72, 0xed, 0xee, 0xb1, 0xd4, 0xbe, 0xfb, 0x55, 0x3c, 0x13, 0xf9, 0x8a, + 0x9a, 0xbf, 0xfb, 0x8c, 0x77, 0x86, 0x7d, 0xbe, 0xd0, 0x3d, 0x3d, 0xe6, 0x39, 0x07, 0xf7, 0xb3, 0xaa, 0x37, 0xb3, 0xc5, 0x19, 0xcf, 0x22, 0x2e, 0x37, 0xdf, 0x07, 0x1c, 0xc1, 0x6c, 0xd2, 0xce, + 0x40, 0x05, 0x16, 0x4d, 0x5a, 0x5a, 0xa3, 0xdc, 0x1b, 0xe6, 0x18, 0x4f, 0xfb, 0x38, 0x64, 0xef, 0xe0, 0x15, 0xcd, 0x02, 0x0c, 0xdd, 0xdb, 0xf5, 0xb7, 0x73, 0xaf, 0xec, 0xec, 0xeb, 0xf1, 0x0a, + 0x4a, 0x57, 0x79, 0xa8, 0xd6, 0xbc, 0x29, 0xac, 0xd6, 0x13, 0x5a, 0x17, 0xb6, 0xa4, 0x02, 0x11, 0x21, 0xf3, 0x4c, 0xf7, 0xdc, 0x19, 0xa4, 0x77, 0x3f, 0x42, 0x77, 0x4c, 0x7d, 0x77, 0xd6, 0xf0, + 0xc7, 0xc6, 0x2b, 0x23, 0x03, 0x6d, 0xbb, 0x95, 0x9f, 0x15, 0xb9, 0xeb, 0x67, 0x0f, 0x67, 0x67, 0xf8, 0xa5, 0xe9, 0xf9, 0x44, 0xf4, 0x28, 0xa8, 0xe3, 0x51, 0xf7, 0x44, 0xe8, 0xb9, 0x64, 0x82, + 0x11, 0xc7, 0x21, 0xee, 0x6a, 0xcb, 0x77, 0x90, 0xd5, 0x10, 0xdf, 0xf3, 0xd8, 0x0e, 0x9c, 0x0d, 0x1c, 0x6e, 0xbe, 0xa2, 0xb9, 0x19, 0xdd, 0x2f, 0x81, 0xce, 0x7c, 0x37, 0x98, 0xc6, 0xde, 0x7c, + 0xb3, 0xdf, 0xef, 0x61, 0x82, 0xe3, 0xe6, 0x74, 0x10, 0x50, 0x38, 0x48, 0xf5, 0x62, 0x7b, 0xba, 0x2a, 0x05, 0x97, 0x64, 0x39, 0x67, 0x2e, 0xcc, 0x06, 0x81, 0x47, 0xcf, 0x67, 0x4d, 0x06, 0x6f, + 0x88, 0x29, 0x34, 0x7d, 0x7d, 0x8e, 0x3e, 0x8f, 0xf9, 0x83, 0xe6, 0x26, 0x5f, 0xa9, 0x14, 0x76, 0xa7, 0x24, 0xc7, 0x77, 0x75, 0x13, 0xf9, 0x13, 0x7c, 0xfb, 0xdf, 0xff, 0xfb, 0xed, 0x3f, 0xff, + 0xe3, 0x0d, 0x39, 0x2c, 0xfe, 0xbb, 0x86, 0x59, 0x7e, 0xb4, 0x91, 0x9b, 0x36, 0x7a, 0xd3, 0xc6, 0x6e, 0xda, 0xf8, 0x9d, 0xb6, 0x66, 0xe6, 0xea, 0xc7, 0x09, 0xe2, 0xe6, 0x06, 0xe2, 0xfd, 0x86, + 0x36, 0x3d, 0xa9, 0x8e, 0xcd, 0x8f, 0xce, 0x7b, 0xdf, 0x13, 0xf2, 0x4a, 0x20, 0xc8, 0x2f, 0xb2, 0x87, 0xee, 0xf4, 0xd1, 0xe8, 0x82, 0xed, 0xc2, 0x42, 0xb6, 0xbe, 0xb9, 0x8a, 0xf4, 0x5e, 0x51, + 0xb1, 0xdb, 0xc4, 0xdb, 0x54, 0x5b, 0x75, 0xb5, 0x54, 0xa8, 0xa0, 0x11, 0xf4, 0xa1, 0x82, 0x91, 0x18, 0x29, 0x51, 0x70, 0x59, 0xee, 0xa1, 0x55, 0x8a, 0xed, 0xc7, 0xba, 0xbb, 0xdf, 0x8e, 0x67, + 0x1d, 0x92, 0x0f, 0x87, 0x8c, 0x3d, 0x8f, 0xfd, 0x15, 0x02, 0x16, 0x19, 0x9e, 0x9b, 0x89, 0xe1, 0x67, 0xbb, 0xa1, 0x55, 0x74, 0x54, 0x13, 0xe5, 0x88, 0xde, 0x34, 0x32, 0x9f, 0x79, 0xab, 0x1e, + 0x77, 0xa8, 0x38, 0x35, 0xfd, 0xc2, 0x30, 0xbb, 0x7e, 0xf6, 0xe3, 0x1c, 0x7f, 0xfe, 0x42, 0xaf, 0x02, 0x7f, 0xb6, 0x34, 0xbc, 0x0f, 0xec, 0xb2, 0xbe, 0x72, 0x9f, 0x92, 0xaf, 0xcc, 0x5a, 0x67, + 0xaa, 0x67, 0x81, 0x58, 0x27, 0x17, 0x2a, 0xd9, 0x66, 0xf2, 0x42, 0x0d, 0xad, 0x19, 0x37, 0x49, 0xe9, 0xe5, 0xb6, 0x2b, 0x60, 0x69, 0x05, 0xed, 0xb0, 0x74, 0x30, 0xca, 0x69, 0x4a, 0xe4, 0x02, + 0xa3, 0x30, 0x1c, 0xb6, 0xa6, 0x07, 0xaa, 0x27, 0x82, 0x90, 0x35, 0xa8, 0x1d, 0x95, 0x1a, 0x3b, 0x59, 0xc4, 0x89, 0x35, 0x5e, 0x13, 0x9d, 0xb1, 0xd8, 0x43, 0xc6, 0x56, 0x3c, 0xcc, 0x2b, 0xb9, + 0xe7, 0x26, 0x2e, 0xb1, 0x63, 0x3a, 0xfb, 0x8a, 0x73, 0xa4, 0x4c, 0x9c, 0x3c, 0x1b, 0xe0, 0xcf, 0x56, 0x31, 0x2d, 0x59, 0x69, 0x1c, 0xe3, 0xb9, 0xbb, 0x79, 0xf4, 0x75, 0xd8, 0xf3, 0xc1, 0x48, + 0xfb, 0x3e, 0x86, 0xeb, 0xbd, 0x07, 0xbc, 0x33, 0xf8, 0xf6, 0xf4, 0x71, 0xc1, 0xd3, 0x02, 0xdf, 0xb5, 0x31, 0x0a, 0x72, 0x2b, 0x88, 0x03, 0xc6, 0x8c, 0x39, 0x6e, 0xde, 0xd9, 0xca, 0xd3, 0x2d, + 0xb5, 0x9e, 0xe5, 0x9b, 0xc2, 0x05, 0xfd, 0x1a, 0x14, 0xf3, 0xc8, 0x59, 0x65, 0x7a, 0xd5, 0x59, 0x05, 0xea, 0xc8, 0xa5, 0x36, 0x4b, 0xd2, 0x49, 0xd7, 0x50, 0x9a, 0x02, 0xc0, 0x08, 0x5f, 0x77, + 0x40, 0xa6, 0x9c, 0x20, 0x53, 0x09, 0xea, 0x2d, 0x7a, 0x44, 0x4f, 0x00, 0x7d, 0x95, 0xb7, 0xb6, 0x64, 0x1a, 0x90, 0x4f, 0x01, 0x7a, 0xbe, 0x5c, 0x70, 0xfe, 0xfa, 0x9a, 0x1f, 0xff, 0xfe, 0x8d, + 0x42, 0x2f, 0x57, 0x4a, 0xf1, 0x1e, 0xcb, 0xd1, 0x9f, 0xf0, 0x0b, 0x29, 0x7c, 0xbf, 0xc8, 0xbe, 0x33, 0xfa, 0xdd, 0x26, 0x3d, 0x52, 0x7b, 0xce, 0xde, 0x75, 0xc7, 0x2c, 0x7d, 0x79, 0xa4, 0x84, + 0xd2, 0x4e, 0x6d, 0xc8, 0xe5, 0x9c, 0x2e, 0xf6, 0x4b, 0xaa, 0x07, 0xd7, 0x0a, 0x3d, 0x8b, 0xf2, 0x14, 0x1b, 0x75, 0x36, 0x8e, 0x44, 0x68, 0x0c, 0xe2, 0x28, 0xab, 0xd0, 0xd8, 0x63, 0x39, 0x3b, + 0x55, 0x21, 0xab, 0xe8, 0xdb, 0xe6, 0xc2, 0xdb, 0x53, 0x8d, 0x00, 0xcd, 0x5d, 0x11, 0x1b, 0x37, 0xa5, 0x6a, 0x8c, 0xb7, 0xcb, 0xb5, 0x69, 0x15, 0x45, 0xa5, 0xf4, 0xe7, 0x2f, 0x58, 0x11, 0xfa, + 0xd9, 0x58, 0x38, 0x1c, 0xfe, 0xaf, 0xcb, 0x2b, 0x99, 0x99, 0x5e, 0x60, 0x81, 0x7e, 0xb4, 0xbf, 0xab, 0x6f, 0xd0, 0x96, 0xb8, 0xcf, 0x45, 0xa8, 0x45, 0xfb, 0x6e, 0x9c, 0xba, 0x81, 0x9b, 0xbb, + 0x5f, 0x14, 0xee, 0x7a, 0x25, 0xee, 0xfa, 0x86, 0x36, 0xd0, 0xbd, 0x3d, 0xd3, 0xa6, 0x80, 0xd1, 0xd1, 0x0b, 0x03, 0xc5, 0x33, 0xbf, 0xcf, 0xf4, 0x1c, 0x0c, 0x5a, 0x47, 0xa9, 0x59, 0x4f, 0x40, + 0x7a, 0x6e, 0xba, 0x86, 0x29, 0x20, 0x02, 0xc3, 0x09, 0x5c, 0xe8, 0xe0, 0x9d, 0x75, 0x8f, 0x07, 0x49, 0x04, 0x81, 0xdc, 0x38, 0xc1, 0x25, 0x72, 0x3a, 0xdc, 0x2a, 0xb2, 0x9b, 0xcc, 0xf0, 0x10, + 0xc8, 0xb5, 0xd1, 0x1e, 0xcd, 0xb0, 0x71, 0xaf, 0x98, 0x3b, 0x7a, 0x6d, 0xe2, 0x74, 0xaa, 0xed, 0xdc, 0x66, 0x47, 0x33, 0x2d, 0x03, 0x79, 0x9f, 0x24, 0x56, 0x3a, 0x6a, 0xd6, 0xd5, 0x5c, 0xdb, + 0x7d, 0x2f, 0x04, 0x7c, 0xff, 0x86, 0xac, 0x0e, 0xb4, 0xc8, 0xff, 0x75, 0xc3, 0xd5, 0xc6, 0x63, 0xe5, 0xb8, 0xba, 0xd3, 0xd5, 0xa2, 0xbd, 0x69, 0x5c, 0xc9, 0xe1, 0x4c, 0xeb, 0x93, 0xe4, 0x5f, + 0xdd, 0x25, 0x69, 0x9d, 0x9e, 0x59, 0x84, 0x86, 0x69, 0x65, 0xaa, 0xf5, 0x78, 0x03, 0xeb, 0x15, 0x44, 0x8d, 0x0f, 0xaa, 0xc7, 0x7e, 0xf0, 0x7e, 0x7c, 0xcc, 0x21, 0x6c, 0xb1, 0xf9, 0x1d, 0xa6, + 0x5b, 0xa5, 0xaa, 0xb6, 0x29, 0x03, 0x2c, 0x81, 0xc9, 0xd6, 0xac, 0xed, 0x49, 0x62, 0xf4, 0xa7, 0xb8, 0xa8, 0x28, 0x10, 0x8f, 0xe3, 0xa3, 0x74, 0x2f, 0x00, 0x0a, 0x11, 0x8c, 0x13, 0x38, 0x9a, + 0xa9, 0x61, 0x24, 0x82, 0x43, 0x28, 0xe4, 0xf7, 0x88, 0x5f, 0x4d, 0x84, 0x02, 0xa7, 0xaa, 0x89, 0x8c, 0xf7, 0x1c, 0xc3, 0xdd, 0xab, 0x43, 0x69, 0x5a, 0x44, 0x72, 0x26, 0x78, 0x03, 0x0c, 0xe8, + 0xc3, 0xcf, 0xa6, 0xa0, 0xaf, 0x36, 0xbf, 0xcf, 0x89, 0x6e, 0x70, 0xeb, 0x71, 0x76, 0xfe, 0xfa, 0xab, 0xd3, 0x67, 0x42, 0xf7, 0xd9, 0x8c, 0xff, 0xfc, 0x3e, 0x8c, 0xcc, 0x91, 0x22, 0xd0, 0x3d, + 0xfd, 0xef, 0x1e, 0x69, 0x3c, 0x67, 0xaf, 0xd6, 0x27, 0x06, 0x7e, 0x6a, 0x4c, 0xd4, 0x49, 0x38, 0xd3, 0xa8, 0x59, 0x07, 0x1a, 0x44, 0xb9, 0x5c, 0x26, 0x4a, 0xa6, 0x21, 0xa6, 0xee, 0x63, 0x95, + 0x8b, 0xd3, 0x96, 0x8b, 0xd3, 0x93, 0xe5, 0x4a, 0x17, 0xa3, 0x2a, 0xc6, 0xf5, 0x32, 0x8b, 0x6d, 0xd0, 0xdb, 0x36, 0xe1, 0x7c, 0xc9, 0x31, 0x5e, 0x00, 0x0c, 0x08, 0xca, 0xb0, 0x87, 0xf4, 0xda, + 0xa4, 0x66, 0x6b, 0x41, 0xd4, 0x39, 0x36, 0x1b, 0x09, 0xaf, 0xb3, 0x37, 0xc8, 0x7e, 0x7c, 0x00, 0xd1, 0xb6, 0x61, 0xad, 0x9b, 0x14, 0x66, 0xf7, 0xcb, 0xed, 0xa1, 0xd7, 0x40, 0x6d, 0xaf, 0x28, + 0x1f, 0xbb, 0xed, 0x45, 0xbb, 0x2d, 0xa0, 0x6d, 0x21, 0xaa, 0xa6, 0x9b, 0x0e, 0x66, 0x65, 0xac, 0x6c, 0x16, 0x76, 0x53, 0x65, 0x33, 0x36, 0x5f, 0xc1, 0xcd, 0x7a, 0xb1, 0x4c, 0x43, 0x80, 0xe4, + 0xb1, 0x04, 0x18, 0x9b, 0x7b, 0x25, 0x18, 0x81, 0xe6, 0x08, 0x5f, 0x50, 0x04, 0xd2, 0x0f, 0x28, 0x0a, 0x5b, 0xa1, 0x6c, 0x35, 0x9d, 0x2f, 0xf7, 0x12, 0xa5, 0x64, 0x3d, 0x6c, 0x49, 0x6d, 0x79, + 0x31, 0x31, 0xf9, 0x68, 0x36, 0x13, 0xa7, 0x98, 0xad, 0x58, 0xbf, 0x11, 0x1b, 0xaf, 0xa7, 0x75, 0x9c, 0x47, 0xdd, 0x54, 0x0d, 0x8d, 0xcf, 0x61, 0xc9, 0x2f, 0x78, 0x93, 0xdb, 0x08, 0x28, 0x36, + 0xd4, 0xdc, 0xec, 0x86, 0x51, 0xee, 0x5a, 0x8f, 0xfd, 0x0d, 0xe8, 0x15, 0x84, 0x45, 0x6b, 0x11, 0x5d, 0xd3, 0x3e, 0x08, 0xe9, 0xfa, 0x4c, 0xf7, 0x48, 0xf7, 0xb9, 0x98, 0x64, 0xdf, 0xc0, 0x15, + 0x70, 0x5e, 0xf7, 0x65, 0x96, 0xc6, 0xf5, 0xdd, 0xd8, 0xb3, 0x2c, 0x76, 0xba, 0x98, 0x06, 0xa3, 0xad, 0x07, 0xd9, 0x82, 0x39, 0x20, 0xd4, 0xf9, 0xb4, 0x41, 0x05, 0xb6, 0xb3, 0x15, 0x76, 0x81, + 0xbb, 0xa7, 0xb7, 0xa8, 0xb7, 0x0a, 0xed, 0x94, 0xdd, 0x8a, 0x72, 0x43, 0x54, 0x33, 0x8e, 0x0e, 0xf2, 0x88, 0x41, 0x85, 0x90, 0x56, 0x61, 0x2a, 0x2c, 0x88, 0xf9, 0x82, 0x73, 0x72, 0xe0, 0xf5, + 0x21, 0x70, 0x98, 0x0f, 0x8e, 0x6c, 0xf9, 0x9c, 0x37, 0x70, 0x84, 0xc3, 0xfb, 0x71, 0x37, 0x66, 0xed, 0xe4, 0x97, 0x38, 0xa3, 0x81, 0x9f, 0x62, 0xa2, 0xa0, 0xdb, 0xd9, 0xa8, 0x56, 0xd3, 0xf0, + 0x5d, 0xe2, 0x37, 0x3e, 0x51, 0x37, 0x38, 0x22, 0x4c, 0xf9, 0x6a, 0x53, 0x3f, 0xb8, 0x21, 0xeb, 0xea, 0xee, 0x45, 0x6f, 0xb9, 0xbe, 0xe4, 0x86, 0x59, 0xae, 0xfa, 0xbe, 0x69, 0x74, 0x6d, 0x3f, + 0xd2, 0x54, 0xff, 0xe4, 0x6b, 0xfc, 0x07, 0x78, 0x9b, 0xd0, 0xeb, 0x66, 0xdd, 0x30, 0x0e, 0x7e, 0xfc, 0xfb, 0xbd, 0xb4, 0x09, 0xf7, 0xf4, 0x7e, 0xef, 0x14, 0x3e, 0x7e, 0x7f, 0x75, 0x8f, 0xaf, + 0x1e, 0x13, 0xb8, 0x2e, 0xfa, 0xce, 0x3f, 0xb0, 0x5b, 0x3a, 0x71, 0x11, 0xab, 0x1f, 0x2f, 0x7a, 0xed, 0xbe, 0xbd, 0x2a, 0x11, 0x70, 0x27, 0xc2, 0x7f, 0x6f, 0xd8, 0x5d, 0x4d, 0xcd, 0x4c, 0xc3, + 0x4d, 0x2f, 0xde, 0xf1, 0xf5, 0x81, 0xf1, 0xf1, 0x8b, 0x6f, 0x4e, 0xdc, 0xb5, 0x19, 0x05, 0x6a, 0x78, 0xdb, 0x9f, 0xbf, 0x05, 0x7e, 0x78, 0x3b, 0x3a, 0xae, 0x2e, 0x9e, 0xfb, 0xd1, 0xfd, 0xf5, + 0xd0, 0x2b, 0xfa, 0xf2, 0x04, 0xd4, 0xd8, 0x3d, 0xfd, 0x6f, 0x1b, 0xf8, 0x8c, 0x32, 0x08, 0x8d, 0x6f, 0x2c, 0x14, 0xe2, 0xa6, 0xf2, 0x7c, 0x68, 0x64, 0x4d, 0xc0, 0x24, 0x42, 0x9f, 0x4d, 0xb0, + 0xf5, 0x1a, 0x28, 0x04, 0x8a, 0x86, 0x09, 0x64, 0x32, 0xe6, 0x83, 0x69, 0x07, 0xf1, 0x28, 0xdf, 0x21, 0xb7, 0x68, 0xc2, 0xe4, 0x46, 0x6e, 0xf7, 0xe7, 0x88, 0xb5, 0xcf, 0x35, 0x7e, 0x20, 0x34, + 0x8b, 0x3d, 0x0c, 0x4b, 0x86, 0x13, 0x32, 0xfa, 0xa4, 0x2c, 0xe0, 0x02, 0xb2, 0xd6, 0xbf, 0x91, 0xba, 0xf8, 0x19, 0x44, 0xf3, 0x66, 0x0c, 0x7c, 0xca, 0x7b, 0x3b, 0x55, 0x0c, 0xfb, 0x9d, 0x1e, + 0xf2, 0x85, 0x00, 0xcf, 0xa9, 0x21, 0xf7, 0x35, 0xe6, 0x2b, 0xce, 0x99, 0x13, 0xc9, 0x83, 0xa2, 0x3c, 0x1e, 0x74, 0xd1, 0x76, 0x4e, 0x19, 0x1a, 0xac, 0xe7, 0xcb, 0x46, 0x36, 0x56, 0xfd, 0x7e, + 0xd8, 0x0b, 0x3b, 0x43, 0xb4, 0xc3, 0x3a, 0x68, 0x3d, 0x66, 0x72, 0x41, 0xd2, 0xd5, 0x49, 0x16, 0xc8, 0x34, 0x93, 0x2d, 0x17, 0x2c, 0x69, 0x03, 0x53, 0xd3, 0xe3, 0xe8, 0xc8, 0xe0, 0x25, 0x78, + 0x3c, 0xb2, 0x44, 0x44, 0x13, 0x08, 0x6f, 0x95, 0xcd, 0xb7, 0xa1, 0x11, 0xc5, 0x4b, 0x62, 0x3a, 0xde, 0x6e, 0x0c, 0x39, 0xd1, 0x21, 0xcb, 0x0b, 0xd6, 0x78, 0x4b, 0x90, 0xc4, 0xb8, 0x08, 0x6b, + 0xfd, 0x9d, 0x6f, 0xef, 0x4a, 0xa9, 0x0d, 0xeb, 0xfc, 0xf7, 0xba, 0x32, 0xbe, 0xfa, 0x67, 0xd1, 0xd4, 0xaf, 0x28, 0x1f, 0x19, 0x79, 0xd1, 0x6e, 0xd3, 0xed, 0xa1, 0xee, 0x30, 0xdd, 0x72, 0x00, + 0x65, 0x69, 0x28, 0x6c, 0x64, 0xec, 0x3e, 0x50, 0x86, 0x88, 0xed, 0x41, 0x3e, 0x85, 0xd7, 0xd5, 0x7d, 0x84, 0xb8, 0x36, 0x4c, 0x4a, 0x8f, 0x97, 0xba, 0x87, 0x17, 0xff, 0xf1, 0xfa, 0x84, 0xde, + 0x06, 0x82, 0xa4, 0xc8, 0xdd, 0x47, 0x48, 0xea, 0xe0, 0x4f, 0xe8, 0x95, 0x65, 0xfd, 0x81, 0xe2, 0x81, 0x93, 0xb9, 0xeb, 0x77, 0x4f, 0x24, 0x9e, 0xf7, 0x48, 0x6d, 0xaf, 0xf4, 0x92, 0x7c, 0xe1, + 0xb3, 0xab, 0xcd, 0x62, 0x5a, 0xf7, 0x24, 0xb5, 0xb7, 0xb5, 0x77, 0x10, 0xb4, 0x5b, 0x64, 0x7e, 0x5c, 0x28, 0x95, 0xba, 0xef, 0xdb, 0x68, 0x26, 0x8e, 0x19, 0x0f, 0x1f, 0xf2, 0x85, 0xce, 0xa8, + 0x1a, 0x3c, 0xd9, 0x87, 0xa3, 0xaa, 0x16, 0x97, 0xfd, 0x78, 0x24, 0xe4, 0x1c, 0x24, 0x78, 0x91, 0xe4, 0x6e, 0x24, 0x9c, 0x71, 0x57, 0x82, 0x22, 0x6b, 0x8b, 0x74, 0xda, 0x59, 0xb4, 0x5c, 0x15, + 0x5e, 0x46, 0x8b, 0xfe, 0xe3, 0x0e, 0x8a, 0x40, 0x57, 0x4d, 0xed, 0xe2, 0x8c, 0xcd, 0x72, 0x5a, 0xc9, 0xdd, 0xc6, 0x93, 0xda, 0x66, 0x68, 0xa6, 0x6a, 0x1e, 0xa5, 0xdd, 0x73, 0x40, 0xeb, 0xc7, + 0xad, 0xc4, 0xcd, 0xad, 0x47, 0x17, 0x4c, 0xf7, 0xd2, 0x07, 0x73, 0x83, 0xf6, 0x75, 0x93, 0x6f, 0xfd, 0x0f, 0xec, 0x36, 0xa2, 0xf6, 0xb4, 0xc8, 0xbc, 0x47, 0xa7, 0x0d, 0x9a, 0xe8, 0x27, 0x24, + 0x82, 0x3f, 0xe8, 0x23, 0xb8, 0x22, 0x7d, 0xee, 0x02, 0x1f, 0x27, 0xda, 0x78, 0x08, 0xa0, 0xee, 0x5c, 0x82, 0xc4, 0xda, 0x8a, 0x2b, 0x24, 0x14, 0x42, 0xb9, 0x2c, 0x17, 0x10, 0xc7, 0x4d, 0xec, + 0x15, 0xab, 0x32, 0x02, 0xf9, 0xcd, 0x1d, 0xb2, 0xa2, 0x70, 0x8d, 0x07, 0xdf, 0x47, 0x5e, 0x99, 0x31, 0xad, 0xbf, 0xaf, 0x70, 0x8d, 0xc3, 0x57, 0x15, 0xae, 0xd1, 0x3d, 0x52, 0x78, 0xde, 0xaf, + 0x87, 0xd3, 0x60, 0x9e, 0x76, 0x86, 0xc1, 0x66, 0x30, 0x66, 0xc9, 0xc2, 0x51, 0x4a, 0xbc, 0x0f, 0x6b, 0x4b, 0x7b, 0xb0, 0xde, 0x66, 0xa3, 0x1d, 0x48, 0xee, 0x06, 0x44, 0x30, 0xf3, 0x53, 0x5a, + 0x1b, 0x98, 0x1d, 0x1d, 0x49, 0x7b, 0xb1, 0xa7, 0x9b, 0xeb, 0x99, 0x5d, 0xc4, 0x63, 0x4b, 0x1c, 0x3b, 0x3a, 0x5a, 0xef, 0x31, 0x6c, 0x84, 0xf7, 0xa6, 0x5b, 0x4a, 0x4c, 0x57, 0xea, 0xa2, 0x28, + 0x7a, 0xe6, 0x38, 0xbc, 0x06, 0x9c, 0xfb, 0xe4, 0x90, 0x7a, 0xff, 0xec, 0x8f, 0x9d, 0xde, 0x13, 0x1f, 0x5a, 0x74, 0x8c, 0xc3, 0x67, 0x7d, 0x55, 0x2e, 0x0c, 0x7a, 0x29, 0x54, 0xe4, 0x17, 0xd9, + 0x33, 0xeb, 0x4e, 0xea, 0x15, 0x6a, 0x17, 0x34, 0x32, 0x35, 0x82, 0xed, 0x9e, 0x22, 0x53, 0x26, 0x93, 0x08, 0x39, 0x16, 0xd7, 0x1a, 0xb7, 0x98, 0xec, 0xc4, 0x66, 0x59, 0xc1, 0xe3, 0xce, 0x02, + 0xdb, 0x64, 0x9a, 0xc0, 0x84, 0xfd, 0x7c, 0xbc, 0x59, 0x48, 0x6a, 0x94, 0x89, 0x94, 0xbe, 0xc9, 0x87, 0xc5, 0x18, 0x90, 0x39, 0x68, 0xe9, 0x35, 0xab, 0x31, 0x1e, 0x6a, 0x3b, 0xdb, 0x4d, 0x06, + 0xb5, 0x43, 0xda, 0x9b, 0xd0, 0xb6, 0xf4, 0x92, 0xa4, 0x32, 0xa3, 0xf7, 0x75, 0x55, 0xd5, 0x92, 0xec, 0xea, 0x51, 0x70, 0xdc, 0x63, 0x3f, 0x57, 0xc8, 0xba, 0xbf, 0x0c, 0x7d, 0xa5, 0x16, 0xcf, + 0x2d, 0x71, 0xa0, 0xfb, 0xe9, 0xd4, 0x31, 0x1e, 0xb3, 0x05, 0x6b, 0x7c, 0xd2, 0xef, 0x0f, 0x02, 0x5e, 0xe7, 0x65, 0xc5, 0x41, 0x43, 0xad, 0x08, 0x45, 0xa5, 0x94, 0xfa, 0x13, 0x1d, 0x8b, 0x4b, + 0xa2, 0x33, 0xef, 0x57, 0x2a, 0x99, 0x00, 0xbc, 0xb1, 0xda, 0x93, 0x05, 0xe1, 0x67, 0x9b, 0x72, 0xc6, 0x70, 0x41, 0x1c, 0x19, 0x13, 0x6a, 0x22, 0x56, 0x3b, 0xca, 0x99, 0xf4, 0x01, 0xc0, 0x18, + 0xca, 0x28, 0xc9, 0x15, 0xe3, 0x41, 0xe0, 0xe5, 0x06, 0x3a, 0x5f, 0xbb, 0x4c, 0xfa, 0xed, 0xdc, 0xbd, 0xa3, 0x36, 0xfa, 0x62, 0xa5, 0xfe, 0x7d, 0x35, 0x72, 0xa4, 0x08, 0x74, 0x4f, 0xff, 0x8f, + 0x2b, 0xf3, 0x16, 0x6e, 0x45, 0x9a, 0x1f, 0x23, 0x4b, 0x1f, 0x5a, 0x6e, 0x90, 0x59, 0xe9, 0x13, 0xa0, 0x8f, 0xd4, 0x09, 0x22, 0xe3, 0xa8, 0xdb, 0x51, 0xab, 0xb8, 0xda, 0x26, 0x19, 0x4b, 0xcb, + 0x9b, 0xdd, 0x2e, 0x11, 0xf2, 0x50, 0xdb, 0xda, 0xa9, 0xc0, 0x74, 0x6a, 0x8f, 0x48, 0x9d, 0x0d, 0xb8, 0x2b, 0x06, 0xcc, 0xbe, 0x99, 0xa8, 0xf2, 0x96, 0xf5, 0x06, 0x1b, 0x2c, 0xb2, 0xd5, 0x98, + 0x13, 0x85, 0x01, 0x27, 0x0a, 0x9e, 0xab, 0xbd, 0xbe, 0xe4, 0x73, 0x33, 0x73, 0x6f, 0x7e, 0x35, 0x73, 0xdf, 0x0d, 0x2e, 0xea, 0x9e, 0x99, 0xf9, 0x11, 0x5d, 0xf4, 0x7e, 0xe6, 0xd3, 0xcf, 0x9f, + 0xed, 0x50, 0xb5, 0xb1, 0x47, 0x1f, 0x39, 0x2b, 0xff, 0xdc, 0x84, 0x70, 0xf7, 0x09, 0x1f, 0x92, 0xbd, 0x39, 0xdf, 0x66, 0x7a, 0x38, 0x9a, 0x0a, 0x95, 0x62, 0x94, 0x20, 0xc5, 0xf1, 0x71, 0xec, + 0x0f, 0x65, 0x98, 0x53, 0xe6, 0x5b, 0x7c, 0x59, 0xd6, 0x85, 0x48, 0x44, 0x9e, 0x97, 0x12, 0x7e, 0xb5, 0xb3, 0xf1, 0xc0, 0x07, 0xd3, 0x68, 0x5c, 0xf7, 0x64, 0xb3, 0x58, 0xa4, 0xc4, 0x64, 0x81, + 0x10, 0x70, 0xe2, 0x8b, 0x1b, 0x88, 0x5c, 0x49, 0x72, 0x63, 0xcb, 0x5c, 0xaf, 0x71, 0x59, 0xdd, 0x4c, 0x37, 0x89, 0x32, 0x0d, 0x06, 0x61, 0x6f, 0xdd, 0x16, 0xe1, 0xdb, 0x3d, 0x3b, 0x88, 0x3f, + 0xa6, 0xf7, 0xdb, 0xc5, 0xb0, 0x16, 0x45, 0xbe, 0xa9, 0x86, 0xdd, 0x53, 0xa2, 0xc8, 0xc7, 0xcc, 0x7c, 0xbb, 0x2e, 0x3e, 0x45, 0xfe, 0x5d, 0xdf, 0xf5, 0xd9, 0xac, 0xb8, 0xf0, 0xe8, 0x7c, 0xca, + 0x53, 0x71, 0xcf, 0xae, 0xe8, 0x1f, 0xbf, 0x3c, 0xd1, 0x9f, 0xba, 0xc9, 0x37, 0x57, 0xa9, 0xdf, 0x77, 0x2f, 0xdf, 0xb3, 0x45, 0x1e, 0xcd, 0x1d, 0xdf, 0x47, 0xb6, 0xfa, 0x44, 0xfd, 0xa3, 0xef, + 0x5c, 0x9c, 0x3b, 0xce, 0x24, 0x2d, 0xd0, 0xad, 0x4a, 0x6f, 0xaf, 0xd2, 0x68, 0x68, 0x31, 0x49, 0xc5, 0x8d, 0xc1, 0x2a, 0x23, 0x2a, 0x25, 0xde, 0x8f, 0x7d, 0xc3, 0x84, 0xb6, 0x29, 0xbf, 0xc5, + 0x0a, 0x1a, 0x54, 0xbc, 0xd8, 0xca, 0x1c, 0x3b, 0x50, 0xe3, 0x89, 0xc0, 0x10, 0xde, 0x64, 0xe3, 0x28, 0xe3, 0x4e, 0xbd, 0x8c, 0x26, 0xcb, 0x44, 0x1d, 0xd2, 0xf5, 0x10, 0x34, 0x45, 0x5a, 0x97, + 0xf7, 0x9a, 0x17, 0xf4, 0x9b, 0x68, 0x3e, 0x23, 0xfa, 0xd6, 0xa0, 0xa5, 0x89, 0xa9, 0x96, 0xaa, 0xeb, 0x1f, 0x83, 0x81, 0x2f, 0x5e, 0x3c, 0xbb, 0x2f, 0xd8, 0x27, 0x9b, 0x14, 0x77, 0xc1, 0x60, + 0xaf, 0x08, 0x58, 0x51, 0x7a, 0x4e, 0xb8, 0x3a, 0x6a, 0x9f, 0xab, 0x8b, 0x8e, 0x9a, 0x75, 0xf3, 0xe8, 0xd4, 0xb1, 0x72, 0xf5, 0x57, 0xdf, 0xba, 0xed, 0xa0, 0xf7, 0xcc, 0x4b, 0xe2, 0xfb, 0x7a, + 0xe8, 0x5f, 0x83, 0x35, 0x5b, 0xb9, 0x86, 0x99, 0xe5, 0x5d, 0xdf, 0x0d, 0x1f, 0xe9, 0xb3, 0xd7, 0xc2, 0x5e, 0x2f, 0xe8, 0x1e, 0x7a, 0xe2, 0xaf, 0x56, 0xdb, 0x10, 0x58, 0x31, 0x0b, 0xa2, 0xad, + 0xea, 0x67, 0x9b, 0x35, 0x23, 0xb0, 0x45, 0xbc, 0x57, 0xb0, 0x39, 0x48, 0xee, 0xd4, 0x9e, 0xe5, 0x2b, 0x9e, 0xe7, 0xf2, 0xe5, 0x68, 0x4d, 0x6d, 0xe4, 0x29, 0x97, 0xbb, 0x9c, 0x40, 0x16, 0x5e, + 0xae, 0x6c, 0xd2, 0x9e, 0x3e, 0xb7, 0x2c, 0x75, 0xd7, 0x29, 0x16, 0x03, 0x94, 0xec, 0x4c, 0x35, 0x72, 0xaa, 0xa9, 0xfe, 0x36, 0xae, 0x6a, 0x73, 0xe5, 0xd6, 0x0c, 0x83, 0x4b, 0x43, 0xfb, 0x75, + 0xff, 0xc8, 0x1d, 0x5c, 0x93, 0x57, 0x96, 0x99, 0xad, 0x26, 0x9b, 0x0b, 0xd6, 0x5d, 0x5d, 0xf8, 0x1b, 0x7b, 0xe2, 0xbf, 0x85, 0xcd, 0x7f, 0x23, 0x50, 0x7c, 0x6d, 0xc5, 0x3e, 0xe2, 0xdb, 0xdf, + 0x38, 0x14, 0xff, 0x02, 0x1c, 0x8a, 0x87, 0xd2, 0x68, 0x09, 0xa0, 0xf0, 0x7d, 0x11, 0x3c, 0x03, 0x50, 0x68, 0xc3, 0xec, 0x55, 0x83, 0x4d, 0x98, 0x4e, 0x6e, 0x27, 0x79, 0xc1, 0x78, 0x82, 0x53, + 0x8d, 0x6d, 0xac, 0x18, 0xae, 0xd7, 0x88, 0x91, 0x27, 0x4a, 0xaf, 0x96, 0x26, 0xbe, 0xb2, 0xb6, 0x12, 0x74, 0x0c, 0x42, 0x00, 0x87, 0xcd, 0x54, 0x0f, 0x5b, 0x8d, 0x3c, 0x62, 0x5d, 0xa7, 0xd2, + 0x74, 0x52, 0x36, 0x6a, 0xb5, 0x58, 0xfb, 0x5c, 0x3c, 0xd5, 0xa8, 0x58, 0xb3, 0x18, 0x70, 0x60, 0xe0, 0xf5, 0x44, 0xef, 0x40, 0xe6, 0x33, 0x66, 0xff, 0x1f, 0x07, 0xa0, 0xf0, 0xa5, 0xe8, 0xff, + 0x86, 0x51, 0x78, 0xfb, 0x5a, 0xe8, 0xff, 0x6d, 0x30, 0x0a, 0x55, 0x94, 0x1a, 0xdd, 0x2a, 0x7d, 0x58, 0x92, 0x08, 0xfa, 0x09, 0xbf, 0xb0, 0x01, 0xfc, 0x41, 0xf5, 0x60, 0x5d, 0x9d, 0x8f, 0x8f, + 0xb5, 0x1d, 0x5a, 0x6c, 0xfa, 0x8e, 0x1a, 0x20, 0x48, 0xc5, 0xca, 0xcd, 0xc5, 0xb9, 0x03, 0x8c, 0x56, 0x54, 0x2e, 0x00, 0xeb, 0x25, 0x80, 0xad, 0x47, 0x9d, 0xda, 0x66, 0x70, 0x66, 0x4d, 0x04, + 0x32, 0xa7, 0x50, 0xf9, 0x68, 0x9a, 0x6a, 0x19, 0xb9, 0x22, 0xfc, 0x72, 0xb6, 0xc0, 0xf7, 0x16, 0x31, 0x98, 0x70, 0xc2, 0x10, 0x2c, 0x36, 0x10, 0x37, 0xe9, 0xfb, 0xe0, 0x88, 0x00, 0x21, 0x1b, + 0x51, 0xd8, 0x22, 0xeb, 0x04, 0xc5, 0x00, 0x2b, 0x9f, 0x45, 0xdb, 0xfd, 0x29, 0x60, 0xeb, 0xc3, 0x87, 0xc6, 0x8f, 0x17, 0x4f, 0x2f, 0x2d, 0xbe, 0x8f, 0x24, 0x0f, 0x9c, 0x3c, 0x1e, 0xb4, 0x59, + 0x5e, 0x43, 0xdd, 0x7c, 0x21, 0xf5, 0xbc, 0x86, 0xa0, 0x13, 0x6f, 0xbb, 0x17, 0x77, 0xf2, 0xb0, 0xa4, 0x40, 0x49, 0x2c, 0x04, 0x2e, 0x8f, 0xbf, 0xeb, 0x7d, 0xad, 0x52, 0x37, 0x37, 0xbb, 0x96, + 0xeb, 0x9b, 0xdd, 0x53, 0x5d, 0xac, 0x2f, 0xa6, 0xcc, 0x17, 0x7a, 0xca, 0x2d, 0xf5, 0xe3, 0x77, 0xde, 0x9c, 0x6b, 0x5b, 0x55, 0x92, 0x2a, 0x47, 0x7a, 0xad, 0x60, 0x93, 0x70, 0x61, 0x25, 0x88, + 0x1b, 0x2d, 0x6a, 0x2f, 0xa5, 0x77, 0xa3, 0x5e, 0xbd, 0x41, 0x03, 0x82, 0xaa, 0x77, 0x24, 0xd0, 0x13, 0x6a, 0x80, 0x61, 0x7a, 0x51, 0xc8, 0x99, 0x05, 0xd0, 0x43, 0xad, 0x2a, 0x15, 0x22, 0xdd, + 0x0c, 0xa6, 0xb0, 0x44, 0x4d, 0x86, 0x94, 0x1f, 0x86, 0x8c, 0xd8, 0x51, 0x98, 0x45, 0x47, 0xf1, 0xa8, 0x39, 0x56, 0xa8, 0x10, 0x30, 0x5b, 0x03, 0xcf, 0x7a, 0xce, 0x17, 0x4e, 0x86, 0xa0, 0x48, + 0x83, 0x22, 0x75, 0x4e, 0x45, 0x26, 0x7f, 0xfc, 0x03, 0xfc, 0x09, 0x7d, 0xf2, 0x0c, 0xdc, 0x0d, 0xe4, 0xbc, 0xd4, 0xd7, 0x57, 0x15, 0x3c, 0x4f, 0x0a, 0xfd, 0x6a, 0x19, 0xf9, 0x20, 0x9e, 0xf6, + 0xb4, 0x85, 0x8e, 0xb5, 0xe8, 0xb1, 0xd7, 0x3b, 0xeb, 0xf7, 0x67, 0xe2, 0x57, 0x14, 0xf2, 0x05, 0x5d, 0xa0, 0x7b, 0xd9, 0x6a, 0x03, 0xfd, 0x7f, 0x90, 0xe6, 0x6c, 0x21, 0x3a, 0x83, 0x09, 0x63, + 0x7a, 0x8a, 0xbc, 0x26, 0x1c, 0x0c, 0xa4, 0x23, 0x87, 0x07, 0x7b, 0x83, 0xb4, 0xb7, 0x56, 0xc7, 0xa6, 0x95, 0xc2, 0xbc, 0x40, 0x59, 0xc8, 0x74, 0x10, 0xc4, 0xfd, 0x9d, 0x37, 0x75, 0x11, 0xd4, + 0x94, 0x6b, 0x49, 0xa6, 0xb6, 0xab, 0xa5, 0x37, 0x90, 0x72, 0x65, 0xb2, 0xe4, 0xf4, 0x21, 0x38, 0x80, 0x57, 0xdc, 0xd2, 0xe9, 0x44, 0x19, 0xc3, 0x67, 0xb6, 0xe8, 0x06, 0xbd, 0x67, 0xd2, 0xfc, + 0x03, 0x2a, 0xf5, 0x0c, 0xaa, 0xfe, 0x88, 0x95, 0xdf, 0xd7, 0x00, 0x47, 0x8a, 0x07, 0x26, 0x1e, 0xfe, 0xb7, 0xc5, 0xc8, 0xe5, 0x39, 0x79, 0x05, 0xb9, 0xd4, 0x76, 0xb2, 0x5d, 0xd9, 0xd4, 0x36, + 0xec, 0xad, 0xe6, 0x9e, 0x5b, 0x74, 0x84, 0x8d, 0x53, 0xaf, 0xb6, 0xa3, 0xac, 0xb4, 0x62, 0x22, 0xd0, 0x0b, 0x39, 0xe8, 0x19, 0x8b, 0x15, 0xc7, 0x81, 0x40, 0xdf, 0xcb, 0xd3, 0x55, 0x35, 0xa4, + 0xf6, 0x0c, 0x09, 0x03, 0x41, 0x7f, 0xa3, 0xe5, 0x7c, 0xc6, 0x7a, 0xc3, 0xb1, 0x6a, 0x80, 0xd5, 0x38, 0x8b, 0x0c, 0xb4, 0x49, 0x97, 0xd4, 0xe0, 0x8a, 0x7d, 0x4f, 0x75, 0x66, 0x9b, 0x6d, 0xcb, + 0x5a, 0xf5, 0x7d, 0xf7, 0x4b, 0x6c, 0xe1, 0xef, 0x77, 0xbd, 0x77, 0x9a, 0x40, 0xf7, 0x7c, 0xd4, 0xb6, 0xcb, 0x21, 0x95, 0xc1, 0xba, 0x86, 0x52, 0x27, 0xd8, 0x8c, 0x06, 0x49, 0x74, 0xcb, 0x0f, + 0x16, 0xd8, 0x32, 0x9e, 0x2e, 0xe6, 0x14, 0x52, 0x79, 0x5b, 0xca, 0x1f, 0x6f, 0x04, 0xa7, 0x08, 0xe0, 0xdd, 0x5c, 0x2f, 0x01, 0x14, 0x5a, 0x84, 0xb0, 0x19, 0x48, 0xa0, 0x51, 0xeb, 0xd2, 0x06, + 0x2d, 0x94, 0x2d, 0x6f, 0x7a, 0x15, 0x57, 0xda, 0xf8, 0x20, 0x2b, 0x35, 0xc3, 0x5f, 0xf3, 0x9d, 0xa1, 0x3c, 0xd0, 0x73, 0xe2, 0xeb, 0x4d, 0x8a, 0x3a, 0xfc, 0xc2, 0xb3, 0xf1, 0xfd, 0xad, 0xad, + 0x3a, 0x3c, 0x7c, 0x75, 0x78, 0xf4, 0x63, 0xb4, 0xd8, 0xd6, 0x5a, 0xed, 0xd1, 0xda, 0x66, 0x37, 0x59, 0x01, 0xeb, 0x84, 0x9b, 0x0d, 0x37, 0x26, 0x29, 0x17, 0x90, 0xec, 0x17, 0x93, 0x20, 0x59, + 0x3b, 0xfb, 0x84, 0x83, 0x75, 0x7e, 0x2b, 0x4a, 0x14, 0x46, 0xe9, 0x7d, 0x44, 0xb2, 0x34, 0x56, 0x8c, 0x05, 0xc2, 0x2a, 0x40, 0x99, 0xd4, 0x80, 0x06, 0xc2, 0xe3, 0x2d, 0x1f, 0x0e, 0xf7, 0x8a, + 0x5c, 0x6e, 0x1c, 0x03, 0xb1, 0x1c, 0x5a, 0xee, 0x31, 0x7c, 0xd0, 0xc7, 0x7f, 0x73, 0x8c, 0xdd, 0x26, 0xa9, 0xff, 0xdb, 0x3b, 0xe7, 0xee, 0x6b, 0xda, 0x1f, 0xff, 0xa5, 0xa9, 0x9a, 0xe9, 0x03, + 0x47, 0xc3, 0xd7, 0x4a, 0xd5, 0xe0, 0x91, 0xa7, 0x88, 0xf8, 0x09, 0xc1, 0x3f, 0xa1, 0xef, 0x73, 0xf4, 0x13, 0x7d, 0xa0, 0x7b, 0xd1, 0xe8, 0xbe, 0x93, 0x7d, 0xce, 0x6a, 0x25, 0x87, 0xea, 0xc8, + 0xa0, 0xf7, 0xd0, 0x4a, 0xaf, 0x5d, 0x73, 0x26, 0x2c, 0x76, 0x9b, 0x70, 0x85, 0x3a, 0xb3, 0xc4, 0xa9, 0x12, 0xc2, 0x61, 0x5d, 0x38, 0x1c, 0xf2, 0x10, 0x6f, 0x52, 0xc8, 0x60, 0xe5, 0x77, 0x12, + 0x98, 0x97, 0xf6, 0x10, 0x2e, 0x8c, 0x17, 0xf6, 0x04, 0xec, 0x34, 0x84, 0x11, 0x06, 0x76, 0x39, 0xeb, 0x49, 0xf9, 0xd8, 0x37, 0x8b, 0xc1, 0x92, 0x9d, 0xba, 0xd3, 0x11, 0x34, 0xd7, 0xc7, 0xcf, + 0x2c, 0xcc, 0xf7, 0x6c, 0xdb, 0x1b, 0x5e, 0xbf, 0x7f, 0x92, 0xe3, 0xda, 0x8e, 0xef, 0xda, 0xce, 0x69, 0x66, 0x21, 0x0e, 0x26, 0xce, 0x83, 0x11, 0x7b, 0xfe, 0x81, 0xe9, 0xc7, 0x66, 0xda, 0x2d, + 0x55, 0xdf, 0x35, 0x8e, 0x9b, 0xe4, 0xae, 0x61, 0x86, 0x5f, 0xc6, 0x0f, 0x12, 0x3f, 0xa1, 0x57, 0xc2, 0x61, 0x9e, 0x3f, 0x0f, 0xe8, 0x7e, 0x75, 0xb5, 0x7b, 0x7a, 0xee, 0x73, 0xa1, 0xac, 0x91, + 0x3c, 0x23, 0x1a, 0x61, 0x51, 0x60, 0xbe, 0xe5, 0x56, 0x1b, 0x66, 0xbd, 0x69, 0xe6, 0x0c, 0x3b, 0x16, 0x3b, 0x7e, 0xd8, 0x1f, 0xac, 0x0c, 0x75, 0x6b, 0xe7, 0xeb, 0xd1, 0xc4, 0xe6, 0x35, 0x28, + 0x65, 0x55, 0x0a, 0xf7, 0x84, 0x34, 0xa7, 0x7b, 0x83, 0x60, 0x40, 0xf0, 0x10, 0x69, 0x45, 0xdb, 0xc9, 0x78, 0x40, 0xae, 0x42, 0x80, 0x02, 0x1c, 0x5c, 0x9c, 0x58, 0xac, 0x14, 0x03, 0x26, 0x34, + 0x41, 0xdb, 0x38, 0x2d, 0xee, 0x88, 0xe0, 0x2f, 0xe0, 0xdf, 0x99, 0xfa, 0x81, 0x5b, 0xe7, 0xe3, 0xd6, 0xbc, 0x91, 0x17, 0xfd, 0x69, 0xb5, 0x2f, 0x97, 0xf2, 0x60, 0x2c, 0x2c, 0x58, 0x95, 0x96, + 0x34, 0x6c, 0xc7, 0x30, 0x59, 0x3f, 0x8a, 0x19, 0xc3, 0x5d, 0xb1, 0x59, 0x12, 0xab, 0x79, 0x8c, 0x58, 0x53, 0x7f, 0x8c, 0x76, 0xe0, 0x91, 0xb4, 0xd8, 0x2d, 0x83, 0xc1, 0x7a, 0x13, 0xae, 0x8b, + 0x7a, 0x61, 0x50, 0x7d, 0x6c, 0xb0, 0xe9, 0x27, 0x8b, 0xcd, 0x66, 0x59, 0x82, 0xae, 0x86, 0x23, 0x73, 0x6f, 0x4e, 0x18, 0x4b, 0xda, 0x78, 0xb6, 0x0e, 0xfe, 0xba, 0xc3, 0x7e, 0xd9, 0xff, 0x8e, + 0x5d, 0x18, 0x7d, 0x14, 0x96, 0xf9, 0x29, 0x36, 0xd2, 0xcb, 0xba, 0x79, 0xb4, 0x33, 0xc3, 0x73, 0x44, 0xd9, 0xdd, 0x15, 0x56, 0xdb, 0x90, 0xb4, 0x5f, 0x17, 0x6e, 0x95, 0xf8, 0x35, 0xda, 0x57, + 0x7b, 0x11, 0x5e, 0xd0, 0x3f, 0x3b, 0x3e, 0x4f, 0xad, 0xee, 0x91, 0xe6, 0x95, 0xf8, 0xde, 0x1e, 0x76, 0xef, 0x25, 0xa8, 0x8c, 0xf1, 0x9d, 0x32, 0x37, 0x96, 0x0e, 0x29, 0xd7, 0x93, 0x0a, 0x59, + 0x08, 0x9a, 0x1c, 0x00, 0x45, 0x47, 0x4c, 0xac, 0x8c, 0xda, 0x0f, 0xe2, 0xcd, 0x14, 0x9c, 0x59, 0xbd, 0x2c, 0x21, 0x01, 0xb3, 0x87, 0x6e, 0xf6, 0xfb, 0x69, 0x3c, 0xe3, 0xf6, 0xbd, 0xe1, 0x1c, + 0x1a, 0xfa, 0x75, 0x3f, 0x9f, 0xae, 0x19, 0x71, 0x2a, 0x75, 0xc8, 0x30, 0xf7, 0x93, 0xe1, 0xde, 0x9d, 0xeb, 0x9d, 0x14, 0x4b, 0x2e, 0xbb, 0xf7, 0xdb, 0x7d, 0x31, 0xbe, 0x3d, 0x14, 0xe5, 0xf1, + 0xca, 0x09, 0x30, 0x5e, 0x8f, 0xc2, 0xd2, 0x4c, 0xcf, 0x9b, 0x1f, 0xbd, 0x5f, 0xec, 0x7f, 0xfb, 0xd0, 0x3f, 0x6f, 0x97, 0xc2, 0xb8, 0x10, 0xe7, 0x23, 0x76, 0xc3, 0x37, 0x80, 0xe0, 0xed, 0xd9, + 0x7d, 0x1d, 0x25, 0x79, 0xa4, 0xd3, 0x8e, 0xc5, 0x42, 0xee, 0x76, 0xac, 0x9e, 0x1f, 0x4f, 0x44, 0xbd, 0x1a, 0xa2, 0xf9, 0x66, 0x4d, 0x02, 0xd3, 0x74, 0xb9, 0xcc, 0x87, 0x90, 0xad, 0xb8, 0x1d, + 0x8b, 0x1c, 0x26, 0x7e, 0x4d, 0x19, 0x51, 0x91, 0xaa, 0xbe, 0x3e, 0xdc, 0x0c, 0xa5, 0xcd, 0x10, 0xee, 0x88, 0x76, 0x7f, 0xb4, 0x70, 0xbc, 0x5d, 0x5f, 0xeb, 0x8c, 0x87, 0x34, 0x9f, 0xf4, 0xb4, + 0x42, 0xa9, 0x06, 0xd0, 0x5e, 0xdf, 0x49, 0x2b, 0x34, 0x36, 0x17, 0x57, 0xa5, 0x08, 0xde, 0x5e, 0x62, 0xf1, 0x6d, 0xc4, 0xe4, 0xe7, 0x8e, 0x78, 0xdc, 0x82, 0xd2, 0xd5, 0xf8, 0x23, 0x74, 0xfe, + 0xe8, 0x6e, 0xf8, 0x55, 0xef, 0x18, 0xbb, 0xbd, 0xfb, 0x4e, 0x8c, 0x25, 0x76, 0x0c, 0x9d, 0x78, 0x2e, 0xb6, 0x1b, 0x79, 0x3f, 0x12, 0xdf, 0xa1, 0x17, 0x20, 0xaf, 0x89, 0xef, 0xf2, 0x09, 0xc7, + 0x09, 0xfa, 0xa2, 0xdd, 0x3d, 0xd2, 0x6d, 0x27, 0x4e, 0xc9, 0xa2, 0x56, 0xb9, 0xd1, 0x29, 0x87, 0x06, 0x95, 0x0f, 0x25, 0xbd, 0x4f, 0xf6, 0xfb, 0xb5, 0x9c, 0x43, 0x96, 0xbc, 0xd9, 0x2f, 0x12, + 0xca, 0xe5, 0x60, 0x7d, 0xc1, 0xe0, 0x0d, 0x43, 0x93, 0x22, 0xa2, 0xc7, 0xd9, 0x80, 0xa6, 0xca, 0xf9, 0x3e, 0xee, 0x35, 0x53, 0xd6, 0xc6, 0x59, 0x60, 0x31, 0x1a, 0x4d, 0x64, 0x6a, 0x49, 0x92, + 0x80, 0xda, 0x00, 0xe3, 0x82, 0x61, 0x29, 0x3e, 0x13, 0xd7, 0x1a, 0x6b, 0xff, 0xb6, 0x38, 0x4f, 0xdf, 0x13, 0x9e, 0xac, 0x9b, 0x1f, 0x57, 0x25, 0xe2, 0xde, 0x9e, 0xb0, 0x3d, 0xbc, 0x36, 0x89, + 0xde, 0x3e, 0xf1, 0x1c, 0xfa, 0x2d, 0x9e, 0x87, 0x67, 0x8b, 0xe8, 0xdc, 0x38, 0x6e, 0xe3, 0xb6, 0xe0, 0x36, 0xd4, 0x8d, 0x7b, 0xf4, 0xda, 0xed, 0xb9, 0xba, 0x54, 0x9a, 0x6b, 0x64, 0x35, 0xae, + 0x3d, 0x44, 0x1a, 0x0b, 0x7a, 0xbc, 0x2c, 0xfb, 0xab, 0x87, 0xfc, 0xba, 0xfb, 0xa1, 0x17, 0x75, 0x1d, 0x1e, 0x2b, 0xe2, 0x6b, 0xf5, 0xdf, 0xfe, 0x33, 0xcf, 0xc4, 0x0f, 0x73, 0xe8, 0xfb, 0xe1, + 0x1d, 0xb7, 0xfd, 0xdb, 0xfd, 0x4f, 0xcc, 0x8d, 0xf9, 0x0a, 0xe9, 0xb3, 0x4a, 0xea, 0x4e, 0x36, 0x81, 0x25, 0xb2, 0x96, 0x1f, 0x8d, 0x48, 0xc2, 0x5f, 0x17, 0x25, 0xf8, 0xbd, 0x4f, 0x7c, 0x58, + 0xd8, 0xe3, 0xed, 0xed, 0x76, 0x97, 0x0d, 0x7b, 0xf1, 0x43, 0x9f, 0x15, 0xf8, 0x38, 0x52, 0x7e, 0xfe, 0xd1, 0xc7, 0x51, 0xe4, 0xad, 0xbd, 0xca, 0xd8, 0x8e, 0x73, 0x14, 0x24, 0x85, 0xb1, 0x4b, + 0x25, 0xfd, 0x2d, 0x1a, 0xad, 0xb8, 0xcc, 0x5e, 0xc1, 0x83, 0x84, 0x62, 0x9b, 0x0c, 0x9e, 0xc5, 0xbb, 0x00, 0x55, 0x25, 0x59, 0xf3, 0x82, 0x8e, 0x32, 0xd8, 0x0c, 0xf4, 0x0d, 0xba, 0xb0, 0x86, + 0xe2, 0x32, 0x45, 0x0b, 0x41, 0x54, 0x02, 0x15, 0x34, 0x6b, 0xd4, 0xc2, 0x7c, 0x9b, 0x4f, 0x77, 0x34, 0xa8, 0x6e, 0x41, 0x49, 0xb8, 0x82, 0x13, 0x7b, 0x7b, 0x69, 0x14, 0x5d, 0xd5, 0xff, 0xb8, + 0x2a, 0x06, 0xf8, 0x76, 0x3d, 0x88, 0xfe, 0xed, 0xf2, 0xff, 0x87, 0xc9, 0x66, 0x1e, 0x71, 0x26, 0x80, 0xd3, 0xbf, 0xf4, 0x91, 0x1f, 0x0c, 0x7c, 0xa9, 0x5a, 0xfe, 0x2d, 0x71, 0xa0, 0xfb, 0x71, + 0x78, 0xcc, 0xd0, 0x6f, 0xb1, 0xc0, 0xc0, 0x4a, 0x62, 0xc9, 0x0c, 0x7a, 0xb1, 0xbf, 0x76, 0xca, 0xbd, 0x64, 0x6e, 0xf8, 0x2d, 0xb3, 0x2c, 0x87, 0xe5, 0x84, 0x36, 0x46, 0x78, 0x3c, 0xc8, 0x8c, + 0xd0, 0x87, 0x6d, 0xc0, 0xa0, 0xe2, 0x3c, 0x28, 0x86, 0x83, 0x99, 0x69, 0x48, 0xe8, 0x20, 0x4d, 0xb0, 0x34, 0x63, 0xb2, 0x6d, 0x27, 0x28, 0x29, 0x01, 0x87, 0xc0, 0xb1, 0x23, 0xaa, 0x53, 0x78, + 0x83, 0xad, 0x21, 0x63, 0x3a, 0x0d, 0x19, 0x6e, 0xbf, 0x7b, 0xb6, 0x96, 0xbb, 0x6f, 0xaf, 0x9d, 0x6b, 0x7d, 0xe0, 0xd7, 0x81, 0xc7, 0x47, 0x12, 0xe7, 0x24, 0x3d, 0xf4, 0x36, 0xc5, 0xc3, 0xcc, + 0xe2, 0xd4, 0x34, 0xdf, 0x0d, 0xb9, 0x9b, 0xec, 0x92, 0x53, 0xe6, 0xc9, 0x7b, 0xa0, 0xc5, 0xe7, 0x0c, 0x98, 0x0f, 0xd8, 0xda, 0xa3, 0x1d, 0x77, 0x85, 0x2d, 0xfb, 0x9e, 0x3e, 0x63, 0xa5, 0xe6, + 0xbb, 0x17, 0xee, 0x76, 0x26, 0x3c, 0x18, 0x82, 0xb5, 0x1a, 0x7c, 0x54, 0x96, 0x40, 0x6e, 0x6b, 0xd5, 0x85, 0x6e, 0xa0, 0xe6, 0xba, 0xf3, 0xd1, 0x69, 0xae, 0xbe, 0x27, 0xbb, 0x5b, 0xf8, 0xf1, + 0x9c, 0xc0, 0x72, 0xee, 0x47, 0x17, 0x1c, 0x7c, 0x96, 0xbd, 0xf8, 0x68, 0x5c, 0xa3, 0x37, 0x09, 0x3b, 0xed, 0xbb, 0xd6, 0x75, 0xf2, 0x21, 0xfa, 0x29, 0xde, 0xf5, 0xed, 0x51, 0x87, 0x32, 0xa2, + 0x41, 0x65, 0x94, 0x01, 0x3a, 0xeb, 0x9b, 0x1c, 0xca, 0x21, 0x73, 0x49, 0x84, 0x95, 0x3e, 0x4c, 0xcb, 0x2b, 0x5a, 0xdd, 0x57, 0x3c, 0x35, 0xef, 0x27, 0x4a, 0x20, 0x78, 0xf9, 0x90, 0x54, 0x31, + 0x68, 0x02, 0xcf, 0x35, 0x70, 0x1f, 0xaf, 0xfd, 0x68, 0x38, 0x0f, 0xfb, 0x53, 0xa6, 0x4a, 0xbc, 0xb8, 0x0a, 0xa9, 0x48, 0x8d, 0xd0, 0xd8, 0xf4, 0x45, 0xd2, 0x47, 0xe6, 0x13, 0xa3, 0x44, 0xec, + 0xf9, 0xef, 0x9b, 0x36, 0xe7, 0x44, 0xc4, 0x8b, 0x30, 0xe9, 0xb7, 0x87, 0x73, 0xe0, 0xaf, 0x8e, 0xf3, 0x70, 0x02, 0x84, 0x7f, 0xa2, 0x2f, 0x6a, 0xcc, 0x77, 0xe2, 0x40, 0xf7, 0x7c, 0xd4, 0x3d, + 0x11, 0x6b, 0xc7, 0x5e, 0x7a, 0x33, 0xee, 0x17, 0x4d, 0xc3, 0x94, 0x4c, 0x34, 0xc2, 0x50, 0x71, 0xc4, 0xf5, 0x33, 0x93, 0x51, 0x43, 0xca, 0x19, 0x20, 0x7d, 0x93, 0x89, 0x52, 0x9b, 0xe1, 0x31, + 0x61, 0x89, 0xf3, 0xc2, 0x76, 0xeb, 0xc1, 0x9b, 0x7e, 0x68, 0xf4, 0x56, 0x7d, 0x38, 0x6b, 0x8c, 0x1d, 0x4a, 0x6d, 0x78, 0xcb, 0x33, 0x6c, 0x91, 0xee, 0x6f, 0xf9, 0x95, 0x1a, 0x6e, 0x65, 0x3d, + 0xa6, 0x69, 0x6e, 0xba, 0xd8, 0xb0, 0xd5, 0xef, 0x9b, 0x1a, 0x97, 0x58, 0x17, 0x3f, 0xfe, 0x01, 0x5e, 0xc2, 0xb5, 0xbc, 0x3d, 0x64, 0x73, 0xf0, 0x15, 0x87, 0xe1, 0x9b, 0xc0, 0xf7, 0xf6, 0x0c, + 0x0e, 0x0e, 0xbc, 0x0d, 0xb2, 0x63, 0x79, 0xf7, 0x96, 0xf6, 0x78, 0xc6, 0xee, 0x66, 0xfb, 0xce, 0xda, 0x13, 0xf2, 0x80, 0xc2, 0x85, 0x2d, 0x4c, 0x44, 0x14, 0x3a, 0xa4, 0x87, 0x03, 0x7e, 0xd8, + 0x57, 0x14, 0x74, 0x81, 0x6e, 0x13, 0x93, 0x9d, 0x6e, 0xfb, 0x25, 0x4e, 0xe6, 0xcb, 0x8e, 0xa7, 0x21, 0xe5, 0x0e, 0x98, 0xd7, 0x2a, 0xb7, 0x99, 0x81, 0xb3, 0x25, 0x57, 0x6f, 0xf2, 0x80, 0x5f, + 0x08, 0xa0, 0xd6, 0x51, 0x8d, 0xd5, 0x72, 0x50, 0x6a, 0x19, 0x34, 0x1b, 0xa8, 0x23, 0xf8, 0x8b, 0xa9, 0xe7, 0x2e, 0x3b, 0xee, 0x6b, 0x85, 0xc7, 0xb6, 0x09, 0xf4, 0xe2, 0xd0, 0xbe, 0xf3, 0x9c, + 0x07, 0x65, 0x61, 0x3f, 0xfb, 0x03, 0xdf, 0x1e, 0x71, 0x10, 0xb7, 0x66, 0x7a, 0x67, 0x8e, 0xba, 0x4e, 0x95, 0xcc, 0x70, 0x11, 0x50, 0xc7, 0x25, 0x6c, 0x41, 0xb6, 0x30, 0x22, 0xfd, 0xe9, 0x3a, + 0xdf, 0x48, 0xa3, 0x28, 0xe9, 0xa3, 0x35, 0x87, 0x47, 0x0b, 0x66, 0xbd, 0x8e, 0xf4, 0x22, 0xa0, 0x32, 0xab, 0x9f, 0x78, 0xbb, 0x6d, 0x98, 0xb8, 0xb2, 0xe0, 0x04, 0x42, 0xb5, 0x00, 0x82, 0xc1, + 0x88, 0x8f, 0x89, 0xb5, 0xe9, 0xf8, 0x39, 0x92, 0xf8, 0xb8, 0x3f, 0x70, 0xbf, 0xe8, 0x97, 0xbf, 0x38, 0xf8, 0x6f, 0x97, 0xff, 0x3f, 0xa6, 0x5d, 0x4b, 0xcd, 0x72, 0xd7, 0xaa, 0x8f, 0x35, 0x8c, + 0xde, 0xe3, 0xab, 0xbf, 0x2a, 0xf7, 0xf7, 0x82, 0xb7, 0xe4, 0xde, 0x13, 0xde, 0x8b, 0x26, 0x9d, 0x9b, 0x6d, 0xc3, 0xdc, 0xed, 0xb2, 0x3f, 0x5d, 0x89, 0xf1, 0x36, 0xdb, 0xa4, 0x63, 0x09, 0xa1, + 0x50, 0x75, 0xdb, 0xe7, 0xc7, 0x86, 0xe6, 0xf3, 0x60, 0xce, 0x24, 0x28, 0x4c, 0xb3, 0x00, 0xbc, 0xad, 0x88, 0x68, 0xaf, 0xb9, 0x7e, 0xcf, 0x81, 0xa0, 0x22, 0xaa, 0x20, 0xb0, 0xc9, 0x17, 0x30, + 0x5b, 0x0c, 0xd5, 0x46, 0xa4, 0x2d, 0x4f, 0x4b, 0x33, 0x05, 0x0b, 0xfd, 0x4e, 0x38, 0xf3, 0x31, 0x8f, 0x59, 0x78, 0x1e, 0xb6, 0x5c, 0x5c, 0x39, 0x4d, 0x5a, 0xcc, 0xb8, 0x0f, 0x60, 0x3e, 0xff, + 0x2b, 0x8c, 0x0c, 0xd3, 0x77, 0x35, 0xc0, 0xca, 0x7e, 0x66, 0xba, 0x1a, 0x3e, 0xde, 0xf1, 0x81, 0xaf, 0x76, 0xaa, 0x5a, 0xf3, 0xf1, 0x33, 0x7d, 0xa0, 0x7b, 0xd1, 0x38, 0x0e, 0xe3, 0x16, 0x39, + 0x44, 0x08, 0x62, 0x23, 0xb1, 0x30, 0xd9, 0x21, 0x9a, 0x8d, 0x85, 0x5b, 0x8d, 0x07, 0x3a, 0x7d, 0x19, 0x1f, 0xc3, 0xe6, 0x84, 0x69, 0x14, 0x2a, 0x74, 0xd1, 0xde, 0xcc, 0x9a, 0x84, 0x3c, 0x66, + 0xd9, 0xce, 0x6c, 0x69, 0xdb, 0xb3, 0x92, 0x36, 0x80, 0x78, 0x28, 0x2e, 0xec, 0x49, 0x66, 0x50, 0xf6, 0x26, 0xce, 0x8b, 0x61, 0x41, 0x24, 0x09, 0x30, 0x98, 0x97, 0x53, 0x79, 0xe8, 0x3b, 0x65, + 0xc6, 0x2f, 0xfb, 0xdc, 0xb3, 0x10, 0xf0, 0x07, 0x8e, 0xa7, 0xcb, 0x4f, 0xca, 0xd5, 0xfc, 0xc7, 0x7b, 0x30, 0xfc, 0x95, 0x0d, 0x90, 0x16, 0x61, 0x37, 0x56, 0x53, 0xd5, 0xf7, 0xcd, 0x73, 0x10, + 0x2f, 0xf4, 0xb3, 0xd7, 0x42, 0x06, 0x27, 0x82, 0xf7, 0x05, 0xf0, 0x4a, 0x29, 0xf5, 0x5b, 0xe2, 0xef, 0xdc, 0xcf, 0xd5, 0xfc, 0x18, 0x7d, 0xdf, 0x82, 0xf5, 0x63, 0xd9, 0x1f, 0x4d, 0x28, 0x50, + 0xf7, 0x73, 0xb8, 0xb3, 0xb6, 0x09, 0x4d, 0xd7, 0x93, 0xce, 0xb2, 0x99, 0x1b, 0x93, 0xb2, 0x84, 0x7a, 0x3a, 0x3c, 0x16, 0x13, 0x7a, 0x91, 0x45, 0x53, 0x3e, 0x86, 0x3c, 0x93, 0xd8, 0x7b, 0x79, + 0x4a, 0x4c, 0x60, 0xbc, 0xb3, 0xd9, 0xce, 0x09, 0x58, 0xe8, 0x1b, 0xe5, 0xaa, 0x97, 0x40, 0xc9, 0xb2, 0x19, 0x6f, 0x18, 0xcb, 0x11, 0xac, 0x0e, 0x33, 0x2f, 0xa5, 0xc9, 0xc3, 0xe2, 0x5f, 0x0f, + 0xf9, 0x52, 0x3d, 0x4e, 0x81, 0x3d, 0x4c, 0x03, 0xdf, 0x07, 0x46, 0xbe, 0x25, 0x7e, 0xe2, 0xcb, 0xe1, 0xe8, 0x18, 0x93, 0xd0, 0x02, 0x1f, 0x99, 0xa4, 0xd3, 0x48, 0xcd, 0xf0, 0x72, 0x99, 0x6f, + 0x50, 0x76, 0xbc, 0x5d, 0x52, 0x23, 0x26, 0x1a, 0x20, 0xb0, 0x13, 0x8a, 0xb0, 0x80, 0xd5, 0x3b, 0xbb, 0x1f, 0x6f, 0x58, 0xad, 0xd8, 0x8e, 0x24, 0x08, 0x2b, 0x07, 0x42, 0x92, 0xc2, 0x48, 0x4c, + 0x13, 0xb8, 0x09, 0xb0, 0x8a, 0x2e, 0x67, 0x4a, 0x7f, 0x44, 0xf1, 0x25, 0x06, 0xee, 0x72, 0x03, 0x46, 0x13, 0x67, 0x50, 0x73, 0x29, 0x5e, 0xd1, 0x79, 0xf4, 0xa2, 0xf3, 0xfe, 0xee, 0x28, 0xbe, + 0x19, 0xb2, 0xef, 0x85, 0xd3, 0x92, 0xf7, 0xee, 0x88, 0x3f, 0x8a, 0x5d, 0xf8, 0xaf, 0x4b, 0x94, 0x76, 0xc0, 0xcd, 0x1e, 0xae, 0x69, 0x5e, 0x73, 0x43, 0xdf, 0x50, 0x3f, 0x05, 0xc2, 0x81, 0x2d, + 0xfd, 0xcf, 0x3d, 0x71, 0xb0, 0xec, 0x41, 0x20, 0x23, 0xaa, 0xe3, 0x59, 0x68, 0xcb, 0x21, 0xcf, 0xcf, 0x4c, 0xbb, 0x33, 0xb5, 0x9b, 0x24, 0x73, 0x7b, 0x85, 0x80, 0x06, 0x0b, 0x2d, 0x5a, 0x61, + 0x35, 0x1e, 0x93, 0x0b, 0x8c, 0x69, 0x84, 0xe5, 0x7a, 0x90, 0x4d, 0x94, 0x54, 0xad, 0xdc, 0x0e, 0x1d, 0x31, 0xe2, 0x6a, 0x4d, 0xab, 0x30, 0xe3, 0x4c, 0x12, 0x49, 0x5e, 0x0d, 0x4b, 0x81, 0xb1, + 0xec, 0x15, 0x88, 0xc3, 0x7c, 0xab, 0xbe, 0x98, 0x35, 0x81, 0x9a, 0xea, 0x8d, 0xba, 0x03, 0x0e, 0x1f, 0xd7, 0xcd, 0xdd, 0xe0, 0xcb, 0x19, 0xe7, 0xfb, 0x1b, 0xba, 0x77, 0x9f, 0x00, 0x74, 0x2f, + 0x1a, 0xc7, 0xf9, 0xa6, 0xc5, 0x2e, 0xef, 0x76, 0x4c, 0xc3, 0x5b, 0xad, 0x19, 0x2d, 0x45, 0xdc, 0x35, 0xc7, 0x9e, 0x35, 0x16, 0xd6, 0x3d, 0xc7, 0x5f, 0xeb, 0xd6, 0x6c, 0x05, 0xe3, 0x19, 0x5c, + 0xaa, 0x96, 0xbc, 0x91, 0x74, 0x65, 0xb4, 0xd9, 0x8e, 0xa6, 0x7b, 0x57, 0x9d, 0x2b, 0xf2, 0x80, 0xe1, 0x06, 0x95, 0xe1, 0x43, 0x70, 0x4f, 0xa9, 0x6d, 0x0c, 0xec, 0x58, 0x91, 0xbc, 0x86, 0xbd, + 0xbe, 0x9d, 0xa7, 0xc9, 0x82, 0xc2, 0x13, 0xb1, 0x10, 0x17, 0xaf, 0xe9, 0x4a, 0xc3, 0xb4, 0xcc, 0xb4, 0x9b, 0x47, 0x5d, 0x3d, 0x0a, 0xc3, 0xcb, 0x6c, 0x88, 0x07, 0x49, 0xf1, 0xff, 0x75, 0x44, + 0x8a, 0xba, 0x2c, 0x10, 0xf5, 0x70, 0x13, 0x04, 0x7c, 0x21, 0xe7, 0xe0, 0x33, 0xf9, 0x9b, 0x6a, 0x54, 0x47, 0xb2, 0xcf, 0x39, 0xac, 0xef, 0x37, 0x43, 0x69, 0x9d, 0x99, 0x74, 0x80, 0x4f, 0x7b, + 0xac, 0x56, 0x41, 0xe3, 0x8d, 0x46, 0xa6, 0xf8, 0x74, 0x81, 0x4e, 0x9d, 0x45, 0x8e, 0x38, 0x33, 0x85, 0xdf, 0x0d, 0xa9, 0x98, 0xf7, 0x04, 0x72, 0x39, 0xd8, 0xce, 0xa7, 0x74, 0x21, 0xb1, 0x3c, + 0x35, 0x82, 0x5d, 0xd8, 0x56, 0x62, 0x7d, 0x6b, 0xf0, 0xf4, 0x38, 0x8d, 0xb7, 0xc5, 0x92, 0x71, 0x46, 0xc4, 0x5a, 0x0b, 0x20, 0x77, 0x1b, 0x88, 0x6c, 0xab, 0x2d, 0xa2, 0xd3, 0x07, 0x84, 0x8f, + 0x91, 0x86, 0x21, 0xfc, 0x27, 0x04, 0xfd, 0x84, 0x5e, 0xe8, 0x7f, 0xbf, 0x48, 0x03, 0xdd, 0x53, 0x7e, 0xd2, 0x99, 0xd6, 0x73, 0x86, 0x74, 0xe0, 0xb1, 0x6d, 0x57, 0x36, 0x31, 0xdb, 0x47, 0x53, + 0x8c, 0xab, 0x9d, 0x32, 0x4b, 0x7a, 0x6b, 0x35, 0x0d, 0x66, 0xda, 0xd8, 0xf4, 0xb7, 0x33, 0x90, 0x00, 0x47, 0xc2, 0x38, 0x18, 0xc4, 0x5a, 0xce, 0xf6, 0xa3, 0x7a, 0x23, 0x8e, 0x45, 0xc9, 0x43, + 0xab, 0xc6, 0xd3, 0xa4, 0xfe, 0xb6, 0x31, 0x46, 0xcb, 0xf9, 0x36, 0x4c, 0x0a, 0xab, 0xc8, 0x27, 0x1a, 0xc6, 0x51, 0xab, 0xb9, 0x42, 0x89, 0x22, 0x4d, 0x55, 0xb7, 0x9b, 0xe4, 0xef, 0xaf, 0xf8, + 0xac, 0xcc, 0xcf, 0x0b, 0x4a, 0xe9, 0x17, 0xe1, 0xab, 0x6a, 0x3f, 0x2d, 0x34, 0x12, 0xb8, 0x26, 0x75, 0x2e, 0xaa, 0x68, 0x23, 0x73, 0xa9, 0x5e, 0xa8, 0xed, 0x29, 0x9b, 0xc0, 0x10, 0x28, 0x1b, + 0xc2, 0xba, 0x31, 0x53, 0x44, 0x77, 0x15, 0xd9, 0xba, 0x35, 0x5e, 0x99, 0x2b, 0x36, 0xe8, 0x68, 0xa6, 0xb7, 0xa2, 0x07, 0x80, 0x56, 0xba, 0x5a, 0x83, 0xa4, 0x23, 0x04, 0x77, 0xa5, 0x59, 0x4f, + 0x93, 0xbc, 0x29, 0x90, 0x4d, 0x9b, 0x61, 0xb5, 0xea, 0x11, 0x40, 0xd1, 0xc7, 0x82, 0x7e, 0x1d, 0xbd, 0x36, 0xd8, 0xae, 0x3b, 0xc7, 0x8f, 0xff, 0xeb, 0xab, 0x21, 0x76, 0x02, 0x63, 0xbb, 0x72, + 0x30, 0x75, 0x63, 0xbf, 0xb0, 0xdd, 0x47, 0xa1, 0x07, 0xe8, 0x4f, 0xf8, 0x25, 0x75, 0xff, 0xe4, 0x69, 0x1f, 0x3e, 0xad, 0xf7, 0x76, 0xf7, 0xf4, 0x9c, 0xe7, 0x7c, 0x4f, 0xb4, 0xbe, 0xbd, 0x9b, + 0x09, 0x04, 0xb3, 0x59, 0x66, 0xb2, 0xc4, 0x7a, 0xfb, 0xde, 0x7c, 0x59, 0x48, 0x6c, 0x56, 0xb9, 0x1d, 0x6d, 0x90, 0x83, 0x6e, 0x96, 0x30, 0xb4, 0x19, 0x75, 0xfa, 0xdc, 0x1a, 0xec, 0x61, 0x48, + 0x93, 0x8c, 0xc1, 0x65, 0x4c, 0xf4, 0x15, 0x62, 0xe8, 0xf6, 0xdc, 0xd8, 0x1e, 0x52, 0x78, 0xa0, 0x4b, 0xc9, 0x10, 0x15, 0xa7, 0x6b, 0xb1, 0x5a, 0x00, 0x16, 0x9c, 0xe2, 0xfb, 0x85, 0xf3, 0xe2, + 0xec, 0x7b, 0xe7, 0x1b, 0xf7, 0xb1, 0x99, 0xba, 0x87, 0x65, 0x96, 0xea, 0x77, 0xcf, 0x20, 0xb0, 0xb7, 0x3c, 0xbc, 0xff, 0xd3, 0x4c, 0x8f, 0x62, 0xb3, 0x1b, 0xa8, 0xa1, 0x6a, 0x9f, 0xb6, 0x30, + 0x3f, 0xff, 0xea, 0x0b, 0x87, 0xd9, 0x39, 0x45, 0x5d, 0xf5, 0xbb, 0xa9, 0x69, 0x74, 0x35, 0x5f, 0xd5, 0x77, 0xdd, 0xfc, 0xec, 0x43, 0xfb, 0x94, 0xd4, 0x76, 0xaa, 0xa0, 0x7b, 0x26, 0x45, 0xfc, + 0x84, 0xae, 0xf2, 0x89, 0x4e, 0xbb, 0x3f, 0xa7, 0xed, 0x9f, 0xcf, 0x51, 0xc3, 0x47, 0x78, 0x96, 0x1f, 0x67, 0xd7, 0xdc, 0x75, 0x00, 0xda, 0x07, 0xf0, 0xed, 0xd1, 0xeb, 0x45, 0xfc, 0xed, 0xf6, + 0xfa, 0x1f, 0xe0, 0xf6, 0xfa, 0xdb, 0x1f, 0xf3, 0xc8, 0x9b, 0xd0, 0x72, 0xfc, 0xfe, 0xc5, 0x6a, 0xf1, 0xd3, 0x23, 0x0f, 0xba, 0xf1, 0xd3, 0xc9, 0xd6, 0x0a, 0x72, 0x5c, 0x2d, 0x97, 0xf0, 0x5a, + 0x64, 0xb8, 0x11, 0xe4, 0x90, 0x73, 0x25, 0x33, 0x85, 0x11, 0xda, 0xd7, 0x65, 0xba, 0xc1, 0xfd, 0x65, 0x39, 0x8f, 0xa6, 0x3c, 0x53, 0x14, 0x89, 0xa8, 0x28, 0xd1, 0xd2, 0x29, 0xad, 0xd1, 0xc0, + 0x99, 0xba, 0xca, 0x4c, 0xea, 0x47, 0x55, 0x07, 0x1b, 0xf8, 0xc8, 0x2c, 0xaf, 0xf7, 0x13, 0xc8, 0x65, 0x52, 0x7c, 0xb5, 0x55, 0x2a, 0x39, 0x1f, 0x20, 0xb5, 0x22, 0x79, 0x8e, 0xfe, 0x3b, 0x0a, + 0xf2, 0xc6, 0xaa, 0x3b, 0x95, 0xc5, 0x40, 0x7e, 0x5f, 0x1b, 0xde, 0xf9, 0xd5, 0xf1, 0xcc, 0xf7, 0xee, 0x3e, 0x9f, 0x39, 0xeb, 0xca, 0xcf, 0xbf, 0x7c, 0x9f, 0xa7, 0x8e, 0x6f, 0xf4, 0xe3, 0xdf, + 0xef, 0x61, 0x59, 0xbd, 0xdf, 0xf1, 0x4b, 0xf7, 0x7d, 0x81, 0x8c, 0x77, 0xe7, 0x3d, 0x8e, 0xd8, 0x09, 0x8f, 0x03, 0x6e, 0xff, 0x54, 0x47, 0x3b, 0x3d, 0x06, 0xe8, 0xbe, 0x1f, 0xb4, 0xee, 0x50, + 0x86, 0x07, 0x29, 0x63, 0x07, 0x40, 0x25, 0xce, 0x1c, 0xf4, 0x79, 0x0d, 0xb6, 0x00, 0xc9, 0x9b, 0x57, 0x42, 0xc0, 0x50, 0xa9, 0x5e, 0xe9, 0xf0, 0x26, 0x4a, 0x37, 0xb3, 0xb9, 0x4f, 0x93, 0x2b, + 0x71, 0xa9, 0xf8, 0x32, 0xc4, 0xc5, 0xcb, 0x75, 0xa6, 0x6d, 0x09, 0x13, 0x51, 0x14, 0x23, 0x76, 0xac, 0x79, 0x05, 0xf7, 0xd4, 0xe5, 0x70, 0xb5, 0x10, 0x0b, 0x96, 0x26, 0xab, 0xde, 0x16, 0xcb, + 0x16, 0x3d, 0xe2, 0x77, 0x3a, 0xd4, 0xff, 0xd4, 0x8e, 0x72, 0x3b, 0x3d, 0x9f, 0xe5, 0xff, 0xf7, 0xd4, 0xf7, 0xf7, 0xd4, 0xf7, 0x3f, 0x7f, 0xea, 0xbb, 0x1d, 0x48, 0x7f, 0xad, 0x32, 0xba, 0x7a, + 0x1a, 0xd0, 0xbd, 0x6e, 0xb7, 0x56, 0x4d, 0xbd, 0xce, 0x46, 0x9e, 0xb0, 0x4c, 0x58, 0xf4, 0x7b, 0xeb, 0x5c, 0xe6, 0x13, 0xda, 0xd1, 0x17, 0x85, 0x40, 0x18, 0x05, 0x81, 0x59, 0x75, 0x7f, 0x01, + 0xd4, 0x71, 0x9f, 0xd4, 0x31, 0x9b, 0x58, 0x18, 0x15, 0x11, 0xb3, 0x3c, 0x2a, 0x32, 0x4b, 0xcd, 0x1c, 0x21, 0xa4, 0x39, 0x99, 0x59, 0xcd, 0xb8, 0x36, 0xfa, 0x23, 0x85, 0x89, 0xa6, 0xb6, 0xe7, + 0x47, 0xfb, 0x05, 0x45, 0x21, 0x1d, 0xd4, 0x07, 0x9a, 0xec, 0x77, 0x16, 0x61, 0xbf, 0xa1, 0x64, 0x4a, 0x37, 0x73, 0xf3, 0x28, 0xed, 0xee, 0xcc, 0xfa, 0xf2, 0x47, 0x6d, 0xc5, 0x77, 0x7e, 0xd8, + 0x5f, 0x2b, 0xb6, 0xd3, 0x84, 0xfe, 0x0e, 0xec, 0xdd, 0x5a, 0x4c, 0xf9, 0x4e, 0x59, 0xd1, 0x36, 0x23, 0x71, 0x46, 0x69, 0x65, 0x24, 0x8f, 0x12, 0xbc, 0x9a, 0xec, 0x23, 0x8f, 0x63, 0x06, 0x9d, + 0x60, 0xbc, 0x0a, 0xa6, 0x8d, 0xd1, 0x10, 0x69, 0xa7, 0xe8, 0xac, 0x30, 0xd4, 0x47, 0x58, 0x66, 0xb7, 0x8c, 0x07, 0x9a, 0x04, 0x4d, 0x62, 0x44, 0x17, 0x93, 0x84, 0x5a, 0xf5, 0x4a, 0x61, 0xd5, + 0xa7, 0x29, 0xc8, 0x72, 0xf3, 0x6c, 0xec, 0x04, 0x44, 0x2d, 0x82, 0xe5, 0xfe, 0x51, 0xf6, 0x46, 0x2b, 0x3e, 0xdd, 0xe8, 0xf2, 0xff, 0x06, 0x9e, 0x5d, 0x3e, 0xf1, 0x1a, 0x18, 0xfd, 0x74, 0xae, + 0x35, 0x2f, 0x77, 0x34, 0xe3, 0xe6, 0x3c, 0xa0, 0xd5, 0xc0, 0x88, 0x23, 0x6c, 0xb2, 0x2f, 0xf3, 0x4b, 0x42, 0xe5, 0x62, 0xaa, 0xf2, 0xe7, 0xa4, 0x11, 0x65, 0x8e, 0xb5, 0x69, 0x48, 0x83, 0x80, + 0xbc, 0x1e, 0x11, 0x62, 0xbb, 0x95, 0x8a, 0xe9, 0xea, 0x68, 0x53, 0xca, 0xe0, 0xbc, 0x1c, 0xac, 0x06, 0x6a, 0xc8, 0x03, 0x83, 0x84, 0x9e, 0x44, 0x94, 0x68, 0x96, 0xe4, 0x56, 0x07, 0x02, 0x09, + 0xe7, 0xf9, 0x6a, 0xfb, 0xc8, 0x05, 0xf5, 0x2f, 0xea, 0xf2, 0x5f, 0x4c, 0xa9, 0x17, 0x97, 0x6c, 0x3f, 0xd2, 0xb4, 0x23, 0x67, 0xfe, 0x01, 0xdd, 0x03, 0x6d, 0x39, 0x97, 0x18, 0xfe, 0x5c, 0x3f, + 0xea, 0xef, 0x15, 0xec, 0xdf, 0xd3, 0xf8, 0xff, 0xb1, 0xd3, 0xf8, 0xcd, 0x98, 0xfa, 0x6b, 0x55, 0xdb, 0xe5, 0xc3, 0x80, 0xee, 0x55, 0xb3, 0xb5, 0x42, 0x43, 0xa3, 0x3d, 0x94, 0x79, 0x01, 0x3b, + 0x1a, 0xef, 0xbd, 0x01, 0x43, 0x87, 0x42, 0x3f, 0xdf, 0x0c, 0x87, 0xce, 0x20, 0xdd, 0xe6, 0x1c, 0x05, 0x0d, 0x74, 0x30, 0xa3, 0xe3, 0xa2, 0x01, 0xad, 0xc4, 0x42, 0x66, 0x1d, 0x1b, 0x99, 0x0c, + 0xd9, 0x7a, 0xb9, 0xdf, 0x6b, 0x43, 0x10, 0xd7, 0xea, 0x0a, 0x1c, 0xce, 0xb3, 0x59, 0x18, 0x6a, 0x09, 0x8a, 0xea, 0x9c, 0x5b, 0x8e, 0x08, 0x2e, 0x83, 0x00, 0x30, 0xbb, 0xc5, 0x2d, 0xfd, 0x4b, + 0x14, 0xda, 0xfb, 0xaa, 0xef, 0x56, 0x89, 0x7d, 0xb5, 0xf8, 0x53, 0x35, 0x2d, 0x3d, 0xbe, 0xcc, 0xa3, 0xed, 0xa3, 0xef, 0x07, 0x0b, 0x9e, 0x48, 0x02, 0xdd, 0xf7, 0x83, 0xe3, 0x5e, 0x51, 0x8b, + 0x00, 0xc1, 0x30, 0x34, 0x7b, 0xc0, 0xd8, 0x95, 0x00, 0xa7, 0x19, 0x3b, 0x32, 0x1e, 0x1b, 0x4c, 0xa8, 0xd1, 0x79, 0x43, 0x30, 0xde, 0x6c, 0xc9, 0xa5, 0x32, 0x08, 0xce, 0x80, 0xa6, 0x9c, 0x2d, + 0x02, 0x2c, 0x9e, 0x0e, 0x77, 0x3e, 0xbe, 0x2f, 0xd8, 0x94, 0x0d, 0xb7, 0x21, 0xb0, 0xce, 0x97, 0xa2, 0x68, 0x89, 0x39, 0x65, 0x29, 0x3d, 0x00, 0x9a, 0xe7, 0xa6, 0xb3, 0xcb, 0x9a, 0x55, 0x2f, + 0xd1, 0x97, 0xae, 0xfb, 0xa8, 0x22, 0xe9, 0x0d, 0x0b, 0x4e, 0x38, 0x47, 0x5d, 0x3f, 0xb2, 0xed, 0xaf, 0xf1, 0xe0, 0x5f, 0x61, 0xc6, 0x35, 0xf1, 0x23, 0x5b, 0xae, 0x4f, 0x1d, 0x77, 0xbf, 0x5b, + 0x30, 0x08, 0xa6, 0xbd, 0xf9, 0x52, 0xd9, 0x2f, 0x67, 0xa5, 0x63, 0x4e, 0x4b, 0x56, 0xa3, 0x33, 0x7f, 0xb8, 0x90, 0xa7, 0xab, 0x5d, 0xda, 0x59, 0x78, 0xb3, 0x7c, 0x1a, 0xa6, 0xfc, 0x0c, 0x41, + 0xac, 0xce, 0x7a, 0xbc, 0xe1, 0x1b, 0xb3, 0x91, 0x62, 0x45, 0x4f, 0xd6, 0x36, 0xe1, 0xa9, 0x08, 0x8f, 0x1a, 0xf4, 0x36, 0x68, 0x1a, 0xbb, 0x5a, 0x76, 0x54, 0x10, 0xee, 0x79, 0xf3, 0x3d, 0x36, + 0xeb, 0xbb, 0xc8, 0xa4, 0x70, 0x3f, 0xa5, 0xff, 0xa9, 0x7a, 0x94, 0x3e, 0xf2, 0xbc, 0x13, 0x2f, 0x05, 0x8f, 0x1e, 0x29, 0x1e, 0xbe, 0xfb, 0xf0, 0xbf, 0x4b, 0xb4, 0x0b, 0x17, 0x0d, 0xa5, 0x3a, + 0x06, 0x23, 0x08, 0x08, 0x44, 0x43, 0x5b, 0x4e, 0xa1, 0xd9, 0x14, 0xdf, 0x8d, 0x76, 0xd5, 0x22, 0x0d, 0x6c, 0x05, 0x14, 0x96, 0x80, 0xd7, 0xef, 0xc7, 0xa2, 0x5b, 0x69, 0x2b, 0x8f, 0x8d, 0xe6, + 0x22, 0x6a, 0xf8, 0xb4, 0x93, 0x4c, 0xf2, 0x48, 0x2a, 0xfa, 0xe1, 0x60, 0xca, 0x35, 0xf6, 0x72, 0x5d, 0xd9, 0xa0, 0xb2, 0x71, 0xfb, 0x91, 0x54, 0xe3, 0x8b, 0xbd, 0x60, 0x6a, 0xd2, 0xda, 0x21, + 0xdb, 0xec, 0x6b, 0x9d, 0xde, 0xd2, 0xcb, 0x1e, 0xe3, 0x04, 0xbd, 0x82, 0xe9, 0xf9, 0x41, 0xf5, 0x83, 0x0f, 0x5e, 0xb6, 0xef, 0x62, 0xed, 0xd0, 0x3d, 0x39, 0x70, 0x96, 0x07, 0x00, 0x4a, 0x4c, + 0x39, 0x4b, 0x9a, 0xc7, 0xa2, 0x04, 0x4f, 0x80, 0x68, 0x2c, 0x02, 0x88, 0x24, 0xbb, 0x1c, 0x3e, 0xac, 0x36, 0x1d, 0x73, 0xa2, 0x8d, 0x79, 0x27, 0x33, 0xf6, 0x0e, 0xbc, 0x59, 0xf2, 0x86, 0xdf, + 0x41, 0xc0, 0x88, 0x54, 0x59, 0x63, 0xa9, 0x05, 0xd8, 0x44, 0xb3, 0xac, 0x78, 0x38, 0xa4, 0x6c, 0xc0, 0xee, 0x34, 0x2e, 0x34, 0xe8, 0x78, 0xe5, 0xc4, 0x51, 0xb1, 0xf0, 0x3b, 0xfa, 0xe8, 0x46, + 0x65, 0x78, 0x8f, 0xf4, 0xc5, 0x7b, 0x78, 0xcf, 0xb7, 0x99, 0xe3, 0x95, 0xef, 0xf1, 0x4c, 0x27, 0x02, 0xcf, 0x39, 0xe2, 0x21, 0xd6, 0x9a, 0xb7, 0xcb, 0x65, 0x84, 0xc1, 0x84, 0x1a, 0xd6, 0x72, + 0x3d, 0x99, 0xb2, 0x4b, 0x79, 0xa2, 0xb1, 0x9d, 0x32, 0x0c, 0x25, 0xb9, 0x1c, 0x80, 0x01, 0x16, 0x04, 0x3b, 0x1d, 0x5a, 0x72, 0x9d, 0x70, 0x4f, 0xc5, 0xf1, 0xae, 0xcf, 0x0b, 0x63, 0x1e, 0x54, + 0x15, 0xd4, 0xd0, 0xfc, 0x75, 0x5f, 0x8c, 0xd8, 0x85, 0xe3, 0x04, 0x9d, 0x5d, 0x33, 0x40, 0x95, 0x55, 0xbd, 0xa3, 0x23, 0xc1, 0x46, 0x5b, 0xc4, 0x31, 0x59, 0x6a, 0x96, 0x77, 0x0d, 0xd3, 0x8c, + 0xbb, 0x66, 0x52, 0xa8, 0x1f, 0x41, 0xb9, 0x37, 0x1b, 0x1f, 0x87, 0x9b, 0x4e, 0x1e, 0xc6, 0xfc, 0x5c, 0x99, 0xd9, 0x0d, 0x6d, 0xd7, 0xaa, 0x2f, 0x94, 0xf1, 0xc5, 0xfd, 0x97, 0xbb, 0xbe, 0x79, + 0xaa, 0x1e, 0xf8, 0x79, 0xf2, 0xea, 0x5d, 0xc7, 0x6a, 0x1f, 0xc1, 0xcb, 0xde, 0xa1, 0xbd, 0x4f, 0x10, 0xff, 0x0f, 0x70, 0x78, 0x8f, 0xc9, 0x35, 0xaa, 0xef, 0xda, 0x8f, 0x86, 0xf1, 0x6b, 0xf0, + 0x41, 0xbf, 0xc8, 0x9e, 0x33, 0xbe, 0x8e, 0x8d, 0xb6, 0x20, 0x41, 0x4a, 0xdc, 0xf7, 0xd7, 0x5c, 0xb2, 0x15, 0x91, 0x39, 0x4b, 0x07, 0x9c, 0xab, 0x19, 0xd6, 0xa6, 0x49, 0xfa, 0x32, 0xea, 0x87, + 0xde, 0xa0, 0x88, 0xc4, 0x66, 0x85, 0x2d, 0xc1, 0x68, 0x30, 0x8c, 0x2d, 0x03, 0x68, 0xb0, 0x64, 0x32, 0x5a, 0xab, 0x69, 0xb1, 0x4b, 0x5d, 0x83, 0x41, 0xbd, 0x82, 0x9f, 0xc2, 0xc3, 0xad, 0xe0, + 0x56, 0x2b, 0x69, 0x9f, 0xf6, 0x36, 0x89, 0x94, 0xab, 0xb2, 0x4a, 0x6e, 0xe7, 0xf2, 0x6b, 0x3e, 0xbb, 0x4f, 0x78, 0x64, 0xc8, 0x4b, 0xe9, 0x75, 0xb7, 0x28, 0x57, 0x6f, 0x6f, 0x9f, 0x76, 0x80, + 0x5f, 0x8c, 0xdc, 0x7d, 0x84, 0x2a, 0x86, 0x7e, 0x8a, 0xf2, 0x7b, 0x7b, 0xc4, 0x6e, 0x48, 0x8d, 0xcd, 0x99, 0xb5, 0x15, 0xa0, 0xd5, 0x74, 0x91, 0x54, 0x60, 0xd4, 0x1b, 0xbb, 0x43, 0x2a, 0x2a, + 0xd7, 0x4d, 0x4f, 0xc0, 0x16, 0x10, 0x63, 0x77, 0xd0, 0x65, 0xca, 0x54, 0x96, 0x60, 0x56, 0x12, 0x1e, 0x03, 0x69, 0x20, 0x14, 0xa6, 0x46, 0xe4, 0x1b, 0xc5, 0x93, 0xa0, 0x74, 0x8f, 0xf2, 0x51, + 0x0d, 0x51, 0x29, 0x6d, 0xdb, 0x51, 0xc2, 0xc6, 0x56, 0x92, 0x18, 0x63, 0x34, 0x8d, 0x42, 0xa3, 0x55, 0x98, 0xe4, 0xff, 0x7a, 0xc8, 0xe8, 0x47, 0x8c, 0x42, 0x5e, 0x66, 0xd4, 0x57, 0x78, 0x4a, + 0x9f, 0xb1, 0xf2, 0xde, 0x1e, 0x31, 0xab, 0x54, 0x2d, 0xbd, 0xc4, 0x39, 0x6f, 0xad, 0x70, 0x0b, 0xbb, 0x01, 0xf1, 0x48, 0x00, 0x46, 0x38, 0xcb, 0xd0, 0x29, 0x95, 0x37, 0x64, 0x69, 0x38, 0x92, + 0xba, 0x63, 0xbd, 0xe1, 0xb8, 0x14, 0xd3, 0x11, 0x85, 0xd7, 0xc8, 0xa8, 0x3f, 0x84, 0xfa, 0xe3, 0x90, 0xaf, 0x3b, 0x12, 0x9f, 0x90, 0xc6, 0x72, 0x32, 0x93, 0x20, 0xad, 0xc3, 0x31, 0xab, 0x84, + 0x19, 0xea, 0xf9, 0xce, 0x98, 0x6f, 0x50, 0xd4, 0x84, 0x7e, 0x3f, 0x21, 0xe4, 0x16, 0x5b, 0x89, 0xb8, 0x59, 0x36, 0x9e, 0xbe, 0xe7, 0x0b, 0x7c, 0xa5, 0x5b, 0x55, 0xf3, 0xf6, 0xf6, 0x19, 0x63, + 0x09, 0xbb, 0xc4, 0xc6, 0x7f, 0x7b, 0xb8, 0xe0, 0xb9, 0x8b, 0x8b, 0xf4, 0xf6, 0x76, 0x3b, 0x37, 0xc2, 0xbf, 0x21, 0xc8, 0x7b, 0xf8, 0x48, 0xd8, 0x27, 0x50, 0xac, 0xb7, 0x47, 0x42, 0x64, 0x8a, + 0x79, 0x06, 0xd9, 0x9c, 0x46, 0x27, 0x99, 0xc0, 0x8d, 0x15, 0x3f, 0xb5, 0xac, 0xca, 0x2f, 0x6c, 0x52, 0x18, 0xed, 0xf4, 0x30, 0xf6, 0x32, 0x6c, 0x3d, 0x0b, 0x78, 0x68, 0x46, 0x39, 0x9d, 0x80, + 0x42, 0xc0, 0x15, 0xc8, 0x2c, 0xa3, 0xdc, 0x62, 0x14, 0xd0, 0x80, 0x57, 0xab, 0x6c, 0x1b, 0xcf, 0x82, 0x59, 0x20, 0x08, 0x13, 0x7c, 0x43, 0x10, 0x88, 0xa0, 0x52, 0xc8, 0xa4, 0xe3, 0x6b, 0xee, + 0xe6, 0xf7, 0xb3, 0x49, 0x6f, 0xb0, 0x92, 0xd0, 0x2f, 0xd8, 0xfd, 0x6f, 0x97, 0xff, 0xaf, 0xb4, 0xf9, 0x31, 0xc5, 0xe9, 0xf1, 0xe2, 0xe9, 0x25, 0x2b, 0xfd, 0x17, 0xdd, 0xb3, 0x92, 0x39, 0xb5, + 0x8e, 0x5a, 0xa6, 0x85, 0x55, 0x32, 0x89, 0xb6, 0xa0, 0x1a, 0xb3, 0xda, 0x48, 0x5d, 0x4d, 0x68, 0xd1, 0xc7, 0xeb, 0x61, 0x27, 0xc6, 0x27, 0xd4, 0x50, 0x56, 0x70, 0x1c, 0x07, 0x1c, 0xa7, 0xcf, + 0x72, 0x22, 0x96, 0xf7, 0xa4, 0xa1, 0xa7, 0x4d, 0x24, 0x6e, 0xb5, 0x02, 0x6c, 0x52, 0x10, 0xb5, 0x21, 0xa3, 0x95, 0x56, 0x6a, 0x73, 0xdb, 0x72, 0x0c, 0x49, 0xb1, 0x12, 0xfb, 0xb3, 0x69, 0x58, + 0x8d, 0xa3, 0x5e, 0xcf, 0xdf, 0x02, 0x14, 0x15, 0xb4, 0xb2, 0xd0, 0x9e, 0x41, 0x39, 0xfe, 0xc6, 0xfc, 0x76, 0x47, 0xe9, 0xb6, 0x98, 0xdf, 0xa0, 0x2e, 0x21, 0x09, 0xdb, 0xaa, 0x1e, 0xb3, 0x4b, + 0xc4, 0x67, 0x35, 0x8a, 0xdb, 0xa8, 0x3d, 0x18, 0xa6, 0xd5, 0x0c, 0x81, 0x15, 0xfb, 0xd6, 0xbe, 0xbe, 0x9b, 0x99, 0x7d, 0xeb, 0x92, 0x79, 0xf1, 0xf5, 0xef, 0x66, 0x64, 0xa3, 0xed, 0x70, 0xbe, + 0x1b, 0x8d, 0xee, 0xa5, 0xfd, 0x09, 0xb5, 0x84, 0x52, 0xcd, 0x73, 0xd7, 0x8c, 0x06, 0x3b, 0x09, 0x37, 0x1c, 0x89, 0x32, 0xbf, 0xb7, 0xf3, 0x1d, 0x29, 0xae, 0xe6, 0x7b, 0x05, 0x19, 0x2b, 0x15, + 0x83, 0x0c, 0x71, 0x31, 0xdf, 0x6b, 0x5b, 0x45, 0xea, 0x87, 0xe1, 0xc2, 0x85, 0xf8, 0xdd, 0xbe, 0x33, 0x66, 0x22, 0xc7, 0x98, 0xf9, 0xc3, 0x18, 0x86, 0xe1, 0x6a, 0x4d, 0xf1, 0x63, 0xc7, 0x54, + 0x26, 0xd2, 0x62, 0xd0, 0xc2, 0xa6, 0xfa, 0x9c, 0x6e, 0x0d, 0x3f, 0x8e, 0xca, 0x53, 0xc3, 0xfa, 0x9c, 0xee, 0x74, 0x5f, 0xf2, 0xaf, 0x0d, 0x85, 0x13, 0xd1, 0x23, 0xdf, 0x4e, 0x87, 0x6d, 0x11, + 0x4a, 0x02, 0x81, 0xc4, 0x60, 0x38, 0xce, 0xe6, 0xfd, 0xa4, 0x59, 0x77, 0x70, 0xde, 0x89, 0x82, 0x2d, 0x56, 0xd9, 0x31, 0x8c, 0xc9, 0x6b, 0x57, 0xf3, 0x1c, 0x72, 0xe3, 0xc1, 0xc8, 0x18, 0x9b, + 0xcf, 0x76, 0xb3, 0x38, 0x5e, 0xac, 0x17, 0x5e, 0xcd, 0x31, 0x30, 0x05, 0x07, 0xf4, 0x24, 0xd8, 0xb0, 0x6a, 0x87, 0x13, 0x09, 0x0b, 0x66, 0x70, 0x5e, 0x74, 0x7a, 0xde, 0x8e, 0xee, 0x9b, 0x35, + 0xbf, 0xcb, 0x1b, 0xef, 0x3b, 0xa6, 0xf9, 0x2f, 0x3e, 0x86, 0x51, 0x1a, 0xa8, 0xbe, 0xdb, 0x98, 0xdd, 0x58, 0xbd, 0xb2, 0x6b, 0x2e, 0xb4, 0x78, 0xec, 0xea, 0xd1, 0xaf, 0x74, 0xb1, 0x53, 0x18, + 0xf7, 0x7d, 0x3e, 0xa7, 0xba, 0x53, 0x3f, 0xf4, 0x0a, 0xbc, 0x34, 0xbc, 0x0e, 0x14, 0x0f, 0x1c, 0x3e, 0xfc, 0x3f, 0xa2, 0x84, 0x3d, 0x1d, 0x54, 0x1d, 0xdd, 0xa3, 0x45, 0xc8, 0x12, 0x46, 0x86, + 0x49, 0x8a, 0x58, 0x3a, 0x32, 0xeb, 0xbd, 0x1b, 0xeb, 0x1c, 0xeb, 0x0d, 0xa8, 0xdb, 0x41, 0x95, 0x3e, 0x5a, 0xb5, 0xbf, 0x56, 0x22, 0x4c, 0x4d, 0x8f, 0x0b, 0xf5, 0xd4, 0x6e, 0x5b, 0x0a, 0x0c, + 0x23, 0x17, 0x3d, 0x89, 0x49, 0x58, 0x70, 0xbb, 0x87, 0x09, 0xb9, 0x9a, 0x2d, 0xf2, 0x9e, 0x35, 0xd9, 0xbb, 0xa5, 0x27, 0xfb, 0x28, 0x02, 0xcb, 0xfd, 0xca, 0x62, 0x04, 0x4b, 0xe9, 0x10, 0xd0, + 0x9c, 0x4a, 0x56, 0xa9, 0x62, 0x5a, 0x04, 0x9f, 0x72, 0x92, 0x82, 0xf0, 0x23, 0x7e, 0x5a, 0xf5, 0x17, 0xe8, 0x90, 0x17, 0xe9, 0xd8, 0x9f, 0x61, 0x08, 0xa2, 0xec, 0xc9, 0x1e, 0xb6, 0x30, 0xa7, + 0xfd, 0x51, 0xd9, 0x4a, 0x19, 0xa6, 0xf6, 0xd7, 0xc5, 0x14, 0xc0, 0x9f, 0xd0, 0x2b, 0xc2, 0xb2, 0xcf, 0xb5, 0x14, 0xce, 0x87, 0xdd, 0x13, 0xa9, 0xe7, 0xac, 0x88, 0xb0, 0x79, 0x54, 0xe3, 0xb9, + 0xc8, 0xa2, 0x0b, 0x1e, 0x18, 0x4e, 0x77, 0x7d, 0x4a, 0xc4, 0xe7, 0x8d, 0xe7, 0xaa, 0x3b, 0x65, 0x01, 0x63, 0x73, 0x5e, 0x1e, 0xa6, 0xba, 0x90, 0xe7, 0x93, 0x44, 0x33, 0x0c, 0x92, 0xde, 0xa4, + 0x21, 0xd5, 0xb1, 0xd8, 0x06, 0x23, 0x5c, 0x11, 0x9b, 0x69, 0x20, 0x1e, 0x97, 0x34, 0x5b, 0xfa, 0x98, 0x2d, 0x81, 0x34, 0x4a, 0x1a, 0x13, 0x3f, 0xf3, 0xb7, 0x65, 0xb4, 0x7c, 0x6d, 0x48, 0x64, + 0x71, 0xea, 0x86, 0xb9, 0xf5, 0xbe, 0x66, 0xfa, 0xe7, 0x75, 0x71, 0xcc, 0x1b, 0x36, 0xa6, 0x6a, 0xdd, 0x2d, 0xc2, 0x13, 0xdb, 0xee, 0xbb, 0x7f, 0x5e, 0x49, 0xde, 0xb9, 0xa0, 0x7b, 0xe4, 0xe5, + 0x47, 0xeb, 0xe8, 0xe2, 0x6d, 0xc1, 0xcd, 0x11, 0x5b, 0xef, 0xa3, 0xe9, 0x52, 0x5e, 0xd5, 0x7d, 0x01, 0xcf, 0xf2, 0x95, 0x89, 0x0f, 0x26, 0x76, 0x68, 0xa0, 0x83, 0xc8, 0xac, 0xa8, 0x31, 0xd1, + 0x08, 0x86, 0x95, 0x4c, 0x3b, 0x3b, 0xd6, 0x0b, 0x7d, 0x25, 0xa0, 0x99, 0x06, 0xd0, 0xe7, 0x58, 0x6c, 0x91, 0x29, 0xa0, 0xcf, 0xd1, 0x4d, 0x82, 0x83, 0x19, 0x0f, 0xc4, 0xe0, 0x78, 0xa7, 0x7b, + 0xab, 0xc1, 0x60, 0x56, 0x2d, 0x10, 0x76, 0x98, 0x8e, 0xeb, 0x07, 0xcb, 0xa6, 0x6b, 0x8e, 0x64, 0x79, 0x7a, 0x0c, 0xdd, 0x7b, 0x3c, 0xcf, 0xbe, 0x56, 0x21, 0xf1, 0x92, 0xf0, 0x81, 0x27, 0x17, + 0xcd, 0xb6, 0xf5, 0x11, 0x15, 0x22, 0x17, 0x2a, 0xa8, 0xce, 0x97, 0xdb, 0x1c, 0xf3, 0x12, 0x41, 0x9f, 0xce, 0x3a, 0x53, 0x29, 0x37, 0x57, 0xd0, 0xba, 0x10, 0xb9, 0x9e, 0x0c, 0xc2, 0x45, 0x31, + 0xc9, 0x39, 0x09, 0x5a, 0x94, 0x78, 0xcf, 0xdb, 0x4a, 0x1c, 0x67, 0x63, 0xba, 0xab, 0xf1, 0x15, 0x3b, 0x89, 0x2a, 0xb2, 0x6e, 0x94, 0x59, 0xc7, 0xa4, 0x74, 0x88, 0x1c, 0x04, 0x3c, 0x3b, 0x53, + 0x7d, 0x50, 0x8b, 0x11, 0x3c, 0x7d, 0x84, 0xc1, 0x78, 0xc3, 0x94, 0x3a, 0xd4, 0x77, 0xee, 0xe3, 0x42, 0xdb, 0xaf, 0x78, 0xb1, 0xcf, 0x44, 0x8f, 0xcc, 0x38, 0x1d, 0xb6, 0x29, 0x7b, 0x0e, 0x75, + 0xf7, 0x18, 0xa1, 0x58, 0x08, 0x09, 0xd6, 0x28, 0x99, 0x46, 0x5a, 0xbd, 0xdd, 0xf1, 0x0d, 0xa3, 0xec, 0x0c, 0x7e, 0x81, 0xec, 0x6e, 0xf5, 0xe3, 0x09, 0xa8, 0x30, 0xf3, 0x4d, 0xf3, 0x31, 0x94, + 0xe6, 0x4b, 0xc2, 0xbc, 0x20, 0x7c, 0x78, 0xff, 0x8b, 0x66, 0x1b, 0x1d, 0x7f, 0xdc, 0x3e, 0x14, 0xa7, 0x1e, 0x93, 0x50, 0x0e, 0x11, 0xef, 0xc1, 0xed, 0x46, 0x1c, 0x77, 0x50, 0x49, 0x6b, 0x22, + 0x77, 0x0e, 0x84, 0xcb, 0xdd, 0x88, 0xda, 0x88, 0x85, 0x01, 0x17, 0x65, 0x38, 0x49, 0x0a, 0x06, 0x02, 0xf6, 0x98, 0x4a, 0x0c, 0x24, 0x45, 0x98, 0x2c, 0x41, 0x4a, 0x6f, 0x12, 0x0e, 0x94, 0x42, + 0x9c, 0x88, 0x64, 0x60, 0xb9, 0x94, 0x20, 0x5e, 0x5b, 0x71, 0xaa, 0xa7, 0xc4, 0x31, 0x32, 0xee, 0xe5, 0xd2, 0x27, 0xb7, 0x66, 0x91, 0x47, 0xba, 0x1a, 0x86, 0x0f, 0xc7, 0x37, 0x7a, 0x4c, 0x43, + 0xf9, 0xf6, 0xf7, 0x7f, 0x90, 0x3d, 0x7c, 0xfd, 0x47, 0xa3, 0x7b, 0xa4, 0xf6, 0xfc, 0xdb, 0xe3, 0xcd, 0x68, 0x40, 0x4f, 0x9c, 0x9e, 0xb6, 0x93, 0x4c, 0x66, 0x2b, 0x7b, 0x90, 0xc8, 0xc3, 0x34, + 0x2d, 0x9b, 0xdb, 0xa5, 0xca, 0xef, 0xb4, 0xb9, 0x5b, 0x23, 0xa2, 0x42, 0x94, 0xe2, 0x1c, 0xd2, 0x12, 0xa2, 0xdc, 0xec, 0x47, 0x33, 0x72, 0xde, 0x71, 0xfb, 0x01, 0x53, 0xd3, 0xfd, 0xbc, 0x70, + 0xe0, 0x99, 0x30, 0x71, 0x37, 0x3e, 0xeb, 0xbb, 0xbb, 0xad, 0x0a, 0xc5, 0x20, 0xbf, 0x5a, 0xc9, 0xc8, 0xd2, 0xa8, 0x5a, 0xd8, 0x5c, 0x5f, 0xd4, 0x83, 0xf4, 0xdd, 0xee, 0xd1, 0x6d, 0x85, 0xfc, + 0x38, 0xf9, 0xa0, 0xb0, 0x6b, 0x1f, 0x94, 0xee, 0x47, 0xe1, 0xb9, 0xe4, 0xc8, 0x4d, 0xc5, 0xa8, 0x93, 0x25, 0xf7, 0x8e, 0xcb, 0xf0, 0xe3, 0xdf, 0xdf, 0x53, 0xcd, 0xae, 0x7f, 0x9d, 0x46, 0xd9, + 0xb1, 0xd2, 0x55, 0xf9, 0xe3, 0xdf, 0xef, 0x01, 0x4a, 0x5a, 0x51, 0x1a, 0x74, 0x0d, 0x35, 0x3f, 0x17, 0x62, 0xbc, 0x79, 0xb8, 0xa3, 0x66, 0xdd, 0xe3, 0x18, 0xe9, 0x3a, 0x51, 0xb4, 0xcb, 0xee, + 0xd3, 0x70, 0x8c, 0xb4, 0xeb, 0xb8, 0x59, 0x1e, 0xd9, 0xa9, 0x1a, 0x9c, 0xfd, 0x65, 0xd0, 0x6d, 0x02, 0xd2, 0xf5, 0x5d, 0xb1, 0x99, 0xea, 0x66, 0x98, 0xbb, 0x07, 0x7b, 0x39, 0xd2, 0xbc, 0x1f, + 0x77, 0x1d, 0x75, 0x87, 0x7e, 0xd0, 0x7d, 0x0f, 0x55, 0x7b, 0x27, 0x7b, 0x60, 0xcf, 0x75, 0xed, 0xe6, 0x3a, 0x36, 0xd3, 0x53, 0x65, 0xa4, 0xcf, 0x45, 0xbe, 0x4e, 0xc1, 0x24, 0xbf, 0xec, 0xb3, + 0x4f, 0x4f, 0x38, 0xa6, 0xf3, 0xbb, 0xd9, 0x99, 0x79, 0x37, 0x55, 0x3c, 0xa3, 0xb0, 0x1b, 0x9a, 0x79, 0xd7, 0x77, 0xb3, 0xfc, 0xbd, 0xd0, 0xe7, 0x27, 0xfe, 0xc6, 0xa9, 0x99, 0xe7, 0x75, 0x57, + 0xab, 0xf3, 0xd3, 0x1e, 0xd1, 0x3b, 0x06, 0xce, 0xd5, 0x1d, 0x91, 0x9d, 0x9a, 0x59, 0x76, 0xff, 0x0d, 0x53, 0xf3, 0xd0, 0x4d, 0xd3, 0x52, 0xfd, 0x95, 0x2a, 0x08, 0x5e, 0x5f, 0x3f, 0xa7, 0x1b, + 0xdd, 0x79, 0xfb, 0xc3, 0xa5, 0x8b, 0x5a, 0x22, 0x0f, 0xd0, 0x9b, 0xbf, 0xa8, 0x33, 0xfb, 0x04, 0x3f, 0xe9, 0x75, 0x94, 0x94, 0x67, 0x55, 0x26, 0xdf, 0x1e, 0x0d, 0xd0, 0xbf, 0xbc, 0xd2, 0xe4, + 0xdb, 0xc3, 0x41, 0x7a, 0xbc, 0x72, 0x0b, 0x94, 0xf4, 0xd9, 0xa7, 0xd8, 0xa2, 0xbc, 0xe4, 0x5b, 0x1b, 0x37, 0xc3, 0xa3, 0xd2, 0x21, 0x8f, 0xe6, 0x0a, 0xec, 0xfb, 0xba, 0xf2, 0xee, 0x23, 0x0e, + 0x7a, 0xf3, 0xee, 0x85, 0xe3, 0xfc, 0x81, 0x3d, 0xd7, 0xa1, 0x8c, 0xc0, 0x80, 0x9c, 0x2b, 0xa2, 0xb8, 0xe9, 0xc6, 0x66, 0xe3, 0x2e, 0x96, 0x10, 0x3f, 0x9b, 0x01, 0x8b, 0xa5, 0xc5, 0xac, 0xc0, + 0xac, 0xb0, 0xc6, 0x8b, 0x6d, 0xe0, 0x2d, 0xec, 0x72, 0x9d, 0x45, 0x2b, 0x38, 0x4f, 0xf6, 0x7a, 0x2e, 0x99, 0xd4, 0xc2, 0xf4, 0x36, 0xba, 0x25, 0xe6, 0x7b, 0x99, 0x4b, 0x06, 0x4b, 0x01, 0x5a, + 0xed, 0x25, 0x32, 0x8b, 0xe1, 0x69, 0xba, 0xa0, 0x37, 0xf1, 0x48, 0xc6, 0xb3, 0x4f, 0x09, 0x3f, 0x6a, 0x59, 0xba, 0xd1, 0x03, 0x76, 0x10, 0x47, 0x5f, 0xfc, 0xf7, 0xd9, 0x51, 0xba, 0xd1, 0xf1, + 0xeb, 0x4b, 0x37, 0xea, 0x1e, 0x69, 0x3c, 0xff, 0xd8, 0xed, 0x06, 0xee, 0x0b, 0xfd, 0x40, 0x51, 0xfb, 0x41, 0xbf, 0x9f, 0x8d, 0xd5, 0x89, 0xca, 0x73, 0x7b, 0xaa, 0x99, 0x55, 0x43, 0x84, 0xb0, + 0xb6, 0x2e, 0xc4, 0xb1, 0x7b, 0x71, 0x5a, 0x9a, 0xc6, 0x34, 0x36, 0xdd, 0x8c, 0x37, 0x82, 0xbd, 0x12, 0x6a, 0x3e, 0xab, 0x23, 0x4e, 0x3c, 0xda, 0xc8, 0xa1, 0x3f, 0xeb, 0x70, 0xd3, 0xd5, 0x5e, + 0xc9, 0xd4, 0xc6, 0x41, 0x91, 0xcd, 0x56, 0x1c, 0xd9, 0xdb, 0x58, 0x4b, 0x5a, 0x4c, 0x18, 0xe7, 0xf5, 0xe0, 0x1d, 0x75, 0x7b, 0x19, 0x10, 0x73, 0xab, 0xcd, 0xaf, 0x92, 0x3c, 0xaf, 0x14, 0x55, + 0x52, 0x98, 0x85, 0xd9, 0x0d, 0x5c, 0x3d, 0x8d, 0x72, 0x35, 0xdb, 0x7d, 0x68, 0x9b, 0x3b, 0xc5, 0xeb, 0x7f, 0x2f, 0xb8, 0xe5, 0x35, 0xf4, 0xa8, 0xcf, 0xc1, 0x2d, 0x2d, 0x30, 0xa3, 0x0e, 0x02, + 0x02, 0x9a, 0x7d, 0x85, 0x75, 0x4a, 0x07, 0x5a, 0x5a, 0x65, 0x07, 0x95, 0x42, 0x42, 0xc5, 0xc2, 0x4c, 0xd3, 0x27, 0xdc, 0x4c, 0x5d, 0x94, 0x7d, 0xc6, 0x89, 0xbc, 0x10, 0x1f, 0x0e, 0xfc, 0x5e, + 0x59, 0xc4, 0x15, 0x07, 0xaf, 0xfb, 0x0b, 0x26, 0x1f, 0xb8, 0x83, 0x3c, 0x49, 0x49, 0x66, 0x98, 0x37, 0xf2, 0x70, 0x6a, 0x34, 0x38, 0xc2, 0xd3, 0xbb, 0xbd, 0xa9, 0x13, 0x8c, 0x5c, 0xe8, 0xb0, + 0x17, 0x85, 0xf8, 0xa7, 0xe0, 0x96, 0xbf, 0xa3, 0x58, 0xda, 0x46, 0xb1, 0x3c, 0x51, 0x7b, 0x9a, 0xea, 0xab, 0xa1, 0x6e, 0x1a, 0xdd, 0xaf, 0xbc, 0x4a, 0xaf, 0x99, 0xc6, 0xd7, 0xa4, 0x81, 0xee, + 0xcd, 0x89, 0x36, 0xe6, 0x31, 0xd4, 0x75, 0xb5, 0xe5, 0x3c, 0x50, 0xb3, 0x94, 0xd8, 0x85, 0xe6, 0x70, 0x87, 0xdb, 0x1c, 0x1a, 0x4e, 0xe7, 0x2e, 0xb4, 0xcf, 0x61, 0xfd, 0xf9, 0x6a, 0x45, 0x53, + 0x33, 0x13, 0x47, 0x1f, 0x17, 0x03, 0x86, 0xae, 0xcc, 0xab, 0xf6, 0xdf, 0xf5, 0x4e, 0xf5, 0xf8, 0x49, 0xef, 0xc7, 0xdd, 0x23, 0xad, 0xe7, 0xfa, 0x8b, 0xe2, 0x62, 0x55, 0xf6, 0x47, 0x21, 0x99, + 0xa3, 0x8b, 0xb5, 0x36, 0x1d, 0xf5, 0xeb, 0x8e, 0x86, 0x75, 0x38, 0xce, 0x2e, 0xe7, 0x68, 0x99, 0x66, 0x0c, 0x59, 0x6a, 0x65, 0xaa, 0xb9, 0xd2, 0x24, 0xce, 0x08, 0x8b, 0x63, 0x96, 0x3b, 0x6f, + 0xc7, 0xa4, 0x35, 0xee, 0xb9, 0x60, 0xba, 0x9a, 0x78, 0x7d, 0x70, 0xd7, 0x68, 0xa2, 0x39, 0xe3, 0xab, 0x66, 0x9f, 0x90, 0x6e, 0x1d, 0x47, 0x28, 0x94, 0x98, 0x9b, 0x4f, 0x31, 0x0c, 0x9a, 0x1b, + 0xaa, 0x69, 0xdd, 0x35, 0xf7, 0xb9, 0x19, 0x1e, 0x3e, 0xf6, 0x11, 0x03, 0x5e, 0x5b, 0xd3, 0x7f, 0xa2, 0x7e, 0x60, 0xc4, 0xed, 0xb9, 0xb6, 0xeb, 0x7b, 0x48, 0xf6, 0x48, 0xa7, 0x27, 0x75, 0x24, + 0x66, 0x88, 0x0d, 0x1b, 0x47, 0xc8, 0x00, 0xbd, 0xd7, 0xc1, 0x57, 0x61, 0xae, 0x31, 0x98, 0xb0, 0x9b, 0x5b, 0xf3, 0x4a, 0xd5, 0x49, 0x26, 0x1a, 0x04, 0x3d, 0xc5, 0x5a, 0xd1, 0x0a, 0x91, 0x2b, + 0x18, 0x26, 0xeb, 0xec, 0x9a, 0x6a, 0x06, 0x26, 0xaa, 0x6d, 0x33, 0x43, 0x1a, 0x0d, 0x76, 0x9d, 0xac, 0xb7, 0xc0, 0xaa, 0x6c, 0xca, 0xad, 0x0d, 0x25, 0xad, 0xc0, 0xbc, 0xcd, 0x52, 0x56, 0x73, + 0xc3, 0x3c, 0x35, 0x1f, 0x3a, 0xa1, 0xa1, 0x97, 0xa2, 0x5d, 0xce, 0x44, 0x4f, 0x1c, 0x39, 0x1e, 0x9e, 0xfc, 0x46, 0xcf, 0xfa, 0x39, 0x13, 0xac, 0xf5, 0x00, 0xab, 0x76, 0xa2, 0x99, 0xa4, 0x2a, + 0xdf, 0xa3, 0x26, 0xf5, 0x24, 0xe7, 0xa0, 0x8d, 0x37, 0x5f, 0x48, 0xb7, 0xb2, 0x7d, 0xaf, 0x72, 0x7f, 0x7f, 0x0d, 0xf7, 0x4a, 0x51, 0x96, 0x23, 0xc5, 0xc3, 0x1b, 0x1f, 0xfe, 0xb7, 0x2d, 0xc3, + 0x62, 0xd2, 0x68, 0xb1, 0xec, 0xcd, 0xd9, 0xc6, 0x86, 0x23, 0x23, 0x1e, 0xcc, 0x71, 0x58, 0xa3, 0xab, 0x05, 0x5f, 0xae, 0x4c, 0xb6, 0xdf, 0xd9, 0x68, 0x73, 0xcf, 0xab, 0xeb, 0xa1, 0xc3, 0x66, + 0x5c, 0xa8, 0x93, 0x55, 0x0c, 0x04, 0x60, 0xc7, 0x91, 0x32, 0x61, 0x55, 0xae, 0x4c, 0x64, 0x04, 0xaf, 0x41, 0x06, 0x2b, 0x2b, 0x30, 0xa4, 0x8d, 0x29, 0xe4, 0xf4, 0x27, 0x91, 0x12, 0x61, 0x01, + 0x67, 0x16, 0xe3, 0x17, 0xe1, 0xcc, 0x2e, 0xf7, 0xfb, 0xef, 0xad, 0xe8, 0xd4, 0xc0, 0xf4, 0x75, 0x35, 0x3b, 0xa7, 0x0a, 0xdd, 0x40, 0x88, 0x3d, 0x59, 0x0b, 0x1e, 0xb8, 0x72, 0x5e, 0x2c, 0xdc, + 0xac, 0x47, 0xee, 0xd4, 0xf5, 0xba, 0x59, 0x2e, 0xe4, 0x66, 0x1a, 0x74, 0x33, 0xb7, 0xf9, 0xb5, 0x60, 0xbc, 0xbe, 0x7c, 0x07, 0xcc, 0xe9, 0xe2, 0xf2, 0x75, 0x7d, 0xb5, 0x53, 0xa4, 0xc5, 0xb7, + 0x16, 0x14, 0xad, 0xb6, 0xe9, 0x6f, 0x73, 0xa7, 0xda, 0x77, 0x9c, 0x47, 0x3b, 0x46, 0x9f, 0x8b, 0x7f, 0xbd, 0x3d, 0xea, 0x46, 0x7f, 0x79, 0x01, 0xb0, 0xb7, 0x3b, 0x2a, 0xe0, 0xed, 0xc6, 0x0c, + 0xf8, 0xff, 0xed, 0xba, 0xeb, 0xb5, 0xcd, 0xdc, 0x3f, 0xbc, 0x1c, 0xbb, 0x10, 0xc4, 0xfd, 0xea, 0x69, 0x6f, 0x37, 0xe2, 0xb8, 0x2d, 0xb1, 0xd4, 0x5e, 0x1c, 0xdf, 0xa9, 0xa2, 0xf6, 0xf6, 0x48, + 0x34, 0x7f, 0x79, 0x25, 0xb5, 0xb7, 0x16, 0x5d, 0xf6, 0x79, 0xbd, 0xb4, 0xb7, 0x3f, 0xd6, 0x89, 0xff, 0x44, 0xdd, 0xb4, 0xb7, 0x47, 0xdc, 0xfc, 0xcb, 0x6b, 0xa7, 0xbd, 0xb5, 0xe0, 0x66, 0xcb, + 0x38, 0x1d, 0xf4, 0xb7, 0xc2, 0x3b, 0xda, 0xd7, 0x3d, 0x7b, 0x7b, 0xc8, 0xac, 0xbf, 0xba, 0xf6, 0xd9, 0xdb, 0x4b, 0x5a, 0xe1, 0x59, 0x0d, 0xb4, 0xb7, 0xaf, 0x7b, 0xec, 0xe7, 0x89, 0xf7, 0xed, + 0xed, 0x49, 0x2d, 0xb4, 0xb7, 0x87, 0x2a, 0xa4, 0x55, 0x9c, 0x0e, 0xfe, 0xf2, 0x58, 0x68, 0x5f, 0xc7, 0xec, 0xed, 0x91, 0x10, 0xff, 0xf2, 0x5a, 0x66, 0x6f, 0x2f, 0x09, 0x51, 0xfd, 0xa2, 0xa6, + 0xd9, 0x5b, 0x0b, 0x07, 0x9a, 0x96, 0xaa, 0xba, 0xd9, 0x35, 0xf7, 0xb1, 0x1a, 0x66, 0x8f, 0x77, 0x11, 0x8f, 0x0e, 0xdb, 0x17, 0xec, 0xea, 0x6b, 0xe2, 0x07, 0x63, 0xf5, 0xfa, 0xcc, 0x29, 0xc8, + 0xbe, 0xc5, 0x02, 0xcc, 0xed, 0x17, 0xb3, 0x11, 0x33, 0xb4, 0xd3, 0xd1, 0x96, 0x18, 0xc1, 0xe5, 0x60, 0x0c, 0x60, 0xfb, 0xb8, 0x01, 0x89, 0x66, 0x31, 0xa2, 0x41, 0x70, 0x19, 0x17, 0x76, 0xe2, + 0x04, 0x72, 0xbe, 0x0e, 0x84, 0x29, 0x8e, 0x41, 0x64, 0xd0, 0x2f, 0xe6, 0x42, 0x34, 0x95, 0x87, 0xbe, 0x31, 0xa0, 0x7d, 0xd0, 0x86, 0x48, 0xa2, 0xb0, 0xa2, 0xc6, 0x50, 0x47, 0xf6, 0x86, 0xd3, + 0xe5, 0xa1, 0x86, 0x43, 0x09, 0xeb, 0xbe, 0x96, 0xac, 0xf5, 0x69, 0xed, 0x7d, 0xc7, 0xb9, 0xa4, 0x47, 0xa1, 0xae, 0xe6, 0xdd, 0xe0, 0x58, 0x01, 0xee, 0x07, 0xf8, 0x38, 0x30, 0xe4, 0xc8, 0x8f, + 0x47, 0x8b, 0x19, 0xe4, 0xa5, 0xba, 0x46, 0x27, 0x92, 0x67, 0x5e, 0x67, 0x47, 0xad, 0xde, 0xc2, 0x45, 0xa7, 0x91, 0x45, 0xd0, 0xe1, 0xa1, 0x79, 0x23, 0x20, 0x1b, 0x66, 0xd1, 0x94, 0x4e, 0x80, + 0xdb, 0xe3, 0x06, 0xaa, 0xad, 0xa5, 0x46, 0xe7, 0xb8, 0xbc, 0xf4, 0xf5, 0x01, 0x47, 0x95, 0x59, 0x90, 0xf4, 0x15, 0x65, 0x58, 0xa1, 0x78, 0x83, 0xc3, 0xb8, 0xbf, 0xf6, 0x7a, 0x1e, 0x54, 0x0f, + 0x66, 0x1b, 0x04, 0x19, 0x61, 0xa3, 0x8e, 0x4f, 0x4b, 0xb1, 0x22, 0xcc, 0xa0, 0x1d, 0xe9, 0x77, 0x08, 0x72, 0xa4, 0x82, 0xaf, 0x71, 0xd8, 0x72, 0x7d, 0xbf, 0x9b, 0xaa, 0xa1, 0x7d, 0xc6, 0x2d, + 0x7e, 0xcc, 0xbe, 0x63, 0x65, 0xae, 0xae, 0x95, 0x46, 0xc1, 0x57, 0x3d, 0xf7, 0xfb, 0x3c, 0xfc, 0x45, 0xf7, 0xc0, 0xc8, 0x5f, 0xad, 0xb6, 0x59, 0x21, 0x82, 0xa4, 0x6f, 0x07, 0x2b, 0xad, 0xcf, + 0xe5, 0x83, 0x88, 0xd0, 0x9c, 0x64, 0x90, 0xe1, 0x18, 0x0e, 0x8e, 0x6a, 0x03, 0xdd, 0xaa, 0x51, 0xa9, 0xf8, 0x53, 0x60, 0xd7, 0x5b, 0x23, 0x8e, 0xb7, 0x5e, 0x0d, 0x81, 0xa6, 0xda, 0x10, 0x1c, + 0xbd, 0x36, 0x16, 0x1c, 0x6a, 0x8f, 0x73, 0x40, 0x6b, 0xaa, 0x45, 0x4f, 0xd0, 0xe6, 0x58, 0x12, 0x69, 0x9d, 0x21, 0xe6, 0x15, 0x99, 0x92, 0x69, 0xa0, 0x2c, 0x71, 0x70, 0x9b, 0xc0, 0x0a, 0x5d, + 0xd5, 0x1d, 0xf3, 0xe8, 0x94, 0x3e, 0xf0, 0xd6, 0x7c, 0x58, 0x03, 0x0a, 0x7f, 0xc9, 0x87, 0xf0, 0x89, 0xfa, 0xc1, 0x48, 0xbe, 0x3d, 0xd7, 0xc5, 0xdb, 0xf9, 0x10, 0xa6, 0x1e, 0xa2, 0x53, 0xec, + 0xac, 0x9f, 0x4c, 0x95, 0x2d, 0x31, 0x6f, 0x70, 0x74, 0x15, 0xd6, 0x30, 0x2b, 0x53, 0x8a, 0xe8, 0xbb, 0xd2, 0x22, 0xb1, 0x34, 0x73, 0x96, 0xda, 0x94, 0x04, 0x55, 0x1c, 0xe5, 0x3a, 0x72, 0xd0, + 0x5f, 0x85, 0xa9, 0x4a, 0xe7, 0x93, 0x9c, 0xd3, 0xd9, 0x39, 0xba, 0x6f, 0x88, 0x6a, 0xd8, 0xe1, 0xa3, 0x49, 0xbf, 0x93, 0x65, 0x43, 0xa5, 0x2c, 0x31, 0xda, 0x1e, 0xf6, 0xc6, 0x4f, 0xcb, 0x3d, + 0x3f, 0xd8, 0x58, 0xf4, 0xa3, 0xf0, 0xf0, 0xfe, 0xc7, 0x62, 0xda, 0xbf, 0x90, 0x7e, 0xae, 0xb6, 0xc8, 0xfe, 0x5f, 0xf6, 0xde, 0xa4, 0x3b, 0x5d, 0xad, 0xdb, 0x1b, 0xed, 0xbf, 0x9f, 0x62, 0x8f, + 0xdd, 0xf5, 0xba, 0xa9, 0xab, 0xdb, 0x3a, 0xa2, 0x28, 0xa8, 0x80, 0x80, 0xa0, 0xd0, 0x38, 0x63, 0x50, 0xd7, 0x85, 0x94, 0x4a, 0xe3, 0xf9, 0xec, 0x77, 0x44, 0x4d, 0xa2, 0x89, 0x26, 0xfc, 0x3d, + 0xfb, 0x1d, 0xb7, 0x73, 0x5a, 0x81, 0x85, 0x99, 0xb0, 0x7e, 0xab, 0x9a, 0xf5, 0xf4, 0xdd, 0x7a, 0x5c, 0xd5, 0xa5, 0x6b, 0xa6, 0xd7, 0x9d, 0x16, 0x7a, 0x60, 0x66, 0x3b, 0x83, 0x31, 0xae, 0xdc, + 0xd4, 0xcc, 0xea, 0xd0, 0x7e, 0xe7, 0xb6, 0xbf, 0xec, 0x0e, 0xb1, 0x7b, 0x6a, 0x1f, 0x1e, 0xa0, 0x7f, 0x27, 0x79, 0xe7, 0x96, 0x6f, 0x32, 0xef, 0xd7, 0x20, 0xa8, 0x9b, 0xdf, 0x7c, 0x3a, 0x4c, + 0x5d, 0x8b, 0x82, 0x7f, 0x97, 0x5f, 0xdf, 0x3b, 0x92, 0x84, 0xf1, 0x6d, 0x67, 0xde, 0x97, 0xd0, 0x0d, 0x3e, 0xcf, 0x44, 0xd0, 0xbb, 0xce, 0x3e, 0x17, 0x41, 0x5f, 0x65, 0xac, 0x3e, 0xc9, 0x03, + 0xe3, 0x9b, 0x9b, 0x3f, 0xf1, 0x9b, 0xcd, 0xe8, 0xf9, 0x68, 0x0e, 0x95, 0x13, 0x43, 0x9b, 0x36, 0x40, 0x41, 0x94, 0x51, 0xef, 0x4f, 0x46, 0xba, 0x85, 0x26, 0x9e, 0xbe, 0x2f, 0x8b, 0x84, 0x30, + 0x71, 0x2d, 0x5d, 0x96, 0x2a, 0xd9, 0xcd, 0x29, 0x0e, 0x9a, 0xae, 0xda, 0x0d, 0x20, 0x75, 0x1b, 0xc1, 0x60, 0x33, 0x31, 0xe9, 0xac, 0x6d, 0xac, 0xe3, 0x4e, 0x5b, 0xcf, 0xb9, 0x7e, 0xce, 0x2b, + 0x27, 0x69, 0x6f, 0xad, 0xf3, 0xad, 0xb4, 0x91, 0x8b, 0xff, 0xb9, 0xdf, 0x6c, 0xd1, 0xa4, 0xb7, 0xe9, 0x9e, 0x6e, 0x1e, 0x3e, 0x66, 0x7c, 0xbe, 0x8d, 0xf8, 0x73, 0xbd, 0xf6, 0xab, 0xcc, 0xcf, + 0xfd, 0x2b, 0x80, 0xf1, 0x97, 0x86, 0x07, 0xde, 0x2b, 0x7f, 0x3d, 0x03, 0xbd, 0x3e, 0x08, 0xfb, 0x52, 0x21, 0xc8, 0x9c, 0x17, 0x19, 0x02, 0x11, 0xf8, 0xe3, 0x0a, 0x65, 0xf8, 0xb5, 0x54, 0x49, + 0x79, 0xb7, 0xf3, 0xc8, 0x68, 0x95, 0xe7, 0x2c, 0xe5, 0x13, 0xc7, 0x8d, 0xd9, 0xca, 0x5b, 0x02, 0xc4, 0x65, 0xdc, 0x8a, 0xa5, 0x25, 0x3e, 0xd3, 0xe1, 0xad, 0x4b, 0x48, 0x4d, 0x6c, 0x1a, 0x55, + 0x93, 0x1c, 0x4d, 0x04, 0xec, 0x24, 0xc2, 0x8a, 0xc1, 0x22, 0x45, 0xf7, 0x21, 0x9b, 0x0e, 0x12, 0xa2, 0xfe, 0xcf, 0xed, 0xdf, 0xcf, 0xcd, 0x2e, 0x49, 0xc6, 0x56, 0xf8, 0xb4, 0x30, 0xe0, 0x6b, + 0xa5, 0x41, 0x3f, 0xa8, 0x9e, 0x37, 0xb7, 0xeb, 0xf5, 0x90, 0x02, 0xa1, 0x6f, 0x08, 0x11, 0xe2, 0x68, 0x6e, 0x4d, 0xc3, 0xa0, 0xa4, 0xb1, 0xdd, 0xc2, 0x9a, 0xeb, 0x6e, 0x65, 0xd7, 0x5d, 0xba, + 0x5d, 0x99, 0x2e, 0x5e, 0x8a, 0x21, 0xd7, 0xa7, 0x3d, 0x14, 0xda, 0xa5, 0xbb, 0x5b, 0x8e, 0x40, 0x73, 0x42, 0xac, 0x97, 0x5e, 0x73, 0x08, 0x98, 0x2a, 0x87, 0xb7, 0x54, 0x66, 0x17, 0xf6, 0xbc, + 0xee, 0x79, 0xa9, 0xee, 0xf7, 0x1e, 0x2c, 0x2d, 0x16, 0x8d, 0xbb, 0x5b, 0x2e, 0xb6, 0x7a, 0x75, 0x28, 0x27, 0xbf, 0x5b, 0xba, 0xde, 0xd3, 0x96, 0xbd, 0xc3, 0xf1, 0xc0, 0xc8, 0xfe, 0xb6, 0xce, + 0xc2, 0xec, 0x4d, 0x86, 0xa9, 0xce, 0xf5, 0x46, 0xbf, 0x6e, 0x0b, 0xdf, 0xa0, 0xad, 0xc2, 0xfa, 0x07, 0xde, 0xe4, 0xb5, 0xf3, 0xe3, 0x4a, 0xf5, 0x0a, 0xed, 0xf9, 0xfa, 0x41, 0xc8, 0xc3, 0x43, + 0x68, 0x37, 0x24, 0x1d, 0x4d, 0xaa, 0x7d, 0x6b, 0x28, 0x23, 0x8d, 0x9b, 0xa9, 0x1c, 0x04, 0x05, 0xec, 0x54, 0x62, 0x5a, 0x02, 0xd5, 0xb7, 0x38, 0xa1, 0xab, 0x21, 0xb6, 0x5c, 0xce, 0x85, 0x1d, + 0x77, 0x58, 0xc3, 0x08, 0x56, 0xd1, 0x69, 0xb4, 0x47, 0x47, 0x87, 0x23, 0xc5, 0x37, 0x6d, 0x52, 0x61, 0x61, 0x7b, 0x12, 0x18, 0xc1, 0xae, 0x8f, 0x28, 0x7e, 0x94, 0xd6, 0x12, 0x62, 0x6e, 0x1b, + 0x86, 0xa8, 0x2a, 0x73, 0x88, 0xce, 0xf9, 0x56, 0x13, 0xf9, 0x08, 0x8b, 0xd7, 0x62, 0xeb, 0x3e, 0xa8, 0x9e, 0xb1, 0xb8, 0x5e, 0x0f, 0x8d, 0xad, 0x5b, 0xc3, 0xa4, 0xb2, 0xa5, 0x21, 0x02, 0xcc, + 0xba, 0x9d, 0x82, 0x23, 0x6a, 0x54, 0x27, 0x8c, 0xc8, 0x20, 0x4e, 0xe2, 0x48, 0x93, 0xc2, 0x5c, 0xee, 0x8d, 0x58, 0xe4, 0xa0, 0x86, 0x9f, 0x7b, 0xbd, 0x87, 0x94, 0x72, 0xb3, 0x71, 0x7d, 0xd6, + 0x64, 0xdd, 0xea, 0xe4, 0xba, 0x23, 0xfd, 0x28, 0x8d, 0x76, 0xb8, 0xd2, 0xca, 0x33, 0x49, 0xc3, 0xd5, 0xd2, 0x11, 0x1d, 0x39, 0x94, 0x21, 0x0c, 0xe9, 0x96, 0x4f, 0xce, 0xce, 0x7b, 0x2c, 0x82, + 0xe7, 0x79, 0x84, 0xd1, 0x97, 0xd2, 0xb6, 0xde, 0x2b, 0xdb, 0xd0, 0x61, 0x19, 0x5a, 0xf3, 0x55, 0x66, 0x05, 0xf3, 0x93, 0xcc, 0xed, 0x0b, 0xb5, 0x71, 0x7b, 0x32, 0xa4, 0xf9, 0xf4, 0xc4, 0x98, + 0x68, 0x66, 0x45, 0x28, 0x27, 0x4a, 0xa7, 0x26, 0xb0, 0x81, 0xee, 0x44, 0xc5, 0x3a, 0x01, 0xec, 0xb4, 0x8d, 0xdd, 0x71, 0x22, 0xa5, 0x4d, 0x70, 0x9c, 0xdc, 0x34, 0xa4, 0x1c, 0x8b, 0xc4, 0x08, + 0x5c, 0x10, 0xb8, 0xb2, 0x96, 0x45, 0xf7, 0xd4, 0x51, 0xd3, 0x42, 0x02, 0x71, 0x28, 0x44, 0xd3, 0x01, 0xcb, 0xec, 0x37, 0x4d, 0xda, 0xaf, 0x5a, 0xb4, 0x2f, 0xab, 0x2c, 0xc8, 0xe3, 0xd0, 0x31, + 0x9f, 0x65, 0x89, 0x41, 0xfe, 0x41, 0x5f, 0xf0, 0x02, 0x7e, 0x27, 0x7a, 0xc6, 0xf4, 0x72, 0x39, 0x3e, 0x53, 0xfa, 0x1d, 0xd6, 0x59, 0xcd, 0x23, 0x3e, 0x11, 0x35, 0xd3, 0xbd, 0x74, 0x9c, 0x6b, + 0x8a, 0xb0, 0x11, 0xe8, 0x13, 0x33, 0x85, 0x47, 0x02, 0x97, 0xd6, 0x74, 0x73, 0x94, 0xa4, 0x76, 0x97, 0xb0, 0x4d, 0x56, 0x2c, 0x39, 0x05, 0x13, 0xed, 0x12, 0x4c, 0x16, 0x08, 0x88, 0xdb, 0x53, + 0x62, 0x3e, 0x0d, 0x09, 0x9b, 0x99, 0x80, 0x5e, 0x9f, 0x9e, 0xac, 0x8d, 0xca, 0x25, 0x68, 0x7d, 0xa4, 0xb9, 0xdc, 0x8a, 0x21, 0x7f, 0x21, 0xbe, 0x6a, 0x1e, 0xf8, 0x70, 0x99, 0xff, 0xfb, 0x3f, + 0xdf, 0x82, 0x15, 0x3f, 0xe4, 0xa6, 0xb7, 0x67, 0x5f, 0x18, 0x35, 0xaf, 0x72, 0xdb, 0xf7, 0x92, 0x21, 0xff, 0xf9, 0xe6, 0xed, 0xe5, 0x27, 0xb9, 0x35, 0x2e, 0xcc, 0xd2, 0xbd, 0x28, 0x31, 0xfe, + 0xf3, 0x8d, 0x8f, 0x0b, 0xab, 0xf1, 0xd5, 0x2c, 0xf6, 0xee, 0xf0, 0xf4, 0x9f, 0xef, 0xb5, 0x51, 0x3e, 0xb3, 0x62, 0xfc, 0xe7, 0x5b, 0x56, 0x8c, 0xef, 0x1e, 0xed, 0xff, 0xf9, 0xc6, 0xe8, 0x95, + 0xae, 0xe9, 0x38, 0x61, 0x59, 0x5c, 0x9f, 0x62, 0x4f, 0x27, 0x48, 0x38, 0x0e, 0x33, 0xef, 0x99, 0x07, 0xc7, 0x6b, 0x9e, 0xac, 0x57, 0x9a, 0x6f, 0xd3, 0xe3, 0x72, 0x35, 0xd4, 0x7f, 0x15, 0xab, + 0x57, 0x04, 0x53, 0x97, 0x06, 0x28, 0x8c, 0xc4, 0xf5, 0x9c, 0xaf, 0x83, 0xfa, 0x20, 0x46, 0xa8, 0xc7, 0xc1, 0x4b, 0xd7, 0x22, 0xc9, 0x29, 0x3a, 0x9d, 0x18, 0x9b, 0x06, 0xc6, 0xd6, 0x33, 0x4d, + 0xf5, 0xf7, 0x4b, 0x70, 0x82, 0x2c, 0x2b, 0x74, 0xc3, 0x2f, 0x0e, 0x65, 0x06, 0x2e, 0x55, 0x68, 0x07, 0xf2, 0x01, 0x04, 0x18, 0x64, 0x67, 0xf4, 0xfa, 0xe6, 0x78, 0x50, 0xcb, 0xbd, 0x4b, 0x5b, + 0xf9, 0x74, 0xd0, 0x06, 0x7c, 0x63, 0xd0, 0x79, 0x8c, 0x03, 0xfc, 0xca, 0x06, 0xfc, 0x4e, 0xf5, 0x0d, 0x89, 0xf7, 0xeb, 0x31, 0xfc, 0xad, 0x10, 0xe0, 0x43, 0x2c, 0x4e, 0xa8, 0x9d, 0xf3, 0xf6, + 0x29, 0xf1, 0x95, 0xa9, 0xa3, 0x85, 0x59, 0x14, 0xce, 0xe8, 0x46, 0x26, 0x37, 0xd3, 0x29, 0x6c, 0xad, 0xa3, 0xd3, 0x62, 0xdb, 0x31, 0xe9, 0xc6, 0xa2, 0x04, 0x56, 0x06, 0x24, 0x53, 0x50, 0x71, + 0x46, 0x15, 0xf7, 0xf6, 0x56, 0x07, 0x2a, 0x5c, 0x8b, 0x16, 0xfc, 0x0c, 0x67, 0x04, 0x85, 0x31, 0x5d, 0x49, 0x67, 0xa7, 0x3a, 0xb8, 0x10, 0x16, 0x0a, 0x16, 0x79, 0x7c, 0xb7, 0x19, 0xe2, 0xe0, + 0x7c, 0xe7, 0xe8, 0xf8, 0x08, 0x0c, 0xf0, 0x25, 0xf3, 0xf8, 0x27, 0xd9, 0x2b, 0x1a, 0x97, 0x9b, 0x31, 0x38, 0xcc, 0x40, 0x4e, 0x48, 0x3e, 0xbc, 0x2c, 0xdd, 0x02, 0x52, 0x80, 0x91, 0x84, 0x30, + 0xb6, 0x1b, 0x1a, 0xb5, 0x64, 0xcf, 0x36, 0xbb, 0x63, 0x30, 0x69, 0xe9, 0x6e, 0xc4, 0xc8, 0x1e, 0x04, 0xe1, 0x70, 0x8b, 0x56, 0x61, 0xbc, 0x2c, 0xdb, 0x3c, 0xe2, 0xd9, 0xf9, 0x61, 0x5f, 0x93, + 0x12, 0xa7, 0x05, 0x26, 0xa9, 0x26, 0x2c, 0x55, 0xfa, 0x2a, 0x48, 0xbb, 0xbb, 0xcd, 0xa9, 0x36, 0x28, 0x60, 0xdb, 0xeb, 0x87, 0x44, 0x1d, 0xe0, 0xe0, 0xf3, 0x11, 0x61, 0xf6, 0xee, 0x86, 0x73, + 0xb3, 0xc6, 0x72, 0x2b, 0x72, 0xed, 0x7a, 0x6c, 0x56, 0xd5, 0xbb, 0x8d, 0xf1, 0xfb, 0x6e, 0xfd, 0xd5, 0x14, 0x08, 0xdf, 0xe5, 0x9b, 0xfb, 0x02, 0xfc, 0xc5, 0x83, 0xf4, 0xf1, 0x04, 0x7c, 0xe9, + 0xe4, 0x7b, 0xa3, 0x78, 0x86, 0xfb, 0x4d, 0xfa, 0xfc, 0xee, 0x76, 0xf2, 0xc0, 0xe0, 0xbc, 0x40, 0xa8, 0x75, 0x06, 0xc5, 0x1e, 0x9b, 0x8f, 0x66, 0x46, 0x27, 0xd1, 0xfa, 0x44, 0x98, 0xe7, 0xd3, + 0x90, 0x95, 0x20, 0xf2, 0x8b, 0xc1, 0xf9, 0x9b, 0x48, 0xfb, 0x2f, 0x32, 0xc8, 0x77, 0xa4, 0x3f, 0x3a, 0xf0, 0xde, 0x30, 0x84, 0x55, 0x86, 0xc6, 0xa0, 0x73, 0xda, 0x8b, 0xca, 0xe4, 0xb8, 0xf5, + 0x0c, 0xa0, 0x2d, 0x93, 0x29, 0x47, 0x6c, 0x1b, 0x41, 0xe2, 0x30, 0x7c, 0x57, 0xbd, 0x72, 0x5c, 0xa4, 0x61, 0x1a, 0xda, 0xdf, 0x25, 0xf8, 0x67, 0xdb, 0x6a, 0x92, 0x37, 0xce, 0xc7, 0x29, 0xf1, + 0x8c, 0xa7, 0x7b, 0x09, 0x99, 0x77, 0xba, 0x17, 0x58, 0xde, 0xef, 0xce, 0x7c, 0xdd, 0x00, 0xbe, 0xc6, 0x88, 0x98, 0x79, 0x74, 0x04, 0xe9, 0x65, 0x16, 0xe6, 0xa4, 0xc2, 0xcc, 0xa0, 0x6d, 0x3f, + 0x23, 0x16, 0xec, 0x04, 0x82, 0xc8, 0x7e, 0x1a, 0x83, 0x28, 0xdf, 0xe3, 0xe6, 0x8c, 0xe7, 0xc3, 0x70, 0x84, 0x02, 0x46, 0xbb, 0xc7, 0xd6, 0x1b, 0x3f, 0x83, 0x66, 0x68, 0xb2, 0xc5, 0x96, 0x11, + 0xc1, 0xe6, 0xce, 0xd4, 0x72, 0x5c, 0x59, 0xc1, 0x9d, 0x3d, 0x49, 0x36, 0x19, 0x0b, 0xe2, 0x92, 0x8d, 0xa4, 0xf1, 0x10, 0xbe, 0xe6, 0x52, 0xe9, 0xe4, 0x3f, 0xe7, 0x4c, 0x06, 0x77, 0xae, 0xb5, + 0x4d, 0x1d, 0x5e, 0xb4, 0x0c, 0xe0, 0xb7, 0xb2, 0x63, 0x4d, 0x73, 0xf1, 0x18, 0xfe, 0x0f, 0x79, 0x5b, 0xb1, 0xf2, 0x0b, 0xd2, 0x4f, 0xaa, 0x54, 0x7e, 0x3d, 0xc6, 0x5e, 0xd8, 0xb1, 0x7e, 0xac, + 0x4e, 0x39, 0x30, 0x39, 0x89, 0x2c, 0x33, 0xd3, 0x4d, 0x15, 0x11, 0x61, 0x03, 0x1c, 0x2d, 0x2c, 0x5f, 0xe9, 0x76, 0x35, 0x67, 0x95, 0xa2, 0x98, 0x0b, 0x59, 0x15, 0x01, 0x18, 0x2c, 0x6a, 0x5b, + 0x79, 0x65, 0xa1, 0xfd, 0x06, 0xcb, 0xb3, 0x7d, 0xa7, 0xcd, 0x91, 0x5e, 0x4b, 0xd3, 0x6d, 0x2e, 0xd8, 0xa2, 0xb7, 0x98, 0x8e, 0xa6, 0xf2, 0xac, 0xf0, 0x56, 0x80, 0x8a, 0x91, 0xa8, 0xc7, 0xfb, + 0x08, 0x69, 0xb0, 0x53, 0x93, 0x49, 0x56, 0xd2, 0xef, 0x78, 0xdf, 0x97, 0x9e, 0xfc, 0xcf, 0xc5, 0xcd, 0xfb, 0x07, 0x00, 0xb3, 0xe7, 0x25, 0xb8, 0xa1, 0x97, 0xca, 0xca, 0xfc, 0x54, 0x67, 0x72, + 0x40, 0x49, 0x13, 0x47, 0x3c, 0x8d, 0x90, 0x49, 0xb3, 0x43, 0x4c, 0xb8, 0x13, 0x2c, 0x83, 0xe5, 0x1a, 0xde, 0x28, 0xb6, 0xb6, 0x1f, 0x2d, 0x9a, 0xb5, 0x0a, 0x34, 0xf4, 0x1a, 0x68, 0x2c, 0xdb, + 0x98, 0x53, 0xe2, 0xde, 0x9a, 0xe5, 0xa4, 0xe7, 0xa1, 0x22, 0x79, 0xd2, 0x0a, 0x8c, 0xf6, 0x40, 0xd7, 0x53, 0xc8, 0x86, 0xc9, 0xf5, 0x1c, 0x3b, 0xa0, 0xf3, 0x23, 0xe1, 0xe8, 0x94, 0xe8, 0x4b, + 0x8b, 0xbd, 0x3f, 0xa9, 0xa4, 0x6f, 0x0e, 0x51, 0x5f, 0x3d, 0xf3, 0x9f, 0x75, 0xff, 0x05, 0x1e, 0xf9, 0x96, 0xf2, 0x07, 0x02, 0xd7, 0xfb, 0x07, 0xc5, 0x36, 0x1f, 0x82, 0x70, 0x08, 0xe9, 0x28, + 0x2e, 0x2c, 0x7e, 0x2d, 0x02, 0xec, 0x1a, 0x27, 0x4f, 0xa3, 0x24, 0x40, 0x0f, 0x20, 0x20, 0x42, 0xbc, 0x31, 0x8f, 0x60, 0x79, 0x8f, 0xef, 0x81, 0x55, 0xca, 0x9b, 0xc8, 0xc8, 0x5f, 0xce, 0x90, + 0x7e, 0xb4, 0xeb, 0x38, 0xc8, 0xe8, 0x67, 0xec, 0xa9, 0x6a, 0x0f, 0xec, 0x42, 0x41, 0xd2, 0x0d, 0x9e, 0xf6, 0xd9, 0xc6, 0x8e, 0x8b, 0x7d, 0xda, 0x41, 0x19, 0x47, 0xd9, 0xcb, 0xe8, 0x24, 0xfb, + 0x0f, 0x41, 0x78, 0xee, 0xef, 0xf4, 0x4a, 0xe8, 0xce, 0x47, 0xfc, 0xf4, 0x35, 0x74, 0x1a, 0xfa, 0x3d, 0x6c, 0xe7, 0xad, 0xbf, 0xe6, 0x48, 0x3d, 0x6c, 0x03, 0x34, 0xf6, 0x0d, 0x1f, 0x50, 0x92, + 0x45, 0xeb, 0x59, 0xfd, 0x8c, 0x2d, 0x7c, 0xb9, 0x21, 0x26, 0x13, 0x49, 0x4c, 0xd3, 0x83, 0xcc, 0x2e, 0xb3, 0x63, 0x20, 0x1b, 0xdc, 0x74, 0x35, 0x57, 0xb7, 0x14, 0x64, 0x95, 0x5a, 0x20, 0x08, + 0x35, 0x46, 0x4e, 0xf9, 0x9d, 0x4a, 0x6d, 0x2a, 0xda, 0x6a, 0x91, 0xcd, 0x6c, 0x6a, 0xa8, 0xac, 0xa5, 0x1d, 0x9b, 0x59, 0xc8, 0xc2, 0x69, 0x7d, 0xb7, 0x39, 0xe5, 0xc5, 0x25, 0xf5, 0xfa, 0x43, + 0xc6, 0x27, 0x4f, 0xad, 0x30, 0x73, 0x9d, 0xef, 0x7a, 0xc9, 0xaf, 0x27, 0x1a, 0xf9, 0x02, 0x20, 0x77, 0xb4, 0xcf, 0xc8, 0xdc, 0xb5, 0x9c, 0xcf, 0x34, 0xf2, 0x77, 0x88, 0xe6, 0x92, 0x80, 0xf2, + 0xb2, 0xd7, 0x2c, 0x5d, 0xd6, 0x23, 0x6c, 0xda, 0xa2, 0xf9, 0xe5, 0x7c, 0x1f, 0xac, 0x94, 0xd9, 0x61, 0x04, 0xc7, 0x93, 0x49, 0x49, 0x27, 0xa9, 0x4c, 0xb7, 0x76, 0x3b, 0x67, 0x30, 0x9a, 0x86, + 0x58, 0x63, 0xb5, 0xaf, 0x95, 0xf9, 0x44, 0x99, 0x05, 0x4e, 0xd2, 0x53, 0xbd, 0xa8, 0x77, 0xc7, 0x80, 0x4c, 0x66, 0x4e, 0xd6, 0xa6, 0xbc, 0xe8, 0x02, 0x23, 0xcc, 0x76, 0x72, 0xc6, 0x19, 0x10, + 0x8d, 0xec, 0xb8, 0x89, 0x79, 0xba, 0xc5, 0xe6, 0x12, 0x36, 0xf8, 0x74, 0x53, 0x4e, 0x53, 0x33, 0x73, 0x9e, 0x66, 0x27, 0x25, 0x5f, 0x0a, 0xe5, 0xfe, 0xa0, 0x7a, 0x81, 0xef, 0x72, 0x3d, 0x26, + 0x87, 0x85, 0x71, 0x8b, 0xf1, 0x76, 0x4d, 0x35, 0xa9, 0x37, 0x62, 0x5d, 0x78, 0x66, 0xc4, 0xea, 0x81, 0xf4, 0xc8, 0x25, 0x95, 0x7b, 0xc4, 0x69, 0x8d, 0xcb, 0xcb, 0x15, 0x07, 0xa3, 0x8e, 0xc6, + 0x6d, 0xe9, 0x54, 0xf0, 0x0c, 0x3a, 0x2d, 0x43, 0xaa, 0xd7, 0x0d, 0xa9, 0x5c, 0xc5, 0xcd, 0x3e, 0x5c, 0x05, 0x27, 0x6f, 0xa3, 0x34, 0x64, 0xad, 0x06, 0x99, 0x46, 0xd3, 0x50, 0xb8, 0xda, 0xbb, + 0x6d, 0x9b, 0x25, 0x32, 0xba, 0xfb, 0xe6, 0x0e, 0x6f, 0xe7, 0x69, 0x91, 0x67, 0x6e, 0x56, 0x8f, 0xdd, 0x34, 0xac, 0xeb, 0x1f, 0x0a, 0xd0, 0xbc, 0x08, 0xc0, 0x3d, 0xf5, 0x0b, 0x10, 0xf7, 0x6d, + 0x63, 0x68, 0x18, 0x20, 0xb2, 0x83, 0x54, 0x2e, 0x2e, 0xd1, 0xa3, 0x4a, 0x84, 0xb6, 0xdd, 0xc1, 0x88, 0x2a, 0x5b, 0x2a, 0x9b, 0xb2, 0x60, 0x36, 0x9c, 0x27, 0x82, 0xc0, 0x49, 0xcf, 0x94, 0x30, + 0xc3, 0x25, 0xa0, 0x9c, 0x21, 0xa9, 0xd8, 0xd4, 0x6c, 0xab, 0x96, 0xd3, 0x49, 0xb0, 0x6c, 0x2c, 0xa4, 0xa4, 0xc0, 0x46, 0xb0, 0x46, 0x0a, 0xa3, 0xd0, 0x0d, 0x03, 0x4a, 0x7a, 0x4e, 0x53, 0xa0, + 0xee, 0x78, 0x66, 0x5d, 0xc9, 0x83, 0x34, 0x3c, 0xb7, 0xb6, 0xcb, 0xc7, 0x02, 0xc6, 0x6b, 0xc7, 0xf5, 0x3b, 0xd9, 0x33, 0x2a, 0xef, 0x37, 0x63, 0xf0, 0xf7, 0x83, 0x1a, 0x1a, 0xc3, 0xab, 0xa4, + 0x84, 0x10, 0x60, 0x17, 0x79, 0x0e, 0x26, 0x66, 0xfc, 0xcc, 0x8c, 0x1a, 0x1f, 0x52, 0x69, 0x47, 0x46, 0x1e, 0x33, 0x8b, 0x5f, 0x3b, 0xe4, 0x85, 0x7e, 0x55, 0x5f, 0xaa, 0x99, 0x3e, 0x66, 0xf6, + 0x5e, 0xec, 0xd1, 0x3b, 0xdd, 0x4b, 0x97, 0xde, 0xef, 0xce, 0x9e, 0x74, 0x03, 0x98, 0x0f, 0x93, 0x5f, 0x15, 0xa5, 0x1f, 0x63, 0x7a, 0x40, 0x0b, 0x27, 0x16, 0xc6, 0x82, 0x88, 0xec, 0x16, 0x35, + 0x3c, 0x9a, 0x61, 0xb0, 0xd2, 0x41, 0x33, 0x59, 0xe6, 0xfa, 0x03, 0xdd, 0xad, 0x0b, 0x58, 0x37, 0xa9, 0x74, 0x9e, 0xea, 0xe4, 0x6a, 0xd3, 0xb6, 0x75, 0x9b, 0x66, 0x26, 0xa9, 0x1c, 0x35, 0x99, + 0x5a, 0xf2, 0x06, 0x1a, 0xf7, 0xfc, 0x0c, 0x27, 0x05, 0x18, 0x6e, 0x13, 0x53, 0x2e, 0x62, 0x77, 0xfe, 0x9a, 0xc9, 0xd5, 0xc9, 0xeb, 0x71, 0x51, 0xe6, 0x17, 0xd3, 0xc5, 0x57, 0xbb, 0xce, 0xdf, + 0x7e, 0x69, 0xda, 0xae, 0xd7, 0x24, 0x63, 0xef, 0x53, 0xeb, 0x75, 0x27, 0x6a, 0xa5, 0x66, 0xec, 0x8e, 0xaf, 0x35, 0xb3, 0xbe, 0x5b, 0xb5, 0x9a, 0x2c, 0x3c, 0x34, 0xef, 0xf9, 0xa4, 0xfe, 0x7e, + 0x68, 0xd4, 0xea, 0xca, 0xb0, 0x76, 0xc7, 0x5e, 0x98, 0xb8, 0xe3, 0x4b, 0x30, 0xe6, 0x63, 0x4a, 0x47, 0xc7, 0x1f, 0x5b, 0x66, 0xe5, 0xbe, 0xbf, 0x0a, 0xfd, 0x69, 0x8f, 0xcb, 0xe3, 0xf0, 0xd9, + 0x80, 0xbf, 0x56, 0x4e, 0xf8, 0x42, 0xf2, 0x3c, 0xd6, 0x6f, 0x17, 0x43, 0x4b, 0x08, 0x1b, 0x5d, 0x39, 0x8f, 0x17, 0xcb, 0xa3, 0x2a, 0x23, 0x0c, 0x97, 0xef, 0x6b, 0x71, 0x74, 0xd2, 0x18, 0x9c, + 0x62, 0x2c, 0x62, 0x95, 0x84, 0x47, 0xcb, 0x74, 0x27, 0x3b, 0x8f, 0x96, 0x68, 0xaa, 0xd5, 0x2a, 0x21, 0x03, 0xf2, 0x91, 0xde, 0xe1, 0x94, 0x4f, 0xef, 0x14, 0x65, 0xb6, 0x22, 0x61, 0x2c, 0x90, + 0x04, 0x47, 0x18, 0x75, 0x73, 0xb2, 0x67, 0xd6, 0x1e, 0xe2, 0xcc, 0x85, 0x04, 0x88, 0x8f, 0xb1, 0xfa, 0x80, 0x57, 0x7a, 0xfb, 0xa6, 0xe8, 0xa9, 0x2e, 0xf1, 0x45, 0x11, 0xf5, 0x9d, 0xea, 0x47, + 0xaf, 0x23, 0xb3, 0x1c, 0x22, 0xaa, 0x9e, 0x8d, 0xe0, 0xdd, 0xc8, 0x74, 0x6c, 0xaf, 0xdf, 0x1c, 0xed, 0x8d, 0xcb, 0x8d, 0xc0, 0x5d, 0xd2, 0xca, 0x65, 0x09, 0x20, 0xc9, 0x42, 0x13, 0x41, 0x6b, + 0x46, 0x60, 0xca, 0x71, 0x8f, 0x93, 0x10, 0x64, 0x1f, 0x95, 0x00, 0xda, 0x59, 0xc7, 0x23, 0x71, 0x34, 0xe8, 0xc5, 0x0a, 0x72, 0xb5, 0x7a, 0xe6, 0xe1, 0x55, 0x48, 0x96, 0x3e, 0x9c, 0x04, 0x99, + 0x1a, 0x55, 0xda, 0x9a, 0x9f, 0xf3, 0x9e, 0x25, 0x73, 0x4d, 0x37, 0xc8, 0x08, 0xfe, 0xb6, 0x08, 0xdf, 0x04, 0x97, 0xf1, 0xd3, 0xe2, 0x6b, 0x2f, 0x4a, 0xbe, 0x37, 0x84, 0xcf, 0x88, 0x7c, 0xde, + 0x0e, 0x93, 0x7a, 0x6b, 0x0f, 0x52, 0x39, 0xff, 0x10, 0xb6, 0xf3, 0x03, 0xe4, 0x1e, 0xea, 0xa3, 0xc4, 0x27, 0x13, 0x47, 0x55, 0x67, 0x9d, 0x39, 0x20, 0x30, 0xc2, 0x2e, 0x5d, 0xb3, 0xbe, 0x98, + 0xd9, 0xc3, 0xa7, 0x7b, 0xd9, 0x6b, 0x0e, 0x0f, 0xf7, 0xa4, 0xdf, 0xba, 0x76, 0xd7, 0x30, 0xd4, 0xed, 0xc1, 0xb1, 0x57, 0xf3, 0x3d, 0x12, 0x65, 0x20, 0x5f, 0x70, 0xe6, 0x3e, 0x0a, 0xab, 0x5c, + 0x6e, 0xdd, 0x23, 0xb7, 0xd4, 0x98, 0x55, 0x6f, 0x1e, 0x88, 0x1e, 0x2e, 0x8d, 0xd5, 0xd1, 0x1b, 0xf1, 0x4a, 0x49, 0x6d, 0x63, 0x27, 0x65, 0xd3, 0x4a, 0x45, 0x53, 0x38, 0xb1, 0xd7, 0x79, 0x54, + 0x46, 0xc0, 0x9c, 0x4d, 0xc8, 0x34, 0xc6, 0xb4, 0x23, 0x9f, 0xea, 0x93, 0x91, 0x57, 0xcb, 0xf1, 0x06, 0x40, 0xf2, 0xd5, 0x20, 0x0d, 0xe1, 0x6d, 0x80, 0xee, 0xb3, 0xf1, 0x7e, 0xe1, 0x44, 0xff, + 0x20, 0x7b, 0x86, 0xe4, 0xfd, 0x66, 0x48, 0x10, 0xcc, 0x1b, 0x1c, 0xcd, 0x44, 0x73, 0x01, 0xcb, 0x17, 0xd8, 0x64, 0xe3, 0x6c, 0x20, 0x8d, 0x41, 0x95, 0x18, 0x24, 0x1b, 0xaa, 0x98, 0x2c, 0x89, + 0x1c, 0x3a, 0x02, 0xb5, 0x26, 0xd5, 0x7b, 0x82, 0xd8, 0x62, 0x7d, 0x12, 0xe8, 0x41, 0xd3, 0x89, 0xbb, 0x5a, 0x8b, 0x37, 0x34, 0x53, 0xb3, 0x4e, 0x3b, 0xc7, 0xec, 0x03, 0x4a, 0x6a, 0xbd, 0x3b, + 0x5d, 0x60, 0x21, 0xd4, 0x0b, 0xa8, 0x23, 0xd9, 0x64, 0xd1, 0xad, 0xf5, 0xf2, 0x3b, 0x53, 0x73, 0xfe, 0xae, 0xaa, 0x30, 0xbb, 0xec, 0x49, 0xe7, 0xef, 0xeb, 0x84, 0xfc, 0x59, 0xe7, 0xcf, 0x74, + 0x3f, 0x7a, 0x7f, 0xbe, 0x3b, 0x17, 0x79, 0x1b, 0x20, 0x1f, 0x85, 0xf2, 0x6c, 0xb3, 0x5c, 0xa9, 0x1b, 0x8d, 0x11, 0x66, 0x84, 0xc3, 0x6e, 0x44, 0xb2, 0x8c, 0x2d, 0x31, 0xdb, 0x14, 0xa7, 0xd9, + 0xc9, 0xb7, 0x67, 0xf3, 0x7a, 0x17, 0x15, 0xee, 0x4e, 0x98, 0xfa, 0x27, 0x72, 0xb7, 0x81, 0xcb, 0xbd, 0x7d, 0xdc, 0xaf, 0xc9, 0x6d, 0x15, 0xcb, 0xae, 0x94, 0xe0, 0x62, 0x49, 0xc3, 0x0b, 0x62, + 0xa4, 0x2e, 0x4b, 0xd3, 0xaf, 0xa0, 0x03, 0x84, 0xcd, 0x1b, 0xc7, 0x26, 0x16, 0xf8, 0x6b, 0xb9, 0xf3, 0x0a, 0xb3, 0x0e, 0xc6, 0xb1, 0x7b, 0xfa, 0xfb, 0xd3, 0x21, 0xff, 0xe6, 0x58, 0xa9, 0x02, + 0xd7, 0x32, 0x33, 0x7f, 0x7c, 0xe5, 0x5a, 0x9f, 0x1c, 0x51, 0x41, 0x78, 0x93, 0x80, 0xe6, 0x99, 0x92, 0xb0, 0x3c, 0x15, 0x75, 0x3e, 0x2e, 0xcd, 0xcc, 0xc9, 0xd3, 0xcf, 0x13, 0xef, 0x5f, 0x54, + 0xde, 0x3f, 0x78, 0xc1, 0x79, 0x74, 0xbe, 0x37, 0x0f, 0x55, 0xeb, 0xb7, 0x50, 0x91, 0x70, 0x33, 0xe4, 0x44, 0x95, 0x40, 0xb2, 0x09, 0xda, 0x70, 0x09, 0x75, 0xe5, 0xbe, 0x58, 0xbb, 0x27, 0x95, + 0x5b, 0x4c, 0x0c, 0x58, 0x61, 0x05, 0x7d, 0xcb, 0x98, 0x45, 0x4a, 0x00, 0xe4, 0x84, 0xca, 0xd6, 0x9b, 0xfc, 0xd4, 0x6a, 0x05, 0x22, 0xaf, 0x00, 0x66, 0x33, 0x3f, 0x64, 0x58, 0xcc, 0xf4, 0xd9, + 0x69, 0xe7, 0xeb, 0x86, 0x50, 0xc9, 0xb5, 0xae, 0x73, 0x3b, 0xab, 0x59, 0x90, 0xcf, 0x2a, 0xc3, 0xde, 0x81, 0xe5, 0xb8, 0x66, 0xfd, 0x3c, 0x78, 0xed, 0x15, 0xfb, 0xf2, 0x99, 0xe2, 0x39, 0xfe, + 0xf1, 0x6d, 0xbc, 0x07, 0x54, 0x17, 0x86, 0xc6, 0x13, 0xf3, 0x60, 0x4b, 0x34, 0xe1, 0xc4, 0x99, 0x3a, 0x9f, 0x33, 0xf6, 0xda, 0x4f, 0x75, 0x6c, 0xb6, 0xb0, 0x16, 0xf6, 0xf1, 0x6b, 0x0a, 0xac, + 0xaf, 0x61, 0x9b, 0xff, 0x73, 0x73, 0xf8, 0x7d, 0xb8, 0xe6, 0x40, 0x33, 0xb8, 0xb8, 0x27, 0xf7, 0x87, 0x0d, 0x01, 0x40, 0x26, 0x65, 0x1f, 0xe2, 0xa3, 0xde, 0xc1, 0xa7, 0x7d, 0x55, 0x41, 0x98, + 0x07, 0xe3, 0xc2, 0x6a, 0x47, 0x17, 0xb3, 0xbd, 0xe4, 0x80, 0x40, 0xb3, 0x02, 0x56, 0x9b, 0x83, 0x23, 0x05, 0x47, 0x6b, 0x63, 0x52, 0x14, 0x1a, 0x64, 0x7d, 0x64, 0x33, 0xb0, 0x76, 0x90, 0x8a, + 0x59, 0x95, 0x78, 0x18, 0x46, 0xc0, 0x88, 0xbd, 0xda, 0xa8, 0xe2, 0x42, 0x49, 0x79, 0x1d, 0x79, 0xcd, 0x6d, 0xea, 0x3d, 0x6a, 0xf3, 0x29, 0x13, 0xe6, 0xb8, 0x6f, 0xf2, 0x4f, 0xe9, 0x56, 0xd5, + 0x6f, 0x9a, 0x68, 0xe4, 0x25, 0x89, 0xeb, 0x01, 0xfd, 0x33, 0x9c, 0xdf, 0x5a, 0xc7, 0xc8, 0xef, 0x52, 0x17, 0x34, 0xf6, 0x57, 0x5b, 0x87, 0x8f, 0x1c, 0x4e, 0x64, 0x5a, 0x7c, 0xc9, 0x4d, 0x67, + 0x7a, 0x58, 0xd6, 0xc4, 0xd2, 0x3f, 0x20, 0x00, 0xff, 0x12, 0x3c, 0x7f, 0xa4, 0x93, 0xbe, 0xcb, 0xcf, 0xfa, 0xef, 0x9d, 0xec, 0x9f, 0x64, 0xcf, 0xc8, 0xbc, 0xdf, 0x0c, 0x3d, 0xd1, 0x4f, 0x0e, + 0x65, 0x63, 0x13, 0x27, 0x3c, 0x68, 0xb6, 0x3c, 0x5a, 0x46, 0x76, 0xa7, 0x4a, 0x16, 0x35, 0x8b, 0x83, 0xa5, 0x4d, 0x66, 0xbe, 0x50, 0x82, 0xbc, 0x19, 0x30, 0xf4, 0xa2, 0x9d, 0x85, 0xcb, 0x8e, + 0x2c, 0x9a, 0x9d, 0x69, 0xc1, 0x27, 0x23, 0x09, 0x46, 0x59, 0x6c, 0x56, 0x62, 0x66, 0x6c, 0x46, 0xcc, 0x62, 0x3b, 0xd9, 0xe0, 0xa5, 0x5c, 0xc0, 0xcb, 0x7e, 0x19, 0x2c, 0x8d, 0xbe, 0x15, 0xe6, + 0xe4, 0x6b, 0xb3, 0x2d, 0x3c, 0x1f, 0xbe, 0xcd, 0x7b, 0xe1, 0xf7, 0x0b, 0x98, 0x77, 0x0a, 0xe9, 0xb0, 0x1a, 0x3b, 0x6f, 0x5c, 0xcb, 0xc5, 0xf2, 0xf3, 0xf1, 0x1b, 0xe8, 0xcb, 0x6f, 0x3e, 0xdd, + 0xa5, 0xbf, 0x51, 0xb8, 0xda, 0x8c, 0xc2, 0xea, 0xf1, 0x3f, 0x5f, 0x1f, 0x7f, 0x38, 0xe7, 0x7d, 0xf3, 0xb1, 0xb9, 0x14, 0xfc, 0xfb, 0xa7, 0x28, 0xf3, 0x3a, 0xaf, 0x4f, 0x85, 0xfb, 0x8f, 0x97, + 0x98, 0xfe, 0xfb, 0x6f, 0xe1, 0x9f, 0x87, 0xfe, 0x58, 0xbb, 0x4f, 0x3d, 0x99, 0xc0, 0x97, 0xd2, 0xbc, 0xdc, 0xd0, 0xfd, 0x18, 0xfc, 0xf3, 0xdd, 0x18, 0x1c, 0x96, 0xe8, 0x65, 0x2d, 0xb2, 0x47, + 0x4e, 0x34, 0x37, 0xba, 0xc3, 0x26, 0x4b, 0xb9, 0x9e, 0x4a, 0xde, 0x8c, 0xd3, 0x8c, 0xda, 0xeb, 0x80, 0xc6, 0xe3, 0xc9, 0x51, 0xa9, 0x45, 0x38, 0x4a, 0xc9, 0x1c, 0xdb, 0xdb, 0x29, 0xd0, 0x2e, + 0x3a, 0x49, 0xde, 0xcf, 0x6b, 0x5c, 0xdc, 0x1c, 0xb8, 0xf9, 0xae, 0x4a, 0xe1, 0x3d, 0xc3, 0x97, 0x02, 0xc7, 0xd4, 0x3b, 0x19, 0x47, 0x2b, 0x1d, 0x5a, 0x33, 0xab, 0x19, 0xdc, 0x4e, 0xc4, 0x61, + 0x47, 0x83, 0x5b, 0x3c, 0x67, 0xde, 0xc1, 0x97, 0x74, 0xbe, 0x57, 0x9a, 0xef, 0x48, 0x5c, 0x8a, 0x26, 0xff, 0xc6, 0xc7, 0x40, 0xe3, 0x0a, 0xce, 0x76, 0x23, 0x08, 0x26, 0x99, 0x11, 0xb1, 0x51, + 0xe3, 0x91, 0x5c, 0xb1, 0xb3, 0x11, 0x61, 0x0b, 0xfb, 0xbe, 0x97, 0x86, 0xf5, 0x23, 0x75, 0x4b, 0xff, 0x87, 0xe2, 0x28, 0x2f, 0x88, 0x21, 0x1f, 0x54, 0xaf, 0x7d, 0x39, 0x5f, 0x9f, 0x23, 0x52, + 0x06, 0x48, 0x65, 0xf3, 0x25, 0xa2, 0xfa, 0x1c, 0xea, 0x73, 0xc9, 0x68, 0xc3, 0x1a, 0x29, 0x86, 0xc4, 0x59, 0xd5, 0x28, 0xf3, 0x82, 0x19, 0x65, 0x8c, 0xc2, 0x97, 0x04, 0x8f, 0xb6, 0x94, 0x64, + 0xfb, 0x34, 0xa1, 0xe0, 0xc8, 0x2a, 0x02, 0xf0, 0xdd, 0x81, 0x0f, 0xe7, 0xd2, 0xb2, 0xa0, 0x69, 0xbd, 0x87, 0x36, 0xf5, 0x08, 0xc7, 0x2d, 0xa3, 0xd8, 0x20, 0x12, 0xb1, 0x3e, 0xb9, 0xa0, 0x98, + 0x53, 0xfc, 0x66, 0x75, 0x51, 0x51, 0x7e, 0xe9, 0xf8, 0xb7, 0xba, 0xc5, 0xff, 0x9e, 0xf6, 0xfe, 0x2b, 0xf1, 0x33, 0x0c, 0xf7, 0x4d, 0x43, 0x75, 0xf8, 0x20, 0xa7, 0x38, 0x42, 0xde, 0x54, 0x6c, + 0x6b, 0x6c, 0x61, 0x26, 0x9c, 0x27, 0x86, 0x6b, 0x4c, 0x58, 0x5a, 0x6d, 0x95, 0x63, 0xba, 0xaa, 0x3a, 0x6d, 0xca, 0x78, 0x64, 0xb0, 0x23, 0x56, 0x3b, 0x7f, 0x81, 0x9a, 0x24, 0xaf, 0x31, 0x0d, + 0x80, 0x68, 0x16, 0xde, 0xec, 0xf4, 0xbc, 0x8f, 0xa3, 0x53, 0x72, 0x9a, 0x1e, 0x5d, 0x70, 0x49, 0x73, 0xa1, 0x4c, 0x43, 0x91, 0x86, 0x62, 0x0a, 0x01, 0xee, 0xb4, 0x21, 0x12, 0x8b, 0xe3, 0x7a, + 0x61, 0xe6, 0x9e, 0x95, 0x2e, 0x6e, 0x59, 0x87, 0x3f, 0x44, 0x34, 0xbf, 0x88, 0xd0, 0x3d, 0xf5, 0x0b, 0x44, 0xf7, 0x6d, 0x43, 0x31, 0x42, 0xf8, 0x83, 0xa7, 0xaf, 0x22, 0x38, 0x59, 0xf7, 0x0e, + 0xaf, 0x78, 0xa4, 0xc1, 0x19, 0x0c, 0xa0, 0x8d, 0x8c, 0xe6, 0x34, 0xa2, 0xfd, 0x19, 0xee, 0x41, 0x38, 0xea, 0x92, 0x2b, 0xb8, 0x23, 0x1c, 0x3f, 0x2b, 0x56, 0x93, 0x92, 0x9e, 0xb9, 0xe5, 0x42, + 0x2f, 0x78, 0x14, 0xe7, 0x74, 0xdd, 0x8e, 0xb2, 0xd8, 0xd9, 0x08, 0x7c, 0xb4, 0x89, 0xa9, 0x09, 0xae, 0xcd, 0x69, 0x72, 0x84, 0x28, 0xab, 0x64, 0x3f, 0xc0, 0x48, 0xf6, 0x7d, 0xb7, 0x05, 0xff, + 0x81, 0x9e, 0xf8, 0x2b, 0x5e, 0x3a, 0xf7, 0x6c, 0xfb, 0x7c, 0x4d, 0xfa, 0xbb, 0xd2, 0xfc, 0x80, 0xce, 0x19, 0x22, 0xf7, 0x41, 0xe3, 0x93, 0x0e, 0x5b, 0x7d, 0xeb, 0xec, 0x1c, 0x3a, 0x14, 0x19, + 0x29, 0x29, 0xe6, 0xf2, 0xc2, 0x40, 0xb1, 0xca, 0x2b, 0x8a, 0xc7, 0x5c, 0xc4, 0x97, 0x7e, 0x7c, 0x51, 0xe4, 0xff, 0x9b, 0xdd, 0xb9, 0x25, 0x7d, 0xee, 0xd5, 0x6d, 0xc3, 0xb0, 0xce, 0x21, 0x7d, + 0x19, 0xa4, 0xe6, 0xa9, 0x1e, 0x21, 0x10, 0x33, 0x3d, 0x94, 0x7e, 0x55, 0xa0, 0xa1, 0x5d, 0x2e, 0xc5, 0x63, 0xf0, 0x35, 0x79, 0x9b, 0x13, 0x7a, 0xde, 0xd3, 0x5d, 0xef, 0x15, 0xe5, 0xcb, 0x1b, + 0xc1, 0xb7, 0xaf, 0x0e, 0x3d, 0x6f, 0x8c, 0xfe, 0xae, 0x6c, 0x39, 0x7b, 0x2c, 0x91, 0x49, 0x7a, 0x5c, 0x29, 0x13, 0x94, 0x16, 0x4e, 0xeb, 0x7e, 0xc4, 0xb2, 0xbc, 0xda, 0x27, 0x22, 0x53, 0xf8, + 0x20, 0x35, 0xd7, 0x46, 0x6e, 0x8b, 0x1b, 0xbc, 0x8b, 0xb4, 0xcb, 0x30, 0xf0, 0x9d, 0x63, 0xef, 0xdb, 0x9d, 0x41, 0x6a, 0x39, 0xc3, 0x6c, 0xd2, 0xc9, 0x7a, 0x6a, 0x2c, 0xa8, 0x75, 0x7a, 0xf0, + 0xb4, 0x5c, 0xe0, 0xf9, 0x55, 0x51, 0xd7, 0x9c, 0xbe, 0xd5, 0x16, 0x78, 0x33, 0xd3, 0x89, 0x41, 0xe7, 0x57, 0x58, 0xbe, 0x7b, 0x88, 0x3d, 0xe6, 0x76, 0x5f, 0x51, 0x38, 0xbf, 0x13, 0x3d, 0x83, + 0x70, 0xb9, 0x3c, 0x47, 0xf7, 0x0c, 0x60, 0xe3, 0x76, 0x71, 0xb9, 0x2b, 0xa8, 0x85, 0x8c, 0xae, 0xf6, 0xde, 0x6a, 0xa1, 0xf7, 0xe2, 0x3a, 0xdd, 0x36, 0x0b, 0x2d, 0x84, 0xd4, 0xdd, 0xdc, 0xeb, + 0x2a, 0x84, 0x20, 0x32, 0xca, 0xb6, 0x31, 0x0c, 0xa8, 0x2d, 0x7c, 0xd6, 0x1c, 0x4e, 0x73, 0xbc, 0xb0, 0x25, 0x6c, 0x62, 0x85, 0x2c, 0x53, 0x05, 0xe6, 0xac, 0xd0, 0xa9, 0x16, 0xcf, 0x4d, 0xa5, + 0x84, 0xf7, 0xd3, 0x59, 0xe8, 0x2c, 0x52, 0xbe, 0x73, 0x7a, 0xee, 0x35, 0x55, 0xf3, 0x59, 0x14, 0x7f, 0xe3, 0x8d, 0xfe, 0xfe, 0x45, 0x83, 0xeb, 0xe4, 0xf6, 0x9b, 0x1c, 0xfb, 0x5c, 0x62, 0x78, + 0x69, 0x11, 0x5c, 0x89, 0xbe, 0x61, 0x78, 0xbd, 0x1c, 0x92, 0x2a, 0xf9, 0xcc, 0x0a, 0x2b, 0x23, 0x09, 0x0b, 0x91, 0x80, 0xf6, 0x88, 0x05, 0x1d, 0x3b, 0xe8, 0x6a, 0x41, 0x9a, 0x84, 0x4b, 0x0b, + 0xc2, 0x4e, 0x58, 0xac, 0xb7, 0x26, 0xd3, 0x75, 0xfa, 0x4e, 0x0d, 0x23, 0x4e, 0xe7, 0x89, 0xbe, 0x4c, 0xf4, 0x19, 0x0f, 0xd2, 0xf3, 0x3d, 0x1b, 0x45, 0x9b, 0x5d, 0xb2, 0x33, 0x20, 0xd9, 0x27, + 0x54, 0xd3, 0x71, 0x0c, 0x97, 0x9b, 0xa5, 0x21, 0x15, 0xcd, 0x11, 0x36, 0x3d, 0x84, 0x12, 0xfc, 0x9a, 0x3a, 0xc3, 0xad, 0xee, 0x4b, 0xa4, 0x3e, 0xdb, 0x14, 0x3f, 0xb5, 0xfa, 0x8f, 0xcd, 0x1e, + 0x2f, 0xc9, 0x5c, 0x57, 0xa2, 0x67, 0x04, 0x2f, 0x97, 0x67, 0xef, 0x96, 0x01, 0x08, 0x4a, 0x3c, 0x79, 0x40, 0xfa, 0x99, 0x8b, 0x91, 0xc1, 0x41, 0x3d, 0x44, 0xa5, 0x29, 0x89, 0x69, 0x6f, 0x40, + 0x6b, 0x8e, 0xa5, 0x94, 0x9d, 0xb4, 0xdc, 0x26, 0xcc, 0x6a, 0xca, 0xa2, 0xf1, 0x12, 0xce, 0xa5, 0x76, 0x6d, 0xc4, 0x84, 0x6c, 0x49, 0xfb, 0xb6, 0x9e, 0xf1, 0xf0, 0x9e, 0x39, 0x20, 0x5e, 0x17, + 0x6b, 0xd4, 0x74, 0xda, 0xb6, 0x2c, 0xba, 0x9e, 0x80, 0x13, 0x6d, 0x94, 0xfb, 0xf3, 0x8a, 0xe6, 0xe1, 0xd7, 0xdc, 0x4b, 0xc3, 0xaf, 0x09, 0xf3, 0x9e, 0x01, 0x18, 0xfa, 0xd9, 0x73, 0xc3, 0x11, + 0xf8, 0x92, 0x52, 0xfd, 0x83, 0xea, 0x05, 0xc2, 0xcb, 0xf5, 0x99, 0x19, 0x1d, 0xb0, 0xa5, 0xa9, 0x8b, 0xc5, 0x62, 0xe7, 0x29, 0x66, 0xd3, 0x54, 0xa6, 0xb6, 0x9c, 0x8e, 0x48, 0xcf, 0xd7, 0x46, + 0x82, 0xd6, 0xd2, 0xfb, 0x78, 0xba, 0x4d, 0xb5, 0x96, 0xa8, 0x62, 0x3c, 0xcb, 0xa3, 0x99, 0x61, 0xb4, 0x8d, 0xa8, 0x0a, 0x0b, 0xf5, 0x04, 0x1a, 0x31, 0xaa, 0x16, 0xac, 0x34, 0xc3, 0x99, 0x59, + 0xa4, 0x80, 0x51, 0x41, 0x77, 0xf6, 0x64, 0xda, 0xb2, 0xa8, 0x9b, 0x7b, 0xed, 0xa9, 0xa7, 0x6d, 0x79, 0xf6, 0xda, 0x2c, 0x3c, 0xa7, 0xfd, 0xfb, 0x08, 0x82, 0x44, 0x9e, 0xa7, 0x65, 0x76, 0x9a, + 0x22, 0x71, 0x8f, 0x6e, 0xf9, 0xdc, 0x65, 0xf1, 0x15, 0x17, 0x96, 0x0f, 0xaa, 0x6f, 0x30, 0xbe, 0x5f, 0x9f, 0x61, 0xfc, 0xc5, 0x81, 0x05, 0x1a, 0x13, 0x3e, 0xeb, 0xb0, 0xab, 0x4e, 0x04, 0xc9, + 0x96, 0x05, 0x2c, 0x3c, 0xf2, 0xec, 0x69, 0x4e, 0xda, 0xe8, 0x64, 0x2d, 0x72, 0xbf, 0xef, 0xed, 0x8f, 0xd3, 0x1d, 0xfc, 0xcf, 0xf5, 0xad, 0xcf, 0xd3, 0x1c, 0x0c, 0xd4, 0xb7, 0x4e, 0x3b, 0x7a, + 0x2d, 0x33, 0x9c, 0x44, 0xac, 0x5b, 0x7d, 0x4e, 0x83, 0xbb, 0x93, 0xdc, 0x76, 0xc1, 0x01, 0x13, 0xb0, 0xc3, 0x26, 0xb0, 0xf1, 0x0d, 0x1f, 0xcd, 0x70, 0x4b, 0xf7, 0xfd, 0x79, 0xc2, 0x61, 0xfa, + 0x69, 0xe6, 0x27, 0x23, 0xb0, 0x3d, 0x1e, 0x30, 0x8d, 0xb5, 0x78, 0x71, 0x7e, 0x58, 0xfb, 0x44, 0xe0, 0xed, 0xfa, 0xb4, 0x21, 0xb7, 0x98, 0x01, 0x49, 0xb9, 0x17, 0xa4, 0x5b, 0x2e, 0xe0, 0xea, + 0x21, 0xa7, 0xdd, 0x9b, 0x44, 0x99, 0x7b, 0xbf, 0xf1, 0x2c, 0xe8, 0x0b, 0x63, 0x7c, 0x47, 0xf9, 0x0d, 0x95, 0xdb, 0xfb, 0xb3, 0xdf, 0xca, 0x00, 0x67, 0xa5, 0x51, 0xd3, 0x41, 0x61, 0xc6, 0xb1, + 0xda, 0x46, 0xca, 0x4d, 0xad, 0x61, 0x7b, 0xf9, 0xb4, 0x77, 0x60, 0x28, 0xb4, 0xf9, 0x91, 0x9d, 0xd5, 0xe8, 0xb4, 0x9f, 0x61, 0xe5, 0x6e, 0x24, 0x4c, 0xa1, 0x2e, 0x12, 0x55, 0x65, 0x2b, 0x56, + 0xa3, 0xad, 0x4b, 0xcc, 0xc5, 0x96, 0x98, 0x04, 0x02, 0xd1, 0x2a, 0xd4, 0x11, 0xc8, 0xb9, 0x53, 0xb0, 0xde, 0x60, 0x1b, 0x19, 0x62, 0x47, 0x45, 0x20, 0x4d, 0xd8, 0x06, 0x7b, 0x6d, 0xdb, 0xc9, + 0x33, 0xfb, 0x5d, 0x11, 0xf4, 0xb4, 0x26, 0xa9, 0x9b, 0x9d, 0xff, 0xf3, 0xb9, 0x21, 0x0f, 0x79, 0xa1, 0x58, 0xd1, 0x3b, 0xd1, 0x33, 0x86, 0x97, 0xcb, 0xf1, 0x99, 0xd2, 0xef, 0xf0, 0x9d, 0x22, + 0x21, 0xdb, 0x94, 0x08, 0x84, 0x01, 0xf3, 0x48, 0x41, 0x7b, 0xae, 0x52, 0x8f, 0xba, 0xdf, 0xe8, 0xea, 0x66, 0x03, 0xbb, 0x90, 0xb0, 0x42, 0x1d, 0x82, 0x21, 0x0c, 0x71, 0x1d, 0x9e, 0xf4, 0xa9, + 0x6d, 0xcd, 0xe9, 0x70, 0xcb, 0x9f, 0xb8, 0xd9, 0x08, 0xee, 0xda, 0x14, 0xee, 0xf0, 0x51, 0x61, 0x00, 0xb9, 0xc3, 0x4f, 0x08, 0x5b, 0x8e, 0xa3, 0xa0, 0xda, 0x58, 0x49, 0xdd, 0xd1, 0x62, 0xb9, + 0x7e, 0x4d, 0x05, 0x74, 0x5f, 0x55, 0xe2, 0x6b, 0x79, 0xe8, 0x7b, 0x14, 0xab, 0xf1, 0x7b, 0xc5, 0xb2, 0xe7, 0x92, 0x15, 0xf5, 0x42, 0x3e, 0xc8, 0x1b, 0xc2, 0x6f, 0x60, 0x7e, 0xde, 0x8d, 0x2f, + 0x04, 0x7f, 0x07, 0x74, 0x62, 0xc2, 0x0b, 0x78, 0x24, 0x3b, 0x88, 0x85, 0xc7, 0x47, 0x46, 0x5d, 0x6d, 0xe7, 0xe8, 0xd6, 0xdc, 0xe1, 0x84, 0xdd, 0xd3, 0xeb, 0xd3, 0xa4, 0x45, 0x7a, 0x42, 0x13, + 0x03, 0x5d, 0x56, 0x31, 0x50, 0xa7, 0x8f, 0x23, 0xcb, 0xaa, 0x74, 0x83, 0x3a, 0x4a, 0x1b, 0x34, 0xe1, 0x05, 0xb3, 0x77, 0x37, 0xcd, 0x3c, 0x39, 0x59, 0x7b, 0x0e, 0xd4, 0x50, 0xbe, 0x6c, 0x36, + 0x79, 0x45, 0x1c, 0xd4, 0x1c, 0xf3, 0x06, 0x38, 0x79, 0xde, 0x86, 0xcb, 0x3d, 0x08, 0x70, 0x75, 0xab, 0x37, 0xf9, 0xb9, 0x28, 0xc3, 0x34, 0xac, 0xc3, 0xf6, 0x7d, 0x9a, 0xc2, 0x5f, 0xaa, 0x44, + 0xbd, 0x16, 0x67, 0xf6, 0xe0, 0x27, 0xd5, 0x29, 0xb5, 0xf2, 0x64, 0xec, 0x5c, 0xeb, 0x04, 0x5e, 0x07, 0xe5, 0x41, 0x5e, 0x5c, 0xf3, 0x53, 0xfa, 0x43, 0xbe, 0x3c, 0xb8, 0x12, 0x79, 0xf2, 0x83, + 0x37, 0xec, 0xcb, 0xcc, 0x4c, 0xc6, 0x55, 0x92, 0xd7, 0x4f, 0x7e, 0x52, 0x8d, 0xdf, 0x50, 0x31, 0xad, 0xe4, 0xb3, 0xbf, 0x5f, 0x55, 0x8a, 0x99, 0xeb, 0x9b, 0x6f, 0x80, 0x8c, 0x7b, 0xb7, 0xcc, + 0xff, 0xfe, 0x64, 0xb9, 0xee, 0x7f, 0x75, 0xab, 0x54, 0x84, 0xbe, 0xd1, 0xa8, 0x02, 0xb3, 0x7c, 0x4f, 0x11, 0x3a, 0xbe, 0xc4, 0x93, 0x3f, 0x1e, 0x84, 0xb7, 0xdf, 0x7e, 0xfa, 0x49, 0xbc, 0x3d, + 0x26, 0xbe, 0x3c, 0xee, 0x5c, 0x33, 0x2e, 0x5d, 0xef, 0xf1, 0xbf, 0xbf, 0xeb, 0x2f, 0xb3, 0xaa, 0xf8, 0xd4, 0x80, 0x42, 0x5f, 0x13, 0xf2, 0xfe, 0xa6, 0xc5, 0xbc, 0xfc, 0xe0, 0x9f, 0x2f, 0x9e, + 0xf3, 0x77, 0x2f, 0xba, 0x7c, 0xe4, 0x8d, 0xa2, 0xb3, 0x2e, 0xc3, 0xd4, 0xbd, 0x99, 0x5a, 0xe8, 0xaf, 0xbf, 0xae, 0x6a, 0xb3, 0xac, 0x1f, 0xff, 0xbe, 0xc9, 0xac, 0xfc, 0xf8, 0x6d, 0x2a, 0x82, + 0x7f, 0x56, 0x43, 0xf6, 0x66, 0x50, 0x3e, 0x5b, 0xbf, 0x2b, 0x57, 0x6e, 0x5f, 0x3c, 0x7c, 0x17, 0x78, 0x27, 0x7e, 0x49, 0xa7, 0x73, 0x39, 0xa6, 0xbf, 0xfb, 0xce, 0xfe, 0xf5, 0x6c, 0x0b, 0x88, + 0x5b, 0xd9, 0x39, 0xce, 0xaa, 0xa3, 0x11, 0x05, 0xbd, 0xba, 0x07, 0x09, 0x23, 0x5b, 0x9f, 0x9c, 0x5e, 0x81, 0xb6, 0x2a, 0xb0, 0x5d, 0x26, 0x5b, 0x95, 0x65, 0x75, 0x54, 0x5f, 0xaf, 0x49, 0xc2, + 0x45, 0x88, 0x5c, 0x9d, 0xa0, 0xd4, 0xcc, 0x8b, 0xd7, 0x07, 0xff, 0x34, 0xd2, 0xa2, 0x79, 0x6e, 0xe7, 0xdd, 0x09, 0xa6, 0xec, 0x55, 0x6b, 0x2b, 0x61, 0x33, 0x8a, 0xb9, 0x96, 0x80, 0xc9, 0x68, + 0xbb, 0xd5, 0xfe, 0x20, 0x41, 0xef, 0xcf, 0x5b, 0xc1, 0x5f, 0xef, 0xcb, 0xab, 0xce, 0x2f, 0x23, 0x57, 0x9b, 0xfe, 0xcd, 0xe2, 0xbc, 0xf9, 0xdd, 0xe3, 0xa0, 0xe6, 0x6f, 0xb3, 0xf0, 0x07, 0xfc, + 0x5f, 0x0d, 0x21, 0xbf, 0x7f, 0x07, 0x30, 0xfe, 0xd2, 0x30, 0xbe, 0x90, 0x1e, 0x36, 0x1a, 0x6c, 0x0e, 0xf7, 0x24, 0x68, 0x69, 0x5c, 0xbb, 0x4c, 0x72, 0x76, 0xa4, 0xf7, 0x72, 0x5a, 0x18, 0x9a, + 0xe4, 0x92, 0xc4, 0xe8, 0x30, 0x51, 0x52, 0x5a, 0x5d, 0x19, 0xb3, 0x9d, 0x7f, 0xa4, 0xec, 0x66, 0xb4, 0x9a, 0x95, 0x7b, 0xd8, 0x98, 0xb1, 0x00, 0x52, 0xf3, 0xa7, 0x91, 0xbf, 0xb7, 0x0c, 0x66, + 0xab, 0x2d, 0x2a, 0x98, 0x27, 0x75, 0xe7, 0x28, 0x5a, 0x62, 0x40, 0xec, 0x27, 0x75, 0x98, 0x52, 0x3a, 0xe8, 0xff, 0x9e, 0xc6, 0xf3, 0xfb, 0x8e, 0xfb, 0xf8, 0x9c, 0x7a, 0x25, 0xba, 0xe9, 0x0b, + 0xed, 0xcb, 0x51, 0x75, 0xdb, 0x32, 0x86, 0x86, 0x45, 0x3a, 0x49, 0x53, 0x31, 0x49, 0x7c, 0x63, 0x59, 0x9b, 0x6a, 0x4e, 0xa5, 0xa1, 0x4e, 0xdb, 0xeb, 0x69, 0xb0, 0x55, 0x4d, 0x56, 0x88, 0x96, + 0x73, 0x64, 0xa3, 0x57, 0x90, 0x16, 0x3a, 0x33, 0x62, 0xd2, 0x85, 0x4c, 0x04, 0xc5, 0xfa, 0x71, 0xe5, 0x4a, 0x5b, 0xbb, 0x5e, 0x4f, 0xdc, 0x7e, 0x22, 0xb2, 0x98, 0xb1, 0x92, 0x59, 0xd0, 0x87, + 0x39, 0x7f, 0x93, 0xe1, 0xab, 0x8e, 0x46, 0xb9, 0x2d, 0x19, 0xca, 0x45, 0x3b, 0xe0, 0xb4, 0xfa, 0xbe, 0x35, 0x7f, 0xdf, 0x56, 0x87, 0x58, 0x7b, 0x2e, 0x47, 0xc4, 0xcd, 0x3c, 0x7f, 0x32, 0x14, + 0xb6, 0x59, 0xb8, 0x63, 0x3f, 0x37, 0x9f, 0x47, 0x29, 0xbc, 0x62, 0x7e, 0xbb, 0xa1, 0x7b, 0x1e, 0x82, 0x8f, 0xbb, 0xb3, 0x13, 0xd5, 0x00, 0xf8, 0x49, 0xa0, 0xe1, 0x02, 0x6b, 0x01, 0xc1, 0xd3, + 0x2a, 0x3a, 0xc1, 0x4b, 0x66, 0x47, 0xcc, 0xa8, 0x82, 0xb5, 0x4a, 0xd7, 0xd4, 0x4c, 0x05, 0x10, 0x0b, 0x01, 0x39, 0xd9, 0xd9, 0xa9, 0x65, 0x92, 0xad, 0xd3, 0xf1, 0x58, 0x86, 0x2f, 0x74, 0x7c, + 0x87, 0xbb, 0x30, 0xb7, 0x71, 0x53, 0xaf, 0x5d, 0x18, 0xae, 0xca, 0x1f, 0x0c, 0x6a, 0x02, 0x20, 0x8b, 0x03, 0x67, 0xf0, 0xfe, 0x2a, 0xa3, 0x83, 0x49, 0x07, 0x0c, 0x51, 0x50, 0x5f, 0xbf, 0xf5, + 0xea, 0x4b, 0x70, 0x31, 0x6c, 0xfd, 0xa0, 0x8f, 0x7c, 0x85, 0x91, 0xfa, 0xfe, 0x82, 0x4f, 0x8c, 0xee, 0x9a, 0x87, 0x24, 0xd5, 0x86, 0xc6, 0x0b, 0x98, 0x9d, 0x68, 0xe1, 0x42, 0x3a, 0x08, 0x00, + 0x5c, 0x46, 0xcd, 0xa9, 0xef, 0xb8, 0xc9, 0x29, 0xe0, 0xd7, 0x41, 0x3d, 0xc0, 0x52, 0x73, 0x29, 0x42, 0xfc, 0x54, 0xa0, 0x83, 0x5f, 0xb1, 0xbf, 0x5d, 0x4b, 0x1f, 0x8f, 0xaf, 0x17, 0xe3, 0x0b, + 0x99, 0xdf, 0xc7, 0x1c, 0x95, 0xa1, 0xd0, 0x95, 0x3d, 0x0c, 0x06, 0xc2, 0xde, 0x36, 0x18, 0x62, 0x92, 0xac, 0x4f, 0x18, 0xde, 0x70, 0x2c, 0x3b, 0x5b, 0x6f, 0x09, 0x54, 0xef, 0x7b, 0x98, 0x6b, + 0xe1, 0x04, 0x8f, 0x67, 0xa6, 0xde, 0x32, 0x0d, 0x75, 0x1c, 0x75, 0x3c, 0x8d, 0x39, 0xc6, 0xa4, 0xd4, 0xd6, 0xa4, 0xa2, 0x2f, 0xf6, 0x8a, 0xae, 0xc1, 0xfa, 0xc4, 0x27, 0xc0, 0xb9, 0xbd, 0xc3, + 0x74, 0x2c, 0x5b, 0x2c, 0x04, 0xee, 0x35, 0x8e, 0xfb, 0xbf, 0x2c, 0xd3, 0x72, 0x13, 0xe0, 0x9c, 0xf9, 0xcb, 0x2b, 0xaf, 0xf1, 0x2a, 0xc4, 0xdb, 0xde, 0x0a, 0xdd, 0x2d, 0xb4, 0xff, 0xba, 0xf6, + 0xf5, 0xf2, 0xa7, 0xbc, 0xf0, 0x7d, 0xdf, 0x2a, 0x81, 0x5e, 0xc3, 0x8c, 0xfe, 0x1b, 0xff, 0x07, 0xfa, 0x9a, 0x31, 0xe9, 0x23, 0x9d, 0xe7, 0xb7, 0x74, 0x29, 0xf7, 0xfe, 0x4d, 0x97, 0x7c, 0x40, + 0x77, 0xbc, 0xc8, 0x7d, 0x2a, 0xef, 0xbb, 0x17, 0xde, 0xe8, 0x10, 0x1f, 0xb8, 0x93, 0xde, 0x48, 0x5a, 0x6f, 0x4c, 0x1d, 0x72, 0x33, 0x89, 0x3f, 0xcb, 0x52, 0x57, 0x76, 0x5e, 0xbc, 0xe7, 0x20, + 0xfd, 0xc2, 0x27, 0x5d, 0x7f, 0x71, 0xab, 0x8b, 0xfb, 0xe2, 0x59, 0xf4, 0x73, 0x69, 0xeb, 0xbb, 0x1f, 0x16, 0xa5, 0xfb, 0x9e, 0xef, 0x08, 0xf9, 0xfa, 0x9a, 0x43, 0xe3, 0x96, 0xa7, 0xeb, 0x16, + 0xf6, 0xad, 0x78, 0xf6, 0x57, 0x55, 0xe0, 0xcd, 0xc3, 0xb3, 0x43, 0xad, 0x9b, 0xd5, 0xe5, 0xe9, 0x92, 0x99, 0xe6, 0x0a, 0x3e, 0xf8, 0x98, 0xa7, 0x3f, 0xd7, 0xb3, 0x71, 0xc6, 0x56, 0x62, 0xda, + 0xf1, 0xb8, 0x7e, 0xff, 0x9c, 0x6f, 0x7b, 0xea, 0x97, 0x08, 0xea, 0xff, 0xfe, 0x9a, 0x89, 0xf4, 0xfc, 0x03, 0xf3, 0x9d, 0x29, 0x47, 0xee, 0x2c, 0xd7, 0x6f, 0x13, 0xfe, 0x5d, 0xa1, 0x76, 0x19, + 0x2e, 0xfc, 0xee, 0x59, 0x7a, 0x8e, 0xbf, 0xf1, 0x4a, 0xb7, 0x7a, 0x52, 0x0a, 0x2c, 0x4c, 0x9b, 0x32, 0x6d, 0xca, 0xc0, 0xbc, 0xfe, 0x00, 0x7c, 0x70, 0x2a, 0xbc, 0x87, 0x66, 0x7f, 0x9f, 0x4a, + 0x51, 0x35, 0x3e, 0x99, 0xe9, 0x47, 0x01, 0xdc, 0x2f, 0x38, 0x3f, 0x2c, 0x7e, 0x3b, 0xee, 0xc2, 0x3a, 0xc8, 0x9b, 0x4b, 0x69, 0xdc, 0xf7, 0x62, 0xb8, 0xdf, 0x30, 0x49, 0xdc, 0x36, 0x7b, 0x3c, + 0xe5, 0x93, 0xdc, 0x79, 0xff, 0x56, 0xf4, 0x1f, 0x88, 0xf8, 0x07, 0xbe, 0x7b, 0xfa, 0x48, 0x85, 0x76, 0xf3, 0x38, 0x33, 0xeb, 0xa6, 0x34, 0x93, 0xb1, 0x9d, 0xa7, 0x6f, 0x80, 0x3f, 0x9e, 0x01, + 0xd7, 0xa0, 0x99, 0xfa, 0x9a, 0x6e, 0x00, 0xfc, 0x87, 0xba, 0xff, 0x82, 0x6f, 0xa5, 0x33, 0xee, 0xfe, 0xfb, 0xb2, 0xc1, 0xbe, 0xe7, 0xac, 0xf9, 0xea, 0x18, 0xe7, 0xa6, 0xad, 0xfb, 0x9e, 0xc5, + 0xe0, 0x8b, 0x24, 0xf8, 0x30, 0xd1, 0xdf, 0xb7, 0xe7, 0x67, 0x4c, 0xed, 0x3c, 0xfd, 0xf4, 0xda, 0xf8, 0xf6, 0x92, 0xfa, 0xe3, 0x88, 0xc7, 0xbf, 0xf6, 0xbf, 0x76, 0x8f, 0xf5, 0xf8, 0xf3, 0x39, + 0xf8, 0xd5, 0x31, 0xbd, 0x25, 0xcf, 0xd0, 0xbc, 0xcd, 0xf2, 0xcf, 0xf9, 0x7d, 0xa9, 0x0e, 0x72, 0xfd, 0xd1, 0x10, 0x41, 0xe1, 0x7f, 0xf3, 0xed, 0x5e, 0xde, 0xfc, 0xe5, 0x64, 0xfc, 0xeb, 0x0b, + 0x57, 0x3f, 0xa4, 0x6c, 0x01, 0xf4, 0x12, 0x42, 0xdf, 0xcb, 0x16, 0x40, 0xc3, 0x70, 0x71, 0x72, 0xa6, 0x73, 0xda, 0x14, 0xdd, 0x4c, 0xdd, 0x15, 0xba, 0x42, 0x64, 0x49, 0x80, 0x8d, 0x29, 0x4c, + 0xeb, 0x2a, 0x6d, 0x1e, 0xbb, 0xf5, 0x44, 0x9e, 0x1e, 0x8c, 0x94, 0x8f, 0xea, 0x39, 0x69, 0x62, 0xd0, 0x12, 0x96, 0x2d, 0xf0, 0x58, 0x68, 0x49, 0x3e, 0x97, 0xb3, 0xa9, 0x38, 0xeb, 0x0e, 0x51, + 0xd1, 0x65, 0x93, 0xdc, 0xcc, 0xd1, 0xc2, 0x4d, 0x04, 0x32, 0x41, 0xe4, 0xa5, 0xd3, 0x22, 0xbe, 0xfc, 0xad, 0x6c, 0xc1, 0xf7, 0xc3, 0xf2, 0xda, 0xb9, 0x67, 0xd2, 0xd5, 0xff, 0x56, 0x33, 0xb8, + 0xaf, 0x66, 0xf0, 0x27, 0xb3, 0xec, 0x7f, 0x33, 0x81, 0x5e, 0xde, 0xfc, 0xc7, 0x93, 0xee, 0x0f, 0x32, 0x81, 0xfe, 0xba, 0x4b, 0x3f, 0xc3, 0xfd, 0x6b, 0x1e, 0x96, 0x3f, 0xc5, 0xfd, 0xee, 0x3d, + 0x1f, 0x03, 0x70, 0xd7, 0xfa, 0xa0, 0x84, 0xe9, 0x5f, 0xcf, 0x46, 0x02, 0xf7, 0x36, 0xf6, 0x48, 0x46, 0xc3, 0xa0, 0x3b, 0x6c, 0x70, 0x01, 0x30, 0xb9, 0x16, 0xf6, 0x20, 0x9f, 0x67, 0xc9, 0x44, + 0xd4, 0xea, 0x9d, 0xc4, 0xe6, 0x87, 0x29, 0x7a, 0x5a, 0xe1, 0xb9, 0x32, 0xd3, 0xb4, 0xdc, 0x6e, 0xd2, 0x49, 0xe5, 0x4d, 0x0f, 0x51, 0xbc, 0xcf, 0x0e, 0xa1, 0xce, 0x07, 0x29, 0xdf, 0x29, 0x40, + 0xca, 0xb0, 0xeb, 0x82, 0xd0, 0xdc, 0x20, 0xa9, 0x91, 0x43, 0x82, 0x27, 0x4c, 0x38, 0x68, 0x5b, 0xfc, 0x3f, 0xb7, 0x7f, 0xef, 0x45, 0x88, 0xf1, 0x25, 0x12, 0x6c, 0x7c, 0xae, 0x69, 0x15, 0xfe, + 0xcb, 0x31, 0x96, 0x8f, 0x5f, 0xf1, 0x29, 0x61, 0x7c, 0x79, 0x30, 0x34, 0xfa, 0x92, 0xf6, 0x8d, 0x66, 0xad, 0x2a, 0xee, 0xaa, 0x6f, 0x93, 0x35, 0xa0, 0xa9, 0xd1, 0x11, 0xd0, 0x2d, 0x82, 0x24, + 0x34, 0x09, 0xc6, 0x65, 0x15, 0xf1, 0x17, 0xd1, 0x04, 0x09, 0xc3, 0x79, 0xeb, 0x54, 0x05, 0x00, 0x5b, 0xbc, 0xa7, 0x71, 0x3b, 0x55, 0xdb, 0x10, 0x75, 0x74, 0xac, 0x23, 0x05, 0x74, 0x47, 0xec, + 0x06, 0x05, 0x29, 0x7b, 0x93, 0x6c, 0x5a, 0x21, 0x96, 0x92, 0xbc, 0x27, 0xa7, 0x14, 0xe4, 0xfe, 0x89, 0x51, 0xf1, 0x21, 0x90, 0x45, 0xd2, 0xf8, 0x61, 0xf6, 0x1b, 0x90, 0xc8, 0x4b, 0x21, 0xd0, + 0x8f, 0x5f, 0xf1, 0x09, 0xe4, 0x97, 0x07, 0xe7, 0x04, 0x4a, 0x03, 0x80, 0x54, 0x67, 0x2b, 0xbc, 0x5c, 0x6e, 0x71, 0x4e, 0x50, 0x3c, 0x5b, 0xcc, 0x31, 0x14, 0x8b, 0x42, 0x53, 0xec, 0x68, 0x02, + 0x84, 0x9a, 0x09, 0x57, 0xc3, 0x80, 0x23, 0x13, 0xbb, 0x6c, 0x2e, 0xe5, 0x8b, 0xa9, 0x96, 0x40, 0x00, 0xc3, 0x1f, 0x9c, 0x89, 0x40, 0xa7, 0x9d, 0x6a, 0x1e, 0x0e, 0x12, 0x8a, 0x99, 0xfb, 0xa2, + 0xac, 0xb6, 0x8b, 0x5e, 0x31, 0x11, 0x6a, 0xcd, 0x41, 0x9b, 0x53, 0x23, 0xd3, 0xc7, 0xe3, 0x9f, 0x00, 0xf9, 0xb9, 0xb2, 0x3f, 0x3e, 0x3d, 0x39, 0xeb, 0xc1, 0xc7, 0x81, 0x9b, 0x14, 0x6e, 0xf9, + 0xa9, 0x2a, 0x7f, 0x66, 0x7d, 0xba, 0x97, 0x7a, 0x1e, 0x21, 0x8e, 0xbd, 0xa8, 0x09, 0xf9, 0x24, 0xfc, 0x89, 0xf3, 0xf9, 0x76, 0x8c, 0x0d, 0xd3, 0x85, 0xc0, 0xc2, 0xb1, 0xb3, 0xe6, 0x40, 0x60, + 0x80, 0xab, 0xc2, 0x2d, 0x74, 0x01, 0xb4, 0x05, 0x2b, 0x1f, 0xcd, 0x05, 0x7c, 0x9f, 0xaf, 0x88, 0x85, 0xc9, 0x26, 0x52, 0xe0, 0x1f, 0x81, 0x80, 0x33, 0x12, 0x5c, 0x33, 0x41, 0x6b, 0x8e, 0x62, + 0xb2, 0x24, 0x8a, 0x5d, 0xb0, 0xe6, 0x4e, 0x64, 0x22, 0xcd, 0xac, 0x66, 0x1a, 0x9a, 0x8e, 0xb2, 0x9e, 0xd2, 0x19, 0x0b, 0x4f, 0xe7, 0xfa, 0xa1, 0x09, 0x6b, 0xcc, 0x7a, 0x0d, 0x5d, 0xb7, 0x2a, + 0x5d, 0xbb, 0x29, 0xab, 0x77, 0x41, 0x06, 0xf9, 0x2a, 0x95, 0xd5, 0xa5, 0xf9, 0x06, 0xd9, 0xfb, 0xf3, 0x1f, 0xec, 0x54, 0x77, 0x32, 0xe4, 0x33, 0xcd, 0xd3, 0xcb, 0x33, 0xfc, 0x4c, 0xf8, 0x13, + 0xef, 0xf3, 0xed, 0xd0, 0x2a, 0x2f, 0x1d, 0x85, 0x3a, 0x92, 0x9e, 0x9b, 0xcd, 0xa9, 0x4d, 0x66, 0x36, 0x8a, 0xec, 0xb3, 0x05, 0x4d, 0x26, 0x2a, 0x62, 0xd4, 0x04, 0x84, 0xb4, 0xc2, 0x34, 0xf0, + 0x6b, 0x94, 0xd9, 0x75, 0xc1, 0x7e, 0xb2, 0x81, 0xf7, 0x31, 0xdd, 0x66, 0x8e, 0x77, 0x9c, 0x83, 0x13, 0x9f, 0x3b, 0xac, 0x44, 0xd1, 0xac, 0xa2, 0x0d, 0xb7, 0xe9, 0x23, 0x6a, 0x79, 0xf0, 0xbb, + 0xb8, 0xb3, 0xa6, 0xfa, 0x0c, 0x04, 0x34, 0xc4, 0x78, 0x4d, 0x0f, 0xf1, 0x4c, 0x90, 0x86, 0xfe, 0xb4, 0xb8, 0xc6, 0x63, 0x42, 0xcf, 0x15, 0xd4, 0xc8, 0x8b, 0x8c, 0xc6, 0x83, 0xf7, 0x7c, 0x8e, + 0xc2, 0x6d, 0xeb, 0x83, 0x80, 0xf0, 0xbf, 0x9e, 0x0d, 0x08, 0xbe, 0x24, 0x60, 0x81, 0x54, 0x05, 0x13, 0xc5, 0xe1, 0xce, 0x04, 0x56, 0x73, 0x71, 0x56, 0x03, 0x9b, 0x25, 0xc2, 0xa9, 0x38, 0xa8, + 0xcc, 0x8a, 0x29, 0x22, 0xed, 0xa7, 0x10, 0x1b, 0xd9, 0x10, 0xbd, 0xdf, 0x17, 0xde, 0x1a, 0x9e, 0x52, 0x32, 0x36, 0x9a, 0xa8, 0x44, 0x14, 0xb8, 0xe0, 0x1c, 0x5f, 0xc8, 0xcc, 0x41, 0xe3, 0x03, + 0x74, 0xd9, 0x34, 0x23, 0x41, 0x27, 0x8e, 0xd9, 0x08, 0x77, 0xc2, 0x42, 0xfd, 0x81, 0xdf, 0xfd, 0x68, 0xfd, 0xf1, 0xc0, 0x7b, 0x82, 0xe5, 0xbf, 0x36, 0x85, 0x07, 0x60, 0x38, 0x70, 0x42, 0x83, + 0xa5, 0x92, 0xca, 0x74, 0xbf, 0xf7, 0x67, 0x3d, 0x57, 0xcd, 0xf0, 0x74, 0xe1, 0x2c, 0x7d, 0xb7, 0xed, 0x7d, 0xb7, 0xe7, 0x30, 0x04, 0x9d, 0xba, 0x25, 0xb6, 0x06, 0xda, 0x13, 0xbf, 0x07, 0x63, + 0xb6, 0xdf, 0x02, 0x51, 0x48, 0xa3, 0x48, 0x24, 0x07, 0x0e, 0xa5, 0xab, 0x09, 0xbf, 0xd0, 0xd7, 0xd2, 0x09, 0xee, 0x8b, 0x52, 0x48, 0xf3, 0x2d, 0x79, 0x30, 0xab, 0xe9, 0xa2, 0xd6, 0x47, 0x92, + 0xb9, 0x1a, 0x92, 0xb5, 0xeb, 0x43, 0xbd, 0xf3, 0x58, 0xbb, 0xf8, 0x4a, 0xfe, 0xc8, 0x0b, 0xc9, 0x33, 0x1e, 0x6f, 0x17, 0x63, 0x62, 0x58, 0xe6, 0xc8, 0x16, 0x59, 0x4e, 0x85, 0x29, 0x83, 0xa3, + 0x4d, 0x1a, 0xcf, 0x8b, 0x34, 0x9e, 0x2f, 0x0e, 0xbd, 0xb6, 0xaa, 0xc4, 0x2d, 0x58, 0x0b, 0x90, 0x51, 0x8e, 0x1a, 0xf7, 0xb0, 0x36, 0xbc, 0x42, 0x83, 0x44, 0x8b, 0x74, 0x47, 0x53, 0xc6, 0xdf, + 0xec, 0xcc, 0x91, 0x78, 0x9c, 0xe6, 0x0b, 0x16, 0xa9, 0xb3, 0x20, 0x4c, 0xf9, 0x15, 0x67, 0xd2, 0x29, 0x9a, 0x02, 0xad, 0x29, 0x17, 0x4b, 0x20, 0x2e, 0xe5, 0x1e, 0x7e, 0x6d, 0x4d, 0x9b, 0x76, + 0x5e, 0xbe, 0xab, 0xf4, 0xbe, 0xe8, 0x34, 0xce, 0x8f, 0xc6, 0x51, 0xf5, 0xce, 0xcb, 0x7e, 0xd3, 0x88, 0x3d, 0xdb, 0x0d, 0x90, 0xff, 0xdd, 0x0d, 0xfe, 0xff, 0xdb, 0x0d, 0x8a, 0x32, 0x4c, 0xcd, + 0x27, 0x93, 0x1c, 0x7d, 0xc9, 0xe5, 0xf5, 0x4a, 0xf3, 0x3a, 0xcb, 0xc3, 0xd4, 0x3c, 0x7b, 0xfe, 0x0e, 0x98, 0xe6, 0xee, 0xa2, 0x99, 0xcf, 0x3b, 0x42, 0x2d, 0x1c, 0x73, 0xe4, 0xa3, 0xc5, 0x48, + 0x62, 0xdb, 0x6c, 0x07, 0xca, 0xa7, 0xed, 0x1e, 0x50, 0x34, 0x77, 0x49, 0xcf, 0x78, 0xc0, 0x9f, 0xd6, 0xfc, 0x44, 0x16, 0x41, 0x7b, 0xdd, 0x6c, 0x61, 0xd6, 0x66, 0x56, 0xd9, 0x76, 0xd3, 0x06, + 0x91, 0x86, 0x9b, 0x0b, 0xf7, 0x50, 0x4e, 0x69, 0xa0, 0xb2, 0x84, 0xbc, 0x00, 0x57, 0x55, 0x9f, 0x82, 0x51, 0x65, 0xee, 0x54, 0x74, 0x90, 0x2f, 0xd4, 0x87, 0xb2, 0xf6, 0xb1, 0xa5, 0xe4, 0x35, + 0x66, 0xf5, 0x4c, 0xf3, 0x8c, 0xc2, 0xf9, 0x6a, 0x68, 0xc6, 0x1e, 0x7b, 0x3a, 0x0b, 0xab, 0x62, 0x57, 0x63, 0x2d, 0xcb, 0xd6, 0x1d, 0xaf, 0xc3, 0x7a, 0x39, 0x91, 0xd0, 0xd0, 0x9a, 0xc7, 0x93, + 0x35, 0x29, 0x5b, 0x2c, 0xa6, 0x2f, 0xe8, 0xcc, 0xa0, 0x6d, 0x0a, 0xe4, 0xf3, 0xa4, 0x6d, 0xbd, 0x38, 0x96, 0xec, 0x65, 0x99, 0x03, 0xa6, 0x11, 0x4e, 0x24, 0x35, 0x91, 0x90, 0x83, 0x5f, 0xea, + 0x0a, 0x3e, 0xc3, 0x5b, 0x72, 0x61, 0x63, 0x0b, 0x6c, 0x2a, 0x55, 0x36, 0xf5, 0x2a, 0xc3, 0x74, 0xc7, 0x11, 0x61, 0x7f, 0x7e, 0x6e, 0xdf, 0xfc, 0xff, 0x73, 0x25, 0xdd, 0xab, 0xe6, 0xe4, 0x4f, + 0xf2, 0x67, 0x94, 0xdf, 0x6f, 0xfe, 0x24, 0x23, 0x39, 0x7d, 0xb4, 0x84, 0xc5, 0x42, 0x48, 0x41, 0xf9, 0x24, 0xeb, 0xad, 0xea, 0xb0, 0x05, 0xd7, 0xb5, 0x14, 0xb7, 0xeb, 0x5d, 0x9e, 0xda, 0x4f, + 0x13, 0x4b, 0x3c, 0x76, 0xf9, 0x64, 0xdb, 0xcc, 0x1d, 0x91, 0x21, 0x0c, 0x06, 0xef, 0xd8, 0xf5, 0x88, 0x95, 0xb0, 0x2d, 0x19, 0xe4, 0x1b, 0x7e, 0xd4, 0xb3, 0x6d, 0xba, 0xea, 0xfb, 0x8a, 0x39, + 0x04, 0xfe, 0x09, 0x5c, 0x94, 0x12, 0xb6, 0x87, 0x10, 0xd3, 0x0b, 0xff, 0x27, 0xcb, 0xf1, 0x93, 0x43, 0x7d, 0xbc, 0x20, 0x5f, 0x13, 0x40, 0xaf, 0x54, 0xcf, 0x30, 0x5d, 0xaf, 0xcf, 0x2a, 0xbb, + 0x01, 0xd3, 0x71, 0x95, 0x7a, 0xab, 0x35, 0x62, 0xe1, 0x8b, 0x91, 0xbc, 0x6f, 0x37, 0xa4, 0x00, 0xb5, 0x25, 0xb2, 0x3d, 0x40, 0xf1, 0x1a, 0xc8, 0xa7, 0x73, 0x3f, 0x83, 0x05, 0x7d, 0xcf, 0xd4, + 0x87, 0x0d, 0x09, 0xac, 0x91, 0x62, 0x65, 0x16, 0xea, 0x04, 0x5d, 0x90, 0xf6, 0x5c, 0x33, 0xf3, 0x39, 0xa2, 0xa8, 0x08, 0x8c, 0x4c, 0x67, 0xe8, 0xfe, 0x54, 0xc8, 0x80, 0xe7, 0x85, 0x39, 0x9b, + 0xc6, 0x75, 0x88, 0x03, 0x5b, 0xf3, 0xb5, 0xb3, 0xe7, 0xdb, 0x74, 0x84, 0xff, 0x77, 0x3a, 0xfe, 0x5f, 0x9e, 0x8e, 0x0f, 0x00, 0xfb, 0x37, 0xe6, 0xe3, 0x63, 0xa0, 0x06, 0xce, 0x48, 0x84, 0xca, + 0xb2, 0x95, 0xe7, 0xed, 0x7a, 0xf2, 0x28, 0x40, 0xb4, 0x0a, 0xc0, 0x36, 0x41, 0x65, 0x54, 0x46, 0x53, 0xec, 0xac, 0xcf, 0xc1, 0x2c, 0xd4, 0xd5, 0xc3, 0x11, 0x3f, 0x9e, 0x0e, 0x6a, 0x76, 0xca, + 0x27, 0x99, 0x74, 0x3a, 0xed, 0x0a, 0x71, 0xeb, 0x18, 0x8c, 0x1b, 0x4e, 0xed, 0x80, 0xa4, 0xe9, 0x06, 0x83, 0xb0, 0x1a, 0xed, 0x0a, 0xca, 0x48, 0x7d, 0xcd, 0xd3, 0x82, 0x8c, 0x62, 0xe8, 0x62, + 0x18, 0x43, 0xf8, 0xb3, 0xc4, 0xf7, 0x92, 0x03, 0x71, 0xf5, 0x29, 0xec, 0xbd, 0xcb, 0x79, 0x83, 0x1c, 0x87, 0x63, 0xad, 0xb2, 0x0f, 0xfb, 0x18, 0x15, 0xa7, 0x05, 0x4e, 0x2a, 0x06, 0xe8, 0xc4, + 0x3e, 0xb3, 0xd2, 0x42, 0x1c, 0x20, 0xc3, 0x08, 0x01, 0xc1, 0x15, 0xbd, 0xdb, 0x2e, 0x0f, 0x08, 0xbc, 0x01, 0x1c, 0xdd, 0xdd, 0x6d, 0x95, 0x6e, 0x85, 0x42, 0xbb, 0xd3, 0xf6, 0x68, 0x26, 0x02, + 0xe4, 0xca, 0xe9, 0x04, 0x33, 0x28, 0x55, 0x05, 0xd6, 0x7b, 0x6a, 0x46, 0xcc, 0x77, 0x4a, 0xaa, 0x51, 0xca, 0x44, 0x3f, 0xe2, 0x43, 0x72, 0x4d, 0xfd, 0x18, 0xf3, 0xfa, 0x5a, 0xf9, 0x9b, 0x8f, + 0x70, 0xd7, 0x6b, 0xa4, 0xeb, 0xc0, 0xf2, 0x37, 0x5e, 0x74, 0x68, 0xa6, 0x18, 0x65, 0xcf, 0x88, 0xe9, 0x69, 0x87, 0x37, 0xa5, 0xb0, 0x5f, 0x81, 0x73, 0xba, 0xf1, 0x62, 0xc3, 0xce, 0xc3, 0xc5, + 0x82, 0x04, 0xbb, 0x6d, 0xb3, 0x69, 0xa2, 0x3d, 0x46, 0x81, 0x36, 0x8d, 0x6d, 0xeb, 0x24, 0x83, 0x41, 0x06, 0x56, 0x69, 0x54, 0x01, 0x76, 0x13, 0x59, 0x3b, 0x04, 0x7b, 0xcf, 0x33, 0x12, 0x78, + 0x2d, 0xf8, 0xca, 0xc8, 0x97, 0x9c, 0x0d, 0xc7, 0x85, 0x29, 0x30, 0x04, 0x02, 0xcf, 0x34, 0xab, 0x71, 0x54, 0x8d, 0xcb, 0x26, 0xab, 0xc3, 0xa7, 0x49, 0x1e, 0xc1, 0x7f, 0xa8, 0x17, 0x16, 0xc7, + 0x17, 0xda, 0xc0, 0xf8, 0x6b, 0xcb, 0xf8, 0x4c, 0xf7, 0x77, 0x74, 0x80, 0xf9, 0xa4, 0x8b, 0x80, 0x62, 0xb9, 0xc3, 0x3b, 0x6a, 0x4f, 0xba, 0xd5, 0x74, 0x44, 0x43, 0x59, 0x1e, 0x85, 0x9c, 0x00, + 0x89, 0x2e, 0x0b, 0xca, 0xab, 0x69, 0xde, 0x1f, 0x01, 0xef, 0x60, 0x45, 0x36, 0xac, 0xf8, 0x71, 0x5a, 0xad, 0x20, 0xd0, 0x9e, 0x13, 0x14, 0x5b, 0x17, 0xac, 0x9b, 0x24, 0xe6, 0xc6, 0x51, 0x2b, + 0x38, 0x5f, 0x92, 0x1b, 0x1a, 0x6d, 0x41, 0x99, 0x85, 0x4d, 0xa5, 0xdb, 0x4e, 0x07, 0x44, 0x00, 0xde, 0x7a, 0x05, 0x7c, 0x71, 0x40, 0xbc, 0x4f, 0xe1, 0xfa, 0xa8, 0x40, 0xe8, 0x4d, 0x92, 0xbb, + 0xbf, 0xff, 0x9b, 0xfc, 0x6a, 0x75, 0x7c, 0x4f, 0x3e, 0xf1, 0xae, 0x42, 0xb8, 0x79, 0xe4, 0x99, 0x55, 0xfd, 0x6e, 0xe9, 0x45, 0xfe, 0x81, 0xc1, 0xaf, 0x56, 0xe2, 0x4f, 0x1b, 0xf2, 0xb7, 0x84, + 0xc2, 0x59, 0xee, 0xb8, 0xe3, 0xbc, 0xba, 0x71, 0x09, 0x80, 0xbe, 0xba, 0x15, 0xe4, 0xad, 0x5b, 0x26, 0xb9, 0xe9, 0x8c, 0x8b, 0x32, 0xaf, 0x5d, 0xfb, 0xc6, 0xf1, 0xf5, 0x8b, 0x71, 0xb3, 0x28, + 0xf3, 0x74, 0x6c, 0x27, 0xe1, 0xbb, 0x9d, 0x1d, 0xfa, 0x66, 0xce, 0x3e, 0x5c, 0x5e, 0x71, 0xf6, 0xa6, 0xf8, 0x23, 0xd7, 0x48, 0xb3, 0xf4, 0x0b, 0xf3, 0xe7, 0xb3, 0x0b, 0xfe, 0x62, 0xe2, 0x1e, + 0x3e, 0xeb, 0xde, 0x89, 0x03, 0xe3, 0x8f, 0xcb, 0x07, 0xe9, 0x58, 0xff, 0x7a, 0x36, 0xd7, 0xc8, 0x11, 0xb5, 0x3b, 0xb8, 0x96, 0x35, 0xef, 0x8b, 0x3d, 0x25, 0xca, 0xa3, 0x9d, 0x89, 0x8b, 0x30, + 0x65, 0x56, 0x5c, 0xee, 0xbb, 0x32, 0xdf, 0xdb, 0x8b, 0x7a, 0xc2, 0x09, 0x4e, 0xc1, 0xb3, 0xec, 0x69, 0xe2, 0x43, 0xa0, 0x07, 0x62, 0xa6, 0x32, 0xd7, 0x68, 0xcb, 0x66, 0x0e, 0x0b, 0x0f, 0xd8, + 0xec, 0x3b, 0x88, 0x89, 0x26, 0xc6, 0xe8, 0x00, 0x03, 0x16, 0x43, 0xfb, 0xc8, 0xac, 0x6d, 0xca, 0x15, 0x22, 0xdd, 0x39, 0xe3, 0x3d, 0x1c, 0xcd, 0x67, 0x40, 0x7c, 0x2f, 0x96, 0x39, 0x14, 0x88, + 0x2b, 0x6d, 0x60, 0xfc, 0x7e, 0x75, 0xae, 0x6e, 0x30, 0xf0, 0xf8, 0xee, 0x8a, 0xa3, 0x51, 0x51, 0x42, 0x7e, 0x34, 0xcc, 0x25, 0xa3, 0x2c, 0x17, 0x9c, 0xb1, 0x3d, 0xcd, 0x18, 0x53, 0x2f, 0x12, + 0x70, 0xbe, 0x52, 0x26, 0xa3, 0x39, 0x4d, 0x99, 0xcb, 0xf0, 0xe4, 0xa6, 0xab, 0x80, 0xef, 0xe2, 0xa3, 0xe4, 0xe3, 0x48, 0x80, 0x6e, 0xa1, 0xd5, 0xd2, 0x57, 0x17, 0x6c, 0xb1, 0x3d, 0x6c, 0x66, + 0x82, 0x6c, 0xa7, 0xa9, 0xbe, 0x6e, 0xfc, 0x52, 0x8e, 0x96, 0x09, 0x5d, 0xef, 0x5a, 0xf9, 0x5b, 0xa9, 0x95, 0x1f, 0xcc, 0x49, 0x9f, 0x53, 0xe4, 0x4b, 0xc6, 0x9b, 0xbf, 0xfe, 0xba, 0x33, 0x26, + 0xfd, 0x9f, 0xdb, 0xbf, 0x9f, 0xbb, 0x5a, 0x55, 0x8f, 0x1d, 0xf7, 0xec, 0x36, 0xd4, 0x94, 0xe1, 0xf8, 0x23, 0x0d, 0xe2, 0x53, 0xb9, 0xe8, 0x15, 0xe9, 0xf0, 0xe9, 0x5b, 0xce, 0x3b, 0xdd, 0x93, + 0x67, 0x43, 0x2a, 0x3b, 0xbf, 0x0d, 0xc0, 0x6e, 0xe5, 0xaf, 0x76, 0x3e, 0xe6, 0xaa, 0xc7, 0x56, 0x36, 0x16, 0xdd, 0x8e, 0x9c, 0xb7, 0x9e, 0x65, 0xb2, 0xc4, 0x64, 0xaf, 0x04, 0xb0, 0xbd, 0x1e, + 0x21, 0x11, 0xe6, 0xf1, 0x8b, 0x5e, 0xe5, 0xa7, 0xc7, 0x1d, 0xbd, 0x44, 0x1c, 0x0d, 0x31, 0x89, 0x5d, 0x4f, 0x9e, 0x60, 0x0f, 0x68, 0x24, 0xd0, 0x45, 0x68, 0x7c, 0x97, 0xe6, 0xce, 0x0c, 0xc9, + 0x15, 0x0c, 0x8d, 0xb6, 0x12, 0xc5, 0x6a, 0x5b, 0x8e, 0xfb, 0x16, 0x27, 0x7f, 0xfd, 0xcc, 0x5f, 0x52, 0x7f, 0x20, 0x2f, 0x05, 0x81, 0x7f, 0xa1, 0xfd, 0x09, 0xca, 0x47, 0x12, 0x10, 0x64, 0x58, + 0x00, 0xb8, 0x87, 0x1c, 0x24, 0x2a, 0x97, 0x4e, 0x54, 0x04, 0x4f, 0x02, 0xda, 0x05, 0x58, 0x4a, 0x9b, 0x52, 0x50, 0xb7, 0x4e, 0x57, 0xf4, 0x74, 0xaa, 0x02, 0xfe, 0x4c, 0xcc, 0x56, 0xc2, 0x44, + 0x5f, 0x60, 0x41, 0xd5, 0x89, 0x04, 0xbd, 0x5e, 0x45, 0x20, 0xc5, 0xda, 0x18, 0xab, 0x0b, 0x3d, 0x65, 0x2f, 0xb8, 0xd1, 0xe8, 0x98, 0x14, 0xb3, 0x29, 0xe7, 0xcf, 0xcc, 0xb0, 0xd6, 0x2a, 0x10, + 0x99, 0x6c, 0x65, 0x12, 0x95, 0x1e, 0x43, 0xf1, 0x3c, 0x6a, 0x18, 0x7a, 0xa9, 0x4c, 0xf6, 0x07, 0xd5, 0x8f, 0xee, 0x87, 0x9e, 0x77, 0xf6, 0x7d, 0x1d, 0x70, 0xee, 0x1d, 0x97, 0x4d, 0xbe, 0xc5, + 0x46, 0x6b, 0x8a, 0xda, 0x27, 0x06, 0x59, 0x77, 0xae, 0x63, 0xca, 0x1e, 0x3e, 0x39, 0xc2, 0x5b, 0x5f, 0xd2, 0x8e, 0xad, 0x6f, 0x88, 0x7a, 0xbe, 0x59, 0x1d, 0x8c, 0xc6, 0x4b, 0x97, 0xa1, 0x05, + 0xd6, 0x6b, 0xb8, 0x76, 0xfd, 0x0d, 0x2d, 0x1a, 0x16, 0x54, 0x68, 0x82, 0xcf, 0x05, 0xc9, 0x61, 0x96, 0x4c, 0x40, 0x57, 0x04, 0x6d, 0xa4, 0xa3, 0x5b, 0xc9, 0x4e, 0xfb, 0x23, 0x3a, 0x84, 0x3d, + 0x3c, 0x7f, 0xe9, 0x8f, 0x01, 0xc4, 0xf0, 0x0b, 0x1e, 0x97, 0x1f, 0x54, 0xdf, 0xb1, 0xb8, 0x86, 0x10, 0xc3, 0xbf, 0xf9, 0x56, 0x9e, 0x8d, 0x2f, 0xb3, 0x7a, 0x6e, 0xfb, 0x5b, 0x9c, 0xec, 0xc2, + 0xed, 0x36, 0xec, 0x0c, 0x38, 0x10, 0x9c, 0xa5, 0x67, 0xb3, 0x42, 0xec, 0x52, 0x7b, 0xd1, 0xcb, 0xba, 0x94, 0x96, 0x77, 0xfb, 0x20, 0x75, 0x57, 0x3c, 0x59, 0xce, 0xc1, 0xed, 0xa2, 0x4b, 0xa7, + 0x80, 0x54, 0xe7, 0x88, 0x42, 0xc8, 0xb9, 0xb1, 0x2a, 0x30, 0x3b, 0x4c, 0x0c, 0xeb, 0xd8, 0x8b, 0x58, 0xb8, 0x15, 0xb6, 0x52, 0xb5, 0x1c, 0x31, 0xee, 0xec, 0x35, 0xe1, 0xed, 0xbf, 0xde, 0x8e, + 0xd9, 0x24, 0xb4, 0x00, 0xaf, 0xfa, 0xa7, 0xaa, 0xcd, 0xfa, 0x63, 0x8f, 0xba, 0xe3, 0x10, 0x6e, 0x7f, 0xd5, 0xbd, 0xf3, 0x11, 0x6f, 0x03, 0x7f, 0x17, 0x01, 0xf2, 0xdd, 0x9b, 0xed, 0xcb, 0x91, + 0x7e, 0x4e, 0xae, 0x01, 0xff, 0xfd, 0xa9, 0x5e, 0xbc, 0x7d, 0x16, 0xda, 0x65, 0xfe, 0xe9, 0xbf, 0x85, 0x7e, 0xfd, 0x84, 0x22, 0xb4, 0x6f, 0x1e, 0x5f, 0xca, 0x54, 0x3c, 0xdf, 0x2f, 0x1f, 0xfa, + 0x9f, 0xfd, 0xab, 0x0a, 0xf5, 0xe7, 0xaf, 0x79, 0x9f, 0x11, 0x8f, 0x7d, 0xe0, 0x06, 0xaa, 0xd7, 0x93, 0xc0, 0x01, 0xba, 0xf9, 0x68, 0x1d, 0x53, 0x24, 0x6b, 0xe4, 0xdb, 0x69, 0x9d, 0x68, 0xa5, + 0xc9, 0xd6, 0x5e, 0x80, 0xed, 0xf5, 0x30, 0xe2, 0x22, 0x33, 0xd9, 0xdb, 0x31, 0x51, 0x99, 0x6a, 0xdd, 0x98, 0x99, 0x32, 0x3b, 0xad, 0xf9, 0x63, 0xc6, 0x06, 0xca, 0x9e, 0x99, 0x2d, 0x0f, 0xec, + 0x71, 0x46, 0xa4, 0x95, 0x4c, 0xce, 0xc0, 0x66, 0x9a, 0x1e, 0x92, 0xb8, 0x8b, 0xa6, 0x1a, 0x79, 0x6c, 0x3b, 0xf6, 0x5b, 0xbe, 0xbb, 0xdb, 0xef, 0xfc, 0x0d, 0x24, 0xe2, 0x1f, 0xe8, 0xcf, 0x45, + 0x88, 0x07, 0x2f, 0xf8, 0x02, 0xcf, 0x27, 0x2e, 0x67, 0x57, 0xd8, 0x5f, 0x81, 0x41, 0x83, 0xa8, 0x33, 0x66, 0x9b, 0xd4, 0x8f, 0x00, 0x43, 0x5d, 0xed, 0x03, 0x66, 0x97, 0xb7, 0x8b, 0x8d, 0x1d, + 0x32, 0x00, 0x96, 0xee, 0xea, 0x09, 0x27, 0x49, 0x47, 0x61, 0x04, 0x6b, 0xf4, 0x6c, 0xde, 0x64, 0xc4, 0x4c, 0xde, 0xc6, 0x70, 0x2e, 0x72, 0xb5, 0xd5, 0x50, 0x86, 0x51, 0xe0, 0xf1, 0x21, 0x1a, + 0xb9, 0x06, 0xd0, 0x10, 0xfd, 0xc8, 0xf1, 0x69, 0x9f, 0x27, 0x50, 0xdb, 0x5b, 0xc8, 0x19, 0x3d, 0x80, 0x7f, 0xbe, 0xf1, 0xb7, 0xfd, 0xc6, 0xfe, 0x7e, 0x26, 0xa6, 0x79, 0x9b, 0xb8, 0xf0, 0xfd, + 0xc4, 0x2d, 0x3d, 0xc7, 0xfe, 0xfb, 0x21, 0x57, 0x7a, 0xf5, 0xcb, 0xae, 0xc2, 0x34, 0x4c, 0xcc, 0xf7, 0x6e, 0x5e, 0x1d, 0x6f, 0x9f, 0x4f, 0xed, 0xe4, 0x8d, 0x53, 0xaf, 0x82, 0xda, 0x0d, 0xb3, + 0x1f, 0x44, 0xde, 0x3f, 0x0f, 0x6b, 0xfc, 0x4a, 0xfc, 0x7d, 0x9c, 0x6e, 0x9a, 0xce, 0xbc, 0xe7, 0x2f, 0x61, 0x8e, 0xd0, 0x78, 0xa3, 0x17, 0xb6, 0x91, 0xfb, 0xf8, 0xfc, 0xc0, 0xf3, 0x87, 0x85, + 0x34, 0x0a, 0x64, 0xd2, 0x68, 0x0e, 0x0e, 0xe6, 0xca, 0x03, 0x12, 0x73, 0x9e, 0x5f, 0x59, 0xba, 0xce, 0xf3, 0x58, 0xc3, 0xd7, 0x64, 0xd9, 0x1b, 0xba, 0xef, 0x1d, 0xbb, 0xdc, 0x0d, 0x95, 0x6a, + 0x75, 0x61, 0x34, 0xd5, 0xbd, 0xa9, 0x26, 0x6b, 0xbc, 0x6a, 0x88, 0xea, 0xc6, 0x0d, 0x33, 0x56, 0x58, 0xf9, 0xa7, 0x9a, 0x87, 0xba, 0x0d, 0x07, 0x4c, 0x01, 0x75, 0xba, 0x66, 0x42, 0x0c, 0x67, + 0x2a, 0x1d, 0x76, 0xba, 0xae, 0xe5, 0x40, 0x30, 0xe6, 0x96, 0xec, 0x32, 0xe7, 0x88, 0x82, 0xd7, 0x0e, 0x8b, 0x9c, 0x77, 0x3b, 0x52, 0xe1, 0x0d, 0x58, 0x51, 0x3c, 0x76, 0xc5, 0xaa, 0x6b, 0x76, + 0x3f, 0xab, 0x1e, 0xf3, 0x30, 0x95, 0xe9, 0x0d, 0xdb, 0xb5, 0x5e, 0x64, 0xf3, 0xee, 0xe9, 0xbf, 0xc3, 0x71, 0xdf, 0x3a, 0x34, 0xa6, 0x62, 0x37, 0x5a, 0x2d, 0x6d, 0xd8, 0x49, 0xb9, 0x75, 0xb2, + 0x29, 0x92, 0x19, 0xc0, 0xa2, 0x2b, 0x2a, 0xa1, 0xd6, 0xf6, 0x84, 0x9d, 0x78, 0x9b, 0x7a, 0x83, 0xd3, 0x3a, 0x89, 0x36, 0xda, 0x7a, 0x2f, 0xe1, 0x4c, 0x6b, 0xf7, 0xd4, 0xda, 0xf6, 0x11, 0x44, + 0x87, 0x7b, 0x88, 0xd3, 0xac, 0x64, 0x8b, 0x1f, 0x1d, 0x1d, 0x43, 0x37, 0x7b, 0x5d, 0x63, 0x99, 0x76, 0x04, 0xee, 0x8a, 0x03, 0xc9, 0xe5, 0x78, 0x1f, 0x7f, 0xcb, 0xc8, 0xfb, 0x29, 0x46, 0x3e, + 0x39, 0xc1, 0x5f, 0xc9, 0x41, 0x7c, 0x25, 0x7a, 0xed, 0xff, 0x5b, 0x9f, 0x2f, 0x84, 0x7e, 0xef, 0xb4, 0xb1, 0x06, 0x35, 0xbc, 0x41, 0x08, 0x07, 0xc7, 0xea, 0x89, 0x4e, 0x26, 0x7c, 0xa7, 0xf1, + 0xf3, 0x7a, 0xde, 0x66, 0x8c, 0xbb, 0xb4, 0x17, 0x24, 0x28, 0xd1, 0x82, 0xe2, 0x4c, 0x83, 0xc3, 0x34, 0x45, 0x43, 0xf4, 0x38, 0x0a, 0x2b, 0x00, 0x21, 0x45, 0x15, 0x42, 0xfd, 0x7e, 0xd9, 0xc8, + 0xfb, 0xa0, 0x70, 0xb3, 0xed, 0x7a, 0x54, 0x6c, 0x97, 0xbd, 0x60, 0x37, 0xd8, 0x2a, 0x83, 0xf2, 0xa6, 0xe7, 0x91, 0x01, 0x7b, 0xd0, 0x7f, 0xbd, 0x7f, 0xb2, 0x19, 0xb5, 0xef, 0xde, 0xba, 0x9f, + 0xc1, 0x8f, 0xf7, 0x56, 0xbf, 0xf7, 0x48, 0xda, 0x24, 0xf7, 0xfd, 0xa7, 0xb9, 0xa2, 0xcd, 0xb6, 0x0d, 0x2f, 0x71, 0x98, 0xc4, 0x57, 0xa5, 0xc0, 0xe3, 0xa3, 0xe1, 0x8d, 0x06, 0xf6, 0xfd, 0x87, + 0x6f, 0xe0, 0xb9, 0x65, 0xf9, 0xe1, 0x36, 0x8d, 0x3c, 0xd4, 0x02, 0x8c, 0x3b, 0xb3, 0xcc, 0xde, 0xbf, 0xe5, 0x9b, 0x03, 0xb2, 0x17, 0x66, 0xce, 0x38, 0x7d, 0xfb, 0xd1, 0xfb, 0x3e, 0xf8, 0x55, + 0x97, 0x90, 0x98, 0x75, 0x55, 0x7f, 0xf6, 0x17, 0xba, 0xfb, 0x8c, 0x24, 0xf4, 0x83, 0xfa, 0xed, 0xff, 0xcb, 0x8f, 0x62, 0xbd, 0x97, 0xcd, 0xf8, 0x5e, 0x11, 0x10, 0x66, 0xf9, 0xfb, 0x36, 0x8e, + 0x7c, 0xd3, 0x11, 0x1c, 0x4f, 0x63, 0xd3, 0x71, 0xca, 0x0f, 0xac, 0x88, 0x27, 0xfb, 0xf8, 0x17, 0x3f, 0xf9, 0xca, 0xb5, 0x9b, 0xd2, 0xbd, 0x80, 0x75, 0x2f, 0xe8, 0xdd, 0x6f, 0xf7, 0xb7, 0x1e, + 0xe0, 0xc8, 0x3d, 0x88, 0x75, 0x98, 0x9d, 0xc6, 0x49, 0xd9, 0x5c, 0x9f, 0x3e, 0x75, 0x29, 0xfa, 0x0a, 0xf6, 0x63, 0x05, 0xd7, 0x2b, 0x36, 0xf0, 0x3b, 0xca, 0x37, 0x6b, 0xe2, 0x7c, 0x3f, 0x06, + 0x87, 0x59, 0xc4, 0xf3, 0xa9, 0x57, 0xd8, 0xd5, 0x2c, 0x73, 0xfc, 0x6c, 0xa6, 0xf9, 0x21, 0x47, 0x58, 0xdd, 0x7c, 0x35, 0x69, 0x32, 0xd8, 0x11, 0x47, 0x68, 0x40, 0xa2, 0x2d, 0x9d, 0xc4, 0xbb, + 0x6a, 0x97, 0xf5, 0x80, 0xa8, 0xae, 0x28, 0xd9, 0xf5, 0x3c, 0x4c, 0x9d, 0xe7, 0xf3, 0x04, 0x46, 0xa1, 0xe3, 0x36, 0x5c, 0xbb, 0xec, 0x6e, 0x0f, 0xb4, 0x2a, 0xd5, 0xc7, 0x33, 0x6d, 0x7f, 0xd0, + 0xd5, 0x63, 0x24, 0x76, 0xac, 0xfd, 0x50, 0xba, 0xb9, 0x9f, 0x4e, 0x8f, 0x61, 0x78, 0x55, 0xc6, 0xb9, 0xa1, 0x7d, 0x03, 0xc4, 0xb5, 0x65, 0x0c, 0x0e, 0x93, 0x77, 0x2a, 0x88, 0x91, 0xfc, 0x86, + 0xee, 0x00, 0xea, 0x50, 0xdb, 0x50, 0x01, 0xec, 0xb6, 0x3a, 0xea, 0x1e, 0xa8, 0x1d, 0x2f, 0x73, 0x93, 0x69, 0x1c, 0x8d, 0xd8, 0xad, 0x2d, 0x72, 0x2b, 0x28, 0xcc, 0x50, 0x5e, 0xc3, 0xcc, 0xb9, + 0x29, 0x4d, 0x29, 0x63, 0xca, 0xd5, 0xa0, 0xb3, 0x24, 0x8a, 0x12, 0xb3, 0x38, 0x0f, 0x4d, 0x36, 0x05, 0xdb, 0x4e, 0xea, 0x0d, 0x7c, 0xea, 0x8a, 0xad, 0xe0, 0x57, 0x44, 0x70, 0x78, 0xc8, 0xc0, + 0x1d, 0x9e, 0x0a, 0x79, 0xd0, 0xab, 0x8c, 0xed, 0xe1, 0xda, 0xef, 0xc3, 0xf8, 0x42, 0xe4, 0xf7, 0xee, 0x12, 0x8c, 0xdd, 0x57, 0xa4, 0xcf, 0x6d, 0x66, 0xa5, 0xd6, 0x6f, 0x47, 0x4c, 0x5c, 0xe9, + 0xb4, 0xdd, 0x14, 0x07, 0xfe, 0x74, 0x54, 0xd8, 0xfd, 0xbe, 0x64, 0xc5, 0xb5, 0x2c, 0x1f, 0x55, 0x18, 0x98, 0x85, 0xb6, 0x46, 0x12, 0x24, 0xc5, 0xcb, 0xb4, 0x2c, 0x93, 0x23, 0xd6, 0x86, 0x9b, + 0x5d, 0xaf, 0x36, 0x85, 0x58, 0xa1, 0xba, 0x82, 0x2e, 0x7b, 0x3a, 0xa5, 0x8f, 0x51, 0x34, 0xd5, 0xe8, 0xe3, 0x0c, 0x18, 0x50, 0xad, 0xa3, 0x74, 0x9b, 0xea, 0x36, 0x94, 0xe4, 0x49, 0xda, 0x94, + 0x07, 0xd1, 0x3b, 0x8f, 0x20, 0xc3, 0x5f, 0xd3, 0x9d, 0x7c, 0x21, 0xfe, 0x06, 0xde, 0x97, 0xa6, 0xb3, 0x53, 0xf4, 0x80, 0x05, 0x44, 0x2c, 0x8a, 0x0a, 0xd8, 0xef, 0x4e, 0xa9, 0xb5, 0x8e, 0x61, + 0x69, 0xad, 0xaf, 0x50, 0xa1, 0x2f, 0x78, 0xb1, 0xd4, 0x23, 0x3e, 0x70, 0xb8, 0xe3, 0xbe, 0xe1, 0xda, 0x13, 0x2c, 0xd1, 0xd5, 0x9a, 0xc1, 0x93, 0xa8, 0xc9, 0x9d, 0x55, 0xeb, 0xc4, 0xbb, 0x0a, + 0xb0, 0x8b, 0xd3, 0x72, 0x89, 0x4c, 0x35, 0x4e, 0x2b, 0x58, 0x50, 0x0c, 0x21, 0xb6, 0xf5, 0xa1, 0xbc, 0xb5, 0xf8, 0x7e, 0xed, 0xcc, 0x69, 0xfa, 0x35, 0xc9, 0xf0, 0x6d, 0xbb, 0xbd, 0x09, 0x05, + 0xf9, 0x21, 0x27, 0xcd, 0x5d, 0x91, 0xf9, 0x47, 0xb0, 0x12, 0xaf, 0xc2, 0x7a, 0x25, 0x7b, 0x01, 0xf4, 0x7a, 0x73, 0x4e, 0xe1, 0x32, 0x00, 0xca, 0x83, 0x98, 0x53, 0xf3, 0x91, 0xc3, 0xab, 0xe9, + 0x14, 0x5e, 0xdb, 0x16, 0x4a, 0x5b, 0x5a, 0x9b, 0xad, 0x96, 0xc7, 0xed, 0x26, 0x9a, 0xa6, 0x23, 0x59, 0x2e, 0x5c, 0xd4, 0x9f, 0x35, 0x8b, 0xb2, 0x8f, 0xd7, 0x44, 0xca, 0x68, 0x09, 0xe0, 0x44, + 0xba, 0xd2, 0xc0, 0xa2, 0x23, 0xc1, 0x1b, 0x13, 0x01, 0x61, 0x01, 0xcd, 0x0f, 0xb1, 0xe2, 0x53, 0x61, 0x89, 0x47, 0xe6, 0x7a, 0xb7, 0x84, 0x55, 0x45, 0x2b, 0x5e, 0x4b, 0x55, 0x52, 0xe7, 0xd7, + 0x38, 0x95, 0xcf, 0x4a, 0xfc, 0xd8, 0x0f, 0x5c, 0xfe, 0xdd, 0x41, 0xf8, 0xd8, 0xbe, 0xf7, 0x8a, 0xeb, 0xc3, 0x0d, 0xdd, 0x33, 0xa0, 0x1f, 0x77, 0x63, 0x74, 0x98, 0x0b, 0x44, 0x50, 0x64, 0x35, + 0xdb, 0xae, 0xc0, 0x50, 0x64, 0x0b, 0xa4, 0x38, 0xec, 0x64, 0x59, 0x65, 0xfa, 0x30, 0x37, 0x4b, 0xb4, 0x2e, 0x48, 0xb7, 0xa1, 0x67, 0xe4, 0x2c, 0xde, 0x2c, 0x10, 0xcd, 0x6c, 0xc4, 0x32, 0x34, + 0xd6, 0x7e, 0xb7, 0x30, 0xd6, 0x5b, 0xa1, 0xc0, 0x4f, 0x86, 0x52, 0x3a, 0x76, 0xbd, 0x24, 0xe5, 0xe9, 0x4c, 0x21, 0xfa, 0xc0, 0x50, 0x64, 0x58, 0x1b, 0x9d, 0x44, 0x93, 0xb6, 0x84, 0x7c, 0x40, + 0x65, 0x42, 0xef, 0x07, 0x0d, 0xe8, 0x83, 0x00, 0x32, 0xef, 0x9b, 0x1e, 0xf0, 0x12, 0x29, 0x75, 0xa7, 0xab, 0x38, 0x73, 0xbb, 0xe7, 0x41, 0x81, 0x7f, 0x3a, 0xad, 0xc7, 0xef, 0xb5, 0x4e, 0xde, + 0xb9, 0x9a, 0xc7, 0x23, 0x76, 0xbb, 0x54, 0x9e, 0xc9, 0x2c, 0x7f, 0x9e, 0xb1, 0xe7, 0x93, 0xec, 0xdb, 0x78, 0x7d, 0xdc, 0x9c, 0x25, 0x96, 0x01, 0xb9, 0x7a, 0x9c, 0x94, 0xaa, 0xb0, 0x4d, 0x47, + 0x2c, 0x6d, 0x70, 0xd1, 0xf2, 0xba, 0x55, 0x05, 0x02, 0xde, 0xdb, 0xc1, 0x74, 0x42, 0xc9, 0xbe, 0x94, 0xf4, 0x3d, 0x63, 0xec, 0x91, 0xf6, 0x94, 0xc8, 0x14, 0x77, 0x98, 0x7b, 0x0a, 0xb9, 0xb7, + 0x43, 0x2b, 0x51, 0xf7, 0xe2, 0xca, 0xdb, 0xe1, 0x4a, 0xd8, 0x2c, 0x41, 0x17, 0x42, 0xdc, 0x99, 0x6e, 0xe4, 0x86, 0x86, 0x75, 0x4e, 0xe9, 0xb6, 0xc4, 0x06, 0x11, 0xba, 0xd7, 0xf7, 0x92, 0xfa, + 0xd2, 0xdf, 0xef, 0x41, 0x6b, 0x65, 0x98, 0x96, 0xa6, 0xf7, 0xb1, 0xc9, 0x3c, 0x89, 0x2a, 0xff, 0xe4, 0xfe, 0x9e, 0x2a, 0xbd, 0x5f, 0x90, 0x0a, 0x2f, 0x44, 0xaf, 0xf0, 0x56, 0x75, 0x79, 0xd1, + 0x68, 0x0f, 0x10, 0x07, 0xd1, 0x7e, 0x73, 0x9c, 0x9d, 0x82, 0xe9, 0x29, 0x14, 0xe0, 0x8e, 0x9b, 0xd4, 0xca, 0x9a, 0xc3, 0x7d, 0x9b, 0x84, 0x01, 0x26, 0x3a, 0x18, 0x36, 0x94, 0x67, 0x1c, 0xca, + 0xf7, 0x40, 0x02, 0x16, 0xbb, 0x72, 0x92, 0x54, 0x8a, 0xa7, 0xb3, 0x00, 0x6c, 0x70, 0xb6, 0x3a, 0x72, 0x91, 0x7c, 0x02, 0x77, 0xb3, 0xce, 0xea, 0xb9, 0x9d, 0xb0, 0xea, 0x4c, 0x18, 0x99, 0x93, + 0x65, 0x80, 0x8f, 0x66, 0xf2, 0x2e, 0xfe, 0x7e, 0xbc, 0x7f, 0xe0, 0xf6, 0x4c, 0x95, 0xfd, 0xc2, 0xb6, 0x7a, 0xa1, 0x79, 0xed, 0x73, 0xed, 0x3a, 0x0f, 0xc2, 0x44, 0x1e, 0x76, 0xb9, 0x9f, 0xe4, + 0x13, 0x29, 0x6c, 0x9c, 0xd3, 0xa8, 0xc4, 0x94, 0x36, 0x53, 0x3a, 0x64, 0xb5, 0x3c, 0x61, 0x79, 0x05, 0xe4, 0xf2, 0x52, 0x67, 0xfb, 0xb2, 0x8f, 0x4c, 0xa0, 0xa6, 0x67, 0x87, 0xd2, 0xa8, 0x85, + 0x40, 0xed, 0x48, 0xab, 0xc6, 0x4f, 0xa4, 0x48, 0xf7, 0xfc, 0xce, 0x8e, 0x76, 0xe5, 0x88, 0x4c, 0x42, 0x8d, 0x64, 0x2c, 0xfc, 0x24, 0x06, 0x1d, 0xb9, 0x33, 0x08, 0x6d, 0x6e, 0x60, 0x46, 0x3f, + 0xc4, 0x0f, 0xcc, 0xcb, 0xcb, 0xb1, 0x6b, 0xda, 0xcf, 0xf2, 0xdb, 0xbf, 0x2d, 0xcc, 0x17, 0x34, 0xfa, 0x57, 0xa2, 0x6f, 0x38, 0x5c, 0x2f, 0xcf, 0x5c, 0xee, 0x00, 0x1d, 0x7e, 0x74, 0xd0, 0xbd, + 0x75, 0x41, 0xa4, 0x39, 0xd5, 0x72, 0x27, 0xc9, 0x23, 0x4f, 0xf1, 0x0e, 0x6e, 0x89, 0xc9, 0x08, 0x16, 0x50, 0x29, 0x72, 0xa7, 0x2e, 0x87, 0x8d, 0x66, 0x3d, 0xb5, 0x2f, 0xcd, 0x50, 0x84, 0x42, + 0x3f, 0x23, 0xa1, 0x2e, 0x0a, 0x59, 0x62, 0x6e, 0x51, 0xad, 0x22, 0xee, 0x5a, 0xc9, 0x13, 0xea, 0x54, 0x31, 0x51, 0x16, 0x96, 0x73, 0x69, 0x5b, 0x96, 0xfb, 0xb0, 0x75, 0x54, 0x23, 0x7d, 0xcd, + 0x15, 0xec, 0x51, 0x66, 0x07, 0xe4, 0xc9, 0x02, 0xca, 0xcb, 0x1f, 0x40, 0x84, 0x5f, 0xca, 0x3b, 0x70, 0xa5, 0x79, 0xc1, 0xf0, 0x0c, 0x21, 0x3c, 0x24, 0xbb, 0xc0, 0x74, 0x84, 0x4e, 0x54, 0x3a, + 0x6c, 0xaa, 0x74, 0x26, 0xe5, 0x38, 0x89, 0x63, 0x49, 0xe4, 0x4c, 0xb6, 0x56, 0xb5, 0xc0, 0xbe, 0x66, 0x3e, 0xf5, 0xf2, 0x32, 0x1d, 0x3b, 0x66, 0xfd, 0xcc, 0x15, 0x12, 0x7e, 0xa9, 0x42, 0xef, + 0x07, 0xd5, 0xcb, 0x87, 0x5f, 0xae, 0xc7, 0xf0, 0xb0, 0xfa, 0xbc, 0x29, 0x0c, 0x09, 0xc8, 0x4e, 0x4c, 0x19, 0x46, 0x95, 0xfd, 0x18, 0xa7, 0xa9, 0xc5, 0x5a, 0x64, 0x50, 0xb9, 0xd9, 0x89, 0x73, + 0x0f, 0x26, 0xd7, 0x41, 0x40, 0x1d, 0x16, 0xba, 0x2b, 0x24, 0x8b, 0x03, 0xaa, 0xcd, 0xf6, 0x6a, 0xb2, 0x3c, 0xc1, 0x75, 0x00, 0x57, 0x09, 0x2d, 0xa8, 0xe4, 0xa2, 0x20, 0x99, 0x3e, 0xc9, 0x75, + 0x43, 0x0c, 0x2d, 0x63, 0x49, 0xd4, 0x98, 0x6b, 0x73, 0xe5, 0x5c, 0x89, 0xb4, 0x01, 0x49, 0x3c, 0xcc, 0xea, 0x94, 0xd9, 0x71, 0x58, 0x5f, 0x0f, 0xa3, 0x2f, 0x5e, 0xbe, 0xdf, 0x4b, 0xfa, 0x5d, + 0x4e, 0xc6, 0xbb, 0x98, 0xf0, 0x34, 0x4c, 0xdd, 0x73, 0xbe, 0xd0, 0xea, 0x7a, 0xe6, 0x41, 0x4f, 0x93, 0x00, 0xbf, 0xc1, 0x12, 0x3a, 0xd7, 0x79, 0xf5, 0xcc, 0x84, 0xf4, 0xc2, 0x86, 0xfb, 0x41, + 0xf6, 0x0a, 0xfd, 0xe5, 0xe6, 0x6c, 0x44, 0x1a, 0xb0, 0xeb, 0x6a, 0xa4, 0xbf, 0x4e, 0x47, 0x28, 0xc4, 0x01, 0x64, 0xec, 0x37, 0x12, 0x0a, 0xe4, 0xd0, 0x0c, 0x91, 0x39, 0x56, 0x4e, 0x03, 0x7d, + 0xbe, 0x40, 0x8b, 0x4c, 0x38, 0xe5, 0x59, 0xdb, 0x98, 0x23, 0x14, 0x2c, 0x0f, 0x36, 0x93, 0x6e, 0xd1, 0x91, 0x46, 0x40, 0x27, 0xd3, 0x40, 0x68, 0x14, 0x23, 0x8e, 0x96, 0xe5, 0x4f, 0xab, 0xa9, + 0x17, 0x29, 0x9b, 0x10, 0xc7, 0x1a, 0x60, 0x87, 0xb7, 0x2b, 0x48, 0x7d, 0x96, 0x7e, 0xee, 0x2b, 0x1c, 0x9d, 0x59, 0x3a, 0x4f, 0xb7, 0xe2, 0x17, 0x85, 0xcd, 0x77, 0xaa, 0x17, 0x30, 0x2e, 0xd7, + 0x43, 0x05, 0x4c, 0xab, 0x91, 0x17, 0xa0, 0x57, 0xd0, 0xb5, 0xcc, 0x2a, 0xdb, 0xa9, 0x38, 0x51, 0x5c, 0x3c, 0x98, 0xc1, 0x18, 0x59, 0x33, 0x8d, 0x35, 0xcf, 0xe5, 0xb5, 0x85, 0x1a, 0xc2, 0x04, + 0x17, 0x8e, 0xbc, 0xc6, 0x0a, 0x1d, 0xec, 0x8b, 0x76, 0xc7, 0xe6, 0x54, 0x77, 0x32, 0xad, 0xa4, 0xe7, 0x7b, 0x71, 0x82, 0xf5, 0xd4, 0x71, 0x42, 0xad, 0xa1, 0x95, 0x10, 0xc5, 0x80, 0x50, 0xe3, + 0xfc, 0x96, 0x32, 0xf5, 0xfc, 0xfb, 0x09, 0x54, 0xfd, 0x53, 0xba, 0x66, 0x52, 0xfc, 0x54, 0x5e, 0xe4, 0x95, 0xe4, 0xb1, 0x37, 0x74, 0xdf, 0x3a, 0xff, 0x79, 0x37, 0x2c, 0x77, 0xf2, 0x5c, 0x52, + 0xea, 0xa5, 0xc2, 0x6b, 0xd1, 0xaa, 0x98, 0xc0, 0x60, 0x9e, 0x05, 0x64, 0x45, 0x4b, 0x72, 0xaa, 0xe2, 0x31, 0x39, 0x60, 0x30, 0xab, 0x1f, 0xeb, 0x15, 0xc3, 0xaf, 0x59, 0x88, 0xab, 0x8f, 0x62, + 0xc5, 0xef, 0x97, 0x67, 0x1d, 0xea, 0x80, 0xf3, 0x64, 0xd2, 0x74, 0x94, 0x89, 0x4e, 0x8e, 0x87, 0x5d, 0x61, 0x52, 0x0b, 0xd5, 0x8b, 0x10, 0x02, 0xa4, 0xf9, 0x4d, 0xdf, 0x9f, 0x32, 0xdb, 0xa3, + 0x27, 0xf4, 0x8e, 0xe4, 0x4d, 0x8b, 0xa0, 0x17, 0x3b, 0x5a, 0x9f, 0x45, 0x28, 0x57, 0xf9, 0x87, 0x91, 0x3d, 0x5b, 0xd5, 0x47, 0x30, 0xc4, 0x1b, 0x2a, 0xb2, 0xf7, 0x54, 0x21, 0xcd, 0xb2, 0xaa, + 0xab, 0x4c, 0x53, 0xdc, 0xfa, 0xdb, 0x74, 0x82, 0x15, 0x4c, 0xd4, 0xfc, 0x26, 0xa9, 0xfc, 0x54, 0x1f, 0xf4, 0x6b, 0x66, 0xba, 0x27, 0xda, 0x85, 0x57, 0x76, 0xde, 0x5b, 0xca, 0x6f, 0x50, 0xdd, + 0xde, 0x0f, 0x2e, 0xa4, 0xc1, 0xe5, 0xed, 0xa4, 0xe7, 0xf7, 0x28, 0x55, 0xcd, 0x49, 0x3d, 0xc1, 0x48, 0x4f, 0x99, 0xee, 0x96, 0x58, 0xd5, 0x2a, 0xeb, 0xc6, 0x0c, 0xad, 0xcd, 0x71, 0x2f, 0x2d, + 0xe7, 0xeb, 0x94, 0x16, 0xad, 0x6d, 0x33, 0x2d, 0x41, 0xde, 0x83, 0x56, 0xe1, 0x26, 0x2f, 0x16, 0x3c, 0x25, 0x84, 0xf3, 0x28, 0xd4, 0xe9, 0xa9, 0xe5, 0x99, 0x26, 0x3c, 0x0f, 0x70, 0xab, 0x74, + 0x25, 0x7c, 0x22, 0x68, 0x5b, 0x0e, 0xfc, 0xae, 0x73, 0xfe, 0x21, 0x95, 0xc7, 0x53, 0x16, 0xf4, 0x65, 0x40, 0xbe, 0xbd, 0xe5, 0x06, 0x9c, 0x6f, 0xcf, 0x86, 0xf8, 0x5d, 0x40, 0xe3, 0x45, 0x77, + 0xe8, 0x5b, 0x4d, 0x25, 0x56, 0x3e, 0x14, 0xa5, 0xce, 0xca, 0x9e, 0x45, 0xb8, 0x5f, 0x25, 0x1c, 0xeb, 0x9f, 0x06, 0xd8, 0x61, 0xbe, 0x66, 0x1e, 0xfc, 0xf7, 0xa6, 0xc0, 0x1d, 0x65, 0x60, 0x7c, + 0x7f, 0x3f, 0x74, 0x0a, 0xc4, 0x3b, 0xa3, 0xcc, 0x34, 0x1e, 0x85, 0xa5, 0x69, 0xc8, 0x4c, 0x60, 0xce, 0x87, 0xac, 0x05, 0xd9, 0x47, 0x39, 0xc7, 0x8b, 0xfe, 0x71, 0xd7, 0xe9, 0x53, 0xc6, 0x15, + 0x9c, 0x4e, 0xc7, 0xb7, 0x2d, 0x60, 0x8b, 0x8a, 0xbb, 0x28, 0xec, 0x7c, 0x8f, 0x16, 0x7b, 0xd6, 0x5b, 0xa9, 0x47, 0x61, 0xa5, 0xe5, 0x93, 0x32, 0x2b, 0x99, 0x12, 0x76, 0xa9, 0xaa, 0xcc, 0x26, + 0xc7, 0xe3, 0x82, 0x2b, 0x4d, 0x85, 0x1a, 0xa0, 0x81, 0x1f, 0x90, 0xb3, 0xf1, 0x8f, 0x92, 0x2c, 0x3e, 0x51, 0x01, 0x9c, 0x93, 0x3a, 0xfe, 0x94, 0x02, 0x16, 0x7d, 0xc9, 0x66, 0xfd, 0x49, 0xf6, + 0x8a, 0xfb, 0x35, 0xf9, 0xeb, 0x77, 0x5f, 0xaa, 0x87, 0xa0, 0x2f, 0x78, 0xb3, 0x46, 0x99, 0x25, 0x06, 0xe1, 0x50, 0xcc, 0x9d, 0x60, 0xd6, 0x6d, 0xd7, 0x49, 0x89, 0x26, 0x8d, 0x10, 0xd1, 0x7e, + 0x9b, 0x46, 0x28, 0x84, 0xac, 0x4c, 0x69, 0x42, 0x44, 0x35, 0xaa, 0x91, 0x34, 0x2a, 0xcf, 0x2a, 0xaf, 0x60, 0x63, 0x62, 0x27, 0x51, 0x0b, 0xed, 0xe0, 0xe9, 0xa7, 0xd3, 0x91, 0x14, 0x15, 0x60, + 0x8d, 0xe3, 0xab, 0xfc, 0x38, 0x2a, 0x97, 0xb2, 0x10, 0x27, 0xeb, 0x15, 0xf1, 0x1a, 0xdf, 0x5b, 0x34, 0xe9, 0x7b, 0x9e, 0x95, 0xa7, 0xba, 0xf2, 0xa7, 0x99, 0x31, 0xff, 0xbd, 0x53, 0xec, 0xf1, + 0x2b, 0xde, 0xc1, 0xfd, 0xf6, 0x60, 0xc8, 0xd9, 0x76, 0xf6, 0x0f, 0x61, 0x52, 0x87, 0x85, 0xf4, 0x96, 0x93, 0x42, 0xa3, 0x48, 0xea, 0xa9, 0xe0, 0xc7, 0x4d, 0xa8, 0x66, 0xa7, 0x26, 0xee, 0x8f, + 0x3c, 0x20, 0xe3, 0xc2, 0x6c, 0xb9, 0x47, 0xa0, 0x95, 0x8b, 0xd0, 0x0b, 0x48, 0x38, 0x60, 0x16, 0xa8, 0xc0, 0x9b, 0x60, 0x8f, 0x51, 0xea, 0x2a, 0xa4, 0x5a, 0xa3, 0xd8, 0xcc, 0x24, 0xcd, 0x39, + 0x64, 0x23, 0x88, 0xb3, 0xcd, 0x49, 0x97, 0xf5, 0xdb, 0x2d, 0xd6, 0x4e, 0xa3, 0x01, 0x8a, 0x96, 0x5f, 0xb2, 0x9a, 0x3e, 0xcb, 0x46, 0xfa, 0x18, 0xfd, 0xe7, 0x1e, 0x37, 0xc4, 0x3f, 0xd0, 0x0b, + 0xf6, 0xe9, 0xab, 0xb3, 0xcd, 0xd9, 0xc9, 0xe4, 0x4c, 0xe1, 0x77, 0x1c, 0xd7, 0x9d, 0x79, 0xec, 0x4e, 0x06, 0x01, 0xaf, 0x63, 0xa2, 0x35, 0x38, 0xa1, 0x16, 0x84, 0xf2, 0xd4, 0xed, 0x41, 0xa3, + 0x59, 0x9f, 0x94, 0xba, 0x74, 0x66, 0xb5, 0x69, 0xb9, 0x9e, 0xb1, 0x9a, 0xe8, 0x98, 0xb1, 0x58, 0x06, 0x5a, 0xed, 0x3b, 0x7d, 0x96, 0x34, 0xb2, 0x5b, 0x1d, 0x85, 0x74, 0x13, 0xd6, 0x0c, 0xa8, + 0x4c, 0xc4, 0x91, 0x08, 0xe3, 0xd5, 0x6e, 0xcb, 0xba, 0x2b, 0x85, 0x83, 0x3b, 0x9e, 0x7e, 0x2d, 0x55, 0xff, 0x3d, 0x1f, 0xf5, 0xc0, 0x60, 0x17, 0x66, 0xde, 0xd9, 0x84, 0xf5, 0xf7, 0xa7, 0x26, + 0xfb, 0xee, 0x69, 0xe0, 0x96, 0xe1, 0xc5, 0x3f, 0xf7, 0xbe, 0x5c, 0xec, 0xcf, 0x59, 0x8f, 0x6e, 0x92, 0x24, 0x7f, 0x35, 0x77, 0xbd, 0xf1, 0x5a, 0xe1, 0x39, 0xe5, 0x6e, 0x9e, 0x34, 0xb5, 0x7b, + 0xf3, 0x55, 0x4f, 0xc7, 0xf3, 0xd3, 0xb9, 0xe7, 0xd1, 0xb0, 0x62, 0x2f, 0x65, 0x70, 0xbf, 0xa1, 0xfb, 0x3e, 0xba, 0x97, 0xbb, 0x73, 0x24, 0xfb, 0x00, 0x99, 0x60, 0x22, 0x72, 0xbe, 0x22, 0x4d, + 0xdd, 0x22, 0x5c, 0xea, 0xdd, 0x06, 0x99, 0xc8, 0xd9, 0xe2, 0x38, 0xc2, 0xb4, 0x6c, 0xdb, 0xc0, 0x2c, 0xad, 0x3b, 0xbd, 0xb5, 0xd8, 0xa0, 0x98, 0xbb, 0xee, 0xa0, 0xb6, 0x44, 0x7a, 0x1a, 0x69, + 0x8d, 0xb5, 0x7b, 0x72, 0x1d, 0xa8, 0x9a, 0x52, 0x41, 0x66, 0xd9, 0xa2, 0x4d, 0x01, 0x4a, 0xc9, 0x9f, 0x78, 0x4c, 0xde, 0x48, 0x65, 0xbc, 0xe8, 0x51, 0x53, 0xa1, 0x8c, 0xfc, 0xb5, 0x5d, 0xe9, + 0x6b, 0xc2, 0xac, 0x1f, 0x96, 0x86, 0x99, 0x8c, 0x9d, 0xf0, 0x69, 0x2d, 0x7a, 0xf8, 0x25, 0x5e, 0xe2, 0x86, 0xee, 0x15, 0xca, 0xeb, 0xdd, 0x03, 0x9f, 0xe1, 0x87, 0x50, 0x62, 0xec, 0x41, 0x3d, + 0x38, 0x41, 0xcc, 0xe4, 0x6d, 0x04, 0x8b, 0x1e, 0x90, 0x56, 0x08, 0xe7, 0x2a, 0x00, 0xe3, 0xc6, 0xb6, 0x88, 0xa1, 0xa7, 0x9a, 0x95, 0xd7, 0x1a, 0xba, 0x61, 0x74, 0xb8, 0x0c, 0xe4, 0xae, 0x64, + 0xf7, 0x6b, 0x29, 0x72, 0x35, 0x86, 0x51, 0xc0, 0x75, 0x10, 0x9b, 0xe0, 0xb1, 0x13, 0x66, 0xf5, 0x42, 0xcf, 0x30, 0xb2, 0x3b, 0x4d, 0xd1, 0x0a, 0x1b, 0xf1, 0x6c, 0x25, 0x8a, 0xf8, 0x6b, 0xeb, + 0x25, 0xcc, 0xc2, 0x8f, 0x79, 0x8b, 0xfd, 0x04, 0xe3, 0x33, 0x08, 0x21, 0xe4, 0x1f, 0xf2, 0x95, 0x1d, 0xfd, 0x42, 0xf4, 0x03, 0xbf, 0x6a, 0x7c, 0x21, 0xf4, 0x3b, 0x78, 0x25, 0x5b, 0x3b, 0x13, + 0x7c, 0xb4, 0x99, 0xd1, 0x5c, 0xe4, 0x32, 0xed, 0x84, 0x82, 0xca, 0xe2, 0xd0, 0x33, 0x6d, 0x0c, 0xc4, 0x08, 0x10, 0x12, 0x8c, 0x2b, 0x48, 0x61, 0x79, 0x0a, 0x77, 0xcd, 0x92, 0x05, 0xd9, 0x8e, + 0xb2, 0x8b, 0xd3, 0x92, 0x9f, 0xd4, 0x70, 0x54, 0x5b, 0x93, 0x4e, 0x35, 0x65, 0x27, 0x98, 0x8d, 0x30, 0x02, 0xd9, 0xa3, 0xed, 0xae, 0xc3, 0x39, 0x3b, 0x5a, 0x6d, 0xcc, 0x2a, 0xa4, 0x7e, 0xe3, + 0xe2, 0x9f, 0xd8, 0x1b, 0x4e, 0x85, 0x3b, 0xf6, 0xde, 0x8d, 0xe0, 0xe0, 0x3f, 0xf0, 0xad, 0x56, 0xf5, 0x86, 0xdc, 0x33, 0x9f, 0xf6, 0xdb, 0xff, 0xff, 0x6c, 0xfe, 0x26, 0xf1, 0x7e, 0xcd, 0x74, + 0x3b, 0x14, 0xe3, 0x0f, 0xf2, 0xc0, 0xf8, 0xf3, 0x7a, 0x7c, 0x21, 0x78, 0x87, 0xf3, 0x5f, 0xcf, 0xb0, 0x16, 0xdc, 0x91, 0xcb, 0xa0, 0x25, 0x08, 0x84, 0xbb, 0xac, 0x98, 0x1c, 0x67, 0x24, 0x06, + 0xf7, 0xc8, 0x64, 0x24, 0x80, 0x74, 0x8d, 0xc9, 0x02, 0x00, 0x08, 0xd1, 0xb2, 0x93, 0x1d, 0x58, 0x9b, 0xb3, 0x4c, 0x5a, 0x9e, 0xba, 0xa3, 0x87, 0xb5, 0x95, 0x91, 0x04, 0xa8, 0x8c, 0x27, 0xe1, + 0x31, 0xc1, 0xe9, 0x51, 0xd7, 0x03, 0xa4, 0x33, 0x4a, 0xcd, 0xad, 0x32, 0x89, 0x05, 0x68, 0xce, 0xc5, 0x1c, 0xb2, 0x7e, 0x3d, 0x20, 0xeb, 0x6d, 0xaa, 0x58, 0xcf, 0x8c, 0x35, 0x10, 0xf4, 0x52, + 0x04, 0xd2, 0x85, 0xe6, 0x75, 0x1e, 0x5a, 0xa7, 0xf1, 0x85, 0xcc, 0xef, 0xd3, 0xd0, 0xf3, 0x9c, 0x34, 0xaf, 0xa2, 0x09, 0x09, 0x12, 0x27, 0x62, 0x94, 0x4c, 0x20, 0x81, 0x07, 0x23, 0x66, 0x3d, + 0x91, 0xb5, 0x54, 0x6f, 0x12, 0x80, 0x80, 0xb0, 0x63, 0xc8, 0xad, 0x99, 0x28, 0x47, 0x02, 0x7a, 0xbd, 0xd9, 0xda, 0x61, 0xe9, 0x4b, 0x42, 0xb6, 0x67, 0xa6, 0x19, 0xe6, 0x23, 0x69, 0x2d, 0x93, + 0x5b, 0x71, 0x3d, 0xd5, 0xac, 0xd8, 0x6b, 0x4c, 0x88, 0x2d, 0xdc, 0x0c, 0xc6, 0x80, 0xbd, 0xfd, 0x9a, 0xd6, 0xff, 0x92, 0xa2, 0xbb, 0xc9, 0xae, 0x40, 0x7c, 0x4f, 0xe9, 0x78, 0x53, 0xda, 0xe7, + 0x72, 0x76, 0x7d, 0xb7, 0xe3, 0xdc, 0x3c, 0xfe, 0xc2, 0x67, 0xdf, 0x24, 0x3f, 0xc4, 0xbe, 0x7a, 0x64, 0xfc, 0xe4, 0x68, 0x5a, 0x25, 0xe6, 0x5d, 0x46, 0xc4, 0x3f, 0x58, 0x17, 0xdf, 0x0a, 0x98, + 0xfc, 0xf5, 0xd7, 0xf7, 0x23, 0x90, 0x7c, 0x69, 0x4d, 0x7c, 0x54, 0x31, 0xb9, 0x96, 0x30, 0x39, 0x53, 0x1a, 0xb6, 0x18, 0x68, 0xbe, 0xf0, 0x66, 0xc4, 0xa6, 0x08, 0x99, 0x6d, 0x41, 0x27, 0xc0, + 0x04, 0x57, 0x50, 0x8a, 0xa4, 0x4d, 0x6e, 0x89, 0xeb, 0xc0, 0x84, 0xde, 0x52, 0x08, 0xb3, 0xb5, 0xac, 0x13, 0xec, 0x6d, 0x40, 0xb0, 0x45, 0x19, 0xab, 0xdd, 0xd0, 0xfb, 0x1d, 0x93, 0x9b, 0x32, + 0xa4, 0xd2, 0x9b, 0x55, 0x85, 0x84, 0x32, 0x86, 0x14, 0x4b, 0x9d, 0x60, 0x6a, 0x23, 0xc6, 0x56, 0x93, 0x29, 0x87, 0x11, 0x21, 0xa4, 0x0e, 0xca, 0x35, 0xf6, 0x78, 0x31, 0xe4, 0xcf, 0x18, 0x04, + 0xea, 0xa5, 0xca, 0x8b, 0x7e, 0x7e, 0x66, 0x0c, 0xf2, 0x7a, 0x4c, 0x0d, 0xab, 0xb4, 0x28, 0x13, 0xee, 0xae, 0xa8, 0xf7, 0xcd, 0x42, 0x3f, 0x76, 0x61, 0x54, 0x81, 0xae, 0x36, 0x6a, 0x91, 0x1c, + 0x1f, 0xed, 0x59, 0x88, 0x3b, 0x68, 0x2b, 0xd2, 0x59, 0x8a, 0x8c, 0x6b, 0x4b, 0xde, 0x36, 0x8d, 0x33, 0xbb, 0xa3, 0x26, 0x1a, 0xea, 0xd8, 0x1d, 0x30, 0x0b, 0x8e, 0x21, 0xc9, 0x3b, 0xc9, 0x61, + 0x53, 0x07, 0xc7, 0x63, 0x61, 0x9c, 0xc2, 0x9e, 0xef, 0x4f, 0x3e, 0x29, 0x6f, 0x53, 0xa6, 0x5a, 0x8c, 0x5e, 0xdb, 0x88, 0xff, 0xab, 0x0a, 0x33, 0xe7, 0xad, 0x9f, 0x65, 0xd0, 0x54, 0xc0, 0xb5, + 0x14, 0x26, 0xf8, 0x0f, 0xf4, 0x45, 0x79, 0xfb, 0x5f, 0x55, 0x9f, 0x9a, 0xa5, 0xdd, 0x9b, 0x31, 0xf0, 0x06, 0xc4, 0xb8, 0x0e, 0xd3, 0x0f, 0xbf, 0xae, 0xaf, 0xb1, 0x5a, 0xa6, 0x1d, 0xb8, 0x67, + 0x95, 0xe9, 0xad, 0x9f, 0xd3, 0xb7, 0x8c, 0x91, 0x8f, 0xab, 0xc5, 0xbe, 0x4d, 0xf9, 0x2f, 0xab, 0xe1, 0xb6, 0x9e, 0xcc, 0x83, 0x14, 0xa0, 0x77, 0x82, 0xe8, 0x03, 0x9f, 0xac, 0x24, 0xef, 0xdc, + 0xd2, 0x36, 0x2b, 0xf7, 0x4b, 0x69, 0xb9, 0xbb, 0xc5, 0xf8, 0xb8, 0x76, 0xeb, 0x7d, 0x62, 0xcd, 0xb1, 0x6d, 0x66, 0xb6, 0x7b, 0x6b, 0xc8, 0xf8, 0xd2, 0xa3, 0xb3, 0x0d, 0xdd, 0x74, 0xde, 0xbd, + 0xa9, 0x6f, 0x75, 0xdc, 0x77, 0xbf, 0x6b, 0xca, 0xe4, 0xe2, 0x84, 0x35, 0x4e, 0xcc, 0xe3, 0x83, 0x65, 0x7e, 0x3f, 0x57, 0x4b, 0xd3, 0x76, 0xbd, 0x26, 0x19, 0x7b, 0xcf, 0xd8, 0x08, 0xf4, 0xae, + 0x8a, 0xc1, 0xe0, 0x39, 0xfb, 0x49, 0xf7, 0x6d, 0xee, 0x7e, 0xde, 0x9d, 0x2b, 0x4b, 0x0e, 0xb0, 0xdd, 0xee, 0xa2, 0xd5, 0x46, 0x58, 0xce, 0x09, 0xca, 0xa9, 0x97, 0x13, 0x2d, 0x0b, 0xd5, 0x64, + 0xb1, 0xd8, 0xb1, 0xfa, 0xa2, 0x87, 0xa3, 0xdd, 0x71, 0x8b, 0x6b, 0x81, 0x00, 0xa0, 0x29, 0x24, 0x38, 0xb1, 0x65, 0xc0, 0x99, 0x58, 0x31, 0xf3, 0x91, 0xcd, 0x41, 0x8c, 0xe3, 0x1f, 0x12, 0xac, + 0x9f, 0xca, 0x41, 0x05, 0x68, 0x95, 0xa4, 0xcb, 0x6d, 0xb9, 0xb7, 0xeb, 0x63, 0x5c, 0x6b, 0x7b, 0x43, 0x8d, 0xc3, 0x67, 0xc9, 0xaf, 0xee, 0x10, 0xb9, 0x68, 0x2f, 0x9e, 0x49, 0xc8, 0x7f, 0x7e, + 0x8c, 0x05, 0xe6, 0x1b, 0x02, 0x81, 0x79, 0x29, 0xea, 0x3f, 0xe4, 0xfc, 0x82, 0x9d, 0x56, 0x04, 0x35, 0x15, 0x17, 0xdd, 0x88, 0x90, 0xe3, 0xdd, 0x72, 0x51, 0xba, 0x41, 0x64, 0xf5, 0xfc, 0x24, + 0x9a, 0x17, 0x18, 0xa0, 0xad, 0x36, 0x05, 0x56, 0x6f, 0x8b, 0x1d, 0xa7, 0xa1, 0x4b, 0x96, 0x35, 0x56, 0x10, 0x40, 0x1f, 0xad, 0xb9, 0x5c, 0x7b, 0x40, 0x15, 0x4e, 0x60, 0x65, 0xb7, 0x75, 0x41, + 0xca, 0x36, 0x67, 0xa9, 0x56, 0xeb, 0x7a, 0xbf, 0x63, 0x38, 0x8b, 0x56, 0xd0, 0x7e, 0x80, 0xec, 0xfb, 0x4c, 0xb3, 0xf3, 0x70, 0xde, 0xbc, 0xf5, 0xe7, 0x6c, 0x8f, 0x19, 0x07, 0x79, 0x1e, 0xff, + 0x84, 0xd8, 0x9f, 0xef, 0x77, 0x5f, 0x68, 0x5f, 0xd1, 0xbb, 0x69, 0x19, 0xaa, 0x45, 0xd0, 0xe7, 0xa0, 0xb6, 0x59, 0x44, 0xf1, 0xb1, 0x24, 0x26, 0xa7, 0x93, 0x24, 0x09, 0xa7, 0x78, 0x4f, 0xf6, + 0x2b, 0x74, 0xd3, 0xd6, 0xcc, 0xac, 0x52, 0x97, 0x93, 0xcd, 0xa1, 0x6b, 0x40, 0x5c, 0x9d, 0xf7, 0x50, 0x62, 0xe1, 0x4c, 0xcb, 0x61, 0x48, 0xb5, 0x09, 0x30, 0x16, 0x8a, 0x77, 0x47, 0x9f, 0x14, + 0xf6, 0x1c, 0xb6, 0xae, 0x3c, 0x79, 0x6a, 0x90, 0xcd, 0x9e, 0x12, 0x62, 0x7d, 0x66, 0xd0, 0x16, 0x90, 0x7e, 0x33, 0x10, 0xbc, 0x7d, 0x9c, 0x15, 0xfa, 0xe1, 0x73, 0x7d, 0x3a, 0xf4, 0x92, 0xc3, + 0xf6, 0x0d, 0xdd, 0x2b, 0x04, 0xd7, 0xbb, 0x73, 0xf7, 0x07, 0xc8, 0x85, 0xb5, 0xd2, 0x4e, 0x57, 0x35, 0x5d, 0x52, 0x49, 0x3c, 0x07, 0x99, 0x23, 0x68, 0x4a, 0xe1, 0x86, 0x12, 0x46, 0x62, 0xa1, + 0xa1, 0x7d, 0x08, 0x97, 0x80, 0xe0, 0xba, 0x98, 0x16, 0xcb, 0x33, 0xcb, 0x3c, 0xb4, 0x08, 0x26, 0xaf, 0x75, 0xbe, 0xb7, 0x3a, 0xc9, 0x9b, 0x2b, 0x86, 0xc1, 0x82, 0xb1, 0x3c, 0x92, 0x1d, 0x1c, + 0x01, 0x61, 0x75, 0x69, 0xc0, 0x05, 0x60, 0x2d, 0xa7, 0x4c, 0x2e, 0x23, 0x5a, 0xfe, 0xcd, 0x17, 0xf1, 0xed, 0xc3, 0xbc, 0xc4, 0x7c, 0xe6, 0x84, 0x88, 0xbe, 0x3c, 0x05, 0xde, 0x88, 0x5e, 0x3b, + 0xfe, 0x76, 0x79, 0x4e, 0xd6, 0x32, 0x60, 0xd0, 0x99, 0x53, 0xbc, 0xdc, 0x02, 0x12, 0xb4, 0x8a, 0xb6, 0x3b, 0xbb, 0x2e, 0x0a, 0x9f, 0x9b, 0xf8, 0x9e, 0x22, 0x82, 0xf5, 0x4a, 0x6b, 0x0c, 0x35, + 0x0a, 0x7c, 0xbe, 0x84, 0x88, 0xf8, 0xb0, 0x6d, 0x52, 0x3e, 0xc1, 0x27, 0x5e, 0x8b, 0x30, 0x9c, 0x92, 0xb8, 0x2a, 0x71, 0x30, 0xd4, 0x3e, 0xdf, 0xcf, 0xe6, 0xdb, 0x09, 0xbb, 0x9d, 0x4d, 0x51, + 0x41, 0xcc, 0x17, 0x80, 0x71, 0x54, 0x11, 0xa6, 0x4d, 0xf8, 0xcd, 0xc3, 0x5e, 0x7f, 0xaa, 0x32, 0xff, 0xd5, 0xdd, 0xe2, 0x9d, 0xee, 0xb5, 0xef, 0xd7, 0xbb, 0xa1, 0xbb, 0x47, 0x82, 0xac, 0xa7, + 0xcd, 0x1c, 0xe7, 0xfd, 0x99, 0xd0, 0x6d, 0x67, 0xab, 0xd8, 0xd1, 0x17, 0x4c, 0x18, 0xe8, 0x51, 0x8d, 0x15, 0xf2, 0xc6, 0x62, 0x7c, 0x14, 0x2f, 0xeb, 0x24, 0xcd, 0x94, 0x4d, 0xa2, 0x5a, 0x7e, + 0x4a, 0x93, 0x6b, 0x91, 0x2b, 0x57, 0x4b, 0x4b, 0xd7, 0xe7, 0xb4, 0x62, 0x65, 0x1b, 0x73, 0xe9, 0x1e, 0xf9, 0x55, 0x1d, 0x6e, 0x44, 0x32, 0x48, 0x5d, 0x39, 0x92, 0x7b, 0x78, 0xeb, 0x8c, 0xbe, + 0x99, 0x06, 0xbe, 0xd7, 0xf3, 0xf8, 0x77, 0x97, 0xff, 0x0d, 0xed, 0x2b, 0x0c, 0x37, 0x2d, 0x43, 0x97, 0x7f, 0x3c, 0x8f, 0x6c, 0x45, 0x08, 0xb2, 0x64, 0xa1, 0x41, 0xf1, 0x29, 0x5f, 0xc4, 0x84, + 0xb8, 0x5f, 0x29, 0x66, 0xc7, 0x62, 0x4b, 0xd1, 0x02, 0xd6, 0xbd, 0x6a, 0x63, 0x1d, 0x45, 0x83, 0x70, 0x20, 0x6e, 0x45, 0xd0, 0xf1, 0xe6, 0x72, 0x64, 0xb1, 0xd2, 0xaa, 0xf5, 0x21, 0x07, 0xb7, + 0x3d, 0x84, 0xb5, 0x5c, 0x35, 0xad, 0x55, 0x4a, 0xb3, 0x2c, 0x0d, 0x39, 0xf4, 0x06, 0xbc, 0x75, 0x03, 0x8a, 0xd8, 0x0d, 0x50, 0x91, 0x3f, 0x52, 0x73, 0x3f, 0x31, 0x32, 0xbf, 0xfd, 0xf4, 0x64, + 0x96, 0xcf, 0x74, 0xb2, 0xaf, 0x05, 0x66, 0xbd, 0x13, 0xbd, 0x22, 0xf7, 0x76, 0x39, 0x34, 0xe8, 0x4a, 0x3d, 0xd0, 0xf2, 0x21, 0x44, 0xa3, 0x86, 0xd8, 0x8e, 0xb6, 0x87, 0x85, 0xe0, 0x1c, 0x26, + 0x22, 0xb8, 0x31, 0x15, 0x6d, 0x51, 0xcd, 0x16, 0x4b, 0x95, 0x96, 0xda, 0x98, 0x72, 0xd5, 0x9d, 0xb0, 0x90, 0x75, 0x68, 0x3a, 0x5f, 0xcc, 0x7a, 0x3d, 0x58, 0xef, 0x72, 0x9e, 0x58, 0x4a, 0x8c, + 0x9b, 0x66, 0x49, 0xab, 0xd9, 0x2d, 0xa0, 0x33, 0xa9, 0x0d, 0x77, 0xc2, 0x8e, 0xa4, 0xa7, 0x30, 0xca, 0x64, 0x6a, 0x35, 0xe8, 0xd4, 0x75, 0xca, 0x71, 0x10, 0x56, 0x75, 0xee, 0x97, 0x66, 0x3a, + 0x8e, 0x9e, 0x2f, 0xaa, 0x57, 0xac, 0xcc, 0x5f, 0x89, 0xbf, 0x01, 0xf3, 0xa5, 0x69, 0x68, 0x10, 0x67, 0x00, 0xea, 0xdb, 0x7c, 0x89, 0xb8, 0xdd, 0xa1, 0x32, 0x0d, 0x24, 0x9b, 0x6f, 0xb7, 0x26, + 0xee, 0xac, 0xc5, 0x19, 0x51, 0x1d, 0x8e, 0x23, 0xc6, 0x77, 0xa6, 0xe8, 0x48, 0xb4, 0x97, 0x94, 0xd8, 0x10, 0xbd, 0x31, 0x4b, 0xb6, 0x60, 0xb5, 0x57, 0x36, 0x2c, 0x5b, 0x22, 0xf6, 0xc9, 0xcd, + 0xa4, 0x6a, 0x73, 0x38, 0x58, 0x1a, 0xbb, 0xc8, 0x80, 0x7c, 0xae, 0xe3, 0x7d, 0xe4, 0x31, 0xab, 0xfd, 0xa2, 0xed, 0xd3, 0x01, 0x73, 0xca, 0x32, 0x2b, 0x17, 0x47, 0x2f, 0xc0, 0x3c, 0x0a, 0xef, + 0x37, 0xe3, 0xfc, 0x63, 0xae, 0x3d, 0x71, 0x7f, 0xb9, 0xef, 0x72, 0xe1, 0x96, 0xb6, 0x9b, 0xd5, 0x61, 0xe2, 0xbe, 0x17, 0xaf, 0xfc, 0xf7, 0xd4, 0x70, 0x3f, 0xbe, 0xe9, 0x1b, 0xf8, 0x5f, 0x9e, + 0x0f, 0x55, 0xd5, 0x49, 0x74, 0x6b, 0x6d, 0x8f, 0x9b, 0x64, 0xd1, 0xb1, 0x11, 0x82, 0x73, 0xf2, 0x1c, 0xc2, 0xf7, 0xeb, 0x5c, 0x67, 0x2c, 0xb5, 0xc5, 0x74, 0xe6, 0x24, 0x22, 0x24, 0x16, 0x87, + 0x0a, 0xc8, 0x29, 0x08, 0x89, 0x40, 0x9e, 0xad, 0x6c, 0x85, 0xfd, 0x56, 0x26, 0x48, 0x4c, 0xab, 0xe7, 0x73, 0x03, 0x36, 0x03, 0x9d, 0x40, 0x90, 0x1e, 0x8c, 0x4f, 0xe4, 0xb2, 0x45, 0x1d, 0x9c, + 0xcb, 0x46, 0x4a, 0x35, 0xea, 0x06, 0x8c, 0xc4, 0x83, 0x99, 0xfa, 0xa3, 0xda, 0xf8, 0x2c, 0xcf, 0x5c, 0xdc, 0x16, 0x2b, 0x37, 0x35, 0xb3, 0x3a, 0xb4, 0x9f, 0xb3, 0xda, 0x2f, 0x2d, 0xf7, 0x07, + 0x2f, 0x78, 0x03, 0xf9, 0x41, 0xf3, 0x50, 0x3b, 0x97, 0x6d, 0x96, 0x9b, 0x38, 0xb1, 0xd5, 0x80, 0x90, 0xc5, 0x9d, 0xbc, 0x22, 0xa6, 0x2d, 0x4c, 0xc8, 0x9b, 0xda, 0x09, 0xf4, 0x40, 0xad, 0xdc, + 0xc4, 0x04, 0x1a, 0x17, 0x03, 0xa2, 0x55, 0x1f, 0xb9, 0xbe, 0xd6, 0xee, 0x67, 0x07, 0x1e, 0xe6, 0xd6, 0x0c, 0x25, 0xc1, 0xf4, 0x22, 0xa3, 0x96, 0xc6, 0x32, 0x80, 0x7c, 0x92, 0xb0, 0x0b, 0x0c, + 0xaf, 0x1a, 0x60, 0xee, 0x4b, 0x4a, 0x6f, 0xef, 0x14, 0xd2, 0x1e, 0xe2, 0x65, 0x72, 0xfe, 0xe8, 0xb3, 0xf0, 0x52, 0x3e, 0xdf, 0x04, 0xc0, 0x7f, 0xb0, 0x57, 0x4e, 0xd6, 0x3b, 0xd2, 0xef, 0x00, + 0x7d, 0x34, 0x8c, 0xcf, 0x54, 0x7f, 0x87, 0xa6, 0x26, 0x82, 0xa8, 0x75, 0x3d, 0x00, 0x63, 0x99, 0x15, 0x21, 0xef, 0xb6, 0x8e, 0xda, 0x6b, 0x6a, 0x90, 0x90, 0x7d, 0xcc, 0x34, 0xa3, 0x75, 0x62, + 0x32, 0x20, 0xa7, 0xf7, 0x0e, 0xdf, 0xb4, 0x96, 0x32, 0x0b, 0x8b, 0x23, 0x2d, 0x17, 0x62, 0x86, 0xaa, 0x41, 0x47, 0x1a, 0x27, 0x66, 0xca, 0x98, 0x24, 0x48, 0x86, 0xda, 0x96, 0xdc, 0x4f, 0xa3, + 0x3e, 0xc7, 0x8f, 0xa9, 0x5e, 0xa3, 0xd3, 0x70, 0x6d, 0x7c, 0x8b, 0x82, 0x0b, 0x4e, 0x85, 0x5b, 0x86, 0xcf, 0x3c, 0x0f, 0x5e, 0x3c, 0x16, 0x2e, 0x34, 0xdf, 0x7a, 0x7e, 0xb9, 0x1a, 0x7a, 0x28, + 0xd8, 0x8a, 0x19, 0x07, 0x47, 0x4b, 0xad, 0x4c, 0xae, 0x39, 0x44, 0x5e, 0xdb, 0xda, 0x6a, 0xd3, 0x26, 0xc0, 0x3c, 0x41, 0x50, 0x78, 0x89, 0x63, 0x47, 0x7f, 0xbd, 0xd6, 0x4b, 0xfd, 0xa8, 0x28, + 0x25, 0x75, 0x48, 0x97, 0x00, 0xb3, 0x5c, 0x8d, 0x14, 0xd2, 0x2e, 0x15, 0x3c, 0xe5, 0x12, 0xc9, 0x01, 0x4c, 0x22, 0x1c, 0x6d, 0x5c, 0x74, 0x06, 0xf2, 0xbe, 0x52, 0xd6, 0xc6, 0x66, 0xdd, 0xbb, + 0x23, 0x73, 0x3a, 0x40, 0x20, 0x69, 0x9a, 0xf0, 0x22, 0x87, 0x20, 0x5f, 0x7d, 0xbd, 0xde, 0x9e, 0xdc, 0x04, 0x1a, 0xfd, 0x71, 0xde, 0xd6, 0x2b, 0xe5, 0x67, 0x4a, 0xac, 0xaf, 0xef, 0x1b, 0x8e, + 0xf1, 0x1b, 0x61, 0x60, 0x7c, 0xfe, 0xf3, 0x20, 0xcb, 0xf3, 0x5f, 0xcf, 0x10, 0x66, 0x23, 0x65, 0x26, 0x77, 0xb8, 0x6f, 0x30, 0xd8, 0x92, 0xf7, 0x7d, 0xbb, 0x66, 0x69, 0x3b, 0xd2, 0xcc, 0x18, + 0x24, 0x47, 0x2b, 0x46, 0x0b, 0x14, 0x2e, 0x9c, 0xf5, 0xf3, 0x6c, 0x4b, 0x29, 0x94, 0xe9, 0xfa, 0x69, 0x41, 0x62, 0x0a, 0x60, 0xc9, 0x2e, 0xad, 0x6d, 0x2d, 0x54, 0xda, 0xce, 0x4d, 0x59, 0x28, + 0xea, 0x25, 0x15, 0x37, 0xba, 0x29, 0x04, 0x99, 0x25, 0x30, 0x62, 0x6c, 0xad, 0x2c, 0x60, 0xf2, 0x7b, 0xcd, 0xb0, 0x1f, 0xeb, 0x11, 0xa3, 0x2f, 0x05, 0xd1, 0x7e, 0x55, 0xe3, 0xa1, 0xbf, 0x07, + 0xcc, 0x9e, 0xe7, 0xd8, 0x69, 0x3e, 0x5b, 0x95, 0x07, 0x1b, 0xd0, 0x1d, 0x7b, 0x37, 0xcf, 0xc2, 0x65, 0xd0, 0x73, 0x28, 0x3c, 0x9a, 0xf4, 0xca, 0xc8, 0x17, 0xba, 0x54, 0xed, 0x45, 0x65, 0x6e, + 0xcb, 0x53, 0x49, 0xef, 0x4e, 0x4a, 0x43, 0xd3, 0xf4, 0x09, 0x58, 0x45, 0xcd, 0x71, 0xb7, 0x36, 0x80, 0x39, 0xcb, 0xb0, 0x38, 0x9f, 0x1f, 0x20, 0x21, 0xec, 0x79, 0x91, 0xde, 0x9d, 0xb6, 0x76, + 0x4b, 0x8a, 0xa8, 0x68, 0x70, 0xfc, 0x90, 0x94, 0x49, 0xd7, 0xcf, 0xb4, 0x4e, 0x63, 0xc7, 0xf5, 0xcc, 0x26, 0xf9, 0x77, 0x93, 0x8a, 0x7c, 0xa3, 0xfe, 0x09, 0xcc, 0x67, 0xdb, 0x30, 0x67, 0x16, + 0x85, 0x2f, 0x6a, 0xbb, 0xb5, 0x16, 0x39, 0x4e, 0x4e, 0x0e, 0x26, 0xb4, 0xc2, 0x72, 0xa7, 0x44, 0xd1, 0xd0, 0x5d, 0x75, 0xf1, 0x80, 0x5e, 0xde, 0xd7, 0xc2, 0x79, 0xd4, 0x41, 0xe4, 0xa5, 0x94, + 0x69, 0xb7, 0x84, 0xdf, 0xfa, 0x76, 0x73, 0x3b, 0x46, 0x86, 0xa5, 0x4d, 0x6b, 0x5d, 0x5d, 0x0f, 0x24, 0x73, 0x34, 0x83, 0x24, 0x7a, 0xd5, 0x67, 0x6d, 0xa0, 0xb2, 0x47, 0x8b, 0xf4, 0xcc, 0x63, + 0x52, 0x76, 0x6a, 0x76, 0xac, 0xdc, 0xd9, 0xc4, 0x9a, 0x14, 0x28, 0x46, 0x30, 0x60, 0xb7, 0x16, 0xc2, 0x1c, 0xb6, 0x44, 0x65, 0x95, 0x45, 0xfa, 0x2c, 0xe0, 0xa3, 0x91, 0x1e, 0x4e, 0x0e, 0x38, + 0x74, 0x2c, 0xf9, 0x45, 0x20, 0xc5, 0x54, 0xb8, 0xd7, 0x62, 0x6c, 0xde, 0xfb, 0x12, 0xff, 0x9a, 0xf9, 0xf2, 0x6a, 0x77, 0x4d, 0x73, 0xa7, 0x79, 0xa6, 0x85, 0xbb, 0xe2, 0x32, 0xf6, 0xca, 0xfc, + 0x5d, 0x23, 0xf8, 0xf4, 0xe8, 0xbf, 0xa2, 0x91, 0x98, 0xfd, 0x33, 0xd3, 0xc8, 0x6b, 0x3b, 0xf9, 0x0d, 0xdd, 0x4f, 0xcc, 0xdf, 0xee, 0x86, 0xec, 0xe8, 0xd0, 0x98, 0xde, 0xa5, 0xe2, 0x46, 0xdd, + 0x73, 0x51, 0x0e, 0x8d, 0x32, 0x63, 0xbd, 0xa6, 0xf5, 0x6d, 0xe6, 0x75, 0x49, 0xbb, 0x89, 0xf9, 0x21, 0x33, 0xe9, 0xb6, 0x66, 0xd2, 0xe3, 0xe3, 0xf9, 0x95, 0x02, 0xdc, 0x37, 0x74, 0xcf, 0x7d, + 0xfa, 0xb8, 0x1b, 0x56, 0x84, 0x3b, 0x0e, 0x42, 0xac, 0x2a, 0xe3, 0x3c, 0x8f, 0xc2, 0xe3, 0xc6, 0xde, 0x12, 0x26, 0x0c, 0xed, 0xad, 0x13, 0xaf, 0xaa, 0xa3, 0x7c, 0x40, 0x9f, 0x3e, 0x3d, 0x0f, + 0x9e, 0x2d, 0xfd, 0x17, 0x36, 0xc2, 0x2b, 0xd1, 0xb7, 0xde, 0x5c, 0x2f, 0xcf, 0x0b, 0xfd, 0xd7, 0xec, 0x01, 0x8a, 0x05, 0x45, 0xbc, 0xe3, 0x49, 0x6b, 0xa9, 0x5b, 0xb6, 0x4b, 0x66, 0xc5, 0xb0, + 0x3b, 0xdc, 0xdf, 0xed, 0x20, 0xcb, 0x7b, 0xbc, 0xd0, 0x7f, 0x99, 0xd3, 0xcf, 0x1d, 0x20, 0xba, 0xd2, 0x2c, 0x8a, 0xf3, 0x7b, 0x9f, 0x28, 0xf9, 0x6e, 0x7c, 0x2e, 0x9e, 0x09, 0x07, 0x2f, 0x0c, + 0xf4, 0x95, 0xe8, 0x19, 0x97, 0xcb, 0xe5, 0x99, 0xe5, 0x1f, 0xa0, 0x13, 0x8e, 0x81, 0x76, 0x61, 0xee, 0x51, 0x40, 0x4f, 0x4c, 0x64, 0xd7, 0x9f, 0xf8, 0x69, 0xbb, 0x95, 0xc4, 0xbd, 0xee, 0x72, + 0x6c, 0x7b, 0x10, 0x57, 0x75, 0x76, 0xa0, 0x9d, 0xa6, 0xdf, 0xb2, 0x45, 0x5f, 0x48, 0x46, 0x3f, 0xa9, 0xe2, 0x15, 0x1f, 0x18, 0xf0, 0x6a, 0xc4, 0x64, 0x74, 0xa8, 0xf0, 0x54, 0xbf, 0x50, 0x72, + 0x6e, 0xee, 0xf2, 0xc5, 0x7e, 0x75, 0x34, 0x51, 0x47, 0x77, 0x0d, 0x4e, 0x3a, 0xb8, 0xdd, 0x37, 0xd5, 0xce, 0xc5, 0xf0, 0xfe, 0x78, 0x22, 0x20, 0x37, 0xc6, 0xad, 0xe1, 0x1d, 0x0e, 0xcf, 0x7d, + 0x0d, 0xcf, 0xe9, 0x98, 0xc9, 0xdf, 0xbb, 0xb9, 0xd4, 0x80, 0x53, 0xe3, 0x6b, 0x70, 0xd3, 0xef, 0xb0, 0x90, 0x97, 0x95, 0xd0, 0x98, 0x9c, 0x66, 0xb5, 0xe4, 0x8c, 0xb2, 0x63, 0xad, 0x66, 0x91, + 0xbb, 0xae, 0x41, 0xd3, 0x16, 0x9c, 0x8e, 0x22, 0xe3, 0xd5, 0xba, 0x6c, 0x1b, 0x59, 0x3b, 0xd1, 0x24, 0x58, 0x57, 0x32, 0x23, 0x32, 0xc4, 0xa9, 0x5d, 0x68, 0xbe, 0x99, 0x04, 0x06, 0x2e, 0x0b, + 0xfb, 0x69, 0xca, 0xb0, 0xb1, 0xba, 0xa2, 0x57, 0xc7, 0x67, 0x05, 0x34, 0xbe, 0xf4, 0xfc, 0xbe, 0xc6, 0xf1, 0xbf, 0xa7, 0xd6, 0xba, 0xa3, 0x7c, 0x46, 0xe3, 0xe6, 0x7e, 0xa8, 0x6a, 0x4b, 0x04, + 0x67, 0x34, 0xb4, 0x9c, 0x02, 0xd5, 0xe6, 0x64, 0x24, 0x84, 0xcd, 0xe5, 0x04, 0x99, 0x61, 0x8e, 0x4c, 0xb8, 0xaa, 0xd2, 0x75, 0x85, 0xbe, 0x09, 0xf7, 0x72, 0xb0, 0xed, 0x85, 0xa3, 0xa1, 0x4d, + 0x78, 0xb5, 0xa1, 0xc9, 0x36, 0xc9, 0xe4, 0xf9, 0x69, 0x7d, 0x74, 0x4a, 0x6d, 0x9b, 0xc7, 0x15, 0xbe, 0xdf, 0xac, 0xb5, 0x6c, 0xee, 0x59, 0xbd, 0xa9, 0x39, 0xd8, 0x6e, 0x1d, 0x05, 0xbe, 0x3f, + 0x1a, 0x52, 0x3c, 0xf4, 0xb1, 0xd7, 0xd7, 0xdd, 0x52, 0x7a, 0xea, 0xf2, 0x58, 0x85, 0x8e, 0x3b, 0xb6, 0x03, 0x33, 0xcb, 0xdc, 0xcf, 0xb2, 0xa1, 0x4f, 0xa2, 0x48, 0xc3, 0xc2, 0x74, 0x9c, 0xf2, + 0x9f, 0x1f, 0x94, 0x1f, 0xd4, 0x2b, 0x2c, 0xc8, 0x3b, 0xd5, 0x37, 0xd8, 0xdf, 0xaf, 0xc7, 0x67, 0x5a, 0xbf, 0x43, 0x0e, 0xae, 0x38, 0x00, 0x07, 0x89, 0x63, 0x7e, 0x54, 0xb6, 0x39, 0x4b, 0x2c, + 0x22, 0x01, 0x9a, 0x7b, 0x8a, 0xb5, 0xce, 0x55, 0x70, 0x64, 0xd5, 0xdb, 0xd0, 0x8e, 0x2a, 0x49, 0xd9, 0x49, 0x49, 0x00, 0x04, 0xc6, 0x29, 0x16, 0xc8, 0x55, 0x91, 0xf2, 0x1e, 0xd1, 0xe8, 0xdd, + 0x66, 0x87, 0xc8, 0x23, 0x33, 0x36, 0x70, 0x19, 0xe8, 0x20, 0xd2, 0x48, 0xf6, 0x0a, 0x4b, 0xeb, 0xfb, 0x50, 0x57, 0x37, 0x22, 0xf2, 0x4d, 0xda, 0x09, 0xab, 0xb1, 0x59, 0xfa, 0xcd, 0xd7, 0x82, + 0x41, 0x5f, 0xa7, 0xdd, 0x0b, 0x7b, 0xcd, 0x0d, 0xe1, 0x4b, 0x71, 0xe5, 0x8f, 0xdb, 0xf3, 0xa4, 0x1b, 0xb0, 0xe7, 0x1c, 0x37, 0x01, 0x28, 0xa7, 0x35, 0x29, 0x30, 0x38, 0x56, 0x09, 0x7d, 0x7b, + 0x52, 0xd3, 0x9d, 0xcf, 0x41, 0x75, 0x8f, 0xa4, 0xab, 0x03, 0x81, 0x26, 0x8b, 0x09, 0x98, 0xae, 0xc9, 0xb5, 0x6e, 0xd8, 0x39, 0xd7, 0xaf, 0xc4, 0x7e, 0x16, 0xe0, 0x6c, 0x5a, 0xea, 0x29, 0xe2, + 0x40, 0x64, 0x8c, 0x83, 0x19, 0xeb, 0x96, 0x53, 0x72, 0x42, 0xad, 0x52, 0x32, 0xd6, 0x1b, 0x92, 0xe8, 0x3d, 0x65, 0x9e, 0xad, 0xbf, 0xe9, 0x53, 0xc3, 0x77, 0xe5, 0xfe, 0xbf, 0xdd, 0xfd, 0x0b, + 0xd5, 0x4b, 0xdf, 0x2f, 0xd7, 0x43, 0x3b, 0xde, 0xd3, 0xd4, 0xb4, 0x6c, 0x78, 0x33, 0x8d, 0x4e, 0x29, 0x09, 0x85, 0xf0, 0xd2, 0x40, 0x54, 0x3e, 0xc3, 0xd0, 0xcd, 0x6a, 0x51, 0x49, 0x7d, 0xb5, + 0x74, 0x73, 0xfc, 0xd8, 0x0a, 0x08, 0xbb, 0x5c, 0xa2, 0xd3, 0x49, 0x25, 0x09, 0x34, 0x1e, 0xca, 0x4d, 0x5d, 0xc0, 0xdb, 0x9c, 0x20, 0x44, 0x6f, 0x2a, 0x34, 0xf9, 0xb1, 0x2a, 0x2a, 0x2e, 0xe8, + 0xcd, 0x4d, 0x2e, 0x42, 0xfd, 0x69, 0xca, 0x04, 0x73, 0x71, 0x40, 0x3c, 0xfb, 0xbd, 0x39, 0xe5, 0x47, 0x27, 0xe1, 0x73, 0x9f, 0x32, 0xb3, 0x3c, 0x8d, 0x7f, 0x88, 0xce, 0x78, 0x91, 0xc5, 0xba, + 0x23, 0xfd, 0x8e, 0xdf, 0x47, 0xc3, 0x10, 0x46, 0xeb, 0x0d, 0x44, 0x83, 0x67, 0x64, 0xdd, 0xad, 0xf0, 0x62, 0x76, 0x72, 0x4e, 0xcd, 0x22, 0x74, 0x2a, 0x97, 0x10, 0x2b, 0xf6, 0x58, 0x5b, 0x1c, + 0xb1, 0xd3, 0x5c, 0x95, 0xc9, 0x7b, 0x5f, 0x06, 0x7c, 0xa2, 0x74, 0xc0, 0xa3, 0x1a, 0xa6, 0xba, 0x90, 0xb4, 0x86, 0xcc, 0x00, 0x2b, 0x98, 0xf7, 0x8d, 0x6d, 0xb4, 0x3b, 0x11, 0x30, 0xc6, 0x79, + 0x6e, 0xb2, 0x76, 0x35, 0x9b, 0xe1, 0x29, 0x22, 0x4d, 0x6b, 0x79, 0xb1, 0x7f, 0x8d, 0xb7, 0xbd, 0x7e, 0xfd, 0x39, 0x93, 0xed, 0x1b, 0x36, 0x17, 0x74, 0xe1, 0x1f, 0xb8, 0xd7, 0x6a, 0x6c, 0xe5, + 0x79, 0xe2, 0x9a, 0xd9, 0x67, 0x55, 0xe4, 0xc7, 0x73, 0xf3, 0x15, 0xaf, 0xc7, 0x6f, 0xd4, 0xaf, 0x18, 0xdf, 0xb5, 0x9d, 0x9d, 0xe1, 0x07, 0x58, 0xba, 0xfc, 0x99, 0x6e, 0xae, 0xd8, 0x65, 0x9a, + 0x45, 0xa8, 0xb9, 0x3b, 0x9e, 0x22, 0x5c, 0x67, 0x4f, 0x7b, 0xad, 0x70, 0x24, 0xb3, 0xab, 0xb5, 0x35, 0xab, 0x62, 0xb6, 0x35, 0x72, 0xfb, 0x7a, 0xb3, 0xb0, 0x7b, 0x0f, 0xb7, 0xa3, 0x66, 0xeb, + 0x74, 0xad, 0x8b, 0x19, 0x1c, 0xe3, 0xf9, 0xfb, 0x03, 0x8b, 0xba, 0x18, 0x31, 0xc9, 0xa0, 0x19, 0x34, 0x59, 0x79, 0xe4, 0xd4, 0x40, 0x62, 0xbd, 0x94, 0xe4, 0x83, 0x3e, 0xe0, 0x64, 0xf8, 0xc5, + 0x5d, 0xf8, 0xd7, 0xaa, 0xe7, 0xdf, 0x00, 0xbf, 0x09, 0x65, 0x7c, 0xa6, 0xfe, 0x7e, 0x69, 0x1b, 0x78, 0xa7, 0x7b, 0x01, 0xf9, 0xfd, 0xee, 0xac, 0xf4, 0x1e, 0xb0, 0x15, 0x64, 0x55, 0xd3, 0xd5, + 0x47, 0xc3, 0xe3, 0xf7, 0x38, 0x21, 0x96, 0xa7, 0x84, 0x5a, 0x4f, 0xa5, 0x51, 0x53, 0x64, 0x53, 0xd0, 0x00, 0x69, 0xbf, 0xe8, 0xb2, 0xba, 0x50, 0x48, 0x2a, 0x85, 0x58, 0x60, 0xbb, 0x9e, 0x83, + 0xbd, 0xe0, 0xf5, 0xde, 0x9a, 0xd7, 0x00, 0x6a, 0x67, 0x02, 0x38, 0x6f, 0x54, 0x11, 0x68, 0xda, 0x05, 0x13, 0x4d, 0x44, 0x70, 0x35, 0x87, 0x8e, 0x5b, 0xdc, 0x70, 0xd6, 0x09, 0x85, 0x7d, 0xb3, + 0xa3, 0xbe, 0x7d, 0xd8, 0x33, 0xce, 0x0b, 0x7e, 0xc9, 0x92, 0x74, 0xa6, 0x78, 0xed, 0x72, 0x78, 0x66, 0x32, 0x07, 0x2c, 0x59, 0xdd, 0x5b, 0x6e, 0x89, 0x32, 0x2e, 0x24, 0x1a, 0x6c, 0x0a, 0xa7, + 0x72, 0xd8, 0xf5, 0x62, 0x57, 0xb6, 0x01, 0xbd, 0xf4, 0x6c, 0xaf, 0x17, 0x04, 0xb3, 0xd3, 0x67, 0x02, 0x77, 0x92, 0xf6, 0xcb, 0x1e, 0xe4, 0xb4, 0x70, 0xe1, 0x11, 0x98, 0x48, 0x32, 0xf4, 0x66, + 0xa5, 0x38, 0x6d, 0x07, 0x97, 0xf3, 0xd1, 0x7a, 0x31, 0xad, 0xf6, 0xe8, 0xdc, 0x20, 0x6b, 0xbb, 0x44, 0x2c, 0x88, 0x5a, 0xdb, 0xc6, 0xe1, 0x59, 0x9a, 0xc6, 0xdf, 0xa6, 0x57, 0x38, 0x0e, 0x33, + 0x2f, 0x1f, 0xb0, 0x50, 0xef, 0x6b, 0x97, 0x3f, 0x3b, 0x41, 0x5e, 0x5a, 0xa5, 0x37, 0xa4, 0x2f, 0x50, 0xde, 0x34, 0x0c, 0xb5, 0x44, 0xab, 0x4a, 0x32, 0xdb, 0x62, 0x30, 0xda, 0xe5, 0x12, 0x48, + 0x9a, 0xb9, 0x31, 0xef, 0x03, 0x04, 0x30, 0x70, 0x3b, 0xa0, 0x74, 0x80, 0xd9, 0xed, 0x19, 0x56, 0x02, 0x26, 0xa6, 0x2c, 0x80, 0x4a, 0xbc, 0x3a, 0xa0, 0x35, 0xbc, 0xec, 0x60, 0x19, 0x46, 0x10, + 0xaa, 0x56, 0xf6, 0x69, 0xd7, 0x68, 0xb9, 0x4e, 0xac, 0xd7, 0x09, 0x3d, 0xb5, 0x44, 0x2e, 0x39, 0xc2, 0xe9, 0x69, 0x03, 0xac, 0xb1, 0x3e, 0x06, 0x1f, 0xb1, 0x11, 0xee, 0xb1, 0xfe, 0xc1, 0xed, + 0xfe, 0xb5, 0x8c, 0x61, 0x9f, 0x64, 0x2f, 0xfd, 0xbf, 0xde, 0x0c, 0xc9, 0x0f, 0x06, 0x8d, 0x0f, 0x5c, 0x37, 0x55, 0x21, 0x57, 0x26, 0xa7, 0xc4, 0xd6, 0x63, 0xcd, 0xa0, 0x71, 0x0f, 0x7b, 0x9b, + 0xf4, 0xfb, 0x11, 0xcf, 0x0d, 0xe0, 0xc7, 0xab, 0xb1, 0xd7, 0x24, 0x49, 0x17, 0x3a, 0x75, 0x30, 0x3e, 0x27, 0x7f, 0x28, 0xf2, 0xe7, 0x3c, 0xc2, 0xcb, 0x6b, 0xe4, 0xd1, 0x3b, 0x2e, 0x5d, 0x7d, + 0xf4, 0x64, 0xc8, 0x3a, 0x82, 0xc6, 0x39, 0xc1, 0xaf, 0xf6, 0x0c, 0x69, 0xc4, 0x3a, 0xbf, 0x73, 0x0f, 0x07, 0x4c, 0x1c, 0x11, 0x38, 0x4a, 0x21, 0x84, 0xa1, 0x92, 0xdf, 0x47, 0xcd, 0x77, 0x33, + 0xb7, 0x34, 0xeb, 0xbc, 0x1c, 0xbf, 0xfb, 0xa0, 0xfc, 0xa4, 0x84, 0x7b, 0xa9, 0x8f, 0xdf, 0x5f, 0x71, 0xe9, 0xe1, 0xf7, 0xf6, 0x8b, 0x36, 0x6e, 0xc0, 0x46, 0x11, 0x55, 0x4c, 0x74, 0xa2, 0x12, + 0xe4, 0x14, 0xee, 0x19, 0x69, 0xb4, 0xa9, 0xf6, 0x4e, 0x4a, 0x77, 0xcc, 0xc6, 0x16, 0x8f, 0xe6, 0x7e, 0xb7, 0xae, 0x8a, 0x95, 0x53, 0x24, 0x73, 0x55, 0xe3, 0xa8, 0xf6, 0x00, 0x85, 0x86, 0xcf, + 0xb9, 0xb1, 0x3b, 0x05, 0xd7, 0x10, 0x4e, 0x1c, 0xdc, 0x86, 0xc4, 0xed, 0x5e, 0x32, 0x8f, 0xae, 0x83, 0x1c, 0x00, 0xb5, 0x6f, 0x3a, 0xb0, 0xea, 0xd6, 0x60, 0x58, 0xae, 0xc9, 0x01, 0x87, 0xce, + 0x9f, 0x9f, 0x2a, 0x3f, 0x2c, 0x89, 0xd7, 0x2a, 0xe9, 0x5c, 0x69, 0x5e, 0x21, 0x7c, 0x5b, 0x0c, 0x03, 0x2b, 0xe9, 0x60, 0x0b, 0xb0, 0x5e, 0xd5, 0xf4, 0x76, 0xce, 0xa5, 0xe2, 0x61, 0x96, 0xad, + 0x69, 0x38, 0x58, 0xe0, 0x74, 0x01, 0x1f, 0xec, 0x15, 0x33, 0x77, 0x9a, 0x1c, 0xad, 0x8d, 0x86, 0xe2, 0xb7, 0x00, 0x8b, 0x0b, 0x52, 0x0b, 0xf8, 0x41, 0x70, 0x42, 0xc0, 0x1c, 0xc3, 0x1a, 0xcf, + 0xf4, 0x8e, 0x4b, 0x60, 0xed, 0xb0, 0x04, 0xb5, 0x5e, 0x57, 0xf0, 0xca, 0x2b, 0x33, 0x12, 0xdb, 0xae, 0x57, 0xa7, 0x09, 0x41, 0xab, 0xaf, 0xf9, 0xe6, 0xde, 0xed, 0x16, 0xd7, 0x50, 0xf0, 0xa7, + 0x08, 0x86, 0x59, 0x55, 0x9b, 0x49, 0xe2, 0x3a, 0xe3, 0x8b, 0x53, 0x7c, 0xf2, 0x4c, 0xa1, 0x07, 0xde, 0xe5, 0x35, 0xfb, 0x03, 0x3c, 0xbf, 0xbf, 0xe1, 0x82, 0xee, 0xf7, 0xf6, 0x73, 0x92, 0x86, + 0x01, 0x9b, 0x6e, 0x67, 0x90, 0x47, 0x28, 0xaa, 0x08, 0xce, 0x04, 0x63, 0xd7, 0xde, 0x00, 0x53, 0x96, 0x07, 0x90, 0x09, 0x1d, 0x4f, 0xd2, 0x26, 0xda, 0x13, 0xbb, 0x4d, 0x2b, 0xc5, 0x78, 0xd3, + 0x20, 0xf3, 0xe4, 0x04, 0xf0, 0x31, 0x8a, 0x16, 0x27, 0xa5, 0x49, 0xa4, 0x22, 0x63, 0x17, 0x28, 0x2e, 0xf2, 0x11, 0xbb, 0xd8, 0x4f, 0x0a, 0x4e, 0xc8, 0x34, 0x54, 0x0a, 0x74, 0x44, 0xd9, 0x65, + 0xcc, 0x54, 0x84, 0x7b, 0xec, 0x35, 0xac, 0xef, 0xe3, 0x3d, 0xde, 0x53, 0x80, 0xff, 0x3f, 0x77, 0x83, 0x71, 0x09, 0xc7, 0xc9, 0xde, 0x04, 0xe6, 0xbf, 0xff, 0xdf, 0x0f, 0x6f, 0xe8, 0x67, 0x03, + 0x92, 0xb9, 0xbe, 0x59, 0x87, 0xad, 0x3b, 0xee, 0xdd, 0x32, 0xff, 0x61, 0x43, 0x7c, 0x69, 0x2c, 0xee, 0x88, 0x5f, 0x86, 0xe1, 0xae, 0xe9, 0xbc, 0x05, 0x0e, 0x18, 0x01, 0xe7, 0xb0, 0x6c, 0xcd, + 0x72, 0x6d, 0x76, 0xfb, 0x6a, 0x6e, 0x09, 0x33, 0x77, 0xb9, 0x23, 0xfa, 0x49, 0x4f, 0x72, 0xf5, 0x92, 0xb2, 0x1d, 0x98, 0xd4, 0x1b, 0xaf, 0x69, 0xe6, 0x7d, 0x00, 0x2e, 0xc8, 0x42, 0x60, 0xa3, + 0x25, 0x9f, 0xe9, 0x20, 0x39, 0x6b, 0x89, 0x4a, 0xdf, 0xc3, 0xcd, 0x1c, 0x53, 0x0b, 0x49, 0xec, 0x42, 0x77, 0xe2, 0x8a, 0xcc, 0x91, 0xd1, 0x27, 0xbb, 0x9d, 0xd7, 0x10, 0x86, 0xa1, 0x3e, 0x92, + 0x1d, 0xb3, 0xe2, 0x79, 0x98, 0xe4, 0x8b, 0x87, 0x42, 0x56, 0xa4, 0xd7, 0x9e, 0x17, 0xe9, 0x50, 0xd7, 0x2b, 0x0a, 0x67, 0xa6, 0x9c, 0x17, 0x50, 0xc7, 0x7a, 0x36, 0x4b, 0x36, 0xa7, 0x44, 0xd8, + 0xec, 0x83, 0x3e, 0xaa, 0x4e, 0x31, 0x5b, 0xf1, 0x4b, 0x03, 0x22, 0x27, 0x4a, 0x61, 0xee, 0x7a, 0xe9, 0x44, 0x97, 0xa8, 0x2e, 0x6f, 0x6d, 0x2d, 0x52, 0xdb, 0xde, 0x64, 0xcd, 0xd3, 0x6c, 0xc2, + 0x28, 0x70, 0xae, 0x02, 0xc8, 0xaa, 0x48, 0xa2, 0x80, 0x55, 0xa3, 0x5a, 0x91, 0x85, 0x70, 0xd6, 0x85, 0xe0, 0x1c, 0x0c, 0x07, 0x19, 0x71, 0xaa, 0x71, 0xd6, 0xa4, 0xd6, 0xd3, 0xb2, 0xae, 0xc4, + 0xcb, 0x28, 0x9c, 0xa9, 0x5e, 0x81, 0x38, 0x5f, 0x9f, 0x93, 0x6f, 0x0d, 0xc0, 0x02, 0x85, 0xa6, 0xa1, 0x17, 0xfb, 0xb8, 0x4b, 0x6e, 0x4f, 0x89, 0x52, 0x38, 0xf5, 0xb6, 0x70, 0xd7, 0x1a, 0x7f, + 0x68, 0x15, 0x9a, 0xd1, 0xfa, 0x6d, 0x5d, 0xb3, 0x2d, 0x23, 0xcf, 0x08, 0x14, 0x1a, 0x15, 0x99, 0x41, 0x4e, 0x84, 0x16, 0x04, 0x41, 0x94, 0x97, 0xd7, 0x28, 0x22, 0xad, 0x36, 0xb3, 0x64, 0x45, + 0xd9, 0x8b, 0x56, 0x28, 0x70, 0xc1, 0xd8, 0x19, 0x2a, 0x9d, 0x58, 0x8b, 0xbd, 0x7e, 0x3c, 0x66, 0x7f, 0x84, 0xc5, 0xef, 0xfc, 0x20, 0xf1, 0x3a, 0x24, 0x77, 0x1c, 0xe1, 0x5d, 0xd3, 0xf9, 0xfc, + 0x24, 0x7e, 0x07, 0x28, 0x86, 0x54, 0x90, 0x93, 0xfb, 0x35, 0x9f, 0x13, 0x46, 0xa2, 0x73, 0x5e, 0x2f, 0x37, 0x30, 0x22, 0x06, 0x38, 0x1f, 0x72, 0x73, 0xb3, 0xf2, 0x0b, 0x8b, 0xda, 0x13, 0xb8, + 0x7b, 0xf0, 0xe6, 0xc6, 0xe4, 0xd0, 0xb1, 0x28, 0xaa, 0x72, 0xe8, 0x6a, 0x4b, 0xb7, 0xb4, 0xce, 0x19, 0x90, 0xa3, 0xac, 0x29, 0xa3, 0x9f, 0x06, 0x5b, 0x9a, 0x52, 0x02, 0xd6, 0x5b, 0xc7, 0x32, + 0x5a, 0x38, 0x3b, 0x2c, 0x2e, 0x87, 0xf8, 0x6f, 0xfc, 0xf1, 0xf1, 0xf9, 0xb3, 0x7b, 0xcc, 0x4b, 0xf3, 0xea, 0xe2, 0x07, 0x13, 0x7e, 0x3a, 0xbc, 0x0c, 0x98, 0x51, 0x4e, 0x79, 0x98, 0x2d, 0x10, + 0xdb, 0xb2, 0xfb, 0xe3, 0x91, 0x59, 0xca, 0xb9, 0xb8, 0xb7, 0xc5, 0xa8, 0x76, 0x0a, 0x68, 0x09, 0x24, 0xa7, 0x02, 0x4a, 0x85, 0x0c, 0x3c, 0x9a, 0x7d, 0x26, 0x57, 0xe4, 0x28, 0x6d, 0xe8, 0xc0, + 0x97, 0xec, 0x32, 0xb3, 0xaa, 0x22, 0x3f, 0x62, 0x7b, 0xcc, 0x13, 0x3b, 0x90, 0xcd, 0xf8, 0xcc, 0xf2, 0x66, 0x7d, 0x9b, 0x31, 0x3c, 0x53, 0x1f, 0x66, 0xcc, 0x92, 0xc9, 0xc9, 0x41, 0x6a, 0xe1, + 0xaf, 0x9b, 0xf3, 0x23, 0x28, 0x5e, 0x4b, 0x4a, 0x7c, 0x4f, 0xfa, 0x02, 0xc9, 0x4d, 0xc3, 0xd0, 0xd4, 0xc4, 0x00, 0xac, 0x2e, 0x36, 0x8a, 0x9f, 0xd6, 0x87, 0x2e, 0x87, 0xe2, 0xfa, 0x48, 0x0a, + 0x33, 0x36, 0x6a, 0x36, 0x9d, 0xb1, 0x4b, 0xd9, 0x40, 0x1c, 0xf9, 0x11, 0xe8, 0x51, 0x08, 0x13, 0x07, 0x6b, 0x1a, 0x93, 0xfd, 0x1d, 0x25, 0x1b, 0x6e, 0xbb, 0xd3, 0xf5, 0x84, 0x8b, 0x15, 0xbc, + 0x77, 0x37, 0x36, 0xae, 0xc2, 0xbb, 0x42, 0x74, 0x24, 0x9d, 0xeb, 0x58, 0x97, 0xd2, 0xa7, 0xe8, 0x6c, 0xc7, 0xd0, 0xda, 0xc0, 0xc5, 0xf6, 0x5e, 0x25, 0xfd, 0xd9, 0x22, 0xfb, 0xf3, 0x9c, 0x42, + 0xef, 0x44, 0x2f, 0x70, 0x5c, 0xf2, 0xe6, 0x41, 0xbf, 0x67, 0x15, 0x3a, 0xdb, 0x52, 0x93, 0xd5, 0x0e, 0x22, 0x14, 0xe1, 0x80, 0xa2, 0x79, 0xd7, 0x62, 0x13, 0x49, 0x46, 0xa6, 0x07, 0xd0, 0x92, + 0x36, 0x8c, 0x45, 0x8e, 0xe2, 0x39, 0xa2, 0xae, 0x0c, 0xd8, 0x0b, 0x0d, 0x41, 0xdc, 0xd5, 0x7d, 0xad, 0x33, 0x58, 0x08, 0x4e, 0xfb, 0xa9, 0x71, 0x9c, 0xcf, 0x3a, 0x11, 0x23, 0x0f, 0x13, 0x71, + 0x57, 0x1f, 0x1d, 0x5a, 0xd6, 0x44, 0x40, 0xc3, 0xa4, 0x30, 0x83, 0xba, 0x68, 0x7a, 0x98, 0xeb, 0xaf, 0x45, 0x7e, 0xdc, 0xab, 0xc4, 0x9f, 0xad, 0xad, 0x2a, 0x30, 0x4b, 0xd7, 0x19, 0x5f, 0x02, + 0xa5, 0xac, 0xc6, 0xf3, 0x9e, 0xee, 0xe1, 0x2f, 0x0b, 0xb0, 0x0f, 0x5e, 0x71, 0x41, 0xf6, 0xc1, 0x83, 0xa1, 0x02, 0x6d, 0x75, 0x10, 0x60, 0x75, 0xd6, 0x40, 0x00, 0x78, 0xc2, 0x9b, 0x76, 0x7f, + 0x52, 0xea, 0xa9, 0xd8, 0x9f, 0x82, 0x49, 0x34, 0x55, 0x12, 0xd6, 0x76, 0xe7, 0x39, 0xbf, 0x5a, 0xee, 0xc8, 0x1d, 0xc5, 0xa8, 0x94, 0xdd, 0x86, 0x36, 0x20, 0x39, 0x95, 0x01, 0xc6, 0x8c, 0x4a, + 0x21, 0x2c, 0x73, 0x42, 0x38, 0x95, 0x99, 0x1b, 0x5c, 0xc8, 0x02, 0x48, 0x37, 0x9a, 0xb0, 0x80, 0x2a, 0x59, 0x1b, 0x56, 0x70, 0x82, 0x01, 0xbc, 0xff, 0x23, 0x85, 0xd3, 0x53, 0x68, 0xcf, 0x5b, + 0xdc, 0xbf, 0xbd, 0xfd, 0x5f, 0xa8, 0x5e, 0x01, 0xbc, 0xa4, 0x6f, 0x1f, 0xb8, 0xe1, 0xd7, 0x0c, 0xac, 0xee, 0xfb, 0xb0, 0x8d, 0x5c, 0x3c, 0xf7, 0x36, 0x3b, 0x22, 0x81, 0x11, 0x3b, 0x9a, 0x89, + 0xbc, 0x09, 0x52, 0xbe, 0x45, 0x1c, 0x93, 0xc9, 0x61, 0x81, 0x47, 0x0b, 0xcc, 0x8d, 0xf0, 0x66, 0xa3, 0x21, 0xf0, 0x36, 0xd9, 0x6d, 0x10, 0x61, 0xb5, 0x09, 0xfd, 0xda, 0x5c, 0xb8, 0xac, 0xd0, + 0x50, 0x5e, 0x1e, 0xd8, 0xb6, 0xac, 0xb7, 0x5c, 0x68, 0xf0, 0x9e, 0x28, 0x66, 0xa2, 0xae, 0xd6, 0x03, 0x15, 0xca, 0x7f, 0xb6, 0xe1, 0x5f, 0x9c, 0x77, 0x7f, 0x40, 0xee, 0x05, 0x03, 0xd8, 0x3b, + 0xd5, 0x2b, 0x72, 0x97, 0xcc, 0x08, 0x43, 0x0d, 0x5f, 0x5d, 0x18, 0x05, 0xa6, 0xac, 0xf8, 0x87, 0x36, 0x48, 0x01, 0xd0, 0x70, 0x26, 0xf6, 0x5e, 0x30, 0x6a, 0x2a, 0xd1, 0x9d, 0xd5, 0xbc, 0xb0, + 0xe5, 0xd9, 0x16, 0x53, 0xd7, 0x6a, 0xa3, 0xef, 0x37, 0xf9, 0x96, 0xa0, 0x50, 0x55, 0x10, 0x1d, 0x75, 0xe4, 0x17, 0x5b, 0x5c, 0xee, 0x73, 0xc2, 0x42, 0x35, 0x98, 0x55, 0x13, 0x20, 0x2f, 0xf0, + 0xc5, 0x41, 0x27, 0x29, 0x74, 0x62, 0x74, 0x2d, 0xe5, 0x99, 0x03, 0x8f, 0xca, 0x81, 0xf9, 0x3a, 0xc2, 0xea, 0x9c, 0x56, 0xeb, 0xba, 0x9a, 0x7e, 0xd0, 0x14, 0xbf, 0x60, 0x3f, 0xbd, 0x23, 0x7d, + 0xc1, 0xef, 0xa6, 0xe1, 0xac, 0x23, 0x1e, 0x60, 0x55, 0x65, 0x0f, 0x2c, 0x0a, 0x6d, 0x05, 0xe3, 0x00, 0x7b, 0x7e, 0xbd, 0xd8, 0x92, 0x3b, 0x56, 0x9b, 0x6b, 0xcb, 0x80, 0xd6, 0x16, 0x8d, 0x8e, + 0x4c, 0xb2, 0x0d, 0x22, 0x21, 0xf8, 0x8a, 0x5c, 0xae, 0xf6, 0xea, 0x51, 0x39, 0xca, 0x7e, 0x0c, 0x38, 0x23, 0x42, 0x88, 0xd2, 0x6e, 0x01, 0xb7, 0x39, 0x9c, 0xea, 0xe9, 0x7e, 0x45, 0xaa, 0xba, + 0xb1, 0x6a, 0xc0, 0x03, 0x4b, 0x5a, 0xda, 0x06, 0xf3, 0x99, 0xb0, 0x8a, 0x06, 0x2c, 0x59, 0xb3, 0x35, 0xc3, 0x8b, 0xb6, 0xf5, 0xe6, 0xa3, 0x3f, 0xf1, 0xbc, 0x2b, 0xe7, 0xf5, 0x8b, 0x3e, 0xd9, + 0x3d, 0x27, 0x2b, 0x38, 0x67, 0x35, 0xbf, 0xfe, 0x00, 0x22, 0xef, 0x09, 0x7c, 0xa6, 0xb8, 0xbb, 0x08, 0x59, 0x77, 0x0f, 0xff, 0x7c, 0x21, 0x9c, 0xbf, 0xf8, 0xe7, 0x11, 0x7d, 0x91, 0x01, 0xfa, + 0xa4, 0x7c, 0x33, 0xa0, 0xef, 0xe3, 0xf9, 0x2b, 0x3b, 0x04, 0x8d, 0x31, 0x36, 0xe3, 0xa6, 0xf3, 0xc8, 0x9b, 0xd1, 0x95, 0x8c, 0x38, 0x45, 0x21, 0x6d, 0x12, 0x9f, 0xf1, 0x7a, 0x53, 0x29, 0x86, + 0xf8, 0x7b, 0x54, 0xe3, 0xce, 0x35, 0xe3, 0xd2, 0x7d, 0x5e, 0x1d, 0xe8, 0xc5, 0xb3, 0xe6, 0x4a, 0xf6, 0xd2, 0xa7, 0xeb, 0xcd, 0xd0, 0x33, 0xe5, 0x60, 0xd7, 0x55, 0xb3, 0x36, 0x52, 0x4e, 0x02, + 0x47, 0xad, 0xa2, 0xf0, 0x5e, 0xae, 0xb5, 0xa7, 0xb9, 0x0b, 0x8f, 0x16, 0x0a, 0xd3, 0x66, 0xa9, 0x01, 0xbb, 0xfd, 0xb6, 0x29, 0x20, 0x85, 0xae, 0x5c, 0x6a, 0x54, 0x77, 0xd3, 0xa9, 0x1b, 0x9a, + 0x09, 0xce, 0x30, 0x21, 0x22, 0xd8, 0xf0, 0x6a, 0x6e, 0x7b, 0xf8, 0xe8, 0xd0, 0xc3, 0x73, 0x7a, 0x93, 0x45, 0xfb, 0x2a, 0x26, 0x8f, 0xc1, 0x4a, 0x31, 0x37, 0x03, 0x56, 0xf9, 0x9f, 0x9c, 0x29, + 0xe7, 0x58, 0x82, 0x8b, 0x34, 0xff, 0x83, 0x02, 0xe4, 0xa5, 0x19, 0x71, 0x43, 0xfa, 0x02, 0xdf, 0x4d, 0xc3, 0x59, 0xe5, 0x31, 0x80, 0x45, 0xd6, 0x22, 0xc5, 0xb5, 0x80, 0x84, 0x4d, 0xe3, 0xfc, + 0xe4, 0x90, 0xe5, 0x69, 0xa3, 0x71, 0xab, 0x56, 0x9c, 0x66, 0xe8, 0x0c, 0x8a, 0x73, 0xfe, 0xa0, 0x8f, 0xda, 0xc3, 0x29, 0x8a, 0x54, 0xcf, 0x46, 0x8e, 0xa7, 0x55, 0xbd, 0x41, 0x1d, 0x5d, 0x3c, + 0xf2, 0x28, 0x5a, 0x19, 0x65, 0x76, 0x90, 0x94, 0x5e, 0x71, 0x2a, 0xe4, 0x78, 0x12, 0x4b, 0x75, 0xbb, 0xde, 0x4e, 0xa9, 0xb5, 0x36, 0xd5, 0xfc, 0x75, 0xe6, 0x0f, 0x63, 0x91, 0xff, 0x6f, 0xac, + 0x92, 0xcf, 0xf5, 0xf1, 0x07, 0x2b, 0xa3, 0xc1, 0x04, 0x47, 0x99, 0xfb, 0x55, 0x13, 0x98, 0x3c, 0x9d, 0x0b, 0x4b, 0x0d, 0xd7, 0x56, 0x1b, 0xdf, 0x56, 0xb6, 0x47, 0x66, 0x48, 0x3f, 0xdc, 0xe3, + 0x33, 0x0e, 0xff, 0x55, 0x61, 0xc7, 0x3d, 0x5e, 0x18, 0x7b, 0xf7, 0xe8, 0x0e, 0x11, 0x75, 0xa0, 0x31, 0xbe, 0x69, 0x7b, 0x47, 0x38, 0x6a, 0x16, 0x10, 0xaa, 0x6e, 0x30, 0xb3, 0xab, 0xb9, 0x5d, + 0xeb, 0x3d, 0x59, 0x8d, 0x82, 0xc9, 0xef, 0x3d, 0x88, 0xde, 0xf6, 0xb8, 0xd8, 0xcd, 0x9e, 0xfb, 0xd8, 0xbf, 0xd2, 0x8b, 0x0f, 0xaa, 0x97, 0xfa, 0x7b, 0x97, 0xeb, 0xa1, 0x6a, 0x11, 0xd9, 0x59, + 0xaa, 0x5e, 0x62, 0x33, 0x88, 0xad, 0xf6, 0xab, 0x90, 0x3f, 0x48, 0x7e, 0x35, 0x6d, 0x40, 0x7c, 0xbe, 0x69, 0x28, 0xd5, 0xe1, 0x96, 0x22, 0x68, 0xb9, 0xba, 0xb5, 0x09, 0x58, 0x01, 0x8d, 0x71, + 0xb3, 0xf0, 0x97, 0x75, 0xe8, 0xd9, 0xf9, 0xb4, 0xde, 0x52, 0x96, 0x7d, 0x14, 0x0b, 0x9d, 0xae, 0x8b, 0x19, 0x1c, 0x4f, 0x79, 0x5c, 0xb1, 0x7a, 0x1f, 0x9d, 0x9a, 0x4d, 0xb5, 0x03, 0x36, 0xab, + 0x21, 0xde, 0xf4, 0xdf, 0xeb, 0x11, 0xde, 0x4b, 0x6c, 0xd0, 0x2b, 0x45, 0x43, 0xbe, 0x17, 0x22, 0xbc, 0x10, 0xfa, 0x1d, 0x87, 0x3c, 0xe6, 0x59, 0x42, 0xdc, 0xef, 0x97, 0x84, 0x5e, 0x0a, 0x94, + 0x18, 0x23, 0x80, 0xb2, 0x2f, 0xb3, 0x06, 0x0d, 0xf7, 0xd4, 0x49, 0x8c, 0x47, 0x30, 0x96, 0x1d, 0xf6, 0x68, 0x98, 0x2a, 0x70, 0x56, 0x34, 0xed, 0x56, 0x9f, 0xa5, 0x39, 0x20, 0x31, 0x46, 0x7e, + 0xe8, 0x8c, 0x58, 0x37, 0xb9, 0x59, 0x8c, 0x44, 0x5a, 0x4b, 0x8b, 0x5b, 0x91, 0x63, 0x7c, 0x26, 0x30, 0xd7, 0xe2, 0x29, 0xa3, 0x15, 0xea, 0x35, 0x85, 0xe4, 0x5d, 0x41, 0x42, 0xe8, 0x6b, 0xa1, + 0x8b, 0xcf, 0xe2, 0xf3, 0x3f, 0xba, 0x77, 0x9e, 0xcb, 0x5d, 0xfc, 0x28, 0xb3, 0x20, 0x2f, 0x4e, 0xb6, 0x0f, 0xba, 0x67, 0x94, 0x3f, 0xee, 0xce, 0xe2, 0xf0, 0xaf, 0xcb, 0x67, 0x77, 0x24, 0x31, + 0xb7, 0x3d, 0x42, 0x50, 0xe6, 0x52, 0xf8, 0xba, 0x27, 0x67, 0xb1, 0x17, 0x8c, 0xcc, 0x8d, 0x71, 0x58, 0xfa, 0x43, 0xa6, 0x4c, 0x9e, 0x8d, 0x2b, 0x3b, 0x70, 0x53, 0x73, 0xfc, 0x4b, 0x8d, 0x65, + 0xf0, 0x9f, 0xd7, 0xa6, 0xcf, 0xf7, 0x17, 0xbc, 0xf7, 0xf2, 0x4b, 0xf3, 0xf8, 0xfc, 0x86, 0xdf, 0xe7, 0xd5, 0xd1, 0xb2, 0xa6, 0x2c, 0xe6, 0x4c, 0x75, 0x15, 0xdb, 0x92, 0x6b, 0x9b, 0x09, 0x82, + 0x26, 0x20, 0xd8, 0x25, 0x49, 0xb2, 0xfb, 0x66, 0x87, 0x1c, 0x2a, 0x0e, 0xd1, 0xc1, 0x5e, 0x34, 0xe6, 0x2b, 0xcf, 0x60, 0x58, 0xbb, 0xd8, 0x85, 0xac, 0x0a, 0x2c, 0x8f, 0x7d, 0x8c, 0xc3, 0x14, + 0x5d, 0x56, 0xa6, 0x05, 0xa4, 0x7c, 0xc8, 0x4a, 0x75, 0x48, 0x75, 0xfc, 0x66, 0x44, 0xa2, 0x98, 0xbc, 0x71, 0xff, 0x3f, 0xf6, 0xde, 0xa3, 0xc7, 0x55, 0x67, 0xeb, 0x17, 0x9e, 0xdf, 0x4f, 0xb1, + 0xb5, 0xa7, 0xc8, 0x9b, 0x1c, 0xfc, 0xcc, 0x8c, 0xc1, 0x09, 0x93, 0x1c, 0x30, 0x30, 0x38, 0xaf, 0xc8, 0x39, 0x67, 0x4b, 0xf7, 0x7c, 0xf6, 0x57, 0xb6, 0x3b, 0x77, 0xbb, 0x9b, 0xed, 0xf3, 0x7f, + 0xa4, 0x3b, 0x38, 0x93, 0x6e, 0x0a, 0xf0, 0x82, 0xfa, 0x55, 0x51, 0xb5, 0xf2, 0x42, 0x95, 0x4f, 0xd6, 0xc5, 0xaf, 0x8b, 0x99, 0x75, 0x41, 0xed, 0x67, 0xcd, 0xad, 0x4e, 0xcc, 0xfd, 0xfa, 0x3c, + 0xf0, 0x43, 0x56, 0x96, 0x51, 0x4f, 0x7c, 0xc1, 0xee, 0x87, 0xfb, 0xc6, 0x39, 0x99, 0xa7, 0xa6, 0x03, 0xc7, 0x1b, 0xa3, 0x96, 0xce, 0x67, 0x80, 0xea, 0x72, 0x78, 0x31, 0x87, 0xea, 0xa8, 0x2b, + 0xd5, 0x4d, 0x3c, 0x62, 0xf3, 0x88, 0x9c, 0xa1, 0xbd, 0xbf, 0xd6, 0x3c, 0xf0, 0x21, 0x5c, 0x08, 0x82, 0x93, 0xeb, 0xbf, 0x6b, 0x8a, 0xee, 0x11, 0x6b, 0xed, 0x74, 0x88, 0x36, 0x20, 0x46, 0xec, + 0x05, 0x70, 0xca, 0x49, 0x3c, 0x58, 0x05, 0x96, 0x7f, 0x96, 0x49, 0xb1, 0x55, 0x87, 0x25, 0xa3, 0x71, 0xcb, 0x83, 0xc1, 0xc4, 0x1c, 0xbf, 0x9c, 0xcf, 0x62, 0x0f, 0x39, 0x72, 0x14, 0xb7, 0x1b, + 0xb0, 0xd0, 0x84, 0x6c, 0xaa, 0x5a, 0x58, 0x00, 0x74, 0xa8, 0x21, 0x4d, 0x4b, 0x0f, 0x7e, 0x41, 0xa9, 0xc8, 0x4e, 0xf7, 0xe6, 0x1e, 0x89, 0xed, 0xa4, 0xde, 0xb3, 0x94, 0xc7, 0x12, 0x38, 0xbd, + 0x5f, 0x1e, 0x7e, 0x7f, 0x93, 0x84, 0x21, 0x36, 0x6a, 0xa7, 0xaa, 0x27, 0xaf, 0x78, 0x7d, 0x05, 0x21, 0xfe, 0x10, 0x84, 0xef, 0x49, 0x83, 0x93, 0x0f, 0x27, 0xae, 0x59, 0x56, 0x46, 0xc0, 0xda, + 0x39, 0x07, 0xa0, 0x84, 0xa2, 0x43, 0xb4, 0x93, 0xed, 0xb9, 0xad, 0xcd, 0x85, 0x3a, 0xe2, 0xbb, 0x93, 0x2a, 0x1f, 0x78, 0xb6, 0xea, 0xb8, 0x72, 0x41, 0x47, 0x09, 0x66, 0x45, 0xb2, 0xc8, 0x2b, + 0xbe, 0x5f, 0xf8, 0x6b, 0x7e, 0x0d, 0x1f, 0x0f, 0x88, 0xcf, 0x87, 0x00, 0x1c, 0x04, 0xde, 0xda, 0xf7, 0xf6, 0x7a, 0x82, 0x7b, 0x87, 0xa4, 0xdc, 0xa9, 0xb4, 0x90, 0x2d, 0x8f, 0x9e, 0x71, 0xd0, + 0xe0, 0xfe, 0x31, 0x58, 0x73, 0xc3, 0x8a, 0x0c, 0xef, 0x56, 0x6c, 0xe8, 0xba, 0x42, 0x13, 0xf7, 0xcb, 0x12, 0xc4, 0x4e, 0x7b, 0x0f, 0xce, 0xc7, 0x56, 0xaf, 0x0b, 0xc1, 0x0b, 0x88, 0x4e, 0x9b, + 0x8e, 0x5d, 0x9d, 0x00, 0xf3, 0x80, 0x34, 0x2b, 0x8c, 0xc5, 0xb7, 0x4b, 0x96, 0xf4, 0xc1, 0x14, 0x75, 0x5a, 0x6b, 0x0f, 0x56, 0x72, 0xbc, 0x51, 0xe7, 0xf9, 0x3a, 0x27, 0x86, 0x84, 0x12, 0x4f, + 0x1b, 0xdc, 0x51, 0x08, 0x80, 0x20, 0x99, 0xaa, 0x88, 0xc1, 0xad, 0x61, 0x1c, 0xc8, 0x62, 0x43, 0xcf, 0x6a, 0xa4, 0x3c, 0xbb, 0x99, 0x01, 0xe2, 0x32, 0xbd, 0xa4, 0xfd, 0x9e, 0x09, 0x7a, 0xd8, + 0xe6, 0x6b, 0x24, 0x92, 0xef, 0xed, 0xfe, 0x3f, 0x41, 0x57, 0x3a, 0x71, 0x63, 0x3b, 0x93, 0x17, 0x71, 0x1e, 0x79, 0x6f, 0x85, 0xbb, 0xa6, 0xa2, 0xb2, 0x7c, 0xc7, 0xba, 0x96, 0xb7, 0xfc, 0xf7, + 0x2d, 0xc5, 0xf6, 0xd7, 0xc0, 0x7e, 0xae, 0x35, 0xf5, 0x35, 0xb3, 0x45, 0x3e, 0x32, 0x67, 0x3f, 0x10, 0xbf, 0x00, 0xfe, 0xe1, 0xd4, 0xe4, 0x4a, 0xf9, 0x67, 0xf0, 0xb7, 0x07, 0x83, 0xd2, 0xf4, + 0x1c, 0xe5, 0x90, 0xd9, 0x31, 0x2f, 0x8e, 0x69, 0xd7, 0x71, 0x46, 0x98, 0xad, 0x57, 0x56, 0xc5, 0x89, 0x74, 0x7a, 0xee, 0x36, 0x82, 0xbc, 0x2f, 0x23, 0xb2, 0x49, 0xcf, 0x81, 0xd4, 0x65, 0xc4, + 0x3c, 0x14, 0xb5, 0x70, 0x10, 0xa1, 0xc5, 0xb4, 0x73, 0xa3, 0x7e, 0xd1, 0x4a, 0x40, 0x4a, 0x57, 0xf3, 0xa5, 0x83, 0x3a, 0xbc, 0x94, 0x3a, 0xb6, 0xe2, 0xad, 0xd7, 0x9e, 0x3d, 0x1b, 0x11, 0xba, + 0xf6, 0x5c, 0x2b, 0xf1, 0x53, 0xa5, 0x70, 0x2b, 0xcb, 0xa2, 0xe0, 0xb9, 0x9c, 0xc6, 0x87, 0xa8, 0xb6, 0x51, 0x45, 0xc2, 0x2a, 0xa7, 0x9e, 0xdc, 0x88, 0x3c, 0xc5, 0x2e, 0xfe, 0xbe, 0xc9, 0xfa, + 0xd8, 0x5f, 0x16, 0xed, 0x0e, 0xdb, 0x77, 0x27, 0xde, 0x8f, 0x1b, 0xf5, 0x87, 0x7a, 0x30, 0xb3, 0x99, 0x11, 0x5e, 0x56, 0x6c, 0x23, 0x6c, 0x27, 0x57, 0x1a, 0xef, 0x46, 0xe8, 0xd7, 0xbd, 0x51, + 0xea, 0xa7, 0x4a, 0xa3, 0x02, 0x3b, 0x30, 0xb4, 0x16, 0x21, 0xcc, 0xac, 0x32, 0xd0, 0x9d, 0xe7, 0xd3, 0xa9, 0x53, 0x79, 0x4b, 0xe6, 0x14, 0xac, 0x58, 0xa1, 0xe4, 0x7a, 0x63, 0xce, 0x0a, 0xcd, + 0xbc, 0xcf, 0x33, 0x7e, 0x9e, 0xcc, 0x6a, 0x70, 0x2e, 0xce, 0x97, 0x0a, 0xd3, 0xcd, 0xc8, 0x28, 0x76, 0xd8, 0x9c, 0x3d, 0x6f, 0x42, 0x26, 0x6d, 0x7d, 0x74, 0x58, 0x66, 0x62, 0xb3, 0x6d, 0x20, + 0xa6, 0x8e, 0xe3, 0x4f, 0xf9, 0x9b, 0xbe, 0x1c, 0xa9, 0x5f, 0xbf, 0xbe, 0xa9, 0x97, 0xf2, 0xbe, 0x64, 0xf9, 0x7d, 0xee, 0xe8, 0x73, 0x98, 0xd0, 0xdb, 0x07, 0x5e, 0x43, 0x85, 0x5e, 0xb5, 0xb1, + 0x9f, 0x8b, 0xcb, 0x5e, 0x6f, 0x6e, 0xca, 0xe0, 0x39, 0x98, 0xf8, 0x56, 0x40, 0xf3, 0xcd, 0xe5, 0xff, 0xfb, 0x72, 0xfc, 0x7f, 0xdf, 0xcc, 0x84, 0x1f, 0x58, 0xb5, 0x5f, 0xbf, 0xbe, 0x13, 0x42, + 0x7f, 0xfd, 0xc5, 0x98, 0xfe, 0x0d, 0xcb, 0xf6, 0x59, 0x44, 0xfd, 0x75, 0x6f, 0xd4, 0x05, 0x9e, 0x02, 0xa5, 0x69, 0x8a, 0xaa, 0xa1, 0xea, 0xaf, 0xf5, 0x14, 0x8e, 0xb7, 0x7e, 0xb4, 0x30, 0x66, + 0xf3, 0x83, 0x78, 0xdc, 0xc9, 0x6a, 0x78, 0xf2, 0x15, 0x8c, 0x9e, 0x81, 0xbb, 0x54, 0x6c, 0xa9, 0xbe, 0xf5, 0x8a, 0xba, 0xc8, 0x67, 0xea, 0x74, 0x2d, 0x62, 0xc9, 0x4e, 0xee, 0xf7, 0x3d, 0xbc, + 0x8b, 0x33, 0xac, 0x2e, 0xce, 0x4e, 0x61, 0x42, 0x95, 0x18, 0x97, 0x8d, 0x21, 0x0e, 0xa8, 0xdd, 0x78, 0x3f, 0x07, 0x3d, 0xc6, 0x99, 0x7d, 0x3f, 0x78, 0x09, 0xfb, 0x03, 0x93, 0x7f, 0x90, 0x07, + 0x36, 0x86, 0x2b, 0xd1, 0xcb, 0x4a, 0x75, 0x3d, 0x98, 0x3c, 0xd1, 0xf9, 0x79, 0x85, 0x6a, 0x91, 0x88, 0x61, 0x1d, 0x9c, 0x8c, 0x1d, 0xeb, 0xd0, 0xc4, 0x06, 0xb3, 0x6e, 0x84, 0x83, 0x34, 0xa0, + 0xbb, 0x01, 0xf3, 0xb6, 0xcb, 0x0d, 0xa1, 0xc3, 0x22, 0xda, 0xb2, 0x70, 0x54, 0x7a, 0xaa, 0x2e, 0x94, 0x95, 0x0c, 0x6c, 0x17, 0x87, 0xe5, 0x4a, 0xe9, 0x95, 0xd0, 0x52, 0xa5, 0x0a, 0x26, 0xb7, + 0xbe, 0xa9, 0x2b, 0x4b, 0xc7, 0x9e, 0x6d, 0x5a, 0x4a, 0xd5, 0xe1, 0xba, 0x0d, 0xf1, 0x45, 0xbb, 0x1f, 0x63, 0xba, 0xba, 0xbd, 0xe8, 0x1f, 0x2b, 0xce, 0x52, 0xe7, 0x32, 0xf7, 0xef, 0x02, 0x82, + 0x3f, 0xb2, 0x84, 0x7f, 0x20, 0xfe, 0x02, 0xcc, 0xeb, 0xa9, 0xc9, 0x95, 0xf2, 0x4f, 0x0c, 0x29, 0x16, 0x52, 0x60, 0xca, 0x02, 0x52, 0x6b, 0x13, 0xab, 0xcd, 0x3e, 0xa5, 0xe9, 0xde, 0x57, 0xb3, + 0xb5, 0x19, 0x9f, 0xc5, 0x11, 0x69, 0xee, 0x9f, 0x1e, 0x59, 0x97, 0x4d, 0x6a, 0x19, 0xf5, 0xfd, 0x38, 0x57, 0xec, 0x01, 0x65, 0xdf, 0x07, 0xda, 0xaf, 0x1d, 0x7c, 0x3e, 0x73, 0xad, 0x29, 0xf5, + 0x83, 0xda, 0x0f, 0x9e, 0x9c, 0xc2, 0xa3, 0x90, 0x6d, 0xd9, 0x9d, 0x88, 0x09, 0xc0, 0x19, 0x04, 0x15, 0x6f, 0x3f, 0x00, 0x27, 0xc1, 0x2c, 0x30, 0x7d, 0x44, 0x2c, 0x5e, 0x9c, 0x65, 0xb9, 0xe9, + 0xa4, 0x77, 0x4b, 0x9a, 0x3c, 0x96, 0x2d, 0xe3, 0x85, 0xea, 0xb5, 0x4f, 0x4f, 0xc7, 0x63, 0xf2, 0x63, 0xc0, 0x13, 0xdb, 0x5b, 0xa2, 0x12, 0x6c, 0x6d, 0xdc, 0x95, 0x04, 0x6d, 0x0a, 0xda, 0x69, + 0x51, 0xcf, 0xa8, 0x81, 0x7c, 0xb3, 0x00, 0xa9, 0x1f, 0xb7, 0xcc, 0xbe, 0x76, 0x9e, 0x54, 0x90, 0xdf, 0x24, 0x8e, 0xfd, 0x94, 0x6d, 0xed, 0x9f, 0x93, 0xb6, 0xde, 0x93, 0xbe, 0xf6, 0xfd, 0xed, + 0x89, 0x31, 0xf2, 0xd3, 0xe5, 0x7b, 0x5e, 0x22, 0xdb, 0x90, 0x80, 0x6b, 0x95, 0x49, 0x95, 0xc5, 0x42, 0x0c, 0x28, 0x45, 0xb7, 0x2b, 0x60, 0x9f, 0xc9, 0x61, 0x2d, 0xcf, 0x51, 0xdb, 0xcb, 0x22, + 0xce, 0x66, 0x96, 0x48, 0x72, 0x48, 0xe0, 0xba, 0xc7, 0x12, 0x1c, 0x12, 0x8e, 0x2b, 0x5a, 0xd4, 0xf7, 0x74, 0x27, 0xcb, 0xab, 0x61, 0x80, 0x14, 0x18, 0x99, 0x41, 0x9b, 0xc3, 0x12, 0x0b, 0x2c, + 0x57, 0x97, 0x57, 0x40, 0x2f, 0x0d, 0x3e, 0x75, 0x4f, 0x00, 0x79, 0x0f, 0x4d, 0xd9, 0xfc, 0x58, 0xd9, 0xef, 0x81, 0xc9, 0xf0, 0x4c, 0xf5, 0x02, 0xc8, 0xf3, 0xf1, 0xb5, 0x96, 0xdf, 0x08, 0xee, + 0x6b, 0x93, 0x11, 0xf6, 0x06, 0xc2, 0xe6, 0xc9, 0x3e, 0x6c, 0xce, 0x69, 0xb7, 0xd9, 0xef, 0xd1, 0xfc, 0xe8, 0x9c, 0x12, 0x1b, 0x5c, 0x41, 0xae, 0x7b, 0x88, 0x23, 0x55, 0xf5, 0x3a, 0x3d, 0x00, + 0x9c, 0x02, 0x3e, 0xce, 0x93, 0x42, 0xee, 0xe6, 0x3e, 0xe0, 0x6c, 0x2b, 0x4d, 0xd4, 0xe6, 0x9d, 0x36, 0x9d, 0xc2, 0x01, 0xb2, 0x30, 0x7c, 0xcc, 0x87, 0x69, 0x96, 0x9f, 0xf7, 0x58, 0x71, 0xf0, + 0x97, 0x66, 0x15, 0x8c, 0x30, 0xb9, 0x0c, 0x46, 0x1c, 0x07, 0x2f, 0x05, 0x50, 0xef, 0x8a, 0x5d, 0x89, 0x11, 0x39, 0x13, 0x3b, 0xb8, 0xaf, 0xbc, 0x79, 0x44, 0xe0, 0x7a, 0x26, 0x0a, 0x4e, 0x5e, + 0x0e, 0xc7, 0xca, 0xae, 0x1e, 0xba, 0x70, 0x24, 0x04, 0xda, 0x0a, 0x9d, 0x3f, 0xdb, 0x9a, 0x20, 0x31, 0x3f, 0x13, 0x8c, 0x8d, 0x2d, 0x90, 0xd4, 0x3b, 0x3b, 0x50, 0x78, 0x26, 0x6b, 0xf3, 0x5c, + 0x32, 0x48, 0x37, 0x53, 0x80, 0x6c, 0xba, 0x70, 0x84, 0x95, 0x83, 0x95, 0x5b, 0x60, 0xe0, 0x90, 0xc4, 0x86, 0x36, 0xa0, 0x1b, 0xec, 0x5d, 0xb8, 0x32, 0xe0, 0x19, 0xe3, 0xab, 0x45, 0x80, 0x03, + 0x99, 0xd2, 0x89, 0x3c, 0xe8, 0x2c, 0x1f, 0xf3, 0x3c, 0x7f, 0x53, 0xa9, 0x95, 0x78, 0x07, 0xe0, 0x1b, 0x52, 0xf7, 0x58, 0xcb, 0x97, 0xdf, 0xde, 0xe3, 0x44, 0x88, 0x0f, 0x81, 0xa8, 0xe3, 0xc1, + 0xbd, 0x91, 0x06, 0x27, 0x4f, 0x07, 0x13, 0xe2, 0x93, 0x59, 0xe0, 0xd7, 0x3d, 0x70, 0x4d, 0x74, 0x7a, 0xa0, 0x8d, 0xc3, 0xde, 0x55, 0x88, 0x81, 0x2e, 0x8d, 0xfc, 0x48, 0x4d, 0x73, 0xdc, 0xe5, + 0x9c, 0x88, 0x45, 0x12, 0x50, 0xe8, 0x52, 0x26, 0xb3, 0x44, 0xa5, 0x6c, 0xe4, 0xc5, 0x1e, 0x06, 0x5b, 0x87, 0xf7, 0xec, 0x73, 0x23, 0x59, 0xa9, 0xc8, 0xa3, 0x18, 0x4f, 0xcc, 0xbb, 0xfe, 0x44, + 0x85, 0x2b, 0x30, 0xee, 0x59, 0x03, 0x2f, 0xe9, 0x8c, 0x71, 0x8e, 0x5d, 0x83, 0xaf, 0x56, 0x87, 0xc7, 0x73, 0x84, 0x5e, 0xe7, 0xc6, 0x77, 0x35, 0x6c, 0xe1, 0x3f, 0xe8, 0x03, 0x41, 0xc7, 0xaf, + 0x64, 0x9f, 0xe7, 0xdf, 0xad, 0x7a, 0xed, 0x95, 0xda, 0xcf, 0x33, 0xb0, 0xa2, 0x8e, 0x7e, 0x2c, 0x38, 0x64, 0x2b, 0x71, 0x59, 0x22, 0xfb, 0x73, 0xb8, 0x58, 0x38, 0x31, 0x9f, 0x45, 0x25, 0xb8, + 0xb7, 0xd0, 0x99, 0x27, 0x98, 0x55, 0x86, 0xa6, 0x24, 0x96, 0x28, 0xd2, 0x0c, 0xdf, 0x1e, 0xf4, 0x2e, 0xa2, 0xa7, 0x42, 0xac, 0xba, 0x98, 0x2a, 0x19, 0xc9, 0xb6, 0xdf, 0xb0, 0x94, 0x0f, 0x79, + 0x3e, 0x89, 0x96, 0xfc, 0x14, 0xeb, 0xdb, 0x6e, 0x77, 0x40, 0xe6, 0xca, 0x3a, 0x1d, 0x63, 0x3f, 0x49, 0x8c, 0xf4, 0x22, 0xd3, 0x7f, 0x1b, 0xc6, 0xf5, 0xc8, 0xf2, 0xf5, 0x86, 0xee, 0x15, 0x90, + 0x97, 0xd6, 0x38, 0x4b, 0xc4, 0x94, 0x07, 0x58, 0x85, 0x8c, 0x12, 0xb2, 0xc1, 0x0a, 0x8f, 0x5c, 0x9c, 0x8f, 0xb4, 0x7c, 0x6c, 0x57, 0x66, 0x19, 0xeb, 0xd6, 0x07, 0xed, 0xe0, 0x4b, 0xbe, 0xdd, + 0xaf, 0xc7, 0xf2, 0x11, 0x5d, 0xc3, 0x8d, 0xe4, 0xe5, 0xb5, 0xaf, 0x07, 0x13, 0x78, 0x9c, 0xbe, 0x81, 0x2a, 0x48, 0x85, 0xf5, 0xf8, 0xcd, 0x09, 0xdb, 0x50, 0xb5, 0xe5, 0x2a, 0xd2, 0x40, 0x79, + 0xd0, 0x54, 0xb0, 0xe4, 0x4e, 0xb7, 0xcd, 0x6e, 0xc1, 0x16, 0xbe, 0x03, 0x9e, 0xf4, 0x28, 0x5b, 0x9f, 0xc3, 0x14, 0x44, 0x0f, 0x4b, 0xa6, 0xab, 0xc5, 0xb9, 0x56, 0xab, 0xcb, 0x7e, 0x86, 0x8a, + 0x54, 0x2d, 0x9d, 0x73, 0xeb, 0x3c, 0x9f, 0x33, 0x5e, 0x0b, 0x48, 0x88, 0x84, 0x0f, 0x10, 0xa4, 0x6f, 0x44, 0x71, 0x0c, 0x43, 0x99, 0x38, 0xb5, 0x9f, 0xd9, 0xf7, 0x37, 0xe5, 0x47, 0xa2, 0xc4, + 0x9e, 0x68, 0x5e, 0x41, 0xb8, 0x1e, 0x8d, 0x89, 0x08, 0x83, 0x27, 0xca, 0x3e, 0x89, 0xe0, 0x54, 0x3f, 0xb2, 0x10, 0x69, 0xf5, 0x7b, 0x3d, 0x51, 0x32, 0xc1, 0x64, 0xb0, 0xa3, 0x01, 0x8a, 0xd8, + 0x88, 0x7e, 0x04, 0x56, 0x99, 0x3d, 0x57, 0x14, 0xf8, 0x9a, 0x61, 0x7c, 0x24, 0x18, 0xf3, 0x95, 0xec, 0xa5, 0x37, 0x2f, 0x8d, 0xab, 0x11, 0x69, 0x44, 0x0c, 0x56, 0xbe, 0x4b, 0xce, 0x1d, 0xa8, + 0x1e, 0xad, 0x4e, 0x5d, 0xe6, 0xcc, 0xd4, 0x58, 0x4f, 0x0b, 0x10, 0x52, 0xc5, 0x6e, 0x2b, 0x0c, 0x5e, 0xc8, 0x1e, 0x36, 0xd4, 0x00, 0x19, 0x19, 0xd4, 0xd9, 0x45, 0x5e, 0x96, 0x67, 0xc6, 0xc0, + 0xb4, 0xb4, 0xdf, 0x5a, 0x67, 0xd2, 0x95, 0x77, 0x7a, 0x49, 0xb5, 0x99, 0x4f, 0x29, 0x30, 0x14, 0x2d, 0xfd, 0x19, 0x6d, 0x0a, 0xd6, 0x4a, 0x89, 0xf0, 0x6e, 0xe5, 0x9d, 0x1e, 0xac, 0x65, 0x69, + 0x96, 0x86, 0xe5, 0xdc, 0x44, 0xd5, 0x4f, 0x29, 0xab, 0xf3, 0xc0, 0xca, 0x5e, 0xab, 0x31, 0x20, 0x7f, 0x90, 0x37, 0xbe, 0x5f, 0x23, 0xf6, 0x8e, 0xb7, 0x3f, 0xbf, 0xb7, 0x7d, 0xdc, 0x88, 0x3e, + 0xb2, 0x7d, 0xbc, 0x50, 0x07, 0x27, 0xaf, 0xc7, 0x93, 0x2b, 0xbd, 0x71, 0x9b, 0x08, 0x97, 0xb3, 0xdb, 0xd0, 0xed, 0xac, 0x39, 0x73, 0x34, 0xa7, 0x92, 0x13, 0x78, 0x87, 0x0a, 0x49, 0xe8, 0xcd, + 0x59, 0x3d, 0x4a, 0xe7, 0x59, 0x23, 0x21, 0x99, 0x64, 0xcd, 0xa6, 0xd4, 0x74, 0xe5, 0x50, 0xbb, 0xda, 0x81, 0x00, 0xed, 0x38, 0x0b, 0x3b, 0x78, 0xa3, 0x38, 0x36, 0xe3, 0x37, 0x07, 0x4e, 0x8a, + 0x56, 0xe1, 0x5e, 0x3b, 0xf3, 0x02, 0x9a, 0xe6, 0xf3, 0x69, 0xdc, 0x1c, 0xfc, 0xa5, 0xc6, 0x72, 0xb6, 0xf7, 0xf8, 0x26, 0x12, 0x24, 0xf7, 0x23, 0x05, 0x1f, 0xc9, 0x34, 0x7d, 0x21, 0x78, 0x9d, + 0x9d, 0xc9, 0x45, 0x92, 0x1f, 0x95, 0x6b, 0xba, 0x87, 0x94, 0x94, 0xaa, 0xf2, 0x35, 0xd0, 0x35, 0x1b, 0x58, 0x24, 0xf6, 0xa4, 0x97, 0x9a, 0x86, 0xec, 0x51, 0x52, 0xef, 0x63, 0x82, 0xb0, 0x32, + 0x49, 0x6e, 0xbf, 0x16, 0x12, 0xf6, 0xc4, 0x05, 0x12, 0x8b, 0xed, 0x38, 0x31, 0x8f, 0xdb, 0x20, 0x4c, 0x01, 0x21, 0x4a, 0xb4, 0x24, 0xd9, 0x79, 0x12, 0x41, 0x25, 0x16, 0x09, 0x85, 0x08, 0x6b, + 0x3a, 0x87, 0xc5, 0xae, 0x2a, 0xab, 0xce, 0x90, 0x9d, 0x51, 0xcb, 0xcd, 0xe5, 0x25, 0xed, 0x7b, 0x71, 0x2d, 0xf0, 0x1f, 0xec, 0x91, 0x0a, 0xc1, 0x4f, 0x44, 0x9f, 0x31, 0xb0, 0xcd, 0xc9, 0x8d, + 0xd0, 0xcf, 0x38, 0x80, 0x82, 0x78, 0x70, 0xb7, 0x65, 0x25, 0xd1, 0x8a, 0xb3, 0x22, 0xb5, 0x7a, 0x21, 0x79, 0x95, 0x72, 0x6a, 0x9d, 0x66, 0x0b, 0x60, 0xfb, 0x30, 0xd4, 0x7a, 0x43, 0x86, 0xfb, + 0x9a, 0x87, 0x39, 0x7e, 0x11, 0x92, 0x2b, 0xbb, 0x8f, 0xe9, 0xb8, 0x77, 0x06, 0x61, 0x7b, 0xf6, 0x87, 0x8d, 0xd2, 0x93, 0x25, 0x56, 0xea, 0xcb, 0xcd, 0x4c, 0x07, 0x89, 0x38, 0xe2, 0xe6, 0x41, + 0xbd, 0xb7, 0x40, 0x21, 0xc9, 0x3f, 0x19, 0xa1, 0xde, 0xd5, 0x2f, 0xfc, 0x7a, 0x9b, 0x84, 0xff, 0x20, 0x7f, 0xef, 0xd8, 0xf7, 0x4a, 0xf7, 0xb9, 0xeb, 0xd7, 0xc6, 0xe4, 0x46, 0xee, 0xe7, 0xde, + 0x6f, 0xd6, 0x7e, 0x91, 0xce, 0x8d, 0x6a, 0x3d, 0x1d, 0x18, 0x60, 0x5f, 0x25, 0x51, 0xd1, 0xac, 0xe8, 0xfe, 0xb0, 0x67, 0x1b, 0xdd, 0x96, 0x55, 0x9c, 0x6e, 0xe4, 0x74, 0x8f, 0x28, 0x16, 0x99, + 0x37, 0xb2, 0x2c, 0x03, 0xd4, 0x10, 0x48, 0xf8, 0x4c, 0xc3, 0x9b, 0x93, 0x9f, 0xdb, 0x2d, 0xa6, 0x6d, 0x31, 0x85, 0xc7, 0x2d, 0x22, 0x88, 0x83, 0x40, 0x3b, 0x49, 0xde, 0x06, 0x4c, 0x37, 0xf2, + 0x36, 0x27, 0x47, 0xe8, 0x59, 0x5f, 0x27, 0xc1, 0xf3, 0x88, 0xdf, 0xfb, 0x50, 0xde, 0x27, 0xe0, 0xfe, 0xe7, 0xc4, 0xc6, 0xf7, 0xa4, 0x6f, 0xe8, 0xbd, 0x39, 0x31, 0x56, 0x6c, 0x0c, 0x71, 0xd6, + 0xaa, 0xd3, 0x68, 0x45, 0x1a, 0x89, 0xab, 0x80, 0x05, 0xbe, 0xf2, 0x92, 0xcc, 0x88, 0x61, 0x0f, 0x91, 0x57, 0x8b, 0xcd, 0xae, 0x34, 0xc4, 0x3a, 0xe9, 0xa1, 0x4d, 0xbe, 0x2e, 0xa2, 0xde, 0xa7, + 0xfd, 0x35, 0x18, 0x6f, 0xf6, 0x31, 0x9c, 0xf2, 0xb9, 0x8c, 0xe1, 0xbe, 0x62, 0x94, 0x9d, 0xc0, 0x1e, 0xc4, 0xec, 0xc4, 0x06, 0x49, 0x6a, 0xeb, 0x98, 0xcc, 0x41, 0xbb, 0x55, 0xdf, 0xf4, 0x63, + 0x7c, 0x04, 0xde, 0x96, 0xcf, 0xf9, 0x5a, 0x0a, 0x7a, 0x6c, 0xb3, 0x7b, 0xa2, 0x7a, 0x05, 0xe4, 0xe9, 0x78, 0x6c, 0xd9, 0xe6, 0x61, 0xb3, 0x52, 0x64, 0xd6, 0x1f, 0x0a, 0x69, 0x7b, 0x3c, 0x78, + 0xf5, 0x94, 0xa6, 0x50, 0x49, 0x6d, 0x88, 0x13, 0x5a, 0xf6, 0x18, 0xdf, 0xb6, 0xab, 0x76, 0x7f, 0x6c, 0x0f, 0x59, 0xe6, 0xe5, 0x5d, 0xb6, 0x64, 0xc4, 0xa3, 0x0c, 0x0c, 0x4c, 0xb9, 0x83, 0x56, + 0xbb, 0xac, 0x06, 0x06, 0x71, 0x6e, 0xcf, 0x45, 0xb2, 0xc1, 0x7c, 0x15, 0xcd, 0x4f, 0x6e, 0x4d, 0x44, 0x27, 0x9a, 0xb6, 0x0a, 0x1f, 0x3a, 0x3e, 0x66, 0x6c, 0xba, 0x6e, 0x75, 0x13, 0xa7, 0xcf, + 0x8d, 0xf4, 0x19, 0x90, 0x6b, 0xf2, 0x0f, 0xf2, 0xde, 0x3c, 0x4b, 0x83, 0x24, 0xb8, 0x6b, 0x0e, 0xb9, 0x70, 0x2e, 0x7f, 0xef, 0x0e, 0xfe, 0x4c, 0xf4, 0x19, 0xca, 0xa0, 0xaa, 0xaf, 0xda, 0x98, + 0x11, 0xee, 0xe0, 0x0b, 0x7e, 0x9a, 0x0a, 0x47, 0xad, 0xdc, 0xd1, 0x33, 0x76, 0xab, 0xcb, 0x07, 0xb4, 0x77, 0x74, 0x99, 0x74, 0x13, 0x5e, 0xa4, 0x3d, 0x22, 0x3d, 0x09, 0xc9, 0x86, 0x3b, 0x58, + 0x5e, 0xb5, 0x71, 0x8c, 0x6d, 0x55, 0x4b, 0xe0, 0x51, 0x64, 0x94, 0x7c, 0x59, 0x95, 0xb8, 0xe8, 0xab, 0xbe, 0xaf, 0x7a, 0x84, 0x0b, 0x14, 0xf5, 0x86, 0x6a, 0x02, 0x1d, 0x90, 0x8e, 0x7d, 0xc4, + 0x9c, 0x2c, 0x6f, 0xad, 0x6e, 0x3f, 0x05, 0x6e, 0x27, 0xf7, 0x17, 0xa3, 0x87, 0x78, 0xf6, 0xeb, 0x1a, 0x54, 0x8d, 0xe3, 0xd0, 0x15, 0x2f, 0x68, 0x4a, 0xb7, 0x9b, 0xb5, 0x49, 0x97, 0xcf, 0xec, + 0xa9, 0x9b, 0x2c, 0x17, 0x58, 0xe8, 0x30, 0x4a, 0x4c, 0x8d, 0x70, 0x76, 0x48, 0x8d, 0xba, 0x29, 0x8d, 0xf8, 0x5a, 0x4e, 0xdd, 0xb8, 0x9b, 0x07, 0x0f, 0x7e, 0xa8, 0xd6, 0xfc, 0x07, 0xda, 0xe0, + 0xe4, 0xe3, 0x99, 0x2b, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x25, 0x01, 0x92, 0xb5, 0x7d, 0x5c, 0x0d, 0x5d, 0x5a, 0x4a, 0x55, 0xde, 0x9a, 0xed, 0x4e, 0x5d, 0xc3, 0x66, 0x2e, 0x8d, 0x28, 0x61, 0x98, + 0x66, 0xb6, 0x33, 0xc9, 0xaa, 0x49, 0x53, 0x07, 0xdf, 0xa4, 0xa9, 0x46, 0x1f, 0x98, 0x93, 0xef, 0x28, 0x5f, 0xfa, 0xf6, 0xb6, 0x7d, 0x95, 0x36, 0x47, 0xcc, 0x4e, 0x73, 0xbd, 0x59, 0xc7, 0x11, + 0xe0, 0xcf, 0x00, 0x12, 0x9c, 0x1d, 0xd2, 0x06, 0xad, 0x64, 0xbe, 0x5e, 0x10, 0x53, 0x32, 0xe8, 0xa6, 0x07, 0x70, 0x13, 0x55, 0x8c, 0xcf, 0xf1, 0xce, 0xb4, 0x61, 0x85, 0x25, 0x24, 0xfa, 0xe7, + 0xf5, 0x92, 0xf4, 0xb7, 0x3c, 0xe1, 0x9a, 0xd6, 0xd0, 0xc0, 0x94, 0x29, 0x36, 0x46, 0x18, 0x6b, 0xa7, 0x74, 0x1f, 0x87, 0xd0, 0xda, 0x67, 0x32, 0xa4, 0x20, 0x23, 0xc8, 0x31, 0x3f, 0x6d, 0x99, + 0x97, 0x57, 0x4b, 0xee, 0x5a, 0xd5, 0x1f, 0xab, 0xfa, 0xfc, 0x44, 0xf3, 0xa9, 0xe3, 0x49, 0x96, 0x8e, 0xa9, 0xfa, 0x7c, 0xe9, 0x32, 0x01, 0x86, 0x45, 0xad, 0xb7, 0x1b, 0x3b, 0x82, 0xa6, 0x48, + 0xae, 0xa4, 0x0c, 0x32, 0x5b, 0xaf, 0xe0, 0x29, 0x27, 0x4f, 0x97, 0xb2, 0x3e, 0xe3, 0x44, 0x5d, 0x19, 0xc0, 0xe1, 0x00, 0x37, 0xce, 0x96, 0x30, 0x32, 0x05, 0x58, 0xf7, 0xa4, 0x01, 0xc7, 0x8a, + 0xbe, 0xaf, 0xd5, 0x73, 0xcb, 0xfa, 0x90, 0x2b, 0x61, 0x67, 0x16, 0x83, 0x19, 0xe6, 0x14, 0x47, 0x4a, 0xb6, 0x0a, 0x77, 0xc4, 0x29, 0xce, 0xee, 0x55, 0x10, 0xff, 0x61, 0x69, 0xb3, 0xfc, 0x2c, + 0x0a, 0x6c, 0xe3, 0xa6, 0xe4, 0x41, 0xdf, 0xd5, 0x32, 0xbe, 0x92, 0x31, 0x1b, 0xef, 0xe5, 0xd2, 0xbb, 0x1a, 0xca, 0x5f, 0x65, 0x4c, 0xfc, 0xa2, 0xa0, 0xc5, 0x0f, 0x75, 0xd9, 0xf2, 0xaa, 0x2e, + 0x1d, 0xe7, 0x4f, 0xe9, 0x24, 0xc3, 0x9b, 0x55, 0xf5, 0xcd, 0x0d, 0x6f, 0x54, 0x50, 0xf8, 0x1f, 0xf2, 0x3d, 0xed, 0xaa, 0xc9, 0xf3, 0xac, 0xac, 0xab, 0x89, 0x95, 0xc5, 0xd9, 0xf3, 0x3d, 0xf8, + 0x7b, 0x43, 0x69, 0x9d, 0x35, 0x2f, 0xcf, 0xfe, 0x60, 0x84, 0x6d, 0x52, 0xdb, 0x71, 0x2b, 0xc3, 0xbd, 0xd9, 0xee, 0x90, 0x8f, 0x39, 0x9b, 0x9a, 0xfc, 0x9a, 0xe2, 0x20, 0xcd, 0xea, 0xc0, 0x0d, + 0x9e, 0x5e, 0x01, 0xfb, 0xdb, 0x14, 0xa3, 0xcf, 0x00, 0xde, 0x93, 0x62, 0x3e, 0xc2, 0x3a, 0x7e, 0xf2, 0x5d, 0x29, 0x83, 0x93, 0xdb, 0xff, 0xc9, 0x95, 0xce, 0x38, 0xe9, 0x25, 0x71, 0x62, 0x20, + 0x74, 0xc9, 0xb4, 0xac, 0xd9, 0x18, 0x97, 0x52, 0x58, 0xee, 0x31, 0xe2, 0x3c, 0xdb, 0xa9, 0x1c, 0x93, 0xd3, 0x66, 0x7b, 0x76, 0xce, 0x95, 0x43, 0xe6, 0xe4, 0xb6, 0x58, 0x0b, 0x89, 0x9d, 0xad, + 0x23, 0x4a, 0xd2, 0x24, 0x7c, 0x3f, 0xec, 0x8d, 0x9e, 0x4d, 0xb4, 0x96, 0x38, 0xe8, 0xd0, 0x66, 0x60, 0xb9, 0x19, 0xec, 0x57, 0xf3, 0xb5, 0x4d, 0x30, 0x6b, 0xdf, 0x5b, 0x1f, 0xea, 0xd3, 0x37, + 0x35, 0xa3, 0x3e, 0x74, 0xee, 0x9e, 0xf5, 0x35, 0xa9, 0x9e, 0x86, 0xe1, 0x4d, 0x00, 0xf6, 0xaf, 0x5f, 0xf7, 0xac, 0x9e, 0x5f, 0x94, 0x1b, 0xf8, 0xf5, 0x09, 0xda, 0x47, 0x2d, 0x9d, 0x5f, 0x95, + 0x1d, 0xf8, 0xec, 0x73, 0xf7, 0xeb, 0x2b, 0x80, 0xe1, 0x49, 0x6d, 0xef, 0x8e, 0xe8, 0x7c, 0xa9, 0x97, 0xc1, 0xe6, 0x94, 0xb8, 0xc2, 0xd2, 0x8d, 0xb3, 0x15, 0x45, 0xc6, 0x4a, 0xd3, 0x42, 0x23, + 0x04, 0xbc, 0xb7, 0x5f, 0xce, 0x47, 0x90, 0x3e, 0x31, 0xf8, 0x0f, 0x75, 0xee, 0x75, 0x5f, 0xfd, 0xa8, 0x41, 0xf9, 0x75, 0x6f, 0xc6, 0x54, 0xcb, 0x48, 0xea, 0x01, 0x25, 0xe4, 0xeb, 0x64, 0x46, + 0xf0, 0x2a, 0x42, 0x66, 0x33, 0x6c, 0x41, 0x2f, 0xd8, 0xed, 0x62, 0xae, 0xeb, 0xd8, 0x1e, 0x53, 0x0b, 0x67, 0x29, 0xaa, 0xf3, 0x96, 0xa0, 0xea, 0x03, 0x10, 0x9a, 0x68, 0x1b, 0x81, 0xbb, 0xc1, + 0xe0, 0x4e, 0x12, 0x24, 0x1d, 0xb8, 0xe1, 0x54, 0x27, 0xdb, 0x3d, 0x0f, 0x99, 0x80, 0x61, 0x1f, 0x0f, 0x6c, 0x6b, 0x56, 0xb0, 0xc4, 0x1a, 0x2b, 0x64, 0x94, 0xd2, 0xf4, 0xab, 0x85, 0xe0, 0x1e, + 0x24, 0x1f, 0x97, 0x87, 0xf1, 0x90, 0x7c, 0xd4, 0x27, 0x5f, 0x29, 0x8d, 0x84, 0xc6, 0x68, 0x0c, 0xc6, 0x05, 0x25, 0xdd, 0x56, 0xbc, 0x72, 0x7b, 0x10, 0xb4, 0xd5, 0xae, 0xce, 0x55, 0x03, 0x0e, + 0x76, 0x01, 0x67, 0x19, 0x8e, 0x19, 0x70, 0x32, 0x4c, 0x6f, 0xec, 0x5c, 0x8e, 0x4f, 0x2b, 0x24, 0x9e, 0xb7, 0x4e, 0x2f, 0xdb, 0x2a, 0x8e, 0x57, 0xa9, 0xb4, 0x18, 0x38, 0x52, 0x3e, 0xe7, 0x8d, + 0x5d, 0x98, 0xf3, 0x35, 0x54, 0xa8, 0x0b, 0x57, 0x34, 0xaa, 0x95, 0x3d, 0x08, 0xcc, 0x72, 0x54, 0x01, 0xb6, 0xef, 0xd6, 0xc1, 0xfb, 0x10, 0xe1, 0x0f, 0x7e, 0x12, 0xef, 0x1f, 0x71, 0x81, 0xea, + 0xdd, 0x89, 0x09, 0xfe, 0xc9, 0x8a, 0xfb, 0xeb, 0x1e, 0x64, 0x72, 0xa8, 0x84, 0x9d, 0xad, 0xae, 0x6b, 0x0c, 0xa2, 0xf8, 0x75, 0x30, 0x2b, 0xe6, 0x2a, 0x96, 0x1d, 0xb9, 0xca, 0x3b, 0x22, 0x6c, + 0x31, 0x5b, 0x9e, 0x2b, 0x44, 0xca, 0xa3, 0x04, 0x33, 0x64, 0xcd, 0x0c, 0x13, 0x40, 0x67, 0x4f, 0xac, 0x75, 0xc2, 0xf6, 0xee, 0x42, 0x38, 0x94, 0x58, 0xc3, 0x0b, 0x7a, 0x62, 0x40, 0xce, 0x80, + 0xb9, 0x78, 0xec, 0x6d, 0xcb, 0x88, 0x86, 0x0c, 0x15, 0x92, 0xf9, 0xec, 0x9b, 0xd9, 0x34, 0x72, 0xfd, 0x79, 0xb3, 0xa2, 0x7c, 0x28, 0x95, 0xf4, 0xeb, 0xfd, 0x2a, 0xf4, 0x7f, 0xde, 0xfe, 0x7f, + 0x65, 0x2f, 0xf2, 0x6f, 0x53, 0x06, 0x3f, 0xc0, 0x39, 0x66, 0x79, 0x7d, 0xe5, 0x2c, 0xf2, 0x7a, 0x54, 0x2e, 0x12, 0x78, 0x62, 0xda, 0x90, 0xdf, 0xee, 0xb3, 0x5e, 0x56, 0x9b, 0xbd, 0x95, 0xa2, + 0x8a, 0xef, 0x06, 0x09, 0x85, 0x6a, 0x6b, 0x02, 0xf8, 0x5a, 0xdd, 0xf9, 0xe6, 0x8d, 0xbe, 0x74, 0x5e, 0x32, 0xcd, 0xf2, 0x7a, 0xef, 0xbd, 0xbc, 0xa0, 0x69, 0x56, 0x26, 0x46, 0x1c, 0x9c, 0xbf, + 0x55, 0xd8, 0x3f, 0xe6, 0xfb, 0xfc, 0x9e, 0xf4, 0x15, 0x86, 0xb7, 0x27, 0xc6, 0x78, 0x40, 0x5f, 0xf9, 0x2c, 0x47, 0xaf, 0xf0, 0x6d, 0x85, 0x9e, 0xea, 0x79, 0x50, 0xad, 0x4e, 0xf9, 0x74, 0x8f, + 0x2c, 0x8f, 0x03, 0x65, 0x17, 0x51, 0xbe, 0x0c, 0x30, 0x5a, 0xd9, 0x9f, 0xd1, 0xa5, 0x51, 0x04, 0x2c, 0xe1, 0x9c, 0x1b, 0x13, 0xc2, 0x61, 0x84, 0xdd, 0x9f, 0x6b, 0xf5, 0xd8, 0x1d, 0x69, 0x62, + 0x4e, 0xac, 0x39, 0x53, 0x8e, 0x34, 0x44, 0x4a, 0x4d, 0x30, 0x61, 0xb0, 0x93, 0x96, 0x85, 0xf3, 0x5d, 0x67, 0x75, 0xdb, 0x31, 0x56, 0xd8, 0xd7, 0xd7, 0x6d, 0xca, 0x7b, 0x8e, 0xf7, 0xd8, 0x1f, + 0xfc, 0x01, 0x45, 0xc3, 0x3b, 0xca, 0xef, 0x80, 0x69, 0xca, 0xf8, 0xea, 0x4c, 0x31, 0x42, 0xcd, 0x30, 0x3d, 0xea, 0xf3, 0xc5, 0x6e, 0x25, 0xdb, 0x42, 0xe9, 0x1e, 0xf2, 0xa5, 0x47, 0x01, 0xf0, + 0x5a, 0x58, 0x7b, 0x53, 0x94, 0x26, 0xce, 0x2c, 0x64, 0xa8, 0xbc, 0xb2, 0x88, 0x3a, 0xf8, 0xb4, 0xe8, 0x5a, 0x11, 0xdb, 0xc7, 0xfa, 0xd0, 0x1d, 0x09, 0x63, 0xeb, 0xe1, 0xa2, 0x0b, 0xcd, 0x72, + 0x50, 0xf2, 0x2c, 0x73, 0xdf, 0x61, 0x5b, 0xa1, 0x6f, 0xf9, 0x93, 0xca, 0x3b, 0x8d, 0xd7, 0xf1, 0x73, 0x15, 0x9a, 0x8d, 0xc1, 0xe5, 0x29, 0x37, 0x80, 0x51, 0x55, 0x81, 0x77, 0x8f, 0x17, 0xc7, + 0x1e, 0x4a, 0xcf, 0xf4, 0x8e, 0x32, 0x38, 0x79, 0xdf, 0xbe, 0x16, 0x3c, 0xf8, 0xd1, 0xeb, 0x79, 0x2d, 0x27, 0x75, 0x8f, 0xeb, 0x9a, 0x4f, 0x81, 0x33, 0x75, 0xdb, 0x1e, 0xe5, 0xaa, 0x5c, 0xb7, + 0x64, 0x85, 0xcc, 0x97, 0xfc, 0x07, 0x61, 0xe2, 0x89, 0x78, 0x90, 0x56, 0xf9, 0x77, 0xa9, 0x15, 0x1e, 0xf1, 0x7a, 0x7c, 0x4f, 0xfa, 0xb5, 0x23, 0x4f, 0x27, 0x26, 0xf0, 0x38, 0x8f, 0x47, 0x83, + 0xcc, 0xd9, 0x95, 0xed, 0xc3, 0x3d, 0xb7, 0x9e, 0x79, 0x87, 0x61, 0x7f, 0x5c, 0x7a, 0x5b, 0xbe, 0x07, 0xfb, 0x8e, 0xd1, 0xab, 0x48, 0x80, 0x8f, 0x36, 0xe1, 0x78, 0x9a, 0x26, 0xa0, 0xac, 0xbd, + 0x3b, 0x61, 0x3a, 0x2f, 0x09, 0x2c, 0x73, 0x3c, 0x2c, 0x00, 0xbf, 0x1b, 0x90, 0xed, 0x71, 0x0e, 0xd0, 0x31, 0xb0, 0x1f, 0xb6, 0xea, 0x4c, 0x48, 0xbb, 0x33, 0x18, 0x0e, 0x3e, 0x58, 0x34, 0x35, + 0x77, 0x1c, 0x63, 0xc2, 0x7b, 0x7e, 0xdd, 0xef, 0x0c, 0x40, 0x7f, 0x1f, 0x37, 0xfb, 0x42, 0xf5, 0x0d, 0x20, 0x37, 0x23, 0xd0, 0x88, 0xb8, 0xd9, 0xda, 0x19, 0x8a, 0x6d, 0xbb, 0x38, 0x9d, 0xb7, + 0x51, 0x81, 0xd3, 0xd3, 0x28, 0xa0, 0x16, 0xca, 0x69, 0x36, 0x85, 0x90, 0x23, 0xbb, 0x43, 0x8a, 0xa8, 0x4f, 0xec, 0x19, 0x96, 0x6e, 0x5d, 0xa0, 0x0b, 0xc5, 0xed, 0xec, 0xe4, 0xf5, 0xe7, 0xf9, + 0x49, 0x17, 0xe6, 0x7d, 0xce, 0x14, 0x53, 0xbe, 0x65, 0x29, 0x3e, 0xf1, 0x4f, 0x42, 0x09, 0xac, 0xa9, 0x0e, 0xa5, 0x05, 0x6c, 0xaa, 0xf4, 0x28, 0xa1, 0x11, 0xea, 0x63, 0x36, 0x13, 0xdb, 0x71, + 0x83, 0xd4, 0x99, 0xe4, 0x65, 0x96, 0x3b, 0x65, 0x1d, 0x38, 0xcf, 0x1e, 0xb8, 0xf0, 0x7b, 0xd1, 0xe3, 0xcb, 0x08, 0x4f, 0x68, 0x92, 0x3a, 0x7d, 0x7d, 0xcf, 0x25, 0xe6, 0x09, 0x95, 0x6f, 0xfd, + 0x61, 0xfe, 0x83, 0xef, 0xea, 0xc9, 0x19, 0xe6, 0x4d, 0xeb, 0x8a, 0xfe, 0x88, 0xb5, 0x46, 0x68, 0x66, 0xec, 0xfe, 0x28, 0x1e, 0xf9, 0x32, 0x5e, 0xab, 0xa2, 0xbb, 0xe2, 0xce, 0x0c, 0x61, 0xe6, + 0x52, 0x83, 0xd6, 0x5a, 0x8d, 0xf6, 0x6d, 0x28, 0xd8, 0xbb, 0xb5, 0x0c, 0x2c, 0x9c, 0x03, 0x14, 0x0b, 0x26, 0xc6, 0x51, 0xa7, 0x1d, 0x09, 0xcd, 0x0d, 0xa6, 0xf7, 0x1b, 0xc1, 0x6b, 0xf6, 0x88, + 0xba, 0x04, 0x96, 0x61, 0x34, 0xf0, 0x9d, 0x78, 0xae, 0x04, 0x5c, 0x8f, 0xea, 0x75, 0xe2, 0xfa, 0x9f, 0x33, 0xa7, 0xde, 0x5e, 0xec, 0xcf, 0x8f, 0x0b, 0xcb, 0xdf, 0xdb, 0x1e, 0xdf, 0x51, 0x7e, + 0x81, 0xe0, 0xcf, 0x9b, 0x85, 0x65, 0x44, 0x50, 0x67, 0xd0, 0x1f, 0x90, 0x2d, 0x7e, 0x58, 0xa9, 0xd5, 0x2c, 0x1f, 0x82, 0xa3, 0xa4, 0x71, 0xc9, 0x09, 0x40, 0xd8, 0x55, 0xae, 0xaa, 0x0e, 0xbe, + 0x0e, 0x50, 0x1e, 0x70, 0x31, 0x07, 0x30, 0x36, 0x8b, 0xd9, 0xca, 0xc8, 0x70, 0x23, 0x59, 0xec, 0x4e, 0xc4, 0x06, 0x12, 0x45, 0xc2, 0x02, 0xb7, 0x47, 0x8a, 0x76, 0x30, 0xb2, 0xa9, 0xe7, 0x3d, + 0xb2, 0xdc, 0x52, 0x53, 0xbf, 0x5f, 0xd2, 0x84, 0xba, 0x4f, 0xb8, 0xe6, 0xa1, 0xa0, 0xce, 0x77, 0x12, 0xf0, 0xc8, 0xe9, 0xf8, 0x75, 0x00, 0xf8, 0x9b, 0x1b, 0xde, 0x4f, 0xbe, 0xdf, 0xdf, 0x55, + 0x0c, 0xcc, 0xd2, 0x49, 0xea, 0xd4, 0x93, 0x38, 0xa8, 0x6a, 0xe7, 0xde, 0x40, 0x3d, 0x66, 0x24, 0x7e, 0x47, 0xf9, 0x32, 0x50, 0x6f, 0xdb, 0x63, 0x0c, 0xc6, 0x57, 0xa5, 0x33, 0xbc, 0xda, 0x69, + 0x03, 0x55, 0x81, 0xbb, 0xd8, 0xa2, 0x5b, 0xe6, 0xd8, 0x71, 0xea, 0x3e, 0x89, 0x44, 0x86, 0xb7, 0x7b, 0x8c, 0xdb, 0x37, 0xeb, 0x36, 0xce, 0xe6, 0xa9, 0xac, 0x6d, 0x90, 0xad, 0x4d, 0xd3, 0x73, + 0xd8, 0xa8, 0x34, 0x6c, 0x55, 0xbb, 0xbe, 0xda, 0x39, 0xe8, 0xf1, 0x14, 0xa5, 0x5b, 0x23, 0x9a, 0x1d, 0x74, 0x26, 0x35, 0xcf, 0x7e, 0x8d, 0xac, 0xc3, 0x0e, 0xe5, 0x61, 0xb6, 0x58, 0x7c, 0x52, + 0x46, 0x3d, 0x25, 0x63, 0xff, 0xe7, 0xd4, 0x8c, 0x17, 0x82, 0xd7, 0x2e, 0x5b, 0x23, 0x15, 0x8a, 0x27, 0xa6, 0x32, 0x72, 0xf4, 0x74, 0x5a, 0x1d, 0xab, 0x9d, 0x58, 0x2d, 0xa6, 0xe9, 0x62, 0x4e, + 0x90, 0x38, 0xaa, 0x1a, 0xd3, 0xaf, 0x23, 0x7c, 0x7e, 0x98, 0x67, 0x3f, 0xe6, 0x90, 0xcf, 0xf2, 0x3a, 0xc8, 0x52, 0xa3, 0xbe, 0xeb, 0xe8, 0x02, 0x3d, 0x94, 0xd5, 0xfa, 0x95, 0xec, 0xa5, 0xf7, + 0x2f, 0x8d, 0x09, 0x34, 0x2e, 0xaf, 0x35, 0x89, 0xed, 0x62, 0x0d, 0x5f, 0xcc, 0x53, 0xbf, 0xc0, 0xc2, 0x5d, 0xaf, 0x1c, 0x25, 0x8e, 0x31, 0x76, 0x5d, 0xa9, 0x08, 0x2a, 0x5f, 0x54, 0xcb, 0x2a, + 0x38, 0x11, 0xb3, 0x4d, 0x87, 0xa9, 0x1c, 0xe5, 0x27, 0x75, 0x02, 0x43, 0xdd, 0x1c, 0x1a, 0x72, 0x9d, 0xde, 0x76, 0xf8, 0x7a, 0x9d, 0x53, 0xb8, 0xa0, 0xf3, 0xe5, 0x14, 0x06, 0x0a, 0x1b, 0xde, + 0xb5, 0x2d, 0x2b, 0x74, 0x1e, 0x19, 0x86, 0xbb, 0xc5, 0x63, 0xae, 0x56, 0x57, 0x5f, 0xd8, 0xd7, 0xc2, 0xb8, 0xef, 0x3f, 0xc0, 0xab, 0x67, 0x7a, 0xec, 0xb4, 0x4e, 0x5a, 0xf9, 0xb5, 0x13, 0xdc, + 0x0c, 0x10, 0xc8, 0xbb, 0x7a, 0x04, 0xaf, 0x61, 0x2e, 0xb7, 0x90, 0x82, 0xf7, 0xe6, 0xf8, 0xbf, 0x8a, 0xf8, 0xf8, 0x1c, 0x92, 0xd0, 0x65, 0xa5, 0x3d, 0xb9, 0x8c, 0xf1, 0xcb, 0xcf, 0xef, 0xa4, + 0x72, 0xc9, 0x5a, 0xa7, 0x8c, 0x33, 0xc3, 0xbe, 0x2c, 0x29, 0xb5, 0xf3, 0x7d, 0x0e, 0x47, 0xe4, 0x91, 0xf1, 0xfe, 0x4c, 0xff, 0x32, 0xf0, 0x9f, 0xcf, 0x5e, 0x4d, 0x23, 0x23, 0x66, 0x80, 0xb1, + 0x16, 0xbd, 0x82, 0x54, 0xbd, 0xd8, 0x8e, 0xe8, 0xed, 0xd4, 0xca, 0xf1, 0x30, 0x9a, 0x81, 0x89, 0x2b, 0xcc, 0x9a, 0x20, 0x82, 0x04, 0xbd, 0x55, 0x0c, 0x3a, 0xce, 0x37, 0xfe, 0xfe, 0x00, 0xb8, + 0x4e, 0x5e, 0xa0, 0x9d, 0x36, 0x4b, 0x32, 0x79, 0x97, 0x6f, 0x42, 0x77, 0x49, 0xcc, 0x34, 0xbc, 0xeb, 0x0e, 0xd9, 0x32, 0x3b, 0x4a, 0x15, 0xe1, 0x48, 0x52, 0xe7, 0xba, 0x3e, 0x5c, 0x60, 0x29, + 0x30, 0xc2, 0x37, 0xd1, 0x68, 0xea, 0xcc, 0x32, 0xd2, 0xf4, 0xc9, 0x98, 0x84, 0x7d, 0x1c, 0xb1, 0xb7, 0x3e, 0xbd, 0xbf, 0x9f, 0x0a, 0xbd, 0x7d, 0x89, 0xf8, 0x87, 0x82, 0xc1, 0xf7, 0x96, 0xd3, + 0xbf, 0x5f, 0x52, 0xde, 0x12, 0x06, 0x27, 0xef, 0x9a, 0xd7, 0xc5, 0x74, 0x04, 0x13, 0x5a, 0x91, 0xa8, 0xda, 0x8b, 0x3a, 0x76, 0xce, 0x6b, 0xd8, 0xb1, 0x75, 0x4d, 0x3f, 0xb7, 0x7e, 0xb1, 0x30, + 0x88, 0xa6, 0x95, 0x2d, 0xb8, 0xed, 0x8e, 0x06, 0xc4, 0x41, 0xb4, 0x5d, 0xaf, 0x75, 0x4f, 0xe6, 0x67, 0x9b, 0x70, 0xba, 0x36, 0x1d, 0x73, 0x05, 0x6c, 0x22, 0x8f, 0xd3, 0xad, 0xa9, 0x0f, 0xd0, + 0x10, 0x2e, 0x71, 0xab, 0xad, 0x78, 0x88, 0x31, 0x23, 0x5c, 0xc2, 0x74, 0x22, 0x94, 0x8a, 0x1e, 0x8f, 0x61, 0x42, 0x3f, 0x04, 0x87, 0x7d, 0x05, 0x0a, 0xf1, 0x90, 0x43, 0xfb, 0x5b, 0xc2, 0x17, + 0x50, 0xde, 0x34, 0x27, 0xc4, 0xcf, 0x8e, 0xec, 0x17, 0x50, 0x22, 0xd4, 0xb4, 0x13, 0x24, 0x45, 0xf0, 0x3a, 0x1a, 0x7a, 0x2b, 0xdc, 0x73, 0x67, 0x1a, 0xef, 0xa9, 0xc8, 0x55, 0xfa, 0x98, 0xb7, + 0xbd, 0xca, 0x94, 0x4a, 0x68, 0x19, 0xe9, 0x56, 0xb7, 0xaa, 0xb6, 0xb9, 0x69, 0x10, 0x16, 0x1d, 0x16, 0xf3, 0x1a, 0xe6, 0x62, 0x6b, 0xee, 0x73, 0x6c, 0xdb, 0xaf, 0xd6, 0xd6, 0x81, 0x86, 0x17, + 0x0a, 0xdf, 0x74, 0x59, 0x10, 0xea, 0x08, 0xd1, 0x3b, 0x3d, 0xce, 0x3f, 0x16, 0x08, 0x76, 0xab, 0x50, 0xfe, 0xfb, 0x5f, 0xef, 0xeb, 0x91, 0x5f, 0x6f, 0xbf, 0xf5, 0x7c, 0x62, 0x34, 0xb5, 0x7f, + 0x0b, 0x73, 0xff, 0xfd, 0xea, 0x45, 0xfb, 0xd5, 0x8d, 0x37, 0x31, 0xf7, 0xf7, 0xbf, 0xf0, 0x8f, 0x77, 0xbc, 0x73, 0x21, 0x45, 0xfe, 0x4e, 0x79, 0xfe, 0xa3, 0xca, 0xef, 0xbf, 0x2e, 0xa4, 0x2f, + 0x35, 0x1f, 0xef, 0x6a, 0x9e, 0xfe, 0x7e, 0x91, 0xbd, 0x50, 0xbc, 0x4e, 0xee, 0x28, 0xbb, 0x69, 0x9e, 0x46, 0xac, 0xa3, 0x98, 0xbf, 0xa5, 0x29, 0x69, 0xc0, 0xce, 0xba, 0xe5, 0xe0, 0x15, 0x36, + 0xd8, 0x53, 0xf5, 0x9c, 0xe5, 0x45, 0xa7, 0xb4, 0xe0, 0xb0, 0x14, 0x7c, 0x05, 0xa6, 0x63, 0x4a, 0x38, 0x24, 0xf3, 0x02, 0x26, 0x09, 0x74, 0xe5, 0x70, 0x08, 0xc0, 0x76, 0xca, 0xa1, 0x05, 0x62, + 0x67, 0xe9, 0x6c, 0x61, 0x94, 0x49, 0x7d, 0xa4, 0x73, 0xcd, 0x22, 0xeb, 0x14, 0x49, 0x9d, 0xaf, 0x45, 0xe8, 0x8c, 0xd5, 0x86, 0xf6, 0xc9, 0xc4, 0xfc, 0xb1, 0x30, 0xd3, 0xdd, 0x4e, 0x3f, 0xd0, + 0xe7, 0x37, 0x94, 0xaf, 0x9d, 0x7f, 0xd3, 0x1e, 0xeb, 0xbd, 0xb1, 0x94, 0x11, 0xf6, 0xb4, 0xcb, 0x65, 0x85, 0x02, 0x33, 0x60, 0xd6, 0x51, 0x5a, 0x51, 0xbb, 0xba, 0x2e, 0xb9, 0xc2, 0xee, 0xa4, + 0x6b, 0x91, 0x19, 0xd8, 0xec, 0x34, 0xc2, 0xcb, 0x3c, 0x06, 0xfd, 0x39, 0xda, 0xd6, 0xab, 0x15, 0xed, 0x2e, 0x13, 0x64, 0xed, 0x06, 0x44, 0x71, 0x52, 0x00, 0x2b, 0x63, 0x96, 0x51, 0x79, 0xe4, + 0xf4, 0x59, 0xcf, 0xa2, 0xdb, 0xac, 0xc6, 0x23, 0xab, 0xda, 0xc5, 0x3e, 0xf0, 0x98, 0xa0, 0x79, 0x61, 0xfc, 0xab, 0xa0, 0x7e, 0xe3, 0x9f, 0x77, 0x6f, 0xff, 0xb8, 0xa6, 0xd9, 0xbb, 0xca, 0x9b, + 0x59, 0xdc, 0xdc, 0x8d, 0x8e, 0x79, 0x14, 0xd5, 0xf7, 0xc4, 0xaf, 0xc0, 0xbe, 0x3f, 0x35, 0x06, 0x5b, 0x78, 0xb2, 0x80, 0x9a, 0xbd, 0xb1, 0x12, 0x14, 0x41, 0x02, 0x28, 0xa7, 0xc2, 0xcb, 0xe9, + 0x21, 0x37, 0x52, 0xbf, 0xb6, 0x54, 0x78, 0x44, 0xfc, 0xcf, 0xf5, 0x91, 0x91, 0x33, 0xdc, 0xd5, 0x50, 0x3e, 0x22, 0x17, 0x3f, 0x13, 0x7d, 0xee, 0x52, 0xe4, 0x0c, 0x57, 0x07, 0xff, 0x11, 0xd3, + 0x24, 0x0b, 0x13, 0x47, 0x80, 0x0a, 0x1b, 0x18, 0xa0, 0xb0, 0x3a, 0xb3, 0x75, 0xa6, 0x61, 0x54, 0x09, 0x49, 0x4e, 0x81, 0xdb, 0x1d, 0xcf, 0x46, 0xeb, 0x78, 0x2e, 0x36, 0x84, 0x8c, 0xbb, 0x18, + 0x1c, 0xbb, 0x51, 0xd5, 0xa9, 0x0d, 0x57, 0x6b, 0xa5, 0xef, 0x65, 0x87, 0x7c, 0x9b, 0x0e, 0x6b, 0x6b, 0x95, 0x20, 0xd8, 0xd1, 0x2f, 0x7a, 0x00, 0x3f, 0x14, 0x09, 0xb2, 0x4e, 0xf7, 0xdd, 0xd6, + 0x67, 0x89, 0x31, 0x4e, 0x3e, 0xd7, 0x17, 0x7d, 0x4e, 0x78, 0x71, 0x6f, 0x94, 0xff, 0xde, 0xdb, 0xfc, 0x95, 0xec, 0x33, 0x18, 0xd7, 0xc6, 0x98, 0x32, 0x57, 0xd7, 0xaf, 0x66, 0x9f, 0x88, 0x07, + 0x84, 0x35, 0x57, 0xe5, 0x5a, 0xa0, 0xdd, 0xe9, 0x7e, 0x47, 0xce, 0x19, 0x76, 0xdb, 0xc5, 0x1b, 0x6a, 0xc6, 0x0a, 0x11, 0x2a, 0xa7, 0xa4, 0x18, 0x44, 0x1c, 0x96, 0x2e, 0xb4, 0x59, 0x83, 0x8a, + 0xb5, 0x83, 0x00, 0x1b, 0x4d, 0x50, 0xda, 0x28, 0x9f, 0xb1, 0x72, 0x82, 0x82, 0x87, 0xad, 0xc0, 0x6e, 0x16, 0x0c, 0xd8, 0xeb, 0x9b, 0xf0, 0x3c, 0xf4, 0x1e, 0xca, 0xd1, 0x27, 0xf1, 0x3c, 0x8e, + 0x4b, 0xb8, 0x6c, 0x6e, 0x43, 0xfe, 0x5d, 0xe5, 0xc3, 0x47, 0x58, 0x84, 0x27, 0xaa, 0xcf, 0x60, 0x5c, 0x99, 0xeb, 0x91, 0x39, 0x62, 0x3c, 0x86, 0x33, 0x29, 0x43, 0xe7, 0x19, 0x87, 0x01, 0x6b, + 0xfd, 0x54, 0x4d, 0x25, 0x02, 0x28, 0xa0, 0xcd, 0x94, 0xef, 0x22, 0x3b, 0x26, 0x7a, 0x5e, 0xa1, 0x0e, 0x61, 0xba, 0x94, 0xd0, 0x62, 0xa3, 0x6c, 0x20, 0xc2, 0xb4, 0x79, 0x2f, 0x32, 0xe9, 0x78, + 0x7b, 0xa4, 0xd6, 0xb6, 0x2b, 0x56, 0xeb, 0x6a, 0x71, 0x46, 0xe8, 0x13, 0x5c, 0x0a, 0xca, 0x01, 0x55, 0x1b, 0x81, 0x8d, 0xa9, 0xb3, 0x34, 0x6b, 0x47, 0x61, 0xf1, 0x85, 0xc7, 0xed, 0x7b, 0x7b, + 0x23, 0xf2, 0x80, 0x48, 0x7e, 0xdf, 0xd3, 0x76, 0x84, 0x28, 0x5e, 0x40, 0x3c, 0x38, 0x75, 0xf4, 0xd5, 0x39, 0x29, 0xa1, 0x59, 0x13, 0xab, 0x83, 0xd4, 0x09, 0xae, 0x1e, 0xd6, 0x9d, 0x0e, 0xee, + 0x68, 0x3d, 0x36, 0x05, 0x94, 0x43, 0xe7, 0x6c, 0xa9, 0x94, 0x11, 0x0e, 0x1d, 0x90, 0xd9, 0x5e, 0x5b, 0x93, 0xf4, 0xe0, 0x40, 0x6c, 0xeb, 0x44, 0x0b, 0x0d, 0x5d, 0x4b, 0xb0, 0x50, 0x23, 0xcc, + 0xaa, 0x81, 0x4a, 0x07, 0x50, 0x10, 0x7d, 0xb5, 0xce, 0xf9, 0xa8, 0x39, 0x8d, 0x71, 0x29, 0xcd, 0x83, 0xf4, 0xde, 0x8e, 0x4a, 0xfc, 0x81, 0xd1, 0x07, 0xd4, 0x97, 0x17, 0x8a, 0x57, 0x08, 0xd2, + 0x6c, 0x72, 0x23, 0xf1, 0x73, 0xf7, 0xeb, 0xcd, 0x40, 0x14, 0x8a, 0x17, 0xf9, 0x53, 0xbe, 0x13, 0xbc, 0x42, 0x85, 0xc1, 0x4c, 0x0b, 0x50, 0xc7, 0x77, 0x63, 0x44, 0x9b, 0xae, 0xa0, 0x66, 0x35, + 0xb0, 0x2c, 0x5f, 0xd1, 0x0e, 0x89, 0x71, 0x41, 0xca, 0xee, 0xd7, 0xa1, 0xcd, 0x97, 0xbc, 0xcc, 0x9c, 0x72, 0x4b, 0x97, 0x72, 0x29, 0xb0, 0x3c, 0x54, 0x51, 0x50, 0xdc, 0x06, 0x97, 0x5b, 0x59, + 0x4f, 0x32, 0x4c, 0xf6, 0x8e, 0x88, 0x1a, 0x8d, 0xc8, 0x93, 0x78, 0x95, 0x35, 0x4b, 0xc7, 0x7e, 0xd6, 0x3d, 0x7e, 0x34, 0xa3, 0xdf, 0x6e, 0xa8, 0x0c, 0xf7, 0x4d, 0x96, 0x91, 0xdf, 0xcf, 0xf2, + 0x28, 0xf5, 0xf1, 0xc6, 0x1f, 0x03, 0xd9, 0xdd, 0xd8, 0xa8, 0xab, 0xfa, 0xc6, 0x20, 0x5e, 0xb7, 0x82, 0x77, 0xfe, 0x27, 0x57, 0xc4, 0xaa, 0xda, 0x9e, 0x54, 0x4e, 0x19, 0x5c, 0xcd, 0x1c, 0xe5, + 0xf3, 0x8e, 0xf6, 0xc1, 0x99, 0xa3, 0x68, 0x02, 0x2b, 0x9a, 0xb8, 0x59, 0x99, 0x18, 0xf5, 0xa4, 0x49, 0x9d, 0xca, 0x32, 0xf2, 0xdb, 0xb8, 0x5c, 0xb9, 0xd6, 0xf7, 0xd5, 0xb8, 0xb2, 0x34, 0xb0, + 0x26, 0x66, 0xf6, 0x54, 0xba, 0xf1, 0x9b, 0x5c, 0x67, 0x77, 0x9e, 0xff, 0xf5, 0x36, 0xf2, 0x48, 0x94, 0xe5, 0x57, 0x0f, 0x78, 0x9e, 0x29, 0x1f, 0x4e, 0x5f, 0x7d, 0x3c, 0x46, 0xac, 0x21, 0x6c, + 0xa1, 0x62, 0x79, 0xc7, 0x48, 0x65, 0x8d, 0xf2, 0x8d, 0x38, 0x9b, 0x1d, 0x69, 0xfe, 0x08, 0x1d, 0x22, 0x3c, 0xda, 0x81, 0x9a, 0x35, 0xe7, 0x71, 0x57, 0x90, 0xd8, 0xb3, 0x37, 0x17, 0x91, 0xf3, + 0x06, 0x5f, 0xb9, 0x2a, 0xd4, 0x9a, 0xc1, 0x6a, 0xba, 0x32, 0x37, 0x5e, 0x9c, 0x0e, 0x8e, 0x5c, 0x09, 0x53, 0x82, 0x3b, 0xa7, 0x86, 0x43, 0xf0, 0x27, 0x06, 0x23, 0x73, 0x9d, 0xc6, 0x8d, 0xf6, + 0x50, 0x7e, 0x52, 0x61, 0xbd, 0x53, 0x29, 0xfc, 0x73, 0x02, 0xfe, 0x2b, 0xd9, 0x0b, 0x0a, 0x2f, 0x8d, 0xb1, 0xe2, 0x7c, 0x1b, 0x59, 0x8c, 0x54, 0xee, 0xf4, 0x0c, 0x96, 0xf5, 0xad, 0x99, 0xe2, + 0xbb, 0xed, 0x52, 0xca, 0x3d, 0xf0, 0x94, 0xac, 0x65, 0x02, 0x2f, 0xb2, 0xd3, 0xc9, 0xb7, 0x96, 0x9c, 0x0b, 0x9a, 0xb8, 0x93, 0xc7, 0x51, 0x64, 0x94, 0x2a, 0x94, 0x4c, 0xcf, 0x54, 0x9e, 0xcf, + 0x8d, 0x1a, 0x4b, 0x62, 0xb1, 0x38, 0x56, 0xa7, 0x7c, 0x10, 0x1a, 0xcd, 0x13, 0x51, 0x65, 0x37, 0x94, 0xda, 0x6a, 0x7f, 0x56, 0xef, 0x25, 0xbb, 0xff, 0x08, 0xc7, 0x45, 0x8a, 0x99, 0x5c, 0xba, + 0x76, 0x77, 0x09, 0x7d, 0x68, 0x3b, 0x79, 0x43, 0xf8, 0x06, 0xc9, 0x4b, 0x73, 0x9c, 0x6b, 0x24, 0xb1, 0x97, 0xa1, 0x96, 0x50, 0x8b, 0x90, 0x4e, 0xa1, 0x95, 0x00, 0x1e, 0x67, 0xb6, 0x4d, 0x67, + 0x94, 0xa7, 0x23, 0x9b, 0x11, 0xae, 0x83, 0x79, 0xe9, 0xd4, 0x75, 0x70, 0x37, 0xb1, 0x15, 0xf2, 0x50, 0x96, 0xbf, 0x67, 0xa2, 0xb7, 0xee, 0x5c, 0x0f, 0x27, 0xc8, 0xb8, 0xcc, 0x7e, 0x91, 0x5a, + 0x8b, 0x58, 0x05, 0x6d, 0xcf, 0x20, 0x73, 0x02, 0xd7, 0x9b, 0xa9, 0x6c, 0x9f, 0xfc, 0x99, 0x4b, 0x82, 0x42, 0x22, 0x9d, 0x64, 0x35, 0x5a, 0x94, 0x60, 0x09, 0x9e, 0xa2, 0x1d, 0xda, 0x0e, 0x6b, + 0x00, 0x6a, 0x29, 0x23, 0x39, 0x30, 0x7d, 0x60, 0xc8, 0xfb, 0xed, 0xb9, 0xa2, 0x04, 0x3a, 0x1e, 0x6a, 0x77, 0x7b, 0x52, 0x41, 0xb2, 0x91, 0x8f, 0xfc, 0xfa, 0x44, 0x90, 0xe4, 0xb0, 0xe5, 0xe2, + 0x7b, 0x55, 0x79, 0xbe, 0x04, 0x62, 0x12, 0x5f, 0x5e, 0xab, 0x9c, 0xf8, 0x4e, 0x9c, 0xdf, 0x5f, 0x0b, 0x1e, 0xcb, 0xf4, 0x77, 0xe7, 0x19, 0x6f, 0x61, 0x7a, 0x7f, 0x65, 0x4c, 0x26, 0xc0, 0x2b, + 0x87, 0x65, 0x72, 0x88, 0x25, 0x4d, 0xd3, 0xd2, 0xd8, 0xef, 0x8f, 0x8b, 0xa9, 0x80, 0xa8, 0xdd, 0xb1, 0x2b, 0xdc, 0x73, 0x3c, 0x5b, 0xc4, 0xbc, 0xa0, 0x69, 0x31, 0xb0, 0xf7, 0x59, 0x50, 0x01, + 0x56, 0x94, 0x31, 0x6d, 0x84, 0x18, 0xcc, 0x8e, 0x05, 0x0d, 0x77, 0x08, 0xbb, 0xc5, 0xb1, 0x8d, 0x0f, 0x89, 0xf1, 0xb0, 0xdb, 0xdb, 0xd4, 0xce, 0x3d, 0x69, 0x1b, 0xd4, 0xca, 0x94, 0x3d, 0x76, + 0xd8, 0x89, 0x12, 0xf2, 0x98, 0x9a, 0xf3, 0x96, 0x63, 0x23, 0x70, 0xdd, 0xdf, 0xcf, 0x76, 0x82, 0x7b, 0x2b, 0xef, 0xa5, 0xcb, 0xc3, 0xc4, 0x1c, 0xea, 0xbb, 0x41, 0x0e, 0xf8, 0x43, 0xc1, 0x2d, + 0x6f, 0x09, 0x3f, 0x43, 0xfb, 0xd4, 0x9c, 0xe0, 0xe3, 0x82, 0x5d, 0x16, 0x8b, 0x0e, 0x42, 0xa7, 0x87, 0xa4, 0xa4, 0x8b, 0x05, 0x47, 0x25, 0x06, 0x48, 0x8a, 0x5b, 0xb4, 0x62, 0xce, 0xa0, 0x32, + 0xd4, 0x76, 0xbd, 0x29, 0x21, 0x0c, 0x03, 0xe5, 0xe3, 0xa6, 0x5e, 0x41, 0x1d, 0x37, 0x8d, 0xcd, 0x69, 0xb8, 0x2d, 0xa6, 0xf5, 0x66, 0x58, 0xf7, 0xc7, 0xae, 0x96, 0x37, 0xab, 0xce, 0x28, 0x11, + 0xba, 0xa8, 0x83, 0x19, 0x16, 0xcc, 0x4f, 0xfb, 0x2e, 0x9b, 0x6e, 0xb6, 0xd1, 0xf9, 0xb3, 0x91, 0x20, 0x2f, 0x33, 0xcb, 0xa9, 0xaa, 0xab, 0xd5, 0xef, 0xb2, 0xb7, 0x19, 0xa5, 0x77, 0x0f, 0x09, + 0xe4, 0x31, 0xe9, 0xec, 0x8b, 0x07, 0x5c, 0x11, 0xf9, 0x7c, 0xfa, 0xba, 0xd4, 0x8c, 0x58, 0x7f, 0xd1, 0xac, 0x39, 0x8a, 0xb9, 0xec, 0xd7, 0x5e, 0x69, 0x8a, 0x06, 0x4c, 0x6e, 0x48, 0xa0, 0xe9, + 0xc5, 0x43, 0xbe, 0x3e, 0x68, 0x27, 0x63, 0x29, 0x91, 0xe0, 0xcc, 0xcf, 0x76, 0x28, 0x30, 0x03, 0x40, 0xd8, 0x99, 0x56, 0x51, 0x79, 0x76, 0xe2, 0x65, 0x00, 0xda, 0xea, 0x99, 0xd5, 0x86, 0xd6, + 0xec, 0x1b, 0x93, 0x5d, 0x10, 0xa7, 0x14, 0x19, 0xf2, 0xca, 0x3a, 0x70, 0x01, 0xb7, 0x59, 0x2c, 0x52, 0xd8, 0x18, 0xb7, 0xfe, 0x66, 0x5e, 0xe9, 0x54, 0xdf, 0x01, 0xf4, 0x00, 0xdb, 0xf6, 0x44, + 0xf4, 0x06, 0xca, 0xf5, 0xf0, 0x0a, 0xc4, 0x08, 0xee, 0x8d, 0x94, 0x82, 0x55, 0xbd, 0x8d, 0x63, 0x7c, 0x6b, 0xa7, 0xdc, 0x9a, 0xef, 0x60, 0x08, 0x5a, 0x03, 0x54, 0xbf, 0x51, 0x77, 0xb8, 0x77, + 0x42, 0xe4, 0xee, 0xa4, 0x45, 0x07, 0x22, 0xd8, 0xb4, 0x06, 0x64, 0xaa, 0x41, 0xad, 0x73, 0x06, 0xa8, 0xf2, 0xe5, 0xde, 0xb4, 0x13, 0x0f, 0x2d, 0x11, 0x35, 0x35, 0x02, 0xfb, 0x3c, 0x95, 0x9b, + 0xc4, 0x86, 0x14, 0xc9, 0xe0, 0x4b, 0x3d, 0x5e, 0x4c, 0x95, 0x69, 0xf5, 0xc9, 0xea, 0x99, 0x97, 0x59, 0x32, 0xb1, 0xe2, 0xc0, 0xb9, 0x5f, 0x31, 0xf2, 0xb1, 0xca, 0x3e, 0x6f, 0x08, 0xdf, 0x3a, + 0xff, 0xdc, 0x9a, 0xc0, 0x23, 0x4b, 0xfc, 0xac, 0xfa, 0xc3, 0xac, 0x34, 0x09, 0x37, 0x12, 0xd3, 0x5a, 0x5e, 0x65, 0xbb, 0x65, 0xdb, 0x62, 0x85, 0x0d, 0xd2, 0x51, 0x56, 0x86, 0x71, 0x10, 0x34, + 0x22, 0xd2, 0xec, 0x4f, 0x73, 0x84, 0x9b, 0xc3, 0x24, 0x7f, 0x3c, 0x70, 0x5a, 0x5d, 0x9f, 0x6c, 0x26, 0x53, 0x55, 0xb0, 0xed, 0x45, 0x5f, 0xb6, 0xa3, 0x8c, 0x9d, 0xb3, 0xfc, 0x94, 0xa6, 0x57, + 0x50, 0x1e, 0x22, 0x31, 0xb5, 0xa4, 0x22, 0xa7, 0x25, 0x46, 0x84, 0x02, 0xd5, 0x76, 0xe0, 0x39, 0x4f, 0x41, 0xff, 0xd0, 0x7d, 0x33, 0x64, 0x5e, 0x66, 0xfd, 0x30, 0x31, 0x6c, 0xfb, 0xfe, 0xd6, + 0xf6, 0x48, 0x66, 0xf4, 0x57, 0xb2, 0x37, 0xd8, 0x9e, 0x1a, 0xd7, 0x59, 0x33, 0x22, 0x7e, 0x2a, 0x8e, 0xe5, 0x8a, 0xdf, 0xee, 0x8f, 0xcc, 0x51, 0x3a, 0x60, 0x58, 0x68, 0x97, 0x47, 0x50, 0x44, + 0xc9, 0x22, 0x4e, 0x03, 0x37, 0xa8, 0x19, 0x09, 0xd0, 0xbb, 0x32, 0x49, 0x74, 0x2b, 0xdb, 0x73, 0xc3, 0x96, 0x6b, 0x6b, 0xbd, 0xcf, 0x07, 0x05, 0x4a, 0x11, 0xd0, 0x64, 0x40, 0x01, 0xab, 0xe9, + 0xd9, 0x4c, 0x07, 0xbd, 0x0d, 0x6b, 0xeb, 0x47, 0x92, 0xe3, 0x4b, 0x23, 0xe3, 0x60, 0x40, 0xd5, 0x66, 0x63, 0x78, 0xfe, 0xac, 0xec, 0x8c, 0xd2, 0xbe, 0x75, 0xef, 0x13, 0x8b, 0xfe, 0xb6, 0x20, + 0xed, 0x53, 0xf5, 0xd9, 0xaf, 0x31, 0x7d, 0xe7, 0xcb, 0x7d, 0xcf, 0x12, 0xf1, 0xf7, 0x99, 0xbf, 0xdf, 0xd0, 0xbd, 0xa0, 0xfa, 0xda, 0x1a, 0x9b, 0xf3, 0x9b, 0x24, 0x19, 0xbd, 0xeb, 0xe5, 0xa4, + 0xe7, 0xd2, 0x06, 0x35, 0x76, 0x38, 0x86, 0x1c, 0x01, 0x95, 0x5a, 0x0c, 0xb9, 0x70, 0x36, 0xdd, 0x0d, 0x30, 0xc7, 0x55, 0x99, 0x89, 0xd0, 0xe6, 0x14, 0x9e, 0xfa, 0x94, 0x80, 0x71, 0xd8, 0x58, + 0xf3, 0xcb, 0xda, 0x3f, 0x69, 0x3b, 0xf5, 0x50, 0x1c, 0x60, 0x16, 0xcf, 0x36, 0xad, 0x07, 0xc4, 0xa1, 0x61, 0x20, 0xe2, 0x26, 0x00, 0x14, 0xb7, 0x9d, 0x8b, 0xf2, 0xa8, 0x92, 0x19, 0x79, 0x93, + 0xdc, 0xe3, 0x06, 0x1f, 0xf3, 0x8b, 0xbb, 0x10, 0xbc, 0x60, 0xd0, 0x24, 0xf9, 0x58, 0x1f, 0xb8, 0x6d, 0xa7, 0x0f, 0x40, 0x8e, 0xee, 0x17, 0x15, 0x2c, 0x0d, 0xb5, 0x0d, 0x86, 0x9a, 0x55, 0x63, + 0x5d, 0xde, 0x62, 0xd3, 0x55, 0xa0, 0xcd, 0x0b, 0x7b, 0xba, 0x8b, 0x2d, 0x5c, 0x57, 0xec, 0x08, 0x52, 0x00, 0x4a, 0x3b, 0xb7, 0x44, 0xb8, 0xc3, 0xe9, 0x38, 0x42, 0x0f, 0xbb, 0x44, 0xda, 0xc2, + 0x6e, 0x4d, 0x4c, 0x0f, 0xbd, 0x04, 0xad, 0x79, 0x7d, 0xb9, 0x01, 0x4e, 0xd2, 0xe2, 0x88, 0xd0, 0x0b, 0xbf, 0x7b, 0x6c, 0xf3, 0xbf, 0x30, 0xae, 0x99, 0x7b, 0x11, 0x1b, 0x1d, 0x23, 0x79, 0x61, + 0x00, 0xde, 0xcd, 0xb5, 0x77, 0x65, 0xca, 0xef, 0xcd, 0xb3, 0x26, 0x1d, 0xac, 0xec, 0x6e, 0x09, 0x92, 0xc7, 0xca, 0xfb, 0x3d, 0x13, 0xbd, 0xa2, 0x7b, 0x3b, 0x1c, 0x53, 0xda, 0xef, 0x82, 0xb0, + 0xba, 0xab, 0x76, 0xa1, 0xed, 0x02, 0x21, 0x9e, 0xc4, 0xc0, 0x00, 0x12, 0x4b, 0x6e, 0x25, 0xe9, 0x66, 0xb9, 0x00, 0xa9, 0x1c, 0xd1, 0x3c, 0x03, 0xda, 0x48, 0xb5, 0x5d, 0x1c, 0xd6, 0x1a, 0xa2, + 0x3a, 0x78, 0xe6, 0x6f, 0x24, 0x66, 0x5a, 0x19, 0xcc, 0x66, 0xb3, 0x95, 0xda, 0x7c, 0x0a, 0x08, 0x7b, 0x3a, 0x2f, 0x95, 0xd6, 0x69, 0x6d, 0x55, 0x1f, 0xcc, 0x34, 0x44, 0xac, 0x96, 0x12, 0x59, + 0x1b, 0xfa, 0xbc, 0xd6, 0x37, 0xb9, 0xf1, 0xcf, 0x6e, 0xff, 0x4d, 0x6e, 0x5c, 0x7b, 0x9b, 0x1b, 0x63, 0xb7, 0x77, 0x9f, 0xdd, 0xac, 0xa0, 0x8a, 0x92, 0xd4, 0xad, 0x06, 0x5a, 0xb6, 0xea, 0x13, + 0x44, 0x2d, 0xb0, 0xf2, 0x32, 0xb5, 0x99, 0x72, 0xcd, 0x09, 0x85, 0x30, 0xc7, 0xfb, 0xa4, 0x1c, 0x2a, 0x7d, 0x40, 0x03, 0x7c, 0x8e, 0x66, 0x6c, 0xb6, 0x4d, 0x0d, 0x52, 0x9b, 0x89, 0x86, 0x0d, + 0x90, 0x0d, 0x8c, 0xe0, 0xc0, 0x79, 0x05, 0xaf, 0x04, 0xf5, 0x98, 0x2c, 0xd9, 0xa8, 0xf4, 0x4d, 0xd4, 0x42, 0x94, 0x32, 0x78, 0x2c, 0x6e, 0xe5, 0x26, 0xe0, 0x4f, 0xbc, 0xcc, 0xb8, 0xad, 0xf5, + 0xc8, 0x7d, 0x15, 0x77, 0x71, 0x8f, 0x2b, 0x20, 0xfe, 0xc0, 0x8f, 0x24, 0x78, 0x2f, 0x2e, 0x0c, 0x41, 0x51, 0x4d, 0x6e, 0x3f, 0xff, 0x19, 0xb5, 0x64, 0xbf, 0xb6, 0xc3, 0x73, 0x71, 0x4e, 0x4f, + 0x9e, 0x6b, 0x63, 0x39, 0x1f, 0x04, 0x64, 0xb5, 0xaa, 0x0d, 0x6d, 0x41, 0x95, 0x3d, 0x45, 0x11, 0xb0, 0x4f, 0x8b, 0x14, 0xb4, 0x2f, 0x0d, 0x0d, 0x5f, 0x1e, 0x20, 0x55, 0x0e, 0xcc, 0x93, 0x7e, + 0xda, 0xec, 0x03, 0x1b, 0x32, 0xda, 0xf3, 0x6a, 0x19, 0x31, 0x6b, 0x7d, 0xbb, 0x4e, 0x9a, 0x1e, 0xd9, 0xe3, 0x89, 0x2a, 0x42, 0x2b, 0xd7, 0xaa, 0x11, 0x79, 0x3e, 0x62, 0x2b, 0xfc, 0x9b, 0xa2, + 0xe3, 0x45, 0xe3, 0x34, 0xce, 0xe4, 0x9a, 0x8f, 0xa0, 0x36, 0xaa, 0xe8, 0x1b, 0x99, 0xfe, 0xef, 0xd9, 0xa8, 0x0f, 0xb4, 0x2f, 0xe0, 0xbd, 0x3f, 0x73, 0x95, 0xee, 0x47, 0x30, 0x55, 0x42, 0x63, + 0x08, 0x7b, 0x83, 0x70, 0x63, 0xee, 0x80, 0x6f, 0x8c, 0xbd, 0x26, 0x9f, 0x37, 0x59, 0x04, 0x61, 0x9b, 0xf3, 0x61, 0x0b, 0xcf, 0x67, 0x84, 0xb1, 0xf4, 0x5b, 0xbc, 0x74, 0xb7, 0x27, 0x54, 0xf2, + 0x8a, 0x19, 0xc0, 0x23, 0x73, 0x3f, 0xd7, 0xe5, 0x74, 0x36, 0xa7, 0x7c, 0x2a, 0xc0, 0xf4, 0x45, 0x44, 0xef, 0x29, 0x15, 0xdf, 0x15, 0x11, 0x43, 0xaf, 0x66, 0x64, 0x89, 0xf9, 0x4e, 0x88, 0x72, + 0xd3, 0x4f, 0x1f, 0xda, 0x5d, 0x4d, 0xd2, 0x3d, 0x1d, 0xf1, 0xdf, 0xc7, 0xc5, 0x7e, 0xfd, 0x88, 0x2b, 0x30, 0x5f, 0x5d, 0x18, 0x9b, 0x1c, 0xa2, 0xd6, 0xe6, 0xb0, 0x0c, 0xfb, 0xde, 0xb0, 0x6b, + 0x56, 0x5e, 0x9c, 0x29, 0xa0, 0xa6, 0x56, 0x48, 0x07, 0xe3, 0x4d, 0x2a, 0x29, 0x3e, 0x55, 0xb8, 0x0d, 0x58, 0xcc, 0x0f, 0xae, 0x7f, 0xd0, 0x8c, 0xc4, 0xe8, 0x48, 0x77, 0xf0, 0x9b, 0x84, 0x33, + 0x90, 0x61, 0x99, 0xdb, 0xfb, 0x8c, 0x22, 0x5b, 0x0d, 0x45, 0xca, 0xb5, 0x15, 0x87, 0x00, 0xe6, 0x9e, 0x34, 0x59, 0x3d, 0xf2, 0xd5, 0x94, 0x5d, 0xb5, 0x9f, 0xe4, 0x92, 0xd2, 0xfa, 0x66, 0x76, + 0xfc, 0xfd, 0xee, 0x5e, 0x5a, 0xe0, 0x04, 0x2c, 0xad, 0xeb, 0x1c, 0x18, 0xb1, 0x97, 0x0f, 0xa8, 0xb9, 0xf4, 0x0a, 0x2e, 0x44, 0x65, 0xda, 0xee, 0xb7, 0xe6, 0x36, 0xca, 0x92, 0x38, 0xf3, 0xa3, + 0xb6, 0x9a, 0x51, 0x9e, 0x3d, 0x0b, 0x8e, 0x72, 0xbc, 0xa7, 0x37, 0x29, 0xed, 0xbb, 0x29, 0x40, 0x4b, 0xbd, 0x87, 0x99, 0x16, 0x81, 0xd8, 0xd4, 0xc1, 0xa2, 0x4f, 0x30, 0xde, 0x19, 0x2d, 0xe3, + 0x7a, 0x4e, 0x3f, 0xf7, 0x2c, 0xcb, 0x8a, 0x7c, 0x4b, 0x6f, 0x87, 0x6e, 0x90, 0x35, 0x49, 0x7c, 0x6c, 0x3b, 0xbb, 0xa5, 0x8a, 0x7c, 0x4d, 0x58, 0x06, 0x7d, 0x34, 0xa3, 0x07, 0x69, 0x70, 0xb9, + 0xf0, 0x6f, 0xf8, 0x83, 0x99, 0xfa, 0x6d, 0x80, 0xf0, 0xb3, 0x73, 0xc7, 0x9b, 0xab, 0x55, 0x5d, 0x06, 0xf9, 0xcd, 0xa7, 0xc0, 0xca, 0x92, 0xe7, 0x72, 0xf8, 0xbf, 0xff, 0x8d, 0xdc, 0x4f, 0x88, + 0x56, 0x3a, 0x86, 0x6d, 0x07, 0xe5, 0x7d, 0x66, 0xe3, 0x11, 0x67, 0x87, 0x67, 0xa2, 0x97, 0xf1, 0x79, 0x3a, 0x9c, 0xa0, 0xe3, 0x9c, 0x1c, 0x2c, 0xde, 0x6f, 0x48, 0x0b, 0xa4, 0x4a, 0xdb, 0x8f, + 0x56, 0xea, 0xa9, 0xd2, 0x80, 0xac, 0xa2, 0x7d, 0x77, 0x3f, 0x40, 0x9b, 0x20, 0xea, 0xf2, 0x15, 0x07, 0xe2, 0x40, 0x90, 0x64, 0xc0, 0x36, 0x77, 0x8c, 0xea, 0xb0, 0xa0, 0xb2, 0x86, 0x2d, 0x57, + 0x65, 0xac, 0x45, 0xdd, 0x01, 0x02, 0x80, 0x34, 0x0c, 0x86, 0x86, 0x69, 0x2d, 0x52, 0x5c, 0x68, 0xf8, 0x01, 0x6d, 0xa2, 0x56, 0xa7, 0x8a, 0x64, 0xf1, 0x98, 0x93, 0xc3, 0xe7, 0x54, 0x24, 0x77, + 0x31, 0xf4, 0x9c, 0x3e, 0xff, 0x93, 0x97, 0x59, 0x9d, 0xd5, 0x43, 0xee, 0xfc, 0x71, 0x63, 0xe3, 0xae, 0xc4, 0x0d, 0x3f, 0xa4, 0xf9, 0xfa, 0xfa, 0x11, 0x57, 0x7c, 0xbf, 0xba, 0x70, 0x8d, 0xa0, + 0x1d, 0x81, 0x36, 0x02, 0xc8, 0xd0, 0x1c, 0xf7, 0xa6, 0x38, 0x2c, 0xc6, 0x5a, 0xbc, 0x39, 0x13, 0x43, 0x83, 0x83, 0x3c, 0x8a, 0xae, 0xad, 0x8a, 0xdd, 0x6f, 0xe3, 0xad, 0x5b, 0x0d, 0x6b, 0x63, + 0xbb, 0x31, 0x96, 0xd8, 0x62, 0x86, 0x94, 0xd8, 0x20, 0x51, 0x7c, 0xab, 0xf0, 0x9b, 0xe3, 0x51, 0x02, 0x5d, 0x85, 0x8e, 0xf6, 0xb9, 0x69, 0x9a, 0x7a, 0xbc, 0xc7, 0xbd, 0x21, 0x35, 0xd9, 0xd3, + 0x36, 0xc8, 0x83, 0x40, 0x0d, 0x1e, 0x43, 0x7b, 0xa4, 0x47, 0xe9, 0x17, 0x0e, 0xce, 0xe4, 0x0f, 0x0e, 0xce, 0x37, 0x88, 0xee, 0xcf, 0xf0, 0x47, 0x7c, 0x9c, 0x9e, 0x68, 0xbe, 0x0c, 0x40, 0x3e, + 0x36, 0x47, 0x9b, 0x2e, 0xae, 0xcf, 0x36, 0x35, 0x28, 0x95, 0x2c, 0xcf, 0xc8, 0x90, 0x5a, 0xce, 0xf7, 0xb1, 0xb4, 0x54, 0x3b, 0x0f, 0x97, 0xdc, 0x64, 0x06, 0x27, 0x65, 0x01, 0x6d, 0x24, 0x2c, + 0x5d, 0xfa, 0x3e, 0x8e, 0x6d, 0x0d, 0x4e, 0x40, 0x7b, 0xdb, 0x08, 0xc0, 0x76, 0x75, 0x64, 0x1a, 0x12, 0xcb, 0xb9, 0x4e, 0xa1, 0xc4, 0xbe, 0x72, 0xf8, 0x3d, 0x81, 0x37, 0x88, 0xb0, 0x4e, 0xb2, + 0x4a, 0xb6, 0xf6, 0x0c, 0x34, 0xc6, 0x84, 0xfb, 0xb5, 0x67, 0xce, 0xd7, 0x3b, 0xd3, 0x23, 0xf6, 0x88, 0x2f, 0xe8, 0xdf, 0xd0, 0xf9, 0x78, 0x76, 0x82, 0x8d, 0xb3, 0x46, 0x48, 0x40, 0x7c, 0x3a, + 0x4b, 0x65, 0xe5, 0xb9, 0x02, 0x70, 0x64, 0x73, 0x66, 0x8f, 0x1e, 0xa9, 0x99, 0xcc, 0x79, 0xe0, 0x31, 0xd4, 0x55, 0x22, 0x91, 0xf7, 0x9b, 0xc6, 0xd1, 0x43, 0x94, 0xe5, 0x80, 0x56, 0x60, 0xf7, + 0x59, 0x41, 0xef, 0x73, 0xfa, 0xc8, 0xa0, 0x5e, 0xd2, 0x60, 0xd5, 0x62, 0x1a, 0x8b, 0x55, 0xa8, 0x9e, 0xc2, 0x05, 0x0c, 0xdb, 0x32, 0x77, 0x2c, 0x9c, 0xc4, 0x45, 0x5b, 0xa7, 0x80, 0x1f, 0x5b, + 0xaf, 0xaf, 0x1b, 0xd7, 0x6d, 0xbd, 0xa5, 0xee, 0xce, 0xb1, 0x5b, 0x3f, 0xef, 0x47, 0xed, 0x3c, 0x96, 0x7f, 0xfd, 0x2d, 0xe1, 0xb7, 0x78, 0x36, 0x65, 0x3c, 0x36, 0xf7, 0x3a, 0x65, 0x58, 0x9a, + 0xaa, 0x1e, 0xd6, 0xd0, 0x2c, 0x92, 0x5b, 0x62, 0x37, 0x13, 0x43, 0x16, 0x6d, 0x45, 0x63, 0xad, 0xea, 0xd1, 0x61, 0xda, 0x65, 0xd8, 0x56, 0x5c, 0x98, 0x34, 0xa7, 0xc9, 0x2c, 0x9b, 0xa6, 0xbc, + 0x40, 0xe7, 0x5c, 0x61, 0x1f, 0xcb, 0x35, 0xb1, 0xc7, 0x84, 0x03, 0xc4, 0x49, 0xeb, 0x0c, 0x3c, 0x29, 0xed, 0x06, 0xaf, 0x59, 0x50, 0xc5, 0xb7, 0x0b, 0xf0, 0x20, 0x1f, 0x5d, 0xc8, 0x89, 0xfe, + 0xf7, 0x80, 0xbc, 0x2a, 0xaa, 0xdb, 0xbb, 0xf5, 0x81, 0x1e, 0xf3, 0x49, 0x7c, 0x25, 0x7b, 0x05, 0xf1, 0xb9, 0x31, 0xc6, 0x1f, 0x11, 0x9e, 0xf0, 0xc8, 0xaa, 0x02, 0xc2, 0x21, 0xe9, 0x34, 0x8e, + 0x11, 0x67, 0xa8, 0xdc, 0xe0, 0xca, 0x92, 0xc2, 0x19, 0x98, 0x14, 0x3f, 0x66, 0x71, 0xfb, 0x3a, 0x63, 0xf3, 0x3d, 0xc9, 0xeb, 0xef, 0x05, 0x88, 0x2f, 0xe8, 0x5f, 0xfb, 0xf3, 0xe9, 0xec, 0xd8, + 0x0a, 0xc3, 0xaa, 0x0b, 0xa5, 0x27, 0x87, 0xd8, 0x55, 0xce, 0x39, 0x58, 0xf0, 0x0d, 0x30, 0xcb, 0xa7, 0x66, 0x10, 0x1c, 0xcd, 0x24, 0x8f, 0x0b, 0x62, 0x3f, 0x05, 0x73, 0x80, 0xec, 0x48, 0x4d, + 0x95, 0xc0, 0x0d, 0xbd, 0xf2, 0xcb, 0x23, 0xc3, 0x1c, 0xfd, 0xce, 0x00, 0xda, 0x99, 0x30, 0x34, 0x66, 0x53, 0xb8, 0xfa, 0xe9, 0xd0, 0x3a, 0x47, 0x10, 0x64, 0x34, 0x65, 0x59, 0x31, 0x4b, 0x72, + 0xc7, 0x6d, 0xc1, 0x96, 0xfd, 0xe4, 0x7d, 0xf5, 0xd4, 0xbb, 0xfb, 0x23, 0xfa, 0x48, 0xbc, 0xd3, 0xd3, 0x6d, 0xd7, 0xfe, 0x5f, 0x8f, 0x26, 0x37, 0x42, 0x3f, 0x77, 0x3a, 0xb0, 0x00, 0x72, 0xa3, + 0x05, 0x0a, 0xa5, 0x04, 0xc8, 0x70, 0x96, 0x97, 0x8b, 0x93, 0x18, 0x05, 0x3a, 0x83, 0xeb, 0xd3, 0x33, 0x29, 0x22, 0xba, 0x9f, 0x4c, 0x55, 0xde, 0x38, 0xf4, 0xf6, 0x86, 0xed, 0x39, 0xa3, 0x0a, + 0x9c, 0xc5, 0xbc, 0x04, 0x06, 0x55, 0x07, 0x4f, 0x89, 0x5a, 0x59, 0xd1, 0x2a, 0xe0, 0x62, 0x18, 0x31, 0x4a, 0x68, 0x20, 0xd4, 0x40, 0x65, 0x7a, 0x34, 0xc1, 0x76, 0xab, 0xf4, 0xc1, 0x95, 0xe5, + 0x9d, 0x63, 0xcd, 0x4d, 0xce, 0x22, 0xee, 0x7d, 0x18, 0xb7, 0x4e, 0x5e, 0x06, 0xf9, 0x1b, 0x91, 0xe2, 0x61, 0x1c, 0xaf, 0x84, 0xdf, 0x80, 0x79, 0x9d, 0x4c, 0x23, 0x9d, 0x4f, 0x72, 0x13, 0xe4, + 0xb5, 0x44, 0xad, 0xea, 0x59, 0x34, 0x54, 0xbb, 0x45, 0x4f, 0xe5, 0x81, 0xb0, 0x86, 0xeb, 0xe5, 0x42, 0x90, 0xd7, 0x8b, 0x19, 0xda, 0x46, 0x2c, 0xba, 0x2c, 0x30, 0xb6, 0x99, 0xc1, 0xf6, 0x82, + 0xf0, 0x56, 0x39, 0x08, 0xb4, 0x9e, 0x5e, 0x54, 0xf3, 0xe5, 0xc6, 0xc8, 0xdb, 0x81, 0x12, 0x50, 0x19, 0xc0, 0x32, 0x72, 0xd1, 0xb5, 0x45, 0x23, 0x6d, 0xac, 0x54, 0x27, 0x77, 0xda, 0x80, 0x8d, + 0x51, 0xde, 0x3f, 0x67, 0x49, 0x8a, 0x83, 0xe8, 0x3b, 0xcf, 0xa4, 0x47, 0x3e, 0xb4, 0x57, 0xc2, 0x37, 0x50, 0x5e, 0x9a, 0x63, 0xca, 0xb1, 0xc1, 0x93, 0x48, 0xb3, 0x3c, 0xf2, 0x5c, 0x87, 0xab, + 0x85, 0x3e, 0x6f, 0x3d, 0x43, 0x5a, 0x18, 0x68, 0x9c, 0x2f, 0xa7, 0xdb, 0xcc, 0xf9, 0xda, 0x78, 0xfa, 0xc3, 0x3c, 0xf9, 0x94, 0xb7, 0xf8, 0xdb, 0xca, 0x7b, 0xa5, 0x53, 0x35, 0xc9, 0x5d, 0xdb, + 0x2b, 0xf4, 0xe8, 0x34, 0xb9, 0xd0, 0xbc, 0x81, 0x71, 0x39, 0x9a, 0x40, 0x3f, 0x4f, 0x0e, 0x78, 0x42, 0x39, 0x21, 0xa4, 0x39, 0xf2, 0x72, 0x4f, 0x88, 0x8e, 0x57, 0x50, 0x14, 0x3a, 0x2f, 0xf8, + 0xe0, 0x00, 0xad, 0x74, 0x38, 0x7a, 0x04, 0x87, 0xda, 0x2f, 0xb3, 0xc6, 0xbb, 0x72, 0xe4, 0xff, 0xbe, 0x48, 0xfe, 0x77, 0x94, 0x12, 0xa5, 0x73, 0xcf, 0xac, 0x01, 0x3d, 0xe4, 0x8e, 0x54, 0x3a, + 0xf5, 0xb5, 0xe3, 0xf5, 0x04, 0x1a, 0xe7, 0x82, 0xc4, 0x43, 0x26, 0xaa, 0x9d, 0xe4, 0x8a, 0xdc, 0xa1, 0xfa, 0x14, 0x26, 0x4f, 0x3b, 0x79, 0x80, 0x57, 0xab, 0x19, 0x49, 0x1b, 0x24, 0x43, 0xf9, + 0xad, 0xee, 0x11, 0x47, 0x16, 0x4f, 0xb6, 0x43, 0xb4, 0xe9, 0x65, 0x85, 0x45, 0xc2, 0x06, 0x5a, 0xab, 0xe6, 0x32, 0x36, 0x56, 0x92, 0x14, 0x47, 0x1a, 0x70, 0x12, 0xc8, 0x6e, 0x21, 0x01, 0xdd, + 0x91, 0x57, 0x13, 0x7a, 0x31, 0x83, 0x0c, 0x85, 0x68, 0xb5, 0x6b, 0x74, 0xff, 0xc7, 0x6e, 0x06, 0xf7, 0xc7, 0xf9, 0x31, 0xb7, 0x81, 0x27, 0x9a, 0xb7, 0xee, 0x5e, 0x8e, 0xc6, 0x38, 0x0b, 0x5c, + 0xba, 0xcc, 0x6d, 0x55, 0x8d, 0xc2, 0x4f, 0x11, 0x5b, 0x20, 0x0a, 0x62, 0x72, 0x4e, 0x0f, 0x6e, 0x45, 0x11, 0x56, 0x02, 0x55, 0x49, 0x11, 0x6e, 0xa9, 0x39, 0x98, 0xa4, 0x0d, 0xd5, 0xcc, 0xd6, + 0xec, 0x30, 0x29, 0x0d, 0x6d, 0x7d, 0xac, 0x94, 0x48, 0x6d, 0x28, 0x11, 0x33, 0x12, 0x80, 0x02, 0xf0, 0xa3, 0x69, 0x18, 0xcb, 0x18, 0x2e, 0xfc, 0x0c, 0x33, 0x8a, 0xd9, 0x4c, 0x5a, 0x09, 0x32, + 0xb6, 0xdc, 0x7f, 0xce, 0xc6, 0x53, 0x3a, 0x4d, 0xf5, 0x7d, 0x9d, 0xa4, 0xbf, 0x57, 0xaa, 0x3c, 0xd1, 0xbc, 0x76, 0xf9, 0x7a, 0x74, 0xfd, 0xc4, 0x47, 0xa8, 0x4d, 0x8e, 0xd3, 0x74, 0x45, 0x51, + 0x06, 0xea, 0x5a, 0xa0, 0x13, 0xcd, 0x17, 0x70, 0x0c, 0x81, 0x47, 0x09, 0x5e, 0x67, 0x55, 0xd0, 0xac, 0xc3, 0xe1, 0xe0, 0x93, 0x3e, 0xdd, 0xaa, 0x0a, 0xbf, 0xd2, 0x3c, 0xc5, 0x72, 0x97, 0x6d, + 0x4d, 0x4d, 0x49, 0xd5, 0x6b, 0x42, 0xe4, 0x28, 0x6e, 0x19, 0x67, 0x8d, 0xd3, 0x4b, 0x24, 0x21, 0xc1, 0xa6, 0x1b, 0x8c, 0xad, 0x72, 0x20, 0x5c, 0xb3, 0x9e, 0x77, 0x87, 0xe1, 0xfc, 0x79, 0xf7, + 0x74, 0xed, 0xfb, 0x8a, 0x93, 0x87, 0x84, 0x49, 0xd7, 0xbe, 0xaa, 0x4e, 0x5c, 0xdb, 0x1a, 0x2b, 0x28, 0x2a, 0x88, 0x9f, 0xb5, 0xf6, 0x79, 0x61, 0x8a, 0x01, 0x49, 0x82, 0x27, 0x23, 0x34, 0xf6, + 0xbc, 0x1a, 0x21, 0xe2, 0x36, 0x01, 0x7a, 0x61, 0xed, 0xc8, 0x36, 0xcf, 0x37, 0x34, 0x19, 0x58, 0x21, 0x69, 0x46, 0xc4, 0x39, 0x40, 0x16, 0xd4, 0x72, 0x39, 0xeb, 0x03, 0xcf, 0x4a, 0x99, 0x45, + 0xbe, 0x59, 0x99, 0xc2, 0x20, 0x58, 0xde, 0xb0, 0x61, 0x02, 0x09, 0xa0, 0x52, 0xb1, 0xd4, 0x70, 0x4b, 0x5f, 0x96, 0x9f, 0x14, 0x68, 0x65, 0x90, 0x94, 0xc6, 0xbd, 0x9a, 0x9a, 0x8f, 0x15, 0x08, + 0xbf, 0x91, 0xbc, 0xf4, 0xf6, 0x7a, 0x30, 0xb6, 0x20, 0xf8, 0x46, 0x8f, 0x36, 0xbc, 0x1e, 0xcd, 0x96, 0x8b, 0x85, 0x24, 0x21, 0x5a, 0xa1, 0xea, 0xaa, 0x64, 0xf2, 0x31, 0x4f, 0x7b, 0x55, 0x7f, + 0x66, 0xa9, 0xf5, 0xb6, 0xc2, 0x62, 0x7e, 0xad, 0x82, 0x48, 0x06, 0x6d, 0xa7, 0x47, 0xba, 0x9b, 0x8a, 0xa0, 0x86, 0x66, 0x44, 0xb7, 0xe8, 0xc0, 0x60, 0xaa, 0x6d, 0x8d, 0xdc, 0x3a, 0x6e, 0x4e, + 0x5d, 0x61, 0x06, 0x68, 0x64, 0xf7, 0x6b, 0xc9, 0x9e, 0x13, 0xc8, 0x61, 0xfd, 0x98, 0xbe, 0xda, 0x8b, 0xb3, 0x6b, 0x7e, 0xc2, 0x7f, 0x91, 0x57, 0x59, 0xf8, 0xeb, 0xf5, 0xae, 0x49, 0x2f, 0x5c, + 0x84, 0x11, 0xc7, 0xce, 0x7d, 0xbe, 0xf9, 0x21, 0xa9, 0xee, 0x0d, 0xe1, 0x0b, 0x88, 0x6f, 0x9a, 0x63, 0x32, 0xfa, 0x5f, 0xa0, 0xc4, 0x63, 0x4c, 0x19, 0xf4, 0x1d, 0x45, 0x6c, 0x75, 0x30, 0x66, + 0x7a, 0xfd, 0xb0, 0x23, 0xc2, 0x62, 0x4b, 0xcd, 0x16, 0x2c, 0xb2, 0x87, 0xd6, 0x8b, 0x2d, 0x2f, 0x21, 0xc4, 0xcc, 0x0c, 0xab, 0xad, 0x32, 0x63, 0xfa, 0x95, 0xed, 0xd3, 0xa0, 0x05, 0x2d, 0x8f, + 0xd5, 0x0a, 0x18, 0xd0, 0xe9, 0xd1, 0x9d, 0x07, 0xa8, 0x7d, 0x3e, 0x53, 0x62, 0x2c, 0x37, 0x52, 0x92, 0x1a, 0x1b, 0x91, 0xcf, 0x98, 0x95, 0x4c, 0x3f, 0x06, 0xe5, 0x67, 0x5d, 0xf5, 0x4d, 0x16, + 0xb9, 0xe3, 0x49, 0x72, 0x75, 0x55, 0xfc, 0xb6, 0x3e, 0x1f, 0xfe, 0x90, 0xab, 0xda, 0x1b, 0xba, 0xe0, 0xe4, 0x6d, 0x6b, 0x82, 0x8f, 0x73, 0x56, 0x2b, 0x73, 0x74, 0x9f, 0x41, 0x24, 0x67, 0xd9, + 0x49, 0xc2, 0x99, 0xcb, 0xd6, 0x33, 0x84, 0x5e, 0xde, 0x6f, 0x4a, 0xd2, 0x5c, 0x2a, 0x7b, 0x25, 0xc2, 0xf7, 0x53, 0xb6, 0x80, 0x17, 0x40, 0x9e, 0x9b, 0xbb, 0x8c, 0x84, 0x00, 0xcd, 0x31, 0x98, + 0x3e, 0xea, 0x70, 0xc6, 0xa6, 0x04, 0x49, 0x00, 0x96, 0x0c, 0x61, 0x86, 0xa9, 0x96, 0x20, 0x4a, 0x23, 0x35, 0x73, 0x35, 0xc9, 0x1b, 0xad, 0x4d, 0xe6, 0xea, 0xa7, 0xdd, 0xe5, 0xfa, 0x62, 0x57, + 0xf5, 0xc6, 0xbd, 0xbc, 0xd4, 0x8f, 0xed, 0x30, 0x6f, 0xe8, 0x3e, 0x77, 0xff, 0xd6, 0x1a, 0xbb, 0xd3, 0x48, 0xc6, 0x71, 0xbf, 0xa8, 0x8e, 0x86, 0x20, 0x34, 0x5c, 0x17, 0xd1, 0x41, 0x98, 0xcd, + 0xa4, 0xd5, 0x8c, 0x23, 0x40, 0x87, 0x27, 0x94, 0xa0, 0x6c, 0x07, 0xe9, 0x14, 0xeb, 0x24, 0x3d, 0x93, 0x07, 0x8c, 0x01, 0xfc, 0x79, 0xeb, 0x63, 0x34, 0x11, 0xaf, 0x97, 0x40, 0x2a, 0xd9, 0xbe, + 0xb9, 0x70, 0xd7, 0xa6, 0x04, 0x78, 0x87, 0x25, 0x6d, 0x95, 0x76, 0x25, 0x1a, 0xc7, 0x0a, 0x5a, 0x00, 0x3a, 0x2d, 0x8e, 0x88, 0x89, 0xbe, 0x71, 0x15, 0xbf, 0xff, 0x0d, 0xdd, 0x0f, 0xaa, 0xab, + 0x1c, 0xab, 0x29, 0x9f, 0xc2, 0xba, 0xbe, 0xf3, 0x97, 0x47, 0x1e, 0x0a, 0xd6, 0xfd, 0x44, 0xfd, 0x1a, 0x86, 0xf4, 0xe1, 0xdc, 0x04, 0xf9, 0x39, 0x8c, 0xf7, 0x82, 0xa2, 0x8c, 0xeb, 0xe0, 0x94, + 0x4c, 0x4d, 0x51, 0xc0, 0x6b, 0x70, 0x0b, 0x56, 0x2b, 0x22, 0xd1, 0x10, 0xd6, 0xb0, 0xdc, 0x50, 0x59, 0x76, 0xe5, 0xdc, 0xda, 0x07, 0x38, 0x83, 0x9a, 0xf5, 0x4e, 0x44, 0x96, 0x3a, 0x95, 0xbb, + 0x30, 0x07, 0x1f, 0x05, 0x52, 0x9f, 0xae, 0xf0, 0x0d, 0x4e, 0xfa, 0xa1, 0x72, 0x44, 0xe4, 0x73, 0x5f, 0xc2, 0xbd, 0x08, 0x2c, 0x12, 0xda, 0x17, 0x5b, 0x36, 0x3a, 0xcf, 0xf9, 0xe4, 0xd3, 0x7e, + 0xfd, 0x29, 0x12, 0xeb, 0x2d, 0x0a, 0xe4, 0x43, 0xb9, 0x03, 0x3f, 0x46, 0x60, 0x91, 0xe3, 0xb2, 0x05, 0x4a, 0x99, 0xb3, 0xdc, 0x68, 0x3e, 0xb5, 0xe2, 0x30, 0xfa, 0x20, 0x82, 0xc6, 0xf4, 0xe0, + 0x12, 0xfa, 0x12, 0x6d, 0x9d, 0x0c, 0x9c, 0x91, 0xba, 0x52, 0x69, 0xe5, 0x7e, 0x46, 0x6c, 0xa8, 0x74, 0x98, 0xa6, 0x26, 0x4a, 0xc3, 0x4a, 0x99, 0x47, 0x8d, 0x00, 0x9c, 0xa7, 0x22, 0x8b, 0x77, + 0x2e, 0x8b, 0xe7, 0xc4, 0x0a, 0xdb, 0x5a, 0xbe, 0xa6, 0x57, 0x8e, 0x17, 0xc8, 0x9e, 0xb9, 0x61, 0xa6, 0x98, 0xbe, 0x18, 0x31, 0x6b, 0xde, 0xd6, 0xd5, 0xf8, 0x58, 0x0d, 0xe1, 0x0b, 0xa8, 0x9e, + 0x7d, 0xdc, 0xee, 0xe9, 0x2a, 0x1f, 0x58, 0x6e, 0x5e, 0xe9, 0xbe, 0x82, 0x76, 0x69, 0x8d, 0x0d, 0x3b, 0x59, 0xaa, 0xd0, 0xba, 0x07, 0xe7, 0x1b, 0x6b, 0x35, 0xd0, 0x94, 0x85, 0x0d, 0x51, 0xbe, + 0x5a, 0xae, 0x67, 0xed, 0x76, 0x10, 0x3b, 0x31, 0x33, 0x6b, 0x1e, 0xa4, 0x6c, 0xe0, 0x20, 0x47, 0x33, 0x9b, 0x82, 0x41, 0x93, 0x0d, 0x3d, 0x69, 0x55, 0xba, 0xa6, 0x81, 0xc1, 0x4a, 0xee, 0x54, + 0x25, 0x19, 0xaa, 0x60, 0x4d, 0x1d, 0x7d, 0x60, 0x87, 0xb2, 0xea, 0xd4, 0x99, 0xed, 0x71, 0xd3, 0x01, 0x42, 0x59, 0x7b, 0x2c, 0x3a, 0xe9, 0x5d, 0x50, 0x20, 0xfa, 0xdf, 0xa0, 0xc0, 0x7f, 0x3c, + 0x28, 0xf0, 0xa9, 0x03, 0x55, 0x9d, 0xdd, 0xcd, 0x67, 0xfa, 0x58, 0x85, 0xee, 0xb7, 0x84, 0x5f, 0x81, 0xba, 0x36, 0xc7, 0x56, 0xe7, 0x3e, 0x58, 0x7a, 0xbb, 0xe4, 0xf9, 0x61, 0xda, 0x66, 0x36, + 0xbb, 0xd8, 0x57, 0x0e, 0x0a, 0xc5, 0xa7, 0x20, 0x8d, 0x42, 0x60, 0xe3, 0x89, 0x74, 0x2b, 0xa5, 0x54, 0xb7, 0x5b, 0xd7, 0xb9, 0xbc, 0xdb, 0x1b, 0x83, 0x6f, 0x01, 0x58, 0x55, 0x31, 0x15, 0x8a, + 0xe2, 0x4d, 0x14, 0x47, 0x6e, 0x2b, 0xcb, 0x1b, 0x6f, 0x0b, 0x9e, 0xda, 0x64, 0xb5, 0x55, 0x42, 0x4c, 0xb3, 0x5a, 0xa4, 0x22, 0xe5, 0xb9, 0xcc, 0x7f, 0xb1, 0x62, 0x7d, 0x2e, 0x90, 0x77, 0x6f, + 0x09, 0xff, 0x7b, 0xa3, 0xe5, 0x27, 0xea, 0x57, 0x2c, 0x3e, 0x9c, 0xbb, 0x2e, 0xe1, 0x23, 0x4c, 0x9a, 0x8e, 0xbd, 0x5b, 0x51, 0x09, 0xcd, 0xb1, 0x27, 0x41, 0x59, 0x2b, 0x3c, 0xe7, 0x84, 0x42, + 0xda, 0x6c, 0xfa, 0xd8, 0x29, 0x34, 0x16, 0xd4, 0xf7, 0xb6, 0x75, 0xa0, 0x40, 0xc1, 0x49, 0xa6, 0x60, 0x92, 0x64, 0x55, 0x0f, 0x23, 0xb9, 0x55, 0xdb, 0x14, 0x54, 0x21, 0xe2, 0x00, 0x41, 0x9c, + 0xa0, 0x9f, 0xcb, 0xcc, 0xe3, 0xf5, 0x3d, 0x9e, 0x18, 0x0d, 0x87, 0x80, 0x43, 0xb2, 0x85, 0xcd, 0x36, 0xfe, 0x6c, 0xb6, 0xad, 0x7c, 0xc7, 0x34, 0x52, 0xef, 0x6a, 0x52, 0x34, 0xd2, 0x7b, 0xf6, + 0xec, 0x07, 0x79, 0x81, 0xf7, 0xb4, 0x2f, 0x60, 0xbc, 0x3f, 0x33, 0x96, 0x27, 0x88, 0x56, 0x7d, 0x89, 0x9c, 0xf5, 0x5c, 0xab, 0xed, 0xa4, 0x14, 0xe0, 0x82, 0x09, 0xcb, 0x52, 0x05, 0x75, 0xb8, + 0xdc, 0xc1, 0xd1, 0x92, 0x62, 0x7a, 0xc0, 0x8b, 0x72, 0x0e, 0x5e, 0x62, 0x8e, 0x9a, 0xb4, 0x6a, 0xd5, 0x25, 0x16, 0x0b, 0xfb, 0x87, 0x13, 0x7d, 0xd2, 0x8e, 0xe7, 0xb8, 0x34, 0xb4, 0x0e, 0x06, + 0x07, 0x3d, 0x27, 0xb4, 0x86, 0xd1, 0x48, 0x52, 0xab, 0x5b, 0x53, 0x80, 0xec, 0x84, 0x79, 0x8c, 0xcb, 0x7c, 0xee, 0xc1, 0x95, 0xa9, 0xf9, 0xfd, 0x43, 0x14, 0xe5, 0xc7, 0x9b, 0xef, 0x49, 0x3e, + 0x8f, 0x43, 0x7b, 0xa5, 0xfc, 0x06, 0xd8, 0x6b, 0x7b, 0xac, 0x0f, 0x18, 0x09, 0x00, 0xf6, 0xc2, 0xaf, 0xad, 0x1e, 0x45, 0x71, 0xb4, 0xa1, 0x8d, 0x82, 0x62, 0x98, 0x1d, 0x26, 0x34, 0x3d, 0xed, + 0xd4, 0xf4, 0x79, 0x4e, 0xea, 0xb2, 0xe8, 0x27, 0x07, 0x79, 0x9d, 0xae, 0x58, 0x9b, 0x30, 0xf7, 0xa5, 0x6a, 0x07, 0xec, 0x70, 0x9e, 0xb7, 0x4b, 0x88, 0xd4, 0x31, 0xec, 0xa8, 0xd9, 0xdb, 0xbd, + 0x7f, 0x3a, 0x0e, 0x6a, 0x8d, 0xf3, 0xe0, 0xe0, 0x9f, 0x29, 0x27, 0xb2, 0x4c, 0x78, 0x4c, 0xbe, 0xaf, 0x0f, 0x2e, 0x28, 0xff, 0x9c, 0xb0, 0xff, 0x96, 0xf0, 0x05, 0x95, 0x37, 0xcd, 0xb1, 0x62, + 0x7f, 0x81, 0xab, 0xd2, 0x50, 0x17, 0x0b, 0x76, 0xcd, 0xad, 0xa2, 0xa5, 0x1d, 0xf0, 0xeb, 0x52, 0x83, 0xa1, 0xa4, 0xdd, 0xee, 0xda, 0x54, 0xf6, 0x31, 0x04, 0x04, 0x96, 0x19, 0x1d, 0x2f, 0x4e, + 0xa8, 0x89, 0x6c, 0xd5, 0x2d, 0x8b, 0xf4, 0xfd, 0x26, 0xd7, 0x17, 0x76, 0x32, 0xc5, 0x3a, 0x07, 0xa2, 0x8d, 0x4c, 0x41, 0x77, 0xdd, 0x66, 0x58, 0x16, 0x1e, 0xde, 0xed, 0x49, 0x27, 0xef, 0x0f, + 0x2d, 0xa4, 0xb7, 0x23, 0xdc, 0x72, 0x7e, 0xc8, 0xc9, 0xe3, 0x39, 0xf5, 0x24, 0x48, 0xeb, 0x32, 0x48, 0xab, 0xc0, 0xfa, 0xfd, 0x1a, 0x9f, 0xf4, 0xe6, 0x96, 0x4f, 0xe9, 0xc7, 0x2e, 0xf7, 0x4c, + 0xff, 0x6e, 0x1b, 0xbd, 0x9b, 0xc2, 0xec, 0xd7, 0xa7, 0xf1, 0x81, 0x3f, 0x96, 0xc0, 0x1c, 0x3b, 0x48, 0x3f, 0xe7, 0x32, 0x83, 0x3f, 0x72, 0x2e, 0xbf, 0xee, 0x8d, 0xd6, 0xda, 0x25, 0xe9, 0x70, + 0x11, 0xe7, 0xd1, 0xf9, 0x4c, 0x3b, 0x0a, 0x6c, 0x15, 0xde, 0x01, 0x15, 0xf7, 0xa7, 0x03, 0x6a, 0x9c, 0x87, 0xac, 0x67, 0x96, 0x46, 0xb8, 0x03, 0x82, 0x65, 0xba, 0xa0, 0x5d, 0x45, 0x41, 0xd8, + 0xd3, 0xc0, 0x0c, 0x27, 0x43, 0xd7, 0x4f, 0x08, 0xbb, 0x63, 0xc2, 0xa3, 0xa1, 0x21, 0x32, 0x4f, 0x05, 0x78, 0xb8, 0x46, 0xf7, 0x21, 0x99, 0xf8, 0x15, 0x8f, 0x31, 0xcc, 0xac, 0x38, 0xcd, 0x7e, + 0x2e, 0x13, 0x59, 0x05, 0x5e, 0x6a, 0xc4, 0x13, 0xa7, 0x0f, 0xee, 0xe9, 0x22, 0xd1, 0x87, 0x7c, 0xcb, 0xdf, 0xd0, 0xbd, 0xce, 0xdf, 0x97, 0xd6, 0xf5, 0x9b, 0x1e, 0xe1, 0x0c, 0xa5, 0x1c, 0x37, + 0xd8, 0x74, 0x31, 0xa7, 0x8e, 0xb0, 0xd8, 0x77, 0xfa, 0xb6, 0x5f, 0x9b, 0x87, 0x43, 0xc9, 0xb4, 0xdb, 0xd4, 0x05, 0x89, 0x03, 0xe3, 0xf5, 0xba, 0xc5, 0x51, 0x5d, 0xbf, 0xa3, 0xce, 0x15, 0x8c, + 0xf6, 0x79, 0x4f, 0xf6, 0xe6, 0x92, 0x80, 0x52, 0x9b, 0x8e, 0x7d, 0xa1, 0x5c, 0x04, 0x08, 0xcb, 0x37, 0x8b, 0x5d, 0xe6, 0x30, 0xd9, 0x46, 0x24, 0xbb, 0xda, 0xdf, 0x6f, 0x0b, 0x0c, 0x61, 0xc3, + 0x51, 0xdf, 0x74, 0x7c, 0xbf, 0x6e, 0xe6, 0x83, 0x6b, 0x5c, 0x7c, 0x2b, 0x9a, 0x79, 0xfd, 0x3f, 0x76, 0x4d, 0xf3, 0xa6, 0x32, 0xec, 0x1b, 0x8e, 0x39, 0xa0, 0x84, 0xb8, 0xdf, 0xd7, 0x9d, 0x89, + 0xa5, 0xf5, 0x7c, 0xb9, 0x5c, 0x1a, 0x5c, 0x65, 0x28, 0xfb, 0x50, 0x26, 0x28, 0x97, 0xee, 0x33, 0xd9, 0x6a, 0xea, 0x18, 0x77, 0xf7, 0x70, 0xdb, 0x68, 0x30, 0xb5, 0x42, 0xbb, 0x7d, 0x8d, 0x86, + 0x8b, 0x61, 0x51, 0x97, 0x51, 0x0f, 0x70, 0x67, 0x48, 0x81, 0x97, 0x14, 0x3e, 0xc3, 0xf8, 0x61, 0x66, 0x33, 0x7c, 0x80, 0x8c, 0x31, 0xc1, 0x57, 0x71, 0x60, 0x39, 0x13, 0x23, 0xad, 0x82, 0x3b, + 0x20, 0x3c, 0x66, 0xc0, 0x79, 0x25, 0x7b, 0x45, 0xe2, 0xb9, 0x31, 0xd6, 0x78, 0x53, 0xf0, 0x73, 0xde, 0xf5, 0x35, 0x08, 0x83, 0x2c, 0x65, 0x75, 0xc0, 0x50, 0x6e, 0x4a, 0x2f, 0x06, 0xaf, 0xd0, + 0xcc, 0xa3, 0xb4, 0xd0, 0xb9, 0x95, 0xe8, 0x91, 0x1c, 0x89, 0x26, 0xf5, 0xe1, 0xb4, 0xd9, 0x99, 0x54, 0x3e, 0x48, 0xa8, 0x7b, 0x76, 0xb1, 0x75, 0x6f, 0xe3, 0xfb, 0xb3, 0xcd, 0x6e, 0x64, 0x82, + 0xdf, 0x1d, 0x3d, 0xf0, 0x44, 0xa7, 0xe2, 0xb6, 0xf7, 0x7c, 0xbd, 0xe6, 0xb8, 0xa6, 0x64, 0x85, 0xc7, 0x7c, 0x40, 0xae, 0xaf, 0x5d, 0xd5, 0x43, 0xfc, 0xe4, 0xfd, 0xf1, 0x29, 0x6b, 0x88, 0x51, + 0xd5, 0xa5, 0x11, 0xbf, 0xd9, 0x59, 0x91, 0x8f, 0x77, 0x04, 0xd5, 0xc4, 0x6d, 0xe2, 0xb8, 0x0b, 0xec, 0xda, 0x9f, 0x5c, 0x7d, 0x71, 0xf3, 0x2c, 0x48, 0xeb, 0x2f, 0xb6, 0xe1, 0x11, 0x4b, 0xdd, + 0x7d, 0x62, 0xf7, 0xd6, 0xbc, 0xc7, 0x53, 0x47, 0xdf, 0x79, 0x16, 0x38, 0xb9, 0x77, 0x65, 0x6c, 0x62, 0xe9, 0xcb, 0x18, 0x9f, 0x87, 0x24, 0xc1, 0x81, 0x06, 0xa8, 0xe6, 0xd5, 0xfe, 0x34, 0x30, + 0xd3, 0x42, 0x30, 0x9c, 0x50, 0x41, 0x99, 0x45, 0xeb, 0xcf, 0x39, 0x2b, 0xe6, 0xec, 0xe0, 0xac, 0x19, 0x9b, 0x63, 0xb3, 0x9a, 0x51, 0xe8, 0x6e, 0x1b, 0x9a, 0x64, 0xba, 0x6f, 0x96, 0xa9, 0x6d, + 0xcf, 0x57, 0xcb, 0x16, 0xf2, 0x23, 0x80, 0xd3, 0x48, 0x9a, 0x9f, 0xc5, 0xd5, 0xc9, 0xe1, 0xb0, 0xa3, 0xe3, 0x11, 0xac, 0x42, 0xa8, 0xf2, 0xe3, 0x75, 0x87, 0xde, 0x85, 0xd1, 0x7e, 0xbd, 0xb5, + 0x3f, 0x52, 0xf0, 0xec, 0x95, 0xec, 0xe5, 0x43, 0x78, 0x69, 0x8c, 0x2d, 0x7c, 0xb6, 0xdd, 0xad, 0x7c, 0x70, 0x46, 0xd5, 0xf9, 0x89, 0x2c, 0x1b, 0x6a, 0x1a, 0x97, 0x71, 0x74, 0xc4, 0x66, 0xd5, + 0x59, 0xad, 0x61, 0xdb, 0xec, 0xf6, 0xa1, 0x72, 0xf2, 0x9a, 0x65, 0x99, 0xc4, 0x3d, 0x4b, 0xd6, 0x46, 0xa7, 0x24, 0x0c, 0x1d, 0xaf, 0x61, 0x69, 0xbd, 0xe5, 0x23, 0x75, 0xd6, 0x6f, 0x0e, 0x5d, + 0xe1, 0x7b, 0x15, 0xeb, 0x1c, 0x56, 0xe7, 0x10, 0x25, 0x18, 0x7c, 0x9e, 0xac, 0x3c, 0x39, 0x11, 0x46, 0xc4, 0x50, 0x18, 0x75, 0x96, 0x04, 0xd6, 0xa4, 0x8a, 0x6f, 0x45, 0x74, 0xbf, 0xd8, 0xd9, + 0xbf, 0x08, 0x75, 0xbe, 0x83, 0x6b, 0x53, 0x5a, 0xce, 0x24, 0x31, 0xee, 0x39, 0x3b, 0x41, 0x7f, 0x88, 0x87, 0x70, 0x7d, 0x26, 0x7b, 0xc5, 0xf5, 0xb9, 0x31, 0xb9, 0x52, 0xfb, 0x19, 0xd7, 0x63, + 0xe8, 0x19, 0x79, 0x93, 0x9c, 0x62, 0x93, 0xf7, 0x23, 0xda, 0x3b, 0x1f, 0x48, 0x2d, 0xb2, 0x70, 0x4d, 0x3d, 0x1e, 0x30, 0x62, 0x01, 0x05, 0x5c, 0x43, 0xed, 0x97, 0x6a, 0x01, 0x99, 0x56, 0x27, + 0xe1, 0xf6, 0x19, 0xf4, 0x21, 0x29, 0x0e, 0x09, 0x27, 0xdd, 0x14, 0xe1, 0x19, 0xd6, 0xcd, 0x02, 0x89, 0xf1, 0x93, 0x51, 0x68, 0x69, 0xa9, 0x98, 0xdd, 0x49, 0x3c, 0xf1, 0xc3, 0x02, 0x5d, 0x60, + 0xe4, 0x18, 0xeb, 0xf0, 0x9b, 0x57, 0x7d, 0x4a, 0x3a, 0x7d, 0x17, 0x16, 0xfc, 0x0f, 0x3c, 0xfd, 0x0f, 0x70, 0x79, 0xa6, 0xff, 0x1e, 0x9f, 0xa7, 0x93, 0x93, 0x1b, 0xf9, 0x9f, 0x81, 0x3a, 0x65, + 0x69, 0x42, 0x9e, 0xc5, 0xf9, 0x7a, 0x73, 0xa6, 0x97, 0xb2, 0x4d, 0x03, 0xb5, 0x5f, 0x49, 0x46, 0x09, 0x45, 0x5a, 0x33, 0x5f, 0x9f, 0xb5, 0xb6, 0xd7, 0xbb, 0x98, 0x36, 0x28, 0x72, 0x08, 0x40, + 0xde, 0x0e, 0x5b, 0xf2, 0x10, 0xe4, 0x88, 0x35, 0x28, 0xe6, 0x36, 0xc4, 0x33, 0xc8, 0x5a, 0x48, 0x02, 0xc6, 0x2a, 0x51, 0x73, 0xe8, 0x4c, 0x74, 0xc9, 0x30, 0xc3, 0xb1, 0x47, 0x98, 0x65, 0xfa, + 0x60, 0xfd, 0xce, 0x27, 0x7d, 0xf4, 0x93, 0xb3, 0xc1, 0x17, 0x53, 0xf2, 0xdd, 0x54, 0x7b, 0xf6, 0x60, 0xfd, 0x7a, 0x52, 0xe6, 0x65, 0x90, 0xd6, 0xee, 0xad, 0x38, 0xf9, 0x3d, 0x3e, 0xfe, 0x01, + 0x36, 0xe8, 0x85, 0xec, 0x05, 0xf4, 0x97, 0xc6, 0x95, 0x87, 0xff, 0x81, 0x09, 0x82, 0x27, 0xb4, 0x68, 0xec, 0x4d, 0x44, 0xcb, 0xe2, 0x83, 0x22, 0x49, 0xf6, 0x4c, 0x59, 0x33, 0xda, 0xb9, 0x59, + 0x58, 0xb9, 0x1b, 0x74, 0x23, 0xa6, 0xd5, 0xcd, 0xc3, 0xa6, 0x0a, 0x92, 0x20, 0x36, 0x9e, 0xc8, 0xde, 0xdb, 0xcd, 0x1f, 0x90, 0x4f, 0x3e, 0x52, 0xbf, 0x74, 0xef, 0xe3, 0xb9, 0xb1, 0x7e, 0xdd, + 0x60, 0x01, 0x52, 0x32, 0x46, 0xc7, 0x98, 0xce, 0xcd, 0xa4, 0x30, 0xa4, 0x4e, 0x4e, 0xb9, 0xa6, 0x37, 0xa7, 0xd9, 0x96, 0x8b, 0x0c, 0x69, 0xe7, 0x96, 0xad, 0xef, 0x2e, 0xa8, 0x08, 0xa4, 0x11, + 0x34, 0xc0, 0xd2, 0x73, 0x19, 0xef, 0x42, 0x04, 0xf4, 0x32, 0x38, 0x99, 0x42, 0xeb, 0x94, 0x4c, 0x97, 0x20, 0xaa, 0x32, 0x7b, 0x53, 0xcc, 0x20, 0x20, 0x6f, 0x88, 0x5d, 0x3b, 0x3f, 0xf0, 0xd3, + 0xdd, 0x92, 0xff, 0x6c, 0x28, 0xb8, 0xbd, 0xde, 0x75, 0x83, 0xba, 0xab, 0x1d, 0x78, 0x48, 0x73, 0xf9, 0x86, 0xf0, 0x2b, 0x0c, 0xb7, 0x8d, 0x70, 0x64, 0x88, 0x4d, 0x2a, 0x16, 0x2b, 0x7c, 0x6a, + 0x3b, 0xf3, 0x62, 0xba, 0xdf, 0xad, 0xe2, 0xbe, 0x80, 0x67, 0x1d, 0x85, 0x6f, 0xd2, 0x1a, 0xeb, 0x08, 0xae, 0xdd, 0x72, 0xc5, 0x49, 0x09, 0x22, 0x22, 0x9b, 0x4d, 0xf5, 0x28, 0x56, 0xb7, 0xc2, + 0x5a, 0x8c, 0x0b, 0x0f, 0x5b, 0x20, 0x43, 0x79, 0x80, 0x79, 0xc5, 0x38, 0x84, 0xb3, 0xa2, 0x55, 0x3a, 0xdb, 0x75, 0x74, 0xb2, 0x23, 0x8d, 0x79, 0xbb, 0x61, 0xc8, 0xc6, 0x8b, 0x46, 0xc8, 0x6a, + 0xdf, 0xf1, 0x21, 0x9f, 0x98, 0x96, 0x9b, 0xdf, 0xf6, 0x13, 0x63, 0xf8, 0x6d, 0xc9, 0xe1, 0x1b, 0x04, 0x6f, 0xdc, 0x7d, 0xeb, 0x32, 0xb8, 0xbf, 0x89, 0x3e, 0xe2, 0xea, 0xf0, 0xe5, 0x13, 0x5e, + 0xc0, 0xff, 0x70, 0xfe, 0x6a, 0x03, 0x1c, 0x61, 0x4e, 0x35, 0xf1, 0xa1, 0x34, 0x63, 0x94, 0x56, 0xd7, 0xe1, 0xca, 0x68, 0xa6, 0x52, 0x19, 0x91, 0x47, 0x68, 0xb7, 0xd3, 0xac, 0xa3, 0x66, 0x0b, + 0x58, 0xb7, 0xdc, 0x2b, 0x46, 0x91, 0xd1, 0xf2, 0x1e, 0x87, 0xe6, 0x73, 0x16, 0xe5, 0xe8, 0x46, 0x3b, 0x42, 0x07, 0x6d, 0x27, 0x48, 0x8b, 0xb9, 0x44, 0x1a, 0x4a, 0x26, 0xf0, 0x2a, 0x45, 0xae, + 0xb8, 0x83, 0x6f, 0xf3, 0x3b, 0x65, 0x2d, 0xa1, 0x5e, 0x60, 0xc5, 0xdc, 0x63, 0x1a, 0xe4, 0xc7, 0xfd, 0x8c, 0x5f, 0x12, 0x29, 0xff, 0xcd, 0xd8, 0x38, 0x77, 0x15, 0x66, 0x0f, 0xaa, 0x2f, 0xee, + 0x3c, 0xe4, 0xde, 0x08, 0x39, 0xa9, 0x3d, 0x56, 0xad, 0x31, 0x4c, 0xfb, 0x79, 0xd8, 0xc1, 0x12, 0x82, 0xce, 0xba, 0x88, 0x62, 0xdb, 0x43, 0x6e, 0x0d, 0x5b, 0x44, 0x58, 0x97, 0x70, 0x48, 0x76, + 0x1b, 0x74, 0xea, 0x02, 0x11, 0x11, 0xb7, 0xbb, 0x74, 0xcf, 0x9f, 0x81, 0xe4, 0x3c, 0x9d, 0x2f, 0xcf, 0x53, 0x41, 0x93, 0x9c, 0x98, 0x89, 0x30, 0x24, 0x12, 0xcf, 0x04, 0x50, 0xc4, 0x54, 0x1f, + 0xba, 0x1c, 0x95, 0x69, 0xe7, 0x01, 0x0d, 0x67, 0x12, 0x2e, 0x1f, 0xf1, 0x11, 0x19, 0x2d, 0x3f, 0xab, 0x35, 0x3e, 0x54, 0x12, 0xba, 0x3f, 0x60, 0xe3, 0xc7, 0xa1, 0xaa, 0x8d, 0xbb, 0xdb, 0xff, + 0x3f, 0x38, 0x12, 0xd7, 0xc7, 0xdc, 0x1b, 0x8b, 0xeb, 0xc5, 0xb1, 0xa3, 0x11, 0xfa, 0x84, 0x33, 0xa5, 0x30, 0x91, 0x76, 0xdb, 0x7e, 0x8f, 0x43, 0xb5, 0xad, 0x21, 0xe9, 0x4e, 0x4f, 0xb3, 0x39, + 0x0e, 0x26, 0xdb, 0x05, 0x27, 0xee, 0x58, 0xd9, 0xed, 0xa8, 0x1a, 0x1f, 0x86, 0x3a, 0xca, 0x8e, 0xd5, 0x66, 0x27, 0xf4, 0xed, 0x1a, 0x64, 0xd1, 0x69, 0xd1, 0xc0, 0x15, 0x03, 0x89, 0xf5, 0x69, + 0x8d, 0x8a, 0x73, 0x48, 0xf5, 0xb8, 0x7d, 0x62, 0x9d, 0xba, 0x73, 0xd0, 0x69, 0x8d, 0x3e, 0x62, 0xe1, 0xfa, 0xdf, 0x18, 0x8d, 0xfc, 0x7f, 0x41, 0xe8, 0x7d, 0x21, 0xfb, 0x84, 0x76, 0x3e, 0x5a, + 0xe8, 0x85, 0x27, 0x05, 0xeb, 0xc8, 0xeb, 0xa6, 0x32, 0x3a, 0x24, 0xc8, 0xac, 0x43, 0x60, 0x6a, 0xf0, 0x26, 0xe8, 0x65, 0xb5, 0x11, 0x32, 0xea, 0x47, 0x7c, 0xae, 0x4f, 0x19, 0xa7, 0xda, 0xfd, + 0x32, 0x1a, 0xe7, 0x9e, 0xee, 0xfc, 0xb1, 0xdd, 0xf1, 0x03, 0xfd, 0x17, 0x2c, 0xde, 0x9d, 0x1d, 0x13, 0xa4, 0x09, 0x4f, 0xa4, 0x05, 0xaf, 0xcb, 0x4d, 0xb4, 0xee, 0x92, 0x98, 0x62, 0x2a, 0x81, + 0xf5, 0xb5, 0x2e, 0x33, 0x57, 0x83, 0x97, 0x7b, 0xd9, 0x08, 0x9e, 0xa8, 0xc9, 0x9d, 0xd2, 0xf0, 0xee, 0xa7, 0x13, 0x40, 0xff, 0x50, 0x8f, 0x30, 0x79, 0x2f, 0x64, 0x6f, 0x85, 0x63, 0x9e, 0x1a, + 0x93, 0x2b, 0xb5, 0x9f, 0xbf, 0xa1, 0xe5, 0x56, 0xae, 0xb7, 0xfc, 0x3c, 0x63, 0xd7, 0x1c, 0xe6, 0x30, 0x2d, 0x21, 0x2e, 0xeb, 0x48, 0xcc, 0xf6, 0x7c, 0x8d, 0x32, 0x40, 0x56, 0x40, 0x03, 0x6a, + 0x57, 0x3d, 0xdf, 0x68, 0x0d, 0xd3, 0x1a, 0xc2, 0xb1, 0x6d, 0x0e, 0x94, 0xb3, 0xa0, 0x9b, 0x6d, 0xe2, 0xee, 0xa0, 0x40, 0xd3, 0xce, 0xab, 0x39, 0xec, 0x50, 0x7e, 0x7e, 0x9e, 0x13, 0x7a, 0xd5, + 0x9b, 0x8d, 0x44, 0x30, 0x6b, 0x23, 0xe6, 0x17, 0x8f, 0x19, 0x05, 0xac, 0x2c, 0xc9, 0xb3, 0xf4, 0xf2, 0xee, 0x4e, 0x12, 0xd4, 0xb5, 0xf3, 0x2c, 0xcc, 0x7d, 0x88, 0xe0, 0xba, 0x99, 0x81, 0xc2, + 0xa7, 0xaa, 0x6a, 0xc8, 0xc7, 0x20, 0xe7, 0xb7, 0x55, 0xd5, 0x3e, 0x5c, 0x7a, 0x13, 0x4e, 0xf6, 0x39, 0xf1, 0x56, 0x56, 0x26, 0x13, 0xdb, 0xa8, 0x8d, 0x27, 0xaa, 0xe8, 0xfb, 0x94, 0xc1, 0x97, + 0xcb, 0x81, 0xfd, 0x94, 0x07, 0xf8, 0x8b, 0x97, 0x7a, 0x2d, 0xcc, 0xfd, 0x9c, 0xa0, 0xfd, 0xed, 0xc5, 0x5b, 0x0d, 0xe1, 0xcb, 0x95, 0x0f, 0x99, 0x88, 0x8b, 0xdb, 0x2f, 0x88, 0x77, 0xd5, 0x4a, + 0xae, 0x00, 0x19, 0xd7, 0x87, 0xbd, 0x0d, 0xe7, 0x46, 0xae, 0x9e, 0x00, 0xcf, 0x9f, 0xd1, 0x1b, 0x78, 0xef, 0xa9, 0x66, 0x3e, 0x13, 0xb9, 0xa7, 0x92, 0xb9, 0x90, 0x7e, 0x5b, 0x18, 0x6e, 0xfc, + 0xec, 0xfb, 0xf0, 0x8c, 0xa7, 0x68, 0xb6, 0x37, 0x67, 0xae, 0xc9, 0x87, 0xc8, 0x71, 0x2a, 0x18, 0xd6, 0xf4, 0x33, 0x8a, 0xc3, 0xc2, 0xb5, 0xb9, 0x9a, 0xf5, 0x69, 0xd3, 0x07, 0x64, 0x86, 0x21, + 0x62, 0xa9, 0x7b, 0x0b, 0x50, 0x3f, 0x08, 0x56, 0xa5, 0x87, 0x44, 0xba, 0xe3, 0x86, 0x63, 0x12, 0xf9, 0xdb, 0x45, 0x41, 0xcd, 0x57, 0xeb, 0x3a, 0x07, 0xdd, 0x81, 0xf0, 0x65, 0xbd, 0xd1, 0x13, + 0x09, 0x4c, 0xd1, 0x41, 0x9f, 0x2a, 0xf4, 0xd1, 0xcc, 0xb1, 0xf3, 0x19, 0x4c, 0x54, 0xca, 0x4f, 0x34, 0xe9, 0x3f, 0x2f, 0x5e, 0x64, 0x65, 0xa5, 0x73, 0xad, 0xba, 0xf8, 0x94, 0x42, 0xfc, 0xdf, + 0x1f, 0x25, 0xbd, 0xa7, 0x0e, 0xf9, 0x4e, 0x19, 0xbc, 0x89, 0x26, 0x44, 0x3f, 0xdd, 0x51, 0x19, 0x65, 0x69, 0x0c, 0xf7, 0x49, 0xdc, 0x49, 0x4a, 0x73, 0x23, 0xf7, 0xe9, 0xee, 0xf7, 0xae, 0x57, + 0xbf, 0xff, 0x8d, 0xff, 0xf9, 0x68, 0x4a, 0x78, 0xd9, 0xe8, 0xff, 0x3f, 0xdb, 0xb9, 0xf0, 0xd7, 0xe5, 0xd3, 0xa3, 0xbf, 0xb8, 0xef, 0xda, 0x3d, 0xdb, 0xc9, 0x4b, 0xc7, 0x32, 0xae, 0x79, 0x4a, + 0x6f, 0xaf, 0x38, 0xa2, 0x58, 0xdc, 0xd7, 0x1e, 0x60, 0xbf, 0x7e, 0x7d, 0xf4, 0x02, 0x7b, 0xb4, 0xa4, 0xda, 0x77, 0x9e, 0x60, 0xa3, 0x8b, 0xac, 0x2d, 0x6d, 0xe4, 0xa8, 0xd3, 0x1b, 0x26, 0x52, + 0x63, 0x8d, 0x5c, 0x9a, 0x9b, 0xde, 0xad, 0x58, 0x0a, 0x4c, 0x5b, 0x2e, 0x3a, 0xb2, 0x47, 0x78, 0x89, 0x52, 0x16, 0x5c, 0x05, 0x02, 0x21, 0x4b, 0x84, 0x31, 0x95, 0x0e, 0x53, 0x3e, 0x59, 0xd1, + 0xd4, 0x32, 0xcd, 0x2b, 0x6b, 0x9f, 0xf0, 0x9b, 0x7d, 0xb6, 0xa0, 0xb6, 0xe2, 0xba, 0xac, 0xa9, 0xc6, 0x06, 0x3b, 0xa9, 0xce, 0xc2, 0xa1, 0xc2, 0x96, 0x04, 0x30, 0x4a, 0xb9, 0xf7, 0x16, 0xa9, + 0x8f, 0x63, 0xf1, 0x8d, 0x55, 0xe8, 0x41, 0xa3, 0xd0, 0xfb, 0x47, 0xbc, 0x30, 0x59, 0xcf, 0x27, 0xbe, 0x28, 0x2b, 0xf2, 0xeb, 0x1e, 0x64, 0x29, 0xb8, 0xf7, 0xd3, 0x96, 0x09, 0x88, 0xc5, 0xca, + 0x34, 0x15, 0xb7, 0x0d, 0xca, 0x0c, 0x38, 0x65, 0x61, 0xb0, 0x38, 0xb7, 0x40, 0x45, 0xf1, 0x12, 0xbf, 0xa2, 0xad, 0xb3, 0xe2, 0x48, 0xee, 0x31, 0x67, 0x36, 0xdb, 0x2e, 0xdb, 0x1e, 0x20, 0xbf, + 0x86, 0x63, 0x4c, 0xeb, 0xe8, 0xb9, 0x19, 0x50, 0xf9, 0x66, 0xd6, 0x3a, 0x2c, 0x6b, 0xa7, 0xd1, 0x6a, 0x90, 0x86, 0x83, 0x04, 0x26, 0xe7, 0x9d, 0xdb, 0x7d, 0x03, 0xd9, 0xc8, 0x8f, 0xf1, 0xab, + 0x59, 0xff, 0x57, 0xc5, 0xc4, 0xae, 0x5b, 0x64, 0xed, 0xdc, 0x2d, 0x20, 0x8c, 0x3d, 0xe4, 0x43, 0xfb, 0x42, 0xf5, 0x79, 0x13, 0xbe, 0x1c, 0x5f, 0x39, 0xad, 0x11, 0xa2, 0x1f, 0x4c, 0xcf, 0xcc, + 0xb6, 0x14, 0xf5, 0x6a, 0x39, 0x43, 0xb5, 0xc3, 0xfc, 0x54, 0x98, 0x89, 0x0f, 0x63, 0x5b, 0x48, 0x63, 0x0b, 0x88, 0x5d, 0xae, 0xe7, 0x2a, 0x98, 0xd2, 0xa9, 0x1b, 0xb9, 0xca, 0x26, 0x25, 0xf7, + 0x65, 0x2f, 0x2b, 0xf0, 0x1a, 0xcd, 0x79, 0x2d, 0xdc, 0x9f, 0x97, 0xd3, 0x01, 0x24, 0xf5, 0x23, 0xa2, 0x4c, 0xed, 0x53, 0x31, 0x14, 0x11, 0x22, 0x89, 0x5d, 0x1f, 0x9b, 0xd0, 0xd4, 0x6e, 0x1e, + 0x33, 0x2f, 0x7c, 0xdc, 0xc7, 0xde, 0x31, 0xb6, 0xef, 0x38, 0x98, 0xcb, 0x1e, 0x4a, 0xdd, 0xe5, 0x68, 0xef, 0x15, 0xcd, 0x7b, 0xef, 0xda, 0xf6, 0x88, 0xbb, 0xed, 0x4f, 0xc5, 0xf2, 0xc8, 0x71, + 0x2e, 0xb7, 0x45, 0x3e, 0x9f, 0xb5, 0xbb, 0x78, 0x5a, 0xd5, 0x8d, 0xb8, 0x6a, 0x1d, 0xae, 0x4a, 0xc9, 0x55, 0x6a, 0x6d, 0x76, 0x6d, 0x8b, 0x43, 0x70, 0xb1, 0x36, 0x2c, 0xee, 0x2c, 0xc7, 0x22, + 0x08, 0x6c, 0xbb, 0xde, 0x9a, 0x02, 0x50, 0x81, 0x74, 0xdb, 0xa1, 0xc5, 0x18, 0xb7, 0xad, 0x29, 0x08, 0x64, 0xa4, 0x14, 0xc9, 0x0b, 0x91, 0xae, 0x36, 0x36, 0x13, 0x64, 0x9e, 0xba, 0xdc, 0x4d, + 0x01, 0xb1, 0xed, 0x76, 0x23, 0x64, 0x87, 0x77, 0x95, 0xf0, 0xbe, 0xd1, 0x62, 0xd4, 0xdf, 0xd4, 0x1c, 0x20, 0xde, 0x15, 0x63, 0x1c, 0x0b, 0x5c, 0xfd, 0x54, 0x6c, 0xe0, 0xfa, 0x7f, 0x42, 0x7c, + 0x2a, 0xc3, 0xf8, 0x25, 0x4c, 0xfa, 0xb2, 0x49, 0x30, 0x52, 0x0b, 0x08, 0x4e, 0x14, 0x17, 0x0c, 0x4b, 0x25, 0x08, 0x82, 0xd6, 0x36, 0x8e, 0x1a, 0xb5, 0x8f, 0x38, 0xe9, 0xca, 0xd2, 0xb6, 0x9e, + 0x38, 0x0f, 0x97, 0x25, 0x9e, 0x7a, 0x0d, 0x65, 0xda, 0xeb, 0xd9, 0x4e, 0x8e, 0x88, 0x44, 0x00, 0xbb, 0x1d, 0xdf, 0x62, 0x03, 0xbf, 0xb3, 0x56, 0xe9, 0x7c, 0x9f, 0xae, 0xcc, 0x39, 0xeb, 0x1b, + 0x58, 0x95, 0x99, 0x72, 0x8f, 0x0f, 0xf7, 0xf2, 0xc4, 0xfe, 0x80, 0x9c, 0x11, 0xb6, 0x57, 0xd0, 0xa8, 0x8f, 0x05, 0x72, 0xe2, 0xcc, 0x36, 0x2a, 0xff, 0x8f, 0x15, 0x67, 0xa9, 0x63, 0x3f, 0x1b, + 0x08, 0xb0, 0x8f, 0xb5, 0x6a, 0x9f, 0xee, 0xaa, 0xcb, 0x26, 0x7d, 0xde, 0xe2, 0xae, 0x95, 0x21, 0xde, 0xcf, 0xf0, 0xb7, 0xe6, 0xc7, 0x2f, 0x8c, 0x6b, 0x1f, 0xd4, 0x78, 0x97, 0x3b, 0xbe, 0xcc, + 0x2f, 0xf0, 0x42, 0x81, 0xf8, 0x5b, 0x7b, 0xda, 0xad, 0x97, 0xf7, 0x76, 0x06, 0xea, 0x43, 0xf1, 0x90, 0xf1, 0xa3, 0x6f, 0x84, 0x2d, 0x38, 0xb9, 0xfc, 0x9d, 0x50, 0x9f, 0x7c, 0x5f, 0x7f, 0xdd, + 0x1b, 0x7d, 0x52, 0x66, 0x90, 0x98, 0x00, 0x38, 0x7a, 0xbf, 0xed, 0x5c, 0x80, 0xe4, 0x1b, 0x2d, 0xb3, 0xcc, 0x53, 0xbb, 0x93, 0x6c, 0xb1, 0x21, 0x50, 0xb0, 0x2e, 0x77, 0xce, 0x61, 0xdb, 0x20, + 0xdc, 0xa2, 0x8b, 0x3c, 0xab, 0x4e, 0x1b, 0x13, 0x36, 0x9a, 0x6c, 0x01, 0x68, 0xf0, 0x49, 0xb3, 0x12, 0x68, 0x3a, 0x3f, 0xf0, 0x64, 0xd1, 0x34, 0x95, 0x55, 0x9e, 0x8b, 0x64, 0xb6, 0x37, 0xb6, + 0xab, 0x39, 0xc8, 0x61, 0xff, 0x79, 0x35, 0xdb, 0x5b, 0x9e, 0xc3, 0x6b, 0x82, 0x88, 0xa2, 0x31, 0xe2, 0xdf, 0xcf, 0xcc, 0xfe, 0x27, 0xae, 0xe6, 0x2a, 0xe2, 0x55, 0x96, 0xef, 0x24, 0xc6, 0xa4, + 0x2e, 0x8d, 0x0b, 0x90, 0xaf, 0x41, 0x84, 0x9f, 0x18, 0xaa, 0xaf, 0x23, 0x53, 0x6f, 0xba, 0x48, 0xe4, 0x13, 0xc3, 0x54, 0x06, 0x37, 0x75, 0xfd, 0x6d, 0x0e, 0x20, 0x3f, 0x33, 0x4a, 0xef, 0xa4, + 0xe2, 0xfb, 0x7c, 0xd2, 0xa3, 0xc6, 0xd1, 0x57, 0xf2, 0x97, 0x71, 0x7e, 0x69, 0x4c, 0xf0, 0xf1, 0x26, 0x50, 0x53, 0x23, 0xdc, 0x10, 0x27, 0xc4, 0xa3, 0x0c, 0xf9, 0x47, 0x98, 0x0b, 0x17, 0x02, + 0x23, 0x37, 0x9b, 0x85, 0x73, 0x2e, 0x38, 0xbb, 0x9c, 0x0d, 0x0b, 0x7b, 0xed, 0xb4, 0x33, 0x26, 0x28, 0xca, 0xd3, 0xaa, 0xdb, 0xc7, 0x66, 0x42, 0x0b, 0xfc, 0x2a, 0xc7, 0x8d, 0x08, 0x71, 0x31, + 0x48, 0x4a, 0xa8, 0xcd, 0x61, 0x31, 0xf0, 0x48, 0x52, 0xf4, 0xd1, 0x92, 0x48, 0xbd, 0x68, 0x25, 0xc2, 0xb0, 0x0b, 0xc6, 0x7f, 0xcb, 0x25, 0x39, 0x49, 0x16, 0xfe, 0x8c, 0x13, 0xf5, 0x30, 0x4e, + 0x6f, 0xe8, 0x83, 0x93, 0xb7, 0xad, 0x09, 0x35, 0x1e, 0x29, 0x7e, 0x1f, 0x6a, 0x67, 0xeb, 0x24, 0x88, 0x33, 0xc8, 0xe9, 0x66, 0xab, 0xfc, 0x0c, 0xf1, 0x7d, 0xae, 0x2d, 0xda, 0xce, 0x23, 0x86, + 0x70, 0x80, 0x85, 0x25, 0xda, 0xd7, 0x4e, 0x56, 0x9c, 0x09, 0x0c, 0x53, 0xe6, 0x19, 0xb8, 0x93, 0xbc, 0xb4, 0x84, 0xc1, 0xe5, 0xb2, 0x06, 0x02, 0x0b, 0x0d, 0x36, 0x87, 0xb3, 0x4c, 0xb1, 0x0d, + 0x7a, 0xb0, 0x79, 0x18, 0xdb, 0x1b, 0x5d, 0xaa, 0x1c, 0x93, 0x25, 0x4b, 0xcc, 0xfe, 0x12, 0xa9, 0xff, 0x9a, 0xde, 0xff, 0x63, 0xd3, 0xfb, 0x1b, 0x34, 0xef, 0xac, 0x15, 0xf7, 0x79, 0xf4, 0x47, + 0xa1, 0xfc, 0xea, 0x41, 0xe0, 0xe4, 0xcb, 0xd3, 0x5f, 0xe4, 0xa0, 0xfd, 0x75, 0x0f, 0x44, 0x81, 0xa7, 0x40, 0x69, 0x9a, 0xa2, 0x6a, 0xa8, 0xfa, 0x6b, 0x3d, 0x85, 0xe3, 0xad, 0x1f, 0x2d, 0x8c, + 0xd9, 0xfc, 0x20, 0x1e, 0x77, 0xb2, 0x1a, 0x9e, 0x7c, 0x05, 0xa3, 0x67, 0xe0, 0x2e, 0x15, 0x5b, 0xaa, 0x6f, 0xbd, 0xa2, 0x2e, 0xf2, 0x99, 0x3a, 0x5d, 0x8b, 0x58, 0xb2, 0x93, 0xfb, 0x7d, 0x0f, + 0xef, 0xe2, 0x0c, 0xab, 0x8b, 0xb3, 0x53, 0x98, 0x50, 0x25, 0xc6, 0x65, 0x63, 0x88, 0x03, 0x6a, 0x37, 0x7f, 0x0b, 0xe2, 0x1d, 0x33, 0xd7, 0xaf, 0x5f, 0x1f, 0x79, 0x6c, 0xe4, 0x51, 0x69, 0xf0, + 0x1b, 0x73, 0x17, 0xf6, 0xc9, 0xd0, 0xf2, 0xeb, 0x1e, 0x58, 0x2a, 0xbd, 0x31, 0x0f, 0xa8, 0x80, 0x6d, 0x7c, 0xa5, 0x49, 0x54, 0x16, 0x72, 0xb2, 0xed, 0x71, 0xca, 0xcc, 0x43, 0xcb, 0x58, 0x4c, + 0x11, 0x6e, 0x2b, 0x14, 0x87, 0x64, 0x31, 0x4f, 0x97, 0x70, 0xee, 0x52, 0x76, 0x73, 0xec, 0x17, 0xcb, 0xae, 0x96, 0x88, 0x19, 0x43, 0xa4, 0x51, 0xd8, 0x4d, 0x0d, 0x74, 0x6d, 0x07, 0xbb, 0x7a, + 0x8b, 0xb2, 0x48, 0x87, 0x6e, 0x98, 0x80, 0x05, 0xfb, 0x00, 0x6d, 0x45, 0xe7, 0x9b, 0xef, 0x77, 0xe4, 0xc6, 0xf6, 0x7e, 0xed, 0xbb, 0xb1, 0x3a, 0x9f, 0x15, 0x0d, 0x3f, 0xba, 0xef, 0x7c, 0xf8, + 0xc1, 0x77, 0x2c, 0xc9, 0xaf, 0xfb, 0x72, 0xfd, 0x57, 0x4a, 0xe9, 0x5f, 0xbf, 0x3e, 0x72, 0xa2, 0x8f, 0x7e, 0x05, 0xf7, 0x94, 0xd3, 0xc4, 0xf8, 0x19, 0x3f, 0x6b, 0x5a, 0xee, 0x50, 0x1e, 0x5c, + 0x59, 0xd0, 0x84, 0xb5, 0x55, 0x9b, 0x3b, 0x98, 0x03, 0xb5, 0xe5, 0x61, 0x07, 0x93, 0x38, 0xb1, 0x1c, 0x2c, 0xa9, 0xf2, 0x48, 0x73, 0x6a, 0xda, 0xca, 0x94, 0x69, 0x8a, 0xa6, 0xc4, 0xbc, 0x96, + 0x30, 0xb8, 0x62, 0xa5, 0x1a, 0x3e, 0x41, 0xea, 0xd4, 0x3a, 0xd9, 0x93, 0x27, 0xf6, 0x8c, 0xcb, 0x8a, 0x25, 0xd6, 0xb1, 0x7b, 0x42, 0x4a, 0x9d, 0x6d, 0xbc, 0x9a, 0xf8, 0xcf, 0xd5, 0x45, 0x1f, + 0xb4, 0xdf, 0xf8, 0x37, 0x70, 0xff, 0x9f, 0xb7, 0xff, 0x5f, 0x39, 0xff, 0x6f, 0x8a, 0x66, 0x3c, 0x54, 0x21, 0xe1, 0x42, 0xf1, 0xca, 0xf8, 0x5f, 0x6b, 0x65, 0x8c, 0xab, 0x90, 0x00, 0x81, 0x1a, + 0x02, 0x49, 0xdd, 0x6e, 0x7d, 0x8c, 0x64, 0xeb, 0x30, 0xdf, 0x07, 0xd8, 0x6c, 0xb6, 0xaf, 0x00, 0x71, 0x26, 0xe8, 0x7a, 0x57, 0x48, 0x9c, 0x11, 0xe4, 0xcb, 0x39, 0xdb, 0xe5, 0x30, 0x64, 0xcb, + 0x7c, 0x90, 0x2b, 0xed, 0x5e, 0xef, 0x8e, 0xc7, 0x79, 0x00, 0xc1, 0x1a, 0x28, 0x46, 0xf1, 0x7a, 0x39, 0xac, 0xb8, 0x85, 0xbf, 0xb6, 0xc2, 0xcc, 0x8a, 0x00, 0x86, 0x4b, 0x69, 0x77, 0x3b, 0xfb, + 0x4f, 0xaa, 0xf7, 0xbd, 0x70, 0x7a, 0x9f, 0xf4, 0x57, 0x4f, 0xf6, 0x16, 0xfb, 0xf7, 0x57, 0x7a, 0xb5, 0xdf, 0x76, 0x56, 0x07, 0x5e, 0x7a, 0x8b, 0xd4, 0xf8, 0xfd, 0x6f, 0xe8, 0xa3, 0x48, 0xeb, + 0x66, 0xe5, 0xc4, 0x31, 0x6e, 0xf9, 0xab, 0xfe, 0x0d, 0xfd, 0x41, 0x3f, 0x94, 0x06, 0x6c, 0xd2, 0x5b, 0xc1, 0xbb, 0x67, 0x63, 0xcf, 0xe7, 0x87, 0x3f, 0x87, 0x9e, 0xfe, 0xfb, 0x22, 0x4e, 0xbd, + 0xab, 0x18, 0xe8, 0x1b, 0xaf, 0xda, 0xc2, 0x77, 0x54, 0x3f, 0x69, 0x0a, 0xb1, 0xdf, 0xef, 0x77, 0xf5, 0x97, 0xc9, 0x73, 0xfd, 0x2d, 0xfe, 0xf6, 0xea, 0xdb, 0xe4, 0x66, 0xff, 0x86, 0xff, 0x20, + 0xef, 0xaf, 0x7e, 0xf6, 0x5d, 0xfe, 0xf7, 0xfb, 0x42, 0xc9, 0xaf, 0x73, 0xe6, 0xb9, 0x37, 0x9f, 0xaf, 0x3e, 0xa5, 0x45, 0xb8, 0xc0, 0xf1, 0xa5, 0xf4, 0xf3, 0xd9, 0xb2, 0x7e, 0x7b, 0x93, 0xf7, + 0x45, 0x0f, 0x3f, 0x24, 0x21, 0xb8, 0x93, 0xca, 0xe6, 0x35, 0xa1, 0xf0, 0x57, 0xd3, 0x1d, 0x7a, 0xc8, 0x23, 0xe2, 0x89, 0xe6, 0x65, 0xc2, 0xdf, 0x8e, 0x26, 0xd0, 0xcf, 0x7e, 0x10, 0xf0, 0x64, + 0x1b, 0x0e, 0x43, 0x87, 0x13, 0xd1, 0xde, 0x51, 0xec, 0x55, 0x72, 0xd6, 0xd9, 0x9d, 0x53, 0x9d, 0xb9, 0x9d, 0xe6, 0xcd, 0xd9, 0x1f, 0x85, 0x7a, 0x33, 0x48, 0xeb, 0xd2, 0xb9, 0x19, 0xfa, 0xe0, + 0xfb, 0x89, 0xe4, 0x6a, 0xa7, 0x4c, 0x26, 0x55, 0x70, 0xbe, 0x1f, 0xf1, 0xf8, 0x88, 0x42, 0xe4, 0x85, 0xea, 0xa5, 0xc7, 0xcf, 0xc7, 0xd7, 0x3a, 0x30, 0x23, 0xd4, 0x20, 0x06, 0x51, 0x35, 0x09, + 0x13, 0x9f, 0x87, 0x95, 0xb2, 0x39, 0x99, 0x14, 0xa0, 0x65, 0xae, 0x86, 0x1d, 0x4e, 0x30, 0x8c, 0x2c, 0x89, 0x1c, 0x59, 0xcc, 0x25, 0x76, 0xb6, 0x88, 0x00, 0x7c, 0xea, 0xad, 0xb5, 0x55, 0x8b, + 0xaa, 0xab, 0x9d, 0x9f, 0x4c, 0xe3, 0x5a, 0x91, 0xa7, 0x51, 0x1c, 0x60, 0xbe, 0x70, 0x72, 0x64, 0xba, 0xdb, 0xe7, 0x0e, 0x65, 0xed, 0x04, 0x04, 0xef, 0xa1, 0x9d, 0xd8, 0xa4, 0xfc, 0xbd, 0x8c, + 0x7f, 0x1f, 0xb0, 0xe8, 0xeb, 0xc9, 0x77, 0x4a, 0x0e, 0xe8, 0x41, 0x30, 0x9e, 0xc9, 0x5e, 0xd1, 0x78, 0x6e, 0x5c, 0x73, 0x52, 0xfc, 0x68, 0xf3, 0x74, 0x61, 0x32, 0x5b, 0x13, 0xc4, 0xec, 0xe8, + 0xb9, 0xb3, 0x79, 0xbb, 0x75, 0xf7, 0xd9, 0xa1, 0x92, 0x28, 0x20, 0xb6, 0xb6, 0xf2, 0x88, 0x0e, 0xbd, 0xcc, 0xf8, 0xaf, 0x87, 0x16, 0x7d, 0x20, 0x12, 0xea, 0x89, 0xe6, 0xa5, 0x2b, 0xb7, 0xa3, + 0xab, 0x35, 0xe5, 0x87, 0xa8, 0x27, 0x78, 0xc2, 0xd8, 0x87, 0x0d, 0x48, 0x14, 0x94, 0xa0, 0xc6, 0x5e, 0x65, 0x5a, 0x11, 0xab, 0xc0, 0x00, 0x93, 0x19, 0x01, 0xe6, 0x1e, 0x47, 0xf4, 0x23, 0x48, + 0x9c, 0xea, 0xbb, 0xb4, 0x4c, 0xc4, 0x43, 0xc6, 0xe8, 0x57, 0xb2, 0x97, 0xde, 0xbc, 0x34, 0xbe, 0xd8, 0xef, 0xbf, 0x9c, 0xa7, 0x1d, 0x6f, 0xd5, 0xe5, 0x89, 0x41, 0x56, 0xba, 0xbe, 0x6d, 0xd6, + 0xb1, 0xe5, 0xc7, 0x11, 0x8b, 0xd8, 0xae, 0xba, 0xf1, 0xc9, 0x0d, 0xc2, 0x31, 0xeb, 0x29, 0xd3, 0xc5, 0x00, 0x62, 0x98, 0x92, 0xe6, 0x41, 0x49, 0xd5, 0xc9, 0x2b, 0x57, 0x9c, 0x0d, 0xf2, 0x09, + 0x0d, 0x37, 0x1e, 0x9c, 0x6b, 0xb8, 0xe2, 0xd6, 0xf5, 0x7e, 0x2d, 0xe8, 0x0d, 0x67, 0xa9, 0x19, 0x8d, 0x2e, 0x96, 0x43, 0xae, 0x44, 0xf1, 0xa7, 0xe4, 0x0a, 0x75, 0x90, 0x0e, 0x93, 0xb8, 0x6c, + 0xee, 0x2a, 0x2c, 0x1f, 0xa9, 0xe0, 0xf5, 0x4c, 0xf4, 0xda, 0xef, 0xdb, 0xe1, 0x84, 0x1c, 0x57, 0xbd, 0xeb, 0x2c, 0x68, 0x22, 0xc4, 0xb5, 0x5e, 0x8a, 0x97, 0xea, 0xf9, 0x94, 0x6f, 0xa1, 0x01, + 0xdd, 0xed, 0xa1, 0x69, 0xc5, 0x73, 0x04, 0xe9, 0x2c, 0x0d, 0x39, 0x9c, 0x52, 0x10, 0x1e, 0xc6, 0xdc, 0x74, 0x49, 0xe4, 0x7b, 0xc3, 0x76, 0xcb, 0xe0, 0x60, 0x9d, 0xcf, 0xdb, 0xd5, 0x42, 0x35, + 0xc0, 0xde, 0x3a, 0x61, 0xc9, 0x7a, 0xe7, 0x26, 0x31, 0x3d, 0x5d, 0x0d, 0x32, 0x08, 0xec, 0xbd, 0x2d, 0xa4, 0xc0, 0x4d, 0xf6, 0x29, 0x79, 0x46, 0x9d, 0x4d, 0xee, 0x9b, 0x0a, 0xef, 0xcb, 0x3c, + 0xa3, 0xfb, 0xff, 0x89, 0xfc, 0x05, 0x89, 0x4f, 0x27, 0xc7, 0xd6, 0xdb, 0x58, 0x17, 0x08, 0xae, 0xd2, 0x35, 0x71, 0x66, 0xf0, 0x34, 0x97, 0xfc, 0x78, 0xab, 0xa8, 0xcb, 0x85, 0x80, 0x82, 0xde, + 0xb0, 0x43, 0xc0, 0x42, 0x64, 0x2c, 0x4e, 0x10, 0x86, 0x03, 0x6f, 0x63, 0xad, 0x99, 0xa0, 0xd3, 0xd5, 0xd1, 0x10, 0x83, 0x19, 0x8f, 0x49, 0x7c, 0x01, 0x39, 0xbc, 0x32, 0x07, 0x0f, 0x51, 0x7f, + 0x06, 0xf4, 0xd0, 0xae, 0x2c, 0x1c, 0xf7, 0xa6, 0xc3, 0x70, 0x06, 0xb4, 0x02, 0x1a, 0x95, 0x1d, 0xf0, 0xfa, 0xca, 0x9e, 0xd3, 0x4f, 0x4a, 0x23, 0xf5, 0xee, 0xad, 0x5a, 0xf8, 0x43, 0x6e, 0x0a, + 0xef, 0x49, 0x3f, 0xc3, 0xf3, 0x72, 0xe2, 0xaa, 0xc3, 0x19, 0xa1, 0xac, 0x25, 0x70, 0x89, 0x0c, 0xce, 0x84, 0x8a, 0x0f, 0x6c, 0x09, 0x5b, 0x9d, 0xe5, 0xb5, 0x72, 0x6f, 0x9a, 0xeb, 0x8e, 0x3c, + 0x46, 0xa8, 0x27, 0x0e, 0xb8, 0xbd, 0xb6, 0x6b, 0x1d, 0x2b, 0x99, 0xd6, 0xd9, 0x16, 0x7e, 0x69, 0x6f, 0x24, 0x60, 0x1b, 0x80, 0xab, 0x9e, 0xa8, 0x07, 0x0e, 0x12, 0x58, 0x13, 0x40, 0x96, 0xf3, + 0x21, 0x75, 0xe6, 0xfc, 0x26, 0x58, 0x16, 0xe5, 0x8c, 0x99, 0xef, 0x85, 0x88, 0xaa, 0x1e, 0xb3, 0x23, 0x04, 0xd5, 0x24, 0x6d, 0x12, 0xf3, 0xc9, 0x86, 0x4f, 0x7e, 0xa3, 0xe7, 0xce, 0x9a, 0xbb, + 0x75, 0xd1, 0x1e, 0xcb, 0x3b, 0x79, 0xa5, 0x78, 0xc5, 0xb0, 0xb1, 0xfc, 0xb1, 0x39, 0x27, 0x4f, 0x74, 0x4f, 0x1d, 0x07, 0xfc, 0xb0, 0xad, 0xc5, 0xfd, 0xae, 0x5e, 0x17, 0x00, 0x0f, 0xa1, 0x60, + 0xc5, 0x31, 0xa5, 0x3a, 0xdf, 0xae, 0xfa, 0x8e, 0xb1, 0x8a, 0x66, 0x2f, 0x21, 0x16, 0x86, 0x6e, 0x1d, 0x08, 0x05, 0xa7, 0x95, 0x53, 0x86, 0x32, 0xbd, 0x3e, 0xd7, 0xe1, 0xee, 0x4c, 0x2c, 0xa2, + 0x8d, 0x73, 0x9e, 0x32, 0xa0, 0x1f, 0x3b, 0xc3, 0x4c, 0x3d, 0xd0, 0xcb, 0x6d, 0xd7, 0xe9, 0xc7, 0x6e, 0x1a, 0x3f, 0xe6, 0x06, 0x91, 0x66, 0xf9, 0x33, 0xeb, 0x06, 0xfd, 0x81, 0xef, 0xc1, 0x56, + 0x4d, 0xd2, 0xfb, 0x59, 0xda, 0xa7, 0x8f, 0x31, 0x4e, 0x37, 0x9a, 0x17, 0xe8, 0x6e, 0x47, 0x93, 0xe9, 0xcf, 0x8c, 0xd3, 0x05, 0x3c, 0x5f, 0x8a, 0x6b, 0x52, 0x9f, 0xcd, 0xd9, 0x9d, 0xbc, 0x74, + 0x21, 0x94, 0x47, 0x70, 0x74, 0xa8, 0xb7, 0x1a, 0x6a, 0xaf, 0xcc, 0xa5, 0xb0, 0x2c, 0x67, 0xc5, 0xb4, 0x58, 0xaf, 0x4e, 0x47, 0x6d, 0xaa, 0xae, 0xb4, 0x18, 0x3e, 0x93, 0x9d, 0x96, 0x7a, 0xfb, + 0x12, 0x15, 0x65, 0xbc, 0x4f, 0x9a, 0x80, 0xca, 0x90, 0x99, 0xd1, 0x57, 0xa2, 0xd0, 0xaf, 0xcf, 0xa1, 0xe1, 0x6e, 0x8f, 0xc1, 0x89, 0xce, 0xe0, 0xc5, 0x83, 0x46, 0x82, 0xf2, 0xd9, 0xb2, 0xf2, + 0xc1, 0xf7, 0xc3, 0x2a, 0x1d, 0xa3, 0x76, 0x26, 0x4f, 0xbf, 0xfa, 0xfd, 0x3f, 0x5f, 0xe5, 0xc7, 0x7f, 0x29, 0x9d, 0x83, 0x7d, 0x34, 0x31, 0x24, 0x46, 0xe4, 0x4c, 0x9c, 0xb2, 0xcc, 0xca, 0xdf, + 0x5f, 0x7a, 0x78, 0x7c, 0xe9, 0x46, 0xff, 0xfb, 0x5f, 0x57, 0xaf, 0xf6, 0xb7, 0x8e, 0x15, 0xbf, 0x87, 0x97, 0x89, 0x7d, 0x8f, 0x47, 0xac, 0xe2, 0xc0, 0xbc, 0xbb, 0xfe, 0xc2, 0x8f, 0xc4, 0x7c, + 0x5c, 0x49, 0x5e, 0x47, 0x35, 0x0e, 0xcc, 0xc9, 0x8d, 0xc8, 0xcf, 0x83, 0xaa, 0xa6, 0x01, 0x8a, 0x0b, 0xdc, 0x39, 0xf4, 0xf8, 0xb2, 0x73, 0xda, 0xa1, 0x5a, 0x1d, 0xe6, 0xb3, 0xb2, 0xde, 0x32, + 0xb9, 0xd4, 0x0e, 0x0e, 0x75, 0x56, 0x40, 0x88, 0xc5, 0xd8, 0x41, 0x4b, 0x31, 0x54, 0x22, 0x41, 0xb2, 0x68, 0xe5, 0x4e, 0xf2, 0xa7, 0xf4, 0x32, 0x5a, 0x39, 0x9d, 0xc9, 0x37, 0xb1, 0x92, 0xd6, + 0x66, 0xe0, 0x25, 0xd6, 0x81, 0x2c, 0x6d, 0x15, 0xa5, 0x85, 0x6c, 0xda, 0xed, 0x36, 0x63, 0x42, 0x12, 0x2e, 0xaf, 0x99, 0xd6, 0x13, 0x2b, 0x4b, 0xdd, 0xc0, 0x9b, 0xfc, 0x50, 0x24, 0xeb, 0xe6, + 0x73, 0xfa, 0x10, 0x24, 0x9f, 0x9f, 0xf1, 0x84, 0xd1, 0xe7, 0x0b, 0x93, 0xdb, 0x63, 0x7e, 0x06, 0xad, 0x97, 0xba, 0xa9, 0xe4, 0x09, 0xd2, 0x76, 0x89, 0x06, 0xdc, 0xae, 0x4f, 0x38, 0x92, 0x39, + 0x95, 0x00, 0x6b, 0x80, 0xfb, 0x73, 0xd9, 0xba, 0xab, 0x3a, 0x5c, 0xd4, 0xf8, 0x96, 0x8e, 0x09, 0xd8, 0x8b, 0x90, 0x23, 0xbd, 0x04, 0x19, 0x7a, 0x1a, 0xcd, 0xd5, 0x5d, 0xd8, 0x02, 0xfd, 0xb0, + 0x3e, 0xc2, 0xe5, 0xb1, 0x4e, 0x8d, 0x61, 0xeb, 0xf0, 0x47, 0x65, 0x43, 0x5b, 0xbc, 0x4a, 0xe9, 0x30, 0x99, 0x32, 0xe3, 0x40, 0x6b, 0xea, 0xe0, 0x6e, 0xb9, 0x38, 0xf4, 0x0f, 0xf2, 0xd0, 0x4a, + 0x7a, 0x23, 0x7a, 0x85, 0xe5, 0x7a, 0x34, 0xb9, 0x11, 0xfa, 0x19, 0x87, 0x64, 0xc5, 0x71, 0x68, 0x70, 0x54, 0xb7, 0x00, 0x7a, 0x5c, 0x10, 0xfd, 0x16, 0x8f, 0x20, 0x89, 0xf5, 0xb9, 0xdd, 0x91, + 0xe6, 0x24, 0x7a, 0xde, 0x82, 0xc0, 0x2e, 0x62, 0xc5, 0x3c, 0xdc, 0x9d, 0xfa, 0xbe, 0x47, 0x48, 0x8e, 0xdb, 0xd1, 0x49, 0x32, 0x23, 0xa0, 0xd9, 0x34, 0xf7, 0xc4, 0x63, 0xcb, 0x07, 0xd4, 0x92, + 0xf3, 0x77, 0xbc, 0xc4, 0x26, 0x21, 0xbd, 0x93, 0xce, 0x15, 0x72, 0x22, 0x45, 0x58, 0x7c, 0x6c, 0x39, 0x7d, 0xfe, 0xa0, 0x2e, 0x5f, 0x2d, 0x75, 0xf7, 0xab, 0x7b, 0x5b, 0xa3, 0xff, 0x6b, 0x69, + 0xe4, 0x91, 0x64, 0x34, 0xaf, 0x64, 0x2f, 0x18, 0xbe, 0x34, 0x26, 0xd0, 0xb8, 0xf4, 0x33, 0x6a, 0xec, 0x1c, 0x33, 0x6b, 0xda, 0x74, 0x4b, 0xb5, 0x08, 0x4f, 0x9d, 0x6a, 0x1c, 0x0f, 0xfa, 0x2c, + 0x39, 0xf3, 0xd6, 0x42, 0xc7, 0x29, 0x9c, 0x92, 0x67, 0x48, 0xdb, 0xf6, 0xf0, 0xb1, 0xc4, 0xfb, 0xb5, 0x15, 0xf4, 0xea, 0x5a, 0x02, 0xa8, 0x6d, 0xba, 0x60, 0xbc, 0x5d, 0x1e, 0x1f, 0x51, 0xa8, + 0xa9, 0x88, 0xda, 0x29, 0xec, 0xb8, 0x8a, 0x16, 0x6e, 0x03, 0x18, 0x0e, 0xc6, 0x91, 0x53, 0x31, 0x73, 0x1e, 0xd3, 0xc1, 0xbc, 0xab, 0x48, 0x78, 0xf3, 0x7f, 0xfb, 0x0e, 0x4a, 0xf7, 0x3b, 0xa1, + 0x9e, 0x7a, 0x64, 0x0d, 0x7b, 0xa6, 0xfa, 0x0c, 0xa4, 0x7b, 0x13, 0xec, 0xa9, 0x31, 0x4b, 0x19, 0x66, 0x9b, 0xe7, 0xf5, 0xb9, 0x68, 0xc3, 0xda, 0x0b, 0x78, 0xbc, 0xec, 0xe0, 0x08, 0x2f, 0xd9, + 0x55, 0x4d, 0xcf, 0x04, 0x2e, 0xb1, 0x1b, 0xdb, 0x5f, 0x0e, 0x34, 0x6b, 0x84, 0x02, 0x04, 0xbb, 0xec, 0xe0, 0x1b, 0xb3, 0xb5, 0x5f, 0x65, 0x9c, 0x30, 0x10, 0x03, 0x09, 0xac, 0x85, 0x29, 0xba, + 0x76, 0xf3, 0x45, 0xdd, 0x69, 0xd3, 0xa0, 0x08, 0xc8, 0x88, 0x01, 0xfa, 0x8e, 0xf3, 0xe5, 0x4a, 0xd8, 0x8c, 0x89, 0xe6, 0xbd, 0xbc, 0xa9, 0x7d, 0x75, 0xfa, 0x9a, 0xd4, 0xd9, 0xf7, 0x69, 0xb2, + 0x2e, 0x5b, 0xc2, 0xdf, 0xe7, 0xf9, 0xf9, 0xea, 0x01, 0x4f, 0x08, 0x7d, 0x3c, 0x7d, 0xe5, 0x84, 0x46, 0xe4, 0x00, 0x3a, 0xdb, 0x0d, 0xa5, 0xf2, 0x02, 0xcb, 0x38, 0x39, 0xc7, 0xed, 0x00, 0x55, + 0x13, 0xd5, 0x99, 0x22, 0xd5, 0xa7, 0x26, 0x80, 0xe2, 0x01, 0x12, 0xea, 0xcc, 0x3f, 0x56, 0x56, 0x07, 0x1c, 0x13, 0x63, 0x15, 0xcc, 0x4e, 0x07, 0xca, 0x2f, 0x15, 0xb8, 0x2c, 0x41, 0x70, 0x45, + 0x28, 0x00, 0xc4, 0xb4, 0x1b, 0x54, 0x94, 0xe1, 0xe9, 0x7e, 0x4a, 0x4e, 0x79, 0x28, 0x36, 0xb6, 0xae, 0x4a, 0x95, 0x09, 0x75, 0x2f, 0xf4, 0xf7, 0x87, 0x49, 0x17, 0x54, 0x93, 0xd7, 0x9e, 0xfc, + 0xfe, 0x9f, 0xef, 0x13, 0x7a, 0x5e, 0xee, 0xac, 0xac, 0x32, 0xc8, 0xef, 0x3b, 0xf6, 0x20, 0x0f, 0xb8, 0xb0, 0xbf, 0x92, 0x7d, 0xc2, 0xf5, 0xd6, 0xb8, 0x1a, 0x1b, 0x46, 0xb8, 0xa8, 0x2b, 0x80, + 0xd3, 0xc6, 0xda, 0x4a, 0x4f, 0xe5, 0xc8, 0x38, 0x53, 0x87, 0x1d, 0xdd, 0xf4, 0x87, 0xd9, 0x14, 0x19, 0x74, 0x5a, 0xca, 0xea, 0x12, 0x5f, 0x01, 0x27, 0x5f, 0x26, 0x4d, 0x06, 0xf5, 0xf5, 0x63, + 0x6a, 0xf7, 0x78, 0xbd, 0x14, 0x0d, 0xd8, 0x6d, 0xe6, 0x9e, 0xb3, 0x0f, 0xfb, 0xd9, 0x99, 0x87, 0x77, 0x81, 0x80, 0xaf, 0xcf, 0xad, 0x61, 0xaf, 0xd5, 0x83, 0xe2, 0xb8, 0x4d, 0xd3, 0xe9, 0xf3, + 0xdd, 0x98, 0x0d, 0xa1, 0x49, 0xcd, 0xac, 0x9f, 0xe4, 0x65, 0x90, 0x04, 0x75, 0xf0, 0x4d, 0x5e, 0xe1, 0x47, 0x9c, 0x9d, 0x3e, 0xd0, 0x06, 0x27, 0x1f, 0xcf, 0x8c, 0xc9, 0xff, 0x7a, 0x15, 0x58, + 0xe0, 0x5c, 0x8a, 0xe7, 0xcc, 0xd4, 0xc7, 0x61, 0x25, 0x2b, 0x9d, 0x61, 0x03, 0xd1, 0x3b, 0x27, 0xb0, 0x1d, 0x1e, 0xe5, 0x19, 0x8e, 0xe7, 0x52, 0x9f, 0x00, 0x94, 0xe9, 0x16, 0xa2, 0x50, 0x14, + 0x0e, 0xf2, 0x82, 0x90, 0x29, 0x71, 0xa1, 0xea, 0x5a, 0x50, 0x48, 0x44, 0x0a, 0xd6, 0xe6, 0xaa, 0xc7, 0x2a, 0x7c, 0x3d, 0x6d, 0x76, 0xbe, 0x35, 0x38, 0x04, 0x5d, 0x9a, 0x51, 0x70, 0x8e, 0x68, + 0x66, 0x84, 0x13, 0xce, 0x0f, 0x0e, 0xfc, 0xbe, 0x51, 0x4d, 0xcc, 0xc0, 0x0b, 0x9e, 0x6a, 0x43, 0x7c, 0x7d, 0x43, 0x35, 0x24, 0x66, 0x16, 0xbf, 0xde, 0xf0, 0x4e, 0xc5, 0xdb, 0xf9, 0x81, 0xe5, + 0x4f, 0xcc, 0xac, 0x77, 0xec, 0x77, 0x63, 0xf0, 0xfb, 0xbb, 0x7a, 0xb8, 0x4d, 0x6a, 0x3b, 0x6e, 0x65, 0xb8, 0xf7, 0xd5, 0x83, 0x8f, 0x04, 0x01, 0xbe, 0x50, 0xbd, 0x0e, 0xd3, 0xd3, 0xf1, 0xd8, + 0x4a, 0x7b, 0x69, 0xa9, 0xea, 0x5d, 0xa7, 0x96, 0x0c, 0x78, 0x00, 0x37, 0xaa, 0x33, 0x78, 0x9b, 0xc2, 0x9e, 0x8b, 0x84, 0xa0, 0xeb, 0xf0, 0x96, 0x20, 0x56, 0x65, 0xcf, 0x83, 0x3a, 0x99, 0xac, + 0x0b, 0x24, 0x93, 0x8c, 0x34, 0x13, 0xa0, 0x05, 0x9c, 0x6e, 0x7b, 0x34, 0xee, 0x36, 0x7c, 0x43, 0xcc, 0xba, 0x8d, 0x46, 0x4c, 0x7d, 0x3b, 0xe8, 0x8d, 0x85, 0x2c, 0x36, 0x99, 0x56, 0xf1, 0x21, + 0x8b, 0x83, 0x73, 0xe4, 0xb1, 0x7d, 0xfc, 0xd5, 0xaf, 0x1b, 0x79, 0x97, 0x5b, 0xee, 0x0d, 0xa5, 0x7b, 0x3e, 0x35, 0xcf, 0x3f, 0x7d, 0x6b, 0xa8, 0x79, 0x0f, 0x2c, 0xf1, 0x67, 0xfa, 0x66, 0xf8, + 0xc6, 0x83, 0x7b, 0xa5, 0x0c, 0x4e, 0x6e, 0xff, 0x27, 0x57, 0x3a, 0xe3, 0x6c, 0x57, 0xe6, 0x9c, 0x64, 0xe3, 0xd2, 0xde, 0x18, 0x9b, 0x54, 0x32, 0x67, 0x12, 0x00, 0xb3, 0x59, 0xad, 0xb5, 0x85, + 0x5e, 0x99, 0xa8, 0x63, 0xc5, 0x78, 0x17, 0x10, 0xb4, 0x1b, 0x10, 0xf4, 0xe6, 0x70, 0xb4, 0x84, 0xac, 0xcb, 0x09, 0xab, 0xad, 0x72, 0x0f, 0x0a, 0xd5, 0x73, 0xba, 0x3b, 0x70, 0x4c, 0x98, 0x80, + 0x2c, 0x39, 0xb3, 0xbd, 0x05, 0xad, 0x38, 0x33, 0x49, 0xe1, 0x05, 0x8b, 0x5b, 0x56, 0x2b, 0xfe, 0x3f, 0x37, 0x40, 0x26, 0xd5, 0xef, 0x97, 0x3c, 0x45, 0x6f, 0xae, 0xfc, 0x64, 0xb2, 0x6a, 0xd2, + 0xa0, 0x68, 0x9c, 0x9f, 0xb3, 0xb9, 0xff, 0x3d, 0x07, 0xf5, 0x8e, 0xf2, 0x75, 0x06, 0xbf, 0x69, 0x8f, 0x4d, 0x7c, 0xd4, 0x08, 0x86, 0x13, 0x94, 0xac, 0xd4, 0xe6, 0xfa, 0x69, 0xef, 0x9d, 0xbb, + 0x4a, 0x5a, 0xd6, 0x47, 0xe4, 0xac, 0xec, 0x0f, 0x65, 0x0a, 0x52, 0x5b, 0xbc, 0x00, 0xd7, 0x4e, 0xaf, 0x27, 0x2b, 0xc8, 0x59, 0x11, 0xfb, 0x19, 0x89, 0xce, 0x93, 0xd9, 0x0c, 0x3f, 0x62, 0xcb, + 0x4e, 0xdc, 0x1d, 0x7a, 0x79, 0xa6, 0x57, 0x53, 0xfc, 0x30, 0x53, 0xb7, 0x42, 0xe1, 0x6c, 0x33, 0x49, 0x12, 0x44, 0xdc, 0xd3, 0xdd, 0x07, 0x9d, 0xd8, 0xac, 0x72, 0xc8, 0xeb, 0x6c, 0x52, 0x1a, + 0xa9, 0xfd, 0xd9, 0xc9, 0xe8, 0xce, 0xce, 0xd6, 0xe4, 0xf6, 0x45, 0x74, 0x4d, 0xb3, 0x3a, 0x70, 0xef, 0x4b, 0x42, 0xd8, 0xbb, 0xf0, 0xbc, 0xd1, 0xf8, 0xbe, 0xa7, 0x7d, 0x41, 0xf8, 0xfd, 0x99, + 0xc9, 0x95, 0xee, 0xcf, 0x18, 0x6b, 0xb1, 0x4d, 0xe8, 0xd0, 0x6e, 0x98, 0x6b, 0x4b, 0x9a, 0xb0, 0xa2, 0x75, 0xe8, 0xba, 0x4b, 0x71, 0x2f, 0x26, 0x2b, 0x35, 0x84, 0x3d, 0xde, 0x61, 0x49, 0x63, + 0x27, 0x9e, 0x31, 0x7e, 0x09, 0xa8, 0x7c, 0x94, 0x04, 0x3d, 0xad, 0x62, 0xe1, 0x31, 0xf5, 0xca, 0xa5, 0x2a, 0x68, 0x67, 0xb2, 0x93, 0x38, 0x3a, 0xa9, 0x33, 0x06, 0xe3, 0x53, 0xda, 0x40, 0x66, + 0x69, 0x43, 0xee, 0xf6, 0x9c, 0x5f, 0x83, 0x8f, 0xad, 0x14, 0x97, 0x65, 0xf7, 0x0a, 0xc9, 0x67, 0xef, 0x3c, 0xcb, 0x37, 0xe2, 0x5b, 0x4e, 0xd3, 0x4f, 0x01, 0x20, 0x37, 0x91, 0xef, 0x39, 0xa9, + 0xdb, 0xcd, 0x6e, 0x0b, 0x7f, 0x5c, 0xf4, 0x07, 0xa3, 0x4c, 0x9f, 0x86, 0xeb, 0x83, 0xee, 0x20, 0x48, 0xae, 0x71, 0xec, 0xb1, 0x71, 0x1e, 0xee, 0xdc, 0x50, 0x4d, 0xac, 0xe0, 0xcd, 0x50, 0xbf, + 0xbf, 0x14, 0xa4, 0x55, 0x6d, 0xc4, 0xb1, 0x63, 0x4f, 0xbc, 0x38, 0x33, 0x8d, 0x38, 0xbe, 0x51, 0x81, 0x3e, 0xc6, 0xa1, 0x04, 0xd5, 0x24, 0xcd, 0x93, 0xdf, 0xff, 0xf3, 0x95, 0x73, 0x62, 0x70, + 0x7b, 0xbf, 0x27, 0x0a, 0x2f, 0xbf, 0x7f, 0x77, 0x4f, 0x6c, 0x5c, 0x1d, 0x93, 0xdf, 0xcc, 0x9b, 0x7f, 0x7d, 0x74, 0x39, 0x7b, 0x2e, 0x86, 0x77, 0x7b, 0xd1, 0xf7, 0x6a, 0x8e, 0x77, 0xe9, 0x17, + 0x3f, 0x3b, 0xdd, 0xfd, 0xee, 0x6d, 0x6f, 0x62, 0x1a, 0x95, 0x63, 0x07, 0xe5, 0x9b, 0x77, 0x7c, 0x9e, 0xd5, 0x23, 0x96, 0xea, 0xe7, 0x01, 0xba, 0xb7, 0x54, 0x3f, 0xee, 0xc1, 0x74, 0xa5, 0x0c, + 0x4e, 0x6e, 0xff, 0xff, 0xc6, 0x3b, 0x09, 0x63, 0x50, 0x9a, 0x38, 0xb9, 0x18, 0xcc, 0x89, 0xda, 0x6e, 0x61, 0x57, 0xe7, 0x84, 0x29, 0xf8, 0xf9, 0xb2, 0xc0, 0x15, 0x05, 0x6c, 0xf8, 0x19, 0x8d, + 0x90, 0xe8, 0x66, 0xbd, 0x4d, 0x44, 0x00, 0x0d, 0x67, 0xb1, 0x4f, 0xa9, 0x58, 0xc1, 0xd4, 0x76, 0xed, 0xcd, 0x77, 0xa8, 0xdb, 0xd7, 0xe6, 0x96, 0xe5, 0xcf, 0xfb, 0x1e, 0x41, 0x64, 0xdb, 0x4f, + 0x19, 0x6b, 0xd3, 0x36, 0x48, 0x03, 0xbb, 0xca, 0x3f, 0xe0, 0x08, 0xff, 0x39, 0x11, 0x0c, 0xfc, 0x85, 0xeb, 0xc7, 0x47, 0x3f, 0xec, 0x5b, 0x8a, 0xe4, 0xbf, 0x5b, 0xdc, 0x9f, 0x3d, 0x1d, 0xbf, + 0x5e, 0x75, 0x1e, 0x91, 0x8b, 0x6f, 0x24, 0x2f, 0x8b, 0xcd, 0xf5, 0x60, 0x82, 0x8d, 0x93, 0x87, 0x69, 0x68, 0xd8, 0x1d, 0xce, 0x9a, 0x7d, 0x9c, 0xcf, 0xd3, 0x69, 0x0a, 0x2c, 0x30, 0x60, 0xe9, + 0x63, 0xc3, 0x9a, 0xa9, 0x79, 0xd9, 0x32, 0x36, 0x55, 0xa2, 0xd1, 0x4c, 0x75, 0xd8, 0x2f, 0x29, 0x0f, 0x14, 0x9d, 0x90, 0xa3, 0x33, 0x7b, 0x2b, 0x23, 0xeb, 0x95, 0x2b, 0xa0, 0x26, 0x4f, 0x86, + 0xc7, 0x6a, 0xa7, 0xa6, 0x76, 0x96, 0x1f, 0x48, 0x71, 0xad, 0x9e, 0x6c, 0xad, 0xb0, 0x60, 0x37, 0x4c, 0x14, 0x62, 0x44, 0xf6, 0x91, 0x37, 0x35, 0x31, 0x9f, 0x3f, 0xec, 0x3b, 0x48, 0xc5, 0x4f, + 0xf9, 0x65, 0x63, 0xe3, 0x9f, 0x4d, 0x54, 0xf7, 0x8e, 0xf2, 0x15, 0xb7, 0x37, 0xed, 0x31, 0x49, 0x9d, 0xe0, 0xc9, 0xa2, 0x54, 0x39, 0x70, 0xe6, 0x9a, 0x18, 0x62, 0x57, 0xcb, 0x3e, 0xd1, 0x17, + 0xa8, 0x17, 0xc2, 0xf1, 0x8c, 0x18, 0xba, 0xaf, 0xf3, 0x39, 0xfc, 0x84, 0xc9, 0xfb, 0x9a, 0xfc, 0xdf, 0x6f, 0x60, 0x75, 0x70, 0x2f, 0x41, 0x1d, 0xf4, 0x07, 0x7e, 0x44, 0x2a, 0xbb, 0x50, 0xbc, + 0xc0, 0x50, 0x07, 0xf1, 0xe4, 0x46, 0xe2, 0xe7, 0xd9, 0x63, 0xf6, 0xfa, 0xb4, 0xa8, 0xf7, 0xf1, 0xf2, 0x78, 0xda, 0x8b, 0xc3, 0x54, 0x36, 0xa6, 0xaa, 0x17, 0xc1, 0x70, 0xb4, 0xaf, 0xe2, 0xbc, + 0xd1, 0x3b, 0xa3, 0x9f, 0x7b, 0x58, 0x25, 0xac, 0x99, 0x90, 0x58, 0x6c, 0x1b, 0x8b, 0x31, 0x4c, 0x64, 0xd3, 0xa7, 0xab, 0x6e, 0x10, 0x0e, 0xf3, 0x7c, 0xc5, 0xd7, 0x1c, 0xcc, 0x87, 0x99, 0x1c, + 0x9c, 0x64, 0x82, 0x09, 0x8e, 0xbc, 0xae, 0x99, 0xfb, 0x52, 0x04, 0xf6, 0x23, 0x84, 0x8d, 0xb7, 0xee, 0x1e, 0xff, 0xfa, 0x18, 0x18, 0x76, 0x59, 0xb4, 0x8d, 0xd2, 0x6b, 0x5e, 0x0a, 0xd1, 0xfd, + 0x0b, 0xfe, 0xc2, 0x21, 0xc4, 0x73, 0x52, 0xa7, 0x34, 0xea, 0xac, 0x9c, 0x3c, 0x7b, 0xa4, 0xbc, 0xdc, 0x4a, 0x7e, 0xb8, 0xf5, 0x2a, 0x30, 0x4f, 0xde, 0x4a, 0xcc, 0x1f, 0xa2, 0xf6, 0x3f, 0x04, + 0xd0, 0xfc, 0xeb, 0x63, 0x64, 0xd6, 0x93, 0xec, 0xf2, 0x15, 0x9d, 0x7b, 0x72, 0xcb, 0xc7, 0xd8, 0xb1, 0x7f, 0x50, 0xd2, 0x7c, 0x47, 0xfa, 0x79, 0xc4, 0x5f, 0x4e, 0x8c, 0x91, 0x33, 0xe1, 0xc9, + 0x4e, 0x86, 0x85, 0xc1, 0xcd, 0x3b, 0x34, 0xe5, 0x53, 0xad, 0x6d, 0xf7, 0x30, 0xc7, 0x6d, 0xbc, 0xe3, 0xd2, 0x60, 0x78, 0x6a, 0x84, 0x1c, 0xdd, 0x04, 0xf6, 0x9d, 0x2e, 0x51, 0xef, 0x36, 0xe7, + 0xd1, 0x5d, 0x6a, 0x02, 0xfb, 0xd2, 0x91, 0x26, 0xb0, 0x27, 0x57, 0x0a, 0x3f, 0xcf, 0xdc, 0x85, 0x98, 0xec, 0x4a, 0x60, 0x91, 0x9c, 0xd8, 0xf5, 0x92, 0x6a, 0x7c, 0xbd, 0x25, 0xe6, 0x88, 0x79, + 0xf0, 0x58, 0x45, 0xad, 0x56, 0x11, 0x44, 0x45, 0x2c, 0x99, 0x48, 0x71, 0x49, 0x9b, 0xac, 0x03, 0x58, 0x68, 0x39, 0xcd, 0x43, 0xcb, 0x51, 0x24, 0xaf, 0xc9, 0xd7, 0xae, 0xb0, 0xf6, 0x2d, 0x6c, + 0xe8, 0x71, 0x7c, 0x45, 0x4c, 0x45, 0x75, 0x26, 0x94, 0x47, 0x63, 0xdf, 0x34, 0x53, 0x67, 0x9d, 0x72, 0x9f, 0x72, 0x98, 0x5e, 0xdf, 0xe8, 0xbb, 0x84, 0xdc, 0x8f, 0x95, 0x95, 0x7a, 0x25, 0xfb, + 0xdc, 0xeb, 0xdb, 0xc2, 0x35, 0xa2, 0xac, 0xd4, 0xa5, 0xef, 0xa2, 0x9d, 0xa8, 0xfd, 0x8c, 0x2a, 0x99, 0x4a, 0x26, 0xb5, 0x5c, 0x50, 0x4c, 0x6e, 0xbf, 0x89, 0x84, 0xf3, 0xa1, 0x43, 0xd6, 0xc0, + 0x1e, 0x3f, 0x55, 0x26, 0xcf, 0xa4, 0xf3, 0x7a, 0x7d, 0xda, 0xcb, 0x46, 0x56, 0x09, 0x33, 0xeb, 0x54, 0x2f, 0x9a, 0x35, 0xa8, 0x71, 0xf0, 0x21, 0x3c, 0x1f, 0xd7, 0x44, 0x6a, 0x46, 0x5e, 0x50, + 0xb0, 0x83, 0x4f, 0x79, 0xa7, 0xd4, 0x73, 0xad, 0x96, 0x9a, 0x55, 0xf6, 0xe7, 0xb2, 0xa4, 0x2d, 0x35, 0xb1, 0xb2, 0x24, 0x0f, 0x62, 0xe7, 0x25, 0x0f, 0xf5, 0xd7, 0x32, 0xcc, 0x23, 0x69, 0x7d, + 0x3f, 0x12, 0x07, 0x27, 0x9f, 0x4e, 0x5d, 0xfd, 0x3a, 0x46, 0xa0, 0x11, 0x53, 0xf1, 0x9c, 0x4d, 0xb6, 0xd6, 0x56, 0xd3, 0x7d, 0x2c, 0x35, 0x9b, 0x54, 0xd0, 0x5b, 0x79, 0xbe, 0xb1, 0xf0, 0xbc, + 0x25, 0x81, 0xdd, 0xbc, 0x33, 0xa8, 0x02, 0xdc, 0xda, 0xc7, 0x9e, 0x6a, 0xc8, 0xb8, 0x3a, 0xb5, 0x12, 0xc3, 0x25, 0x79, 0x66, 0x6f, 0x66, 0x1b, 0xa1, 0x8b, 0x66, 0xfe, 0x66, 0x0e, 0x82, 0xf6, + 0x42, 0xc3, 0x28, 0xae, 0x59, 0xb3, 0x49, 0x58, 0xdb, 0xd8, 0x4e, 0x09, 0x98, 0x72, 0x8c, 0x26, 0xf3, 0xba, 0x28, 0x7c, 0x23, 0xd9, 0xfd, 0xfd, 0xa7, 0x7d, 0xa5, 0x08, 0x4e, 0x6e, 0xff, 0xc7, + 0xd6, 0xe2, 0xa2, 0xb7, 0x6b, 0xf4, 0x10, 0xc3, 0x87, 0x13, 0x2a, 0xb5, 0x31, 0x09, 0xc5, 0xe8, 0x50, 0xa0, 0x1a, 0x81, 0x05, 0x80, 0xd1, 0xe5, 0x9d, 0x5a, 0x54, 0x4b, 0x5a, 0x3b, 0x45, 0x51, + 0xc1, 0xd7, 0xa9, 0xa9, 0x7a, 0x25, 0xcf, 0x00, 0x43, 0x48, 0x96, 0xfe, 0x09, 0x8a, 0x1a, 0x96, 0xe9, 0xcf, 0x1b, 0x43, 0x53, 0x97, 0x21, 0x7b, 0xc2, 0x33, 0xcf, 0xc8, 0x39, 0x81, 0x67, 0x39, + 0x81, 0x0f, 0x03, 0xf3, 0x31, 0x29, 0x23, 0xa8, 0x9c, 0xde, 0xf9, 0x69, 0xe7, 0xbb, 0xa7, 0x07, 0xfa, 0xe7, 0x56, 0xc8, 0x2f, 0x9f, 0xf0, 0x02, 0xeb, 0x87, 0xf3, 0x63, 0xd6, 0xcb, 0xeb, 0x56, + 0xd9, 0xe9, 0x76, 0x0b, 0xcd, 0xb8, 0x6d, 0x9e, 0xc7, 0x0b, 0x0d, 0xe1, 0xf4, 0x9d, 0x4a, 0x1c, 0xda, 0xa1, 0x11, 0xc8, 0x2c, 0x0c, 0x4b, 0x32, 0xee, 0x22, 0x8f, 0x48, 0x62, 0xa8, 0xcc, 0xd6, + 0xc3, 0x54, 0x73, 0x9a, 0x7d, 0x49, 0x6e, 0xf6, 0x28, 0x89, 0x14, 0xb1, 0x70, 0x82, 0xa9, 0xa3, 0xac, 0x9d, 0x3d, 0x8d, 0x9b, 0x9e, 0x83, 0xa5, 0xe5, 0x94, 0xa7, 0x42, 0x17, 0x13, 0x36, 0x9d, + 0x2a, 0x63, 0xd2, 0xbc, 0x05, 0xcf, 0x7a, 0xb7, 0x97, 0xed, 0xed, 0xa3, 0xf0, 0x63, 0x66, 0x59, 0xec, 0x18, 0xe9, 0xe4, 0xe6, 0xe9, 0xf8, 0xb2, 0x33, 0x7d, 0x94, 0x83, 0x6e, 0xbe, 0x07, 0xef, + 0xef, 0xfa, 0xbc, 0xad, 0xbe, 0x11, 0xbf, 0x3f, 0x39, 0x5a, 0x06, 0xcf, 0x1a, 0xbe, 0xdf, 0xaf, 0x0a, 0xbe, 0x6f, 0x86, 0xf8, 0xfd, 0x76, 0x79, 0x6f, 0xf5, 0x24, 0x1f, 0x1c, 0xde, 0x37, 0xd4, + 0x5f, 0x86, 0xf6, 0xcd, 0xb9, 0xeb, 0x5a, 0x4a, 0xfe, 0x3c, 0xac, 0x6d, 0xd8, 0x1b, 0x34, 0x96, 0xba, 0x4c, 0xd1, 0x71, 0x6b, 0xa8, 0xab, 0xc8, 0x4e, 0xcf, 0xfb, 0x75, 0x6c, 0x3b, 0xb0, 0x5a, + 0x6e, 0x55, 0xbc, 0xa1, 0x21, 0x3d, 0xcc, 0xdd, 0xca, 0xf7, 0x12, 0x23, 0xdf, 0xf0, 0x0c, 0x19, 0x6e, 0x4e, 0xbe, 0xbe, 0x06, 0x86, 0x43, 0xb6, 0x39, 0x14, 0xc6, 0x82, 0x1e, 0x16, 0x90, 0x23, + 0xd0, 0x96, 0xd6, 0x9b, 0x61, 0x32, 0x3f, 0x67, 0x3b, 0x89, 0x9c, 0xbb, 0xec, 0x08, 0x0e, 0xc8, 0x68, 0x8d, 0x20, 0xbe, 0xba, 0xfa, 0xbc, 0x79, 0xe9, 0xea, 0x6b, 0xdc, 0x7f, 0x50, 0xcd, 0x7e, + 0x99, 0x73, 0xe8, 0x1d, 0x01, 0x37, 0x2b, 0x9f, 0x1d, 0x7a, 0xaf, 0x5f, 0xe6, 0xbb, 0x8b, 0x17, 0x19, 0xbe, 0xce, 0x6e, 0xe3, 0x5e, 0x1b, 0xaf, 0x43, 0xff, 0x71, 0xfe, 0x7c, 0xc5, 0xfd, 0x90, + 0x77, 0xc6, 0x3f, 0xb0, 0x2f, 0x12, 0x75, 0x1c, 0xa4, 0xf7, 0x3e, 0xec, 0xc7, 0xdc, 0x58, 0xde, 0xd0, 0xbd, 0x8c, 0xf9, 0x6b, 0x6b, 0xac, 0x4b, 0x8b, 0x50, 0x25, 0x99, 0x6a, 0xc4, 0xd5, 0x49, + 0x61, 0xf8, 0x65, 0x93, 0xf7, 0x3a, 0xbe, 0x83, 0xa8, 0xc8, 0x98, 0xba, 0xb1, 0x1e, 0x86, 0xc1, 0xb6, 0x5d, 0x29, 0xb3, 0x93, 0x26, 0x72, 0x75, 0xc0, 0xf1, 0x54, 0x13, 0xd6, 0xfa, 0xa9, 0x9c, + 0x5a, 0x3b, 0xd7, 0x35, 0x22, 0xa0, 0xd9, 0xb3, 0x18, 0x05, 0x88, 0x26, 0x25, 0x9a, 0x46, 0xac, 0xe6, 0xdd, 0xe0, 0x1c, 0x83, 0x81, 0x61, 0x08, 0x79, 0xe1, 0x3d, 0xa6, 0xf5, 0xfa, 0x22, 0x6c, + 0xf2, 0x2f, 0xf5, 0x02, 0xff, 0x0d, 0x9e, 0xbb, 0x3d, 0xf9, 0xbf, 0xc1, 0x73, 0xff, 0x0d, 0x9e, 0xfb, 0x60, 0xaf, 0xfd, 0x7f, 0x21, 0x78, 0xee, 0x2f, 0xe2, 0xbe, 0x1e, 0x83, 0xf0, 0xa7, 0xb8, + 0xaf, 0xb1, 0x60, 0x1d, 0xcf, 0xf8, 0x86, 0x01, 0x6a, 0xaf, 0xa8, 0x1b, 0x26, 0xe4, 0xfd, 0x6e, 0xed, 0xe1, 0xcd, 0x42, 0x51, 0x50, 0xbb, 0x2e, 0xf4, 0xe9, 0x20, 0x6f, 0x62, 0x5d, 0x71, 0x0b, + 0x6c, 0x0d, 0xc1, 0x20, 0x87, 0x4b, 0x46, 0x88, 0x1f, 0x57, 0x21, 0xa9, 0x0c, 0xa5, 0x2c, 0x6e, 0xda, 0xb3, 0xd1, 0xed, 0x95, 0x98, 0xcb, 0x45, 0x73, 0x96, 0x9b, 0x2e, 0x03, 0xb1, 0x36, 0x31, + 0x6c, 0x2c, 0x00, 0x76, 0xfe, 0x73, 0x5d, 0xde, 0x7f, 0xe3, 0xbe, 0xfe, 0x1b, 0xf7, 0xf5, 0xbb, 0xcb, 0x4a, 0x7b, 0xd2, 0x95, 0x77, 0x13, 0x13, 0xc3, 0x7f, 0x90, 0x07, 0x0c, 0x3c, 0x2f, 0x54, + 0x2f, 0x4c, 0xc4, 0xf3, 0xf1, 0x35, 0x27, 0xe5, 0x08, 0xa3, 0xce, 0xea, 0x0c, 0x26, 0xa5, 0xd0, 0x05, 0xb5, 0xb0, 0xf3, 0xc1, 0xd5, 0x71, 0x56, 0xf3, 0xa0, 0x72, 0x00, 0x71, 0x65, 0x05, 0x0c, + 0x1e, 0x43, 0x30, 0x0a, 0x99, 0x68, 0x9c, 0x3e, 0xab, 0x57, 0x62, 0x69, 0x56, 0xd4, 0x91, 0x8c, 0x5b, 0x69, 0x4f, 0xf4, 0x2e, 0xc9, 0x6e, 0x38, 0x7e, 0x01, 0x35, 0x27, 0x98, 0xdb, 0xcc, 0x63, + 0x68, 0x45, 0x42, 0xb0, 0x87, 0xea, 0xcb, 0xa6, 0x02, 0x92, 0x86, 0xc5, 0xdb, 0x31, 0xbe, 0xd6, 0x97, 0x97, 0xcc, 0xef, 0x73, 0xd2, 0x0f, 0x09, 0x4a, 0x57, 0x92, 0x17, 0x14, 0xae, 0x07, 0x63, + 0x44, 0x21, 0x78, 0x52, 0xef, 0xe5, 0x69, 0x78, 0x26, 0xe9, 0x22, 0x54, 0x7b, 0x21, 0xd2, 0x16, 0xed, 0x0c, 0x92, 0x85, 0x86, 0xe7, 0xea, 0x7c, 0x84, 0xea, 0xa8, 0x2b, 0x83, 0xda, 0x99, 0xb8, + 0x17, 0x21, 0xff, 0x96, 0xbf, 0xfa, 0x1b, 0x95, 0xf0, 0x03, 0x03, 0xfb, 0x91, 0xfa, 0xb5, 0x6b, 0x1f, 0xce, 0x8d, 0xad, 0x77, 0x30, 0x6b, 0x57, 0xd6, 0xa0, 0xe3, 0x9b, 0x74, 0xef, 0x16, 0x68, + 0x90, 0xed, 0xff, 0x7f, 0xce, 0xae, 0xa7, 0x47, 0x55, 0x18, 0x88, 0xdf, 0xf7, 0x63, 0xbc, 0xab, 0xd9, 0x57, 0xfe, 0x2e, 0x72, 0xac, 0x02, 0xae, 0x52, 0x54, 0x44, 0x84, 0x72, 0x78, 0x89, 0xf2, + 0x47, 0x40, 0x8a, 0x0a, 0x56, 0xec, 0x26, 0xef, 0xbb, 0xbf, 0xb8, 0xbe, 0x4d, 0x34, 0xea, 0x46, 0xf7, 0x40, 0x68, 0x2f, 0x93, 0x74, 0xa6, 0x33, 0xe9, 0xcc, 0xfc, 0xf2, 0x1b, 0x96, 0x57, 0x9d, + 0xd5, 0xbb, 0xca, 0x3c, 0x89, 0x28, 0x90, 0xad, 0xda, 0x40, 0xb5, 0x18, 0xd0, 0x34, 0x75, 0x5d, 0x9a, 0x31, 0x05, 0xaa, 0x94, 0x34, 0x95, 0xb5, 0x0e, 0x63, 0x32, 0x12, 0x6c, 0x38, 0x30, 0x60, + 0x51, 0x96, 0xda, 0xb0, 0x15, 0x68, 0x4e, 0x2b, 0xc8, 0xe1, 0x44, 0xa6, 0x73, 0x1e, 0x8c, 0x67, 0xe0, 0x87, 0xa0, 0x1f, 0x42, 0x2b, 0x42, 0xab, 0xf4, 0x34, 0x07, 0xe1, 0xd7, 0x1f, 0xee, 0x37, + 0x7f, 0x95, 0xb8, 0xdd, 0x44, 0x05, 0x9d, 0xc7, 0xb0, 0x8b, 0xb9, 0x12, 0xa7, 0xf0, 0x78, 0x91, 0x46, 0xdc, 0x01, 0x66, 0x9d, 0x3a, 0x5a, 0xf2, 0xed, 0x87, 0xfe, 0x65, 0x6f, 0xeb, 0x76, 0x33, + 0xe4, 0x27, 0xb5, 0xfd, 0x33, 0xb9, 0xe0, 0xf5, 0x7c, 0xf7, 0x08, 0x51, 0xe3, 0xd1, 0x78, 0x63, 0x67, 0x98, 0xea, 0x03, 0x2d, 0xce, 0x03, 0x3c, 0x53, 0x52, 0x99, 0xeb, 0xac, 0x53, 0xc4, 0xa9, + 0x7a, 0xa5, 0xce, 0xe6, 0xfd, 0x38, 0xa9, 0x04, 0x64, 0xc1, 0x44, 0x1c, 0xe9, 0x64, 0xd3, 0x5d, 0xe5, 0xa3, 0x4c, 0x94, 0x62, 0xcc, 0x6c, 0x0c, 0x7d, 0x77, 0x9a, 0xeb, 0xf6, 0x2e, 0x18, 0x4c, + 0xcd, 0xd0, 0xe0, 0x74, 0xc1, 0x35, 0xa7, 0x69, 0x6b, 0x5d, 0x6b, 0xa8, 0x5e, 0x0e, 0x33, 0xa2, 0x3e, 0xe2, 0xa5, 0x5f, 0x74, 0x7a, 0xf7, 0x74, 0xf1, 0xbc, 0x93, 0x7e, 0x4a, 0x3c, 0x6a, 0xe1, + 0xf8, 0x7f, 0x94, 0x3e, 0x09, 0x99, 0xd8, 0xe5, 0x33, 0xe8, 0x0f, 0x7c, 0x77, 0x09, 0xfd, 0x52, 0x75, 0x27, 0x79, 0x46, 0x5b, 0x96, 0x97, 0x32, 0xd7, 0x7f, 0xaf, 0xf7, 0xc9, 0x46, 0x21, 0x21, + 0xc5, 0x44, 0x8d, 0x1c, 0xd7, 0x34, 0x39, 0xd0, 0xcd, 0x77, 0x95, 0xdb, 0x18, 0xf0, 0xa0, 0xb5, 0x05, 0x40, 0xba, 0xde, 0x62, 0x87, 0xea, 0x5e, 0x6e, 0xf4, 0xe7, 0x11, 0xd7, 0xf4, 0xeb, 0x75, + 0x24, 0x7d, 0x54, 0x53, 0xa8, 0x5f, 0x31, 0x38, 0xb3, 0x79, 0x51, 0x64, 0xdf, 0xb2, 0x46, 0x3d, 0x6f, 0xfa, 0xff, 0x32, 0xc1, 0xeb, 0xd7, 0xea, 0x51, 0x93, 0x8b, 0x4d, 0xd4, 0xcb, 0xa2, 0x80, + 0x6d, 0xe5, 0x71, 0x87, 0x6b, 0x4b, 0x3e, 0xd2, 0x1d, 0x79, 0xba, 0x19, 0x39, 0x13, 0x28, 0x36, 0xb9, 0x0f, 0x8b, 0xbe, 0x67, 0xa5, 0x94, 0x08, 0xab, 0x49, 0xb8, 0x07, 0x12, 0xef, 0x94, 0x42, + 0x4c, 0x6c, 0x2e, 0x62, 0xa1, 0xed, 0x49, 0x34, 0xf0, 0x51, 0x9c, 0x37, 0xe6, 0x7e, 0xf9, 0xa6, 0xd7, 0xfb, 0x45, 0x54, 0xcc, 0x50, 0xcb, 0xc0, 0x7a, 0xb8, 0x53, 0xae, 0xaa, 0xa2, 0x9f, 0x60, + 0xf5, 0x7b, 0x19, 0xed, 0xf3, 0x95, 0x6f, 0x56, 0x1e, 0x0f, 0x5a, 0x3e, 0x3a, 0x52, 0xcf, 0x3d, 0x48, 0x6c, 0xd9, 0xf3, 0x6a, 0x2a, 0x84, 0x4a, 0x56, 0x1b, 0x5e, 0xdc, 0xc6, 0x94, 0xc7, 0x05, + 0x1d, 0x90, 0xed, 0x2c, 0x3d, 0x6c, 0x4d, 0x21, 0x44, 0xfe, 0xd0, 0x86, 0x32, 0x0c, 0xbb, 0xa2, 0x9d, 0x2c, 0x7a, 0xc3, 0x8d, 0xa5, 0x24, 0x94, 0xc3, 0xed, 0x05, 0xf8, 0xe0, 0xdf, 0x36, 0x3e, + 0x2a, 0x8d, 0x43, 0x80, 0xf7, 0x5e, 0x1a, 0x89, 0x49, 0xda, 0xc1, 0xaa, 0x86, 0x48, 0xf7, 0xed, 0xdb, 0x6b, 0xfd, 0x72, 0xfc, 0xfe, 0xbe, 0xfc, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, + 0x08, 0x7d, 0x55, 0x8d, 0xf2, 0x2c, 0x4b, 0x01, 0x00, 0x95, 0xc9, 0x04, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xcb, 0x6e, 0x1a, 0x41, 0x10, 0xbc, 0xf3, 0x15, 0xad, 0x3d, 0xf8, 0x80, 0x3c, 0xbd, 0x0f, 0x88, + 0x63, 0x73, 0x4a, 0x94, 0x44, 0xca, 0x3d, 0x39, 0x22, 0x47, 0xcb, 0x4e, 0x1b, 0x0f, 0x5a, 0x66, 0x27, 0xf3, 0x40, 0x20, 0x8b, 0x7f, 0x8f, 0xa6, 0xf7, 0xc1, 0xf2, 0x88, 0x65, 0x09, 0x01, 0x3b, + 0x55, 0x5d, 0xdd, 0x5d, 0x53, 0xda, 0xb7, 0x09, 0x40, 0xa2, 0xcb, 0x2d, 0x25, 0x0b, 0x48, 0x68, 0x47, 0xda, 0x8b, 0xd7, 0x52, 0xcb, 0x9a, 0x6c, 0x72, 0x1f, 0xa1, 0x1d, 0x59, 0xa7, 0x1a, 0x1d, + 0xd1, 0x0c, 0x73, 0xcc, 0xda, 0x53, 0x49, 0xae, 0xb2, 0xca, 0xf8, 0x0e, 0xf9, 0x7d, 0x30, 0xf4, 0x8b, 0x0f, 0xe0, 0x5b, 0xdd, 0x04, 0xf9, 0x23, 0xea, 0xc0, 0xcf, 0xb1, 0x4e, 0xad, 0x2a, 0xd2, + 0x8e, 0xbb, 0x7c, 0x35, 0x65, 0xf5, 0x4a, 0xa2, 0xe8, 0xc5, 0x2c, 0x99, 0xc6, 0x29, 0xdf, 0xd8, 0x43, 0xb2, 0x80, 0x38, 0x0f, 0x40, 0xe2, 0x0f, 0x86, 0xb9, 0x6b, 0xe5, 0x99, 0x04, 0x90, 0x04, + 0x5b, 0xc7, 0x93, 0x64, 0x02, 0x70, 0xe4, 0xba, 0x76, 0x04, 0x77, 0x2a, 0x5a, 0x05, 0x55, 0xcb, 0xc8, 0xd1, 0x66, 0x0f, 0xc2, 0x40, 0x14, 0x69, 0x49, 0xe0, 0x5d, 0xd5, 0xeb, 0x18, 0x4b, 0x9e, + 0x9c, 0x6f, 0x79, 0x5b, 0xb0, 0x41, 0x43, 0xad, 0xb4, 0x87, 0xbb, 0x3b, 0xe8, 0x9f, 0x5b, 0xa1, 0x8e, 0x1f, 0xc9, 0x8b, 0xa0, 0x15, 0x57, 0x78, 0x27, 0x74, 0x23, 0x09, 0xe2, 0xd7, 0x9f, 0x6d, + 0x23, 0x43, 0x4d, 0x2e, 0xf5, 0xa5, 0xa1, 0x74, 0xa5, 0x34, 0xff, 0x81, 0xc8, 0x4f, 0x23, 0x1f, 0xbd, 0x3b, 0xd3, 0x50, 0xda, 0xd3, 0xda, 0x96, 0xbd, 0x69, 0x1f, 0x95, 0x1a, 0x95, 0x5d, 0x28, + 0x8e, 0x57, 0x18, 0xa6, 0x1c, 0xef, 0x71, 0xd5, 0xb6, 0x2b, 0x76, 0xbe, 0xb4, 0x5c, 0xfd, 0x52, 0x96, 0x4e, 0x6c, 0x9c, 0xb0, 0x41, 0x7b, 0xb5, 0x25, 0xc0, 0x94, 0x57, 0x4f, 0x95, 0x96, 0xb4, + 0xc7, 0xcd, 0xd0, 0x2d, 0x1a, 0xc4, 0x01, 0x71, 0x6c, 0xd5, 0x32, 0x71, 0xb6, 0x4a, 0xa7, 0xd3, 0x74, 0x8a, 0x6f, 0x1b, 0x77, 0xef, 0xe3, 0x67, 0x7f, 0x5c, 0x26, 0xb0, 0xe4, 0xb9, 0x6e, 0x21, + 0x42, 0xfc, 0x0d, 0x8a, 0x86, 0xcb, 0x94, 0xb4, 0x0a, 0x6b, 0x9e, 0xbf, 0x91, 0xb4, 0x6d, 0x34, 0x08, 0xa1, 0xb4, 0x33, 0x54, 0x79, 0xc0, 0xf4, 0xcc, 0x91, 0x8b, 0x11, 0xd9, 0x9c, 0xaa, 0x56, + 0xb8, 0x71, 0xd7, 0xd3, 0x0e, 0xd1, 0x90, 0xb4, 0xfb, 0x4e, 0x86, 0xb4, 0x24, 0x5d, 0x29, 0x1a, 0x45, 0xe4, 0x0b, 0x67, 0x82, 0xdd, 0x8d, 0xdd, 0x9f, 0xe7, 0x98, 0xcf, 0xba, 0x1c, 0x0e, 0x28, + 0x27, 0x46, 0xb4, 0xab, 0xa6, 0xed, 0x8f, 0x30, 0x75, 0x58, 0x2b, 0xdd, 0x95, 0x14, 0xf3, 0x77, 0x4b, 0x4c, 0x69, 0x1d, 0xd9, 0x1b, 0xdc, 0x16, 0x67, 0xe0, 0x33, 0x16, 0x0f, 0x97, 0x80, 0xa8, + 0x1a, 0xfd, 0xa2, 0xd6, 0x22, 0x06, 0xd4, 0xab, 0x4e, 0xe1, 0x11, 0x67, 0x57, 0xbc, 0x76, 0x98, 0x73, 0xde, 0x0c, 0x47, 0x8d, 0x3a, 0x53, 0x19, 0x28, 0x30, 0xc3, 0xf9, 0x38, 0xfb, 0x43, 0x49, + 0x31, 0x96, 0x76, 0xc1, 0x90, 0xed, 0x43, 0xf5, 0x3c, 0xc7, 0x0c, 0x8b, 0x21, 0x6a, 0xb7, 0xcd, 0xea, 0xf2, 0xcb, 0xc8, 0x13, 0xe6, 0x98, 0x9f, 0x80, 0xff, 0x6e, 0x93, 0x63, 0xfe, 0x38, 0x52, + 0x18, 0xac, 0xeb, 0xcd, 0xc2, 0xf9, 0xf8, 0x0e, 0xdf, 0xb9, 0xc0, 0xa1, 0x73, 0xfe, 0x80, 0x79, 0x8e, 0xf9, 0x30, 0x6c, 0x15, 0xdf, 0x3f, 0xfc, 0x1e, 0x73, 0x8c, 0x7f, 0xc2, 0xe2, 0xd4, 0xf0, + 0x22, 0x4b, 0x4c, 0xc8, 0xf0, 0x09, 0x33, 0xee, 0x3a, 0x39, 0x4e, 0xfe, 0x05, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb4, 0xff, 0x5a, 0x4f, 0x03, 0x02, 0x00, 0x00, 0x0e, 0x05, 0x00, + 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0xa4, 0x55, 0xdb, 0x6e, 0xdb, + 0x46, 0x10, 0x7d, 0xdf, 0xaf, 0x98, 0xa2, 0x01, 0x28, 0x19, 0xbc, 0xbc, 0x4b, 0xb1, 0x5b, 0xc0, 0x31, 0x90, 0x14, 0x68, 0x1c, 0xc4, 0x6e, 0x80, 0xbc, 0x65, 0xb9, 0x3b, 0x12, 0xd7, 0x26, 0x77, + 0x98, 0xdd, 0xa5, 0x64, 0x55, 0xe5, 0xbf, 0x17, 0x7b, 0x11, 0x29, 0xa7, 0x86, 0x51, 0xb4, 0x7e, 0x31, 0x3d, 0x73, 0xe6, 0x76, 0xf6, 0xcc, 0x58, 0x75, 0x3d, 0x19, 0x07, 0x47, 0xb8, 0x6e, 0x69, + 0x90, 0x37, 0x3b, 0xd4, 0x2e, 0x87, 0xf7, 0xf7, 0xf7, 0x9f, 0x72, 0xf8, 0x1d, 0xad, 0xe5, 0x5b, 0x84, 0x11, 0x36, 0x86, 0x3a, 0xc8, 0x84, 0x47, 0xa0, 0x47, 0xd8, 0x6c, 0xcd, 0xe6, 0x40, 0xd2, + 0x0e, 0x9f, 0xdc, 0x04, 0xdb, 0x70, 0x6e, 0x8b, 0x07, 0x5b, 0x98, 0x41, 0x3b, 0xd5, 0x61, 0xb6, 0x66, 0xac, 0xba, 0xb8, 0x60, 0x70, 0x01, 0x5f, 0x69, 0x30, 0x67, 0x75, 0x2c, 0x6c, 0x06, 0x2d, + 0x9c, 0x22, 0x9d, 0x83, 0xd2, 0x3b, 0x7a, 0x44, 0x09, 0x7b, 0xe5, 0x1a, 0x40, 0x2e, 0x1a, 0x30, 0xf8, 0x7d, 0x40, 0xeb, 0x4a, 0xb8, 0x6f, 0x94, 0xf5, 0xd1, 0xca, 0x02, 0xd7, 0x80, 0x4f, 0xbc, + 0xeb, 0x5b, 0x9c, 0x42, 0x61, 0xdf, 0x28, 0xd1, 0x40, 0x4b, 0x5b, 0x0b, 0xae, 0x41, 0x50, 0x5a, 0x50, 0xa7, 0xf4, 0x16, 0x42, 0xa3, 0xc0, 0xb5, 0x04, 0x14, 0x0d, 0x61, 0x48, 0xe1, 0x01, 0x06, + 0x05, 0xaa, 0x1d, 0xca, 0x04, 0x90, 0xdc, 0x71, 0x70, 0x14, 0x5c, 0x82, 0xb7, 0x2d, 0x9a, 0x92, 0x41, 0xe8, 0xf6, 0x83, 0x03, 0xc1, 0x35, 0xd4, 0xf8, 0xbc, 0xb9, 0xcc, 0x57, 0x4e, 0xa6, 0xac, + 0x7c, 0x0e, 0x74, 0x68, 0xdd, 0x84, 0xd3, 0x7d, 0x17, 0x0c, 0xd9, 0x29, 0xe1, 0xaf, 0x3d, 0x37, 0xbc, 0x83, 0x63, 0x22, 0x6c, 0x04, 0x91, 0x98, 0xe3, 0xd3, 0x17, 0xd5, 0x0f, 0x28, 0x5c, 0x79, + 0x8e, 0x8e, 0xa6, 0x09, 0x5c, 0xd6, 0x24, 0x0f, 0x69, 0x90, 0x40, 0x10, 0x04, 0x83, 0xda, 0x00, 0xd7, 0x87, 0xd7, 0xe2, 0xbe, 0x0f, 0x68, 0x62, 0x60, 0xfc, 0xb2, 0xce, 0x78, 0x9a, 0x24, 0x5a, + 0x34, 0x8a, 0xb7, 0x7f, 0xa2, 0x04, 0x1e, 0x18, 0x8e, 0x81, 0xf9, 0xbf, 0x48, 0xd9, 0xd2, 0xd6, 0x13, 0xbf, 0xf5, 0x79, 0xa2, 0x2f, 0x8e, 0xde, 0xa1, 0x6b, 0x48, 0x5a, 0xd8, 0x90, 0x81, 0x4c, + 0xe9, 0x0d, 0x65, 0x39, 0x64, 0x7b, 0x6e, 0xb4, 0xff, 0x8d, 0xc6, 0x90, 0xc9, 0x72, 0x40, 0x27, 0x5e, 0x9d, 0xb3, 0x41, 0x2e, 0xd1, 0xc4, 0x47, 0xf5, 0x7a, 0x9c, 0xe6, 0x4d, 0x8e, 0xf3, 0xd8, + 0x38, 0xcb, 0x1c, 0x1b, 0x1b, 0xf8, 0x67, 0x68, 0xb4, 0xbf, 0x16, 0xd9, 0x38, 0xd7, 0x7f, 0x41, 0x63, 0xbd, 0xb2, 0xa6, 0xf0, 0xde, 0x90, 0x23, 0x41, 0x2d, 0xec, 0xa2, 0xc7, 0x27, 0xb8, 0x43, + 0x5c, 0x81, 0x47, 0xdb, 0x55, 0x55, 0x6d, 0x95, 0x6b, 0x86, 0xba, 0x14, 0xd4, 0x55, 0x8f, 0x9a, 0x3b, 0xb5, 0xc3, 0xc2, 0x72, 0x2d, 0x6b, 0x7a, 0xaa, 0x1e, 0x75, 0xd1, 0xb7, 0xc3, 0x56, 0xe9, + 0xc2, 0xeb, 0xa6, 0xaa, 0x5b, 0xaa, 0xab, 0x8e, 0x2b, 0x5d, 0x49, 0x12, 0xb6, 0xda, 0x0e, 0x4a, 0xa2, 0xad, 0x34, 0x49, 0x7c, 0xb0, 0x65, 0x27, 0x7f, 0x76, 0x0d, 0x16, 0xa9, 0x97, 0x22, 0x32, + 0xf2, 0x4c, 0x39, 0xd3, 0xee, 0x8c, 0x30, 0x6f, 0x63, 0x68, 0x74, 0x76, 0x31, 0xb8, 0xa8, 0x98, 0x20, 0xed, 0xa9, 0xe2, 0x5a, 0xb6, 0x08, 0x97, 0xc0, 0xed, 0x41, 0x0b, 0x58, 0x30, 0x38, 0x0d, + 0xba, 0x3a, 0xad, 0x6d, 0xee, 0x6d, 0x53, 0xaa, 0x5f, 0x56, 0x67, 0x89, 0xde, 0x26, 0x89, 0xfc, 0x05, 0xd7, 0x83, 0x75, 0xd4, 0xa1, 0xb9, 0x62, 0xcb, 0x15, 0x7c, 0x32, 0xd4, 0x29, 0x8b, 0x6f, + 0xd3, 0x79, 0xb8, 0x82, 0xcb, 0x2b, 0x38, 0xc6, 0xcc, 0x91, 0x62, 0x0e, 0x97, 0xc1, 0x00, 0x60, 0x69, 0x30, 0x02, 0x57, 0x71, 0x67, 0xfc, 0xb6, 0x96, 0xa1, 0xca, 0x17, 0x85, 0x7b, 0x34, 0x59, + 0x1e, 0x30, 0xee, 0xd0, 0x7b, 0x84, 0x5f, 0xd2, 0x8c, 0x01, 0x8c, 0x6b, 0x06, 0x50, 0x55, 0xf0, 0xf5, 0xf6, 0x8f, 0xcf, 0x70, 0x7d, 0xfb, 0xee, 0x06, 0xde, 0xdf, 0x7c, 0xbe, 0x89, 0xb6, 0xfb, + 0xf3, 0xfd, 0x3e, 0x1f, 0xd8, 0x6b, 0x75, 0xf1, 0xd3, 0x3c, 0xc6, 0x32, 0xd5, 0x8f, 0x2d, 0x19, 0xb4, 0x3d, 0x69, 0x8b, 0x2f, 0xcc, 0x76, 0x05, 0x97, 0xa0, 0x71, 0xff, 0x82, 0x63, 0x11, 0x33, + 0x00, 0x94, 0xa5, 0x97, 0x13, 0xcf, 0xe7, 0x3f, 0x8f, 0x53, 0xcf, 0x49, 0xca, 0xfe, 0x86, 0xac, 0x20, 0xfb, 0x48, 0xe9, 0xa6, 0x9c, 0x4e, 0x4c, 0x06, 0x63, 0x88, 0x1a, 0x97, 0xeb, 0x53, 0x3b, + 0xa7, 0xbd, 0x29, 0xfd, 0x3a, 0x2c, 0x4e, 0x9d, 0x95, 0x8e, 0xee, 0x42, 0xd9, 0xc5, 0x32, 0x41, 0x0d, 0xba, 0xc1, 0xe8, 0x20, 0xbf, 0xb2, 0x56, 0x9a, 0x9b, 0xc3, 0x04, 0x0e, 0x88, 0x31, 0x32, + 0x82, 0xb6, 0x55, 0xda, 0x15, 0x52, 0x59, 0x5e, 0xb7, 0x58, 0x68, 0x2f, 0x9b, 0x56, 0x69, 0x04, 0x4d, 0x5e, 0x46, 0x96, 0x5a, 0x4c, 0x2f, 0x43, 0x2d, 0xfa, 0xba, 0x8b, 0x6f, 0xac, 0xf8, 0xef, + 0x3f, 0x6c, 0xe6, 0x69, 0xc5, 0xde, 0x1c, 0x67, 0xc2, 0x47, 0xc6, 0xde, 0x79, 0x12, 0xd8, 0x9b, 0xe3, 0x6f, 0x77, 0xb7, 0x1f, 0xcb, 0x48, 0xa2, 0xda, 0x1c, 0x16, 0x33, 0xa6, 0xf4, 0x34, 0x2d, + 0xc7, 0xff, 0x55, 0xff, 0xdb, 0x32, 0xc9, 0x23, 0x92, 0x91, 0x4e, 0x2d, 0xff, 0xe1, 0x0d, 0xd9, 0x8b, 0xfc, 0x3d, 0xc7, 0x2c, 0x8e, 0xd3, 0xcb, 0xa6, 0xf7, 0xfb, 0xa1, 0x53, 0x18, 0xfd, 0x5b, + 0x8c, 0x6b, 0xc6, 0x94, 0x76, 0x68, 0x36, 0x5c, 0xe0, 0xb4, 0x07, 0x41, 0x5e, 0x9a, 0x77, 0xb8, 0x4a, 0x67, 0xd4, 0x77, 0x25, 0x92, 0xf3, 0x83, 0x9c, 0xad, 0x23, 0x63, 0xf8, 0x94, 0xfe, 0x4f, + 0xc6, 0x65, 0xcc, 0xe7, 0x24, 0xe3, 0x9a, 0xfd, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xd5, 0x40, 0xbe, 0x47, 0x32, 0x03, 0x00, 0x00, 0x7e, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x8c, + 0x53, 0x3f, 0x6f, 0xdb, 0x4e, 0x0c, 0xdd, 0xf5, 0x29, 0xb8, 0xdd, 0xe9, 0x87, 0xb3, 0x9c, 0x5f, 0xda, 0x2e, 0x0e, 0xdc, 0x25, 0x08, 0x90, 0x74, 0x48, 0x0a, 0xd4, 0xe8, 0x52, 0x74, 0xb8, 0x48, + 0x8c, 0xad, 0x44, 0xbe, 0x53, 0x48, 0xca, 0xa9, 0x61, 0xf8, 0xbb, 0x17, 0x3c, 0xc9, 0xb2, 0x92, 0xa9, 0x9b, 0x8e, 0x7f, 0x1e, 0xdf, 0xe3, 0xa3, 0x4c, 0xc7, 0x08, 0x2c, 0x54, 0x97, 0x62, 0xae, + 0xb2, 0x7a, 0xdb, 0x46, 0x12, 0x38, 0xc0, 0x75, 0x13, 0xbb, 0xea, 0x66, 0x87, 0x41, 0x1c, 0xdc, 0xae, 0x56, 0xdf, 0xe1, 0x08, 0x4f, 0x14, 0xb7, 0x60, 0x4a, 0x4d, 0xa0, 0x26, 0x78, 0x5a, 0xcf, + 0xe2, 0x49, 0x1c, 0xdc, 0x85, 0x5d, 0x7c, 0x41, 0x7a, 0x68, 0xa5, 0x8e, 0x81, 0xc7, 0xa6, 0x27, 0xef, 0x79, 0xf6, 0xcc, 0x33, 0xea, 0x82, 0xd4, 0x5b, 0x3c, 0x37, 0x12, 0xbe, 0x76, 0xc8, 0x32, + 0x94, 0x71, 0xd7, 0x22, 0x09, 0xb2, 0x32, 0x39, 0x55, 0xfc, 0x07, 0x9e, 0xe1, 0xa9, 0x0b, 0xe5, 0x50, 0x53, 0x14, 0xf3, 0xc7, 0xae, 0x6e, 0xaa, 0x33, 0x86, 0x36, 0x38, 0x38, 0xc0, 0x4a, 0x81, + 0x4e, 0x13, 0xc5, 0xb7, 0x3a, 0x26, 0x2b, 0x63, 0x60, 0x81, 0xca, 0x8b, 0x87, 0x25, 0x1c, 0x32, 0x80, 0xe0, 0xb7, 0xb8, 0x00, 0x23, 0xf5, 0x1a, 0xc9, 0xb8, 0x0c, 0xa0, 0xec, 0x58, 0xe2, 0x16, + 0xe9, 0xae, 0x5a, 0x80, 0xb9, 0xf8, 0xff, 0xf2, 0xd3, 0x67, 0x93, 0x1d, 0xc7, 0xce, 0x2d, 0x32, 0xfb, 0x35, 0xc2, 0x32, 0x6d, 0xa1, 0x78, 0xac, 0x83, 0xa7, 0xbd, 0x55, 0x1c, 0x7c, 0x9b, 0x2c, + 0xc9, 0x2a, 0x34, 0x00, 0xc7, 0x8e, 0x4a, 0x85, 0x9f, 0x2b, 0xa9, 0x79, 0x1d, 0x04, 0xd7, 0xe4, 0x75, 0x17, 0x69, 0x14, 0x80, 0xec, 0xdb, 0x34, 0x5d, 0x35, 0xf6, 0x11, 0xa5, 0x96, 0x01, 0x1c, + 0xf3, 0x2c, 0x1f, 0x87, 0x22, 0xd1, 0xad, 0x0f, 0x55, 0x83, 0x04, 0x4b, 0xb0, 0xb2, 0x48, 0xd2, 0x72, 0x58, 0x7e, 0x05, 0x8b, 0x44, 0x0b, 0xb8, 0x21, 0x8a, 0x94, 0xde, 0x3a, 0x56, 0x0a, 0xd4, + 0xb7, 0xa6, 0xf2, 0xab, 0xfe, 0x1d, 0x2a, 0x9b, 0x5f, 0x25, 0x15, 0x3a, 0xc9, 0x9a, 0xbb, 0x33, 0x91, 0x05, 0x6c, 0x12, 0x34, 0x83, 0x87, 0x9d, 0x6f, 0xea, 0x0a, 0x92, 0x99, 0xc6, 0x81, 0x95, + 0x11, 0x32, 0xb9, 0x69, 0x75, 0xeb, 0x45, 0x5f, 0xed, 0xe0, 0x70, 0x54, 0x23, 0xde, 0xfb, 0x9b, 0x17, 0xb2, 0xc1, 0x60, 0x2d, 0x23, 0xed, 0xf0, 0x4c, 0x48, 0x29, 0xb4, 0x8d, 0x0f, 0xf6, 0x4b, + 0xe2, 0x03, 0x27, 0x97, 0x4f, 0x75, 0x29, 0x06, 0x50, 0xb4, 0x51, 0xb9, 0xcd, 0xcd, 0x18, 0x60, 0x25, 0x3e, 0x6c, 0xbc, 0x78, 0x8c, 0xd5, 0x7e, 0x92, 0x91, 0x31, 0xb1, 0x41, 0x5f, 0x21, 0xf1, + 0x98, 0xc3, 0x3f, 0x2d, 0x96, 0x62, 0x2f, 0x2f, 0x2e, 0x3e, 0x86, 0xcc, 0x75, 0x0c, 0x82, 0x41, 0x66, 0xab, 0x7d, 0x8b, 0xc6, 0xc1, 0xfc, 0x99, 0x63, 0x98, 0x9f, 0xab, 0x42, 0x65, 0x75, 0x6b, + 0x0e, 0x08, 0xb9, 0x6b, 0x64, 0x22, 0xa0, 0x17, 0x31, 0xee, 0xd5, 0x81, 0xb9, 0x8f, 0x90, 0x9e, 0x66, 0xd0, 0xd4, 0x57, 0xc4, 0x17, 0x3b, 0xf4, 0x4e, 0xa3, 0x15, 0x62, 0x7b, 0xf3, 0xda, 0xf9, + 0x66, 0x48, 0x26, 0x2d, 0x0e, 0xbe, 0xfd, 0x78, 0xb8, 0x2f, 0x5a, 0x4f, 0x8c, 0xef, 0x44, 0xea, 0x5e, 0xf5, 0x07, 0x0c, 0xeb, 0xfc, 0x1d, 0x0a, 0x4e, 0x11, 0x06, 0xd1, 0xbf, 0x4c, 0x89, 0x33, + 0x3d, 0x22, 0xf3, 0xdb, 0x81, 0xc1, 0x72, 0x13, 0xcd, 0xbf, 0xf5, 0xf4, 0x97, 0x99, 0xba, 0xd4, 0x56, 0xb5, 0xaf, 0x48, 0xc6, 0xff, 0xac, 0xf1, 0x0d, 0x3f, 0xa8, 0x1a, 0xee, 0xe7, 0x14, 0xe8, + 0x6d, 0x2b, 0xca, 0x26, 0x32, 0x9e, 0xe3, 0xc7, 0xf4, 0x75, 0x74, 0x93, 0x6b, 0xb5, 0xa2, 0x0a, 0x34, 0xf1, 0x37, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xb5, 0xfa, 0xb1, 0x83, 0x18, + 0x02, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, + 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, 0x73, 0x84, 0x53, 0x3d, 0x6f, 0xdb, 0x30, 0x10, 0xdd, 0xf5, 0x2b, 0xde, 0x46, 0x19, 0x50, 0xe8, 0x7e, 0x64, 0xb2, 0xeb, 0x00, 0x45, 0x90, 0x21, 0x1d, + 0xda, 0xa1, 0x68, 0x97, 0xa2, 0xc3, 0x95, 0xbc, 0x44, 0x6c, 0x24, 0x52, 0x25, 0x8f, 0x71, 0x8c, 0xc0, 0xff, 0xbd, 0xa0, 0x2c, 0xdb, 0x32, 0x50, 0xa0, 0xa3, 0xee, 0xde, 0xdd, 0xbd, 0x0f, 0x51, + 0xe5, 0xc4, 0x48, 0x12, 0x9d, 0x11, 0xb5, 0xae, 0x2a, 0xd7, 0x0f, 0x21, 0x0a, 0x84, 0x93, 0xe0, 0x21, 0x86, 0x1e, 0x4a, 0x68, 0x60, 0xb5, 0x3e, 0x36, 0x5e, 0x71, 0xdb, 0x85, 0x6c, 0xef, 0x9e, + 0xd9, 0x0b, 0xf6, 0x13, 0xc4, 0x94, 0x12, 0x97, 0x52, 0xba, 0x40, 0x06, 0x2f, 0xfc, 0x72, 0x86, 0x3d, 0x10, 0xa5, 0xab, 0xdf, 0xe9, 0x2a, 0x66, 0x2f, 0xae, 0xbf, 0x58, 0xda, 0x92, 0xb7, 0x1d, + 0x37, 0xb8, 0xcd, 0x49, 0x42, 0xcf, 0xf1, 0x34, 0xa3, 0xf5, 0x32, 0x45, 0x53, 0x98, 0x2d, 0x97, 0xb8, 0xf3, 0x29, 0x47, 0x86, 0xb4, 0x24, 0x90, 0x96, 0xf1, 0x90, 0xbd, 0x11, 0x17, 0x3c, 0x4c, + 0xe8, 0x87, 0x8e, 0x85, 0x13, 0x4c, 0xc7, 0xe4, 0xbb, 0x1d, 0xb6, 0x2d, 0x7b, 0x0c, 0x94, 0x12, 0x5b, 0x10, 0x9e, 0xa9, 0x73, 0x16, 0x23, 0x43, 0x5d, 0x15, 0x6d, 0xb5, 0xfa, 0xe6, 0x9d, 0xac, + 0xa6, 0xbb, 0xe9, 0x12, 0xa2, 0x1a, 0x50, 0xda, 0x79, 0x83, 0x5a, 0x16, 0xd8, 0xdc, 0xe0, 0xb5, 0x02, 0x44, 0x0f, 0x1d, 0xf9, 0xfa, 0x7a, 0xb1, 0xae, 0x00, 0x13, 0x7c, 0x12, 0x58, 0x12, 0xc2, + 0x66, 0xec, 0x02, 0x9e, 0x7a, 0x5e, 0x41, 0x89, 0x7b, 0xe4, 0xa8, 0x9a, 0xb1, 0x64, 0x26, 0x2d, 0xf7, 0x76, 0x05, 0xf5, 0xe6, 0xed, 0xbb, 0xf7, 0xd7, 0xaa, 0x02, 0xf6, 0x65, 0xc1, 0x72, 0x89, + 0x8f, 0xf3, 0x8b, 0x70, 0xde, 0x74, 0xd9, 0x72, 0x82, 0xb3, 0x0d, 0x64, 0x37, 0x30, 0xc8, 0x5b, 0xa4, 0x90, 0xa3, 0x61, 0x90, 0x80, 0xd0, 0x3b, 0xef, 0xfa, 0xdc, 0xeb, 0xd3, 0xf9, 0xb3, 0xe9, + 0xab, 0x59, 0x26, 0x1f, 0x8e, 0x0e, 0xde, 0x60, 0x03, 0xcf, 0xdb, 0x7f, 0xb6, 0xea, 0x03, 0x67, 0x77, 0x26, 0x76, 0x60, 0x5c, 0x0e, 0xaf, 0xa0, 0x4c, 0xe8, 0x35, 0xbf, 0x50, 0xb1, 0x54, 0xcf, + 0xa2, 0xd5, 0xc5, 0xb8, 0x09, 0x79, 0x60, 0xb6, 0x82, 0x5a, 0xce, 0x8a, 0xc5, 0x90, 0xa2, 0x70, 0xb1, 0xae, 0x0e, 0x1a, 0xef, 0xfd, 0x73, 0x78, 0xe2, 0xcb, 0xa8, 0xb6, 0x4e, 0xda, 0xb1, 0x32, + 0x93, 0xdf, 0x60, 0xdb, 0x3a, 0xd3, 0x22, 0xb5, 0x21, 0x77, 0xf6, 0x94, 0xe6, 0x88, 0x0d, 0x59, 0xc0, 0x31, 0x86, 0x78, 0x56, 0x1e, 0x39, 0xe5, 0x4e, 0xb0, 0x01, 0x6d, 0xc9, 0xc9, 0x94, 0x61, + 0xfd, 0xba, 0x07, 0xa5, 0xe3, 0x3f, 0xd7, 0xcc, 0xec, 0x19, 0x23, 0x13, 0x1d, 0x9e, 0xea, 0xc3, 0xe0, 0xf4, 0x6d, 0x99, 0x87, 0xbb, 0x3f, 0x99, 0xba, 0xfa, 0xd3, 0xd7, 0x2f, 0x9f, 0xf5, 0x40, + 0x31, 0xf1, 0x84, 0xd0, 0xbf, 0x82, 0xdd, 0x95, 0x6d, 0xe5, 0x5d, 0xf8, 0xc7, 0x45, 0x33, 0x4a, 0x9b, 0xe6, 0x78, 0x9c, 0x99, 0x80, 0x2d, 0x93, 0xe5, 0x98, 0x7e, 0x28, 0xc3, 0x57, 0xc5, 0x3d, + 0xf5, 0xb3, 0x81, 0x62, 0xd3, 0x06, 0xf5, 0x3f, 0xf4, 0xc1, 0xc1, 0x11, 0x7f, 0xf4, 0x46, 0x8f, 0x74, 0xbf, 0x3b, 0xde, 0x72, 0x3c, 0xcd, 0x7b, 0x5b, 0x2f, 0xd6, 0x55, 0xf1, 0xf4, 0x6f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x8c, 0x99, 0x86, 0x22, 0xdc, 0x01, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xdd, 0x6e, 0x23, 0x37, 0x0f, 0xbd, 0xf7, 0x53, + 0x10, 0x73, 0x33, 0x89, 0x91, 0xd8, 0xd9, 0x7c, 0xf8, 0xb6, 0xad, 0xef, 0x16, 0x8e, 0x17, 0x48, 0xd1, 0x4d, 0x8b, 0x38, 0x05, 0x0a, 0x14, 0x45, 0x21, 0x6b, 0x38, 0x36, 0x53, 0x0d, 0x35, 0x10, + 0xa9, 0x24, 0x83, 0xc5, 0xbe, 0x7b, 0x21, 0xc9, 0x3f, 0x69, 0x7e, 0x8c, 0xf5, 0xcd, 0xd0, 0x33, 0xe2, 0xe1, 0xe1, 0x21, 0x75, 0xbe, 0x8e, 0x00, 0x2a, 0x62, 0xeb, 0x62, 0x83, 0xd5, 0x0c, 0xfe, + 0x1c, 0x01, 0x00, 0x54, 0x12, 0xec, 0x74, 0x3c, 0x9e, 0x8e, 0xab, 0x11, 0xc0, 0x5f, 0x67, 0xe9, 0x08, 0x3e, 0xed, 0x8f, 0x54, 0xec, 0x1b, 0xfc, 0xbb, 0xf3, 0x4d, 0x74, 0x28, 0x55, 0xf9, 0x6c, + 0x7d, 0xd7, 0x93, 0xc3, 0xf0, 0x6b, 0xaf, 0xe4, 0x59, 0xaa, 0x19, 0x7c, 0x2d, 0x48, 0x6a, 0xc2, 0x1a, 0xb5, 0x9a, 0x41, 0xb5, 0x58, 0x5e, 0x5e, 0x5c, 0x5e, 0x54, 0x67, 0xf0, 0xee, 0x6f, 0x3a, + 0x86, 0x65, 0x8f, 0x96, 0xda, 0x01, 0x16, 0xf3, 0x2f, 0x9f, 0x96, 0x36, 0x50, 0xaf, 0x50, 0x10, 0xe0, 0x01, 0x83, 0x90, 0xe7, 0x19, 0xd4, 0x8b, 0xe5, 0xff, 0x6a, 0x38, 0x69, 0xb0, 0x35, 0xd1, + 0xe9, 0xe9, 0x59, 0x7a, 0xf1, 0xff, 0x3a, 0x3f, 0x2e, 0x2f, 0x3e, 0x1c, 0xa2, 0x8f, 0xfb, 0xe8, 0x87, 0x7d, 0xf4, 0xe3, 0x3e, 0xfa, 0x69, 0x17, 0x5d, 0x5e, 0xd4, 0x67, 0xe0, 0x43, 0xfa, 0x73, + 0xb3, 0xf8, 0xe3, 0xae, 0x9e, 0xc0, 0x78, 0x5a, 0xa8, 0x97, 0x0e, 0x13, 0x75, 0xeb, 0xbb, 0xce, 0xf3, 0xbd, 0xbc, 0x4f, 0xfe, 0x19, 0xf5, 0x92, 0x06, 0xd6, 0x37, 0x08, 0x6b, 0x64, 0x0c, 0x46, + 0x0b, 0x6f, 0xf6, 0x8c, 0xa9, 0xea, 0x0e, 0x2d, 0xc5, 0xa6, 0x6b, 0xd2, 0x43, 0x06, 0x51, 0xec, 0x52, 0x14, 0xcb, 0x0b, 0x94, 0x5d, 0x2f, 0x29, 0x7a, 0xce, 0x11, 0x9f, 0xf4, 0x19, 0x47, 0x1f, + 0xf5, 0x8a, 0x42, 0xe2, 0x38, 0x99, 0xae, 0x22, 0xb9, 0xe6, 0x88, 0xbe, 0xd3, 0x31, 0xdc, 0x62, 0x43, 0x01, 0xad, 0x82, 0x8f, 0xda, 0x47, 0x05, 0xd1, 0x10, 0xad, 0xc6, 0x80, 0xa0, 0x1e, 0x74, + 0x83, 0x50, 0x3e, 0xfb, 0x30, 0x1c, 0x4a, 0x88, 0x06, 0xb2, 0x69, 0x82, 0x1a, 0x22, 0x1e, 0x99, 0xde, 0xb6, 0xc4, 0x82, 0xcd, 0xca, 0x21, 0x18, 0xe7, 0xa0, 0x64, 0x82, 0x0e, 0x3d, 0x9e, 0xdb, + 0x0d, 0xda, 0x7f, 0x88, 0xd7, 0xe0, 0xcb, 0x86, 0x1c, 0xf0, 0xd9, 0x5f, 0x77, 0xbd, 0x23, 0x4b, 0xfa, 0x89, 0x87, 0x6a, 0x06, 0xad, 0x71, 0xf2, 0x6e, 0x9d, 0xd4, 0x83, 0x21, 0x41, 0xc0, 0x10, + 0x7c, 0x00, 0xcf, 0x80, 0x4f, 0x7d, 0x40, 0x49, 0xab, 0x21, 0x60, 0xb8, 0x81, 0x06, 0xad, 0x33, 0x45, 0x73, 0x81, 0x47, 0xd2, 0x0d, 0x18, 0x06, 0x4a, 0x15, 0xb0, 0x81, 0xda, 0xf0, 0x50, 0x67, + 0x42, 0x2f, 0xfb, 0xbb, 0x89, 0xce, 0xcd, 0x13, 0x47, 0x39, 0xd6, 0xe9, 0xa1, 0xbf, 0x6d, 0x6f, 0x1c, 0x9d, 0x83, 0xdc, 0x9b, 0xbc, 0x44, 0xfc, 0x1c, 0xd9, 0x26, 0x16, 0x77, 0x43, 0x8f, 0xef, + 0x83, 0xbe, 0x42, 0x3c, 0x08, 0xd5, 0x42, 0xbb, 0x85, 0xc8, 0x8c, 0xdf, 0x94, 0xec, 0x6e, 0x43, 0x47, 0x09, 0xbf, 0xa5, 0x58, 0xad, 0x1b, 0x92, 0xfa, 0x3f, 0xc2, 0x7d, 0x8f, 0x4e, 0xec, 0x7f, + 0xe7, 0x28, 0xd8, 0xfc, 0xe2, 0xad, 0x71, 0xdf, 0x51, 0x14, 0x7b, 0x1f, 0xb4, 0x54, 0x95, 0x54, 0x36, 0xe6, 0x6c, 0x70, 0x39, 0xfd, 0x35, 0xec, 0x6f, 0x26, 0x98, 0x0e, 0x15, 0xc3, 0x11, 0xe8, + 0x23, 0xb0, 0xfd, 0x3e, 0xfd, 0x2d, 0x99, 0x6e, 0x51, 0x63, 0xe0, 0x63, 0xa4, 0x5f, 0x40, 0xc3, 0xe3, 0x06, 0x19, 0xd8, 0x6b, 0x5e, 0xe4, 0x7c, 0x97, 0x7b, 0xa3, 0x1b, 0x01, 0xe2, 0xc3, 0x54, + 0x42, 0x46, 0x05, 0x03, 0x0f, 0xc6, 0x45, 0x7c, 0x69, 0x1c, 0xb7, 0x28, 0xde, 0xc5, 0x74, 0x30, 0x5d, 0xcf, 0xe4, 0x99, 0x6f, 0xdd, 0xcd, 0xd7, 0xc6, 0x11, 0xf6, 0x79, 0x69, 0x25, 0x8c, 0xe2, + 0x7a, 0xc8, 0xe6, 0xd1, 0x60, 0x0d, 0x27, 0x37, 0xbe, 0xc1, 0xc9, 0xbd, 0x9c, 0x66, 0x37, 0xb0, 0xce, 0x88, 0x90, 0xad, 0xe1, 0x24, 0xed, 0xd8, 0xd6, 0x2e, 0xfb, 0x80, 0xe7, 0x1f, 0x26, 0x1f, + 0x4f, 0x0f, 0x74, 0x50, 0xbe, 0x64, 0xe4, 0x6b, 0x56, 0x0c, 0xbe, 0x3f, 0x3a, 0xb9, 0xfd, 0x3a, 0x0a, 0x60, 0x47, 0x0a, 0x54, 0x72, 0x30, 0x98, 0x15, 0x39, 0xd2, 0x01, 0x56, 0xa8, 0x8f, 0x88, + 0x0c, 0xf3, 0x6c, 0x62, 0x3f, 0x2f, 0xf3, 0x9d, 0x5b, 0x2c, 0xa1, 0x94, 0x10, 0x78, 0x20, 0x03, 0x36, 0x60, 0xbe, 0x7f, 0x69, 0x85, 0xd9, 0x74, 0x28, 0xbd, 0xb1, 0x08, 0x7e, 0x75, 0x8f, 0x56, + 0x05, 0x5a, 0x1f, 0xb2, 0xa8, 0xd4, 0x25, 0xb9, 0x65, 0x02, 0x79, 0x48, 0x28, 0x50, 0x1b, 0xe7, 0xfc, 0xe3, 0x72, 0x60, 0xdd, 0xa0, 0x92, 0xbd, 0x2a, 0x06, 0x7f, 0x5d, 0x8e, 0x3d, 0xf3, 0xbc, + 0xd6, 0x07, 0x8b, 0x73, 0xcf, 0x42, 0xa2, 0xc8, 0x3a, 0x37, 0x42, 0xbc, 0xbe, 0xe6, 0xcf, 0xe4, 0xf0, 0x26, 0x55, 0xdb, 0x36, 0xb8, 0xeb, 0xe7, 0x8a, 0x24, 0x03, 0x03, 0xb1, 0xdd, 0x27, 0xb9, + 0xe1, 0xdc, 0x9a, 0xb4, 0x37, 0x01, 0x5b, 0x0c, 0xc8, 0x16, 0x65, 0x67, 0x81, 0x62, 0x3a, 0x84, 0x96, 0xdc, 0x6e, 0xa0, 0xdf, 0x46, 0xdf, 0x46, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, + 0x07, 0x08, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x94, 0x91, 0xb1, 0x6a, 0xc4, 0x30, 0x0c, 0x86, 0x77, 0x3f, 0x85, 0xd0, 0x7c, + 0xe1, 0xe8, 0xea, 0xa9, 0x0f, 0x70, 0xd0, 0xa5, 0xdb, 0x91, 0xc1, 0x24, 0xea, 0x61, 0x70, 0xac, 0x54, 0x96, 0x69, 0x4b, 0xc8, 0xbb, 0x17, 0xdb, 0x69, 0x28, 0x21, 0xcb, 0x4d, 0xc6, 0xe8, 0xfb, + 0xa4, 0x5f, 0x68, 0x31, 0x00, 0x28, 0xcc, 0x8a, 0x16, 0x54, 0x32, 0x5d, 0xca, 0x7f, 0x76, 0x92, 0x48, 0xd0, 0x02, 0xbe, 0xea, 0xcf, 0x4c, 0x69, 0x10, 0x3f, 0x6b, 0x47, 0x29, 0xf8, 0xa8, 0xd7, + 0xad, 0xd8, 0xc0, 0x90, 0x1f, 0x3e, 0x26, 0xb4, 0x70, 0x37, 0x00, 0x70, 0xc6, 0x57, 0xb0, 0xa0, 0x42, 0xaa, 0x9e, 0x04, 0x01, 0xfa, 0xea, 0xd2, 0xb7, 0x52, 0x1c, 0xff, 0xb9, 0x8d, 0xb7, 0x42, + 0x03, 0x4f, 0x13, 0xc5, 0x91, 0xc6, 0xdd, 0xad, 0x63, 0xec, 0x49, 0x98, 0xf6, 0x74, 0x4f, 0x39, 0x67, 0xf0, 0x31, 0x9c, 0xe4, 0x40, 0x25, 0xda, 0xd2, 0xea, 0x91, 0xbb, 0x81, 0x63, 0xe2, 0x40, + 0x68, 0xe1, 0xe5, 0x20, 0x5d, 0x77, 0xfb, 0x6f, 0x95, 0xb2, 0x8c, 0x08, 0x0b, 0x5e, 0x60, 0x01, 0xa4, 0x38, 0xbe, 0x7d, 0xdc, 0x7c, 0x2c, 0x2e, 0xba, 0xac, 0x8c, 0xb0, 0x56, 0xac, 0xdf, 0x1a, + 0x7d, 0x66, 0xd6, 0x3a, 0xed, 0xbe, 0x6b, 0x98, 0x7c, 0x7c, 0x04, 0x6a, 0x0d, 0x5c, 0x08, 0xfc, 0xf5, 0x4e, 0xd3, 0x1c, 0x9c, 0xd2, 0xcd, 0x2b, 0x89, 0x0b, 0x69, 0xbb, 0x17, 0xac, 0xbd, 0x01, + 0x58, 0xcd, 0x6a, 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0x84, 0x7e, 0x8c, 0x5d, 0xd6, 0x00, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0xaa, 0xe6, 0x52, 0x50, 0x50, 0x2a, 0x4e, 0xcd, 0xcd, 0x54, 0xb2, 0x52, 0x28, 0x29, + 0x2a, 0x4d, 0xd5, 0x01, 0xf1, 0x4b, 0x8a, 0x12, 0x33, 0x73, 0x32, 0xf3, 0xd2, 0x9d, 0xf3, 0x73, 0x73, 0x13, 0x95, 0xac, 0x14, 0x94, 0xf2, 0xf2, 0xf3, 0x52, 0x95, 0xc0, 0x52, 0xc5, 0x99, 0x79, + 0xe9, 0x39, 0xa9, 0x81, 0xa5, 0xf9, 0x25, 0xa9, 0xc8, 0x3a, 0x0a, 0x8a, 0x32, 0xf3, 0x4a, 0xc2, 0x33, 0x53, 0x4a, 0x32, 0x94, 0xac, 0x14, 0x2c, 0x0c, 0xb8, 0x6a, 0xb9, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xbe, 0x97, 0xda, 0x64, 0x50, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x7c, 0x55, 0x4b, 0x6f, 0x1b, 0x37, 0x10, 0xbe, 0xef, 0xaf, 0x98, 0xda, 0x07, 0x4b, 0x45, 0xbc, 0x6b, 0xa0, 0x28, 0x10, 0x28, 0xe8, 0xa9, + 0x68, 0x9b, 0x43, 0x8b, 0x06, 0xb1, 0xfa, 0x82, 0x6a, 0x60, 0x29, 0x72, 0xa4, 0xa5, 0xc3, 0x9d, 0x61, 0x48, 0xae, 0xe4, 0x45, 0x90, 0xff, 0x5e, 0x0c, 0xb9, 0x7a, 0x21, 0x4a, 0x0f, 0x86, 0x45, + 0xf2, 0x9b, 0x6f, 0xe7, 0xf1, 0xcd, 0xcc, 0x2d, 0x2c, 0x47, 0x8f, 0x8f, 0x3a, 0x58, 0x9f, 0xe0, 0xed, 0x72, 0xf9, 0x0e, 0x7e, 0x1e, 0x48, 0x27, 0xcb, 0x54, 0x55, 0x7f, 0xa1, 0xd3, 0xdc, 0x23, + 0x24, 0x86, 0x91, 0x87, 0x00, 0x84, 0xfb, 0x73, 0xf4, 0x66, 0x02, 0x82, 0x0f, 0xfc, 0x8c, 0x3a, 0x7d, 0x03, 0xcb, 0x0e, 0x61, 0xcd, 0xd6, 0x61, 0xf0, 0x4e, 0x25, 0x3c, 0x21, 0x34, 0x1b, 0x04, + 0xad, 0x08, 0xd6, 0x08, 0x1b, 0x1e, 0xc8, 0x80, 0x25, 0x58, 0xb5, 0x96, 0x0c, 0xbe, 0xd4, 0x29, 0xb6, 0x4f, 0xb3, 0xba, 0x39, 0x1c, 0xe6, 0x35, 0x2c, 0x3b, 0x1b, 0x4f, 0xc6, 0x7b, 0xeb, 0x1c, + 0x04, 0x8c, 0x9e, 0xc9, 0x88, 0x2f, 0x96, 0x34, 0xf7, 0x96, 0xb6, 0xc5, 0xdd, 0x5f, 0x7e, 0x5a, 0x82, 0x22, 0x03, 0xef, 0x7e, 0x7f, 0x5c, 0x42, 0xc0, 0x8f, 0x03, 0xc6, 0x14, 0xeb, 0xaa, 0xba, + 0xbd, 0x85, 0x5f, 0x59, 0x2b, 0x07, 0xf8, 0x82, 0x7a, 0x28, 0x01, 0x2d, 0x19, 0xc2, 0x40, 0xe0, 0xe4, 0xde, 0x8d, 0x55, 0xd5, 0xb6, 0xad, 0x66, 0x8a, 0xec, 0xb0, 0x22, 0xdf, 0x83, 0xa5, 0x98, + 0x94, 0x73, 0xf9, 0xb7, 0xe0, 0xd6, 0x83, 0x75, 0xe6, 0x78, 0xca, 0x56, 0x62, 0x52, 0x55, 0x12, 0x67, 0x18, 0x28, 0xd9, 0x1e, 0x8b, 0x77, 0xf8, 0xe2, 0x39, 0x22, 0xa4, 0x2e, 0x20, 0x02, 0x92, + 0xf1, 0x6c, 0x29, 0x7b, 0x01, 0xf0, 0x2d, 0xb4, 0x4d, 0x9b, 0x33, 0x73, 0xb8, 0x87, 0x0d, 0x87, 0x92, 0xd0, 0x43, 0x88, 0xf5, 0x84, 0xeb, 0x50, 0xb9, 0xd4, 0x35, 0x01, 0x95, 0xb1, 0x84, 0x31, + 0x5e, 0xb1, 0x53, 0x70, 0x7c, 0x85, 0x02, 0x07, 0xdd, 0xa1, 0xfe, 0x70, 0xc9, 0xe0, 0xec, 0x0e, 0xbf, 0x4a, 0x70, 0x78, 0xbc, 0xb4, 0xcf, 0x41, 0x79, 0x15, 0x54, 0x8f, 0x09, 0x83, 0xd4, 0x74, + 0x67, 0x0d, 0xe6, 0x84, 0xa7, 0xee, 0xac, 0x94, 0x47, 0x32, 0x95, 0xc0, 0xd2, 0x8e, 0xb5, 0xca, 0xd7, 0x36, 0x82, 0x82, 0xf6, 0x47, 0xa6, 0x84, 0x2f, 0xa9, 0x05, 0x5e, 0x8b, 0x22, 0x40, 0x33, + 0x25, 0x65, 0xe9, 0x58, 0xac, 0xa9, 0x3e, 0x60, 0x69, 0xc3, 0xa1, 0x57, 0x25, 0x76, 0xc9, 0xe9, 0x73, 0xac, 0x8e, 0x5f, 0xe8, 0x14, 0x19, 0x87, 0xef, 0x0b, 0x74, 0xa6, 0x0b, 0xe5, 0x1c, 0x3e, + 0x55, 0x20, 0x7c, 0x31, 0x81, 0xe3, 0x2d, 0xfc, 0x00, 0xd3, 0x43, 0xed, 0x78, 0xfb, 0xa6, 0x02, 0xb9, 0xac, 0x85, 0xf6, 0x60, 0x50, 0x77, 0x29, 0xf9, 0x3f, 0x31, 0x44, 0xcb, 0x34, 0xbf, 0x0a, + 0xe8, 0x31, 0x75, 0x6c, 0xe6, 0x6f, 0xa0, 0x69, 0x72, 0x88, 0x17, 0x1e, 0x96, 0x47, 0x98, 0x31, 0xb9, 0x31, 0x6b, 0x8c, 0x43, 0x91, 0x58, 0x1c, 0xbc, 0xe7, 0x90, 0xd0, 0xcc, 0xaf, 0x71, 0x7e, + 0x1c, 0x30, 0x8c, 0x85, 0xd2, 0x6e, 0x20, 0x9f, 0x4e, 0x49, 0x8d, 0xa0, 0x02, 0x9e, 0x32, 0x6b, 0x09, 0x54, 0xa6, 0x9e, 0xbe, 0x79, 0x8d, 0x6f, 0xcd, 0x66, 0xa2, 0x9b, 0x52, 0x19, 0xb3, 0xab, + 0x07, 0x2f, 0xe5, 0x79, 0xaa, 0xea, 0xb9, 0xfe, 0xaf, 0xa6, 0x03, 0x95, 0xc1, 0x10, 0x0b, 0x99, 0x72, 0xae, 0x84, 0x3b, 0xdd, 0x42, 0x44, 0x4a, 0xb0, 0xb7, 0xa9, 0xcb, 0xf4, 0xb8, 0x43, 0x4a, + 0xd5, 0xe7, 0x93, 0xd8, 0xcf, 0x95, 0x12, 0x0f, 0x8d, 0xac, 0xb4, 0xc6, 0x18, 0x4b, 0x20, 0x59, 0xce, 0xeb, 0xc0, 0xfb, 0x88, 0x41, 0x94, 0xb1, 0x92, 0xec, 0x2f, 0x9a, 0x26, 0x37, 0x4d, 0xc7, + 0x31, 0x2d, 0x5e, 0x3f, 0xbc, 0x7e, 0xf8, 0x42, 0xe0, 0x4f, 0xb3, 0x79, 0x6e, 0xde, 0xff, 0x87, 0x1f, 0x04, 0xfb, 0x34, 0x9b, 0xd7, 0xf0, 0x0f, 0x0f, 0xd9, 0x81, 0x21, 0x22, 0xb4, 0x7a, 0x08, + 0xae, 0x15, 0x89, 0xb6, 0x12, 0x7e, 0x0b, 0x8a, 0x8a, 0xef, 0x5f, 0x55, 0xed, 0xe2, 0xa2, 0xe9, 0xc5, 0x1c, 0xee, 0xff, 0x2e, 0xb9, 0xbb, 0x37, 0x70, 0xf7, 0xe9, 0xa6, 0x43, 0xe7, 0xf8, 0x66, + 0x01, 0x37, 0x7b, 0x0e, 0xce, 0xdc, 0x7c, 0xbe, 0x83, 0x7f, 0x2b, 0x80, 0xfb, 0xb7, 0x77, 0x59, 0xda, 0x94, 0xee, 0xd3, 0xe8, 0x71, 0x01, 0xca, 0x7b, 0x67, 0x8b, 0xf4, 0x9b, 0xe7, 0xc8, 0x54, + 0x60, 0x57, 0xa3, 0x38, 0x1b, 0x19, 0xc7, 0xce, 0x95, 0x98, 0x8f, 0x6d, 0x78, 0x9c, 0x17, 0x39, 0xa6, 0x15, 0xef, 0x30, 0x38, 0x56, 0xe6, 0xde, 0x07, 0x4e, 0x98, 0xdd, 0x7f, 0x9a, 0x09, 0x73, + 0x5c, 0x34, 0xcd, 0x7e, 0xbf, 0xaf, 0xc9, 0xf7, 0xcf, 0xb1, 0xd6, 0xdc, 0x37, 0x5e, 0xe9, 0x0f, 0x6a, 0x8b, 0xcd, 0x15, 0x93, 0x92, 0xd7, 0x8b, 0xd1, 0x99, 0xcb, 0xdb, 0xe6, 0xb2, 0x7f, 0xff, + 0xf0, 0x1d, 0x3c, 0x62, 0xd8, 0x59, 0x8d, 0xf0, 0x07, 0xa9, 0x9d, 0xb2, 0x4e, 0xad, 0x1d, 0xb6, 0x05, 0x23, 0x8d, 0xec, 0xac, 0x04, 0xfb, 0x1e, 0x53, 0x18, 0xdb, 0x49, 0x25, 0xa2, 0xe8, 0x8b, + 0xb1, 0x25, 0x4d, 0x6f, 0x44, 0xd8, 0xbd, 0xa5, 0x32, 0x29, 0xd6, 0x08, 0x07, 0x5f, 0xd0, 0xbc, 0x82, 0xb5, 0x12, 0x79, 0x30, 0xe5, 0x5a, 0xf4, 0xd8, 0x73, 0x18, 0x61, 0x88, 0x6a, 0x8b, 0xd9, + 0xb9, 0x52, 0x29, 0xc7, 0xec, 0xc1, 0xa0, 0x53, 0x63, 0x19, 0xda, 0x4b, 0x8c, 0xc9, 0xd2, 0x56, 0x32, 0x76, 0xbe, 0x04, 0xa6, 0x1d, 0x23, 0xc3, 0xdf, 0x0d, 0x06, 0x65, 0xda, 0xac, 0x06, 0xb2, + 0x09, 0x12, 0xc6, 0x24, 0xeb, 0x43, 0xfe, 0x37, 0x72, 0x23, 0x2b, 0x24, 0xf3, 0x2b, 0x82, 0x95, 0xa5, 0x84, 0xdb, 0x50, 0x46, 0xd4, 0x05, 0xf2, 0xec, 0xa1, 0xec, 0x9c, 0xdf, 0xd8, 0xd8, 0xcd, + 0x28, 0x9e, 0x46, 0x7c, 0x25, 0xdd, 0xae, 0x8c, 0x91, 0x3f, 0x2b, 0x10, 0xe5, 0xb2, 0x75, 0x3c, 0x8d, 0xee, 0xf5, 0x10, 0x4b, 0x29, 0x1d, 0x6f, 0xad, 0xae, 0xbf, 0xd8, 0x25, 0x02, 0xcf, 0x95, + 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xe9, 0xf3, 0xdd, 0x10, 0x5d, 0x03, 0x00, 0x00, 0x61, 0x07, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, + 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0xec, 0xfd, 0x59, 0x93, 0xba, 0xdc, 0xb2, 0x38, 0x0c, 0xde, 0xbf, + 0x9f, 0xe2, 0x89, 0xdf, 0x65, 0xf3, 0xa7, 0x98, 0x07, 0x4f, 0xc4, 0x3e, 0x7d, 0x04, 0x1c, 0x11, 0x14, 0x67, 0xe9, 0xe8, 0xdd, 0xc1, 0x3c, 0xc8, 0x3c, 0x0a, 0xef, 0xe9, 0xfd, 0xd9, 0xdf, 0x10, + 0xcb, 0x2a, 0xb5, 0xb4, 0xa4, 0xfc, 0x3d, 0xcf, 0x19, 0xf7, 0x4d, 0x15, 0xb0, 0x30, 0x81, 0xcc, 0x5c, 0x39, 0xad, 0xcc, 0x5c, 0xff, 0xf7, 0xff, 0xf5, 0xc7, 0x1f, 0xbf, 0x02, 0xc5, 0x37, 0x7e, + 0xfd, 0xcb, 0x1f, 0xbf, 0x8c, 0xc2, 0x08, 0x32, 0xd0, 0x56, 0x02, 0xdd, 0x33, 0x92, 0x5f, 0xff, 0xe7, 0x38, 0x54, 0x18, 0x49, 0xea, 0x84, 0xc1, 0x71, 0x14, 0x7e, 0x43, 0xde, 0xe0, 0xd3, 0x55, + 0x2f, 0xd4, 0xf6, 0xa6, 0xe3, 0x19, 0xeb, 0x8f, 0x51, 0xb4, 0xb9, 0x9e, 0x18, 0x71, 0xee, 0x24, 0x46, 0xfa, 0xeb, 0x5f, 0xfe, 0xc8, 0x92, 0xdc, 0x68, 0xae, 0x45, 0x8a, 0xb6, 0x57, 0xac, 0xe6, + 0xda, 0xf1, 0x61, 0x7f, 0xfc, 0xf1, 0xeb, 0xe3, 0xe8, 0xdb, 0x47, 0x37, 0xc3, 0x77, 0x1f, 0xdf, 0x8c, 0x78, 0x8e, 0x66, 0x04, 0x69, 0xf3, 0xdb, 0x6e, 0xa4, 0x68, 0xb6, 0x01, 0xa2, 0x97, 0xc3, + 0xba, 0x11, 0x19, 0x81, 0x6e, 0x04, 0x9a, 0x73, 0xf1, 0xe4, 0x66, 0xe4, 0xdf, 0xb2, 0x2a, 0x32, 0x52, 0x28, 0x08, 0xf5, 0xe6, 0xc7, 0x7f, 0x47, 0xc8, 0x37, 0x04, 0x79, 0x43, 0xd0, 0x8f, 0xdf, + 0xfe, 0xf1, 0xc7, 0x2f, 0xcd, 0x0b, 0x73, 0xbd, 0x79, 0xa5, 0xb4, 0xb9, 0x87, 0x78, 0xbb, 0x04, 0xfe, 0xc7, 0x1f, 0xbf, 0x4c, 0x45, 0x49, 0x41, 0x37, 0x05, 0x93, 0x3c, 0xc8, 0x9c, 0xd3, 0x17, + 0xfc, 0x1d, 0x7e, 0xeb, 0xbc, 0xc1, 0xbf, 0xde, 0xef, 0xf9, 0xff, 0x5f, 0xbc, 0x49, 0xc1, 0x3d, 0x7b, 0x99, 0x4c, 0x89, 0x4e, 0x30, 0xf0, 0x37, 0x04, 0xbb, 0x7e, 0xd2, 0xe9, 0x0e, 0x2d, 0x71, + 0xa2, 0x0c, 0x34, 0x52, 0xcf, 0x09, 0x32, 0xe8, 0xf4, 0x0f, 0x8c, 0xbc, 0xdc, 0x72, 0x82, 0xf7, 0x9f, 0xa1, 0xf8, 0xd3, 0x9f, 0x45, 0x4a, 0x92, 0x1a, 0xc9, 0x83, 0xfb, 0x4f, 0xf7, 0x34, 0x83, + 0xd4, 0x1b, 0x4a, 0xde, 0x1b, 0x04, 0xb5, 0x30, 0x30, 0x1d, 0x0b, 0x8c, 0x12, 0x23, 0xcb, 0x9c, 0x77, 0x48, 0xf4, 0x1b, 0x76, 0xf7, 0xde, 0xd3, 0xcb, 0x5d, 0xdf, 0x8b, 0xbd, 0xdd, 0x3c, 0xf4, + 0x48, 0x03, 0xff, 0x44, 0xdd, 0xbf, 0xa3, 0x6f, 0xf0, 0x1b, 0x7e, 0x39, 0x78, 0xf5, 0x53, 0xf4, 0xf6, 0x31, 0x69, 0x1e, 0x19, 0x49, 0x66, 0xa4, 0xd9, 0xfb, 0xf7, 0xc0, 0x6f, 0x57, 0x04, 0xfc, + 0x06, 0xa1, 0x59, 0x0a, 0x7e, 0xd0, 0xbe, 0xf3, 0x86, 0xbc, 0x21, 0xd7, 0x83, 0x0f, 0xbf, 0x14, 0x79, 0x43, 0xe8, 0x1b, 0x48, 0x1f, 0x28, 0x3e, 0x23, 0xf5, 0x0d, 0xff, 0xa0, 0x7f, 0xf3, 0xff, + 0x9d, 0x0b, 0x9a, 0x0f, 0xfd, 0xff, 0xf9, 0xa1, 0x9e, 0x7b, 0x46, 0x0a, 0xfd, 0x9b, 0xaa, 0xa8, 0x86, 0x07, 0x69, 0xa1, 0x6e, 0x80, 0x66, 0x72, 0xe2, 0xff, 0xff, 0xfb, 0x0e, 0xc3, 0x53, 0x6f, + 0x08, 0xfa, 0x86, 0x7c, 0xbe, 0xde, 0xaf, 0xc4, 0x48, 0x43, 0xaf, 0x30, 0xf4, 0xe3, 0xa0, 0x9d, 0x65, 0x51, 0xfa, 0x2f, 0x10, 0x94, 0x18, 0x96, 0x93, 0x66, 0x49, 0xf5, 0x16, 0x44, 0xbe, 0x9b, + 0xbe, 0x85, 0x89, 0xf5, 0x15, 0x3e, 0x04, 0x5e, 0x9c, 0x80, 0xef, 0x60, 0xdf, 0x32, 0xab, 0xfe, 0x04, 0xed, 0x04, 0x99, 0x61, 0x25, 0x4e, 0x56, 0x1d, 0x61, 0xa7, 0xb6, 0x42, 0x20, 0x28, 0x28, + 0x67, 0x48, 0x15, 0xea, 0xcc, 0x01, 0x59, 0x69, 0x95, 0x63, 0xcc, 0x84, 0xc5, 0x7e, 0x13, 0xac, 0x70, 0x7b, 0x16, 0xdb, 0x65, 0x4c, 0xd9, 0x03, 0x07, 0x0d, 0xfa, 0x13, 0x64, 0x62, 0x74, 0xb1, + 0xde, 0xca, 0x03, 0x62, 0x74, 0x22, 0x1d, 0x10, 0x52, 0x18, 0x2d, 0xac, 0x31, 0x0c, 0xd4, 0x94, 0x1e, 0xf8, 0x56, 0x31, 0xeb, 0x48, 0xd9, 0xc8, 0x33, 0xf2, 0xde, 0x72, 0x30, 0x75, 0xa6, 0x43, + 0x64, 0xae, 0x8d, 0xca, 0xbf, 0xfd, 0xed, 0x72, 0x92, 0x16, 0x17, 0x92, 0xe2, 0x8f, 0x27, 0xf3, 0xf6, 0xf4, 0x59, 0xb6, 0x63, 0xd9, 0x9e, 0x63, 0xd9, 0x67, 0x5e, 0x45, 0xe0, 0x9f, 0x20, 0xdd, + 0x36, 0xbc, 0xc8, 0x48, 0xc0, 0x42, 0xf1, 0x1c, 0x5d, 0xc9, 0xc2, 0x04, 0x74, 0x74, 0x23, 0xc8, 0x1c, 0xf3, 0x44, 0xe4, 0x07, 0x54, 0xb8, 0xe4, 0xda, 0x1f, 0x12, 0xe1, 0x9b, 0xe7, 0x41, 0xe0, + 0x77, 0xa3, 0xe0, 0xe9, 0xb9, 0xcf, 0xa9, 0xb4, 0xc6, 0xb2, 0x94, 0xaa, 0x85, 0x45, 0x4e, 0x78, 0xa6, 0x53, 0x6e, 0xb8, 0xf5, 0xa6, 0x9e, 0x73, 0x83, 0x91, 0x08, 0x78, 0x01, 0xdb, 0x5b, 0xe9, + 0xca, 0xd6, 0xca, 0xd6, 0xc3, 0xb1, 0x35, 0x51, 0x91, 0x64, 0xa0, 0x74, 0x49, 0x57, 0x48, 0x32, 0xa6, 0xd3, 0xf3, 0x7b, 0xd4, 0x04, 0xa1, 0xcd, 0x70, 0x3b, 0x1e, 0xf5, 0xe8, 0x55, 0x00, 0x75, + 0x21, 0x9b, 0x14, 0xc7, 0xe6, 0x40, 0x8a, 0x20, 0x03, 0x19, 0xe3, 0xdd, 0xfb, 0x54, 0x7a, 0x8e, 0xde, 0x0b, 0xe2, 0xfc, 0x05, 0xc8, 0x3c, 0x43, 0x3f, 0xa2, 0xee, 0x7c, 0xdc, 0x1a, 0x51, 0xbb, + 0x05, 0x3b, 0x2d, 0x0f, 0xc5, 0x72, 0xd7, 0x1b, 0x09, 0x8b, 0x81, 0xc2, 0x48, 0x2a, 0xb1, 0xe7, 0xb8, 0x94, 0x0d, 0x23, 0x4e, 0x77, 0x56, 0x83, 0x34, 0x8e, 0x94, 0x2c, 0xc2, 0xcc, 0xa9, 0x37, + 0xc2, 0x01, 0x74, 0x28, 0x2d, 0xf6, 0x4b, 0xbf, 0xb7, 0xde, 0x04, 0xeb, 0xbc, 0x5a, 0xe8, 0x5d, 0x96, 0xe8, 0x6d, 0xd8, 0x78, 0xb1, 0xd9, 0x2c, 0x0b, 0xd8, 0x51, 0x49, 0x6c, 0xee, 0xce, 0x29, + 0x7d, 0xc9, 0xe8, 0xd6, 0x6f, 0xb3, 0xf3, 0xb7, 0x0c, 0xd9, 0x30, 0xf8, 0x8d, 0xd0, 0xd4, 0x6c, 0xc5, 0xdb, 0x7f, 0x88, 0xcc, 0xab, 0x21, 0x37, 0x05, 0xb3, 0x70, 0x6f, 0x04, 0xe9, 0x87, 0x50, + 0x84, 0x7f, 0x30, 0x35, 0x3e, 0xb0, 0x7b, 0x35, 0xaa, 0x04, 0xa9, 0x03, 0xa6, 0x59, 0xe5, 0x5d, 0x7d, 0xc0, 0x25, 0x51, 0xb1, 0x37, 0xf4, 0xed, 0xe7, 0x52, 0xea, 0x02, 0x2e, 0x04, 0x5e, 0x9e, + 0x81, 0x0d, 0xbc, 0xe7, 0xf4, 0x5c, 0x2f, 0x61, 0x79, 0x44, 0xee, 0xe5, 0xb9, 0xbe, 0xb4, 0xe9, 0x5d, 0x35, 0x2e, 0xb1, 0x85, 0xa0, 0xee, 0x7c, 0x28, 0x07, 0xc4, 0xd8, 0x4c, 0xbb, 0x87, 0x5e, + 0xb4, 0x99, 0xc2, 0x33, 0xb3, 0x93, 0xc6, 0x34, 0x64, 0x74, 0xf0, 0xcd, 0xe1, 0x30, 0x8d, 0x66, 0xfc, 0xa1, 0xd3, 0x9f, 0x23, 0x7d, 0xaf, 0x62, 0xb3, 0xe9, 0x9a, 0x13, 0xa7, 0x12, 0x40, 0x07, + 0x99, 0x17, 0xf7, 0x0f, 0xce, 0x5c, 0x03, 0x12, 0x22, 0x7e, 0xc0, 0xf8, 0x2d, 0xe8, 0xa9, 0x85, 0x5e, 0x98, 0x1c, 0x15, 0x47, 0x61, 0x24, 0xd9, 0xbb, 0xc2, 0xb8, 0x6b, 0x0f, 0x18, 0x81, 0xe5, + 0x04, 0xb7, 0xbf, 0x3e, 0x6b, 0xa4, 0x7f, 0xfd, 0xdb, 0x4f, 0x84, 0xd9, 0x7d, 0x8a, 0x9d, 0x19, 0xe4, 0x1e, 0xad, 0xd0, 0x37, 0xfc, 0x42, 0x51, 0xb6, 0xa5, 0x55, 0x03, 0xf1, 0xa8, 0x45, 0x8e, + 0xff, 0xc1, 0x06, 0xc6, 0x73, 0xfa, 0x08, 0x99, 0x03, 0x98, 0x1d, 0x2f, 0x1a, 0x8b, 0x5a, 0xd9, 0xc7, 0xb3, 0xcd, 0x9a, 0x86, 0xa6, 0xc9, 0x72, 0x99, 0xf5, 0x11, 0x4b, 0x76, 0x00, 0x93, 0xee, + 0xc7, 0x5e, 0xd5, 0xd5, 0xc3, 0x3c, 0x51, 0x3c, 0xad, 0xbf, 0xe9, 0x4b, 0x9b, 0x3e, 0x0a, 0x88, 0x16, 0x3b, 0x5c, 0xd8, 0xee, 0x9e, 0x55, 0x81, 0x51, 0x9f, 0x99, 0xc4, 0x1d, 0x35, 0x97, 0xcb, + 0x1e, 0x72, 0xd0, 0xf6, 0xd2, 0x0a, 0x8f, 0x8c, 0x45, 0x2e, 0xbd, 0x4c, 0x9f, 0x6b, 0x3e, 0x3e, 0x1a, 0x23, 0xe8, 0xb5, 0xea, 0x37, 0x52, 0x4d, 0x89, 0x0c, 0x30, 0xcd, 0x12, 0x27, 0xb0, 0xc0, + 0xc4, 0xb0, 0x8c, 0x43, 0xf4, 0x4e, 0x47, 0xf8, 0x8d, 0xb8, 0xb1, 0x3d, 0xa2, 0x30, 0xc9, 0x52, 0xb0, 0xa1, 0xf9, 0xaf, 0x93, 0x81, 0x88, 0xfd, 0xe7, 0xd0, 0xfa, 0x86, 0xeb, 0xee, 0xd1, 0xfc, + 0xc8, 0x87, 0xd8, 0xcf, 0x69, 0x7e, 0x09, 0xb9, 0xb1, 0x20, 0x2e, 0xce, 0xc1, 0x06, 0xe6, 0x73, 0x1e, 0x90, 0xcc, 0xee, 0x2a, 0xd3, 0x81, 0xa2, 0xaf, 0x77, 0xb3, 0xbe, 0xa4, 0xb1, 0x34, 0xcb, + 0x56, 0xbb, 0x0c, 0x31, 0x77, 0x9b, 0xc3, 0x22, 0xee, 0x3a, 0x3c, 0xaa, 0x2d, 0x38, 0xb2, 0xe6, 0x18, 0x5a, 0xc4, 0xb4, 0x28, 0xed, 0x31, 0xdd, 0x62, 0x7e, 0x88, 0x3a, 0xf5, 0x74, 0x60, 0x91, + 0x03, 0x68, 0x31, 0x1c, 0x8e, 0x77, 0xdd, 0x25, 0x4d, 0x43, 0x4a, 0x0d, 0x8d, 0x72, 0x6e, 0xd0, 0x9d, 0xa4, 0xe2, 0x5a, 0x1d, 0xbc, 0x2e, 0x73, 0x4f, 0xdf, 0x70, 0x76, 0x39, 0x90, 0x37, 0xe4, + 0x0d, 0xfb, 0x93, 0x28, 0x10, 0x3c, 0x36, 0xe3, 0x4e, 0x8f, 0x79, 0x0d, 0xfd, 0xc1, 0xd9, 0x7a, 0x3b, 0x9f, 0x80, 0x0d, 0xb4, 0xef, 0x11, 0x8f, 0x80, 0x51, 0x87, 0x59, 0x3b, 0x1d, 0x47, 0x93, + 0x0a, 0x63, 0x8d, 0xad, 0x46, 0x95, 0x8b, 0x49, 0x23, 0x41, 0x8b, 0x96, 0x05, 0xbb, 0xfa, 0x4d, 0xbd, 0x7e, 0xfd, 0xed, 0xb6, 0x92, 0x82, 0xa6, 0xa7, 0x58, 0x0f, 0x15, 0x03, 0xfc, 0x82, 0xb2, + 0x3f, 0x03, 0x3d, 0x2a, 0xf9, 0xf7, 0x43, 0xb0, 0x81, 0xf4, 0xec, 0xab, 0x33, 0x7d, 0xbe, 0xc2, 0xd8, 0x81, 0x9c, 0x38, 0xe3, 0x8d, 0x6f, 0x8a, 0x03, 0xd3, 0x0b, 0x87, 0x34, 0xe5, 0xad, 0xf3, + 0x02, 0xfe, 0x9e, 0x61, 0xfe, 0xf2, 0x59, 0xfa, 0x45, 0x60, 0xdc, 0xc3, 0x16, 0xf1, 0x46, 0xbc, 0x80, 0xad, 0x6b, 0xd0, 0x10, 0x78, 0x73, 0x01, 0x6c, 0xa0, 0xb6, 0x98, 0xa8, 0xee, 0xda, 0x2d, + 0xf5, 0xed, 0x28, 0xc3, 0x61, 0x5a, 0x18, 0x39, 0xdd, 0x98, 0xdd, 0xe2, 0xe1, 0x8a, 0x4f, 0xad, 0x15, 0xda, 0x8b, 0xbb, 0x83, 0x3a, 0x45, 0x67, 0xd1, 0xde, 0xc7, 0x15, 0x69, 0xa7, 0xba, 0x3e, + 0x20, 0xf7, 0x36, 0x3d, 0x6d, 0x83, 0x2f, 0xcc, 0xbe, 0xb8, 0x4c, 0xf0, 0x5c, 0x10, 0x65, 0x5f, 0x81, 0x8d, 0x0a, 0x37, 0x09, 0xcf, 0x9a, 0x24, 0x7b, 0x06, 0x56, 0xb6, 0xb0, 0x24, 0x84, 0xaf, + 0xdb, 0xfa, 0x17, 0x8c, 0x75, 0x94, 0xd4, 0xf0, 0x5f, 0x25, 0x5b, 0xaf, 0x1c, 0xea, 0x44, 0x7b, 0x40, 0x19, 0xf8, 0x0d, 0x7f, 0xc1, 0xc0, 0xb9, 0x05, 0x0e, 0x81, 0x1f, 0x87, 0x60, 0x03, 0xf1, + 0x39, 0x55, 0x88, 0x82, 0x5a, 0x72, 0xbd, 0x4e, 0xe4, 0xad, 0xed, 0xe2, 0x20, 0x19, 0x9b, 0xc9, 0x96, 0x5b, 0x16, 0xfd, 0x62, 0xcc, 0xe8, 0x43, 0x32, 0xea, 0xa5, 0x7a, 0xe0, 0xa1, 0x16, 0xa4, + 0x77, 0xa3, 0xcc, 0xcf, 0xfb, 0xbd, 0x99, 0xa1, 0x4b, 0x78, 0x2f, 0x89, 0x89, 0x24, 0xe5, 0xd2, 0x2d, 0xe0, 0x17, 0x5d, 0x81, 0x44, 0xe0, 0x91, 0x2d, 0x2a, 0x53, 0x74, 0x43, 0xac, 0x11, 0x7d, + 0x3a, 0x0d, 0x38, 0xfe, 0xb0, 0xff, 0x0d, 0x15, 0xea, 0x16, 0x0d, 0x41, 0xc8, 0xa3, 0x07, 0x79, 0xe5, 0xab, 0xeb, 0x86, 0x9a, 0x9f, 0x88, 0x85, 0xdf, 0x7a, 0xd4, 0x46, 0x1a, 0x25, 0xc6, 0xc9, + 0xdb, 0xa6, 0x6e, 0x9d, 0x78, 0xcb, 0x0b, 0x55, 0xc5, 0x3b, 0xe9, 0xe3, 0xa3, 0x53, 0x7a, 0x3d, 0xea, 0x58, 0x41, 0x98, 0x9c, 0xbd, 0x78, 0xf8, 0x8d, 0xbc, 0x1a, 0xf3, 0x8f, 0x4c, 0x0e, 0x9a, + 0x89, 0x91, 0xda, 0xf7, 0xd5, 0xb9, 0x9b, 0x82, 0x95, 0xe2, 0x7b, 0xef, 0x83, 0x08, 0x76, 0x3d, 0xea, 0x3b, 0x81, 0xe3, 0x2b, 0x99, 0x66, 0x7f, 0x70, 0xd8, 0xd5, 0xf7, 0x1c, 0x8d, 0x80, 0x08, + 0x74, 0xd3, 0x30, 0x00, 0xb5, 0xd0, 0xf7, 0x3f, 0xe2, 0x40, 0x58, 0xf3, 0x75, 0x3f, 0x63, 0xc5, 0xbf, 0x23, 0xf0, 0x11, 0x5f, 0xf0, 0x1f, 0xff, 0xfe, 0xef, 0x7f, 0xfc, 0xeb, 0xdf, 0x10, 0xb4, + 0xad, 0x55, 0x7e, 0xcb, 0x3e, 0x57, 0xa3, 0x67, 0x84, 0xdf, 0x63, 0x57, 0xfc, 0x0d, 0x7b, 0x81, 0x5d, 0x1b, 0x88, 0x10, 0x78, 0xfa, 0x0f, 0x36, 0x30, 0x9e, 0x33, 0xa8, 0x1e, 0xf6, 0x4a, 0xbd, + 0xf0, 0xf1, 0x19, 0x6b, 0xf0, 0x38, 0x8f, 0xcd, 0x25, 0x11, 0x95, 0x59, 0x94, 0xd9, 0xad, 0x18, 0xe5, 0x50, 0x4e, 0xba, 0x73, 0x36, 0x96, 0x7d, 0xc1, 0xcd, 0xfa, 0xb4, 0x42, 0x20, 0x63, 0x74, + 0xae, 0xc2, 0x87, 0x68, 0xed, 0x85, 0xfd, 0x79, 0xc0, 0x4e, 0xb9, 0x32, 0x76, 0xa3, 0x32, 0xe8, 0x86, 0x4a, 0x88, 0x47, 0x86, 0x27, 0xd2, 0x1e, 0x36, 0x1f, 0xeb, 0x05, 0x66, 0xcd, 0x5f, 0x67, + 0x50, 0xbf, 0xa1, 0xd2, 0x91, 0x91, 0xd0, 0x1f, 0x12, 0xe9, 0x5f, 0xff, 0x46, 0xde, 0x93, 0x31, 0x91, 0x61, 0x24, 0x97, 0xc1, 0x3b, 0xc1, 0xc8, 0x94, 0x6b, 0x00, 0x0f, 0x45, 0x7b, 0x33, 0x1a, + 0x46, 0x99, 0x13, 0x06, 0x8a, 0x77, 0xa9, 0x67, 0xff, 0xf8, 0xa0, 0xfb, 0x6f, 0xd0, 0xff, 0x73, 0xe6, 0xdc, 0x35, 0x39, 0xd0, 0xb7, 0x57, 0xdc, 0xec, 0x77, 0xa0, 0x10, 0x78, 0x3e, 0x02, 0x4f, + 0x80, 0x9e, 0xf3, 0x01, 0xb3, 0x19, 0xb1, 0x79, 0x5d, 0x73, 0x05, 0x17, 0x0e, 0x09, 0x5c, 0x1c, 0xf2, 0x6c, 0x6a, 0x70, 0x4a, 0xd0, 0xb5, 0x7b, 0x18, 0x6b, 0x70, 0x61, 0x62, 0x71, 0x13, 0x42, + 0x58, 0x92, 0x13, 0x61, 0xbb, 0x75, 0xd1, 0x0d, 0x1b, 0xe8, 0x9d, 0x15, 0x8b, 0xa6, 0xb5, 0xbe, 0xc7, 0xbb, 0x9b, 0x89, 0xe9, 0xea, 0x96, 0xc8, 0xb0, 0xdb, 0xc9, 0x4a, 0x09, 0xb6, 0x3b, 0x2d, + 0x62, 0x18, 0x7e, 0xba, 0xd8, 0x0c, 0xca, 0xd7, 0xed, 0xbc, 0xac, 0x8a, 0x0c, 0xd0, 0x3c, 0x07, 0x07, 0xe1, 0x37, 0xfa, 0xc7, 0x93, 0xf6, 0x5f, 0xff, 0x46, 0x7f, 0xfd, 0x85, 0x99, 0x07, 0xba, + 0x13, 0x58, 0xd7, 0xbf, 0xc8, 0x13, 0xef, 0x12, 0xad, 0x96, 0x93, 0xd9, 0xb9, 0xfa, 0xa6, 0x85, 0x3e, 0x94, 0x46, 0x61, 0x90, 0x86, 0x49, 0x0a, 0xa5, 0x4e, 0xa0, 0x1f, 0x49, 0x90, 0xd8, 0x79, + 0xfa, 0xdb, 0x33, 0xdf, 0x7f, 0x44, 0xf4, 0x13, 0xdb, 0xff, 0x94, 0xe6, 0xfe, 0x91, 0xdc, 0x7e, 0x0a, 0x36, 0xbf, 0x7e, 0x4e, 0xe8, 0x74, 0xb0, 0x9f, 0x1d, 0x80, 0xb5, 0x2b, 0x64, 0x7e, 0x97, + 0x14, 0xb6, 0x28, 0x15, 0x76, 0xf1, 0x3e, 0xd3, 0xef, 0x4d, 0xfa, 0xac, 0x2c, 0xe3, 0x0b, 0x7c, 0x1b, 0x1b, 0x83, 0xe9, 0x96, 0x2d, 0x48, 0x3a, 0x5b, 0x02, 0xae, 0x8a, 0x15, 0x7b, 0x68, 0x5e, + 0x29, 0xfc, 0x66, 0x06, 0xcf, 0x96, 0x7c, 0xb5, 0xc9, 0xfc, 0xc9, 0x42, 0x80, 0x55, 0x40, 0xd1, 0x57, 0xcb, 0x5e, 0xa1, 0xa6, 0xc8, 0xac, 0xa7, 0x0c, 0xd1, 0x07, 0x76, 0xc2, 0xab, 0x18, 0xba, + 0x2f, 0xbc, 0xef, 0x1b, 0xa8, 0xc8, 0x0b, 0x92, 0xf2, 0x0e, 0xfc, 0xa3, 0xdd, 0xf5, 0xf5, 0x2a, 0xd8, 0xc0, 0x7f, 0x8e, 0x54, 0xd2, 0x9c, 0x69, 0xc0, 0x1c, 0x77, 0xec, 0x32, 0x9e, 0x91, 0x22, + 0xa4, 0x8c, 0x0a, 0xd4, 0x44, 0x2c, 0x61, 0x48, 0x7b, 0xd3, 0x75, 0xb6, 0x91, 0x86, 0x61, 0xcc, 0xe2, 0x15, 0x4f, 0x86, 0x0b, 0x6e, 0xbd, 0x0e, 0xb5, 0xdc, 0xef, 0xa6, 0x26, 0x1b, 0xbb, 0xfb, + 0x6d, 0x10, 0x3b, 0x3b, 0xc1, 0xf6, 0x85, 0x72, 0x01, 0xf9, 0xbd, 0xe1, 0x24, 0xa2, 0xd6, 0x86, 0xed, 0x65, 0x58, 0xec, 0x91, 0x5e, 0xcf, 0x79, 0x36, 0x7b, 0xfe, 0xeb, 0xb2, 0xbf, 0xa9, 0xa4, + 0x99, 0x63, 0x56, 0x90, 0xe2, 0x16, 0x47, 0x54, 0x46, 0x8e, 0xf7, 0x30, 0x38, 0x8b, 0x5c, 0xaf, 0x09, 0xb5, 0x24, 0xe0, 0xdd, 0x27, 0x40, 0xe0, 0xd5, 0x69, 0xe3, 0x68, 0xb5, 0x90, 0x7c, 0x56, + 0xc1, 0x4e, 0x57, 0x62, 0xb4, 0x4d, 0x37, 0xc9, 0x48, 0xc2, 0xba, 0xb8, 0xb2, 0x65, 0x27, 0x23, 0x5d, 0xf5, 0x26, 0x70, 0xc6, 0xc5, 0x38, 0xca, 0x0c, 0x20, 0x74, 0x5b, 0x52, 0xe1, 0x41, 0x75, + 0xbc, 0x8e, 0x8d, 0x20, 0x79, 0x58, 0x22, 0x70, 0x9d, 0x2d, 0xd0, 0x41, 0xde, 0x57, 0x6a, 0x91, 0x31, 0x5d, 0x35, 0x49, 0x65, 0x22, 0xf0, 0x80, 0x60, 0xe6, 0x11, 0x2e, 0xb7, 0x70, 0x5d, 0x62, + 0xb9, 0xb8, 0xa1, 0x5d, 0x2b, 0x7b, 0x8c, 0x6c, 0x83, 0xda, 0xe3, 0x99, 0xe7, 0xa8, 0x90, 0x99, 0xbe, 0xa5, 0x9a, 0x12, 0xe8, 0xce, 0x23, 0xc4, 0x1e, 0xc5, 0x01, 0xfe, 0x73, 0xc4, 0x7e, 0x85, + 0x0f, 0x81, 0x17, 0x27, 0x8d, 0x94, 0xc1, 0x9f, 0x23, 0x15, 0xc3, 0x2c, 0x2c, 0x12, 0xc6, 0x7b, 0x4c, 0xb5, 0x88, 0x60, 0xab, 0x4e, 0x20, 0x80, 0xdd, 0x91, 0x23, 0xd4, 0x18, 0x73, 0xb5, 0xdc, + 0x0d, 0x1c, 0xbc, 0x33, 0x33, 0xc7, 0xc1, 0x84, 0x30, 0x2d, 0x7b, 0xb6, 0xb4, 0xac, 0x59, 0xc1, 0xe8, 0x50, 0xd4, 0x17, 0x17, 0xd6, 0x38, 0xd5, 0xbb, 0xd6, 0x26, 0xca, 0xf2, 0x7e, 0x4e, 0xc5, + 0x31, 0xd4, 0x9b, 0x17, 0xd3, 0x5d, 0xdf, 0xb3, 0x8b, 0x74, 0xb2, 0x64, 0xf9, 0xd7, 0x43, 0x7b, 0x57, 0x9f, 0x95, 0x29, 0xd9, 0x09, 0x41, 0x37, 0x26, 0x63, 0x92, 0x07, 0x60, 0xa4, 0x24, 0x8a, + 0xe7, 0x19, 0x27, 0xa3, 0xf3, 0xc8, 0x40, 0x9d, 0x1f, 0xab, 0x9d, 0x3f, 0xe8, 0x9f, 0xd2, 0xf1, 0xf4, 0x42, 0xf7, 0x89, 0x08, 0xff, 0x2e, 0x11, 0x33, 0x25, 0x7b, 0xa7, 0x60, 0xa6, 0x64, 0x60, + 0x03, 0xf0, 0x39, 0xf9, 0x46, 0x3b, 0x6f, 0x38, 0xee, 0xc2, 0x9a, 0x97, 0xa1, 0xc0, 0xda, 0xa2, 0x54, 0x4d, 0x8b, 0x81, 0x65, 0x3d, 0xd7, 0xc7, 0x45, 0x81, 0x74, 0x34, 0x74, 0x24, 0xc6, 0xcc, + 0x22, 0x0d, 0xa7, 0x93, 0x08, 0x71, 0x0d, 0xea, 0xe0, 0x66, 0x09, 0x35, 0x46, 0x49, 0x60, 0xb3, 0x9d, 0x53, 0xa8, 0xc0, 0xea, 0xc5, 0xaa, 0x13, 0x23, 0xf1, 0xb2, 0x1e, 0x6d, 0x38, 0xd3, 0x16, + 0x4c, 0x80, 0x9b, 0x17, 0xd2, 0x98, 0xc7, 0x9f, 0x59, 0x85, 0x7f, 0x36, 0x5e, 0xcb, 0xc7, 0x41, 0xd4, 0xa3, 0xa6, 0x24, 0x7f, 0x0b, 0xaf, 0xe5, 0x29, 0x9e, 0xfa, 0x7e, 0x04, 0x36, 0x00, 0x9f, + 0xe3, 0x95, 0x66, 0x92, 0x50, 0x49, 0xc9, 0x62, 0x99, 0x6d, 0xf0, 0xc1, 0x68, 0xbb, 0xec, 0x0e, 0xb9, 0xb0, 0x87, 0xa1, 0x76, 0x20, 0xa2, 0x02, 0x51, 0xed, 0x2d, 0x36, 0xda, 0x0c, 0xd4, 0x7c, + 0x3b, 0x94, 0x10, 0xa2, 0xe8, 0x09, 0x71, 0x82, 0x62, 0x11, 0x43, 0x91, 0x06, 0x34, 0x90, 0xb5, 0x5d, 0x2a, 0xb3, 0xc3, 0xee, 0xa4, 0x20, 0xe0, 0x7d, 0xa6, 0xa3, 0x78, 0x6c, 0xf7, 0x2a, 0x3e, + 0x21, 0x4b, 0x26, 0xfb, 0x0d, 0x27, 0xfd, 0xbe, 0x34, 0xb9, 0x11, 0x1d, 0xcd, 0x5a, 0x79, 0x9a, 0xc5, 0xef, 0x53, 0xe2, 0xae, 0x95, 0xfd, 0xa7, 0x90, 0xee, 0x52, 0xcb, 0x40, 0xce, 0x23, 0x8d, + 0x0f, 0xbf, 0xb8, 0x00, 0x75, 0x03, 0x1d, 0x02, 0x21, 0x27, 0x05, 0xe1, 0x96, 0x2b, 0x4f, 0x1d, 0xb1, 0xb7, 0xec, 0x20, 0x30, 0x27, 0x2a, 0xa3, 0x59, 0x60, 0xed, 0x82, 0xc9, 0x64, 0x66, 0x58, + 0xc0, 0xd4, 0xaa, 0xe3, 0xd4, 0xe9, 0xe4, 0x02, 0xee, 0x2f, 0xd4, 0x70, 0x45, 0x54, 0x64, 0x44, 0x2f, 0x08, 0xae, 0x16, 0x96, 0xeb, 0x5e, 0x3a, 0x96, 0x13, 0xa5, 0x74, 0x00, 0x26, 0xe4, 0xc4, + 0xd5, 0x9a, 0x51, 0x50, 0xce, 0x1e, 0xc7, 0xd2, 0x6e, 0xd5, 0x2f, 0x04, 0xce, 0xb4, 0x56, 0x30, 0x89, 0x4e, 0x7e, 0x73, 0x3e, 0xb4, 0x52, 0x17, 0x69, 0xed, 0x2b, 0x89, 0x56, 0x2b, 0x7b, 0xe8, + 0x88, 0x1b, 0x30, 0x73, 0xfc, 0x6f, 0x35, 0xf1, 0xcf, 0xad, 0xcf, 0xbb, 0x4f, 0x80, 0xc0, 0x8b, 0x93, 0x46, 0x0f, 0xb7, 0x30, 0x4c, 0xb7, 0x23, 0x06, 0xdd, 0xaa, 0xf5, 0x70, 0x29, 0x92, 0x8e, + 0x31, 0x72, 0xcd, 0x91, 0xb0, 0xee, 0xd8, 0xde, 0x5a, 0x33, 0x67, 0x2b, 0x94, 0x4c, 0xd1, 0x42, 0x31, 0x77, 0x1b, 0x49, 0x93, 0x87, 0x9b, 0xed, 0x70, 0x7a, 0x70, 0x94, 0xb9, 0xbc, 0xeb, 0x71, + 0x7c, 0xaf, 0xd4, 0x3d, 0x04, 0xed, 0xc8, 0x95, 0x45, 0xc0, 0x80, 0x19, 0xee, 0xd6, 0xa8, 0xcb, 0x5a, 0x59, 0x12, 0x2f, 0xba, 0x64, 0x2c, 0xe6, 0xe2, 0xe2, 0x75, 0x95, 0xa1, 0x1b, 0xa6, 0x91, + 0x80, 0x59, 0x08, 0x6a, 0x61, 0x10, 0x18, 0xda, 0x79, 0x41, 0x08, 0x7e, 0xc1, 0x11, 0x69, 0x45, 0xa9, 0x53, 0x1a, 0x49, 0x63, 0x7d, 0xa6, 0x9a, 0x6d, 0xf8, 0xca, 0x03, 0x32, 0x51, 0x6f, 0xf0, + 0x1b, 0xf5, 0x73, 0x32, 0x7d, 0x01, 0x0f, 0x81, 0x97, 0x67, 0x60, 0x03, 0xf6, 0x39, 0x91, 0xb4, 0xc3, 0xa6, 0x2f, 0xad, 0x53, 0x83, 0xf1, 0xc9, 0x69, 0x67, 0xa0, 0x96, 0xc8, 0x68, 0xa3, 0xd2, + 0x09, 0x39, 0x5d, 0xe0, 0x53, 0x7b, 0x91, 0x61, 0xf6, 0x4c, 0x9e, 0xec, 0xfb, 0xdd, 0x68, 0xe2, 0x0a, 0xf4, 0xb2, 0xb7, 0x9d, 0x4f, 0x99, 0x5c, 0x1a, 0x4c, 0xba, 0x43, 0xd4, 0x41, 0x2d, 0x39, + 0xd2, 0xb6, 0xfa, 0x84, 0x19, 0x25, 0xd1, 0x36, 0x5f, 0x72, 0xf6, 0x90, 0x5a, 0xab, 0x3e, 0xe2, 0x6c, 0x7d, 0x71, 0xf0, 0xf3, 0xb5, 0xea, 0xab, 0x04, 0xa0, 0xbb, 0xcc, 0x7c, 0x9b, 0x12, 0xf4, + 0x43, 0x44, 0x1d, 0x41, 0x43, 0x60, 0xf3, 0x0f, 0x3c, 0xc3, 0x7a, 0x8e, 0x1d, 0x00, 0x1d, 0x59, 0x56, 0x69, 0x51, 0xb3, 0x43, 0x38, 0x25, 0xf8, 0xca, 0x2e, 0xd2, 0xb8, 0xb3, 0x56, 0x12, 0x7f, + 0xa6, 0x8e, 0x0c, 0x6f, 0x3b, 0x83, 0x29, 0x78, 0x28, 0x8c, 0xfc, 0x5e, 0xa4, 0x66, 0x03, 0x36, 0xac, 0x36, 0xe2, 0x48, 0x94, 0x5c, 0xbc, 0xac, 0x5d, 0x55, 0x62, 0xb7, 0xb5, 0x3e, 0x5c, 0xce, + 0xb7, 0x41, 0x9c, 0x9b, 0x79, 0x36, 0x56, 0x09, 0xbe, 0xbb, 0x9a, 0xcb, 0x5d, 0x51, 0x64, 0xba, 0x47, 0xf1, 0xfe, 0x14, 0x15, 0xef, 0xd9, 0x32, 0xf7, 0x83, 0x49, 0x57, 0xf9, 0x33, 0x3f, 0x44, + 0xc4, 0x11, 0x30, 0x04, 0x36, 0xff, 0xc0, 0x13, 0xa4, 0xe7, 0x68, 0x80, 0xd7, 0xb4, 0xc6, 0x87, 0x25, 0xa3, 0xa7, 0x4e, 0xb7, 0x13, 0xa8, 0x87, 0xae, 0x45, 0x11, 0x18, 0x92, 0xf6, 0x51, 0x4d, + 0x9f, 0xc9, 0xa2, 0xb3, 0x0a, 0x2d, 0xcd, 0x1c, 0xad, 0x8c, 0xd5, 0xc0, 0x07, 0x54, 0xc3, 0x5d, 0x31, 0x3d, 0x48, 0x2d, 0x1c, 0xb5, 0xc6, 0x92, 0x21, 0x46, 0x3a, 0xd2, 0xac, 0xa3, 0x4a, 0xee, + 0x14, 0x4a, 0xa7, 0x75, 0xbf, 0x5c, 0x75, 0x28, 0x28, 0x67, 0x09, 0x9f, 0xad, 0xc2, 0xd7, 0x67, 0xf2, 0x4d, 0xba, 0xd8, 0xff, 0xab, 0xf5, 0x6c, 0xfc, 0x36, 0x65, 0xeb, 0x3e, 0xaa, 0xd1, 0x97, + 0x74, 0xd3, 0x93, 0xa7, 0x7d, 0xc4, 0x9d, 0xcf, 0x39, 0x59, 0xa7, 0xe7, 0x3c, 0x27, 0x44, 0xac, 0xb2, 0xd6, 0x7e, 0x26, 0x50, 0xdc, 0x66, 0x99, 0xee, 0xa4, 0x81, 0x7b, 0xe8, 0xcc, 0x97, 0xb9, + 0x34, 0x48, 0x4b, 0x07, 0x50, 0x7b, 0x19, 0xec, 0xa4, 0x31, 0xc7, 0x18, 0x21, 0xc0, 0xf2, 0x6b, 0xb8, 0x43, 0x60, 0x75, 0x3c, 0x82, 0x97, 0x11, 0xc5, 0xca, 0x54, 0xdf, 0xe9, 0x38, 0x91, 0xd5, + 0xef, 0x92, 0xbe, 0x26, 0xc5, 0x7d, 0x5c, 0x9c, 0xae, 0xc5, 0x72, 0x01, 0x99, 0x68, 0x42, 0x1e, 0x16, 0xf6, 0x6f, 0x98, 0x1b, 0x77, 0xbe, 0xf3, 0x10, 0x19, 0x89, 0x73, 0xf4, 0xb5, 0x15, 0x0f, + 0xcc, 0x33, 0xe7, 0x14, 0x4a, 0x6e, 0x95, 0x0c, 0x97, 0x6a, 0x61, 0x64, 0x80, 0xbe, 0x12, 0x28, 0xd6, 0x29, 0xd3, 0xe2, 0xeb, 0xaf, 0xbe, 0x09, 0x6a, 0x9b, 0x79, 0xa0, 0x9d, 0x22, 0x7b, 0x60, + 0x62, 0xe8, 0xa0, 0xea, 0x29, 0xda, 0x1e, 0xcc, 0xce, 0x71, 0xee, 0x93, 0x9c, 0xbf, 0xb8, 0xdd, 0x0b, 0x75, 0xe5, 0x3d, 0x4e, 0x8d, 0xbf, 0x21, 0xd4, 0x1b, 0x72, 0xb5, 0x9c, 0x7c, 0x5a, 0x6a, + 0x3e, 0xad, 0x35, 0x63, 0xb7, 0x29, 0x1d, 0xa9, 0xe1, 0x17, 0x1f, 0xa9, 0x20, 0xd8, 0x4d, 0x92, 0x5b, 0xfa, 0xf1, 0xcd, 0x7f, 0xc7, 0x1a, 0xb8, 0x3f, 0x54, 0x2e, 0xdf, 0x86, 0xa6, 0x3f, 0x40, + 0xdc, 0xf5, 0xfb, 0x8f, 0x18, 0x3d, 0x82, 0x08, 0x23, 0x23, 0xd0, 0x42, 0xcf, 0x33, 0xb4, 0xcc, 0x29, 0x8c, 0xcb, 0xb7, 0xbb, 0x89, 0x0c, 0x5c, 0xdf, 0xd8, 0x44, 0x08, 0xbe, 0x50, 0xe5, 0x79, + 0x00, 0xf6, 0x29, 0x4b, 0x5c, 0x25, 0x39, 0xc2, 0x0f, 0x73, 0x1c, 0x89, 0xe3, 0xd8, 0xf1, 0xb3, 0xff, 0x4e, 0x7e, 0x1c, 0x51, 0xf7, 0x3f, 0xff, 0x79, 0x0c, 0xf8, 0x2a, 0x0f, 0xf0, 0xf3, 0xfa, + 0x6f, 0xc6, 0x7f, 0x9f, 0x4d, 0xeb, 0xe0, 0x9f, 0xeb, 0x01, 0xe7, 0x4b, 0xff, 0x2b, 0xd6, 0x03, 0x7e, 0xc4, 0x0f, 0xff, 0x8c, 0x12, 0xdf, 0xc7, 0xd8, 0x3d, 0x85, 0xf1, 0x17, 0xeb, 0xe2, 0x2f, + 0x8f, 0x3c, 0x2a, 0xe4, 0x2f, 0x17, 0x5b, 0x6b, 0xe5, 0x51, 0xb9, 0x5c, 0xa2, 0x6b, 0x91, 0xe3, 0x87, 0x88, 0x4d, 0xcf, 0xe5, 0xd4, 0x10, 0x86, 0x38, 0xab, 0xed, 0x98, 0x9a, 0xf4, 0x96, 0xc5, + 0x3c, 0x9c, 0x4e, 0xb8, 0x3c, 0x8f, 0x45, 0x59, 0x0e, 0x97, 0x76, 0x61, 0x0e, 0x7b, 0xf6, 0xd4, 0x91, 0x67, 0x12, 0x1b, 0x96, 0x00, 0xd1, 0xf3, 0xb0, 0x59, 0x56, 0x1d, 0xc6, 0x88, 0xc3, 0x25, + 0xe4, 0x6a, 0x2b, 0x97, 0xbb, 0xac, 0x87, 0x55, 0xb2, 0xe4, 0xda, 0xda, 0xef, 0x6a, 0xe5, 0x1b, 0xcf, 0xe3, 0x57, 0x23, 0x4b, 0xb1, 0xdf, 0x57, 0xc1, 0x77, 0x7e, 0xd5, 0x5c, 0xf9, 0xd9, 0xdd, + 0xe7, 0x2b, 0x67, 0x05, 0xfd, 0x28, 0xfb, 0x1d, 0x6c, 0xde, 0xe8, 0x53, 0x3f, 0xdc, 0xb9, 0xe3, 0x53, 0xe1, 0x3e, 0x50, 0x96, 0xff, 0xa3, 0xf5, 0xed, 0xa7, 0x02, 0x7d, 0xd1, 0x0c, 0xfe, 0xd0, + 0xce, 0x7f, 0xed, 0x9c, 0x3b, 0x3d, 0x06, 0x02, 0xdf, 0x0f, 0x5a, 0xcf, 0x2d, 0xdd, 0x45, 0xe4, 0x91, 0x0d, 0xe1, 0x12, 0x6f, 0xf4, 0xd8, 0x89, 0x8a, 0x9a, 0x90, 0xe4, 0xce, 0x4b, 0xc1, 0xe7, + 0xba, 0x89, 0x56, 0x6a, 0xe8, 0x26, 0x4c, 0x36, 0xb3, 0xb9, 0xc7, 0xd0, 0x2b, 0x71, 0x29, 0x7b, 0x3b, 0x84, 0x8f, 0x96, 0xeb, 0x54, 0xdd, 0x52, 0x06, 0x26, 0xcb, 0x7a, 0x64, 0x9b, 0xf3, 0x12, + 0xed, 0x28, 0xcb, 0xfe, 0x6a, 0x21, 0xe6, 0x03, 0x86, 0x2e, 0x3b, 0x5b, 0x22, 0x5d, 0x74, 0xa8, 0xdf, 0x9d, 0x5b, 0xff, 0x55, 0xe7, 0xcc, 0xad, 0x79, 0xfc, 0xbf, 0x75, 0x2a, 0xfc, 0xf7, 0xb4, + 0x25, 0xdf, 0xa7, 0xc8, 0x3f, 0x8d, 0xc8, 0x8f, 0x4b, 0xff, 0x4b, 0x8d, 0xc8, 0x7b, 0x8c, 0xf0, 0x4f, 0xeb, 0xf1, 0x2e, 0xaa, 0x6e, 0x85, 0xef, 0x5f, 0xab, 0xc4, 0xae, 0x9e, 0x06, 0x81, 0xd7, + 0xe7, 0xad, 0x55, 0x5a, 0x07, 0xd8, 0xec, 0xc6, 0x03, 0x2e, 0xc8, 0xd9, 0xce, 0x3a, 0xdb, 0x4d, 0x62, 0xc6, 0xd6, 0x16, 0xb9, 0x40, 0xe9, 0x39, 0x45, 0x98, 0x15, 0xbb, 0x80, 0xaa, 0x88, 0xa5, + 0x35, 0xc2, 0xa2, 0x16, 0x7a, 0x49, 0x45, 0x83, 0x09, 0x2e, 0x72, 0x4b, 0xd5, 0x18, 0x62, 0xb4, 0x31, 0x9e, 0x99, 0xf5, 0xa8, 0xd2, 0xd9, 0xa1, 0xcc, 0x85, 0x53, 0xcb, 0xf5, 0xc2, 0xc3, 0xa2, + 0xdb, 0xc5, 0x00, 0xdc, 0x83, 0xea, 0xf4, 0x77, 0xa3, 0x69, 0xbf, 0xa1, 0x9c, 0x0a, 0x27, 0x75, 0xb2, 0x30, 0x01, 0xf7, 0x46, 0x75, 0xf9, 0xa3, 0x9f, 0x4d, 0xcc, 0xbf, 0xd3, 0x6f, 0xc8, 0x59, + 0x52, 0x1f, 0xf5, 0x10, 0xf6, 0xa1, 0x87, 0x90, 0xe3, 0xc0, 0x1d, 0x5d, 0xf6, 0x9f, 0xa0, 0x88, 0x7e, 0xc4, 0x9a, 0x67, 0x24, 0xfe, 0xb5, 0x2c, 0x79, 0xb2, 0xf5, 0xc1, 0xd3, 0xff, 0xd6, 0x2c, + 0x98, 0xed, 0xe5, 0x15, 0x63, 0x71, 0x12, 0xaf, 0x17, 0x66, 0x4a, 0x4f, 0x70, 0x6a, 0xa2, 0xc4, 0x87, 0xd0, 0xe5, 0xb9, 0x1e, 0xe0, 0x8f, 0x56, 0xfe, 0xb4, 0xd6, 0x6b, 0x2a, 0x01, 0x72, 0x60, + 0x45, 0xe0, 0x1e, 0x36, 0xe0, 0xf6, 0xcb, 0xa8, 0xa7, 0x4a, 0xc8, 0x38, 0xc2, 0x34, 0x31, 0x8e, 0xbb, 0xab, 0x4e, 0x21, 0xac, 0x58, 0xa6, 0x8b, 0x98, 0x4e, 0x96, 0x8e, 0x6c, 0x9f, 0xaa, 0x44, + 0xb8, 0x38, 0x74, 0x9e, 0xc9, 0xf3, 0xff, 0x8d, 0xf4, 0xbf, 0xb1, 0xd9, 0xfe, 0x03, 0x78, 0xe1, 0xf2, 0x89, 0x67, 0xbe, 0xb8, 0xbc, 0xd6, 0x9a, 0x47, 0xf6, 0x0c, 0xe7, 0x64, 0x13, 0x48, 0xad, + 0xa0, 0x21, 0x4f, 0x59, 0x34, 0xbb, 0x9b, 0x2c, 0x29, 0x85, 0x8f, 0xba, 0xa5, 0x37, 0xa7, 0xf5, 0x30, 0xb5, 0xcd, 0x4d, 0x4d, 0xeb, 0x14, 0xe2, 0x76, 0xa8, 0x80, 0xd8, 0xaf, 0x14, 0x42, 0x53, + 0x86, 0x9b, 0x62, 0x07, 0xcf, 0x8b, 0xde, 0xaa, 0xa7, 0x04, 0x13, 0xa8, 0x17, 0x33, 0xe3, 0xb0, 0x2b, 0x1a, 0x05, 0xbd, 0xd5, 0x20, 0x5f, 0x22, 0x27, 0x93, 0x72, 0xfb, 0x68, 0x65, 0xe8, 0x3f, + 0x51, 0x4c, 0x5d, 0xfc, 0xe8, 0x9b, 0xe8, 0xb2, 0xe5, 0x85, 0xaa, 0x5a, 0x9d, 0xac, 0xe4, 0x2f, 0xb1, 0x64, 0x27, 0x05, 0x8f, 0xe3, 0xbf, 0xce, 0x11, 0xce, 0xab, 0xc1, 0x7f, 0x46, 0x8b, 0xff, + 0x8b, 0x98, 0xd7, 0x5f, 0x67, 0xc7, 0x3f, 0x2d, 0xed, 0x8f, 0x4b, 0xff, 0x4b, 0x2d, 0xed, 0x27, 0x3c, 0xf1, 0x4f, 0xa3, 0xfb, 0x2e, 0xd6, 0x6e, 0x24, 0xe9, 0x5f, 0xab, 0xd4, 0x2e, 0x1f, 0x06, + 0x81, 0x57, 0xa7, 0xad, 0x55, 0x19, 0x1e, 0x1e, 0x90, 0xd4, 0xf5, 0x07, 0xc3, 0xd1, 0xc1, 0xed, 0x71, 0x4c, 0x20, 0xb0, 0xd9, 0xa6, 0xdf, 0xb7, 0x7b, 0xc9, 0x36, 0xe3, 0xbb, 0x48, 0x4f, 0x83, + 0x53, 0x26, 0xca, 0x6b, 0xd8, 0x8c, 0x4d, 0x6c, 0x06, 0x58, 0xd8, 0xb8, 0x3f, 0xa8, 0x96, 0x87, 0x83, 0xda, 0x87, 0x49, 0xb5, 0x2a, 0xe1, 0xfe, 0x3c, 0x9d, 0x05, 0x81, 0x1a, 0xe3, 0xb8, 0xc6, + 0x3b, 0xc5, 0x90, 0xe2, 0x53, 0x04, 0x82, 0x53, 0xf2, 0x59, 0x36, 0xef, 0x9f, 0xa5, 0xca, 0xde, 0xc3, 0x9c, 0xb7, 0xea, 0xeb, 0xb5, 0x68, 0xe7, 0x7f, 0x6f, 0x2b, 0x4b, 0x51, 0xd5, 0xa4, 0x41, + 0xf4, 0x3d, 0x96, 0x43, 0x5e, 0xca, 0x1c, 0x3f, 0x81, 0x84, 0xc0, 0xf7, 0x83, 0x26, 0xb7, 0xa9, 0x85, 0x98, 0x0e, 0x02, 0xa3, 0x03, 0x8d, 0x1c, 0x09, 0xb2, 0xeb, 0x91, 0xbd, 0x23, 0x23, 0x9d, + 0x0b, 0x54, 0x26, 0xab, 0x29, 0xce, 0x9d, 0x2d, 0xf9, 0x64, 0x07, 0xc3, 0x33, 0xa8, 0x2e, 0x66, 0x0b, 0x9f, 0x88, 0xa6, 0xfd, 0xbd, 0x47, 0x1e, 0xf2, 0x41, 0x32, 0x08, 0xb6, 0x01, 0xb4, 0xce, + 0x96, 0xa2, 0x68, 0x8a, 0x59, 0xd7, 0x94, 0x3b, 0x10, 0x32, 0xcf, 0x0c, 0x7b, 0x9f, 0xd6, 0xab, 0x4e, 0xac, 0x2d, 0x1d, 0x07, 0x7e, 0x20, 0xa6, 0xbf, 0xc3, 0x47, 0x9a, 0x25, 0x8a, 0x96, 0x81, + 0x5e, 0x68, 0x59, 0xd7, 0x54, 0xba, 0x4d, 0x3a, 0x7d, 0x05, 0x33, 0xd7, 0xc0, 0x1b, 0x1c, 0x5d, 0x5f, 0x6a, 0xb2, 0x4f, 0x5b, 0x60, 0x0b, 0x65, 0xdc, 0xf9, 0x52, 0x3e, 0x2c, 0x67, 0x85, 0x6d, + 0x4c, 0x8b, 0x81, 0xca, 0xa4, 0x5e, 0x7f, 0xb1, 0x9b, 0xae, 0xf6, 0x09, 0xb0, 0x70, 0x67, 0xd9, 0x34, 0x48, 0x26, 0x33, 0x0c, 0x33, 0x81, 0xf5, 0x68, 0x33, 0xa9, 0x8d, 0x5a, 0x8a, 0x64, 0x2d, + 0x5e, 0x5b, 0x94, 0xab, 0x60, 0x13, 0x5c, 0x67, 0xb6, 0x7e, 0x5d, 0x5b, 0xe5, 0x12, 0x50, 0x60, 0xb4, 0xe3, 0xce, 0x0f, 0xc4, 0x8c, 0x75, 0xb0, 0x71, 0xee, 0x74, 0xbf, 0x4d, 0xa3, 0x51, 0xb4, + 0x30, 0x79, 0x94, 0xd5, 0x41, 0xbd, 0x54, 0x3c, 0xd8, 0x40, 0x3c, 0x22, 0xe1, 0xf8, 0x1f, 0xa4, 0xda, 0x95, 0x0b, 0x06, 0x52, 0x15, 0xc1, 0x21, 0x02, 0xf9, 0xa2, 0xae, 0x2e, 0xa7, 0xc8, 0x6c, + 0x4a, 0xee, 0x87, 0xfb, 0x72, 0x91, 0xf8, 0x96, 0x0c, 0x0b, 0x4b, 0xc8, 0x65, 0xd9, 0x48, 0x74, 0x4a, 0x75, 0xe5, 0x0e, 0xc2, 0xb9, 0x88, 0xeb, 0x1e, 0x63, 0xc7, 0xe3, 0x2c, 0x94, 0x72, 0x36, + 0xe8, 0x4d, 0xf9, 0xda, 0x5a, 0xae, 0x4b, 0x0b, 0x96, 0x37, 0x0e, 0x1b, 0x4a, 0x15, 0xb9, 0x38, 0x08, 0x86, 0x2a, 0xad, 0x6d, 0xfa, 0x99, 0x11, 0xad, 0x5e, 0xe5, 0xb3, 0xfc, 0xf1, 0xc7, 0xaf, + 0x33, 0x32, 0x8e, 0x23, 0xef, 0x98, 0xf9, 0x99, 0xdc, 0xf8, 0xd7, 0xbf, 0xc1, 0x6f, 0x78, 0xab, 0x1a, 0xb9, 0x13, 0x76, 0xdc, 0xf4, 0xf0, 0x00, 0xf7, 0xc4, 0x4b, 0xa6, 0xd4, 0x07, 0xd4, 0x0f, + 0xfc, 0xbb, 0xe9, 0x01, 0x24, 0xda, 0x99, 0x54, 0x3c, 0x3c, 0xcb, 0x7c, 0x08, 0xa7, 0xa6, 0xbc, 0x29, 0xcd, 0x23, 0x51, 0x42, 0xc7, 0x50, 0x38, 0x12, 0x21, 0x4c, 0xda, 0x39, 0x3c, 0xd9, 0x2f, + 0x37, 0x80, 0x31, 0x56, 0x47, 0x13, 0x3b, 0xd5, 0x0f, 0x36, 0xba, 0x59, 0x4e, 0x74, 0x0f, 0xc0, 0xe0, 0x90, 0x56, 0x06, 0xfa, 0x52, 0xf5, 0x89, 0xb1, 0x6a, 0x9a, 0x51, 0xbf, 0xdf, 0xb5, 0x20, + 0x0b, 0xa8, 0x1d, 0xa4, 0x07, 0xb8, 0xc5, 0xd8, 0x56, 0x88, 0xe0, 0x99, 0xf4, 0xff, 0x3e, 0x54, 0xfd, 0x41, 0x90, 0xdb, 0xf8, 0x74, 0x73, 0x44, 0xb7, 0xac, 0x47, 0x3c, 0x15, 0x1b, 0xdc, 0xc3, + 0xf2, 0x7b, 0xf9, 0xc1, 0x8f, 0xd1, 0xec, 0x16, 0xef, 0x35, 0x17, 0x27, 0x00, 0xcf, 0x71, 0xeb, 0x62, 0xe6, 0x7a, 0x62, 0x15, 0xcb, 0x90, 0x40, 0x29, 0x25, 0xa8, 0x76, 0xd5, 0x78, 0x3a, 0x58, + 0xee, 0xc6, 0xea, 0x00, 0x28, 0x82, 0x40, 0xda, 0x15, 0x3d, 0xd8, 0x27, 0x7c, 0x7f, 0xaf, 0x21, 0x4b, 0x1e, 0x08, 0x0e, 0xdd, 0x28, 0xda, 0xb3, 0x13, 0x61, 0x34, 0x81, 0x15, 0x19, 0xd7, 0x55, + 0x6f, 0xcd, 0x8a, 0xe1, 0x60, 0x61, 0xdb, 0x3e, 0xb0, 0xaf, 0x7b, 0xb8, 0xbc, 0xaa, 0xf6, 0x4c, 0x28, 0x58, 0x78, 0xcb, 0x5a, 0x0b, 0x53, 0x49, 0x33, 0x50, 0x37, 0x8c, 0x08, 0x34, 0xe2, 0x5c, + 0xf9, 0x28, 0x2b, 0xbd, 0x49, 0x0b, 0x3a, 0xde, 0x74, 0x5a, 0x0a, 0xcd, 0x14, 0xd5, 0x3b, 0x37, 0x93, 0x70, 0xcc, 0xea, 0x42, 0x89, 0x5e, 0xdc, 0x7f, 0x99, 0x42, 0x99, 0x25, 0xca, 0x11, 0xa7, + 0x27, 0xcd, 0x79, 0x5d, 0x71, 0xdc, 0xa8, 0x38, 0x07, 0x74, 0x4f, 0xaa, 0x18, 0x7f, 0x43, 0xef, 0xd9, 0xc7, 0xdf, 0xea, 0xce, 0x53, 0x59, 0xce, 0x37, 0x3a, 0xf3, 0x5e, 0xdd, 0x8e, 0x11, 0x85, + 0xaa, 0x91, 0x18, 0xf5, 0xde, 0x09, 0xda, 0xf0, 0x47, 0x90, 0x3a, 0xa0, 0xe2, 0x39, 0xd6, 0x23, 0x41, 0xf8, 0x5a, 0x37, 0x80, 0x4f, 0xb0, 0xe7, 0x2e, 0x31, 0xcd, 0x49, 0x9b, 0x8e, 0x00, 0x47, + 0x96, 0x91, 0x23, 0xd6, 0x5b, 0xf3, 0xf1, 0x56, 0xc4, 0xe6, 0x03, 0xc6, 0xe7, 0x1d, 0x55, 0x37, 0x37, 0x75, 0xcc, 0xee, 0x70, 0x2f, 0x70, 0x7b, 0x79, 0x28, 0xd6, 0x2b, 0x62, 0x09, 0x87, 0xbd, + 0x7e, 0x64, 0xea, 0x50, 0x4d, 0xc4, 0xe3, 0xe1, 0x5a, 0x49, 0xf2, 0x7d, 0xe2, 0xe8, 0x1c, 0xee, 0xe6, 0x93, 0x29, 0xda, 0xdf, 0x0a, 0x4e, 0xb9, 0x92, 0x0e, 0x49, 0x67, 0x13, 0x4b, 0x99, 0xb2, + 0x53, 0xe8, 0xed, 0x7c, 0xf7, 0xfa, 0x8a, 0xde, 0x7b, 0x73, 0x91, 0xd2, 0xd1, 0xb3, 0xcf, 0xca, 0xe3, 0x56, 0xb3, 0xef, 0x13, 0x0d, 0x5f, 0xaf, 0x37, 0x09, 0x64, 0x0f, 0x6d, 0xe3, 0x57, 0x2a, + 0xa4, 0x3e, 0xc1, 0x9e, 0xb1, 0xde, 0x9c, 0x80, 0x78, 0xbb, 0xa2, 0x28, 0x44, 0x89, 0x8c, 0x99, 0xb9, 0x15, 0x90, 0xd5, 0x74, 0x11, 0x97, 0x70, 0xd8, 0x19, 0x39, 0xfd, 0x6e, 0x58, 0xac, 0xeb, + 0x8e, 0x40, 0x2c, 0x10, 0xce, 0x02, 0xf0, 0x65, 0xc2, 0x95, 0xa6, 0x60, 0x94, 0x12, 0x19, 0x41, 0x89, 0x2f, 0xe4, 0x86, 0x4a, 0x65, 0x1b, 0xd9, 0x95, 0x90, 0xe4, 0x80, 0x4f, 0xc2, 0x0a, 0xe9, + 0x26, 0x8c, 0x65, 0x85, 0xf1, 0x20, 0x32, 0xe3, 0x58, 0x1f, 0xe1, 0x49, 0x18, 0x3c, 0x6d, 0xb5, 0xf4, 0xcc, 0x41, 0xfc, 0x0d, 0x2c, 0xdf, 0x90, 0xed, 0x3e, 0x77, 0xbf, 0x82, 0xe7, 0x4b, 0xc0, + 0xef, 0x35, 0x84, 0xe7, 0xd3, 0xa6, 0x78, 0xb0, 0x05, 0xae, 0x0b, 0xc5, 0xd4, 0x0a, 0x92, 0x77, 0xd7, 0x32, 0xbf, 0xb0, 0x6a, 0x98, 0x0c, 0x05, 0x68, 0x48, 0x0e, 0x38, 0x26, 0xe9, 0x66, 0x35, + 0x5d, 0xe8, 0xb6, 0xa4, 0xec, 0x07, 0x6e, 0x7f, 0x54, 0x88, 0xc9, 0xb0, 0x4b, 0x56, 0xd8, 0x90, 0xed, 0x23, 0xec, 0x28, 0x98, 0x54, 0x80, 0x34, 0x89, 0x69, 0x7d, 0x39, 0x9e, 0x49, 0x88, 0x0a, + 0xf0, 0xdc, 0x2a, 0xe6, 0xfa, 0x5a, 0xb6, 0xd7, 0xe7, 0x1b, 0x1c, 0x37, 0x90, 0xd7, 0x39, 0xdc, 0xf0, 0x43, 0xf7, 0x93, 0x23, 0x4f, 0x89, 0x20, 0xb7, 0xf1, 0x2b, 0x33, 0xf7, 0xbc, 0xd3, 0x37, + 0x36, 0x6d, 0xe9, 0xa2, 0xf0, 0xbc, 0x92, 0xfa, 0x45, 0x40, 0x9e, 0x8a, 0x2a, 0x8f, 0x64, 0xf9, 0x75, 0x5a, 0x69, 0x45, 0x7e, 0xec, 0x85, 0xfc, 0x3e, 0xe5, 0x3f, 0x5e, 0xe0, 0xbe, 0x89, 0x81, + 0xbe, 0x48, 0xf7, 0x13, 0xd8, 0x8f, 0xca, 0xd1, 0xe6, 0x0d, 0x1a, 0x68, 0xcf, 0x69, 0xce, 0xe5, 0xf3, 0x14, 0xb1, 0x78, 0x95, 0x89, 0x53, 0x81, 0x1f, 0xc9, 0x5e, 0x62, 0x9a, 0xa5, 0x97, 0x5b, + 0xb4, 0x30, 0xdc, 0x6b, 0x41, 0xe4, 0xa6, 0xc4, 0x7a, 0xe6, 0x4f, 0x90, 0x59, 0xd7, 0x06, 0xfc, 0x2e, 0x06, 0xaf, 0x60, 0x6e, 0x19, 0x66, 0x26, 0x27, 0xc3, 0x3a, 0xba, 0x5a, 0xa5, 0xdb, 0x68, + 0xe6, 0xcf, 0x7c, 0x41, 0x18, 0x93, 0x1b, 0x8a, 0xc2, 0x04, 0xa5, 0x8b, 0x8d, 0x01, 0x4f, 0x75, 0x36, 0xcf, 0x0c, 0xbd, 0x27, 0xad, 0x95, 0x3e, 0x49, 0x8e, 0xff, 0xb5, 0x54, 0x6a, 0x22, 0x35, + 0x8f, 0x43, 0x01, 0x2f, 0xf9, 0x65, 0x9f, 0x70, 0xcf, 0xf2, 0xee, 0x74, 0xd6, 0x08, 0xbc, 0x16, 0x56, 0xdf, 0x38, 0xdc, 0xc2, 0x4a, 0x34, 0x50, 0x87, 0xca, 0x6a, 0xcc, 0x88, 0x1e, 0x59, 0xf5, + 0x81, 0x88, 0x1c, 0x77, 0xfb, 0x3b, 0x99, 0x24, 0x49, 0xc8, 0xb6, 0xd9, 0x01, 0x2f, 0x12, 0x59, 0x47, 0xea, 0xbb, 0xea, 0x58, 0xe2, 0x57, 0x2b, 0xc8, 0xa2, 0x05, 0x51, 0xed, 0x73, 0x6a, 0x61, + 0x26, 0x16, 0xbf, 0x2d, 0x46, 0x88, 0x14, 0xc9, 0x91, 0x37, 0x9b, 0x06, 0xe5, 0x28, 0xec, 0x74, 0xbc, 0x2d, 0xd4, 0xed, 0xfa, 0xcf, 0x08, 0xf2, 0x67, 0x21, 0xf4, 0x3b, 0xf5, 0xf1, 0x1b, 0x4a, + 0xfb, 0x8e, 0xfa, 0x68, 0xa1, 0xb4, 0x11, 0x90, 0x92, 0x84, 0x6d, 0x59, 0x8d, 0x06, 0x4b, 0xcc, 0x1b, 0xa8, 0x5d, 0x7e, 0xa3, 0x74, 0x50, 0x94, 0x51, 0x52, 0x0c, 0x95, 0xad, 0x0b, 0x7c, 0xfc, + 0x09, 0xdd, 0x5f, 0x9e, 0x77, 0xb6, 0xc3, 0xdf, 0x5e, 0xa9, 0x7d, 0x78, 0xdc, 0xd9, 0xae, 0x81, 0xf7, 0x9c, 0x9b, 0x6a, 0x95, 0xe9, 0x24, 0xec, 0xb8, 0xbb, 0x44, 0x12, 0xd5, 0x75, 0xd6, 0x9c, + 0x8a, 0xda, 0x31, 0xdf, 0x1f, 0x8a, 0xbb, 0xc9, 0xc1, 0xca, 0xf6, 0xb4, 0xb8, 0x9a, 0x1f, 0x64, 0x6c, 0x24, 0x97, 0x1c, 0xd6, 0x27, 0xc5, 0xec, 0xa0, 0x6e, 0x65, 0x89, 0x0d, 0x82, 0x85, 0x83, + 0x4c, 0xf6, 0x07, 0x60, 0xc4, 0x85, 0xb6, 0x3e, 0xf3, 0xfa, 0x11, 0x8a, 0xa2, 0xe5, 0xba, 0x3b, 0x19, 0xd9, 0x86, 0x3c, 0x96, 0x16, 0xbd, 0x96, 0x76, 0xee, 0xd7, 0x36, 0x76, 0xe8, 0x4b, 0x55, + 0x4b, 0xbf, 0x5f, 0x3f, 0x7e, 0x6a, 0x3a, 0x77, 0x81, 0xbe, 0xff, 0xf7, 0xbb, 0x65, 0xfa, 0x37, 0xa4, 0x15, 0x71, 0xab, 0x73, 0x7f, 0x97, 0x47, 0xea, 0xfa, 0x15, 0x39, 0x71, 0x02, 0xda, 0x90, + 0xf5, 0x74, 0xd8, 0xb6, 0xc6, 0xdf, 0x17, 0x68, 0x02, 0x45, 0xa3, 0x74, 0xce, 0xc6, 0xf5, 0x1a, 0x20, 0x27, 0x76, 0xe8, 0x6f, 0x89, 0xd2, 0x8a, 0x50, 0x62, 0xb7, 0x76, 0x54, 0xd7, 0xa6, 0x37, + 0x2e, 0x8a, 0x8d, 0x88, 0xf9, 0x6c, 0x3f, 0x8b, 0xa2, 0xc5, 0x7a, 0xe1, 0x56, 0x3c, 0x87, 0x76, 0x51, 0x9f, 0x19, 0xfb, 0x9b, 0x81, 0x02, 0xf0, 0x22, 0x65, 0xa2, 0x1c, 0x39, 0x11, 0xed, 0x8e, + 0xbb, 0x67, 0x58, 0xa3, 0x9a, 0xec, 0xb3, 0xda, 0x7d, 0x66, 0x12, 0x3d, 0x26, 0x73, 0x10, 0x26, 0xbe, 0xe2, 0x39, 0xb5, 0x01, 0x46, 0xca, 0x95, 0x29, 0x7a, 0xa1, 0x7c, 0x23, 0x47, 0x0b, 0x3f, + 0x7b, 0xe4, 0x9c, 0x8a, 0x89, 0x7f, 0xca, 0x06, 0xad, 0x6a, 0x37, 0x95, 0x44, 0xb3, 0xab, 0x87, 0x81, 0xb6, 0x97, 0x04, 0xd0, 0x11, 0xe2, 0x91, 0x4a, 0xc7, 0xff, 0x20, 0xd2, 0x46, 0xec, 0x00, + 0x9a, 0xcb, 0x88, 0x88, 0x29, 0x0c, 0x75, 0x83, 0x16, 0x89, 0x64, 0x68, 0x54, 0x07, 0x27, 0xd2, 0xf8, 0x81, 0xdb, 0xeb, 0x7e, 0x1b, 0xfa, 0x49, 0x1e, 0xaf, 0xe3, 0xbc, 0xd2, 0xf7, 0x4d, 0x49, + 0x9a, 0xd8, 0x57, 0x62, 0x35, 0xaa, 0xa7, 0x45, 0x8b, 0x3d, 0x82, 0x5e, 0x74, 0x24, 0x2e, 0x1e, 0xc0, 0xdb, 0x03, 0x4a, 0xed, 0xca, 0xd9, 0x22, 0xeb, 0x98, 0xe3, 0x83, 0x53, 0xb8, 0x3b, 0x0f, + 0xc7, 0xd0, 0x1d, 0x5b, 0x9a, 0x9c, 0x60, 0xca, 0x00, 0x85, 0xcc, 0xbb, 0xf1, 0x2a, 0x91, 0x0d, 0x93, 0x9a, 0x24, 0xbc, 0x24, 0x63, 0x93, 0xe1, 0x64, 0x5a, 0xb2, 0x0b, 0xbc, 0x3f, 0x11, 0x99, + 0xc8, 0x9b, 0x11, 0x18, 0x26, 0x1f, 0xe8, 0x0e, 0xb1, 0x30, 0xa6, 0xec, 0xb0, 0xf8, 0x71, 0x4d, 0x9d, 0x92, 0x58, 0x4d, 0x22, 0xd1, 0x37, 0x54, 0x44, 0x5e, 0x21, 0xe3, 0x09, 0xea, 0x09, 0x23, + 0xcd, 0x21, 0x78, 0x02, 0xf5, 0x1c, 0x2f, 0x21, 0x31, 0x0f, 0x2b, 0x32, 0x13, 0x07, 0xf8, 0x62, 0x02, 0xf5, 0xa7, 0x7b, 0xb6, 0x2b, 0x92, 0xf3, 0xda, 0x75, 0x94, 0xbd, 0xbc, 0x40, 0x89, 0xf9, + 0x64, 0xd7, 0x4f, 0x34, 0x21, 0xcb, 0xc6, 0xb1, 0xaa, 0xeb, 0x34, 0xb3, 0x49, 0x82, 0x2e, 0x60, 0x0e, 0x6a, 0x82, 0x72, 0x44, 0x62, 0xa6, 0xc2, 0x64, 0x54, 0x30, 0x83, 0xc2, 0x23, 0x2c, 0x09, + 0x66, 0x70, 0x5a, 0x1f, 0x7b, 0xa9, 0xb7, 0x2d, 0xc2, 0xe5, 0xeb, 0x13, 0x2e, 0x8d, 0x12, 0x27, 0xc8, 0xcc, 0x77, 0x27, 0xfe, 0x1f, 0x48, 0xd3, 0xb0, 0xba, 0xcd, 0xd4, 0x48, 0x94, 0x0a, 0xcc, + 0x83, 0x13, 0x1e, 0xef, 0xa1, 0x16, 0x7d, 0xc9, 0xf1, 0xb8, 0x80, 0xdb, 0x20, 0xf7, 0xe3, 0xac, 0x59, 0x2f, 0x6a, 0x81, 0xde, 0xe1, 0xa0, 0x3a, 0x84, 0xd3, 0xe5, 0x6e, 0x55, 0xb1, 0x02, 0x99, + 0x66, 0x2b, 0x83, 0xec, 0x8d, 0xad, 0x40, 0xc7, 0x7b, 0xa1, 0x51, 0x76, 0x47, 0x54, 0x2d, 0xe8, 0x66, 0x3c, 0x05, 0xf6, 0x03, 0x37, 0xf0, 0x64, 0x9f, 0xe1, 0x6a, 0x48, 0x9b, 0x13, 0x91, 0x49, + 0x27, 0x90, 0x36, 0xc7, 0x37, 0x31, 0x09, 0xa7, 0x13, 0x28, 0x82, 0x47, 0x7b, 0xcd, 0x5d, 0xf5, 0x7a, 0xb3, 0x72, 0x81, 0x0d, 0xfa, 0xc9, 0xa8, 0x7a, 0xe6, 0x76, 0xb4, 0xd6, 0x39, 0xdf, 0x20, + 0x34, 0xcd, 0x92, 0xa6, 0x6a, 0xeb, 0xb1, 0xcd, 0x83, 0xbe, 0x26, 0x72, 0x2e, 0x00, 0x1f, 0x51, 0x7a, 0x71, 0xda, 0x44, 0xae, 0x5b, 0xe0, 0x54, 0xa6, 0x32, 0xa1, 0x44, 0xaa, 0x6c, 0xb9, 0xcd, + 0x08, 0x37, 0x16, 0xb4, 0xe9, 0x0c, 0x98, 0x4a, 0x99, 0xb1, 0x42, 0xd6, 0xb9, 0xc8, 0x77, 0x76, 0x30, 0x9a, 0xe7, 0xe3, 0x8c, 0x97, 0x90, 0x45, 0x41, 0x76, 0xdc, 0xad, 0xc4, 0xf3, 0x16, 0xa1, + 0x39, 0xea, 0xa4, 0x1c, 0x8c, 0xc3, 0x92, 0xae, 0x6a, 0x79, 0x06, 0x18, 0x5d, 0x0d, 0xa1, 0x7b, 0xfe, 0x64, 0x30, 0x53, 0x3c, 0x58, 0x8d, 0x30, 0x32, 0x29, 0x9e, 0x2d, 0xc7, 0xfe, 0x29, 0x38, + 0xad, 0x02, 0x6d, 0xef, 0x3c, 0x6a, 0x43, 0x01, 0xbf, 0xd4, 0x8c, 0xea, 0x0c, 0xb4, 0xc1, 0xe5, 0xe9, 0xb0, 0x69, 0x9b, 0xf7, 0x54, 0x90, 0x1f, 0x08, 0x4a, 0x36, 0x31, 0x1a, 0xae, 0x70, 0x3a, + 0x09, 0xd5, 0x6a, 0xbb, 0x9f, 0xd4, 0x9c, 0xbc, 0xd7, 0x27, 0x0b, 0x6c, 0xff, 0xad, 0x20, 0xcf, 0x42, 0xdf, 0xd1, 0xc0, 0xd4, 0x33, 0x8c, 0xe8, 0xcf, 0xd5, 0x45, 0x17, 0x80, 0x8f, 0x1f, 0x73, + 0x71, 0xda, 0x46, 0x33, 0x35, 0xd9, 0x31, 0xe2, 0xd4, 0xe5, 0xe2, 0xae, 0x4d, 0x45, 0x07, 0x78, 0xbb, 0x11, 0x47, 0x00, 0x2e, 0xa9, 0x75, 0xe8, 0xcc, 0xa1, 0x60, 0xb9, 0x1f, 0x76, 0x37, 0x62, + 0xae, 0xa3, 0x79, 0x11, 0x8c, 0xe3, 0x9c, 0x43, 0xa0, 0x03, 0xa1, 0x50, 0x3d, 0x49, 0x16, 0xc6, 0x4b, 0xb8, 0xab, 0xd5, 0x31, 0x0f, 0x4b, 0x01, 0x49, 0x85, 0x3b, 0x68, 0xb9, 0x94, 0x90, 0x89, + 0xba, 0xe2, 0x15, 0x57, 0x8e, 0x22, 0x6c, 0xd4, 0xc9, 0xae, 0x18, 0xe3, 0x19, 0x17, 0xb4, 0x0d, 0x53, 0xe5, 0x59, 0xa8, 0x29, 0x41, 0xf0, 0x50, 0x5a, 0xe1, 0x6f, 0xe4, 0x2b, 0x28, 0xfc, 0x00, + 0x7b, 0x44, 0xe0, 0xc7, 0x09, 0xd8, 0x40, 0x7b, 0x8e, 0xbe, 0x68, 0x33, 0xec, 0x31, 0x63, 0xbb, 0xa3, 0xee, 0x25, 0x83, 0xdb, 0xee, 0x5c, 0x44, 0x9c, 0xa0, 0x0c, 0xb3, 0x33, 0xb6, 0x4b, 0x65, + 0xb2, 0x57, 0xe7, 0x4e, 0x85, 0x89, 0x32, 0x55, 0x88, 0x73, 0x44, 0x8d, 0xa9, 0x62, 0x73, 0x18, 0xce, 0xe8, 0x39, 0xe0, 0xb0, 0x3e, 0x57, 0x31, 0x6c, 0x96, 0xdb, 0xe8, 0x4c, 0x18, 0x3b, 0x1b, + 0x6f, 0xe0, 0x39, 0xfb, 0xad, 0x82, 0x44, 0xf0, 0x64, 0xb5, 0xda, 0x61, 0x4b, 0xbd, 0x6c, 0x69, 0x4f, 0x7f, 0x74, 0xeb, 0xfe, 0x62, 0x5f, 0x69, 0x9e, 0x03, 0x36, 0x61, 0x62, 0xec, 0xd7, 0x29, + 0xe6, 0x4b, 0x5c, 0x47, 0x4a, 0x34, 0x2f, 0x0c, 0x8c, 0x77, 0xdb, 0x0b, 0xb9, 0xce, 0xe5, 0x39, 0x59, 0xe9, 0xef, 0xc9, 0x0b, 0xcd, 0x2d, 0xc8, 0x6d, 0x2c, 0x5a, 0x4b, 0xc2, 0x34, 0x05, 0x95, + 0xc4, 0x2a, 0xde, 0xc7, 0x6f, 0x9e, 0x6e, 0x86, 0x89, 0x0f, 0xea, 0x4a, 0xa6, 0xbc, 0x3f, 0xe1, 0xe6, 0xe1, 0xb6, 0x92, 0x82, 0xcd, 0xbc, 0x03, 0xed, 0x30, 0xdc, 0xa7, 0xf7, 0x61, 0xd8, 0x7a, + 0x02, 0xda, 0x4e, 0x9a, 0x85, 0x56, 0xa2, 0xf8, 0xe7, 0xf8, 0x34, 0x72, 0xdb, 0xff, 0xe3, 0xfa, 0xae, 0xc8, 0x48, 0x34, 0x23, 0xc8, 0x9c, 0xa3, 0x3f, 0x14, 0xaa, 0xee, 0xaf, 0xbb, 0x71, 0x9f, + 0x23, 0x2f, 0x80, 0xef, 0xc5, 0x1b, 0xef, 0x60, 0x8f, 0xe8, 0xb9, 0xc2, 0x81, 0x5d, 0x45, 0x46, 0xe2, 0xe8, 0x1f, 0x00, 0xae, 0xca, 0x8d, 0x4e, 0x69, 0xb2, 0x9f, 0xc6, 0xed, 0x97, 0x27, 0x34, + 0x0d, 0x20, 0x9d, 0xf4, 0x8c, 0xbc, 0x9b, 0xed, 0x3d, 0xc2, 0x00, 0x0c, 0x8c, 0x0c, 0xf4, 0x9c, 0x34, 0x33, 0x82, 0xfb, 0xf8, 0x6d, 0xf6, 0x86, 0xa8, 0x40, 0xb5, 0xca, 0x4e, 0x6b, 0xe9, 0xef, + 0x2d, 0xa0, 0xaf, 0xee, 0x08, 0xad, 0xc4, 0x48, 0xd3, 0xfb, 0x6f, 0x98, 0x18, 0x47, 0x56, 0x4d, 0x0a, 0xe5, 0xb3, 0x5b, 0x10, 0x7c, 0x3d, 0x7e, 0x6e, 0xb7, 0x71, 0xe7, 0xed, 0x8f, 0x43, 0xa7, + 0x60, 0xe1, 0xaf, 0x8f, 0x75, 0x9d, 0xaf, 0xb6, 0xf9, 0xd7, 0xa5, 0xb9, 0xcb, 0xe9, 0x79, 0x71, 0xf6, 0xe6, 0xb6, 0x69, 0xcc, 0x75, 0x31, 0x0b, 0xaf, 0xae, 0x7f, 0xd7, 0x6f, 0xfc, 0xb5, 0xf8, + 0xc1, 0x75, 0xbf, 0xf1, 0x16, 0x51, 0x83, 0x26, 0xef, 0x82, 0xc3, 0x18, 0x72, 0x63, 0xe2, 0x08, 0x3f, 0xdd, 0xcd, 0xfb, 0x7a, 0x5a, 0xfb, 0x5c, 0x2c, 0xb0, 0x83, 0x98, 0x58, 0xaf, 0xa1, 0x5c, + 0xe8, 0x32, 0x28, 0x85, 0x8d, 0x47, 0x13, 0x7f, 0x0a, 0x60, 0x6e, 0xd7, 0xb3, 0xe9, 0x2d, 0x1e, 0x73, 0x99, 0x9e, 0x59, 0xec, 0x1c, 0x33, 0x0f, 0x99, 0x3a, 0xe9, 0x09, 0xf5, 0xe2, 0x80, 0xa2, + 0x92, 0x6e, 0x07, 0x9c, 0x36, 0x2e, 0x72, 0x34, 0x47, 0xcc, 0xf5, 0x6d, 0x0f, 0xc2, 0x6f, 0x23, 0x60, 0x17, 0xcd, 0xc5, 0xf1, 0x5b, 0x6a, 0xde, 0x69, 0x19, 0x4e, 0xbd, 0x14, 0x26, 0x6b, 0xa5, + 0x8f, 0x0b, 0xc5, 0xf1, 0x9a, 0xf5, 0xa7, 0xac, 0x8a, 0x0c, 0x1d, 0x6c, 0xcc, 0xbb, 0x47, 0x31, 0x8e, 0xeb, 0xee, 0xe6, 0x6d, 0x29, 0x74, 0xff, 0x11, 0x47, 0xe9, 0x7c, 0x77, 0xa0, 0x51, 0x74, + 0xc4, 0x73, 0x1a, 0x72, 0x02, 0x07, 0xf3, 0x8e, 0x88, 0x93, 0x86, 0x13, 0x19, 0xb5, 0xb3, 0x58, 0x22, 0x93, 0xd9, 0x0c, 0x5a, 0x2c, 0x4d, 0x6e, 0x05, 0xa7, 0xb9, 0x39, 0x5a, 0x6c, 0x7d, 0x77, + 0x61, 0x15, 0xeb, 0x34, 0x5c, 0xa1, 0x59, 0x7c, 0xd0, 0x32, 0xc9, 0xe8, 0x2e, 0x0c, 0x77, 0xa3, 0x99, 0x62, 0x76, 0xd8, 0xf1, 0x71, 0x6f, 0x29, 0x20, 0xab, 0x83, 0x44, 0xa7, 0x11, 0x3a, 0x4d, + 0x16, 0xcc, 0x26, 0x1a, 0xee, 0xc8, 0xb4, 0xfc, 0x81, 0xa2, 0xfb, 0xe3, 0xae, 0x93, 0xfb, 0xc3, 0xc8, 0xc5, 0xc7, 0x0a, 0x9a, 0xe7, 0xda, 0x4a, 0xa2, 0xb6, 0xa2, 0x58, 0xe1, 0x84, 0x0f, 0x08, + 0x44, 0x35, 0xeb, 0x7d, 0x3f, 0x27, 0x50, 0xe1, 0x84, 0x0d, 0x3d, 0x0a, 0x27, 0x04, 0x1b, 0x18, 0xcf, 0xd1, 0xbf, 0xdd, 0xa0, 0xac, 0xc0, 0xfa, 0xb2, 0xc2, 0xfa, 0x2c, 0x9b, 0x8e, 0x94, 0xb1, + 0x32, 0xe1, 0x0f, 0xdd, 0x7a, 0x56, 0xf6, 0x31, 0xca, 0xdc, 0x3a, 0x08, 0x3f, 0x38, 0x88, 0xd3, 0xc2, 0xd0, 0xa7, 0x91, 0xe1, 0xa4, 0x13, 0xdd, 0x3f, 0xc8, 0x81, 0xea, 0x0d, 0x34, 0xcc, 0x8e, + 0x86, 0x9b, 0x5d, 0xe0, 0xcd, 0x00, 0x7e, 0xba, 0x3a, 0xc8, 0xa9, 0x52, 0xdb, 0x38, 0xb6, 0xd9, 0x8a, 0x43, 0x6b, 0x1b, 0xa9, 0x71, 0x4b, 0x45, 0x79, 0x0e, 0x02, 0xdc, 0x51, 0x33, 0x97, 0xa9, + 0xb2, 0xb7, 0x5a, 0xec, 0xaa, 0xb7, 0xd4, 0x95, 0x80, 0x8e, 0x73, 0x23, 0x37, 0x40, 0xdf, 0xd1, 0x92, 0x30, 0x53, 0xd2, 0xfd, 0x87, 0x94, 0x6d, 0xe5, 0x76, 0x35, 0xd8, 0xbb, 0xba, 0xf4, 0x2c, + 0x65, 0xf3, 0xe7, 0xae, 0xfe, 0xd7, 0x94, 0xcd, 0x16, 0xee, 0x3e, 0x54, 0x1f, 0x4a, 0x02, 0x28, 0x6c, 0x64, 0x69, 0x16, 0x00, 0x2e, 0x05, 0x94, 0x42, 0x04, 0xa9, 0xaa, 0x8d, 0xf9, 0x99, 0xb2, + 0x28, 0x58, 0xce, 0x0e, 0xdd, 0x80, 0xec, 0xf7, 0xbc, 0x4e, 0x91, 0x47, 0x25, 0x8f, 0xae, 0xd9, 0x05, 0x97, 0xf5, 0x9c, 0x5e, 0x16, 0x27, 0x34, 0xd7, 0xcf, 0xea, 0x5d, 0x7f, 0xaa, 0xd7, 0x24, + 0x36, 0x61, 0xf6, 0x07, 0x43, 0xa3, 0xb8, 0x5d, 0xae, 0xa1, 0x6e, 0x18, 0x90, 0x52, 0x3b, 0x12, 0xfd, 0x4f, 0xca, 0xcf, 0xbc, 0x43, 0xe1, 0xff, 0xa1, 0x09, 0x98, 0x8f, 0x71, 0xa0, 0x2a, 0x9e, + 0x12, 0x68, 0x86, 0x0e, 0x7e, 0x17, 0x29, 0x7d, 0xcd, 0xe9, 0xb9, 0x06, 0x0d, 0x81, 0x37, 0x17, 0xda, 0x38, 0x3e, 0x08, 0xe8, 0xa8, 0xcb, 0xb9, 0xaf, 0xa4, 0x09, 0xb5, 0x0f, 0x8c, 0xfe, 0x9e, + 0xb4, 0x78, 0x3c, 0x98, 0xce, 0x1d, 0xe4, 0x90, 0xa1, 0xda, 0x0f, 0xc3, 0x53, 0xaa, 0x92, 0x1a, 0x24, 0x7e, 0x32, 0x25, 0xef, 0x7f, 0x24, 0xf1, 0x42, 0x38, 0xf8, 0x03, 0x6a, 0xf3, 0x7d, 0xef, + 0xc7, 0x60, 0x03, 0xeb, 0x39, 0xbd, 0xbb, 0x7c, 0xa4, 0xec, 0xbc, 0x61, 0x40, 0x67, 0xf8, 0x62, 0xad, 0x4e, 0x87, 0x6c, 0x05, 0xa8, 0x04, 0xc0, 0xf3, 0x56, 0x31, 0xc7, 0x8b, 0x24, 0xe5, 0xe8, + 0x42, 0x2d, 0x12, 0xd5, 0x91, 0xc6, 0x51, 0x4a, 0x99, 0x3c, 0xb7, 0xdc, 0xbb, 0x7b, 0x2e, 0xa9, 0x48, 0xd7, 0x81, 0x93, 0xd5, 0xd8, 0x65, 0xe1, 0x7d, 0xad, 0x8a, 0xc6, 0x6c, 0x52, 0xd6, 0x87, + 0x98, 0x76, 0xaa, 0x28, 0xc4, 0x91, 0xd8, 0xd8, 0x5c, 0xc5, 0xed, 0x3e, 0xb5, 0xd6, 0xff, 0xe7, 0x63, 0x66, 0x5c, 0x4d, 0x9f, 0x87, 0xd9, 0x21, 0xed, 0xb4, 0x9b, 0x69, 0x1c, 0x5d, 0x8c, 0x5f, + 0x9f, 0xb3, 0xee, 0xff, 0x7c, 0xff, 0x98, 0x48, 0xc9, 0x12, 0x23, 0x0c, 0xbe, 0x7d, 0x4e, 0x59, 0x96, 0x6f, 0xef, 0xf7, 0x35, 0x0f, 0xfb, 0xe9, 0x33, 0xb4, 0x30, 0x48, 0x73, 0x2f, 0x3b, 0x7e, + 0xf6, 0x77, 0x8f, 0x39, 0x81, 0x3d, 0x2d, 0xc5, 0xbe, 0x3b, 0x51, 0x5f, 0x84, 0xc7, 0xff, 0xf7, 0x1b, 0x76, 0x72, 0x02, 0x25, 0xa9, 0x40, 0xe3, 0x90, 0x19, 0xc1, 0x91, 0x85, 0xbe, 0x13, 0x1c, + 0x2f, 0xcc, 0x9d, 0x5b, 0xe8, 0x47, 0xf6, 0xba, 0xbd, 0xd6, 0x36, 0x4e, 0x87, 0xec, 0x5c, 0xda, 0xee, 0x48, 0x80, 0xc4, 0xf5, 0x89, 0x7e, 0x6d, 0x0b, 0x29, 0xa4, 0x75, 0x00, 0x72, 0x15, 0x64, + 0x2a, 0x47, 0x08, 0xfb, 0xb9, 0x39, 0x2f, 0x15, 0x8d, 0xe6, 0xc2, 0x9e, 0xdf, 0x91, 0xcd, 0x15, 0x23, 0x53, 0x99, 0x4c, 0x10, 0x3b, 0x6d, 0xb0, 0xee, 0xd6, 0x3d, 0x03, 0x57, 0xb7, 0xa9, 0x2e, + 0x0d, 0x7b, 0x7b, 0x20, 0xed, 0x2c, 0x88, 0x32, 0x9d, 0xf2, 0x6b, 0x5d, 0x4e, 0x4a, 0x38, 0xfb, 0x0f, 0x88, 0x29, 0xa9, 0x4e, 0x90, 0x25, 0xc6, 0xc3, 0x95, 0x39, 0xe4, 0xa5, 0x2c, 0xd3, 0x33, + 0xd0, 0x13, 0x42, 0x9b, 0xc3, 0x53, 0x3c, 0xf9, 0x99, 0x24, 0xe2, 0xfc, 0xb5, 0xe6, 0x13, 0xe5, 0x5e, 0x34, 0xe2, 0x44, 0x99, 0x74, 0xba, 0xe3, 0x6a, 0x9c, 0xf1, 0xc8, 0xc6, 0x9d, 0x2f, 0xa4, + 0x6f, 0x05, 0x6c, 0x78, 0x30, 0x1e, 0x47, 0x42, 0x5e, 0x49, 0x1c, 0x68, 0x20, 0x1e, 0x5f, 0xff, 0xf8, 0x1f, 0xc4, 0xdb, 0xa5, 0x0b, 0x18, 0x0c, 0x9e, 0x2f, 0x3b, 0xf3, 0x41, 0x6d, 0xa1, 0xa1, + 0x1e, 0xf5, 0xe6, 0x24, 0xaa, 0x32, 0xe5, 0x62, 0x52, 0xac, 0x8c, 0x01, 0x0b, 0x6c, 0xd4, 0xb9, 0xeb, 0x56, 0x55, 0xdf, 0x1e, 0xa4, 0x7c, 0xa0, 0xd1, 0x65, 0x04, 0xf9, 0x30, 0x60, 0x4b, 0xa9, + 0xb0, 0x2a, 0x56, 0x06, 0x36, 0x44, 0xd7, 0x30, 0x47, 0x14, 0x25, 0x1c, 0x30, 0xfa, 0x14, 0xb1, 0xd9, 0x71, 0x28, 0x87, 0x84, 0xcf, 0x1b, 0xf9, 0xe8, 0x19, 0x0f, 0x3c, 0x71, 0x96, 0xce, 0x99, + 0x62, 0xf7, 0xe2, 0x22, 0x8a, 0x6f, 0x78, 0x9a, 0xf2, 0x9e, 0x0a, 0x77, 0x9d, 0xc3, 0xf9, 0x3c, 0xa2, 0x72, 0xc4, 0xcc, 0xd9, 0xe5, 0x46, 0xbf, 0x66, 0x93, 0x5c, 0x65, 0x5f, 0x7d, 0x71, 0xd3, + 0x32, 0x23, 0xf1, 0xc1, 0xd4, 0xa9, 0x3f, 0xc3, 0x2e, 0xd7, 0xc3, 0x77, 0xfa, 0xca, 0x5f, 0x0c, 0x97, 0x8e, 0x6e, 0xa4, 0x19, 0xe8, 0x39, 0xef, 0x61, 0x1b, 0xec, 0x37, 0x3d, 0xbc, 0x3b, 0x92, + 0xfc, 0x67, 0xfe, 0xc7, 0x0f, 0x3b, 0x6f, 0x9f, 0x98, 0x2b, 0xf8, 0x51, 0x82, 0x00, 0xf1, 0x92, 0x79, 0xf0, 0x28, 0x41, 0x80, 0x78, 0x6e, 0x16, 0x1c, 0x19, 0x5a, 0xdd, 0x91, 0xa6, 0x4b, 0x90, + 0xd3, 0x95, 0x04, 0xdb, 0x2b, 0x84, 0x77, 0xfb, 0x22, 0x27, 0xe5, 0xe3, 0xbe, 0x51, 0xc7, 0xbc, 0x9e, 0x74, 0xab, 0xbe, 0x3e, 0x32, 0x8a, 0x2e, 0xe7, 0xc4, 0xc9, 0x66, 0x58, 0x2e, 0x3c, 0xd5, + 0x67, 0x44, 0x61, 0x18, 0x11, 0xca, 0x1e, 0x35, 0x71, 0x78, 0xe6, 0xd3, 0xe3, 0x65, 0xbf, 0x12, 0x50, 0x3f, 0x3e, 0xec, 0x07, 0x64, 0x60, 0xed, 0x87, 0x53, 0x04, 0x31, 0x21, 0xef, 0xd9, 0xda, + 0x4e, 0x6b, 0xb2, 0xfd, 0x08, 0xc1, 0xff, 0x8b, 0x82, 0x27, 0x3f, 0x15, 0x11, 0xff, 0x65, 0xe2, 0x29, 0x77, 0xc8, 0x76, 0x9d, 0xe6, 0x76, 0x8f, 0x78, 0xf4, 0x4b, 0xc4, 0xbb, 0x80, 0x0b, 0x81, + 0x97, 0x67, 0x20, 0xdd, 0x8e, 0x90, 0xc2, 0xc2, 0xdd, 0xd5, 0xda, 0x46, 0x9c, 0x76, 0x61, 0xa3, 0xec, 0x0e, 0xa3, 0x1a, 0x16, 0x0e, 0xd1, 0xae, 0x5f, 0x94, 0x16, 0x59, 0xb9, 0x15, 0x22, 0x0e, + 0xb0, 0x43, 0x66, 0x84, 0x71, 0x4d, 0xe2, 0xf8, 0x9a, 0x0d, 0xa1, 0xf9, 0xcc, 0x0a, 0x12, 0x04, 0x1a, 0x0c, 0x32, 0xc0, 0xd1, 0x30, 0x67, 0xbc, 0xac, 0x25, 0xba, 0x97, 0x63, 0x4b, 0x5d, 0x40, + 0xf0, 0x85, 0x52, 0x06, 0xeb, 0x95, 0x3f, 0xe8, 0x91, 0x3f, 0x5e, 0x0e, 0xbe, 0x83, 0xb1, 0xc7, 0x79, 0x7f, 0x7f, 0x1e, 0xeb, 0x3f, 0x78, 0xc6, 0xa9, 0x5b, 0xf3, 0xbd, 0x91, 0xb6, 0xd3, 0xa3, + 0xae, 0x7c, 0x9f, 0x00, 0x72, 0x20, 0x65, 0xd3, 0xc5, 0xa6, 0xe2, 0x3a, 0xb1, 0xa8, 0x18, 0xee, 0x1a, 0xe3, 0xfa, 0x85, 0xcd, 0xf2, 0x9a, 0xc7, 0xeb, 0x4e, 0xbd, 0x53, 0xc6, 0xab, 0x7c, 0xd8, + 0xa5, 0xb1, 0xf9, 0xc4, 0x55, 0xa9, 0x60, 0x91, 0x0f, 0x02, 0x5d, 0x67, 0x87, 0x83, 0x02, 0xb6, 0xf7, 0x00, 0xbf, 0xa3, 0x18, 0xa1, 0xeb, 0xa5, 0x1b, 0x83, 0xc7, 0x57, 0x86, 0x45, 0xf6, 0xd6, + 0xe4, 0x56, 0x7a, 0x36, 0x3d, 0xfe, 0x1a, 0xce, 0x6d, 0x91, 0xcb, 0xfa, 0x9a, 0x69, 0xf2, 0x5d, 0x2e, 0x6b, 0x4b, 0x43, 0xa5, 0x5e, 0xd5, 0xc4, 0x98, 0x03, 0x32, 0x2b, 0xce, 0x72, 0xce, 0x15, + 0xec, 0x72, 0x64, 0x11, 0x79, 0x7f, 0xbd, 0xc6, 0xf4, 0x2c, 0x96, 0x3b, 0x95, 0x34, 0xf6, 0xe4, 0xb5, 0x19, 0xe3, 0x23, 0x18, 0x81, 0x78, 0x62, 0xa6, 0xb8, 0xc4, 0x6a, 0xe8, 0x52, 0xeb, 0x2a, + 0x91, 0xa6, 0xe3, 0xa2, 0x56, 0xca, 0xc5, 0xda, 0xe3, 0xa3, 0xa9, 0xda, 0x8d, 0x54, 0x93, 0x83, 0x7b, 0x3a, 0x59, 0x8d, 0x35, 0x00, 0x31, 0x9e, 0xa1, 0xb9, 0x7d, 0x2e, 0x2b, 0x7d, 0x6b, 0x6f, + 0x7c, 0x97, 0xcb, 0xfa, 0xb5, 0x93, 0xe7, 0x75, 0x2e, 0xeb, 0x83, 0x98, 0xfd, 0x5f, 0x47, 0xf4, 0x6f, 0xd3, 0x58, 0xc9, 0x97, 0xe6, 0xdb, 0xa3, 0x34, 0x56, 0xb2, 0xdd, 0xac, 0xea, 0xe6, 0x05, + 0xbf, 0x4c, 0x96, 0xa6, 0x24, 0xee, 0xc4, 0x91, 0x96, 0xa9, 0x73, 0x84, 0x87, 0x76, 0x83, 0xe5, 0x1c, 0xa1, 0x08, 0x72, 0x50, 0x69, 0xb3, 0xd4, 0xa2, 0xd4, 0x8e, 0xaa, 0xaf, 0x3b, 0x5c, 0x1e, + 0xe7, 0x09, 0x6e, 0x15, 0xa4, 0xc2, 0xc7, 0xc3, 0xad, 0x62, 0x93, 0x94, 0x4c, 0x8f, 0xfc, 0x05, 0xb5, 0xe9, 0xd5, 0x84, 0xb4, 0xd6, 0xa6, 0x99, 0x67, 0x6e, 0xd0, 0x44, 0xee, 0xe5, 0x56, 0x46, + 0x3e, 0xcb, 0x21, 0x68, 0x9d, 0xc6, 0x4a, 0xfc, 0x75, 0x04, 0x4a, 0x14, 0xcd, 0x00, 0x8d, 0x43, 0xa4, 0x04, 0xe9, 0xe3, 0xc4, 0x8e, 0x66, 0xc5, 0xe9, 0x05, 0x1f, 0xe7, 0x1a, 0xf8, 0xd1, 0x57, + 0xb8, 0xbe, 0x72, 0xaa, 0x3a, 0x6c, 0x11, 0xa1, 0x70, 0xd8, 0x7c, 0x36, 0xe4, 0xfa, 0x56, 0x32, 0xdc, 0x52, 0x43, 0xb4, 0xe8, 0x8d, 0x20, 0xe2, 0x10, 0xd5, 0x30, 0x55, 0x2f, 0x86, 0x0c, 0x0c, + 0x2f, 0xa3, 0xdc, 0x8a, 0x6d, 0x7f, 0x97, 0xad, 0x7d, 0x61, 0x4a, 0x12, 0x08, 0xed, 0xb3, 0xf9, 0x5c, 0x08, 0xa7, 0xbb, 0xbe, 0xa7, 0xf7, 0x18, 0x0f, 0xb6, 0x10, 0x9a, 0xca, 0xcd, 0xb0, 0xd6, + 0x95, 0xa1, 0xb5, 0xe1, 0xb5, 0x5d, 0x5f, 0x25, 0x91, 0x78, 0xe0, 0x3c, 0x4b, 0x6a, 0x7d, 0x4c, 0x9e, 0x2f, 0xd1, 0xaa, 0x3b, 0x91, 0x62, 0x2d, 0x0c, 0x34, 0x25, 0x03, 0x7d, 0xa5, 0xe9, 0xa6, + 0x0b, 0x5f, 0x65, 0x2e, 0x3e, 0xa1, 0xc7, 0x23, 0x4f, 0x13, 0xbb, 0xda, 0x5a, 0xfe, 0x47, 0x54, 0x48, 0xcf, 0xc8, 0x4f, 0x1b, 0x3d, 0xd3, 0x22, 0x08, 0xa8, 0xd2, 0xb9, 0x0f, 0x4c, 0x90, 0x79, + 0x2d, 0x60, 0x1b, 0x6e, 0x51, 0x17, 0xb6, 0x4f, 0x5a, 0xa3, 0x1a, 0xa9, 0xcc, 0xa5, 0xca, 0x64, 0xe4, 0x6e, 0xe9, 0x69, 0x3d, 0xbe, 0x5b, 0xa4, 0x7e, 0xcc, 0xca, 0x72, 0xbf, 0xc4, 0xc9, 0x9a, + 0x44, 0x49, 0x6f, 0xed, 0x76, 0x5c, 0xa4, 0xea, 0xcd, 0x36, 0x18, 0x36, 0x24, 0x86, 0x80, 0xc7, 0x48, 0x91, 0x2c, 0xcc, 0x90, 0x3d, 0xed, 0x01, 0x14, 0x3d, 0x54, 0xe0, 0xd7, 0x51, 0x6e, 0x3a, + 0x9e, 0x07, 0x26, 0x4a, 0x60, 0x19, 0xef, 0x16, 0xd6, 0xef, 0x65, 0x82, 0x7e, 0x43, 0x81, 0xdc, 0x34, 0x8d, 0x04, 0x34, 0x93, 0xd0, 0xff, 0x6e, 0x36, 0xfc, 0x9c, 0x0c, 0x9f, 0x70, 0x8f, 0xb4, + 0xf8, 0x3c, 0x6b, 0x5b, 0x7a, 0x2b, 0x48, 0xda, 0xb6, 0xb7, 0x52, 0x59, 0x3e, 0xeb, 0x85, 0x94, 0x6a, 0xc7, 0xbd, 0x94, 0x24, 0x48, 0x78, 0x58, 0xe9, 0xf8, 0x56, 0x09, 0x0b, 0xd9, 0x9b, 0x42, + 0xfb, 0xce, 0x1a, 0xb3, 0xdd, 0xf5, 0xaa, 0x0f, 0xd5, 0xe5, 0x86, 0xe2, 0x99, 0xb5, 0xbe, 0xe0, 0x71, 0x6b, 0x94, 0x41, 0x6a, 0x5d, 0x2e, 0x3a, 0x82, 0x3a, 0x27, 0xe2, 0x50, 0x05, 0xfa, 0x84, + 0x9b, 0xa7, 0x72, 0xaa, 0xc2, 0x3b, 0x89, 0x47, 0x7f, 0x6c, 0x4e, 0x69, 0x8a, 0x66, 0x1b, 0xcd, 0xa2, 0x5a, 0x62, 0xc4, 0xf9, 0xc9, 0xff, 0xbc, 0x2f, 0xc5, 0x5f, 0x89, 0x37, 0x7d, 0x81, 0x7e, + 0x74, 0x1e, 0x6e, 0xaf, 0x81, 0x64, 0xbb, 0x78, 0xd3, 0xd4, 0xc5, 0xb4, 0xee, 0x60, 0xc6, 0xc6, 0x53, 0x79, 0x4b, 0xcd, 0x6b, 0x12, 0x5f, 0x05, 0x15, 0x3a, 0xd8, 0x75, 0x65, 0xd1, 0x73, 0xa4, + 0x45, 0x6c, 0xaa, 0xc6, 0x2c, 0xb1, 0xba, 0x12, 0x52, 0xf2, 0x5d, 0xc7, 0xde, 0xf9, 0xec, 0x2a, 0x48, 0x14, 0x26, 0x1b, 0x67, 0xbc, 0x36, 0x98, 0xe3, 0x87, 0x9a, 0x2a, 0xfb, 0xc0, 0x24, 0x1c, + 0xb3, 0x40, 0x9a, 0xf6, 0xe5, 0xa2, 0x20, 0x18, 0xab, 0xdf, 0x19, 0x59, 0xaf, 0xab, 0xf0, 0x26, 0x87, 0x02, 0x4c, 0x8c, 0xc6, 0x25, 0x36, 0x3e, 0x84, 0xc6, 0x55, 0x22, 0x81, 0x65, 0x64, 0x60, + 0x9a, 0x25, 0x86, 0xe2, 0xbf, 0xcb, 0x7d, 0xe4, 0x4e, 0x32, 0x42, 0x83, 0x10, 0x30, 0x35, 0x7c, 0x25, 0xc8, 0x1c, 0xed, 0xec, 0x95, 0xdc, 0x88, 0x9f, 0xbd, 0x51, 0x15, 0xf7, 0x95, 0xbf, 0x17, + 0x96, 0x46, 0xa2, 0x29, 0xa9, 0x71, 0x5b, 0x52, 0xff, 0x7f, 0x2e, 0xa7, 0xcc, 0x39, 0x27, 0xf7, 0xdd, 0xb5, 0xff, 0xea, 0xf6, 0x9c, 0x3f, 0xc4, 0x73, 0xf6, 0x97, 0x1f, 0xf3, 0x57, 0x4c, 0xc9, + 0xaf, 0x5c, 0x71, 0x35, 0x7c, 0x85, 0xb4, 0xfb, 0x81, 0x81, 0x57, 0x8c, 0xc8, 0x4f, 0xb0, 0x10, 0x78, 0x71, 0xd2, 0xb6, 0x30, 0x26, 0x60, 0xfa, 0x40, 0x1f, 0x49, 0xba, 0xf2, 0x9a, 0xcd, 0xa1, + 0x88, 0x4a, 0xdc, 0xda, 0xea, 0x02, 0x3b, 0x15, 0xf7, 0xcc, 0xdd, 0x36, 0x89, 0x3c, 0x4a, 0x21, 0xd7, 0xfe, 0x38, 0x59, 0xd1, 0x65, 0xbf, 0x33, 0x42, 0x58, 0xbe, 0x98, 0x41, 0x52, 0x39, 0x13, + 0xe5, 0x61, 0x30, 0xf5, 0x4a, 0x75, 0xb9, 0xdf, 0x91, 0x7a, 0x91, 0xf5, 0x47, 0x75, 0x5f, 0x58, 0x54, 0xd2, 0x56, 0x9d, 0x84, 0x4b, 0x69, 0x36, 0x8f, 0x5e, 0x97, 0x9f, 0x51, 0xee, 0x5f, 0xb6, + 0x75, 0x7f, 0x9d, 0x4c, 0x1f, 0xbf, 0xf8, 0x0f, 0x8a, 0x04, 0x3d, 0x21, 0xfe, 0x17, 0x6e, 0xbe, 0xc7, 0x00, 0xaf, 0xa5, 0x51, 0x5e, 0x83, 0x86, 0xc0, 0x9b, 0x0b, 0x6d, 0x53, 0x29, 0xb3, 0x58, + 0xdc, 0x26, 0x0b, 0x8a, 0x0e, 0x85, 0x69, 0x8f, 0xc2, 0x44, 0xe1, 0xc0, 0xe3, 0x3d, 0x61, 0x22, 0xa5, 0x52, 0x58, 0x6e, 0x4c, 0xda, 0xe5, 0xc3, 0x70, 0xd8, 0xb1, 0xa8, 0xc3, 0x4c, 0x29, 0xe6, + 0x4b, 0x0a, 0x26, 0xe7, 0xa4, 0xba, 0x97, 0xc6, 0x24, 0xb7, 0x43, 0x97, 0x06, 0x25, 0xe5, 0x7b, 0x45, 0x4e, 0x73, 0xef, 0xa0, 0x60, 0x70, 0x29, 0x51, 0xea, 0x1e, 0x8e, 0x7c, 0x7c, 0xeb, 0x0c, + 0x7f, 0xb7, 0x20, 0xa7, 0xdd, 0xac, 0xf3, 0x3c, 0x50, 0x75, 0x02, 0xfd, 0xa1, 0x1a, 0x7c, 0xc5, 0x1a, 0xf9, 0x80, 0xda, 0x48, 0xf6, 0xf7, 0xe3, 0x26, 0xf2, 0xdd, 0xc2, 0x26, 0xa1, 0xa6, 0x40, + 0x5f, 0x65, 0x1d, 0x3b, 0x61, 0x88, 0xcd, 0x40, 0xed, 0xef, 0x8c, 0x54, 0xcb, 0x4a, 0x7f, 0xc9, 0x2b, 0x06, 0x99, 0x4c, 0x9d, 0x51, 0xed, 0xd7, 0x88, 0xa3, 0x25, 0xc6, 0x66, 0x0c, 0xc0, 0x4a, + 0x97, 0x9a, 0x8c, 0xcd, 0x3c, 0xb6, 0x7b, 0x69, 0x88, 0x2e, 0x3b, 0x81, 0x16, 0x69, 0xfd, 0xac, 0x16, 0xa4, 0xac, 0xde, 0x9a, 0xa8, 0x34, 0x18, 0xe4, 0xc6, 0x66, 0x3c, 0x58, 0xee, 0xd2, 0x38, + 0xe9, 0xb6, 0x5b, 0x71, 0x3e, 0xef, 0xb3, 0x70, 0x46, 0xc9, 0x9d, 0x3c, 0xac, 0xa3, 0x90, 0x70, 0x82, 0xa3, 0xb3, 0x99, 0x3a, 0xda, 0x77, 0x32, 0xf1, 0xd5, 0xa9, 0xd3, 0x3a, 0x89, 0xe3, 0x88, + 0xd9, 0xd4, 0xc9, 0xbe, 0xb1, 0x24, 0x5f, 0xd3, 0xce, 0xef, 0x50, 0xdf, 0x69, 0xd7, 0x1c, 0xb7, 0x2d, 0x0e, 0x9d, 0xd1, 0x8c, 0xdb, 0x4d, 0xb7, 0x85, 0xbc, 0x00, 0xd6, 0x23, 0x6e, 0x35, 0x42, + 0x10, 0x7b, 0xc8, 0x4a, 0xbd, 0x82, 0xc2, 0x77, 0x4b, 0x92, 0xda, 0xad, 0x1c, 0x62, 0x3c, 0xee, 0x8b, 0x9b, 0x51, 0x3c, 0x41, 0x31, 0x22, 0x65, 0x7c, 0x77, 0x8b, 0x03, 0xf1, 0xa1, 0x23, 0xe4, + 0x85, 0x97, 0x12, 0x4e, 0x51, 0x89, 0x3d, 0x51, 0xcb, 0x0e, 0x38, 0x79, 0x90, 0x26, 0x12, 0xa6, 0x2c, 0xf3, 0x1e, 0x95, 0xa6, 0xca, 0xb3, 0xc8, 0xff, 0xb3, 0x4c, 0x80, 0x56, 0xa8, 0xfc, 0x5c, + 0x02, 0xb8, 0xaf, 0x5c, 0x5e, 0x69, 0xec, 0xf0, 0x01, 0xb5, 0x41, 0xe5, 0xfb, 0x71, 0xdb, 0xc6, 0x0e, 0x13, 0x94, 0x5e, 0x2c, 0x19, 0x84, 0x82, 0x83, 0x72, 0xb3, 0x20, 0xb1, 0x95, 0x9b, 0x79, + 0xbd, 0x69, 0x0f, 0xd3, 0x3d, 0x5d, 0xea, 0x46, 0xca, 0x78, 0x2b, 0xef, 0xa7, 0x23, 0x24, 0x17, 0xfa, 0x66, 0x6d, 0x62, 0xc9, 0x3c, 0x9f, 0x19, 0xd6, 0x50, 0x19, 0x1a, 0x69, 0x65, 0x18, 0xc0, + 0xee, 0x20, 0x01, 0x1b, 0x72, 0x51, 0xcc, 0x39, 0x69, 0x4d, 0xae, 0x12, 0x7d, 0xaa, 0xcf, 0x9d, 0x39, 0x42, 0x60, 0xe5, 0xf8, 0x99, 0x61, 0xf3, 0x67, 0xa0, 0xf2, 0x9b, 0x00, 0x33, 0xfe, 0x52, + 0x62, 0xc3, 0x75, 0x80, 0x19, 0x6f, 0x97, 0xde, 0x10, 0xf2, 0x81, 0x6a, 0xf7, 0xab, 0xf9, 0x68, 0x1b, 0xad, 0x72, 0xa3, 0xa6, 0x1d, 0x46, 0xf0, 0xab, 0x9e, 0x82, 0x07, 0xaa, 0x8b, 0x8f, 0xa6, + 0x52, 0x95, 0xdb, 0x1a, 0x54, 0x56, 0x9d, 0xfd, 0x8e, 0x82, 0x36, 0xeb, 0x99, 0x56, 0x8e, 0xa6, 0x9d, 0x75, 0x97, 0x24, 0xe9, 0x59, 0x4e, 0xcf, 0xf7, 0x53, 0x0a, 0x80, 0x07, 0x14, 0xb9, 0x98, + 0xcc, 0xa7, 0x46, 0x55, 0x76, 0xd8, 0x48, 0x82, 0x49, 0xc4, 0xc1, 0x6f, 0x05, 0xf2, 0x7f, 0x7e, 0x34, 0x19, 0x69, 0xdb, 0x10, 0xef, 0x59, 0xd9, 0x5b, 0xf3, 0xf7, 0x47, 0x05, 0x6f, 0x9a, 0x1d, + 0xee, 0x1d, 0x5d, 0x79, 0xd4, 0x97, 0x16, 0x7b, 0xc3, 0x5f, 0x48, 0x51, 0x3a, 0x03, 0x6d, 0xa8, 0x7d, 0x3a, 0x04, 0x1b, 0x48, 0xcf, 0x09, 0xce, 0x65, 0x02, 0x66, 0x51, 0x6e, 0xce, 0x6e, 0xa5, + 0x43, 0x7f, 0xbd, 0x10, 0x67, 0x22, 0x53, 0xf5, 0x58, 0x14, 0x10, 0x47, 0x7e, 0xc6, 0xe4, 0x07, 0x49, 0x2a, 0x36, 0xde, 0x30, 0x0f, 0xa2, 0xf1, 0x68, 0x41, 0x4c, 0xb5, 0x04, 0xf6, 0x06, 0x18, + 0x4c, 0x6a, 0x2c, 0xd5, 0x67, 0x1d, 0x4a, 0xeb, 0x75, 0x61, 0xb3, 0xf6, 0x2b, 0x75, 0xb6, 0x1a, 0x79, 0x78, 0x76, 0x60, 0x46, 0xa1, 0xba, 0x47, 0xac, 0xc1, 0xf4, 0x99, 0xe8, 0xf9, 0x8e, 0x07, + 0x3e, 0xea, 0x01, 0x7f, 0xfd, 0xe3, 0x4b, 0xe3, 0x8e, 0x8f, 0x08, 0xc0, 0x71, 0xec, 0xd6, 0x3d, 0xf0, 0x42, 0x15, 0x8c, 0x94, 0xc4, 0x38, 0x05, 0xf6, 0xfe, 0xf1, 0xc5, 0x3f, 0x70, 0x52, 0xf0, + 0x7d, 0x79, 0xfe, 0x9c, 0x6e, 0xfc, 0x8f, 0xaf, 0x7b, 0xd9, 0x7f, 0x76, 0x6d, 0xfc, 0xc7, 0x97, 0xae, 0x8d, 0x5f, 0x8b, 0xf1, 0xfe, 0xf1, 0xc5, 0x81, 0x48, 0x0c, 0x45, 0xd7, 0x9d, 0x24, 0x7a, + 0x1f, 0x25, 0x5e, 0x60, 0xce, 0x3f, 0x4e, 0xfd, 0xb8, 0xbe, 0xfe, 0xee, 0x9c, 0x46, 0xf5, 0xb8, 0x85, 0x8c, 0x99, 0x1a, 0xc5, 0x79, 0x13, 0xfc, 0x7f, 0xa0, 0x2d, 0x93, 0xe8, 0x34, 0x07, 0x74, + 0x02, 0xf3, 0x51, 0x5a, 0xe3, 0x6b, 0xe6, 0xe1, 0x3b, 0xcc, 0x23, 0x3f, 0x9e, 0x8e, 0xda, 0x1a, 0x84, 0x44, 0xc6, 0x53, 0xbd, 0x2c, 0x91, 0x61, 0x11, 0x98, 0x4e, 0xfa, 0x42, 0x66, 0x67, 0xf1, + 0xd4, 0xc5, 0xcd, 0x11, 0x3a, 0x36, 0x54, 0x9a, 0x66, 0x71, 0xb6, 0x2b, 0xcf, 0x72, 0x94, 0x98, 0x70, 0xeb, 0x95, 0xb5, 0x1d, 0xc3, 0x5d, 0x6c, 0x9c, 0xe2, 0x33, 0x61, 0x10, 0x27, 0x01, 0x3c, + 0x5e, 0x21, 0x1b, 0x58, 0xb0, 0x11, 0x48, 0xa6, 0x4b, 0xb9, 0xde, 0xcd, 0x0e, 0xf1, 0x2a, 0xd9, 0x1a, 0x8c, 0x1a, 0xb2, 0x3f, 0xee, 0xa1, 0x75, 0xb9, 0x40, 0x7d, 0x1f, 0x29, 0xe8, 0x2b, 0x7a, + 0xed, 0x0c, 0xf5, 0x88, 0x96, 0xf3, 0x31, 0xd8, 0xc0, 0x7a, 0x8e, 0x98, 0x0a, 0xd7, 0x42, 0x41, 0xab, 0x3c, 0x6b, 0xc1, 0xea, 0x6b, 0x27, 0x70, 0x1d, 0x8e, 0xc9, 0xe7, 0xf4, 0x8c, 0x65, 0x51, + 0x75, 0xe2, 0x56, 0x83, 0x65, 0xd9, 0xf3, 0x67, 0x6a, 0x47, 0x1c, 0xce, 0x21, 0x49, 0x11, 0x57, 0x64, 0x6f, 0x35, 0xdd, 0x6a, 0xcb, 0x1d, 0x94, 0x92, 0x6b, 0x77, 0x20, 0x70, 0x64, 0x4f, 0x5c, + 0xf4, 0x14, 0x43, 0xda, 0x0d, 0xd9, 0x1d, 0x3c, 0x10, 0x07, 0x0b, 0xc2, 0x35, 0x85, 0x72, 0xf6, 0x2c, 0x08, 0xdb, 0x5a, 0xaf, 0xbd, 0x2a, 0x45, 0x5f, 0x76, 0x7c, 0x2e, 0x6b, 0x32, 0xee, 0x51, + 0x08, 0x7e, 0x29, 0x53, 0xec, 0x13, 0xec, 0x3b, 0x89, 0x4e, 0x27, 0x20, 0xdc, 0x2e, 0x57, 0x8c, 0x92, 0x2c, 0x74, 0x9c, 0x18, 0x11, 0xb2, 0x80, 0x00, 0x09, 0xeb, 0x69, 0x86, 0x23, 0x67, 0x92, + 0xc6, 0xcd, 0x36, 0x07, 0xbb, 0x5b, 0x30, 0x25, 0xd0, 0x9b, 0x9b, 0x08, 0x42, 0xa2, 0x05, 0x9e, 0x3a, 0xfb, 0x71, 0x52, 0x84, 0xae, 0x30, 0xec, 0xc7, 0xdb, 0x8c, 0x96, 0x46, 0x6b, 0x5b, 0xa1, + 0x57, 0xde, 0xb0, 0x93, 0x58, 0x2b, 0x98, 0x31, 0x36, 0xb3, 0x2a, 0x93, 0x3b, 0xd0, 0xb2, 0xde, 0xc5, 0xde, 0xaa, 0x65, 0x5e, 0x6e, 0xa8, 0xba, 0x86, 0x96, 0x81, 0x4a, 0x9a, 0x9e, 0x13, 0x36, + 0xbe, 0xaa, 0xcf, 0xdb, 0xbc, 0x0a, 0xf4, 0x85, 0x0d, 0x21, 0xee, 0x52, 0xfd, 0xb9, 0x64, 0xfa, 0xe8, 0x06, 0xd1, 0x3e, 0xb9, 0xf7, 0x5c, 0x57, 0x73, 0x7f, 0x02, 0xbe, 0x64, 0x11, 0x1d, 0x21, + 0x36, 0x94, 0x0d, 0x03, 0xa3, 0x4d, 0xc2, 0x27, 0x02, 0x0e, 0xb0, 0xce, 0x24, 0x40, 0xf6, 0xe6, 0x30, 0x04, 0x38, 0xb9, 0x94, 0x98, 0x5d, 0x57, 0xec, 0x87, 0xac, 0x33, 0x94, 0x10, 0xba, 0x7d, + 0xb6, 0x3a, 0xfc, 0xd6, 0xca, 0xa7, 0xbc, 0x8d, 0x81, 0xfd, 0x89, 0x8e, 0xe5, 0x15, 0xe8, 0x0f, 0x0c, 0x9c, 0x2f, 0xb4, 0x71, 0x31, 0x11, 0x10, 0xd6, 0xab, 0xed, 0x74, 0xd1, 0x3d, 0x2c, 0x4d, + 0x19, 0x2a, 0x12, 0x8f, 0x1d, 0x51, 0xcb, 0x5c, 0x94, 0x46, 0x04, 0xb9, 0x49, 0x5f, 0xd5, 0xf6, 0xbe, 0xe3, 0x3b, 0xda, 0xd7, 0xb0, 0x5f, 0x9b, 0x12, 0x36, 0xcd, 0x0b, 0x73, 0xfd, 0x43, 0xdb, + 0x3d, 0x72, 0x3e, 0x5e, 0x42, 0xd5, 0x19, 0xee, 0x09, 0x4f, 0xe7, 0xb3, 0xc6, 0x01, 0x69, 0x61, 0x41, 0xcb, 0x6e, 0xaf, 0xef, 0x1e, 0x60, 0x66, 0x1c, 0x38, 0x21, 0xbd, 0xe8, 0x71, 0xc8, 0xb2, + 0xe6, 0xa8, 0xc1, 0xb0, 0x8b, 0x20, 0x74, 0xcd, 0xee, 0x61, 0x5c, 0xa8, 0x49, 0x85, 0x13, 0x04, 0xc7, 0x01, 0x70, 0x48, 0x2e, 0xb6, 0xc4, 0x64, 0x66, 0x05, 0x08, 0x87, 0x7b, 0x4b, 0x62, 0xec, + 0x52, 0xc3, 0x50, 0x67, 0x55, 0xdd, 0x98, 0x2f, 0x48, 0x7d, 0x4b, 0xd3, 0x79, 0x30, 0x84, 0x49, 0x49, 0xc3, 0xfc, 0x7d, 0x5b, 0x0b, 0xfa, 0xb4, 0xd3, 0xfc, 0x3f, 0x9a, 0x4e, 0x6d, 0x57, 0x65, + 0x4c, 0x79, 0xe6, 0x9c, 0x62, 0x95, 0x4d, 0x6f, 0xe8, 0xab, 0xba, 0xaf, 0x3c, 0x3f, 0x55, 0x67, 0xfd, 0x83, 0x6e, 0x2a, 0xa3, 0x5a, 0xa0, 0xfe, 0xa6, 0xf7, 0xc4, 0x23, 0xb3, 0xe1, 0x05, 0xf9, + 0x7b, 0x09, 0xf9, 0x88, 0xfe, 0xcb, 0xf3, 0xb6, 0x8d, 0x25, 0xe7, 0xf3, 0x1e, 0x3b, 0x4b, 0x5d, 0xca, 0xc9, 0xa1, 0x83, 0x4a, 0x84, 0xfc, 0x4e, 0x4b, 0xfb, 0xc3, 0x45, 0x14, 0xf5, 0xc5, 0x20, + 0x75, 0x21, 0x02, 0x9d, 0xae, 0x97, 0x73, 0x5e, 0xc5, 0xeb, 0x19, 0x11, 0x06, 0xdb, 0x72, 0xdd, 0xc7, 0xea, 0xb5, 0xef, 0x2f, 0x43, 0x51, 0x9b, 0x9a, 0x03, 0x16, 0x60, 0xe7, 0x5c, 0x64, 0xf2, + 0xd0, 0x8a, 0xa0, 0x71, 0x53, 0xb0, 0x30, 0x5a, 0x1e, 0xb2, 0x4a, 0xcf, 0xe3, 0x5b, 0xa6, 0xde, 0x9f, 0x5e, 0x38, 0x50, 0xfc, 0x86, 0x99, 0xff, 0x71, 0xaa, 0xb1, 0x3b, 0x63, 0xb4, 0xad, 0xb8, + 0xa0, 0xda, 0x4e, 0x81, 0xcb, 0x87, 0xdd, 0x17, 0x16, 0xc8, 0x0b, 0x1b, 0xcb, 0x7f, 0x82, 0xfd, 0xa0, 0xc0, 0xf1, 0xa4, 0x59, 0x8a, 0x69, 0xb1, 0xab, 0xbc, 0x3e, 0xad, 0x00, 0xac, 0x9b, 0x6f, + 0x30, 0x05, 0x2d, 0x45, 0x55, 0x1e, 0x8e, 0x72, 0x41, 0x8e, 0x96, 0x9a, 0xe5, 0x0e, 0xf2, 0xc9, 0x0a, 0xca, 0x99, 0x09, 0x94, 0xab, 0x9a, 0xdc, 0xef, 0x4c, 0xb7, 0x2a, 0x17, 0xd2, 0xa6, 0x89, + 0x4f, 0xe9, 0x6a, 0x1d, 0x11, 0x8c, 0x09, 0x1b, 0xe6, 0x82, 0xce, 0x7b, 0xe1, 0x2e, 0x24, 0x62, 0xbc, 0x7f, 0xa0, 0xf4, 0x5d, 0x67, 0x6a, 0x49, 0x83, 0xad, 0xd5, 0x4d, 0xa5, 0xef, 0xfb, 0x7a, + 0xde, 0x96, 0x59, 0x3e, 0xc2, 0xc5, 0x0b, 0x8e, 0xd5, 0x25, 0xe4, 0x0f, 0x74, 0xbc, 0x9f, 0x37, 0x18, 0x69, 0xe1, 0x62, 0xc5, 0x0e, 0xe3, 0xee, 0x23, 0x55, 0x98, 0x4c, 0xa1, 0xe1, 0x84, 0xa4, + 0x2b, 0xc0, 0xb3, 0xf1, 0x18, 0x86, 0xa6, 0x88, 0x20, 0xf7, 0x5d, 0x74, 0xbe, 0x25, 0xb7, 0x10, 0xef, 0x0b, 0x0a, 0x06, 0x58, 0x63, 0x0e, 0xab, 0x81, 0x4d, 0x39, 0x42, 0xe4, 0x9a, 0x1b, 0x56, + 0x69, 0x11, 0x0f, 0x07, 0x0b, 0xcc, 0x9f, 0x91, 0x7e, 0x1d, 0xcc, 0xb4, 0x7d, 0xb4, 0xf5, 0x4b, 0x24, 0x18, 0x75, 0xb4, 0xb1, 0x5b, 0xcd, 0xaf, 0x42, 0x12, 0x5f, 0x2a, 0x08, 0xbf, 0x14, 0x9e, + 0xaa, 0x4e, 0xcb, 0xea, 0xc1, 0x6f, 0xdb, 0x36, 0x21, 0x2f, 0x95, 0x88, 0x7f, 0x74, 0x6c, 0x7a, 0x6f, 0xd6, 0x84, 0x3c, 0x2f, 0x0f, 0x3f, 0xa2, 0x4d, 0x01, 0x56, 0xf1, 0xd2, 0xc6, 0xf7, 0x96, + 0x6c, 0x41, 0x0b, 0x6f, 0x50, 0x98, 0x6a, 0xcd, 0x0d, 0x23, 0x6b, 0x9e, 0x53, 0xdd, 0xae, 0x34, 0xf5, 0xfd, 0x78, 0x3e, 0x1c, 0x07, 0x07, 0x7b, 0x2e, 0x8f, 0x58, 0xbe, 0xbf, 0x5a, 0x76, 0x10, + 0x35, 0x59, 0xdb, 0xa2, 0x98, 0x11, 0x34, 0x2b, 0x6c, 0x56, 0x9d, 0x59, 0xca, 0xa8, 0x05, 0x36, 0xe3, 0x58, 0x79, 0x35, 0x54, 0xd7, 0x87, 0x9c, 0x73, 0x86, 0xa8, 0x9f, 0x5d, 0x09, 0xd2, 0x9b, + 0xba, 0x94, 0xb6, 0xf3, 0xf3, 0x28, 0x85, 0x3a, 0xed, 0x26, 0xa8, 0xaf, 0x3a, 0x81, 0xa1, 0x7f, 0xbf, 0x02, 0x73, 0xd4, 0x78, 0xf4, 0x0b, 0x48, 0xbd, 0x82, 0xdd, 0x60, 0xf7, 0xea, 0x4a, 0xa3, + 0xd4, 0xe9, 0xe7, 0x68, 0xee, 0x4b, 0x22, 0x2e, 0xcc, 0xcd, 0x7c, 0x6c, 0x0c, 0x4d, 0x4a, 0x63, 0x54, 0x46, 0x18, 0xf7, 0xb7, 0x36, 0xbf, 0xe0, 0x62, 0x00, 0xdd, 0x77, 0xbb, 0x09, 0xe3, 0xf9, + 0x73, 0xa6, 0xd0, 0x8a, 0x7e, 0x8f, 0x60, 0x18, 0x64, 0x28, 0xf3, 0xdb, 0x6c, 0xd1, 0xef, 0x2e, 0x38, 0x5b, 0xf7, 0xea, 0x4e, 0x3d, 0xdd, 0x95, 0x07, 0x9b, 0xf6, 0x38, 0x3d, 0x28, 0x7c, 0x61, + 0x6a, 0x40, 0x00, 0xa1, 0xe9, 0x61, 0xef, 0xb6, 0x09, 0xe0, 0x23, 0x71, 0xa9, 0x1b, 0x9e, 0x52, 0x5d, 0xe2, 0xe7, 0xd4, 0x71, 0xe3, 0x05, 0x9f, 0xb9, 0xa5, 0x89, 0x15, 0xfa, 0xbe, 0x12, 0xe8, + 0x0f, 0x77, 0x05, 0xa2, 0x5f, 0x6a, 0x24, 0xf5, 0x01, 0xf5, 0x44, 0x84, 0xd3, 0x31, 0x48, 0xb7, 0x6b, 0x22, 0x35, 0xdd, 0x2f, 0x27, 0x9d, 0xdc, 0x37, 0x81, 0xa1, 0x81, 0x72, 0xf2, 0x7e, 0x15, + 0xd3, 0x26, 0x3d, 0xee, 0x84, 0x26, 0x55, 0x4d, 0xc8, 0xf9, 0x98, 0x1f, 0xa1, 0xb8, 0xbe, 0x1e, 0x2d, 0x19, 0x5f, 0x34, 0x65, 0xc6, 0x4f, 0x9c, 0x4e, 0xbd, 0x93, 0xa5, 0x84, 0xdf, 0xe7, 0x5b, + 0x87, 0xb7, 0x2b, 0x73, 0xb6, 0xc8, 0xe9, 0x6c, 0x65, 0x07, 0x6b, 0x86, 0x41, 0x1c, 0x7e, 0x6b, 0x14, 0x45, 0xe0, 0xcd, 0xf1, 0xcd, 0x8f, 0x4a, 0x29, 0x91, 0x56, 0xc6, 0x78, 0xe8, 0x47, 0x61, + 0x60, 0x04, 0x19, 0x68, 0xf8, 0x4e, 0x96, 0x3d, 0xc4, 0x20, 0xf2, 0x2a, 0x06, 0xaf, 0xa1, 0x9f, 0x30, 0x79, 0x7d, 0x0d, 0x44, 0xda, 0x61, 0x74, 0xae, 0x63, 0xa9, 0x41, 0x4a, 0x0c, 0x90, 0x4e, + 0x91, 0x65, 0x19, 0xcb, 0x6e, 0xaa, 0x49, 0x49, 0x9e, 0x44, 0xbd, 0xd9, 0xc8, 0x9c, 0xc2, 0x50, 0xb5, 0x0b, 0x16, 0x4e, 0x40, 0x4a, 0x50, 0xc2, 0x61, 0xfe, 0x34, 0xcf, 0x86, 0xc5, 0x2a, 0x61, + 0xbb, 0xf6, 0x38, 0x57, 0xb1, 0xa4, 0x03, 0xe7, 0xa2, 0x0a, 0x2c, 0x7a, 0x0b, 0x26, 0xef, 0xc1, 0xd2, 0x2e, 0x64, 0x3a, 0xf0, 0x4e, 0x37, 0x95, 0x2c, 0x9d, 0x3f, 0x88, 0x00, 0x7f, 0x87, 0xb0, + 0x8b, 0x14, 0x97, 0xfb, 0x1e, 0xea, 0x6b, 0x16, 0xd2, 0x19, 0x6c, 0x83, 0xa2, 0xf3, 0x09, 0x08, 0x3f, 0xb7, 0x8d, 0x10, 0x10, 0xe5, 0xbd, 0x04, 0xc1, 0xa0, 0x8d, 0x6b, 0xea, 0xc4, 0x34, 0x10, + 0x38, 0xc5, 0xcd, 0x2d, 0x64, 0xc5, 0xe8, 0x73, 0xec, 0xbe, 0x05, 0xff, 0xed, 0xd7, 0x99, 0x8e, 0x95, 0x66, 0x61, 0xf2, 0x38, 0xf4, 0xff, 0xe2, 0xe7, 0x9d, 0xe1, 0x9e, 0xbe, 0xef, 0x7c, 0xd6, + 0xa4, 0x9c, 0xb7, 0x30, 0xfe, 0x14, 0x81, 0x8f, 0x12, 0x6b, 0x4f, 0xec, 0x6c, 0x46, 0xac, 0x86, 0x28, 0x61, 0xbb, 0x74, 0x39, 0xc8, 0x50, 0x80, 0x23, 0xd0, 0x45, 0x89, 0x70, 0xf3, 0xf9, 0xa8, + 0x8e, 0x99, 0x72, 0x12, 0xa1, 0x3b, 0xa5, 0xe3, 0xf7, 0xfd, 0x1d, 0xcd, 0xcf, 0x8a, 0x22, 0x2b, 0xfc, 0x40, 0xa1, 0x17, 0x87, 0xf5, 0xbc, 0x33, 0x16, 0x64, 0x7c, 0x5f, 0x0b, 0x1c, 0x49, 0x8b, + 0x28, 0x5a, 0x78, 0xca, 0x3c, 0xda, 0x1b, 0xfd, 0x67, 0x0b, 0x8a, 0xdf, 0x08, 0xb8, 0x30, 0x03, 0xa3, 0x24, 0x3c, 0xad, 0x2e, 0x13, 0xb7, 0x85, 0x0e, 0x56, 0xa2, 0x68, 0x86, 0x99, 0x7b, 0xa0, + 0xf9, 0x19, 0xf0, 0xbe, 0x8a, 0x69, 0xfa, 0xca, 0xde, 0x00, 0x75, 0xe7, 0x14, 0xea, 0xfe, 0x12, 0x6b, 0xcc, 0x03, 0x27, 0xce, 0xcf, 0xcd, 0x8b, 0x7f, 0xdd, 0xcd, 0x55, 0x28, 0x13, 0x27, 0x33, + 0x40, 0xd3, 0xf1, 0x0c, 0xf0, 0xd4, 0xd0, 0xe4, 0x3e, 0xa4, 0x83, 0x6e, 0x81, 0xaa, 0x92, 0x1a, 0xe7, 0x47, 0xe1, 0x2f, 0x09, 0xe1, 0x76, 0x12, 0x38, 0xdc, 0x3b, 0x8f, 0x78, 0x06, 0x7e, 0xa9, + 0x07, 0xfb, 0x09, 0x64, 0xc3, 0x2e, 0xc7, 0x83, 0xa6, 0xfb, 0x4c, 0x0b, 0x4e, 0x91, 0xcb, 0xa4, 0xbf, 0x1f, 0x8c, 0x0f, 0xab, 0x39, 0xd6, 0x1b, 0x85, 0xdb, 0x6c, 0x0a, 0x54, 0xeb, 0x1e, 0xd9, + 0xe9, 0xa9, 0x14, 0xef, 0x39, 0x07, 0x55, 0x31, 0xba, 0x1b, 0x93, 0x91, 0x98, 0x4e, 0xb1, 0x4e, 0xc5, 0x00, 0x0a, 0x81, 0x5d, 0x49, 0x76, 0x2c, 0x66, 0xb3, 0x58, 0x70, 0x3c, 0x8d, 0x12, 0xb6, + 0x24, 0xea, 0x22, 0x50, 0xf6, 0xe9, 0xba, 0x37, 0x31, 0x31, 0xbd, 0x2f, 0x7a, 0xd0, 0xfe, 0xb0, 0x5f, 0x75, 0x7f, 0x22, 0x78, 0xe1, 0xb7, 0x56, 0x0b, 0x43, 0xcd, 0x57, 0xb9, 0x0f, 0x57, 0x0c, + 0x5e, 0x0c, 0x85, 0x9c, 0xa1, 0x7e, 0xe0, 0xcd, 0x55, 0x92, 0x36, 0x21, 0x91, 0x26, 0xdb, 0xaa, 0x04, 0x14, 0x5d, 0x33, 0xeb, 0xd9, 0x41, 0x9b, 0x19, 0x23, 0x00, 0xde, 0x78, 0xc5, 0x3c, 0x49, + 0x20, 0xcc, 0x1b, 0xac, 0xa7, 0xb0, 0xca, 0x51, 0xc4, 0xe2, 0xb0, 0x25, 0x69, 0x04, 0xd1, 0x0e, 0x0b, 0x1b, 0xd9, 0xa8, 0x87, 0x03, 0x75, 0x90, 0x99, 0x01, 0x8f, 0x18, 0xeb, 0x8c, 0x33, 0xc9, + 0xd4, 0xa1, 0x13, 0x0b, 0xf5, 0xec, 0x60, 0xe5, 0xa6, 0xeb, 0x89, 0xd0, 0x17, 0x4c, 0x75, 0x3e, 0xca, 0xcb, 0x9f, 0x67, 0x5b, 0x1d, 0xc5, 0xc2, 0xd1, 0xaf, 0x05, 0x9d, 0xc7, 0xf6, 0xea, 0x4b, + 0xd1, 0x92, 0x0b, 0xc0, 0x0d, 0x7a, 0x3e, 0x4f, 0xdb, 0x45, 0x4a, 0x32, 0x13, 0x59, 0x8d, 0xac, 0xd8, 0x29, 0xfa, 0x31, 0x62, 0xc4, 0xd9, 0x41, 0x12, 0xbc, 0xae, 0xbe, 0x5a, 0x71, 0xa5, 0xf2, + 0xd3, 0x82, 0x58, 0x2d, 0x31, 0x94, 0xec, 0x94, 0xdd, 0xe1, 0x3c, 0x14, 0xb5, 0xaf, 0xe5, 0xdc, 0x5d, 0x83, 0x3e, 0x7e, 0xe7, 0xd5, 0x85, 0xb6, 0x99, 0x77, 0xba, 0xc6, 0xf7, 0xb7, 0x98, 0x1b, + 0xc0, 0x42, 0x34, 0x52, 0xb6, 0xae, 0x93, 0x86, 0xf3, 0xc2, 0x38, 0x8c, 0xc6, 0xeb, 0x1e, 0x5f, 0x2b, 0x31, 0x55, 0xa3, 0x89, 0xcc, 0x1f, 0x4c, 0x40, 0x58, 0x24, 0x9d, 0xe5, 0x5e, 0xf7, 0x87, + 0x7e, 0xba, 0xc2, 0x7d, 0xd4, 0xd3, 0x26, 0xa1, 0x9b, 0xb8, 0x50, 0x7f, 0xe8, 0xd1, 0xfe, 0x9e, 0x58, 0x1f, 0x04, 0x7f, 0xd7, 0x05, 0xcc, 0x6c, 0xbe, 0x9f, 0x41, 0x58, 0x78, 0xeb, 0x6d, 0xb7, + 0xc1, 0xd3, 0x45, 0x17, 0x9d, 0x47, 0x9c, 0xf0, 0x82, 0x5d, 0xf2, 0x01, 0xb6, 0xc1, 0xcf, 0xf9, 0xa4, 0x4d, 0x59, 0xf4, 0x11, 0x37, 0x79, 0x77, 0x6d, 0x40, 0xaa, 0x25, 0x0e, 0xbd, 0x99, 0x3e, + 0x43, 0xd6, 0x3d, 0x7c, 0xb1, 0x87, 0xe9, 0xbc, 0x13, 0x75, 0xc7, 0x54, 0x88, 0x1c, 0xa0, 0x6c, 0x2d, 0x65, 0x5b, 0x8a, 0x5a, 0x12, 0xb5, 0x67, 0xef, 0xec, 0xbc, 0x9c, 0x6e, 0xb2, 0xf5, 0x7e, + 0xc6, 0xf4, 0xb2, 0xa1, 0x5e, 0xf4, 0x09, 0x2d, 0xc6, 0xe9, 0x75, 0x6d, 0xb0, 0x03, 0xc2, 0x41, 0x6a, 0x11, 0xd7, 0x25, 0x8d, 0x8e, 0xca, 0xc9, 0x2e, 0xf9, 0xbe, 0x56, 0xfc, 0xf4, 0x92, 0x69, + 0xa4, 0x94, 0xc1, 0x03, 0x4c, 0x5c, 0x6f, 0xf9, 0xfd, 0x33, 0x4c, 0x34, 0x70, 0x3f, 0x50, 0xd1, 0x9c, 0x81, 0x0d, 0xbc, 0xe7, 0xb8, 0x70, 0xe6, 0xdc, 0x6c, 0xcc, 0xaf, 0x66, 0xeb, 0x9e, 0xc8, + 0x51, 0xfa, 0x70, 0x36, 0xa5, 0x93, 0xbd, 0x3a, 0x0d, 0x66, 0x51, 0xc5, 0x55, 0x96, 0xc6, 0xf5, 0xb3, 0x8d, 0x1b, 0x19, 0x1b, 0x91, 0xb5, 0x2a, 0x7a, 0x33, 0x43, 0x93, 0xad, 0x76, 0xd8, 0x4e, + 0xe8, 0x65, 0xba, 0x9f, 0x1b, 0x92, 0x47, 0x4e, 0x13, 0x06, 0x1d, 0x50, 0xc0, 0x6a, 0x9c, 0x28, 0x56, 0x8a, 0xc4, 0x08, 0xd1, 0xcf, 0x75, 0x8d, 0x1a, 0xfc, 0x46, 0x12, 0x79, 0xa4, 0x64, 0x36, + 0xb8, 0x37, 0xaa, 0x5f, 0x9f, 0x05, 0x80, 0x17, 0xfa, 0x30, 0xb5, 0x0d, 0x55, 0x09, 0x2c, 0xf0, 0xdd, 0x9a, 0x7f, 0xa0, 0x5b, 0x6d, 0xe7, 0xa2, 0xe7, 0xe6, 0xcf, 0xe3, 0xe8, 0xad, 0x7a, 0x6e, + 0x6a, 0x49, 0x15, 0x65, 0x21, 0x98, 0x28, 0x81, 0x1e, 0xfa, 0x9f, 0xaa, 0xfe, 0x51, 0xc8, 0xed, 0x15, 0x16, 0xff, 0xfa, 0x80, 0x86, 0xc2, 0x5f, 0x2f, 0xb7, 0x5d, 0xc3, 0x2b, 0x90, 0xc8, 0x1b, + 0x71, 0x58, 0xd5, 0x49, 0x20, 0x6f, 0x66, 0x17, 0xce, 0x18, 0x29, 0x93, 0x6d, 0x34, 0x31, 0xaa, 0xd5, 0x68, 0xd0, 0x95, 0xd1, 0xc5, 0x50, 0xdc, 0x2d, 0x7b, 0x4a, 0xe4, 0x53, 0x10, 0xdd, 0xed, + 0x04, 0x93, 0x59, 0x58, 0x15, 0xeb, 0x08, 0x9b, 0xf3, 0x50, 0x6f, 0xd6, 0x8f, 0x03, 0x62, 0xdf, 0xab, 0x83, 0x6a, 0x63, 0xed, 0x64, 0x31, 0x9d, 0x67, 0xbb, 0xdd, 0x68, 0xa3, 0xe6, 0x03, 0x9a, + 0x7f, 0x66, 0x83, 0xfd, 0x09, 0xb6, 0x89, 0x6e, 0x28, 0x0f, 0x6b, 0x6d, 0x90, 0x97, 0x92, 0x82, 0x1a, 0x88, 0x4d, 0xeb, 0x90, 0x23, 0xbb, 0x21, 0xcf, 0x93, 0x81, 0x10, 0xb0, 0xab, 0xc4, 0x9a, + 0xc4, 0x50, 0xfa, 0x3e, 0x58, 0xf5, 0xfb, 0x3d, 0x6d, 0x62, 0xf9, 0x3b, 0x82, 0x1b, 0xa8, 0x03, 0xed, 0x60, 0x7d, 0x37, 0xef, 0xbf, 0x6b, 0x7b, 0xf2, 0x5a, 0x42, 0xd3, 0x75, 0xdb, 0x93, 0x96, + 0x89, 0x4c, 0xd3, 0x2d, 0xbd, 0x8d, 0x67, 0x14, 0x84, 0x28, 0x1d, 0x2d, 0xde, 0x1f, 0x76, 0x25, 0x5a, 0x6d, 0xd3, 0x14, 0x21, 0x4c, 0x94, 0x14, 0xf9, 0x0d, 0x13, 0x71, 0x5b, 0x49, 0x87, 0xa1, + 0x9c, 0x87, 0xf8, 0x59, 0xac, 0x4b, 0xf6, 0x41, 0x9d, 0x29, 0x9d, 0x0e, 0x6e, 0x07, 0xb5, 0xab, 0xf5, 0xd0, 0x75, 0x2c, 0x45, 0x5c, 0xea, 0x99, 0x04, 0x41, 0xa1, 0x98, 0xc6, 0xcf, 0x56, 0xd3, + 0xc1, 0xc2, 0x17, 0x76, 0xd8, 0xb3, 0xec, 0x9b, 0xe7, 0x9d, 0x50, 0xda, 0xc5, 0x53, 0x75, 0xe3, 0xe8, 0x73, 0x26, 0x46, 0x9a, 0x3e, 0x5b, 0x85, 0xc1, 0x5e, 0xf2, 0x72, 0xef, 0xc0, 0x6f, 0xf0, + 0xfb, 0xe5, 0x2a, 0x88, 0x3d, 0xf7, 0x74, 0x11, 0xd0, 0xe2, 0x97, 0xba, 0xe0, 0xea, 0xa3, 0x69, 0xaf, 0x20, 0xc7, 0x23, 0x96, 0xdb, 0x39, 0x49, 0x46, 0x8d, 0xad, 0x18, 0x83, 0x84, 0x97, 0xf1, + 0xf5, 0x6c, 0x3d, 0xa6, 0xed, 0x74, 0x6b, 0xd3, 0xd7, 0xfb, 0x6a, 0x97, 0x96, 0x3f, 0xcf, 0xae, 0xf9, 0x04, 0xdb, 0x20, 0xf7, 0x7c, 0xd2, 0xd6, 0x9e, 0xa9, 0xf4, 0x8e, 0x46, 0x74, 0x75, 0x27, + 0x5e, 0x6b, 0x73, 0x60, 0xec, 0x6a, 0xe5, 0x4a, 0x52, 0x3b, 0xdc, 0xde, 0x1e, 0x6b, 0x74, 0x60, 0x89, 0x09, 0x2c, 0x28, 0x76, 0x8f, 0x19, 0x14, 0x9c, 0x33, 0x2e, 0xe9, 0x28, 0xdf, 0x28, 0x2a, + 0x5a, 0xc9, 0x9e, 0x0d, 0x04, 0x7b, 0x25, 0x9d, 0x06, 0xf2, 0x0c, 0xe8, 0x0d, 0x96, 0xdd, 0x19, 0x99, 0xcc, 0x23, 0x74, 0x5c, 0x8f, 0xed, 0xb1, 0x5c, 0x17, 0x62, 0x9f, 0x7e, 0x9d, 0x83, 0x9d, + 0xc6, 0xe2, 0xc8, 0xfd, 0x73, 0x56, 0x47, 0x43, 0x8f, 0xab, 0xe5, 0x1b, 0x27, 0x05, 0xf5, 0xa3, 0xdd, 0x76, 0x5a, 0x00, 0xfe, 0xb8, 0xe7, 0x76, 0x33, 0x87, 0xcf, 0x82, 0xa9, 0x2f, 0x10, 0xde, + 0x97, 0x8e, 0x9d, 0xf4, 0xfe, 0x8f, 0xdf, 0x87, 0x3f, 0x12, 0xe2, 0xbf, 0xa4, 0x76, 0x36, 0xa0, 0xa3, 0xb7, 0x28, 0x09, 0xb3, 0x30, 0xab, 0x22, 0xe3, 0xcd, 0xf4, 0x14, 0xeb, 0x7c, 0x2f, 0xda, + 0x7a, 0xf3, 0xd1, 0x16, 0x59, 0x02, 0xad, 0x73, 0x3c, 0x4f, 0x74, 0x3f, 0x64, 0xc6, 0xc3, 0x0c, 0x5d, 0xf8, 0xa5, 0x0e, 0x97, 0x17, 0x70, 0x3f, 0xb8, 0xab, 0x39, 0x03, 0xe1, 0x76, 0x3d, 0x2e, + 0x27, 0xd3, 0xe1, 0x61, 0x34, 0x55, 0x66, 0x3b, 0x7d, 0xe8, 0x8d, 0xe7, 0x19, 0x2b, 0x99, 0xdc, 0x68, 0x2d, 0x67, 0x66, 0x09, 0xe5, 0xa6, 0x40, 0x03, 0xc9, 0xda, 0x25, 0xf1, 0xce, 0x7c, 0x34, + 0xac, 0x35, 0x1f, 0x2a, 0x06, 0xa5, 0x34, 0xdf, 0xf6, 0x33, 0x72, 0x3a, 0x8b, 0x47, 0xfd, 0x4d, 0xea, 0xa3, 0xdb, 0x9e, 0x90, 0x88, 0xa3, 0x5e, 0xb6, 0x99, 0x93, 0x78, 0xba, 0x43, 0x26, 0x3d, + 0x9e, 0x43, 0x8b, 0xee, 0xf4, 0x37, 0x75, 0x23, 0xde, 0x5a, 0x3e, 0x1a, 0xd1, 0x63, 0x5f, 0x0b, 0x7e, 0x69, 0x81, 0xe5, 0x1d, 0xe6, 0x19, 0x99, 0x4e, 0x0a, 0xc2, 0xcf, 0x17, 0x55, 0x10, 0x30, + 0x45, 0x83, 0x0d, 0x80, 0xa0, 0x74, 0x0f, 0xa0, 0x66, 0xab, 0x3d, 0x30, 0x4f, 0x87, 0x1c, 0x40, 0x69, 0xe2, 0xb6, 0xae, 0xa5, 0x1f, 0x7a, 0x0e, 0xc7, 0xc7, 0xfa, 0x46, 0x62, 0x3d, 0x12, 0xf5, + 0xf8, 0x4b, 0x6d, 0xdd, 0x3e, 0xa0, 0xbe, 0x7f, 0x58, 0x73, 0xdc, 0x94, 0xd7, 0xb6, 0x70, 0xaf, 0xfb, 0x63, 0x6c, 0x65, 0x8d, 0x70, 0x6b, 0xe4, 0x01, 0xb3, 0xa1, 0xec, 0x13, 0xd8, 0x3e, 0x48, + 0xf3, 0x45, 0x3f, 0xea, 0x01, 0x41, 0x6f, 0x21, 0x24, 0x94, 0x80, 0x17, 0x1d, 0x49, 0xb3, 0x18, 0x6a, 0x41, 0x62, 0xbc, 0x0b, 0x91, 0x9b, 0x58, 0x70, 0xfa, 0xd2, 0x38, 0x62, 0x98, 0x5d, 0x8d, + 0xcc, 0x32, 0x80, 0x24, 0x55, 0x39, 0x9a, 0x61, 0x12, 0x35, 0xa9, 0x0c, 0x78, 0x1a, 0x76, 0x84, 0x19, 0x7f, 0x13, 0x91, 0x7f, 0xbe, 0xc0, 0xd1, 0x96, 0x23, 0x4c, 0x23, 0x01, 0xb3, 0x10, 0xd4, + 0xc2, 0x20, 0x38, 0x49, 0x9f, 0x47, 0x82, 0xfc, 0x15, 0xd6, 0xb8, 0x06, 0xde, 0xa0, 0xf2, 0xfa, 0x52, 0xdb, 0x15, 0x38, 0x78, 0xb4, 0xd0, 0xc5, 0x30, 0x4f, 0x87, 0x85, 0xbc, 0x44, 0x7b, 0x4e, + 0xdf, 0x93, 0x0d, 0xb9, 0x3b, 0x64, 0x56, 0xc5, 0xe2, 0xe0, 0xf3, 0x69, 0xb9, 0x66, 0x7b, 0x26, 0x6d, 0x6f, 0x28, 0x7e, 0x63, 0x0d, 0x70, 0x85, 0x16, 0xd6, 0xbd, 0x1c, 0xc2, 0xd6, 0x2a, 0x99, + 0x6f, 0x76, 0x61, 0xbd, 0x77, 0x2b, 0xaf, 0x62, 0x0f, 0x06, 0x3c, 0x66, 0x46, 0xce, 0x9c, 0x41, 0xdc, 0x35, 0x4e, 0x2c, 0x28, 0x78, 0xb3, 0xfe, 0xb1, 0x93, 0xaa, 0x1b, 0xa6, 0x13, 0x18, 0x4d, + 0x3c, 0xd0, 0x48, 0x32, 0xe7, 0x61, 0x76, 0xd9, 0xcb, 0xe8, 0xba, 0x86, 0x7e, 0xc2, 0xd7, 0xf5, 0xb5, 0xb6, 0x08, 0xc3, 0x84, 0xd8, 0xdc, 0xf1, 0x2e, 0xea, 0x4d, 0x6a, 0x5d, 0x58, 0x98, 0xb4, + 0x3c, 0x92, 0x7b, 0xd0, 0x1a, 0x90, 0xf3, 0x0a, 0x60, 0x2c, 0x8e, 0x34, 0x11, 0x12, 0x37, 0x68, 0x1e, 0x2d, 0x29, 0xdd, 0x0a, 0x22, 0xbe, 0x9b, 0x30, 0x9c, 0x91, 0x0c, 0x76, 0x91, 0x80, 0x93, + 0xa3, 0xdd, 0x4e, 0x73, 0x83, 0xbd, 0x3e, 0x13, 0x05, 0x77, 0xb6, 0xef, 0x74, 0xc9, 0x75, 0x9f, 0xa1, 0x01, 0x6c, 0xc1, 0x7b, 0xdb, 0x96, 0x6b, 0xe8, 0x5f, 0xf5, 0x0d, 0xfc, 0x86, 0xfc, 0xbc, + 0x78, 0xea, 0xaa, 0x45, 0xe4, 0x33, 0xa2, 0x3c, 0xd2, 0x12, 0xaf, 0x85, 0x0d, 0xde, 0x61, 0x7e, 0x10, 0x40, 0x6f, 0x13, 0x30, 0x40, 0xc0, 0x6a, 0x87, 0xaa, 0x75, 0xa1, 0x6f, 0x74, 0xc6, 0x99, + 0xf6, 0x24, 0x2f, 0xea, 0xcf, 0x07, 0x32, 0x4e, 0xa4, 0x66, 0x14, 0xdd, 0x37, 0xe8, 0xbe, 0xfb, 0xa8, 0x9b, 0x75, 0xb5, 0x3f, 0xf3, 0xdb, 0x2e, 0x41, 0x37, 0x9f, 0x78, 0x79, 0xa1, 0xdd, 0x97, + 0x62, 0x75, 0x62, 0xfb, 0x4a, 0x95, 0x01, 0x18, 0xd2, 0x63, 0xe3, 0xc4, 0x4a, 0x23, 0xdc, 0xd1, 0x92, 0xf1, 0xf4, 0x60, 0xef, 0x7f, 0x22, 0xa5, 0xda, 0xed, 0x3e, 0xa9, 0x3b, 0xa6, 0xf9, 0x50, + 0xb8, 0xbf, 0x12, 0x1f, 0x3c, 0x02, 0x3c, 0x7e, 0xb8, 0x63, 0x9a, 0x20, 0xfe, 0x3c, 0x1e, 0xd8, 0xa4, 0xb5, 0xd2, 0x9e, 0x7f, 0xe0, 0x17, 0x5d, 0x9c, 0x11, 0xab, 0x49, 0x0d, 0x0c, 0x87, 0xc2, + 0xaa, 0xf6, 0xa6, 0xbd, 0xc8, 0x82, 0x3b, 0xfd, 0x35, 0x60, 0x14, 0xa4, 0x2c, 0x18, 0x58, 0x31, 0x76, 0x6c, 0x4b, 0x3f, 0xd4, 0x96, 0x56, 0xca, 0xf4, 0x3a, 0xec, 0xf5, 0x66, 0x7e, 0x77, 0xc2, + 0xca, 0x83, 0xce, 0xc4, 0x8f, 0xcd, 0x75, 0x28, 0x0a, 0x02, 0x1f, 0x65, 0xd9, 0x68, 0xb7, 0x5c, 0x0f, 0xc8, 0x9c, 0xdb, 0x51, 0xbf, 0xa9, 0xf6, 0xe1, 0xa6, 0x38, 0xa3, 0x0d, 0xfe, 0x92, 0x73, + 0x52, 0xf4, 0x7d, 0x5f, 0xe8, 0x95, 0x85, 0x9e, 0x33, 0xd0, 0x06, 0x8f, 0xa7, 0xc3, 0xa6, 0xf8, 0xba, 0x85, 0x85, 0xbe, 0xd9, 0x27, 0x9b, 0xa8, 0x33, 0x98, 0xe3, 0xfc, 0xd6, 0xe4, 0x07, 0xbb, + 0x7a, 0x3a, 0xf1, 0x97, 0xf9, 0x60, 0xed, 0x20, 0xab, 0x4d, 0xdf, 0x2c, 0x53, 0x8c, 0xa2, 0x82, 0x8e, 0xa6, 0x11, 0x04, 0x94, 0xa9, 0x24, 0x97, 0xc7, 0x55, 0x9f, 0x8c, 0x34, 0x89, 0xe8, 0xaa, + 0xce, 0xb0, 0x97, 0xda, 0x0a, 0x17, 0xed, 0x3a, 0x05, 0x19, 0x2a, 0x8b, 0x04, 0xdd, 0xb2, 0x9c, 0xa3, 0x0f, 0x7c, 0xa1, 0xd4, 0xeb, 0xd1, 0x33, 0x5c, 0x3e, 0x89, 0x24, 0x9d, 0xfb, 0xda, 0xfd, + 0x85, 0x2b, 0x27, 0x7a, 0xa8, 0x65, 0x89, 0xf3, 0x30, 0x23, 0xf2, 0xb5, 0x4e, 0x2c, 0x67, 0xa0, 0x47, 0x32, 0xbc, 0x1f, 0xb6, 0xed, 0xb5, 0x52, 0x2d, 0x00, 0x89, 0x70, 0x30, 0x9b, 0x31, 0xa9, + 0x01, 0xb3, 0xd7, 0x71, 0x7e, 0x40, 0x2b, 0x94, 0xc1, 0x88, 0xe2, 0x46, 0x1c, 0x4c, 0x96, 0x4a, 0xaf, 0x2c, 0x77, 0x9b, 0x95, 0xe3, 0x8e, 0x76, 0x02, 0x55, 0x27, 0xde, 0x8e, 0x13, 0x60, 0xa6, + 0xbf, 0x1d, 0xba, 0xee, 0x6c, 0xe3, 0x6d, 0x64, 0x64, 0x6e, 0x51, 0x2b, 0x45, 0xd7, 0x65, 0x63, 0xc4, 0xf9, 0x4e, 0xc7, 0xed, 0x63, 0x43, 0x3f, 0x76, 0xa4, 0x47, 0x3b, 0x91, 0xb7, 0x20, 0x83, + 0x91, 0xe6, 0x99, 0xe3, 0x9d, 0x34, 0x06, 0xfa, 0x52, 0xb5, 0x2d, 0xd9, 0xd6, 0x0c, 0xfe, 0x5c, 0xd3, 0xbb, 0x47, 0x08, 0xe2, 0xb5, 0xd8, 0xc0, 0x3b, 0xd0, 0x86, 0x10, 0xa7, 0xc3, 0x26, 0xe1, + 0xb0, 0x05, 0x21, 0x24, 0x81, 0x8e, 0xb1, 0x9a, 0x33, 0x08, 0xda, 0x8e, 0x57, 0xb1, 0x9b, 0x28, 0xd2, 0xd4, 0xaf, 0x65, 0x64, 0x32, 0x1a, 0x76, 0x16, 0x1b, 0x69, 0xbc, 0xf4, 0x7a, 0x3c, 0x3b, + 0xc4, 0xf7, 0x63, 0x34, 0x94, 0x8a, 0x89, 0xbc, 0xa7, 0xe6, 0xaa, 0xb4, 0x2d, 0x32, 0x4e, 0x40, 0xb7, 0xbd, 0x18, 0x33, 0xcb, 0xfd, 0xba, 0xc3, 0xb2, 0x45, 0x31, 0xc4, 0x27, 0x5d, 0xb8, 0xbb, + 0x06, 0x42, 0xab, 0x9f, 0x32, 0x02, 0xfa, 0x7a, 0x05, 0x87, 0x73, 0xdb, 0x2f, 0xfe, 0xa7, 0x74, 0x68, 0x37, 0x19, 0x32, 0xc7, 0x0a, 0x1e, 0xaf, 0x3e, 0xc3, 0x2f, 0x2d, 0x8a, 0x7d, 0x40, 0x3d, + 0x51, 0xe1, 0x74, 0xdc, 0x38, 0x24, 0x2d, 0x44, 0xfc, 0x6a, 0x30, 0x18, 0x6c, 0xcc, 0x85, 0x92, 0xe7, 0xa9, 0xb2, 0x1e, 0xb3, 0x00, 0x6d, 0x5a, 0x6b, 0x40, 0x5c, 0x17, 0xcc, 0x76, 0xcf, 0x2e, + 0xfd, 0x75, 0x41, 0xa5, 0x7b, 0x32, 0x08, 0x5d, 0x4e, 0x96, 0x8b, 0x7c, 0xba, 0x12, 0x07, 0xab, 0x0a, 0x96, 0xf7, 0xf8, 0x2a, 0x1a, 0x4a, 0x1c, 0xd9, 0xe3, 0xdc, 0x05, 0xec, 0x46, 0x4c, 0xa9, + 0x75, 0xd9, 0x62, 0x88, 0x1b, 0xa1, 0x59, 0x54, 0x35, 0xa3, 0xcd, 0xb9, 0xd7, 0xe7, 0x43, 0xd3, 0x38, 0xff, 0xa3, 0x03, 0x07, 0x76, 0x7f, 0x57, 0xa8, 0x2f, 0x79, 0x63, 0xa7, 0x4f, 0x6e, 0xf0, + 0xa4, 0x3a, 0x01, 0x74, 0x3e, 0x6d, 0x41, 0x90, 0x3c, 0xf2, 0x8c, 0x83, 0x91, 0x3c, 0xce, 0xc7, 0x7f, 0x25, 0x15, 0xf1, 0x03, 0xea, 0x91, 0x20, 0xe7, 0xe3, 0x86, 0x20, 0x4f, 0x12, 0x11, 0x11, + 0x90, 0xb2, 0x86, 0xfa, 0x90, 0x2f, 0xa7, 0x30, 0x5d, 0x0c, 0x21, 0x95, 0x74, 0x4d, 0x8d, 0x0d, 0x69, 0x0d, 0xef, 0x4e, 0xa6, 0xa3, 0x1f, 0x1a, 0x53, 0xcf, 0x7b, 0x88, 0xbd, 0xb6, 0xa4, 0xf2, + 0xb8, 0x87, 0x58, 0xcb, 0x25, 0x15, 0xb6, 0x64, 0x26, 0xf3, 0xde, 0x48, 0xa2, 0x26, 0xc5, 0xae, 0xcf, 0xc0, 0x9b, 0x6a, 0x5e, 0x94, 0x76, 0x4c, 0x88, 0x44, 0x3c, 0xb3, 0x35, 0x72, 0x26, 0xb8, + 0x1c, 0xa9, 0xee, 0x2c, 0xab, 0xef, 0x8d, 0x88, 0x5d, 0xc5, 0x59, 0x1e, 0x00, 0x17, 0x87, 0x98, 0x58, 0x0f, 0x55, 0x61, 0xda, 0x8f, 0x27, 0x16, 0x65, 0x9b, 0x9b, 0xda, 0xcf, 0xe9, 0x25, 0x21, + 0x23, 0x52, 0x68, 0xda, 0xfe, 0x72, 0x64, 0x8f, 0xb2, 0x1f, 0x2f, 0xc3, 0x1a, 0x81, 0x0e, 0x86, 0xe6, 0x33, 0x53, 0x13, 0x7f, 0x81, 0xfa, 0x57, 0x90, 0x8f, 0x28, 0xba, 0x3c, 0x6f, 0xb2, 0x08, + 0x5b, 0xa4, 0xa3, 0x02, 0x79, 0x89, 0x38, 0xc1, 0x68, 0xb8, 0x9e, 0x49, 0xa1, 0xb2, 0xce, 0x87, 0xf5, 0xbc, 0xda, 0xea, 0x28, 0xe2, 0x68, 0x02, 0xa0, 0x05, 0x19, 0xce, 0xd6, 0x1c, 0x91, 0x6c, + 0x00, 0x91, 0x45, 0x4a, 0x77, 0xba, 0x5a, 0x2c, 0xa7, 0x29, 0xb0, 0x34, 0xa8, 0xfe, 0xb4, 0xa0, 0xba, 0xb6, 0x48, 0x15, 0x8b, 0xce, 0x01, 0x0a, 0x47, 0x95, 0x3d, 0x99, 0x11, 0xb3, 0x39, 0x32, + 0x04, 0x22, 0x5b, 0xea, 0x0e, 0x73, 0xe2, 0x75, 0xe9, 0x18, 0x06, 0xda, 0x39, 0xae, 0xda, 0xce, 0x7a, 0x35, 0x82, 0x66, 0x39, 0xf6, 0xf1, 0xea, 0x3f, 0xf6, 0xc2, 0x9e, 0xde, 0x67, 0xa0, 0x0d, + 0x52, 0x4f, 0x87, 0x60, 0x03, 0xe9, 0x39, 0x3e, 0x2b, 0x57, 0x0c, 0x66, 0x09, 0x86, 0x10, 0x50, 0xdf, 0x5d, 0xe0, 0xf5, 0x28, 0x5d, 0x1d, 0x76, 0x56, 0xbe, 0x5b, 0xcd, 0x66, 0xa8, 0x81, 0x88, + 0x3c, 0xae, 0x53, 0x3d, 0x4a, 0x9e, 0x4e, 0x9c, 0x6a, 0xc7, 0x6a, 0x6a, 0x9f, 0x71, 0x96, 0x42, 0x35, 0xe2, 0x00, 0xb4, 0x2c, 0x7c, 0xb4, 0x24, 0x81, 0x48, 0x86, 0x42, 0x5d, 0xe8, 0x52, 0xda, + 0x7c, 0xef, 0xda, 0xe9, 0x4c, 0xf5, 0xb2, 0x92, 0x99, 0x26, 0x93, 0xd7, 0xe3, 0xa3, 0xd7, 0x5b, 0x8d, 0x9e, 0x52, 0x68, 0x7e, 0xbe, 0x14, 0x47, 0xb7, 0xca, 0xc4, 0x30, 0x52, 0x50, 0x51, 0xd3, + 0x2c, 0x51, 0xbe, 0x0b, 0x74, 0x74, 0x5e, 0xd8, 0xa5, 0xe1, 0x02, 0xf0, 0x91, 0x22, 0x9f, 0x67, 0xe0, 0x09, 0xe0, 0x73, 0xaa, 0x74, 0x15, 0x74, 0x80, 0x02, 0x73, 0x1d, 0x53, 0xc9, 0xfd, 0xa1, + 0xb7, 0xe2, 0x97, 0x7d, 0x7c, 0xa9, 0x6c, 0x48, 0x4a, 0xab, 0x99, 0x49, 0xd5, 0x2d, 0xb0, 0x9a, 0x5a, 0x4f, 0xed, 0xdd, 0x7c, 0x45, 0xc0, 0x3b, 0xe6, 0x00, 0xa8, 0x6a, 0xba, 0x93, 0x3b, 0x07, + 0x69, 0x86, 0x7b, 0x82, 0xa8, 0xd4, 0xc6, 0x2c, 0xef, 0x7b, 0x95, 0xba, 0x1d, 0xc1, 0x6b, 0x5c, 0x48, 0xf2, 0x59, 0x98, 0x52, 0xf1, 0x2a, 0x24, 0xcc, 0x96, 0x45, 0x07, 0x97, 0xbd, 0x10, 0xee, + 0xb4, 0x6d, 0x31, 0x52, 0x30, 0x0b, 0xc1, 0x28, 0x71, 0x7c, 0x27, 0x73, 0x8a, 0x33, 0xf3, 0xa3, 0x37, 0x3b, 0xb2, 0xbf, 0xd6, 0x40, 0xe0, 0xce, 0x2d, 0x69, 0xe5, 0xab, 0xa1, 0x07, 0xea, 0x46, + 0xaa, 0x25, 0x4e, 0x93, 0xdf, 0xfb, 0xeb, 0x5f, 0xee, 0xee, 0x89, 0xa3, 0x7c, 0x46, 0x17, 0xb0, 0x9b, 0x81, 0x77, 0x20, 0x0f, 0x6e, 0x38, 0xe2, 0x3f, 0x09, 0x14, 0x0f, 0x4c, 0xbd, 0x30, 0x7b, + 0x70, 0x4b, 0x0a, 0x1e, 0xb1, 0xa2, 0xa8, 0xde, 0xe7, 0xf7, 0xde, 0x06, 0xed, 0x03, 0xc3, 0x52, 0x8e, 0x08, 0x01, 0x6b, 0x23, 0x09, 0x7f, 0x7d, 0x9a, 0xad, 0xd7, 0x77, 0x5d, 0x86, 0xed, 0x91, + 0x2f, 0x30, 0x52, 0x5b, 0x49, 0xce, 0x9b, 0x77, 0x80, 0xa7, 0xb6, 0x49, 0xf7, 0x89, 0x70, 0xbc, 0xf7, 0x33, 0x4d, 0xec, 0x38, 0x4c, 0xdd, 0x0c, 0x97, 0x86, 0xb2, 0x4f, 0x0c, 0xf3, 0xfe, 0xcf, + 0xcf, 0x2b, 0x04, 0x41, 0x1a, 0x7d, 0xae, 0x31, 0x20, 0xb7, 0x9b, 0xf1, 0x3c, 0x5b, 0x27, 0x38, 0xdd, 0xf0, 0x76, 0x53, 0xa2, 0x76, 0xf5, 0xa0, 0xd3, 0x4b, 0x5e, 0x2c, 0x25, 0x64, 0x89, 0xe3, + 0x1b, 0x17, 0xac, 0x85, 0x3f, 0xbd, 0x3b, 0xcd, 0x94, 0x24, 0xbb, 0x7f, 0x7f, 0x1e, 0xa8, 0xe1, 0xe1, 0x0b, 0x2b, 0xbe, 0xb4, 0x76, 0xff, 0x9f, 0xb3, 0xff, 0xc8, 0xa5, 0xa0, 0xb8, 0x1a, 0xb8, + 0xe0, 0x94, 0x47, 0x11, 0xc5, 0x9f, 0xeb, 0xdf, 0x33, 0xd0, 0x53, 0x5f, 0xce, 0x93, 0x69, 0xd2, 0xb2, 0x08, 0x64, 0x5f, 0xcc, 0xf5, 0x03, 0x97, 0x1e, 0x64, 0xd7, 0xae, 0x57, 0x5b, 0x98, 0x92, + 0x83, 0x49, 0xa5, 0xd7, 0x0b, 0x64, 0xb9, 0x82, 0x96, 0x63, 0x6f, 0xb9, 0x1a, 0x0e, 0x77, 0xf8, 0x6e, 0x32, 0xa1, 0x29, 0x03, 0xa3, 0xc2, 0x55, 0x17, 0xef, 0x70, 0xe6, 0x7e, 0x12, 0x5b, 0x15, + 0xb0, 0x76, 0xfb, 0xa1, 0x16, 0x96, 0x15, 0xda, 0xd1, 0xf8, 0x42, 0x5b, 0x38, 0x39, 0xb0, 0x1f, 0x15, 0x14, 0x4a, 0xbb, 0xcb, 0xe5, 0xba, 0x65, 0x52, 0xf9, 0x13, 0x79, 0x74, 0x9c, 0xdf, 0x59, + 0x78, 0x62, 0x9d, 0x4c, 0xb1, 0x2e, 0xa4, 0xc3, 0x7f, 0x77, 0x26, 0xf8, 0x32, 0x4b, 0x1f, 0xb0, 0xc2, 0x2b, 0x0d, 0x9f, 0xae, 0x61, 0x43, 0xe0, 0xcd, 0x05, 0xf0, 0x04, 0xf6, 0x39, 0x63, 0x0c, + 0x43, 0xb4, 0xa6, 0x61, 0x75, 0x3d, 0x2a, 0xc6, 0x5e, 0x38, 0x04, 0x76, 0xf5, 0xdc, 0x8f, 0xe4, 0xb5, 0x64, 0xd0, 0x14, 0x10, 0x77, 0x17, 0x3e, 0xb3, 0xe2, 0x65, 0x6e, 0x63, 0x1d, 0x3a, 0x5a, + 0x0e, 0xf0, 0x5c, 0xb2, 0x45, 0x65, 0x6e, 0x08, 0x61, 0x99, 0x50, 0x01, 0xd6, 0x56, 0x95, 0x7b, 0xcb, 0xf5, 0x20, 0x45, 0x05, 0x7a, 0xa7, 0x1f, 0xa6, 0xea, 0xd4, 0xa6, 0xb6, 0xdd, 0xcc, 0xf1, + 0x3b, 0x3b, 0xf8, 0x8a, 0x31, 0xfe, 0x23, 0xf0, 0x7f, 0xa3, 0xd0, 0xee, 0xe3, 0xf9, 0x95, 0x12, 0xf1, 0x1b, 0xd8, 0x27, 0x6b, 0xe0, 0xf2, 0x0a, 0x88, 0xb4, 0x2b, 0x17, 0x97, 0xd8, 0xa9, 0xe7, + 0x59, 0xf2, 0x38, 0x53, 0x56, 0x61, 0xc7, 0x77, 0x76, 0x8c, 0x36, 0x61, 0xed, 0xe5, 0x4a, 0x19, 0x8a, 0xee, 0xb8, 0x8f, 0xcd, 0x76, 0x29, 0xb2, 0x76, 0x74, 0x8e, 0xea, 0x96, 0x4e, 0xcf, 0x45, + 0xf6, 0xbb, 0x03, 0x6f, 0x48, 0x4b, 0x2d, 0x9b, 0x74, 0x8d, 0xba, 0x3b, 0x1d, 0x12, 0x32, 0x3f, 0x1f, 0xc2, 0x16, 0x3a, 0xb2, 0x66, 0x01, 0xc9, 0x97, 0x0c, 0x3e, 0x5a, 0xd2, 0xce, 0x3c, 0xba, + 0xdd, 0x6e, 0xf6, 0x9b, 0x08, 0xc0, 0x8d, 0xf6, 0xfb, 0xaa, 0xb9, 0xda, 0x2c, 0x59, 0x9f, 0xb4, 0xf0, 0xc5, 0x2c, 0xfe, 0x6f, 0x33, 0x41, 0x35, 0x25, 0x32, 0x40, 0x2b, 0x54, 0x1e, 0x57, 0x47, + 0xbe, 0x92, 0xd9, 0x70, 0x01, 0xb7, 0x61, 0x8c, 0x8f, 0xb3, 0x26, 0x6f, 0xb7, 0x05, 0x53, 0xd0, 0x50, 0x3e, 0xb2, 0xd5, 0x01, 0x82, 0xb2, 0xa9, 0x5b, 0xa1, 0xe3, 0xde, 0x86, 0xe2, 0x3a, 0xd1, + 0x50, 0x4d, 0x0c, 0x65, 0xad, 0x2c, 0xa0, 0x69, 0x24, 0x62, 0x95, 0x16, 0x54, 0x45, 0xcf, 0x5b, 0xea, 0xa5, 0x40, 0x04, 0xe4, 0x60, 0x47, 0x6e, 0x48, 0x03, 0x1d, 0xcd, 0x0c, 0xdf, 0x2c, 0x06, + 0xb2, 0xb1, 0x12, 0x62, 0xb9, 0xd3, 0x85, 0xb0, 0x41, 0x3c, 0x92, 0x05, 0x8b, 0x0f, 0x18, 0xbb, 0x5b, 0x42, 0xcf, 0x7c, 0xa1, 0x67, 0xa6, 0x77, 0x7b, 0x84, 0xbe, 0x67, 0xa1, 0x9d, 0xd2, 0x0d, + 0x1e, 0x4e, 0xbb, 0x57, 0xb6, 0x49, 0xbb, 0xf7, 0x80, 0x4f, 0x14, 0x5f, 0x5d, 0x6e, 0xb3, 0x45, 0x1a, 0x02, 0x0e, 0xd0, 0x61, 0x77, 0xed, 0x0c, 0xa4, 0x58, 0x84, 0xd0, 0xc4, 0xcd, 0xab, 0xba, + 0x1c, 0x75, 0x2b, 0x5b, 0x98, 0xd8, 0xd9, 0xfd, 0xf5, 0xe9, 0xb6, 0xd8, 0x82, 0xdf, 0xe8, 0x76, 0x5e, 0x63, 0xea, 0x3d, 0x6e, 0xda, 0x4d, 0xbd, 0xa1, 0xaf, 0xe4, 0x3e, 0x9c, 0x60, 0x36, 0x68, + 0x39, 0x1e, 0x80, 0x27, 0x30, 0xcf, 0xb9, 0x0e, 0x9f, 0x23, 0x8e, 0x31, 0x37, 0x09, 0x14, 0x72, 0x6a, 0x4d, 0xee, 0x51, 0x5d, 0x6f, 0x52, 0x11, 0x64, 0x3e, 0x1a, 0x0e, 0xb9, 0xc9, 0x92, 0xc2, + 0x77, 0x75, 0x8d, 0x8e, 0x0a, 0xd4, 0x23, 0xf7, 0x9c, 0xb2, 0x2b, 0x7a, 0x79, 0xe7, 0x00, 0x94, 0x02, 0x43, 0xe8, 0x72, 0x37, 0x59, 0x4f, 0xe8, 0xc5, 0x6e, 0xb0, 0x5d, 0xec, 0xd6, 0xe8, 0xae, + 0x6b, 0x51, 0x70, 0x5f, 0xdb, 0x10, 0x3b, 0x22, 0x18, 0x0c, 0xc4, 0xd1, 0xeb, 0x1e, 0xe3, 0xbf, 0xa9, 0x8a, 0x6a, 0x78, 0x50, 0xd3, 0x06, 0xda, 0x4c, 0xde, 0x2b, 0x75, 0xa9, 0xa3, 0xfa, 0x42, + 0xae, 0x04, 0xd0, 0xbf, 0xbd, 0x7f, 0xef, 0xe9, 0x5f, 0x72, 0x72, 0x39, 0xae, 0x2b, 0x14, 0x3e, 0x2b, 0xae, 0xff, 0x4e, 0x9e, 0x96, 0xcc, 0x2f, 0x46, 0x3e, 0xf7, 0xbf, 0xf8, 0xd2, 0x7f, 0xf2, + 0x3a, 0x49, 0xf7, 0xd4, 0xb0, 0xf5, 0xca, 0x46, 0xb9, 0xde, 0x49, 0xed, 0xea, 0x81, 0x17, 0xcb, 0x00, 0x77, 0x0a, 0x39, 0x2e, 0xa2, 0x05, 0x47, 0x7f, 0x02, 0xbb, 0x98, 0x0b, 0x8d, 0x2b, 0xd6, + 0x10, 0x2e, 0xd5, 0xc2, 0xf7, 0xd5, 0x0a, 0xe2, 0xd6, 0x44, 0x7f, 0xbf, 0xe3, 0x32, 0x94, 0x7e, 0x93, 0x1a, 0xfb, 0x7e, 0x47, 0xe1, 0xa4, 0x4e, 0x16, 0x26, 0xdf, 0xb4, 0xc9, 0x34, 0xd2, 0x28, + 0x31, 0x8c, 0xf7, 0xef, 0xc3, 0x6e, 0x1f, 0x13, 0xe7, 0x46, 0x52, 0xbd, 0x8b, 0x76, 0xfc, 0xf6, 0x87, 0xb7, 0x91, 0xfc, 0x8b, 0xc1, 0xa6, 0x94, 0xc5, 0x08, 0xb2, 0xa4, 0x3a, 0xb5, 0xfa, 0x7c, + 0x47, 0x3e, 0x7c, 0xdf, 0x9d, 0x6c, 0x76, 0x76, 0xd6, 0x41, 0xd5, 0x53, 0xb4, 0x3d, 0x98, 0x9d, 0x5f, 0xe7, 0x8b, 0xae, 0xb9, 0x69, 0x1d, 0xf4, 0x77, 0xe2, 0xf6, 0x5b, 0x8e, 0x37, 0x28, 0x67, + 0x7f, 0x10, 0xbb, 0xca, 0x1c, 0xfa, 0x08, 0x9a, 0x7e, 0x90, 0x8b, 0xbc, 0x1a, 0xf3, 0x9b, 0x4a, 0x61, 0x33, 0x31, 0xd2, 0x07, 0xdb, 0xf7, 0x3b, 0x7e, 0x9e, 0xf8, 0x79, 0x62, 0x2b, 0xef, 0x37, + 0xc0, 0x77, 0xb4, 0xe5, 0xb9, 0x27, 0xd1, 0x57, 0x56, 0x72, 0x53, 0xb0, 0x52, 0x7c, 0xef, 0x1d, 0x34, 0x72, 0x83, 0x67, 0x37, 0x0d, 0x03, 0x30, 0x6d, 0x9a, 0x98, 0xbc, 0x4b, 0x31, 0xc7, 0xac, + 0xc0, 0xd2, 0xc9, 0xec, 0x30, 0xcf, 0xc0, 0xe3, 0xa8, 0x63, 0x56, 0xf7, 0x71, 0xe2, 0x19, 0x45, 0x70, 0x9f, 0xe5, 0xbd, 0x50, 0x3f, 0xbf, 0x2b, 0xfe, 0x86, 0x50, 0x6f, 0xe8, 0xd5, 0xe8, 0xbd, + 0xb8, 0xf3, 0xc5, 0x70, 0xa0, 0x64, 0x79, 0xa2, 0x78, 0xa0, 0x16, 0xfa, 0x47, 0x84, 0xdf, 0xe7, 0x80, 0xf7, 0xba, 0xdc, 0xec, 0xbd, 0xc7, 0x17, 0xfc, 0xd6, 0xb9, 0x7e, 0x83, 0x2f, 0x3b, 0xb6, + 0x5e, 0xfd, 0xfa, 0x24, 0xa7, 0xcf, 0x0d, 0x3d, 0x6f, 0x33, 0xbb, 0x0d, 0xbf, 0x30, 0xce, 0xad, 0xc3, 0x6e, 0x82, 0x10, 0x77, 0x3b, 0xbf, 0x7f, 0x19, 0x6f, 0x70, 0xaa, 0x85, 0xfe, 0x67, 0x4a, + 0xde, 0x97, 0x87, 0x64, 0x1f, 0xa6, 0x0f, 0x79, 0xfb, 0xfd, 0x99, 0x71, 0xc8, 0xc0, 0xcf, 0x71, 0xf8, 0xb6, 0x24, 0xac, 0xa0, 0x1b, 0xd4, 0x1c, 0xb9, 0xfc, 0x93, 0xbf, 0x4f, 0x9b, 0xd2, 0xbe, + 0xdf, 0xf4, 0x4d, 0xf4, 0xfe, 0x43, 0xea, 0x37, 0xc1, 0xfb, 0xd3, 0xd9, 0x65, 0xd5, 0xf7, 0xc7, 0x2f, 0xbf, 0xd5, 0x32, 0x7f, 0x47, 0x9a, 0x1e, 0x11, 0xf0, 0x1f, 0xff, 0xfe, 0xef, 0x7f, 0xfc, + 0xeb, 0xdf, 0x90, 0x07, 0x8b, 0x38, 0x6d, 0xac, 0xa8, 0x30, 0x32, 0x02, 0x2d, 0xf4, 0x3c, 0x43, 0x3b, 0x9a, 0xae, 0x8d, 0x35, 0xf5, 0xfe, 0x8a, 0x67, 0x70, 0xff, 0xd7, 0x1f, 0xdf, 0x6b, 0x30, + 0xf0, 0x54, 0x02, 0x08, 0x36, 0xbb, 0xf8, 0x3a, 0x7f, 0x72, 0xdd, 0xee, 0xfd, 0x47, 0x7c, 0x2a, 0xb8, 0x9b, 0x81, 0xb6, 0x15, 0xbd, 0x8c, 0x25, 0xe7, 0x93, 0xd5, 0xc2, 0xe0, 0xeb, 0xc2, 0x9b, + 0x40, 0xeb, 0x95, 0x7b, 0x80, 0x76, 0x2a, 0x45, 0x53, 0x6b, 0x09, 0x25, 0xe7, 0x2b, 0xcc, 0x1a, 0xb8, 0x5d, 0xcc, 0x71, 0xfa, 0x85, 0x9e, 0x46, 0x10, 0xaa, 0x0a, 0xe6, 0x7a, 0xb4, 0x59, 0xad, + 0x67, 0x54, 0xe6, 0x1e, 0x32, 0x77, 0x01, 0x1b, 0xc0, 0x70, 0x86, 0xc3, 0x1d, 0x6d, 0xe6, 0xcd, 0x0a, 0x71, 0x2f, 0x79, 0x61, 0x4d, 0xb3, 0x1d, 0xc4, 0x78, 0xb6, 0x10, 0xf4, 0x80, 0x17, 0xee, + 0xe0, 0xaf, 0xe1, 0x0d, 0xcd, 0x73, 0xee, 0x32, 0xc6, 0xed, 0x4e, 0x8f, 0x8f, 0xf8, 0xab, 0x7d, 0x93, 0x8a, 0xf7, 0xf7, 0x88, 0xbc, 0xdc, 0x72, 0x82, 0x67, 0x74, 0xc4, 0x5e, 0xea, 0x2f, 0x70, + 0xff, 0x11, 0x9f, 0x74, 0xbc, 0x19, 0x68, 0x3a, 0xe3, 0xb5, 0xa0, 0xe3, 0x8a, 0xe3, 0xc9, 0x64, 0xbc, 0x24, 0x47, 0xe2, 0xc2, 0xd4, 0xa6, 0x21, 0x81, 0x13, 0xae, 0xa3, 0x4c, 0x4b, 0x86, 0x82, + 0x91, 0xbc, 0x3b, 0xca, 0x50, 0x48, 0x9f, 0x53, 0x9b, 0xa0, 0x2f, 0x85, 0x03, 0x76, 0xed, 0x21, 0x50, 0x4f, 0x88, 0xf5, 0xae, 0xc8, 0xf8, 0xe5, 0x4a, 0x89, 0x63, 0x09, 0x27, 0x94, 0x6d, 0x94, + 0xa4, 0xcb, 0x41, 0xbd, 0x50, 0xb0, 0xce, 0x64, 0x84, 0xcc, 0xaa, 0x7c, 0xce, 0x1c, 0x0e, 0xcf, 0xe8, 0xf8, 0x4d, 0x9e, 0xc1, 0xf9, 0xf5, 0xbd, 0x26, 0x00, 0x09, 0xda, 0x86, 0x17, 0x19, 0xc9, + 0x67, 0x8c, 0xf2, 0xe7, 0xf1, 0x8b, 0x07, 0x5b, 0x5b, 0xb4, 0xe7, 0x81, 0x2f, 0x7a, 0xf2, 0x92, 0xcd, 0xfe, 0xf5, 0x6f, 0xc8, 0x51, 0x1f, 0xb5, 0x78, 0xc0, 0xd7, 0xed, 0x44, 0x9f, 0x4e, 0xfe, + 0xe6, 0xae, 0xdf, 0xd8, 0x56, 0xf4, 0xc6, 0x12, 0xba, 0xc7, 0x8b, 0xc4, 0x8b, 0x3e, 0xda, 0x27, 0xe0, 0x4f, 0x0e, 0x6c, 0x4e, 0x41, 0xa2, 0x9d, 0x97, 0x86, 0x8a, 0x87, 0x52, 0xed, 0x43, 0xb6, + 0x0c, 0xf3, 0x91, 0x11, 0xed, 0x44, 0x58, 0x13, 0xd5, 0x10, 0xe8, 0x8b, 0xe4, 0x36, 0xe4, 0xa9, 0x81, 0x32, 0xf4, 0x24, 0xdb, 0x3a, 0x40, 0xf6, 0x48, 0xf6, 0xc8, 0xb5, 0x02, 0xab, 0x7d, 0x9c, + 0x98, 0x4b, 0xd3, 0x69, 0x69, 0x4f, 0x46, 0x15, 0xed, 0x49, 0x9c, 0x9a, 0xb3, 0x8e, 0xa2, 0x2f, 0x26, 0x2c, 0x13, 0x0c, 0x51, 0xb6, 0xbf, 0x8b, 0x73, 0x27, 0x23, 0xd4, 0xd7, 0xf9, 0xce, 0x48, + 0x13, 0x43, 0xcb, 0x93, 0xf4, 0x6c, 0xe0, 0x60, 0xb7, 0xd6, 0x5a, 0x96, 0x28, 0x47, 0xb4, 0x9d, 0xc7, 0x5f, 0x5b, 0x7f, 0xf9, 0x91, 0x30, 0x39, 0xdb, 0x87, 0x8f, 0x5c, 0xeb, 0x97, 0x45, 0x48, + 0x03, 0xf8, 0x93, 0x6c, 0xcd, 0x69, 0xdb, 0x1d, 0x1c, 0xcb, 0x0e, 0xae, 0x4b, 0xbb, 0x50, 0xc9, 0xab, 0xc2, 0xe3, 0x34, 0x1c, 0xdb, 0x06, 0x03, 0x86, 0xf6, 0x56, 0x98, 0x9c, 0x51, 0x08, 0x56, + 0x88, 0xac, 0x6d, 0x65, 0x78, 0x6f, 0x53, 0xda, 0xdb, 0xee, 0x0c, 0xdd, 0xee, 0x99, 0x22, 0xd0, 0xcd, 0x43, 0x1f, 0xee, 0x5a, 0xa3, 0x98, 0x9f, 0x4e, 0x95, 0xd4, 0x9d, 0x8d, 0x66, 0xb5, 0xdb, + 0x19, 0xc7, 0x56, 0xb9, 0x2f, 0x55, 0x76, 0xc7, 0xc1, 0xd0, 0x1a, 0x93, 0x5f, 0x77, 0x73, 0x1e, 0xd9, 0xe9, 0xc8, 0x4b, 0x0d, 0x53, 0xff, 0xc4, 0x4e, 0x7f, 0x7e, 0x95, 0x66, 0x8e, 0xa6, 0x64, + 0x86, 0xf2, 0x43, 0x82, 0x43, 0xf7, 0x46, 0x6e, 0xbe, 0xef, 0x7e, 0x48, 0xe0, 0x37, 0x8c, 0x83, 0x4b, 0xf8, 0x9f, 0x8c, 0x71, 0x79, 0xb5, 0x6d, 0x5b, 0x0a, 0x72, 0x4c, 0xa1, 0x22, 0xbd, 0x12, + 0x15, 0x9c, 0x44, 0x4b, 0x05, 0xe2, 0xfb, 0x53, 0x2e, 0x83, 0x66, 0x63, 0x6c, 0xb4, 0x22, 0xe1, 0x05, 0x17, 0xb1, 0x98, 0xb4, 0x65, 0x91, 0xa1, 0xab, 0x21, 0xcc, 0x76, 0x1b, 0x99, 0x13, 0x94, + 0xed, 0xcc, 0x09, 0xa0, 0xbb, 0xa2, 0x5c, 0xdb, 0x80, 0xfb, 0xe4, 0x60, 0xde, 0x8b, 0xd7, 0x82, 0x8d, 0x8f, 0xf3, 0x1c, 0x10, 0x77, 0xd4, 0x21, 0x00, 0x48, 0xdd, 0x89, 0x56, 0xbf, 0x19, 0x7c, + 0x69, 0x93, 0x20, 0xdb, 0x1e, 0xd1, 0xbf, 0x35, 0xf5, 0x5a, 0x20, 0xba, 0xe5, 0x44, 0x84, 0x93, 0x85, 0x3f, 0x67, 0xea, 0xad, 0xc5, 0xd5, 0xa3, 0x94, 0x23, 0xfd, 0x81, 0x3e, 0xb6, 0x8c, 0xa2, + 0xb6, 0x8c, 0x7a, 0x44, 0x60, 0x38, 0x6b, 0x24, 0xc4, 0x04, 0x2a, 0x2a, 0x61, 0x0b, 0xef, 0x87, 0xf5, 0x12, 0x72, 0x1d, 0x06, 0xc7, 0xdc, 0xb9, 0xad, 0x77, 0x76, 0x2b, 0x4f, 0x18, 0xec, 0x26, + 0x52, 0x85, 0xd6, 0x51, 0x22, 0xfa, 0xe1, 0x92, 0x8e, 0x95, 0x94, 0x1d, 0x64, 0x3b, 0x40, 0x52, 0xf8, 0x67, 0xf2, 0xf3, 0x09, 0xa2, 0x91, 0xf6, 0xd2, 0xed, 0x9f, 0x1b, 0x3b, 0xbe, 0x86, 0xe2, + 0x76, 0x81, 0xc4, 0xaf, 0x18, 0x7e, 0xb6, 0x61, 0xfc, 0xcf, 0x6d, 0x80, 0xaf, 0x1b, 0xc6, 0xb7, 0xd0, 0xfa, 0x7a, 0xd8, 0x2b, 0xf5, 0xc2, 0xc7, 0x67, 0xac, 0xc1, 0xe3, 0x3c, 0x36, 0x97, 0x44, + 0x54, 0x66, 0x51, 0x66, 0xb7, 0x62, 0x94, 0x43, 0x39, 0xe9, 0xce, 0xd9, 0x58, 0xf6, 0x05, 0x37, 0xeb, 0xd3, 0x0a, 0x81, 0x8c, 0xd1, 0xb9, 0x0a, 0x1f, 0xa2, 0xb5, 0x17, 0xf6, 0xe7, 0x01, 0x3b, + 0xe5, 0xca, 0xd8, 0x8d, 0xca, 0xa0, 0x1b, 0x2a, 0x21, 0x1e, 0x19, 0x9e, 0x48, 0x7b, 0xd8, 0x7c, 0xac, 0x17, 0x98, 0x35, 0x7f, 0x26, 0x1e, 0x9e, 0x57, 0x4e, 0xfe, 0x4f, 0xd8, 0x43, 0xfe, 0x1e, + 0xd5, 0xff, 0x87, 0x6e, 0x22, 0x7f, 0x87, 0xd8, 0x3f, 0xc3, 0xcb, 0x3f, 0x77, 0xa0, 0x6b, 0x31, 0x39, 0xfe, 0xc3, 0x76, 0xa0, 0x7b, 0x4c, 0xa1, 0xdb, 0x28, 0xd4, 0x7d, 0x6f, 0xfa, 0x15, 0x0f, + 0xe6, 0x0e, 0xfc, 0x0f, 0x9a, 0x5d, 0x5d, 0x6d, 0x6a, 0xc2, 0x5b, 0x48, 0x36, 0xd2, 0x9c, 0x69, 0xc0, 0x1c, 0x77, 0xec, 0x32, 0x9e, 0x91, 0x22, 0xa4, 0x8c, 0x0a, 0xd4, 0x44, 0x2c, 0x61, 0x48, + 0x7b, 0xd3, 0x75, 0xb6, 0x91, 0x86, 0x61, 0xcc, 0xe2, 0x15, 0x4f, 0x86, 0x0b, 0x6e, 0xbd, 0x0e, 0xb5, 0xdc, 0xef, 0xa6, 0x26, 0x1b, 0xbb, 0xfb, 0x6d, 0x10, 0x3b, 0x3b, 0xc1, 0xf6, 0x85, 0x72, + 0x01, 0xf9, 0xbd, 0xe1, 0x24, 0xa2, 0xd6, 0x86, 0xed, 0x65, 0x58, 0xec, 0x91, 0x5e, 0xcf, 0xf9, 0xd3, 0x94, 0xc5, 0xc7, 0x2f, 0x5e, 0xb5, 0x67, 0x7f, 0xd8, 0xb9, 0xfa, 0x23, 0x2c, 0x7e, 0x8f, + 0x62, 0xd4, 0x4b, 0xfa, 0xe6, 0x04, 0xb2, 0x31, 0x9a, 0x8e, 0x07, 0x20, 0xd5, 0x4e, 0xe3, 0x14, 0xd8, 0x98, 0x15, 0xd9, 0x1e, 0x89, 0xe7, 0xfe, 0xbe, 0x1f, 0xf9, 0xfb, 0xfe, 0x20, 0xae, 0xd7, + 0x7c, 0x3a, 0x5d, 0xc2, 0x99, 0x88, 0xc8, 0x09, 0x90, 0x1b, 0xf1, 0x44, 0x36, 0xa3, 0x35, 0x32, 0x55, 0x69, 0x03, 0x60, 0x7b, 0xd6, 0x6c, 0xa3, 0x00, 0xd3, 0x03, 0x1b, 0x0e, 0x86, 0x58, 0x16, + 0xd8, 0x8e, 0x2f, 0xf0, 0x23, 0x85, 0xf1, 0x71, 0x1f, 0x2a, 0x94, 0x79, 0x34, 0x86, 0xf6, 0xc9, 0xbc, 0x46, 0x9f, 0xd1, 0xe5, 0x9b, 0x49, 0xa5, 0x85, 0xc9, 0x79, 0x39, 0xe4, 0x26, 0x1e, 0xdc, + 0x0c, 0x81, 0x6e, 0x7a, 0x9e, 0x6e, 0x5f, 0x56, 0x13, 0x1e, 0xb9, 0x3a, 0x77, 0xc3, 0x0f, 0xaf, 0x07, 0x3f, 0x9f, 0x51, 0xf5, 0x9f, 0x1e, 0xca, 0x7f, 0x92, 0x87, 0x12, 0x25, 0x8e, 0xaf, 0x3c, + 0xb4, 0xe1, 0x5e, 0xa9, 0x4f, 0x7a, 0x87, 0xf9, 0x3e, 0xa9, 0x1c, 0x5f, 0x69, 0x2a, 0xbd, 0x5a, 0xcc, 0x2a, 0x63, 0x90, 0xf7, 0xfb, 0x25, 0xb5, 0x8a, 0x74, 0x05, 0xb0, 0xf0, 0x08, 0x90, 0x86, + 0x45, 0xb0, 0x81, 0xe7, 0xd5, 0x72, 0x0b, 0x2d, 0xd6, 0xc6, 0x98, 0xe1, 0x04, 0xc8, 0x62, 0x33, 0xa1, 0x3b, 0x9f, 0xc2, 0xda, 0x24, 0x5f, 0xa2, 0x43, 0xad, 0xc7, 0x07, 0xcb, 0x59, 0x61, 0xbb, + 0x6b, 0x52, 0x19, 0x18, 0x71, 0xc2, 0x32, 0x50, 0xaa, 0x8a, 0x61, 0x04, 0xf3, 0x69, 0xed, 0xc3, 0x6e, 0xaa, 0x6c, 0x56, 0xf8, 0xb3, 0xea, 0xa4, 0x3b, 0xd1, 0xdf, 0x48, 0x79, 0x0f, 0xc9, 0x9c, + 0x96, 0x02, 0x9a, 0xd3, 0x37, 0x37, 0xbd, 0x9e, 0x37, 0x85, 0xe2, 0x39, 0xba, 0x92, 0x5d, 0xdc, 0x77, 0xbe, 0xf2, 0xf3, 0x65, 0x83, 0xb6, 0xb4, 0x3a, 0xaf, 0xfc, 0xdd, 0x9f, 0x08, 0xaf, 0xc5, + 0x7f, 0x1b, 0x98, 0x0d, 0xad, 0x9a, 0xa3, 0xb6, 0x1d, 0x66, 0x35, 0x96, 0x73, 0xd2, 0x68, 0x93, 0x11, 0xc5, 0x70, 0x98, 0x95, 0xc2, 0x0e, 0xdd, 0x25, 0x5d, 0x09, 0x77, 0xd4, 0xfe, 0xbe, 0x3b, + 0xa1, 0xe7, 0xea, 0x90, 0xd8, 0x0d, 0x98, 0x40, 0x66, 0xb4, 0x0e, 0x2c, 0x84, 0x5e, 0x51, 0x98, 0xfb, 0xbd, 0xa4, 0x8d, 0x93, 0x10, 0x52, 0x64, 0xa7, 0x2b, 0xad, 0x3c, 0x09, 0x8b, 0xad, 0x64, + 0xb7, 0x20, 0x39, 0xb2, 0xa0, 0x07, 0x1a, 0x31, 0x20, 0x58, 0x29, 0xd5, 0x3a, 0xaf, 0x9b, 0x15, 0x37, 0xa1, 0x34, 0xe2, 0xa5, 0x48, 0x0d, 0xfc, 0xd6, 0xd2, 0xd7, 0x3c, 0xe1, 0xec, 0xe6, 0xe2, + 0xc5, 0x0b, 0xdc, 0x77, 0x36, 0x5f, 0xc9, 0x1d, 0xfb, 0x04, 0xdb, 0x90, 0xe8, 0x7c, 0xd2, 0x76, 0xb3, 0x40, 0xe6, 0xa0, 0x8a, 0x83, 0x81, 0xe8, 0xc3, 0xf3, 0x6a, 0xbe, 0x2b, 0x56, 0xfa, 0x30, + 0x1a, 0x95, 0x45, 0x67, 0xb4, 0xa9, 0x0d, 0xa1, 0xb3, 0x65, 0x3d, 0x75, 0x7a, 0x28, 0xc3, 0xee, 0x32, 0xef, 0xeb, 0xd3, 0x1e, 0x25, 0xf7, 0xc8, 0x72, 0x38, 0x01, 0x86, 0x12, 0xb1, 0xa4, 0xed, + 0x70, 0x26, 0x00, 0xf5, 0xb0, 0xf0, 0xf9, 0xba, 0x4e, 0x7b, 0xb1, 0x6d, 0x55, 0xf0, 0x20, 0x91, 0x88, 0x2d, 0x82, 0x29, 0xa6, 0xf3, 0xbb, 0x62, 0xa9, 0xa5, 0x56, 0xf8, 0x0c, 0x9d, 0x3e, 0x72, + 0x2f, 0x5f, 0x41, 0xe7, 0x3b, 0xd4, 0x06, 0x9b, 0xef, 0xc7, 0x8d, 0x9b, 0xd9, 0x02, 0x99, 0xbc, 0x6f, 0xf2, 0x13, 0x4c, 0x25, 0x07, 0xc0, 0x7c, 0x5b, 0xcc, 0x68, 0x11, 0x29, 0x12, 0x6c, 0x19, + 0x23, 0xfb, 0x09, 0x14, 0xb2, 0x7d, 0x2b, 0x40, 0xc5, 0xdd, 0xb6, 0x97, 0xc5, 0x33, 0x1a, 0x9a, 0x60, 0x11, 0xaf, 0x44, 0xab, 0x2e, 0x3e, 0xa0, 0xb5, 0xfe, 0x5a, 0x09, 0xfb, 0xd8, 0x62, 0x85, + 0xa1, 0x18, 0xcb, 0xe1, 0xdb, 0x2a, 0x9a, 0x43, 0xa6, 0xe9, 0x84, 0x43, 0x7f, 0x9f, 0x39, 0x24, 0xb4, 0x54, 0x5e, 0x57, 0xfa, 0x5f, 0x58, 0xfe, 0x6e, 0xbb, 0x90, 0x3f, 0x97, 0x18, 0xff, 0xe4, + 0xf9, 0xbf, 0x96, 0xe7, 0x9f, 0xe0, 0xf3, 0x55, 0xa6, 0xbf, 0x8f, 0xcf, 0x96, 0x6c, 0x8f, 0x75, 0x82, 0x80, 0x37, 0xcd, 0x4d, 0x4d, 0x1f, 0x44, 0x84, 0x59, 0x41, 0xa8, 0x46, 0x75, 0x82, 0x4e, + 0xc0, 0x74, 0x86, 0x5c, 0x1d, 0xc2, 0x81, 0xb3, 0x5b, 0xc5, 0x07, 0xf2, 0x50, 0xc5, 0xab, 0xa0, 0x0a, 0xbb, 0x81, 0x54, 0x55, 0x9b, 0x68, 0xba, 0xd4, 0xe5, 0x9e, 0xe1, 0xb0, 0x9a, 0x4d, 0x33, + 0x4c, 0x4e, 0x20, 0x44, 0x86, 0x97, 0x51, 0x47, 0xf6, 0xad, 0xb5, 0xb9, 0xb6, 0x83, 0x4e, 0x8f, 0x89, 0x9e, 0x49, 0xfa, 0x3f, 0x09, 0x9f, 0xdf, 0xaf, 0x76, 0xbc, 0x54, 0x79, 0x96, 0x7e, 0x2e, + 0x74, 0x9c, 0xd7, 0x38, 0x5a, 0x55, 0x9c, 0xed, 0xd7, 0xa9, 0x16, 0x6f, 0xf7, 0xf8, 0x94, 0x8d, 0x48, 0x7a, 0x21, 0xc3, 0xfa, 0xde, 0xea, 0xf1, 0x6b, 0x87, 0x84, 0x68, 0xc7, 0xc5, 0x60, 0x98, + 0x67, 0x36, 0xcb, 0x71, 0x8c, 0xa1, 0x33, 0x48, 0xdf, 0x19, 0x9b, 0xe5, 0xa2, 0xe4, 0x71, 0x64, 0x53, 0x2d, 0x0f, 0x8a, 0x27, 0x22, 0xc6, 0xdc, 0xef, 0x12, 0x72, 0x67, 0xb5, 0x82, 0x26, 0xdb, + 0x0e, 0x47, 0xf5, 0x37, 0x0b, 0x7f, 0xdd, 0x59, 0x74, 0x77, 0x07, 0xf2, 0x99, 0xf4, 0x68, 0xa1, 0xf0, 0xda, 0x61, 0xf2, 0xbb, 0x76, 0x40, 0xaf, 0x6d, 0x1f, 0xfe, 0xd1, 0x09, 0xe8, 0xbd, 0x09, + 0x50, 0xcb, 0xed, 0xc3, 0x4d, 0x37, 0xce, 0x59, 0xa2, 0xa3, 0x71, 0x14, 0x5b, 0x6d, 0xc8, 0x3c, 0x11, 0xb7, 0x3c, 0xdc, 0x67, 0x72, 0x73, 0x2f, 0x6b, 0xa1, 0x33, 0x18, 0xd0, 0x70, 0xb9, 0xcc, + 0x67, 0xb9, 0xbb, 0x25, 0x3a, 0xb0, 0xc6, 0x10, 0xcb, 0xcc, 0x0b, 0x50, 0xb8, 0x87, 0xae, 0x18, 0x7c, 0x01, 0x6d, 0xba, 0xf3, 0x75, 0x6c, 0x6f, 0x4d, 0x53, 0xf6, 0xd0, 0x89, 0x68, 0x2d, 0x00, + 0x4b, 0xd2, 0x67, 0xa3, 0x91, 0xe3, 0x43, 0x3f, 0xee, 0x50, 0x6d, 0x2a, 0x4a, 0x0a, 0xba, 0x29, 0x98, 0xe4, 0x41, 0xe6, 0x3c, 0xdc, 0x43, 0x02, 0x7e, 0xeb, 0xbc, 0x30, 0x5d, 0x6f, 0x60, 0x43, + 0xe0, 0xed, 0x15, 0xb0, 0x81, 0xfb, 0x1c, 0x55, 0x50, 0xbf, 0x5b, 0xba, 0x50, 0x34, 0xde, 0x90, 0x65, 0x67, 0x4b, 0x1b, 0x29, 0x0b, 0x30, 0x48, 0x10, 0xba, 0xce, 0x48, 0x44, 0xa6, 0xc6, 0x10, + 0x9e, 0xf3, 0x6c, 0x58, 0x1f, 0x20, 0x33, 0x56, 0x5d, 0x0d, 0x5d, 0x58, 0x7b, 0x3f, 0xe5, 0x11, 0x58, 0xeb, 0x53, 0x9d, 0x61, 0x16, 0x0d, 0x0d, 0xcf, 0x53, 0x66, 0xfa, 0x2a, 0x45, 0xc3, 0x31, + 0x3d, 0x63, 0xf0, 0x02, 0x9e, 0x0f, 0x51, 0x65, 0x51, 0x2e, 0x6f, 0xf7, 0x03, 0x7b, 0x58, 0x48, 0x70, 0x91, 0xc1, 0x77, 0x53, 0xa7, 0x72, 0xbd, 0xfb, 0xcc, 0x1d, 0x9f, 0xf4, 0xb2, 0xd3, 0xfc, + 0xaf, 0xbf, 0xd3, 0xb7, 0x19, 0x42, 0xe7, 0x56, 0x83, 0xe7, 0xf5, 0xb8, 0x8b, 0x21, 0x53, 0x49, 0xb3, 0x73, 0x56, 0x16, 0xf6, 0x86, 0xc2, 0xb7, 0x19, 0x5d, 0x9f, 0xf9, 0x5e, 0x5f, 0x36, 0x78, + 0x3a, 0x92, 0x17, 0x0c, 0xd3, 0x8b, 0xf4, 0x3d, 0xe4, 0x36, 0x05, 0x30, 0x2c, 0x8c, 0xc4, 0x0b, 0x15, 0x1d, 0x8c, 0x92, 0x30, 0x33, 0xb4, 0x8b, 0xfa, 0x28, 0xf4, 0x76, 0x29, 0x3f, 0xf4, 0x41, + 0xcd, 0x73, 0xce, 0x39, 0x71, 0xc8, 0x97, 0xd4, 0xb3, 0xf8, 0xf4, 0x88, 0x26, 0xf3, 0xf1, 0xce, 0x92, 0xef, 0x17, 0x9f, 0xe4, 0x2b, 0xbf, 0xdd, 0x4b, 0x45, 0x69, 0xcd, 0xaf, 0x37, 0xeb, 0x24, + 0x89, 0x75, 0xf6, 0x78, 0x1e, 0xc9, 0xc9, 0x9f, 0x3b, 0x81, 0x67, 0xa0, 0x10, 0xf8, 0x71, 0xd8, 0x76, 0x13, 0x1a, 0x1a, 0xe8, 0x6c, 0x62, 0x43, 0x55, 0xfb, 0x75, 0xb4, 0xed, 0x4c, 0xe7, 0xc0, + 0x46, 0x21, 0xa7, 0x68, 0x47, 0x49, 0x47, 0xa1, 0x65, 0xcc, 0x85, 0x5a, 0x1b, 0x64, 0xdd, 0x91, 0xa8, 0x47, 0xc2, 0x70, 0x58, 0x75, 0x2d, 0x04, 0x36, 0x61, 0x42, 0x59, 0xf4, 0xd7, 0x8c, 0xaa, + 0xf5, 0xe2, 0x81, 0x09, 0xcd, 0xb6, 0x25, 0xd2, 0x73, 0xbb, 0x32, 0x10, 0xa3, 0x90, 0xda, 0x63, 0x2c, 0x8c, 0x2b, 0xf2, 0x84, 0xc7, 0xa4, 0x6f, 0x5b, 0xbf, 0x7e, 0x8b, 0x9f, 0x4f, 0xbe, 0xb9, + 0xaf, 0x93, 0x5f, 0x59, 0xb9, 0x7b, 0x87, 0x09, 0x81, 0xe7, 0xa3, 0x66, 0x93, 0xd1, 0x16, 0x93, 0xba, 0x8c, 0x0e, 0x72, 0xda, 0x11, 0xc3, 0x83, 0xac, 0x8c, 0x7b, 0x8b, 0xf1, 0x60, 0x24, 0x2f, + 0x2b, 0xae, 0xa7, 0xec, 0x22, 0x0f, 0xee, 0xf3, 0x8b, 0x2e, 0xd0, 0x67, 0x3a, 0xca, 0xd8, 0xa9, 0x0c, 0x9f, 0xb7, 0x85, 0x72, 0x7f, 0x90, 0x2c, 0x12, 0xb3, 0xf1, 0x25, 0xc2, 0x8f, 0xad, 0xd5, + 0x60, 0x18, 0x2d, 0xe3, 0x19, 0x27, 0xce, 0x35, 0xdf, 0xdf, 0x4d, 0x72, 0x2b, 0x99, 0xbb, 0x63, 0x8f, 0xc9, 0x36, 0xc5, 0xbc, 0x65, 0x71, 0xc2, 0x05, 0xa3, 0x3c, 0x6c, 0xdc, 0xfa, 0x85, 0x75, + 0x2f, 0x66, 0xdd, 0x91, 0x65, 0xdf, 0x4f, 0xdb, 0xb2, 0x6d, 0x9a, 0x81, 0xba, 0xd1, 0xe4, 0x1b, 0xe7, 0x89, 0x03, 0x7e, 0xec, 0x6b, 0xf0, 0xd0, 0x07, 0x7e, 0x85, 0x55, 0x1f, 0x3e, 0xa5, 0x11, + 0xbd, 0x0f, 0xc6, 0x9a, 0x5c, 0xf6, 0x16, 0xcc, 0xbc, 0xe1, 0x2d, 0x7e, 0x63, 0x11, 0xc6, 0xea, 0x50, 0xcc, 0xe5, 0x41, 0xb9, 0xa1, 0xfb, 0x85, 0xa9, 0x2a, 0x43, 0xaa, 0xbb, 0x5d, 0xd8, 0xa8, + 0x36, 0x01, 0x30, 0x97, 0x30, 0x85, 0x41, 0xbd, 0x12, 0xd8, 0xc3, 0x86, 0x19, 0x63, 0xfa, 0x1a, 0x53, 0xa8, 0x4d, 0x4d, 0x57, 0xa8, 0x09, 0xe5, 0x12, 0x6c, 0x60, 0x0c, 0xb9, 0xf1, 0x43, 0x9d, + 0xc3, 0xc2, 0x05, 0x81, 0xbb, 0x4b, 0xa9, 0x33, 0x5c, 0x2f, 0x47, 0x4d, 0x06, 0xf7, 0x53, 0xac, 0x3d, 0xe9, 0x10, 0x89, 0xbd, 0xd4, 0x29, 0xeb, 0x06, 0xf6, 0x27, 0x86, 0x3e, 0x7a, 0x45, 0x62, + 0xed, 0xba, 0x64, 0x99, 0x58, 0x2c, 0x75, 0x42, 0xa9, 0xea, 0xb8, 0x68, 0xd7, 0x66, 0x0c, 0x68, 0xd8, 0x59, 0xb3, 0x1d, 0xa4, 0x9c, 0xf8, 0x3c, 0xc3, 0xb2, 0x2b, 0xc8, 0xe2, 0xa6, 0x01, 0x2f, + 0x76, 0x77, 0x03, 0xc2, 0x4e, 0xcb, 0x29, 0xc5, 0x4c, 0x78, 0x17, 0xee, 0x0c, 0x35, 0x62, 0xb8, 0x13, 0xeb, 0x8e, 0x36, 0x18, 0x01, 0xc0, 0xc1, 0x8b, 0x38, 0x76, 0x64, 0x71, 0x8a, 0x93, 0xad, + 0x53, 0x18, 0xeb, 0x2e, 0xe7, 0x34, 0xfe, 0x6c, 0x92, 0x1f, 0xdf, 0xf4, 0x71, 0x47, 0x23, 0xe4, 0x25, 0x6f, 0xe5, 0x03, 0xea, 0x07, 0x2e, 0x1c, 0xd3, 0x6c, 0x4a, 0x8d, 0x5a, 0xcc, 0xe6, 0xc3, + 0x38, 0x0f, 0x97, 0x04, 0x30, 0xe9, 0x74, 0xb6, 0x9e, 0x4c, 0x67, 0xa5, 0xa1, 0x2b, 0x73, 0x93, 0xec, 0x1e, 0xd0, 0xa5, 0x25, 0xad, 0x0f, 0x85, 0x25, 0x4f, 0x77, 0xe1, 0x8c, 0x8f, 0xe5, 0xdc, + 0xf4, 0xc7, 0x8e, 0x0a, 0x67, 0x13, 0x34, 0x33, 0xac, 0x19, 0x33, 0x95, 0x55, 0x24, 0x5a, 0x8b, 0xd6, 0xc8, 0xf6, 0x62, 0xce, 0xeb, 0xc2, 0xc6, 0x14, 0xd6, 0xb0, 0x92, 0x29, 0x24, 0xcd, 0xaf, + 0x0f, 0xf8, 0x8f, 0x17, 0xb3, 0x9a, 0xd7, 0xfe, 0xb6, 0x4d, 0x11, 0xfa, 0x42, 0x61, 0xc8, 0x07, 0xd4, 0x33, 0x62, 0xde, 0x1b, 0x15, 0xa1, 0xcf, 0x4a, 0x40, 0x9a, 0x44, 0x2e, 0x2e, 0xeb, 0x6b, + 0xd6, 0x92, 0xa4, 0x4b, 0x67, 0xb9, 0x74, 0x4a, 0x19, 0xb5, 0x45, 0x7d, 0x6c, 0x6a, 0x43, 0x71, 0x6f, 0x74, 0xb6, 0x53, 0x33, 0x28, 0x7d, 0x66, 0xbe, 0xd9, 0xda, 0xbe, 0xc1, 0x0b, 0x74, 0xd2, + 0x87, 0x97, 0x83, 0xd2, 0x67, 0x21, 0x29, 0x0b, 0xb1, 0x05, 0x35, 0x0f, 0x65, 0x3e, 0x22, 0x34, 0xc7, 0x93, 0xd5, 0x43, 0x3d, 0x25, 0x9c, 0xa5, 0xb8, 0x94, 0xd2, 0x31, 0xd0, 0x33, 0xb8, 0x67, + 0xd6, 0xf2, 0x37, 0x85, 0x0f, 0x47, 0x7c, 0x79, 0x8e, 0x0a, 0x99, 0xe9, 0x5b, 0x9a, 0x29, 0xd9, 0x87, 0x04, 0xbc, 0xb2, 0x6c, 0x2e, 0xef, 0x2a, 0xcf, 0xf6, 0xcf, 0x91, 0x13, 0xae, 0x0a, 0x9c, + 0xbf, 0x66, 0xcc, 0xdf, 0x98, 0x22, 0x4d, 0xc3, 0x43, 0xf4, 0xd7, 0x67, 0x18, 0xfe, 0x72, 0xcc, 0xd1, 0x92, 0xf0, 0x33, 0x47, 0x1c, 0xbf, 0x7d, 0x85, 0xc8, 0xd1, 0x2e, 0x86, 0x4f, 0x7b, 0xad, + 0x9e, 0xe5, 0xec, 0xc7, 0x77, 0xb6, 0x5e, 0xe0, 0x79, 0xc2, 0x32, 0x77, 0x53, 0xe4, 0x1f, 0x5a, 0x11, 0xaf, 0xa8, 0xc9, 0xc7, 0x8f, 0x39, 0x33, 0xd5, 0xfd, 0x34, 0xfd, 0x96, 0xe9, 0x2e, 0x9e, + 0xad, 0x43, 0x65, 0x1f, 0x98, 0xec, 0x3b, 0xf4, 0x50, 0x0e, 0x97, 0x6c, 0xe6, 0xad, 0x13, 0x65, 0x98, 0x99, 0x36, 0xb1, 0xdd, 0x39, 0xee, 0xc8, 0x55, 0xbc, 0xad, 0xb6, 0xa7, 0x52, 0x65, 0x95, + 0xe5, 0x4a, 0xb0, 0xe0, 0xaa, 0x89, 0x70, 0x08, 0x86, 0xf6, 0x62, 0xdb, 0xe3, 0xc6, 0xf1, 0xf0, 0xc0, 0x51, 0x7e, 0x3a, 0xa7, 0x39, 0x38, 0x67, 0xfd, 0xd8, 0xdb, 0x97, 0x2e, 0xbb, 0xa6, 0x0f, + 0x45, 0x39, 0xfc, 0xbe, 0xc9, 0xfc, 0xe5, 0x4b, 0x3f, 0xc3, 0x18, 0xf5, 0x86, 0xfc, 0xdc, 0xaf, 0xba, 0xf3, 0x80, 0x1b, 0x5c, 0x7d, 0x22, 0xa9, 0x29, 0xdd, 0x79, 0x8a, 0x25, 0xdc, 0x76, 0x4b, + 0x99, 0x9b, 0xf9, 0x96, 0x0b, 0xc9, 0x2b, 0x7e, 0x6b, 0xf7, 0x36, 0x61, 0x31, 0x98, 0x69, 0x4e, 0x0f, 0x22, 0xfc, 0x4d, 0xd6, 0x1d, 0x49, 0xd2, 0x41, 0x04, 0xd0, 0x35, 0xc3, 0xf5, 0xf3, 0x80, + 0xe2, 0xe6, 0xcb, 0x3d, 0x1a, 0x4e, 0x47, 0x99, 0x9a, 0x77, 0x64, 0x39, 0x22, 0xf7, 0xb1, 0x0b, 0x18, 0x32, 0x94, 0x53, 0x35, 0xa0, 0x5b, 0x8c, 0x25, 0x50, 0xb8, 0x66, 0x0e, 0xe6, 0x01, 0xd3, + 0xd2, 0x8f, 0xb8, 0xa8, 0x11, 0xfa, 0xe2, 0x06, 0x7c, 0x36, 0x1f, 0x3d, 0x4e, 0x04, 0xf4, 0x7a, 0x22, 0x24, 0xa6, 0xae, 0xfd, 0xba, 0x6b, 0x9d, 0xbf, 0x97, 0xa4, 0xa5, 0x8e, 0xef, 0x78, 0xca, + 0xf9, 0x53, 0xdf, 0x8b, 0x85, 0x7e, 0x3a, 0x55, 0xfe, 0x38, 0xfa, 0xcf, 0xad, 0x3c, 0xe8, 0x86, 0x00, 0xde, 0xd1, 0xed, 0x49, 0xed, 0xcc, 0xb8, 0x32, 0x92, 0x6e, 0x8d, 0xed, 0x9f, 0xf7, 0x24, + 0xb9, 0x05, 0x7e, 0x26, 0xf8, 0xc5, 0xa5, 0xc6, 0xf8, 0x7e, 0xd2, 0xa3, 0x04, 0x01, 0x67, 0xbb, 0x48, 0x93, 0x43, 0x8b, 0xec, 0xc7, 0x82, 0x10, 0x0f, 0x24, 0xc0, 0x9e, 0xd3, 0x72, 0x1e, 0xeb, + 0x84, 0x31, 0xff, 0xe9, 0xee, 0x1b, 0xcd, 0xf3, 0x13, 0x43, 0x7f, 0xdc, 0xf0, 0xe3, 0xb5, 0xb0, 0xc1, 0x05, 0xdc, 0xf3, 0x57, 0x9e, 0xce, 0xda, 0x06, 0x10, 0x76, 0x22, 0xc0, 0xee, 0x4c, 0x76, + 0x3d, 0x5f, 0x0b, 0x2b, 0x79, 0xba, 0x9a, 0x19, 0x4e, 0x30, 0x14, 0x79, 0xab, 0xca, 0x04, 0xa4, 0x9c, 0x8d, 0x20, 0x16, 0x5a, 0xb1, 0x93, 0xde, 0xff, 0xc3, 0xde, 0x9f, 0x36, 0x29, 0xcb, 0x45, + 0xfb, 0xe1, 0xf0, 0x57, 0xe9, 0xba, 0x5f, 0x25, 0x31, 0x5e, 0xcc, 0x83, 0x4f, 0x25, 0xa9, 0x88, 0xa2, 0xa0, 0x08, 0x28, 0x8a, 0x42, 0x92, 0x53, 0xc5, 0x3c, 0x0f, 0x32, 0x43, 0x9d, 0xca, 0x67, + 0x7f, 0xca, 0xa1, 0x07, 0xfb, 0x6a, 0x5b, 0xda, 0xfb, 0x3a, 0x75, 0xe7, 0x9c, 0xfa, 0xbf, 0x6a, 0x36, 0xda, 0x0b, 0xf9, 0xad, 0xbd, 0xd7, 0x5e, 0x7b, 0x8d, 0x1e, 0x86, 0xd3, 0xb9, 0x02, 0x9b, + 0x75, 0x5d, 0xb1, 0x20, 0x18, 0xb0, 0x0b, 0x66, 0x91, 0xb0, 0x44, 0xba, 0x92, 0x8f, 0xf3, 0x64, 0x65, 0xd5, 0xa4, 0xb4, 0x52, 0x61, 0x49, 0xb2, 0x99, 0x25, 0xb3, 0xe3, 0x98, 0xc3, 0x34, 0xff, + 0x49, 0x85, 0xd8, 0x3e, 0xe5, 0x52, 0xce, 0xef, 0x95, 0x6b, 0x76, 0x3f, 0xb9, 0xfa, 0xa4, 0xca, 0x7b, 0x4b, 0xff, 0x15, 0xcd, 0xdb, 0xbb, 0x7d, 0xd3, 0x63, 0xf7, 0x83, 0xe5, 0xc2, 0x80, 0xcd, + 0x88, 0xe5, 0x42, 0x31, 0x0d, 0xa7, 0x00, 0x83, 0x2e, 0x47, 0xe1, 0x88, 0x33, 0xc6, 0xcc, 0xd8, 0x16, 0x0b, 0x11, 0xa7, 0x14, 0x12, 0x2d, 0x65, 0xee, 0xb0, 0xc6, 0xe9, 0xca, 0xe8, 0x46, 0x9c, + 0xe1, 0x20, 0x88, 0x02, 0x77, 0x10, 0x2b, 0xeb, 0xe1, 0x16, 0x6f, 0x4c, 0x05, 0x43, 0xc5, 0x83, 0x22, 0x33, 0x74, 0x35, 0x00, 0xf7, 0xe9, 0x91, 0x64, 0x13, 0xbc, 0x0b, 0xbe, 0xef, 0x5c, 0xf9, + 0x7e, 0xd8, 0xbf, 0xa3, 0xb3, 0x3c, 0xd3, 0x10, 0xe9, 0x4a, 0xf4, 0x0a, 0xc6, 0x09, 0x80, 0x0b, 0xa1, 0xc7, 0x08, 0xa8, 0x1c, 0x28, 0xe3, 0x25, 0x42, 0x98, 0x38, 0x56, 0x8c, 0x15, 0x32, 0x5c, + 0xd5, 0xf2, 0x6a, 0x56, 0xcc, 0xaa, 0x98, 0xb6, 0x16, 0xc6, 0x9c, 0x04, 0xd7, 0x14, 0x2f, 0x99, 0x13, 0xf7, 0x38, 0x89, 0x50, 0x0f, 0x6d, 0x06, 0x5e, 0x0e, 0x20, 0xa4, 0xb0, 0x83, 0x50, 0xa7, + 0x5b, 0x94, 0x9b, 0x83, 0x9b, 0x5a, 0xf1, 0x96, 0x1b, 0xa4, 0xdb, 0x45, 0xc7, 0x1b, 0x25, 0xb6, 0x8c, 0xa1, 0xa4, 0xec, 0x56, 0x48, 0x4f, 0x29, 0xf9, 0x3f, 0x5f, 0x7f, 0xb6, 0xe6, 0x57, 0xaf, + 0x39, 0x50, 0xef, 0xd5, 0x4c, 0x6e, 0xe3, 0x01, 0x5e, 0xcb, 0xe3, 0x84, 0x89, 0xe3, 0xdc, 0xed, 0x7d, 0xa5, 0x55, 0x95, 0x77, 0x29, 0xac, 0x42, 0x7c, 0x36, 0xdf, 0x7c, 0xbd, 0x81, 0x9d, 0x68, + 0x60, 0xbf, 0x7f, 0xf1, 0x04, 0xa0, 0x95, 0x65, 0x6f, 0xc9, 0x68, 0xc8, 0x97, 0xf6, 0x9a, 0x61, 0xad, 0x65, 0xf1, 0xeb, 0x6f, 0xf9, 0x2d, 0xad, 0xcb, 0xf6, 0x62, 0x73, 0x18, 0x9d, 0xbe, 0xf4, + 0x2a, 0xa9, 0x3f, 0x5b, 0x7d, 0x42, 0xad, 0xc8, 0x8b, 0xf7, 0xf7, 0x85, 0x6e, 0x7e, 0x46, 0xe8, 0x39, 0x6e, 0x71, 0xfa, 0xff, 0xcc, 0x3a, 0x96, 0x56, 0x5e, 0xbc, 0x6d, 0x17, 0xb7, 0x26, 0x1b, + 0x2f, 0x4e, 0x5e, 0x37, 0x1a, 0xe4, 0x37, 0x6b, 0x4e, 0xd3, 0x0e, 0x35, 0xd3, 0xcc, 0xde, 0xb0, 0x22, 0xee, 0xec, 0x34, 0x9f, 0xb2, 0x0f, 0x73, 0xcb, 0x28, 0x33, 0xeb, 0x02, 0xd6, 0xed, 0xc1, + 0xf9, 0x76, 0x43, 0xfa, 0x98, 0x57, 0x87, 0xdc, 0x82, 0x58, 0x78, 0x71, 0x3b, 0x0c, 0xb3, 0xf2, 0xfa, 0x69, 0xff, 0xbd, 0xe6, 0x23, 0xf2, 0x5f, 0xdb, 0x26, 0x9f, 0x09, 0x97, 0xb9, 0xa1, 0xfc, + 0x61, 0x91, 0x9c, 0xc7, 0x43, 0xb0, 0x5f, 0xf0, 0x4c, 0x32, 0xb1, 0x53, 0x23, 0x9f, 0xc6, 0xa6, 0x13, 0x4f, 0x65, 0xc7, 0x63, 0x09, 0xbd, 0x9e, 0x2d, 0xc7, 0x65, 0x0c, 0x9b, 0xc2, 0x00, 0x75, + 0x49, 0xb4, 0xa2, 0xc2, 0x60, 0x9f, 0xef, 0xe3, 0x0e, 0x10, 0x76, 0xcb, 0xd1, 0xc6, 0xb2, 0x6d, 0x6c, 0x37, 0x4b, 0x66, 0x21, 0x8c, 0x42, 0xcd, 0xd6, 0xe3, 0x2c, 0x66, 0x7f, 0x00, 0xaa, 0xdd, + 0xa8, 0x0b, 0xa6, 0xf2, 0xe1, 0xa8, 0xec, 0x1a, 0x5f, 0xa8, 0x19, 0xe3, 0xf1, 0xd1, 0xef, 0x76, 0xa2, 0x7d, 0x8d, 0xc9, 0xb3, 0x07, 0xc0, 0x0f, 0xb4, 0x3f, 0xa0, 0x72, 0xbd, 0x33, 0x04, 0xfb, + 0x1d, 0x06, 0x73, 0x88, 0x5e, 0x3b, 0x25, 0x55, 0x03, 0xa3, 0x63, 0x61, 0x40, 0x29, 0xb0, 0xdf, 0x2a, 0xa8, 0x75, 0x1c, 0xed, 0x57, 0x1b, 0x76, 0x3c, 0x09, 0xfc, 0x01, 0xb3, 0x35, 0x04, 0x76, + 0x09, 0x79, 0x31, 0xba, 0x92, 0x31, 0x6d, 0xa6, 0xad, 0x27, 0x23, 0x75, 0xc2, 0x16, 0xa0, 0xb9, 0x20, 0xd2, 0x0c, 0xd3, 0x59, 0x1b, 0x0d, 0xc5, 0x94, 0xa9, 0xc6, 0x85, 0x08, 0xb7, 0x75, 0xba, + 0xe5, 0x9d, 0x9c, 0x70, 0x8f, 0x8f, 0xb5, 0xd1, 0xe3, 0xdd, 0xe3, 0x30, 0xf4, 0xac, 0xca, 0x7e, 0xbc, 0x82, 0x70, 0x1c, 0x5e, 0x88, 0x3c, 0x7e, 0x77, 0x82, 0x36, 0xba, 0x9c, 0x74, 0x58, 0x71, + 0x9a, 0xc9, 0xdd, 0x76, 0x40, 0x07, 0xb9, 0x42, 0x19, 0x65, 0x7a, 0x5c, 0xb5, 0x8d, 0xc4, 0x1c, 0x0e, 0x19, 0x23, 0x70, 0x9b, 0x4d, 0xb3, 0x83, 0x81, 0xa9, 0x67, 0xc8, 0x24, 0x41, 0x8e, 0x56, + 0x1b, 0x6a, 0xb3, 0x21, 0x07, 0x8c, 0x01, 0x97, 0xfb, 0x6e, 0x57, 0xa6, 0x42, 0x8e, 0x2a, 0x12, 0xba, 0xe8, 0xa8, 0x88, 0x6a, 0x7c, 0x7f, 0x22, 0x53, 0xcd, 0xf4, 0xb3, 0x59, 0xff, 0x9e, 0xf4, + 0xcc, 0xac, 0x32, 0xff, 0x98, 0xcb, 0xdb, 0x27, 0x16, 0xe3, 0x8b, 0x5c, 0xea, 0xaf, 0x30, 0xc4, 0x9f, 0x33, 0x48, 0x7d, 0x22, 0x7e, 0x42, 0xf3, 0xd3, 0xad, 0x73, 0xf4, 0x67, 0x8f, 0xb5, 0x46, + 0xcc, 0xd3, 0x1c, 0x38, 0xec, 0xdb, 0x48, 0xe7, 0x02, 0x78, 0xcd, 0x29, 0x4b, 0x94, 0xef, 0xd2, 0x95, 0x90, 0x29, 0xfe, 0xca, 0x35, 0xd9, 0xe6, 0x50, 0xb2, 0x55, 0x0b, 0xaf, 0xa9, 0x9c, 0xa3, + 0xf1, 0xd0, 0x2f, 0x13, 0x73, 0x59, 0x99, 0xc1, 0x3e, 0x07, 0x8c, 0xb4, 0x5d, 0x2c, 0x90, 0x89, 0xcc, 0xca, 0x29, 0x03, 0x0a, 0x1e, 0xc4, 0x54, 0x0e, 0x94, 0x54, 0xfa, 0xaa, 0xe3, 0xcc, 0x19, + 0x45, 0x3d, 0x7f, 0x8e, 0x3e, 0x89, 0xea, 0x0f, 0xc9, 0xb9, 0x77, 0x4a, 0x6b, 0xfe, 0x5b, 0x44, 0x99, 0xd9, 0x5e, 0x18, 0x0e, 0x33, 0x2d, 0xbe, 0xdb, 0xac, 0x80, 0x78, 0x96, 0x55, 0x57, 0xb2, + 0x17, 0x26, 0x5d, 0x07, 0xe7, 0x32, 0x94, 0x3d, 0xd8, 0x73, 0x14, 0x92, 0xd1, 0x6c, 0x60, 0xae, 0x76, 0xd1, 0x04, 0xe6, 0x0c, 0x1d, 0xa5, 0x74, 0xb9, 0x8a, 0x97, 0x8b, 0x66, 0x2b, 0xfa, 0x93, + 0x68, 0xb0, 0xd9, 0xa4, 0x16, 0xea, 0x4c, 0xcb, 0x79, 0xd6, 0x05, 0x1c, 0x11, 0xd1, 0x72, 0x08, 0x98, 0xbe, 0x22, 0x95, 0xb0, 0x60, 0xae, 0x61, 0x51, 0x43, 0x40, 0x98, 0x47, 0x93, 0x63, 0x20, + 0x39, 0x23, 0x2f, 0xc3, 0x7d, 0x8d, 0xdb, 0x2f, 0xe0, 0x9d, 0x24, 0xa7, 0x8f, 0x7c, 0xd5, 0xf7, 0xd9, 0x53, 0x24, 0xd7, 0x5c, 0x86, 0x57, 0xa0, 0x2e, 0x01, 0xba, 0x3f, 0x3f, 0x17, 0xf5, 0x32, + 0x21, 0xdc, 0xec, 0xeb, 0x5f, 0x9b, 0xd6, 0x9f, 0x09, 0x69, 0xfa, 0x40, 0xf7, 0xcc, 0x93, 0xb7, 0xd1, 0x10, 0xed, 0x17, 0xda, 0xe4, 0xa6, 0x71, 0xc1, 0x54, 0x4b, 0xd0, 0x13, 0x98, 0x14, 0x49, + 0x8f, 0xfb, 0xcd, 0x66, 0x47, 0x77, 0x5e, 0xa2, 0x65, 0x68, 0x91, 0x92, 0x56, 0x49, 0x4d, 0xc9, 0x69, 0x20, 0xce, 0x11, 0x59, 0x2b, 0x85, 0xcc, 0x53, 0x39, 0xa7, 0x9e, 0xab, 0xdc, 0x96, 0x4f, + 0xf1, 0x56, 0x95, 0x32, 0xd3, 0x28, 0x16, 0xe4, 0x66, 0x32, 0x95, 0x88, 0xce, 0x55, 0xa5, 0x0d, 0x2c, 0x0f, 0x5a, 0x41, 0xa3, 0x74, 0x3e, 0xa9, 0xfb, 0xc9, 0x22, 0xfb, 0x1b, 0x8b, 0xf7, 0x17, + 0x95, 0x06, 0xec, 0xdf, 0x4c, 0xbd, 0x97, 0x94, 0xfa, 0x1b, 0x83, 0xd3, 0x59, 0xa3, 0x3f, 0xf3, 0x15, 0xfe, 0x4e, 0x01, 0x19, 0xbe, 0xb6, 0xa4, 0x7d, 0x55, 0xd4, 0x7e, 0xca, 0xf4, 0x5e, 0xc1, + 0x53, 0x37, 0x12, 0xe0, 0xde, 0xb1, 0xf0, 0xe7, 0xf5, 0xd6, 0xde, 0xc9, 0x9e, 0x78, 0xfe, 0x36, 0x38, 0x1f, 0x0a, 0x7b, 0xd4, 0x5c, 0x33, 0xa3, 0x51, 0x8e, 0x89, 0x35, 0xb1, 0x30, 0xc0, 0x79, + 0xb5, 0x52, 0xf4, 0xdc, 0xe5, 0xf1, 0xce, 0x70, 0x27, 0xe3, 0xd1, 0xc6, 0x59, 0x87, 0x5d, 0x47, 0xab, 0x07, 0xa4, 0x6a, 0xc3, 0xcd, 0x88, 0x3d, 0xce, 0x6c, 0x89, 0x3c, 0x18, 0x9e, 0x1e, 0xee, + 0x0e, 0xc2, 0xd2, 0xde, 0xe3, 0x92, 0x57, 0x2e, 0x40, 0x0b, 0x42, 0xac, 0xa9, 0xa2, 0x26, 0xaa, 0x8c, 0xd5, 0x66, 0x66, 0x55, 0x84, 0x88, 0xf0, 0xf5, 0xdf, 0x13, 0x93, 0xc5, 0xe5, 0x9d, 0x7f, + 0xaf, 0x90, 0x90, 0x79, 0x51, 0xa6, 0xd9, 0x6f, 0xf2, 0xf3, 0xa7, 0x39, 0x26, 0xcf, 0xca, 0xcf, 0x37, 0x25, 0xfb, 0xae, 0xe3, 0xe5, 0x89, 0xc3, 0xfc, 0x85, 0xe8, 0x95, 0x65, 0x79, 0x91, 0x5d, + 0xbc, 0x2a, 0x3d, 0x4e, 0xf1, 0x68, 0x27, 0x36, 0xd3, 0xd6, 0x9d, 0xb4, 0x1e, 0x0f, 0xd7, 0xec, 0xb8, 0x90, 0x38, 0x16, 0x77, 0x0c, 0x12, 0x06, 0x68, 0xff, 0xa8, 0x1a, 0x50, 0x12, 0xb3, 0xe8, + 0xaa, 0x03, 0x42, 0x30, 0xdd, 0x67, 0xe3, 0x30, 0x97, 0x6c, 0x85, 0x01, 0x60, 0x95, 0x35, 0x76, 0x03, 0x0b, 0x49, 0xc6, 0x70, 0x3d, 0xad, 0xf5, 0x8e, 0xdd, 0xf3, 0xcb, 0x5a, 0x83, 0x91, 0x19, + 0x99, 0xb9, 0xf8, 0x60, 0xba, 0xd9, 0x07, 0x0f, 0x74, 0xa5, 0x37, 0xa6, 0xdc, 0x73, 0xa7, 0x3c, 0xb1, 0x7d, 0x5c, 0x68, 0x5e, 0x01, 0x28, 0x2c, 0xb3, 0x6f, 0x62, 0x40, 0x37, 0x4e, 0xc6, 0x6b, + 0xaf, 0x34, 0xdb, 0x41, 0x86, 0x49, 0x55, 0x2c, 0xd5, 0xc8, 0x72, 0xd1, 0x62, 0x49, 0x0e, 0x24, 0x9b, 0x85, 0xc2, 0x74, 0x59, 0xe7, 0x6b, 0x40, 0x41, 0x4d, 0x8f, 0x99, 0x5a, 0xf0, 0xee, 0xae, + 0x26, 0xf5, 0x02, 0x6f, 0x49, 0x81, 0xea, 0x56, 0x7b, 0xc3, 0xdf, 0x67, 0x03, 0x32, 0xf4, 0x64, 0x92, 0xd6, 0xf1, 0x56, 0x70, 0x6b, 0x72, 0xaf, 0x12, 0xf2, 0x4c, 0xc5, 0xd4, 0xee, 0xc7, 0xf5, + 0x8b, 0xed, 0x24, 0x1b, 0x5a, 0x9a, 0x71, 0xaf, 0xf1, 0xdf, 0x49, 0x8c, 0x3c, 0xe1, 0x62, 0xba, 0x12, 0x3d, 0x81, 0x72, 0xbd, 0x3c, 0x9f, 0x2c, 0x7a, 0x38, 0x95, 0xfc, 0xa3, 0x62, 0x73, 0x29, + 0x11, 0x25, 0xa3, 0x8a, 0x6d, 0xd7, 0x36, 0xd9, 0x06, 0x7b, 0xb8, 0x22, 0xc6, 0x03, 0x98, 0x47, 0xd7, 0xbe, 0x35, 0xb1, 0x58, 0x6c, 0x30, 0xed, 0x46, 0x87, 0x4c, 0xf3, 0x04, 0xc8, 0x73, 0x62, + 0x12, 0xaa, 0x7d, 0x8f, 0x21, 0x66, 0xfa, 0xa8, 0x92, 0x84, 0x7d, 0xb5, 0xb6, 0xf9, 0x22, 0x92, 0x34, 0x94, 0x81, 0x37, 0xc9, 0x7a, 0x9b, 0x65, 0x07, 0xaf, 0x32, 0x77, 0x6a, 0xf4, 0x28, 0x54, + 0xe9, 0x67, 0xc5, 0xdc, 0x90, 0x3e, 0x6b, 0x2d, 0xc9, 0xbe, 0x41, 0x15, 0x7e, 0xaa, 0x4c, 0xd7, 0x95, 0xe6, 0x05, 0xd4, 0x33, 0xa6, 0x70, 0x9f, 0x62, 0x5c, 0x93, 0x01, 0x3a, 0xde, 0x51, 0x5e, + 0x99, 0x47, 0xd3, 0x75, 0x82, 0x93, 0x38, 0x16, 0xfa, 0xe6, 0x78, 0xab, 0xe7, 0x73, 0x2c, 0xf8, 0x76, 0xad, 0x24, 0x59, 0x34, 0x34, 0xb5, 0xe2, 0x5e, 0x60, 0x39, 0xfc, 0x0b, 0x7b, 0x66, 0xb5, + 0xbc, 0x52, 0xbd, 0xbc, 0xc5, 0xe5, 0x7a, 0x78, 0xa6, 0xf5, 0x78, 0x6e, 0x44, 0x30, 0xc4, 0x23, 0x7b, 0x21, 0xa2, 0xe9, 0xdd, 0xc6, 0x09, 0x70, 0x6a, 0x34, 0xe7, 0x04, 0x1a, 0xdd, 0x94, 0x7b, + 0x61, 0x66, 0xc3, 0x24, 0xe7, 0xba, 0xa3, 0xe3, 0x5c, 0xb1, 0xf8, 0x70, 0x7e, 0x44, 0xe5, 0xe9, 0x61, 0x17, 0x2e, 0x5a, 0xb8, 0x70, 0xe1, 0x3c, 0xa4, 0xf8, 0x1d, 0x39, 0x4f, 0x49, 0xba, 0x0b, + 0x13, 0x45, 0x15, 0x3c, 0x5d, 0x5d, 0x10, 0x05, 0x66, 0x19, 0x6c, 0x36, 0x93, 0x7c, 0xb9, 0xaf, 0xe3, 0x3c, 0x6f, 0x63, 0x23, 0xf0, 0x8a, 0xeb, 0xe6, 0xfa, 0x29, 0x45, 0xc3, 0x48, 0x22, 0xfd, + 0xdc, 0xe9, 0xe6, 0xad, 0x0e, 0xf8, 0x65, 0xa7, 0xbf, 0x29, 0x86, 0x14, 0x79, 0x91, 0x75, 0x6e, 0x95, 0x91, 0x5f, 0xf7, 0x70, 0xe8, 0xc9, 0xc6, 0x3e, 0x1f, 0xfe, 0xeb, 0x7b, 0xfe, 0x79, 0xe6, + 0x75, 0xe2, 0x7e, 0x2d, 0xf0, 0x9f, 0x69, 0xed, 0xf5, 0x4e, 0xf6, 0xca, 0xc1, 0xcb, 0xe0, 0xec, 0x2d, 0xed, 0x21, 0xf4, 0x65, 0xd2, 0xe1, 0xa2, 0x01, 0x0a, 0xb1, 0x00, 0x19, 0x38, 0xe5, 0x1a, + 0x05, 0x12, 0x68, 0x8a, 0x6c, 0x58, 0x66, 0x13, 0xb9, 0xca, 0x6c, 0x8e, 0xa6, 0x31, 0xdf, 0x26, 0x71, 0x55, 0x6a, 0x03, 0x14, 0xcc, 0x8e, 0x06, 0x1d, 0x6d, 0xd1, 0x81, 0x4c, 0x40, 0xad, 0xa6, + 0x22, 0x14, 0x8a, 0x11, 0x8d, 0xae, 0x3b, 0x93, 0x7c, 0x62, 0xfb, 0x92, 0xe8, 0xe1, 0x58, 0x09, 0xec, 0xf1, 0x6a, 0x09, 0xed, 0x1e, 0xd6, 0x23, 0xef, 0x93, 0xdb, 0x14, 0x24, 0x43, 0xdb, 0x3b, + 0xa7, 0x36, 0x15, 0x65, 0x1c, 0x1b, 0x41, 0x32, 0x49, 0x32, 0x0b, 0x30, 0x92, 0x28, 0xf2, 0xf2, 0x13, 0x62, 0xbd, 0x62, 0x1d, 0x92, 0xac, 0xd6, 0x32, 0xf3, 0xee, 0x06, 0xf3, 0xa4, 0x71, 0xe2, + 0x95, 0xea, 0x05, 0xf0, 0xcb, 0x75, 0x5f, 0x83, 0x84, 0x5e, 0x6e, 0xe6, 0xa0, 0x9d, 0x52, 0xc5, 0x86, 0x91, 0xb6, 0x13, 0x61, 0x2c, 0x59, 0xb8, 0x3b, 0x85, 0x31, 0xb2, 0xa0, 0x4b, 0x7d, 0x96, + 0x6c, 0x38, 0x1d, 0x55, 0xf9, 0x31, 0xce, 0x37, 0x2b, 0x99, 0xe1, 0x6b, 0xd8, 0x11, 0x8c, 0x9a, 0x49, 0x46, 0x75, 0xab, 0xe9, 0x61, 0xb7, 0xea, 0x84, 0x31, 0xd6, 0x8d, 0x9a, 0xf1, 0x88, 0x83, + 0x96, 0xbc, 0x1f, 0x00, 0x7c, 0x81, 0xaf, 0xb6, 0x23, 0x4d, 0xb9, 0x55, 0x84, 0x1f, 0x4f, 0xd7, 0x5e, 0xd6, 0xf2, 0xfc, 0x57, 0x66, 0x69, 0x61, 0xfa, 0x5d, 0x0b, 0xda, 0x67, 0x32, 0x2f, 0x3f, + 0xd0, 0x3d, 0xc1, 0xf7, 0x3e, 0xea, 0xd7, 0xa9, 0x69, 0xb6, 0x96, 0x8a, 0x85, 0xb4, 0x92, 0xfd, 0x65, 0x3a, 0x86, 0xc1, 0x24, 0x76, 0xc9, 0x9c, 0x5a, 0x6f, 0xa2, 0x1d, 0x1e, 0x90, 0x3f, 0xdd, + 0x67, 0xf3, 0xb7, 0x78, 0xb9, 0x7b, 0x3e, 0x80, 0x27, 0xf6, 0xd9, 0x2b, 0xd1, 0xf3, 0xab, 0x5d, 0x2e, 0xcf, 0xd6, 0xfe, 0x1e, 0xfb, 0xec, 0xb8, 0xac, 0x47, 0x1a, 0x3a, 0x6e, 0x8e, 0xfb, 0x54, + 0x1b, 0xcd, 0x77, 0xb6, 0x8f, 0x10, 0x20, 0xb5, 0x12, 0xbb, 0xae, 0x8d, 0x0d, 0x9b, 0x1a, 0x53, 0x7b, 0x72, 0xa5, 0xe9, 0x04, 0x35, 0xdf, 0x53, 0xca, 0xd4, 0x47, 0xd9, 0xdc, 0x39, 0x0e, 0x8c, + 0xe9, 0xb2, 0x68, 0x40, 0x0f, 0x2f, 0x47, 0xbe, 0x71, 0x18, 0xa5, 0xeb, 0x69, 0x9c, 0xd7, 0xb9, 0xa6, 0x09, 0x5b, 0x67, 0x1b, 0x8d, 0xb1, 0x94, 0xf6, 0xcb, 0xcf, 0xb6, 0xee, 0xcc, 0x32, 0xb4, + 0xab, 0x12, 0xfc, 0xbf, 0xff, 0x12, 0x43, 0x4b, 0xcb, 0xad, 0x97, 0x32, 0x35, 0xb5, 0xc2, 0x7a, 0x29, 0x92, 0x97, 0x50, 0x2b, 0xac, 0xbc, 0x78, 0xa9, 0xe0, 0x5f, 0xc8, 0x4b, 0x92, 0x9d, 0xfe, + 0xc2, 0xff, 0xfb, 0xaf, 0x6f, 0x17, 0xb2, 0xab, 0xe5, 0x6c, 0x9c, 0x17, 0x5a, 0x18, 0x4a, 0xe7, 0xf2, 0xe6, 0x9f, 0x3f, 0xff, 0x94, 0x25, 0xfd, 0x7e, 0xff, 0x04, 0xfb, 0xff, 0x7a, 0x9f, 0x9e, + 0xa6, 0x96, 0xd5, 0x5e, 0xfc, 0x3a, 0x2d, 0xff, 0x4f, 0xbf, 0xb9, 0xfc, 0x2f, 0xe4, 0x2f, 0x08, 0xbf, 0x28, 0xdd, 0x27, 0x05, 0x1c, 0x7f, 0xd3, 0xbf, 0xa1, 0xbe, 0xfa, 0xf7, 0xa7, 0x2a, 0xef, + 0x77, 0x2c, 0x76, 0xcf, 0xec, 0xaa, 0x1f, 0x29, 0x9f, 0x26, 0xc3, 0xc7, 0x71, 0xef, 0xd6, 0xaf, 0x6c, 0x52, 0x8d, 0xbb, 0xd5, 0x01, 0x1d, 0xe5, 0x33, 0x52, 0x09, 0x31, 0xd2, 0x96, 0x26, 0xfb, + 0x05, 0x96, 0x57, 0x12, 0x57, 0x6a, 0x9e, 0x2e, 0x36, 0x87, 0xf5, 0x62, 0xc6, 0x45, 0x94, 0xa0, 0x6f, 0xcb, 0x49, 0x06, 0xae, 0x6c, 0x68, 0xe9, 0x89, 0x49, 0x3a, 0x5f, 0x8d, 0x78, 0x6f, 0xe6, + 0x7b, 0x0a, 0x35, 0xd1, 0x6d, 0x4d, 0x83, 0x67, 0x2e, 0xae, 0x67, 0xd6, 0x1a, 0x1f, 0xf3, 0xf2, 0x96, 0x05, 0x1f, 0xf8, 0x7f, 0xbe, 0x29, 0x54, 0x78, 0xf7, 0x8c, 0xf2, 0x34, 0x3a, 0xbf, 0x3d, + 0xe5, 0x03, 0x52, 0xbf, 0x7d, 0xd6, 0x27, 0x38, 0x0c, 0x1a, 0xce, 0xeb, 0x63, 0x57, 0xc9, 0x3b, 0x62, 0xe9, 0x40, 0x7e, 0x64, 0x2e, 0x8d, 0xa9, 0x8f, 0x3b, 0x79, 0xc8, 0x32, 0x4e, 0xfb, 0x53, + 0x67, 0xeb, 0xe7, 0xfa, 0xfe, 0x7f, 0x6e, 0x72, 0xdc, 0x50, 0x06, 0x86, 0xb7, 0xe3, 0xbe, 0x93, 0x23, 0xd8, 0xab, 0x59, 0x2c, 0xaf, 0x50, 0x78, 0x3d, 0xf1, 0xe8, 0x31, 0xcc, 0x3a, 0x90, 0x3e, + 0x27, 0x3b, 0x3f, 0x61, 0x57, 0x82, 0xd3, 0xec, 0x6b, 0x65, 0x42, 0x5b, 0xbc, 0x59, 0x2b, 0xf8, 0xb6, 0x02, 0x0c, 0x41, 0xb2, 0xe6, 0xa9, 0x91, 0x1c, 0xd0, 0xf4, 0xc0, 0xd8, 0xcb, 0x5d, 0xc3, + 0x2f, 0xe5, 0x64, 0x9c, 0xc5, 0x19, 0x9d, 0xc1, 0xd6, 0x28, 0xcf, 0xe2, 0x71, 0xd3, 0xcc, 0xd9, 0x4c, 0x93, 0x46, 0x3d, 0x5d, 0x63, 0x3d, 0xba, 0x23, 0xfc, 0xa8, 0x9d, 0xc1, 0x17, 0xb6, 0xb0, + 0x3e, 0x1a, 0xc2, 0xdf, 0x2a, 0x8a, 0x7c, 0xee, 0xcd, 0xf0, 0x5d, 0x8f, 0x98, 0xe7, 0x62, 0x50, 0xdf, 0xc9, 0x5e, 0x19, 0x7b, 0xed, 0x0e, 0xd3, 0x33, 0x12, 0x75, 0xbe, 0xd2, 0x0a, 0x94, 0x5e, + 0x60, 0x10, 0x0e, 0x05, 0x6c, 0x0b, 0x33, 0x56, 0xc5, 0x85, 0x19, 0x1a, 0x96, 0xbc, 0x4f, 0x39, 0x55, 0xe4, 0xa3, 0x10, 0xb2, 0xd4, 0xd6, 0x63, 0xc2, 0x2f, 0x50, 0x99, 0xa4, 0xd0, 0xcd, 0x34, + 0xb7, 0x53, 0x26, 0x20, 0xf6, 0xeb, 0xd1, 0x5c, 0x3e, 0xda, 0x4a, 0xdb, 0x36, 0xa4, 0x20, 0x01, 0x1c, 0x8e, 0x2f, 0x93, 0x66, 0x90, 0x2d, 0x36, 0x7c, 0x10, 0x72, 0x4b, 0xe2, 0xf9, 0xc3, 0x56, + 0x5a, 0x46, 0xaf, 0x75, 0x2b, 0x9f, 0x29, 0x29, 0xd0, 0x47, 0xcf, 0xb8, 0xdb, 0x23, 0xe3, 0xcf, 0xa9, 0x1c, 0x5f, 0x3f, 0xe2, 0x95, 0x3f, 0xbf, 0x7d, 0xd0, 0x47, 0x11, 0x39, 0x87, 0xd3, 0xd1, + 0x91, 0xc9, 0x40, 0x4a, 0xc5, 0xae, 0x3d, 0x35, 0x0d, 0x8b, 0x09, 0xef, 0x04, 0xa5, 0xb7, 0x8b, 0xdb, 0x32, 0xe8, 0x9a, 0x15, 0xb0, 0xc1, 0xf9, 0xe9, 0xe2, 0x80, 0x40, 0x4b, 0x0b, 0xa1, 0xe6, + 0x10, 0x7f, 0xc4, 0x74, 0x50, 0x82, 0x45, 0xf7, 0x80, 0x8d, 0x76, 0x4b, 0x6f, 0x54, 0xa9, 0xa9, 0x38, 0x5d, 0xcb, 0xe6, 0x31, 0x1e, 0x40, 0xac, 0xa1, 0x8d, 0xeb, 0xb8, 0xdb, 0x6e, 0xb1, 0x6a, + 0xe2, 0xf7, 0x34, 0x69, 0x3e, 0xe8, 0x29, 0x70, 0xaf, 0x37, 0xc9, 0x4f, 0x19, 0xf8, 0x0f, 0x15, 0x2c, 0xff, 0x26, 0x6c, 0x92, 0xf8, 0x05, 0x3d, 0x11, 0xcb, 0x73, 0x8d, 0x98, 0x3c, 0x47, 0x09, + 0x9e, 0x29, 0x3c, 0xe6, 0x2e, 0x57, 0x6b, 0x4d, 0xdd, 0xaa, 0x04, 0xcc, 0x05, 0x44, 0xa5, 0xb2, 0x7c, 0xc1, 0xf3, 0x59, 0x5b, 0x1f, 0x40, 0xb5, 0xe4, 0x5a, 0xa9, 0xc8, 0xcc, 0x69, 0xa1, 0xe9, + 0x96, 0xad, 0x2e, 0xc7, 0x0a, 0xa6, 0xce, 0x17, 0xae, 0x5c, 0x38, 0x66, 0x17, 0x87, 0xe5, 0xc6, 0xca, 0x1b, 0x3e, 0x12, 0xbd, 0x82, 0x06, 0xa5, 0xb1, 0x30, 0x10, 0x60, 0x3c, 0xdf, 0x6f, 0x19, + 0x6b, 0x29, 0xb1, 0x70, 0xbd, 0xa2, 0x1e, 0xe5, 0x4d, 0x7f, 0x23, 0x72, 0x6f, 0xd4, 0xf1, 0x2f, 0x62, 0x10, 0xbc, 0xd8, 0x3e, 0x7b, 0xe5, 0xff, 0x7a, 0xf7, 0xb8, 0xdd, 0x7c, 0xea, 0x5a, 0x99, + 0x77, 0x49, 0x0e, 0xb9, 0x99, 0x29, 0x0f, 0xca, 0xe3, 0x7e, 0x68, 0x0f, 0xf5, 0xd9, 0x83, 0x7f, 0x52, 0xd9, 0xbd, 0x73, 0xeb, 0x87, 0x24, 0x2c, 0x0b, 0xeb, 0xc3, 0xaf, 0xfa, 0xd9, 0x2c, 0xfb, + 0x2f, 0x7f, 0x6e, 0x82, 0x79, 0xb9, 0xa6, 0x19, 0x7d, 0xce, 0x85, 0xb7, 0xe1, 0xa2, 0x5f, 0xcd, 0x33, 0xec, 0xa9, 0xb2, 0x3b, 0x1f, 0xe8, 0xbe, 0x4e, 0xb7, 0xcb, 0xe8, 0x5c, 0x6b, 0xb1, 0xc7, + 0x69, 0x7c, 0x2c, 0xb0, 0x8e, 0xb4, 0x9e, 0x58, 0xa9, 0xb7, 0x50, 0x6a, 0x11, 0x19, 0x6f, 0xe2, 0x79, 0x33, 0xc0, 0xe4, 0x78, 0x5b, 0xc2, 0x0c, 0xa5, 0x98, 0x9d, 0x3e, 0x17, 0x51, 0xcc, 0xe2, + 0x6a, 0xa8, 0xca, 0x90, 0x8e, 0x42, 0x2a, 0x95, 0xb3, 0x5a, 0xcb, 0x84, 0xf2, 0xc9, 0xc8, 0x8d, 0x75, 0x43, 0x30, 0x46, 0x80, 0x94, 0xad, 0xda, 0x15, 0xb6, 0x11, 0xd7, 0x59, 0x30, 0xef, 0x50, + 0x4d, 0x1a, 0xa9, 0x9f, 0xdd, 0x24, 0x3f, 0x98, 0x75, 0x9f, 0x4b, 0x3d, 0x3f, 0x21, 0x41, 0x7a, 0xed, 0x01, 0xe7, 0x72, 0xd6, 0x43, 0xd3, 0xcb, 0xee, 0x9f, 0xc6, 0x9e, 0xd1, 0x33, 0x3f, 0xd0, + 0xbd, 0xb2, 0xe3, 0x3a, 0xea, 0x9b, 0x35, 0x83, 0x31, 0xc7, 0xdd, 0xd1, 0x74, 0x03, 0x3a, 0xa9, 0x7c, 0x58, 0xb0, 0x81, 0x28, 0x47, 0x58, 0x4b, 0x02, 0x68, 0x2b, 0x30, 0x04, 0x0c, 0x6d, 0x0b, + 0x66, 0xc3, 0xc9, 0xa8, 0x48, 0x2b, 0x70, 0xe6, 0x6e, 0xea, 0x8c, 0x39, 0x70, 0x6b, 0xdf, 0x92, 0x69, 0x5a, 0x02, 0x39, 0x37, 0xd0, 0xc0, 0xa6, 0xe6, 0xa7, 0xc5, 0x5c, 0x89, 0x31, 0xb2, 0x6e, + 0x27, 0x68, 0x8e, 0x0d, 0x56, 0x4c, 0x2e, 0x08, 0xf8, 0xf3, 0x42, 0xc0, 0x8b, 0xbd, 0xb7, 0xc5, 0x88, 0xfd, 0x98, 0x15, 0x7d, 0xfc, 0x87, 0xef, 0x85, 0xc5, 0xbf, 0xdc, 0x7e, 0x91, 0x73, 0xb9, + 0xff, 0xe7, 0xd8, 0xf0, 0xce, 0x82, 0x7c, 0x78, 0x21, 0xf4, 0x18, 0xff, 0x8c, 0x29, 0xcc, 0x31, 0x3e, 0x10, 0xa7, 0x14, 0xeb, 0x5b, 0x74, 0x35, 0x1e, 0x41, 0x59, 0x7a, 0xec, 0xe8, 0x2a, 0x00, + 0x02, 0x04, 0xf0, 0x08, 0xda, 0xe2, 0xd7, 0x5e, 0xd6, 0x7a, 0xfb, 0x72, 0xc1, 0x80, 0x4c, 0x3d, 0x32, 0xd2, 0x76, 0xb1, 0x1a, 0x17, 0xb0, 0x5f, 0xe8, 0xe3, 0x7a, 0xa7, 0x6d, 0x4c, 0x77, 0x3a, + 0xc0, 0x08, 0xe4, 0x80, 0x56, 0xfb, 0x1a, 0x67, 0x0d, 0x7f, 0x29, 0x6a, 0xb9, 0xf7, 0x59, 0xc9, 0xfd, 0x01, 0xfe, 0x45, 0x9b, 0x5a, 0x43, 0xfb, 0x35, 0xde, 0x09, 0xfc, 0x05, 0xff, 0xdc, 0x53, + 0xf4, 0x4f, 0x96, 0xfa, 0x79, 0xe5, 0xc3, 0xcd, 0xcd, 0x8f, 0xef, 0x74, 0xc7, 0x44, 0xf6, 0x4c, 0x48, 0xe9, 0x1b, 0x59, 0x60, 0xf8, 0x7e, 0x3d, 0xbc, 0x10, 0x7b, 0xcc, 0x77, 0xde, 0x1a, 0x58, + 0x34, 0x9a, 0x81, 0x80, 0xb7, 0x8f, 0xd3, 0x71, 0x33, 0x25, 0x31, 0xb8, 0x43, 0xc6, 0x03, 0x1e, 0xa4, 0x0a, 0x6c, 0xc3, 0x03, 0x00, 0xef, 0x2f, 0xea, 0x8d, 0x09, 0xcb, 0x33, 0x86, 0x8e, 0xb2, + 0xb6, 0x6e, 0x6c, 0xac, 0xca, 0xd5, 0xd0, 0x45, 0x37, 0x78, 0xe8, 0x35, 0x21, 0x4e, 0x0d, 0xea, 0x0e, 0x20, 0xcd, 0x41, 0xa4, 0x6d, 0xa5, 0x71, 0xc0, 0x43, 0x33, 0x36, 0x60, 0x11, 0xee, 0x11, + 0xdf, 0xfb, 0x7b, 0x62, 0xff, 0x09, 0xc6, 0xe9, 0xf7, 0x1c, 0xfa, 0x10, 0xf4, 0x54, 0xce, 0xf5, 0x85, 0xe6, 0x75, 0x4d, 0xea, 0xed, 0xf0, 0x42, 0xe6, 0x31, 0x6b, 0x6c, 0xdb, 0x8c, 0x92, 0xdc, + 0x1f, 0x93, 0x20, 0xd1, 0x12, 0x83, 0x70, 0x0c, 0xf1, 0x2b, 0xd0, 0xa7, 0xb9, 0xf1, 0x46, 0x8e, 0x94, 0x32, 0x04, 0x08, 0x08, 0x6b, 0x3c, 0x96, 0xa3, 0xfd, 0x04, 0x71, 0x29, 0x4e, 0xdc, 0x1a, + 0x5e, 0xe6, 0xac, 0xf9, 0xf8, 0x40, 0x4f, 0x62, 0xcc, 0x41, 0xa2, 0x62, 0x43, 0x6e, 0x05, 0x6e, 0x22, 0xeb, 0x81, 0x5d, 0x6a, 0x10, 0x93, 0x5a, 0x31, 0x8c, 0x01, 0x07, 0xe3, 0x79, 0xaf, 0xee, + 0xa5, 0xd5, 0x5c, 0x19, 0x5f, 0xc1, 0xf8, 0xbd, 0x3f, 0xc4, 0x87, 0x6e, 0xe1, 0x17, 0xfd, 0xe6, 0x77, 0x5f, 0xff, 0x87, 0x8f, 0x3f, 0x9d, 0x62, 0x3f, 0x74, 0x52, 0xc0, 0x3e, 0x07, 0x22, 0x7e, + 0x97, 0x51, 0x92, 0x87, 0xda, 0x4d, 0x7b, 0x85, 0x9f, 0xca, 0x88, 0x7f, 0x7c, 0xae, 0x7d, 0xea, 0xe6, 0xf6, 0x5d, 0x6b, 0xe3, 0x13, 0x30, 0xe4, 0x8f, 0xa7, 0xdf, 0x5b, 0x5f, 0xe3, 0x6b, 0x53, + 0xe3, 0x33, 0x95, 0xc7, 0xb3, 0x8f, 0x5a, 0xa5, 0xf6, 0x94, 0x10, 0x53, 0x8f, 0xde, 0xa6, 0x54, 0x08, 0x8c, 0x71, 0x09, 0x1d, 0x91, 0x94, 0xc6, 0x2e, 0x70, 0x05, 0x18, 0x53, 0xdb, 0x11, 0x42, + 0x6f, 0x75, 0xbd, 0x85, 0x6d, 0x11, 0x04, 0x2b, 0x94, 0xd6, 0x2b, 0x91, 0x3a, 0xec, 0xe9, 0x44, 0xdb, 0x40, 0x3b, 0x4a, 0x5c, 0xe6, 0x88, 0xb7, 0xc1, 0x90, 0x74, 0xa1, 0x10, 0x74, 0xa1, 0x06, + 0xd8, 0x72, 0x3c, 0x61, 0x31, 0xc2, 0x83, 0x76, 0x8f, 0xf4, 0xa3, 0x47, 0x2a, 0x4e, 0x9f, 0xd8, 0x36, 0x27, 0xb9, 0x27, 0x60, 0x47, 0xbf, 0x9e, 0x69, 0x7e, 0xe3, 0x24, 0x67, 0x0d, 0x33, 0x29, + 0x86, 0xe7, 0xff, 0x7f, 0x8c, 0xdc, 0x86, 0xb0, 0xf6, 0x69, 0x71, 0x28, 0xe7, 0x4a, 0x53, 0x7b, 0x7e, 0x0e, 0x5a, 0xf2, 0xa0, 0x42, 0x12, 0x7c, 0x70, 0x60, 0x20, 0xf6, 0x28, 0x2f, 0x49, 0x73, + 0x21, 0xd0, 0x96, 0xb1, 0xb6, 0xb7, 0x51, 0x10, 0x1b, 0xf5, 0x68, 0x2c, 0xa3, 0xa6, 0x51, 0x03, 0x53, 0xb7, 0xf1, 0xc8, 0x95, 0x19, 0x1e, 0xc5, 0xc2, 0x6d, 0x9a, 0x54, 0x6d, 0xbd, 0x6e, 0xd5, + 0xb5, 0x0e, 0xb9, 0xd9, 0x46, 0x74, 0x3e, 0x1f, 0x3c, 0x12, 0xa9, 0xdf, 0x44, 0x57, 0x7f, 0x9c, 0x96, 0x80, 0x97, 0x5f, 0x77, 0x54, 0xe8, 0x93, 0x1b, 0xef, 0x7f, 0xe6, 0x5d, 0xa4, 0x65, 0x46, + 0xa7, 0x05, 0xc0, 0x09, 0x8c, 0x61, 0xe1, 0x45, 0x6f, 0x41, 0xd8, 0x9f, 0x53, 0xe0, 0x35, 0xc3, 0xb5, 0xce, 0x9e, 0xaf, 0x8f, 0x41, 0xc9, 0xbf, 0x35, 0xcd, 0x30, 0x2d, 0x23, 0x89, 0xd2, 0xcc, + 0xca, 0xf3, 0x61, 0x66, 0x9d, 0x17, 0xc9, 0x6b, 0xd8, 0xdc, 0xa7, 0x35, 0xfc, 0xb1, 0x83, 0xf4, 0x17, 0x5d, 0x50, 0x6e, 0xec, 0x47, 0x5f, 0x04, 0x50, 0x87, 0x49, 0x6d, 0x65, 0x86, 0x96, 0x5b, + 0x1f, 0xeb, 0xbf, 0x7d, 0x92, 0x3e, 0x91, 0x17, 0x79, 0xc6, 0xed, 0xcf, 0xf8, 0xed, 0x3b, 0xe9, 0xd0, 0xd0, 0x62, 0xc3, 0xfa, 0xe8, 0xf0, 0xfe, 0xf4, 0x46, 0xe7, 0x00, 0x33, 0xcd, 0x7c, 0xcd, + 0xd6, 0xfa, 0xe8, 0xed, 0xbc, 0xf9, 0x5e, 0x99, 0x85, 0x97, 0x88, 0xe9, 0x61, 0xa8, 0x35, 0x7f, 0x43, 0x38, 0xf5, 0x6b, 0x4e, 0xeb, 0x64, 0x9a, 0x61, 0xd9, 0x65, 0x38, 0xb4, 0xef, 0x69, 0x93, + 0xe8, 0x4d, 0x13, 0xd2, 0xde, 0x13, 0xff, 0x9d, 0xee, 0x69, 0x01, 0xbc, 0x8f, 0x86, 0x67, 0x7a, 0x8f, 0x17, 0xc2, 0xde, 0x5f, 0x8a, 0xfc, 0x62, 0x46, 0x8c, 0xcc, 0x62, 0x31, 0x96, 0x63, 0x6f, + 0x17, 0xce, 0xe7, 0x7b, 0x46, 0x99, 0x77, 0xb0, 0xbf, 0x6f, 0xb6, 0xb8, 0xec, 0xf2, 0x00, 0x1a, 0x41, 0xbc, 0x19, 0xe8, 0x2a, 0x1c, 0x0b, 0x39, 0x3d, 0x1b, 0x18, 0x2c, 0x44, 0x9b, 0xce, 0x31, + 0xc4, 0xba, 0xc9, 0xc6, 0xcd, 0x01, 0x39, 0x5f, 0x2b, 0x9b, 0x2a, 0x3b, 0x18, 0x45, 0x13, 0x14, 0xf2, 0x41, 0xdd, 0x05, 0xde, 0xbd, 0x36, 0x0a, 0xf7, 0xe1, 0xb9, 0xd8, 0x47, 0xef, 0xd9, 0xb8, + 0x7e, 0xbe, 0x9d, 0xbb, 0xda, 0x09, 0x0e, 0x57, 0xcb, 0x87, 0x7d, 0xf7, 0x71, 0xd8, 0xac, 0x04, 0x50, 0xde, 0xe1, 0x82, 0xe5, 0x13, 0x9b, 0x60, 0xbf, 0x98, 0x67, 0x96, 0xeb, 0xeb, 0xdd, 0x6a, + 0xec, 0xcf, 0x52, 0x0c, 0x90, 0x97, 0x62, 0x8a, 0x15, 0xdb, 0x74, 0xcf, 0xca, 0xe8, 0x82, 0x61, 0xd4, 0x25, 0x04, 0x50, 0x8d, 0x3e, 0xdb, 0x14, 0x36, 0x90, 0x7b, 0x63, 0x58, 0xda, 0x6f, 0x2d, + 0x70, 0x64, 0x68, 0xd3, 0x48, 0x2e, 0x14, 0xa5, 0xdb, 0xd3, 0xac, 0x4e, 0x49, 0x68, 0xd7, 0xd3, 0x7a, 0x75, 0xcf, 0x7e, 0xfc, 0xd3, 0x99, 0xf8, 0x02, 0xf6, 0x6c, 0x5a, 0x7d, 0xc2, 0xe5, 0x1c, + 0x2f, 0x30, 0x74, 0x93, 0x24, 0xf8, 0x0e, 0xf9, 0x9f, 0x4b, 0xe2, 0x4f, 0xb4, 0xaf, 0x5c, 0xf8, 0x70, 0xa7, 0xaf, 0x3d, 0x51, 0x99, 0x81, 0xb2, 0x38, 0xf7, 0x83, 0x26, 0x23, 0xc6, 0x6d, 0xbb, + 0x5e, 0xf3, 0x6d, 0x70, 0x20, 0xbb, 0x25, 0x2a, 0x56, 0x05, 0x3d, 0xcd, 0x77, 0x8b, 0xb1, 0x78, 0xac, 0x4b, 0x10, 0xdf, 0xcd, 0x3a, 0x28, 0xd4, 0x71, 0xba, 0x62, 0x31, 0x24, 0x17, 0x5d, 0x8c, + 0x81, 0x82, 0x7d, 0xe3, 0x90, 0xfc, 0x81, 0xc5, 0xb8, 0xdc, 0xde, 0x4c, 0x54, 0xb2, 0x3c, 0x8c, 0xf8, 0x40, 0x99, 0xaa, 0x94, 0x0e, 0x44, 0xdf, 0x87, 0x5f, 0x9d, 0x7e, 0xa9, 0xee, 0x39, 0xde, + 0x7d, 0x37, 0x28, 0xf4, 0x54, 0x42, 0xd9, 0x07, 0xba, 0x57, 0x3c, 0xae, 0xa3, 0x33, 0x16, 0x3d, 0x0e, 0x00, 0x85, 0x54, 0x4d, 0x96, 0x05, 0x95, 0x8d, 0xc2, 0x60, 0x06, 0xd2, 0x0d, 0xa8, 0xad, + 0x3d, 0x71, 0xc4, 0x0f, 0x84, 0x54, 0x46, 0x3b, 0x0f, 0xce, 0x00, 0xde, 0xb2, 0x30, 0x39, 0xd8, 0x4c, 0x75, 0xed, 0x58, 0x21, 0xd8, 0x86, 0x53, 0x56, 0x9d, 0x5e, 0xaf, 0xed, 0x99, 0xa4, 0xaa, + 0x0c, 0x18, 0x6c, 0x06, 0x1b, 0x13, 0x47, 0x40, 0x78, 0xb7, 0x50, 0xe1, 0x14, 0xd0, 0x17, 0x13, 0x3a, 0xd9, 0x20, 0x72, 0x72, 0xb3, 0x5b, 0x3d, 0xab, 0x4e, 0xf5, 0x36, 0x62, 0x9e, 0xde, 0xda, + 0x0e, 0xb5, 0xfb, 0xa5, 0xbc, 0x9f, 0x9d, 0x6c, 0x27, 0xa2, 0x57, 0x54, 0x4f, 0x97, 0xe7, 0x42, 0x90, 0x3d, 0xa6, 0x17, 0xdd, 0x06, 0x8b, 0x2d, 0xb0, 0x86, 0x96, 0xfe, 0x76, 0x6f, 0x14, 0x69, + 0xea, 0xb0, 0x63, 0xc7, 0x96, 0x04, 0xb0, 0x58, 0xca, 0xa5, 0xba, 0xf3, 0x5d, 0x67, 0x95, 0x41, 0x44, 0x70, 0xdc, 0x96, 0xd1, 0x2a, 0xc4, 0xc7, 0x76, 0x85, 0xd0, 0xac, 0x14, 0x5a, 0x3b, 0xe2, + 0xa8, 0xee, 0xba, 0xe4, 0x30, 0x9d, 0x6d, 0xc7, 0xcc, 0x76, 0x3a, 0x41, 0x79, 0x21, 0x99, 0x03, 0x6a, 0xb3, 0x43, 0xe8, 0x2a, 0x5c, 0x89, 0xeb, 0x1f, 0x04, 0x1e, 0xf4, 0xb1, 0x3f, 0xdc, 0x7a, + 0x87, 0xfe, 0xa8, 0x78, 0x7c, 0xa5, 0x7b, 0x85, 0xee, 0x3a, 0xea, 0x2b, 0x2e, 0x43, 0x84, 0x9b, 0x94, 0x33, 0x7c, 0xe5, 0x4c, 0xf9, 0x7a, 0x3b, 0x5d, 0x06, 0xa6, 0x32, 0xa7, 0x3d, 0x57, 0xf1, + 0x0b, 0x2c, 0xdd, 0x88, 0x3a, 0xed, 0xa0, 0x78, 0x56, 0x84, 0x51, 0x2c, 0x89, 0xe1, 0x4e, 0x77, 0x22, 0x8a, 0xe4, 0x04, 0x36, 0x5b, 0x2e, 0x74, 0x45, 0x99, 0x51, 0x92, 0x1e, 0x8b, 0xda, 0xc2, + 0x6a, 0x56, 0xcb, 0xc2, 0x13, 0x05, 0xd2, 0x8d, 0xac, 0x8d, 0xbf, 0xe9, 0xe0, 0xad, 0x39, 0x18, 0xff, 0x00, 0xbd, 0x7f, 0xc8, 0x14, 0xff, 0x7b, 0x77, 0xe2, 0x3f, 0x2b, 0x39, 0x3f, 0xd0, 0xbe, + 0x32, 0xe6, 0xc3, 0x9d, 0xbe, 0x92, 0x33, 0x98, 0xf9, 0x86, 0xc4, 0xbb, 0x71, 0x38, 0x97, 0xa1, 0xa0, 0x4d, 0xe6, 0x01, 0x21, 0x1c, 0x96, 0x92, 0x56, 0x33, 0xd8, 0x42, 0xd0, 0x01, 0xae, 0xdb, + 0x19, 0x58, 0x3d, 0xa2, 0x40, 0xd8, 0x15, 0xb6, 0x02, 0x68, 0xda, 0xb3, 0x8d, 0xaf, 0x33, 0xeb, 0x65, 0xe5, 0x40, 0x26, 0x6e, 0xd8, 0x08, 0xa3, 0x5b, 0xbb, 0xa8, 0xd8, 0x8d, 0x64, 0x5d, 0x97, + 0x91, 0x63, 0xa7, 0xc2, 0x5b, 0xcb, 0x1d, 0x11, 0xfb, 0x9e, 0xbe, 0xd0, 0xaf, 0xfc, 0x99, 0x3f, 0x37, 0x0a, 0xfd, 0x83, 0xdc, 0x6d, 0xb5, 0xec, 0x9e, 0xbb, 0xed, 0xb9, 0xfa, 0x02, 0xaf, 0x44, + 0xaf, 0xfc, 0x3c, 0x5d, 0xf6, 0xad, 0x1d, 0xb0, 0x3b, 0x52, 0x9b, 0xa3, 0x87, 0xfa, 0x25, 0xb1, 0x1d, 0x6c, 0x8f, 0x73, 0xde, 0x3c, 0x8e, 0x05, 0x50, 0xd4, 0x24, 0x79, 0x9e, 0x4f, 0xe7, 0x8b, + 0x1d, 0xb5, 0xae, 0x82, 0x91, 0xb5, 0xdb, 0xf3, 0xf3, 0x8d, 0x02, 0x4d, 0x66, 0xf3, 0x69, 0xa7, 0xb8, 0xdc, 0x3e, 0x59, 0x11, 0x8b, 0x35, 0x6d, 0x45, 0x71, 0x58, 0xc9, 0x46, 0x05, 0x28, 0x74, + 0x64, 0xc0, 0x35, 0xbf, 0x27, 0xa9, 0x09, 0x8c, 0xd2, 0xf1, 0x2e, 0xff, 0x9b, 0xc7, 0xbb, 0x5e, 0x62, 0xcb, 0xcc, 0x86, 0xae, 0x97, 0x17, 0x89, 0x93, 0x69, 0xd1, 0xd0, 0xbf, 0x2f, 0xbb, 0x9e, + 0x09, 0x37, 0xfb, 0x4c, 0xfc, 0x84, 0xeb, 0xa7, 0x5b, 0x7d, 0x4b, 0xa3, 0xb8, 0xa0, 0xb2, 0x4d, 0x16, 0x88, 0x55, 0x1f, 0x73, 0x4d, 0x45, 0xe2, 0xd9, 0x76, 0xab, 0xe1, 0x26, 0x27, 0x4c, 0x89, + 0xfc, 0xd8, 0x0c, 0x68, 0xc7, 0x9c, 0xa0, 0x03, 0xc1, 0x58, 0x8c, 0x84, 0x92, 0xe8, 0xd4, 0x69, 0xb8, 0x05, 0xf3, 0x83, 0x24, 0x32, 0x4c, 0x86, 0x18, 0xad, 0x15, 0xaf, 0x73, 0xf1, 0x78, 0xd4, + 0x65, 0x66, 0x1e, 0x03, 0xc9, 0x4c, 0xc1, 0x3b, 0xdf, 0xa6, 0x97, 0x87, 0x79, 0xd5, 0x45, 0x3d, 0x17, 0x8a, 0xae, 0xe5, 0x16, 0x8e, 0x5e, 0xc0, 0xf9, 0xaa, 0xbe, 0x97, 0x16, 0x24, 0x6f, 0x0b, + 0xa8, 0x4f, 0x40, 0xef, 0x2d, 0x06, 0xa9, 0x95, 0x19, 0x56, 0x5c, 0x78, 0xa1, 0x95, 0x0f, 0x13, 0xdd, 0xbf, 0x3b, 0xa1, 0x9f, 0x71, 0x23, 0x7c, 0xfb, 0xa4, 0xdf, 0xb8, 0xf1, 0xe9, 0xf3, 0xbe, + 0xae, 0x86, 0x35, 0x55, 0xe9, 0xdb, 0x46, 0x0c, 0xe7, 0x35, 0xe3, 0x23, 0x38, 0xbb, 0x99, 0x41, 0xf8, 0x81, 0x4b, 0x14, 0x5a, 0xdf, 0x55, 0x98, 0x42, 0xb7, 0x02, 0x42, 0x62, 0x81, 0x27, 0x81, + 0xac, 0x84, 0x90, 0x08, 0x64, 0x1b, 0xd2, 0x96, 0x3f, 0x6c, 0x37, 0x04, 0x89, 0xc9, 0xc5, 0x6c, 0xa6, 0xc2, 0x9a, 0xab, 0x10, 0x08, 0xd2, 0x81, 0x41, 0x4b, 0x2e, 0x2a, 0xd4, 0xc4, 0xd9, 0x78, + 0x20, 0xe5, 0x83, 0xba, 0x27, 0x6b, 0xbe, 0x98, 0xbe, 0x9f, 0x7d, 0x79, 0xdf, 0xf0, 0xe1, 0x74, 0x2e, 0xbf, 0x24, 0x86, 0xe4, 0x56, 0xa4, 0xc5, 0x85, 0x67, 0xdc, 0x3f, 0xf1, 0x3d, 0x25, 0x4f, + 0xbe, 0x78, 0xc0, 0x09, 0xf5, 0x2f, 0x6e, 0xf7, 0x0d, 0xb3, 0x30, 0xb4, 0x4c, 0x0c, 0x42, 0x63, 0xe7, 0x12, 0x1b, 0x61, 0xbf, 0x59, 0x12, 0x93, 0x0a, 0x26, 0x36, 0x62, 0x61, 0xba, 0x8a, 0xbb, + 0xcb, 0xad, 0x50, 0x03, 0x4a, 0x0b, 0x03, 0xfc, 0x65, 0xe7, 0x5b, 0x8e, 0x5c, 0x1d, 0xa6, 0xc7, 0x15, 0xcc, 0x72, 0xf4, 0x68, 0x0d, 0x53, 0xf3, 0x78, 0xb4, 0x50, 0x17, 0x2e, 0xe4, 0x90, 0x84, + 0x91, 0x62, 0x78, 0x5e, 0x02, 0x33, 0x67, 0x2d, 0x75, 0xc6, 0x5e, 0x22, 0x8d, 0x3b, 0xc6, 0x90, 0x07, 0xc8, 0x9d, 0x4f, 0xe4, 0xd9, 0x7d, 0x99, 0x01, 0xfe, 0xc2, 0x9e, 0xd1, 0x77, 0x6e, 0x48, + 0xbf, 0xa2, 0xf5, 0x76, 0x63, 0x78, 0xa6, 0xfa, 0x18, 0xa7, 0x82, 0x70, 0xfd, 0xca, 0xb2, 0x01, 0x8c, 0xa1, 0x97, 0xc4, 0x66, 0xbf, 0x35, 0x77, 0x9d, 0xbc, 0x73, 0x43, 0xb2, 0x0b, 0xe8, 0x72, + 0xc0, 0x85, 0x1a, 0x0d, 0xb2, 0x4a, 0x67, 0xae, 0xca, 0x4a, 0x97, 0xa6, 0x5e, 0xda, 0x50, 0x9b, 0x54, 0x88, 0xd1, 0x9d, 0x5b, 0x93, 0x6a, 0x4b, 0x4f, 0x68, 0x8d, 0x04, 0x49, 0x4f, 0xde, 0x92, + 0x87, 0x89, 0xdf, 0x25, 0x78, 0x13, 0x29, 0x05, 0x3a, 0xf1, 0x38, 0xf5, 0xfb, 0x42, 0x5b, 0x6e, 0x9b, 0x5a, 0x99, 0x77, 0x2f, 0x1a, 0xef, 0xc9, 0x1d, 0xe9, 0x42, 0xf3, 0x04, 0xc3, 0xe5, 0xaa, + 0xef, 0x7e, 0x64, 0x48, 0x5a, 0xe0, 0x36, 0xfa, 0x2e, 0xd7, 0xd8, 0xf2, 0xe8, 0xdb, 0x55, 0x65, 0xec, 0xca, 0x2a, 0x04, 0x66, 0x21, 0x82, 0xc2, 0x0b, 0x1c, 0x6b, 0x1c, 0x8e, 0x53, 0x32, 0xa5, + 0x91, 0xa4, 0x6c, 0x74, 0x8c, 0x16, 0x00, 0xbd, 0x58, 0x0e, 0x24, 0xd2, 0xc8, 0x24, 0x3c, 0x62, 0xc3, 0xb5, 0x09, 0x68, 0x84, 0x37, 0x10, 0x2d, 0x74, 0x0a, 0xae, 0x1c, 0x29, 0x2b, 0x54, 0x91, + 0xeb, 0xac, 0x81, 0x36, 0xe9, 0x79, 0x48, 0x2e, 0x4b, 0xef, 0x72, 0x36, 0x46, 0x3e, 0xc7, 0xb6, 0x9f, 0x3e, 0xf9, 0x90, 0xfb, 0x7e, 0xdb, 0x41, 0xed, 0x21, 0xb2, 0xb7, 0xa6, 0xdd, 0xeb, 0x53, + 0xbe, 0xc2, 0xfa, 0xb9, 0xe6, 0x97, 0x27, 0x82, 0xc0, 0xf0, 0xfc, 0xa7, 0x6f, 0x63, 0x4b, 0xc6, 0x97, 0xa6, 0x9b, 0x1a, 0x77, 0x54, 0x1a, 0x5b, 0xac, 0x1c, 0xc7, 0x28, 0x18, 0xca, 0xf0, 0x65, + 0x2d, 0x00, 0xc9, 0xc1, 0x92, 0x96, 0x5d, 0x89, 0xf5, 0xa6, 0xdd, 0x2c, 0xde, 0x8e, 0xa4, 0x91, 0x66, 0x39, 0x51, 0x4a, 0x62, 0x12, 0xa0, 0x6f, 0x2c, 0x4a, 0xde, 0xea, 0xe8, 0x7a, 0x3b, 0xd3, + 0x36, 0x7c, 0x5a, 0x2c, 0x46, 0x41, 0xa9, 0x68, 0xbc, 0x1b, 0xeb, 0x3c, 0x2d, 0x04, 0xfa, 0x52, 0x07, 0x3e, 0x67, 0x11, 0x7c, 0x88, 0x7c, 0x7d, 0x8b, 0x7b, 0x75, 0x32, 0xcd, 0xb4, 0x5e, 0x5e, + 0x8a, 0xe4, 0xe5, 0xfa, 0xda, 0x2f, 0xc4, 0x4b, 0x92, 0xbd, 0xb8, 0x9e, 0xe3, 0x5a, 0xd9, 0xaf, 0x97, 0x17, 0x21, 0x34, 0xad, 0xec, 0xf5, 0xb3, 0xfc, 0x25, 0xd2, 0xda, 0x97, 0x32, 0xb7, 0x5e, + 0x56, 0x5a, 0xe1, 0xfe, 0xca, 0xb4, 0xd8, 0x4c, 0xa2, 0xff, 0xf4, 0x9f, 0x5f, 0xbc, 0xf8, 0xc5, 0xb0, 0xb2, 0x42, 0x3b, 0xfd, 0xf5, 0x32, 0xa3, 0x8c, 0xf2, 0x42, 0x8b, 0x0d, 0x2b, 0xff, 0xaf, + 0x2f, 0xb5, 0xeb, 0x19, 0xee, 0x8b, 0x97, 0xbf, 0x04, 0x71, 0x52, 0xc7, 0xa7, 0xc7, 0xe8, 0xd6, 0x4b, 0x9a, 0x25, 0x7a, 0x68, 0x45, 0x5a, 0xe1, 0x19, 0xbf, 0x5e, 0x5e, 0x24, 0xcb, 0x7a, 0x79, + 0x05, 0xb3, 0x22, 0x7f, 0x99, 0x56, 0x05, 0xe8, 0x61, 0xe2, 0x00, 0x91, 0x56, 0xb8, 0xc3, 0xcb, 0x23, 0x5e, 0xec, 0x24, 0x7b, 0x31, 0xad, 0x42, 0xf3, 0xc2, 0xfc, 0xd7, 0xfb, 0x2b, 0xfd, 0x56, + 0x13, 0xf0, 0x75, 0xbe, 0xe8, 0x5e, 0x7c, 0xe1, 0xea, 0xe3, 0x19, 0xf1, 0xad, 0x5d, 0x1f, 0x7d, 0xaa, 0x6a, 0xce, 0x67, 0xbb, 0x3e, 0xfa, 0xb8, 0x42, 0xce, 0x79, 0xa1, 0xb5, 0xb3, 0xe9, 0x32, + 0x3b, 0x1a, 0x80, 0x62, 0x1a, 0xfb, 0x59, 0xec, 0x2d, 0xdc, 0x8e, 0x45, 0xe1, 0xc1, 0xb8, 0x93, 0x06, 0x0e, 0x5f, 0x47, 0xbb, 0x4e, 0x90, 0x66, 0xc6, 0x66, 0xb2, 0x56, 0xea, 0x56, 0x2a, 0x29, + 0x8a, 0x6a, 0x81, 0xa5, 0x5f, 0x36, 0x7b, 0x4e, 0x05, 0x66, 0x0c, 0xcd, 0xe0, 0xab, 0xe4, 0x08, 0xf1, 0x5e, 0xb7, 0x12, 0xa8, 0x7d, 0xbb, 0x35, 0x2a, 0x52, 0x40, 0x05, 0x95, 0x5d, 0x3d, 0xf2, + 0x2a, 0x3d, 0xd2, 0xc9, 0xfb, 0xd8, 0xf5, 0xaf, 0xaf, 0xa9, 0xb7, 0x43, 0xd3, 0xb2, 0xb5, 0x32, 0xfc, 0xb3, 0x55, 0x14, 0x7f, 0xa3, 0xfe, 0x0e, 0xec, 0xfb, 0xbd, 0x7e, 0x81, 0xb1, 0xd2, 0x2a, + 0x2d, 0x8c, 0x4a, 0x9f, 0x27, 0x38, 0x39, 0x3e, 0x6a, 0xd0, 0x12, 0x4b, 0xcc, 0x0c, 0x45, 0x3d, 0x6b, 0x59, 0x07, 0x3f, 0xdc, 0xb6, 0x3e, 0xb5, 0x10, 0xff, 0x5a, 0x74, 0x3c, 0x53, 0x53, 0xfb, + 0x23, 0xe1, 0xd3, 0x8b, 0x7e, 0x18, 0x0e, 0x91, 0x7e, 0x75, 0xb5, 0x2b, 0x4b, 0x51, 0xdc, 0xb5, 0x36, 0x98, 0x42, 0x6b, 0x6a, 0xd9, 0xc5, 0x95, 0xbb, 0x63, 0x1a, 0x9d, 0xb4, 0xb5, 0x26, 0xcc, + 0xea, 0x5d, 0xdc, 0xe4, 0xd6, 0x74, 0xac, 0x8f, 0x53, 0x14, 0x23, 0x68, 0xb0, 0xe6, 0x78, 0x2f, 0x81, 0x75, 0x41, 0x5a, 0xc6, 0xbe, 0x32, 0x75, 0x57, 0xfe, 0x40, 0xf1, 0xc6, 0x47, 0x1c, 0x6a, + 0xb2, 0xd5, 0xdc, 0x5d, 0x07, 0x23, 0xef, 0x20, 0x07, 0xd8, 0xac, 0x73, 0xd6, 0xab, 0x47, 0x07, 0x88, 0x6f, 0xe2, 0x27, 0x2f, 0xc1, 0x3f, 0x17, 0xe4, 0xfe, 0xfa, 0xd2, 0x2a, 0x7f, 0xc5, 0x66, + 0x68, 0x67, 0xc9, 0xab, 0x27, 0xe1, 0x19, 0xa3, 0xfc, 0x1f, 0x6c, 0x88, 0xf9, 0x43, 0x87, 0xe1, 0x95, 0x4d, 0xa1, 0xd6, 0xdd, 0xf3, 0x50, 0x3f, 0xb7, 0x69, 0x7f, 0xa0, 0xfb, 0x3e, 0x19, 0x4e, + 0xa3, 0x3e, 0x9b, 0x37, 0x34, 0xa4, 0xf6, 0x91, 0x20, 0xee, 0x0e, 0xac, 0x9f, 0x40, 0x83, 0x58, 0xe5, 0x38, 0x4a, 0xd9, 0xc6, 0x76, 0x1d, 0x56, 0x62, 0xb0, 0xfa, 0x5b, 0x52, 0xa1, 0x97, 0x50, + 0xb8, 0x69, 0xa1, 0xff, 0xb5, 0x56, 0x07, 0x3d, 0xe1, 0xfb, 0xf8, 0x40, 0xf7, 0x0c, 0xc9, 0xdb, 0x68, 0x78, 0xa6, 0xf7, 0x08, 0x92, 0xc0, 0xf5, 0xb0, 0x3c, 0x0b, 0x92, 0xc4, 0xf7, 0x1a, 0xd1, + 0xd8, 0x12, 0x1a, 0x0c, 0x1d, 0xf4, 0x76, 0xb5, 0xdb, 0x0d, 0x92, 0xbf, 0x05, 0x09, 0xf8, 0x8b, 0xfc, 0x05, 0x8d, 0xfa, 0xe0, 0xf2, 0x1e, 0xa3, 0x78, 0x4f, 0x46, 0x3e, 0xb1, 0xe3, 0x5c, 0x89, + 0x9e, 0x10, 0xb9, 0x5e, 0x9e, 0x25, 0xe2, 0xc3, 0xba, 0x6c, 0x92, 0x0e, 0xf9, 0x2b, 0xd3, 0x5e, 0x73, 0xeb, 0x7a, 0x51, 0x2d, 0xe8, 0x25, 0xcd, 0xec, 0x71, 0x67, 0xbf, 0x87, 0x74, 0xfb, 0x6b, + 0x89, 0xd8, 0x63, 0xbd, 0xdf, 0x0f, 0x97, 0xac, 0x33, 0x2d, 0x4d, 0xcf, 0xcf, 0x86, 0x7a, 0x01, 0xf5, 0x16, 0xae, 0x79, 0xef, 0x18, 0xfb, 0xc4, 0xec, 0xb9, 0x12, 0x3d, 0x03, 0x75, 0xb9, 0x3c, + 0x1f, 0x4e, 0x7b, 0xf8, 0xcc, 0x02, 0xa0, 0x9a, 0x6b, 0x07, 0x14, 0x50, 0x42, 0x0d, 0xd9, 0x77, 0xed, 0x6a, 0x52, 0x6d, 0xd7, 0xc2, 0x41, 0xb1, 0x58, 0xa6, 0x3a, 0x0a, 0xcb, 0x22, 0x3e, 0x52, + 0x66, 0xd9, 0x6d, 0x99, 0xb4, 0x4b, 0xd7, 0x6a, 0x37, 0xce, 0x83, 0xe5, 0xca, 0x55, 0xe1, 0xe5, 0x80, 0x8e, 0x29, 0x4f, 0x5a, 0x8d, 0xba, 0xb9, 0x94, 0xb0, 0x33, 0x6b, 0x95, 0x1e, 0x96, 0x8d, + 0x86, 0x9a, 0x8a, 0xa5, 0xb2, 0xeb, 0xa3, 0x55, 0x7f, 0x5f, 0x5d, 0xe8, 0x12, 0xeb, 0xf6, 0xf5, 0x34, 0x41, 0x9e, 0x09, 0x38, 0x88, 0xbd, 0xf3, 0x8b, 0x7b, 0xe7, 0xee, 0x53, 0x3d, 0x42, 0x0d, + 0x16, 0x32, 0xd0, 0x96, 0x8e, 0x0c, 0x97, 0xdd, 0x1e, 0xf3, 0x56, 0x1b, 0xc9, 0x53, 0xc7, 0xed, 0xb4, 0x58, 0x9b, 0x83, 0xb8, 0x29, 0x76, 0xb1, 0x6f, 0x71, 0x05, 0xa8, 0x19, 0xbc, 0x59, 0x8f, + 0xc8, 0x60, 0xc9, 0x65, 0x55, 0xb9, 0x91, 0x5b, 0x8a, 0x04, 0x8b, 0x7c, 0x43, 0x0b, 0x34, 0xd1, 0x56, 0x73, 0xd9, 0xd1, 0x42, 0x57, 0xc5, 0x37, 0xfc, 0x61, 0x12, 0xd1, 0x4c, 0xb0, 0x5b, 0x52, + 0xcb, 0xe6, 0x5e, 0xdb, 0xfc, 0xef, 0x60, 0x28, 0xac, 0x2c, 0xd6, 0xc2, 0x61, 0x1e, 0xde, 0x8d, 0x20, 0x78, 0xce, 0x24, 0x7e, 0x43, 0xf9, 0x0c, 0xcd, 0x87, 0x71, 0x5f, 0xb3, 0xb8, 0x00, 0x4e, + 0x29, 0x68, 0x31, 0x01, 0x72, 0xb1, 0x55, 0x43, 0xc2, 0x60, 0x13, 0x82, 0x8c, 0x31, 0x73, 0x43, 0x58, 0x3b, 0xa9, 0xae, 0x53, 0x45, 0xf4, 0x0e, 0x1b, 0x77, 0xdb, 0xf1, 0x8d, 0x2a, 0x8f, 0x57, + 0xbb, 0x92, 0x22, 0xab, 0x30, 0xde, 0xcc, 0x5a, 0xae, 0x31, 0x33, 0x79, 0x9b, 0x04, 0x39, 0x7e, 0x10, 0x39, 0x39, 0x9e, 0xd9, 0x7a, 0xa7, 0xc9, 0x26, 0xb6, 0xe7, 0x7c, 0xd7, 0x71, 0x06, 0x55, + 0xcf, 0x04, 0xe0, 0xaf, 0x83, 0xdc, 0x6f, 0x56, 0xdd, 0xdd, 0x2c, 0x94, 0xdc, 0x33, 0xad, 0xa1, 0xe1, 0x6a, 0x71, 0x6c, 0x85, 0x6f, 0xdf, 0xf8, 0x69, 0xd5, 0x9c, 0x4f, 0x66, 0xdb, 0x6f, 0x98, + 0x98, 0x6a, 0xa6, 0x99, 0xfd, 0xfa, 0xc6, 0x2e, 0x38, 0x7a, 0x46, 0x39, 0x7c, 0xa5, 0x7a, 0x62, 0xde, 0xeb, 0xf5, 0xf0, 0x4c, 0xeb, 0x31, 0xe3, 0xc0, 0x25, 0x0b, 0xe0, 0x20, 0xd1, 0x24, 0x8d, + 0xb4, 0x4d, 0x18, 0x62, 0xee, 0xf3, 0xd0, 0xcc, 0x96, 0x74, 0x2e, 0xd9, 0x81, 0x03, 0xbd, 0xd8, 0x7a, 0x86, 0x9f, 0xaf, 0xa5, 0xfd, 0x3a, 0x74, 0x01, 0x57, 0x6d, 0x03, 0x9e, 0x5c, 0xa6, 0xd1, + 0xca, 0x26, 0x4a, 0xa5, 0x16, 0xf7, 0xc8, 0x66, 0xa0, 0x05, 0x2a, 0xbe, 0x01, 0x6a, 0x88, 0x54, 0xc3, 0x83, 0xc4, 0x50, 0xca, 0xc1, 0x53, 0x76, 0xa2, 0x80, 0xfc, 0xa4, 0x62, 0xe3, 0x4b, 0xcf, + 0xc6, 0x50, 0x5e, 0x3e, 0xd4, 0x32, 0xa7, 0xfc, 0xae, 0xaf, 0x24, 0xf4, 0x9c, 0x38, 0xfc, 0x40, 0xf8, 0x84, 0xe0, 0x87, 0xe1, 0x79, 0xf6, 0xf7, 0x10, 0x8b, 0x8d, 0xe8, 0x82, 0x9b, 0xa8, 0x20, + 0x79, 0x1a, 0xc7, 0x72, 0xbe, 0xab, 0xda, 0x5d, 0xb4, 0x77, 0x58, 0xa8, 0xe8, 0x90, 0x68, 0x79, 0x24, 0xd0, 0x70, 0x3e, 0x06, 0x23, 0x8e, 0xe4, 0x14, 0xd5, 0x48, 0xd8, 0x6e, 0x29, 0x74, 0x53, + 0x17, 0x67, 0xa2, 0x4c, 0x89, 0x10, 0x13, 0x22, 0x03, 0x1c, 0x8c, 0x19, 0x2b, 0x9b, 0x90, 0xe3, 0xd1, 0x32, 0x22, 0x03, 0xa5, 0x24, 0x89, 0xce, 0x96, 0x66, 0x31, 0xf7, 0xb4, 0x53, 0xe8, 0x5b, + 0x0c, 0x2f, 0xfe, 0xd7, 0x3f, 0x0d, 0xe0, 0x85, 0xea, 0x05, 0xbd, 0xcb, 0x75, 0x5f, 0xe8, 0x3a, 0x6a, 0x34, 0xc9, 0xca, 0x95, 0x16, 0xf9, 0x6d, 0x44, 0x42, 0x1e, 0xbc, 0x50, 0x91, 0xdd, 0x2a, + 0xc6, 0x50, 0x71, 0x39, 0xcf, 0xd7, 0x5d, 0xbe, 0xb0, 0x12, 0xbc, 0xa9, 0x78, 0x84, 0x59, 0x2c, 0xd0, 0xc9, 0x38, 0x5f, 0xf3, 0x14, 0xee, 0x6d, 0xca, 0x22, 0x85, 0xb7, 0x09, 0x41, 0x08, 0xf6, + 0x84, 0x2f, 0x93, 0x26, 0x4f, 0x73, 0xd6, 0xed, 0x34, 0x31, 0x11, 0xa0, 0xae, 0x9d, 0xd0, 0xee, 0x4c, 0xe8, 0x59, 0x9b, 0xec, 0xd6, 0xeb, 0xfd, 0xcf, 0xa5, 0xa0, 0x9d, 0x41, 0x8b, 0xb5, 0xac, + 0x1d, 0x7e, 0x93, 0x65, 0xfd, 0xa4, 0xf2, 0x7c, 0x43, 0xfa, 0x95, 0x41, 0x6f, 0x37, 0xfa, 0xa8, 0xd0, 0x27, 0x2e, 0xa9, 0x2b, 0x7a, 0xa3, 0x58, 0x39, 0x9e, 0x4e, 0x5b, 0xb3, 0x2d, 0xe7, 0x9e, + 0x99, 0x5b, 0x84, 0x90, 0x33, 0x4d, 0xa1, 0xb3, 0xc4, 0x5e, 0xb6, 0x76, 0x74, 0xd2, 0x39, 0x1b, 0xc0, 0x21, 0x32, 0x13, 0x6c, 0x76, 0x5e, 0xa4, 0xf0, 0x61, 0xa5, 0x6e, 0x68, 0x60, 0x09, 0xaf, + 0x1c, 0x75, 0xeb, 0xef, 0x5b, 0x02, 0xc6, 0x58, 0xdb, 0x0a, 0x39, 0x4b, 0x36, 0xe8, 0xd5, 0x88, 0x88, 0xa2, 0x62, 0x33, 0x3f, 0x3c, 0x7f, 0x9c, 0xba, 0xbe, 0xc1, 0xb9, 0xb9, 0xcd, 0xd9, 0x24, + 0xf3, 0xd7, 0xff, 0xef, 0xad, 0xf4, 0xd2, 0x6f, 0xec, 0xfb, 0x03, 0x6e, 0x9d, 0x13, 0x68, 0x49, 0x12, 0x5a, 0x5a, 0x3c, 0x4c, 0x74, 0xdf, 0xba, 0x5b, 0x75, 0x17, 0x7a, 0x2a, 0x59, 0xe4, 0x37, + 0xea, 0x57, 0x36, 0xdd, 0xdc, 0x3b, 0xa7, 0x83, 0xf6, 0x08, 0x98, 0x70, 0xa6, 0x8a, 0xb6, 0x64, 0x16, 0x51, 0xec, 0xa3, 0xda, 0xbe, 0x69, 0x7d, 0x5c, 0x61, 0xda, 0x83, 0x9c, 0x9a, 0x6b, 0xad, + 0x2e, 0x64, 0x8e, 0xd9, 0x61, 0x86, 0x3e, 0xb0, 0xba, 0x42, 0x9c, 0x1b, 0x9d, 0x8d, 0x1b, 0x7e, 0xb9, 0x35, 0xeb, 0xca, 0xc2, 0x54, 0x96, 0xb6, 0x9d, 0xc3, 0x91, 0x41, 0x2d, 0x8c, 0x18, 0xc7, + 0xd0, 0x14, 0x1a, 0x2f, 0x6d, 0x72, 0xa2, 0x22, 0x81, 0x92, 0xad, 0x37, 0x47, 0xa5, 0xe7, 0x46, 0xfc, 0x20, 0x19, 0xed, 0x77, 0x17, 0xf2, 0x73, 0x89, 0x42, 0xff, 0x98, 0x97, 0xf4, 0xb6, 0xe4, + 0xcc, 0xd7, 0x13, 0xe0, 0x99, 0x50, 0xb6, 0x0f, 0x74, 0x2f, 0xac, 0x7f, 0x1d, 0x9d, 0xdd, 0x79, 0x3d, 0x84, 0x68, 0x9c, 0x97, 0x75, 0xd1, 0xa8, 0xf6, 0xea, 0x80, 0x13, 0x42, 0xd6, 0x86, 0x23, + 0x6e, 0xb2, 0x1e, 0x94, 0x69, 0x3c, 0x01, 0x55, 0x90, 0x72, 0xd2, 0x3a, 0x2e, 0x52, 0x89, 0x1c, 0x45, 0x10, 0x03, 0x6c, 0xb9, 0x19, 0xd8, 0xf1, 0x76, 0x67, 0x73, 0x2b, 0x19, 0x18, 0xed, 0x35, + 0x00, 0x5f, 0xa9, 0xb9, 0x0f, 0x6a, 0x46, 0x4a, 0xfb, 0x63, 0x01, 0x5c, 0xce, 0xa0, 0x66, 0x8b, 0xab, 0x26, 0x17, 0x8e, 0xb0, 0x1f, 0xd6, 0x92, 0xf8, 0xa7, 0x18, 0x72, 0xef, 0x74, 0x00, 0x3f, + 0x15, 0x8a, 0x70, 0xa6, 0x78, 0x65, 0x82, 0x77, 0x3e, 0x15, 0xf5, 0x90, 0x8e, 0x8a, 0xbd, 0xd8, 0x12, 0x59, 0x90, 0xae, 0x29, 0xb0, 0x4c, 0xcd, 0xdc, 0x64, 0xb8, 0xf9, 0x3e, 0xab, 0x5c, 0x6a, + 0x61, 0x1b, 0x76, 0xc7, 0xf3, 0x5a, 0xad, 0x4c, 0x79, 0xb6, 0x5d, 0x1f, 0x16, 0x1d, 0xc8, 0xca, 0xde, 0xdc, 0x26, 0x30, 0x81, 0xa4, 0x29, 0x71, 0x29, 0x99, 0x55, 0x0d, 0x67, 0xb3, 0x01, 0x37, + 0x9f, 0xe4, 0x07, 0x74, 0xa6, 0x92, 0x85, 0x91, 0x21, 0x3a, 0x34, 0xe2, 0x0c, 0xf5, 0x78, 0xaf, 0xd1, 0x44, 0x9f, 0x65, 0xe8, 0x0d, 0xbd, 0xd8, 0x4e, 0xbe, 0x93, 0x89, 0xbf, 0x19, 0x8d, 0x5f, + 0x91, 0x3c, 0x7d, 0xd2, 0xaf, 0x7d, 0x8c, 0x97, 0x0f, 0x4d, 0xad, 0xb0, 0x1e, 0x09, 0xc4, 0x67, 0xa2, 0xc6, 0x6e, 0x49, 0x5f, 0xb8, 0xf1, 0xe1, 0x46, 0xdf, 0xd8, 0xb1, 0x9d, 0x14, 0x4e, 0xb7, + 0x18, 0x8c, 0xd6, 0xc9, 0x1a, 0x24, 0xb5, 0x44, 0x9d, 0x75, 0x2e, 0x02, 0xa8, 0xb8, 0xe1, 0x8e, 0x14, 0x80, 0xde, 0x1f, 0x68, 0x66, 0x0d, 0x8c, 0xb5, 0x0d, 0x0f, 0x4a, 0xc1, 0xf2, 0x88, 0x16, + 0xf0, 0xa2, 0x86, 0x37, 0x30, 0x82, 0x8c, 0x0a, 0xe9, 0x10, 0xd5, 0xa5, 0x9c, 0x28, 0x04, 0xc7, 0x85, 0xd4, 0x44, 0x17, 0xd8, 0xb0, 0x81, 0xa3, 0x56, 0x04, 0x38, 0xac, 0x0b, 0xc0, 0x1f, 0xaa, + 0xb6, 0xff, 0xd0, 0xaa, 0xb0, 0x9a, 0xe2, 0x9b, 0xdc, 0xd9, 0xe7, 0xca, 0x9a, 0xbf, 0x93, 0xbd, 0x70, 0xe4, 0x3a, 0xe8, 0x53, 0xc4, 0x1c, 0x1a, 0x1e, 0xd9, 0x7a, 0xb2, 0x83, 0xac, 0x0d, 0x39, + 0x21, 0xb6, 0x36, 0xa3, 0xb9, 0xa5, 0x75, 0x3c, 0x18, 0xa4, 0xd3, 0x0d, 0x56, 0xec, 0xdf, 0x34, 0x39, 0xf5, 0x6c, 0xb2, 0xe7, 0xe5, 0x43, 0xbb, 0x0c, 0xc3, 0xda, 0x33, 0x0b, 0x77, 0x78, 0xae, + 0x00, 0x99, 0x26, 0xf7, 0x15, 0xe1, 0xa7, 0x85, 0xc7, 0x57, 0xcf, 0xb8, 0xc0, 0xf5, 0xd5, 0x27, 0x7d, 0x04, 0x0c, 0x34, 0x4c, 0x88, 0xd5, 0xf2, 0x40, 0x93, 0x6a, 0xa0, 0xac, 0xf6, 0xd6, 0xf1, + 0x88, 0x09, 0x03, 0x02, 0x47, 0x47, 0x08, 0xa1, 0xee, 0xc8, 0xfe, 0x73, 0xb1, 0xe7, 0xf1, 0xc0, 0xb1, 0x62, 0x2b, 0xd3, 0x8a, 0x24, 0x1b, 0xbe, 0xc6, 0xe6, 0x7e, 0xb3, 0xb2, 0xa1, 0xa7, 0x20, + 0xfa, 0xfd, 0x11, 0x17, 0x80, 0x7e, 0xbf, 0x7f, 0x71, 0x68, 0xf4, 0x10, 0xc0, 0x7e, 0x4e, 0xfb, 0xed, 0x28, 0x44, 0x5a, 0xef, 0x40, 0xaf, 0x07, 0x62, 0x7e, 0x30, 0x23, 0xaa, 0xa6, 0x45, 0x43, + 0x68, 0xb4, 0xc3, 0x9e, 0xcb, 0xd3, 0xa5, 0x99, 0x86, 0xb3, 0x9d, 0xcc, 0x8e, 0xaa, 0x23, 0xe4, 0xa9, 0x0e, 0x6b, 0x05, 0xd6, 0x04, 0xe4, 0x20, 0x9c, 0x38, 0x5a, 0x25, 0x89, 0x1b, 0xdd, 0x5a, + 0x6b, 0x2c, 0x13, 0x39, 0x02, 0xbb, 0xae, 0xac, 0xc1, 0xbc, 0xe6, 0x40, 0x2f, 0xe3, 0xc8, 0x9e, 0x4a, 0xcf, 0x7f, 0x04, 0xad, 0xe6, 0x1b, 0x59, 0xf1, 0x5c, 0x97, 0xf2, 0x2b, 0xcd, 0x2b, 0x63, + 0x4f, 0x52, 0xa2, 0x67, 0x97, 0x72, 0x6c, 0x0e, 0x16, 0xcb, 0x82, 0xda, 0xce, 0xd8, 0x48, 0x38, 0x4e, 0x63, 0x8e, 0x82, 0xdd, 0x39, 0x4e, 0xa5, 0xf0, 0xd1, 0x58, 0xd2, 0x33, 0xb3, 0x4c, 0xd0, + 0x42, 0x2d, 0x47, 0xab, 0x2d, 0xc0, 0xe0, 0xfc, 0xba, 0x02, 0x1c, 0xd7, 0x6d, 0x11, 0x30, 0xc1, 0xb0, 0xd2, 0xd6, 0xec, 0x66, 0x01, 0x70, 0x26, 0x43, 0x8c, 0x38, 0x2e, 0x87, 0x97, 0x76, 0x16, + 0x93, 0xd8, 0x96, 0x5b, 0xb6, 0x63, 0x82, 0xda, 0x3d, 0xf2, 0xff, 0x7d, 0x9b, 0xf7, 0xfc, 0x2e, 0x4a, 0xaf, 0x85, 0xe1, 0x7e, 0xcc, 0xd7, 0x9f, 0xc8, 0x28, 0xef, 0x52, 0x44, 0xc9, 0x32, 0x87, + 0x97, 0x24, 0xcd, 0xf0, 0x9e, 0x2f, 0x05, 0xbc, 0x29, 0x66, 0xff, 0x03, 0xbe, 0xfc, 0xfe, 0x84, 0x0b, 0x97, 0x7e, 0xbf, 0x7f, 0x2e, 0x0c, 0xd9, 0x63, 0x9f, 0xad, 0x55, 0xb2, 0x81, 0xfc, 0x9c, + 0x60, 0x35, 0x30, 0xb0, 0x0c, 0x11, 0x98, 0x30, 0x2b, 0x00, 0x19, 0x53, 0xc1, 0x38, 0x2a, 0xfd, 0x03, 0xb1, 0x17, 0xab, 0x75, 0x80, 0x97, 0x25, 0x32, 0x0b, 0x5b, 0x60, 0x15, 0xa0, 0x68, 0xda, + 0x4a, 0x65, 0xb8, 0x4e, 0x63, 0x66, 0x8e, 0xe2, 0xc2, 0xca, 0x67, 0xe6, 0x87, 0x71, 0xca, 0xf2, 0xb1, 0x8c, 0xae, 0x5d, 0x05, 0x91, 0xf6, 0x31, 0x3d, 0x11, 0xe0, 0x0e, 0x7b, 0x9e, 0x67, 0xb7, + 0x49, 0xe4, 0xaf, 0xbd, 0xf4, 0xfe, 0xeb, 0x0d, 0x53, 0x2f, 0x45, 0x0b, 0xe2, 0xdc, 0x33, 0x5f, 0x93, 0x7e, 0x9e, 0xc9, 0x69, 0xff, 0xe7, 0x32, 0x78, 0xbd, 0x7c, 0x18, 0x5b, 0x8e, 0x56, 0x78, + 0x95, 0x35, 0xec, 0xac, 0x2c, 0xf9, 0x66, 0x1b, 0x7b, 0x6a, 0x92, 0xdc, 0x10, 0xbf, 0xcc, 0x8f, 0x9b, 0x5b, 0xe7, 0x8d, 0xab, 0xc7, 0xd4, 0x30, 0x8f, 0x8b, 0x4a, 0xcb, 0x38, 0xad, 0x3e, 0xe4, + 0x33, 0x9d, 0x9f, 0x5a, 0x8b, 0x3d, 0xd1, 0x8d, 0x3b, 0x92, 0x2d, 0x16, 0x23, 0xc3, 0x84, 0x49, 0xa5, 0xb4, 0xcb, 0x72, 0xd6, 0xb9, 0xe0, 0x9c, 0x4c, 0x79, 0xc6, 0x5f, 0xac, 0x62, 0x05, 0x24, + 0xa7, 0x15, 0x91, 0x2b, 0x07, 0xb8, 0x9c, 0x61, 0xbb, 0x74, 0x2d, 0xd4, 0x9e, 0x35, 0xb6, 0x04, 0xba, 0xa1, 0x95, 0xf1, 0x7e, 0x6f, 0x97, 0x84, 0xaa, 0xee, 0x9e, 0x36, 0x8c, 0xfd, 0x6d, 0x2e, + 0xfd, 0x44, 0xa6, 0xc6, 0xe9, 0xfd, 0x82, 0x42, 0x4f, 0x2a, 0x17, 0x71, 0x1a, 0x5d, 0x79, 0x91, 0x46, 0x7d, 0xa3, 0xfd, 0x47, 0x38, 0x3d, 0x61, 0x6d, 0x77, 0xd4, 0x14, 0xd3, 0x69, 0x28, 0xb6, + 0x21, 0x2f, 0x1e, 0xdc, 0xce, 0xcf, 0xdb, 0x80, 0xc9, 0x57, 0x0b, 0x15, 0x22, 0xc7, 0x52, 0xaa, 0xed, 0xbb, 0x75, 0x4b, 0x65, 0xa8, 0xb2, 0xd9, 0x1a, 0xb2, 0xbf, 0xab, 0x3a, 0x8d, 0xd1, 0xda, + 0xe9, 0x98, 0x96, 0xe0, 0x64, 0x07, 0x20, 0xcb, 0x34, 0xf4, 0x5d, 0x66, 0xe7, 0x17, 0xd2, 0x86, 0xf7, 0xa6, 0xb5, 0x07, 0xce, 0x40, 0xef, 0xd1, 0xe2, 0xec, 0xbd, 0x6e, 0xbe, 0x47, 0xb0, 0x8c, + 0x74, 0xeb, 0x5e, 0x51, 0x64, 0xe2, 0x69, 0x10, 0xcf, 0x54, 0xaf, 0x38, 0x9e, 0xaf, 0xcf, 0xf5, 0xe4, 0x7b, 0x40, 0x89, 0x42, 0x13, 0xcf, 0x0e, 0x1c, 0xdc, 0x22, 0xb7, 0x6d, 0x28, 0xa5, 0x66, + 0xb1, 0x4d, 0x2d, 0x4e, 0x5e, 0x1d, 0x2b, 0x89, 0xa2, 0xe5, 0x6e, 0x5b, 0x14, 0x4c, 0x45, 0x6f, 0xa6, 0x04, 0x0a, 0x0d, 0xd2, 0x58, 0x25, 0xc7, 0x7c, 0x05, 0x82, 0x20, 0xba, 0xda, 0x70, 0x28, + 0xb2, 0x5e, 0x8a, 0xd3, 0x70, 0x39, 0x32, 0xe6, 0x15, 0x9f, 0xe2, 0xbc, 0xba, 0x57, 0x77, 0x54, 0xa8, 0xcf, 0x0f, 0x4a, 0xd3, 0xc4, 0x7f, 0x13, 0xca, 0x4b, 0xb9, 0xe9, 0x9f, 0xe0, 0xf9, 0xf8, + 0xc0, 0x46, 0x3c, 0x0f, 0xeb, 0xcd, 0x91, 0xed, 0xe6, 0xd6, 0x59, 0x97, 0x23, 0x1e, 0x83, 0x1c, 0x40, 0x3b, 0x90, 0xdd, 0x74, 0xdc, 0x2a, 0x21, 0xd4, 0x50, 0x61, 0xed, 0x6e, 0x53, 0xc2, 0x88, + 0xe0, 0xe2, 0x2b, 0x8f, 0x9d, 0x69, 0xb9, 0x93, 0xea, 0xa3, 0x03, 0x81, 0x5b, 0x47, 0x7b, 0xa6, 0x8e, 0x8f, 0x35, 0x83, 0xa2, 0x3b, 0x16, 0x5d, 0x6e, 0xa9, 0x8a, 0x52, 0x58, 0x15, 0x32, 0x25, + 0x6e, 0xa4, 0x76, 0x13, 0x77, 0x4b, 0x8d, 0x24, 0x97, 0xb1, 0xb9, 0x60, 0x83, 0xa6, 0xe6, 0x1e, 0x0b, 0xb2, 0xbe, 0xe1, 0xaf, 0xff, 0x01, 0x54, 0xb9, 0xef, 0x63, 0x9e, 0x9f, 0x5a, 0x31, 0x97, + 0xe0, 0x66, 0xef, 0x3d, 0x8a, 0xb9, 0xc7, 0x5a, 0x31, 0xb3, 0xe3, 0x74, 0x8e, 0x18, 0xba, 0xd1, 0x35, 0x0d, 0xbd, 0xd8, 0x24, 0xc2, 0xc1, 0x10, 0xfc, 0xc2, 0x4c, 0xa1, 0x05, 0x10, 0xb6, 0x29, + 0x14, 0xf1, 0x31, 0xd8, 0x68, 0x5d, 0xbc, 0xc9, 0xc9, 0x41, 0x54, 0x52, 0xae, 0xb3, 0x36, 0xb2, 0x58, 0xcf, 0xd3, 0xa4, 0xc1, 0x0e, 0x98, 0x2d, 0xd4, 0x20, 0x13, 0xaf, 0x62, 0xdd, 0x9e, 0x76, + 0x55, 0x4c, 0xaf, 0xe8, 0xe2, 0x38, 0xa5, 0x17, 0x74, 0x42, 0x3e, 0x32, 0x89, 0xfc, 0x19, 0xb1, 0x73, 0xab, 0x1b, 0x7c, 0x85, 0xe4, 0x73, 0xcd, 0xd5, 0x6e, 0x49, 0x5f, 0x10, 0xfd, 0x70, 0xa3, + 0x6f, 0x8b, 0x35, 0x00, 0xde, 0xcd, 0x45, 0xc9, 0x89, 0x8a, 0x63, 0x9d, 0x40, 0x41, 0xd1, 0x90, 0xfc, 0x94, 0xf1, 0x4b, 0xb1, 0x56, 0xf7, 0x11, 0xe3, 0x0a, 0x03, 0xc7, 0x07, 0xed, 0x11, 0x42, + 0x07, 0x2e, 0x47, 0x61, 0x1b, 0x67, 0x3f, 0xda, 0xa8, 0x56, 0xb5, 0x57, 0x94, 0x90, 0x0d, 0x24, 0xbc, 0xb3, 0x44, 0x03, 0xdf, 0xc1, 0xfb, 0x54, 0x30, 0xd7, 0x0a, 0x5b, 0x33, 0xd6, 0x48, 0x99, + 0xa0, 0xd3, 0x3d, 0x4d, 0xc9, 0x7f, 0x53, 0x0a, 0xf5, 0x44, 0xf6, 0xdc, 0x26, 0xe1, 0x1b, 0xc1, 0xf3, 0xf3, 0xc2, 0xdb, 0xaf, 0x44, 0x2f, 0x68, 0x5e, 0xda, 0x6b, 0x40, 0x8f, 0x4b, 0x6f, 0x9f, + 0x23, 0xc4, 0xc2, 0xe5, 0x1e, 0x22, 0x24, 0xfe, 0x88, 0xa2, 0x49, 0x5d, 0x61, 0xe3, 0xf5, 0x06, 0x99, 0x1c, 0x41, 0x7d, 0x2d, 0xd2, 0x3a, 0x39, 0x08, 0x66, 0xc8, 0x6e, 0xa9, 0xc2, 0xb6, 0xa7, + 0xf2, 0xc2, 0xbe, 0xe8, 0x0a, 0x85, 0xc6, 0x3c, 0x70, 0xd2, 0x4d, 0xd4, 0x66, 0x36, 0xad, 0x05, 0x8c, 0x3c, 0x8e, 0x85, 0x7d, 0xd1, 0x98, 0xd4, 0x46, 0x16, 0x00, 0x19, 0x5b, 0x7b, 0x31, 0x54, + 0xfb, 0x93, 0xe3, 0x4c, 0x79, 0x3e, 0x0f, 0xfe, 0xd6, 0x43, 0xfd, 0x9b, 0xe8, 0xf8, 0x7f, 0x56, 0xde, 0xe4, 0xae, 0x96, 0x59, 0xe6, 0xf0, 0x52, 0x7e, 0x43, 0x2f, 0x6d, 0xfb, 0xee, 0x8e, 0xfd, + 0xb4, 0x2d, 0xf0, 0x8b, 0x47, 0x5c, 0xf8, 0xfd, 0xc5, 0x07, 0x7d, 0x6d, 0x83, 0xf9, 0x91, 0x87, 0x77, 0xd3, 0x12, 0x02, 0xc0, 0x16, 0x2f, 0xab, 0x43, 0x2b, 0x15, 0x13, 0xa1, 0x6b, 0xdd, 0xb1, + 0x3f, 0x91, 0x42, 0xc6, 0xb0, 0x66, 0xc9, 0x6a, 0xb9, 0xd8, 0x93, 0xfb, 0x11, 0xbd, 0x1b, 0x19, 0x95, 0x67, 0x00, 0x6b, 0x33, 0x57, 0xc1, 0x80, 0xde, 0x8d, 0x10, 0x86, 0x6e, 0x11, 0x76, 0x47, + 0xcf, 0x54, 0xd6, 0x63, 0x00, 0xa4, 0x1e, 0x8c, 0x19, 0x60, 0xb7, 0xd6, 0x45, 0x86, 0x37, 0xdd, 0x9e, 0x16, 0x83, 0xaf, 0xdc, 0x24, 0xff, 0x0c, 0xef, 0xce, 0x3b, 0xdd, 0x9f, 0xd6, 0x04, 0x2e, + 0x54, 0xaf, 0x1c, 0xba, 0xb4, 0x03, 0xed, 0xb9, 0xf7, 0x17, 0x34, 0xbc, 0x3b, 0x74, 0x5e, 0xe5, 0x5b, 0x78, 0x62, 0x8b, 0x7b, 0x22, 0x84, 0x11, 0xc3, 0x9f, 0x0a, 0x2b, 0x0d, 0x1c, 0x39, 0x3a, + 0xd1, 0x84, 0xe3, 0xe3, 0x1c, 0xf7, 0xe7, 0x98, 0xe5, 0xe3, 0xa5, 0x28, 0x23, 0xf0, 0x36, 0xdc, 0x8b, 0x08, 0xbf, 0x14, 0x3d, 0xa7, 0xd0, 0xe6, 0x16, 0xc3, 0x97, 0x23, 0x3b, 0x71, 0x0d, 0x63, + 0xa3, 0x54, 0xac, 0xa7, 0xae, 0x6c, 0x41, 0x88, 0x05, 0x65, 0x57, 0xfc, 0xc0, 0x17, 0xfc, 0xef, 0x7d, 0xef, 0xbf, 0xa4, 0x1f, 0x7e, 0xc3, 0xcf, 0x27, 0x82, 0x83, 0x5e, 0xa9, 0x5e, 0xf9, 0x79, + 0x29, 0x92, 0xd9, 0x37, 0x28, 0xa8, 0xf6, 0x7c, 0x57, 0xdb, 0x48, 0xce, 0xb1, 0x72, 0x23, 0x00, 0x54, 0xcd, 0xb1, 0x71, 0xe0, 0xd5, 0x62, 0x14, 0x2a, 0xe6, 0x72, 0x96, 0x1a, 0x9b, 0xe9, 0x16, + 0xdb, 0x71, 0xbb, 0x52, 0x39, 0x88, 0xc9, 0x96, 0x18, 0xa1, 0x3b, 0x5e, 0x30, 0x77, 0x03, 0x27, 0xdd, 0xe2, 0x9b, 0x2e, 0x21, 0x74, 0x54, 0x86, 0x99, 0x5d, 0x08, 0x24, 0x29, 0x3e, 0x3f, 0x2a, + 0xe4, 0x08, 0x1d, 0xab, 0x75, 0x35, 0xb2, 0xb5, 0x1f, 0xe8, 0x72, 0x3d, 0xca, 0xcb, 0xfe, 0x3f, 0xcb, 0xcb, 0xa2, 0x4d, 0x5f, 0x45, 0xdb, 0x5d, 0x86, 0x3e, 0x55, 0x6f, 0xe7, 0x86, 0xf4, 0x85, + 0xab, 0x1f, 0x6e, 0x9c, 0xdd, 0xcc, 0x3d, 0x82, 0xe2, 0x98, 0x23, 0x83, 0x42, 0x5b, 0x5e, 0x3d, 0xc2, 0xb6, 0x53, 0xcc, 0xb7, 0xe4, 0x9e, 0x91, 0x67, 0xf2, 0xc2, 0xa5, 0xe4, 0x79, 0xa9, 0x20, + 0xe3, 0x58, 0x44, 0xd6, 0x08, 0xbe, 0x24, 0x17, 0xcb, 0xc3, 0xae, 0x91, 0x9a, 0x8d, 0x13, 0x00, 0xe6, 0x80, 0xe0, 0xfd, 0xa8, 0x9e, 0xc3, 0x55, 0x02, 0x47, 0x4a, 0x74, 0x58, 0x92, 0x3b, 0x45, + 0x5d, 0x96, 0xe0, 0x91, 0x21, 0x75, 0x59, 0xc4, 0x1c, 0xda, 0xcb, 0xfd, 0x9e, 0xf2, 0x53, 0xab, 0x34, 0xef, 0xe2, 0x1e, 0xfd, 0xf0, 0xc3, 0xdf, 0xb9, 0xfc, 0xae, 0x45, 0x3c, 0x76, 0x49, 0x5b, + 0xe7, 0xba, 0x95, 0xe7, 0x9e, 0x9d, 0xd7, 0x2f, 0x40, 0xe4, 0x2d, 0x81, 0xf7, 0x76, 0x21, 0x17, 0x4b, 0xd2, 0xcd, 0x87, 0xff, 0x11, 0x84, 0xc6, 0x19, 0xc3, 0xef, 0xe7, 0xd9, 0x93, 0xe7, 0x86, + 0x77, 0xca, 0x1f, 0xa6, 0xd9, 0xeb, 0x2c, 0x7b, 0x78, 0x8a, 0x80, 0x86, 0x18, 0x13, 0xb3, 0x93, 0x99, 0x6f, 0x4f, 0xa9, 0x7c, 0x83, 0x98, 0x69, 0xba, 0x16, 0x43, 0x87, 0xb6, 0x3b, 0x4d, 0x4a, + 0xbf, 0x0e, 0x53, 0xfe, 0xf6, 0x35, 0x6b, 0x4b, 0x0b, 0x32, 0xcb, 0xfe, 0xd3, 0xba, 0xc9, 0x95, 0xec, 0xe5, 0x05, 0xaf, 0x83, 0xbe, 0x3a, 0xc8, 0xd1, 0x28, 0xf2, 0x92, 0x53, 0x23, 0x76, 0x0d, + 0x0e, 0x2a, 0x49, 0x5a, 0xd9, 0x89, 0x5c, 0xb5, 0x33, 0x0b, 0x1e, 0xcc, 0x25, 0xba, 0x8a, 0x23, 0x15, 0xb6, 0xba, 0x6d, 0x99, 0x42, 0x12, 0x95, 0x5b, 0xa3, 0x41, 0x51, 0x4f, 0x26, 0x96, 0xa7, + 0x85, 0x38, 0x4d, 0x7b, 0x08, 0x6f, 0xc0, 0xcb, 0x99, 0x61, 0xe3, 0x83, 0x63, 0x07, 0xcf, 0x28, 0x31, 0xf6, 0x0f, 0x79, 0x40, 0x36, 0xee, 0x52, 0xd2, 0xc4, 0x9e, 0xe2, 0xf1, 0xff, 0x19, 0x1d, + 0xe4, 0x9c, 0x15, 0x7e, 0x31, 0xd9, 0xde, 0xe1, 0x0d, 0xf8, 0x5c, 0x0e, 0xc9, 0x0d, 0xe9, 0x0b, 0x7f, 0x3e, 0xdc, 0x38, 0xdb, 0xb6, 0x7b, 0x9c, 0x63, 0x65, 0x5f, 0xb2, 0x74, 0x20, 0x64, 0xa2, + 0x20, 0x69, 0x4d, 0x32, 0x6b, 0x45, 0x99, 0x5d, 0x56, 0xc2, 0x24, 0x46, 0xa7, 0x50, 0x90, 0xac, 0x8e, 0xca, 0xa0, 0x3a, 0xb6, 0xbe, 0xbf, 0xb3, 0x0d, 0xa4, 0x69, 0x97, 0x85, 0x88, 0x9a, 0x8a, + 0xd0, 0xac, 0x50, 0x34, 0x57, 0xb3, 0xf8, 0xb8, 0x96, 0x3a, 0xc9, 0xcc, 0x91, 0xa6, 0x15, 0xb2, 0xdd, 0x96, 0xdb, 0x4e, 0x46, 0x9c, 0x3c, 0x91, 0x1d, 0x2e, 0x76, 0x7e, 0x1e, 0xfc, 0x9b, 0xff, + 0x5b, 0x2c, 0xd0, 0xf7, 0xa5, 0xf9, 0x83, 0x45, 0x59, 0x62, 0xbc, 0x29, 0xcd, 0x9c, 0xbc, 0x74, 0xb5, 0x15, 0x95, 0xf0, 0x0b, 0x19, 0x97, 0x97, 0xa2, 0x63, 0x48, 0xdb, 0x86, 0xfe, 0xf1, 0x4b, + 0x59, 0xcd, 0xbd, 0x13, 0xf6, 0xb3, 0xb6, 0x0a, 0xab, 0xb9, 0x1c, 0xac, 0xad, 0xc6, 0xea, 0x63, 0xa9, 0x80, 0x86, 0xb8, 0x58, 0x75, 0x26, 0xdf, 0xc8, 0x3a, 0xe0, 0xed, 0x2c, 0x77, 0x6a, 0xe4, + 0x33, 0xa3, 0x50, 0x3a, 0x32, 0x1f, 0xb8, 0xe3, 0x1f, 0xbe, 0x8e, 0x7f, 0xda, 0x0a, 0x02, 0x2b, 0xce, 0xef, 0xbc, 0xd2, 0x73, 0x56, 0xdf, 0x37, 0xaa, 0xc0, 0xf0, 0xfd, 0xba, 0xaf, 0xed, 0x77, + 0x63, 0x2e, 0x76, 0x76, 0x68, 0xd0, 0x88, 0xb1, 0xeb, 0x96, 0xde, 0xea, 0xb8, 0x76, 0xf2, 0x49, 0x09, 0xe2, 0x33, 0xb1, 0x1c, 0xed, 0x4c, 0x76, 0x21, 0x80, 0xba, 0xa5, 0xe8, 0xa2, 0xcb, 0xf0, + 0x68, 0x80, 0x6b, 0xa9, 0xb3, 0x28, 0x3c, 0xdb, 0x48, 0x26, 0xc5, 0x76, 0xa4, 0x1b, 0x8d, 0x90, 0x2a, 0x54, 0x91, 0x4e, 0xe1, 0x60, 0xb2, 0xc2, 0x25, 0xbd, 0x73, 0xd0, 0x89, 0x56, 0xe6, 0x7b, + 0x40, 0x5c, 0xfe, 0x38, 0xbb, 0xd9, 0x3f, 0x2d, 0xbc, 0xe8, 0xde, 0xea, 0x46, 0x7e, 0x41, 0xcf, 0xb4, 0x12, 0xbf, 0x12, 0xbd, 0xa0, 0x72, 0xba, 0x1a, 0x5e, 0x08, 0x3d, 0x06, 0x25, 0x09, 0x56, + 0x0c, 0x21, 0x1c, 0x0e, 0x0b, 0x42, 0xc9, 0xf8, 0x91, 0x10, 0x20, 0x80, 0x74, 0xc8, 0xe2, 0x12, 0xf5, 0x0e, 0xa3, 0x56, 0x08, 0x06, 0x30, 0x16, 0x1f, 0x0f, 0xa8, 0x17, 0x49, 0x70, 0x9c, 0x96, + 0xd5, 0x56, 0x99, 0x46, 0x09, 0xb0, 0xa6, 0xd5, 0xe4, 0x58, 0xab, 0x81, 0xa2, 0xb1, 0xd3, 0x00, 0xf1, 0xe5, 0x8a, 0x12, 0xb6, 0x02, 0x4b, 0x3b, 0xb4, 0xab, 0x71, 0x42, 0x1b, 0x53, 0xd2, 0xe8, + 0x91, 0xfd, 0xe4, 0xbb, 0xba, 0x95, 0xce, 0xc7, 0x0c, 0xde, 0x4f, 0xed, 0xaf, 0xad, 0x3c, 0xcd, 0xbc, 0x48, 0xfb, 0xeb, 0x9b, 0x7c, 0xb0, 0xdf, 0x42, 0x79, 0xde, 0xf1, 0x3e, 0xa7, 0x80, 0x5e, + 0x87, 0xfd, 0x82, 0x7a, 0xce, 0xdd, 0xb4, 0xbf, 0x3d, 0xc5, 0x23, 0x4f, 0x4e, 0xe3, 0x37, 0xba, 0x67, 0x96, 0xbd, 0x8d, 0xce, 0x56, 0xaf, 0x87, 0xab, 0x74, 0xdf, 0x90, 0x98, 0x55, 0x35, 0x10, + 0x14, 0x5b, 0x23, 0x9c, 0xeb, 0xc8, 0x69, 0x60, 0xbb, 0x03, 0x4d, 0x54, 0x8f, 0x0b, 0xe7, 0xc7, 0x93, 0x31, 0x89, 0x87, 0xb9, 0xe1, 0x5a, 0x91, 0x36, 0x2c, 0x32, 0xed, 0xf4, 0x62, 0xf7, 0x64, + 0x10, 0xf8, 0xeb, 0xb9, 0x89, 0xf9, 0xfb, 0x03, 0x5e, 0x5f, 0xf9, 0xd3, 0xed, 0xe1, 0xf9, 0x09, 0x8f, 0x67, 0x6c, 0xa3, 0xeb, 0x13, 0x06, 0x33, 0x27, 0xca, 0x0e, 0xdb, 0x92, 0x9c, 0x41, 0xbb, + 0x6e, 0xe9, 0x12, 0xcc, 0x82, 0x24, 0x99, 0x43, 0xb9, 0x47, 0x8e, 0x39, 0x8b, 0x28, 0x60, 0x27, 0xa8, 0xb3, 0xa5, 0xad, 0xd2, 0x8c, 0x91, 0xee, 0x3d, 0x66, 0x07, 0x2c, 0x9a, 0x2e, 0xc0, 0xe1, + 0x11, 0x95, 0xe5, 0x9a, 0x0e, 0x44, 0x2b, 0x8f, 0x59, 0x17, 0xde, 0xa8, 0x5e, 0x89, 0x03, 0x12, 0xc5, 0x36, 0xa2, 0x85, 0xc8, 0xdf, 0x27, 0xdf, 0x5f, 0x5b, 0xd0, 0xbf, 0x96, 0x12, 0xbc, 0x74, + 0xa2, 0x1f, 0xd6, 0x5e, 0xe1, 0x26, 0xe5, 0xa5, 0x41, 0xfd, 0xa5, 0xa7, 0xf3, 0xbd, 0xed, 0xe8, 0x59, 0xdc, 0x1e, 0x3c, 0xf1, 0x0d, 0xc8, 0x07, 0xdf, 0xeb, 0x97, 0x09, 0x1b, 0xeb, 0x16, 0x14, + 0x2e, 0xb4, 0x42, 0xec, 0xba, 0x01, 0x59, 0xa7, 0xd0, 0x6c, 0x02, 0x16, 0x41, 0x9d, 0x1d, 0x16, 0xe1, 0x4f, 0xb7, 0xb2, 0xc0, 0x6a, 0xab, 0xfb, 0xf2, 0xed, 0x89, 0xf5, 0x72, 0x22, 0x08, 0x0c, + 0xcf, 0x7f, 0xce, 0x4d, 0x2b, 0x7b, 0x08, 0xfb, 0x51, 0x1b, 0x2c, 0x00, 0x14, 0x97, 0x78, 0x60, 0xb4, 0x14, 0x57, 0x40, 0xee, 0x19, 0x6e, 0xb7, 0x26, 0x84, 0xea, 0xd0, 0xce, 0xa7, 0xca, 0x72, + 0xbe, 0xd5, 0xa6, 0xe1, 0x72, 0x35, 0x9f, 0x8c, 0x43, 0x07, 0xde, 0x2d, 0xc9, 0xe5, 0xa6, 0x45, 0x7d, 0x1d, 0x34, 0xc9, 0x7c, 0x66, 0x0c, 0xc0, 0x6d, 0x01, 0x2a, 0x4a, 0xbc, 0x75, 0x8f, 0xe4, + 0x01, 0xde, 0xa8, 0xce, 0xc4, 0x21, 0xd0, 0x8d, 0xd8, 0x38, 0xc6, 0xe7, 0x16, 0x7c, 0x3f, 0x90, 0x6b, 0xb7, 0x92, 0xe4, 0x2f, 0xa4, 0x67, 0x11, 0x91, 0x4b, 0xe7, 0xa9, 0xe1, 0x3b, 0x80, 0x5f, + 0x61, 0x8a, 0x3d, 0x85, 0xe9, 0x2d, 0x69, 0x60, 0xf8, 0xe9, 0xc6, 0xb9, 0xf2, 0x6c, 0x0f, 0x9c, 0x6b, 0x6b, 0x3b, 0xc8, 0xc0, 0x60, 0x1b, 0x6c, 0xd6, 0xe6, 0xc4, 0x54, 0x26, 0x7c, 0x11, 0xac, + 0xea, 0xfd, 0x61, 0xbd, 0x5d, 0xd1, 0x79, 0xbd, 0xcc, 0x66, 0x54, 0x10, 0xa1, 0x46, 0xb0, 0x16, 0x56, 0xb2, 0xeb, 0x1e, 0x5d, 0x76, 0xc5, 0x42, 0xbb, 0x2d, 0xec, 0xae, 0xfc, 0x01, 0xe4, 0x79, + 0x0e, 0xeb, 0x3a, 0x92, 0x1a, 0x61, 0xce, 0x36, 0xca, 0x36, 0x07, 0x8a, 0x4f, 0xe6, 0x3b, 0x47, 0xdb, 0x2a, 0x50, 0xf3, 0x3c, 0xce, 0xa9, 0x66, 0x04, 0x9a, 0x63, 0x9d, 0x67, 0xfe, 0x79, 0x9b, + 0xc0, 0x9f, 0x6a, 0x2f, 0xdc, 0xc7, 0x82, 0x1f, 0x5a, 0xd5, 0x3d, 0x8e, 0x3c, 0x27, 0x2b, 0x4f, 0x04, 0x4f, 0x7c, 0xb0, 0xaa, 0xb8, 0xaf, 0x2c, 0x1c, 0xe8, 0x5b, 0xb8, 0x64, 0x50, 0x1a, 0xe3, + 0xe6, 0x34, 0xe1, 0x02, 0x31, 0x62, 0x55, 0x86, 0x04, 0xe4, 0xeb, 0x70, 0x71, 0x98, 0xa4, 0x6c, 0x8a, 0xb7, 0x11, 0x29, 0xec, 0x17, 0x98, 0x25, 0xe3, 0x03, 0x9c, 0x98, 0xe6, 0xc7, 0x10, 0xe0, + 0x34, 0x6d, 0x4b, 0x1c, 0x17, 0xd4, 0xb8, 0x80, 0xb3, 0xce, 0x4e, 0x34, 0x00, 0x5b, 0x53, 0x73, 0xca, 0x6d, 0xa6, 0x5e, 0x03, 0x99, 0xab, 0x02, 0x0e, 0xd6, 0xf7, 0x54, 0x9a, 0x3e, 0xe8, 0x67, + 0x56, 0x58, 0x9a, 0xd6, 0xf0, 0xcd, 0xc8, 0x04, 0xdf, 0x86, 0x9a, 0x9c, 0x2b, 0x9e, 0x1b, 0xae, 0x65, 0x04, 0xa7, 0xcf, 0xff, 0xef, 0x6d, 0x99, 0xca, 0xbe, 0xbc, 0x79, 0x01, 0xcf, 0xd5, 0xf6, + 0x7b, 0x30, 0xe8, 0x9c, 0xf3, 0x1a, 0xb5, 0x1f, 0x0a, 0xdf, 0x7e, 0xad, 0x89, 0x12, 0xcf, 0x2c, 0x9f, 0x4f, 0xc4, 0x4f, 0x8c, 0xfb, 0x74, 0x6b, 0x78, 0xa6, 0xfc, 0x98, 0x89, 0xdc, 0x56, 0x23, + 0x15, 0x35, 0x45, 0x96, 0xf0, 0x78, 0x97, 0x1e, 0x77, 0x71, 0x5d, 0x2f, 0x35, 0x3f, 0x61, 0x19, 0x23, 0x5f, 0x0a, 0x54, 0xdc, 0xd5, 0x0b, 0x7e, 0x2d, 0x65, 0x01, 0x51, 0xc6, 0x9d, 0x27, 0xd6, + 0x09, 0x3e, 0xf1, 0x05, 0xc5, 0x6f, 0x05, 0x70, 0x36, 0xaa, 0xed, 0xa0, 0x99, 0x55, 0xe2, 0x20, 0xa6, 0xf2, 0xc9, 0xdc, 0x42, 0xac, 0x95, 0x18, 0x5b, 0xa6, 0xec, 0xb0, 0xac, 0x63, 0x8e, 0x7b, + 0x56, 0x53, 0xd1, 0xfc, 0xea, 0xcc, 0x2a, 0xf2, 0x73, 0x8a, 0xa0, 0x91, 0x24, 0x81, 0x77, 0x51, 0xc3, 0x7e, 0x6b, 0x22, 0x6a, 0x6b, 0x79, 0x71, 0xde, 0x66, 0xb4, 0x2c, 0xbe, 0x1c, 0x88, 0xcf, + 0x55, 0xff, 0x6f, 0xbf, 0x94, 0x5b, 0xc5, 0xf0, 0x42, 0xe4, 0x5a, 0x5f, 0xe7, 0xaf, 0x8b, 0xcd, 0x08, 0xfd, 0xd5, 0x27, 0xd3, 0xf7, 0x37, 0x78, 0x6f, 0x3e, 0xbd, 0xfc, 0xea, 0xaf, 0x98, 0x49, + 0xfe, 0x22, 0x9f, 0xb0, 0x5c, 0x68, 0xfe, 0x69, 0x7b, 0xd1, 0xfc, 0x6a, 0x78, 0xfe, 0xff, 0xc7, 0x2c, 0x6b, 0x46, 0x72, 0x79, 0x18, 0x6c, 0x00, 0xdf, 0x98, 0xf9, 0xd0, 0x94, 0x49, 0x00, 0x7b, + 0x92, 0x8e, 0x46, 0x56, 0xee, 0xcc, 0xa7, 0x7b, 0x8f, 0xa1, 0xf9, 0x6c, 0xd9, 0x68, 0x13, 0x9a, 0x2f, 0x27, 0x4d, 0x9a, 0xac, 0x26, 0xd1, 0xb8, 0x00, 0x26, 0xc2, 0x64, 0x2e, 0x4f, 0xeb, 0x31, + 0x11, 0x84, 0x16, 0x9d, 0xd2, 0xdd, 0xc2, 0x9f, 0xc6, 0x95, 0x8b, 0xb4, 0xf3, 0x44, 0x28, 0xb9, 0x12, 0x9c, 0x16, 0x61, 0xd8, 0x93, 0x65, 0xf7, 0xfa, 0xb0, 0xdf, 0xac, 0xb4, 0x3b, 0x8a, 0xdd, + 0x97, 0x85, 0x16, 0x8e, 0xa5, 0x97, 0x5d, 0x0a, 0x2d, 0xbc, 0xbb, 0x40, 0x2e, 0xd6, 0xbd, 0x1b, 0xe3, 0x60, 0x99, 0x79, 0xaf, 0x35, 0xb0, 0xd0, 0x73, 0x47, 0xd6, 0xdf, 0x16, 0xee, 0x97, 0x06, + 0x92, 0xd3, 0x9a, 0x3f, 0xfd, 0xd3, 0xc5, 0x32, 0x72, 0x4b, 0xf0, 0xa1, 0xe9, 0xc4, 0x4a, 0x13, 0xdd, 0xca, 0xac, 0x2e, 0x78, 0x6f, 0x82, 0xf8, 0xf4, 0xa4, 0xf9, 0x81, 0xae, 0xfb, 0x9c, 0x09, + 0xe1, 0x27, 0xba, 0x6e, 0x0f, 0xe3, 0xc2, 0x69, 0x9e, 0xf1, 0x2b, 0x12, 0x10, 0x47, 0x31, 0x72, 0xf0, 0x0f, 0x2e, 0xab, 0xc6, 0x50, 0xc8, 0xb9, 0xc1, 0x4c, 0x1b, 0x4f, 0xb6, 0xc2, 0x6e, 0xb3, + 0x3e, 0xf8, 0x7b, 0x57, 0x46, 0xa9, 0x31, 0xb0, 0x89, 0x85, 0x8a, 0x6c, 0x2a, 0xe7, 0x58, 0x1c, 0xd3, 0xf1, 0x61, 0xc4, 0x0a, 0x68, 0xb4, 0x59, 0x37, 0x52, 0x03, 0x6d, 0xc2, 0x04, 0x2d, 0x8e, + 0x9d, 0x75, 0xd4, 0xc1, 0x5c, 0x08, 0xb3, 0x52, 0x13, 0x5a, 0xc4, 0x2c, 0xbf, 0xd7, 0x75, 0xc3, 0xc4, 0xbc, 0x5f, 0x9f, 0x01, 0xfd, 0x05, 0x11, 0xbf, 0xe0, 0x27, 0xb6, 0xb6, 0x33, 0xd1, 0x93, + 0x8c, 0x3c, 0x5f, 0x0c, 0xaf, 0x74, 0x1e, 0x03, 0x50, 0xc1, 0xc1, 0x94, 0xb6, 0x30, 0x22, 0xb4, 0x8c, 0x6d, 0x19, 0x6a, 0x53, 0xb6, 0xe4, 0xb7, 0x62, 0x8b, 0x6c, 0x5a, 0xd4, 0xe1, 0xe6, 0x0b, + 0x5c, 0x85, 0x04, 0xa4, 0xa2, 0xa1, 0x20, 0x73, 0x0e, 0x2a, 0x9f, 0xe5, 0xeb, 0x01, 0x37, 0xdb, 0xce, 0x19, 0xb9, 0x91, 0x7d, 0xe3, 0x20, 0xe6, 0x10, 0xc1, 0xb9, 0xba, 0x2a, 0xcf, 0x2d, 0x73, + 0xbc, 0xa8, 0xc8, 0x83, 0x0a, 0x15, 0x95, 0x8f, 0xcd, 0x2a, 0xe9, 0xce, 0xf1, 0xf4, 0x11, 0x26, 0xbf, 0x8c, 0x30, 0x89, 0xad, 0xd3, 0xca, 0xbb, 0x8b, 0x0e, 0xf6, 0xc4, 0xb4, 0xf9, 0x4c, 0xfc, + 0x0d, 0xa5, 0xf7, 0x5b, 0xc3, 0x33, 0xe5, 0x47, 0x0a, 0x3c, 0xea, 0x93, 0x40, 0x4c, 0x0f, 0xc4, 0xca, 0xc4, 0x99, 0x85, 0x14, 0x53, 0x54, 0xe3, 0x1e, 0x12, 0x56, 0x0f, 0x3b, 0xe1, 0xa7, 0x3d, + 0x60, 0xaf, 0xcf, 0x2f, 0xb2, 0x32, 0x36, 0xb4, 0xe2, 0xde, 0x2a, 0x41, 0x7f, 0xa1, 0x4f, 0xc8, 0xda, 0x4f, 0xb4, 0xdf, 0xdf, 0xf6, 0xf5, 0xce, 0xf0, 0x4c, 0xf7, 0xd1, 0xcb, 0xee, 0xfd, 0x1d, + 0x9f, 0x70, 0xf4, 0x46, 0x40, 0xf9, 0x41, 0x07, 0x00, 0xb2, 0x23, 0xb5, 0x83, 0x3d, 0xaf, 0x1f, 0x51, 0xf5, 0xeb, 0x3a, 0x26, 0xdf, 0xbd, 0x6c, 0x92, 0xea, 0x56, 0x7c, 0xb7, 0x07, 0xfa, 0x73, + 0xd5, 0x29, 0xdf, 0xa8, 0x9e, 0x5f, 0xf0, 0x7a, 0xdd, 0xa7, 0x1e, 0x25, 0x34, 0x34, 0x9d, 0x39, 0x22, 0x42, 0xc6, 0xc2, 0x66, 0x44, 0x70, 0x71, 0xa4, 0xac, 0x0a, 0x71, 0xb4, 0x62, 0x90, 0x2e, + 0x66, 0x00, 0xd9, 0x6b, 0x83, 0x68, 0x0a, 0xeb, 0x6a, 0xc8, 0xbe, 0xed, 0x4d, 0xf5, 0x1d, 0x04, 0x9f, 0x8a, 0xf2, 0xff, 0xb9, 0x83, 0xec, 0x2d, 0xe9, 0x33, 0x18, 0x1f, 0x6f, 0xf4, 0x39, 0x9a, + 0x9e, 0xe4, 0xc0, 0x1c, 0xe6, 0x7c, 0x1c, 0x2a, 0x0e, 0xd3, 0x58, 0x9e, 0xcd, 0x04, 0x8f, 0x94, 0x55, 0x33, 0x1f, 0x48, 0xc9, 0xda, 0x2f, 0xd6, 0x13, 0xc4, 0x74, 0x92, 0x60, 0x69, 0x4e, 0xe7, + 0x70, 0xb4, 0x8d, 0xa0, 0xa2, 0x41, 0x23, 0x0c, 0xe4, 0x77, 0x0c, 0x25, 0xa8, 0x12, 0x55, 0xaf, 0xd7, 0x4c, 0xdb, 0x82, 0x32, 0x04, 0x8f, 0xc1, 0xc5, 0x76, 0x8e, 0x7a, 0x86, 0xad, 0xae, 0x99, + 0x41, 0x23, 0xb6, 0x2e, 0xf9, 0xf0, 0x38, 0xf7, 0x38, 0xd8, 0xb0, 0xe7, 0x29, 0x2e, 0x2b, 0x2f, 0x15, 0x19, 0xef, 0x20, 0x8b, 0x3f, 0xb5, 0xdd, 0xbc, 0x51, 0x3d, 0x81, 0xfa, 0x7a, 0x3d, 0xc4, + 0xfb, 0x6d, 0x2c, 0x8b, 0x04, 0x37, 0x17, 0x20, 0x3a, 0x89, 0x24, 0xbf, 0xec, 0xe2, 0x7a, 0x21, 0x49, 0x48, 0xba, 0xb3, 0xf6, 0x91, 0x09, 0x30, 0xa0, 0x6d, 0x6f, 0xc3, 0xe0, 0x70, 0x70, 0x6a, + 0xd5, 0x1b, 0x58, 0x47, 0x68, 0x37, 0x89, 0x8e, 0xeb, 0x7a, 0xe2, 0x0e, 0x2c, 0x2e, 0x57, 0x04, 0x65, 0x52, 0x2b, 0xa3, 0x11, 0xe4, 0xc1, 0x33, 0xcd, 0x45, 0x5d, 0x88, 0xa2, 0x57, 0x93, 0x06, + 0x3d, 0x6e, 0xdd, 0xb9, 0x9e, 0x7b, 0x3d, 0x1d, 0x96, 0xad, 0x16, 0x86, 0xde, 0xb5, 0x0f, 0xc5, 0x73, 0x55, 0x9d, 0x7a, 0x55, 0x48, 0x88, 0xb4, 0xc0, 0x1a, 0x9a, 0xde, 0x7d, 0xcb, 0xdd, 0x33, + 0xa7, 0xe6, 0x57, 0xa2, 0xc0, 0xf0, 0xed, 0xb2, 0xaf, 0x45, 0xc2, 0x41, 0x66, 0x96, 0x08, 0x83, 0x1c, 0x5f, 0xbb, 0x63, 0x4e, 0x07, 0xf0, 0x49, 0x87, 0x4f, 0x4d, 0x74, 0x06, 0xc7, 0x4e, 0x67, + 0x81, 0x7e, 0x47, 0x14, 0x7a, 0x97, 0x4d, 0xe1, 0x7a, 0x2c, 0x0f, 0x92, 0xd1, 0xcc, 0xe2, 0x19, 0x0b, 0xcd, 0xb8, 0x41, 0xbb, 0x84, 0x23, 0x13, 0x5c, 0x00, 0xb6, 0x27, 0xd9, 0x50, 0xae, 0x41, + 0xe3, 0xa9, 0x7b, 0x38, 0x7a, 0xd8, 0x20, 0x91, 0x6b, 0x61, 0x05, 0x58, 0xf3, 0x47, 0x31, 0x80, 0xf7, 0xb9, 0x90, 0x5b, 0x51, 0x75, 0x55, 0xca, 0xf1, 0xa7, 0x98, 0xf0, 0xcf, 0x85, 0xfb, 0xbf, + 0x31, 0xe1, 0xe6, 0xee, 0xdb, 0x0b, 0x7d, 0xbd, 0xc4, 0x9e, 0xf1, 0x9a, 0x5d, 0x48, 0x02, 0xc3, 0xeb, 0xc5, 0x10, 0xef, 0xe7, 0x25, 0xd3, 0x91, 0xd1, 0x96, 0xd2, 0xb6, 0x92, 0x2d, 0xe3, 0x2d, + 0x95, 0x69, 0xe9, 0x8e, 0x1c, 0xa5, 0x98, 0xbd, 0xb4, 0x02, 0x1a, 0x8e, 0x00, 0xbe, 0x8e, 0xa7, 0x89, 0x21, 0xc8, 0x59, 0xb9, 0x9e, 0x49, 0x10, 0x50, 0x59, 0x2b, 0xc7, 0xec, 0x4a, 0xd1, 0x88, + 0x85, 0x15, 0x82, 0xae, 0xf0, 0x49, 0xdd, 0xec, 0x49, 0x9f, 0x01, 0xc2, 0x86, 0xd6, 0xb0, 0x8c, 0x4a, 0xa6, 0xd6, 0xae, 0x2e, 0x31, 0x86, 0xd9, 0x3e, 0xe2, 0xf4, 0x6f, 0x86, 0xef, 0x77, 0x06, + 0xeb, 0x5e, 0x7c, 0x7d, 0x83, 0x7e, 0x66, 0xef, 0x33, 0xbe, 0x56, 0x96, 0x25, 0xf7, 0x63, 0xd7, 0x90, 0x27, 0x2a, 0x52, 0xbd, 0x93, 0x7d, 0x5d, 0x3d, 0xe7, 0xc1, 0xb9, 0xf0, 0x50, 0x8f, 0x5a, + 0x88, 0x39, 0xb9, 0x73, 0x43, 0xde, 0x22, 0x2a, 0x71, 0x99, 0x44, 0x6b, 0x77, 0x02, 0x1d, 0x67, 0x56, 0xb8, 0x4a, 0x82, 0x0c, 0x90, 0x0c, 0x64, 0xec, 0xf0, 0x7a, 0x9e, 0x20, 0x31, 0x81, 0x46, + 0xb2, 0x38, 0xc6, 0xb8, 0xad, 0x5a, 0x07, 0xd4, 0x88, 0x0f, 0x0f, 0x36, 0x7a, 0x10, 0xb5, 0x88, 0x6b, 0x16, 0x34, 0xe9, 0x82, 0x8e, 0x4b, 0x20, 0xd9, 0x6a, 0x84, 0x36, 0x55, 0xbd, 0xd9, 0xc2, + 0x13, 0x99, 0x8d, 0x7f, 0xec, 0x7b, 0x8c, 0xb4, 0x58, 0x73, 0xac, 0xef, 0x2b, 0x53, 0x3c, 0x23, 0xcd, 0x3f, 0xd0, 0x3d, 0xa3, 0xf3, 0x36, 0xea, 0xe7, 0xb8, 0x1b, 0xad, 0x06, 0xb4, 0x4c, 0x04, + 0x11, 0x51, 0xa2, 0x47, 0x87, 0x98, 0x75, 0x3b, 0x6a, 0xbd, 0xab, 0x18, 0x3d, 0x0b, 0x55, 0xe3, 0x3b, 0x65, 0xff, 0xad, 0x59, 0xd7, 0xd7, 0x5c, 0x7e, 0xc6, 0x8a, 0x75, 0x21, 0x79, 0x7a, 0x87, + 0xf3, 0xc5, 0x10, 0xea, 0x67, 0xc9, 0x22, 0x8f, 0x84, 0x4c, 0x3b, 0xab, 0xc5, 0x1e, 0x5d, 0x90, 0x85, 0x61, 0xcb, 0x62, 0x4b, 0x3a, 0xe0, 0x88, 0x37, 0xd6, 0xb5, 0x6a, 0xea, 0xf5, 0x8c, 0x3e, + 0xba, 0x16, 0xb0, 0x57, 0x83, 0x84, 0xed, 0xfc, 0x18, 0x40, 0xb6, 0xf3, 0x69, 0x5d, 0x08, 0x13, 0xa5, 0x38, 0xcc, 0x9b, 0x31, 0x22, 0x90, 0x85, 0xd8, 0xa5, 0x46, 0x37, 0x99, 0x4c, 0x9d, 0x6a, + 0x20, 0xc2, 0x22, 0xd6, 0x82, 0xa0, 0xba, 0x10, 0x3e, 0x17, 0x3e, 0xf9, 0xe9, 0x06, 0xff, 0xd2, 0xc7, 0x0c, 0x18, 0x59, 0x85, 0x9b, 0x98, 0xf7, 0x95, 0xa6, 0x67, 0x4a, 0x60, 0x5c, 0x69, 0x9e, + 0x41, 0x3c, 0x5f, 0xf5, 0x29, 0x77, 0x01, 0x0d, 0x65, 0x29, 0x0a, 0xa0, 0x58, 0xdd, 0xd1, 0x20, 0x61, 0x34, 0x92, 0x1a, 0xc9, 0x09, 0xaf, 0x4f, 0xd1, 0x9d, 0x06, 0x08, 0xe8, 0xdf, 0xc3, 0x01, + 0xec, 0xd5, 0xda, 0x28, 0xf2, 0x8c, 0x2c, 0x79, 0x6d, 0x9a, 0xfb, 0xf5, 0x81, 0xe1, 0x99, 0x7a, 0x3a, 0xef, 0x64, 0x4f, 0x78, 0xbc, 0x0d, 0xce, 0x5e, 0xdf, 0x1e, 0xc5, 0x20, 0xd2, 0x4d, 0xd4, + 0xd5, 0xc0, 0x61, 0x67, 0xd4, 0x87, 0x79, 0x3a, 0x1d, 0x69, 0xec, 0xe8, 0x08, 0x80, 0x07, 0xa1, 0xe6, 0xf8, 0xd6, 0xf1, 0xe9, 0xed, 0x82, 0x6c, 0x41, 0x2d, 0x01, 0x6b, 0xf3, 0x98, 0x66, 0x59, + 0x37, 0xd5, 0x50, 0x25, 0x6e, 0x38, 0xa3, 0x23, 0xec, 0xf5, 0x46, 0xcd, 0xc8, 0x2a, 0x71, 0x49, 0x19, 0x02, 0x83, 0xb9, 0x3b, 0xa6, 0x74, 0xde, 0x60, 0xe4, 0x00, 0xab, 0x19, 0x67, 0x5f, 0x3f, + 0x9a, 0x58, 0xdf, 0xd4, 0x6a, 0xc9, 0x34, 0xc3, 0xba, 0x58, 0x51, 0x7e, 0xeb, 0xba, 0x97, 0x7a, 0x46, 0xf2, 0xde, 0x74, 0x18, 0xfe, 0x05, 0x3f, 0x11, 0xfa, 0xdc, 0xaf, 0x0b, 0xd5, 0x07, 0x4c, + 0x6f, 0xee, 0x7f, 0xfc, 0x05, 0x5f, 0xcb, 0x36, 0xf8, 0x89, 0xa8, 0xc9, 0x37, 0xaa, 0xc0, 0xf0, 0xfd, 0x7a, 0x78, 0xa6, 0xf5, 0x98, 0x7f, 0xcb, 0x94, 0xe6, 0x7c, 0xbb, 0x36, 0x26, 0xd3, 0x9d, + 0x3e, 0x12, 0x2d, 0xcf, 0xd9, 0xe6, 0x70, 0x44, 0x2d, 0xba, 0xc3, 0x4e, 0xec, 0xc6, 0xa5, 0x08, 0x27, 0xa2, 0x31, 0x1e, 0x91, 0x23, 0xc6, 0x22, 0x37, 0x85, 0x05, 0x0e, 0x94, 0xdd, 0xd8, 0xaf, + 0xa1, 0x85, 0x6c, 0x99, 0x53, 0xb7, 0xdc, 0x2e, 0xc5, 0x80, 0xf1, 0x25, 0xa5, 0x5b, 0xf1, 0x48, 0x9c, 0x4e, 0x46, 0x61, 0xb9, 0x75, 0xe7, 0x0a, 0xbd, 0x34, 0x1f, 0xf1, 0xef, 0x07, 0x20, 0xbf, + 0xfd, 0xcf, 0xb3, 0xca, 0x8f, 0x9f, 0xc4, 0xb9, 0xe1, 0x86, 0x5e, 0x1c, 0x58, 0x59, 0xd1, 0x8b, 0x77, 0xd1, 0x7d, 0xbb, 0xd5, 0x33, 0x3d, 0xf3, 0x4e, 0x04, 0xcf, 0x4b, 0x2b, 0xb2, 0x86, 0x50, + 0xbf, 0xae, 0x79, 0x0d, 0x28, 0xc7, 0x64, 0x9e, 0xb2, 0x83, 0xba, 0x5c, 0x40, 0x02, 0x2e, 0x11, 0x4e, 0xac, 0x6b, 0x6b, 0x87, 0x14, 0x1b, 0x17, 0xe5, 0x79, 0x46, 0x27, 0x96, 0x12, 0xcb, 0x47, + 0xf4, 0x7e, 0xe9, 0x89, 0x34, 0xba, 0x59, 0x0a, 0x69, 0x58, 0x79, 0x7e, 0x3c, 0xe0, 0x83, 0x48, 0x89, 0xa2, 0x8d, 0x23, 0xe2, 0x64, 0x64, 0x10, 0xa0, 0x0f, 0xd3, 0xba, 0xb5, 0x9d, 0x6d, 0xf2, + 0x2c, 0xaf, 0xb5, 0xb5, 0xf5, 0x88, 0x29, 0xbf, 0x69, 0x38, 0x57, 0x24, 0xfe, 0x32, 0x42, 0xef, 0xa3, 0x62, 0xd3, 0x97, 0x8b, 0x7d, 0x6a, 0x00, 0x9c, 0x41, 0x31, 0xef, 0x65, 0x83, 0x43, 0xbf, + 0xd0, 0x67, 0x6a, 0x81, 0x5f, 0x89, 0xbe, 0x62, 0x6e, 0xea, 0xc3, 0x0b, 0xa1, 0xc7, 0xb8, 0x03, 0xbc, 0xb0, 0xb5, 0xb9, 0x2c, 0x17, 0x29, 0xd9, 0x62, 0x08, 0xa5, 0x98, 0x89, 0x4e, 0x2e, 0xef, + 0x2b, 0xab, 0xe4, 0x06, 0xa8, 0xe4, 0xfb, 0x4a, 0xa3, 0xad, 0xa1, 0xa6, 0x58, 0x41, 0xcb, 0xd5, 0xcc, 0x27, 0x18, 0xb3, 0x09, 0xa9, 0xb0, 0xb1, 0x5a, 0x9e, 0xeb, 0xdc, 0x76, 0x21, 0x37, 0x44, + 0x86, 0x66, 0xea, 0x7c, 0x31, 0x56, 0x01, 0x3c, 0x0c, 0x96, 0x13, 0xaf, 0x90, 0x0c, 0x80, 0x8f, 0xd2, 0x1f, 0xd6, 0xf0, 0xe8, 0x27, 0x5f, 0xa2, 0x4b, 0x38, 0xea, 0xbd, 0x7d, 0x11, 0x3e, 0xed, + 0x67, 0x3f, 0x8f, 0xa7, 0x7f, 0xa7, 0xfb, 0x0a, 0xde, 0x79, 0x30, 0xbc, 0x90, 0x7b, 0x8c, 0xdf, 0x82, 0x75, 0x8f, 0xf1, 0x44, 0xcb, 0xd9, 0x51, 0x3b, 0x1d, 0x48, 0x79, 0x14, 0x1c, 0x4b, 0x86, + 0x6a, 0xb6, 0x12, 0x5d, 0xaa, 0xe6, 0xfa, 0x80, 0x51, 0xe5, 0x3a, 0x96, 0x60, 0xd9, 0x20, 0xd2, 0x72, 0xbd, 0x5e, 0x0f, 0xc8, 0xd6, 0x13, 0xb1, 0xb1, 0x82, 0x95, 0x7b, 0x37, 0x35, 0x2b, 0x54, + 0xe1, 0x50, 0x79, 0x85, 0x19, 0xb8, 0x17, 0x7a, 0x9e, 0xb2, 0x17, 0x9d, 0x05, 0x10, 0x2f, 0xd6, 0x5c, 0x4a, 0xf4, 0xb4, 0xdb, 0xbf, 0x4f, 0xa5, 0xd7, 0x79, 0xf3, 0xd3, 0x09, 0xdb, 0x1f, 0xfc, + 0xdb, 0xf6, 0x89, 0x7f, 0xce, 0x9a, 0x73, 0x4b, 0xfa, 0xc2, 0x83, 0x0f, 0x37, 0xfa, 0x5a, 0x73, 0x7c, 0x8c, 0x36, 0x8a, 0x38, 0x60, 0x08, 0x2d, 0xb2, 0x65, 0xe0, 0x88, 0x31, 0x4e, 0x94, 0x68, + 0x21, 0xe4, 0xc0, 0x6b, 0x66, 0xb6, 0xd8, 0x64, 0x9a, 0x50, 0x44, 0x0d, 0xb8, 0x48, 0xd9, 0x63, 0xd0, 0xb8, 0x94, 0xcb, 0x02, 0xe1, 0x42, 0x0a, 0xa1, 0x78, 0x95, 0xae, 0x51, 0xcc, 0x95, 0xb5, + 0xac, 0xe6, 0xe9, 0xad, 0x90, 0xec, 0x69, 0x2f, 0x8a, 0x4d, 0x15, 0x5d, 0x2f, 0xc1, 0x0d, 0xd3, 0x94, 0xcd, 0x23, 0xb7, 0xe5, 0x1f, 0x91, 0x06, 0xb1, 0xf7, 0xdd, 0xf6, 0x88, 0x3c, 0xa9, 0xe0, + 0x5c, 0xa9, 0x9e, 0xf1, 0xbc, 0x5e, 0x9f, 0x23, 0x81, 0x7a, 0xa8, 0x37, 0xed, 0x82, 0x91, 0xd7, 0xb4, 0xdb, 0x1e, 0x45, 0x6e, 0xb7, 0x75, 0x8a, 0x11, 0x45, 0x22, 0xe2, 0xa1, 0xc4, 0xf7, 0x48, + 0xd6, 0xa0, 0xab, 0xaa, 0x62, 0x2a, 0x69, 0x57, 0x6d, 0x93, 0xc4, 0x49, 0xeb, 0x64, 0x3e, 0x15, 0x76, 0xeb, 0x41, 0x3b, 0xcd, 0x36, 0x20, 0xb3, 0x49, 0x8a, 0x41, 0x2b, 0x4c, 0xcc, 0x89, 0x40, + 0x94, 0xa8, 0x7b, 0x40, 0xd2, 0xbd, 0x5d, 0xe0, 0xc1, 0x9e, 0xa2, 0x8c, 0xa3, 0x0b, 0xee, 0x1e, 0x19, 0xc6, 0x1e, 0xa8, 0x37, 0x43, 0xab, 0x49, 0xb5, 0xf8, 0x15, 0x94, 0x73, 0xf9, 0x51, 0xe2, + 0x87, 0x93, 0xfd, 0xbf, 0xf4, 0xe5, 0x86, 0x77, 0xd7, 0xaf, 0x7b, 0x52, 0x98, 0x7f, 0x9e, 0x42, 0xf7, 0x4a, 0xf4, 0x95, 0x17, 0x5e, 0x5e, 0x9c, 0xad, 0xb6, 0x3d, 0x52, 0xe8, 0x66, 0xab, 0x51, + 0xcc, 0xef, 0x94, 0x6c, 0x43, 0x8d, 0x69, 0x4e, 0x5d, 0x6f, 0x91, 0xc6, 0x52, 0xd7, 0x84, 0x1d, 0xad, 0x04, 0xca, 0xc1, 0xe3, 0x3d, 0x1f, 0x2d, 0x96, 0x5b, 0xc3, 0xc9, 0x17, 0x96, 0xc6, 0xe5, + 0x85, 0x08, 0xec, 0x84, 0xa9, 0x9c, 0xce, 0xf3, 0x0c, 0x13, 0xdc, 0x83, 0xeb, 0x1e, 0x1c, 0xdc, 0x1e, 0x1c, 0x8b, 0x05, 0x59, 0x7a, 0xea, 0x40, 0xdc, 0x35, 0xc1, 0x74, 0x6f, 0x38, 0xec, 0x81, + 0xfb, 0xbe, 0x51, 0x61, 0x74, 0x5f, 0xbe, 0x3e, 0x75, 0x08, 0x3d, 0x8b, 0xd5, 0xbc, 0xdf, 0x91, 0x53, 0x76, 0xbc, 0x32, 0xb3, 0xeb, 0x71, 0x15, 0xd5, 0xe9, 0xd8, 0x1c, 0xd9, 0xd1, 0x7c, 0x86, + 0xfa, 0xd6, 0x54, 0x0e, 0xc9, 0x9f, 0x46, 0xa1, 0xc5, 0x5a, 0x51, 0x66, 0x5a, 0x38, 0x34, 0x92, 0x28, 0xd5, 0xee, 0x36, 0x5e, 0x80, 0x9e, 0xea, 0xbb, 0xf1, 0x89, 0x36, 0x30, 0xfc, 0x7c, 0xe7, + 0x7c, 0x40, 0x7d, 0xf8, 0xb2, 0x52, 0x86, 0x03, 0x44, 0x61, 0xee, 0x98, 0xb6, 0x8e, 0x33, 0x31, 0x4f, 0x2b, 0xbd, 0xda, 0x1c, 0x58, 0x48, 0x4f, 0x45, 0xe3, 0xa7, 0x2f, 0x9b, 0x98, 0xd6, 0x30, + 0xc9, 0x87, 0x65, 0xe1, 0x7d, 0xd3, 0xcc, 0x0f, 0x79, 0x62, 0xea, 0xde, 0x50, 0x3e, 0xbd, 0xe8, 0xc7, 0xf1, 0xd9, 0xca, 0xd2, 0x63, 0x12, 0xeb, 0xec, 0x82, 0x0d, 0x83, 0x81, 0x3b, 0x1e, 0x10, + 0xc0, 0x78, 0x1b, 0x97, 0x48, 0xbe, 0x5e, 0x15, 0x33, 0x7c, 0x44, 0x78, 0xf5, 0x68, 0x0b, 0x2c, 0x82, 0x7c, 0xea, 0x2e, 0x57, 0xd6, 0xa8, 0xa4, 0xf9, 0x39, 0x28, 0xb8, 0x1d, 0x3b, 0x27, 0x5c, + 0x6e, 0x85, 0xdb, 0xba, 0xd1, 0x96, 0x10, 0xa9, 0x0b, 0xa5, 0xe6, 0x87, 0xca, 0x3e, 0x96, 0x42, 0x1f, 0x64, 0xdd, 0x69, 0x02, 0x1f, 0x89, 0x00, 0xb4, 0xf4, 0xef, 0x3d, 0x8e, 0xa7, 0x41, 0x74, + 0x37, 0xba, 0x09, 0x7e, 0x2a, 0x13, 0xf6, 0x4a, 0xf3, 0x8a, 0x42, 0x94, 0xc4, 0xe7, 0x39, 0xdd, 0xe3, 0xfd, 0x71, 0xc0, 0x3f, 0x16, 0x6a, 0xb5, 0x30, 0x03, 0x70, 0x04, 0xa7, 0x72, 0x3c, 0x85, + 0xc7, 0x2c, 0x03, 0x8d, 0x96, 0xeb, 0xd1, 0x7c, 0xad, 0x8e, 0x97, 0x82, 0x2a, 0xb7, 0x40, 0xbb, 0x85, 0x4a, 0x8b, 0xc3, 0xb5, 0x44, 0x1e, 0xb0, 0x0d, 0xa1, 0x41, 0xa1, 0xac, 0x4a, 0xc5, 0xa1, + 0xab, 0x68, 0x17, 0xb4, 0x45, 0xb4, 0xa3, 0x51, 0x68, 0x3a, 0xdd, 0x87, 0x81, 0x9c, 0x30, 0xfe, 0x06, 0xdf, 0x87, 0x49, 0xf7, 0x48, 0x9e, 0xba, 0x5a, 0xce, 0x5e, 0xea, 0xcd, 0x48, 0x46, 0xe6, + 0xa5, 0x45, 0x7f, 0x79, 0x6b, 0xb8, 0x49, 0xe0, 0x99, 0xda, 0xc5, 0x8e, 0x8b, 0x9c, 0xdd, 0xf2, 0xff, 0xf5, 0xfd, 0x53, 0xd3, 0xd2, 0x4b, 0xe7, 0xed, 0x23, 0xfc, 0xe3, 0x47, 0x5f, 0x35, 0xe8, + 0xf8, 0xa2, 0xcd, 0xf2, 0xc7, 0x1d, 0xef, 0x72, 0x62, 0xbd, 0xe9, 0xf6, 0x9c, 0xe6, 0x45, 0x66, 0x59, 0xbf, 0x32, 0x2b, 0x6a, 0x3f, 0x88, 0xfa, 0x0f, 0x5f, 0xf8, 0x60, 0x65, 0xc6, 0x7e, 0x11, + 0xb7, 0xb4, 0xf3, 0x32, 0x4d, 0x93, 0xac, 0xc8, 0x87, 0x46, 0x12, 0x26, 0xaf, 0xdf, 0xc1, 0x6e, 0xa3, 0x13, 0x8a, 0xa4, 0x7c, 0x7b, 0xf6, 0xa7, 0x08, 0x95, 0x32, 0x36, 0x2d, 0x3b, 0xd7, 0xec, + 0x4b, 0x5c, 0x03, 0xfc, 0xb9, 0x94, 0x75, 0x99, 0x9e, 0x6b, 0xe4, 0xc5, 0x49, 0xe1, 0xd9, 0xde, 0xf5, 0x27, 0xa0, 0x37, 0x2d, 0x81, 0xde, 0xe0, 0xfd, 0xed, 0x60, 0xf1, 0x3e, 0x23, 0xcf, 0xb6, + 0xd3, 0xeb, 0xf0, 0x99, 0x33, 0x06, 0x79, 0xeb, 0x23, 0x7a, 0xfb, 0xb7, 0x6f, 0x43, 0x25, 0x92, 0xd4, 0x8a, 0x8d, 0x24, 0x0c, 0x2d, 0xa3, 0xf0, 0x2a, 0xeb, 0xe6, 0xa5, 0x6e, 0x8f, 0x93, 0xb7, + 0x5f, 0x3c, 0x1f, 0x2b, 0x5f, 0x7f, 0xfa, 0xeb, 0x13, 0x1f, 0x2e, 0xbb, 0x5b, 0x03, 0xc0, 0xeb, 0x8c, 0xf9, 0x5a, 0xbb, 0x81, 0x9f, 0xb0, 0xfa, 0x9e, 0x29, 0x02, 0xc3, 0xcb, 0xdf, 0xe1, 0x99, + 0xc6, 0xe3, 0x55, 0x18, 0x59, 0xe1, 0xc0, 0xb7, 0x89, 0x38, 0x2b, 0xe8, 0x10, 0x13, 0x63, 0x68, 0xdd, 0xa0, 0x78, 0x37, 0xde, 0x1c, 0x96, 0xd3, 0x94, 0xd2, 0xab, 0xce, 0xea, 0x72, 0x8b, 0x48, + 0x09, 0xee, 0xc8, 0xf2, 0x91, 0x99, 0xb0, 0x01, 0x29, 0x2a, 0x22, 0x26, 0xb5, 0x92, 0xd6, 0xd0, 0x91, 0x52, 0xe1, 0x5b, 0x15, 0x5c, 0xb4, 0xf4, 0x72, 0x0c, 0xb9, 0xf9, 0x84, 0x35, 0xf1, 0x29, + 0xeb, 0x3a, 0xec, 0xb6, 0xf8, 0xad, 0x73, 0xe5, 0x87, 0xd6, 0x47, 0xd3, 0xd3, 0x8f, 0x7b, 0xef, 0x68, 0xf4, 0x3f, 0xfe, 0xfb, 0xe9, 0x77, 0x82, 0x2f, 0xff, 0xed, 0xf4, 0x87, 0x78, 0xf9, 0xd7, + 0x7f, 0x7d, 0xf9, 0x1f, 0xff, 0x1d, 0x7d, 0xf9, 0x6f, 0xe8, 0x2f, 0xe4, 0x17, 0xf4, 0xe2, 0x6a, 0x95, 0xf5, 0xa2, 0xbd, 0x84, 0x49, 0x3d, 0xcc, 0xad, 0xca, 0x3a, 0xfd, 0xf2, 0x97, 0x8d, 0x35, + 0x4d, 0xf2, 0x97, 0xcc, 0x72, 0x32, 0x2b, 0x3f, 0x91, 0x78, 0xa9, 0x5d, 0x2b, 0x7e, 0x29, 0x73, 0xcb, 0x7c, 0xf1, 0xe2, 0x17, 0xed, 0x85, 0x4f, 0x4c, 0xeb, 0x97, 0x9f, 0xbf, 0x58, 0x71, 0xe5, + 0x65, 0x49, 0x1c, 0x59, 0x71, 0xf1, 0xeb, 0x85, 0x2d, 0x5e, 0xbc, 0xd3, 0x3f, 0x19, 0x49, 0x14, 0x9d, 0x96, 0xb7, 0xf9, 0xd2, 0x26, 0xe5, 0x5b, 0xfb, 0xa5, 0x22, 0x79, 0xb9, 0x3c, 0x3d, 0xc9, + 0x5e, 0xce, 0x0f, 0xfe, 0xf5, 0xf2, 0x9f, 0xbe, 0x30, 0x23, 0x54, 0xde, 0xe9, 0x79, 0x91, 0x65, 0x7a, 0xda, 0x15, 0x6a, 0x2f, 0xcf, 0x4b, 0x2b, 0x07, 0x88, 0x11, 0xf1, 0x9f, 0x9f, 0x54, 0xe2, + 0xa2, 0xfc, 0xba, 0xa4, 0xa0, 0x5e, 0xde, 0xe3, 0x2f, 0x27, 0xd2, 0x83, 0x36, 0xbf, 0xcf, 0xc5, 0xcd, 0x7f, 0xd5, 0xe6, 0xb7, 0x57, 0xc4, 0x7c, 0x61, 0x6e, 0x76, 0xc8, 0x64, 0xae, 0x66, 0xde, + 0x62, 0x1f, 0xd9, 0xfc, 0xdc, 0x0e, 0x13, 0x86, 0x24, 0x42, 0xb9, 0xac, 0xc0, 0x7f, 0xf3, 0x43, 0xc3, 0x97, 0xf0, 0x7c, 0xa3, 0xb8, 0x3d, 0x65, 0x30, 0x7e, 0x53, 0xdc, 0x1e, 0x9a, 0x89, 0xcf, + 0xae, 0x94, 0x79, 0x20, 0x36, 0x03, 0xd9, 0x5f, 0x15, 0xd1, 0x18, 0x5f, 0x1d, 0x60, 0x22, 0x19, 0xa3, 0x33, 0x6a, 0x46, 0x73, 0xb3, 0x89, 0xaa, 0xa2, 0x12, 0x7a, 0x38, 0x5a, 0x73, 0xe1, 0x30, + 0xa9, 0x70, 0xb2, 0xd8, 0x0e, 0x7c, 0x1d, 0xa9, 0x02, 0x60, 0xd3, 0x6a, 0xcb, 0xbd, 0x08, 0x8a, 0xdb, 0x65, 0xbb, 0x2f, 0x22, 0x4e, 0x5a, 0x81, 0xfa, 0x40, 0x33, 0x77, 0x5b, 0xba, 0xd2, 0x73, + 0x48, 0xa4, 0x35, 0x06, 0xfe, 0xb1, 0x2b, 0xe5, 0x4b, 0x60, 0xbe, 0xf5, 0xe2, 0xdd, 0x6e, 0x21, 0x7d, 0xc1, 0xf9, 0xec, 0xc5, 0x3b, 0x53, 0xe9, 0x01, 0x92, 0x56, 0x6a, 0x53, 0x1b, 0x10, 0x55, + 0x53, 0x76, 0x32, 0x6e, 0xcb, 0x2b, 0xcc, 0xa6, 0x48, 0x0f, 0x1a, 0xe4, 0x6d, 0xbc, 0xa5, 0xa1, 0x59, 0xba, 0xb7, 0x5c, 0x43, 0xd4, 0xc2, 0x4c, 0xd7, 0xe1, 0x9e, 0x81, 0xc3, 0x49, 0x65, 0x35, + 0x6b, 0xf3, 0x80, 0x61, 0x79, 0x2c, 0xce, 0xda, 0x25, 0xb1, 0xee, 0xd2, 0xd2, 0x3c, 0xea, 0x13, 0x16, 0x3c, 0x1e, 0x66, 0xb6, 0xa0, 0xe5, 0x8c, 0xd9, 0xf2, 0xd3, 0xf9, 0xa3, 0x43, 0x6a, 0x2f, + 0x2f, 0xde, 0xb3, 0x93, 0xee, 0xb7, 0x0d, 0xf7, 0x6b, 0x8c, 0x9f, 0x09, 0x62, 0xba, 0x25, 0x7d, 0xc2, 0xfa, 0xe6, 0xc6, 0x10, 0x7b, 0x1c, 0xc0, 0x74, 0xc2, 0x7c, 0xed, 0xcb, 0x7e, 0x6d, 0x1e, + 0xd8, 0x02, 0x05, 0xc9, 0x15, 0xeb, 0x8d, 0x8f, 0x93, 0x03, 0x9a, 0xec, 0x96, 0xb9, 0xb3, 0x83, 0xe9, 0xe3, 0x78, 0xde, 0xe5, 0xb0, 0x98, 0x06, 0x11, 0xaa, 0xad, 0x15, 0xdd, 0x8f, 0x06, 0x2a, + 0xbd, 0xa7, 0x8d, 0x3d, 0x2a, 0xd9, 0x33, 0x7e, 0x9b, 0xa1, 0xe5, 0x8a, 0x57, 0x23, 0x0d, 0xb4, 0x5a, 0xd4, 0xc6, 0x42, 0x87, 0xcb, 0x02, 0x0a, 0xd4, 0x0e, 0xe0, 0x7a, 0x95, 0x3c, 0xf2, 0x9c, + 0x7e, 0x9f, 0x35, 0x7f, 0x15, 0x62, 0x17, 0xe5, 0xe7, 0xe7, 0x36, 0x9b, 0x7e, 0x12, 0x22, 0xfd, 0xb6, 0x3f, 0xda, 0xcf, 0xd9, 0x71, 0xa2, 0x78, 0xd6, 0x7d, 0xd3, 0xa2, 0x57, 0xd5, 0x50, 0x68, + 0xa8, 0x9b, 0xa0, 0x5b, 0x49, 0x49, 0xb3, 0x3e, 0x94, 0x92, 0x11, 0x23, 0xb2, 0x6b, 0x7b, 0x11, 0x89, 0x28, 0x2c, 0x3e, 0x78, 0xe0, 0x3b, 0xfa, 0x26, 0xb6, 0x58, 0xd7, 0xb3, 0xf3, 0xf7, 0xff, + 0xfa, 0xa2, 0xd2, 0xc0, 0x17, 0x3a, 0xd7, 0x19, 0x84, 0xab, 0xc2, 0x95, 0x16, 0x3f, 0xd7, 0xb6, 0xfa, 0xd8, 0x0c, 0xe2, 0x24, 0x8b, 0xb4, 0xd0, 0xeb, 0xbe, 0xf5, 0xe0, 0x3e, 0xb7, 0x39, 0xdd, + 0x92, 0x3e, 0xa3, 0xff, 0xf1, 0x46, 0x9f, 0x8d, 0xea, 0x7c, 0x00, 0xb1, 0xd4, 0x1c, 0xe3, 0x72, 0x64, 0x5f, 0x4c, 0xbc, 0x9c, 0xd9, 0xa7, 0x23, 0x09, 0x9e, 0xef, 0x5a, 0xd2, 0x3c, 0x06, 0xe9, + 0xdc, 0x43, 0x29, 0x59, 0xea, 0x90, 0xb9, 0x76, 0xf4, 0x68, 0xdc, 0xea, 0x4a, 0x1d, 0xc4, 0x20, 0x98, 0x96, 0xba, 0xe2, 0xb0, 0xab, 0x77, 0x14, 0x3e, 0xc1, 0xd9, 0xa5, 0xbe, 0x0e, 0x14, 0x58, + 0x8c, 0x75, 0x20, 0x9a, 0xa2, 0x7b, 0x25, 0xf1, 0x27, 0x9b, 0xda, 0xa8, 0xb9, 0x47, 0x07, 0x90, 0x3f, 0x15, 0xe9, 0xf4, 0xfe, 0xca, 0x17, 0x4d, 0xf5, 0x2b, 0x74, 0xd1, 0x5f, 0xd8, 0x13, 0x42, + 0xfc, 0x86, 0xf2, 0x0d, 0xb8, 0x65, 0x16, 0x9e, 0xe3, 0x23, 0x7b, 0x88, 0xf4, 0xd1, 0x4e, 0x9d, 0xcc, 0x36, 0xcc, 0xda, 0xe4, 0x33, 0x7b, 0x9b, 0xce, 0x1d, 0x72, 0x00, 0xb1, 0x3c, 0xeb, 0x8c, + 0x10, 0x0a, 0xef, 0x68, 0x50, 0x3b, 0xac, 0xe4, 0x59, 0x50, 0x43, 0xfb, 0x59, 0x5d, 0x09, 0xa8, 0x14, 0xaa, 0x6d, 0xbd, 0xc3, 0x35, 0xce, 0xc1, 0x04, 0x1b, 0x1c, 0xa7, 0x80, 0xe8, 0x18, 0xba, + 0x54, 0xa3, 0x1c, 0xdf, 0x54, 0xab, 0xfd, 0x61, 0x65, 0x95, 0x4e, 0xbd, 0x9a, 0x1c, 0xc0, 0xf1, 0xdf, 0xc4, 0xb6, 0x8f, 0x8f, 0xf9, 0x5a, 0x33, 0x4e, 0xcb, 0x73, 0xcf, 0xb9, 0x77, 0x4e, 0x46, + 0x9f, 0xaa, 0x62, 0x7d, 0x43, 0x19, 0x18, 0xde, 0x8e, 0xcf, 0x6d, 0x83, 0x1f, 0xe6, 0x8d, 0xb1, 0xeb, 0xa8, 0x68, 0x30, 0x55, 0x71, 0x49, 0x60, 0x7c, 0xe0, 0xaa, 0xdd, 0x3a, 0xcf, 0xd8, 0x8a, + 0xc8, 0xe1, 0xc9, 0x7c, 0xd5, 0xdf, 0xaf, 0xd0, 0x7b, 0x86, 0x5d, 0x7f, 0xa0, 0x17, 0xe7, 0xe9, 0x77, 0x65, 0xfb, 0x9e, 0x49, 0xe9, 0xb8, 0x25, 0xfd, 0x0e, 0xc6, 0xf5, 0xc6, 0x10, 0xea, 0x97, + 0xce, 0xa1, 0x11, 0x29, 0xcd, 0x98, 0x2e, 0xd4, 0x2c, 0xd9, 0xb1, 0xb3, 0x6d, 0xa5, 0xdd, 0xdc, 0xe1, 0x56, 0x0d, 0xd0, 0xd4, 0x53, 0x35, 0x0f, 0x78, 0x68, 0x67, 0xe2, 0x96, 0xa3, 0x28, 0x3c, + 0x42, 0x9b, 0x9b, 0x3d, 0xaa, 0xae, 0x44, 0x9e, 0x9e, 0xee, 0xb6, 0xb3, 0x81, 0x5b, 0xb7, 0x30, 0xb7, 0x9b, 0x0c, 0xa8, 0x70, 0x20, 0xb5, 0xdc, 0x61, 0xcc, 0xc7, 0x75, 0x07, 0xf8, 0xad, 0x0b, + 0x1c, 0xcb, 0x62, 0xb9, 0x7b, 0xb4, 0x87, 0x3d, 0xeb, 0x7c, 0xec, 0x5d, 0x9b, 0xe0, 0x15, 0x8b, 0xef, 0x02, 0x1d, 0x7e, 0xee, 0x19, 0x7e, 0xa3, 0xfa, 0x01, 0xed, 0x4b, 0xb0, 0x43, 0x0f, 0xcf, + 0x70, 0x61, 0xb5, 0x47, 0xae, 0x9a, 0xed, 0x3b, 0x2e, 0x38, 0x62, 0xd4, 0x28, 0xf0, 0xc8, 0x99, 0xbc, 0x1f, 0x8f, 0x40, 0x78, 0x47, 0x6f, 0xe0, 0x63, 0xd0, 0x44, 0xe6, 0x18, 0x8d, 0x39, 0x7b, + 0x50, 0xfb, 0x02, 0x37, 0xde, 0x3b, 0x4d, 0x37, 0xd9, 0xab, 0xfc, 0xa4, 0x49, 0xa7, 0xc7, 0xd1, 0xaa, 0xa2, 0xc9, 0x55, 0xe4, 0xee, 0xf9, 0x6c, 0xc0, 0x92, 0x35, 0x42, 0xf1, 0xe8, 0x48, 0x6e, + 0x10, 0x5c, 0xc1, 0x0f, 0x8f, 0x9c, 0x90, 0xf7, 0xb7, 0x3b, 0xd3, 0xb2, 0xbd, 0xd8, 0x1a, 0xa6, 0x59, 0x92, 0x5a, 0x59, 0xe1, 0x5d, 0x9d, 0xfc, 0xb7, 0xb8, 0xdc, 0xab, 0xb1, 0x02, 0x0e, 0x63, + 0xab, 0x29, 0xfe, 0xfd, 0x54, 0xe4, 0xb9, 0xf2, 0xea, 0xdb, 0x68, 0xe1, 0xbf, 0x21, 0x8e, 0xae, 0xa1, 0xc2, 0x1f, 0x46, 0xe7, 0x39, 0xd1, 0x43, 0xc2, 0xf3, 0xe5, 0x98, 0x96, 0x76, 0xc2, 0x6e, + 0x95, 0x85, 0xec, 0x41, 0xb0, 0x99, 0x65, 0x37, 0xc5, 0xf5, 0x54, 0x2c, 0x91, 0x42, 0x29, 0x90, 0xa6, 0xf2, 0x79, 0x73, 0xc3, 0xae, 0x07, 0x33, 0x6b, 0x0b, 0x86, 0xbc, 0x8e, 0x2e, 0xc9, 0xfd, + 0x86, 0x00, 0x27, 0xda, 0xb4, 0x71, 0x4b, 0xde, 0x29, 0x25, 0xf8, 0x30, 0x1f, 0xcc, 0xfd, 0xa0, 0x5d, 0xd5, 0x42, 0x97, 0xf3, 0x98, 0x1a, 0x14, 0x6c, 0x64, 0xbb, 0xff, 0x16, 0xad, 0xa7, 0x2e, + 0xaf, 0xf6, 0xeb, 0xa1, 0x44, 0xff, 0xf9, 0x51, 0xf0, 0x86, 0xf2, 0x1b, 0x88, 0xbf, 0x3e, 0x48, 0xf4, 0x1e, 0x07, 0x44, 0xaf, 0xd9, 0xc2, 0x1c, 0xb6, 0x65, 0x0e, 0xf9, 0x38, 0x6d, 0xbd, 0x9d, + 0xa8, 0x2c, 0xa3, 0xfd, 0x00, 0xa6, 0x99, 0xf4, 0x70, 0xb0, 0x30, 0xd6, 0x43, 0x56, 0x03, 0x1b, 0xb5, 0x06, 0xda, 0x62, 0x36, 0x66, 0xb4, 0x04, 0xd3, 0xa2, 0xd9, 0x66, 0x8f, 0x2f, 0x40, 0x41, + 0xc0, 0x0d, 0x80, 0xdb, 0x91, 0x94, 0x85, 0x12, 0x65, 0x31, 0x69, 0xe0, 0x39, 0x47, 0x8e, 0xdc, 0x66, 0x4e, 0xe1, 0x07, 0x29, 0x5a, 0x96, 0x4f, 0xd7, 0x62, 0xb9, 0x31, 0xfb, 0xf5, 0x5c, 0x66, + 0x5f, 0x17, 0xbc, 0xfa, 0xf0, 0x85, 0xdb, 0x29, 0x7c, 0xa1, 0xf0, 0xef, 0x67, 0xfd, 0xc5, 0xc3, 0xd8, 0x2a, 0x86, 0xa1, 0x97, 0x17, 0xd6, 0xbd, 0xe9, 0xf3, 0x5c, 0xe8, 0xd9, 0x0d, 0xe5, 0xd3, + 0xf4, 0xf9, 0x38, 0xee, 0x13, 0x86, 0x76, 0x76, 0x4a, 0x42, 0xcc, 0x46, 0x69, 0xc9, 0x1c, 0xd8, 0x84, 0x06, 0x55, 0x4d, 0x77, 0xf5, 0xf2, 0x20, 0x45, 0x81, 0x30, 0x5d, 0x99, 0x0d, 0xba, 0x94, + 0x4a, 0xb6, 0x0a, 0x93, 0x49, 0xbc, 0x56, 0x16, 0x30, 0x67, 0x52, 0xd4, 0x04, 0xd2, 0x72, 0x05, 0x65, 0x0a, 0xdb, 0x3d, 0xd4, 0x16, 0xb2, 0xdb, 0x07, 0x31, 0xa7, 0x05, 0xe3, 0xad, 0x3a, 0x8d, + 0xf5, 0xce, 0x2d, 0x60, 0xd6, 0xaf, 0x91, 0x15, 0x44, 0x1f, 0x67, 0x3f, 0x09, 0x53, 0x18, 0xfd, 0x42, 0x7f, 0x81, 0x2f, 0xff, 0xfa, 0xaf, 0x2f, 0xff, 0x42, 0xfe, 0x1a, 0xf5, 0x5b, 0x90, 0x97, + 0x16, 0xa5, 0x5f, 0x03, 0xf9, 0x8c, 0xe3, 0xe9, 0x44, 0xf0, 0x8c, 0x9f, 0xd1, 0xd3, 0xc5, 0xb4, 0x9f, 0xe6, 0x5a, 0x8a, 0xec, 0xf7, 0xcc, 0x2e, 0xdf, 0x08, 0xf9, 0x6c, 0x14, 0xcf, 0x26, 0x38, + 0x81, 0x21, 0x07, 0x6d, 0xf4, 0x75, 0xfe, 0x7d, 0x8f, 0xa5, 0xf4, 0xb3, 0xee, 0xaa, 0x49, 0x5a, 0x78, 0x49, 0xac, 0x15, 0x77, 0x4d, 0x03, 0xe0, 0x53, 0xfd, 0x18, 0xdf, 0xc9, 0x9e, 0xe0, 0x78, + 0x1b, 0x0c, 0xc1, 0x7e, 0x1d, 0x19, 0x09, 0x74, 0x13, 0x2a, 0xd8, 0x6c, 0x12, 0xbb, 0x47, 0xd4, 0xdf, 0x34, 0xf2, 0x4e, 0x5c, 0x4e, 0xb5, 0x4d, 0x9d, 0xc9, 0xfc, 0x61, 0x75, 0xcc, 0xe7, 0xb9, + 0xb7, 0xc7, 0xc7, 0x8b, 0x1a, 0x3d, 0x2c, 0x49, 0x37, 0x2a, 0x22, 0x08, 0xac, 0x27, 0x60, 0x9b, 0xaa, 0x14, 0x57, 0x63, 0x2c, 0x9b, 0x92, 0x18, 0xaf, 0xae, 0xb2, 0x11, 0x34, 0x38, 0x9a, 0xd0, + 0xa6, 0xaa, 0x68, 0xbe, 0x76, 0x08, 0xdf, 0xdf, 0xcc, 0x1e, 0xa9, 0x53, 0xdf, 0xed, 0xf2, 0x56, 0x7a, 0xd1, 0x82, 0xfe, 0xfa, 0x17, 0xf0, 0xb3, 0xd0, 0x39, 0xa7, 0x66, 0x86, 0x56, 0x65, 0xc5, + 0xb9, 0x5b, 0x58, 0xde, 0xc5, 0xfd, 0x0d, 0xdf, 0xb4, 0xef, 0x7d, 0x79, 0xf9, 0xeb, 0x9a, 0x38, 0x7e, 0x49, 0xac, 0xbd, 0x0d, 0x00, 0xfc, 0x51, 0xfe, 0xf4, 0xef, 0x89, 0xb9, 0x75, 0x92, 0x99, + 0xc3, 0x13, 0xd3, 0xdf, 0xfe, 0xfd, 0xe7, 0x01, 0x84, 0xbd, 0xd3, 0xab, 0x93, 0xca, 0xca, 0xc2, 0x44, 0x33, 0x4f, 0xa2, 0xb8, 0xb0, 0xbe, 0x6f, 0x8e, 0x02, 0x3f, 0x33, 0x6f, 0x7e, 0xa7, 0x7f, + 0x9a, 0x40, 0xbf, 0xdf, 0x3d, 0xfb, 0xe7, 0x7b, 0xcc, 0x24, 0x8d, 0x15, 0x9c, 0x23, 0x71, 0x70, 0x42, 0x33, 0xa0, 0xb8, 0x91, 0x91, 0x62, 0x7e, 0x30, 0x06, 0x22, 0x9b, 0x1f, 0x97, 0x5e, 0x00, + 0xf2, 0x6a, 0x25, 0x6b, 0x54, 0x98, 0x2e, 0x5c, 0x69, 0x3b, 0xb0, 0xad, 0xf4, 0x88, 0xd4, 0xca, 0x38, 0x4a, 0xd6, 0x9b, 0x74, 0xe1, 0xdb, 0x73, 0x7c, 0xac, 0x60, 0x75, 0xbd, 0x4d, 0xe6, 0xc9, + 0x4e, 0xcc, 0x71, 0x4b, 0x14, 0x6b, 0xdb, 0x76, 0xa1, 0x23, 0x1a, 0x0f, 0x7a, 0xe6, 0xbc, 0x68, 0x65, 0x91, 0x18, 0x5a, 0x1c, 0x5f, 0x43, 0x22, 0xd0, 0xcf, 0x9c, 0xff, 0x98, 0x84, 0x76, 0xe1, + 0x5c, 0x1f, 0x16, 0xa4, 0x43, 0x43, 0x8b, 0x0d, 0xeb, 0xfb, 0x16, 0x6c, 0xcf, 0xa4, 0xb9, 0x7c, 0x24, 0x0c, 0x0c, 0x6f, 0x86, 0xe7, 0x3d, 0xa0, 0xc7, 0x31, 0x28, 0x27, 0x90, 0x43, 0x23, 0xa8, + 0x68, 0x97, 0x16, 0x90, 0x65, 0xaa, 0x8a, 0xda, 0x55, 0xee, 0x71, 0xa6, 0xe1, 0x65, 0xb5, 0x36, 0xa0, 0xaa, 0xde, 0x69, 0xe0, 0x12, 0xa4, 0xcc, 0x82, 0x55, 0x9d, 0xf5, 0x6a, 0xbc, 0xf0, 0x47, + 0xac, 0x6e, 0xe9, 0xcc, 0x60, 0x11, 0x38, 0x4b, 0xd5, 0x18, 0xb9, 0x03, 0x0a, 0xc4, 0xc4, 0x25, 0xc3, 0x09, 0xdb, 0x10, 0xd5, 0xfc, 0x39, 0x44, 0x45, 0x7c, 0x26, 0xab, 0x9f, 0x53, 0xa4, 0x7f, + 0x7a, 0xd6, 0xee, 0x13, 0x3d, 0xf5, 0xa9, 0x82, 0xc4, 0x57, 0x98, 0xe2, 0x4f, 0x99, 0x48, 0x3f, 0x12, 0x3e, 0x61, 0xfa, 0x61, 0x38, 0xc4, 0xfb, 0x99, 0x47, 0x03, 0x44, 0x37, 0x23, 0x38, 0x86, + 0xb1, 0x22, 0x68, 0x1b, 0xc3, 0x97, 0x96, 0x1d, 0x85, 0x35, 0x64, 0x60, 0xcb, 0x4d, 0xb8, 0x32, 0x9d, 0x5c, 0x17, 0x33, 0x70, 0x1e, 0xa8, 0x46, 0xcd, 0xe4, 0x5c, 0xaa, 0x6b, 0xb8, 0x41, 0xf9, + 0xc7, 0x49, 0x01, 0x2d, 0x43, 0x63, 0xe2, 0x2e, 0xe9, 0xaa, 0x61, 0x58, 0x63, 0x4b, 0x41, 0x33, 0x79, 0x55, 0xd6, 0x89, 0xe7, 0xab, 0x30, 0xde, 0x58, 0x0d, 0xb6, 0x7a, 0x64, 0x92, 0xfe, 0xa6, + 0xb5, 0x48, 0x72, 0x39, 0xc2, 0x8c, 0x6e, 0xc2, 0x4e, 0xcf, 0x88, 0x5c, 0xde, 0x7e, 0xa8, 0x95, 0x85, 0x7b, 0xa9, 0xd2, 0xf5, 0xd7, 0x7b, 0xb6, 0xd7, 0x57, 0x5f, 0xbc, 0x2a, 0x47, 0xff, 0x82, + 0x7d, 0xfe, 0xc6, 0x4d, 0x9a, 0x12, 0xfc, 0x84, 0x01, 0xb6, 0x8f, 0x7d, 0xe5, 0x86, 0x35, 0xfd, 0xdd, 0x11, 0xff, 0x5f, 0x52, 0xd1, 0x0f, 0x92, 0x8a, 0x52, 0x2d, 0xb8, 0xd7, 0x97, 0xe5, 0xac, + 0x9b, 0xff, 0x7c, 0x83, 0x38, 0x51, 0x3c, 0x2f, 0xa4, 0x20, 0xb9, 0x18, 0xb9, 0x7b, 0xec, 0x01, 0xa8, 0xcb, 0x51, 0xa4, 0xd8, 0xa2, 0x9d, 0x6a, 0x58, 0x58, 0x8e, 0xb6, 0xe6, 0xe8, 0xd0, 0x25, + 0xe9, 0xb1, 0x96, 0x2b, 0xa0, 0x9d, 0xf3, 0xae, 0x0c, 0x51, 0x21, 0xc9, 0x6f, 0xa3, 0xc9, 0x11, 0x22, 0x70, 0x84, 0xb1, 0x96, 0xf0, 0x80, 0xae, 0xe5, 0x6d, 0x35, 0x08, 0xad, 0xb9, 0xc5, 0x41, + 0xc8, 0x34, 0x76, 0xe1, 0xda, 0xd6, 0x8f, 0x49, 0x2d, 0x8b, 0x87, 0x09, 0x2b, 0x80, 0x1d, 0x5a, 0x68, 0xca, 0xf7, 0x31, 0x5a, 0xa9, 0x96, 0x59, 0x71, 0x31, 0xbc, 0x0c, 0xbf, 0x43, 0xe0, 0x09, + 0x00, 0x3e, 0x50, 0x3e, 0x23, 0xf1, 0x61, 0xdc, 0x37, 0x16, 0x73, 0xbe, 0x86, 0xe9, 0xfd, 0x26, 0x5d, 0xcb, 0x24, 0x90, 0x0c, 0xc6, 0x35, 0xa9, 0x1c, 0x0b, 0x5b, 0x55, 0x45, 0x9b, 0xdf, 0xec, + 0x55, 0x25, 0xd0, 0x3d, 0x93, 0x1e, 0x05, 0x58, 0x96, 0x86, 0x80, 0x3b, 0x41, 0xaa, 0x82, 0x61, 0x28, 0x7b, 0x1e, 0xc1, 0xac, 0xed, 0xe1, 0xc7, 0xbd, 0x3c, 0x30, 0x92, 0xe9, 0x3c, 0xc8, 0x76, + 0x4b, 0x75, 0xdc, 0xd0, 0x08, 0x97, 0x14, 0x58, 0x60, 0xe4, 0x9b, 0xd0, 0x1d, 0x3c, 0x6f, 0x45, 0x39, 0x9d, 0xfe, 0x72, 0xaf, 0xb8, 0x1e, 0xeb, 0x9e, 0xf3, 0xb9, 0xf4, 0x13, 0xf3, 0x85, 0x3b, + 0xf4, 0xce, 0xb6, 0x98, 0x24, 0x2c, 0xef, 0xe6, 0xb8, 0x3f, 0xcb, 0x98, 0x5b, 0xe2, 0x67, 0xde, 0xdc, 0xde, 0xea, 0xc3, 0x1e, 0x68, 0x38, 0x03, 0x4b, 0x49, 0x63, 0x78, 0x99, 0x17, 0x07, 0xa4, + 0x95, 0x63, 0xd9, 0x68, 0x9b, 0x6a, 0xb1, 0x5b, 0x18, 0x07, 0xe8, 0xeb, 0x94, 0xfe, 0xbe, 0x08, 0xf5, 0x36, 0xb7, 0x9e, 0x7f, 0x76, 0x60, 0xb5, 0x77, 0xe0, 0x41, 0x9e, 0xb2, 0xf2, 0xbc, 0x12, + 0x7d, 0x85, 0x25, 0xb0, 0xda, 0x73, 0x12, 0x6d, 0x8f, 0xd9, 0x9a, 0xf8, 0x91, 0xc5, 0x83, 0x47, 0x73, 0xd0, 0x82, 0x7e, 0xde, 0xd1, 0x45, 0xa2, 0xa0, 0x64, 0x06, 0x8a, 0xd6, 0x11, 0x33, 0xeb, + 0x15, 0x1d, 0xb0, 0xe1, 0x44, 0x28, 0xf1, 0x35, 0x66, 0xa3, 0x50, 0x68, 0x07, 0x79, 0x7d, 0x28, 0x97, 0x85, 0x92, 0xb9, 0x4e, 0xb2, 0x4d, 0xb9, 0xb8, 0x65, 0x0d, 0x26, 0x82, 0xd1, 0x9d, 0x7b, + 0x6c, 0x06, 0xd8, 0xf6, 0x18, 0xc1, 0x6c, 0x2c, 0xd5, 0x9c, 0x4b, 0xe3, 0x8f, 0x76, 0xc0, 0x3f, 0xb2, 0xc3, 0x14, 0xee, 0xf0, 0xb5, 0xb2, 0xe1, 0xbd, 0x89, 0xf6, 0xf3, 0xe0, 0x9a, 0x77, 0xb2, + 0xaf, 0x58, 0x9e, 0x07, 0xe7, 0xc9, 0xd5, 0x23, 0xcc, 0x66, 0x2e, 0x45, 0xc2, 0x16, 0xa6, 0x75, 0x26, 0x63, 0x79, 0xca, 0x1e, 0x49, 0x1b, 0x62, 0x32, 0xa5, 0xb9, 0x3a, 0x5c, 0x90, 0x63, 0x9a, + 0x0f, 0x90, 0x75, 0x4c, 0x08, 0x5e, 0xb0, 0x44, 0xe3, 0x99, 0x32, 0x2e, 0x11, 0xa1, 0xb0, 0xe0, 0xc1, 0x42, 0xe1, 0xe5, 0x2a, 0x48, 0xc7, 0xf4, 0x3a, 0x42, 0x80, 0x2d, 0xc7, 0xd3, 0x8b, 0xd9, + 0x14, 0x68, 0xd4, 0x85, 0xdf, 0xb5, 0x8d, 0x83, 0x2c, 0xa9, 0xbd, 0xd0, 0xfd, 0x38, 0x0e, 0xe0, 0xfc, 0xbb, 0xaf, 0xb1, 0x4f, 0x5f, 0xdb, 0xc1, 0x9e, 0x71, 0xc7, 0xbd, 0x51, 0x7d, 0x45, 0xe6, + 0x7c, 0x78, 0xea, 0x59, 0x2a, 0xd4, 0x99, 0x2e, 0x75, 0x52, 0x53, 0x57, 0x53, 0x6b, 0x0a, 0x14, 0xea, 0x3e, 0x1f, 0x89, 0xf8, 0xe0, 0x08, 0x2e, 0x46, 0xab, 0x3a, 0x30, 0x43, 0xbc, 0x59, 0xc9, + 0xe4, 0xd6, 0x8f, 0xe7, 0x22, 0x72, 0x5c, 0xc8, 0x0b, 0x10, 0xd7, 0xcd, 0x95, 0x13, 0xe8, 0x54, 0xc8, 0xed, 0x48, 0xd6, 0xb4, 0x85, 0x9c, 0xcd, 0x67, 0x1d, 0x4c, 0xed, 0xa1, 0x8c, 0x97, 0xb7, + 0xc8, 0xa1, 0xe4, 0xe9, 0x90, 0xec, 0xc4, 0x71, 0xf5, 0x68, 0xb3, 0xfd, 0x13, 0xd3, 0xac, 0x47, 0xfe, 0xd6, 0xcf, 0x6d, 0x42, 0xf7, 0xf3, 0xb7, 0x7a, 0xd8, 0x82, 0x8e, 0xe0, 0x0a, 0x18, 0x59, + 0x2a, 0xd3, 0x45, 0x19, 0x38, 0x2e, 0xc3, 0x43, 0x2b, 0xd6, 0xbc, 0xad, 0xfa, 0x45, 0xad, 0x02, 0x1b, 0x4a, 0x0d, 0x75, 0x1e, 0x59, 0x22, 0x13, 0x3a, 0x93, 0xb3, 0x00, 0x03, 0xb7, 0xf0, 0x58, + 0x52, 0x58, 0x82, 0x6a, 0x2d, 0x90, 0xae, 0xac, 0x60, 0xa6, 0x20, 0xac, 0x08, 0xf1, 0x05, 0x3c, 0x65, 0x4a, 0x30, 0xb3, 0x06, 0x32, 0xac, 0x32, 0x6c, 0xba, 0x0a, 0xca, 0xfd, 0xa3, 0xfd, 0xe5, + 0x11, 0x94, 0xff, 0x64, 0xfe, 0x56, 0xea, 0xc5, 0xf7, 0x14, 0x21, 0xfc, 0x17, 0x84, 0x3c, 0xe1, 0x45, 0x39, 0x51, 0x3c, 0xb3, 0x26, 0x4e, 0x86, 0x17, 0x12, 0x8f, 0xd9, 0x52, 0x2c, 0x5a, 0xfc, + 0x28, 0x3b, 0x81, 0x3b, 0x5a, 0xd5, 0xbc, 0x73, 0x3c, 0x40, 0x40, 0xa2, 0x78, 0x88, 0xe5, 0xda, 0x21, 0xac, 0x8c, 0x18, 0xb0, 0x64, 0x5a, 0x9a, 0x5e, 0xe5, 0x94, 0x45, 0xa0, 0x4b, 0x2f, 0xa6, + 0x25, 0xd6, 0x37, 0x57, 0xd9, 0x6a, 0x3d, 0xdd, 0xa7, 0x86, 0x2a, 0xa6, 0xa2, 0x67, 0x38, 0x88, 0x2c, 0x23, 0x98, 0x09, 0xcc, 0xb9, 0xb5, 0x1a, 0x25, 0xe8, 0xda, 0xd9, 0xc1, 0x87, 0xa0, 0x67, + 0x73, 0x89, 0xb3, 0x99, 0x24, 0xb3, 0xcc, 0x57, 0x17, 0x08, 0xf2, 0x59, 0xe9, 0x3f, 0x7f, 0x21, 0xd7, 0xec, 0x0f, 0x35, 0x2d, 0xff, 0x7a, 0x35, 0xa5, 0x90, 0x9f, 0xbf, 0xf8, 0xb0, 0x12, 0x99, + 0x1d, 0x6a, 0x45, 0x5e, 0x5c, 0xce, 0x10, 0xe7, 0x5d, 0xf7, 0x26, 0x46, 0xf6, 0x8c, 0x5a, 0x5e, 0x98, 0xc3, 0xdc, 0xca, 0xbc, 0xb3, 0x47, 0x39, 0x7b, 0xd5, 0x3d, 0x3e, 0x05, 0x9c, 0x1e, 0x4b, + 0xcf, 0x08, 0x86, 0x76, 0x92, 0x45, 0x5a, 0x31, 0x2c, 0x63, 0x2b, 0x37, 0xb4, 0xf4, 0xc2, 0x9b, 0xf3, 0xc1, 0xe6, 0xc6, 0x12, 0x94, 0x27, 0xb1, 0x67, 0x0c, 0xf5, 0x24, 0x89, 0xde, 0x1e, 0xfb, + 0x45, 0xc1, 0xac, 0xdf, 0xd4, 0xeb, 0xeb, 0xdc, 0xe8, 0xdf, 0x76, 0xfa, 0xce, 0xaf, 0xff, 0x7a, 0xaf, 0x7e, 0xa6, 0x8e, 0xcd, 0x57, 0x0f, 0x78, 0x9d, 0x6b, 0x9f, 0x6e, 0x9f, 0x83, 0x3b, 0x7b, + 0x08, 0x57, 0xfa, 0x78, 0x40, 0xd3, 0x7a, 0x2a, 0x66, 0x05, 0xb2, 0x2a, 0x85, 0xf1, 0x78, 0x47, 0xad, 0x76, 0xe0, 0x36, 0xc0, 0x82, 0x0d, 0xa0, 0x18, 0x93, 0x15, 0x66, 0xf3, 0x22, 0xdd, 0x39, + 0x13, 0x01, 0xee, 0x16, 0x18, 0x63, 0x1f, 0xc0, 0x4a, 0xf7, 0x98, 0x11, 0xa3, 0x2f, 0x9c, 0x30, 0x6e, 0xad, 0x75, 0xce, 0x8f, 0xf0, 0x65, 0x17, 0x6b, 0x16, 0xbe, 0xda, 0x4f, 0x51, 0x22, 0x55, + 0x29, 0x4c, 0xab, 0xb6, 0xd9, 0xf7, 0x21, 0xe6, 0x37, 0x86, 0xb5, 0x3f, 0x67, 0xa2, 0x7a, 0x27, 0x7b, 0x82, 0xe4, 0x6d, 0xd0, 0xd7, 0x20, 0x55, 0x05, 0xc6, 0x54, 0xcc, 0x36, 0x6a, 0x02, 0xad, + 0x55, 0x4e, 0x8f, 0xb1, 0x0d, 0x37, 0x17, 0x53, 0x07, 0xd8, 0x47, 0xec, 0x1a, 0xc7, 0x8e, 0xc9, 0x7e, 0xef, 0x1a, 0xf3, 0xa5, 0x0d, 0xe8, 0x98, 0x95, 0x86, 0x41, 0xa0, 0x65, 0x07, 0x30, 0x1a, + 0x75, 0x64, 0x9a, 0x4e, 0xb4, 0x02, 0x8d, 0x42, 0xe1, 0xb8, 0xcb, 0xf7, 0x69, 0xcb, 0x97, 0x8a, 0x23, 0x20, 0xf2, 0xa6, 0xcd, 0x14, 0x46, 0xea, 0x0e, 0x0f, 0x3b, 0x85, 0xfe, 0x29, 0xf3, 0x5f, + 0x9a, 0x9d, 0xd7, 0xf7, 0xf0, 0x04, 0xcf, 0xdd, 0xdd, 0xe6, 0xa9, 0x8d, 0xfb, 0x03, 0xe1, 0x0b, 0xac, 0x6f, 0xc3, 0x7e, 0x89, 0x29, 0xb8, 0xb4, 0x06, 0x2b, 0xfc, 0x70, 0xf4, 0xa9, 0x18, 0x64, + 0x78, 0x60, 0x37, 0x36, 0x4d, 0x2a, 0x21, 0x1d, 0x15, 0x5e, 0x7c, 0x9d, 0xab, 0xd1, 0x17, 0x9a, 0x3e, 0x6e, 0x84, 0x34, 0xb3, 0x8a, 0xc2, 0xbb, 0x6b, 0x31, 0x80, 0x9f, 0xb2, 0x18, 0xbc, 0x12, + 0xbd, 0xa0, 0x71, 0xbe, 0x1c, 0xc2, 0xfd, 0xac, 0x06, 0xc1, 0xa1, 0x10, 0xd0, 0x1c, 0xe4, 0x3a, 0x60, 0xba, 0x07, 0xd8, 0xc5, 0x68, 0x6d, 0xee, 0xdd, 0xb1, 0x4d, 0x00, 0x7c, 0x24, 0xee, 0xd7, + 0x87, 0x60, 0x96, 0x01, 0x19, 0xb0, 0x0f, 0x36, 0x48, 0xd5, 0xb2, 0x03, 0xb0, 0x22, 0xb5, 0x68, 0x3b, 0x6d, 0x3c, 0x6d, 0x2d, 0x71, 0x5d, 0x4e, 0xf2, 0x54, 0xd8, 0x16, 0x36, 0xb7, 0x3f, 0x00, + 0x44, 0xb9, 0xde, 0xad, 0xd8, 0x3d, 0x4e, 0x10, 0x2d, 0xb7, 0x0c, 0x1f, 0xf6, 0xe2, 0xff, 0x5d, 0xac, 0xbd, 0xa3, 0x72, 0xfa, 0x70, 0xf8, 0x3a, 0xfe, 0x79, 0x8c, 0xd7, 0xff, 0xf8, 0xef, 0x10, + 0x78, 0xda, 0xe1, 0x7a, 0xce, 0xd0, 0x0b, 0x56, 0xe1, 0x09, 0x99, 0x6c, 0xe8, 0x5a, 0x61, 0x7a, 0x5f, 0x3c, 0x3e, 0x57, 0xf3, 0xef, 0xce, 0x33, 0x3e, 0x72, 0xea, 0xf6, 0x93, 0xbe, 0x95, 0xff, + 0xe6, 0xfa, 0x12, 0x36, 0xc4, 0x51, 0x9c, 0x69, 0x92, 0xb4, 0x9b, 0x8d, 0x78, 0xf8, 0x50, 0xef, 0xea, 0xa3, 0xdd, 0x85, 0xe3, 0x59, 0xb8, 0xe2, 0x15, 0x25, 0x1c, 0x48, 0x2e, 0x0d, 0xc8, 0x03, + 0x86, 0xd4, 0x46, 0x25, 0x1f, 0x02, 0xc9, 0xee, 0x48, 0x41, 0x35, 0x4c, 0x73, 0x18, 0xba, 0x70, 0x41, 0x21, 0x6c, 0x37, 0x92, 0x49, 0x6e, 0xec, 0xbd, 0xb2, 0x40, 0x8c, 0x44, 0x96, 0xd0, 0xed, + 0x46, 0x10, 0xef, 0x85, 0xe8, 0xf6, 0xdd, 0xb2, 0x4d, 0xcf, 0xb6, 0xff, 0x7a, 0xf5, 0x95, 0x7e, 0xb1, 0x9d, 0x3d, 0x3a, 0x96, 0xf7, 0x2c, 0x7a, 0x7c, 0x46, 0xae, 0x1d, 0xea, 0x6d, 0x61, 0xdd, + 0x63, 0x16, 0xf6, 0x54, 0xa2, 0xfb, 0x47, 0xc2, 0xaf, 0x1c, 0xba, 0x0e, 0x87, 0x58, 0xbf, 0xc4, 0xf7, 0xd9, 0xac, 0x06, 0x91, 0xd1, 0x36, 0xca, 0xa8, 0xe3, 0x6c, 0x49, 0x46, 0x1a, 0x40, 0x08, + 0x1c, 0x92, 0x4f, 0x3b, 0x40, 0x6e, 0x0b, 0xb3, 0x58, 0x64, 0x20, 0x8a, 0x02, 0xeb, 0xdd, 0xa2, 0x60, 0xc0, 0x7a, 0x39, 0x0a, 0xf5, 0x91, 0xcf, 0x1d, 0x47, 0xc5, 0xa2, 0x65, 0x9b, 0x5d, 0x5d, + 0xac, 0x17, 0x4c, 0xad, 0x65, 0x30, 0x75, 0x2c, 0xbc, 0x31, 0xea, 0x4d, 0xf6, 0x52, 0x9d, 0x8c, 0x16, 0x5c, 0xd0, 0xfd, 0xc8, 0xb3, 0xf9, 0x07, 0x15, 0xd7, 0x1f, 0x56, 0x5d, 0x4a, 0xb3, 0xc4, + 0xb0, 0xf2, 0xfc, 0x1c, 0xa9, 0x72, 0x52, 0x84, 0xb4, 0xcc, 0xb9, 0xc7, 0x1e, 0xf8, 0x39, 0xab, 0xc9, 0x17, 0x0f, 0x38, 0xb3, 0xe9, 0xf7, 0xdb, 0xe7, 0x8d, 0xa0, 0xc7, 0x0e, 0x8b, 0x24, 0xe5, + 0x4e, 0x48, 0xd7, 0x6e, 0xe1, 0x64, 0xba, 0xa0, 0x41, 0xc4, 0x82, 0x18, 0x94, 0x8d, 0xb0, 0x4d, 0xd9, 0xad, 0xb2, 0xd7, 0xe6, 0x22, 0x01, 0x8c, 0xdd, 0x64, 0x83, 0x0c, 0xc6, 0x03, 0x00, 0xb2, + 0x46, 0x79, 0x90, 0x75, 0x56, 0x38, 0xf7, 0x00, 0xf3, 0xd0, 0xd1, 0x4a, 0x5b, 0xe9, 0x4d, 0xa9, 0xd3, 0x33, 0x7c, 0x1f, 0xc3, 0x6d, 0x9a, 0x1b, 0xdb, 0xa5, 0xb7, 0x5c, 0xcc, 0x66, 0x31, 0xa4, + 0xfd, 0xb8, 0x7c, 0x64, 0x9a, 0x25, 0xe7, 0xc4, 0x90, 0x6f, 0xd0, 0x7a, 0x42, 0xe9, 0xbf, 0x12, 0xbd, 0x20, 0x74, 0xbe, 0x3c, 0xa3, 0xd2, 0x43, 0xf7, 0x27, 0x44, 0x8f, 0x29, 0xb8, 0x30, 0xc4, + 0x38, 0x33, 0x5e, 0xb2, 0xab, 0x1a, 0x02, 0x41, 0x76, 0x40, 0x36, 0x8b, 0xc3, 0x06, 0x73, 0xf6, 0xf0, 0xba, 0xde, 0x2b, 0xc1, 0x16, 0xf7, 0x16, 0x95, 0x06, 0xea, 0x07, 0xaf, 0x50, 0x97, 0x1a, + 0x70, 0x58, 0x65, 0x92, 0x6e, 0x46, 0x0e, 0x92, 0xc1, 0x87, 0x58, 0xf3, 0xcc, 0x6e, 0xb4, 0x2e, 0x23, 0x13, 0x94, 0x45, 0x6d, 0x95, 0xa9, 0xe1, 0x6c, 0x24, 0x8f, 0xf2, 0x9f, 0x04, 0xc9, 0xdc, + 0x16, 0x7e, 0xfe, 0x16, 0xb8, 0x68, 0x68, 0x84, 0x9e, 0x15, 0xdf, 0x8d, 0xf4, 0x7b, 0xae, 0x21, 0xff, 0x07, 0xc2, 0x17, 0xfc, 0x5e, 0x47, 0x43, 0xa8, 0x67, 0x67, 0x7e, 0xa6, 0xd9, 0x8e, 0x33, + 0x1d, 0xb7, 0x03, 0x21, 0x2e, 0xd6, 0x4c, 0xb2, 0x99, 0x57, 0x15, 0x7a, 0x34, 0x01, 0x2a, 0x48, 0x32, 0x3f, 0xf4, 0xbc, 0x52, 0x80, 0x4b, 0x69, 0x3f, 0x81, 0x97, 0x13, 0x88, 0x58, 0xed, 0xb6, + 0x4b, 0xa5, 0x28, 0xf6, 0xe6, 0x34, 0x39, 0x1c, 0x80, 0xaa, 0x11, 0xdc, 0xb5, 0x19, 0x24, 0xf4, 0x84, 0x5e, 0x8d, 0x28, 0x8a, 0x01, 0x53, 0x1f, 0x0e, 0xc9, 0x39, 0x19, 0x58, 0x15, 0xde, 0xb3, + 0x92, 0x40, 0x61, 0x7a, 0x8e, 0x75, 0x2d, 0xa0, 0x07, 0x3e, 0x15, 0xb6, 0xd2, 0xab, 0x80, 0x5e, 0x9a, 0x25, 0x4d, 0x3b, 0xd4, 0x4c, 0xf3, 0xbe, 0x36, 0xf3, 0x4c, 0x4f, 0xc4, 0x77, 0xb2, 0x17, + 0xe8, 0xaf, 0x83, 0xf3, 0xe4, 0xed, 0x51, 0xc2, 0x21, 0x0c, 0xd7, 0xf9, 0x8a, 0x93, 0x76, 0xd3, 0x9d, 0xb8, 0x45, 0x51, 0xdf, 0xcc, 0x76, 0x80, 0x80, 0x10, 0xc7, 0x30, 0xf6, 0x6c, 0xaf, 0x98, + 0x8a, 0x03, 0xb5, 0xce, 0xa2, 0x48, 0x35, 0x12, 0x69, 0xd9, 0x72, 0xcb, 0xaa, 0x50, 0x9b, 0xb4, 0x95, 0xc1, 0x18, 0x06, 0xf4, 0x29, 0xc0, 0xa3, 0x05, 0x35, 0x1e, 0xab, 0x80, 0xb3, 0xa0, 0x4d, + 0x75, 0x47, 0x2c, 0x57, 0x99, 0x96, 0x2c, 0xa1, 0xc1, 0x41, 0x19, 0xf7, 0x3d, 0xb8, 0x26, 0x59, 0xad, 0x65, 0xe6, 0xe5, 0x15, 0x7f, 0x3b, 0x67, 0x7a, 0xe9, 0xe9, 0x3d, 0x7e, 0x5d, 0x6a, 0x24, + 0x43, 0xe7, 0x58, 0x89, 0x9f, 0xf2, 0xe5, 0xe5, 0x1c, 0xed, 0xdf, 0x83, 0x35, 0x37, 0x79, 0x97, 0x5f, 0xab, 0x33, 0xcf, 0xb4, 0xc3, 0xfb, 0x40, 0xf7, 0xc4, 0x9c, 0xf7, 0x51, 0xdf, 0x46, 0x78, + 0x04, 0x31, 0x55, 0xeb, 0x66, 0x1d, 0x35, 0xcb, 0xb8, 0x44, 0xb4, 0x0d, 0x86, 0xc2, 0xbb, 0xc1, 0x81, 0x9c, 0xb5, 0x29, 0xdf, 0xe9, 0xf6, 0x62, 0x30, 0xc1, 0x0e, 0xeb, 0x69, 0x80, 0x94, 0x7b, + 0x7f, 0xdf, 0xc4, 0x38, 0x84, 0x41, 0x1a, 0xbb, 0x9a, 0x17, 0xee, 0x5e, 0xd9, 0x1c, 0xb6, 0xc7, 0x2d, 0x44, 0x63, 0xc9, 0xa2, 0x72, 0x06, 0xa1, 0xaf, 0x69, 0xb0, 0xb0, 0xf0, 0x06, 0xb2, 0x5d, + 0x4d, 0x84, 0xf5, 0xbd, 0x46, 0xc7, 0xdf, 0xc0, 0x53, 0x46, 0xf7, 0xce, 0x24, 0xcf, 0xc5, 0xf6, 0x9f, 0x08, 0x9e, 0x00, 0x29, 0xa3, 0xb4, 0x6f, 0x1c, 0x3f, 0x57, 0xab, 0xed, 0x20, 0x45, 0xa4, + 0x59, 0x0e, 0x89, 0x6d, 0x61, 0x02, 0xbe, 0x62, 0x14, 0x68, 0x9d, 0x56, 0xe8, 0x88, 0xf1, 0x94, 0xc9, 0xd1, 0x1c, 0x6d, 0x42, 0x03, 0x53, 0x65, 0x33, 0x00, 0xe5, 0x01, 0xa9, 0x74, 0x15, 0xee, + 0x6f, 0x30, 0x2a, 0x0c, 0x90, 0xed, 0x26, 0x12, 0x39, 0xc8, 0x2e, 0xf0, 0xd1, 0xb6, 0x11, 0x41, 0x76, 0xa5, 0xce, 0x17, 0x83, 0xbd, 0x38, 0xdb, 0xc1, 0xd4, 0xcc, 0xad, 0x9f, 0x57, 0xe0, 0x4e, + 0x47, 0xa8, 0xc4, 0x1e, 0x9e, 0x38, 0xaa, 0x45, 0x6f, 0x4a, 0xdc, 0xcd, 0xfc, 0xbd, 0x86, 0x40, 0x9d, 0x3e, 0x41, 0x7a, 0x25, 0xfe, 0xa5, 0x65, 0xdc, 0x1a, 0x97, 0xb9, 0xfb, 0xb5, 0x78, 0x78, + 0xca, 0x39, 0x70, 0x25, 0x7a, 0x86, 0xfb, 0x72, 0x79, 0x4e, 0x6b, 0xeb, 0x21, 0x93, 0x0f, 0x9b, 0x7c, 0xe3, 0x9b, 0xf6, 0xc0, 0xc7, 0xa2, 0x70, 0xd0, 0x02, 0xf8, 0x7c, 0xc9, 0x88, 0xaa, 0x9e, + 0xcd, 0x00, 0x32, 0x85, 0x15, 0x47, 0x03, 0x17, 0x62, 0x61, 0x1e, 0xb7, 0xac, 0x02, 0x1f, 0x2c, 0x2c, 0x71, 0x17, 0xe2, 0x74, 0x94, 0x6b, 0xd3, 0xc5, 0x82, 0x13, 0xab, 0x74, 0x34, 0xe0, 0x25, + 0x2a, 0xcd, 0xe4, 0xca, 0xaa, 0xcc, 0x83, 0xda, 0xea, 0xb1, 0x0f, 0x1b, 0x15, 0x29, 0xd0, 0x26, 0xf8, 0x93, 0x7d, 0xad, 0x97, 0xe3, 0xa9, 0x4c, 0xb5, 0x3f, 0xab, 0x36, 0x95, 0xa9, 0x76, 0x06, + 0x2b, 0xd5, 0xfa, 0xaa, 0x45, 0x2e, 0xbd, 0x60, 0xc0, 0x9c, 0x14, 0x0f, 0x9c, 0x02, 0x18, 0xe6, 0xc1, 0xc5, 0xf1, 0x82, 0xa7, 0xd7, 0xf3, 0xd8, 0x9c, 0x66, 0xec, 0x92, 0x3f, 0xf2, 0x13, 0xac, + 0x89, 0xb2, 0x36, 0x57, 0x5b, 0xc4, 0xc3, 0x26, 0x48, 0x42, 0x27, 0x5c, 0xac, 0x11, 0xca, 0x58, 0xd0, 0xcc, 0x01, 0x51, 0x42, 0x30, 0x36, 0xe8, 0x18, 0x88, 0xe1, 0x0f, 0xbb, 0x68, 0x4e, 0x07, + 0x99, 0xab, 0x23, 0x06, 0x2c, 0x67, 0x9f, 0xab, 0xbf, 0xfe, 0x64, 0x6e, 0x9e, 0x2d, 0x69, 0x43, 0x27, 0xd1, 0x2e, 0x7b, 0x1a, 0xfc, 0x94, 0xd7, 0xaf, 0x8f, 0x7d, 0xfc, 0x78, 0x4f, 0x07, 0xc3, + 0x7f, 0x41, 0xcf, 0xb4, 0x3c, 0x3c, 0x9e, 0xd4, 0xaf, 0x63, 0x3e, 0xbc, 0xfc, 0xfb, 0x63, 0xe0, 0x23, 0x89, 0x35, 0xfd, 0xee, 0xd8, 0xc5, 0x7b, 0xc7, 0x36, 0xd1, 0x74, 0xe5, 0x79, 0x44, 0xce, + 0x14, 0x9a, 0x32, 0x23, 0xb3, 0x86, 0x24, 0x71, 0xc8, 0xa5, 0x04, 0x12, 0x94, 0x32, 0x4d, 0xc1, 0xe6, 0x5b, 0xf0, 0xb0, 0xf6, 0xf4, 0xbd, 0xba, 0x5f, 0x48, 0x9e, 0x09, 0x6a, 0x55, 0xc7, 0xcc, + 0x83, 0x29, 0xab, 0x72, 0x6c, 0x54, 0x36, 0xb0, 0x84, 0x45, 0x07, 0x01, 0x64, 0x6c, 0xa3, 0x80, 0xd7, 0x93, 0x9e, 0x5a, 0xc3, 0xb9, 0xab, 0xba, 0xe1, 0x6a, 0x71, 0x6c, 0x85, 0x7f, 0xbd, 0x1a, + 0x25, 0xbf, 0x08, 0x5e, 0x7d, 0xa8, 0xbb, 0xfd, 0xc1, 0x23, 0x48, 0xef, 0x80, 0xd7, 0x63, 0x69, 0x95, 0xd6, 0xf0, 0x5c, 0xb6, 0xae, 0xd0, 0xf2, 0xe0, 0xee, 0xa6, 0xf7, 0x4c, 0x79, 0xba, 0x4f, + 0xb4, 0x4f, 0x1c, 0xbd, 0xbd, 0x73, 0xb6, 0xe7, 0xf5, 0xd0, 0xab, 0xf9, 0x52, 0xe3, 0x25, 0x0d, 0xb7, 0xc3, 0xe5, 0x16, 0x5b, 0x68, 0x92, 0xb2, 0xee, 0x16, 0x49, 0x00, 0xa2, 0x8b, 0x6e, 0xcb, + 0x41, 0x93, 0x31, 0xae, 0xcd, 0xdd, 0x0a, 0xcb, 0x6c, 0x6e, 0x8f, 0x88, 0xce, 0x71, 0x3c, 0x58, 0xc1, 0x13, 0x37, 0x55, 0xd7, 0xf1, 0x78, 0x42, 0xba, 0xa4, 0x87, 0xaa, 0xb3, 0x80, 0x92, 0xc8, + 0x03, 0xb6, 0x39, 0x06, 0x53, 0x8a, 0x19, 0x13, 0x19, 0xea, 0x5a, 0x3e, 0xb2, 0x1c, 0xdd, 0x2c, 0xab, 0x77, 0x9c, 0xff, 0xd7, 0x1b, 0xce, 0xef, 0x88, 0x7f, 0xd7, 0x6d, 0xa1, 0x1f, 0x3f, 0x6c, + 0x2b, 0x4b, 0xf2, 0xb7, 0xc3, 0xe0, 0x07, 0x0e, 0xdf, 0x79, 0x4c, 0xaa, 0x15, 0x99, 0x95, 0xc4, 0xdf, 0x3e, 0xa7, 0xae, 0xeb, 0x5f, 0xd7, 0xef, 0x9d, 0x1f, 0xf6, 0xd3, 0x67, 0x18, 0x49, 0x9c, + 0x97, 0x61, 0x71, 0x7a, 0xed, 0xef, 0x1e, 0x73, 0x21, 0x7b, 0x89, 0xb0, 0xb9, 0xe4, 0x9e, 0x7e, 0x78, 0xc4, 0xf5, 0xea, 0xff, 0x7c, 0x37, 0xc1, 0xee, 0x18, 0xf7, 0xbf, 0x9a, 0x67, 0xcf, 0x15, + 0xb2, 0xfc, 0xfa, 0x11, 0xe7, 0xe9, 0xf6, 0xd5, 0x07, 0x7d, 0x0b, 0x5c, 0x16, 0xca, 0x04, 0x5a, 0x43, 0xae, 0xd3, 0x6e, 0x4a, 0xc6, 0x09, 0x13, 0x19, 0x50, 0x0e, 0x39, 0x5c, 0x43, 0x58, 0x19, + 0x8b, 0xb2, 0x4b, 0x1e, 0xed, 0x12, 0x38, 0x4e, 0xb6, 0xb6, 0xbb, 0x55, 0xb4, 0x48, 0xab, 0x09, 0xbb, 0x75, 0xcb, 0x68, 0xa9, 0xc1, 0xed, 0x3c, 0x35, 0xa5, 0x84, 0x24, 0x2a, 0x05, 0x81, 0x33, + 0xd6, 0x08, 0xfd, 0x01, 0x6a, 0xef, 0x95, 0xf5, 0x61, 0xb7, 0xca, 0x47, 0x34, 0x53, 0x7d, 0x6f, 0x4e, 0xcf, 0x8c, 0x6f, 0x16, 0xe0, 0xcf, 0xb5, 0xce, 0xcc, 0x00, 0x86, 0x40, 0x66, 0x9c, 0x97, + 0x59, 0x0f, 0x1d, 0xb3, 0x45, 0xf4, 0xb9, 0x73, 0x5c, 0xfa, 0xc8, 0x9a, 0x32, 0x1b, 0x4e, 0xe7, 0x82, 0x24, 0x0a, 0x13, 0x37, 0xa8, 0xf2, 0x31, 0xe9, 0x98, 0x63, 0x6f, 0xb7, 0x0e, 0x25, 0x6a, + 0x11, 0x53, 0xae, 0x1d, 0x0f, 0x28, 0xb1, 0x71, 0x50, 0xdd, 0xc0, 0x61, 0x93, 0xdc, 0x1a, 0xd4, 0x1e, 0xc2, 0x6a, 0xad, 0x9a, 0xda, 0x8e, 0xd5, 0x4c, 0x1c, 0xc3, 0x30, 0x02, 0xd7, 0x50, 0xab, + 0xb6, 0x6e, 0xd7, 0x8a, 0x28, 0x3c, 0xaf, 0x59, 0x5d, 0x5a, 0xb1, 0xbc, 0x17, 0xdd, 0x07, 0x3f, 0x47, 0xc3, 0x79, 0xb1, 0x77, 0xfa, 0xe0, 0xff, 0x42, 0x37, 0xc6, 0xdf, 0xd7, 0xe2, 0x2a, 0xaf, + 0x95, 0xd0, 0xa1, 0xdf, 0x1a, 0xe8, 0x14, 0x99, 0x97, 0x5e, 0xc2, 0x03, 0x2f, 0x15, 0x22, 0x8a, 0xf3, 0xc1, 0xe2, 0xff, 0xc2, 0x5f, 0xb7, 0xee, 0xfe, 0xcd, 0xe8, 0x7a, 0x66, 0xd2, 0xe7, 0xda, + 0x88, 0xdf, 0xf0, 0xd4, 0xd2, 0x4c, 0xd3, 0xcb, 0xee, 0xeb, 0xcd, 0xcf, 0xc4, 0x3c, 0xbe, 0x12, 0x3d, 0xf1, 0xf7, 0x7a, 0x39, 0x44, 0xfa, 0xc5, 0x3a, 0x1a, 0x2b, 0xb7, 0x24, 0x0c, 0x80, 0xcc, + 0x4c, 0x37, 0x60, 0x0e, 0xfb, 0x5c, 0x19, 0x24, 0x39, 0xe5, 0xda, 0x52, 0x0b, 0x2e, 0xbc, 0xa0, 0x4e, 0x99, 0x25, 0x80, 0x0d, 0xbc, 0x28, 0x19, 0x70, 0xa9, 0xa5, 0xe5, 0xdb, 0x19, 0x99, 0x94, + 0x74, 0xc6, 0x64, 0xa1, 0x12, 0xd4, 0x5b, 0x70, 0x30, 0x88, 0x7d, 0xaf, 0x2d, 0xa7, 0x95, 0x41, 0x08, 0x33, 0x05, 0xdb, 0x22, 0x65, 0x50, 0xa9, 0xe4, 0x31, 0x9a, 0x3d, 0x8a, 0xf4, 0xf8, 0xa6, + 0xb5, 0xd5, 0x6f, 0xb5, 0x59, 0x7f, 0x7e, 0xba, 0x23, 0xfb, 0x46, 0xdd, 0x64, 0x96, 0x63, 0x35, 0xe9, 0xaf, 0x34, 0x4b, 0x8a, 0xe4, 0x24, 0x06, 0x7f, 0xd9, 0xa1, 0x76, 0xd7, 0xd8, 0x06, 0x3d, + 0xe5, 0x53, 0xf8, 0xfa, 0x11, 0x67, 0x3e, 0x7d, 0xf5, 0xc1, 0xb9, 0x7c, 0x54, 0x0f, 0xae, 0xc1, 0x83, 0x35, 0x38, 0xc1, 0x9c, 0x11, 0x06, 0x09, 0xa1, 0x12, 0x2e, 0x3a, 0xbc, 0x2d, 0x31, 0x60, + 0x85, 0x20, 0xac, 0x91, 0xd3, 0x12, 0x17, 0x72, 0x76, 0xde, 0xb2, 0x1a, 0xb7, 0xd0, 0xe6, 0xe8, 0x6c, 0x0c, 0x67, 0x68, 0x2b, 0x92, 0xab, 0x4a, 0x5e, 0x2d, 0x76, 0x3b, 0x11, 0xb0, 0x65, 0x2a, + 0x90, 0x52, 0x5d, 0xd7, 0xd5, 0x50, 0xc2, 0x9c, 0x36, 0xd6, 0xe9, 0x3d, 0xe7, 0xa5, 0x9e, 0x77, 0xf0, 0x9e, 0xe7, 0x5a, 0xcf, 0x64, 0xa1, 0x2f, 0x72, 0xf2, 0x88, 0x7f, 0x77, 0x39, 0x79, 0x17, + 0xc6, 0xdd, 0x5f, 0xbf, 0xcf, 0xc4, 0x81, 0x5f, 0x69, 0xbe, 0x4d, 0x8b, 0xb4, 0x6f, 0xb3, 0x03, 0x55, 0x60, 0x3b, 0x93, 0x6c, 0xe5, 0xff, 0x3f, 0x7b, 0x6f, 0xd6, 0xa4, 0xb8, 0xb3, 0xe4, 0x0b, + 0xbe, 0xf7, 0xa7, 0x48, 0xab, 0xc7, 0xe1, 0x52, 0xda, 0x17, 0xda, 0xac, 0x7b, 0x5a, 0x42, 0x20, 0x40, 0x0b, 0x88, 0x5d, 0x7a, 0x38, 0x63, 0xda, 0x17, 0xb4, 0xaf, 0x48, 0x76, 0xed, 0x7c, 0xf6, + 0x31, 0x20, 0xc9, 0x02, 0x12, 0x12, 0x25, 0x55, 0xff, 0x3e, 0x3d, 0x77, 0xfe, 0x2f, 0x99, 0x0a, 0x49, 0xb8, 0x24, 0xf7, 0x08, 0x0f, 0x0f, 0x0f, 0xf7, 0x9f, 0x67, 0x92, 0x44, 0x11, 0x1e, 0xc9, + 0xf6, 0x17, 0xfe, 0x8c, 0xdd, 0x56, 0x36, 0x36, 0xb3, 0x02, 0x0a, 0x0a, 0xd2, 0x04, 0x9c, 0xcc, 0xd0, 0x90, 0x75, 0x1c, 0x0c, 0xe5, 0x55, 0x4e, 0x44, 0xf6, 0x86, 0xea, 0x02, 0xe5, 0x68, 0xc5, + 0x14, 0x04, 0x1a, 0x73, 0xd5, 0x9a, 0x9c, 0xee, 0x33, 0x53, 0x58, 0xe0, 0x58, 0x01, 0x8b, 0xe3, 0x20, 0xca, 0x24, 0x7d, 0xc1, 0x80, 0xcf, 0xfa, 0xc1, 0xb3, 0xe1, 0xf7, 0xe7, 0x84, 0x12, 0xd4, + 0x59, 0xee, 0xea, 0x6a, 0x6e, 0xaa, 0xed, 0x04, 0x73, 0x27, 0x1a, 0xfa, 0xbe, 0x5d, 0xf1, 0xca, 0x16, 0xfd, 0x1d, 0xfa, 0x27, 0x81, 0xdd, 0x9e, 0xed, 0xa2, 0xed, 0x36, 0xe8, 0x67, 0x1d, 0x7f, + 0xd3, 0xcc, 0xd2, 0xcc, 0xb6, 0xc4, 0xce, 0x6a, 0x10, 0x33, 0x0b, 0x64, 0x45, 0x52, 0x12, 0x67, 0x03, 0x2b, 0x4f, 0xd9, 0xe2, 0x81, 0xb4, 0x98, 0x14, 0xa6, 0xe2, 0x21, 0x03, 0xae, 0x53, 0x8a, + 0x83, 0x45, 0x94, 0xd0, 0x8b, 0x98, 0x5e, 0x31, 0x88, 0x1d, 0x14, 0x68, 0x36, 0xec, 0xf9, 0xd3, 0xcc, 0xdb, 0x6e, 0xbc, 0x21, 0x04, 0x19, 0x12, 0xb7, 0x4a, 0xcc, 0xc0, 0x42, 0x4a, 0x33, 0x81, + 0x5e, 0x9f, 0x60, 0x4f, 0x13, 0xd9, 0x3f, 0x4e, 0xb6, 0xc5, 0x77, 0x07, 0x63, 0xdb, 0x4d, 0xa7, 0x0f, 0x76, 0x3d, 0x06, 0x2e, 0x78, 0xad, 0xce, 0xe6, 0x25, 0xe1, 0x4b, 0xb1, 0x14, 0xa9, 0xdf, + 0xb6, 0xc6, 0x26, 0xa9, 0xea, 0xf2, 0x76, 0xbb, 0x1c, 0x83, 0xd4, 0x4e, 0x2a, 0xf1, 0x39, 0x35, 0xf5, 0x06, 0x48, 0x39, 0x55, 0xc7, 0x5b, 0x65, 0xb7, 0xec, 0x55, 0x11, 0xca, 0x4f, 0x87, 0x1a, + 0xcd, 0xc9, 0xd2, 0x60, 0x10, 0x86, 0x82, 0x48, 0xc7, 0x5c, 0x62, 0xac, 0xd2, 0x31, 0xbe, 0x40, 0xc5, 0x25, 0xc8, 0xcd, 0xc6, 0x11, 0xb0, 0x59, 0x97, 0x13, 0x2c, 0x1f, 0x00, 0x5b, 0x8c, 0x1f, + 0x02, 0x4b, 0x69, 0x65, 0x81, 0xe6, 0xee, 0x5f, 0x24, 0x8f, 0x36, 0xab, 0xf4, 0xd4, 0x3c, 0x6e, 0x99, 0x96, 0x0f, 0x6b, 0xe0, 0xbf, 0x96, 0xd4, 0xf2, 0x8b, 0xec, 0x51, 0x0e, 0xe7, 0x46, 0x9b, + 0x84, 0x16, 0xa8, 0x2b, 0xc0, 0xa3, 0xac, 0xe3, 0xd5, 0x41, 0x25, 0x73, 0xcc, 0x94, 0x42, 0xa4, 0x02, 0x5b, 0xb3, 0x24, 0xc6, 0x40, 0xc4, 0xf4, 0xcb, 0x02, 0x0b, 0xf7, 0xab, 0xeb, 0x3d, 0x72, + 0xfe, 0x7c, 0xdf, 0x01, 0x71, 0x87, 0xfe, 0xf1, 0xe3, 0x3e, 0x9d, 0x3d, 0xba, 0x86, 0x5a, 0x78, 0x28, 0xb6, 0x16, 0x18, 0x6e, 0x4c, 0x7c, 0x9e, 0x99, 0x8d, 0x3b, 0x14, 0x8a, 0x0e, 0x15, 0xf7, + 0x34, 0xd7, 0x5d, 0x69, 0x41, 0xec, 0x27, 0xf8, 0xa2, 0x07, 0xc4, 0x1d, 0xa2, 0x22, 0xe4, 0xed, 0x0c, 0x98, 0xd0, 0x23, 0x27, 0x5d, 0x31, 0xcc, 0xca, 0xa9, 0xd4, 0x4e, 0x49, 0x89, 0x75, 0xa1, + 0x15, 0x89, 0xa5, 0x6c, 0x96, 0xa5, 0xb9, 0x02, 0x00, 0x46, 0x5e, 0xb3, 0x19, 0xc3, 0x12, 0x73, 0x8e, 0x07, 0xca, 0x41, 0xf5, 0x0d, 0x1f, 0x5a, 0xeb, 0xd0, 0xe4, 0x77, 0x0e, 0x3d, 0xee, 0x22, + 0xaf, 0x60, 0x40, 0xbc, 0xdf, 0x76, 0xe4, 0xe1, 0xf1, 0xa8, 0x7b, 0x22, 0xf4, 0x9c, 0x71, 0xae, 0xde, 0x21, 0x26, 0xb2, 0xbb, 0x26, 0xd7, 0x2e, 0x5c, 0x37, 0x12, 0x3b, 0xdc, 0x4c, 0x77, 0xae, + 0xc2, 0x60, 0x4a, 0xaf, 0x21, 0xa6, 0xb0, 0xe2, 0x04, 0xbd, 0xad, 0xa0, 0x2e, 0xf7, 0xc6, 0x64, 0xb0, 0xe7, 0xd4, 0xcc, 0x35, 0x87, 0xfd, 0xb4, 0x53, 0x6f, 0x15, 0x60, 0x13, 0x6c, 0x33, 0x7d, + 0x37, 0x72, 0x39, 0x1f, 0x82, 0xd5, 0x14, 0xac, 0xf1, 0xad, 0xbb, 0x65, 0xf6, 0x48, 0x80, 0xce, 0x47, 0xe1, 0x6f, 0x28, 0xcd, 0xab, 0x80, 0xe3, 0x93, 0xaf, 0xe7, 0x5f, 0xe1, 0xb7, 0x39, 0x73, + 0xf1, 0xd0, 0x13, 0xbf, 0x58, 0x4c, 0xbf, 0x2c, 0xa8, 0x23, 0xe1, 0x0b, 0x69, 0x1d, 0x7b, 0x7c, 0xcb, 0x20, 0xdf, 0x58, 0x03, 0x04, 0x39, 0xd8, 0x66, 0x39, 0xb5, 0xab, 0xb3, 0xf9, 0x70, 0x4f, + 0xc6, 0xae, 0x38, 0x86, 0x72, 0x76, 0x28, 0x4a, 0xe3, 0x21, 0x85, 0x94, 0xbb, 0x01, 0xc2, 0x26, 0xe8, 0xa0, 0xa0, 0x20, 0x63, 0x88, 0xdb, 0xa3, 0x18, 0xe8, 0x94, 0xb6, 0x92, 0x64, 0x7d, 0x76, + 0xa2, 0xc6, 0x65, 0x4d, 0x8a, 0x88, 0xd4, 0x41, 0x23, 0x62, 0x58, 0x95, 0x49, 0x31, 0x9b, 0xe8, 0xa1, 0x42, 0xcc, 0xe5, 0x1a, 0xfd, 0xcd, 0xf0, 0xab, 0x36, 0x31, 0x46, 0x67, 0xb4, 0x6d, 0xdf, + 0xdd, 0x7d, 0x15, 0x4d, 0xfe, 0x8a, 0x32, 0xf9, 0x45, 0xf8, 0xc4, 0xd3, 0x8f, 0xe6, 0x31, 0x6c, 0xe5, 0x69, 0x01, 0x92, 0x9d, 0xac, 0xdb, 0x44, 0x93, 0x7b, 0xa3, 0xa1, 0xd2, 0x2f, 0x6d, 0x75, + 0x36, 0x54, 0x11, 0x3f, 0x66, 0x7b, 0x7c, 0x64, 0x3e, 0x89, 0xbc, 0x7a, 0xdc, 0x8f, 0x3f, 0x95, 0xa6, 0x3b, 0x43, 0x02, 0xb4, 0xe2, 0x53, 0x11, 0x3c, 0x0c, 0xc5, 0x02, 0x5f, 0xed, 0x76, 0x07, + 0x9a, 0x27, 0xee, 0x1c, 0x8e, 0xba, 0xe0, 0xf3, 0xce, 0x06, 0x75, 0x49, 0xd3, 0x03, 0x65, 0x53, 0x62, 0x17, 0xf8, 0xd4, 0xb4, 0x13, 0x92, 0x44, 0xfa, 0x89, 0xe0, 0x2e, 0xc1, 0x91, 0x02, 0xed, + 0x5e, 0x65, 0x4c, 0xee, 0xa4, 0x51, 0x61, 0x1f, 0x97, 0xa3, 0xff, 0x84, 0x7f, 0x22, 0xad, 0x92, 0xdc, 0x53, 0xf3, 0xd1, 0x3e, 0x3a, 0xf8, 0x52, 0x60, 0x78, 0x6a, 0xe6, 0x47, 0x4e, 0xe4, 0x5d, + 0xb0, 0x5d, 0x30, 0xb8, 0x00, 0x6a, 0x88, 0xbc, 0x91, 0x32, 0x62, 0x8e, 0x28, 0x3d, 0x88, 0xd8, 0xcc, 0xa5, 0x1a, 0x1a, 0x8d, 0x28, 0x82, 0x56, 0x09, 0x86, 0x74, 0x4a, 0xc5, 0xc6, 0x57, 0x03, + 0x2c, 0xe0, 0xeb, 0xdd, 0x64, 0x2f, 0xad, 0x07, 0xb0, 0x57, 0x80, 0xe3, 0xad, 0xc6, 0xfa, 0xea, 0x68, 0x36, 0xf3, 0x77, 0x72, 0x67, 0x23, 0x12, 0xd5, 0x70, 0xd6, 0xa9, 0x56, 0xc2, 0x36, 0xa0, + 0x87, 0x14, 0xa8, 0xae, 0xf1, 0x52, 0xbe, 0xc6, 0xd4, 0xfb, 0x23, 0xe3, 0x2b, 0x77, 0x1f, 0xf7, 0x9b, 0xd7, 0x82, 0x1a, 0xdf, 0x69, 0x9e, 0xb8, 0x75, 0x38, 0x6a, 0x13, 0xca, 0x78, 0xe0, 0x18, + 0xc7, 0x6f, 0x65, 0x12, 0xdb, 0xec, 0x06, 0x09, 0xbc, 0x86, 0x35, 0xce, 0xdc, 0x03, 0xfc, 0x74, 0x0a, 0xad, 0xdd, 0xed, 0x3a, 0x84, 0x39, 0x56, 0x36, 0xd1, 0x99, 0x5c, 0x67, 0x94, 0x21, 0x1b, + 0x5e, 0x90, 0xaa, 0xf2, 0x78, 0x95, 0xad, 0x77, 0xdb, 0x82, 0x9c, 0xa2, 0x6a, 0xd0, 0x21, 0x3b, 0xd8, 0x4a, 0x53, 0x55, 0xd6, 0x87, 0x12, 0x27, 0x42, 0xd5, 0x84, 0xa2, 0x66, 0x23, 0x51, 0x42, + 0xd9, 0xc5, 0x13, 0x3c, 0xe6, 0xd4, 0x2c, 0xb2, 0x53, 0xc4, 0xf5, 0x23, 0xd5, 0xf2, 0x7d, 0xdf, 0xe7, 0x3b, 0xcd, 0xe3, 0xf7, 0x1f, 0x8f, 0x8e, 0x0a, 0xa5, 0x85, 0x77, 0x73, 0xd5, 0x0b, 0x47, + 0x24, 0xa9, 0x22, 0x96, 0x0e, 0x98, 0xbb, 0xfe, 0x10, 0xf2, 0x41, 0x60, 0x35, 0x83, 0xc6, 0x51, 0xe6, 0x16, 0x63, 0xaf, 0x5e, 0x3a, 0x84, 0x43, 0x97, 0xdb, 0xb5, 0x30, 0x92, 0xed, 0xb5, 0x6e, + 0xb1, 0x65, 0x4e, 0xf6, 0x88, 0xad, 0x5d, 0x78, 0xf0, 0x6a, 0xca, 0x33, 0xe6, 0x18, 0xa3, 0x59, 0x38, 0x20, 0x80, 0xa2, 0xaa, 0x55, 0x7e, 0xbd, 0xc4, 0x2d, 0x2d, 0xef, 0x57, 0xcb, 0xba, 0x79, + 0x6e, 0x8f, 0xb8, 0xd1, 0x69, 0x1b, 0xff, 0x3f, 0xff, 0xe3, 0x13, 0x00, 0xc9, 0x2b, 0xa6, 0x8a, 0x65, 0x3c, 0xf6, 0x98, 0xbe, 0xe4, 0xbd, 0xb1, 0x8c, 0xa3, 0xcf, 0xd4, 0x32, 0xf4, 0xb6, 0x9e, + 0x99, 0x35, 0xec, 0x44, 0xa5, 0xd1, 0x0c, 0xb5, 0xa9, 0x4b, 0x10, 0xc0, 0x46, 0xf5, 0xd4, 0x85, 0xb0, 0xdd, 0xc1, 0x53, 0x3e, 0xe8, 0xec, 0xc5, 0xb1, 0x29, 0x19, 0x82, 0x50, 0xd0, 0x84, 0xab, + 0x7b, 0x84, 0xb6, 0xc3, 0x1b, 0x17, 0x1e, 0x92, 0x2c, 0x4b, 0xed, 0x5d, 0x5b, 0x0f, 0x99, 0x61, 0x3c, 0x19, 0x69, 0x62, 0x2d, 0xea, 0x76, 0x3d, 0x61, 0xdc, 0x59, 0x87, 0x0c, 0xa7, 0xa9, 0x8c, + 0xe9, 0x0a, 0x9b, 0x52, 0x5f, 0x77, 0x24, 0x37, 0x48, 0x55, 0xeb, 0xa1, 0x43, 0xe2, 0xa5, 0x29, 0xea, 0x48, 0xf2, 0xf0, 0xe9, 0xc7, 0x83, 0xe3, 0x66, 0x7c, 0x0b, 0xbd, 0x33, 0x51, 0x76, 0x13, + 0x41, 0xd9, 0x51, 0xec, 0x70, 0x38, 0x9b, 0xc1, 0x72, 0xb2, 0x55, 0xb6, 0x33, 0x4d, 0xf0, 0x05, 0xda, 0xce, 0xf6, 0xcd, 0x80, 0x1c, 0xf3, 0x19, 0xea, 0x0b, 0xe3, 0x2d, 0x00, 0x47, 0x20, 0xdf, + 0x5b, 0xd1, 0x55, 0x6f, 0x0a, 0xc8, 0x48, 0x84, 0x57, 0xc3, 0x0a, 0x70, 0x7b, 0x32, 0xaf, 0xc6, 0xfa, 0x6a, 0xb2, 0xa9, 0x12, 0xcd, 0x45, 0x76, 0xc6, 0x7e, 0x3c, 0x33, 0xfa, 0x38, 0xbc, 0x1c, + 0xbf, 0xbe, 0xe1, 0x69, 0xfb, 0xd1, 0xb1, 0x0e, 0xc8, 0x3f, 0x88, 0xa3, 0x27, 0xea, 0xdc, 0x81, 0x3e, 0x7e, 0xf9, 0xd9, 0x97, 0x7b, 0xe6, 0xe4, 0x6d, 0x66, 0xc0, 0xc7, 0x4f, 0x5e, 0xb5, 0xe4, + 0xdc, 0x4c, 0x55, 0xf5, 0x56, 0xfe, 0xe1, 0x22, 0x3c, 0xd8, 0x93, 0xaa, 0xef, 0x9b, 0x8f, 0x97, 0x65, 0x2f, 0xb9, 0x2f, 0x2e, 0x08, 0x1f, 0x04, 0x7b, 0xd1, 0x6c, 0x53, 0x2f, 0xf7, 0x20, 0x5e, + 0xcc, 0x47, 0xd7, 0xb5, 0x32, 0x27, 0x71, 0x5e, 0x01, 0x7c, 0x66, 0xaf, 0x2c, 0xe7, 0xb8, 0x97, 0xf0, 0x24, 0x35, 0x1c, 0xc0, 0x0b, 0x70, 0x3c, 0xe4, 0x85, 0x19, 0x8c, 0x53, 0x9a, 0x97, 0xf1, + 0x6b, 0x8a, 0xd9, 0x8f, 0x0c, 0x87, 0x06, 0x74, 0x90, 0x5d, 0x65, 0xa3, 0x4e, 0x8d, 0xf4, 0x56, 0x56, 0xdf, 0x45, 0x8c, 0xa6, 0x21, 0xa7, 0xbe, 0x54, 0xcc, 0x82, 0x50, 0x9d, 0x4c, 0x85, 0x88, + 0x19, 0x49, 0xf4, 0x33, 0xf1, 0xfe, 0xbd, 0x17, 0xf7, 0xf0, 0x31, 0xad, 0xf6, 0xe2, 0x5a, 0x8c, 0x93, 0xcf, 0xbb, 0xbe, 0x27, 0xb7, 0x03, 0xdc, 0xa2, 0xbf, 0x1e, 0xd3, 0x87, 0xb4, 0xc2, 0xb2, + 0xbe, 0x40, 0x13, 0x7e, 0x25, 0xe7, 0xe3, 0x82, 0x2e, 0xd0, 0xbd, 0x6c, 0x75, 0xb1, 0x76, 0x59, 0x1f, 0x69, 0x8c, 0x2c, 0x22, 0x90, 0xe0, 0x74, 0x23, 0x08, 0x38, 0x8d, 0x2d, 0x6d, 0x55, 0xdc, + 0x4b, 0x8b, 0x49, 0x4a, 0x68, 0xec, 0x7a, 0xb1, 0xde, 0x61, 0x8b, 0xde, 0x20, 0x81, 0x86, 0x9d, 0x38, 0xd6, 0xe6, 0x11, 0x01, 0x76, 0x64, 0x53, 0x65, 0xf6, 0xbb, 0x0a, 0x63, 0x0c, 0x52, 0x9c, + 0x89, 0x1d, 0x96, 0xc1, 0x35, 0x2f, 0x94, 0x03, 0x78, 0x5d, 0xcc, 0x8a, 0xfe, 0x36, 0x88, 0x0b, 0xb9, 0x0c, 0xfa, 0x5b, 0xe9, 0xef, 0x5d, 0xe2, 0x3f, 0xd7, 0x33, 0x9f, 0x74, 0xaa, 0xa3, 0x2b, + 0xfc, 0x51, 0xd1, 0xcc, 0xd7, 0xcc, 0xc3, 0x0b, 0xba, 0xe7, 0x4e, 0x75, 0x6a, 0xb5, 0x35, 0x13, 0x67, 0xea, 0x6a, 0x31, 0xcc, 0x56, 0xaa, 0x28, 0x16, 0x5c, 0xb5, 0xa3, 0x5d, 0x2f, 0xa2, 0x66, + 0x23, 0x8a, 0xc3, 0x01, 0x53, 0xc0, 0xd7, 0x6e, 0x5a, 0xd6, 0xb3, 0x8d, 0xaf, 0x10, 0x34, 0x25, 0xd5, 0x28, 0xd3, 0x71, 0xfa, 0xa5, 0x83, 0xd2, 0xb8, 0x3f, 0x66, 0x3b, 0xe1, 0xcc, 0x70, 0xb4, + 0xa1, 0x35, 0xd6, 0x66, 0x1d, 0x7b, 0xc9, 0xd2, 0x7a, 0x6a, 0x64, 0x53, 0x75, 0x95, 0x81, 0xc3, 0x8e, 0x42, 0x4f, 0x5b, 0x02, 0xb6, 0x9d, 0x56, 0x15, 0x3f, 0xfe, 0x09, 0xb6, 0x44, 0xad, 0xc9, + 0x4c, 0xbd, 0x48, 0xdf, 0x81, 0x4f, 0xbe, 0x4a, 0x89, 0x86, 0x5f, 0xc2, 0xdd, 0xfa, 0x44, 0xfd, 0x88, 0xb4, 0x71, 0x73, 0xae, 0x0b, 0x3f, 0x47, 0xe4, 0x3a, 0xb0, 0x55, 0xc2, 0x14, 0xa0, 0x47, + 0x84, 0xda, 0x54, 0xc4, 0x72, 0x80, 0x07, 0xb2, 0x11, 0x1e, 0xc8, 0xf0, 0x40, 0xd5, 0x2d, 0x6f, 0xcd, 0x56, 0x69, 0x5f, 0x5f, 0xb8, 0x18, 0x83, 0x68, 0xf9, 0x7c, 0x0a, 0xb3, 0x0a, 0x19, 0x5b, + 0x10, 0x07, 0xad, 0x44, 0x42, 0xe9, 0x8d, 0xb0, 0x09, 0x46, 0x38, 0xde, 0x7a, 0x05, 0x4b, 0xcd, 0x3e, 0x85, 0xf6, 0xd3, 0xce, 0x30, 0xa0, 0x9d, 0x69, 0x39, 0xd8, 0x35, 0x7d, 0x21, 0xf8, 0xda, + 0xfa, 0xfe, 0x12, 0x71, 0x84, 0x78, 0xa9, 0x30, 0xcc, 0x2d, 0xe2, 0x08, 0xd1, 0xae, 0x14, 0xcc, 0x2c, 0x32, 0xd9, 0x89, 0xec, 0x90, 0x23, 0x0e, 0xa5, 0x97, 0x53, 0x40, 0xed, 0x2d, 0x2d, 0x5c, + 0x61, 0x91, 0xd2, 0x8c, 0x00, 0x8a, 0x50, 0xd6, 0x99, 0x9c, 0x2e, 0x28, 0x7c, 0x42, 0x86, 0x75, 0x2f, 0xd4, 0x10, 0x1a, 0x5a, 0xa7, 0xf1, 0xae, 0x10, 0x3b, 0x4d, 0x6f, 0x3a, 0xc0, 0x2a, 0x6b, + 0x80, 0xc5, 0xf8, 0x08, 0xe5, 0x75, 0x47, 0x56, 0x32, 0xd3, 0x76, 0x25, 0x5b, 0x9b, 0x30, 0x3d, 0x54, 0xb9, 0xdd, 0x81, 0x7d, 0xb8, 0xec, 0xbf, 0x28, 0x99, 0xfe, 0xb0, 0x40, 0xf5, 0xb7, 0xd1, + 0x49, 0x3e, 0x7e, 0xf9, 0x27, 0xc2, 0xa3, 0xdf, 0x99, 0xf9, 0x9e, 0x14, 0x73, 0xdf, 0xc4, 0x7d, 0x25, 0x00, 0xf2, 0x82, 0xee, 0x2f, 0x91, 0x1d, 0x5a, 0x6d, 0x31, 0x12, 0xd8, 0x2d, 0x38, 0xde, + 0x03, 0xfd, 0x89, 0x3e, 0xaa, 0x69, 0x52, 0x47, 0xeb, 0x5d, 0x3c, 0x62, 0xc7, 0x54, 0xc9, 0xd7, 0xd3, 0x6a, 0x1a, 0x69, 0xb9, 0x00, 0x90, 0x46, 0x67, 0x29, 0xed, 0x28, 0x83, 0x84, 0x00, 0x6d, + 0xe0, 0xd9, 0xb3, 0x51, 0x6a, 0x69, 0x2a, 0x0a, 0xad, 0x63, 0x33, 0x4b, 0x09, 0x6f, 0x0b, 0xe4, 0xe4, 0xca, 0xe9, 0xcc, 0x91, 0xc1, 0xb6, 0x67, 0x52, 0x0b, 0x4c, 0x33, 0x3b, 0x9e, 0x24, 0x3f, + 0xf3, 0x6b, 0x7d, 0x11, 0x77, 0x76, 0x89, 0xe0, 0x83, 0xfc, 0x45, 0x81, 0x7d, 0x97, 0x4c, 0x6b, 0x3f, 0x9c, 0xfe, 0x06, 0xf0, 0xf9, 0x06, 0x80, 0xcf, 0xfb, 0xd7, 0x66, 0x79, 0xf4, 0xb0, 0x44, + 0x17, 0xf8, 0x1b, 0xfc, 0x3c, 0x11, 0xfe, 0xc5, 0xd5, 0x63, 0xb3, 0x0b, 0xb6, 0xe3, 0xed, 0x52, 0x57, 0x4a, 0x56, 0x10, 0xea, 0x5e, 0x19, 0x19, 0x83, 0xe1, 0x22, 0x33, 0x11, 0xd0, 0xdf, 0xb8, + 0xe1, 0xce, 0xeb, 0x4c, 0xec, 0x29, 0x5d, 0xce, 0x42, 0xb2, 0x9a, 0x8f, 0xf3, 0x58, 0x9a, 0x2f, 0xd4, 0xda, 0xd1, 0x3b, 0x68, 0x96, 0x31, 0x19, 0x82, 0x60, 0xc5, 0xce, 0xdf, 0x59, 0xa5, 0x24, + 0x4d, 0x6c, 0x1e, 0xd8, 0x94, 0xc1, 0x88, 0x5f, 0x7b, 0xa8, 0xac, 0x97, 0x70, 0x46, 0x48, 0x7d, 0x49, 0x78, 0xa6, 0xa7, 0xf3, 0xae, 0x1e, 0x45, 0x3b, 0xd7, 0x3c, 0x4d, 0x29, 0x8f, 0xfd, 0x45, + 0xe8, 0x0b, 0x21, 0x51, 0x9f, 0xa8, 0x1f, 0x19, 0x73, 0x73, 0xee, 0x38, 0x8b, 0xb5, 0x08, 0x98, 0x32, 0x8d, 0xf9, 0x88, 0x0c, 0x68, 0x6e, 0xb0, 0x11, 0xd7, 0xe3, 0xb5, 0xc0, 0x99, 0x9e, 0x18, + 0x16, 0x93, 0xbd, 0x6f, 0x26, 0xf2, 0x00, 0x50, 0x16, 0x86, 0xbe, 0x24, 0x01, 0xd1, 0x0c, 0x7a, 0x40, 0x10, 0x44, 0xd9, 0x1e, 0x82, 0x63, 0x3d, 0x37, 0x48, 0x30, 0x83, 0xa7, 0x35, 0x08, 0x72, + 0xa2, 0xd2, 0xa4, 0x91, 0x2d, 0x28, 0x0b, 0x2c, 0x50, 0x0b, 0x0e, 0x06, 0xea, 0x80, 0x87, 0xb4, 0xd2, 0x7f, 0x12, 0x21, 0x96, 0x39, 0xa6, 0xa6, 0x86, 0xf6, 0x31, 0x72, 0x49, 0x0d, 0x1f, 0xc5, + 0xd1, 0xbd, 0x68, 0x2c, 0x5d, 0xd3, 0x3e, 0x70, 0xe6, 0xfa, 0x4c, 0x5b, 0xa3, 0x69, 0x37, 0xda, 0xa7, 0x70, 0xa3, 0xc4, 0x72, 0x6e, 0x04, 0xa9, 0x08, 0x25, 0x8c, 0x97, 0xa6, 0x5b, 0x40, 0x81, + 0xd2, 0x39, 0xb4, 0x63, 0x49, 0x66, 0xdf, 0xb1, 0x77, 0x31, 0x07, 0xb1, 0xa8, 0xb9, 0x0d, 0xca, 0x6d, 0x56, 0x05, 0xfa, 0x00, 0x72, 0x96, 0x1b, 0x7a, 0x23, 0xaf, 0x1a, 0x3f, 0x55, 0xe5, 0x0a, + 0x02, 0x6a, 0x25, 0xc6, 0xe5, 0x82, 0x91, 0x09, 0x42, 0xce, 0x4b, 0x4d, 0x04, 0x8d, 0x80, 0x79, 0xb6, 0x6c, 0xfc, 0x42, 0x51, 0xbe, 0x7f, 0xc5, 0xd1, 0xf2, 0xfb, 0xf1, 0x3a, 0xfc, 0x51, 0x2b, + 0x7d, 0x79, 0xf3, 0xac, 0x47, 0x1e, 0x9a, 0xd7, 0xa5, 0x73, 0xa4, 0x7c, 0x21, 0x9b, 0x63, 0xbb, 0x6d, 0xf2, 0x04, 0xd1, 0xe9, 0x18, 0x43, 0x27, 0xd7, 0xf7, 0x08, 0x82, 0x21, 0x05, 0xad, 0x26, + 0x24, 0xc3, 0xcc, 0x51, 0xb1, 0xd8, 0xd3, 0x66, 0x4e, 0x37, 0x7d, 0x42, 0x91, 0xa6, 0x4e, 0xb0, 0x94, 0xc6, 0xe1, 0x68, 0x60, 0xe0, 0xda, 0x22, 0xdd, 0x1a, 0xee, 0xa0, 0x6e, 0xfa, 0x25, 0x0b, + 0x12, 0x0a, 0x8a, 0xae, 0x64, 0x83, 0x5f, 0x38, 0x9b, 0x55, 0xbd, 0xcd, 0x31, 0x01, 0xa8, 0x9d, 0x86, 0x34, 0x77, 0xba, 0x06, 0x3d, 0x93, 0xcc, 0x9f, 0x60, 0xeb, 0x75, 0x8c, 0xf5, 0x7d, 0x27, + 0xc9, 0x2b, 0xfe, 0xd3, 0x4b, 0xc2, 0x07, 0xa6, 0x5e, 0x34, 0xdb, 0x7a, 0x52, 0x13, 0x6c, 0x3b, 0xab, 0xf3, 0x64, 0x38, 0x18, 0x73, 0xa3, 0x1d, 0x6b, 0xb8, 0xc2, 0x38, 0x95, 0x21, 0x30, 0x28, + 0xf9, 0x79, 0x19, 0x4a, 0x0e, 0x0a, 0x03, 0x1d, 0x36, 0xa2, 0xfd, 0xe1, 0x06, 0xd1, 0x60, 0x7e, 0xcb, 0x0f, 0xe0, 0xfd, 0x7e, 0x12, 0x2b, 0x43, 0x23, 0xe8, 0xa1, 0x95, 0x09, 0xd2, 0x6a, 0xb4, + 0x46, 0xe6, 0xd5, 0xa4, 0x66, 0x13, 0x1b, 0xab, 0x16, 0x84, 0x19, 0xef, 0x97, 0x25, 0xa8, 0xdc, 0x62, 0xda, 0xbc, 0x88, 0xe9, 0x6c, 0x9b, 0x79, 0xd7, 0x0d, 0xf3, 0xd4, 0x0d, 0x33, 0x57, 0xff, + 0xf1, 0x0b, 0x30, 0xe3, 0xe2, 0x96, 0x4f, 0xb8, 0xff, 0x87, 0x7b, 0x7a, 0xad, 0x4b, 0xab, 0xb5, 0x58, 0xd5, 0xb6, 0xde, 0xd3, 0xbc, 0x92, 0xc5, 0xd5, 0x95, 0x96, 0xc5, 0x09, 0xa0, 0x57, 0xcc, + 0xc2, 0xe7, 0xd5, 0x09, 0xa0, 0x56, 0xd6, 0xe1, 0xd8, 0x22, 0x68, 0x6f, 0xe8, 0xc7, 0xbb, 0xa6, 0xa1, 0xcd, 0x35, 0xa4, 0x27, 0xf6, 0x12, 0x99, 0x2e, 0x36, 0x4b, 0x44, 0x6d, 0xea, 0x68, 0xcf, + 0xb0, 0xaa, 0x37, 0xef, 0xb8, 0x6c, 0x38, 0xa4, 0xad, 0xf5, 0x1a, 0x1e, 0x6c, 0x6a, 0xa6, 0xde, 0xa8, 0x8a, 0xb2, 0x81, 0x07, 0x73, 0xc6, 0x5b, 0xa9, 0x32, 0x2c, 0x09, 0xa4, 0x8b, 0x79, 0x63, + 0x64, 0xe1, 0x11, 0x81, 0x93, 0x09, 0x28, 0xc3, 0x50, 0xc9, 0xe6, 0x41, 0x90, 0xfa, 0x5f, 0x26, 0x00, 0x3b, 0x54, 0xfd, 0xae, 0xb9, 0x77, 0x1f, 0xf1, 0x18, 0x79, 0x29, 0xa5, 0xf6, 0x82, 0xee, + 0x71, 0x8c, 0x7d, 0xb4, 0x8e, 0x6a, 0xab, 0x45, 0x02, 0xc0, 0x7a, 0x35, 0x41, 0x7b, 0xc3, 0x3e, 0xb9, 0x82, 0xa6, 0xfb, 0x4a, 0xe1, 0xf7, 0x63, 0x6d, 0xb9, 0x4c, 0x99, 0x92, 0x0f, 0x2d, 0x00, + 0x5f, 0x32, 0xf6, 0x5e, 0xd1, 0x39, 0xb2, 0xda, 0xcf, 0xc9, 0x26, 0x83, 0x90, 0x7d, 0xbc, 0x27, 0xf6, 0x1a, 0x8b, 0x83, 0xa1, 0x41, 0xfb, 0x8e, 0x98, 0x0e, 0x5d, 0x78, 0x20, 0x14, 0xc3, 0x79, + 0x64, 0x32, 0xd1, 0x64, 0x4a, 0x54, 0xb9, 0xb3, 0xe0, 0x13, 0x14, 0x1e, 0x78, 0x0f, 0xd4, 0xd6, 0x17, 0xec, 0xf1, 0xd5, 0xec, 0xcf, 0x96, 0xb6, 0x39, 0x52, 0x3c, 0xb0, 0xe4, 0xf0, 0xbf, 0xad, + 0x0e, 0xb7, 0x7b, 0x12, 0xe4, 0xa8, 0xa6, 0x56, 0x23, 0xf8, 0x74, 0xb1, 0xc8, 0x2b, 0x0d, 0x0d, 0xf3, 0x3e, 0xcb, 0xb2, 0x2a, 0x97, 0xa9, 0xeb, 0x85, 0x27, 0xe1, 0xa4, 0x45, 0xef, 0x23, 0x49, + 0x2f, 0x72, 0x1f, 0xb3, 0x16, 0x50, 0x59, 0xc8, 0x10, 0x39, 0x42, 0xaa, 0x45, 0x8e, 0x78, 0xc3, 0x7a, 0x98, 0xa7, 0xbb, 0x7d, 0x87, 0x6b, 0xc0, 0x35, 0xc4, 0x92, 0x18, 0x85, 0x0a, 0x35, 0x65, + 0x30, 0x82, 0x0b, 0xff, 0xb1, 0x10, 0xc0, 0xaf, 0xd8, 0xe7, 0xea, 0x66, 0x57, 0x0d, 0x33, 0xf7, 0x01, 0x0f, 0x5f, 0x0b, 0x58, 0xf8, 0x45, 0xf6, 0xc8, 0xc8, 0x73, 0xa3, 0x6d, 0xb0, 0x42, 0x22, + 0xf4, 0x05, 0xcb, 0x91, 0x41, 0x14, 0xd4, 0xd7, 0xa3, 0x25, 0x8a, 0x70, 0x3d, 0x7a, 0x58, 0xdb, 0x89, 0xac, 0xad, 0x66, 0x43, 0x85, 0x1b, 0x4d, 0x6d, 0x82, 0x23, 0x90, 0x20, 0x5f, 0x6e, 0x26, + 0x73, 0x8d, 0x8c, 0xeb, 0x19, 0x62, 0x35, 0x16, 0x3a, 0xde, 0x1b, 0xd8, 0xa2, 0x31, 0x06, 0x13, 0x09, 0x17, 0xe6, 0x2b, 0x1b, 0xd8, 0xd0, 0xe1, 0x94, 0xdf, 0xdb, 0x8e, 0x92, 0x73, 0x5c, 0x91, + 0x0e, 0xc4, 0x67, 0xdc, 0xfc, 0x02, 0xcf, 0xf8, 0xf0, 0xea, 0x59, 0x5e, 0xfb, 0xef, 0x21, 0xb5, 0x9f, 0x90, 0x5d, 0xd5, 0x2c, 0x4f, 0x55, 0xff, 0xc2, 0x96, 0x81, 0x6f, 0xef, 0x70, 0xb3, 0xae, + 0x55, 0xf8, 0x7e, 0xe5, 0x1a, 0xb9, 0xd3, 0x3d, 0xa6, 0xf9, 0xc5, 0x91, 0x1b, 0xe6, 0xbf, 0x61, 0xf8, 0x40, 0xbf, 0x3f, 0x1b, 0xe8, 0x8e, 0xea, 0xef, 0x2e, 0xc4, 0xf3, 0x7f, 0xbf, 0x6b, 0xa7, + 0xff, 0x68, 0x93, 0x0f, 0x79, 0x21, 0xe2, 0xab, 0xf3, 0x8f, 0xbf, 0xf4, 0xcf, 0x0d, 0xd1, 0x07, 0xcf, 0x00, 0xba, 0x8f, 0xae, 0xb4, 0x1d, 0xc6, 0x4d, 0x1d, 0x04, 0x58, 0xa7, 0xe8, 0x64, 0xfd, + 0x6c, 0xb1, 0xa9, 0x99, 0x5e, 0x22, 0xaa, 0xa6, 0xb7, 0x46, 0x98, 0x61, 0xe9, 0xf4, 0x39, 0xdd, 0xe7, 0x0c, 0xb7, 0x91, 0xd5, 0xc9, 0xaa, 0x18, 0x51, 0x24, 0x32, 0xe7, 0x3d, 0x8d, 0x08, 0x17, + 0x05, 0x1b, 0x1a, 0x46, 0x7f, 0xc4, 0x96, 0xa0, 0xb3, 0xeb, 0x70, 0x32, 0x41, 0x0b, 0x94, 0x9f, 0x6d, 0x4c, 0x0e, 0x5d, 0x99, 0x36, 0x3e, 0x58, 0xe3, 0x5b, 0xe9, 0x99, 0x37, 0xe1, 0x4f, 0x0c, + 0xe3, 0x4b, 0x04, 0xae, 0xfb, 0xf3, 0x30, 0xfa, 0xc2, 0x34, 0xfc, 0x8b, 0xec, 0x61, 0x18, 0x7f, 0x34, 0x8e, 0x10, 0xff, 0x2d, 0x66, 0x5f, 0x7e, 0x3e, 0x72, 0x00, 0x8a, 0xcc, 0xe3, 0x0d, 0x91, + 0x16, 0x64, 0xcf, 0x4f, 0xfd, 0xdd, 0x0a, 0xa5, 0xb2, 0x66, 0x9b, 0x43, 0x86, 0x56, 0x2d, 0xbc, 0xf5, 0xc6, 0x2e, 0xd8, 0x34, 0xf0, 0xf7, 0x03, 0x22, 0x57, 0xab, 0x75, 0xc0, 0xd0, 0xfe, 0x18, + 0x9a, 0x8d, 0x79, 0x61, 0xb7, 0xa5, 0xf6, 0x93, 0x65, 0x95, 0x38, 0x76, 0x36, 0x30, 0x97, 0xa3, 0xc6, 0x43, 0x70, 0x06, 0xeb, 0x07, 0x23, 0x5b, 0x0a, 0xc4, 0x96, 0xd9, 0xeb, 0x6a, 0x1e, 0x05, + 0xae, 0xde, 0xcd, 0x7c, 0xd3, 0x8c, 0xef, 0xdb, 0x61, 0x77, 0x90, 0xd2, 0xda, 0x30, 0xba, 0x48, 0x75, 0xb3, 0x1b, 0xa8, 0x8f, 0x42, 0xcf, 0xc1, 0x9f, 0xf8, 0x4b, 0x8c, 0x3e, 0x93, 0x3d, 0x32, + 0xfa, 0xdc, 0xe8, 0x1e, 0xa9, 0x3d, 0x67, 0xf4, 0xca, 0xb3, 0xd5, 0xb8, 0x08, 0x36, 0xbe, 0x26, 0x38, 0x3b, 0xda, 0x6e, 0x96, 0x84, 0xbc, 0xd3, 0x31, 0x79, 0xbb, 0x5a, 0xa2, 0xf8, 0x10, 0x74, + 0xb9, 0x82, 0x5c, 0xb0, 0xdb, 0x04, 0xd4, 0xf4, 0x6a, 0x86, 0x19, 0x0d, 0xe0, 0x80, 0x33, 0xdf, 0xc3, 0xcd, 0x70, 0x92, 0x78, 0x0d, 0xa4, 0x68, 0x09, 0xec, 0x63, 0x1b, 0x35, 0x91, 0xc3, 0x74, + 0xad, 0x55, 0x9b, 0xe9, 0x46, 0xa8, 0x87, 0xc8, 0x10, 0x25, 0x7e, 0xb3, 0xdb, 0xb6, 0x8e, 0x17, 0xb8, 0xf8, 0xdc, 0xf3, 0x2e, 0xc5, 0x23, 0xd6, 0x62, 0x3f, 0xa1, 0xde, 0x6f, 0xf0, 0xf6, 0x4c, + 0xff, 0x9a, 0xc7, 0xef, 0x27, 0xbb, 0x27, 0xf2, 0xcf, 0x99, 0xbd, 0x89, 0xc2, 0x80, 0x68, 0xa6, 0xfd, 0xf1, 0xa4, 0xa1, 0x59, 0xc9, 0xa0, 0x3b, 0xb9, 0x93, 0xcd, 0xd4, 0x14, 0xdc, 0xc9, 0x45, + 0x7f, 0xdc, 0xc8, 0xe5, 0x5e, 0xa9, 0x7c, 0x5a, 0x25, 0x89, 0xda, 0x05, 0x04, 0xc3, 0x2b, 0x89, 0xa5, 0x1b, 0xc3, 0x7a, 0xbd, 0xd6, 0x78, 0x0f, 0x8b, 0x40, 0x7d, 0x38, 0x13, 0xd1, 0xc1, 0x7a, + 0x57, 0x2c, 0x2b, 0x0d, 0x61, 0x19, 0xa6, 0x5e, 0xed, 0x61, 0x86, 0x0d, 0xd9, 0x67, 0xae, 0xad, 0xc7, 0x1d, 0xfd, 0x7d, 0x3f, 0xee, 0x3d, 0xe6, 0xf0, 0x4e, 0x3f, 0xbf, 0xea, 0xb2, 0xe7, 0x8c, + 0xad, 0x16, 0x62, 0x89, 0x53, 0x37, 0xcc, 0xad, 0xae, 0x97, 0x7d, 0xb1, 0xb6, 0x7b, 0xc1, 0xec, 0xfc, 0x20, 0x7b, 0x90, 0xc2, 0x47, 0xe3, 0xb8, 0xae, 0x7b, 0x62, 0x74, 0x42, 0x5d, 0x7a, 0xaa, + 0x2e, 0x34, 0x58, 0x8e, 0xfc, 0xe5, 0x7a, 0x36, 0x33, 0xa8, 0xf5, 0x98, 0x91, 0x9b, 0x62, 0xa8, 0xc7, 0x96, 0x5b, 0x7d, 0xd7, 0x6c, 0x3c, 0xc5, 0x09, 0x67, 0x6e, 0xe0, 0xfa, 0xea, 0xfb, 0x33, + 0x1e, 0x99, 0x3f, 0x2f, 0x2c, 0x60, 0x6f, 0xa9, 0x1f, 0xbe, 0xf5, 0xf6, 0x5c, 0xdb, 0x94, 0x47, 0x20, 0x01, 0x48, 0x09, 0xa5, 0x7d, 0x54, 0xe1, 0xa8, 0x99, 0xe7, 0x91, 0x1b, 0x33, 0x1d, 0xd3, + 0x93, 0x0d, 0xc5, 0x73, 0x3b, 0x75, 0x36, 0xb7, 0xd2, 0xd2, 0xb1, 0x86, 0xe4, 0x0e, 0xa0, 0x61, 0xc4, 0x45, 0xc3, 0x26, 0xf5, 0xe7, 0x1e, 0x0c, 0xd8, 0x11, 0x14, 0xf4, 0xc0, 0x71, 0x48, 0x84, + 0x2c, 0x80, 0x6c, 0x99, 0x85, 0x36, 0x8d, 0xc0, 0x4e, 0x5c, 0xe0, 0xf3, 0xb2, 0xbf, 0x14, 0x7a, 0x73, 0xf6, 0x88, 0x83, 0xff, 0x94, 0x3b, 0xc7, 0x59, 0xf4, 0xa1, 0x37, 0xeb, 0x95, 0x75, 0xdd, + 0x25, 0xe1, 0x5f, 0x3c, 0x39, 0xcd, 0xd6, 0x2d, 0x71, 0x0f, 0xc2, 0x69, 0x32, 0xc2, 0x7a, 0x86, 0xd9, 0x4f, 0x7a, 0x8b, 0xf9, 0xc8, 0xdf, 0x27, 0x10, 0x55, 0x91, 0xd8, 0x24, 0xcc, 0xd1, 0x0a, + 0xe7, 0x4a, 0x9e, 0x4b, 0x36, 0x6b, 0x77, 0x87, 0x47, 0x54, 0x4f, 0xd9, 0xf9, 0x5b, 0x5e, 0x1c, 0x4f, 0xfd, 0xc4, 0x46, 0x87, 0x70, 0x9d, 0x2e, 0x21, 0x61, 0xad, 0x2e, 0x3d, 0x2a, 0x29, 0xd7, + 0x95, 0x61, 0x99, 0x0a, 0x51, 0x11, 0x6a, 0xbf, 0x9c, 0x30, 0x44, 0x61, 0xdf, 0xe6, 0x07, 0x3c, 0x1a, 0x6b, 0x5f, 0x59, 0x71, 0x9f, 0x4c, 0xbe, 0x53, 0x4a, 0xe3, 0xbb, 0x69, 0x7d, 0x36, 0x1a, + 0xcf, 0xe3, 0xae, 0xad, 0x16, 0x6d, 0x13, 0xc2, 0x77, 0xe2, 0xe2, 0x45, 0x12, 0x5b, 0x9e, 0xba, 0x8f, 0xed, 0x80, 0x57, 0x42, 0x1f, 0xef, 0x3e, 0xe1, 0x43, 0x7e, 0x37, 0xe7, 0x8f, 0x71, 0x2c, + 0x2d, 0xc2, 0x94, 0x34, 0xac, 0x4e, 0x35, 0x1f, 0xa1, 0xb7, 0x63, 0x6f, 0xa4, 0x16, 0xbd, 0x59, 0xba, 0x23, 0x56, 0xe0, 0x7c, 0x2e, 0xeb, 0x2b, 0xd9, 0x10, 0xd1, 0x8a, 0x5d, 0xac, 0xd5, 0x24, + 0xa2, 0xa5, 0x05, 0x06, 0xf6, 0xfb, 0x03, 0x84, 0xa3, 0x0b, 0x79, 0x05, 0x2e, 0xe5, 0xb9, 0x38, 0x1b, 0xf6, 0x67, 0x84, 0xba, 0x8e, 0x44, 0x61, 0x4b, 0x12, 0x23, 0x6e, 0xe9, 0x18, 0xc2, 0x7c, + 0x3d, 0x9e, 0x21, 0xb6, 0xab, 0xfb, 0xdc, 0xb3, 0x49, 0xeb, 0xaf, 0xc8, 0x9e, 0xfb, 0xa8, 0x68, 0xf7, 0x7d, 0xf1, 0xfe, 0x8b, 0xb2, 0xe7, 0xee, 0xca, 0xcd, 0x7c, 0xe8, 0xb9, 0x7e, 0xd1, 0x8b, + 0xf7, 0xe0, 0x21, 0x8f, 0xfa, 0x8d, 0x19, 0x1a, 0x6d, 0xbd, 0x7b, 0x75, 0x6f, 0xdf, 0xf7, 0x2a, 0x68, 0x06, 0x23, 0x54, 0xb5, 0x23, 0x07, 0xe5, 0x32, 0xd6, 0x6b, 0x1e, 0x16, 0xc7, 0x29, 0xe4, + 0x11, 0xd5, 0x04, 0xe9, 0x59, 0x9d, 0x1d, 0xee, 0x97, 0xf3, 0x70, 0x21, 0x34, 0x9d, 0xa0, 0xe9, 0xf5, 0xd9, 0xa6, 0x27, 0xca, 0x33, 0xd3, 0x67, 0x76, 0x28, 0xbc, 0x9b, 0x36, 0x78, 0x27, 0xf1, + 0xc9, 0xbd, 0x67, 0x71, 0x64, 0x24, 0x37, 0x35, 0xe2, 0x51, 0x33, 0x4c, 0x5a, 0x61, 0x2d, 0x8b, 0xdb, 0x7c, 0xf6, 0xee, 0x5d, 0xb9, 0xee, 0xbe, 0xea, 0x46, 0xff, 0x43, 0x04, 0x9d, 0xe5, 0xea, + 0x43, 0x1b, 0xeb, 0x0f, 0x8a, 0xfa, 0xf8, 0x98, 0x47, 0xc2, 0x3e, 0x5e, 0x6c, 0x2b, 0x6e, 0xcf, 0xc1, 0xcd, 0x1e, 0x89, 0x4e, 0x69, 0xab, 0xdc, 0x2f, 0x30, 0x30, 0x37, 0x64, 0x38, 0x9c, 0x2b, + 0x61, 0xd4, 0xc7, 0x80, 0x80, 0x1f, 0x72, 0xd3, 0xf9, 0x40, 0xb2, 0x2a, 0x32, 0xc7, 0xea, 0x3a, 0xdf, 0x45, 0xab, 0x6c, 0x32, 0x17, 0xf7, 0xe5, 0x18, 0x18, 0x20, 0xbd, 0xa4, 0x80, 0x32, 0x06, + 0x9c, 0xe6, 0x9b, 0x31, 0x32, 0xed, 0x83, 0x5b, 0x9b, 0x5b, 0x04, 0xfa, 0xa6, 0x6a, 0xdc, 0x4a, 0x2e, 0x94, 0x96, 0x2a, 0xff, 0xff, 0x73, 0xe2, 0x8e, 0xff, 0x02, 0x6f, 0xce, 0x07, 0xd9, 0x77, + 0x71, 0xc6, 0xad, 0xbd, 0x39, 0x50, 0x37, 0x19, 0x98, 0xd2, 0xb8, 0xc8, 0xd4, 0x0a, 0x76, 0x23, 0x7d, 0xe9, 0x6a, 0x32, 0x34, 0x71, 0xf7, 0xd2, 0xb6, 0x10, 0x23, 0xb2, 0x95, 0x00, 0x8e, 0x4f, + 0xfa, 0xdd, 0x5d, 0xa2, 0xb6, 0xd3, 0xe8, 0x67, 0x08, 0x82, 0xfb, 0xb6, 0xcf, 0x2b, 0xd0, 0x45, 0x77, 0xe8, 0x7f, 0xb0, 0xf3, 0xea, 0x6c, 0x1b, 0x60, 0x23, 0xa8, 0x3b, 0x1b, 0x0a, 0x8a, 0x54, + 0xec, 0xc6, 0x55, 0xe0, 0x93, 0x4c, 0x26, 0x0e, 0x1c, 0xb9, 0x8a, 0xb4, 0x51, 0x6d, 0xc7, 0x76, 0xf4, 0xdf, 0xb4, 0x6e, 0x2b, 0x62, 0x33, 0x55, 0xed, 0xc7, 0x70, 0x85, 0xc8, 0x4f, 0xf2, 0x95, + 0x05, 0xc2, 0x07, 0xd9, 0x53, 0x61, 0xfd, 0xf7, 0x46, 0xf7, 0x48, 0xed, 0xb9, 0xae, 0x60, 0x79, 0x29, 0xe7, 0x85, 0x7e, 0x34, 0x18, 0x73, 0xa8, 0xc9, 0x94, 0xf8, 0x94, 0xcd, 0x77, 0xd3, 0x68, + 0x21, 0xe4, 0x08, 0xd3, 0x89, 0x12, 0xb0, 0x46, 0x8c, 0x6c, 0x2f, 0x14, 0x72, 0xc1, 0x94, 0xaa, 0xb8, 0x2a, 0x8b, 0x25, 0x69, 0x0e, 0xe9, 0x82, 0x0f, 0xac, 0x39, 0xe8, 0xca, 0x72, 0x33, 0xea, + 0x43, 0x26, 0xe9, 0xc4, 0x4d, 0x1f, 0x57, 0xb2, 0xbd, 0x56, 0xcc, 0x70, 0x66, 0xac, 0xfa, 0xc2, 0xf0, 0xd9, 0x66, 0xda, 0x17, 0xea, 0x23, 0x0a, 0xe2, 0x28, 0x3c, 0xbc, 0xbf, 0x19, 0xb8, 0x79, + 0x6e, 0x9e, 0xdd, 0x0d, 0x37, 0xf0, 0x17, 0xa7, 0x9d, 0x6e, 0x4f, 0x3d, 0x5d, 0x86, 0x6f, 0xc1, 0xca, 0x0c, 0x53, 0x2b, 0xce, 0x75, 0xf9, 0x6f, 0x2e, 0x5d, 0x60, 0x71, 0x7c, 0x46, 0x96, 0x8f, + 0xd2, 0xa0, 0x6b, 0xa8, 0xb9, 0xfa, 0x4e, 0x15, 0xb9, 0x2e, 0xc3, 0x76, 0xb8, 0xec, 0x1a, 0xef, 0xe5, 0xd4, 0xee, 0xbc, 0x54, 0x60, 0xe6, 0x4e, 0x64, 0xfc, 0xd2, 0x68, 0x57, 0x3f, 0x0e, 0xdc, + 0xe0, 0xfc, 0xb3, 0x9b, 0xea, 0x6e, 0xc9, 0xe9, 0x17, 0xf8, 0x55, 0xe5, 0xf3, 0xa3, 0xfc, 0xd5, 0xe3, 0xc3, 0xba, 0x17, 0xb0, 0x6c, 0xf0, 0x31, 0xc4, 0xeb, 0xbb, 0xa3, 0xf9, 0xad, 0x1d, 0xa0, + 0xe6, 0x45, 0x4f, 0xba, 0x3a, 0xff, 0xf9, 0x45, 0xee, 0x0f, 0x72, 0xe4, 0x05, 0xbc, 0xc7, 0x1b, 0xda, 0xef, 0x50, 0x20, 0x17, 0x67, 0x8e, 0x58, 0xd6, 0x2d, 0x90, 0x1f, 0x07, 0x9a, 0x13, 0x91, + 0x1c, 0xea, 0x8d, 0xb5, 0x11, 0xb5, 0x0f, 0x8b, 0xbd, 0x4b, 0x44, 0x28, 0x3c, 0x4d, 0x15, 0x7b, 0x08, 0x28, 0x4b, 0x51, 0xcf, 0x14, 0x0f, 0x0f, 0xe7, 0x5c, 0xbd, 0x0a, 0x76, 0x0e, 0x3f, 0x4c, + 0xc8, 0xfe, 0x68, 0x9c, 0xc7, 0x80, 0x55, 0xe3, 0x8e, 0xa4, 0x14, 0x4a, 0x30, 0x03, 0x42, 0xa4, 0x56, 0x7a, 0x6b, 0x7a, 0xa5, 0xc5, 0x68, 0xd3, 0x00, 0xc1, 0x96, 0x74, 0x02, 0x79, 0xf6, 0xba, + 0x97, 0x41, 0x8f, 0x52, 0xb3, 0x5b, 0xe4, 0xae, 0xff, 0x5e, 0x0e, 0xf2, 0x9f, 0x9f, 0xdc, 0x0c, 0x6e, 0xe8, 0x98, 0xa9, 0x7b, 0x01, 0xdb, 0x72, 0x65, 0x36, 0xbb, 0x99, 0x9a, 0xa6, 0x6a, 0x7d, + 0xff, 0xa7, 0x0f, 0xc0, 0x76, 0x4f, 0x64, 0xae, 0xd7, 0x54, 0x57, 0x71, 0xce, 0x3f, 0xfe, 0x89, 0xdd, 0x76, 0xcb, 0x93, 0xb1, 0xf1, 0xff, 0x18, 0xe6, 0x61, 0x75, 0x96, 0xbe, 0x3f, 0xee, 0xe6, + 0x9e, 0xe3, 0x67, 0x18, 0x66, 0x9c, 0x9a, 0xba, 0x7a, 0xac, 0x85, 0x74, 0x7a, 0xa5, 0x56, 0x4e, 0xef, 0x07, 0x5d, 0xaa, 0x4d, 0xfc, 0xf5, 0x2b, 0x05, 0x6a, 0xbf, 0x8a, 0xbf, 0x6e, 0x55, 0x9c, + 0x96, 0x35, 0xe0, 0x95, 0x42, 0x4f, 0x98, 0xdd, 0xd6, 0x97, 0x09, 0x56, 0x9b, 0xec, 0xad, 0x6c, 0x40, 0x02, 0x61, 0xc9, 0xed, 0x56, 0x83, 0x15, 0xc4, 0x22, 0xa4, 0x0e, 0x65, 0xae, 0x88, 0x4b, + 0x33, 0x5c, 0xed, 0xcd, 0x96, 0x3d, 0x21, 0x18, 0xd1, 0x24, 0x1b, 0xc6, 0x99, 0xbe, 0x08, 0x84, 0xc9, 0x22, 0x1a, 0x92, 0xfc, 0x74, 0x9c, 0xe6, 0x64, 0x61, 0x00, 0xd5, 0x2c, 0x8f, 0xbc, 0x3a, + 0x43, 0x59, 0xfc, 0x51, 0xc1, 0xab, 0x17, 0xd8, 0x76, 0x2b, 0xad, 0xfb, 0x26, 0xe9, 0xeb, 0x9e, 0x86, 0x33, 0xe9, 0x0f, 0x33, 0xf4, 0x7c, 0xa2, 0x6d, 0x89, 0xed, 0x10, 0x58, 0x38, 0x61, 0xc9, + 0xb8, 0xf8, 0x70, 0xa4, 0x69, 0x6b, 0xab, 0x74, 0xd3, 0xa8, 0xb3, 0x89, 0x3c, 0x77, 0xd8, 0x94, 0x9d, 0x8c, 0x14, 0x66, 0xc2, 0x88, 0xd6, 0x9b, 0xb5, 0x39, 0xb3, 0x56, 0x31, 0x33, 0xe1, 0xab, + 0x88, 0x5f, 0x82, 0x4e, 0x0e, 0xf9, 0xa8, 0x5c, 0xd1, 0x7d, 0xcd, 0x25, 0xe3, 0x09, 0x55, 0x9a, 0x83, 0x81, 0x11, 0xee, 0x46, 0xf5, 0xac, 0x5e, 0xce, 0x80, 0xa0, 0x99, 0x5b, 0xd5, 0xeb, 0x8b, + 0xd4, 0x7b, 0xfd, 0xbf, 0xb5, 0x2a, 0xcc, 0x4f, 0x30, 0xba, 0x8f, 0xec, 0xc2, 0x17, 0x7a, 0xe7, 0x99, 0xea, 0x79, 0xa6, 0x3e, 0x1c, 0x1f, 0xad, 0xc2, 0x16, 0x3d, 0x13, 0xa2, 0x29, 0xad, 0x4c, + 0xa7, 0x4a, 0xc6, 0x52, 0x88, 0xbc, 0xec, 0x6f, 0x12, 0x2d, 0x70, 0x20, 0x94, 0x07, 0xe5, 0x41, 0x02, 0x0e, 0xd8, 0x71, 0x7f, 0x0b, 0x84, 0x74, 0x68, 0xed, 0xac, 0xf5, 0x24, 0x24, 0x16, 0xe9, + 0x5e, 0x5a, 0x43, 0x63, 0x24, 0x16, 0x64, 0x6f, 0xd1, 0xb0, 0xbd, 0x1a, 0x20, 0x94, 0x15, 0xbc, 0xee, 0x19, 0x9b, 0xa4, 0x4e, 0x76, 0xf0, 0x6c, 0x5a, 0xed, 0x7d, 0x0d, 0xec, 0x19, 0xb7, 0x55, + 0xb7, 0xbf, 0xc1, 0xd9, 0xdb, 0xc9, 0xee, 0xca, 0xca, 0xbf, 0x32, 0x75, 0x0e, 0x13, 0x2d, 0xf9, 0x42, 0xad, 0xd9, 0xb6, 0xe0, 0x1c, 0xef, 0xfe, 0xe8, 0xac, 0xab, 0x47, 0xfe, 0xc3, 0xea, 0xc4, + 0xc4, 0x4b, 0xd9, 0x47, 0xd7, 0xa4, 0x4f, 0x52, 0xbb, 0x38, 0xd1, 0x25, 0xda, 0x65, 0x20, 0x25, 0x71, 0x9f, 0x2a, 0xe7, 0x7e, 0x2f, 0xcb, 0x8b, 0xe9, 0xa8, 0x34, 0xb9, 0x2c, 0x24, 0x46, 0xa1, + 0x3e, 0x99, 0x97, 0x25, 0x06, 0x42, 0xc9, 0x58, 0xd5, 0xb9, 0x46, 0xf2, 0xa7, 0x40, 0x87, 0xaf, 0xf6, 0x7a, 0xaf, 0x03, 0x26, 0x70, 0xc5, 0xd7, 0x25, 0xca, 0x58, 0x65, 0x4e, 0x82, 0x00, 0x33, + 0x0b, 0xe1, 0x38, 0x99, 0xd2, 0xd9, 0xc4, 0x60, 0xdc, 0xc8, 0xde, 0xb2, 0xf3, 0x5e, 0x67, 0x5a, 0x56, 0xf3, 0x96, 0xeb, 0x31, 0x47, 0xcd, 0xba, 0x96, 0xaf, 0x9e, 0xac, 0xa1, 0xd7, 0x7c, 0x6a, + 0x6d, 0x36, 0xd4, 0xf2, 0x2f, 0xaa, 0xcc, 0xe2, 0x3f, 0x89, 0x17, 0x14, 0x52, 0xfe, 0x5e, 0x5e, 0xf6, 0xf8, 0xbf, 0x7b, 0xa4, 0xf1, 0x9c, 0xd3, 0x0a, 0x5b, 0x04, 0x28, 0x21, 0xbb, 0x38, 0x37, + 0x9d, 0x0e, 0x99, 0x01, 0x19, 0xc0, 0x30, 0x92, 0x1b, 0x18, 0xa2, 0xe6, 0x0e, 0x6c, 0x86, 0x23, 0x5d, 0xe6, 0xed, 0x69, 0xdf, 0x63, 0x53, 0x2c, 0xb4, 0x0b, 0x52, 0x33, 0xc6, 0xd4, 0x5c, 0xda, + 0xe1, 0x81, 0x08, 0x54, 0x73, 0xa1, 0x44, 0x6b, 0x61, 0xae, 0x8f, 0xc2, 0xfe, 0x22, 0x1c, 0x69, 0xfd, 0x81, 0xa3, 0xa2, 0x59, 0xa4, 0x49, 0x7b, 0xac, 0x7e, 0x5a, 0x4f, 0xea, 0x8b, 0xb5, 0x98, + 0x57, 0x1e, 0xf9, 0x4e, 0xde, 0xd6, 0x97, 0xf7, 0x23, 0x43, 0xcd, 0x9c, 0x9f, 0xba, 0x1f, 0x85, 0xa6, 0x71, 0xde, 0x71, 0x43, 0xaf, 0x50, 0xd4, 0x7e, 0xdd, 0x95, 0xa7, 0x45, 0x78, 0x9e, 0x79, + 0x8f, 0xc5, 0x81, 0xaf, 0xc7, 0xda, 0x65, 0x44, 0xc2, 0x9d, 0xbd, 0xf6, 0x1b, 0xdf, 0xf4, 0xe1, 0x8e, 0xbb, 0x58, 0x72, 0x1f, 0x14, 0x1e, 0xc4, 0xd3, 0x3f, 0xdd, 0x5e, 0x6f, 0x39, 0x5c, 0x4f, + 0x72, 0xbd, 0x3a, 0x75, 0x62, 0xd3, 0xbd, 0xae, 0x43, 0xbe, 0x94, 0xe5, 0xa1, 0x7a, 0x25, 0xd0, 0x3d, 0xfc, 0xed, 0x92, 0xed, 0x32, 0x39, 0x08, 0x89, 0x81, 0x7d, 0xbc, 0xc3, 0xd1, 0x0b, 0xbe, + 0xb2, 0x3a, 0x84, 0x50, 0xc8, 0x91, 0xae, 0x6d, 0xca, 0xf9, 0xcc, 0x98, 0x16, 0x38, 0x02, 0xe4, 0xe9, 0xdc, 0x5c, 0xf2, 0x05, 0xcc, 0x0d, 0xab, 0x9d, 0xad, 0xe7, 0x61, 0xa1, 0x41, 0x6a, 0x11, + 0x0d, 0x3b, 0x32, 0xb4, 0x91, 0xf5, 0x00, 0xec, 0xf5, 0x97, 0x02, 0x91, 0x14, 0x45, 0xa6, 0xa7, 0x4d, 0x12, 0x50, 0x0b, 0x95, 0x1f, 0xf5, 0x01, 0x0e, 0x7d, 0x5d, 0xb7, 0x9e, 0xea, 0x69, 0x1c, + 0x91, 0x03, 0x93, 0x42, 0xf5, 0x7f, 0x9c, 0x17, 0x32, 0x57, 0x5d, 0xe8, 0xb8, 0x04, 0xce, 0x74, 0xc7, 0x0c, 0xd4, 0x6e, 0x9e, 0xaa, 0x07, 0xa6, 0x9d, 0x17, 0x18, 0x37, 0x3d, 0xe0, 0x3e, 0xcc, + 0xcc, 0xc9, 0x03, 0x7f, 0xd5, 0x95, 0x8a, 0xd4, 0x3d, 0x6d, 0x5f, 0x9d, 0x3a, 0xc9, 0x9d, 0x22, 0x1e, 0x77, 0x3d, 0x32, 0x0f, 0x13, 0xc6, 0xda, 0xf8, 0x6a, 0xcc, 0x38, 0xd2, 0xcc, 0xd4, 0x6c, + 0x76, 0x6e, 0xf8, 0x62, 0xe7, 0xb9, 0xf4, 0x77, 0xdc, 0xb7, 0x24, 0x5f, 0xf1, 0xe1, 0xfc, 0x22, 0x7b, 0xe8, 0x4a, 0x1f, 0x8d, 0x2e, 0xf6, 0xdc, 0x87, 0x73, 0x74, 0xd6, 0xcb, 0xb8, 0xe5, 0x61, + 0xf8, 0x74, 0x25, 0x81, 0xce, 0x0a, 0xe2, 0xbc, 0xa1, 0xc8, 0x48, 0xc5, 0x64, 0x68, 0x36, 0x09, 0x67, 0xa4, 0x54, 0x3d, 0x34, 0xc6, 0x66, 0x49, 0x31, 0x6e, 0x92, 0x6e, 0x46, 0xd5, 0xc2, 0xd7, + 0x02, 0x5a, 0x14, 0x46, 0x31, 0xa6, 0xee, 0x60, 0x0b, 0x05, 0x67, 0x01, 0x39, 0x59, 0x0e, 0x6b, 0x01, 0x0e, 0x92, 0xfd, 0x8e, 0xc5, 0x43, 0x7b, 0x37, 0x9a, 0x42, 0x90, 0x05, 0xf8, 0xcf, 0x14, + 0xd1, 0x9f, 0xd2, 0xe3, 0xd7, 0x0c, 0x36, 0x83, 0xc8, 0xfb, 0x9a, 0xc3, 0xe4, 0x4b, 0x1c, 0xbe, 0xa0, 0x0b, 0x74, 0x2f, 0x5b, 0x5d, 0xb2, 0x1d, 0x8f, 0x85, 0x85, 0x27, 0x37, 0xfa, 0x46, 0x9c, + 0x52, 0xa0, 0x59, 0x51, 0xa3, 0xb8, 0x01, 0x85, 0x7d, 0x2c, 0x0f, 0xcb, 0xca, 0xc6, 0x6b, 0xaf, 0x86, 0x44, 0x16, 0xd9, 0xe7, 0x66, 0x94, 0x34, 0x38, 0x8a, 0xae, 0xfb, 0x11, 0x30, 0x9f, 0xd9, + 0x61, 0x0a, 0x01, 0x2c, 0x9b, 0x77, 0x5c, 0x1d, 0x71, 0x27, 0xcb, 0x46, 0x22, 0x07, 0x05, 0xb2, 0x34, 0x04, 0x08, 0x5d, 0xa8, 0x55, 0xb8, 0x5e, 0x05, 0xec, 0x00, 0xff, 0x76, 0x40, 0xdd, 0x1d, + 0x8e, 0xfd, 0x1d, 0xd2, 0xf3, 0x2f, 0x08, 0xe9, 0xb9, 0x23, 0x87, 0x07, 0x2a, 0xf2, 0xfe, 0xa2, 0xe9, 0x15, 0x21, 0xdc, 0x7b, 0x00, 0xd0, 0xbd, 0x7b, 0xba, 0x6d, 0x69, 0x27, 0x51, 0x20, 0x81, + 0x59, 0x2f, 0x44, 0xb6, 0xde, 0xd6, 0x19, 0x2b, 0x21, 0xe4, 0xf3, 0xce, 0x6e, 0xa8, 0x52, 0xfd, 0xe5, 0x74, 0x35, 0x97, 0xb6, 0xde, 0xc6, 0x59, 0xa3, 0x34, 0x05, 0xcc, 0xc3, 0x69, 0x49, 0xee, + 0x4b, 0x3b, 0xc9, 0x93, 0x98, 0xda, 0xf6, 0xc6, 0x53, 0x34, 0x98, 0x4b, 0xfb, 0xc5, 0x1e, 0x9a, 0xfb, 0x11, 0x9a, 0x27, 0x8d, 0x99, 0x68, 0x60, 0x36, 0xf5, 0xd3, 0x42, 0x9d, 0xd6, 0x88, 0x51, + 0x7c, 0x7b, 0x01, 0x7a, 0x87, 0x99, 0x2d, 0xf6, 0xb8, 0xd1, 0xdf, 0xd8, 0x2c, 0xbd, 0xbf, 0xc7, 0x8d, 0xb6, 0xdb, 0x1a, 0xdd, 0xd2, 0x13, 0x6d, 0x89, 0x88, 0xe8, 0xc4, 0x59, 0x17, 0xc1, 0x76, + 0x00, 0x9a, 0x11, 0xbf, 0xea, 0x31, 0x7d, 0x4f, 0x57, 0x87, 0x3d, 0x98, 0xe3, 0xc5, 0x64, 0x19, 0x0c, 0xfb, 0x21, 0x0b, 0xc5, 0x16, 0x69, 0x14, 0xab, 0xfd, 0x90, 0xad, 0xf2, 0x19, 0x4e, 0x31, + 0x78, 0xb8, 0xf3, 0xaa, 0x9e, 0x8a, 0x8c, 0x0d, 0x77, 0x9e, 0xf3, 0xc8, 0x00, 0xae, 0x90, 0x09, 0xe3, 0x0e, 0x80, 0xbd, 0x8b, 0x94, 0x53, 0xf3, 0x75, 0x27, 0xe6, 0xb5, 0xc6, 0x3c, 0x99, 0x7f, + 0xdf, 0x8c, 0x6e, 0xbc, 0xb8, 0xf9, 0x8f, 0x98, 0x67, 0x2f, 0x8e, 0xa0, 0xa7, 0x1b, 0x24, 0xf8, 0x4b, 0xe3, 0xe6, 0xd1, 0x06, 0x09, 0xde, 0x6e, 0x8c, 0x50, 0x45, 0xc9, 0x2d, 0xd3, 0xa5, 0x25, + 0x89, 0xb2, 0x38, 0xd6, 0x73, 0x6d, 0x0e, 0x71, 0x80, 0xcc, 0x2e, 0xe7, 0x10, 0x81, 0xe1, 0x6c, 0xad, 0xcf, 0x32, 0x9b, 0xd0, 0x7a, 0x9a, 0xb1, 0xee, 0x31, 0x45, 0x52, 0xa4, 0xa8, 0x5d, 0xe2, + 0x2a, 0x97, 0x8c, 0xb6, 0xaa, 0x83, 0x13, 0x0a, 0x39, 0x0e, 0x16, 0xc4, 0x66, 0xd0, 0x60, 0xd2, 0x5a, 0x9f, 0xe6, 0xbe, 0xb5, 0x81, 0x53, 0x65, 0x50, 0xd8, 0xf9, 0x6d, 0x79, 0x9d, 0x6f, 0x88, + 0xfb, 0x66, 0xc7, 0x05, 0xfb, 0x0b, 0x05, 0xf4, 0x45, 0x19, 0xe4, 0x97, 0x8a, 0xc3, 0x1e, 0x28, 0x1e, 0xd7, 0x58, 0xc7, 0xea, 0xc7, 0xed, 0x8a, 0xc3, 0x82, 0x80, 0x0c, 0x83, 0xb3, 0x6a, 0x3e, + 0x5e, 0xed, 0x24, 0x7d, 0xd9, 0x5f, 0xb8, 0x28, 0x45, 0x2d, 0xb2, 0xce, 0x94, 0x12, 0x15, 0xa5, 0x4a, 0x66, 0x9c, 0xea, 0xc6, 0x6c, 0x7f, 0x50, 0xc5, 0x10, 0x68, 0x48, 0x82, 0x1b, 0xaf, 0xcb, + 0x85, 0x52, 0xad, 0x56, 0x7d, 0x17, 0x84, 0x64, 0x60, 0xba, 0xf3, 0xc7, 0x6c, 0x3d, 0xe2, 0x86, 0xce, 0x58, 0xf7, 0x22, 0x7d, 0xd7, 0x61, 0xb8, 0x90, 0xb6, 0x78, 0x6a, 0xf8, 0x3a, 0xf7, 0xaf, + 0xed, 0xe4, 0xcf, 0xde, 0xcb, 0xd3, 0x8e, 0xa3, 0xf1, 0xe3, 0xae, 0x27, 0xd5, 0x88, 0x72, 0xd7, 0x0e, 0x4f, 0x39, 0x8b, 0x3f, 0xfe, 0x09, 0xde, 0xfa, 0x31, 0xac, 0x28, 0xed, 0x9a, 0xea, 0x09, + 0xd6, 0xf9, 0x9f, 0xe0, 0x4f, 0xe4, 0xda, 0x47, 0x6b, 0x15, 0xa1, 0x9e, 0xbb, 0x51, 0xf8, 0xb1, 0xdd, 0xf9, 0xf9, 0xe1, 0x67, 0x2c, 0x97, 0x7f, 0x1e, 0x56, 0xaf, 0xf8, 0xe5, 0x15, 0x47, 0xfd, + 0xe5, 0x17, 0xbe, 0xf6, 0xfc, 0xde, 0xfa, 0x85, 0xd1, 0x1b, 0xcd, 0xf1, 0xd1, 0xd3, 0x8e, 0xbf, 0xc5, 0x2e, 0xaf, 0x5e, 0x62, 0x86, 0xff, 0x13, 0xfa, 0x09, 0x5f, 0x5f, 0xfd, 0x9c, 0x25, 0xf3, + 0x4f, 0xe8, 0x27, 0x71, 0xbb, 0x56, 0x38, 0xf6, 0x9b, 0xf3, 0xd7, 0x7c, 0xbe, 0xfa, 0x0e, 0x9a, 0x76, 0x60, 0xc7, 0xdd, 0x85, 0xe6, 0xe7, 0xb0, 0x9a, 0xd3, 0x9b, 0x5c, 0xb1, 0xe5, 0x16, 0x9e, + 0xec, 0x0e, 0x52, 0xe8, 0xa7, 0xdc, 0xd4, 0xf7, 0xce, 0x7f, 0xcc, 0x4c, 0x3d, 0x1e, 0xb7, 0x18, 0x2f, 0x1f, 0xa5, 0xb0, 0xee, 0x0d, 0x19, 0xf0, 0x25, 0x3f, 0xe9, 0x3b, 0xcd, 0xc3, 0xa0, 0x39, + 0x1d, 0x75, 0xc1, 0xe7, 0x9e, 0x51, 0xa8, 0xcb, 0x7b, 0x75, 0x5d, 0x61, 0xf8, 0x6e, 0x61, 0xae, 0x8d, 0x51, 0xd0, 0x28, 0x83, 0xb9, 0x99, 0x35, 0xdc, 0x5c, 0xb6, 0xfb, 0x83, 0x56, 0x6e, 0x1c, + 0xcd, 0x0d, 0xf3, 0xd4, 0x3c, 0x6d, 0x97, 0xb7, 0x75, 0xbe, 0xe7, 0x66, 0x1a, 0x74, 0x33, 0xb7, 0x79, 0xa4, 0x33, 0xe0, 0x97, 0x7c, 0x62, 0x1f, 0x54, 0x0f, 0x2c, 0x38, 0x1f, 0x1f, 0xeb, 0x7d, + 0xb7, 0xd0, 0xdc, 0x2a, 0x9e, 0x15, 0x01, 0xe3, 0x37, 0xf5, 0x68, 0x3d, 0xd9, 0x68, 0x64, 0x47, 0x8e, 0x2c, 0x19, 0x5d, 0x6e, 0x20, 0x08, 0x66, 0xf1, 0x18, 0x1e, 0xf6, 0x67, 0x03, 0x6a, 0xb8, + 0xeb, 0x60, 0x3d, 0x7b, 0x2c, 0x8f, 0x4a, 0x64, 0x3b, 0x9a, 0x3b, 0x41, 0xcf, 0xcf, 0xd7, 0x52, 0x6f, 0xe7, 0xbb, 0xa8, 0x23, 0x6e, 0x4c, 0x89, 0xae, 0x16, 0xb1, 0x49, 0xea, 0x73, 0x11, 0xc6, + 0xf6, 0xe0, 0x7c, 0x5a, 0x84, 0xc2, 0x53, 0x74, 0xfe, 0xd6, 0x9a, 0xf7, 0xe3, 0x17, 0xaf, 0x06, 0x1e, 0x7c, 0xb3, 0x68, 0x62, 0x6e, 0xee, 0xf3, 0xee, 0x57, 0x9e, 0x33, 0xf0, 0x45, 0x09, 0x9d, + 0xc9, 0x1e, 0x45, 0x74, 0x6e, 0x1c, 0x61, 0xf8, 0x9e, 0x86, 0x1f, 0x58, 0x10, 0x11, 0x8d, 0x71, 0x9c, 0x5a, 0xd9, 0x16, 0xd5, 0x2f, 0x79, 0x6b, 0x11, 0x2d, 0xb3, 0x19, 0xd9, 0xf1, 0x75, 0x5e, + 0xfa, 0xae, 0x0d, 0xf9, 0x31, 0xc8, 0xef, 0x77, 0x3e, 0xe4, 0x85, 0xcc, 0xe7, 0x77, 0x9a, 0x87, 0xef, 0x3a, 0x1d, 0x1d, 0xb7, 0x07, 0x9f, 0x64, 0x39, 0x43, 0x5d, 0xc6, 0x58, 0x4e, 0x00, 0x3c, + 0x21, 0xc5, 0xad, 0x6f, 0x67, 0x9a, 0xbe, 0x1b, 0xac, 0xa1, 0x0e, 0x13, 0xa9, 0x2e, 0x6a, 0xad, 0xbe, 0xfb, 0x51, 0x6e, 0x60, 0x66, 0x5f, 0x21, 0xf5, 0xbe, 0x66, 0x10, 0xfd, 0x22, 0x7b, 0xf8, + 0xb4, 0x8f, 0x46, 0x5b, 0x83, 0xa8, 0x12, 0xf4, 0x3c, 0xdd, 0x30, 0xf0, 0x48, 0x51, 0xf8, 0x62, 0xec, 0xeb, 0x8e, 0xbf, 0x1b, 0xc0, 0x86, 0xb5, 0x9d, 0x38, 0xc4, 0x04, 0xe6, 0x98, 0x71, 0x8f, + 0xa9, 0xfc, 0x0e, 0xac, 0x6a, 0x33, 0xd9, 0x06, 0x83, 0xac, 0x92, 0x46, 0xd6, 0x94, 0xaa, 0xa5, 0x0d, 0xe2, 0x4d, 0x6c, 0x28, 0x96, 0xb1, 0xb5, 0x95, 0xe7, 0x8b, 0xb1, 0xa8, 0x14, 0x9c, 0xbe, + 0x8d, 0x68, 0x64, 0xc8, 0xd6, 0xf1, 0x7a, 0xe7, 0x7f, 0xa7, 0xb6, 0x55, 0x2b, 0xeb, 0xc5, 0x0d, 0xeb, 0xae, 0x9f, 0x16, 0x0f, 0x18, 0x47, 0x1c, 0x41, 0x68, 0xbf, 0xcf, 0xb8, 0x13, 0xd1, 0x23, + 0xdb, 0x4e, 0x87, 0xdd, 0x23, 0xa5, 0xe7, 0x4c, 0x6b, 0x44, 0x79, 0x0a, 0x72, 0xa5, 0x1d, 0x62, 0xe9, 0xb6, 0xd9, 0xc4, 0x3c, 0x58, 0x23, 0xf3, 0x05, 0xd8, 0xcb, 0x04, 0x0e, 0x27, 0x4c, 0x56, + 0x95, 0xbc, 0x1e, 0x09, 0x62, 0x9e, 0xcf, 0xf5, 0x58, 0x3c, 0x5e, 0xa8, 0x86, 0x95, 0xba, 0x4b, 0xbd, 0x69, 0xf8, 0xd1, 0x70, 0xab, 0x02, 0x7b, 0x7d, 0x83, 0x06, 0xe3, 0xb9, 0x15, 0xf8, 0x74, + 0x6f, 0x54, 0x4b, 0x40, 0x67, 0x61, 0xf3, 0xe0, 0x1a, 0x2a, 0xa2, 0xe7, 0xe0, 0x81, 0x17, 0x1b, 0x1c, 0x6d, 0x98, 0x16, 0x75, 0xdb, 0x6d, 0xbf, 0xbf, 0xb6, 0x80, 0xfd, 0x4c, 0xfe, 0xc0, 0xc8, + 0x4f, 0x27, 0xdb, 0x2e, 0x5e, 0xc7, 0x09, 0x8c, 0x6d, 0xe9, 0x1c, 0x6f, 0x18, 0x2c, 0x8c, 0x67, 0x8e, 0xcf, 0xaf, 0xb7, 0xec, 0x50, 0x44, 0x00, 0xbb, 0x9e, 0xc3, 0x40, 0x32, 0x65, 0x74, 0x4e, + 0x14, 0xeb, 0xa5, 0x60, 0xa0, 0xa5, 0x16, 0x20, 0xbd, 0xd1, 0x4a, 0x9d, 0xba, 0x94, 0x80, 0xce, 0x84, 0x04, 0x34, 0x85, 0x75, 0x1f, 0x58, 0xee, 0xf6, 0x4d, 0x47, 0xf1, 0x8c, 0x4c, 0xc7, 0x30, + 0xbb, 0x57, 0xd7, 0x4d, 0x47, 0x4e, 0xc0, 0xdf, 0x05, 0xf6, 0x6f, 0xcd, 0x65, 0xdb, 0xdc, 0x77, 0x53, 0x35, 0xb4, 0x1f, 0x29, 0x63, 0xec, 0xa5, 0x28, 0xa6, 0x6b, 0xd2, 0x67, 0xee, 0x7e, 0x9c, + 0x38, 0xfa, 0x13, 0x5b, 0x6c, 0x6c, 0xe0, 0xd8, 0x8c, 0x70, 0x1b, 0x7c, 0x8b, 0xd5, 0x83, 0x14, 0xd2, 0x2b, 0xdd, 0x2e, 0xa5, 0xbd, 0xa6, 0x8d, 0x2b, 0x62, 0xb5, 0x43, 0xec, 0x69, 0x8d, 0x19, + 0x63, 0x23, 0x57, 0xd0, 0x94, 0x29, 0x4d, 0x3e, 0x71, 0x52, 0x63, 0x32, 0xeb, 0xf0, 0x2e, 0x30, 0xda, 0xe3, 0x79, 0xcd, 0x81, 0xe2, 0x40, 0xeb, 0xc0, 0x6c, 0xbf, 0x0e, 0xcd, 0xbe, 0x30, 0x71, + 0xd9, 0x24, 0xa5, 0x98, 0xfe, 0x42, 0xdc, 0x91, 0xd9, 0x33, 0xce, 0x7e, 0x19, 0xd8, 0x1d, 0x16, 0x81, 0xf6, 0x1e, 0x9e, 0x43, 0xbc, 0xb6, 0xe2, 0x69, 0xb7, 0x5d, 0x10, 0x15, 0xfa, 0xe3, 0x7c, + 0xd5, 0x57, 0x90, 0xde, 0x8f, 0x14, 0x8f, 0x82, 0x28, 0x74, 0xa7, 0x6d, 0xc9, 0x8a, 0x0d, 0xbd, 0x27, 0x57, 0x35, 0xb6, 0xe4, 0xf3, 0xe9, 0x62, 0x9e, 0x8f, 0x93, 0x8e, 0x00, 0x22, 0x40, 0xc6, + 0x31, 0xe9, 0xb6, 0xcf, 0x8f, 0xf6, 0x15, 0xa3, 0x27, 0xc5, 0x62, 0x06, 0xeb, 0x28, 0xc2, 0x9b, 0x20, 0x02, 0xf4, 0x32, 0x33, 0xf5, 0x24, 0x7a, 0xdc, 0xe4, 0xde, 0xbc, 0xc1, 0x87, 0xbb, 0x89, + 0xd9, 0xf4, 0x18, 0xc0, 0xf1, 0xcd, 0x9a, 0xda, 0x2e, 0x69, 0x96, 0xaf, 0x2a, 0x65, 0x55, 0xf5, 0xfc, 0xd7, 0x3d, 0x0c, 0x61, 0x14, 0x9f, 0x0d, 0xf8, 0xab, 0xa2, 0xa0, 0x1f, 0x3f, 0xfd, 0x64, + 0x3e, 0x1f, 0x98, 0x7a, 0xe6, 0xe5, 0xd1, 0x86, 0xfe, 0x38, 0xd1, 0x0e, 0xe0, 0x25, 0xcf, 0xba, 0xef, 0xa2, 0xbb, 0x27, 0x89, 0xde, 0x6b, 0xb6, 0xf4, 0x89, 0xe6, 0x41, 0x16, 0xa7, 0xa3, 0x6e, + 0xef, 0xb9, 0x2d, 0x7d, 0x90, 0x86, 0x33, 0xf3, 0x73, 0x42, 0xa1, 0xfa, 0x83, 0xb9, 0xc4, 0x5a, 0x20, 0x22, 0xc0, 0x18, 0x52, 0xe7, 0xbc, 0x8c, 0x18, 0x23, 0x8d, 0x15, 0xd9, 0x94, 0x4a, 0x7a, + 0xc9, 0x78, 0xb4, 0x59, 0xc9, 0xbd, 0xed, 0x48, 0xf6, 0xa1, 0x86, 0xa8, 0xe4, 0xd0, 0x5e, 0xa4, 0xc8, 0x54, 0xc2, 0xf6, 0x41, 0xe1, 0x92, 0x11, 0x4c, 0xa9, 0xfb, 0x6c, 0x2a, 0xee, 0xc7, 0x8d, + 0xa7, 0x5a, 0xfc, 0xca, 0xdd, 0xd0, 0x11, 0x34, 0x7c, 0xe6, 0xa3, 0xfc, 0xc2, 0x01, 0x90, 0x9e, 0xb7, 0x57, 0x6f, 0x82, 0xcd, 0xf4, 0xd4, 0x54, 0x73, 0xb3, 0xfb, 0xbe, 0x01, 0xf3, 0xe3, 0xdf, + 0xef, 0x15, 0xd6, 0xfc, 0xa8, 0x9b, 0x8e, 0xde, 0x6e, 0x12, 0x06, 0xea, 0xce, 0xec, 0x9a, 0x69, 0x1a, 0xa5, 0x3f, 0xee, 0x86, 0x94, 0xdd, 0x4d, 0x04, 0xfb, 0xf1, 0x8f, 0x63, 0x5e, 0x16, 0x71, + 0x79, 0x63, 0xfd, 0x31, 0x5a, 0xda, 0x94, 0x86, 0xfa, 0x25, 0xe9, 0x1f, 0x86, 0x9b, 0xe5, 0xc0, 0x3b, 0xa8, 0xe8, 0xff, 0xfa, 0x74, 0x47, 0x37, 0xd3, 0x53, 0xf7, 0xd4, 0x0f, 0xcf, 0x37, 0xbe, + 0x9f, 0x7a, 0x70, 0x7f, 0x9e, 0xaa, 0x61, 0x16, 0xbb, 0xbe, 0xd9, 0x8d, 0x42, 0xbf, 0xbe, 0xfa, 0xdd, 0xc7, 0xa5, 0xcf, 0x3f, 0x7d, 0xf8, 0x94, 0x5f, 0x31, 0x49, 0xc6, 0x6b, 0x38, 0x5e, 0xf7, + 0xd5, 0x56, 0x6c, 0x9a, 0x29, 0xf3, 0x18, 0x59, 0xbb, 0x8e, 0xcd, 0x5f, 0x6f, 0xf4, 0x9f, 0xff, 0x01, 0xff, 0x24, 0x5a, 0x8d, 0x1e, 0xdf, 0xd5, 0x1e, 0xce, 0xdc, 0xd0, 0x2b, 0xb9, 0xa6, 0x47, + 0x92, 0xc7, 0xa1, 0xe3, 0xbb, 0x5a, 0xf7, 0x44, 0xe4, 0xf9, 0xc8, 0xd9, 0x86, 0x2e, 0x82, 0x89, 0x5c, 0xe3, 0xd9, 0x42, 0x5a, 0x99, 0x65, 0x9d, 0x8d, 0x96, 0x7d, 0x2a, 0xcd, 0x79, 0x26, 0x9e, + 0x95, 0xb5, 0x49, 0x36, 0x6b, 0x00, 0x1c, 0xa0, 0x83, 0x5a, 0x0e, 0x51, 0x64, 0x46, 0x00, 0x44, 0x52, 0x4a, 0xd5, 0xcc, 0xe9, 0xd1, 0xec, 0x6e, 0x64, 0x56, 0x9a, 0x50, 0xf8, 0xeb, 0x30, 0xd7, + 0x5c, 0x3b, 0xd0, 0x97, 0x44, 0x6a, 0x6c, 0x11, 0x5a, 0x8c, 0x7a, 0xd5, 0x7c, 0xf2, 0x7d, 0xf7, 0x72, 0xe6, 0xbb, 0x61, 0xde, 0xd5, 0xa3, 0xd0, 0x72, 0xed, 0xee, 0xb1, 0xd4, 0xbe, 0xfb, 0x55, + 0x3c, 0x13, 0xf9, 0x8a, 0x9a, 0xbf, 0xfb, 0x8c, 0x77, 0x86, 0x7d, 0xbe, 0xd0, 0x3d, 0x3d, 0xe6, 0x39, 0x07, 0xf7, 0xb3, 0xaa, 0x37, 0xb3, 0xc5, 0x19, 0xcf, 0x22, 0x2e, 0x37, 0xdf, 0x07, 0x1c, + 0xc1, 0x6c, 0xd2, 0xce, 0x40, 0x05, 0x16, 0x4d, 0x5a, 0x5a, 0xa3, 0xdc, 0x1b, 0xe6, 0x18, 0x4f, 0xfb, 0x38, 0x64, 0xef, 0xe0, 0x15, 0xcd, 0x02, 0x0c, 0xdd, 0xdb, 0xf5, 0xb7, 0x73, 0xaf, 0xec, + 0xec, 0xeb, 0xf1, 0x0a, 0x4a, 0x57, 0x79, 0xa8, 0xd6, 0xbc, 0x29, 0xac, 0xd6, 0x13, 0x5a, 0x17, 0xb6, 0xa4, 0x02, 0x11, 0x21, 0xf3, 0x4c, 0xf7, 0xdc, 0x19, 0xa4, 0x77, 0x3f, 0x42, 0x77, 0x4c, + 0x7d, 0x77, 0xd6, 0xf0, 0xc7, 0xc6, 0x2b, 0x23, 0x03, 0x6d, 0xbb, 0x95, 0x9f, 0x15, 0xb9, 0xeb, 0x67, 0x0f, 0x67, 0x67, 0xf8, 0xa5, 0xe9, 0xf9, 0x44, 0xf4, 0x28, 0xa8, 0xe3, 0x51, 0xf7, 0x44, + 0xe8, 0xb9, 0x64, 0x82, 0x11, 0xc7, 0x21, 0xee, 0x6a, 0xcb, 0x77, 0x90, 0xd5, 0x10, 0xdf, 0xf3, 0xd8, 0x0e, 0x9c, 0x0d, 0x1c, 0x6e, 0xbe, 0xa2, 0xb9, 0x19, 0xdd, 0x2f, 0x81, 0xce, 0x7c, 0x37, + 0x98, 0xc6, 0xde, 0x7c, 0xb3, 0xdf, 0xef, 0x61, 0x82, 0xe3, 0xe6, 0x74, 0x10, 0x50, 0x38, 0x48, 0xf5, 0x62, 0x7b, 0xba, 0x2a, 0x05, 0x97, 0x64, 0x39, 0x67, 0x2e, 0xcc, 0x06, 0x81, 0x47, 0xcf, + 0x67, 0x4d, 0x06, 0x6f, 0x88, 0x29, 0x34, 0x7d, 0x7d, 0x8e, 0x3e, 0x8f, 0xf9, 0x83, 0xe6, 0x26, 0x5f, 0xa9, 0x14, 0x76, 0xa7, 0x24, 0xc7, 0x77, 0x75, 0x13, 0xf9, 0x13, 0x7c, 0xfb, 0xdf, 0xff, + 0xfb, 0xed, 0x3f, 0xff, 0xe3, 0x0d, 0x39, 0x2c, 0xfe, 0xbb, 0x86, 0x59, 0x7e, 0xb4, 0x91, 0x9b, 0x36, 0x7a, 0xd3, 0xc6, 0x6e, 0xda, 0xf8, 0x9d, 0xb6, 0x66, 0xe6, 0xea, 0xc7, 0x09, 0xe2, 0xe6, + 0x06, 0xe2, 0xfd, 0x86, 0x36, 0x3d, 0xa9, 0x8e, 0xcd, 0x8f, 0xce, 0x7b, 0xdf, 0x13, 0xf2, 0x4a, 0x20, 0xc8, 0x2f, 0xb2, 0x87, 0xee, 0xf4, 0xd1, 0xe8, 0x82, 0xed, 0xc2, 0x42, 0xb6, 0xbe, 0xb9, + 0x8a, 0xf4, 0x5e, 0x51, 0xb1, 0xdb, 0xc4, 0xdb, 0x54, 0x5b, 0x75, 0xb5, 0x54, 0xa8, 0xa0, 0x11, 0xf4, 0xa1, 0x82, 0x91, 0x18, 0x29, 0x51, 0x70, 0x59, 0xee, 0xa1, 0x55, 0x8a, 0xed, 0xc7, 0xba, + 0xbb, 0xdf, 0x8e, 0x67, 0x1d, 0x92, 0x0f, 0x87, 0x8c, 0x3d, 0x8f, 0xfd, 0x15, 0x02, 0x16, 0x19, 0x9e, 0x9b, 0x89, 0xe1, 0x67, 0xbb, 0xa1, 0x55, 0x74, 0x54, 0x13, 0xe5, 0x88, 0xde, 0x34, 0x32, + 0x9f, 0x79, 0xab, 0x1e, 0x77, 0xa8, 0x38, 0x35, 0xfd, 0xc2, 0x30, 0xbb, 0x7e, 0xf6, 0xe3, 0x1c, 0x7f, 0xfe, 0x42, 0xaf, 0x02, 0x7f, 0xb6, 0x34, 0xbc, 0x0f, 0xec, 0xb2, 0xbe, 0x72, 0x9f, 0x92, + 0xaf, 0xcc, 0x5a, 0x67, 0xaa, 0x67, 0x81, 0x58, 0x27, 0x17, 0x2a, 0xd9, 0x66, 0xf2, 0x42, 0x0d, 0xad, 0x19, 0x37, 0x49, 0xe9, 0xe5, 0xb6, 0x2b, 0x60, 0x69, 0x05, 0xed, 0xb0, 0x74, 0x30, 0xca, + 0x69, 0x4a, 0xe4, 0x02, 0xa3, 0x30, 0x1c, 0xb6, 0xa6, 0x07, 0xaa, 0x27, 0x82, 0x90, 0x35, 0xa8, 0x1d, 0x95, 0x1a, 0x3b, 0x59, 0xc4, 0x89, 0x35, 0x5e, 0x13, 0x9d, 0xb1, 0xd8, 0x43, 0xc6, 0x56, + 0x3c, 0xcc, 0x2b, 0xb9, 0xe7, 0x26, 0x2e, 0xb1, 0x63, 0x3a, 0xfb, 0x8a, 0x73, 0xa4, 0x4c, 0x9c, 0x3c, 0x1b, 0xe0, 0xcf, 0x56, 0x31, 0x2d, 0x59, 0x69, 0x1c, 0xe3, 0xb9, 0xbb, 0x79, 0xf4, 0x75, + 0xd8, 0xf3, 0xc1, 0x48, 0xfb, 0x3e, 0x86, 0xeb, 0xbd, 0x07, 0xbc, 0x33, 0xf8, 0xf6, 0xf4, 0x71, 0xc1, 0xd3, 0x02, 0xdf, 0xb5, 0x31, 0x0a, 0x72, 0x2b, 0x88, 0x03, 0xc6, 0x8c, 0x39, 0x6e, 0xde, + 0xd9, 0xca, 0xd3, 0x2d, 0xb5, 0x9e, 0xe5, 0x9b, 0xc2, 0x05, 0xfd, 0x1a, 0x14, 0xf3, 0xc8, 0x59, 0x65, 0x7a, 0xd5, 0x59, 0x05, 0xea, 0xc8, 0xa5, 0x36, 0x4b, 0xd2, 0x49, 0xd7, 0x50, 0x9a, 0x02, + 0xc0, 0x08, 0x5f, 0x77, 0x40, 0xa6, 0x9c, 0x20, 0x53, 0x09, 0xea, 0x2d, 0x7a, 0x44, 0x4f, 0x00, 0x7d, 0x95, 0xb7, 0xb6, 0x64, 0x1a, 0x90, 0x4f, 0x01, 0x7a, 0xbe, 0x5c, 0x70, 0xfe, 0xfa, 0x9a, + 0x1f, 0xff, 0xfe, 0x8d, 0x42, 0x2f, 0x57, 0x4a, 0xf1, 0x1e, 0xcb, 0xd1, 0x9f, 0xf0, 0x0b, 0x29, 0x7c, 0xbf, 0xc8, 0xbe, 0x33, 0xfa, 0xdd, 0x26, 0x3d, 0x52, 0x7b, 0xce, 0xde, 0x75, 0xc7, 0x2c, + 0x7d, 0x79, 0xa4, 0x84, 0xd2, 0x4e, 0x6d, 0xc8, 0xe5, 0x9c, 0x2e, 0xf6, 0x4b, 0xaa, 0x07, 0xd7, 0x0a, 0x3d, 0x8b, 0xf2, 0x14, 0x1b, 0x75, 0x36, 0x8e, 0x44, 0x68, 0x0c, 0xe2, 0x28, 0xab, 0xd0, + 0xd8, 0x63, 0x39, 0x3b, 0x55, 0x21, 0xab, 0xe8, 0xdb, 0xe6, 0xc2, 0xdb, 0x53, 0x8d, 0x00, 0xcd, 0x5d, 0x11, 0x1b, 0x37, 0xa5, 0x6a, 0x8c, 0xb7, 0xcb, 0xb5, 0x69, 0x15, 0x45, 0xa5, 0xf4, 0xe7, + 0x2f, 0x58, 0x11, 0xfa, 0xd9, 0x58, 0x38, 0x1c, 0xfe, 0xaf, 0xcb, 0x2b, 0x99, 0x99, 0x5e, 0x60, 0x81, 0x7e, 0xb4, 0xbf, 0xab, 0x6f, 0xd0, 0x96, 0xb8, 0xcf, 0x45, 0xa8, 0x45, 0xfb, 0x6e, 0x9c, + 0xba, 0x81, 0x9b, 0xbb, 0x5f, 0x14, 0xee, 0x7a, 0x25, 0xee, 0xfa, 0x86, 0x36, 0xd0, 0xbd, 0x3d, 0xd3, 0xa6, 0x80, 0xd1, 0xd1, 0x0b, 0x03, 0xc5, 0x33, 0xbf, 0xcf, 0xf4, 0x1c, 0x0c, 0x5a, 0x47, + 0xa9, 0x59, 0x4f, 0x40, 0x7a, 0x6e, 0xba, 0x86, 0x29, 0x20, 0x02, 0xc3, 0x09, 0x5c, 0xe8, 0xe0, 0x9d, 0x75, 0x8f, 0x07, 0x49, 0x04, 0x81, 0xdc, 0x38, 0xc1, 0x25, 0x72, 0x3a, 0xdc, 0x2a, 0xb2, + 0x9b, 0xcc, 0xf0, 0x10, 0xc8, 0xb5, 0xd1, 0x1e, 0xcd, 0xb0, 0x71, 0xaf, 0x98, 0x3b, 0x7a, 0x6d, 0xe2, 0x74, 0xaa, 0xed, 0xdc, 0x66, 0x47, 0x33, 0x2d, 0x03, 0x79, 0x9f, 0x24, 0x56, 0x3a, 0x6a, + 0xd6, 0xd5, 0x5c, 0xdb, 0x7d, 0x2f, 0x04, 0x7c, 0xff, 0x86, 0xac, 0x0e, 0xb4, 0xc8, 0xff, 0x75, 0xc3, 0xd5, 0xc6, 0x63, 0xe5, 0xb8, 0xba, 0xd3, 0xd5, 0xa2, 0xbd, 0x69, 0x5c, 0xc9, 0xe1, 0x4c, + 0xeb, 0x93, 0xe4, 0x5f, 0xdd, 0x25, 0x69, 0x9d, 0x9e, 0x59, 0x84, 0x86, 0x69, 0x65, 0xaa, 0xf5, 0x78, 0x03, 0xeb, 0x15, 0x44, 0x8d, 0x0f, 0xaa, 0xc7, 0x7e, 0xf0, 0x7e, 0x7c, 0xcc, 0x21, 0x6c, + 0xb1, 0xf9, 0x1d, 0xa6, 0x5b, 0xa5, 0xaa, 0xb6, 0x29, 0x03, 0x2c, 0x81, 0xc9, 0xd6, 0xac, 0xed, 0x49, 0x62, 0xf4, 0xa7, 0xb8, 0xa8, 0x28, 0x10, 0x8f, 0xe3, 0xa3, 0x74, 0x2f, 0x00, 0x0a, 0x11, + 0x8c, 0x13, 0x38, 0x9a, 0xa9, 0x61, 0x24, 0x82, 0x43, 0x28, 0xe4, 0xf7, 0x88, 0x5f, 0x4d, 0x84, 0x02, 0xa7, 0xaa, 0x89, 0x8c, 0xf7, 0x1c, 0xc3, 0xdd, 0xab, 0x43, 0x69, 0x5a, 0x44, 0x72, 0x26, + 0x78, 0x03, 0x0c, 0xe8, 0xc3, 0xcf, 0xa6, 0xa0, 0xaf, 0x36, 0xbf, 0xcf, 0x89, 0x6e, 0x70, 0xeb, 0x71, 0x76, 0xfe, 0xfa, 0xab, 0xd3, 0x67, 0x42, 0xf7, 0xd9, 0x8c, 0xff, 0xfc, 0x3e, 0x8c, 0xcc, + 0x91, 0x22, 0xd0, 0x3d, 0xfd, 0xef, 0x1e, 0x69, 0x3c, 0x67, 0xaf, 0xd6, 0x27, 0x06, 0x7e, 0x6a, 0x4c, 0xd4, 0x49, 0x38, 0xd3, 0xa8, 0x59, 0x07, 0x1a, 0x44, 0xb9, 0x5c, 0x26, 0x4a, 0xa6, 0x21, + 0xa6, 0xee, 0x63, 0x95, 0x8b, 0xd3, 0x96, 0x8b, 0xd3, 0x93, 0xe5, 0x4a, 0x17, 0xa3, 0x2a, 0xc6, 0xf5, 0x32, 0x8b, 0x6d, 0xd0, 0xdb, 0x36, 0xe1, 0x7c, 0xc9, 0x31, 0x5e, 0x00, 0x0c, 0x08, 0xca, + 0xb0, 0x87, 0xf4, 0xda, 0xa4, 0x66, 0x6b, 0x41, 0xd4, 0x39, 0x36, 0x1b, 0x09, 0xaf, 0xb3, 0x37, 0xc8, 0x7e, 0x7c, 0x00, 0xd1, 0xb6, 0x61, 0xad, 0x9b, 0x14, 0x66, 0xf7, 0xcb, 0xed, 0xa1, 0xd7, + 0x40, 0x6d, 0xaf, 0x28, 0x1f, 0xbb, 0xed, 0x45, 0xbb, 0x2d, 0xa0, 0x6d, 0x21, 0xaa, 0xa6, 0x9b, 0x0e, 0x66, 0x65, 0xac, 0x6c, 0x16, 0x76, 0x53, 0x65, 0x33, 0x36, 0x5f, 0xc1, 0xcd, 0x7a, 0xb1, + 0x4c, 0x43, 0x80, 0xe4, 0xb1, 0x04, 0x18, 0x9b, 0x7b, 0x25, 0x18, 0x81, 0xe6, 0x08, 0x5f, 0x50, 0x04, 0xd2, 0x0f, 0x28, 0x0a, 0x5b, 0xa1, 0x6c, 0x35, 0x9d, 0x2f, 0xf7, 0x12, 0xa5, 0x64, 0x3d, + 0x6c, 0x49, 0x6d, 0x79, 0x31, 0x31, 0xf9, 0x68, 0x36, 0x13, 0xa7, 0x98, 0xad, 0x58, 0xbf, 0x11, 0x1b, 0xaf, 0xa7, 0x75, 0x9c, 0x47, 0xdd, 0x54, 0x0d, 0x8d, 0xcf, 0x61, 0xc9, 0x2f, 0x78, 0x93, + 0xdb, 0x08, 0x28, 0x36, 0xd4, 0xdc, 0xec, 0x86, 0x51, 0xee, 0x5a, 0x8f, 0xfd, 0x0d, 0xe8, 0x15, 0x84, 0x45, 0x6b, 0x11, 0x5d, 0xd3, 0x3e, 0x08, 0xe9, 0xfa, 0x4c, 0xf7, 0x48, 0xf7, 0xb9, 0x98, + 0x64, 0xdf, 0xc0, 0x15, 0x70, 0x5e, 0xf7, 0x65, 0x96, 0xc6, 0xf5, 0xdd, 0xd8, 0xb3, 0x2c, 0x76, 0xba, 0x98, 0x06, 0xa3, 0xad, 0x07, 0xd9, 0x82, 0x39, 0x20, 0xd4, 0xf9, 0xb4, 0x41, 0x05, 0xb6, + 0xb3, 0x15, 0x76, 0x81, 0xbb, 0xa7, 0xb7, 0xa8, 0xb7, 0x0a, 0xed, 0x94, 0xdd, 0x8a, 0x72, 0x43, 0x54, 0x33, 0x8e, 0x0e, 0xf2, 0x88, 0x41, 0x85, 0x90, 0x56, 0x61, 0x2a, 0x2c, 0x88, 0xf9, 0x82, + 0x73, 0x72, 0xe0, 0xf5, 0x21, 0x70, 0x98, 0x0f, 0x8e, 0x6c, 0xf9, 0x9c, 0x37, 0x70, 0x84, 0xc3, 0xfb, 0x71, 0x37, 0x66, 0xed, 0xe4, 0x97, 0x38, 0xa3, 0x81, 0x9f, 0x62, 0xa2, 0xa0, 0xdb, 0xd9, + 0xa8, 0x56, 0xd3, 0xf0, 0x5d, 0xe2, 0x37, 0x3e, 0x51, 0x37, 0x38, 0x22, 0x4c, 0xf9, 0x6a, 0x53, 0x3f, 0xb8, 0x21, 0xeb, 0xea, 0xee, 0x45, 0x6f, 0xb9, 0xbe, 0xe4, 0x86, 0x59, 0xae, 0xfa, 0xbe, + 0x69, 0x74, 0x6d, 0x3f, 0xd2, 0x54, 0xff, 0xe4, 0x6b, 0xfc, 0x07, 0x78, 0x9b, 0xd0, 0xeb, 0x66, 0xdd, 0x30, 0x0e, 0x7e, 0xfc, 0xfb, 0xbd, 0xb4, 0x09, 0xf7, 0xf4, 0x7e, 0xef, 0x14, 0x3e, 0x7e, + 0x7f, 0x75, 0x8f, 0xaf, 0x1e, 0x13, 0xb8, 0x2e, 0xfa, 0xce, 0x3f, 0xb0, 0x5b, 0x3a, 0x71, 0x11, 0xab, 0x1f, 0x2f, 0x7a, 0xed, 0xbe, 0xbd, 0x2a, 0x11, 0x70, 0x27, 0xc2, 0x7f, 0x6f, 0xd8, 0x5d, + 0x4d, 0xcd, 0x4c, 0xc3, 0x4d, 0x2f, 0xde, 0xf1, 0xf5, 0x81, 0xf1, 0xf1, 0x8b, 0x6f, 0x4e, 0xdc, 0xb5, 0x19, 0x05, 0x6a, 0x78, 0xdb, 0x9f, 0xbf, 0x05, 0x7e, 0x78, 0x3b, 0x3a, 0xae, 0x2e, 0x9e, + 0xfb, 0xd1, 0xfd, 0xf5, 0xd0, 0x2b, 0xfa, 0xf2, 0x04, 0xd4, 0xd8, 0x3d, 0xfd, 0x6f, 0x1b, 0xf8, 0x8c, 0x32, 0x08, 0x8d, 0x6f, 0x2c, 0x14, 0xe2, 0xa6, 0xf2, 0x7c, 0x68, 0x64, 0x4d, 0xc0, 0x24, + 0x42, 0x9f, 0x4d, 0xb0, 0xf5, 0x1a, 0x28, 0x04, 0x8a, 0x86, 0x09, 0x64, 0x32, 0xe6, 0x83, 0x69, 0x07, 0xf1, 0x28, 0xdf, 0x21, 0xb7, 0x68, 0xc2, 0xe4, 0x46, 0x6e, 0xf7, 0xe7, 0x88, 0xb5, 0xcf, + 0x35, 0x7e, 0x20, 0x34, 0x8b, 0x3d, 0x0c, 0x4b, 0x86, 0x13, 0x32, 0xfa, 0xa4, 0x2c, 0xe0, 0x02, 0xb2, 0xd6, 0xbf, 0x91, 0xba, 0xf8, 0x19, 0x44, 0xf3, 0x66, 0x0c, 0x7c, 0xca, 0x7b, 0x3b, 0x55, + 0x0c, 0xfb, 0x9d, 0x1e, 0xf2, 0x85, 0x00, 0xcf, 0xa9, 0x21, 0xf7, 0x35, 0xe6, 0x2b, 0xce, 0x99, 0x13, 0xc9, 0x83, 0xa2, 0x3c, 0x1e, 0x74, 0xd1, 0x76, 0x4e, 0x19, 0x1a, 0xac, 0xe7, 0xcb, 0x46, + 0x36, 0x56, 0xfd, 0x7e, 0xd8, 0x0b, 0x3b, 0x43, 0xb4, 0xc3, 0x3a, 0x68, 0x3d, 0x66, 0x72, 0x41, 0xd2, 0xd5, 0x49, 0x16, 0xc8, 0x34, 0x93, 0x2d, 0x17, 0x2c, 0x69, 0x03, 0x53, 0xd3, 0xe3, 0xe8, + 0xc8, 0xe0, 0x25, 0x78, 0x3c, 0xb2, 0x44, 0x44, 0x13, 0x08, 0x6f, 0x95, 0xcd, 0xb7, 0xa1, 0x11, 0xc5, 0x4b, 0x62, 0x3a, 0xde, 0x6e, 0x0c, 0x39, 0xd1, 0x21, 0xcb, 0x0b, 0xd6, 0x78, 0x4b, 0x90, + 0xc4, 0xb8, 0x08, 0x6b, 0xfd, 0x9d, 0x6f, 0xef, 0x4a, 0xa9, 0x0d, 0xeb, 0xfc, 0xf7, 0xba, 0x32, 0xbe, 0xfa, 0x67, 0xd1, 0xd4, 0xaf, 0x28, 0x1f, 0x19, 0x79, 0xd1, 0x6e, 0xd3, 0xed, 0xa1, 0xee, + 0x30, 0xdd, 0x72, 0x00, 0x65, 0x69, 0x28, 0x6c, 0x64, 0xec, 0x3e, 0x50, 0x86, 0x88, 0xed, 0x41, 0x3e, 0x85, 0xd7, 0xd5, 0x7d, 0x84, 0xb8, 0x36, 0x4c, 0x4a, 0x8f, 0x97, 0xba, 0x87, 0x17, 0xff, + 0xf1, 0xfa, 0x84, 0xde, 0x06, 0x82, 0xa4, 0xc8, 0xdd, 0x47, 0x48, 0xea, 0xe0, 0x4f, 0xe8, 0x95, 0x65, 0xfd, 0x81, 0xe2, 0x81, 0x93, 0xb9, 0xeb, 0x77, 0x4f, 0x24, 0x9e, 0xf7, 0x48, 0x6d, 0xaf, + 0xf4, 0x92, 0x7c, 0xe1, 0xb3, 0xab, 0xcd, 0x62, 0x5a, 0xf7, 0x24, 0xb5, 0xb7, 0xb5, 0x77, 0x10, 0xb4, 0x5b, 0x64, 0x7e, 0x5c, 0x28, 0x95, 0xba, 0xef, 0xdb, 0x68, 0x26, 0x8e, 0x19, 0x0f, 0x1f, + 0xf2, 0x85, 0xce, 0xa8, 0x1a, 0x3c, 0xd9, 0x87, 0xa3, 0xaa, 0x16, 0x97, 0xfd, 0x78, 0x24, 0xe4, 0x1c, 0x24, 0x78, 0x91, 0xe4, 0x6e, 0x24, 0x9c, 0x71, 0x57, 0x82, 0x22, 0x6b, 0x8b, 0x74, 0xda, + 0x59, 0xb4, 0x5c, 0x15, 0x5e, 0x46, 0x8b, 0xfe, 0xe3, 0x0e, 0x8a, 0x40, 0x57, 0x4d, 0xed, 0xe2, 0x8c, 0xcd, 0x72, 0x5a, 0xc9, 0xdd, 0xc6, 0x93, 0xda, 0x66, 0x68, 0xa6, 0x6a, 0x1e, 0xa5, 0xdd, + 0x73, 0x40, 0xeb, 0xc7, 0xad, 0xc4, 0xcd, 0xad, 0x47, 0x17, 0x4c, 0xf7, 0xd2, 0x07, 0x73, 0x83, 0xf6, 0x75, 0x93, 0x6f, 0xfd, 0x0f, 0xec, 0x36, 0xa2, 0xf6, 0xb4, 0xc8, 0xbc, 0x47, 0xa7, 0x0d, + 0x9a, 0xe8, 0x27, 0x24, 0x82, 0x3f, 0xe8, 0x23, 0xb8, 0x22, 0x7d, 0xee, 0x02, 0x1f, 0x27, 0xda, 0x78, 0x08, 0xa0, 0xee, 0x5c, 0x82, 0xc4, 0xda, 0x8a, 0x2b, 0x24, 0x14, 0x42, 0xb9, 0x2c, 0x17, + 0x10, 0xc7, 0x4d, 0xec, 0x15, 0xab, 0x32, 0x02, 0xf9, 0xcd, 0x1d, 0xb2, 0xa2, 0x70, 0x8d, 0x07, 0xdf, 0x47, 0x5e, 0x99, 0x31, 0xad, 0xbf, 0xaf, 0x70, 0x8d, 0xc3, 0x57, 0x15, 0xae, 0xd1, 0x3d, + 0x52, 0x78, 0xde, 0xaf, 0x87, 0xd3, 0x60, 0x9e, 0x76, 0x86, 0xc1, 0x66, 0x30, 0x66, 0xc9, 0xc2, 0x51, 0x4a, 0xbc, 0x0f, 0x6b, 0x4b, 0x7b, 0xb0, 0xde, 0x66, 0xa3, 0x1d, 0x48, 0xee, 0x06, 0x44, + 0x30, 0xf3, 0x53, 0x5a, 0x1b, 0x98, 0x1d, 0x1d, 0x49, 0x7b, 0xb1, 0xa7, 0x9b, 0xeb, 0x99, 0x5d, 0xc4, 0x63, 0x4b, 0x1c, 0x3b, 0x3a, 0x5a, 0xef, 0x31, 0x6c, 0x84, 0xf7, 0xa6, 0x5b, 0x4a, 0x4c, + 0x57, 0xea, 0xa2, 0x28, 0x7a, 0xe6, 0x38, 0xbc, 0x06, 0x9c, 0xfb, 0xe4, 0x90, 0x7a, 0xff, 0xec, 0x8f, 0x9d, 0xde, 0x13, 0x1f, 0x5a, 0x74, 0x8c, 0xc3, 0x67, 0x7d, 0x55, 0x2e, 0x0c, 0x7a, 0x29, + 0x54, 0xe4, 0x17, 0xd9, 0x33, 0xeb, 0x4e, 0xea, 0x15, 0x6a, 0x17, 0x34, 0x32, 0x35, 0x82, 0xed, 0x9e, 0x22, 0x53, 0x26, 0x93, 0x08, 0x39, 0x16, 0xd7, 0x1a, 0xb7, 0x98, 0xec, 0xc4, 0x66, 0x59, + 0xc1, 0xe3, 0xce, 0x02, 0xdb, 0x64, 0x9a, 0xc0, 0x84, 0xfd, 0x7c, 0xbc, 0x59, 0x48, 0x6a, 0x94, 0x89, 0x94, 0xbe, 0xc9, 0x87, 0xc5, 0x18, 0x90, 0x39, 0x68, 0xe9, 0x35, 0xab, 0x31, 0x1e, 0x6a, + 0x3b, 0xdb, 0x4d, 0x06, 0xb5, 0x43, 0xda, 0x9b, 0xd0, 0xb6, 0xf4, 0x92, 0xa4, 0x32, 0xa3, 0xf7, 0x75, 0x55, 0xd5, 0x92, 0xec, 0xea, 0x51, 0x70, 0xdc, 0x63, 0x3f, 0x57, 0xc8, 0xba, 0xbf, 0x0c, + 0x7d, 0xa5, 0x16, 0xcf, 0x2d, 0x71, 0xa0, 0xfb, 0xe9, 0xd4, 0x31, 0x1e, 0xb3, 0x05, 0x6b, 0x7c, 0xd2, 0xef, 0x0f, 0x02, 0x5e, 0xe7, 0x65, 0xc5, 0x41, 0x43, 0xad, 0x08, 0x45, 0xa5, 0x94, 0xfa, + 0x13, 0x1d, 0x8b, 0x4b, 0xa2, 0x33, 0xef, 0x57, 0x2a, 0x99, 0x00, 0xbc, 0xb1, 0xda, 0x93, 0x05, 0xe1, 0x67, 0x9b, 0x72, 0xc6, 0x70, 0x41, 0x1c, 0x19, 0x13, 0x6a, 0x22, 0x56, 0x3b, 0xca, 0x99, + 0xf4, 0x01, 0xc0, 0x18, 0xca, 0x28, 0xc9, 0x15, 0xe3, 0x41, 0xe0, 0xe5, 0x06, 0x3a, 0x5f, 0xbb, 0x4c, 0xfa, 0xed, 0xdc, 0xbd, 0xa3, 0x36, 0xfa, 0x62, 0xa5, 0xfe, 0x7d, 0x35, 0x72, 0xa4, 0x08, + 0x74, 0x4f, 0xff, 0x8f, 0x2b, 0xf3, 0x16, 0x6e, 0x45, 0x9a, 0x1f, 0x23, 0x4b, 0x1f, 0x5a, 0x6e, 0x90, 0x59, 0xe9, 0x13, 0xa0, 0x8f, 0xd4, 0x09, 0x22, 0xe3, 0xa8, 0xdb, 0x51, 0xab, 0xb8, 0xda, + 0x26, 0x19, 0x4b, 0xcb, 0x9b, 0xdd, 0x2e, 0x11, 0xf2, 0x50, 0xdb, 0xda, 0xa9, 0xc0, 0x74, 0x6a, 0x8f, 0x48, 0x9d, 0x0d, 0xb8, 0x2b, 0x06, 0xcc, 0xbe, 0x99, 0xa8, 0xf2, 0x96, 0xf5, 0x06, 0x1b, + 0x2c, 0xb2, 0xd5, 0x98, 0x13, 0x85, 0x01, 0x27, 0x0a, 0x9e, 0xab, 0xbd, 0xbe, 0xe4, 0x73, 0x33, 0x73, 0x6f, 0x7e, 0x35, 0x73, 0xdf, 0x0d, 0x2e, 0xea, 0x9e, 0x99, 0xf9, 0x11, 0x5d, 0xf4, 0x7e, + 0xe6, 0xd3, 0xcf, 0x9f, 0xed, 0x50, 0xb5, 0xb1, 0x47, 0x1f, 0x39, 0x2b, 0xff, 0xdc, 0x84, 0x70, 0xf7, 0x09, 0x1f, 0x92, 0xbd, 0x39, 0xdf, 0x66, 0x7a, 0x38, 0x9a, 0x0a, 0x95, 0x62, 0x94, 0x20, + 0xc5, 0xf1, 0x71, 0xec, 0x0f, 0x65, 0x98, 0x53, 0xe6, 0x5b, 0x7c, 0x59, 0xd6, 0x85, 0x48, 0x44, 0x9e, 0x97, 0x12, 0x7e, 0xb5, 0xb3, 0xf1, 0xc0, 0x07, 0xd3, 0x68, 0x5c, 0xf7, 0x64, 0xb3, 0x58, + 0xa4, 0xc4, 0x64, 0x81, 0x10, 0x70, 0xe2, 0x8b, 0x1b, 0x88, 0x5c, 0x49, 0x72, 0x63, 0xcb, 0x5c, 0xaf, 0x71, 0x59, 0xdd, 0x4c, 0x37, 0x89, 0x32, 0x0d, 0x06, 0x61, 0x6f, 0xdd, 0x16, 0xe1, 0xdb, + 0x3d, 0x3b, 0x88, 0x3f, 0xa6, 0xf7, 0xdb, 0xc5, 0xb0, 0x16, 0x45, 0xbe, 0xa9, 0x86, 0xdd, 0x53, 0xa2, 0xc8, 0xc7, 0xcc, 0x7c, 0xbb, 0x2e, 0x3e, 0x45, 0xfe, 0x5d, 0xdf, 0xf5, 0xd9, 0xac, 0xb8, + 0xf0, 0xe8, 0x7c, 0xca, 0x53, 0x71, 0xcf, 0xae, 0xe8, 0x1f, 0xbf, 0x3c, 0xd1, 0x9f, 0xba, 0xc9, 0x37, 0x57, 0xa9, 0xdf, 0x77, 0x2f, 0xdf, 0xb3, 0x45, 0x1e, 0xcd, 0x1d, 0xdf, 0x47, 0xb6, 0xfa, + 0x44, 0xfd, 0xa3, 0xef, 0x5c, 0x9c, 0x3b, 0xce, 0x24, 0x2d, 0xd0, 0xad, 0x4a, 0x6f, 0xaf, 0xd2, 0x68, 0x68, 0x31, 0x49, 0xc5, 0x8d, 0xc1, 0x2a, 0x23, 0x2a, 0x25, 0xde, 0x8f, 0x7d, 0xc3, 0x84, + 0xb6, 0x29, 0xbf, 0xc5, 0x0a, 0x1a, 0x54, 0xbc, 0xd8, 0xca, 0x1c, 0x3b, 0x50, 0xe3, 0x89, 0xc0, 0x10, 0xde, 0x64, 0xe3, 0x28, 0xe3, 0x4e, 0xbd, 0x8c, 0x26, 0xcb, 0x44, 0x1d, 0xd2, 0xf5, 0x10, + 0x34, 0x45, 0x5a, 0x97, 0xf7, 0x9a, 0x17, 0xf4, 0x9b, 0x68, 0x3e, 0x23, 0xfa, 0xd6, 0xa0, 0xa5, 0x89, 0xa9, 0x96, 0xaa, 0xeb, 0x1f, 0x83, 0x81, 0x2f, 0x5e, 0x3c, 0xbb, 0x2f, 0xd8, 0x27, 0x9b, + 0x14, 0x77, 0xc1, 0x60, 0xaf, 0x08, 0x58, 0x51, 0x7a, 0x4e, 0xb8, 0x3a, 0x6a, 0x9f, 0xab, 0x8b, 0x8e, 0x9a, 0x75, 0xf3, 0xe8, 0xd4, 0xb1, 0x72, 0xf5, 0x57, 0xdf, 0xba, 0xed, 0xa0, 0xf7, 0xcc, + 0x4b, 0xe2, 0xfb, 0x7a, 0xe8, 0x5f, 0x83, 0x35, 0x5b, 0xb9, 0x86, 0x99, 0xe5, 0x5d, 0xdf, 0x0d, 0x1f, 0xe9, 0xb3, 0xd7, 0xc2, 0x5e, 0x2f, 0xe8, 0x1e, 0x7a, 0xe2, 0xaf, 0x56, 0xdb, 0x10, 0x58, + 0x31, 0x0b, 0xa2, 0xad, 0xea, 0x67, 0x9b, 0x35, 0x23, 0xb0, 0x45, 0xbc, 0x57, 0xb0, 0x39, 0x48, 0xee, 0xd4, 0x9e, 0xe5, 0x2b, 0x9e, 0xe7, 0xf2, 0xe5, 0x68, 0x4d, 0x6d, 0xe4, 0x29, 0x97, 0xbb, + 0x9c, 0x40, 0x16, 0x5e, 0xae, 0x6c, 0xd2, 0x9e, 0x3e, 0xb7, 0x2c, 0x75, 0xd7, 0x29, 0x16, 0x03, 0x94, 0xec, 0x4c, 0x35, 0x72, 0xaa, 0xa9, 0xfe, 0x36, 0xae, 0x6a, 0x73, 0xe5, 0xd6, 0x0c, 0x83, + 0x4b, 0x43, 0xfb, 0x75, 0xff, 0xc8, 0x1d, 0x5c, 0x93, 0x57, 0x96, 0x99, 0xad, 0x26, 0x9b, 0x0b, 0xd6, 0x5d, 0x5d, 0xf8, 0x1b, 0x7b, 0xe2, 0xbf, 0x85, 0xcd, 0x7f, 0x23, 0x50, 0x7c, 0x6d, 0xc5, + 0x3e, 0xe2, 0xdb, 0xdf, 0x38, 0x14, 0xff, 0x02, 0x1c, 0x8a, 0x87, 0xd2, 0x68, 0x09, 0xa0, 0xf0, 0x7d, 0x11, 0x3c, 0x03, 0x50, 0x68, 0xc3, 0xec, 0x55, 0x83, 0x4d, 0x98, 0x4e, 0x6e, 0x27, 0x79, + 0xc1, 0x78, 0x82, 0x53, 0x8d, 0x6d, 0xac, 0x18, 0xae, 0xd7, 0x88, 0x91, 0x27, 0x4a, 0xaf, 0x96, 0x26, 0xbe, 0xb2, 0xb6, 0x12, 0x74, 0x0c, 0x42, 0x00, 0x87, 0xcd, 0x54, 0x0f, 0x5b, 0x8d, 0x3c, + 0x62, 0x5d, 0xa7, 0xd2, 0x74, 0x52, 0x36, 0x6a, 0xb5, 0x58, 0xfb, 0x5c, 0x3c, 0xd5, 0xa8, 0x58, 0xb3, 0x18, 0x70, 0x60, 0xe0, 0xf5, 0x44, 0xef, 0x40, 0xe6, 0x33, 0x66, 0xff, 0x1f, 0x07, 0xa0, + 0xf0, 0xa5, 0xe8, 0xff, 0x86, 0x51, 0x78, 0xfb, 0x5a, 0xe8, 0xff, 0x6d, 0x30, 0x0a, 0x55, 0x94, 0x1a, 0xdd, 0x2a, 0x7d, 0x58, 0x92, 0x08, 0xfa, 0x09, 0xbf, 0xb0, 0x01, 0xfc, 0x41, 0xf5, 0x60, + 0x5d, 0x9d, 0x8f, 0x8f, 0xb5, 0x1d, 0x5a, 0x6c, 0xfa, 0x8e, 0x1a, 0x20, 0x48, 0xc5, 0xca, 0xcd, 0xc5, 0xb9, 0x03, 0x8c, 0x56, 0x54, 0x2e, 0x00, 0xeb, 0x25, 0x80, 0xad, 0x47, 0x9d, 0xda, 0x66, + 0x70, 0x66, 0x4d, 0x04, 0x32, 0xa7, 0x50, 0xf9, 0x68, 0x9a, 0x6a, 0x19, 0xb9, 0x22, 0xfc, 0x72, 0xb6, 0xc0, 0xf7, 0x16, 0x31, 0x98, 0x70, 0xc2, 0x10, 0x2c, 0x36, 0x10, 0x37, 0xe9, 0xfb, 0xe0, + 0x88, 0x00, 0x21, 0x1b, 0x51, 0xd8, 0x22, 0xeb, 0x04, 0xc5, 0x00, 0x2b, 0x9f, 0x45, 0xdb, 0xfd, 0x29, 0x60, 0xeb, 0xc3, 0x87, 0xc6, 0x8f, 0x17, 0x4f, 0x2f, 0x2d, 0xbe, 0x8f, 0x24, 0x0f, 0x9c, + 0x3c, 0x1e, 0xb4, 0x59, 0x5e, 0x43, 0xdd, 0x7c, 0x21, 0xf5, 0xbc, 0x86, 0xa0, 0x13, 0x6f, 0xbb, 0x17, 0x77, 0xf2, 0xb0, 0xa4, 0x40, 0x49, 0x2c, 0x04, 0x2e, 0x8f, 0xbf, 0xeb, 0x7d, 0xad, 0x52, + 0x37, 0x37, 0xbb, 0x96, 0xeb, 0x9b, 0xdd, 0x53, 0x5d, 0xac, 0x2f, 0xa6, 0xcc, 0x17, 0x7a, 0xca, 0x2d, 0xf5, 0xe3, 0x77, 0xde, 0x9c, 0x6b, 0x5b, 0x55, 0x92, 0x2a, 0x47, 0x7a, 0xad, 0x60, 0x93, + 0x70, 0x61, 0x25, 0x88, 0x1b, 0x2d, 0x6a, 0x2f, 0xa5, 0x77, 0xa3, 0x5e, 0xbd, 0x41, 0x03, 0x82, 0xaa, 0x77, 0x24, 0xd0, 0x13, 0x6a, 0x80, 0x61, 0x7a, 0x51, 0xc8, 0x99, 0x05, 0xd0, 0x43, 0xad, + 0x2a, 0x15, 0x22, 0xdd, 0x0c, 0xa6, 0xb0, 0x44, 0x4d, 0x86, 0x94, 0x1f, 0x86, 0x8c, 0xd8, 0x51, 0x98, 0x45, 0x47, 0xf1, 0xa8, 0x39, 0x56, 0xa8, 0x10, 0x30, 0x5b, 0x03, 0xcf, 0x7a, 0xce, 0x17, + 0x4e, 0x86, 0xa0, 0x48, 0x83, 0x22, 0x75, 0x4e, 0x45, 0x26, 0x7f, 0xfc, 0x03, 0xfc, 0x09, 0x7d, 0xf2, 0x0c, 0xdc, 0x0d, 0xe4, 0xbc, 0xd4, 0xd7, 0x57, 0x15, 0x3c, 0x4f, 0x0a, 0xfd, 0x6a, 0x19, + 0xf9, 0x20, 0x9e, 0xf6, 0xb4, 0x85, 0x8e, 0xb5, 0xe8, 0xb1, 0xd7, 0x3b, 0xeb, 0xf7, 0x67, 0xe2, 0x57, 0x14, 0xf2, 0x05, 0x5d, 0xa0, 0x7b, 0xd9, 0x6a, 0x03, 0xfd, 0x7f, 0x90, 0xe6, 0x6c, 0x21, + 0x3a, 0x83, 0x09, 0x63, 0x7a, 0x8a, 0xbc, 0x26, 0x1c, 0x0c, 0xa4, 0x23, 0x87, 0x07, 0x7b, 0x83, 0xb4, 0xb7, 0x56, 0xc7, 0xa6, 0x95, 0xc2, 0xbc, 0x40, 0x59, 0xc8, 0x74, 0x10, 0xc4, 0xfd, 0x9d, + 0x37, 0x75, 0x11, 0xd4, 0x94, 0x6b, 0x49, 0xa6, 0xb6, 0xab, 0xa5, 0x37, 0x90, 0x72, 0x65, 0xb2, 0xe4, 0xf4, 0x21, 0x38, 0x80, 0x57, 0xdc, 0xd2, 0xe9, 0x44, 0x19, 0xc3, 0x67, 0xb6, 0xe8, 0x06, + 0xbd, 0x67, 0xd2, 0xfc, 0x03, 0x2a, 0xf5, 0x0c, 0xaa, 0xfe, 0x88, 0x95, 0xdf, 0xd7, 0x00, 0x47, 0x8a, 0x07, 0x26, 0x1e, 0xfe, 0xb7, 0xc5, 0xc8, 0xe5, 0x39, 0x79, 0x05, 0xb9, 0xd4, 0x76, 0xb2, + 0x5d, 0xd9, 0xd4, 0x36, 0xec, 0xad, 0xe6, 0x9e, 0x5b, 0x74, 0x84, 0x8d, 0x53, 0xaf, 0xb6, 0xa3, 0xac, 0xb4, 0x62, 0x22, 0xd0, 0x0b, 0x39, 0xe8, 0x19, 0x8b, 0x15, 0xc7, 0x81, 0x40, 0xdf, 0xcb, + 0xd3, 0x55, 0x35, 0xa4, 0xf6, 0x0c, 0x09, 0x03, 0x41, 0x7f, 0xa3, 0xe5, 0x7c, 0xc6, 0x7a, 0xc3, 0xb1, 0x6a, 0x80, 0xd5, 0x38, 0x8b, 0x0c, 0xb4, 0x49, 0x97, 0xd4, 0xe0, 0x8a, 0x7d, 0x4f, 0x75, + 0x66, 0x9b, 0x6d, 0xcb, 0x5a, 0xf5, 0x7d, 0xf7, 0x4b, 0x6c, 0xe1, 0xef, 0x77, 0xbd, 0x77, 0x9a, 0x40, 0xf7, 0x7c, 0xd4, 0xb6, 0xcb, 0x21, 0x95, 0xc1, 0xba, 0x86, 0x52, 0x27, 0xd8, 0x8c, 0x06, + 0x49, 0x74, 0xcb, 0x0f, 0x16, 0xd8, 0x32, 0x9e, 0x2e, 0xe6, 0x14, 0x52, 0x79, 0x5b, 0xca, 0x1f, 0x6f, 0x04, 0xa7, 0x08, 0xe0, 0xdd, 0x5c, 0x2f, 0x01, 0x14, 0x5a, 0x84, 0xb0, 0x19, 0x48, 0xa0, + 0x51, 0xeb, 0xd2, 0x06, 0x2d, 0x94, 0x2d, 0x6f, 0x7a, 0x15, 0x57, 0xda, 0xf8, 0x20, 0x2b, 0x35, 0xc3, 0x5f, 0xf3, 0x9d, 0xa1, 0x3c, 0xd0, 0x73, 0xe2, 0xeb, 0x4d, 0x8a, 0x3a, 0xfc, 0xc2, 0xb3, + 0xf1, 0xfd, 0xad, 0xad, 0x3a, 0x3c, 0x7c, 0x75, 0x78, 0xf4, 0x63, 0xb4, 0xd8, 0xd6, 0x5a, 0xed, 0xd1, 0xda, 0x66, 0x37, 0x59, 0x01, 0xeb, 0x84, 0x9b, 0x0d, 0x37, 0x26, 0x29, 0x17, 0x90, 0xec, + 0x17, 0x93, 0x20, 0x59, 0x3b, 0xfb, 0x84, 0x83, 0x75, 0x7e, 0x2b, 0x4a, 0x14, 0x46, 0xe9, 0x7d, 0x44, 0xb2, 0x34, 0x56, 0x8c, 0x05, 0xc2, 0x2a, 0x40, 0x99, 0xd4, 0x80, 0x06, 0xc2, 0xe3, 0x2d, + 0x1f, 0x0e, 0xf7, 0x8a, 0x5c, 0x6e, 0x1c, 0x03, 0xb1, 0x1c, 0x5a, 0xee, 0x31, 0x7c, 0xd0, 0xc7, 0x7f, 0x73, 0x8c, 0xdd, 0x26, 0xa9, 0xff, 0xdb, 0x3b, 0xe7, 0xee, 0x6b, 0xda, 0x1f, 0xff, 0xa5, + 0xa9, 0x9a, 0xe9, 0x03, 0x47, 0xc3, 0xd7, 0x4a, 0xd5, 0xe0, 0x91, 0xa7, 0x88, 0xf8, 0x09, 0xc1, 0x3f, 0xa1, 0xef, 0x73, 0xf4, 0x13, 0x7d, 0xa0, 0x7b, 0xd1, 0xe8, 0xbe, 0x93, 0x7d, 0xce, 0x6a, + 0x25, 0x87, 0xea, 0xc8, 0xa0, 0xf7, 0xd0, 0x4a, 0xaf, 0x5d, 0x73, 0x26, 0x2c, 0x76, 0x9b, 0x70, 0x85, 0x3a, 0xb3, 0xc4, 0xa9, 0x12, 0xc2, 0x61, 0x5d, 0x38, 0x1c, 0xf2, 0x10, 0x6f, 0x52, 0xc8, + 0x60, 0xe5, 0x77, 0x12, 0x98, 0x97, 0xf6, 0x10, 0x2e, 0x8c, 0x17, 0xf6, 0x04, 0xec, 0x34, 0x84, 0x11, 0x06, 0x76, 0x39, 0xeb, 0x49, 0xf9, 0xd8, 0x37, 0x8b, 0xc1, 0x92, 0x9d, 0xba, 0xd3, 0x11, + 0x34, 0xd7, 0xc7, 0xcf, 0x2c, 0xcc, 0xf7, 0x6c, 0xdb, 0x1b, 0x5e, 0xbf, 0x7f, 0x92, 0xe3, 0xda, 0x8e, 0xef, 0xda, 0xce, 0x69, 0x66, 0x21, 0x0e, 0x26, 0xce, 0x83, 0x11, 0x7b, 0xfe, 0x81, 0xe9, + 0xc7, 0x66, 0xda, 0x2d, 0x55, 0xdf, 0x35, 0x8e, 0x9b, 0xe4, 0xae, 0x61, 0x86, 0x5f, 0xc6, 0x0f, 0x12, 0x3f, 0xa1, 0x57, 0xc2, 0x61, 0x9e, 0x3f, 0x0f, 0xe8, 0x7e, 0x75, 0xb5, 0x7b, 0x7a, 0xee, + 0x73, 0xa1, 0xac, 0x91, 0x3c, 0x23, 0x1a, 0x61, 0x51, 0x60, 0xbe, 0xe5, 0x56, 0x1b, 0x66, 0xbd, 0x69, 0xe6, 0x0c, 0x3b, 0x16, 0x3b, 0x7e, 0xd8, 0x1f, 0xac, 0x0c, 0x75, 0x6b, 0xe7, 0xeb, 0xd1, + 0xc4, 0xe6, 0x35, 0x28, 0x65, 0x55, 0x0a, 0xf7, 0x84, 0x34, 0xa7, 0x7b, 0x83, 0x60, 0x40, 0xf0, 0x10, 0x69, 0x45, 0xdb, 0xc9, 0x78, 0x40, 0xae, 0x42, 0x80, 0x02, 0x1c, 0x5c, 0x9c, 0x58, 0xac, + 0x14, 0x03, 0x26, 0x34, 0x41, 0xdb, 0x38, 0x2d, 0xee, 0x88, 0xe0, 0x2f, 0xe0, 0xdf, 0x99, 0xfa, 0x81, 0x5b, 0xe7, 0xe3, 0xd6, 0xbc, 0x91, 0x17, 0xfd, 0x69, 0xb5, 0x2f, 0x97, 0xf2, 0x60, 0x2c, + 0x2c, 0x58, 0x95, 0x96, 0x34, 0x6c, 0xc7, 0x30, 0x59, 0x3f, 0x8a, 0x19, 0xc3, 0x5d, 0xb1, 0x59, 0x12, 0xab, 0x79, 0x8c, 0x58, 0x53, 0x7f, 0x8c, 0x76, 0xe0, 0x91, 0xb4, 0xd8, 0x2d, 0x83, 0xc1, + 0x7a, 0x13, 0xae, 0x8b, 0x7a, 0x61, 0x50, 0x7d, 0x6c, 0xb0, 0xe9, 0x27, 0x8b, 0xcd, 0x66, 0x59, 0x82, 0xae, 0x86, 0x23, 0x73, 0x6f, 0x4e, 0x18, 0x4b, 0xda, 0x78, 0xb6, 0x0e, 0xfe, 0xba, 0xc3, + 0x7e, 0xd9, 0xff, 0x8e, 0x5d, 0x18, 0x7d, 0x14, 0x96, 0xf9, 0x29, 0x36, 0xd2, 0xcb, 0xba, 0x79, 0xb4, 0x33, 0xc3, 0x73, 0x44, 0xd9, 0xdd, 0x15, 0x56, 0xdb, 0x90, 0xb4, 0x5f, 0x17, 0x6e, 0x95, + 0xf8, 0x35, 0xda, 0x57, 0x7b, 0x11, 0x5e, 0xd0, 0x3f, 0x3b, 0x3e, 0x4f, 0xad, 0xee, 0x91, 0xe6, 0x95, 0xf8, 0xde, 0x1e, 0x76, 0xef, 0x25, 0xa8, 0x8c, 0xf1, 0x9d, 0x32, 0x37, 0x96, 0x0e, 0x29, + 0xd7, 0x93, 0x0a, 0x59, 0x08, 0x9a, 0x1c, 0x00, 0x45, 0x47, 0x4c, 0xac, 0x8c, 0xda, 0x0f, 0xe2, 0xcd, 0x14, 0x9c, 0x59, 0xbd, 0x2c, 0x21, 0x01, 0xb3, 0x87, 0x6e, 0xf6, 0xfb, 0x69, 0x3c, 0xe3, + 0xf6, 0xbd, 0xe1, 0x1c, 0x1a, 0xfa, 0x75, 0x3f, 0x9f, 0xae, 0x19, 0x71, 0x2a, 0x75, 0xc8, 0x30, 0xf7, 0x93, 0xe1, 0xde, 0x9d, 0xeb, 0x9d, 0x14, 0x4b, 0x2e, 0xbb, 0xf7, 0xdb, 0x7d, 0x31, 0xbe, + 0x3d, 0x14, 0xe5, 0xf1, 0xca, 0x09, 0x30, 0x5e, 0x8f, 0xc2, 0xd2, 0x4c, 0xcf, 0x9b, 0x1f, 0xbd, 0x5f, 0xec, 0x7f, 0xfb, 0xd0, 0x3f, 0x6f, 0x97, 0xc2, 0xb8, 0x10, 0xe7, 0x23, 0x76, 0xc3, 0x37, + 0x80, 0xe0, 0xed, 0xd9, 0x7d, 0x1d, 0x25, 0x79, 0xa4, 0xd3, 0x8e, 0xc5, 0x42, 0xee, 0x76, 0xac, 0x9e, 0x1f, 0x4f, 0x44, 0xbd, 0x1a, 0xa2, 0xf9, 0x66, 0x4d, 0x02, 0xd3, 0x74, 0xb9, 0xcc, 0x87, + 0x90, 0xad, 0xb8, 0x1d, 0x8b, 0x1c, 0x26, 0x7e, 0x4d, 0x19, 0x51, 0x91, 0xaa, 0xbe, 0x3e, 0xdc, 0x0c, 0xa5, 0xcd, 0x10, 0xee, 0x88, 0x76, 0x7f, 0xb4, 0x70, 0xbc, 0x5d, 0x5f, 0xeb, 0x8c, 0x87, + 0x34, 0x9f, 0xf4, 0xb4, 0x42, 0xa9, 0x06, 0xd0, 0x5e, 0xdf, 0x49, 0x2b, 0x34, 0x36, 0x17, 0x57, 0xa5, 0x08, 0xde, 0x5e, 0x62, 0xf1, 0x6d, 0xc4, 0xe4, 0xe7, 0x8e, 0x78, 0xdc, 0x82, 0xd2, 0xd5, + 0xf8, 0x23, 0x74, 0xfe, 0xe8, 0x6e, 0xf8, 0x55, 0xef, 0x18, 0xbb, 0xbd, 0xfb, 0x4e, 0x8c, 0x25, 0x76, 0x0c, 0x9d, 0x78, 0x2e, 0xb6, 0x1b, 0x79, 0x3f, 0x12, 0xdf, 0xa1, 0x17, 0x20, 0xaf, 0x89, + 0xef, 0xf2, 0x09, 0xc7, 0x09, 0xfa, 0xa2, 0xdd, 0x3d, 0xd2, 0x6d, 0x27, 0x4e, 0xc9, 0xa2, 0x56, 0xb9, 0xd1, 0x29, 0x87, 0x06, 0x95, 0x0f, 0x25, 0xbd, 0x4f, 0xf6, 0xfb, 0xb5, 0x9c, 0x43, 0x96, + 0xbc, 0xd9, 0x2f, 0x12, 0xca, 0xe5, 0x60, 0x7d, 0xc1, 0xe0, 0x0d, 0x43, 0x93, 0x22, 0xa2, 0xc7, 0xd9, 0x80, 0xa6, 0xca, 0xf9, 0x3e, 0xee, 0x35, 0x53, 0xd6, 0xc6, 0x59, 0x60, 0x31, 0x1a, 0x4d, + 0x64, 0x6a, 0x49, 0x92, 0x80, 0xda, 0x00, 0xe3, 0x82, 0x61, 0x29, 0x3e, 0x13, 0xd7, 0x1a, 0x6b, 0xff, 0xb6, 0x38, 0x4f, 0xdf, 0x13, 0x9e, 0xac, 0x9b, 0x1f, 0x57, 0x25, 0xe2, 0xde, 0x9e, 0xb0, + 0x3d, 0xbc, 0x36, 0x89, 0xde, 0x3e, 0xf1, 0x1c, 0xfa, 0x2d, 0x9e, 0x87, 0x67, 0x8b, 0xe8, 0xdc, 0x38, 0x6e, 0xe3, 0xb6, 0xe0, 0x36, 0xd4, 0x8d, 0x7b, 0xf4, 0xda, 0xed, 0xb9, 0xba, 0x54, 0x9a, + 0x6b, 0x64, 0x35, 0xae, 0x3d, 0x44, 0x1a, 0x0b, 0x7a, 0xbc, 0x2c, 0xfb, 0xab, 0x87, 0xfc, 0xba, 0xfb, 0xa1, 0x17, 0x75, 0x1d, 0x1e, 0x2b, 0xe2, 0x6b, 0xf5, 0xdf, 0xfe, 0x33, 0xcf, 0xc4, 0x0f, + 0x73, 0xe8, 0xfb, 0xe1, 0x1d, 0xb7, 0xfd, 0xdb, 0xfd, 0x4f, 0xcc, 0x8d, 0xf9, 0x0a, 0xe9, 0xb3, 0x4a, 0xea, 0x4e, 0x36, 0x81, 0x25, 0xb2, 0x96, 0x1f, 0x8d, 0x48, 0xc2, 0x5f, 0x17, 0x25, 0xf8, + 0xbd, 0x4f, 0x7c, 0x58, 0xd8, 0xe3, 0xed, 0xed, 0x76, 0x97, 0x0d, 0x7b, 0xf1, 0x43, 0x9f, 0x15, 0xf8, 0x38, 0x52, 0x7e, 0xfe, 0xd1, 0xc7, 0x51, 0xe4, 0xad, 0xbd, 0xca, 0xd8, 0x8e, 0x73, 0x14, + 0x24, 0x85, 0xb1, 0x4b, 0x25, 0xfd, 0x2d, 0x1a, 0xad, 0xb8, 0xcc, 0x5e, 0xc1, 0x83, 0x84, 0x62, 0x9b, 0x0c, 0x9e, 0xc5, 0xbb, 0x00, 0x55, 0x25, 0x59, 0xf3, 0x82, 0x8e, 0x32, 0xd8, 0x0c, 0xf4, + 0x0d, 0xba, 0xb0, 0x86, 0xe2, 0x32, 0x45, 0x0b, 0x41, 0x54, 0x02, 0x15, 0x34, 0x6b, 0xd4, 0xc2, 0x7c, 0x9b, 0x4f, 0x77, 0x34, 0xa8, 0x6e, 0x41, 0x49, 0xb8, 0x82, 0x13, 0x7b, 0x7b, 0x69, 0x14, + 0x5d, 0xd5, 0xff, 0xb8, 0x2a, 0x06, 0xf8, 0x76, 0x3d, 0x88, 0xfe, 0xed, 0xf2, 0xff, 0x87, 0xc9, 0x66, 0x1e, 0x71, 0x26, 0x80, 0xd3, 0xbf, 0xf4, 0x91, 0x1f, 0x0c, 0x7c, 0xa9, 0x5a, 0xfe, 0x2d, + 0x71, 0xa0, 0xfb, 0x71, 0x78, 0xcc, 0xd0, 0x6f, 0xb1, 0xc0, 0xc0, 0x4a, 0x62, 0xc9, 0x0c, 0x7a, 0xb1, 0xbf, 0x76, 0xca, 0xbd, 0x64, 0x6e, 0xf8, 0x2d, 0xb3, 0x2c, 0x87, 0xe5, 0x84, 0x36, 0x46, + 0x78, 0x3c, 0xc8, 0x8c, 0xd0, 0x87, 0x6d, 0xc0, 0xa0, 0xe2, 0x3c, 0x28, 0x86, 0x83, 0x99, 0x69, 0x48, 0xe8, 0x20, 0x4d, 0xb0, 0x34, 0x63, 0xb2, 0x6d, 0x27, 0x28, 0x29, 0x01, 0x87, 0xc0, 0xb1, + 0x23, 0xaa, 0x53, 0x78, 0x83, 0xad, 0x21, 0x63, 0x3a, 0x0d, 0x19, 0x6e, 0xbf, 0x7b, 0xb6, 0x96, 0xbb, 0x6f, 0xaf, 0x9d, 0x6b, 0x7d, 0xe0, 0xd7, 0x81, 0xc7, 0x47, 0x12, 0xe7, 0x24, 0x3d, 0xf4, + 0x36, 0xc5, 0xc3, 0xcc, 0xe2, 0xd4, 0x34, 0xdf, 0x0d, 0xb9, 0x9b, 0xec, 0x92, 0x53, 0xe6, 0xc9, 0x7b, 0xa0, 0xc5, 0xe7, 0x0c, 0x98, 0x0f, 0xd8, 0xda, 0xa3, 0x1d, 0x77, 0x85, 0x2d, 0xfb, 0x9e, + 0x3e, 0x63, 0xa5, 0xe6, 0xbb, 0x17, 0xee, 0x76, 0x26, 0x3c, 0x18, 0x82, 0xb5, 0x1a, 0x7c, 0x54, 0x96, 0x40, 0x6e, 0x6b, 0xd5, 0x85, 0x6e, 0xa0, 0xe6, 0xba, 0xf3, 0xd1, 0x69, 0xae, 0xbe, 0x27, + 0xbb, 0x5b, 0xf8, 0xf1, 0x9c, 0xc0, 0x72, 0xee, 0x47, 0x17, 0x1c, 0x7c, 0x96, 0xbd, 0xf8, 0x68, 0x5c, 0xa3, 0x37, 0x09, 0x3b, 0xed, 0xbb, 0xd6, 0x75, 0xf2, 0x21, 0xfa, 0x29, 0xde, 0xf5, 0xed, + 0x51, 0x87, 0x32, 0xa2, 0x41, 0x65, 0x94, 0x01, 0x3a, 0xeb, 0x9b, 0x1c, 0xca, 0x21, 0x73, 0x49, 0x84, 0x95, 0x3e, 0x4c, 0xcb, 0x2b, 0x5a, 0xdd, 0x57, 0x3c, 0x35, 0xef, 0x27, 0x4a, 0x20, 0x78, + 0xf9, 0x90, 0x54, 0x31, 0x68, 0x02, 0xcf, 0x35, 0x70, 0x1f, 0xaf, 0xfd, 0x68, 0x38, 0x0f, 0xfb, 0x53, 0xa6, 0x4a, 0xbc, 0xb8, 0x0a, 0xa9, 0x48, 0x8d, 0xd0, 0xd8, 0xf4, 0x45, 0xd2, 0x47, 0xe6, + 0x13, 0xa3, 0x44, 0xec, 0xf9, 0xef, 0x9b, 0x36, 0xe7, 0x44, 0xc4, 0x8b, 0x30, 0xe9, 0xb7, 0x87, 0x73, 0xe0, 0xaf, 0x8e, 0xf3, 0x70, 0x02, 0x84, 0x7f, 0xa2, 0x2f, 0x6a, 0xcc, 0x77, 0xe2, 0x40, + 0xf7, 0x7c, 0xd4, 0x3d, 0x11, 0x6b, 0xc7, 0x5e, 0x7a, 0x33, 0xee, 0x17, 0x4d, 0xc3, 0x94, 0x4c, 0x34, 0xc2, 0x50, 0x71, 0xc4, 0xf5, 0x33, 0x93, 0x51, 0x43, 0xca, 0x19, 0x20, 0x7d, 0x93, 0x89, + 0x52, 0x9b, 0xe1, 0x31, 0x61, 0x89, 0xf3, 0xc2, 0x76, 0xeb, 0xc1, 0x9b, 0x7e, 0x68, 0xf4, 0x56, 0x7d, 0x38, 0x6b, 0x8c, 0x1d, 0x4a, 0x6d, 0x78, 0xcb, 0x33, 0x6c, 0x91, 0xee, 0x6f, 0xf9, 0x95, + 0x1a, 0x6e, 0x65, 0x3d, 0xa6, 0x69, 0x6e, 0xba, 0xd8, 0xb0, 0xd5, 0xef, 0x9b, 0x1a, 0x97, 0x58, 0x17, 0x3f, 0xfe, 0x01, 0x5e, 0xc2, 0xb5, 0xbc, 0x3d, 0x64, 0x73, 0xf0, 0x15, 0x87, 0xe1, 0x9b, + 0xc0, 0xf7, 0xf6, 0x0c, 0x0e, 0x0e, 0xbc, 0x0d, 0xb2, 0x63, 0x79, 0xf7, 0x96, 0xf6, 0x78, 0xc6, 0xee, 0x66, 0xfb, 0xce, 0xda, 0x13, 0xf2, 0x80, 0xc2, 0x85, 0x2d, 0x4c, 0x44, 0x14, 0x3a, 0xa4, + 0x87, 0x03, 0x7e, 0xd8, 0x57, 0x14, 0x74, 0x81, 0x6e, 0x13, 0x93, 0x9d, 0x6e, 0xfb, 0x25, 0x4e, 0xe6, 0xcb, 0x8e, 0xa7, 0x21, 0xe5, 0x0e, 0x98, 0xd7, 0x2a, 0xb7, 0x99, 0x81, 0xb3, 0x25, 0x57, + 0x6f, 0xf2, 0x80, 0x5f, 0x08, 0xa0, 0xd6, 0x51, 0x8d, 0xd5, 0x72, 0x50, 0x6a, 0x19, 0x34, 0x1b, 0xa8, 0x23, 0xf8, 0x8b, 0xa9, 0xe7, 0x2e, 0x3b, 0xee, 0x6b, 0x85, 0xc7, 0xb6, 0x09, 0xf4, 0xe2, + 0xd0, 0xbe, 0xf3, 0x9c, 0x07, 0x65, 0x61, 0x3f, 0xfb, 0x03, 0xdf, 0x1e, 0x71, 0x10, 0xb7, 0x66, 0x7a, 0x67, 0x8e, 0xba, 0x4e, 0x95, 0xcc, 0x70, 0x11, 0x50, 0xc7, 0x25, 0x6c, 0x41, 0xb6, 0x30, + 0x22, 0xfd, 0xe9, 0x3a, 0xdf, 0x48, 0xa3, 0x28, 0xe9, 0xa3, 0x35, 0x87, 0x47, 0x0b, 0x66, 0xbd, 0x8e, 0xf4, 0x22, 0xa0, 0x32, 0xab, 0x9f, 0x78, 0xbb, 0x6d, 0x98, 0xb8, 0xb2, 0xe0, 0x04, 0x42, + 0xb5, 0x00, 0x82, 0xc1, 0x88, 0x8f, 0x89, 0xb5, 0xe9, 0xf8, 0x39, 0x92, 0xf8, 0xb8, 0x3f, 0x70, 0xbf, 0xe8, 0x97, 0xbf, 0x38, 0xf8, 0x6f, 0x97, 0xff, 0x3f, 0xa6, 0x5d, 0x4b, 0xcd, 0x72, 0xd7, + 0xaa, 0x8f, 0x35, 0x8c, 0xde, 0xe3, 0xab, 0xbf, 0x2a, 0xf7, 0xf7, 0x82, 0xb7, 0xe4, 0xde, 0x13, 0xde, 0x8b, 0x26, 0x9d, 0x9b, 0x6d, 0xc3, 0xdc, 0xed, 0xb2, 0x3f, 0x5d, 0x89, 0xf1, 0x36, 0xdb, + 0xa4, 0x63, 0x09, 0xa1, 0x50, 0x75, 0xdb, 0xe7, 0xc7, 0x86, 0xe6, 0xf3, 0x60, 0xce, 0x24, 0x28, 0x4c, 0xb3, 0x00, 0xbc, 0xad, 0x88, 0x68, 0xaf, 0xb9, 0x7e, 0xcf, 0x81, 0xa0, 0x22, 0xaa, 0x20, + 0xb0, 0xc9, 0x17, 0x30, 0x5b, 0x0c, 0xd5, 0x46, 0xa4, 0x2d, 0x4f, 0x4b, 0x33, 0x05, 0x0b, 0xfd, 0x4e, 0x38, 0xf3, 0x31, 0x8f, 0x59, 0x78, 0x1e, 0xb6, 0x5c, 0x5c, 0x39, 0x4d, 0x5a, 0xcc, 0xb8, + 0x0f, 0x60, 0x3e, 0xff, 0x2b, 0x8c, 0x0c, 0xd3, 0x77, 0x35, 0xc0, 0xca, 0x7e, 0x66, 0xba, 0x1a, 0x3e, 0xde, 0xf1, 0x81, 0xaf, 0x76, 0xaa, 0x5a, 0xf3, 0xf1, 0x33, 0x7d, 0xa0, 0x7b, 0xd1, 0x38, + 0x0e, 0xe3, 0x16, 0x39, 0x44, 0x08, 0x62, 0x23, 0xb1, 0x30, 0xd9, 0x21, 0x9a, 0x8d, 0x85, 0x5b, 0x8d, 0x07, 0x3a, 0x7d, 0x19, 0x1f, 0xc3, 0xe6, 0x84, 0x69, 0x14, 0x2a, 0x74, 0xd1, 0xde, 0xcc, + 0x9a, 0x84, 0x3c, 0x66, 0xd9, 0xce, 0x6c, 0x69, 0xdb, 0xb3, 0x92, 0x36, 0x80, 0x78, 0x28, 0x2e, 0xec, 0x49, 0x66, 0x50, 0xf6, 0x26, 0xce, 0x8b, 0x61, 0x41, 0x24, 0x09, 0x30, 0x98, 0x97, 0x53, + 0x79, 0xe8, 0x3b, 0x65, 0xc6, 0x2f, 0xfb, 0xdc, 0xb3, 0x10, 0xf0, 0x07, 0x8e, 0xa7, 0xcb, 0x4f, 0xca, 0xd5, 0xfc, 0xc7, 0x7b, 0x30, 0xfc, 0x95, 0x0d, 0x90, 0x16, 0x61, 0x37, 0x56, 0x53, 0xd5, + 0xf7, 0xcd, 0x73, 0x10, 0x2f, 0xf4, 0xb3, 0xd7, 0x42, 0x06, 0x27, 0x82, 0xf7, 0x05, 0xf0, 0x4a, 0x29, 0xf5, 0x5b, 0xe2, 0xef, 0xdc, 0xcf, 0xd5, 0xfc, 0x18, 0x7d, 0xdf, 0x82, 0xf5, 0x63, 0xd9, + 0x1f, 0x4d, 0x28, 0x50, 0xf7, 0x73, 0xb8, 0xb3, 0xb6, 0x09, 0x4d, 0xd7, 0x93, 0xce, 0xb2, 0x99, 0x1b, 0x93, 0xb2, 0x84, 0x7a, 0x3a, 0x3c, 0x16, 0x13, 0x7a, 0x91, 0x45, 0x53, 0x3e, 0x86, 0x3c, + 0x93, 0xd8, 0x7b, 0x79, 0x4a, 0x4c, 0x60, 0xbc, 0xb3, 0xd9, 0xce, 0x09, 0x58, 0xe8, 0x1b, 0xe5, 0xaa, 0x97, 0x40, 0xc9, 0xb2, 0x19, 0x6f, 0x18, 0xcb, 0x11, 0xac, 0x0e, 0x33, 0x2f, 0xa5, 0xc9, + 0xc3, 0xe2, 0x5f, 0x0f, 0xf9, 0x52, 0x3d, 0x4e, 0x81, 0x3d, 0x4c, 0x03, 0xdf, 0x07, 0x46, 0xbe, 0x25, 0x7e, 0xe2, 0xcb, 0xe1, 0xe8, 0x18, 0x93, 0xd0, 0x02, 0x1f, 0x99, 0xa4, 0xd3, 0x48, 0xcd, + 0xf0, 0x72, 0x99, 0x6f, 0x50, 0x76, 0xbc, 0x5d, 0x52, 0x23, 0x26, 0x1a, 0x20, 0xb0, 0x13, 0x8a, 0xb0, 0x80, 0xd5, 0x3b, 0xbb, 0x1f, 0x6f, 0x58, 0xad, 0xd8, 0x8e, 0x24, 0x08, 0x2b, 0x07, 0x42, + 0x92, 0xc2, 0x48, 0x4c, 0x13, 0xb8, 0x09, 0xb0, 0x8a, 0x2e, 0x67, 0x4a, 0x7f, 0x44, 0xf1, 0x25, 0x06, 0xee, 0x72, 0x03, 0x46, 0x13, 0x67, 0x50, 0x73, 0x29, 0x5e, 0xd1, 0x79, 0xf4, 0xa2, 0xf3, + 0xfe, 0xee, 0x28, 0xbe, 0x19, 0xb2, 0xef, 0x85, 0xd3, 0x92, 0xf7, 0xee, 0x88, 0x3f, 0x8a, 0x5d, 0xf8, 0xaf, 0x4b, 0x94, 0x76, 0xc0, 0xcd, 0x1e, 0xae, 0x69, 0x5e, 0x73, 0x43, 0xdf, 0x50, 0x3f, + 0x05, 0xc2, 0x81, 0x2d, 0xfd, 0xcf, 0x3d, 0x71, 0xb0, 0xec, 0x41, 0x20, 0x23, 0xaa, 0xe3, 0x59, 0x68, 0xcb, 0x21, 0xcf, 0xcf, 0x4c, 0xbb, 0x33, 0xb5, 0x9b, 0x24, 0x73, 0x7b, 0x85, 0x80, 0x06, + 0x0b, 0x2d, 0x5a, 0x61, 0x35, 0x1e, 0x93, 0x0b, 0x8c, 0x69, 0x84, 0xe5, 0x7a, 0x90, 0x4d, 0x94, 0x54, 0xad, 0xdc, 0x0e, 0x1d, 0x31, 0xe2, 0x6a, 0x4d, 0xab, 0x30, 0xe3, 0x4c, 0x12, 0x49, 0x5e, + 0x0d, 0x4b, 0x81, 0xb1, 0xec, 0x15, 0x88, 0xc3, 0x7c, 0xab, 0xbe, 0x98, 0x35, 0x81, 0x9a, 0xea, 0x8d, 0xba, 0x03, 0x0e, 0x1f, 0xd7, 0xcd, 0xdd, 0xe0, 0xcb, 0x19, 0xe7, 0xfb, 0x1b, 0xba, 0x77, + 0x9f, 0x00, 0x74, 0x2f, 0x1a, 0xc7, 0xf9, 0xa6, 0xc5, 0x2e, 0xef, 0x76, 0x4c, 0xc3, 0x5b, 0xad, 0x19, 0x2d, 0x45, 0xdc, 0x35, 0xc7, 0x9e, 0x35, 0x16, 0xd6, 0x3d, 0xc7, 0x5f, 0xeb, 0xd6, 0x6c, + 0x05, 0xe3, 0x19, 0x5c, 0xaa, 0x96, 0xbc, 0x91, 0x74, 0x65, 0xb4, 0xd9, 0x8e, 0xa6, 0x7b, 0x57, 0x9d, 0x2b, 0xf2, 0x80, 0xe1, 0x06, 0x95, 0xe1, 0x43, 0x70, 0x4f, 0xa9, 0x6d, 0x0c, 0xec, 0x58, + 0x91, 0xbc, 0x86, 0xbd, 0xbe, 0x9d, 0xa7, 0xc9, 0x82, 0xc2, 0x13, 0xb1, 0x10, 0x17, 0xaf, 0xe9, 0x4a, 0xc3, 0xb4, 0xcc, 0xb4, 0x9b, 0x47, 0x5d, 0x3d, 0x0a, 0xc3, 0xcb, 0x6c, 0x88, 0x07, 0x49, + 0xf1, 0xff, 0x75, 0x44, 0x8a, 0xba, 0x2c, 0x10, 0xf5, 0x70, 0x13, 0x04, 0x7c, 0x21, 0xe7, 0xe0, 0x33, 0xf9, 0x9b, 0x6a, 0x54, 0x47, 0xb2, 0xcf, 0x39, 0xac, 0xef, 0x37, 0x43, 0x69, 0x9d, 0x99, + 0x74, 0x80, 0x4f, 0x7b, 0xac, 0x56, 0x41, 0xe3, 0x8d, 0x46, 0xa6, 0xf8, 0x74, 0x81, 0x4e, 0x9d, 0x45, 0x8e, 0x38, 0x33, 0x85, 0xdf, 0x0d, 0xa9, 0x98, 0xf7, 0x04, 0x72, 0x39, 0xd8, 0xce, 0xa7, + 0x74, 0x21, 0xb1, 0x3c, 0x35, 0x82, 0x5d, 0xd8, 0x56, 0x62, 0x7d, 0x6b, 0xf0, 0xf4, 0x38, 0x8d, 0xb7, 0xc5, 0x92, 0x71, 0x46, 0xc4, 0x5a, 0x0b, 0x20, 0x77, 0x1b, 0x88, 0x6c, 0xab, 0x2d, 0xa2, + 0xd3, 0x07, 0x84, 0x8f, 0x91, 0x86, 0x21, 0xfc, 0x27, 0x04, 0xfd, 0x84, 0x5e, 0xe8, 0x7f, 0xbf, 0x48, 0x03, 0xdd, 0x53, 0x7e, 0xd2, 0x99, 0xd6, 0x73, 0x86, 0x74, 0xe0, 0xb1, 0x6d, 0x57, 0x36, + 0x31, 0xdb, 0x47, 0x53, 0x8c, 0xab, 0x9d, 0x32, 0x4b, 0x7a, 0x6b, 0x35, 0x0d, 0x66, 0xda, 0xd8, 0xf4, 0xb7, 0x33, 0x90, 0x00, 0x47, 0xc2, 0x38, 0x18, 0xc4, 0x5a, 0xce, 0xf6, 0xa3, 0x7a, 0x23, + 0x8e, 0x45, 0xc9, 0x43, 0xab, 0xc6, 0xd3, 0xa4, 0xfe, 0xb6, 0x31, 0x46, 0xcb, 0xf9, 0x36, 0x4c, 0x0a, 0xab, 0xc8, 0x27, 0x1a, 0xc6, 0x51, 0xab, 0xb9, 0x42, 0x89, 0x22, 0x4d, 0x55, 0xb7, 0x9b, + 0xe4, 0xef, 0xaf, 0xf8, 0xac, 0xcc, 0xcf, 0x0b, 0x4a, 0xe9, 0x17, 0xe1, 0xab, 0x6a, 0x3f, 0x2d, 0x34, 0x12, 0xb8, 0x26, 0x75, 0x2e, 0xaa, 0x68, 0x23, 0x73, 0xa9, 0x5e, 0xa8, 0xed, 0x29, 0x9b, + 0xc0, 0x10, 0x28, 0x1b, 0xc2, 0xba, 0x31, 0x53, 0x44, 0x77, 0x15, 0xd9, 0xba, 0x35, 0x5e, 0x99, 0x2b, 0x36, 0xe8, 0x68, 0xa6, 0xb7, 0xa2, 0x07, 0x80, 0x56, 0xba, 0x5a, 0x83, 0xa4, 0x23, 0x04, + 0x77, 0xa5, 0x59, 0x4f, 0x93, 0xbc, 0x29, 0x90, 0x4d, 0x9b, 0x61, 0xb5, 0xea, 0x11, 0x40, 0xd1, 0xc7, 0x82, 0x7e, 0x1d, 0xbd, 0x36, 0xd8, 0xae, 0x3b, 0xc7, 0x8f, 0xff, 0xeb, 0xab, 0x21, 0x76, + 0x02, 0x63, 0xbb, 0x72, 0x30, 0x75, 0x63, 0xbf, 0xb0, 0xdd, 0x47, 0xa1, 0x07, 0xe8, 0x4f, 0xf8, 0x25, 0x75, 0xff, 0xe4, 0x69, 0x1f, 0x3e, 0xad, 0xf7, 0x76, 0xf7, 0xf4, 0x9c, 0xe7, 0x7c, 0x4f, + 0xb4, 0xbe, 0xbd, 0x9b, 0x09, 0x04, 0xb3, 0x59, 0x66, 0xb2, 0xc4, 0x7a, 0xfb, 0xde, 0x7c, 0x59, 0x48, 0x6c, 0x56, 0xb9, 0x1d, 0x6d, 0x90, 0x83, 0x6e, 0x96, 0x30, 0xb4, 0x19, 0x75, 0xfa, 0xdc, + 0x1a, 0xec, 0x61, 0x48, 0x93, 0x8c, 0xc1, 0x65, 0x4c, 0xf4, 0x15, 0x62, 0xe8, 0xf6, 0xdc, 0xd8, 0x1e, 0x52, 0x78, 0xa0, 0x4b, 0xc9, 0x10, 0x15, 0xa7, 0x6b, 0xb1, 0x5a, 0x00, 0x16, 0x9c, 0xe2, + 0xfb, 0x85, 0xf3, 0xe2, 0xec, 0x7b, 0xe7, 0x1b, 0xf7, 0xb1, 0x99, 0xba, 0x87, 0x65, 0x96, 0xea, 0x77, 0xcf, 0x20, 0xb0, 0xb7, 0x3c, 0xbc, 0xff, 0xd3, 0x4c, 0x8f, 0x62, 0xb3, 0x1b, 0xa8, 0xa1, + 0x6a, 0x9f, 0xb6, 0x30, 0x3f, 0xff, 0xea, 0x0b, 0x87, 0xd9, 0x39, 0x45, 0x5d, 0xf5, 0xbb, 0xa9, 0x69, 0x74, 0x35, 0x5f, 0xd5, 0x77, 0xdd, 0xfc, 0xec, 0x43, 0xfb, 0x94, 0xd4, 0x76, 0xaa, 0xa0, + 0x7b, 0x26, 0x45, 0xfc, 0x84, 0xae, 0xf2, 0x89, 0x4e, 0xbb, 0x3f, 0xa7, 0xed, 0x9f, 0xcf, 0x51, 0xc3, 0x47, 0x78, 0x96, 0x1f, 0x67, 0xd7, 0xdc, 0x75, 0x00, 0xda, 0x07, 0xf0, 0xed, 0xd1, 0xeb, + 0x45, 0xfc, 0xed, 0xf6, 0xfa, 0x1f, 0xe0, 0xf6, 0xfa, 0xdb, 0x1f, 0xf3, 0xc8, 0x9b, 0xd0, 0x72, 0xfc, 0xfe, 0xc5, 0x6a, 0xf1, 0xd3, 0x23, 0x0f, 0xba, 0xf1, 0xd3, 0xc9, 0xd6, 0x0a, 0x72, 0x5c, + 0x2d, 0x97, 0xf0, 0x5a, 0x64, 0xb8, 0x11, 0xe4, 0x90, 0x73, 0x25, 0x33, 0x85, 0x11, 0xda, 0xd7, 0x65, 0xba, 0xc1, 0xfd, 0x65, 0x39, 0x8f, 0xa6, 0x3c, 0x53, 0x14, 0x89, 0xa8, 0x28, 0xd1, 0xd2, + 0x29, 0xad, 0xd1, 0xc0, 0x99, 0xba, 0xca, 0x4c, 0xea, 0x47, 0x55, 0x07, 0x1b, 0xf8, 0xc8, 0x2c, 0xaf, 0xf7, 0x13, 0xc8, 0x65, 0x52, 0x7c, 0xb5, 0x55, 0x2a, 0x39, 0x1f, 0x20, 0xb5, 0x22, 0x79, + 0x8e, 0xfe, 0x3b, 0x0a, 0xf2, 0xc6, 0xaa, 0x3b, 0x95, 0xc5, 0x40, 0x7e, 0x5f, 0x1b, 0xde, 0xf9, 0xd5, 0xf1, 0xcc, 0xf7, 0xee, 0x3e, 0x9f, 0x39, 0xeb, 0xca, 0xcf, 0xbf, 0x7c, 0x9f, 0xa7, 0x8e, + 0x6f, 0xf4, 0xe3, 0xdf, 0xef, 0x61, 0x59, 0xbd, 0xdf, 0xf1, 0x4b, 0xf7, 0x7d, 0x81, 0x8c, 0x77, 0xe7, 0x3d, 0x8e, 0xd8, 0x09, 0x8f, 0x03, 0x6e, 0xff, 0x54, 0x47, 0x3b, 0x3d, 0x06, 0xe8, 0xbe, + 0x1f, 0xb4, 0xee, 0x50, 0x86, 0x07, 0x29, 0x63, 0x07, 0x40, 0x25, 0xce, 0x1c, 0xf4, 0x79, 0x0d, 0xb6, 0x00, 0xc9, 0x9b, 0x57, 0x42, 0xc0, 0x50, 0xa9, 0x5e, 0xe9, 0xf0, 0x26, 0x4a, 0x37, 0xb3, + 0xb9, 0x4f, 0x93, 0x2b, 0x71, 0xa9, 0xf8, 0x32, 0xc4, 0xc5, 0xcb, 0x75, 0xa6, 0x6d, 0x09, 0x13, 0x51, 0x14, 0x23, 0x76, 0xac, 0x79, 0x05, 0xf7, 0xd4, 0xe5, 0x70, 0xb5, 0x10, 0x0b, 0x96, 0x26, + 0xab, 0xde, 0x16, 0xcb, 0x16, 0x3d, 0xe2, 0x77, 0x3a, 0xd4, 0xff, 0xd4, 0x8e, 0x72, 0x3b, 0x3d, 0x9f, 0xe5, 0xff, 0xf7, 0xd4, 0xf7, 0xf7, 0xd4, 0xf7, 0x3f, 0x7f, 0xea, 0xbb, 0x1d, 0x48, 0x7f, + 0xad, 0x32, 0xba, 0x7a, 0x1a, 0xd0, 0xbd, 0x6e, 0xb7, 0x56, 0x4d, 0xbd, 0xce, 0x46, 0x9e, 0xb0, 0x4c, 0x58, 0xf4, 0x7b, 0xeb, 0x5c, 0xe6, 0x13, 0xda, 0xd1, 0x17, 0x85, 0x40, 0x18, 0x05, 0x81, + 0x59, 0x75, 0x7f, 0x01, 0xd4, 0x71, 0x9f, 0xd4, 0x31, 0x9b, 0x58, 0x18, 0x15, 0x11, 0xb3, 0x3c, 0x2a, 0x32, 0x4b, 0xcd, 0x1c, 0x21, 0xa4, 0x39, 0x99, 0x59, 0xcd, 0xb8, 0x36, 0xfa, 0x23, 0x85, + 0x89, 0xa6, 0xb6, 0xe7, 0x47, 0xfb, 0x05, 0x45, 0x21, 0x1d, 0xd4, 0x07, 0x9a, 0xec, 0x77, 0x16, 0x61, 0xbf, 0xa1, 0x64, 0x4a, 0x37, 0x73, 0xf3, 0x28, 0xed, 0xee, 0xcc, 0xfa, 0xf2, 0x47, 0x6d, + 0xc5, 0x77, 0x7e, 0xd8, 0x5f, 0x2b, 0xb6, 0xd3, 0x84, 0xfe, 0x0e, 0xec, 0xdd, 0x5a, 0x4c, 0xf9, 0x4e, 0x59, 0xd1, 0x36, 0x23, 0x71, 0x46, 0x69, 0x65, 0x24, 0x8f, 0x12, 0xbc, 0x9a, 0xec, 0x23, + 0x8f, 0x63, 0x06, 0x9d, 0x60, 0xbc, 0x0a, 0xa6, 0x8d, 0xd1, 0x10, 0x69, 0xa7, 0xe8, 0xac, 0x30, 0xd4, 0x47, 0x58, 0x66, 0xb7, 0x8c, 0x07, 0x9a, 0x04, 0x4d, 0x62, 0x44, 0x17, 0x93, 0x84, 0x5a, + 0xf5, 0x4a, 0x61, 0xd5, 0xa7, 0x29, 0xc8, 0x72, 0xf3, 0x6c, 0xec, 0x04, 0x44, 0x2d, 0x82, 0xe5, 0xfe, 0x51, 0xf6, 0x46, 0x2b, 0x3e, 0xdd, 0xe8, 0xf2, 0xff, 0x06, 0x9e, 0x5d, 0x3e, 0xf1, 0x1a, + 0x18, 0xfd, 0x74, 0xae, 0x35, 0x2f, 0x77, 0x34, 0xe3, 0xe6, 0x3c, 0xa0, 0xd5, 0xc0, 0x88, 0x23, 0x6c, 0xb2, 0x2f, 0xf3, 0x4b, 0x42, 0xe5, 0x62, 0xaa, 0xf2, 0xe7, 0xa4, 0x11, 0x65, 0x8e, 0xb5, + 0x69, 0x48, 0x83, 0x80, 0xbc, 0x1e, 0x11, 0x62, 0xbb, 0x95, 0x8a, 0xe9, 0xea, 0x68, 0x53, 0xca, 0xe0, 0xbc, 0x1c, 0xac, 0x06, 0x6a, 0xc8, 0x03, 0x83, 0x84, 0x9e, 0x44, 0x94, 0x68, 0x96, 0xe4, + 0x56, 0x07, 0x02, 0x09, 0xe7, 0xf9, 0x6a, 0xfb, 0xc8, 0x05, 0xf5, 0x2f, 0xea, 0xf2, 0x5f, 0x4c, 0xa9, 0x17, 0x97, 0x6c, 0x3f, 0xd2, 0xb4, 0x23, 0x67, 0xfe, 0x01, 0xdd, 0x03, 0x6d, 0x39, 0x97, + 0x18, 0xfe, 0x5c, 0x3f, 0xea, 0xef, 0x15, 0xec, 0xdf, 0xd3, 0xf8, 0xff, 0xb1, 0xd3, 0xf8, 0xcd, 0x98, 0xfa, 0x6b, 0x55, 0xdb, 0xe5, 0xc3, 0x80, 0xee, 0x55, 0xb3, 0xb5, 0x42, 0x43, 0xa3, 0x3d, + 0x94, 0x79, 0x01, 0x3b, 0x1a, 0xef, 0xbd, 0x01, 0x43, 0x87, 0x42, 0x3f, 0xdf, 0x0c, 0x87, 0xce, 0x20, 0xdd, 0xe6, 0x1c, 0x05, 0x0d, 0x74, 0x30, 0xa3, 0xe3, 0xa2, 0x01, 0xad, 0xc4, 0x42, 0x66, + 0x1d, 0x1b, 0x99, 0x0c, 0xd9, 0x7a, 0xb9, 0xdf, 0x6b, 0x43, 0x10, 0xd7, 0xea, 0x0a, 0x1c, 0xce, 0xb3, 0x59, 0x18, 0x6a, 0x09, 0x8a, 0xea, 0x9c, 0x5b, 0x8e, 0x08, 0x2e, 0x83, 0x00, 0x30, 0xbb, + 0xc5, 0x2d, 0xfd, 0x4b, 0x14, 0xda, 0xfb, 0xaa, 0xef, 0x56, 0x89, 0x7d, 0xb5, 0xf8, 0x53, 0x35, 0x2d, 0x3d, 0xbe, 0xcc, 0xa3, 0xed, 0xa3, 0xef, 0x07, 0x0b, 0x9e, 0x48, 0x02, 0xdd, 0xf7, 0x83, + 0xe3, 0x5e, 0x51, 0x8b, 0x00, 0xc1, 0x30, 0x34, 0x7b, 0xc0, 0xd8, 0x95, 0x00, 0xa7, 0x19, 0x3b, 0x32, 0x1e, 0x1b, 0x4c, 0xa8, 0xd1, 0x79, 0x43, 0x30, 0xde, 0x6c, 0xc9, 0xa5, 0x32, 0x08, 0xce, + 0x80, 0xa6, 0x9c, 0x2d, 0x02, 0x2c, 0x9e, 0x0e, 0x77, 0x3e, 0xbe, 0x2f, 0xd8, 0x94, 0x0d, 0xb7, 0x21, 0xb0, 0xce, 0x97, 0xa2, 0x68, 0x89, 0x39, 0x65, 0x29, 0x3d, 0x00, 0x9a, 0xe7, 0xa6, 0xb3, + 0xcb, 0x9a, 0x55, 0x2f, 0xd1, 0x97, 0xae, 0xfb, 0xa8, 0x22, 0xe9, 0x0d, 0x0b, 0x4e, 0x38, 0x47, 0x5d, 0x3f, 0xb2, 0xed, 0xaf, 0xf1, 0xe0, 0x5f, 0x61, 0xc6, 0x35, 0xf1, 0x23, 0x5b, 0xae, 0x4f, + 0x1d, 0x77, 0xbf, 0x5b, 0x30, 0x08, 0xa6, 0xbd, 0xf9, 0x52, 0xd9, 0x2f, 0x67, 0xa5, 0x63, 0x4e, 0x4b, 0x56, 0xa3, 0x33, 0x7f, 0xb8, 0x90, 0xa7, 0xab, 0x5d, 0xda, 0x59, 0x78, 0xb3, 0x7c, 0x1a, + 0xa6, 0xfc, 0x0c, 0x41, 0xac, 0xce, 0x7a, 0xbc, 0xe1, 0x1b, 0xb3, 0x91, 0x62, 0x45, 0x4f, 0xd6, 0x36, 0xe1, 0xa9, 0x08, 0x8f, 0x1a, 0xf4, 0x36, 0x68, 0x1a, 0xbb, 0x5a, 0x76, 0x54, 0x10, 0xee, + 0x79, 0xf3, 0x3d, 0x36, 0xeb, 0xbb, 0xc8, 0xa4, 0x70, 0x3f, 0xa5, 0xff, 0xa9, 0x7a, 0x94, 0x3e, 0xf2, 0xbc, 0x13, 0x2f, 0x05, 0x8f, 0x1e, 0x29, 0x1e, 0xbe, 0xfb, 0xf0, 0xbf, 0x4b, 0xb4, 0x0b, + 0x17, 0x0d, 0xa5, 0x3a, 0x06, 0x23, 0x08, 0x08, 0x44, 0x43, 0x5b, 0x4e, 0xa1, 0xd9, 0x14, 0xdf, 0x8d, 0x76, 0xd5, 0x22, 0x0d, 0x6c, 0x05, 0x14, 0x96, 0x80, 0xd7, 0xef, 0xc7, 0xa2, 0x5b, 0x69, + 0x2b, 0x8f, 0x8d, 0xe6, 0x22, 0x6a, 0xf8, 0xb4, 0x93, 0x4c, 0xf2, 0x48, 0x2a, 0xfa, 0xe1, 0x60, 0xca, 0x35, 0xf6, 0x72, 0x5d, 0xd9, 0xa0, 0xb2, 0x71, 0xfb, 0x91, 0x54, 0xe3, 0x8b, 0xbd, 0x60, + 0x6a, 0xd2, 0xda, 0x21, 0xdb, 0xec, 0x6b, 0x9d, 0xde, 0xd2, 0xcb, 0x1e, 0xe3, 0x04, 0xbd, 0x82, 0xe9, 0xf9, 0x41, 0xf5, 0x83, 0x0f, 0x5e, 0xb6, 0xef, 0x62, 0xed, 0xd0, 0x3d, 0x39, 0x70, 0x96, + 0x07, 0x00, 0x4a, 0x4c, 0x39, 0x4b, 0x9a, 0xc7, 0xa2, 0x04, 0x4f, 0x80, 0x68, 0x2c, 0x02, 0x88, 0x24, 0xbb, 0x1c, 0x3e, 0xac, 0x36, 0x1d, 0x73, 0xa2, 0x8d, 0x79, 0x27, 0x33, 0xf6, 0x0e, 0xbc, + 0x59, 0xf2, 0x86, 0xdf, 0x41, 0xc0, 0x88, 0x54, 0x59, 0x63, 0xa9, 0x05, 0xd8, 0x44, 0xb3, 0xac, 0x78, 0x38, 0xa4, 0x6c, 0xc0, 0xee, 0x34, 0x2e, 0x34, 0xe8, 0x78, 0xe5, 0xc4, 0x51, 0xb1, 0xf0, + 0x3b, 0xfa, 0xe8, 0x46, 0x65, 0x78, 0x8f, 0xf4, 0xc5, 0x7b, 0x78, 0xcf, 0xb7, 0x99, 0xe3, 0x95, 0xef, 0xf1, 0x4c, 0x27, 0x02, 0xcf, 0x39, 0xe2, 0x21, 0xd6, 0x9a, 0xb7, 0xcb, 0x65, 0x84, 0xc1, + 0x84, 0x1a, 0xd6, 0x72, 0x3d, 0x99, 0xb2, 0x4b, 0x79, 0xa2, 0xb1, 0x9d, 0x32, 0x0c, 0x25, 0xb9, 0x1c, 0x80, 0x01, 0x16, 0x04, 0x3b, 0x1d, 0x5a, 0x72, 0x9d, 0x70, 0x4f, 0xc5, 0xf1, 0xae, 0xcf, + 0x0b, 0x63, 0x1e, 0x54, 0x15, 0xd4, 0xd0, 0xfc, 0x75, 0x5f, 0x8c, 0xd8, 0x85, 0xe3, 0x04, 0x9d, 0x5d, 0x33, 0x40, 0x95, 0x55, 0xbd, 0xa3, 0x23, 0xc1, 0x46, 0x5b, 0xc4, 0x31, 0x59, 0x6a, 0x96, + 0x77, 0x0d, 0xd3, 0x8c, 0xbb, 0x66, 0x52, 0xa8, 0x1f, 0x41, 0xb9, 0x37, 0x1b, 0x1f, 0x87, 0x9b, 0x4e, 0x1e, 0xc6, 0xfc, 0x5c, 0x99, 0xd9, 0x0d, 0x6d, 0xd7, 0xaa, 0x2f, 0x94, 0xf1, 0xc5, 0xfd, + 0x97, 0xbb, 0xbe, 0x79, 0xaa, 0x1e, 0xf8, 0x79, 0xf2, 0xea, 0x5d, 0xc7, 0x6a, 0x1f, 0xc1, 0xcb, 0xde, 0xa1, 0xbd, 0x4f, 0x10, 0xff, 0x0f, 0x70, 0x78, 0x8f, 0xc9, 0x35, 0xaa, 0xef, 0xda, 0x8f, + 0x86, 0xf1, 0x6b, 0xf0, 0x41, 0xbf, 0xc8, 0x9e, 0x33, 0xbe, 0x8e, 0x8d, 0xb6, 0x20, 0x41, 0x4a, 0xdc, 0xf7, 0xd7, 0x5c, 0xb2, 0x15, 0x91, 0x39, 0x4b, 0x07, 0x9c, 0xab, 0x19, 0xd6, 0xa6, 0x49, + 0xfa, 0x32, 0xea, 0x87, 0xde, 0xa0, 0x88, 0xc4, 0x66, 0x85, 0x2d, 0xc1, 0x68, 0x30, 0x8c, 0x2d, 0x03, 0x68, 0xb0, 0x64, 0x32, 0x5a, 0xab, 0x69, 0xb1, 0x4b, 0x5d, 0x83, 0x41, 0xbd, 0x82, 0x9f, + 0xc2, 0xc3, 0xad, 0xe0, 0x56, 0x2b, 0x69, 0x9f, 0xf6, 0x36, 0x89, 0x94, 0xab, 0xb2, 0x4a, 0x6e, 0xe7, 0xf2, 0x6b, 0x3e, 0xbb, 0x4f, 0x78, 0x64, 0xc8, 0x4b, 0xe9, 0x75, 0xb7, 0x28, 0x57, 0x6f, + 0x6f, 0x9f, 0x76, 0x80, 0x5f, 0x8c, 0xdc, 0x7d, 0x84, 0x2a, 0x86, 0x7e, 0x8a, 0xf2, 0x7b, 0x7b, 0xc4, 0x6e, 0x48, 0x8d, 0xcd, 0x99, 0xb5, 0x15, 0xa0, 0xd5, 0x74, 0x91, 0x54, 0x60, 0xd4, 0x1b, + 0xbb, 0x43, 0x2a, 0x2a, 0xd7, 0x4d, 0x4f, 0xc0, 0x16, 0x10, 0x63, 0x77, 0xd0, 0x65, 0xca, 0x54, 0x96, 0x60, 0x56, 0x12, 0x1e, 0x03, 0x69, 0x20, 0x14, 0xa6, 0x46, 0xe4, 0x1b, 0xc5, 0x93, 0xa0, + 0x74, 0x8f, 0xf2, 0x51, 0x0d, 0x51, 0x29, 0x6d, 0xdb, 0x51, 0xc2, 0xc6, 0x56, 0x92, 0x18, 0x63, 0x34, 0x8d, 0x42, 0xa3, 0x55, 0x98, 0xe4, 0xff, 0x7a, 0xc8, 0xe8, 0x47, 0x8c, 0x42, 0x5e, 0x66, + 0xd4, 0x57, 0x78, 0x4a, 0x9f, 0xb1, 0xf2, 0xde, 0x1e, 0x31, 0xab, 0x54, 0x2d, 0xbd, 0xc4, 0x39, 0x6f, 0xad, 0x70, 0x0b, 0xbb, 0x01, 0xf1, 0x48, 0x00, 0x46, 0x38, 0xcb, 0xd0, 0x29, 0x95, 0x37, + 0x64, 0x69, 0x38, 0x92, 0xba, 0x63, 0xbd, 0xe1, 0xb8, 0x14, 0xd3, 0x11, 0x85, 0xd7, 0xc8, 0xa8, 0x3f, 0x84, 0xfa, 0xe3, 0x90, 0xaf, 0x3b, 0x12, 0x9f, 0x90, 0xc6, 0x72, 0x32, 0x93, 0x20, 0xad, + 0xc3, 0x31, 0xab, 0x84, 0x19, 0xea, 0xf9, 0xce, 0x98, 0x6f, 0x50, 0xd4, 0x84, 0x7e, 0x3f, 0x21, 0xe4, 0x16, 0x5b, 0x89, 0xb8, 0x59, 0x36, 0x9e, 0xbe, 0xe7, 0x0b, 0x7c, 0xa5, 0x5b, 0x55, 0xf3, + 0xf6, 0xf6, 0x19, 0x63, 0x09, 0xbb, 0xc4, 0xc6, 0x7f, 0x7b, 0xb8, 0xe0, 0xb9, 0x8b, 0x8b, 0xf4, 0xf6, 0x76, 0x3b, 0x37, 0xc2, 0xbf, 0x21, 0xc8, 0x7b, 0xf8, 0x48, 0xd8, 0x27, 0x50, 0xac, 0xb7, + 0x47, 0x42, 0x64, 0x8a, 0x79, 0x06, 0xd9, 0x9c, 0x46, 0x27, 0x99, 0xc0, 0x8d, 0x15, 0x3f, 0xb5, 0xac, 0xca, 0x2f, 0x6c, 0x52, 0x18, 0xed, 0xf4, 0x30, 0xf6, 0x32, 0x6c, 0x3d, 0x0b, 0x78, 0x68, + 0x46, 0x39, 0x9d, 0x80, 0x42, 0xc0, 0x15, 0xc8, 0x2c, 0xa3, 0xdc, 0x62, 0x14, 0xd0, 0x80, 0x57, 0xab, 0x6c, 0x1b, 0xcf, 0x82, 0x59, 0x20, 0x08, 0x13, 0x7c, 0x43, 0x10, 0x88, 0xa0, 0x52, 0xc8, + 0xa4, 0xe3, 0x6b, 0xee, 0xe6, 0xf7, 0xb3, 0x49, 0x6f, 0xb0, 0x92, 0xd0, 0x2f, 0xd8, 0xfd, 0x6f, 0x97, 0xff, 0xaf, 0xb4, 0xf9, 0x31, 0xc5, 0xe9, 0xf1, 0xe2, 0xe9, 0x25, 0x2b, 0xfd, 0x17, 0xdd, + 0xb3, 0x92, 0x39, 0xb5, 0x8e, 0x5a, 0xa6, 0x85, 0x55, 0x32, 0x89, 0xb6, 0xa0, 0x1a, 0xb3, 0xda, 0x48, 0x5d, 0x4d, 0x68, 0xd1, 0xc7, 0xeb, 0x61, 0x27, 0xc6, 0x27, 0xd4, 0x50, 0x56, 0x70, 0x1c, + 0x07, 0x1c, 0xa7, 0xcf, 0x72, 0x22, 0x96, 0xf7, 0xa4, 0xa1, 0xa7, 0x4d, 0x24, 0x6e, 0xb5, 0x02, 0x6c, 0x52, 0x10, 0xb5, 0x21, 0xa3, 0x95, 0x56, 0x6a, 0x73, 0xdb, 0x72, 0x0c, 0x49, 0xb1, 0x12, + 0xfb, 0xb3, 0x69, 0x58, 0x8d, 0xa3, 0x5e, 0xcf, 0xdf, 0x02, 0x14, 0x15, 0xb4, 0xb2, 0xd0, 0x9e, 0x41, 0x39, 0xfe, 0xc6, 0xfc, 0x76, 0x47, 0xe9, 0xb6, 0x98, 0xdf, 0xa0, 0x2e, 0x21, 0x09, 0xdb, + 0xaa, 0x1e, 0xb3, 0x4b, 0xc4, 0x67, 0x35, 0x8a, 0xdb, 0xa8, 0x3d, 0x18, 0xa6, 0xd5, 0x0c, 0x81, 0x15, 0xfb, 0xd6, 0xbe, 0xbe, 0x9b, 0x99, 0x7d, 0xeb, 0x92, 0x79, 0xf1, 0xf5, 0xef, 0x66, 0x64, + 0xa3, 0xed, 0x70, 0xbe, 0x1b, 0x8d, 0xee, 0xa5, 0xfd, 0x09, 0xb5, 0x84, 0x52, 0xcd, 0x73, 0xd7, 0x8c, 0x06, 0x3b, 0x09, 0x37, 0x1c, 0x89, 0x32, 0xbf, 0xb7, 0xf3, 0x1d, 0x29, 0xae, 0xe6, 0x7b, + 0x05, 0x19, 0x2b, 0x15, 0x83, 0x0c, 0x71, 0x31, 0xdf, 0x6b, 0x5b, 0x45, 0xea, 0x87, 0xe1, 0xc2, 0x85, 0xf8, 0xdd, 0xbe, 0x33, 0x66, 0x22, 0xc7, 0x98, 0xf9, 0xc3, 0x18, 0x86, 0xe1, 0x6a, 0x4d, + 0xf1, 0x63, 0xc7, 0x54, 0x26, 0xd2, 0x62, 0xd0, 0xc2, 0xa6, 0xfa, 0x9c, 0x6e, 0x0d, 0x3f, 0x8e, 0xca, 0x53, 0xc3, 0xfa, 0x9c, 0xee, 0x74, 0x5f, 0xf2, 0xaf, 0x0d, 0x85, 0x13, 0xd1, 0x23, 0xdf, + 0x4e, 0x87, 0x6d, 0x11, 0x4a, 0x02, 0x81, 0xc4, 0x60, 0x38, 0xce, 0xe6, 0xfd, 0xa4, 0x59, 0x77, 0x70, 0xde, 0x89, 0x82, 0x2d, 0x56, 0xd9, 0x31, 0x8c, 0xc9, 0x6b, 0x57, 0xf3, 0x1c, 0x72, 0xe3, + 0xc1, 0xc8, 0x18, 0x9b, 0xcf, 0x76, 0xb3, 0x38, 0x5e, 0xac, 0x17, 0x5e, 0xcd, 0x31, 0x30, 0x05, 0x07, 0xf4, 0x24, 0xd8, 0xb0, 0x6a, 0x87, 0x13, 0x09, 0x0b, 0x66, 0x70, 0x5e, 0x74, 0x7a, 0xde, + 0x8e, 0xee, 0x9b, 0x35, 0xbf, 0xcb, 0x1b, 0xef, 0x3b, 0xa6, 0xf9, 0x2f, 0x3e, 0x86, 0x51, 0x1a, 0xa8, 0xbe, 0xdb, 0x98, 0xdd, 0x58, 0xbd, 0xb2, 0x6b, 0x2e, 0xb4, 0x78, 0xec, 0xea, 0xd1, 0xaf, + 0x74, 0xb1, 0x53, 0x18, 0xf7, 0x7d, 0x3e, 0xa7, 0xba, 0x53, 0x3f, 0xf4, 0x0a, 0xbc, 0x34, 0xbc, 0x0e, 0x14, 0x0f, 0x1c, 0x3e, 0xfc, 0x3f, 0xa2, 0x84, 0x3d, 0x1d, 0x54, 0x1d, 0xdd, 0xa3, 0x45, + 0xc8, 0x12, 0x46, 0x86, 0x49, 0x8a, 0x58, 0x3a, 0x32, 0xeb, 0xbd, 0x1b, 0xeb, 0x1c, 0xeb, 0x0d, 0xa8, 0xdb, 0x41, 0x95, 0x3e, 0x5a, 0xb5, 0xbf, 0x56, 0x22, 0x4c, 0x4d, 0x8f, 0x0b, 0xf5, 0xd4, + 0x6e, 0x5b, 0x0a, 0x0c, 0x23, 0x17, 0x3d, 0x89, 0x49, 0x58, 0x70, 0xbb, 0x87, 0x09, 0xb9, 0x9a, 0x2d, 0xf2, 0x9e, 0x35, 0xd9, 0xbb, 0xa5, 0x27, 0xfb, 0x28, 0x02, 0xcb, 0xfd, 0xca, 0x62, 0x04, + 0x4b, 0xe9, 0x10, 0xd0, 0x9c, 0x4a, 0x56, 0xa9, 0x62, 0x5a, 0x04, 0x9f, 0x72, 0x92, 0x82, 0xf0, 0x23, 0x7e, 0x5a, 0xf5, 0x17, 0xe8, 0x90, 0x17, 0xe9, 0xd8, 0x9f, 0x61, 0x08, 0xa2, 0xec, 0xc9, + 0x1e, 0xb6, 0x30, 0xa7, 0xfd, 0x51, 0xd9, 0x4a, 0x19, 0xa6, 0xf6, 0xd7, 0xc5, 0x14, 0xc0, 0x9f, 0xd0, 0x2b, 0xc2, 0xb2, 0xcf, 0xb5, 0x14, 0xce, 0x87, 0xdd, 0x13, 0xa9, 0xe7, 0xac, 0x88, 0xb0, + 0x79, 0x54, 0xe3, 0xb9, 0xc8, 0xa2, 0x0b, 0x1e, 0x18, 0x4e, 0x77, 0x7d, 0x4a, 0xc4, 0xe7, 0x8d, 0xe7, 0xaa, 0x3b, 0x65, 0x01, 0x63, 0x73, 0x5e, 0x1e, 0xa6, 0xba, 0x90, 0xe7, 0x93, 0x44, 0x33, + 0x0c, 0x92, 0xde, 0xa4, 0x21, 0xd5, 0xb1, 0xd8, 0x06, 0x23, 0x5c, 0x11, 0x9b, 0x69, 0x20, 0x1e, 0x97, 0x34, 0x5b, 0xfa, 0x98, 0x2d, 0x81, 0x34, 0x4a, 0x1a, 0x13, 0x3f, 0xf3, 0xb7, 0x65, 0xb4, + 0x7c, 0x6d, 0x48, 0x64, 0x71, 0xea, 0x86, 0xb9, 0xf5, 0xbe, 0x66, 0xfa, 0xe7, 0x75, 0x71, 0xcc, 0x1b, 0x36, 0xa6, 0x6a, 0xdd, 0x2d, 0xc2, 0x13, 0xdb, 0xee, 0xbb, 0x7f, 0x5e, 0x49, 0xde, 0xb9, + 0xa0, 0x7b, 0xe4, 0xe5, 0x47, 0xeb, 0xe8, 0xe2, 0x6d, 0xc1, 0xcd, 0x11, 0x5b, 0xef, 0xa3, 0xe9, 0x52, 0x5e, 0xd5, 0x7d, 0x01, 0xcf, 0xf2, 0x95, 0x89, 0x0f, 0x26, 0x76, 0x68, 0xa0, 0x83, 0xc8, + 0xac, 0xa8, 0x31, 0xd1, 0x08, 0x86, 0x95, 0x4c, 0x3b, 0x3b, 0xd6, 0x0b, 0x7d, 0x25, 0xa0, 0x99, 0x06, 0xd0, 0xe7, 0x58, 0x6c, 0x91, 0x29, 0xa0, 0xcf, 0xd1, 0x4d, 0x82, 0x83, 0x19, 0x0f, 0xc4, + 0xe0, 0x78, 0xa7, 0x7b, 0xab, 0xc1, 0x60, 0x56, 0x2d, 0x10, 0x76, 0x98, 0x8e, 0xeb, 0x07, 0xcb, 0xa6, 0x6b, 0x8e, 0x64, 0x79, 0x7a, 0x0c, 0xdd, 0x7b, 0x3c, 0xcf, 0xbe, 0x56, 0x21, 0xf1, 0x92, + 0xf0, 0x81, 0x27, 0x17, 0xcd, 0xb6, 0xf5, 0x11, 0x15, 0x22, 0x17, 0x2a, 0xa8, 0xce, 0x97, 0xdb, 0x1c, 0xf3, 0x12, 0x41, 0x9f, 0xce, 0x3a, 0x53, 0x29, 0x37, 0x57, 0xd0, 0xba, 0x10, 0xb9, 0x9e, + 0x0c, 0xc2, 0x45, 0x31, 0xc9, 0x39, 0x09, 0x5a, 0x94, 0x78, 0xcf, 0xdb, 0x4a, 0x1c, 0x67, 0x63, 0xba, 0xab, 0xf1, 0x15, 0x3b, 0x89, 0x2a, 0xb2, 0x6e, 0x94, 0x59, 0xc7, 0xa4, 0x74, 0x88, 0x1c, + 0x04, 0x3c, 0x3b, 0x53, 0x7d, 0x50, 0x8b, 0x11, 0x3c, 0x7d, 0x84, 0xc1, 0x78, 0xc3, 0x94, 0x3a, 0xd4, 0x77, 0xee, 0xe3, 0x42, 0xdb, 0xaf, 0x78, 0xb1, 0xcf, 0x44, 0x8f, 0xcc, 0x38, 0x1d, 0xb6, + 0x29, 0x7b, 0x0e, 0x75, 0xf7, 0x18, 0xa1, 0x58, 0x08, 0x09, 0xd6, 0x28, 0x99, 0x46, 0x5a, 0xbd, 0xdd, 0xf1, 0x0d, 0xa3, 0xec, 0x0c, 0x7e, 0x81, 0xec, 0x6e, 0xf5, 0xe3, 0x09, 0xa8, 0x30, 0xf3, + 0x4d, 0xf3, 0x31, 0x94, 0xe6, 0x4b, 0xc2, 0xbc, 0x20, 0x7c, 0x78, 0xff, 0x8b, 0x66, 0x1b, 0x1d, 0x7f, 0xdc, 0x3e, 0x14, 0xa7, 0x1e, 0x93, 0x50, 0x0e, 0x11, 0xef, 0xc1, 0xed, 0x46, 0x1c, 0x77, + 0x50, 0x49, 0x6b, 0x22, 0x77, 0x0e, 0x84, 0xcb, 0xdd, 0x88, 0xda, 0x88, 0x85, 0x01, 0x17, 0x65, 0x38, 0x49, 0x0a, 0x06, 0x02, 0xf6, 0x98, 0x4a, 0x0c, 0x24, 0x45, 0x98, 0x2c, 0x41, 0x4a, 0x6f, + 0x12, 0x0e, 0x94, 0x42, 0x9c, 0x88, 0x64, 0x60, 0xb9, 0x94, 0x20, 0x5e, 0x5b, 0x71, 0xaa, 0xa7, 0xc4, 0x31, 0x32, 0xee, 0xe5, 0xd2, 0x27, 0xb7, 0x66, 0x91, 0x47, 0xba, 0x1a, 0x86, 0x0f, 0xc7, + 0x37, 0x7a, 0x4c, 0x43, 0xf9, 0xf6, 0xf7, 0x7f, 0x90, 0x3d, 0x7c, 0xfd, 0x47, 0xa3, 0x7b, 0xa4, 0xf6, 0xfc, 0xdb, 0xe3, 0xcd, 0x68, 0x40, 0x4f, 0x9c, 0x9e, 0xb6, 0x93, 0x4c, 0x66, 0x2b, 0x7b, + 0x90, 0xc8, 0xc3, 0x34, 0x2d, 0x9b, 0xdb, 0xa5, 0xca, 0xef, 0xb4, 0xb9, 0x5b, 0x23, 0xa2, 0x42, 0x94, 0xe2, 0x1c, 0xd2, 0x12, 0xa2, 0xdc, 0xec, 0x47, 0x33, 0x72, 0xde, 0x71, 0xfb, 0x01, 0x53, + 0xd3, 0xfd, 0xbc, 0x70, 0xe0, 0x99, 0x30, 0x71, 0x37, 0x3e, 0xeb, 0xbb, 0xbb, 0xad, 0x0a, 0xc5, 0x20, 0xbf, 0x5a, 0xc9, 0xc8, 0xd2, 0xa8, 0x5a, 0xd8, 0x5c, 0x5f, 0xd4, 0x83, 0xf4, 0xdd, 0xee, + 0xd1, 0x6d, 0x85, 0xfc, 0x38, 0xf9, 0xa0, 0xb0, 0x6b, 0x1f, 0x94, 0xee, 0x47, 0xe1, 0xb9, 0xe4, 0xc8, 0x4d, 0xc5, 0xa8, 0x93, 0x25, 0xf7, 0x8e, 0xcb, 0xf0, 0xe3, 0xdf, 0xdf, 0x53, 0xcd, 0xae, + 0x7f, 0x9d, 0x46, 0xd9, 0xb1, 0xd2, 0x55, 0xf9, 0xe3, 0xdf, 0xef, 0x01, 0x4a, 0x5a, 0x51, 0x1a, 0x74, 0x0d, 0x35, 0x3f, 0x17, 0x62, 0xbc, 0x79, 0xb8, 0xa3, 0x66, 0xdd, 0xe3, 0x18, 0xe9, 0x3a, + 0x51, 0xb4, 0xcb, 0xee, 0xd3, 0x70, 0x8c, 0xb4, 0xeb, 0xb8, 0x59, 0x1e, 0xd9, 0xa9, 0x1a, 0x9c, 0xfd, 0x65, 0xd0, 0x6d, 0x02, 0xd2, 0xf5, 0x5d, 0xb1, 0x99, 0xea, 0x66, 0x98, 0xbb, 0x07, 0x7b, + 0x39, 0xd2, 0xbc, 0x1f, 0x77, 0x1d, 0x75, 0x87, 0x7e, 0xd0, 0x7d, 0x0f, 0x55, 0x7b, 0x27, 0x7b, 0x60, 0xcf, 0x75, 0xed, 0xe6, 0x3a, 0x36, 0xd3, 0x53, 0x65, 0xa4, 0xcf, 0x45, 0xbe, 0x4e, 0xc1, + 0x24, 0xbf, 0xec, 0xb3, 0x4f, 0x4f, 0x38, 0xa6, 0xf3, 0xbb, 0xd9, 0x99, 0x79, 0x37, 0x55, 0x3c, 0xa3, 0xb0, 0x1b, 0x9a, 0x79, 0xd7, 0x77, 0xb3, 0xfc, 0xbd, 0xd0, 0xe7, 0x27, 0xfe, 0xc6, 0xa9, + 0x99, 0xe7, 0x75, 0x57, 0xab, 0xf3, 0xd3, 0x1e, 0xd1, 0x3b, 0x06, 0xce, 0xd5, 0x1d, 0x91, 0x9d, 0x9a, 0x59, 0x76, 0xff, 0x0d, 0x53, 0xf3, 0xd0, 0x4d, 0xd3, 0x52, 0xfd, 0x95, 0x2a, 0x08, 0x5e, + 0x5f, 0x3f, 0xa7, 0x1b, 0xdd, 0x79, 0xfb, 0xc3, 0xa5, 0x8b, 0x5a, 0x22, 0x0f, 0xd0, 0x9b, 0xbf, 0xa8, 0x33, 0xfb, 0x04, 0x3f, 0xe9, 0x75, 0x94, 0x94, 0x67, 0x55, 0x26, 0xdf, 0x1e, 0x0d, 0xd0, + 0xbf, 0xbc, 0xd2, 0xe4, 0xdb, 0xc3, 0x41, 0x7a, 0xbc, 0x72, 0x0b, 0x94, 0xf4, 0xd9, 0xa7, 0xd8, 0xa2, 0xbc, 0xe4, 0x5b, 0x1b, 0x37, 0xc3, 0xa3, 0xd2, 0x21, 0x8f, 0xe6, 0x0a, 0xec, 0xfb, 0xba, + 0xf2, 0xee, 0x23, 0x0e, 0x7a, 0xf3, 0xee, 0x85, 0xe3, 0xfc, 0x81, 0x3d, 0xd7, 0xa1, 0x8c, 0xc0, 0x80, 0x9c, 0x2b, 0xa2, 0xb8, 0xe9, 0xc6, 0x66, 0xe3, 0x2e, 0x96, 0x10, 0x3f, 0x9b, 0x01, 0x8b, + 0xa5, 0xc5, 0xac, 0xc0, 0xac, 0xb0, 0xc6, 0x8b, 0x6d, 0xe0, 0x2d, 0xec, 0x72, 0x9d, 0x45, 0x2b, 0x38, 0x4f, 0xf6, 0x7a, 0x2e, 0x99, 0xd4, 0xc2, 0xf4, 0x36, 0xba, 0x25, 0xe6, 0x7b, 0x99, 0x4b, + 0x06, 0x4b, 0x01, 0x5a, 0xed, 0x25, 0x32, 0x8b, 0xe1, 0x69, 0xba, 0xa0, 0x37, 0xf1, 0x48, 0xc6, 0xb3, 0x4f, 0x09, 0x3f, 0x6a, 0x59, 0xba, 0xd1, 0x03, 0x76, 0x10, 0x47, 0x5f, 0xfc, 0xf7, 0xd9, + 0x51, 0xba, 0xd1, 0xf1, 0xeb, 0x4b, 0x37, 0xea, 0x1e, 0x69, 0x3c, 0xff, 0xd8, 0xed, 0x06, 0xee, 0x0b, 0xfd, 0x40, 0x51, 0xfb, 0x41, 0xbf, 0x9f, 0x8d, 0xd5, 0x89, 0xca, 0x73, 0x7b, 0xaa, 0x99, + 0x55, 0x43, 0x84, 0xb0, 0xb6, 0x2e, 0xc4, 0xb1, 0x7b, 0x71, 0x5a, 0x9a, 0xc6, 0x34, 0x36, 0xdd, 0x8c, 0x37, 0x82, 0xbd, 0x12, 0x6a, 0x3e, 0xab, 0x23, 0x4e, 0x3c, 0xda, 0xc8, 0xa1, 0x3f, 0xeb, + 0x70, 0xd3, 0xd5, 0x5e, 0xc9, 0xd4, 0xc6, 0x41, 0x91, 0xcd, 0x56, 0x1c, 0xd9, 0xdb, 0x58, 0x4b, 0x5a, 0x4c, 0x18, 0xe7, 0xf5, 0xe0, 0x1d, 0x75, 0x7b, 0x19, 0x10, 0x73, 0xab, 0xcd, 0xaf, 0x92, + 0x3c, 0xaf, 0x14, 0x55, 0x52, 0x98, 0x85, 0xd9, 0x0d, 0x5c, 0x3d, 0x8d, 0x72, 0x35, 0xdb, 0x7d, 0x68, 0x9b, 0x3b, 0xc5, 0xeb, 0x7f, 0x2f, 0xb8, 0xe5, 0x35, 0xf4, 0xa8, 0xcf, 0xc1, 0x2d, 0x2d, + 0x30, 0xa3, 0x0e, 0x02, 0x02, 0x9a, 0x7d, 0x85, 0x75, 0x4a, 0x07, 0x5a, 0x5a, 0x65, 0x07, 0x95, 0x42, 0x42, 0xc5, 0xc2, 0x4c, 0xd3, 0x27, 0xdc, 0x4c, 0x5d, 0x94, 0x7d, 0xc6, 0x89, 0xbc, 0x10, + 0x1f, 0x0e, 0xfc, 0x5e, 0x59, 0xc4, 0x15, 0x07, 0xaf, 0xfb, 0x0b, 0x26, 0x1f, 0xb8, 0x83, 0x3c, 0x49, 0x49, 0x66, 0x98, 0x37, 0xf2, 0x70, 0x6a, 0x34, 0x38, 0xc2, 0xd3, 0xbb, 0xbd, 0xa9, 0x13, + 0x8c, 0x5c, 0xe8, 0xb0, 0x17, 0x85, 0xf8, 0xa7, 0xe0, 0x96, 0xbf, 0xa3, 0x58, 0xda, 0x46, 0xb1, 0x3c, 0x51, 0x7b, 0x9a, 0xea, 0xab, 0xa1, 0x6e, 0x1a, 0xdd, 0xaf, 0xbc, 0x4a, 0xaf, 0x99, 0xc6, + 0xd7, 0xa4, 0x81, 0xee, 0xcd, 0x89, 0x36, 0xe6, 0x31, 0xd4, 0x75, 0xb5, 0xe5, 0x3c, 0x50, 0xb3, 0x94, 0xd8, 0x85, 0xe6, 0x70, 0x87, 0xdb, 0x1c, 0x1a, 0x4e, 0xe7, 0x2e, 0xb4, 0xcf, 0x61, 0xfd, + 0xf9, 0x6a, 0x45, 0x53, 0x33, 0x13, 0x47, 0x1f, 0x17, 0x03, 0x86, 0xae, 0xcc, 0xab, 0xf6, 0xdf, 0xf5, 0x4e, 0xf5, 0xf8, 0x49, 0xef, 0xc7, 0xdd, 0x23, 0xad, 0xe7, 0xfa, 0x8b, 0xe2, 0x62, 0x55, + 0xf6, 0x47, 0x21, 0x99, 0xa3, 0x8b, 0xb5, 0x36, 0x1d, 0xf5, 0xeb, 0x8e, 0x86, 0x75, 0x38, 0xce, 0x2e, 0xe7, 0x68, 0x99, 0x66, 0x0c, 0x59, 0x6a, 0x65, 0xaa, 0xb9, 0xd2, 0x24, 0xce, 0x08, 0x8b, + 0x63, 0x96, 0x3b, 0x6f, 0xc7, 0xa4, 0x35, 0xee, 0xb9, 0x60, 0xba, 0x9a, 0x78, 0x7d, 0x70, 0xd7, 0x68, 0xa2, 0x39, 0xe3, 0xab, 0x66, 0x9f, 0x90, 0x6e, 0x1d, 0x47, 0x28, 0x94, 0x98, 0x9b, 0x4f, + 0x31, 0x0c, 0x9a, 0x1b, 0xaa, 0x69, 0xdd, 0x35, 0xf7, 0xb9, 0x19, 0x1e, 0x3e, 0xf6, 0x11, 0x03, 0x5e, 0x5b, 0xd3, 0x7f, 0xa2, 0x7e, 0x60, 0xc4, 0xed, 0xb9, 0xb6, 0xeb, 0x7b, 0x48, 0xf6, 0x48, + 0xa7, 0x27, 0x75, 0x24, 0x66, 0x88, 0x0d, 0x1b, 0x47, 0xc8, 0x00, 0xbd, 0xd7, 0xc1, 0x57, 0x61, 0xae, 0x31, 0x98, 0xb0, 0x9b, 0x5b, 0xf3, 0x4a, 0xd5, 0x49, 0x26, 0x1a, 0x04, 0x3d, 0xc5, 0x5a, + 0xd1, 0x0a, 0x91, 0x2b, 0x18, 0x26, 0xeb, 0xec, 0x9a, 0x6a, 0x06, 0x26, 0xaa, 0x6d, 0x33, 0x43, 0x1a, 0x0d, 0x76, 0x9d, 0xac, 0xb7, 0xc0, 0xaa, 0x6c, 0xca, 0xad, 0x0d, 0x25, 0xad, 0xc0, 0xbc, + 0xcd, 0x52, 0x56, 0x73, 0xc3, 0x3c, 0x35, 0x1f, 0x3a, 0xa1, 0xa1, 0x97, 0xa2, 0x5d, 0xce, 0x44, 0x4f, 0x1c, 0x39, 0x1e, 0x9e, 0xfc, 0x46, 0xcf, 0xfa, 0x39, 0x13, 0xac, 0xf5, 0x00, 0xab, 0x76, + 0xa2, 0x99, 0xa4, 0x2a, 0xdf, 0xa3, 0x26, 0xf5, 0x24, 0xe7, 0xa0, 0x8d, 0x37, 0x5f, 0x48, 0xb7, 0xb2, 0x7d, 0xaf, 0x72, 0x7f, 0x7f, 0x0d, 0xf7, 0x4a, 0x51, 0x96, 0x23, 0xc5, 0xc3, 0x1b, 0x1f, + 0xfe, 0xb7, 0x2d, 0xc3, 0x62, 0xd2, 0x68, 0xb1, 0xec, 0xcd, 0xd9, 0xc6, 0x86, 0x23, 0x23, 0x1e, 0xcc, 0x71, 0x58, 0xa3, 0xab, 0x05, 0x5f, 0xae, 0x4c, 0xb6, 0xdf, 0xd9, 0x68, 0x73, 0xcf, 0xab, + 0xeb, 0xa1, 0xc3, 0x66, 0x5c, 0xa8, 0x93, 0x55, 0x0c, 0x04, 0x60, 0xc7, 0x91, 0x32, 0x61, 0x55, 0xae, 0x4c, 0x64, 0x04, 0xaf, 0x41, 0x06, 0x2b, 0x2b, 0x30, 0xa4, 0x8d, 0x29, 0xe4, 0xf4, 0x27, + 0x91, 0x12, 0x61, 0x01, 0x67, 0x16, 0xe3, 0x17, 0xe1, 0xcc, 0x2e, 0xf7, 0xfb, 0xef, 0xad, 0xe8, 0xd4, 0xc0, 0xf4, 0x75, 0x35, 0x3b, 0xa7, 0x0a, 0xdd, 0x40, 0x88, 0x3d, 0x59, 0x0b, 0x1e, 0xb8, + 0x72, 0x5e, 0x2c, 0xdc, 0xac, 0x47, 0xee, 0xd4, 0xf5, 0xba, 0x59, 0x2e, 0xe4, 0x66, 0x1a, 0x74, 0x33, 0xb7, 0xf9, 0xb5, 0x60, 0xbc, 0xbe, 0x7c, 0x07, 0xcc, 0xe9, 0xe2, 0xf2, 0x75, 0x7d, 0xb5, + 0x53, 0xa4, 0xc5, 0xb7, 0x16, 0x14, 0xad, 0xb6, 0xe9, 0x6f, 0x73, 0xa7, 0xda, 0x77, 0x9c, 0x47, 0x3b, 0x46, 0x9f, 0x8b, 0x7f, 0xbd, 0x3d, 0xea, 0x46, 0x7f, 0x79, 0x01, 0xb0, 0xb7, 0x3b, 0x2a, + 0xe0, 0xed, 0xc6, 0x0c, 0xf8, 0xff, 0xed, 0xba, 0xeb, 0xb5, 0xcd, 0xdc, 0x3f, 0xbc, 0x1c, 0xbb, 0x10, 0xc4, 0xfd, 0xea, 0x69, 0x6f, 0x37, 0xe2, 0xb8, 0x2d, 0xb1, 0xd4, 0x5e, 0x1c, 0xdf, 0xa9, + 0xa2, 0xf6, 0xf6, 0x48, 0x34, 0x7f, 0x79, 0x25, 0xb5, 0xb7, 0x16, 0x5d, 0xf6, 0x79, 0xbd, 0xb4, 0xb7, 0x3f, 0xd6, 0x89, 0xff, 0x44, 0xdd, 0xb4, 0xb7, 0x47, 0xdc, 0xfc, 0xcb, 0x6b, 0xa7, 0xbd, + 0xb5, 0xe0, 0x66, 0xcb, 0x38, 0x1d, 0xf4, 0xb7, 0xc2, 0x3b, 0xda, 0xd7, 0x3d, 0x7b, 0x7b, 0xc8, 0xac, 0xbf, 0xba, 0xf6, 0xd9, 0xdb, 0x4b, 0x5a, 0xe1, 0x59, 0x0d, 0xb4, 0xb7, 0xaf, 0x7b, 0xec, + 0xe7, 0x89, 0xf7, 0xed, 0xed, 0x49, 0x2d, 0xb4, 0xb7, 0x87, 0x2a, 0xa4, 0x55, 0x9c, 0x0e, 0xfe, 0xf2, 0x58, 0x68, 0x5f, 0xc7, 0xec, 0xed, 0x91, 0x10, 0xff, 0xf2, 0x5a, 0x66, 0x6f, 0x2f, 0x09, + 0x51, 0xfd, 0xa2, 0xa6, 0xd9, 0x5b, 0x0b, 0x07, 0x9a, 0x96, 0xaa, 0xba, 0xd9, 0x35, 0xf7, 0xb1, 0x1a, 0x66, 0x8f, 0x77, 0x11, 0x8f, 0x0e, 0xdb, 0x17, 0xec, 0xea, 0x6b, 0xe2, 0x07, 0x63, 0xf5, + 0xfa, 0xcc, 0x29, 0xc8, 0xbe, 0xc5, 0x02, 0xcc, 0xed, 0x17, 0xb3, 0x11, 0x33, 0xb4, 0xd3, 0xd1, 0x96, 0x18, 0xc1, 0xe5, 0x60, 0x0c, 0x60, 0xfb, 0xb8, 0x01, 0x89, 0x66, 0x31, 0xa2, 0x41, 0x70, + 0x19, 0x17, 0x76, 0xe2, 0x04, 0x72, 0xbe, 0x0e, 0x84, 0x29, 0x8e, 0x41, 0x64, 0xd0, 0x2f, 0xe6, 0x42, 0x34, 0x95, 0x87, 0xbe, 0x31, 0xa0, 0x7d, 0xd0, 0x86, 0x48, 0xa2, 0xb0, 0xa2, 0xc6, 0x50, + 0x47, 0xf6, 0x86, 0xd3, 0xe5, 0xa1, 0x86, 0x43, 0x09, 0xeb, 0xbe, 0x96, 0xac, 0xf5, 0x69, 0xed, 0x7d, 0xc7, 0xb9, 0xa4, 0x47, 0xa1, 0xae, 0xe6, 0xdd, 0xe0, 0x58, 0x01, 0xee, 0x07, 0xf8, 0x38, + 0x30, 0xe4, 0xc8, 0x8f, 0x47, 0x8b, 0x19, 0xe4, 0xa5, 0xba, 0x46, 0x27, 0x92, 0x67, 0x5e, 0x67, 0x47, 0xad, 0xde, 0xc2, 0x45, 0xa7, 0x91, 0x45, 0xd0, 0xe1, 0xa1, 0x79, 0x23, 0x20, 0x1b, 0x66, + 0xd1, 0x94, 0x4e, 0x80, 0xdb, 0xe3, 0x06, 0xaa, 0xad, 0xa5, 0x46, 0xe7, 0xb8, 0xbc, 0xf4, 0xf5, 0x01, 0x47, 0x95, 0x59, 0x90, 0xf4, 0x15, 0x65, 0x58, 0xa1, 0x78, 0x83, 0xc3, 0xb8, 0xbf, 0xf6, + 0x7a, 0x1e, 0x54, 0x0f, 0x66, 0x1b, 0x04, 0x19, 0x61, 0xa3, 0x8e, 0x4f, 0x4b, 0xb1, 0x22, 0xcc, 0xa0, 0x1d, 0xe9, 0x77, 0x08, 0x72, 0xa4, 0x82, 0xaf, 0x71, 0xd8, 0x72, 0x7d, 0xbf, 0x9b, 0xaa, + 0xa1, 0x7d, 0xc6, 0x2d, 0x7e, 0xcc, 0xbe, 0x63, 0x65, 0xae, 0xae, 0x95, 0x46, 0xc1, 0x57, 0x3d, 0xf7, 0xfb, 0x3c, 0xfc, 0x45, 0xf7, 0xc0, 0xc8, 0x5f, 0xad, 0xb6, 0x59, 0x21, 0x82, 0xa4, 0x6f, + 0x07, 0x2b, 0xad, 0xcf, 0xe5, 0x83, 0x88, 0xd0, 0x9c, 0x64, 0x90, 0xe1, 0x18, 0x0e, 0x8e, 0x6a, 0x03, 0xdd, 0xaa, 0x51, 0xa9, 0xf8, 0x53, 0x60, 0xd7, 0x5b, 0x23, 0x8e, 0xb7, 0x5e, 0x0d, 0x81, + 0xa6, 0xda, 0x10, 0x1c, 0xbd, 0x36, 0x16, 0x1c, 0x6a, 0x8f, 0x73, 0x40, 0x6b, 0xaa, 0x45, 0x4f, 0xd0, 0xe6, 0x58, 0x12, 0x69, 0x9d, 0x21, 0xe6, 0x15, 0x99, 0x92, 0x69, 0xa0, 0x2c, 0x71, 0x70, + 0x9b, 0xc0, 0x0a, 0x5d, 0xd5, 0x1d, 0xf3, 0xe8, 0x94, 0x3e, 0xf0, 0xd6, 0x7c, 0x58, 0x03, 0x0a, 0x7f, 0xc9, 0x87, 0xf0, 0x89, 0xfa, 0xc1, 0x48, 0xbe, 0x3d, 0xd7, 0xc5, 0xdb, 0xf9, 0x10, 0xa6, + 0x1e, 0xa2, 0x53, 0xec, 0xac, 0x9f, 0x4c, 0x95, 0x2d, 0x31, 0x6f, 0x70, 0x74, 0x15, 0xd6, 0x30, 0x2b, 0x53, 0x8a, 0xe8, 0xbb, 0xd2, 0x22, 0xb1, 0x34, 0x73, 0x96, 0xda, 0x94, 0x04, 0x55, 0x1c, + 0xe5, 0x3a, 0x72, 0xd0, 0x5f, 0x85, 0xa9, 0x4a, 0xe7, 0x93, 0x9c, 0xd3, 0xd9, 0x39, 0xba, 0x6f, 0x88, 0x6a, 0xd8, 0xe1, 0xa3, 0x49, 0xbf, 0x93, 0x65, 0x43, 0xa5, 0x2c, 0x31, 0xda, 0x1e, 0xf6, + 0xc6, 0x4f, 0xcb, 0x3d, 0x3f, 0xd8, 0x58, 0xf4, 0xa3, 0xf0, 0xf0, 0xfe, 0xc7, 0x62, 0xda, 0xbf, 0x90, 0x7e, 0xae, 0xb6, 0xc8, 0xfe, 0x5f, 0xf6, 0xde, 0xa4, 0x3b, 0x5d, 0xad, 0xdb, 0x1b, 0xed, + 0xbf, 0x9f, 0x62, 0x8f, 0xdd, 0xf5, 0xba, 0xa9, 0xab, 0xdb, 0x3a, 0xa2, 0x28, 0xa8, 0x80, 0x80, 0xa0, 0xd0, 0x38, 0x63, 0x50, 0xd7, 0x85, 0x94, 0x4a, 0xe3, 0xf9, 0xec, 0x77, 0x44, 0x4d, 0xa2, + 0x89, 0x26, 0xfc, 0x3d, 0xfb, 0x1d, 0xb7, 0x73, 0x5a, 0x81, 0x85, 0x99, 0xb0, 0x7e, 0xab, 0x9a, 0xf5, 0xf4, 0xdd, 0x7a, 0x5c, 0xd5, 0xa5, 0x6b, 0xa6, 0xd7, 0x9d, 0x16, 0x7a, 0x60, 0x66, 0x3b, + 0x83, 0x31, 0xae, 0xdc, 0xd4, 0xcc, 0xea, 0xd0, 0x7e, 0xe7, 0xb6, 0xbf, 0xec, 0x0e, 0xb1, 0x7b, 0x6a, 0x1f, 0x1e, 0xa0, 0x7f, 0x27, 0x79, 0xe7, 0x96, 0x6f, 0x32, 0xef, 0xd7, 0x20, 0xa8, 0x9b, + 0xdf, 0x7c, 0x3a, 0x4c, 0x5d, 0x8b, 0x82, 0x7f, 0x97, 0x5f, 0xdf, 0x3b, 0x92, 0x84, 0xf1, 0x6d, 0x67, 0xde, 0x97, 0xd0, 0x0d, 0x3e, 0xcf, 0x44, 0xd0, 0xbb, 0xce, 0x3e, 0x17, 0x41, 0x5f, 0x65, + 0xac, 0x3e, 0xc9, 0x03, 0xe3, 0x9b, 0x9b, 0x3f, 0xf1, 0x9b, 0xcd, 0xe8, 0xf9, 0x68, 0x0e, 0x95, 0x13, 0x43, 0x9b, 0x36, 0x40, 0x41, 0x94, 0x51, 0xef, 0x4f, 0x46, 0xba, 0x85, 0x26, 0x9e, 0xbe, + 0x2f, 0x8b, 0x84, 0x30, 0x71, 0x2d, 0x5d, 0x96, 0x2a, 0xd9, 0xcd, 0x29, 0x0e, 0x9a, 0xae, 0xda, 0x0d, 0x20, 0x75, 0x1b, 0xc1, 0x60, 0x33, 0x31, 0xe9, 0xac, 0x6d, 0xac, 0xe3, 0x4e, 0x5b, 0xcf, + 0xb9, 0x7e, 0xce, 0x2b, 0x27, 0x69, 0x6f, 0xad, 0xf3, 0xad, 0xb4, 0x91, 0x8b, 0xff, 0xb9, 0xdf, 0x6c, 0xd1, 0xa4, 0xb7, 0xe9, 0x9e, 0x6e, 0x1e, 0x3e, 0x66, 0x7c, 0xbe, 0x8d, 0xf8, 0x73, 0xbd, + 0xf6, 0xab, 0xcc, 0xcf, 0xfd, 0x2b, 0x80, 0xf1, 0x97, 0x86, 0x07, 0xde, 0x2b, 0x7f, 0x3d, 0x03, 0xbd, 0x3e, 0x08, 0xfb, 0x52, 0x21, 0xc8, 0x9c, 0x17, 0x19, 0x02, 0x11, 0xf8, 0xe3, 0x0a, 0x65, + 0xf8, 0xb5, 0x54, 0x49, 0x79, 0xb7, 0xf3, 0xc8, 0x68, 0x95, 0xe7, 0x2c, 0xe5, 0x13, 0xc7, 0x8d, 0xd9, 0xca, 0x5b, 0x02, 0xc4, 0x65, 0xdc, 0x8a, 0xa5, 0x25, 0x3e, 0xd3, 0xe1, 0xad, 0x4b, 0x48, + 0x4d, 0x6c, 0x1a, 0x55, 0x93, 0x1c, 0x4d, 0x04, 0xec, 0x24, 0xc2, 0x8a, 0xc1, 0x22, 0x45, 0xf7, 0x21, 0x9b, 0x0e, 0x12, 0xa2, 0xfe, 0xcf, 0xed, 0xdf, 0xcf, 0xcd, 0x2e, 0x49, 0xc6, 0x56, 0xf8, + 0xb4, 0x30, 0xe0, 0x6b, 0xa5, 0x41, 0x3f, 0xa8, 0x9e, 0x37, 0xb7, 0xeb, 0xf5, 0x90, 0x02, 0xa1, 0x6f, 0x08, 0x11, 0xe2, 0x68, 0x6e, 0x4d, 0xc3, 0xa0, 0xa4, 0xb1, 0xdd, 0xc2, 0x9a, 0xeb, 0x6e, + 0x65, 0xd7, 0x5d, 0xba, 0x5d, 0x99, 0x2e, 0x5e, 0x8a, 0x21, 0xd7, 0xa7, 0x3d, 0x14, 0xda, 0xa5, 0xbb, 0x5b, 0x8e, 0x40, 0x73, 0x42, 0xac, 0x97, 0x5e, 0x73, 0x08, 0x98, 0x2a, 0x87, 0xb7, 0x54, + 0x66, 0x17, 0xf6, 0xbc, 0xee, 0x79, 0xa9, 0xee, 0xf7, 0x1e, 0x2c, 0x2d, 0x16, 0x8d, 0xbb, 0x5b, 0x2e, 0xb6, 0x7a, 0x75, 0x28, 0x27, 0xbf, 0x5b, 0xba, 0xde, 0xd3, 0x96, 0xbd, 0xc3, 0xf1, 0xc0, + 0xc8, 0xfe, 0xb6, 0xce, 0xc2, 0xec, 0x4d, 0x86, 0xa9, 0xce, 0xf5, 0x46, 0xbf, 0x6e, 0x0b, 0xdf, 0xa0, 0xad, 0xc2, 0xfa, 0x07, 0xde, 0xe4, 0xb5, 0xf3, 0xe3, 0x4a, 0xf5, 0x0a, 0xed, 0xf9, 0xfa, + 0x41, 0xc8, 0xc3, 0x43, 0x68, 0x37, 0x24, 0x1d, 0x4d, 0xaa, 0x7d, 0x6b, 0x28, 0x23, 0x8d, 0x9b, 0xa9, 0x1c, 0x04, 0x05, 0xec, 0x54, 0x62, 0x5a, 0x02, 0xd5, 0xb7, 0x38, 0xa1, 0xab, 0x21, 0xb6, + 0x5c, 0xce, 0x85, 0x1d, 0x77, 0x58, 0xc3, 0x08, 0x56, 0xd1, 0x69, 0xb4, 0x47, 0x47, 0x87, 0x23, 0xc5, 0x37, 0x6d, 0x52, 0x61, 0x61, 0x7b, 0x12, 0x18, 0xc1, 0xae, 0x8f, 0x28, 0x7e, 0x94, 0xd6, + 0x12, 0x62, 0x6e, 0x1b, 0x86, 0xa8, 0x2a, 0x73, 0x88, 0xce, 0xf9, 0x56, 0x13, 0xf9, 0x08, 0x8b, 0xd7, 0x62, 0xeb, 0x3e, 0xa8, 0x9e, 0xb1, 0xb8, 0x5e, 0x0f, 0x8d, 0xad, 0x5b, 0xc3, 0xa4, 0xb2, + 0xa5, 0x21, 0x02, 0xcc, 0xba, 0x9d, 0x82, 0x23, 0x6a, 0x54, 0x27, 0x8c, 0xc8, 0x20, 0x4e, 0xe2, 0x48, 0x93, 0xc2, 0x5c, 0xee, 0x8d, 0x58, 0xe4, 0xa0, 0x86, 0x9f, 0x7b, 0xbd, 0x87, 0x94, 0x72, + 0xb3, 0x71, 0x7d, 0xd6, 0x64, 0xdd, 0xea, 0xe4, 0xba, 0x23, 0xfd, 0x28, 0x8d, 0x76, 0xb8, 0xd2, 0xca, 0x33, 0x49, 0xc3, 0xd5, 0xd2, 0x11, 0x1d, 0x39, 0x94, 0x21, 0x0c, 0xe9, 0x96, 0x4f, 0xce, + 0xce, 0x7b, 0x2c, 0x82, 0xe7, 0x79, 0x84, 0xd1, 0x97, 0xd2, 0xb6, 0xde, 0x2b, 0xdb, 0xd0, 0x61, 0x19, 0x5a, 0xf3, 0x55, 0x66, 0x05, 0xf3, 0x93, 0xcc, 0xed, 0x0b, 0xb5, 0x71, 0x7b, 0x32, 0xa4, + 0xf9, 0xf4, 0xc4, 0x98, 0x68, 0x66, 0x45, 0x28, 0x27, 0x4a, 0xa7, 0x26, 0xb0, 0x81, 0xee, 0x44, 0xc5, 0x3a, 0x01, 0xec, 0xb4, 0x8d, 0xdd, 0x71, 0x22, 0xa5, 0x4d, 0x70, 0x9c, 0xdc, 0x34, 0xa4, + 0x1c, 0x8b, 0xc4, 0x08, 0x5c, 0x10, 0xb8, 0xb2, 0x96, 0x45, 0xf7, 0xd4, 0x51, 0xd3, 0x42, 0x02, 0x71, 0x28, 0x44, 0xd3, 0x01, 0xcb, 0xec, 0x37, 0x4d, 0xda, 0xaf, 0x5a, 0xb4, 0x2f, 0xab, 0x2c, + 0xc8, 0xe3, 0xd0, 0x31, 0x9f, 0x65, 0x89, 0x41, 0xfe, 0x41, 0x5f, 0xf0, 0x02, 0x7e, 0x27, 0x7a, 0xc6, 0xf4, 0x72, 0x39, 0x3e, 0x53, 0xfa, 0x1d, 0xd6, 0x59, 0xcd, 0x23, 0x3e, 0x11, 0x35, 0xd3, + 0xbd, 0x74, 0x9c, 0x6b, 0x8a, 0xb0, 0x11, 0xe8, 0x13, 0x33, 0x85, 0x47, 0x02, 0x97, 0xd6, 0x74, 0x73, 0x94, 0xa4, 0x76, 0x97, 0xb0, 0x4d, 0x56, 0x2c, 0x39, 0x05, 0x13, 0xed, 0x12, 0x4c, 0x16, + 0x08, 0x88, 0xdb, 0x53, 0x62, 0x3e, 0x0d, 0x09, 0x9b, 0x99, 0x80, 0x5e, 0x9f, 0x9e, 0xac, 0x8d, 0xca, 0x25, 0x68, 0x7d, 0xa4, 0xb9, 0xdc, 0x8a, 0x21, 0x7f, 0x21, 0xbe, 0x6a, 0x1e, 0xf8, 0x70, + 0x99, 0xff, 0xfb, 0x3f, 0xdf, 0x82, 0x15, 0x3f, 0xe4, 0xa6, 0xb7, 0x67, 0x5f, 0x18, 0x35, 0xaf, 0x72, 0xdb, 0xf7, 0x92, 0x21, 0xff, 0xf9, 0xe6, 0xed, 0xe5, 0x27, 0xb9, 0x35, 0x2e, 0xcc, 0xd2, + 0xbd, 0x28, 0x31, 0xfe, 0xf3, 0x8d, 0x8f, 0x0b, 0xab, 0xf1, 0xd5, 0x2c, 0xf6, 0xee, 0xf0, 0xf4, 0x9f, 0xef, 0xb5, 0x51, 0x3e, 0xb3, 0x62, 0xfc, 0xe7, 0x5b, 0x56, 0x8c, 0xef, 0x1e, 0xed, 0xff, + 0xf9, 0xc6, 0xe8, 0x95, 0xae, 0xe9, 0x38, 0x61, 0x59, 0x5c, 0x9f, 0x62, 0x4f, 0x27, 0x48, 0x38, 0x0e, 0x33, 0xef, 0x99, 0x07, 0xc7, 0x6b, 0x9e, 0xac, 0x57, 0x9a, 0x6f, 0xd3, 0xe3, 0x72, 0x35, + 0xd4, 0x7f, 0x15, 0xab, 0x57, 0x04, 0x53, 0x97, 0x06, 0x28, 0x8c, 0xc4, 0xf5, 0x9c, 0xaf, 0x83, 0xfa, 0x20, 0x46, 0xa8, 0xc7, 0xc1, 0x4b, 0xd7, 0x22, 0xc9, 0x29, 0x3a, 0x9d, 0x18, 0x9b, 0x06, + 0xc6, 0xd6, 0x33, 0x4d, 0xf5, 0xf7, 0x4b, 0x70, 0x82, 0x2c, 0x2b, 0x74, 0xc3, 0x2f, 0x0e, 0x65, 0x06, 0x2e, 0x55, 0x68, 0x07, 0xf2, 0x01, 0x04, 0x18, 0x64, 0x67, 0xf4, 0xfa, 0xe6, 0x78, 0x50, + 0xcb, 0xbd, 0x4b, 0x5b, 0xf9, 0x74, 0xd0, 0x06, 0x7c, 0x63, 0xd0, 0x79, 0x8c, 0x03, 0xfc, 0xca, 0x06, 0xfc, 0x4e, 0xf5, 0x0d, 0x89, 0xf7, 0xeb, 0x31, 0xfc, 0xad, 0x10, 0xe0, 0x43, 0x2c, 0x4e, + 0xa8, 0x9d, 0xf3, 0xf6, 0x29, 0xf1, 0x95, 0xa9, 0xa3, 0x85, 0x59, 0x14, 0xce, 0xe8, 0x46, 0x26, 0x37, 0xd3, 0x29, 0x6c, 0xad, 0xa3, 0xd3, 0x62, 0xdb, 0x31, 0xe9, 0xc6, 0xa2, 0x04, 0x56, 0x06, + 0x24, 0x53, 0x50, 0x71, 0x46, 0x15, 0xf7, 0xf6, 0x56, 0x07, 0x2a, 0x5c, 0x8b, 0x16, 0xfc, 0x0c, 0x67, 0x04, 0x85, 0x31, 0x5d, 0x49, 0x67, 0xa7, 0x3a, 0xb8, 0x10, 0x16, 0x0a, 0x16, 0x79, 0x7c, + 0xb7, 0x19, 0xe2, 0xe0, 0x7c, 0xe7, 0xe8, 0xf8, 0x08, 0x0c, 0xf0, 0x25, 0xf3, 0xf8, 0x27, 0xd9, 0x2b, 0x1a, 0x97, 0x9b, 0x31, 0x38, 0xcc, 0x40, 0x4e, 0x48, 0x3e, 0xbc, 0x2c, 0xdd, 0x02, 0x52, + 0x80, 0x91, 0x84, 0x30, 0xb6, 0x1b, 0x1a, 0xb5, 0x64, 0xcf, 0x36, 0xbb, 0x63, 0x30, 0x69, 0xe9, 0x6e, 0xc4, 0xc8, 0x1e, 0x04, 0xe1, 0x70, 0x8b, 0x56, 0x61, 0xbc, 0x2c, 0xdb, 0x3c, 0xe2, 0xd9, + 0xf9, 0x61, 0x5f, 0x93, 0x12, 0xa7, 0x05, 0x26, 0xa9, 0x26, 0x2c, 0x55, 0xfa, 0x2a, 0x48, 0xbb, 0xbb, 0xcd, 0xa9, 0x36, 0x28, 0x60, 0xdb, 0xeb, 0x87, 0x44, 0x1d, 0xe0, 0xe0, 0xf3, 0x11, 0x61, + 0xf6, 0xee, 0x86, 0x73, 0xb3, 0xc6, 0x72, 0x2b, 0x72, 0xed, 0x7a, 0x6c, 0x56, 0xd5, 0xbb, 0x8d, 0xf1, 0xfb, 0x6e, 0xfd, 0xd5, 0x14, 0x08, 0xdf, 0xe5, 0x9b, 0xfb, 0x02, 0xfc, 0xc5, 0x83, 0xf4, + 0xf1, 0x04, 0x7c, 0xe9, 0xe4, 0x7b, 0xa3, 0x78, 0x86, 0xfb, 0x4d, 0xfa, 0xfc, 0xee, 0x76, 0xf2, 0xc0, 0xe0, 0xbc, 0x40, 0xa8, 0x75, 0x06, 0xc5, 0x1e, 0x9b, 0x8f, 0x66, 0x46, 0x27, 0xd1, 0xfa, + 0x44, 0x98, 0xe7, 0xd3, 0x90, 0x95, 0x20, 0xf2, 0x8b, 0xc1, 0xf9, 0x9b, 0x48, 0xfb, 0x2f, 0x32, 0xc8, 0x77, 0xa4, 0x3f, 0x3a, 0xf0, 0xde, 0x30, 0x84, 0x55, 0x86, 0xc6, 0xa0, 0x73, 0xda, 0x8b, + 0xca, 0xe4, 0xb8, 0xf5, 0x0c, 0xa0, 0x2d, 0x93, 0x29, 0x47, 0x6c, 0x1b, 0x41, 0xe2, 0x30, 0x7c, 0x57, 0xbd, 0x72, 0x5c, 0xa4, 0x61, 0x1a, 0xda, 0xdf, 0x25, 0xf8, 0x67, 0xdb, 0x6a, 0x92, 0x37, + 0xce, 0xc7, 0x29, 0xf1, 0x8c, 0xa7, 0x7b, 0x09, 0x99, 0x77, 0xba, 0x17, 0x58, 0xde, 0xef, 0xce, 0x7c, 0xdd, 0x00, 0xbe, 0xc6, 0x88, 0x98, 0x79, 0x74, 0x04, 0xe9, 0x65, 0x16, 0xe6, 0xa4, 0xc2, + 0xcc, 0xa0, 0x6d, 0x3f, 0x23, 0x16, 0xec, 0x04, 0x82, 0xc8, 0x7e, 0x1a, 0x83, 0x28, 0xdf, 0xe3, 0xe6, 0x8c, 0xe7, 0xc3, 0x70, 0x84, 0x02, 0x46, 0xbb, 0xc7, 0xd6, 0x1b, 0x3f, 0x83, 0x66, 0x68, + 0xb2, 0xc5, 0x96, 0x11, 0xc1, 0xe6, 0xce, 0xd4, 0x72, 0x5c, 0x59, 0xc1, 0x9d, 0x3d, 0x49, 0x36, 0x19, 0x0b, 0xe2, 0x92, 0x8d, 0xa4, 0xf1, 0x10, 0xbe, 0xe6, 0x52, 0xe9, 0xe4, 0x3f, 0xe7, 0x4c, + 0x06, 0x77, 0xae, 0xb5, 0x4d, 0x1d, 0x5e, 0xb4, 0x0c, 0xe0, 0xb7, 0xb2, 0x63, 0x4d, 0x73, 0xf1, 0x18, 0xfe, 0x0f, 0x79, 0x5b, 0xb1, 0xf2, 0x0b, 0xd2, 0x4f, 0xaa, 0x54, 0x7e, 0x3d, 0xc6, 0x5e, + 0xd8, 0xb1, 0x7e, 0xac, 0x4e, 0x39, 0x30, 0x39, 0x89, 0x2c, 0x33, 0xd3, 0x4d, 0x15, 0x11, 0x61, 0x03, 0x1c, 0x2d, 0x2c, 0x5f, 0xe9, 0x76, 0x35, 0x67, 0x95, 0xa2, 0x98, 0x0b, 0x59, 0x15, 0x01, + 0x18, 0x2c, 0x6a, 0x5b, 0x79, 0x65, 0xa1, 0xfd, 0x06, 0xcb, 0xb3, 0x7d, 0xa7, 0xcd, 0x91, 0x5e, 0x4b, 0xd3, 0x6d, 0x2e, 0xd8, 0xa2, 0xb7, 0x98, 0x8e, 0xa6, 0xf2, 0xac, 0xf0, 0x56, 0x80, 0x8a, + 0x91, 0xa8, 0xc7, 0xfb, 0x08, 0x69, 0xb0, 0x53, 0x93, 0x49, 0x56, 0xd2, 0xef, 0x78, 0xdf, 0x97, 0x9e, 0xfc, 0xcf, 0xc5, 0xcd, 0xfb, 0x07, 0x00, 0xb3, 0xe7, 0x25, 0xb8, 0xa1, 0x97, 0xca, 0xca, + 0xfc, 0x54, 0x67, 0x72, 0x40, 0x49, 0x13, 0x47, 0x3c, 0x8d, 0x90, 0x49, 0xb3, 0x43, 0x4c, 0xb8, 0x13, 0x2c, 0x83, 0xe5, 0x1a, 0xde, 0x28, 0xb6, 0xb6, 0x1f, 0x2d, 0x9a, 0xb5, 0x0a, 0x34, 0xf4, + 0x1a, 0x68, 0x2c, 0xdb, 0x98, 0x53, 0xe2, 0xde, 0x9a, 0xe5, 0xa4, 0xe7, 0xa1, 0x22, 0x79, 0xd2, 0x0a, 0x8c, 0xf6, 0x40, 0xd7, 0x53, 0xc8, 0x86, 0xc9, 0xf5, 0x1c, 0x3b, 0xa0, 0xf3, 0x23, 0xe1, + 0xe8, 0x94, 0xe8, 0x4b, 0x8b, 0xbd, 0x3f, 0xa9, 0xa4, 0x6f, 0x0e, 0x51, 0x5f, 0x3d, 0xf3, 0x9f, 0x75, 0xff, 0x05, 0x1e, 0xf9, 0x96, 0xf2, 0x07, 0x02, 0xd7, 0xfb, 0x07, 0xc5, 0x36, 0x1f, 0x82, + 0x70, 0x08, 0xe9, 0x28, 0x2e, 0x2c, 0x7e, 0x2d, 0x02, 0xec, 0x1a, 0x27, 0x4f, 0xa3, 0x24, 0x40, 0x0f, 0x20, 0x20, 0x42, 0xbc, 0x31, 0x8f, 0x60, 0x79, 0x8f, 0xef, 0x81, 0x55, 0xca, 0x9b, 0xc8, + 0xc8, 0x5f, 0xce, 0x90, 0x7e, 0xb4, 0xeb, 0x38, 0xc8, 0xe8, 0x67, 0xec, 0xa9, 0x6a, 0x0f, 0xec, 0x42, 0x41, 0xd2, 0x0d, 0x9e, 0xf6, 0xd9, 0xc6, 0x8e, 0x8b, 0x7d, 0xda, 0x41, 0x19, 0x47, 0xd9, + 0xcb, 0xe8, 0x24, 0xfb, 0x0f, 0x41, 0x78, 0xee, 0xef, 0xf4, 0x4a, 0xe8, 0xce, 0x47, 0xfc, 0xf4, 0x35, 0x74, 0x1a, 0xfa, 0x3d, 0x6c, 0xe7, 0xad, 0xbf, 0xe6, 0x48, 0x3d, 0x6c, 0x03, 0x34, 0xf6, + 0x0d, 0x1f, 0x50, 0x92, 0x45, 0xeb, 0x59, 0xfd, 0x8c, 0x2d, 0x7c, 0xb9, 0x21, 0x26, 0x13, 0x49, 0x4c, 0xd3, 0x83, 0xcc, 0x2e, 0xb3, 0x63, 0x20, 0x1b, 0xdc, 0x74, 0x35, 0x57, 0xb7, 0x14, 0x64, + 0x95, 0x5a, 0x20, 0x08, 0x35, 0x46, 0x4e, 0xf9, 0x9d, 0x4a, 0x6d, 0x2a, 0xda, 0x6a, 0x91, 0xcd, 0x6c, 0x6a, 0xa8, 0xac, 0xa5, 0x1d, 0x9b, 0x59, 0xc8, 0xc2, 0x69, 0x7d, 0xb7, 0x39, 0xe5, 0xc5, + 0x25, 0xf5, 0xfa, 0x43, 0xc6, 0x27, 0x4f, 0xad, 0x30, 0x73, 0x9d, 0xef, 0x7a, 0xc9, 0xaf, 0x27, 0x1a, 0xf9, 0x02, 0x20, 0x77, 0xb4, 0xcf, 0xc8, 0xdc, 0xb5, 0x9c, 0xcf, 0x34, 0xf2, 0x77, 0x88, + 0xe6, 0x92, 0x80, 0xf2, 0xb2, 0xd7, 0x2c, 0x5d, 0xd6, 0x23, 0x6c, 0xda, 0xa2, 0xf9, 0xe5, 0x7c, 0x1f, 0xac, 0x94, 0xd9, 0x61, 0x04, 0xc7, 0x93, 0x49, 0x49, 0x27, 0xa9, 0x4c, 0xb7, 0x76, 0x3b, + 0x67, 0x30, 0x9a, 0x86, 0x58, 0x63, 0xb5, 0xaf, 0x95, 0xf9, 0x44, 0x99, 0x05, 0x4e, 0xd2, 0x53, 0xbd, 0xa8, 0x77, 0xc7, 0x80, 0x4c, 0x66, 0x4e, 0xd6, 0xa6, 0xbc, 0xe8, 0x02, 0x23, 0xcc, 0x76, + 0x72, 0xc6, 0x19, 0x10, 0x8d, 0xec, 0xb8, 0x89, 0x79, 0xba, 0xc5, 0xe6, 0x12, 0x36, 0xf8, 0x74, 0x53, 0x4e, 0x53, 0x33, 0x73, 0x9e, 0x66, 0x27, 0x25, 0x5f, 0x0a, 0xe5, 0xfe, 0xa0, 0x7a, 0x81, + 0xef, 0x72, 0x3d, 0x26, 0x87, 0x85, 0x71, 0x8b, 0xf1, 0x76, 0x4d, 0x35, 0xa9, 0x37, 0x62, 0x5d, 0x78, 0x66, 0xc4, 0xea, 0x81, 0xf4, 0xc8, 0x25, 0x95, 0x7b, 0xc4, 0x69, 0x8d, 0xcb, 0xcb, 0x15, + 0x07, 0xa3, 0x8e, 0xc6, 0x6d, 0xe9, 0x54, 0xf0, 0x0c, 0x3a, 0x2d, 0x43, 0xaa, 0xd7, 0x0d, 0xa9, 0x5c, 0xc5, 0xcd, 0x3e, 0x5c, 0x05, 0x27, 0x6f, 0xa3, 0x34, 0x64, 0xad, 0x06, 0x99, 0x46, 0xd3, + 0x50, 0xb8, 0xda, 0xbb, 0x6d, 0x9b, 0x25, 0x32, 0xba, 0xfb, 0xe6, 0x0e, 0x6f, 0xe7, 0x69, 0x91, 0x67, 0x6e, 0x56, 0x8f, 0xdd, 0x34, 0xac, 0xeb, 0x1f, 0x0a, 0xd0, 0xbc, 0x08, 0xc0, 0x3d, 0xf5, + 0x0b, 0x10, 0xf7, 0x6d, 0x63, 0x68, 0x18, 0x20, 0xb2, 0x83, 0x54, 0x2e, 0x2e, 0xd1, 0xa3, 0x4a, 0x84, 0xb6, 0xdd, 0xc1, 0x88, 0x2a, 0x5b, 0x2a, 0x9b, 0xb2, 0x60, 0x36, 0x9c, 0x27, 0x82, 0xc0, + 0x49, 0xcf, 0x94, 0x30, 0xc3, 0x25, 0xa0, 0x9c, 0x21, 0xa9, 0xd8, 0xd4, 0x6c, 0xab, 0x96, 0xd3, 0x49, 0xb0, 0x6c, 0x2c, 0xa4, 0xa4, 0xc0, 0x46, 0xb0, 0x46, 0x0a, 0xa3, 0xd0, 0x0d, 0x03, 0x4a, + 0x7a, 0x4e, 0x53, 0xa0, 0xee, 0x78, 0x66, 0x5d, 0xc9, 0x83, 0x34, 0x3c, 0xb7, 0xb6, 0xcb, 0xc7, 0x02, 0xc6, 0x6b, 0xc7, 0xf5, 0x3b, 0xd9, 0x33, 0x2a, 0xef, 0x37, 0x63, 0xf0, 0xf7, 0x83, 0x1a, + 0x1a, 0xc3, 0xab, 0xa4, 0x84, 0x10, 0x60, 0x17, 0x79, 0x0e, 0x26, 0x66, 0xfc, 0xcc, 0x8c, 0x1a, 0x1f, 0x52, 0x69, 0x47, 0x46, 0x1e, 0x33, 0x8b, 0x5f, 0x3b, 0xe4, 0x85, 0x7e, 0x55, 0x5f, 0xaa, + 0x99, 0x3e, 0x66, 0xf6, 0x5e, 0xec, 0xd1, 0x3b, 0xdd, 0x4b, 0x97, 0xde, 0xef, 0xce, 0x9e, 0x74, 0x03, 0x98, 0x0f, 0x93, 0x5f, 0x15, 0xa5, 0x1f, 0x63, 0x7a, 0x40, 0x0b, 0x27, 0x16, 0xc6, 0x82, + 0x88, 0xec, 0x16, 0x35, 0x3c, 0x9a, 0x61, 0xb0, 0xd2, 0x41, 0x33, 0x59, 0xe6, 0xfa, 0x03, 0xdd, 0xad, 0x0b, 0x58, 0x37, 0xa9, 0x74, 0x9e, 0xea, 0xe4, 0x6a, 0xd3, 0xb6, 0x75, 0x9b, 0x66, 0x26, + 0xa9, 0x1c, 0x35, 0x99, 0x5a, 0xf2, 0x06, 0x1a, 0xf7, 0xfc, 0x0c, 0x27, 0x05, 0x18, 0x6e, 0x13, 0x53, 0x2e, 0x62, 0x77, 0xfe, 0x9a, 0xc9, 0xd5, 0xc9, 0xeb, 0x71, 0x51, 0xe6, 0x17, 0xd3, 0xc5, + 0x57, 0xbb, 0xce, 0xdf, 0x7e, 0x69, 0xda, 0xae, 0xd7, 0x24, 0x63, 0xef, 0x53, 0xeb, 0x75, 0x27, 0x6a, 0xa5, 0x66, 0xec, 0x8e, 0xaf, 0x35, 0xb3, 0xbe, 0x5b, 0xb5, 0x9a, 0x2c, 0x3c, 0x34, 0xef, + 0xf9, 0xa4, 0xfe, 0x7e, 0x68, 0xd4, 0xea, 0xca, 0xb0, 0x76, 0xc7, 0x5e, 0x98, 0xb8, 0xe3, 0x4b, 0x30, 0xe6, 0x63, 0x4a, 0x47, 0xc7, 0x1f, 0x5b, 0x66, 0xe5, 0xbe, 0xbf, 0x0a, 0xfd, 0x69, 0x8f, + 0xcb, 0xe3, 0xf0, 0xd9, 0x80, 0xbf, 0x56, 0x4e, 0xf8, 0x42, 0xf2, 0x3c, 0xd6, 0x6f, 0x17, 0x43, 0x4b, 0x08, 0x1b, 0x5d, 0x39, 0x8f, 0x17, 0xcb, 0xa3, 0x2a, 0x23, 0x0c, 0x97, 0xef, 0x6b, 0x71, + 0x74, 0xd2, 0x18, 0x9c, 0x62, 0x2c, 0x62, 0x95, 0x84, 0x47, 0xcb, 0x74, 0x27, 0x3b, 0x8f, 0x96, 0x68, 0xaa, 0xd5, 0x2a, 0x21, 0x03, 0xf2, 0x91, 0xde, 0xe1, 0x94, 0x4f, 0xef, 0x14, 0x65, 0xb6, + 0x22, 0x61, 0x2c, 0x90, 0x04, 0x47, 0x18, 0x75, 0x73, 0xb2, 0x67, 0xd6, 0x1e, 0xe2, 0xcc, 0x85, 0x04, 0x88, 0x8f, 0xb1, 0xfa, 0x80, 0x57, 0x7a, 0xfb, 0xa6, 0xe8, 0xa9, 0x2e, 0xf1, 0x45, 0x11, + 0xf5, 0x9d, 0xea, 0x47, 0xaf, 0x23, 0xb3, 0x1c, 0x22, 0xaa, 0x9e, 0x8d, 0xe0, 0xdd, 0xc8, 0x74, 0x6c, 0xaf, 0xdf, 0x1c, 0xed, 0x8d, 0xcb, 0x8d, 0xc0, 0x5d, 0xd2, 0xca, 0x65, 0x09, 0x20, 0xc9, + 0x42, 0x13, 0x41, 0x6b, 0x46, 0x60, 0xca, 0x71, 0x8f, 0x93, 0x10, 0x64, 0x1f, 0x95, 0x00, 0xda, 0x59, 0xc7, 0x23, 0x71, 0x34, 0xe8, 0xc5, 0x0a, 0x72, 0xb5, 0x7a, 0xe6, 0xe1, 0x55, 0x48, 0x96, + 0x3e, 0x9c, 0x04, 0x99, 0x1a, 0x55, 0xda, 0x9a, 0x9f, 0xf3, 0x9e, 0x25, 0x73, 0x4d, 0x37, 0xc8, 0x08, 0xfe, 0xb6, 0x08, 0xdf, 0x04, 0x97, 0xf1, 0xd3, 0xe2, 0x6b, 0x2f, 0x4a, 0xbe, 0x37, 0x84, + 0xcf, 0x88, 0x7c, 0xde, 0x0e, 0x93, 0x7a, 0x6b, 0x0f, 0x52, 0x39, 0xff, 0x10, 0xb6, 0xf3, 0x03, 0xe4, 0x1e, 0xea, 0xa3, 0xc4, 0x27, 0x13, 0x47, 0x55, 0x67, 0x9d, 0x39, 0x20, 0x30, 0xc2, 0x2e, + 0x5d, 0xb3, 0xbe, 0x98, 0xd9, 0xc3, 0xa7, 0x7b, 0xd9, 0x6b, 0x0e, 0x0f, 0xf7, 0xa4, 0xdf, 0xba, 0x76, 0xd7, 0x30, 0xd4, 0xed, 0xc1, 0xb1, 0x57, 0xf3, 0x3d, 0x12, 0x65, 0x20, 0x5f, 0x70, 0xe6, + 0x3e, 0x0a, 0xab, 0x5c, 0x6e, 0xdd, 0x23, 0xb7, 0xd4, 0x98, 0x55, 0x6f, 0x1e, 0x88, 0x1e, 0x2e, 0x8d, 0xd5, 0xd1, 0x1b, 0xf1, 0x4a, 0x49, 0x6d, 0x63, 0x27, 0x65, 0xd3, 0x4a, 0x45, 0x53, 0x38, + 0xb1, 0xd7, 0x79, 0x54, 0x46, 0xc0, 0x9c, 0x4d, 0xc8, 0x34, 0xc6, 0xb4, 0x23, 0x9f, 0xea, 0x93, 0x91, 0x57, 0xcb, 0xf1, 0x06, 0x40, 0xf2, 0xd5, 0x20, 0x0d, 0xe1, 0x6d, 0x80, 0xee, 0xb3, 0xf1, + 0x7e, 0xe1, 0x44, 0xff, 0x20, 0x7b, 0x86, 0xe4, 0xfd, 0x66, 0x48, 0x10, 0xcc, 0x1b, 0x1c, 0xcd, 0x44, 0x73, 0x01, 0xcb, 0x17, 0xd8, 0x64, 0xe3, 0x6c, 0x20, 0x8d, 0x41, 0x95, 0x18, 0x24, 0x1b, + 0xaa, 0x98, 0x2c, 0x89, 0x1c, 0x3a, 0x02, 0xb5, 0x26, 0xd5, 0x7b, 0x82, 0xd8, 0x62, 0x7d, 0x12, 0xe8, 0x41, 0xd3, 0x89, 0xbb, 0x5a, 0x8b, 0x37, 0x34, 0x53, 0xb3, 0x4e, 0x3b, 0xc7, 0xec, 0x03, + 0x4a, 0x6a, 0xbd, 0x3b, 0x5d, 0x60, 0x21, 0xd4, 0x0b, 0xa8, 0x23, 0xd9, 0x64, 0xd1, 0xad, 0xf5, 0xf2, 0x3b, 0x53, 0x73, 0xfe, 0xae, 0xaa, 0x30, 0xbb, 0xec, 0x49, 0xe7, 0xef, 0xeb, 0x84, 0xfc, + 0x59, 0xe7, 0xcf, 0x74, 0x3f, 0x7a, 0x7f, 0xbe, 0x3b, 0x17, 0x79, 0x1b, 0x20, 0x1f, 0x85, 0xf2, 0x6c, 0xb3, 0x5c, 0xa9, 0x1b, 0x8d, 0x11, 0x66, 0x84, 0xc3, 0x6e, 0x44, 0xb2, 0x8c, 0x2d, 0x31, + 0xdb, 0x14, 0xa7, 0xd9, 0xc9, 0xb7, 0x67, 0xf3, 0x7a, 0x17, 0x15, 0xee, 0x4e, 0x98, 0xfa, 0x27, 0x72, 0xb7, 0x81, 0xcb, 0xbd, 0x7d, 0xdc, 0xaf, 0xc9, 0x6d, 0x15, 0xcb, 0xae, 0x94, 0xe0, 0x62, + 0x49, 0xc3, 0x0b, 0x62, 0xa4, 0x2e, 0x4b, 0xd3, 0xaf, 0xa0, 0x03, 0x84, 0xcd, 0x1b, 0xc7, 0x26, 0x16, 0xf8, 0x6b, 0xb9, 0xf3, 0x0a, 0xb3, 0x0e, 0xc6, 0xb1, 0x7b, 0xfa, 0xfb, 0xd3, 0x21, 0xff, + 0xe6, 0x58, 0xa9, 0x02, 0xd7, 0x32, 0x33, 0x7f, 0x7c, 0xe5, 0x5a, 0x9f, 0x1c, 0x51, 0x41, 0x78, 0x93, 0x80, 0xe6, 0x99, 0x92, 0xb0, 0x3c, 0x15, 0x75, 0x3e, 0x2e, 0xcd, 0xcc, 0xc9, 0xd3, 0xcf, + 0x13, 0xef, 0x5f, 0x54, 0xde, 0x3f, 0x78, 0xc1, 0x79, 0x74, 0xbe, 0x37, 0x0f, 0x55, 0xeb, 0xb7, 0x50, 0x91, 0x70, 0x33, 0xe4, 0x44, 0x95, 0x40, 0xb2, 0x09, 0xda, 0x70, 0x09, 0x75, 0xe5, 0xbe, + 0x58, 0xbb, 0x27, 0x95, 0x5b, 0x4c, 0x0c, 0x58, 0x61, 0x05, 0x7d, 0xcb, 0x98, 0x45, 0x4a, 0x00, 0xe4, 0x84, 0xca, 0xd6, 0x9b, 0xfc, 0xd4, 0x6a, 0x05, 0x22, 0xaf, 0x00, 0x66, 0x33, 0x3f, 0x64, + 0x58, 0xcc, 0xf4, 0xd9, 0x69, 0xe7, 0xeb, 0x86, 0x50, 0xc9, 0xb5, 0xae, 0x73, 0x3b, 0xab, 0x59, 0x90, 0xcf, 0x2a, 0xc3, 0xde, 0x81, 0xe5, 0xb8, 0x66, 0xfd, 0x3c, 0x78, 0xed, 0x15, 0xfb, 0xf2, + 0x99, 0xe2, 0x39, 0xfe, 0xf1, 0x6d, 0xbc, 0x07, 0x54, 0x17, 0x86, 0xc6, 0x13, 0xf3, 0x60, 0x4b, 0x34, 0xe1, 0xc4, 0x99, 0x3a, 0x9f, 0x33, 0xf6, 0xda, 0x4f, 0x75, 0x6c, 0xb6, 0xb0, 0x16, 0xf6, + 0xf1, 0x6b, 0x0a, 0xac, 0xaf, 0x61, 0x9b, 0xff, 0x73, 0x73, 0xf8, 0x7d, 0xb8, 0xe6, 0x40, 0x33, 0xb8, 0xb8, 0x27, 0xf7, 0x87, 0x0d, 0x01, 0x40, 0x26, 0x65, 0x1f, 0xe2, 0xa3, 0xde, 0xc1, 0xa7, + 0x7d, 0x55, 0x41, 0x98, 0x07, 0xe3, 0xc2, 0x6a, 0x47, 0x17, 0xb3, 0xbd, 0xe4, 0x80, 0x40, 0xb3, 0x02, 0x56, 0x9b, 0x83, 0x23, 0x05, 0x47, 0x6b, 0x63, 0x52, 0x14, 0x1a, 0x64, 0x7d, 0x64, 0x33, + 0xb0, 0x76, 0x90, 0x8a, 0x59, 0x95, 0x78, 0x18, 0x46, 0xc0, 0x88, 0xbd, 0xda, 0xa8, 0xe2, 0x42, 0x49, 0x79, 0x1d, 0x79, 0xcd, 0x6d, 0xea, 0x3d, 0x6a, 0xf3, 0x29, 0x13, 0xe6, 0xb8, 0x6f, 0xf2, + 0x4f, 0xe9, 0x56, 0xd5, 0x6f, 0x9a, 0x68, 0xe4, 0x25, 0x89, 0xeb, 0x01, 0xfd, 0x33, 0x9c, 0xdf, 0x5a, 0xc7, 0xc8, 0xef, 0x52, 0x17, 0x34, 0xf6, 0x57, 0x5b, 0x87, 0x8f, 0x1c, 0x4e, 0x64, 0x5a, + 0x7c, 0xc9, 0x4d, 0x67, 0x7a, 0x58, 0xd6, 0xc4, 0xd2, 0x3f, 0x20, 0x00, 0xff, 0x12, 0x3c, 0x7f, 0xa4, 0x93, 0xbe, 0xcb, 0xcf, 0xfa, 0xef, 0x9d, 0xec, 0x9f, 0x64, 0xcf, 0xc8, 0xbc, 0xdf, 0x0c, + 0x3d, 0xd1, 0x4f, 0x0e, 0x65, 0x63, 0x13, 0x27, 0x3c, 0x68, 0xb6, 0x3c, 0x5a, 0x46, 0x76, 0xa7, 0x4a, 0x16, 0x35, 0x8b, 0x83, 0xa5, 0x4d, 0x66, 0xbe, 0x50, 0x82, 0xbc, 0x19, 0x30, 0xf4, 0xa2, + 0x9d, 0x85, 0xcb, 0x8e, 0x2c, 0x9a, 0x9d, 0x69, 0xc1, 0x27, 0x23, 0x09, 0x46, 0x59, 0x6c, 0x56, 0x62, 0x66, 0x6c, 0x46, 0xcc, 0x62, 0x3b, 0xd9, 0xe0, 0xa5, 0x5c, 0xc0, 0xcb, 0x7e, 0x19, 0x2c, + 0x8d, 0xbe, 0x15, 0xe6, 0xe4, 0x6b, 0xb3, 0x2d, 0x3c, 0x1f, 0xbe, 0xcd, 0x7b, 0xe1, 0xf7, 0x0b, 0x98, 0x77, 0x0a, 0xe9, 0xb0, 0x1a, 0x3b, 0x6f, 0x5c, 0xcb, 0xc5, 0xf2, 0xf3, 0xf1, 0x1b, 0xe8, + 0xcb, 0x6f, 0x3e, 0xdd, 0xa5, 0xbf, 0x51, 0xb8, 0xda, 0x8c, 0xc2, 0xea, 0xf1, 0x3f, 0x5f, 0x1f, 0x7f, 0x38, 0xe7, 0x7d, 0xf3, 0xb1, 0xb9, 0x14, 0xfc, 0xfb, 0xa7, 0x28, 0xf3, 0x3a, 0xaf, 0x4f, + 0x85, 0xfb, 0x8f, 0x97, 0x98, 0xfe, 0xfb, 0x6f, 0xe1, 0x9f, 0x87, 0xfe, 0x58, 0xbb, 0x4f, 0x3d, 0x99, 0xc0, 0x97, 0xd2, 0xbc, 0xdc, 0xd0, 0xfd, 0x18, 0xfc, 0xf3, 0xdd, 0x18, 0x1c, 0x96, 0xe8, + 0x65, 0x2d, 0xb2, 0x47, 0x4e, 0x34, 0x37, 0xba, 0xc3, 0x26, 0x4b, 0xb9, 0x9e, 0x4a, 0xde, 0x8c, 0xd3, 0x8c, 0xda, 0xeb, 0x80, 0xc6, 0xe3, 0xc9, 0x51, 0xa9, 0x45, 0x38, 0x4a, 0xc9, 0x1c, 0xdb, + 0xdb, 0x29, 0xd0, 0x2e, 0x3a, 0x49, 0xde, 0xcf, 0x6b, 0x5c, 0xdc, 0x1c, 0xb8, 0xf9, 0xae, 0x4a, 0xe1, 0x3d, 0xc3, 0x97, 0x02, 0xc7, 0xd4, 0x3b, 0x19, 0x47, 0x2b, 0x1d, 0x5a, 0x33, 0xab, 0x19, + 0xdc, 0x4e, 0xc4, 0x61, 0x47, 0x83, 0x5b, 0x3c, 0x67, 0xde, 0xc1, 0x97, 0x74, 0xbe, 0x57, 0x9a, 0xef, 0x48, 0x5c, 0x8a, 0x26, 0xff, 0xc6, 0xc7, 0x40, 0xe3, 0x0a, 0xce, 0x76, 0x23, 0x08, 0x26, + 0x99, 0x11, 0xb1, 0x51, 0xe3, 0x91, 0x5c, 0xb1, 0xb3, 0x11, 0x61, 0x0b, 0xfb, 0xbe, 0x97, 0x86, 0xf5, 0x23, 0x75, 0x4b, 0xff, 0x87, 0xe2, 0x28, 0x2f, 0x88, 0x21, 0x1f, 0x54, 0xaf, 0x7d, 0x39, + 0x5f, 0x9f, 0x23, 0x52, 0x06, 0x48, 0x65, 0xf3, 0x25, 0xa2, 0xfa, 0x1c, 0xea, 0x73, 0xc9, 0x68, 0xc3, 0x1a, 0x29, 0x86, 0xc4, 0x59, 0xd5, 0x28, 0xf3, 0x82, 0x19, 0x65, 0x8c, 0xc2, 0x97, 0x04, + 0x8f, 0xb6, 0x94, 0x64, 0xfb, 0x34, 0xa1, 0xe0, 0xc8, 0x2a, 0x02, 0xf0, 0xdd, 0x81, 0x0f, 0xe7, 0xd2, 0xb2, 0xa0, 0x69, 0xbd, 0x87, 0x36, 0xf5, 0x08, 0xc7, 0x2d, 0xa3, 0xd8, 0x20, 0x12, 0xb1, + 0x3e, 0xb9, 0xa0, 0x98, 0x53, 0xfc, 0x66, 0x75, 0x51, 0x51, 0x7e, 0xe9, 0xf8, 0xb7, 0xba, 0xc5, 0xff, 0x9e, 0xf6, 0xfe, 0x2b, 0xf1, 0x33, 0x0c, 0xf7, 0x4d, 0x43, 0x75, 0xf8, 0x20, 0xa7, 0x38, + 0x42, 0xde, 0x54, 0x6c, 0x6b, 0x6c, 0x61, 0x26, 0x9c, 0x27, 0x86, 0x6b, 0x4c, 0x58, 0x5a, 0x6d, 0x95, 0x63, 0xba, 0xaa, 0x3a, 0x6d, 0xca, 0x78, 0x64, 0xb0, 0x23, 0x56, 0x3b, 0x7f, 0x81, 0x9a, + 0x24, 0xaf, 0x31, 0x0d, 0x80, 0x68, 0x16, 0xde, 0xec, 0xf4, 0xbc, 0x8f, 0xa3, 0x53, 0x72, 0x9a, 0x1e, 0x5d, 0x70, 0x49, 0x73, 0xa1, 0x4c, 0x43, 0x91, 0x86, 0x62, 0x0a, 0x01, 0xee, 0xb4, 0x21, + 0x12, 0x8b, 0xe3, 0x7a, 0x61, 0xe6, 0x9e, 0x95, 0x2e, 0x6e, 0x59, 0x87, 0x3f, 0x44, 0x34, 0xbf, 0x88, 0xd0, 0x3d, 0xf5, 0x0b, 0x44, 0xf7, 0x6d, 0x43, 0x31, 0x42, 0xf8, 0x83, 0xa7, 0xaf, 0x22, + 0x38, 0x59, 0xf7, 0x0e, 0xaf, 0x78, 0xa4, 0xc1, 0x19, 0x0c, 0xa0, 0x8d, 0x8c, 0xe6, 0x34, 0xa2, 0xfd, 0x19, 0xee, 0x41, 0x38, 0xea, 0x92, 0x2b, 0xb8, 0x23, 0x1c, 0x3f, 0x2b, 0x56, 0x93, 0x92, + 0x9e, 0xb9, 0xe5, 0x42, 0x2f, 0x78, 0x14, 0xe7, 0x74, 0xdd, 0x8e, 0xb2, 0xd8, 0xd9, 0x08, 0x7c, 0xb4, 0x89, 0xa9, 0x09, 0xae, 0xcd, 0x69, 0x72, 0x84, 0x28, 0xab, 0x64, 0x3f, 0xc0, 0x48, 0xf6, + 0x7d, 0xb7, 0x05, 0xff, 0x81, 0x9e, 0xf8, 0x2b, 0x5e, 0x3a, 0xf7, 0x6c, 0xfb, 0x7c, 0x4d, 0xfa, 0xbb, 0xd2, 0xfc, 0x80, 0xce, 0x19, 0x22, 0xf7, 0x41, 0xe3, 0x93, 0x0e, 0x5b, 0x7d, 0xeb, 0xec, + 0x1c, 0x3a, 0x14, 0x19, 0x29, 0x29, 0xe6, 0xf2, 0xc2, 0x40, 0xb1, 0xca, 0x2b, 0x8a, 0xc7, 0x5c, 0xc4, 0x97, 0x7e, 0x7c, 0x51, 0xe4, 0xff, 0x9b, 0xdd, 0xb9, 0x25, 0x7d, 0xee, 0xd5, 0x6d, 0xc3, + 0xb0, 0xce, 0x21, 0x7d, 0x19, 0xa4, 0xe6, 0xa9, 0x1e, 0x21, 0x10, 0x33, 0x3d, 0x94, 0x7e, 0x55, 0xa0, 0xa1, 0x5d, 0x2e, 0xc5, 0x63, 0xf0, 0x35, 0x79, 0x9b, 0x13, 0x7a, 0xde, 0xd3, 0x5d, 0xef, + 0x15, 0xe5, 0xcb, 0x1b, 0xc1, 0xb7, 0xaf, 0x0e, 0x3d, 0x6f, 0x8c, 0xfe, 0xae, 0x6c, 0x39, 0x7b, 0x2c, 0x91, 0x49, 0x7a, 0x5c, 0x29, 0x13, 0x94, 0x16, 0x4e, 0xeb, 0x7e, 0xc4, 0xb2, 0xbc, 0xda, + 0x27, 0x22, 0x53, 0xf8, 0x20, 0x35, 0xd7, 0x46, 0x6e, 0x8b, 0x1b, 0xbc, 0x8b, 0xb4, 0xcb, 0x30, 0xf0, 0x9d, 0x63, 0xef, 0xdb, 0x9d, 0x41, 0x6a, 0x39, 0xc3, 0x6c, 0xd2, 0xc9, 0x7a, 0x6a, 0x2c, + 0xa8, 0x75, 0x7a, 0xf0, 0xb4, 0x5c, 0xe0, 0xf9, 0x55, 0x51, 0xd7, 0x9c, 0xbe, 0xd5, 0x16, 0x78, 0x33, 0xd3, 0x89, 0x41, 0xe7, 0x57, 0x58, 0xbe, 0x7b, 0x88, 0x3d, 0xe6, 0x76, 0x5f, 0x51, 0x38, + 0xbf, 0x13, 0x3d, 0x83, 0x70, 0xb9, 0x3c, 0x47, 0xf7, 0x0c, 0x60, 0xe3, 0x76, 0x71, 0xb9, 0x2b, 0xa8, 0x85, 0x8c, 0xae, 0xf6, 0xde, 0x6a, 0xa1, 0xf7, 0xe2, 0x3a, 0xdd, 0x36, 0x0b, 0x2d, 0x84, + 0xd4, 0xdd, 0xdc, 0xeb, 0x2a, 0x84, 0x20, 0x32, 0xca, 0xb6, 0x31, 0x0c, 0xa8, 0x2d, 0x7c, 0xd6, 0x1c, 0x4e, 0x73, 0xbc, 0xb0, 0x25, 0x6c, 0x62, 0x85, 0x2c, 0x53, 0x05, 0xe6, 0xac, 0xd0, 0xa9, + 0x16, 0xcf, 0x4d, 0xa5, 0x84, 0xf7, 0xd3, 0x59, 0xe8, 0x2c, 0x52, 0xbe, 0x73, 0x7a, 0xee, 0x35, 0x55, 0xf3, 0x59, 0x14, 0x7f, 0xe3, 0x8d, 0xfe, 0xfe, 0x45, 0x83, 0xeb, 0xe4, 0xf6, 0x9b, 0x1c, + 0xfb, 0x5c, 0x62, 0x78, 0x69, 0x11, 0x5c, 0x89, 0xbe, 0x61, 0x78, 0xbd, 0x1c, 0x92, 0x2a, 0xf9, 0xcc, 0x0a, 0x2b, 0x23, 0x09, 0x0b, 0x91, 0x80, 0xf6, 0x88, 0x05, 0x1d, 0x3b, 0xe8, 0x6a, 0x41, + 0x9a, 0x84, 0x4b, 0x0b, 0xc2, 0x4e, 0x58, 0xac, 0xb7, 0x26, 0xd3, 0x75, 0xfa, 0x4e, 0x0d, 0x23, 0x4e, 0xe7, 0x89, 0xbe, 0x4c, 0xf4, 0x19, 0x0f, 0xd2, 0xf3, 0x3d, 0x1b, 0x45, 0x9b, 0x5d, 0xb2, + 0x33, 0x20, 0xd9, 0x27, 0x54, 0xd3, 0x71, 0x0c, 0x97, 0x9b, 0xa5, 0x21, 0x15, 0xcd, 0x11, 0x36, 0x3d, 0x84, 0x12, 0xfc, 0x9a, 0x3a, 0xc3, 0xad, 0xee, 0x4b, 0xa4, 0x3e, 0xdb, 0x14, 0x3f, 0xb5, + 0xfa, 0x8f, 0xcd, 0x1e, 0x2f, 0xc9, 0x5c, 0x57, 0xa2, 0x67, 0x04, 0x2f, 0x97, 0x67, 0xef, 0x96, 0x01, 0x08, 0x4a, 0x3c, 0x79, 0x40, 0xfa, 0x99, 0x8b, 0x91, 0xc1, 0x41, 0x3d, 0x44, 0xa5, 0x29, + 0x89, 0x69, 0x6f, 0x40, 0x6b, 0x8e, 0xa5, 0x94, 0x9d, 0xb4, 0xdc, 0x26, 0xcc, 0x6a, 0xca, 0xa2, 0xf1, 0x12, 0xce, 0xa5, 0x76, 0x6d, 0xc4, 0x84, 0x6c, 0x49, 0xfb, 0xb6, 0x9e, 0xf1, 0xf0, 0x9e, + 0x39, 0x20, 0x5e, 0x17, 0x6b, 0xd4, 0x74, 0xda, 0xb6, 0x2c, 0xba, 0x9e, 0x80, 0x13, 0x6d, 0x94, 0xfb, 0xf3, 0x8a, 0xe6, 0xe1, 0xd7, 0xdc, 0x4b, 0xc3, 0xaf, 0x09, 0xf3, 0x9e, 0x01, 0x18, 0xfa, + 0xd9, 0x73, 0xc3, 0x11, 0xf8, 0x92, 0x52, 0xfd, 0x83, 0xea, 0x05, 0xc2, 0xcb, 0xf5, 0x99, 0x19, 0x1d, 0xb0, 0xa5, 0xa9, 0x8b, 0xc5, 0x62, 0xe7, 0x29, 0x66, 0xd3, 0x54, 0xa6, 0xb6, 0x9c, 0x8e, + 0x48, 0xcf, 0xd7, 0x46, 0x82, 0xd6, 0xd2, 0xfb, 0x78, 0xba, 0x4d, 0xb5, 0x96, 0xa8, 0x62, 0x3c, 0xcb, 0xa3, 0x99, 0x61, 0xb4, 0x8d, 0xa8, 0x0a, 0x0b, 0xf5, 0x04, 0x1a, 0x31, 0xaa, 0x16, 0xac, + 0x34, 0xc3, 0x99, 0x59, 0xa4, 0x80, 0x51, 0x41, 0x77, 0xf6, 0x64, 0xda, 0xb2, 0xa8, 0x9b, 0x7b, 0xed, 0xa9, 0xa7, 0x6d, 0x79, 0xf6, 0xda, 0x2c, 0x3c, 0xa7, 0xfd, 0xfb, 0x08, 0x82, 0x44, 0x9e, + 0xa7, 0x65, 0x76, 0x9a, 0x22, 0x71, 0x8f, 0x6e, 0xf9, 0xdc, 0x65, 0xf1, 0x15, 0x17, 0x96, 0x0f, 0xaa, 0x6f, 0x30, 0xbe, 0x5f, 0x9f, 0x61, 0xfc, 0xc5, 0x81, 0x05, 0x1a, 0x13, 0x3e, 0xeb, 0xb0, + 0xab, 0x4e, 0x04, 0xc9, 0x96, 0x05, 0x2c, 0x3c, 0xf2, 0xec, 0x69, 0x4e, 0xda, 0xe8, 0x64, 0x2d, 0x72, 0xbf, 0xef, 0xed, 0x8f, 0xd3, 0x1d, 0xfc, 0xcf, 0xf5, 0xad, 0xcf, 0xd3, 0x1c, 0x0c, 0xd4, + 0xb7, 0x4e, 0x3b, 0x7a, 0x2d, 0x33, 0x9c, 0x44, 0xac, 0x5b, 0x7d, 0x4e, 0x83, 0xbb, 0x93, 0xdc, 0x76, 0xc1, 0x01, 0x13, 0xb0, 0xc3, 0x26, 0xb0, 0xf1, 0x0d, 0x1f, 0xcd, 0x70, 0x4b, 0xf7, 0xfd, + 0x79, 0xc2, 0x61, 0xfa, 0x69, 0xe6, 0x27, 0x23, 0xb0, 0x3d, 0x1e, 0x30, 0x8d, 0xb5, 0x78, 0x71, 0x7e, 0x58, 0xfb, 0x44, 0xe0, 0xed, 0xfa, 0xb4, 0x21, 0xb7, 0x98, 0x01, 0x49, 0xb9, 0x17, 0xa4, + 0x5b, 0x2e, 0xe0, 0xea, 0x21, 0xa7, 0xdd, 0x9b, 0x44, 0x99, 0x7b, 0xbf, 0xf1, 0x2c, 0xe8, 0x0b, 0x63, 0x7c, 0x47, 0xf9, 0x0d, 0x95, 0xdb, 0xfb, 0xb3, 0xdf, 0xca, 0x00, 0x67, 0xa5, 0x51, 0xd3, + 0x41, 0x61, 0xc6, 0xb1, 0xda, 0x46, 0xca, 0x4d, 0xad, 0x61, 0x7b, 0xf9, 0xb4, 0x77, 0x60, 0x28, 0xb4, 0xf9, 0x91, 0x9d, 0xd5, 0xe8, 0xb4, 0x9f, 0x61, 0xe5, 0x6e, 0x24, 0x4c, 0xa1, 0x2e, 0x12, + 0x55, 0x65, 0x2b, 0x56, 0xa3, 0xad, 0x4b, 0xcc, 0xc5, 0x96, 0x98, 0x04, 0x02, 0xd1, 0x2a, 0xd4, 0x11, 0xc8, 0xb9, 0x53, 0xb0, 0xde, 0x60, 0x1b, 0x19, 0x62, 0x47, 0x45, 0x20, 0x4d, 0xd8, 0x06, + 0x7b, 0x6d, 0xdb, 0xc9, 0x33, 0xfb, 0x5d, 0x11, 0xf4, 0xb4, 0x26, 0xa9, 0x9b, 0x9d, 0xff, 0xf3, 0xb9, 0x21, 0x0f, 0x79, 0xa1, 0x58, 0xd1, 0x3b, 0xd1, 0x33, 0x86, 0x97, 0xcb, 0xf1, 0x99, 0xd2, + 0xef, 0xf0, 0x9d, 0x22, 0x21, 0xdb, 0x94, 0x08, 0x84, 0x01, 0xf3, 0x48, 0x41, 0x7b, 0xae, 0x52, 0x8f, 0xba, 0xdf, 0xe8, 0xea, 0x66, 0x03, 0xbb, 0x90, 0xb0, 0x42, 0x1d, 0x82, 0x21, 0x0c, 0x71, + 0x1d, 0x9e, 0xf4, 0xa9, 0x6d, 0xcd, 0xe9, 0x70, 0xcb, 0x9f, 0xb8, 0xd9, 0x08, 0xee, 0xda, 0x14, 0xee, 0xf0, 0x51, 0x61, 0x00, 0xb9, 0xc3, 0x4f, 0x08, 0x5b, 0x8e, 0xa3, 0xa0, 0xda, 0x58, 0x49, + 0xdd, 0xd1, 0x62, 0xb9, 0x7e, 0x4d, 0x05, 0x74, 0x5f, 0x55, 0xe2, 0x6b, 0x79, 0xe8, 0x7b, 0x14, 0xab, 0xf1, 0x7b, 0xc5, 0xb2, 0xe7, 0x92, 0x15, 0xf5, 0x42, 0x3e, 0xc8, 0x1b, 0xc2, 0x6f, 0x60, + 0x7e, 0xde, 0x8d, 0x2f, 0x04, 0x7f, 0x07, 0x74, 0x62, 0xc2, 0x0b, 0x78, 0x24, 0x3b, 0x88, 0x85, 0xc7, 0x47, 0x46, 0x5d, 0x6d, 0xe7, 0xe8, 0xd6, 0xdc, 0xe1, 0x84, 0xdd, 0xd3, 0xeb, 0xd3, 0xa4, + 0x45, 0x7a, 0x42, 0x13, 0x03, 0x5d, 0x56, 0x31, 0x50, 0xa7, 0x8f, 0x23, 0xcb, 0xaa, 0x74, 0x83, 0x3a, 0x4a, 0x1b, 0x34, 0xe1, 0x05, 0xb3, 0x77, 0x37, 0xcd, 0x3c, 0x39, 0x59, 0x7b, 0x0e, 0xd4, + 0x50, 0xbe, 0x6c, 0x36, 0x79, 0x45, 0x1c, 0xd4, 0x1c, 0xf3, 0x06, 0x38, 0x79, 0xde, 0x86, 0xcb, 0x3d, 0x08, 0x70, 0x75, 0xab, 0x37, 0xf9, 0xb9, 0x28, 0xc3, 0x34, 0xac, 0xc3, 0xf6, 0x7d, 0x9a, + 0xc2, 0x5f, 0xaa, 0x44, 0xbd, 0x16, 0x67, 0xf6, 0xe0, 0x27, 0xd5, 0x29, 0xb5, 0xf2, 0x64, 0xec, 0x5c, 0xeb, 0x04, 0x5e, 0x07, 0xe5, 0x41, 0x5e, 0x5c, 0xf3, 0x53, 0xfa, 0x43, 0xbe, 0x3c, 0xb8, + 0x12, 0x79, 0xf2, 0x83, 0x37, 0xec, 0xcb, 0xcc, 0x4c, 0xc6, 0x55, 0x92, 0xd7, 0x4f, 0x7e, 0x52, 0x8d, 0xdf, 0x50, 0x31, 0xad, 0xe4, 0xb3, 0xbf, 0x5f, 0x55, 0x8a, 0x99, 0xeb, 0x9b, 0x6f, 0x80, + 0x8c, 0x7b, 0xb7, 0xcc, 0xff, 0xfe, 0x64, 0xb9, 0xee, 0x7f, 0x75, 0xab, 0x54, 0x84, 0xbe, 0xd1, 0xa8, 0x02, 0xb3, 0x7c, 0x4f, 0x11, 0x3a, 0xbe, 0xc4, 0x93, 0x3f, 0x1e, 0x84, 0xb7, 0xdf, 0x7e, + 0xfa, 0x49, 0xbc, 0x3d, 0x26, 0xbe, 0x3c, 0xee, 0x5c, 0x33, 0x2e, 0x5d, 0xef, 0xf1, 0xbf, 0xbf, 0xeb, 0x2f, 0xb3, 0xaa, 0xf8, 0xd4, 0x80, 0x42, 0x5f, 0x13, 0xf2, 0xfe, 0xa6, 0xc5, 0xbc, 0xfc, + 0xe0, 0x9f, 0x2f, 0x9e, 0xf3, 0x77, 0x2f, 0xba, 0x7c, 0xe4, 0x8d, 0xa2, 0xb3, 0x2e, 0xc3, 0xd4, 0xbd, 0x99, 0x5a, 0xe8, 0xaf, 0xbf, 0xae, 0x6a, 0xb3, 0xac, 0x1f, 0xff, 0xbe, 0xc9, 0xac, 0xfc, + 0xf8, 0x6d, 0x2a, 0x82, 0x7f, 0x56, 0x43, 0xf6, 0x66, 0x50, 0x3e, 0x5b, 0xbf, 0x2b, 0x57, 0x6e, 0x5f, 0x3c, 0x7c, 0x17, 0x78, 0x27, 0x7e, 0x49, 0xa7, 0x73, 0x39, 0xa6, 0xbf, 0xfb, 0xce, 0xfe, + 0xf5, 0x6c, 0x0b, 0x88, 0x5b, 0xd9, 0x39, 0xce, 0xaa, 0xa3, 0x11, 0x05, 0xbd, 0xba, 0x07, 0x09, 0x23, 0x5b, 0x9f, 0x9c, 0x5e, 0x81, 0xb6, 0x2a, 0xb0, 0x5d, 0x26, 0x5b, 0x95, 0x65, 0x75, 0x54, + 0x5f, 0xaf, 0x49, 0xc2, 0x45, 0x88, 0x5c, 0x9d, 0xa0, 0xd4, 0xcc, 0x8b, 0xd7, 0x07, 0xff, 0x34, 0xd2, 0xa2, 0x79, 0x6e, 0xe7, 0xdd, 0x09, 0xa6, 0xec, 0x55, 0x6b, 0x2b, 0x61, 0x33, 0x8a, 0xb9, + 0x96, 0x80, 0xc9, 0x68, 0xbb, 0xd5, 0xfe, 0x20, 0x41, 0xef, 0xcf, 0x5b, 0xc1, 0x5f, 0xef, 0xcb, 0xab, 0xce, 0x2f, 0x23, 0x57, 0x9b, 0xfe, 0xcd, 0xe2, 0xbc, 0xf9, 0xdd, 0xe3, 0xa0, 0xe6, 0x6f, + 0xb3, 0xf0, 0x07, 0xfc, 0x5f, 0x0d, 0x21, 0xbf, 0x7f, 0x07, 0x30, 0xfe, 0xd2, 0x30, 0xbe, 0x90, 0x1e, 0x36, 0x1a, 0x6c, 0x0e, 0xf7, 0x24, 0x68, 0x69, 0x5c, 0xbb, 0x4c, 0x72, 0x76, 0xa4, 0xf7, + 0x72, 0x5a, 0x18, 0x9a, 0xe4, 0x92, 0xc4, 0xe8, 0x30, 0x51, 0x52, 0x5a, 0x5d, 0x19, 0xb3, 0x9d, 0x7f, 0xa4, 0xec, 0x66, 0xb4, 0x9a, 0x95, 0x7b, 0xd8, 0x98, 0xb1, 0x00, 0x52, 0xf3, 0xa7, 0x91, + 0xbf, 0xb7, 0x0c, 0x66, 0xab, 0x2d, 0x2a, 0x98, 0x27, 0x75, 0xe7, 0x28, 0x5a, 0x62, 0x40, 0xec, 0x27, 0x75, 0x98, 0x52, 0x3a, 0xe8, 0xff, 0x9e, 0xc6, 0xf3, 0xfb, 0x8e, 0xfb, 0xf8, 0x9c, 0x7a, + 0x25, 0xba, 0xe9, 0x0b, 0xed, 0xcb, 0x51, 0x75, 0xdb, 0x32, 0x86, 0x86, 0x45, 0x3a, 0x49, 0x53, 0x31, 0x49, 0x7c, 0x63, 0x59, 0x9b, 0x6a, 0x4e, 0xa5, 0xa1, 0x4e, 0xdb, 0xeb, 0x69, 0xb0, 0x55, + 0x4d, 0x56, 0x88, 0x96, 0x73, 0x64, 0xa3, 0x57, 0x90, 0x16, 0x3a, 0x33, 0x62, 0xd2, 0x85, 0x4c, 0x04, 0xc5, 0xfa, 0x71, 0xe5, 0x4a, 0x5b, 0xbb, 0x5e, 0x4f, 0xdc, 0x7e, 0x22, 0xb2, 0x98, 0xb1, + 0x92, 0x59, 0xd0, 0x87, 0x39, 0x7f, 0x93, 0xe1, 0xab, 0x8e, 0x46, 0xb9, 0x2d, 0x19, 0xca, 0x45, 0x3b, 0xe0, 0xb4, 0xfa, 0xbe, 0x35, 0x7f, 0xdf, 0x56, 0x87, 0x58, 0x7b, 0x2e, 0x47, 0xc4, 0xcd, + 0x3c, 0x7f, 0x32, 0x14, 0xb6, 0x59, 0xb8, 0x63, 0x3f, 0x37, 0x9f, 0x47, 0x29, 0xbc, 0x62, 0x7e, 0xbb, 0xa1, 0x7b, 0x1e, 0x82, 0x8f, 0xbb, 0xb3, 0x13, 0xd5, 0x00, 0xf8, 0x49, 0xa0, 0xe1, 0x02, + 0x6b, 0x01, 0xc1, 0xd3, 0x2a, 0x3a, 0xc1, 0x4b, 0x66, 0x47, 0xcc, 0xa8, 0x82, 0xb5, 0x4a, 0xd7, 0xd4, 0x4c, 0x05, 0x10, 0x0b, 0x01, 0x39, 0xd9, 0xd9, 0xa9, 0x65, 0x92, 0xad, 0xd3, 0xf1, 0x58, + 0x86, 0x2f, 0x74, 0x7c, 0x87, 0xbb, 0x30, 0xb7, 0x71, 0x53, 0xaf, 0x5d, 0x18, 0xae, 0xca, 0x1f, 0x0c, 0x6a, 0x02, 0x20, 0x8b, 0x03, 0x67, 0xf0, 0xfe, 0x2a, 0xa3, 0x83, 0x49, 0x07, 0x0c, 0x51, + 0x50, 0x5f, 0xbf, 0xf5, 0xea, 0x4b, 0x70, 0x31, 0x6c, 0xfd, 0xa0, 0x8f, 0x7c, 0x85, 0x91, 0xfa, 0xfe, 0x82, 0x4f, 0x8c, 0xee, 0x9a, 0x87, 0x24, 0xd5, 0x86, 0xc6, 0x0b, 0x98, 0x9d, 0x68, 0xe1, + 0x42, 0x3a, 0x08, 0x00, 0x5c, 0x46, 0xcd, 0xa9, 0xef, 0xb8, 0xc9, 0x29, 0xe0, 0xd7, 0x41, 0x3d, 0xc0, 0x52, 0x73, 0x29, 0x42, 0xfc, 0x54, 0xa0, 0x83, 0x5f, 0xb1, 0xbf, 0x5d, 0x4b, 0x1f, 0x8f, + 0xaf, 0x17, 0xe3, 0x0b, 0x99, 0xdf, 0xc7, 0x1c, 0x95, 0xa1, 0xd0, 0x95, 0x3d, 0x0c, 0x06, 0xc2, 0xde, 0x36, 0x18, 0x62, 0x92, 0xac, 0x4f, 0x18, 0xde, 0x70, 0x2c, 0x3b, 0x5b, 0x6f, 0x09, 0x54, + 0xef, 0x7b, 0x98, 0x6b, 0xe1, 0x04, 0x8f, 0x67, 0xa6, 0xde, 0x32, 0x0d, 0x75, 0x1c, 0x75, 0x3c, 0x8d, 0x39, 0xc6, 0xa4, 0xd4, 0xd6, 0xa4, 0xa2, 0x2f, 0xf6, 0x8a, 0xae, 0xc1, 0xfa, 0xc4, 0x27, + 0xc0, 0xb9, 0xbd, 0xc3, 0x74, 0x2c, 0x5b, 0x2c, 0x04, 0xee, 0x35, 0x8e, 0xfb, 0xbf, 0x2c, 0xd3, 0x72, 0x13, 0xe0, 0x9c, 0xf9, 0xcb, 0x2b, 0xaf, 0xf1, 0x2a, 0xc4, 0xdb, 0xde, 0x0a, 0xdd, 0x2d, + 0xb4, 0xff, 0xba, 0xf6, 0xf5, 0xf2, 0xa7, 0xbc, 0xf0, 0x7d, 0xdf, 0x2a, 0x81, 0x5e, 0xc3, 0x8c, 0xfe, 0x1b, 0xff, 0x07, 0xfa, 0x9a, 0x31, 0xe9, 0x23, 0x9d, 0xe7, 0xb7, 0x74, 0x29, 0xf7, 0xfe, + 0x4d, 0x97, 0x7c, 0x40, 0x77, 0xbc, 0xc8, 0x7d, 0x2a, 0xef, 0xbb, 0x17, 0xde, 0xe8, 0x10, 0x1f, 0xb8, 0x93, 0xde, 0x48, 0x5a, 0x6f, 0x4c, 0x1d, 0x72, 0x33, 0x89, 0x3f, 0xcb, 0x52, 0x57, 0x76, + 0x5e, 0xbc, 0xe7, 0x20, 0xfd, 0xc2, 0x27, 0x5d, 0x7f, 0x71, 0xab, 0x8b, 0xfb, 0xe2, 0x59, 0xf4, 0x73, 0x69, 0xeb, 0xbb, 0x1f, 0x16, 0xa5, 0xfb, 0x9e, 0xef, 0x08, 0xf9, 0xfa, 0x9a, 0x43, 0xe3, + 0x96, 0xa7, 0xeb, 0x16, 0xf6, 0xad, 0x78, 0xf6, 0x57, 0x55, 0xe0, 0xcd, 0xc3, 0xb3, 0x43, 0xad, 0x9b, 0xd5, 0xe5, 0xe9, 0x92, 0x99, 0xe6, 0x0a, 0x3e, 0xf8, 0x98, 0xa7, 0x3f, 0xd7, 0xb3, 0x71, + 0xc6, 0x56, 0x62, 0xda, 0xf1, 0xb8, 0x7e, 0xff, 0x9c, 0x6f, 0x7b, 0xea, 0x97, 0x08, 0xea, 0xff, 0xfe, 0x9a, 0x89, 0xf4, 0xfc, 0x03, 0xf3, 0x9d, 0x29, 0x47, 0xee, 0x2c, 0xd7, 0x6f, 0x13, 0xfe, + 0x5d, 0xa1, 0x76, 0x19, 0x2e, 0xfc, 0xee, 0x59, 0x7a, 0x8e, 0xbf, 0xf1, 0x4a, 0xb7, 0x7a, 0x52, 0x0a, 0x2c, 0x4c, 0x9b, 0x32, 0x6d, 0xca, 0xc0, 0xbc, 0xfe, 0x00, 0x7c, 0x70, 0x2a, 0xbc, 0x87, + 0x66, 0x7f, 0x9f, 0x4a, 0x51, 0x35, 0x3e, 0x99, 0xe9, 0x47, 0x01, 0xdc, 0x2f, 0x38, 0x3f, 0x2c, 0x7e, 0x3b, 0xee, 0xc2, 0x3a, 0xc8, 0x9b, 0x4b, 0x69, 0xdc, 0xf7, 0x62, 0xb8, 0xdf, 0x30, 0x49, + 0xdc, 0x36, 0x7b, 0x3c, 0xe5, 0x93, 0xdc, 0x79, 0xff, 0x56, 0xf4, 0x1f, 0x88, 0xf8, 0x07, 0xbe, 0x7b, 0xfa, 0x48, 0x85, 0x76, 0xf3, 0x38, 0x33, 0xeb, 0xa6, 0x34, 0x93, 0xb1, 0x9d, 0xa7, 0x6f, + 0x80, 0x3f, 0x9e, 0x01, 0xd7, 0xa0, 0x99, 0xfa, 0x9a, 0x6e, 0x00, 0xfc, 0x87, 0xba, 0xff, 0x82, 0x6f, 0xa5, 0x33, 0xee, 0xfe, 0xfb, 0xb2, 0xc1, 0xbe, 0xe7, 0xac, 0xf9, 0xea, 0x18, 0xe7, 0xa6, + 0xad, 0xfb, 0x9e, 0xc5, 0xe0, 0x8b, 0x24, 0xf8, 0x30, 0xd1, 0xdf, 0xb7, 0xe7, 0x67, 0x4c, 0xed, 0x3c, 0xfd, 0xf4, 0xda, 0xf8, 0xf6, 0x92, 0xfa, 0xe3, 0x88, 0xc7, 0xbf, 0xf6, 0xbf, 0x76, 0x8f, + 0xf5, 0xf8, 0xf3, 0x39, 0xf8, 0xd5, 0x31, 0xbd, 0x25, 0xcf, 0xd0, 0xbc, 0xcd, 0xf2, 0xcf, 0xf9, 0x7d, 0xa9, 0x0e, 0x72, 0xfd, 0xd1, 0x10, 0x41, 0xe1, 0x7f, 0xf3, 0xed, 0x5e, 0xde, 0xfc, 0xe5, + 0x64, 0xfc, 0xeb, 0x0b, 0x57, 0x3f, 0xa4, 0x6c, 0x01, 0xf4, 0x12, 0x42, 0xdf, 0xcb, 0x16, 0x40, 0xc3, 0x70, 0x71, 0x72, 0xa6, 0x73, 0xda, 0x14, 0xdd, 0x4c, 0xdd, 0x15, 0xba, 0x42, 0x64, 0x49, + 0x80, 0x8d, 0x29, 0x4c, 0xeb, 0x2a, 0x6d, 0x1e, 0xbb, 0xf5, 0x44, 0x9e, 0x1e, 0x8c, 0x94, 0x8f, 0xea, 0x39, 0x69, 0x62, 0xd0, 0x12, 0x96, 0x2d, 0xf0, 0x58, 0x68, 0x49, 0x3e, 0x97, 0xb3, 0xa9, + 0x38, 0xeb, 0x0e, 0x51, 0xd1, 0x65, 0x93, 0xdc, 0xcc, 0xd1, 0xc2, 0x4d, 0x04, 0x32, 0x41, 0xe4, 0xa5, 0xd3, 0x22, 0xbe, 0xfc, 0xad, 0x6c, 0xc1, 0xf7, 0xc3, 0xf2, 0xda, 0xb9, 0x67, 0xd2, 0xd5, + 0xff, 0x56, 0x33, 0xb8, 0xaf, 0x66, 0xf0, 0x27, 0xb3, 0xec, 0x7f, 0x33, 0x81, 0x5e, 0xde, 0xfc, 0xc7, 0x93, 0xee, 0x0f, 0x32, 0x81, 0xfe, 0xba, 0x4b, 0x3f, 0xc3, 0xfd, 0x6b, 0x1e, 0x96, 0x3f, + 0xc5, 0xfd, 0xee, 0x3d, 0x1f, 0x03, 0x70, 0xd7, 0xfa, 0xa0, 0x84, 0xe9, 0x5f, 0xcf, 0x46, 0x02, 0xf7, 0x36, 0xf6, 0x48, 0x46, 0xc3, 0xa0, 0x3b, 0x6c, 0x70, 0x01, 0x30, 0xb9, 0x16, 0xf6, 0x20, + 0x9f, 0x67, 0xc9, 0x44, 0xd4, 0xea, 0x9d, 0xc4, 0xe6, 0x87, 0x29, 0x7a, 0x5a, 0xe1, 0xb9, 0x32, 0xd3, 0xb4, 0xdc, 0x6e, 0xd2, 0x49, 0xe5, 0x4d, 0x0f, 0x51, 0xbc, 0xcf, 0x0e, 0xa1, 0xce, 0x07, + 0x29, 0xdf, 0x29, 0x40, 0xca, 0xb0, 0xeb, 0x82, 0xd0, 0xdc, 0x20, 0xa9, 0x91, 0x43, 0x82, 0x27, 0x4c, 0x38, 0x68, 0x5b, 0xfc, 0x3f, 0xb7, 0x7f, 0xef, 0x45, 0x88, 0xf1, 0x25, 0x12, 0x6c, 0x7c, + 0xae, 0x69, 0x15, 0xfe, 0xcb, 0x31, 0x96, 0x8f, 0x5f, 0xf1, 0x29, 0x61, 0x7c, 0x79, 0x30, 0x34, 0xfa, 0x92, 0xf6, 0x8d, 0x66, 0xad, 0x2a, 0xee, 0xaa, 0x6f, 0x93, 0x35, 0xa0, 0xa9, 0xd1, 0x11, + 0xd0, 0x2d, 0x82, 0x24, 0x34, 0x09, 0xc6, 0x65, 0x15, 0xf1, 0x17, 0xd1, 0x04, 0x09, 0xc3, 0x79, 0xeb, 0x54, 0x05, 0x00, 0x5b, 0xbc, 0xa7, 0x71, 0x3b, 0x55, 0xdb, 0x10, 0x75, 0x74, 0xac, 0x23, + 0x05, 0x74, 0x47, 0xec, 0x06, 0x05, 0x29, 0x7b, 0x93, 0x6c, 0x5a, 0x21, 0x96, 0x92, 0xbc, 0x27, 0xa7, 0x14, 0xe4, 0xfe, 0x89, 0x51, 0xf1, 0x21, 0x90, 0x45, 0xd2, 0xf8, 0x61, 0xf6, 0x1b, 0x90, + 0xc8, 0x4b, 0x21, 0xd0, 0x8f, 0x5f, 0xf1, 0x09, 0xe4, 0x97, 0x07, 0xe7, 0x04, 0x4a, 0x03, 0x80, 0x54, 0x67, 0x2b, 0xbc, 0x5c, 0x6e, 0x71, 0x4e, 0x50, 0x3c, 0x5b, 0xcc, 0x31, 0x14, 0x8b, 0x42, + 0x53, 0xec, 0x68, 0x02, 0x84, 0x9a, 0x09, 0x57, 0xc3, 0x80, 0x23, 0x13, 0xbb, 0x6c, 0x2e, 0xe5, 0x8b, 0xa9, 0x96, 0x40, 0x00, 0xc3, 0x1f, 0x9c, 0x89, 0x40, 0xa7, 0x9d, 0x6a, 0x1e, 0x0e, 0x12, + 0x8a, 0x99, 0xfb, 0xa2, 0xac, 0xb6, 0x8b, 0x5e, 0x31, 0x11, 0x6a, 0xcd, 0x41, 0x9b, 0x53, 0x23, 0xd3, 0xc7, 0xe3, 0x9f, 0x00, 0xf9, 0xb9, 0xb2, 0x3f, 0x3e, 0x3d, 0x39, 0xeb, 0xc1, 0xc7, 0x81, + 0x9b, 0x14, 0x6e, 0xf9, 0xa9, 0x2a, 0x7f, 0x66, 0x7d, 0xba, 0x97, 0x7a, 0x1e, 0x21, 0x8e, 0xbd, 0xa8, 0x09, 0xf9, 0x24, 0xfc, 0x89, 0xf3, 0xf9, 0x76, 0x8c, 0x0d, 0xd3, 0x85, 0xc0, 0xc2, 0xb1, + 0xb3, 0xe6, 0x40, 0x60, 0x80, 0xab, 0xc2, 0x2d, 0x74, 0x01, 0xb4, 0x05, 0x2b, 0x1f, 0xcd, 0x05, 0x7c, 0x9f, 0xaf, 0x88, 0x85, 0xc9, 0x26, 0x52, 0xe0, 0x1f, 0x81, 0x80, 0x33, 0x12, 0x5c, 0x33, + 0x41, 0x6b, 0x8e, 0x62, 0xb2, 0x24, 0x8a, 0x5d, 0xb0, 0xe6, 0x4e, 0x64, 0x22, 0xcd, 0xac, 0x66, 0x1a, 0x9a, 0x8e, 0xb2, 0x9e, 0xd2, 0x19, 0x0b, 0x4f, 0xe7, 0xfa, 0xa1, 0x09, 0x6b, 0xcc, 0x7a, + 0x0d, 0x5d, 0xb7, 0x2a, 0x5d, 0xbb, 0x29, 0xab, 0x77, 0x41, 0x06, 0xf9, 0x2a, 0x95, 0xd5, 0xa5, 0xf9, 0x06, 0xd9, 0xfb, 0xf3, 0x1f, 0xec, 0x54, 0x77, 0x32, 0xe4, 0x33, 0xcd, 0xd3, 0xcb, 0x33, + 0xfc, 0x4c, 0xf8, 0x13, 0xef, 0xf3, 0xed, 0xd0, 0x2a, 0x2f, 0x1d, 0x85, 0x3a, 0x92, 0x9e, 0x9b, 0xcd, 0xa9, 0x4d, 0x66, 0x36, 0x8a, 0xec, 0xb3, 0x05, 0x4d, 0x26, 0x2a, 0x62, 0xd4, 0x04, 0x84, + 0xb4, 0xc2, 0x34, 0xf0, 0x6b, 0x94, 0xd9, 0x75, 0xc1, 0x7e, 0xb2, 0x81, 0xf7, 0x31, 0xdd, 0x66, 0x8e, 0x77, 0x9c, 0x83, 0x13, 0x9f, 0x3b, 0xac, 0x44, 0xd1, 0xac, 0xa2, 0x0d, 0xb7, 0xe9, 0x23, + 0x6a, 0x79, 0xf0, 0xbb, 0xb8, 0xb3, 0xa6, 0xfa, 0x0c, 0x04, 0x34, 0xc4, 0x78, 0x4d, 0x0f, 0xf1, 0x4c, 0x90, 0x86, 0xfe, 0xb4, 0xb8, 0xc6, 0x63, 0x42, 0xcf, 0x15, 0xd4, 0xc8, 0x8b, 0x8c, 0xc6, + 0x83, 0xf7, 0x7c, 0x8e, 0xc2, 0x6d, 0xeb, 0x83, 0x80, 0xf0, 0xbf, 0x9e, 0x0d, 0x08, 0xbe, 0x24, 0x60, 0x81, 0x54, 0x05, 0x13, 0xc5, 0xe1, 0xce, 0x04, 0x56, 0x73, 0x71, 0x56, 0x03, 0x9b, 0x25, + 0xc2, 0xa9, 0x38, 0xa8, 0xcc, 0x8a, 0x29, 0x22, 0xed, 0xa7, 0x10, 0x1b, 0xd9, 0x10, 0xbd, 0xdf, 0x17, 0xde, 0x1a, 0x9e, 0x52, 0x32, 0x36, 0x9a, 0xa8, 0x44, 0x14, 0xb8, 0xe0, 0x1c, 0x5f, 0xc8, + 0xcc, 0x41, 0xe3, 0x03, 0x74, 0xd9, 0x34, 0x23, 0x41, 0x27, 0x8e, 0xd9, 0x08, 0x77, 0xc2, 0x42, 0xfd, 0x81, 0xdf, 0xfd, 0x68, 0xfd, 0xf1, 0xc0, 0x7b, 0x82, 0xe5, 0xbf, 0x36, 0x85, 0x07, 0x60, + 0x38, 0x70, 0x42, 0x83, 0xa5, 0x92, 0xca, 0x74, 0xbf, 0xf7, 0x67, 0x3d, 0x57, 0xcd, 0xf0, 0x74, 0xe1, 0x2c, 0x7d, 0xb7, 0xed, 0x7d, 0xb7, 0xe7, 0x30, 0x04, 0x9d, 0xba, 0x25, 0xb6, 0x06, 0xda, + 0x13, 0xbf, 0x07, 0x63, 0xb6, 0xdf, 0x02, 0x51, 0x48, 0xa3, 0x48, 0x24, 0x07, 0x0e, 0xa5, 0xab, 0x09, 0xbf, 0xd0, 0xd7, 0xd2, 0x09, 0xee, 0x8b, 0x52, 0x48, 0xf3, 0x2d, 0x79, 0x30, 0xab, 0xe9, + 0xa2, 0xd6, 0x47, 0x92, 0xb9, 0x1a, 0x92, 0xb5, 0xeb, 0x43, 0xbd, 0xf3, 0x58, 0xbb, 0xf8, 0x4a, 0xfe, 0xc8, 0x0b, 0xc9, 0x33, 0x1e, 0x6f, 0x17, 0x63, 0x62, 0x58, 0xe6, 0xc8, 0x16, 0x59, 0x4e, + 0x85, 0x29, 0x83, 0xa3, 0x4d, 0x1a, 0xcf, 0x8b, 0x34, 0x9e, 0x2f, 0x0e, 0xbd, 0xb6, 0xaa, 0xc4, 0x2d, 0x58, 0x0b, 0x90, 0x51, 0x8e, 0x1a, 0xf7, 0xb0, 0x36, 0xbc, 0x42, 0x83, 0x44, 0x8b, 0x74, + 0x47, 0x53, 0xc6, 0xdf, 0xec, 0xcc, 0x91, 0x78, 0x9c, 0xe6, 0x0b, 0x16, 0xa9, 0xb3, 0x20, 0x4c, 0xf9, 0x15, 0x67, 0xd2, 0x29, 0x9a, 0x02, 0xad, 0x29, 0x17, 0x4b, 0x20, 0x2e, 0xe5, 0x1e, 0x7e, + 0x6d, 0x4d, 0x9b, 0x76, 0x5e, 0xbe, 0xab, 0xf4, 0xbe, 0xe8, 0x34, 0xce, 0x8f, 0xc6, 0x51, 0xf5, 0xce, 0xcb, 0x7e, 0xd3, 0x88, 0x3d, 0xdb, 0x0d, 0x90, 0xff, 0xdd, 0x0d, 0xfe, 0xff, 0xdb, 0x0d, + 0x8a, 0x32, 0x4c, 0xcd, 0x27, 0x93, 0x1c, 0x7d, 0xc9, 0xe5, 0xf5, 0x4a, 0xf3, 0x3a, 0xcb, 0xc3, 0xd4, 0x3c, 0x7b, 0xfe, 0x0e, 0x98, 0xe6, 0xee, 0xa2, 0x99, 0xcf, 0x3b, 0x42, 0x2d, 0x1c, 0x73, + 0xe4, 0xa3, 0xc5, 0x48, 0x62, 0xdb, 0x6c, 0x07, 0xca, 0xa7, 0xed, 0x1e, 0x50, 0x34, 0x77, 0x49, 0xcf, 0x78, 0xc0, 0x9f, 0xd6, 0xfc, 0x44, 0x16, 0x41, 0x7b, 0xdd, 0x6c, 0x61, 0xd6, 0x66, 0x56, + 0xd9, 0x76, 0xd3, 0x06, 0x91, 0x86, 0x9b, 0x0b, 0xf7, 0x50, 0x4e, 0x69, 0xa0, 0xb2, 0x84, 0xbc, 0x00, 0x57, 0x55, 0x9f, 0x82, 0x51, 0x65, 0xee, 0x54, 0x74, 0x90, 0x2f, 0xd4, 0x87, 0xb2, 0xf6, + 0xb1, 0xa5, 0xe4, 0x35, 0x66, 0xf5, 0x4c, 0xf3, 0x8c, 0xc2, 0xf9, 0x6a, 0x68, 0xc6, 0x1e, 0x7b, 0x3a, 0x0b, 0xab, 0x62, 0x57, 0x63, 0x2d, 0xcb, 0xd6, 0x1d, 0xaf, 0xc3, 0x7a, 0x39, 0x91, 0xd0, + 0xd0, 0x9a, 0xc7, 0x93, 0x35, 0x29, 0x5b, 0x2c, 0xa6, 0x2f, 0xe8, 0xcc, 0xa0, 0x6d, 0x0a, 0xe4, 0xf3, 0xa4, 0x6d, 0xbd, 0x38, 0x96, 0xec, 0x65, 0x99, 0x03, 0xa6, 0x11, 0x4e, 0x24, 0x35, 0x91, + 0x90, 0x83, 0x5f, 0xea, 0x0a, 0x3e, 0xc3, 0x5b, 0x72, 0x61, 0x63, 0x0b, 0x6c, 0x2a, 0x55, 0x36, 0xf5, 0x2a, 0xc3, 0x74, 0xc7, 0x11, 0x61, 0x7f, 0x7e, 0x6e, 0xdf, 0xfc, 0xff, 0x73, 0x25, 0xdd, + 0xab, 0xe6, 0xe4, 0x4f, 0xf2, 0x67, 0x94, 0xdf, 0x6f, 0xfe, 0x24, 0x23, 0x39, 0x7d, 0xb4, 0x84, 0xc5, 0x42, 0x48, 0x41, 0xf9, 0x24, 0xeb, 0xad, 0xea, 0xb0, 0x05, 0xd7, 0xb5, 0x14, 0xb7, 0xeb, + 0x5d, 0x9e, 0xda, 0x4f, 0x13, 0x4b, 0x3c, 0x76, 0xf9, 0x64, 0xdb, 0xcc, 0x1d, 0x91, 0x21, 0x0c, 0x06, 0xef, 0xd8, 0xf5, 0x88, 0x95, 0xb0, 0x2d, 0x19, 0xe4, 0x1b, 0x7e, 0xd4, 0xb3, 0x6d, 0xba, + 0xea, 0xfb, 0x8a, 0x39, 0x04, 0xfe, 0x09, 0x5c, 0x94, 0x12, 0xb6, 0x87, 0x10, 0xd3, 0x0b, 0xff, 0x27, 0xcb, 0xf1, 0x93, 0x43, 0x7d, 0xbc, 0x20, 0x5f, 0x13, 0x40, 0xaf, 0x54, 0xcf, 0x30, 0x5d, + 0xaf, 0xcf, 0x2a, 0xbb, 0x01, 0xd3, 0x71, 0x95, 0x7a, 0xab, 0x35, 0x62, 0xe1, 0x8b, 0x91, 0xbc, 0x6f, 0x37, 0xa4, 0x00, 0xb5, 0x25, 0xb2, 0x3d, 0x40, 0xf1, 0x1a, 0xc8, 0xa7, 0x73, 0x3f, 0x83, + 0x05, 0x7d, 0xcf, 0xd4, 0x87, 0x0d, 0x09, 0xac, 0x91, 0x62, 0x65, 0x16, 0xea, 0x04, 0x5d, 0x90, 0xf6, 0x5c, 0x33, 0xf3, 0x39, 0xa2, 0xa8, 0x08, 0x8c, 0x4c, 0x67, 0xe8, 0xfe, 0x54, 0xc8, 0x80, + 0xe7, 0x85, 0x39, 0x9b, 0xc6, 0x75, 0x88, 0x03, 0x5b, 0xf3, 0xb5, 0xb3, 0xe7, 0xdb, 0x74, 0x84, 0xff, 0x77, 0x3a, 0xfe, 0x5f, 0x9e, 0x8e, 0x0f, 0x00, 0xfb, 0x37, 0xe6, 0xe3, 0x63, 0xa0, 0x06, + 0xce, 0x48, 0x84, 0xca, 0xb2, 0x95, 0xe7, 0xed, 0x7a, 0xf2, 0x28, 0x40, 0xb4, 0x0a, 0xc0, 0x36, 0x41, 0x65, 0x54, 0x46, 0x53, 0xec, 0xac, 0xcf, 0xc1, 0x2c, 0xd4, 0xd5, 0xc3, 0x11, 0x3f, 0x9e, + 0x0e, 0x6a, 0x76, 0xca, 0x27, 0x99, 0x74, 0x3a, 0xed, 0x0a, 0x71, 0xeb, 0x18, 0x8c, 0x1b, 0x4e, 0xed, 0x80, 0xa4, 0xe9, 0x06, 0x83, 0xb0, 0x1a, 0xed, 0x0a, 0xca, 0x48, 0x7d, 0xcd, 0xd3, 0x82, + 0x8c, 0x62, 0xe8, 0x62, 0x18, 0x43, 0xf8, 0xb3, 0xc4, 0xf7, 0x92, 0x03, 0x71, 0xf5, 0x29, 0xec, 0xbd, 0xcb, 0x79, 0x83, 0x1c, 0x87, 0x63, 0xad, 0xb2, 0x0f, 0xfb, 0x18, 0x15, 0xa7, 0x05, 0x4e, + 0x2a, 0x06, 0xe8, 0xc4, 0x3e, 0xb3, 0xd2, 0x42, 0x1c, 0x20, 0xc3, 0x08, 0x01, 0xc1, 0x15, 0xbd, 0xdb, 0x2e, 0x0f, 0x08, 0xbc, 0x01, 0x1c, 0xdd, 0xdd, 0x6d, 0x95, 0x6e, 0x85, 0x42, 0xbb, 0xd3, + 0xf6, 0x68, 0x26, 0x02, 0xe4, 0xca, 0xe9, 0x04, 0x33, 0x28, 0x55, 0x05, 0xd6, 0x7b, 0x6a, 0x46, 0xcc, 0x77, 0x4a, 0xaa, 0x51, 0xca, 0x44, 0x3f, 0xe2, 0x43, 0x72, 0x4d, 0xfd, 0x18, 0xf3, 0xfa, + 0x5a, 0xf9, 0x9b, 0x8f, 0x70, 0xd7, 0x6b, 0xa4, 0xeb, 0xc0, 0xf2, 0x37, 0x5e, 0x74, 0x68, 0xa6, 0x18, 0x65, 0xcf, 0x88, 0xe9, 0x69, 0x87, 0x37, 0xa5, 0xb0, 0x5f, 0x81, 0x73, 0xba, 0xf1, 0x62, + 0xc3, 0xce, 0xc3, 0xc5, 0x82, 0x04, 0xbb, 0x6d, 0xb3, 0x69, 0xa2, 0x3d, 0x46, 0x81, 0x36, 0x8d, 0x6d, 0xeb, 0x24, 0x83, 0x41, 0x06, 0x56, 0x69, 0x54, 0x01, 0x76, 0x13, 0x59, 0x3b, 0x04, 0x7b, + 0xcf, 0x33, 0x12, 0x78, 0x2d, 0xf8, 0xca, 0xc8, 0x97, 0x9c, 0x0d, 0xc7, 0x85, 0x29, 0x30, 0x04, 0x02, 0xcf, 0x34, 0xab, 0x71, 0x54, 0x8d, 0xcb, 0x26, 0xab, 0xc3, 0xa7, 0x49, 0x1e, 0xc1, 0x7f, + 0xa8, 0x17, 0x16, 0xc7, 0x17, 0xda, 0xc0, 0xf8, 0x6b, 0xcb, 0xf8, 0x4c, 0xf7, 0x77, 0x74, 0x80, 0xf9, 0xa4, 0x8b, 0x80, 0x62, 0xb9, 0xc3, 0x3b, 0x6a, 0x4f, 0xba, 0xd5, 0x74, 0x44, 0x43, 0x59, + 0x1e, 0x85, 0x9c, 0x00, 0x89, 0x2e, 0x0b, 0xca, 0xab, 0x69, 0xde, 0x1f, 0x01, 0xef, 0x60, 0x45, 0x36, 0xac, 0xf8, 0x71, 0x5a, 0xad, 0x20, 0xd0, 0x9e, 0x13, 0x14, 0x5b, 0x17, 0xac, 0x9b, 0x24, + 0xe6, 0xc6, 0x51, 0x2b, 0x38, 0x5f, 0x92, 0x1b, 0x1a, 0x6d, 0x41, 0x99, 0x85, 0x4d, 0xa5, 0xdb, 0x4e, 0x07, 0x44, 0x00, 0xde, 0x7a, 0x05, 0x7c, 0x71, 0x40, 0xbc, 0x4f, 0xe1, 0xfa, 0xa8, 0x40, + 0xe8, 0x4d, 0x92, 0xbb, 0xbf, 0xff, 0x9b, 0xfc, 0x6a, 0x75, 0x7c, 0x4f, 0x3e, 0xf1, 0xae, 0x42, 0xb8, 0x79, 0xe4, 0x99, 0x55, 0xfd, 0x6e, 0xe9, 0x45, 0xfe, 0x81, 0xc1, 0xaf, 0x56, 0xe2, 0x4f, + 0x1b, 0xf2, 0xb7, 0x84, 0xc2, 0x59, 0xee, 0xb8, 0xe3, 0xbc, 0xba, 0x71, 0x09, 0x80, 0xbe, 0xba, 0x15, 0xe4, 0xad, 0x5b, 0x26, 0xb9, 0xe9, 0x8c, 0x8b, 0x32, 0xaf, 0x5d, 0xfb, 0xc6, 0xf1, 0xf5, + 0x8b, 0x71, 0xb3, 0x28, 0xf3, 0x74, 0x6c, 0x27, 0xe1, 0xbb, 0x9d, 0x1d, 0xfa, 0x66, 0xce, 0x3e, 0x5c, 0x5e, 0x71, 0xf6, 0xa6, 0xf8, 0x23, 0xd7, 0x48, 0xb3, 0xf4, 0x0b, 0xf3, 0xe7, 0xb3, 0x0b, + 0xfe, 0x62, 0xe2, 0x1e, 0x3e, 0xeb, 0xde, 0x89, 0x03, 0xe3, 0x8f, 0xcb, 0x07, 0xe9, 0x58, 0xff, 0x7a, 0x36, 0xd7, 0xc8, 0x11, 0xb5, 0x3b, 0xb8, 0x96, 0x35, 0xef, 0x8b, 0x3d, 0x25, 0xca, 0xa3, + 0x9d, 0x89, 0x8b, 0x30, 0x65, 0x56, 0x5c, 0xee, 0xbb, 0x32, 0xdf, 0xdb, 0x8b, 0x7a, 0xc2, 0x09, 0x4e, 0xc1, 0xb3, 0xec, 0x69, 0xe2, 0x43, 0xa0, 0x07, 0x62, 0xa6, 0x32, 0xd7, 0x68, 0xcb, 0x66, + 0x0e, 0x0b, 0x0f, 0xd8, 0xec, 0x3b, 0x88, 0x89, 0x26, 0xc6, 0xe8, 0x00, 0x03, 0x16, 0x43, 0xfb, 0xc8, 0xac, 0x6d, 0xca, 0x15, 0x22, 0xdd, 0x39, 0xe3, 0x3d, 0x1c, 0xcd, 0x67, 0x40, 0x7c, 0x2f, + 0x96, 0x39, 0x14, 0x88, 0x2b, 0x6d, 0x60, 0xfc, 0x7e, 0x75, 0xae, 0x6e, 0x30, 0xf0, 0xf8, 0xee, 0x8a, 0xa3, 0x51, 0x51, 0x42, 0x7e, 0x34, 0xcc, 0x25, 0xa3, 0x2c, 0x17, 0x9c, 0xb1, 0x3d, 0xcd, + 0x18, 0x53, 0x2f, 0x12, 0x70, 0xbe, 0x52, 0x26, 0xa3, 0x39, 0x4d, 0x99, 0xcb, 0xf0, 0xe4, 0xa6, 0xab, 0x80, 0xef, 0xe2, 0xa3, 0xe4, 0xe3, 0x48, 0x80, 0x6e, 0xa1, 0xd5, 0xd2, 0x57, 0x17, 0x6c, + 0xb1, 0x3d, 0x6c, 0x66, 0x82, 0x6c, 0xa7, 0xa9, 0xbe, 0x6e, 0xfc, 0x52, 0x8e, 0x96, 0x09, 0x5d, 0xef, 0x5a, 0xf9, 0x5b, 0xa9, 0x95, 0x1f, 0xcc, 0x49, 0x9f, 0x53, 0xe4, 0x4b, 0xc6, 0x9b, 0xbf, + 0xfe, 0xba, 0x33, 0x26, 0xfd, 0x9f, 0xdb, 0xbf, 0x9f, 0xbb, 0x5a, 0x55, 0x8f, 0x1d, 0xf7, 0xec, 0x36, 0xd4, 0x94, 0xe1, 0xf8, 0x23, 0x0d, 0xe2, 0x53, 0xb9, 0xe8, 0x15, 0xe9, 0xf0, 0xe9, 0x5b, + 0xce, 0x3b, 0xdd, 0x93, 0x67, 0x43, 0x2a, 0x3b, 0xbf, 0x0d, 0xc0, 0x6e, 0xe5, 0xaf, 0x76, 0x3e, 0xe6, 0xaa, 0xc7, 0x56, 0x36, 0x16, 0xdd, 0x8e, 0x9c, 0xb7, 0x9e, 0x65, 0xb2, 0xc4, 0x64, 0xaf, + 0x04, 0xb0, 0xbd, 0x1e, 0x21, 0x11, 0xe6, 0xf1, 0x8b, 0x5e, 0xe5, 0xa7, 0xc7, 0x1d, 0xbd, 0x44, 0x1c, 0x0d, 0x31, 0x89, 0x5d, 0x4f, 0x9e, 0x60, 0x0f, 0x68, 0x24, 0xd0, 0x45, 0x68, 0x7c, 0x97, + 0xe6, 0xce, 0x0c, 0xc9, 0x15, 0x0c, 0x8d, 0xb6, 0x12, 0xc5, 0x6a, 0x5b, 0x8e, 0xfb, 0x16, 0x27, 0x7f, 0xfd, 0xcc, 0x5f, 0x52, 0x7f, 0x20, 0x2f, 0x05, 0x81, 0x7f, 0xa1, 0xfd, 0x09, 0xca, 0x47, + 0x12, 0x10, 0x64, 0x58, 0x00, 0xb8, 0x87, 0x1c, 0x24, 0x2a, 0x97, 0x4e, 0x54, 0x04, 0x4f, 0x02, 0xda, 0x05, 0x58, 0x4a, 0x9b, 0x52, 0x50, 0xb7, 0x4e, 0x57, 0xf4, 0x74, 0xaa, 0x02, 0xfe, 0x4c, + 0xcc, 0x56, 0xc2, 0x44, 0x5f, 0x60, 0x41, 0xd5, 0x89, 0x04, 0xbd, 0x5e, 0x45, 0x20, 0xc5, 0xda, 0x18, 0xab, 0x0b, 0x3d, 0x65, 0x2f, 0xb8, 0xd1, 0xe8, 0x98, 0x14, 0xb3, 0x29, 0xe7, 0xcf, 0xcc, + 0xb0, 0xd6, 0x2a, 0x10, 0x99, 0x6c, 0x65, 0x12, 0x95, 0x1e, 0x43, 0xf1, 0x3c, 0x6a, 0x18, 0x7a, 0xa9, 0x4c, 0xf6, 0x07, 0xd5, 0x8f, 0xee, 0x87, 0x9e, 0x77, 0xf6, 0x7d, 0x1d, 0x70, 0xee, 0x1d, + 0x97, 0x4d, 0xbe, 0xc5, 0x46, 0x6b, 0x8a, 0xda, 0x27, 0x06, 0x59, 0x77, 0xae, 0x63, 0xca, 0x1e, 0x3e, 0x39, 0xc2, 0x5b, 0x5f, 0xd2, 0x8e, 0xad, 0x6f, 0x88, 0x7a, 0xbe, 0x59, 0x1d, 0x8c, 0xc6, + 0x4b, 0x97, 0xa1, 0x05, 0xd6, 0x6b, 0xb8, 0x76, 0xfd, 0x0d, 0x2d, 0x1a, 0x16, 0x54, 0x68, 0x82, 0xcf, 0x05, 0xc9, 0x61, 0x96, 0x4c, 0x40, 0x57, 0x04, 0x6d, 0xa4, 0xa3, 0x5b, 0xc9, 0x4e, 0xfb, + 0x23, 0x3a, 0x84, 0x3d, 0x3c, 0x7f, 0xe9, 0x8f, 0x01, 0xc4, 0xf0, 0x0b, 0x1e, 0x97, 0x1f, 0x54, 0xdf, 0xb1, 0xb8, 0x86, 0x10, 0xc3, 0xbf, 0xf9, 0x56, 0x9e, 0x8d, 0x2f, 0xb3, 0x7a, 0x6e, 0xfb, + 0x5b, 0x9c, 0xec, 0xc2, 0xed, 0x36, 0xec, 0x0c, 0x38, 0x10, 0x9c, 0xa5, 0x67, 0xb3, 0x42, 0xec, 0x52, 0x7b, 0xd1, 0xcb, 0xba, 0x94, 0x96, 0x77, 0xfb, 0x20, 0x75, 0x57, 0x3c, 0x59, 0xce, 0xc1, + 0xed, 0xa2, 0x4b, 0xa7, 0x80, 0x54, 0xe7, 0x88, 0x42, 0xc8, 0xb9, 0xb1, 0x2a, 0x30, 0x3b, 0x4c, 0x0c, 0xeb, 0xd8, 0x8b, 0x58, 0xb8, 0x15, 0xb6, 0x52, 0xb5, 0x1c, 0x31, 0xee, 0xec, 0x35, 0xe1, + 0xed, 0xbf, 0xde, 0x8e, 0xd9, 0x24, 0xb4, 0x00, 0xaf, 0xfa, 0xa7, 0xaa, 0xcd, 0xfa, 0x63, 0x8f, 0xba, 0xe3, 0x10, 0x6e, 0x7f, 0xd5, 0xbd, 0xf3, 0x11, 0x6f, 0x03, 0x7f, 0x17, 0x01, 0xf2, 0xdd, + 0x9b, 0xed, 0xcb, 0x91, 0x7e, 0x4e, 0xae, 0x01, 0xff, 0xfd, 0xa9, 0x5e, 0xbc, 0x7d, 0x16, 0xda, 0x65, 0xfe, 0xe9, 0xbf, 0x85, 0x7e, 0xfd, 0x84, 0x22, 0xb4, 0x6f, 0x1e, 0x5f, 0xca, 0x54, 0x3c, + 0xdf, 0x2f, 0x1f, 0xfa, 0x9f, 0xfd, 0xab, 0x0a, 0xf5, 0xe7, 0xaf, 0x79, 0x9f, 0x11, 0x8f, 0x7d, 0xe0, 0x06, 0xaa, 0xd7, 0x93, 0xc0, 0x01, 0xba, 0xf9, 0x68, 0x1d, 0x53, 0x24, 0x6b, 0xe4, 0xdb, + 0x69, 0x9d, 0x68, 0xa5, 0xc9, 0xd6, 0x5e, 0x80, 0xed, 0xf5, 0x30, 0xe2, 0x22, 0x33, 0xd9, 0xdb, 0x31, 0x51, 0x99, 0x6a, 0xdd, 0x98, 0x99, 0x32, 0x3b, 0xad, 0xf9, 0x63, 0xc6, 0x06, 0xca, 0x9e, + 0x99, 0x2d, 0x0f, 0xec, 0x71, 0x46, 0xa4, 0x95, 0x4c, 0xce, 0xc0, 0x66, 0x9a, 0x1e, 0x92, 0xb8, 0x8b, 0xa6, 0x1a, 0x79, 0x6c, 0x3b, 0xf6, 0x5b, 0xbe, 0xbb, 0xdb, 0xef, 0xfc, 0x0d, 0x24, 0xe2, + 0x1f, 0xe8, 0xcf, 0x45, 0x88, 0x07, 0x2f, 0xf8, 0x02, 0xcf, 0x27, 0x2e, 0x67, 0x57, 0xd8, 0x5f, 0x81, 0x41, 0x83, 0xa8, 0x33, 0x66, 0x9b, 0xd4, 0x8f, 0x00, 0x43, 0x5d, 0xed, 0x03, 0x66, 0x97, + 0xb7, 0x8b, 0x8d, 0x1d, 0x32, 0x00, 0x96, 0xee, 0xea, 0x09, 0x27, 0x49, 0x47, 0x61, 0x04, 0x6b, 0xf4, 0x6c, 0xde, 0x64, 0xc4, 0x4c, 0xde, 0xc6, 0x70, 0x2e, 0x72, 0xb5, 0xd5, 0x50, 0x86, 0x51, + 0xe0, 0xf1, 0x21, 0x1a, 0xb9, 0x06, 0xd0, 0x10, 0xfd, 0xc8, 0xf1, 0x69, 0x9f, 0x27, 0x50, 0xdb, 0x5b, 0xc8, 0x19, 0x3d, 0x80, 0x7f, 0xbe, 0xf1, 0xb7, 0xfd, 0xc6, 0xfe, 0x7e, 0x26, 0xa6, 0x79, + 0x9b, 0xb8, 0xf0, 0xfd, 0xc4, 0x2d, 0x3d, 0xc7, 0xfe, 0xfb, 0x21, 0x57, 0x7a, 0xf5, 0xcb, 0xae, 0xc2, 0x34, 0x4c, 0xcc, 0xf7, 0x6e, 0x5e, 0x1d, 0x6f, 0x9f, 0x4f, 0xed, 0xe4, 0x8d, 0x53, 0xaf, + 0x82, 0xda, 0x0d, 0xb3, 0x1f, 0x44, 0xde, 0x3f, 0x0f, 0x6b, 0xfc, 0x4a, 0xfc, 0x7d, 0x9c, 0x6e, 0x9a, 0xce, 0xbc, 0xe7, 0x2f, 0x61, 0x8e, 0xd0, 0x78, 0xa3, 0x17, 0xb6, 0x91, 0xfb, 0xf8, 0xfc, + 0xc0, 0xf3, 0x87, 0x85, 0x34, 0x0a, 0x64, 0xd2, 0x68, 0x0e, 0x0e, 0xe6, 0xca, 0x03, 0x12, 0x73, 0x9e, 0x5f, 0x59, 0xba, 0xce, 0xf3, 0x58, 0xc3, 0xd7, 0x64, 0xd9, 0x1b, 0xba, 0xef, 0x1d, 0xbb, + 0xdc, 0x0d, 0x95, 0x6a, 0x75, 0x61, 0x34, 0xd5, 0xbd, 0xa9, 0x26, 0x6b, 0xbc, 0x6a, 0x88, 0xea, 0xc6, 0x0d, 0x33, 0x56, 0x58, 0xf9, 0xa7, 0x9a, 0x87, 0xba, 0x0d, 0x07, 0x4c, 0x01, 0x75, 0xba, + 0x66, 0x42, 0x0c, 0x67, 0x2a, 0x1d, 0x76, 0xba, 0xae, 0xe5, 0x40, 0x30, 0xe6, 0x96, 0xec, 0x32, 0xe7, 0x88, 0x82, 0xd7, 0x0e, 0x8b, 0x9c, 0x77, 0x3b, 0x52, 0xe1, 0x0d, 0x58, 0x51, 0x3c, 0x76, + 0xc5, 0xaa, 0x6b, 0x76, 0x3f, 0xab, 0x1e, 0xf3, 0x30, 0x95, 0xe9, 0x0d, 0xdb, 0xb5, 0x5e, 0x64, 0xf3, 0xee, 0xe9, 0xbf, 0xc3, 0x71, 0xdf, 0x3a, 0x34, 0xa6, 0x62, 0x37, 0x5a, 0x2d, 0x6d, 0xd8, + 0x49, 0xb9, 0x75, 0xb2, 0x29, 0x92, 0x19, 0xc0, 0xa2, 0x2b, 0x2a, 0xa1, 0xd6, 0xf6, 0x84, 0x9d, 0x78, 0x9b, 0x7a, 0x83, 0xd3, 0x3a, 0x89, 0x36, 0xda, 0x7a, 0x2f, 0xe1, 0x4c, 0x6b, 0xf7, 0xd4, + 0xda, 0xf6, 0x11, 0x44, 0x87, 0x7b, 0x88, 0xd3, 0xac, 0x64, 0x8b, 0x1f, 0x1d, 0x1d, 0x43, 0x37, 0x7b, 0x5d, 0x63, 0x99, 0x76, 0x04, 0xee, 0x8a, 0x03, 0xc9, 0xe5, 0x78, 0x1f, 0x7f, 0xcb, 0xc8, + 0xfb, 0x29, 0x46, 0x3e, 0x39, 0xc1, 0x5f, 0xc9, 0x41, 0x7c, 0x25, 0x7a, 0xed, 0xff, 0x5b, 0x9f, 0x2f, 0x84, 0x7e, 0xef, 0xb4, 0xb1, 0x06, 0x35, 0xbc, 0x41, 0x08, 0x07, 0xc7, 0xea, 0x89, 0x4e, + 0x26, 0x7c, 0xa7, 0xf1, 0xf3, 0x7a, 0xde, 0x66, 0x8c, 0xbb, 0xb4, 0x17, 0x24, 0x28, 0xd1, 0x82, 0xe2, 0x4c, 0x83, 0xc3, 0x34, 0x45, 0x43, 0xf4, 0x38, 0x0a, 0x2b, 0x00, 0x21, 0x45, 0x15, 0x42, + 0xfd, 0x7e, 0xd9, 0xc8, 0xfb, 0xa0, 0x70, 0xb3, 0xed, 0x7a, 0x54, 0x6c, 0x97, 0xbd, 0x60, 0x37, 0xd8, 0x2a, 0x83, 0xf2, 0xa6, 0xe7, 0x91, 0x01, 0x7b, 0xd0, 0x7f, 0xbd, 0x7f, 0xb2, 0x19, 0xb5, + 0xef, 0xde, 0xba, 0x9f, 0xc1, 0x8f, 0xf7, 0x56, 0xbf, 0xf7, 0x48, 0xda, 0x24, 0xf7, 0xfd, 0xa7, 0xb9, 0xa2, 0xcd, 0xb6, 0x0d, 0x2f, 0x71, 0x98, 0xc4, 0x57, 0xa5, 0xc0, 0xe3, 0xa3, 0xe1, 0x8d, + 0x06, 0xf6, 0xfd, 0x87, 0x6f, 0xe0, 0xb9, 0x65, 0xf9, 0xe1, 0x36, 0x8d, 0x3c, 0xd4, 0x02, 0x8c, 0x3b, 0xb3, 0xcc, 0xde, 0xbf, 0xe5, 0x9b, 0x03, 0xb2, 0x17, 0x66, 0xce, 0x38, 0x7d, 0xfb, 0xd1, + 0xfb, 0x3e, 0xf8, 0x55, 0x97, 0x90, 0x98, 0x75, 0x55, 0x7f, 0xf6, 0x17, 0xba, 0xfb, 0x8c, 0x24, 0xf4, 0x83, 0xfa, 0xed, 0xff, 0xcb, 0x8f, 0x62, 0xbd, 0x97, 0xcd, 0xf8, 0x5e, 0x11, 0x10, 0x66, + 0xf9, 0xfb, 0x36, 0x8e, 0x7c, 0xd3, 0x11, 0x1c, 0x4f, 0x63, 0xd3, 0x71, 0xca, 0x0f, 0xac, 0x88, 0x27, 0xfb, 0xf8, 0x17, 0x3f, 0xf9, 0xca, 0xb5, 0x9b, 0xd2, 0xbd, 0x80, 0x75, 0x2f, 0xe8, 0xdd, + 0x6f, 0xf7, 0xb7, 0x1e, 0xe0, 0xc8, 0x3d, 0x88, 0x75, 0x98, 0x9d, 0xc6, 0x49, 0xd9, 0x5c, 0x9f, 0x3e, 0x75, 0x29, 0xfa, 0x0a, 0xf6, 0x63, 0x05, 0xd7, 0x2b, 0x36, 0xf0, 0x3b, 0xca, 0x37, 0x6b, + 0xe2, 0x7c, 0x3f, 0x06, 0x87, 0x59, 0xc4, 0xf3, 0xa9, 0x57, 0xd8, 0xd5, 0x2c, 0x73, 0xfc, 0x6c, 0xa6, 0xf9, 0x21, 0x47, 0x58, 0xdd, 0x7c, 0x35, 0x69, 0x32, 0xd8, 0x11, 0x47, 0x68, 0x40, 0xa2, + 0x2d, 0x9d, 0xc4, 0xbb, 0x6a, 0x97, 0xf5, 0x80, 0xa8, 0xae, 0x28, 0xd9, 0xf5, 0x3c, 0x4c, 0x9d, 0xe7, 0xf3, 0x04, 0x46, 0xa1, 0xe3, 0x36, 0x5c, 0xbb, 0xec, 0x6e, 0x0f, 0xb4, 0x2a, 0xd5, 0xc7, + 0x33, 0x6d, 0x7f, 0xd0, 0xd5, 0x63, 0x24, 0x76, 0xac, 0xfd, 0x50, 0xba, 0xb9, 0x9f, 0x4e, 0x8f, 0x61, 0x78, 0x55, 0xc6, 0xb9, 0xa1, 0x7d, 0x03, 0xc4, 0xb5, 0x65, 0x0c, 0x0e, 0x93, 0x77, 0x2a, + 0x88, 0x91, 0xfc, 0x86, 0xee, 0x00, 0xea, 0x50, 0xdb, 0x50, 0x01, 0xec, 0xb6, 0x3a, 0xea, 0x1e, 0xa8, 0x1d, 0x2f, 0x73, 0x93, 0x69, 0x1c, 0x8d, 0xd8, 0xad, 0x2d, 0x72, 0x2b, 0x28, 0xcc, 0x50, + 0x5e, 0xc3, 0xcc, 0xb9, 0x29, 0x4d, 0x29, 0x63, 0xca, 0xd5, 0xa0, 0xb3, 0x24, 0x8a, 0x12, 0xb3, 0x38, 0x0f, 0x4d, 0x36, 0x05, 0xdb, 0x4e, 0xea, 0x0d, 0x7c, 0xea, 0x8a, 0xad, 0xe0, 0x57, 0x44, + 0x70, 0x78, 0xc8, 0xc0, 0x1d, 0x9e, 0x0a, 0x79, 0xd0, 0xab, 0x8c, 0xed, 0xe1, 0xda, 0xef, 0xc3, 0xf8, 0x42, 0xe4, 0xf7, 0xee, 0x12, 0x8c, 0xdd, 0x57, 0xa4, 0xcf, 0x6d, 0x66, 0xa5, 0xd6, 0x6f, + 0x47, 0x4c, 0x5c, 0xe9, 0xb4, 0xdd, 0x14, 0x07, 0xfe, 0x74, 0x54, 0xd8, 0xfd, 0xbe, 0x64, 0xc5, 0xb5, 0x2c, 0x1f, 0x55, 0x18, 0x98, 0x85, 0xb6, 0x46, 0x12, 0x24, 0xc5, 0xcb, 0xb4, 0x2c, 0x93, + 0x23, 0xd6, 0x86, 0x9b, 0x5d, 0xaf, 0x36, 0x85, 0x58, 0xa1, 0xba, 0x82, 0x2e, 0x7b, 0x3a, 0xa5, 0x8f, 0x51, 0x34, 0xd5, 0xe8, 0xe3, 0x0c, 0x18, 0x50, 0xad, 0xa3, 0x74, 0x9b, 0xea, 0x36, 0x94, + 0xe4, 0x49, 0xda, 0x94, 0x07, 0xd1, 0x3b, 0x8f, 0x20, 0xc3, 0x5f, 0xd3, 0x9d, 0x7c, 0x21, 0xfe, 0x06, 0xde, 0x97, 0xa6, 0xb3, 0x53, 0xf4, 0x80, 0x05, 0x44, 0x2c, 0x8a, 0x0a, 0xd8, 0xef, 0x4e, + 0xa9, 0xb5, 0x8e, 0x61, 0x69, 0xad, 0xaf, 0x50, 0xa1, 0x2f, 0x78, 0xb1, 0xd4, 0x23, 0x3e, 0x70, 0xb8, 0xe3, 0xbe, 0xe1, 0xda, 0x13, 0x2c, 0xd1, 0xd5, 0x9a, 0xc1, 0x93, 0xa8, 0xc9, 0x9d, 0x55, + 0xeb, 0xc4, 0xbb, 0x0a, 0xb0, 0x8b, 0xd3, 0x72, 0x89, 0x4c, 0x35, 0x4e, 0x2b, 0x58, 0x50, 0x0c, 0x21, 0xb6, 0xf5, 0xa1, 0xbc, 0xb5, 0xf8, 0x7e, 0xed, 0xcc, 0x69, 0xfa, 0x35, 0xc9, 0xf0, 0x6d, + 0xbb, 0xbd, 0x09, 0x05, 0xf9, 0x21, 0x27, 0xcd, 0x5d, 0x91, 0xf9, 0x47, 0xb0, 0x12, 0xaf, 0xc2, 0x7a, 0x25, 0x7b, 0x01, 0xf4, 0x7a, 0x73, 0x4e, 0xe1, 0x32, 0x00, 0xca, 0x83, 0x98, 0x53, 0xf3, + 0x91, 0xc3, 0xab, 0xe9, 0x14, 0x5e, 0xdb, 0x16, 0x4a, 0x5b, 0x5a, 0x9b, 0xad, 0x96, 0xc7, 0xed, 0x26, 0x9a, 0xa6, 0x23, 0x59, 0x2e, 0x5c, 0xd4, 0x9f, 0x35, 0x8b, 0xb2, 0x8f, 0xd7, 0x44, 0xca, + 0x68, 0x09, 0xe0, 0x44, 0xba, 0xd2, 0xc0, 0xa2, 0x23, 0xc1, 0x1b, 0x13, 0x01, 0x61, 0x01, 0xcd, 0x0f, 0xb1, 0xe2, 0x53, 0x61, 0x89, 0x47, 0xe6, 0x7a, 0xb7, 0x84, 0x55, 0x45, 0x2b, 0x5e, 0x4b, + 0x55, 0x52, 0xe7, 0xd7, 0x38, 0x95, 0xcf, 0x4a, 0xfc, 0xd8, 0x0f, 0x5c, 0xfe, 0xdd, 0x41, 0xf8, 0xd8, 0xbe, 0xf7, 0x8a, 0xeb, 0xc3, 0x0d, 0xdd, 0x33, 0xa0, 0x1f, 0x77, 0x63, 0x74, 0x98, 0x0b, + 0x44, 0x50, 0x64, 0x35, 0xdb, 0xae, 0xc0, 0x50, 0x64, 0x0b, 0xa4, 0x38, 0xec, 0x64, 0x59, 0x65, 0xfa, 0x30, 0x37, 0x4b, 0xb4, 0x2e, 0x48, 0xb7, 0xa1, 0x67, 0xe4, 0x2c, 0xde, 0x2c, 0x10, 0xcd, + 0x6c, 0xc4, 0x32, 0x34, 0xd6, 0x7e, 0xb7, 0x30, 0xd6, 0x5b, 0xa1, 0xc0, 0x4f, 0x86, 0x52, 0x3a, 0x76, 0xbd, 0x24, 0xe5, 0xe9, 0x4c, 0x21, 0xfa, 0xc0, 0x50, 0x64, 0x58, 0x1b, 0x9d, 0x44, 0x93, + 0xb6, 0x84, 0x7c, 0x40, 0x65, 0x42, 0xef, 0x07, 0x0d, 0xe8, 0x83, 0x00, 0x32, 0xef, 0x9b, 0x1e, 0xf0, 0x12, 0x29, 0x75, 0xa7, 0xab, 0x38, 0x73, 0xbb, 0xe7, 0x41, 0x81, 0x7f, 0x3a, 0xad, 0xc7, + 0xef, 0xb5, 0x4e, 0xde, 0xb9, 0x9a, 0xc7, 0x23, 0x76, 0xbb, 0x54, 0x9e, 0xc9, 0x2c, 0x7f, 0x9e, 0xb1, 0xe7, 0x93, 0xec, 0xdb, 0x78, 0x7d, 0xdc, 0x9c, 0x25, 0x96, 0x01, 0xb9, 0x7a, 0x9c, 0x94, + 0xaa, 0xb0, 0x4d, 0x47, 0x2c, 0x6d, 0x70, 0xd1, 0xf2, 0xba, 0x55, 0x05, 0x02, 0xde, 0xdb, 0xc1, 0x74, 0x42, 0xc9, 0xbe, 0x94, 0xf4, 0x3d, 0x63, 0xec, 0x91, 0xf6, 0x94, 0xc8, 0x14, 0x77, 0x98, + 0x7b, 0x0a, 0xb9, 0xb7, 0x43, 0x2b, 0x51, 0xf7, 0xe2, 0xca, 0xdb, 0xe1, 0x4a, 0xd8, 0x2c, 0x41, 0x17, 0x42, 0xdc, 0x99, 0x6e, 0xe4, 0x86, 0x86, 0x75, 0x4e, 0xe9, 0xb6, 0xc4, 0x06, 0x11, 0xba, + 0xd7, 0xf7, 0x92, 0xfa, 0xd2, 0xdf, 0xef, 0x41, 0x6b, 0x65, 0x98, 0x96, 0xa6, 0xf7, 0xb1, 0xc9, 0x3c, 0x89, 0x2a, 0xff, 0xe4, 0xfe, 0x9e, 0x2a, 0xbd, 0x5f, 0x90, 0x0a, 0x2f, 0x44, 0xaf, 0xf0, + 0x56, 0x75, 0x79, 0xd1, 0x68, 0x0f, 0x10, 0x07, 0xd1, 0x7e, 0x73, 0x9c, 0x9d, 0x82, 0xe9, 0x29, 0x14, 0xe0, 0x8e, 0x9b, 0xd4, 0xca, 0x9a, 0xc3, 0x7d, 0x9b, 0x84, 0x01, 0x26, 0x3a, 0x18, 0x36, + 0x94, 0x67, 0x1c, 0xca, 0xf7, 0x40, 0x02, 0x16, 0xbb, 0x72, 0x92, 0x54, 0x8a, 0xa7, 0xb3, 0x00, 0x6c, 0x70, 0xb6, 0x3a, 0x72, 0x91, 0x7c, 0x02, 0x77, 0xb3, 0xce, 0xea, 0xb9, 0x9d, 0xb0, 0xea, + 0x4c, 0x18, 0x99, 0x93, 0x65, 0x80, 0x8f, 0x66, 0xf2, 0x2e, 0xfe, 0x7e, 0xbc, 0x7f, 0xe0, 0xf6, 0x4c, 0x95, 0xfd, 0xc2, 0xb6, 0x7a, 0xa1, 0x79, 0xed, 0x73, 0xed, 0x3a, 0x0f, 0xc2, 0x44, 0x1e, + 0x76, 0xb9, 0x9f, 0xe4, 0x13, 0x29, 0x6c, 0x9c, 0xd3, 0xa8, 0xc4, 0x94, 0x36, 0x53, 0x3a, 0x64, 0xb5, 0x3c, 0x61, 0x79, 0x05, 0xe4, 0xf2, 0x52, 0x67, 0xfb, 0xb2, 0x8f, 0x4c, 0xa0, 0xa6, 0x67, + 0x87, 0xd2, 0xa8, 0x85, 0x40, 0xed, 0x48, 0xab, 0xc6, 0x4f, 0xa4, 0x48, 0xf7, 0xfc, 0xce, 0x8e, 0x76, 0xe5, 0x88, 0x4c, 0x42, 0x8d, 0x64, 0x2c, 0xfc, 0x24, 0x06, 0x1d, 0xb9, 0x33, 0x08, 0x6d, + 0x6e, 0x60, 0x46, 0x3f, 0xc4, 0x0f, 0xcc, 0xcb, 0xcb, 0xb1, 0x6b, 0xda, 0xcf, 0xf2, 0xdb, 0xbf, 0x2d, 0xcc, 0x17, 0x34, 0xfa, 0x57, 0xa2, 0x6f, 0x38, 0x5c, 0x2f, 0xcf, 0x5c, 0xee, 0x00, 0x1d, + 0x7e, 0x74, 0xd0, 0xbd, 0x75, 0x41, 0xa4, 0x39, 0xd5, 0x72, 0x27, 0xc9, 0x23, 0x4f, 0xf1, 0x0e, 0x6e, 0x89, 0xc9, 0x08, 0x16, 0x50, 0x29, 0x72, 0xa7, 0x2e, 0x87, 0x8d, 0x66, 0x3d, 0xb5, 0x2f, + 0xcd, 0x50, 0x84, 0x42, 0x3f, 0x23, 0xa1, 0x2e, 0x0a, 0x59, 0x62, 0x6e, 0x51, 0xad, 0x22, 0xee, 0x5a, 0xc9, 0x13, 0xea, 0x54, 0x31, 0x51, 0x16, 0x96, 0x73, 0x69, 0x5b, 0x96, 0xfb, 0xb0, 0x75, + 0x54, 0x23, 0x7d, 0xcd, 0x15, 0xec, 0x51, 0x66, 0x07, 0xe4, 0xc9, 0x02, 0xca, 0xcb, 0x1f, 0x40, 0x84, 0x5f, 0xca, 0x3b, 0x70, 0xa5, 0x79, 0xc1, 0xf0, 0x0c, 0x21, 0x3c, 0x24, 0xbb, 0xc0, 0x74, + 0x84, 0x4e, 0x54, 0x3a, 0x6c, 0xaa, 0x74, 0x26, 0xe5, 0x38, 0x89, 0x63, 0x49, 0xe4, 0x4c, 0xb6, 0x56, 0xb5, 0xc0, 0xbe, 0x66, 0x3e, 0xf5, 0xf2, 0x32, 0x1d, 0x3b, 0x66, 0xfd, 0xcc, 0x15, 0x12, + 0x7e, 0xa9, 0x42, 0xef, 0x07, 0xd5, 0xcb, 0x87, 0x5f, 0xae, 0xc7, 0xf0, 0xb0, 0xfa, 0xbc, 0x29, 0x0c, 0x09, 0xc8, 0x4e, 0x4c, 0x19, 0x46, 0x95, 0xfd, 0x18, 0xa7, 0xa9, 0xc5, 0x5a, 0x64, 0x50, + 0xb9, 0xd9, 0x89, 0x73, 0x0f, 0x26, 0xd7, 0x41, 0x40, 0x1d, 0x16, 0xba, 0x2b, 0x24, 0x8b, 0x03, 0xaa, 0xcd, 0xf6, 0x6a, 0xb2, 0x3c, 0xc1, 0x75, 0x00, 0x57, 0x09, 0x2d, 0xa8, 0xe4, 0xa2, 0x20, + 0x99, 0x3e, 0xc9, 0x75, 0x43, 0x0c, 0x2d, 0x63, 0x49, 0xd4, 0x98, 0x6b, 0x73, 0xe5, 0x5c, 0x89, 0xb4, 0x01, 0x49, 0x3c, 0xcc, 0xea, 0x94, 0xd9, 0x71, 0x58, 0x5f, 0x0f, 0xa3, 0x2f, 0x5e, 0xbe, + 0xdf, 0x4b, 0xfa, 0x5d, 0x4e, 0xc6, 0xbb, 0x98, 0xf0, 0x34, 0x4c, 0xdd, 0x73, 0xbe, 0xd0, 0xea, 0x7a, 0xe6, 0x41, 0x4f, 0x93, 0x00, 0xbf, 0xc1, 0x12, 0x3a, 0xd7, 0x79, 0xf5, 0xcc, 0x84, 0xf4, + 0xc2, 0x86, 0xfb, 0x41, 0xf6, 0x0a, 0xfd, 0xe5, 0xe6, 0x6c, 0x44, 0x1a, 0xb0, 0xeb, 0x6a, 0xa4, 0xbf, 0x4e, 0x47, 0x28, 0xc4, 0x01, 0x64, 0xec, 0x37, 0x12, 0x0a, 0xe4, 0xd0, 0x0c, 0x91, 0x39, + 0x56, 0x4e, 0x03, 0x7d, 0xbe, 0x40, 0x8b, 0x4c, 0x38, 0xe5, 0x59, 0xdb, 0x98, 0x23, 0x14, 0x2c, 0x0f, 0x36, 0x93, 0x6e, 0xd1, 0x91, 0x46, 0x40, 0x27, 0xd3, 0x40, 0x68, 0x14, 0x23, 0x8e, 0x96, + 0xe5, 0x4f, 0xab, 0xa9, 0x17, 0x29, 0x9b, 0x10, 0xc7, 0x1a, 0x60, 0x87, 0xb7, 0x2b, 0x48, 0x7d, 0x96, 0x7e, 0xee, 0x2b, 0x1c, 0x9d, 0x59, 0x3a, 0x4f, 0xb7, 0xe2, 0x17, 0x85, 0xcd, 0x77, 0xaa, + 0x17, 0x30, 0x2e, 0xd7, 0x43, 0x05, 0x4c, 0xab, 0x91, 0x17, 0xa0, 0x57, 0xd0, 0xb5, 0xcc, 0x2a, 0xdb, 0xa9, 0x38, 0x51, 0x5c, 0x3c, 0x98, 0xc1, 0x18, 0x59, 0x33, 0x8d, 0x35, 0xcf, 0xe5, 0xb5, + 0x85, 0x1a, 0xc2, 0x04, 0x17, 0x8e, 0xbc, 0xc6, 0x0a, 0x1d, 0xec, 0x8b, 0x76, 0xc7, 0xe6, 0x54, 0x77, 0x32, 0xad, 0xa4, 0xe7, 0x7b, 0x71, 0x82, 0xf5, 0xd4, 0x71, 0x42, 0xad, 0xa1, 0x95, 0x10, + 0xc5, 0x80, 0x50, 0xe3, 0xfc, 0x96, 0x32, 0xf5, 0xfc, 0xfb, 0x09, 0x54, 0xfd, 0x53, 0xba, 0x66, 0x52, 0xfc, 0x54, 0x5e, 0xe4, 0x95, 0xe4, 0xb1, 0x37, 0x74, 0xdf, 0x3a, 0xff, 0x79, 0x37, 0x2c, + 0x77, 0xf2, 0x5c, 0x52, 0xea, 0xa5, 0xc2, 0x6b, 0xd1, 0xaa, 0x98, 0xc0, 0x60, 0x9e, 0x05, 0x64, 0x45, 0x4b, 0x72, 0xaa, 0xe2, 0x31, 0x39, 0x60, 0x30, 0xab, 0x1f, 0xeb, 0x15, 0xc3, 0xaf, 0x59, + 0x88, 0xab, 0x8f, 0x62, 0xc5, 0xef, 0x97, 0x67, 0x1d, 0xea, 0x80, 0xf3, 0x64, 0xd2, 0x74, 0x94, 0x89, 0x4e, 0x8e, 0x87, 0x5d, 0x61, 0x52, 0x0b, 0xd5, 0x8b, 0x10, 0x02, 0xa4, 0xf9, 0x4d, 0xdf, + 0x9f, 0x32, 0xdb, 0xa3, 0x27, 0xf4, 0x8e, 0xe4, 0x4d, 0x8b, 0xa0, 0x17, 0x3b, 0x5a, 0x9f, 0x45, 0x28, 0x57, 0xf9, 0x87, 0x91, 0x3d, 0x5b, 0xd5, 0x47, 0x30, 0xc4, 0x1b, 0x2a, 0xb2, 0xf7, 0x54, + 0x21, 0xcd, 0xb2, 0xaa, 0xab, 0x4c, 0x53, 0xdc, 0xfa, 0xdb, 0x74, 0x82, 0x15, 0x4c, 0xd4, 0xfc, 0x26, 0xa9, 0xfc, 0x54, 0x1f, 0xf4, 0x6b, 0x66, 0xba, 0x27, 0xda, 0x85, 0x57, 0x76, 0xde, 0x5b, + 0xca, 0x6f, 0x50, 0xdd, 0xde, 0x0f, 0x2e, 0xa4, 0xc1, 0xe5, 0xed, 0xa4, 0xe7, 0xf7, 0x28, 0x55, 0xcd, 0x49, 0x3d, 0xc1, 0x48, 0x4f, 0x99, 0xee, 0x96, 0x58, 0xd5, 0x2a, 0xeb, 0xc6, 0x0c, 0xad, + 0xcd, 0x71, 0x2f, 0x2d, 0xe7, 0xeb, 0x94, 0x16, 0xad, 0x6d, 0x33, 0x2d, 0x41, 0xde, 0x83, 0x56, 0xe1, 0x26, 0x2f, 0x16, 0x3c, 0x25, 0x84, 0xf3, 0x28, 0xd4, 0xe9, 0xa9, 0xe5, 0x99, 0x26, 0x3c, + 0x0f, 0x70, 0xab, 0x74, 0x25, 0x7c, 0x22, 0x68, 0x5b, 0x0e, 0xfc, 0xae, 0x73, 0xfe, 0x21, 0x95, 0xc7, 0x53, 0x16, 0xf4, 0x65, 0x40, 0xbe, 0xbd, 0xe5, 0x06, 0x9c, 0x6f, 0xcf, 0x86, 0xf8, 0x5d, + 0x40, 0xe3, 0x45, 0x77, 0xe8, 0x5b, 0x4d, 0x25, 0x56, 0x3e, 0x14, 0xa5, 0xce, 0xca, 0x9e, 0x45, 0xb8, 0x5f, 0x25, 0x1c, 0xeb, 0x9f, 0x06, 0xd8, 0x61, 0xbe, 0x66, 0x1e, 0xfc, 0xf7, 0xa6, 0xc0, + 0x1d, 0x65, 0x60, 0x7c, 0x7f, 0x3f, 0x74, 0x0a, 0xc4, 0x3b, 0xa3, 0xcc, 0x34, 0x1e, 0x85, 0xa5, 0x69, 0xc8, 0x4c, 0x60, 0xce, 0x87, 0xac, 0x05, 0xd9, 0x47, 0x39, 0xc7, 0x8b, 0xfe, 0x71, 0xd7, + 0xe9, 0x53, 0xc6, 0x15, 0x9c, 0x4e, 0xc7, 0xb7, 0x2d, 0x60, 0x8b, 0x8a, 0xbb, 0x28, 0xec, 0x7c, 0x8f, 0x16, 0x7b, 0xd6, 0x5b, 0xa9, 0x47, 0x61, 0xa5, 0xe5, 0x93, 0x32, 0x2b, 0x99, 0x12, 0x76, + 0xa9, 0xaa, 0xcc, 0x26, 0xc7, 0xe3, 0x82, 0x2b, 0x4d, 0x85, 0x1a, 0xa0, 0x81, 0x1f, 0x90, 0xb3, 0xf1, 0x8f, 0x92, 0x2c, 0x3e, 0x51, 0x01, 0x9c, 0x93, 0x3a, 0xfe, 0x94, 0x02, 0x16, 0x7d, 0xc9, + 0x66, 0xfd, 0x49, 0xf6, 0x8a, 0xfb, 0x35, 0xf9, 0xeb, 0x77, 0x5f, 0xaa, 0x87, 0xa0, 0x2f, 0x78, 0xb3, 0x46, 0x99, 0x25, 0x06, 0xe1, 0x50, 0xcc, 0x9d, 0x60, 0xd6, 0x6d, 0xd7, 0x49, 0x89, 0x26, + 0x8d, 0x10, 0xd1, 0x7e, 0x9b, 0x46, 0x28, 0x84, 0xac, 0x4c, 0x69, 0x42, 0x44, 0x35, 0xaa, 0x91, 0x34, 0x2a, 0xcf, 0x2a, 0xaf, 0x60, 0x63, 0x62, 0x27, 0x51, 0x0b, 0xed, 0xe0, 0xe9, 0xa7, 0xd3, + 0x91, 0x14, 0x15, 0x60, 0x8d, 0xe3, 0xab, 0xfc, 0x38, 0x2a, 0x97, 0xb2, 0x10, 0x27, 0xeb, 0x15, 0xf1, 0x1a, 0xdf, 0x5b, 0x34, 0xe9, 0x7b, 0x9e, 0x95, 0xa7, 0xba, 0xf2, 0xa7, 0x99, 0x31, 0xff, + 0xbd, 0x53, 0xec, 0xf1, 0x2b, 0xde, 0xc1, 0xfd, 0xf6, 0x60, 0xc8, 0xd9, 0x76, 0xf6, 0x0f, 0x61, 0x52, 0x87, 0x85, 0xf4, 0x96, 0x93, 0x42, 0xa3, 0x48, 0xea, 0xa9, 0xe0, 0xc7, 0x4d, 0xa8, 0x66, + 0xa7, 0x26, 0xee, 0x8f, 0x3c, 0x20, 0xe3, 0xc2, 0x6c, 0xb9, 0x47, 0xa0, 0x95, 0x8b, 0xd0, 0x0b, 0x48, 0x38, 0x60, 0x16, 0xa8, 0xc0, 0x9b, 0x60, 0x8f, 0x51, 0xea, 0x2a, 0xa4, 0x5a, 0xa3, 0xd8, + 0xcc, 0x24, 0xcd, 0x39, 0x64, 0x23, 0x88, 0xb3, 0xcd, 0x49, 0x97, 0xf5, 0xdb, 0x2d, 0xd6, 0x4e, 0xa3, 0x01, 0x8a, 0x96, 0x5f, 0xb2, 0x9a, 0x3e, 0xcb, 0x46, 0xfa, 0x18, 0xfd, 0xe7, 0x1e, 0x37, + 0xc4, 0x3f, 0xd0, 0x0b, 0xf6, 0xe9, 0xab, 0xb3, 0xcd, 0xd9, 0xc9, 0xe4, 0x4c, 0xe1, 0x77, 0x1c, 0xd7, 0x9d, 0x79, 0xec, 0x4e, 0x06, 0x01, 0xaf, 0x63, 0xa2, 0x35, 0x38, 0xa1, 0x16, 0x84, 0xf2, + 0xd4, 0xed, 0x41, 0xa3, 0x59, 0x9f, 0x94, 0xba, 0x74, 0x66, 0xb5, 0x69, 0xb9, 0x9e, 0xb1, 0x9a, 0xe8, 0x98, 0xb1, 0x58, 0x06, 0x5a, 0xed, 0x3b, 0x7d, 0x96, 0x34, 0xb2, 0x5b, 0x1d, 0x85, 0x74, + 0x13, 0xd6, 0x0c, 0xa8, 0x4c, 0xc4, 0x91, 0x08, 0xe3, 0xd5, 0x6e, 0xcb, 0xba, 0x2b, 0x85, 0x83, 0x3b, 0x9e, 0x7e, 0x2d, 0x55, 0xff, 0x3d, 0x1f, 0xf5, 0xc0, 0x60, 0x17, 0x66, 0xde, 0xd9, 0x84, + 0xf5, 0xf7, 0xa7, 0x26, 0xfb, 0xee, 0x69, 0xe0, 0x96, 0xe1, 0xc5, 0x3f, 0xf7, 0xbe, 0x5c, 0xec, 0xcf, 0x59, 0x8f, 0x6e, 0x92, 0x24, 0x7f, 0x35, 0x77, 0xbd, 0xf1, 0x5a, 0xe1, 0x39, 0xe5, 0x6e, + 0x9e, 0x34, 0xb5, 0x7b, 0xf3, 0x55, 0x4f, 0xc7, 0xf3, 0xd3, 0xb9, 0xe7, 0xd1, 0xb0, 0x62, 0x2f, 0x65, 0x70, 0xbf, 0xa1, 0xfb, 0x3e, 0xba, 0x97, 0xbb, 0x73, 0x24, 0xfb, 0x00, 0x99, 0x60, 0x22, + 0x72, 0xbe, 0x22, 0x4d, 0xdd, 0x22, 0x5c, 0xea, 0xdd, 0x06, 0x99, 0xc8, 0xd9, 0xe2, 0x38, 0xc2, 0xb4, 0x6c, 0xdb, 0xc0, 0x2c, 0xad, 0x3b, 0xbd, 0xb5, 0xd8, 0xa0, 0x98, 0xbb, 0xee, 0xa0, 0xb6, + 0x44, 0x7a, 0x1a, 0x69, 0x8d, 0xb5, 0x7b, 0x72, 0x1d, 0xa8, 0x9a, 0x52, 0x41, 0x66, 0xd9, 0xa2, 0x4d, 0x01, 0x4a, 0xc9, 0x9f, 0x78, 0x4c, 0xde, 0x48, 0x65, 0xbc, 0xe8, 0x51, 0x53, 0xa1, 0x8c, + 0xfc, 0xb5, 0x5d, 0xe9, 0x6b, 0xc2, 0xac, 0x1f, 0x96, 0x86, 0x99, 0x8c, 0x9d, 0xf0, 0x69, 0x2d, 0x7a, 0xf8, 0x25, 0x5e, 0xe2, 0x86, 0xee, 0x15, 0xca, 0xeb, 0xdd, 0x03, 0x9f, 0xe1, 0x87, 0x50, + 0x62, 0xec, 0x41, 0x3d, 0x38, 0x41, 0xcc, 0xe4, 0x6d, 0x04, 0x8b, 0x1e, 0x90, 0x56, 0x08, 0xe7, 0x2a, 0x00, 0xe3, 0xc6, 0xb6, 0x88, 0xa1, 0xa7, 0x9a, 0x95, 0xd7, 0x1a, 0xba, 0x61, 0x74, 0xb8, + 0x0c, 0xe4, 0xae, 0x64, 0xf7, 0x6b, 0x29, 0x72, 0x35, 0x86, 0x51, 0xc0, 0x75, 0x10, 0x9b, 0xe0, 0xb1, 0x13, 0x66, 0xf5, 0x42, 0xcf, 0x30, 0xb2, 0x3b, 0x4d, 0xd1, 0x0a, 0x1b, 0xf1, 0x6c, 0x25, + 0x8a, 0xf8, 0x6b, 0xeb, 0x25, 0xcc, 0xc2, 0x8f, 0x79, 0x8b, 0xfd, 0x04, 0xe3, 0x33, 0x08, 0x21, 0xe4, 0x1f, 0xf2, 0x95, 0x1d, 0xfd, 0x42, 0xf4, 0x03, 0xbf, 0x6a, 0x7c, 0x21, 0xf4, 0x3b, 0x78, + 0x25, 0x5b, 0x3b, 0x13, 0x7c, 0xb4, 0x99, 0xd1, 0x5c, 0xe4, 0x32, 0xed, 0x84, 0x82, 0xca, 0xe2, 0xd0, 0x33, 0x6d, 0x0c, 0xc4, 0x08, 0x10, 0x12, 0x8c, 0x2b, 0x48, 0x61, 0x79, 0x0a, 0x77, 0xcd, + 0x92, 0x05, 0xd9, 0x8e, 0xb2, 0x8b, 0xd3, 0x92, 0x9f, 0xd4, 0x70, 0x54, 0x5b, 0x93, 0x4e, 0x35, 0x65, 0x27, 0x98, 0x8d, 0x30, 0x02, 0xd9, 0xa3, 0xed, 0xae, 0xc3, 0x39, 0x3b, 0x5a, 0x6d, 0xcc, + 0x2a, 0xa4, 0x7e, 0xe3, 0xe2, 0x9f, 0xd8, 0x1b, 0x4e, 0x85, 0x3b, 0xf6, 0xde, 0x8d, 0xe0, 0xe0, 0x3f, 0xf0, 0xad, 0x56, 0xf5, 0x86, 0xdc, 0x33, 0x9f, 0xf6, 0xdb, 0xff, 0xff, 0x6c, 0xfe, 0x26, + 0xf1, 0x7e, 0xcd, 0x74, 0x3b, 0x14, 0xe3, 0x0f, 0xf2, 0xc0, 0xf8, 0xf3, 0x7a, 0x7c, 0x21, 0x78, 0x87, 0xf3, 0x5f, 0xcf, 0xb0, 0x16, 0xdc, 0x91, 0xcb, 0xa0, 0x25, 0x08, 0x84, 0xbb, 0xac, 0x98, + 0x1c, 0x67, 0x24, 0x06, 0xf7, 0xc8, 0x64, 0x24, 0x80, 0x74, 0x8d, 0xc9, 0x02, 0x00, 0x08, 0xd1, 0xb2, 0x93, 0x1d, 0x58, 0x9b, 0xb3, 0x4c, 0x5a, 0x9e, 0xba, 0xa3, 0x87, 0xb5, 0x95, 0x91, 0x04, + 0xa8, 0x8c, 0x27, 0xe1, 0x31, 0xc1, 0xe9, 0x51, 0xd7, 0x03, 0xa4, 0x33, 0x4a, 0xcd, 0xad, 0x32, 0x89, 0x05, 0x68, 0xce, 0xc5, 0x1c, 0xb2, 0x7e, 0x3d, 0x20, 0xeb, 0x6d, 0xaa, 0x58, 0xcf, 0x8c, + 0x35, 0x10, 0xf4, 0x52, 0x04, 0xd2, 0x85, 0xe6, 0x75, 0x1e, 0x5a, 0xa7, 0xf1, 0x85, 0xcc, 0xef, 0xd3, 0xd0, 0xf3, 0x9c, 0x34, 0xaf, 0xa2, 0x09, 0x09, 0x12, 0x27, 0x62, 0x94, 0x4c, 0x20, 0x81, + 0x07, 0x23, 0x66, 0x3d, 0x91, 0xb5, 0x54, 0x6f, 0x12, 0x80, 0x80, 0xb0, 0x63, 0xc8, 0xad, 0x99, 0x28, 0x47, 0x02, 0x7a, 0xbd, 0xd9, 0xda, 0x61, 0xe9, 0x4b, 0x42, 0xb6, 0x67, 0xa6, 0x19, 0xe6, + 0x23, 0x69, 0x2d, 0x93, 0x5b, 0x71, 0x3d, 0xd5, 0xac, 0xd8, 0x6b, 0x4c, 0x88, 0x2d, 0xdc, 0x0c, 0xc6, 0x80, 0xbd, 0xfd, 0x9a, 0xd6, 0xff, 0x92, 0xa2, 0xbb, 0xc9, 0xae, 0x40, 0x7c, 0x4f, 0xe9, + 0x78, 0x53, 0xda, 0xe7, 0x72, 0x76, 0x7d, 0xb7, 0xe3, 0xdc, 0x3c, 0xfe, 0xc2, 0x67, 0xdf, 0x24, 0x3f, 0xc4, 0xbe, 0x7a, 0x64, 0xfc, 0xe4, 0x68, 0x5a, 0x25, 0xe6, 0x5d, 0x46, 0xc4, 0x3f, 0x58, + 0x17, 0xdf, 0x0a, 0x98, 0xfc, 0xf5, 0xd7, 0xf7, 0x23, 0x90, 0x7c, 0x69, 0x4d, 0x7c, 0x54, 0x31, 0xb9, 0x96, 0x30, 0x39, 0x53, 0x1a, 0xb6, 0x18, 0x68, 0xbe, 0xf0, 0x66, 0xc4, 0xa6, 0x08, 0x99, + 0x6d, 0x41, 0x27, 0xc0, 0x04, 0x57, 0x50, 0x8a, 0xa4, 0x4d, 0x6e, 0x89, 0xeb, 0xc0, 0x84, 0xde, 0x52, 0x08, 0xb3, 0xb5, 0xac, 0x13, 0xec, 0x6d, 0x40, 0xb0, 0x45, 0x19, 0xab, 0xdd, 0xd0, 0xfb, + 0x1d, 0x93, 0x9b, 0x32, 0xa4, 0xd2, 0x9b, 0x55, 0x85, 0x84, 0x32, 0x86, 0x14, 0x4b, 0x9d, 0x60, 0x6a, 0x23, 0xc6, 0x56, 0x93, 0x29, 0x87, 0x11, 0x21, 0xa4, 0x0e, 0xca, 0x35, 0xf6, 0x78, 0x31, + 0xe4, 0xcf, 0x18, 0x04, 0xea, 0xa5, 0xca, 0x8b, 0x7e, 0x7e, 0x66, 0x0c, 0xf2, 0x7a, 0x4c, 0x0d, 0xab, 0xb4, 0x28, 0x13, 0xee, 0xae, 0xa8, 0xf7, 0xcd, 0x42, 0x3f, 0x76, 0x61, 0x54, 0x81, 0xae, + 0x36, 0x6a, 0x91, 0x1c, 0x1f, 0xed, 0x59, 0x88, 0x3b, 0x68, 0x2b, 0xd2, 0x59, 0x8a, 0x8c, 0x6b, 0x4b, 0xde, 0x36, 0x8d, 0x33, 0xbb, 0xa3, 0x26, 0x1a, 0xea, 0xd8, 0x1d, 0x30, 0x0b, 0x8e, 0x21, + 0xc9, 0x3b, 0xc9, 0x61, 0x53, 0x07, 0xc7, 0x63, 0x61, 0x9c, 0xc2, 0x9e, 0xef, 0x4f, 0x3e, 0x29, 0x6f, 0x53, 0xa6, 0x5a, 0x8c, 0x5e, 0xdb, 0x88, 0xff, 0xab, 0x0a, 0x33, 0xe7, 0xad, 0x9f, 0x65, + 0xd0, 0x54, 0xc0, 0xb5, 0x14, 0x26, 0xf8, 0x0f, 0xf4, 0x45, 0x79, 0xfb, 0x5f, 0x55, 0x9f, 0x9a, 0xa5, 0xdd, 0x9b, 0x31, 0xf0, 0x06, 0xc4, 0xb8, 0x0e, 0xd3, 0x0f, 0xbf, 0xae, 0xaf, 0xb1, 0x5a, + 0xa6, 0x1d, 0xb8, 0x67, 0x95, 0xe9, 0xad, 0x9f, 0xd3, 0xb7, 0x8c, 0x91, 0x8f, 0xab, 0xc5, 0xbe, 0x4d, 0xf9, 0x2f, 0xab, 0xe1, 0xb6, 0x9e, 0xcc, 0x83, 0x14, 0xa0, 0x77, 0x82, 0xe8, 0x03, 0x9f, + 0xac, 0x24, 0xef, 0xdc, 0xd2, 0x36, 0x2b, 0xf7, 0x4b, 0x69, 0xb9, 0xbb, 0xc5, 0xf8, 0xb8, 0x76, 0xeb, 0x7d, 0x62, 0xcd, 0xb1, 0x6d, 0x66, 0xb6, 0x7b, 0x6b, 0xc8, 0xf8, 0xd2, 0xa3, 0xb3, 0x0d, + 0xdd, 0x74, 0xde, 0xbd, 0xa9, 0x6f, 0x75, 0xdc, 0x77, 0xbf, 0x6b, 0xca, 0xe4, 0xe2, 0x84, 0x35, 0x4e, 0xcc, 0xe3, 0x83, 0x65, 0x7e, 0x3f, 0x57, 0x4b, 0xd3, 0x76, 0xbd, 0x26, 0x19, 0x7b, 0xcf, + 0xd8, 0x08, 0xf4, 0xae, 0x8a, 0xc1, 0xe0, 0x39, 0xfb, 0x49, 0xf7, 0x6d, 0xee, 0x7e, 0xde, 0x9d, 0x2b, 0x4b, 0x0e, 0xb0, 0xdd, 0xee, 0xa2, 0xd5, 0x46, 0x58, 0xce, 0x09, 0xca, 0xa9, 0x97, 0x13, + 0x2d, 0x0b, 0xd5, 0x64, 0xb1, 0xd8, 0xb1, 0xfa, 0xa2, 0x87, 0xa3, 0xdd, 0x71, 0x8b, 0x6b, 0x81, 0x00, 0xa0, 0x29, 0x24, 0x38, 0xb1, 0x65, 0xc0, 0x99, 0x58, 0x31, 0xf3, 0x91, 0xcd, 0x41, 0x8c, + 0xe3, 0x1f, 0x12, 0xac, 0x9f, 0xca, 0x41, 0x05, 0x68, 0x95, 0xa4, 0xcb, 0x6d, 0xb9, 0xb7, 0xeb, 0x63, 0x5c, 0x6b, 0x7b, 0x43, 0x8d, 0xc3, 0x67, 0xc9, 0xaf, 0xee, 0x10, 0xb9, 0x68, 0x2f, 0x9e, + 0x49, 0xc8, 0x7f, 0x7e, 0x8c, 0x05, 0xe6, 0x1b, 0x02, 0x81, 0x79, 0x29, 0xea, 0x3f, 0xe4, 0xfc, 0x82, 0x9d, 0x56, 0x04, 0x35, 0x15, 0x17, 0xdd, 0x88, 0x90, 0xe3, 0xdd, 0x72, 0x51, 0xba, 0x41, + 0x64, 0xf5, 0xfc, 0x24, 0x9a, 0x17, 0x18, 0xa0, 0xad, 0x36, 0x05, 0x56, 0x6f, 0x8b, 0x1d, 0xa7, 0xa1, 0x4b, 0x96, 0x35, 0x56, 0x10, 0x40, 0x1f, 0xad, 0xb9, 0x5c, 0x7b, 0x40, 0x15, 0x4e, 0x60, + 0x65, 0xb7, 0x75, 0x41, 0xca, 0x36, 0x67, 0xa9, 0x56, 0xeb, 0x7a, 0xbf, 0x63, 0x38, 0x8b, 0x56, 0xd0, 0x7e, 0x80, 0xec, 0xfb, 0x4c, 0xb3, 0xf3, 0x70, 0xde, 0xbc, 0xf5, 0xe7, 0x6c, 0x8f, 0x19, + 0x07, 0x79, 0x1e, 0xff, 0x84, 0xd8, 0x9f, 0xef, 0x77, 0x5f, 0x68, 0x5f, 0xd1, 0xbb, 0x69, 0x19, 0xaa, 0x45, 0xd0, 0xe7, 0xa0, 0xb6, 0x59, 0x44, 0xf1, 0xb1, 0x24, 0x26, 0xa7, 0x93, 0x24, 0x09, + 0xa7, 0x78, 0x4f, 0xf6, 0x2b, 0x74, 0xd3, 0xd6, 0xcc, 0xac, 0x52, 0x97, 0x93, 0xcd, 0xa1, 0x6b, 0x40, 0x5c, 0x9d, 0xf7, 0x50, 0x62, 0xe1, 0x4c, 0xcb, 0x61, 0x48, 0xb5, 0x09, 0x30, 0x16, 0x8a, + 0x77, 0x47, 0x9f, 0x14, 0xf6, 0x1c, 0xb6, 0xae, 0x3c, 0x79, 0x6a, 0x90, 0xcd, 0x9e, 0x12, 0x62, 0x7d, 0x66, 0xd0, 0x16, 0x90, 0x7e, 0x33, 0x10, 0xbc, 0x7d, 0x9c, 0x15, 0xfa, 0xe1, 0x73, 0x7d, + 0x3a, 0xf4, 0x92, 0xc3, 0xf6, 0x0d, 0xdd, 0x2b, 0x04, 0xd7, 0xbb, 0x73, 0xf7, 0x07, 0xc8, 0x85, 0xb5, 0xd2, 0x4e, 0x57, 0x35, 0x5d, 0x52, 0x49, 0x3c, 0x07, 0x99, 0x23, 0x68, 0x4a, 0xe1, 0x86, + 0x12, 0x46, 0x62, 0xa1, 0xa1, 0x7d, 0x08, 0x97, 0x80, 0xe0, 0xba, 0x98, 0x16, 0xcb, 0x33, 0xcb, 0x3c, 0xb4, 0x08, 0x26, 0xaf, 0x75, 0xbe, 0xb7, 0x3a, 0xc9, 0x9b, 0x2b, 0x86, 0xc1, 0x82, 0xb1, + 0x3c, 0x92, 0x1d, 0x1c, 0x01, 0x61, 0x75, 0x69, 0xc0, 0x05, 0x60, 0x2d, 0xa7, 0x4c, 0x2e, 0x23, 0x5a, 0xfe, 0xcd, 0x17, 0xf1, 0xed, 0xc3, 0xbc, 0xc4, 0x7c, 0xe6, 0x84, 0x88, 0xbe, 0x3c, 0x05, + 0xde, 0x88, 0x5e, 0x3b, 0xfe, 0x76, 0x79, 0x4e, 0xd6, 0x32, 0x60, 0xd0, 0x99, 0x53, 0xbc, 0xdc, 0x02, 0x12, 0xb4, 0x8a, 0xb6, 0x3b, 0xbb, 0x2e, 0x0a, 0x9f, 0x9b, 0xf8, 0x9e, 0x22, 0x82, 0xf5, + 0x4a, 0x6b, 0x0c, 0x35, 0x0a, 0x7c, 0xbe, 0x84, 0x88, 0xf8, 0xb0, 0x6d, 0x52, 0x3e, 0xc1, 0x27, 0x5e, 0x8b, 0x30, 0x9c, 0x92, 0xb8, 0x2a, 0x71, 0x30, 0xd4, 0x3e, 0xdf, 0xcf, 0xe6, 0xdb, 0x09, + 0xbb, 0x9d, 0x4d, 0x51, 0x41, 0xcc, 0x17, 0x80, 0x71, 0x54, 0x11, 0xa6, 0x4d, 0xf8, 0xcd, 0xc3, 0x5e, 0x7f, 0xaa, 0x32, 0xff, 0xd5, 0xdd, 0xe2, 0x9d, 0xee, 0xb5, 0xef, 0xd7, 0xbb, 0xa1, 0xbb, + 0x47, 0x82, 0xac, 0xa7, 0xcd, 0x1c, 0xe7, 0xfd, 0x99, 0xd0, 0x6d, 0x67, 0xab, 0xd8, 0xd1, 0x17, 0x4c, 0x18, 0xe8, 0x51, 0x8d, 0x15, 0xf2, 0xc6, 0x62, 0x7c, 0x14, 0x2f, 0xeb, 0x24, 0xcd, 0x94, + 0x4d, 0xa2, 0x5a, 0x7e, 0x4a, 0x93, 0x6b, 0x91, 0x2b, 0x57, 0x4b, 0x4b, 0xd7, 0xe7, 0xb4, 0x62, 0x65, 0x1b, 0x73, 0xe9, 0x1e, 0xf9, 0x55, 0x1d, 0x6e, 0x44, 0x32, 0x48, 0x5d, 0x39, 0x92, 0x7b, + 0x78, 0xeb, 0x8c, 0xbe, 0x99, 0x06, 0xbe, 0xd7, 0xf3, 0xf8, 0x77, 0x97, 0xff, 0x0d, 0xed, 0x2b, 0x0c, 0x37, 0x2d, 0x43, 0x97, 0x7f, 0x3c, 0x8f, 0x6c, 0x45, 0x08, 0xb2, 0x64, 0xa1, 0x41, 0xf1, + 0x29, 0x5f, 0xc4, 0x84, 0xb8, 0x5f, 0x29, 0x66, 0xc7, 0x62, 0x4b, 0xd1, 0x02, 0xd6, 0xbd, 0x6a, 0x63, 0x1d, 0x45, 0x83, 0x70, 0x20, 0x6e, 0x45, 0xd0, 0xf1, 0xe6, 0x72, 0x64, 0xb1, 0xd2, 0xaa, + 0xf5, 0x21, 0x07, 0xb7, 0x3d, 0x84, 0xb5, 0x5c, 0x35, 0xad, 0x55, 0x4a, 0xb3, 0x2c, 0x0d, 0x39, 0xf4, 0x06, 0xbc, 0x75, 0x03, 0x8a, 0xd8, 0x0d, 0x50, 0x91, 0x3f, 0x52, 0x73, 0x3f, 0x31, 0x32, + 0xbf, 0xfd, 0xf4, 0x64, 0x96, 0xcf, 0x74, 0xb2, 0xaf, 0x05, 0x66, 0xbd, 0x13, 0xbd, 0x22, 0xf7, 0x76, 0x39, 0x34, 0xe8, 0x4a, 0x3d, 0xd0, 0xf2, 0x21, 0x44, 0xa3, 0x86, 0xd8, 0x8e, 0xb6, 0x87, + 0x85, 0xe0, 0x1c, 0x26, 0x22, 0xb8, 0x31, 0x15, 0x6d, 0x51, 0xcd, 0x16, 0x4b, 0x95, 0x96, 0xda, 0x98, 0x72, 0xd5, 0x9d, 0xb0, 0x90, 0x75, 0x68, 0x3a, 0x5f, 0xcc, 0x7a, 0x3d, 0x58, 0xef, 0x72, + 0x9e, 0x58, 0x4a, 0x8c, 0x9b, 0x66, 0x49, 0xab, 0xd9, 0x2d, 0xa0, 0x33, 0xa9, 0x0d, 0x77, 0xc2, 0x8e, 0xa4, 0xa7, 0x30, 0xca, 0x64, 0x6a, 0x35, 0xe8, 0xd4, 0x75, 0xca, 0x71, 0x10, 0x56, 0x75, + 0xee, 0x97, 0x66, 0x3a, 0x8e, 0x9e, 0x2f, 0xaa, 0x57, 0xac, 0xcc, 0x5f, 0x89, 0xbf, 0x01, 0xf3, 0xa5, 0x69, 0x68, 0x10, 0x67, 0x00, 0xea, 0xdb, 0x7c, 0x89, 0xb8, 0xdd, 0xa1, 0x32, 0x0d, 0x24, + 0x9b, 0x6f, 0xb7, 0x26, 0xee, 0xac, 0xc5, 0x19, 0x51, 0x1d, 0x8e, 0x23, 0xc6, 0x77, 0xa6, 0xe8, 0x48, 0xb4, 0x97, 0x94, 0xd8, 0x10, 0xbd, 0x31, 0x4b, 0xb6, 0x60, 0xb5, 0x57, 0x36, 0x2c, 0x5b, + 0x22, 0xf6, 0xc9, 0xcd, 0xa4, 0x6a, 0x73, 0x38, 0x58, 0x1a, 0xbb, 0xc8, 0x80, 0x7c, 0xae, 0xe3, 0x7d, 0xe4, 0x31, 0xab, 0xfd, 0xa2, 0xed, 0xd3, 0x01, 0x73, 0xca, 0x32, 0x2b, 0x17, 0x47, 0x2f, + 0xc0, 0x3c, 0x0a, 0xef, 0x37, 0xe3, 0xfc, 0x63, 0xae, 0x3d, 0x71, 0x7f, 0xb9, 0xef, 0x72, 0xe1, 0x96, 0xb6, 0x9b, 0xd5, 0x61, 0xe2, 0xbe, 0x17, 0xaf, 0xfc, 0xf7, 0xd4, 0x70, 0x3f, 0xbe, 0xe9, + 0x1b, 0xf8, 0x5f, 0x9e, 0x0f, 0x55, 0xd5, 0x49, 0x74, 0x6b, 0x6d, 0x8f, 0x9b, 0x64, 0xd1, 0xb1, 0x11, 0x82, 0x73, 0xf2, 0x1c, 0xc2, 0xf7, 0xeb, 0x5c, 0x67, 0x2c, 0xb5, 0xc5, 0x74, 0xe6, 0x24, + 0x22, 0x24, 0x16, 0x87, 0x0a, 0xc8, 0x29, 0x08, 0x89, 0x40, 0x9e, 0xad, 0x6c, 0x85, 0xfd, 0x56, 0x26, 0x48, 0x4c, 0xab, 0xe7, 0x73, 0x03, 0x36, 0x03, 0x9d, 0x40, 0x90, 0x1e, 0x8c, 0x4f, 0xe4, + 0xb2, 0x45, 0x1d, 0x9c, 0xcb, 0x46, 0x4a, 0x35, 0xea, 0x06, 0x8c, 0xc4, 0x83, 0x99, 0xfa, 0xa3, 0xda, 0xf8, 0x2c, 0xcf, 0x5c, 0xdc, 0x16, 0x2b, 0x37, 0x35, 0xb3, 0x3a, 0xb4, 0x9f, 0xb3, 0xda, + 0x2f, 0x2d, 0xf7, 0x07, 0x2f, 0x78, 0x03, 0xf9, 0x41, 0xf3, 0x50, 0x3b, 0x97, 0x6d, 0x96, 0x9b, 0x38, 0xb1, 0xd5, 0x80, 0x90, 0xc5, 0x9d, 0xbc, 0x22, 0xa6, 0x2d, 0x4c, 0xc8, 0x9b, 0xda, 0x09, + 0xf4, 0x40, 0xad, 0xdc, 0xc4, 0x04, 0x1a, 0x17, 0x03, 0xa2, 0x55, 0x1f, 0xb9, 0xbe, 0xd6, 0xee, 0x67, 0x07, 0x1e, 0xe6, 0xd6, 0x0c, 0x25, 0xc1, 0xf4, 0x22, 0xa3, 0x96, 0xc6, 0x32, 0x80, 0x7c, + 0x92, 0xb0, 0x0b, 0x0c, 0xaf, 0x1a, 0x60, 0xee, 0x4b, 0x4a, 0x6f, 0xef, 0x14, 0xd2, 0x1e, 0xe2, 0x65, 0x72, 0xfe, 0xe8, 0xb3, 0xf0, 0x52, 0x3e, 0xdf, 0x04, 0xc0, 0x7f, 0xb0, 0x57, 0x4e, 0xd6, + 0x3b, 0xd2, 0xef, 0x00, 0x7d, 0x34, 0x8c, 0xcf, 0x54, 0x7f, 0x87, 0xa6, 0x26, 0x82, 0xa8, 0x75, 0x3d, 0x00, 0x63, 0x99, 0x15, 0x21, 0xef, 0xb6, 0x8e, 0xda, 0x6b, 0x6a, 0x90, 0x90, 0x7d, 0xcc, + 0x34, 0xa3, 0x75, 0x62, 0x32, 0x20, 0xa7, 0xf7, 0x0e, 0xdf, 0xb4, 0x96, 0x32, 0x0b, 0x8b, 0x23, 0x2d, 0x17, 0x62, 0x86, 0xaa, 0x41, 0x47, 0x1a, 0x27, 0x66, 0xca, 0x98, 0x24, 0x48, 0x86, 0xda, + 0x96, 0xdc, 0x4f, 0xa3, 0x3e, 0xc7, 0x8f, 0xa9, 0x5e, 0xa3, 0xd3, 0x70, 0x6d, 0x7c, 0x8b, 0x82, 0x0b, 0x4e, 0x85, 0x5b, 0x86, 0xcf, 0x3c, 0x0f, 0x5e, 0x3c, 0x16, 0x2e, 0x34, 0xdf, 0x7a, 0x7e, + 0xb9, 0x1a, 0x7a, 0x28, 0xd8, 0x8a, 0x19, 0x07, 0x47, 0x4b, 0xad, 0x4c, 0xae, 0x39, 0x44, 0x5e, 0xdb, 0xda, 0x6a, 0xd3, 0x26, 0xc0, 0x3c, 0x41, 0x50, 0x78, 0x89, 0x63, 0x47, 0x7f, 0xbd, 0xd6, + 0x4b, 0xfd, 0xa8, 0x28, 0x25, 0x75, 0x48, 0x97, 0x00, 0xb3, 0x5c, 0x8d, 0x14, 0xd2, 0x2e, 0x15, 0x3c, 0xe5, 0x12, 0xc9, 0x01, 0x4c, 0x22, 0x1c, 0x6d, 0x5c, 0x74, 0x06, 0xf2, 0xbe, 0x52, 0xd6, + 0xc6, 0x66, 0xdd, 0xbb, 0x23, 0x73, 0x3a, 0x40, 0x20, 0x69, 0x9a, 0xf0, 0x22, 0x87, 0x20, 0x5f, 0x7d, 0xbd, 0xde, 0x9e, 0xdc, 0x04, 0x1a, 0xfd, 0x71, 0xde, 0xd6, 0x2b, 0xe5, 0x67, 0x4a, 0xac, + 0xaf, 0xef, 0x1b, 0x8e, 0xf1, 0x1b, 0x61, 0x60, 0x7c, 0xfe, 0xf3, 0x20, 0xcb, 0xf3, 0x5f, 0xcf, 0x10, 0x66, 0x23, 0x65, 0x26, 0x77, 0xb8, 0x6f, 0x30, 0xd8, 0x92, 0xf7, 0x7d, 0xbb, 0x66, 0x69, + 0x3b, 0xd2, 0xcc, 0x18, 0x24, 0x47, 0x2b, 0x46, 0x0b, 0x14, 0x2e, 0x9c, 0xf5, 0xf3, 0x6c, 0x4b, 0x29, 0x94, 0xe9, 0xfa, 0x69, 0x41, 0x62, 0x0a, 0x60, 0xc9, 0x2e, 0xad, 0x6d, 0x2d, 0x54, 0xda, + 0xce, 0x4d, 0x59, 0x28, 0xea, 0x25, 0x15, 0x37, 0xba, 0x29, 0x04, 0x99, 0x25, 0x30, 0x62, 0x6c, 0xad, 0x2c, 0x60, 0xf2, 0x7b, 0xcd, 0xb0, 0x1f, 0xeb, 0x11, 0xa3, 0x2f, 0x05, 0xd1, 0x7e, 0x55, + 0xe3, 0xa1, 0xbf, 0x07, 0xcc, 0x9e, 0xe7, 0xd8, 0x69, 0x3e, 0x5b, 0x95, 0x07, 0x1b, 0xd0, 0x1d, 0x7b, 0x37, 0xcf, 0xc2, 0x65, 0xd0, 0x73, 0x28, 0x3c, 0x9a, 0xf4, 0xca, 0xc8, 0x17, 0xba, 0x54, + 0xed, 0x45, 0x65, 0x6e, 0xcb, 0x53, 0x49, 0xef, 0x4e, 0x4a, 0x43, 0xd3, 0xf4, 0x09, 0x58, 0x45, 0xcd, 0x71, 0xb7, 0x36, 0x80, 0x39, 0xcb, 0xb0, 0x38, 0x9f, 0x1f, 0x20, 0x21, 0xec, 0x79, 0x91, + 0xde, 0x9d, 0xb6, 0x76, 0x4b, 0x8a, 0xa8, 0x68, 0x70, 0xfc, 0x90, 0x94, 0x49, 0xd7, 0xcf, 0xb4, 0x4e, 0x63, 0xc7, 0xf5, 0xcc, 0x26, 0xf9, 0x77, 0x93, 0x8a, 0x7c, 0xa3, 0xfe, 0x09, 0xcc, 0x67, + 0xdb, 0x30, 0x67, 0x16, 0x85, 0x2f, 0x6a, 0xbb, 0xb5, 0x16, 0x39, 0x4e, 0x4e, 0x0e, 0x26, 0xb4, 0xc2, 0x72, 0xa7, 0x44, 0xd1, 0xd0, 0x5d, 0x75, 0xf1, 0x80, 0x5e, 0xde, 0xd7, 0xc2, 0x79, 0xd4, + 0x41, 0xe4, 0xa5, 0x94, 0x69, 0xb7, 0x84, 0xdf, 0xfa, 0x76, 0x73, 0x3b, 0x46, 0x86, 0xa5, 0x4d, 0x6b, 0x5d, 0x5d, 0x0f, 0x24, 0x73, 0x34, 0x83, 0x24, 0x7a, 0xd5, 0x67, 0x6d, 0xa0, 0xb2, 0x47, + 0x8b, 0xf4, 0xcc, 0x63, 0x52, 0x76, 0x6a, 0x76, 0xac, 0xdc, 0xd9, 0xc4, 0x9a, 0x14, 0x28, 0x46, 0x30, 0x60, 0xb7, 0x16, 0xc2, 0x1c, 0xb6, 0x44, 0x65, 0x95, 0x45, 0xfa, 0x2c, 0xe0, 0xa3, 0x91, + 0x1e, 0x4e, 0x0e, 0x38, 0x74, 0x2c, 0xf9, 0x45, 0x20, 0xc5, 0x54, 0xb8, 0xd7, 0x62, 0x6c, 0xde, 0xfb, 0x12, 0xff, 0x9a, 0xf9, 0xf2, 0x6a, 0x77, 0x4d, 0x73, 0xa7, 0x79, 0xa6, 0x85, 0xbb, 0xe2, + 0x32, 0xf6, 0xca, 0xfc, 0x5d, 0x23, 0xf8, 0xf4, 0xe8, 0xbf, 0xa2, 0x91, 0x98, 0xfd, 0x33, 0xd3, 0xc8, 0x6b, 0x3b, 0xf9, 0x0d, 0xdd, 0x4f, 0xcc, 0xdf, 0xee, 0x86, 0xec, 0xe8, 0xd0, 0x98, 0xde, + 0xa5, 0xe2, 0x46, 0xdd, 0x73, 0x51, 0x0e, 0x8d, 0x32, 0x63, 0xbd, 0xa6, 0xf5, 0x6d, 0xe6, 0x75, 0x49, 0xbb, 0x89, 0xf9, 0x21, 0x33, 0xe9, 0xb6, 0x66, 0xd2, 0xe3, 0xe3, 0xf9, 0x95, 0x02, 0xdc, + 0x37, 0x74, 0xcf, 0x7d, 0xfa, 0xb8, 0x1b, 0x56, 0x84, 0x3b, 0x0e, 0x42, 0xac, 0x2a, 0xe3, 0x3c, 0x8f, 0xc2, 0xe3, 0xc6, 0xde, 0x12, 0x26, 0x0c, 0xed, 0xad, 0x13, 0xaf, 0xaa, 0xa3, 0x7c, 0x40, + 0x9f, 0x3e, 0x3d, 0x0f, 0x9e, 0x2d, 0xfd, 0x17, 0x36, 0xc2, 0x2b, 0xd1, 0xb7, 0xde, 0x5c, 0x2f, 0xcf, 0x0b, 0xfd, 0xd7, 0xec, 0x01, 0x8a, 0x05, 0x45, 0xbc, 0xe3, 0x49, 0x6b, 0xa9, 0x5b, 0xb6, + 0x4b, 0x66, 0xc5, 0xb0, 0x3b, 0xdc, 0xdf, 0xed, 0x20, 0xcb, 0x7b, 0xbc, 0xd0, 0x7f, 0x99, 0xd3, 0xcf, 0x1d, 0x20, 0xba, 0xd2, 0x2c, 0x8a, 0xf3, 0x7b, 0x9f, 0x28, 0xf9, 0x6e, 0x7c, 0x2e, 0x9e, + 0x09, 0x07, 0x2f, 0x0c, 0xf4, 0x95, 0xe8, 0x19, 0x97, 0xcb, 0xe5, 0x99, 0xe5, 0x1f, 0xa0, 0x13, 0x8e, 0x81, 0x76, 0x61, 0xee, 0x51, 0x40, 0x4f, 0x4c, 0x64, 0xd7, 0x9f, 0xf8, 0x69, 0xbb, 0x95, + 0xc4, 0xbd, 0xee, 0x72, 0x6c, 0x7b, 0x10, 0x57, 0x75, 0x76, 0xa0, 0x9d, 0xa6, 0xdf, 0xb2, 0x45, 0x5f, 0x48, 0x46, 0x3f, 0xa9, 0xe2, 0x15, 0x1f, 0x18, 0xf0, 0x6a, 0xc4, 0x64, 0x74, 0xa8, 0xf0, + 0x54, 0xbf, 0x50, 0x72, 0x6e, 0xee, 0xf2, 0xc5, 0x7e, 0x75, 0x34, 0x51, 0x47, 0x77, 0x0d, 0x4e, 0x3a, 0xb8, 0xdd, 0x37, 0xd5, 0xce, 0xc5, 0xf0, 0xfe, 0x78, 0x22, 0x20, 0x37, 0xc6, 0xad, 0xe1, + 0x1d, 0x0e, 0xcf, 0x7d, 0x0d, 0xcf, 0xe9, 0x98, 0xc9, 0xdf, 0xbb, 0xb9, 0xd4, 0x80, 0x53, 0xe3, 0x6b, 0x70, 0xd3, 0xef, 0xb0, 0x90, 0x97, 0x95, 0xd0, 0x98, 0x9c, 0x66, 0xb5, 0xe4, 0x8c, 0xb2, + 0x63, 0xad, 0x66, 0x91, 0xbb, 0xae, 0x41, 0xd3, 0x16, 0x9c, 0x8e, 0x22, 0xe3, 0xd5, 0xba, 0x6c, 0x1b, 0x59, 0x3b, 0xd1, 0x24, 0x58, 0x57, 0x32, 0x23, 0x32, 0xc4, 0xa9, 0x5d, 0x68, 0xbe, 0x99, + 0x04, 0x06, 0x2e, 0x0b, 0xfb, 0x69, 0xca, 0xb0, 0xb1, 0xba, 0xa2, 0x57, 0xc7, 0x67, 0x05, 0x34, 0xbe, 0xf4, 0xfc, 0xbe, 0xc6, 0xf1, 0xbf, 0xa7, 0xd6, 0xba, 0xa3, 0x7c, 0x46, 0xe3, 0xe6, 0x7e, + 0xa8, 0x6a, 0x4b, 0x04, 0x67, 0x34, 0xb4, 0x9c, 0x02, 0xd5, 0xe6, 0x64, 0x24, 0x84, 0xcd, 0xe5, 0x04, 0x99, 0x61, 0x8e, 0x4c, 0xb8, 0xaa, 0xd2, 0x75, 0x85, 0xbe, 0x09, 0xf7, 0x72, 0xb0, 0xed, + 0x85, 0xa3, 0xa1, 0x4d, 0x78, 0xb5, 0xa1, 0xc9, 0x36, 0xc9, 0xe4, 0xf9, 0x69, 0x7d, 0x74, 0x4a, 0x6d, 0x9b, 0xc7, 0x15, 0xbe, 0xdf, 0xac, 0xb5, 0x6c, 0xee, 0x59, 0xbd, 0xa9, 0x39, 0xd8, 0x6e, + 0x1d, 0x05, 0xbe, 0x3f, 0x1a, 0x52, 0x3c, 0xf4, 0xb1, 0xd7, 0xd7, 0xdd, 0x52, 0x7a, 0xea, 0xf2, 0x58, 0x85, 0x8e, 0x3b, 0xb6, 0x03, 0x33, 0xcb, 0xdc, 0xcf, 0xb2, 0xa1, 0x4f, 0xa2, 0x48, 0xc3, + 0xc2, 0x74, 0x9c, 0xf2, 0x9f, 0x1f, 0x94, 0x1f, 0xd4, 0x2b, 0x2c, 0xc8, 0x3b, 0xd5, 0x37, 0xd8, 0xdf, 0xaf, 0xc7, 0x67, 0x5a, 0xbf, 0x43, 0x0e, 0xae, 0x38, 0x00, 0x07, 0x89, 0x63, 0x7e, 0x54, + 0xb6, 0x39, 0x4b, 0x2c, 0x22, 0x01, 0x9a, 0x7b, 0x8a, 0xb5, 0xce, 0x55, 0x70, 0x64, 0xd5, 0xdb, 0xd0, 0x8e, 0x2a, 0x49, 0xd9, 0x49, 0x49, 0x00, 0x04, 0xc6, 0x29, 0x16, 0xc8, 0x55, 0x91, 0xf2, + 0x1e, 0xd1, 0xe8, 0xdd, 0x66, 0x87, 0xc8, 0x23, 0x33, 0x36, 0x70, 0x19, 0xe8, 0x20, 0xd2, 0x48, 0xf6, 0x0a, 0x4b, 0xeb, 0xfb, 0x50, 0x57, 0x37, 0x22, 0xf2, 0x4d, 0xda, 0x09, 0xab, 0xb1, 0x59, + 0xfa, 0xcd, 0xd7, 0x82, 0x41, 0x5f, 0xa7, 0xdd, 0x0b, 0x7b, 0xcd, 0x0d, 0xe1, 0x4b, 0x71, 0xe5, 0x8f, 0xdb, 0xf3, 0xa4, 0x1b, 0xb0, 0xe7, 0x1c, 0x37, 0x01, 0x28, 0xa7, 0x35, 0x29, 0x30, 0x38, + 0x56, 0x09, 0x7d, 0x7b, 0x52, 0xd3, 0x9d, 0xcf, 0x41, 0x75, 0x8f, 0xa4, 0xab, 0x03, 0x81, 0x26, 0x8b, 0x09, 0x98, 0xae, 0xc9, 0xb5, 0x6e, 0xd8, 0x39, 0xd7, 0xaf, 0xc4, 0x7e, 0x16, 0xe0, 0x6c, + 0x5a, 0xea, 0x29, 0xe2, 0x40, 0x64, 0x8c, 0x83, 0x19, 0xeb, 0x96, 0x53, 0x72, 0x42, 0xad, 0x52, 0x32, 0xd6, 0x1b, 0x92, 0xe8, 0x3d, 0x65, 0x9e, 0xad, 0xbf, 0xe9, 0x53, 0xc3, 0x77, 0xe5, 0xfe, + 0xbf, 0xdd, 0xfd, 0x0b, 0xd5, 0x4b, 0xdf, 0x2f, 0xd7, 0x43, 0x3b, 0xde, 0xd3, 0xd4, 0xb4, 0x6c, 0x78, 0x33, 0x8d, 0x4e, 0x29, 0x09, 0x85, 0xf0, 0xd2, 0x40, 0x54, 0x3e, 0xc3, 0xd0, 0xcd, 0x6a, + 0x51, 0x49, 0x7d, 0xb5, 0x74, 0x73, 0xfc, 0xd8, 0x0a, 0x08, 0xbb, 0x5c, 0xa2, 0xd3, 0x49, 0x25, 0x09, 0x34, 0x1e, 0xca, 0x4d, 0x5d, 0xc0, 0xdb, 0x9c, 0x20, 0x44, 0x6f, 0x2a, 0x34, 0xf9, 0xb1, + 0x2a, 0x2a, 0x2e, 0xe8, 0xcd, 0x4d, 0x2e, 0x42, 0xfd, 0x69, 0xca, 0x04, 0x73, 0x71, 0x40, 0x3c, 0xfb, 0xbd, 0x39, 0xe5, 0x47, 0x27, 0xe1, 0x73, 0x9f, 0x32, 0xb3, 0x3c, 0x8d, 0x7f, 0x88, 0xce, + 0x78, 0x91, 0xc5, 0xba, 0x23, 0xfd, 0x8e, 0xdf, 0x47, 0xc3, 0x10, 0x46, 0xeb, 0x0d, 0x44, 0x83, 0x67, 0x64, 0xdd, 0xad, 0xf0, 0x62, 0x76, 0x72, 0x4e, 0xcd, 0x22, 0x74, 0x2a, 0x97, 0x10, 0x2b, + 0xf6, 0x58, 0x5b, 0x1c, 0xb1, 0xd3, 0x5c, 0x95, 0xc9, 0x7b, 0x5f, 0x06, 0x7c, 0xa2, 0x74, 0xc0, 0xa3, 0x1a, 0xa6, 0xba, 0x90, 0xb4, 0x86, 0xcc, 0x00, 0x2b, 0x98, 0xf7, 0x8d, 0x6d, 0xb4, 0x3b, + 0x11, 0x30, 0xc6, 0x79, 0x6e, 0xb2, 0x76, 0x35, 0x9b, 0xe1, 0x29, 0x22, 0x4d, 0x6b, 0x79, 0xb1, 0x7f, 0x8d, 0xb7, 0xbd, 0x7e, 0xfd, 0x39, 0x93, 0xed, 0x1b, 0x36, 0x17, 0x74, 0xe1, 0x1f, 0xb8, + 0xd7, 0x6a, 0x6c, 0xe5, 0x79, 0xe2, 0x9a, 0xd9, 0x67, 0x55, 0xe4, 0xc7, 0x73, 0xf3, 0x15, 0xaf, 0xc7, 0x6f, 0xd4, 0xaf, 0x18, 0xdf, 0xb5, 0x9d, 0x9d, 0xe1, 0x07, 0x58, 0xba, 0xfc, 0x99, 0x6e, + 0xae, 0xd8, 0x65, 0x9a, 0x45, 0xa8, 0xb9, 0x3b, 0x9e, 0x22, 0x5c, 0x67, 0x4f, 0x7b, 0xad, 0x70, 0x24, 0xb3, 0xab, 0xb5, 0x35, 0xab, 0x62, 0xb6, 0x35, 0x72, 0xfb, 0x7a, 0xb3, 0xb0, 0x7b, 0x0f, + 0xb7, 0xa3, 0x66, 0xeb, 0x74, 0xad, 0x8b, 0x19, 0x1c, 0xe3, 0xf9, 0xfb, 0x03, 0x8b, 0xba, 0x18, 0x31, 0xc9, 0xa0, 0x19, 0x34, 0x59, 0x79, 0xe4, 0xd4, 0x40, 0x62, 0xbd, 0x94, 0xe4, 0x83, 0x3e, + 0xe0, 0x64, 0xf8, 0xc5, 0x5d, 0xf8, 0xd7, 0xaa, 0xe7, 0xdf, 0x00, 0xbf, 0x09, 0x65, 0x7c, 0xa6, 0xfe, 0x7e, 0x69, 0x1b, 0x78, 0xa7, 0x7b, 0x01, 0xf9, 0xfd, 0xee, 0xac, 0xf4, 0x1e, 0xb0, 0x15, + 0x64, 0x55, 0xd3, 0xd5, 0x47, 0xc3, 0xe3, 0xf7, 0x38, 0x21, 0x96, 0xa7, 0x84, 0x5a, 0x4f, 0xa5, 0x51, 0x53, 0x64, 0x53, 0xd0, 0x00, 0x69, 0xbf, 0xe8, 0xb2, 0xba, 0x50, 0x48, 0x2a, 0x85, 0x58, + 0x60, 0xbb, 0x9e, 0x83, 0xbd, 0xe0, 0xf5, 0xde, 0x9a, 0xd7, 0x00, 0x6a, 0x67, 0x02, 0x38, 0x6f, 0x54, 0x11, 0x68, 0xda, 0x05, 0x13, 0x4d, 0x44, 0x70, 0x35, 0x87, 0x8e, 0x5b, 0xdc, 0x70, 0xd6, + 0x09, 0x85, 0x7d, 0xb3, 0xa3, 0xbe, 0x7d, 0xd8, 0x33, 0xce, 0x0b, 0x7e, 0xc9, 0x92, 0x74, 0xa6, 0x78, 0xed, 0x72, 0x78, 0x66, 0x32, 0x07, 0x2c, 0x59, 0xdd, 0x5b, 0x6e, 0x89, 0x32, 0x2e, 0x24, + 0x1a, 0x6c, 0x0a, 0xa7, 0x72, 0xd8, 0xf5, 0x62, 0x57, 0xb6, 0x01, 0xbd, 0xf4, 0x6c, 0xaf, 0x17, 0x04, 0xb3, 0xd3, 0x67, 0x02, 0x77, 0x92, 0xf6, 0xcb, 0x1e, 0xe4, 0xb4, 0x70, 0xe1, 0x11, 0x98, + 0x48, 0x32, 0xf4, 0x66, 0xa5, 0x38, 0x6d, 0x07, 0x97, 0xf3, 0xd1, 0x7a, 0x31, 0xad, 0xf6, 0xe8, 0xdc, 0x20, 0x6b, 0xbb, 0x44, 0x2c, 0x88, 0x5a, 0xdb, 0xc6, 0xe1, 0x59, 0x9a, 0xc6, 0xdf, 0xa6, + 0x57, 0x38, 0x0e, 0x33, 0x2f, 0x1f, 0xb0, 0x50, 0xef, 0x6b, 0x97, 0x3f, 0x3b, 0x41, 0x5e, 0x5a, 0xa5, 0x37, 0xa4, 0x2f, 0x50, 0xde, 0x34, 0x0c, 0xb5, 0x44, 0xab, 0x4a, 0x32, 0xdb, 0x62, 0x30, + 0xda, 0xe5, 0x12, 0x48, 0x9a, 0xb9, 0x31, 0xef, 0x03, 0x04, 0x30, 0x70, 0x3b, 0xa0, 0x74, 0x80, 0xd9, 0xed, 0x19, 0x56, 0x02, 0x26, 0xa6, 0x2c, 0x80, 0x4a, 0xbc, 0x3a, 0xa0, 0x35, 0xbc, 0xec, + 0x60, 0x19, 0x46, 0x10, 0xaa, 0x56, 0xf6, 0x69, 0xd7, 0x68, 0xb9, 0x4e, 0xac, 0xd7, 0x09, 0x3d, 0xb5, 0x44, 0x2e, 0x39, 0xc2, 0xe9, 0x69, 0x03, 0xac, 0xb1, 0x3e, 0x06, 0x1f, 0xb1, 0x11, 0xee, + 0xb1, 0xfe, 0xc1, 0xed, 0xfe, 0xb5, 0x8c, 0x61, 0x9f, 0x64, 0x2f, 0xfd, 0xbf, 0xde, 0x0c, 0xc9, 0x0f, 0x06, 0x8d, 0x0f, 0x5c, 0x37, 0x55, 0x21, 0x57, 0x26, 0xa7, 0xc4, 0xd6, 0x63, 0xcd, 0xa0, + 0x71, 0x0f, 0x7b, 0x9b, 0xf4, 0xfb, 0x11, 0xcf, 0x0d, 0xe0, 0xc7, 0xab, 0xb1, 0xd7, 0x24, 0x49, 0x17, 0x3a, 0x75, 0x30, 0x3e, 0x27, 0x7f, 0x28, 0xf2, 0xe7, 0x3c, 0xc2, 0xcb, 0x6b, 0xe4, 0xd1, + 0x3b, 0x2e, 0x5d, 0x7d, 0xf4, 0x64, 0xc8, 0x3a, 0x82, 0xc6, 0x39, 0xc1, 0xaf, 0xf6, 0x0c, 0x69, 0xc4, 0x3a, 0xbf, 0x73, 0x0f, 0x07, 0x4c, 0x1c, 0x11, 0x38, 0x4a, 0x21, 0x84, 0xa1, 0x92, 0xdf, + 0x47, 0xcd, 0x77, 0x33, 0xb7, 0x34, 0xeb, 0xbc, 0x1c, 0xbf, 0xfb, 0xa0, 0xfc, 0xa4, 0x84, 0x7b, 0xa9, 0x8f, 0xdf, 0x5f, 0x71, 0xe9, 0xe1, 0xf7, 0xf6, 0x8b, 0x36, 0x6e, 0xc0, 0x46, 0x11, 0x55, + 0x4c, 0x74, 0xa2, 0x12, 0xe4, 0x14, 0xee, 0x19, 0x69, 0xb4, 0xa9, 0xf6, 0x4e, 0x4a, 0x77, 0xcc, 0xc6, 0x16, 0x8f, 0xe6, 0x7e, 0xb7, 0xae, 0x8a, 0x95, 0x53, 0x24, 0x73, 0x55, 0xe3, 0xa8, 0xf6, + 0x00, 0x85, 0x86, 0xcf, 0xb9, 0xb1, 0x3b, 0x05, 0xd7, 0x10, 0x4e, 0x1c, 0xdc, 0x86, 0xc4, 0xed, 0x5e, 0x32, 0x8f, 0xae, 0x83, 0x1c, 0x00, 0xb5, 0x6f, 0x3a, 0xb0, 0xea, 0xd6, 0x60, 0x58, 0xae, + 0xc9, 0x01, 0x87, 0xce, 0x9f, 0x9f, 0x2a, 0x3f, 0x2c, 0x89, 0xd7, 0x2a, 0xe9, 0x5c, 0x69, 0x5e, 0x21, 0x7c, 0x5b, 0x0c, 0x03, 0x2b, 0xe9, 0x60, 0x0b, 0xb0, 0x5e, 0xd5, 0xf4, 0x76, 0xce, 0xa5, + 0xe2, 0x61, 0x96, 0xad, 0x69, 0x38, 0x58, 0xe0, 0x74, 0x01, 0x1f, 0xec, 0x15, 0x33, 0x77, 0x9a, 0x1c, 0xad, 0x8d, 0x86, 0xe2, 0xb7, 0x00, 0x8b, 0x0b, 0x52, 0x0b, 0xf8, 0x41, 0x70, 0x42, 0xc0, + 0x1c, 0xc3, 0x1a, 0xcf, 0xf4, 0x8e, 0x4b, 0x60, 0xed, 0xb0, 0x04, 0xb5, 0x5e, 0x57, 0xf0, 0xca, 0x2b, 0x33, 0x12, 0xdb, 0xae, 0x57, 0xa7, 0x09, 0x41, 0xab, 0xaf, 0xf9, 0xe6, 0xde, 0xed, 0x16, + 0xd7, 0x50, 0xf0, 0xa7, 0x08, 0x86, 0x59, 0x55, 0x9b, 0x49, 0xe2, 0x3a, 0xe3, 0x8b, 0x53, 0x7c, 0xf2, 0x4c, 0xa1, 0x07, 0xde, 0xe5, 0x35, 0xfb, 0x03, 0x3c, 0xbf, 0xbf, 0xe1, 0x82, 0xee, 0xf7, + 0xf6, 0x73, 0x92, 0x86, 0x01, 0x9b, 0x6e, 0x67, 0x90, 0x47, 0x28, 0xaa, 0x08, 0xce, 0x04, 0x63, 0xd7, 0xde, 0x00, 0x53, 0x96, 0x07, 0x90, 0x09, 0x1d, 0x4f, 0xd2, 0x26, 0xda, 0x13, 0xbb, 0x4d, + 0x2b, 0xc5, 0x78, 0xd3, 0x20, 0xf3, 0xe4, 0x04, 0xf0, 0x31, 0x8a, 0x16, 0x27, 0xa5, 0x49, 0xa4, 0x22, 0x63, 0x17, 0x28, 0x2e, 0xf2, 0x11, 0xbb, 0xd8, 0x4f, 0x0a, 0x4e, 0xc8, 0x34, 0x54, 0x0a, + 0x74, 0x44, 0xd9, 0x65, 0xcc, 0x54, 0x84, 0x7b, 0xec, 0x35, 0xac, 0xef, 0xe3, 0x3d, 0xde, 0x53, 0x80, 0xff, 0x3f, 0x77, 0x83, 0x71, 0x09, 0xc7, 0xc9, 0xde, 0x04, 0xe6, 0xbf, 0xff, 0xdf, 0x0f, + 0x6f, 0xe8, 0x67, 0x03, 0x92, 0xb9, 0xbe, 0x59, 0x87, 0xad, 0x3b, 0xee, 0xdd, 0x32, 0xff, 0x61, 0x43, 0x7c, 0x69, 0x2c, 0xee, 0x88, 0x5f, 0x86, 0xe1, 0xae, 0xe9, 0xbc, 0x05, 0x0e, 0x18, 0x01, + 0xe7, 0xb0, 0x6c, 0xcd, 0x72, 0x6d, 0x76, 0xfb, 0x6a, 0x6e, 0x09, 0x33, 0x77, 0xb9, 0x23, 0xfa, 0x49, 0x4f, 0x72, 0xf5, 0x92, 0xb2, 0x1d, 0x98, 0xd4, 0x1b, 0xaf, 0x69, 0xe6, 0x7d, 0x00, 0x2e, + 0xc8, 0x42, 0x60, 0xa3, 0x25, 0x9f, 0xe9, 0x20, 0x39, 0x6b, 0x89, 0x4a, 0xdf, 0xc3, 0xcd, 0x1c, 0x53, 0x0b, 0x49, 0xec, 0x42, 0x77, 0xe2, 0x8a, 0xcc, 0x91, 0xd1, 0x27, 0xbb, 0x9d, 0xd7, 0x10, + 0x86, 0xa1, 0x3e, 0x92, 0x1d, 0xb3, 0xe2, 0x79, 0x98, 0xe4, 0x8b, 0x87, 0x42, 0x56, 0xa4, 0xd7, 0x9e, 0x17, 0xe9, 0x50, 0xd7, 0x2b, 0x0a, 0x67, 0xa6, 0x9c, 0x17, 0x50, 0xc7, 0x7a, 0x36, 0x4b, + 0x36, 0xa7, 0x44, 0xd8, 0xec, 0x83, 0x3e, 0xaa, 0x4e, 0x31, 0x5b, 0xf1, 0x4b, 0x03, 0x22, 0x27, 0x4a, 0x61, 0xee, 0x7a, 0xe9, 0x44, 0x97, 0xa8, 0x2e, 0x6f, 0x6d, 0x2d, 0x52, 0xdb, 0xde, 0x64, + 0xcd, 0xd3, 0x6c, 0xc2, 0x28, 0x70, 0xae, 0x02, 0xc8, 0xaa, 0x48, 0xa2, 0x80, 0x55, 0xa3, 0x5a, 0x91, 0x85, 0x70, 0xd6, 0x85, 0xe0, 0x1c, 0x0c, 0x07, 0x19, 0x71, 0xaa, 0x71, 0xd6, 0xa4, 0xd6, + 0xd3, 0xb2, 0xae, 0xc4, 0xcb, 0x28, 0x9c, 0xa9, 0x5e, 0x81, 0x38, 0x5f, 0x9f, 0x93, 0x6f, 0x0d, 0xc0, 0x02, 0x85, 0xa6, 0xa1, 0x17, 0xfb, 0xb8, 0x4b, 0x6e, 0x4f, 0x89, 0x52, 0x38, 0xf5, 0xb6, + 0x70, 0xd7, 0x1a, 0x7f, 0x68, 0x15, 0x9a, 0xd1, 0xfa, 0x6d, 0x5d, 0xb3, 0x2d, 0x23, 0xcf, 0x08, 0x14, 0x1a, 0x15, 0x99, 0x41, 0x4e, 0x84, 0x16, 0x04, 0x41, 0x94, 0x97, 0xd7, 0x28, 0x22, 0xad, + 0x36, 0xb3, 0x64, 0x45, 0xd9, 0x8b, 0x56, 0x28, 0x70, 0xc1, 0xd8, 0x19, 0x2a, 0x9d, 0x58, 0x8b, 0xbd, 0x7e, 0x3c, 0x66, 0x7f, 0x84, 0xc5, 0xef, 0xfc, 0x20, 0xf1, 0x3a, 0x24, 0x77, 0x1c, 0xe1, + 0x5d, 0xd3, 0xf9, 0xfc, 0x24, 0x7e, 0x07, 0x28, 0x86, 0x54, 0x90, 0x93, 0xfb, 0x35, 0x9f, 0x13, 0x46, 0xa2, 0x73, 0x5e, 0x2f, 0x37, 0x30, 0x22, 0x06, 0x38, 0x1f, 0x72, 0x73, 0xb3, 0xf2, 0x0b, + 0x8b, 0xda, 0x13, 0xb8, 0x7b, 0xf0, 0xe6, 0xc6, 0xe4, 0xd0, 0xb1, 0x28, 0xaa, 0x72, 0xe8, 0x6a, 0x4b, 0xb7, 0xb4, 0xce, 0x19, 0x90, 0xa3, 0xac, 0x29, 0xa3, 0x9f, 0x06, 0x5b, 0x9a, 0x52, 0x02, + 0xd6, 0x5b, 0xc7, 0x32, 0x5a, 0x38, 0x3b, 0x2c, 0x2e, 0x87, 0xf8, 0x6f, 0xfc, 0xf1, 0xf1, 0xf9, 0xb3, 0x7b, 0xcc, 0x4b, 0xf3, 0xea, 0xe2, 0x07, 0x13, 0x7e, 0x3a, 0xbc, 0x0c, 0x98, 0x51, 0x4e, + 0x79, 0x98, 0x2d, 0x10, 0xdb, 0xb2, 0xfb, 0xe3, 0x91, 0x59, 0xca, 0xb9, 0xb8, 0xb7, 0xc5, 0xa8, 0x76, 0x0a, 0x68, 0x09, 0x24, 0xa7, 0x02, 0x4a, 0x85, 0x0c, 0x3c, 0x9a, 0x7d, 0x26, 0x57, 0xe4, + 0x28, 0x6d, 0xe8, 0xc0, 0x97, 0xec, 0x32, 0xb3, 0xaa, 0x22, 0x3f, 0x62, 0x7b, 0xcc, 0x13, 0x3b, 0x90, 0xcd, 0xf8, 0xcc, 0xf2, 0x66, 0x7d, 0x9b, 0x31, 0x3c, 0x53, 0x1f, 0x66, 0xcc, 0x92, 0xc9, + 0xc9, 0x41, 0x6a, 0xe1, 0xaf, 0x9b, 0xf3, 0x23, 0x28, 0x5e, 0x4b, 0x4a, 0x7c, 0x4f, 0xfa, 0x02, 0xc9, 0x4d, 0xc3, 0xd0, 0xd4, 0xc4, 0x00, 0xac, 0x2e, 0x36, 0x8a, 0x9f, 0xd6, 0x87, 0x2e, 0x87, + 0xe2, 0xfa, 0x48, 0x0a, 0x33, 0x36, 0x6a, 0x36, 0x9d, 0xb1, 0x4b, 0xd9, 0x40, 0x1c, 0xf9, 0x11, 0xe8, 0x51, 0x08, 0x13, 0x07, 0x6b, 0x1a, 0x93, 0xfd, 0x1d, 0x25, 0x1b, 0x6e, 0xbb, 0xd3, 0xf5, + 0x84, 0x8b, 0x15, 0xbc, 0x77, 0x37, 0x36, 0xae, 0xc2, 0xbb, 0x42, 0x74, 0x24, 0x9d, 0xeb, 0x58, 0x97, 0xd2, 0xa7, 0xe8, 0x6c, 0xc7, 0xd0, 0xda, 0xc0, 0xc5, 0xf6, 0x5e, 0x25, 0xfd, 0xd9, 0x22, + 0xfb, 0xf3, 0x9c, 0x42, 0xef, 0x44, 0x2f, 0x70, 0x5c, 0xf2, 0xe6, 0x41, 0xbf, 0x67, 0x15, 0x3a, 0xdb, 0x52, 0x93, 0xd5, 0x0e, 0x22, 0x14, 0xe1, 0x80, 0xa2, 0x79, 0xd7, 0x62, 0x13, 0x49, 0x46, + 0xa6, 0x07, 0xd0, 0x92, 0x36, 0x8c, 0x45, 0x8e, 0xe2, 0x39, 0xa2, 0xae, 0x0c, 0xd8, 0x0b, 0x0d, 0x41, 0xdc, 0xd5, 0x7d, 0xad, 0x33, 0x58, 0x08, 0x4e, 0xfb, 0xa9, 0x71, 0x9c, 0xcf, 0x3a, 0x11, + 0x23, 0x0f, 0x13, 0x71, 0x57, 0x1f, 0x1d, 0x5a, 0xd6, 0x44, 0x40, 0xc3, 0xa4, 0x30, 0x83, 0xba, 0x68, 0x7a, 0x98, 0xeb, 0xaf, 0x45, 0x7e, 0xdc, 0xab, 0xc4, 0x9f, 0xad, 0xad, 0x2a, 0x30, 0x4b, + 0xd7, 0x19, 0x5f, 0x02, 0xa5, 0xac, 0xc6, 0xf3, 0x9e, 0xee, 0xe1, 0x2f, 0x0b, 0xb0, 0x0f, 0x5e, 0x71, 0x41, 0xf6, 0xc1, 0x83, 0xa1, 0x02, 0x6d, 0x75, 0x10, 0x60, 0x75, 0xd6, 0x40, 0x00, 0x78, + 0xc2, 0x9b, 0x76, 0x7f, 0x52, 0xea, 0xa9, 0xd8, 0x9f, 0x82, 0x49, 0x34, 0x55, 0x12, 0xd6, 0x76, 0xe7, 0x39, 0xbf, 0x5a, 0xee, 0xc8, 0x1d, 0xc5, 0xa8, 0x94, 0xdd, 0x86, 0x36, 0x20, 0x39, 0x95, + 0x01, 0xc6, 0x8c, 0x4a, 0x21, 0x2c, 0x73, 0x42, 0x38, 0x95, 0x99, 0x1b, 0x5c, 0xc8, 0x02, 0x48, 0x37, 0x9a, 0xb0, 0x80, 0x2a, 0x59, 0x1b, 0x56, 0x70, 0x82, 0x01, 0xbc, 0xff, 0x23, 0x85, 0xd3, + 0x53, 0x68, 0xcf, 0x5b, 0xdc, 0xbf, 0xbd, 0xfd, 0x5f, 0xa8, 0x5e, 0x01, 0xbc, 0xa4, 0x6f, 0x1f, 0xb8, 0xe1, 0xd7, 0x0c, 0xac, 0xee, 0xfb, 0xb0, 0x8d, 0x5c, 0x3c, 0xf7, 0x36, 0x3b, 0x22, 0x81, + 0x11, 0x3b, 0x9a, 0x89, 0xbc, 0x09, 0x52, 0xbe, 0x45, 0x1c, 0x93, 0xc9, 0x61, 0x81, 0x47, 0x0b, 0xcc, 0x8d, 0xf0, 0x66, 0xa3, 0x21, 0xf0, 0x36, 0xd9, 0x6d, 0x10, 0x61, 0xb5, 0x09, 0xfd, 0xda, + 0x5c, 0xb8, 0xac, 0xd0, 0x50, 0x5e, 0x1e, 0xd8, 0xb6, 0xac, 0xb7, 0x5c, 0x68, 0xf0, 0x9e, 0x28, 0x66, 0xa2, 0xae, 0xd6, 0x03, 0x15, 0xca, 0x7f, 0xb6, 0xe1, 0x5f, 0x9c, 0x77, 0x7f, 0x40, 0xee, + 0x05, 0x03, 0xd8, 0x3b, 0xd5, 0x2b, 0x72, 0x97, 0xcc, 0x08, 0x43, 0x0d, 0x5f, 0x5d, 0x18, 0x05, 0xa6, 0xac, 0xf8, 0x87, 0x36, 0x48, 0x01, 0xd0, 0x70, 0x26, 0xf6, 0x5e, 0x30, 0x6a, 0x2a, 0xd1, + 0x9d, 0xd5, 0xbc, 0xb0, 0xe5, 0xd9, 0x16, 0x53, 0xd7, 0x6a, 0xa3, 0xef, 0x37, 0xf9, 0x96, 0xa0, 0x50, 0x55, 0x10, 0x1d, 0x75, 0xe4, 0x17, 0x5b, 0x5c, 0xee, 0x73, 0xc2, 0x42, 0x35, 0x98, 0x55, + 0x13, 0x20, 0x2f, 0xf0, 0xc5, 0x41, 0x27, 0x29, 0x74, 0x62, 0x74, 0x2d, 0xe5, 0x99, 0x03, 0x8f, 0xca, 0x81, 0xf9, 0x3a, 0xc2, 0xea, 0x9c, 0x56, 0xeb, 0xba, 0x9a, 0x7e, 0xd0, 0x14, 0xbf, 0x60, + 0x3f, 0xbd, 0x23, 0x7d, 0xc1, 0xef, 0xa6, 0xe1, 0xac, 0x23, 0x1e, 0x60, 0x55, 0x65, 0x0f, 0x2c, 0x0a, 0x6d, 0x05, 0xe3, 0x00, 0x7b, 0x7e, 0xbd, 0xd8, 0x92, 0x3b, 0x56, 0x9b, 0x6b, 0xcb, 0x80, + 0xd6, 0x16, 0x8d, 0x8e, 0x4c, 0xb2, 0x0d, 0x22, 0x21, 0xf8, 0x8a, 0x5c, 0xae, 0xf6, 0xea, 0x51, 0x39, 0xca, 0x7e, 0x0c, 0x38, 0x23, 0x42, 0x88, 0xd2, 0x6e, 0x01, 0xb7, 0x39, 0x9c, 0xea, 0xe9, + 0x7e, 0x45, 0xaa, 0xba, 0xb1, 0x6a, 0xc0, 0x03, 0x4b, 0x5a, 0xda, 0x06, 0xf3, 0x99, 0xb0, 0x8a, 0x06, 0x2c, 0x59, 0xb3, 0x35, 0xc3, 0x8b, 0xb6, 0xf5, 0xe6, 0xa3, 0x3f, 0xf1, 0xbc, 0x2b, 0xe7, + 0xf5, 0x8b, 0x3e, 0xd9, 0x3d, 0x27, 0x2b, 0x38, 0x67, 0x35, 0xbf, 0xfe, 0x00, 0x22, 0xef, 0x09, 0x7c, 0xa6, 0xb8, 0xbb, 0x08, 0x59, 0x77, 0x0f, 0xff, 0x7c, 0x21, 0x9c, 0xbf, 0xf8, 0xe7, 0x11, + 0x7d, 0x91, 0x01, 0xfa, 0xa4, 0x7c, 0x33, 0xa0, 0xef, 0xe3, 0xf9, 0x2b, 0x3b, 0x04, 0x8d, 0x31, 0x36, 0xe3, 0xa6, 0xf3, 0xc8, 0x9b, 0xd1, 0x95, 0x8c, 0x38, 0x45, 0x21, 0x6d, 0x12, 0x9f, 0xf1, + 0x7a, 0x53, 0x29, 0x86, 0xf8, 0x7b, 0x54, 0xe3, 0xce, 0x35, 0xe3, 0xd2, 0x7d, 0x5e, 0x1d, 0xe8, 0xc5, 0xb3, 0xe6, 0x4a, 0xf6, 0xd2, 0xa7, 0xeb, 0xcd, 0xd0, 0x33, 0xe5, 0x60, 0xd7, 0x55, 0xb3, + 0x36, 0x52, 0x4e, 0x02, 0x47, 0xad, 0xa2, 0xf0, 0x5e, 0xae, 0xb5, 0xa7, 0xb9, 0x0b, 0x8f, 0x16, 0x0a, 0xd3, 0x66, 0xa9, 0x01, 0xbb, 0xfd, 0xb6, 0x29, 0x20, 0x85, 0xae, 0x5c, 0x6a, 0x54, 0x77, + 0xd3, 0xa9, 0x1b, 0x9a, 0x09, 0xce, 0x30, 0x21, 0x22, 0xd8, 0xf0, 0x6a, 0x6e, 0x7b, 0xf8, 0xe8, 0xd0, 0xc3, 0x73, 0x7a, 0x93, 0x45, 0xfb, 0x2a, 0x26, 0x8f, 0xc1, 0x4a, 0x31, 0x37, 0x03, 0x56, + 0xf9, 0x9f, 0x9c, 0x29, 0xe7, 0x58, 0x82, 0x8b, 0x34, 0xff, 0x83, 0x02, 0xe4, 0xa5, 0x19, 0x71, 0x43, 0xfa, 0x02, 0xdf, 0x4d, 0xc3, 0x59, 0xe5, 0x31, 0x80, 0x45, 0xd6, 0x22, 0xc5, 0xb5, 0x80, + 0x84, 0x4d, 0xe3, 0xfc, 0xe4, 0x90, 0xe5, 0x69, 0xa3, 0x71, 0xab, 0x56, 0x9c, 0x66, 0xe8, 0x0c, 0x8a, 0x73, 0xfe, 0xa0, 0x8f, 0xda, 0xc3, 0x29, 0x8a, 0x54, 0xcf, 0x46, 0x8e, 0xa7, 0x55, 0xbd, + 0x41, 0x1d, 0x5d, 0x3c, 0xf2, 0x28, 0x5a, 0x19, 0x65, 0x76, 0x90, 0x94, 0x5e, 0x71, 0x2a, 0xe4, 0x78, 0x12, 0x4b, 0x75, 0xbb, 0xde, 0x4e, 0xa9, 0xb5, 0x36, 0xd5, 0xfc, 0x75, 0xe6, 0x0f, 0x63, + 0x91, 0xff, 0x6f, 0xac, 0x92, 0xcf, 0xf5, 0xf1, 0x07, 0x2b, 0xa3, 0xc1, 0x04, 0x47, 0x99, 0xfb, 0x55, 0x13, 0x98, 0x3c, 0x9d, 0x0b, 0x4b, 0x0d, 0xd7, 0x56, 0x1b, 0xdf, 0x56, 0xb6, 0x47, 0x66, + 0x48, 0x3f, 0xdc, 0xe3, 0x33, 0x0e, 0xff, 0x55, 0x61, 0xc7, 0x3d, 0x5e, 0x18, 0x7b, 0xf7, 0xe8, 0x0e, 0x11, 0x75, 0xa0, 0x31, 0xbe, 0x69, 0x7b, 0x47, 0x38, 0x6a, 0x16, 0x10, 0xaa, 0x6e, 0x30, + 0xb3, 0xab, 0xb9, 0x5d, 0xeb, 0x3d, 0x59, 0x8d, 0x82, 0xc9, 0xef, 0x3d, 0x88, 0xde, 0xf6, 0xb8, 0xd8, 0xcd, 0x9e, 0xfb, 0xd8, 0xbf, 0xd2, 0x8b, 0x0f, 0xaa, 0x97, 0xfa, 0x7b, 0x97, 0xeb, 0xa1, + 0x6a, 0x11, 0xd9, 0x59, 0xaa, 0x5e, 0x62, 0x33, 0x88, 0xad, 0xf6, 0xab, 0x90, 0x3f, 0x48, 0x7e, 0x35, 0x6d, 0x40, 0x7c, 0xbe, 0x69, 0x28, 0xd5, 0xe1, 0x96, 0x22, 0x68, 0xb9, 0xba, 0xb5, 0x09, + 0x58, 0x01, 0x8d, 0x71, 0xb3, 0xf0, 0x97, 0x75, 0xe8, 0xd9, 0xf9, 0xb4, 0xde, 0x52, 0x96, 0x7d, 0x14, 0x0b, 0x9d, 0xae, 0x8b, 0x19, 0x1c, 0x4f, 0x79, 0x5c, 0xb1, 0x7a, 0x1f, 0x9d, 0x9a, 0x4d, + 0xb5, 0x03, 0x36, 0xab, 0x21, 0xde, 0xf4, 0xdf, 0xeb, 0x11, 0xde, 0x4b, 0x6c, 0xd0, 0x2b, 0x45, 0x43, 0xbe, 0x17, 0x22, 0xbc, 0x10, 0xfa, 0x1d, 0x87, 0x3c, 0xe6, 0x59, 0x42, 0xdc, 0xef, 0x97, + 0x84, 0x5e, 0x0a, 0x94, 0x18, 0x23, 0x80, 0xb2, 0x2f, 0xb3, 0x06, 0x0d, 0xf7, 0xd4, 0x49, 0x8c, 0x47, 0x30, 0x96, 0x1d, 0xf6, 0x68, 0x98, 0x2a, 0x70, 0x56, 0x34, 0xed, 0x56, 0x9f, 0xa5, 0x39, + 0x20, 0x31, 0x46, 0x7e, 0xe8, 0x8c, 0x58, 0x37, 0xb9, 0x59, 0x8c, 0x44, 0x5a, 0x4b, 0x8b, 0x5b, 0x91, 0x63, 0x7c, 0x26, 0x30, 0xd7, 0xe2, 0x29, 0xa3, 0x15, 0xea, 0x35, 0x85, 0xe4, 0x5d, 0x41, + 0x42, 0xe8, 0x6b, 0xa1, 0x8b, 0xcf, 0xe2, 0xf3, 0x3f, 0xba, 0x77, 0x9e, 0xcb, 0x5d, 0xfc, 0x28, 0xb3, 0x20, 0x2f, 0x4e, 0xb6, 0x0f, 0xba, 0x67, 0x94, 0x3f, 0xee, 0xce, 0xe2, 0xf0, 0xaf, 0xcb, + 0x67, 0x77, 0x24, 0x31, 0xb7, 0x3d, 0x42, 0x50, 0xe6, 0x52, 0xf8, 0xba, 0x27, 0x67, 0xb1, 0x17, 0x8c, 0xcc, 0x8d, 0x71, 0x58, 0xfa, 0x43, 0xa6, 0x4c, 0x9e, 0x8d, 0x2b, 0x3b, 0x70, 0x53, 0x73, + 0xfc, 0x4b, 0x8d, 0x65, 0xf0, 0x9f, 0xd7, 0xa6, 0xcf, 0xf7, 0x17, 0xbc, 0xf7, 0xf2, 0x4b, 0xf3, 0xf8, 0xfc, 0x86, 0xdf, 0xe7, 0xd5, 0xd1, 0xb2, 0xa6, 0x2c, 0xe6, 0x4c, 0x75, 0x15, 0xdb, 0x92, + 0x6b, 0x9b, 0x09, 0x82, 0x26, 0x20, 0xd8, 0x25, 0x49, 0xb2, 0xfb, 0x66, 0x87, 0x1c, 0x2a, 0x0e, 0xd1, 0xc1, 0x5e, 0x34, 0xe6, 0x2b, 0xcf, 0x60, 0x58, 0xbb, 0xd8, 0x85, 0xac, 0x0a, 0x2c, 0x8f, + 0x7d, 0x8c, 0xc3, 0x14, 0x5d, 0x56, 0xa6, 0x05, 0xa4, 0x7c, 0xc8, 0x4a, 0x75, 0x48, 0x75, 0xfc, 0x66, 0x44, 0xa2, 0x98, 0xbc, 0x71, 0xff, 0x3f, 0xf6, 0xde, 0xa3, 0xc7, 0x55, 0x67, 0xeb, 0x17, + 0x9e, 0xdf, 0x4f, 0xb1, 0xb5, 0xa7, 0xc8, 0x9b, 0x1c, 0xfc, 0xcc, 0x8c, 0xc1, 0x09, 0x93, 0x1c, 0x30, 0x30, 0x38, 0xaf, 0xc8, 0x39, 0x67, 0x4b, 0xf7, 0x7c, 0xf6, 0x57, 0xb6, 0x3b, 0x77, 0xbb, + 0x9b, 0xed, 0xf3, 0x7f, 0xa4, 0x3b, 0x38, 0x93, 0x6e, 0x0a, 0xf0, 0x82, 0xfa, 0x55, 0x51, 0xb5, 0xf2, 0x42, 0x95, 0x4f, 0xd6, 0xc5, 0xaf, 0x8b, 0x99, 0x75, 0x41, 0xed, 0x67, 0xcd, 0xad, 0x4e, + 0xcc, 0xfd, 0xfa, 0x3c, 0xf0, 0x43, 0x56, 0x96, 0x51, 0x4f, 0x7c, 0xc1, 0xee, 0x87, 0xfb, 0xc6, 0x39, 0x99, 0xa7, 0xa6, 0x03, 0xc7, 0x1b, 0xa3, 0x96, 0xce, 0x67, 0x80, 0xea, 0x72, 0x78, 0x31, + 0x87, 0xea, 0xa8, 0x2b, 0xd5, 0x4d, 0x3c, 0x62, 0xf3, 0x88, 0x9c, 0xa1, 0xbd, 0xbf, 0xd6, 0x3c, 0xf0, 0x21, 0x5c, 0x08, 0x82, 0x93, 0xeb, 0xbf, 0x6b, 0x8a, 0xee, 0x11, 0x6b, 0xed, 0x74, 0x88, + 0x36, 0x20, 0x46, 0xec, 0x05, 0x70, 0xca, 0x49, 0x3c, 0x58, 0x05, 0x96, 0x7f, 0x96, 0x49, 0xb1, 0x55, 0x87, 0x25, 0xa3, 0x71, 0xcb, 0x83, 0xc1, 0xc4, 0x1c, 0xbf, 0x9c, 0xcf, 0x62, 0x0f, 0x39, + 0x72, 0x14, 0xb7, 0x1b, 0xb0, 0xd0, 0x84, 0x6c, 0xaa, 0x5a, 0x58, 0x00, 0x74, 0xa8, 0x21, 0x4d, 0x4b, 0x0f, 0x7e, 0x41, 0xa9, 0xc8, 0x4e, 0xf7, 0xe6, 0x1e, 0x89, 0xed, 0xa4, 0xde, 0xb3, 0x94, + 0xc7, 0x12, 0x38, 0xbd, 0x5f, 0x1e, 0x7e, 0x7f, 0x93, 0x84, 0x21, 0x36, 0x6a, 0xa7, 0xaa, 0x27, 0xaf, 0x78, 0x7d, 0x05, 0x21, 0xfe, 0x10, 0x84, 0xef, 0x49, 0x83, 0x93, 0x0f, 0x27, 0xae, 0x59, + 0x56, 0x46, 0xc0, 0xda, 0x39, 0x07, 0xa0, 0x84, 0xa2, 0x43, 0xb4, 0x93, 0xed, 0xb9, 0xad, 0xcd, 0x85, 0x3a, 0xe2, 0xbb, 0x93, 0x2a, 0x1f, 0x78, 0xb6, 0xea, 0xb8, 0x72, 0x41, 0x47, 0x09, 0x66, + 0x45, 0xb2, 0xc8, 0x2b, 0xbe, 0x5f, 0xf8, 0x6b, 0x7e, 0x0d, 0x1f, 0x0f, 0x88, 0xcf, 0x87, 0x00, 0x1c, 0x04, 0xde, 0xda, 0xf7, 0xf6, 0x7a, 0x82, 0x7b, 0x87, 0xa4, 0xdc, 0xa9, 0xb4, 0x90, 0x2d, + 0x8f, 0x9e, 0x71, 0xd0, 0xe0, 0xfe, 0x31, 0x58, 0x73, 0xc3, 0x8a, 0x0c, 0xef, 0x56, 0x6c, 0xe8, 0xba, 0x42, 0x13, 0xf7, 0xcb, 0x12, 0xc4, 0x4e, 0x7b, 0x0f, 0xce, 0xc7, 0x56, 0xaf, 0x0b, 0xc1, + 0x0b, 0x88, 0x4e, 0x9b, 0x8e, 0x5d, 0x9d, 0x00, 0xf3, 0x80, 0x34, 0x2b, 0x8c, 0xc5, 0xb7, 0x4b, 0x96, 0xf4, 0xc1, 0x14, 0x75, 0x5a, 0x6b, 0x0f, 0x56, 0x72, 0xbc, 0x51, 0xe7, 0xf9, 0x3a, 0x27, + 0x86, 0x84, 0x12, 0x4f, 0x1b, 0xdc, 0x51, 0x08, 0x80, 0x20, 0x99, 0xaa, 0x88, 0xc1, 0xad, 0x61, 0x1c, 0xc8, 0x62, 0x43, 0xcf, 0x6a, 0xa4, 0x3c, 0xbb, 0x99, 0x01, 0xe2, 0x32, 0xbd, 0xa4, 0xfd, + 0x9e, 0x09, 0x7a, 0xd8, 0xe6, 0x6b, 0x24, 0x92, 0xef, 0xed, 0xfe, 0x3f, 0x41, 0x57, 0x3a, 0x71, 0x63, 0x3b, 0x93, 0x17, 0x71, 0x1e, 0x79, 0x6f, 0x85, 0xbb, 0xa6, 0xa2, 0xb2, 0x7c, 0xc7, 0xba, + 0x96, 0xb7, 0xfc, 0xf7, 0x2d, 0xc5, 0xf6, 0xd7, 0xc0, 0x7e, 0xae, 0x35, 0xf5, 0x35, 0xb3, 0x45, 0x3e, 0x32, 0x67, 0x3f, 0x10, 0xbf, 0x00, 0xfe, 0xe1, 0xd4, 0xe4, 0x4a, 0xf9, 0x67, 0xf0, 0xb7, + 0x07, 0x83, 0xd2, 0xf4, 0x1c, 0xe5, 0x90, 0xd9, 0x31, 0x2f, 0x8e, 0x69, 0xd7, 0x71, 0x46, 0x98, 0xad, 0x57, 0x56, 0xc5, 0x89, 0x74, 0x7a, 0xee, 0x36, 0x82, 0xbc, 0x2f, 0x23, 0xb2, 0x49, 0xcf, + 0x81, 0xd4, 0x65, 0xc4, 0x3c, 0x14, 0xb5, 0x70, 0x10, 0xa1, 0xc5, 0xb4, 0x73, 0xa3, 0x7e, 0xd1, 0x4a, 0x40, 0x4a, 0x57, 0xf3, 0xa5, 0x83, 0x3a, 0xbc, 0x94, 0x3a, 0xb6, 0xe2, 0xad, 0xd7, 0x9e, + 0x3d, 0x1b, 0x11, 0xba, 0xf6, 0x5c, 0x2b, 0xf1, 0x53, 0xa5, 0x70, 0x2b, 0xcb, 0xa2, 0xe0, 0xb9, 0x9c, 0xc6, 0x87, 0xa8, 0xb6, 0x51, 0x45, 0xc2, 0x2a, 0xa7, 0x9e, 0xdc, 0x88, 0x3c, 0xc5, 0x2e, + 0xfe, 0xbe, 0xc9, 0xfa, 0xd8, 0x5f, 0x16, 0xed, 0x0e, 0xdb, 0x77, 0x27, 0xde, 0x8f, 0x1b, 0xf5, 0x87, 0x7a, 0x30, 0xb3, 0x99, 0x11, 0x5e, 0x56, 0x6c, 0x23, 0x6c, 0x27, 0x57, 0x1a, 0xef, 0x46, + 0xe8, 0xd7, 0xbd, 0x51, 0xea, 0xa7, 0x4a, 0xa3, 0x02, 0x3b, 0x30, 0xb4, 0x16, 0x21, 0xcc, 0xac, 0x32, 0xd0, 0x9d, 0xe7, 0xd3, 0xa9, 0x53, 0x79, 0x4b, 0xe6, 0x14, 0xac, 0x58, 0xa1, 0xe4, 0x7a, + 0x63, 0xce, 0x0a, 0xcd, 0xbc, 0xcf, 0x33, 0x7e, 0x9e, 0xcc, 0x6a, 0x70, 0x2e, 0xce, 0x97, 0x0a, 0xd3, 0xcd, 0xc8, 0x28, 0x76, 0xd8, 0x9c, 0x3d, 0x6f, 0x42, 0x26, 0x6d, 0x7d, 0x74, 0x58, 0x66, + 0x62, 0xb3, 0x6d, 0x20, 0xa6, 0x8e, 0xe3, 0x4f, 0xf9, 0x9b, 0xbe, 0x1c, 0xa9, 0x5f, 0xbf, 0xbe, 0xa9, 0x97, 0xf2, 0xbe, 0x64, 0xf9, 0x7d, 0xee, 0xe8, 0x73, 0x98, 0xd0, 0xdb, 0x07, 0x5e, 0x43, + 0x85, 0x5e, 0xb5, 0xb1, 0x9f, 0x8b, 0xcb, 0x5e, 0x6f, 0x6e, 0xca, 0xe0, 0x39, 0x98, 0xf8, 0x56, 0x40, 0xf3, 0xcd, 0xe5, 0xff, 0xfb, 0x72, 0xfc, 0x7f, 0xdf, 0xcc, 0x84, 0x1f, 0x58, 0xb5, 0x5f, + 0xbf, 0xbe, 0x13, 0x42, 0x7f, 0xfd, 0xc5, 0x98, 0xfe, 0x0d, 0xcb, 0xf6, 0x59, 0x44, 0xfd, 0x75, 0x6f, 0xd4, 0x05, 0x9e, 0x02, 0xa5, 0x69, 0x8a, 0xaa, 0xa1, 0xea, 0xaf, 0xf5, 0x14, 0x8e, 0xb7, + 0x7e, 0xb4, 0x30, 0x66, 0xf3, 0x83, 0x78, 0xdc, 0xc9, 0x6a, 0x78, 0xf2, 0x15, 0x8c, 0x9e, 0x81, 0xbb, 0x54, 0x6c, 0xa9, 0xbe, 0xf5, 0x8a, 0xba, 0xc8, 0x67, 0xea, 0x74, 0x2d, 0x62, 0xc9, 0x4e, + 0xee, 0xf7, 0x3d, 0xbc, 0x8b, 0x33, 0xac, 0x2e, 0xce, 0x4e, 0x61, 0x42, 0x95, 0x18, 0x97, 0x8d, 0x21, 0x0e, 0xa8, 0xdd, 0x78, 0x3f, 0x07, 0x3d, 0xc6, 0x99, 0x7d, 0x3f, 0x78, 0x09, 0xfb, 0x03, + 0x93, 0x7f, 0x90, 0x07, 0x36, 0x86, 0x2b, 0xd1, 0xcb, 0x4a, 0x75, 0x3d, 0x98, 0x3c, 0xd1, 0xf9, 0x79, 0x85, 0x6a, 0x91, 0x88, 0x61, 0x1d, 0x9c, 0x8c, 0x1d, 0xeb, 0xd0, 0xc4, 0x06, 0xb3, 0x6e, + 0x84, 0x83, 0x34, 0xa0, 0xbb, 0x01, 0xf3, 0xb6, 0xcb, 0x0d, 0xa1, 0xc3, 0x22, 0xda, 0xb2, 0x70, 0x54, 0x7a, 0xaa, 0x2e, 0x94, 0x95, 0x0c, 0x6c, 0x17, 0x87, 0xe5, 0x4a, 0xe9, 0x95, 0xd0, 0x52, + 0xa5, 0x0a, 0x26, 0xb7, 0xbe, 0xa9, 0x2b, 0x4b, 0xc7, 0x9e, 0x6d, 0x5a, 0x4a, 0xd5, 0xe1, 0xba, 0x0d, 0xf1, 0x45, 0xbb, 0x1f, 0x63, 0xba, 0xba, 0xbd, 0xe8, 0x1f, 0x2b, 0xce, 0x52, 0xe7, 0x32, + 0xf7, 0xef, 0x02, 0x82, 0x3f, 0xb2, 0x84, 0x7f, 0x20, 0xfe, 0x02, 0xcc, 0xeb, 0xa9, 0xc9, 0x95, 0xf2, 0x4f, 0x0c, 0x29, 0x16, 0x52, 0x60, 0xca, 0x02, 0x52, 0x6b, 0x13, 0xab, 0xcd, 0x3e, 0xa5, + 0xe9, 0xde, 0x57, 0xb3, 0xb5, 0x19, 0x9f, 0xc5, 0x11, 0x69, 0xee, 0x9f, 0x1e, 0x59, 0x97, 0x4d, 0x6a, 0x19, 0xf5, 0xfd, 0x38, 0x57, 0xec, 0x01, 0x65, 0xdf, 0x07, 0xda, 0xaf, 0x1d, 0x7c, 0x3e, + 0x73, 0xad, 0x29, 0xf5, 0x83, 0xda, 0x0f, 0x9e, 0x9c, 0xc2, 0xa3, 0x90, 0x6d, 0xd9, 0x9d, 0x88, 0x09, 0xc0, 0x19, 0x04, 0x15, 0x6f, 0x3f, 0x00, 0x27, 0xc1, 0x2c, 0x30, 0x7d, 0x44, 0x2c, 0x5e, + 0x9c, 0x65, 0xb9, 0xe9, 0xa4, 0x77, 0x4b, 0x9a, 0x3c, 0x96, 0x2d, 0xe3, 0x85, 0xea, 0xb5, 0x4f, 0x4f, 0xc7, 0x63, 0xf2, 0x63, 0xc0, 0x13, 0xdb, 0x5b, 0xa2, 0x12, 0x6c, 0x6d, 0xdc, 0x95, 0x04, + 0x6d, 0x0a, 0xda, 0x69, 0x51, 0xcf, 0xa8, 0x81, 0x7c, 0xb3, 0x00, 0xa9, 0x1f, 0xb7, 0xcc, 0xbe, 0x76, 0x9e, 0x54, 0x90, 0xdf, 0x24, 0x8e, 0xfd, 0x94, 0x6d, 0xed, 0x9f, 0x93, 0xb6, 0xde, 0x93, + 0xbe, 0xf6, 0xfd, 0xed, 0x89, 0x31, 0xf2, 0xd3, 0xe5, 0x7b, 0x5e, 0x22, 0xdb, 0x90, 0x80, 0x6b, 0x95, 0x49, 0x95, 0xc5, 0x42, 0x0c, 0x28, 0x45, 0xb7, 0x2b, 0x60, 0x9f, 0xc9, 0x61, 0x2d, 0xcf, + 0x51, 0xdb, 0xcb, 0x22, 0xce, 0x66, 0x96, 0x48, 0x72, 0x48, 0xe0, 0xba, 0xc7, 0x12, 0x1c, 0x12, 0x8e, 0x2b, 0x5a, 0xd4, 0xf7, 0x74, 0x27, 0xcb, 0xab, 0x61, 0x80, 0x14, 0x18, 0x99, 0x41, 0x9b, + 0xc3, 0x12, 0x0b, 0x2c, 0x57, 0x97, 0x57, 0x40, 0x2f, 0x0d, 0x3e, 0x75, 0x4f, 0x00, 0x79, 0x0f, 0x4d, 0xd9, 0xfc, 0x58, 0xd9, 0xef, 0x81, 0xc9, 0xf0, 0x4c, 0xf5, 0x02, 0xc8, 0xf3, 0xf1, 0xb5, + 0x96, 0xdf, 0x08, 0xee, 0x6b, 0x93, 0x11, 0xf6, 0x06, 0xc2, 0xe6, 0xc9, 0x3e, 0x6c, 0xce, 0x69, 0xb7, 0xd9, 0xef, 0xd1, 0xfc, 0xe8, 0x9c, 0x12, 0x1b, 0x5c, 0x41, 0xae, 0x7b, 0x88, 0x23, 0x55, + 0xf5, 0x3a, 0x3d, 0x00, 0x9c, 0x02, 0x3e, 0xce, 0x93, 0x42, 0xee, 0xe6, 0x3e, 0xe0, 0x6c, 0x2b, 0x4d, 0xd4, 0xe6, 0x9d, 0x36, 0x9d, 0xc2, 0x01, 0xb2, 0x30, 0x7c, 0xcc, 0x87, 0x69, 0x96, 0x9f, + 0xf7, 0x58, 0x71, 0xf0, 0x97, 0x66, 0x15, 0x8c, 0x30, 0xb9, 0x0c, 0x46, 0x1c, 0x07, 0x2f, 0x05, 0x50, 0xef, 0x8a, 0x5d, 0x89, 0x11, 0x39, 0x13, 0x3b, 0xb8, 0xaf, 0xbc, 0x79, 0x44, 0xe0, 0x7a, + 0x26, 0x0a, 0x4e, 0x5e, 0x0e, 0xc7, 0xca, 0xae, 0x1e, 0xba, 0x70, 0x24, 0x04, 0xda, 0x0a, 0x9d, 0x3f, 0xdb, 0x9a, 0x20, 0x31, 0x3f, 0x13, 0x8c, 0x8d, 0x2d, 0x90, 0xd4, 0x3b, 0x3b, 0x50, 0x78, + 0x26, 0x6b, 0xf3, 0x5c, 0x32, 0x48, 0x37, 0x53, 0x80, 0x6c, 0xba, 0x70, 0x84, 0x95, 0x83, 0x95, 0x5b, 0x60, 0xe0, 0x90, 0xc4, 0x86, 0x36, 0xa0, 0x1b, 0xec, 0x5d, 0xb8, 0x32, 0xe0, 0x19, 0xe3, + 0xab, 0x45, 0x80, 0x03, 0x99, 0xd2, 0x89, 0x3c, 0xe8, 0x2c, 0x1f, 0xf3, 0x3c, 0x7f, 0x53, 0xa9, 0x95, 0x78, 0x07, 0xe0, 0x1b, 0x52, 0xf7, 0x58, 0xcb, 0x97, 0xdf, 0xde, 0xe3, 0x44, 0x88, 0x0f, + 0x81, 0xa8, 0xe3, 0xc1, 0xbd, 0x91, 0x06, 0x27, 0x4f, 0x07, 0x13, 0xe2, 0x93, 0x59, 0xe0, 0xd7, 0x3d, 0x70, 0x4d, 0x74, 0x7a, 0xa0, 0x8d, 0xc3, 0xde, 0x55, 0x88, 0x81, 0x2e, 0x8d, 0xfc, 0x48, + 0x4d, 0x73, 0xdc, 0xe5, 0x9c, 0x88, 0x45, 0x12, 0x50, 0xe8, 0x52, 0x26, 0xb3, 0x44, 0xa5, 0x6c, 0xe4, 0xc5, 0x1e, 0x06, 0x5b, 0x87, 0xf7, 0xec, 0x73, 0x23, 0x59, 0xa9, 0xc8, 0xa3, 0x18, 0x4f, + 0xcc, 0xbb, 0xfe, 0x44, 0x85, 0x2b, 0x30, 0xee, 0x59, 0x03, 0x2f, 0xe9, 0x8c, 0x71, 0x8e, 0x5d, 0x83, 0xaf, 0x56, 0x87, 0xc7, 0x73, 0x84, 0x5e, 0xe7, 0xc6, 0x77, 0x35, 0x6c, 0xe1, 0x3f, 0xe8, + 0x03, 0x41, 0xc7, 0xaf, 0x64, 0x9f, 0xe7, 0xdf, 0xad, 0x7a, 0xed, 0x95, 0xda, 0xcf, 0x33, 0xb0, 0xa2, 0x8e, 0x7e, 0x2c, 0x38, 0x64, 0x2b, 0x71, 0x59, 0x22, 0xfb, 0x73, 0xb8, 0x58, 0x38, 0x31, + 0x9f, 0x45, 0x25, 0xb8, 0xb7, 0xd0, 0x99, 0x27, 0x98, 0x55, 0x86, 0xa6, 0x24, 0x96, 0x28, 0xd2, 0x0c, 0xdf, 0x1e, 0xf4, 0x2e, 0xa2, 0xa7, 0x42, 0xac, 0xba, 0x98, 0x2a, 0x19, 0xc9, 0xb6, 0xdf, + 0xb0, 0x94, 0x0f, 0x79, 0x3e, 0x89, 0x96, 0xfc, 0x14, 0xeb, 0xdb, 0x6e, 0x77, 0x40, 0xe6, 0xca, 0x3a, 0x1d, 0x63, 0x3f, 0x49, 0x8c, 0xf4, 0x22, 0xd3, 0x7f, 0x1b, 0xc6, 0xf5, 0xc8, 0xf2, 0xf5, + 0x86, 0xee, 0x15, 0x90, 0x97, 0xd6, 0x38, 0x4b, 0xc4, 0x94, 0x07, 0x58, 0x85, 0x8c, 0x12, 0xb2, 0xc1, 0x0a, 0x8f, 0x5c, 0x9c, 0x8f, 0xb4, 0x7c, 0x6c, 0x57, 0x66, 0x19, 0xeb, 0xd6, 0x07, 0xed, + 0xe0, 0x4b, 0xbe, 0xdd, 0xaf, 0xc7, 0xf2, 0x11, 0x5d, 0xc3, 0x8d, 0xe4, 0xe5, 0xb5, 0xaf, 0x07, 0x13, 0x78, 0x9c, 0xbe, 0x81, 0x2a, 0x48, 0x85, 0xf5, 0xf8, 0xcd, 0x09, 0xdb, 0x50, 0xb5, 0xe5, + 0x2a, 0xd2, 0x40, 0x79, 0xd0, 0x54, 0xb0, 0xe4, 0x4e, 0xb7, 0xcd, 0x6e, 0xc1, 0x16, 0xbe, 0x03, 0x9e, 0xf4, 0x28, 0x5b, 0x9f, 0xc3, 0x14, 0x44, 0x0f, 0x4b, 0xa6, 0xab, 0xc5, 0xb9, 0x56, 0xab, + 0xcb, 0x7e, 0x86, 0x8a, 0x54, 0x2d, 0x9d, 0x73, 0xeb, 0x3c, 0x9f, 0x33, 0x5e, 0x0b, 0x48, 0x88, 0x84, 0x0f, 0x10, 0xa4, 0x6f, 0x44, 0x71, 0x0c, 0x43, 0x99, 0x38, 0xb5, 0x9f, 0xd9, 0xf7, 0x37, + 0xe5, 0x47, 0xa2, 0xc4, 0x9e, 0x68, 0x5e, 0x41, 0xb8, 0x1e, 0x8d, 0x89, 0x08, 0x83, 0x27, 0xca, 0x3e, 0x89, 0xe0, 0x54, 0x3f, 0xb2, 0x10, 0x69, 0xf5, 0x7b, 0x3d, 0x51, 0x32, 0xc1, 0x64, 0xb0, + 0xa3, 0x01, 0x8a, 0xd8, 0x88, 0x7e, 0x04, 0x56, 0x99, 0x3d, 0x57, 0x14, 0xf8, 0x9a, 0x61, 0x7c, 0x24, 0x18, 0xf3, 0x95, 0xec, 0xa5, 0x37, 0x2f, 0x8d, 0xab, 0x11, 0x69, 0x44, 0x0c, 0x56, 0xbe, + 0x4b, 0xce, 0x1d, 0xa8, 0x1e, 0xad, 0x4e, 0x5d, 0xe6, 0xcc, 0xd4, 0x58, 0x4f, 0x0b, 0x10, 0x52, 0xc5, 0x6e, 0x2b, 0x0c, 0x5e, 0xc8, 0x1e, 0x36, 0xd4, 0x00, 0x19, 0x19, 0xd4, 0xd9, 0x45, 0x5e, + 0x96, 0x67, 0xc6, 0xc0, 0xb4, 0xb4, 0xdf, 0x5a, 0x67, 0xd2, 0x95, 0x77, 0x7a, 0x49, 0xb5, 0x99, 0x4f, 0x29, 0x30, 0x14, 0x2d, 0xfd, 0x19, 0x6d, 0x0a, 0xd6, 0x4a, 0x89, 0xf0, 0x6e, 0xe5, 0x9d, + 0x1e, 0xac, 0x65, 0x69, 0x96, 0x86, 0xe5, 0xdc, 0x44, 0xd5, 0x4f, 0x29, 0xab, 0xf3, 0xc0, 0xca, 0x5e, 0xab, 0x31, 0x20, 0x7f, 0x90, 0x37, 0xbe, 0x5f, 0x23, 0xf6, 0x8e, 0xb7, 0x3f, 0xbf, 0xb7, + 0x7d, 0xdc, 0x88, 0x3e, 0xb2, 0x7d, 0xbc, 0x50, 0x07, 0x27, 0xaf, 0xc7, 0x93, 0x2b, 0xbd, 0x71, 0x9b, 0x08, 0x97, 0xb3, 0xdb, 0xd0, 0xed, 0xac, 0x39, 0x73, 0x34, 0xa7, 0x92, 0x13, 0x78, 0x87, + 0x0a, 0x49, 0xe8, 0xcd, 0x59, 0x3d, 0x4a, 0xe7, 0x59, 0x23, 0x21, 0x99, 0x64, 0xcd, 0xa6, 0xd4, 0x74, 0xe5, 0x50, 0xbb, 0xda, 0x81, 0x00, 0xed, 0x38, 0x0b, 0x3b, 0x78, 0xa3, 0x38, 0x36, 0xe3, + 0x37, 0x07, 0x4e, 0x8a, 0x56, 0xe1, 0x5e, 0x3b, 0xf3, 0x02, 0x9a, 0xe6, 0xf3, 0x69, 0xdc, 0x1c, 0xfc, 0xa5, 0xc6, 0x72, 0xb6, 0xf7, 0xf8, 0x26, 0x12, 0x24, 0xf7, 0x23, 0x05, 0x1f, 0xc9, 0x34, + 0x7d, 0x21, 0x78, 0x9d, 0x9d, 0xc9, 0x45, 0x92, 0x1f, 0x95, 0x6b, 0xba, 0x87, 0x94, 0x94, 0xaa, 0xf2, 0x35, 0xd0, 0x35, 0x1b, 0x58, 0x24, 0xf6, 0xa4, 0x97, 0x9a, 0x86, 0xec, 0x51, 0x52, 0xef, + 0x63, 0x82, 0xb0, 0x32, 0x49, 0x6e, 0xbf, 0x16, 0x12, 0xf6, 0xc4, 0x05, 0x12, 0x8b, 0xed, 0x38, 0x31, 0x8f, 0xdb, 0x20, 0x4c, 0x01, 0x21, 0x4a, 0xb4, 0x24, 0xd9, 0x79, 0x12, 0x41, 0x25, 0x16, + 0x09, 0x85, 0x08, 0x6b, 0x3a, 0x87, 0xc5, 0xae, 0x2a, 0xab, 0xce, 0x90, 0x9d, 0x51, 0xcb, 0xcd, 0xe5, 0x25, 0xed, 0x7b, 0x71, 0x2d, 0xf0, 0x1f, 0xec, 0x91, 0x0a, 0xc1, 0x4f, 0x44, 0x9f, 0x31, + 0xb0, 0xcd, 0xc9, 0x8d, 0xd0, 0xcf, 0x38, 0x80, 0x82, 0x78, 0x70, 0xb7, 0x65, 0x25, 0xd1, 0x8a, 0xb3, 0x22, 0xb5, 0x7a, 0x21, 0x79, 0x95, 0x72, 0x6a, 0x9d, 0x66, 0x0b, 0x60, 0xfb, 0x30, 0xd4, + 0x7a, 0x43, 0x86, 0xfb, 0x9a, 0x87, 0x39, 0x7e, 0x11, 0x92, 0x2b, 0xbb, 0x8f, 0xe9, 0xb8, 0x77, 0x06, 0x61, 0x7b, 0xf6, 0x87, 0x8d, 0xd2, 0x93, 0x25, 0x56, 0xea, 0xcb, 0xcd, 0x4c, 0x07, 0x89, + 0x38, 0xe2, 0xe6, 0x41, 0xbd, 0xb7, 0x40, 0x21, 0xc9, 0x3f, 0x19, 0xa1, 0xde, 0xd5, 0x2f, 0xfc, 0x7a, 0x9b, 0x84, 0xff, 0x20, 0x7f, 0xef, 0xd8, 0xf7, 0x4a, 0xf7, 0xb9, 0xeb, 0xd7, 0xc6, 0xe4, + 0x46, 0xee, 0xe7, 0xde, 0x6f, 0xd6, 0x7e, 0x91, 0xce, 0x8d, 0x6a, 0x3d, 0x1d, 0x18, 0x60, 0x5f, 0x25, 0x51, 0xd1, 0xac, 0xe8, 0xfe, 0xb0, 0x67, 0x1b, 0xdd, 0x96, 0x55, 0x9c, 0x6e, 0xe4, 0x74, + 0x8f, 0x28, 0x16, 0x99, 0x37, 0xb2, 0x2c, 0x03, 0xd4, 0x10, 0x48, 0xf8, 0x4c, 0xc3, 0x9b, 0x93, 0x9f, 0xdb, 0x2d, 0xa6, 0x6d, 0x31, 0x85, 0xc7, 0x2d, 0x22, 0x88, 0x83, 0x40, 0x3b, 0x49, 0xde, + 0x06, 0x4c, 0x37, 0xf2, 0x36, 0x27, 0x47, 0xe8, 0x59, 0x5f, 0x27, 0xc1, 0xf3, 0x88, 0xdf, 0xfb, 0x50, 0xde, 0x27, 0xe0, 0xfe, 0xe7, 0xc4, 0xc6, 0xf7, 0xa4, 0x6f, 0xe8, 0xbd, 0x39, 0x31, 0x56, + 0x6c, 0x0c, 0x71, 0xd6, 0xaa, 0xd3, 0x68, 0x45, 0x1a, 0x89, 0xab, 0x80, 0x05, 0xbe, 0xf2, 0x92, 0xcc, 0x88, 0x61, 0x0f, 0x91, 0x57, 0x8b, 0xcd, 0xae, 0x34, 0xc4, 0x3a, 0xe9, 0xa1, 0x4d, 0xbe, + 0x2e, 0xa2, 0xde, 0xa7, 0xfd, 0x35, 0x18, 0x6f, 0xf6, 0x31, 0x9c, 0xf2, 0xb9, 0x8c, 0xe1, 0xbe, 0x62, 0x94, 0x9d, 0xc0, 0x1e, 0xc4, 0xec, 0xc4, 0x06, 0x49, 0x6a, 0xeb, 0x98, 0xcc, 0x41, 0xbb, + 0x55, 0xdf, 0xf4, 0x63, 0x7c, 0x04, 0xde, 0x96, 0xcf, 0xf9, 0x5a, 0x0a, 0x7a, 0x6c, 0xb3, 0x7b, 0xa2, 0x7a, 0x05, 0xe4, 0xe9, 0x78, 0x6c, 0xd9, 0xe6, 0x61, 0xb3, 0x52, 0x64, 0xd6, 0x1f, 0x0a, + 0x69, 0x7b, 0x3c, 0x78, 0xf5, 0x94, 0xa6, 0x50, 0x49, 0x6d, 0x88, 0x13, 0x5a, 0xf6, 0x18, 0xdf, 0xb6, 0xab, 0x76, 0x7f, 0x6c, 0x0f, 0x59, 0xe6, 0xe5, 0x5d, 0xb6, 0x64, 0xc4, 0xa3, 0x0c, 0x0c, + 0x4c, 0xb9, 0x83, 0x56, 0xbb, 0xac, 0x06, 0x06, 0x71, 0x6e, 0xcf, 0x45, 0xb2, 0xc1, 0x7c, 0x15, 0xcd, 0x4f, 0x6e, 0x4d, 0x44, 0x27, 0x9a, 0xb6, 0x0a, 0x1f, 0x3a, 0x3e, 0x66, 0x6c, 0xba, 0x6e, + 0x75, 0x13, 0xa7, 0xcf, 0x8d, 0xf4, 0x19, 0x90, 0x6b, 0xf2, 0x0f, 0xf2, 0xde, 0x3c, 0x4b, 0x83, 0x24, 0xb8, 0x6b, 0x0e, 0xb9, 0x70, 0x2e, 0x7f, 0xef, 0x0e, 0xfe, 0x4c, 0xf4, 0x19, 0xca, 0xa0, + 0xaa, 0xaf, 0xda, 0x98, 0x11, 0xee, 0xe0, 0x0b, 0x7e, 0x9a, 0x0a, 0x47, 0xad, 0xdc, 0xd1, 0x33, 0x76, 0xab, 0xcb, 0x07, 0xb4, 0x77, 0x74, 0x99, 0x74, 0x13, 0x5e, 0xa4, 0x3d, 0x22, 0x3d, 0x09, + 0xc9, 0x86, 0x3b, 0x58, 0x5e, 0xb5, 0x71, 0x8c, 0x6d, 0x55, 0x4b, 0xe0, 0x51, 0x64, 0x94, 0x7c, 0x59, 0x95, 0xb8, 0xe8, 0xab, 0xbe, 0xaf, 0x7a, 0x84, 0x0b, 0x14, 0xf5, 0x86, 0x6a, 0x02, 0x1d, + 0x90, 0x8e, 0x7d, 0xc4, 0x9c, 0x2c, 0x6f, 0xad, 0x6e, 0x3f, 0x05, 0x6e, 0x27, 0xf7, 0x17, 0xa3, 0x87, 0x78, 0xf6, 0xeb, 0x1a, 0x54, 0x8d, 0xe3, 0xd0, 0x15, 0x2f, 0x68, 0x4a, 0xb7, 0x9b, 0xb5, + 0x49, 0x97, 0xcf, 0xec, 0xa9, 0x9b, 0x2c, 0x17, 0x58, 0xe8, 0x30, 0x4a, 0x4c, 0x8d, 0x70, 0x76, 0x48, 0x8d, 0xba, 0x29, 0x8d, 0xf8, 0x5a, 0x4e, 0xdd, 0xb8, 0x9b, 0x07, 0x0f, 0x7e, 0xa8, 0xd6, + 0xfc, 0x07, 0xda, 0xe0, 0xe4, 0xe3, 0x99, 0x2b, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x25, 0x01, 0x92, 0xb5, 0x7d, 0x5c, 0x0d, 0x5d, 0x5a, 0x4a, 0x55, 0xde, 0x9a, 0xed, 0x4e, 0x5d, 0xc3, 0x66, 0x2e, + 0x8d, 0x28, 0x61, 0x98, 0x66, 0xb6, 0x33, 0xc9, 0xaa, 0x49, 0x53, 0x07, 0xdf, 0xa4, 0xa9, 0x46, 0x1f, 0x98, 0x93, 0xef, 0x28, 0x5f, 0xfa, 0xf6, 0xb6, 0x7d, 0x95, 0x36, 0x47, 0xcc, 0x4e, 0x73, + 0xbd, 0x59, 0xc7, 0x11, 0xe0, 0xcf, 0x00, 0x12, 0x9c, 0x1d, 0xd2, 0x06, 0xad, 0x64, 0xbe, 0x5e, 0x10, 0x53, 0x32, 0xe8, 0xa6, 0x07, 0x70, 0x13, 0x55, 0x8c, 0xcf, 0xf1, 0xce, 0xb4, 0x61, 0x85, + 0x25, 0x24, 0xfa, 0xe7, 0xf5, 0x92, 0xf4, 0xb7, 0x3c, 0xe1, 0x9a, 0xd6, 0xd0, 0xc0, 0x94, 0x29, 0x36, 0x46, 0x18, 0x6b, 0xa7, 0x74, 0x1f, 0x87, 0xd0, 0xda, 0x67, 0x32, 0xa4, 0x20, 0x23, 0xc8, + 0x31, 0x3f, 0x6d, 0x99, 0x97, 0x57, 0x4b, 0xee, 0x5a, 0xd5, 0x1f, 0xab, 0xfa, 0xfc, 0x44, 0xf3, 0xa9, 0xe3, 0x49, 0x96, 0x8e, 0xa9, 0xfa, 0x7c, 0xe9, 0x32, 0x01, 0x86, 0x45, 0xad, 0xb7, 0x1b, + 0x3b, 0x82, 0xa6, 0x48, 0xae, 0xa4, 0x0c, 0x32, 0x5b, 0xaf, 0xe0, 0x29, 0x27, 0x4f, 0x97, 0xb2, 0x3e, 0xe3, 0x44, 0x5d, 0x19, 0xc0, 0xe1, 0x00, 0x37, 0xce, 0x96, 0x30, 0x32, 0x05, 0x58, 0xf7, + 0xa4, 0x01, 0xc7, 0x8a, 0xbe, 0xaf, 0xd5, 0x73, 0xcb, 0xfa, 0x90, 0x2b, 0x61, 0x67, 0x16, 0x83, 0x19, 0xe6, 0x14, 0x47, 0x4a, 0xb6, 0x0a, 0x77, 0xc4, 0x29, 0xce, 0xee, 0x55, 0x10, 0xff, 0x61, + 0x69, 0xb3, 0xfc, 0x2c, 0x0a, 0x6c, 0xe3, 0xa6, 0xe4, 0x41, 0xdf, 0xd5, 0x32, 0xbe, 0x92, 0x31, 0x1b, 0xef, 0xe5, 0xd2, 0xbb, 0x1a, 0xca, 0x5f, 0x65, 0x4c, 0xfc, 0xa2, 0xa0, 0xc5, 0x0f, 0x75, + 0xd9, 0xf2, 0xaa, 0x2e, 0x1d, 0xe7, 0x4f, 0xe9, 0x24, 0xc3, 0x9b, 0x55, 0xf5, 0xcd, 0x0d, 0x6f, 0x54, 0x50, 0xf8, 0x1f, 0xf2, 0x3d, 0xed, 0xaa, 0xc9, 0xf3, 0xac, 0xac, 0xab, 0x89, 0x95, 0xc5, + 0xd9, 0xf3, 0x3d, 0xf8, 0x7b, 0x43, 0x69, 0x9d, 0x35, 0x2f, 0xcf, 0xfe, 0x60, 0x84, 0x6d, 0x52, 0xdb, 0x71, 0x2b, 0xc3, 0xbd, 0xd9, 0xee, 0x90, 0x8f, 0x39, 0x9b, 0x9a, 0xfc, 0x9a, 0xe2, 0x20, + 0xcd, 0xea, 0xc0, 0x0d, 0x9e, 0x5e, 0x01, 0xfb, 0xdb, 0x14, 0xa3, 0xcf, 0x00, 0xde, 0x93, 0x62, 0x3e, 0xc2, 0x3a, 0x7e, 0xf2, 0x5d, 0x29, 0x83, 0x93, 0xdb, 0xff, 0xc9, 0x95, 0xce, 0x38, 0xe9, + 0x25, 0x71, 0x62, 0x20, 0x74, 0xc9, 0xb4, 0xac, 0xd9, 0x18, 0x97, 0x52, 0x58, 0xee, 0x31, 0xe2, 0x3c, 0xdb, 0xa9, 0x1c, 0x93, 0xd3, 0x66, 0x7b, 0x76, 0xce, 0x95, 0x43, 0xe6, 0xe4, 0xb6, 0x58, + 0x0b, 0x89, 0x9d, 0xad, 0x23, 0x4a, 0xd2, 0x24, 0x7c, 0x3f, 0xec, 0x8d, 0x9e, 0x4d, 0xb4, 0x96, 0x38, 0xe8, 0xd0, 0x66, 0x60, 0xb9, 0x19, 0xec, 0x57, 0xf3, 0xb5, 0x4d, 0x30, 0x6b, 0xdf, 0x5b, + 0x1f, 0xea, 0xd3, 0x37, 0x35, 0xa3, 0x3e, 0x74, 0xee, 0x9e, 0xf5, 0x35, 0xa9, 0x9e, 0x86, 0xe1, 0x4d, 0x00, 0xf6, 0xaf, 0x5f, 0xf7, 0xac, 0x9e, 0x5f, 0x94, 0x1b, 0xf8, 0xf5, 0x09, 0xda, 0x47, + 0x2d, 0x9d, 0x5f, 0x95, 0x1d, 0xf8, 0xec, 0x73, 0xf7, 0xeb, 0x2b, 0x80, 0xe1, 0x49, 0x6d, 0xef, 0x8e, 0xe8, 0x7c, 0xa9, 0x97, 0xc1, 0xe6, 0x94, 0xb8, 0xc2, 0xd2, 0x8d, 0xb3, 0x15, 0x45, 0xc6, + 0x4a, 0xd3, 0x42, 0x23, 0x04, 0xbc, 0xb7, 0x5f, 0xce, 0x47, 0x90, 0x3e, 0x31, 0xf8, 0x0f, 0x75, 0xee, 0x75, 0x5f, 0xfd, 0xa8, 0x41, 0xf9, 0x75, 0x6f, 0xc6, 0x54, 0xcb, 0x48, 0xea, 0x01, 0x25, + 0xe4, 0xeb, 0x64, 0x46, 0xf0, 0x2a, 0x42, 0x66, 0x33, 0x6c, 0x41, 0x2f, 0xd8, 0xed, 0x62, 0xae, 0xeb, 0xd8, 0x1e, 0x53, 0x0b, 0x67, 0x29, 0xaa, 0xf3, 0x96, 0xa0, 0xea, 0x03, 0x10, 0x9a, 0x68, + 0x1b, 0x81, 0xbb, 0xc1, 0xe0, 0x4e, 0x12, 0x24, 0x1d, 0xb8, 0xe1, 0x54, 0x27, 0xdb, 0x3d, 0x0f, 0x99, 0x80, 0x61, 0x1f, 0x0f, 0x6c, 0x6b, 0x56, 0xb0, 0xc4, 0x1a, 0x2b, 0x64, 0x94, 0xd2, 0xf4, + 0xab, 0x85, 0xe0, 0x1e, 0x24, 0x1f, 0x97, 0x87, 0xf1, 0x90, 0x7c, 0xd4, 0x27, 0x5f, 0x29, 0x8d, 0x84, 0xc6, 0x68, 0x0c, 0xc6, 0x05, 0x25, 0xdd, 0x56, 0xbc, 0x72, 0x7b, 0x10, 0xb4, 0xd5, 0xae, + 0xce, 0x55, 0x03, 0x0e, 0x76, 0x01, 0x67, 0x19, 0x8e, 0x19, 0x70, 0x32, 0x4c, 0x6f, 0xec, 0x5c, 0x8e, 0x4f, 0x2b, 0x24, 0x9e, 0xb7, 0x4e, 0x2f, 0xdb, 0x2a, 0x8e, 0x57, 0xa9, 0xb4, 0x18, 0x38, + 0x52, 0x3e, 0xe7, 0x8d, 0x5d, 0x98, 0xf3, 0x35, 0x54, 0xa8, 0x0b, 0x57, 0x34, 0xaa, 0x95, 0x3d, 0x08, 0xcc, 0x72, 0x54, 0x01, 0xb6, 0xef, 0xd6, 0xc1, 0xfb, 0x10, 0xe1, 0x0f, 0x7e, 0x12, 0xef, + 0x1f, 0x71, 0x81, 0xea, 0xdd, 0x89, 0x09, 0xfe, 0xc9, 0x8a, 0xfb, 0xeb, 0x1e, 0x64, 0x72, 0xa8, 0x84, 0x9d, 0xad, 0xae, 0x6b, 0x0c, 0xa2, 0xf8, 0x75, 0x30, 0x2b, 0xe6, 0x2a, 0x96, 0x1d, 0xb9, + 0xca, 0x3b, 0x22, 0x6c, 0x31, 0x5b, 0x9e, 0x2b, 0x44, 0xca, 0xa3, 0x04, 0x33, 0x64, 0xcd, 0x0c, 0x13, 0x40, 0x67, 0x4f, 0xac, 0x75, 0xc2, 0xf6, 0xee, 0x42, 0x38, 0x94, 0x58, 0xc3, 0x0b, 0x7a, + 0x62, 0x40, 0xce, 0x80, 0xb9, 0x78, 0xec, 0x6d, 0xcb, 0x88, 0x86, 0x0c, 0x15, 0x92, 0xf9, 0xec, 0x9b, 0xd9, 0x34, 0x72, 0xfd, 0x79, 0xb3, 0xa2, 0x7c, 0x28, 0x95, 0xf4, 0xeb, 0xfd, 0x2a, 0xf4, + 0x7f, 0xde, 0xfe, 0x7f, 0x65, 0x2f, 0xf2, 0x6f, 0x53, 0x06, 0x3f, 0xc0, 0x39, 0x66, 0x79, 0x7d, 0xe5, 0x2c, 0xf2, 0x7a, 0x54, 0x2e, 0x12, 0x78, 0x62, 0xda, 0x90, 0xdf, 0xee, 0xb3, 0x5e, 0x56, + 0x9b, 0xbd, 0x95, 0xa2, 0x8a, 0xef, 0x06, 0x09, 0x85, 0x6a, 0x6b, 0x02, 0xf8, 0x5a, 0xdd, 0xf9, 0xe6, 0x8d, 0xbe, 0x74, 0x5e, 0x32, 0xcd, 0xf2, 0x7a, 0xef, 0xbd, 0xbc, 0xa0, 0x69, 0x56, 0x26, + 0x46, 0x1c, 0x9c, 0xbf, 0x55, 0xd8, 0x3f, 0xe6, 0xfb, 0xfc, 0x9e, 0xf4, 0x15, 0x86, 0xb7, 0x27, 0xc6, 0x78, 0x40, 0x5f, 0xf9, 0x2c, 0x47, 0xaf, 0xf0, 0x6d, 0x85, 0x9e, 0xea, 0x79, 0x50, 0xad, + 0x4e, 0xf9, 0x74, 0x8f, 0x2c, 0x8f, 0x03, 0x65, 0x17, 0x51, 0xbe, 0x0c, 0x30, 0x5a, 0xd9, 0x9f, 0xd1, 0xa5, 0x51, 0x04, 0x2c, 0xe1, 0x9c, 0x1b, 0x13, 0xc2, 0x61, 0x84, 0xdd, 0x9f, 0x6b, 0xf5, + 0xd8, 0x1d, 0x69, 0x62, 0x4e, 0xac, 0x39, 0x53, 0x8e, 0x34, 0x44, 0x4a, 0x4d, 0x30, 0x61, 0xb0, 0x93, 0x96, 0x85, 0xf3, 0x5d, 0x67, 0x75, 0xdb, 0x31, 0x56, 0xd8, 0xd7, 0xd7, 0x6d, 0xca, 0x7b, + 0x8e, 0xf7, 0xd8, 0x1f, 0xfc, 0x01, 0x45, 0xc3, 0x3b, 0xca, 0xef, 0x80, 0x69, 0xca, 0xf8, 0xea, 0x4c, 0x31, 0x42, 0xcd, 0x30, 0x3d, 0xea, 0xf3, 0xc5, 0x6e, 0x25, 0xdb, 0x42, 0xe9, 0x1e, 0xf2, + 0xa5, 0x47, 0x01, 0xf0, 0x5a, 0x58, 0x7b, 0x53, 0x94, 0x26, 0xce, 0x2c, 0x64, 0xa8, 0xbc, 0xb2, 0x88, 0x3a, 0xf8, 0xb4, 0xe8, 0x5a, 0x11, 0xdb, 0xc7, 0xfa, 0xd0, 0x1d, 0x09, 0x63, 0xeb, 0xe1, + 0xa2, 0x0b, 0xcd, 0x72, 0x50, 0xf2, 0x2c, 0x73, 0xdf, 0x61, 0x5b, 0xa1, 0x6f, 0xf9, 0x93, 0xca, 0x3b, 0x8d, 0xd7, 0xf1, 0x73, 0x15, 0x9a, 0x8d, 0xc1, 0xe5, 0x29, 0x37, 0x80, 0x51, 0x55, 0x81, + 0x77, 0x8f, 0x17, 0xc7, 0x1e, 0x4a, 0xcf, 0xf4, 0x8e, 0x32, 0x38, 0x79, 0xdf, 0xbe, 0x16, 0x3c, 0xf8, 0xd1, 0xeb, 0x79, 0x2d, 0x27, 0x75, 0x8f, 0xeb, 0x9a, 0x4f, 0x81, 0x33, 0x75, 0xdb, 0x1e, + 0xe5, 0xaa, 0x5c, 0xb7, 0x64, 0x85, 0xcc, 0x97, 0xfc, 0x07, 0x61, 0xe2, 0x89, 0x78, 0x90, 0x56, 0xf9, 0x77, 0xa9, 0x15, 0x1e, 0xf1, 0x7a, 0x7c, 0x4f, 0xfa, 0xb5, 0x23, 0x4f, 0x27, 0x26, 0xf0, + 0x38, 0x8f, 0x47, 0x83, 0xcc, 0xd9, 0x95, 0xed, 0xc3, 0x3d, 0xb7, 0x9e, 0x79, 0x87, 0x61, 0x7f, 0x5c, 0x7a, 0x5b, 0xbe, 0x07, 0xfb, 0x8e, 0xd1, 0xab, 0x48, 0x80, 0x8f, 0x36, 0xe1, 0x78, 0x9a, + 0x26, 0xa0, 0xac, 0xbd, 0x3b, 0x61, 0x3a, 0x2f, 0x09, 0x2c, 0x73, 0x3c, 0x2c, 0x00, 0xbf, 0x1b, 0x90, 0xed, 0x71, 0x0e, 0xd0, 0x31, 0xb0, 0x1f, 0xb6, 0xea, 0x4c, 0x48, 0xbb, 0x33, 0x18, 0x0e, + 0x3e, 0x58, 0x34, 0x35, 0x77, 0x1c, 0x63, 0xc2, 0x7b, 0x7e, 0xdd, 0xef, 0x0c, 0x40, 0x7f, 0x1f, 0x37, 0xfb, 0x42, 0xf5, 0x0d, 0x20, 0x37, 0x23, 0xd0, 0x88, 0xb8, 0xd9, 0xda, 0x19, 0x8a, 0x6d, + 0xbb, 0x38, 0x9d, 0xb7, 0x51, 0x81, 0xd3, 0xd3, 0x28, 0xa0, 0x16, 0xca, 0x69, 0x36, 0x85, 0x90, 0x23, 0xbb, 0x43, 0x8a, 0xa8, 0x4f, 0xec, 0x19, 0x96, 0x6e, 0x5d, 0xa0, 0x0b, 0xc5, 0xed, 0xec, + 0xe4, 0xf5, 0xe7, 0xf9, 0x49, 0x17, 0xe6, 0x7d, 0xce, 0x14, 0x53, 0xbe, 0x65, 0x29, 0x3e, 0xf1, 0x4f, 0x42, 0x09, 0xac, 0xa9, 0x0e, 0xa5, 0x05, 0x6c, 0xaa, 0xf4, 0x28, 0xa1, 0x11, 0xea, 0x63, + 0x36, 0x13, 0xdb, 0x71, 0x83, 0xd4, 0x99, 0xe4, 0x65, 0x96, 0x3b, 0x65, 0x1d, 0x38, 0xcf, 0x1e, 0xb8, 0xf0, 0x7b, 0xd1, 0xe3, 0xcb, 0x08, 0x4f, 0x68, 0x92, 0x3a, 0x7d, 0x7d, 0xcf, 0x25, 0xe6, + 0x09, 0x95, 0x6f, 0xfd, 0x61, 0xfe, 0x83, 0xef, 0xea, 0xc9, 0x19, 0xe6, 0x4d, 0xeb, 0x8a, 0xfe, 0x88, 0xb5, 0x46, 0x68, 0x66, 0xec, 0xfe, 0x28, 0x1e, 0xf9, 0x32, 0x5e, 0xab, 0xa2, 0xbb, 0xe2, + 0xce, 0x0c, 0x61, 0xe6, 0x52, 0x83, 0xd6, 0x5a, 0x8d, 0xf6, 0x6d, 0x28, 0xd8, 0xbb, 0xb5, 0x0c, 0x2c, 0x9c, 0x03, 0x14, 0x0b, 0x26, 0xc6, 0x51, 0xa7, 0x1d, 0x09, 0xcd, 0x0d, 0xa6, 0xf7, 0x1b, + 0xc1, 0x6b, 0xf6, 0x88, 0xba, 0x04, 0x96, 0x61, 0x34, 0xf0, 0x9d, 0x78, 0xae, 0x04, 0x5c, 0x8f, 0xea, 0x75, 0xe2, 0xfa, 0x9f, 0x33, 0xa7, 0xde, 0x5e, 0xec, 0xcf, 0x8f, 0x0b, 0xcb, 0xdf, 0xdb, + 0x1e, 0xdf, 0x51, 0x7e, 0x81, 0xe0, 0xcf, 0x9b, 0x85, 0x65, 0x44, 0x50, 0x67, 0xd0, 0x1f, 0x90, 0x2d, 0x7e, 0x58, 0xa9, 0xd5, 0x2c, 0x1f, 0x82, 0xa3, 0xa4, 0x71, 0xc9, 0x09, 0x40, 0xd8, 0x55, + 0xae, 0xaa, 0x0e, 0xbe, 0x0e, 0x50, 0x1e, 0x70, 0x31, 0x07, 0x30, 0x36, 0x8b, 0xd9, 0xca, 0xc8, 0x70, 0x23, 0x59, 0xec, 0x4e, 0xc4, 0x06, 0x12, 0x45, 0xc2, 0x02, 0xb7, 0x47, 0x8a, 0x76, 0x30, + 0xb2, 0xa9, 0xe7, 0x3d, 0xb2, 0xdc, 0x52, 0x53, 0xbf, 0x5f, 0xd2, 0x84, 0xba, 0x4f, 0xb8, 0xe6, 0xa1, 0xa0, 0xce, 0x77, 0x12, 0xf0, 0xc8, 0xe9, 0xf8, 0x75, 0x00, 0xf8, 0x9b, 0x1b, 0xde, 0x4f, + 0xbe, 0xdf, 0xdf, 0x55, 0x0c, 0xcc, 0xd2, 0x49, 0xea, 0xd4, 0x93, 0x38, 0xa8, 0x6a, 0xe7, 0xde, 0x40, 0x3d, 0x66, 0x24, 0x7e, 0x47, 0xf9, 0x32, 0x50, 0x6f, 0xdb, 0x63, 0x0c, 0xc6, 0x57, 0xa5, + 0x33, 0xbc, 0xda, 0x69, 0x03, 0x55, 0x81, 0xbb, 0xd8, 0xa2, 0x5b, 0xe6, 0xd8, 0x71, 0xea, 0x3e, 0x89, 0x44, 0x86, 0xb7, 0x7b, 0x8c, 0xdb, 0x37, 0xeb, 0x36, 0xce, 0xe6, 0xa9, 0xac, 0x6d, 0x90, + 0xad, 0x4d, 0xd3, 0x73, 0xd8, 0xa8, 0x34, 0x6c, 0x55, 0xbb, 0xbe, 0xda, 0x39, 0xe8, 0xf1, 0x14, 0xa5, 0x5b, 0x23, 0x9a, 0x1d, 0x74, 0x26, 0x35, 0xcf, 0x7e, 0x8d, 0xac, 0xc3, 0x0e, 0xe5, 0x61, + 0xb6, 0x58, 0x7c, 0x52, 0x46, 0x3d, 0x25, 0x63, 0xff, 0xe7, 0xd4, 0x8c, 0x17, 0x82, 0xd7, 0x2e, 0x5b, 0x23, 0x15, 0x8a, 0x27, 0xa6, 0x32, 0x72, 0xf4, 0x74, 0x5a, 0x1d, 0xab, 0x9d, 0x58, 0x2d, + 0xa6, 0xe9, 0x62, 0x4e, 0x90, 0x38, 0xaa, 0x1a, 0xd3, 0xaf, 0x23, 0x7c, 0x7e, 0x98, 0x67, 0x3f, 0xe6, 0x90, 0xcf, 0xf2, 0x3a, 0xc8, 0x52, 0xa3, 0xbe, 0xeb, 0xe8, 0x02, 0x3d, 0x94, 0xd5, 0xfa, + 0x95, 0xec, 0xa5, 0xf7, 0x2f, 0x8d, 0x09, 0x34, 0x2e, 0xaf, 0x35, 0x89, 0xed, 0x62, 0x0d, 0x5f, 0xcc, 0x53, 0xbf, 0xc0, 0xc2, 0x5d, 0xaf, 0x1c, 0x25, 0x8e, 0x31, 0x76, 0x5d, 0xa9, 0x08, 0x2a, + 0x5f, 0x54, 0xcb, 0x2a, 0x38, 0x11, 0xb3, 0x4d, 0x87, 0xa9, 0x1c, 0xe5, 0x27, 0x75, 0x02, 0x43, 0xdd, 0x1c, 0x1a, 0x72, 0x9d, 0xde, 0x76, 0xf8, 0x7a, 0x9d, 0x53, 0xb8, 0xa0, 0xf3, 0xe5, 0x14, + 0x06, 0x0a, 0x1b, 0xde, 0xb5, 0x2d, 0x2b, 0x74, 0x1e, 0x19, 0x86, 0xbb, 0xc5, 0x63, 0xae, 0x56, 0x57, 0x5f, 0xd8, 0xd7, 0xc2, 0xb8, 0xef, 0x3f, 0xc0, 0xab, 0x67, 0x7a, 0xec, 0xb4, 0x4e, 0x5a, + 0xf9, 0xb5, 0x13, 0xdc, 0x0c, 0x10, 0xc8, 0xbb, 0x7a, 0x04, 0xaf, 0x61, 0x2e, 0xb7, 0x90, 0x82, 0xf7, 0xe6, 0xf8, 0xbf, 0x8a, 0xf8, 0xf8, 0x1c, 0x92, 0xd0, 0x65, 0xa5, 0x3d, 0xb9, 0x8c, 0xf1, + 0xcb, 0xcf, 0xef, 0xa4, 0x72, 0xc9, 0x5a, 0xa7, 0x8c, 0x33, 0xc3, 0xbe, 0x2c, 0x29, 0xb5, 0xf3, 0x7d, 0x0e, 0x47, 0xe4, 0x91, 0xf1, 0xfe, 0x4c, 0xff, 0x32, 0xf0, 0x9f, 0xcf, 0x5e, 0x4d, 0x23, + 0x23, 0x66, 0x80, 0xb1, 0x16, 0xbd, 0x82, 0x54, 0xbd, 0xd8, 0x8e, 0xe8, 0xed, 0xd4, 0xca, 0xf1, 0x30, 0x9a, 0x81, 0x89, 0x2b, 0xcc, 0x9a, 0x20, 0x82, 0x04, 0xbd, 0x55, 0x0c, 0x3a, 0xce, 0x37, + 0xfe, 0xfe, 0x00, 0xb8, 0x4e, 0x5e, 0xa0, 0x9d, 0x36, 0x4b, 0x32, 0x79, 0x97, 0x6f, 0x42, 0x77, 0x49, 0xcc, 0x34, 0xbc, 0xeb, 0x0e, 0xd9, 0x32, 0x3b, 0x4a, 0x15, 0xe1, 0x48, 0x52, 0xe7, 0xba, + 0x3e, 0x5c, 0x60, 0x29, 0x30, 0xc2, 0x37, 0xd1, 0x68, 0xea, 0xcc, 0x32, 0xd2, 0xf4, 0xc9, 0x98, 0x84, 0x7d, 0x1c, 0xb1, 0xb7, 0x3e, 0xbd, 0xbf, 0x9f, 0x0a, 0xbd, 0x7d, 0x89, 0xf8, 0x87, 0x82, + 0xc1, 0xf7, 0x96, 0xd3, 0xbf, 0x5f, 0x52, 0xde, 0x12, 0x06, 0x27, 0xef, 0x9a, 0xd7, 0xc5, 0x74, 0x04, 0x13, 0x5a, 0x91, 0xa8, 0xda, 0x8b, 0x3a, 0x76, 0xce, 0x6b, 0xd8, 0xb1, 0x75, 0x4d, 0x3f, + 0xb7, 0x7e, 0xb1, 0x30, 0x88, 0xa6, 0x95, 0x2d, 0xb8, 0xed, 0x8e, 0x06, 0xc4, 0x41, 0xb4, 0x5d, 0xaf, 0x75, 0x4f, 0xe6, 0x67, 0x9b, 0x70, 0xba, 0x36, 0x1d, 0x73, 0x05, 0x6c, 0x22, 0x8f, 0xd3, + 0xad, 0xa9, 0x0f, 0xd0, 0x10, 0x2e, 0x71, 0xab, 0xad, 0x78, 0x88, 0x31, 0x23, 0x5c, 0xc2, 0x74, 0x22, 0x94, 0x8a, 0x1e, 0x8f, 0x61, 0x42, 0x3f, 0x04, 0x87, 0x7d, 0x05, 0x0a, 0xf1, 0x90, 0x43, + 0xfb, 0x5b, 0xc2, 0x17, 0x50, 0xde, 0x34, 0x27, 0xc4, 0xcf, 0x8e, 0xec, 0x17, 0x50, 0x22, 0xd4, 0xb4, 0x13, 0x24, 0x45, 0xf0, 0x3a, 0x1a, 0x7a, 0x2b, 0xdc, 0x73, 0x67, 0x1a, 0xef, 0xa9, 0xc8, + 0x55, 0xfa, 0x98, 0xb7, 0xbd, 0xca, 0x94, 0x4a, 0x68, 0x19, 0xe9, 0x56, 0xb7, 0xaa, 0xb6, 0xb9, 0x69, 0x10, 0x16, 0x1d, 0x16, 0xf3, 0x1a, 0xe6, 0x62, 0x6b, 0xee, 0x73, 0x6c, 0xdb, 0xaf, 0xd6, + 0xd6, 0x81, 0x86, 0x17, 0x0a, 0xdf, 0x74, 0x59, 0x10, 0xea, 0x08, 0xd1, 0x3b, 0x3d, 0xce, 0x3f, 0x16, 0x08, 0x76, 0xab, 0x50, 0xfe, 0xfb, 0x5f, 0xef, 0xeb, 0x91, 0x5f, 0x6f, 0xbf, 0xf5, 0x7c, + 0x62, 0x34, 0xb5, 0x7f, 0x0b, 0x73, 0xff, 0xfd, 0xea, 0x45, 0xfb, 0xd5, 0x8d, 0x37, 0x31, 0xf7, 0xf7, 0xbf, 0xf0, 0x8f, 0x77, 0xbc, 0x73, 0x21, 0x45, 0xfe, 0x4e, 0x79, 0xfe, 0xa3, 0xca, 0xef, + 0xbf, 0x2e, 0xa4, 0x2f, 0x35, 0x1f, 0xef, 0x6a, 0x9e, 0xfe, 0x7e, 0x91, 0xbd, 0x50, 0xbc, 0x4e, 0xee, 0x28, 0xbb, 0x69, 0x9e, 0x46, 0xac, 0xa3, 0x98, 0xbf, 0xa5, 0x29, 0x69, 0xc0, 0xce, 0xba, + 0xe5, 0xe0, 0x15, 0x36, 0xd8, 0x53, 0xf5, 0x9c, 0xe5, 0x45, 0xa7, 0xb4, 0xe0, 0xb0, 0x14, 0x7c, 0x05, 0xa6, 0x63, 0x4a, 0x38, 0x24, 0xf3, 0x02, 0x26, 0x09, 0x74, 0xe5, 0x70, 0x08, 0xc0, 0x76, + 0xca, 0xa1, 0x05, 0x62, 0x67, 0xe9, 0x6c, 0x61, 0x94, 0x49, 0x7d, 0xa4, 0x73, 0xcd, 0x22, 0xeb, 0x14, 0x49, 0x9d, 0xaf, 0x45, 0xe8, 0x8c, 0xd5, 0x86, 0xf6, 0xc9, 0xc4, 0xfc, 0xb1, 0x30, 0xd3, + 0xdd, 0x4e, 0x3f, 0xd0, 0xe7, 0x37, 0x94, 0xaf, 0x9d, 0x7f, 0xd3, 0x1e, 0xeb, 0xbd, 0xb1, 0x94, 0x11, 0xf6, 0xb4, 0xcb, 0x65, 0x85, 0x02, 0x33, 0x60, 0xd6, 0x51, 0x5a, 0x51, 0xbb, 0xba, 0x2e, + 0xb9, 0xc2, 0xee, 0xa4, 0x6b, 0x91, 0x19, 0xd8, 0xec, 0x34, 0xc2, 0xcb, 0x3c, 0x06, 0xfd, 0x39, 0xda, 0xd6, 0xab, 0x15, 0xed, 0x2e, 0x13, 0x64, 0xed, 0x06, 0x44, 0x71, 0x52, 0x00, 0x2b, 0x63, + 0x96, 0x51, 0x79, 0xe4, 0xf4, 0x59, 0xcf, 0xa2, 0xdb, 0xac, 0xc6, 0x23, 0xab, 0xda, 0xc5, 0x3e, 0xf0, 0x98, 0xa0, 0x79, 0x61, 0xfc, 0xab, 0xa0, 0x7e, 0xe3, 0x9f, 0x77, 0x6f, 0xff, 0xb8, 0xa6, + 0xd9, 0xbb, 0xca, 0x9b, 0x59, 0xdc, 0xdc, 0x8d, 0x8e, 0x79, 0x14, 0xd5, 0xf7, 0xc4, 0xaf, 0xc0, 0xbe, 0x3f, 0x35, 0x06, 0x5b, 0x78, 0xb2, 0x80, 0x9a, 0xbd, 0xb1, 0x12, 0x14, 0x41, 0x02, 0x28, + 0xa7, 0xc2, 0xcb, 0xe9, 0x21, 0x37, 0x52, 0xbf, 0xb6, 0x54, 0x78, 0x44, 0xfc, 0xcf, 0xf5, 0x91, 0x91, 0x33, 0xdc, 0xd5, 0x50, 0x3e, 0x22, 0x17, 0x3f, 0x13, 0x7d, 0xee, 0x52, 0xe4, 0x0c, 0x57, + 0x07, 0xff, 0x11, 0xd3, 0x24, 0x0b, 0x13, 0x47, 0x80, 0x0a, 0x1b, 0x18, 0xa0, 0xb0, 0x3a, 0xb3, 0x75, 0xa6, 0x61, 0x54, 0x09, 0x49, 0x4e, 0x81, 0xdb, 0x1d, 0xcf, 0x46, 0xeb, 0x78, 0x2e, 0x36, + 0x84, 0x8c, 0xbb, 0x18, 0x1c, 0xbb, 0x51, 0xd5, 0xa9, 0x0d, 0x57, 0x6b, 0xa5, 0xef, 0x65, 0x87, 0x7c, 0x9b, 0x0e, 0x6b, 0x6b, 0x95, 0x20, 0xd8, 0xd1, 0x2f, 0x7a, 0x00, 0x3f, 0x14, 0x09, 0xb2, + 0x4e, 0xf7, 0xdd, 0xd6, 0x67, 0x89, 0x31, 0x4e, 0x3e, 0xd7, 0x17, 0x7d, 0x4e, 0x78, 0x71, 0x6f, 0x94, 0xff, 0xde, 0xdb, 0xfc, 0x95, 0xec, 0x33, 0x18, 0xd7, 0xc6, 0x98, 0x32, 0x57, 0xd7, 0xaf, + 0x66, 0x9f, 0x88, 0x07, 0x84, 0x35, 0x57, 0xe5, 0x5a, 0xa0, 0xdd, 0xe9, 0x7e, 0x47, 0xce, 0x19, 0x76, 0xdb, 0xc5, 0x1b, 0x6a, 0xc6, 0x0a, 0x11, 0x2a, 0xa7, 0xa4, 0x18, 0x44, 0x1c, 0x96, 0x2e, + 0xb4, 0x59, 0x83, 0x8a, 0xb5, 0x83, 0x00, 0x1b, 0x4d, 0x50, 0xda, 0x28, 0x9f, 0xb1, 0x72, 0x82, 0x82, 0x87, 0xad, 0xc0, 0x6e, 0x16, 0x0c, 0xd8, 0xeb, 0x9b, 0xf0, 0x3c, 0xf4, 0x1e, 0xca, 0xd1, + 0x27, 0xf1, 0x3c, 0x8e, 0x4b, 0xb8, 0x6c, 0x6e, 0x43, 0xfe, 0x5d, 0xe5, 0xc3, 0x47, 0x58, 0x84, 0x27, 0xaa, 0xcf, 0x60, 0x5c, 0x99, 0xeb, 0x91, 0x39, 0x62, 0x3c, 0x86, 0x33, 0x29, 0x43, 0xe7, + 0x19, 0x87, 0x01, 0x6b, 0xfd, 0x54, 0x4d, 0x25, 0x02, 0x28, 0xa0, 0xcd, 0x94, 0xef, 0x22, 0x3b, 0x26, 0x7a, 0x5e, 0xa1, 0x0e, 0x61, 0xba, 0x94, 0xd0, 0x62, 0xa3, 0x6c, 0x20, 0xc2, 0xb4, 0x79, + 0x2f, 0x32, 0xe9, 0x78, 0x7b, 0xa4, 0xd6, 0xb6, 0x2b, 0x56, 0xeb, 0x6a, 0x71, 0x46, 0xe8, 0x13, 0x5c, 0x0a, 0xca, 0x01, 0x55, 0x1b, 0x81, 0x8d, 0xa9, 0xb3, 0x34, 0x6b, 0x47, 0x61, 0xf1, 0x85, + 0xc7, 0xed, 0x7b, 0x7b, 0x23, 0xf2, 0x80, 0x48, 0x7e, 0xdf, 0xd3, 0x76, 0x84, 0x28, 0x5e, 0x40, 0x3c, 0x38, 0x75, 0xf4, 0xd5, 0x39, 0x29, 0xa1, 0x59, 0x13, 0xab, 0x83, 0xd4, 0x09, 0xae, 0x1e, + 0xd6, 0x9d, 0x0e, 0xee, 0x68, 0x3d, 0x36, 0x05, 0x94, 0x43, 0xe7, 0x6c, 0xa9, 0x94, 0x11, 0x0e, 0x1d, 0x90, 0xd9, 0x5e, 0x5b, 0x93, 0xf4, 0xe0, 0x40, 0x6c, 0xeb, 0x44, 0x0b, 0x0d, 0x5d, 0x4b, + 0xb0, 0x50, 0x23, 0xcc, 0xaa, 0x81, 0x4a, 0x07, 0x50, 0x10, 0x7d, 0xb5, 0xce, 0xf9, 0xa8, 0x39, 0x8d, 0x71, 0x29, 0xcd, 0x83, 0xf4, 0xde, 0x8e, 0x4a, 0xfc, 0x81, 0xd1, 0x07, 0xd4, 0x97, 0x17, + 0x8a, 0x57, 0x08, 0xd2, 0x6c, 0x72, 0x23, 0xf1, 0x73, 0xf7, 0xeb, 0xcd, 0x40, 0x14, 0x8a, 0x17, 0xf9, 0x53, 0xbe, 0x13, 0xbc, 0x42, 0x85, 0xc1, 0x4c, 0x0b, 0x50, 0xc7, 0x77, 0x63, 0x44, 0x9b, + 0xae, 0xa0, 0x66, 0x35, 0xb0, 0x2c, 0x5f, 0xd1, 0x0e, 0x89, 0x71, 0x41, 0xca, 0xee, 0xd7, 0xa1, 0xcd, 0x97, 0xbc, 0xcc, 0x9c, 0x72, 0x4b, 0x97, 0x72, 0x29, 0xb0, 0x3c, 0x54, 0x51, 0x50, 0xdc, + 0x06, 0x97, 0x5b, 0x59, 0x4f, 0x32, 0x4c, 0xf6, 0x8e, 0x88, 0x1a, 0x8d, 0xc8, 0x93, 0x78, 0x95, 0x35, 0x4b, 0xc7, 0x7e, 0xd6, 0x3d, 0x7e, 0x34, 0xa3, 0xdf, 0x6e, 0xa8, 0x0c, 0xf7, 0x4d, 0x96, + 0x91, 0xdf, 0xcf, 0xf2, 0x28, 0xf5, 0xf1, 0xc6, 0x1f, 0x03, 0xd9, 0xdd, 0xd8, 0xa8, 0xab, 0xfa, 0xc6, 0x20, 0x5e, 0xb7, 0x82, 0x77, 0xfe, 0x27, 0x57, 0xc4, 0xaa, 0xda, 0x9e, 0x54, 0x4e, 0x19, + 0x5c, 0xcd, 0x1c, 0xe5, 0xf3, 0x8e, 0xf6, 0xc1, 0x99, 0xa3, 0x68, 0x02, 0x2b, 0x9a, 0xb8, 0x59, 0x99, 0x18, 0xf5, 0xa4, 0x49, 0x9d, 0xca, 0x32, 0xf2, 0xdb, 0xb8, 0x5c, 0xb9, 0xd6, 0xf7, 0xd5, + 0xb8, 0xb2, 0x34, 0xb0, 0x26, 0x66, 0xf6, 0x54, 0xba, 0xf1, 0x9b, 0x5c, 0x67, 0x77, 0x9e, 0xff, 0xf5, 0x36, 0xf2, 0x48, 0x94, 0xe5, 0x57, 0x0f, 0x78, 0x9e, 0x29, 0x1f, 0x4e, 0x5f, 0x7d, 0x3c, + 0x46, 0xac, 0x21, 0x6c, 0xa1, 0x62, 0x79, 0xc7, 0x48, 0x65, 0x8d, 0xf2, 0x8d, 0x38, 0x9b, 0x1d, 0x69, 0xfe, 0x08, 0x1d, 0x22, 0x3c, 0xda, 0x81, 0x9a, 0x35, 0xe7, 0x71, 0x57, 0x90, 0xd8, 0xb3, + 0x37, 0x17, 0x91, 0xf3, 0x06, 0x5f, 0xb9, 0x2a, 0xd4, 0x9a, 0xc1, 0x6a, 0xba, 0x32, 0x37, 0x5e, 0x9c, 0x0e, 0x8e, 0x5c, 0x09, 0x53, 0x82, 0x3b, 0xa7, 0x86, 0x43, 0xf0, 0x27, 0x06, 0x23, 0x73, + 0x9d, 0xc6, 0x8d, 0xf6, 0x50, 0x7e, 0x52, 0x61, 0xbd, 0x53, 0x29, 0xfc, 0x73, 0x02, 0xfe, 0x2b, 0xd9, 0x0b, 0x0a, 0x2f, 0x8d, 0xb1, 0xe2, 0x7c, 0x1b, 0x59, 0x8c, 0x54, 0xee, 0xf4, 0x0c, 0x96, + 0xf5, 0xad, 0x99, 0xe2, 0xbb, 0xed, 0x52, 0xca, 0x3d, 0xf0, 0x94, 0xac, 0x65, 0x02, 0x2f, 0xb2, 0xd3, 0xc9, 0xb7, 0x96, 0x9c, 0x0b, 0x9a, 0xb8, 0x93, 0xc7, 0x51, 0x64, 0x94, 0x2a, 0x94, 0x4c, + 0xcf, 0x54, 0x9e, 0xcf, 0x8d, 0x1a, 0x4b, 0x62, 0xb1, 0x38, 0x56, 0xa7, 0x7c, 0x10, 0x1a, 0xcd, 0x13, 0x51, 0x65, 0x37, 0x94, 0xda, 0x6a, 0x7f, 0x56, 0xef, 0x25, 0xbb, 0xff, 0x08, 0xc7, 0x45, + 0x8a, 0x99, 0x5c, 0xba, 0x76, 0x77, 0x09, 0x7d, 0x68, 0x3b, 0x79, 0x43, 0xf8, 0x06, 0xc9, 0x4b, 0x73, 0x9c, 0x6b, 0x24, 0xb1, 0x97, 0xa1, 0x96, 0x50, 0x8b, 0x90, 0x4e, 0xa1, 0x95, 0x00, 0x1e, + 0x67, 0xb6, 0x4d, 0x67, 0x94, 0xa7, 0x23, 0x9b, 0x11, 0xae, 0x83, 0x79, 0xe9, 0xd4, 0x75, 0x70, 0x37, 0xb1, 0x15, 0xf2, 0x50, 0x96, 0xbf, 0x67, 0xa2, 0xb7, 0xee, 0x5c, 0x0f, 0x27, 0xc8, 0xb8, + 0xcc, 0x7e, 0x91, 0x5a, 0x8b, 0x58, 0x05, 0x6d, 0xcf, 0x20, 0x73, 0x02, 0xd7, 0x9b, 0xa9, 0x6c, 0x9f, 0xfc, 0x99, 0x4b, 0x82, 0x42, 0x22, 0x9d, 0x64, 0x35, 0x5a, 0x94, 0x60, 0x09, 0x9e, 0xa2, + 0x1d, 0xda, 0x0e, 0x6b, 0x00, 0x6a, 0x29, 0x23, 0x39, 0x30, 0x7d, 0x60, 0xc8, 0xfb, 0xed, 0xb9, 0xa2, 0x04, 0x3a, 0x1e, 0x6a, 0x77, 0x7b, 0x52, 0x41, 0xb2, 0x91, 0x8f, 0xfc, 0xfa, 0x44, 0x90, + 0xe4, 0xb0, 0xe5, 0xe2, 0x7b, 0x55, 0x79, 0xbe, 0x04, 0x62, 0x12, 0x5f, 0x5e, 0xab, 0x9c, 0xf8, 0x4e, 0x9c, 0xdf, 0x5f, 0x0b, 0x1e, 0xcb, 0xf4, 0x77, 0xe7, 0x19, 0x6f, 0x61, 0x7a, 0x7f, 0x65, + 0x4c, 0x26, 0xc0, 0x2b, 0x87, 0x65, 0x72, 0x88, 0x25, 0x4d, 0xd3, 0xd2, 0xd8, 0xef, 0x8f, 0x8b, 0xa9, 0x80, 0xa8, 0xdd, 0xb1, 0x2b, 0xdc, 0x73, 0x3c, 0x5b, 0xc4, 0xbc, 0xa0, 0x69, 0x31, 0xb0, + 0xf7, 0x59, 0x50, 0x01, 0x56, 0x94, 0x31, 0x6d, 0x84, 0x18, 0xcc, 0x8e, 0x05, 0x0d, 0x77, 0x08, 0xbb, 0xc5, 0xb1, 0x8d, 0x0f, 0x89, 0xf1, 0xb0, 0xdb, 0xdb, 0xd4, 0xce, 0x3d, 0x69, 0x1b, 0xd4, + 0xca, 0x94, 0x3d, 0x76, 0xd8, 0x89, 0x12, 0xf2, 0x98, 0x9a, 0xf3, 0x96, 0x63, 0x23, 0x70, 0xdd, 0xdf, 0xcf, 0x76, 0x82, 0x7b, 0x2b, 0xef, 0xa5, 0xcb, 0xc3, 0xc4, 0x1c, 0xea, 0xbb, 0x41, 0x0e, + 0xf8, 0x43, 0xc1, 0x2d, 0x6f, 0x09, 0x3f, 0x43, 0xfb, 0xd4, 0x9c, 0xe0, 0xe3, 0x82, 0x5d, 0x16, 0x8b, 0x0e, 0x42, 0xa7, 0x87, 0xa4, 0xa4, 0x8b, 0x05, 0x47, 0x25, 0x06, 0x48, 0x8a, 0x5b, 0xb4, + 0x62, 0xce, 0xa0, 0x32, 0xd4, 0x76, 0xbd, 0x29, 0x21, 0x0c, 0x03, 0xe5, 0xe3, 0xa6, 0x5e, 0x41, 0x1d, 0x37, 0x8d, 0xcd, 0x69, 0xb8, 0x2d, 0xa6, 0xf5, 0x66, 0x58, 0xf7, 0xc7, 0xae, 0x96, 0x37, + 0xab, 0xce, 0x28, 0x11, 0xba, 0xa8, 0x83, 0x19, 0x16, 0xcc, 0x4f, 0xfb, 0x2e, 0x9b, 0x6e, 0xb6, 0xd1, 0xf9, 0xb3, 0x91, 0x20, 0x2f, 0x33, 0xcb, 0xa9, 0xaa, 0xab, 0xd5, 0xef, 0xb2, 0xb7, 0x19, + 0xa5, 0x77, 0x0f, 0x09, 0xe4, 0x31, 0xe9, 0xec, 0x8b, 0x07, 0x5c, 0x11, 0xf9, 0x7c, 0xfa, 0xba, 0xd4, 0x8c, 0x58, 0x7f, 0xd1, 0xac, 0x39, 0x8a, 0xb9, 0xec, 0xd7, 0x5e, 0x69, 0x8a, 0x06, 0x4c, + 0x6e, 0x48, 0xa0, 0xe9, 0xc5, 0x43, 0xbe, 0x3e, 0x68, 0x27, 0x63, 0x29, 0x91, 0xe0, 0xcc, 0xcf, 0x76, 0x28, 0x30, 0x03, 0x40, 0xd8, 0x99, 0x56, 0x51, 0x79, 0x76, 0xe2, 0x65, 0x00, 0xda, 0xea, + 0x99, 0xd5, 0x86, 0xd6, 0xec, 0x1b, 0x93, 0x5d, 0x10, 0xa7, 0x14, 0x19, 0xf2, 0xca, 0x3a, 0x70, 0x01, 0xb7, 0x59, 0x2c, 0x52, 0xd8, 0x18, 0xb7, 0xfe, 0x66, 0x5e, 0xe9, 0x54, 0xdf, 0x01, 0xf4, + 0x00, 0xdb, 0xf6, 0x44, 0xf4, 0x06, 0xca, 0xf5, 0xf0, 0x0a, 0xc4, 0x08, 0xee, 0x8d, 0x94, 0x82, 0x55, 0xbd, 0x8d, 0x63, 0x7c, 0x6b, 0xa7, 0xdc, 0x9a, 0xef, 0x60, 0x08, 0x5a, 0x03, 0x54, 0xbf, + 0x51, 0x77, 0xb8, 0x77, 0x42, 0xe4, 0xee, 0xa4, 0x45, 0x07, 0x22, 0xd8, 0xb4, 0x06, 0x64, 0xaa, 0x41, 0xad, 0x73, 0x06, 0xa8, 0xf2, 0xe5, 0xde, 0xb4, 0x13, 0x0f, 0x2d, 0x11, 0x35, 0x35, 0x02, + 0xfb, 0x3c, 0x95, 0x9b, 0xc4, 0x86, 0x14, 0xc9, 0xe0, 0x4b, 0x3d, 0x5e, 0x4c, 0x95, 0x69, 0xf5, 0xc9, 0xea, 0x99, 0x97, 0x59, 0x32, 0xb1, 0xe2, 0xc0, 0xb9, 0x5f, 0x31, 0xf2, 0xb1, 0xca, 0x3e, + 0x6f, 0x08, 0xdf, 0x3a, 0xff, 0xdc, 0x9a, 0xc0, 0x23, 0x4b, 0xfc, 0xac, 0xfa, 0xc3, 0xac, 0x34, 0x09, 0x37, 0x12, 0xd3, 0x5a, 0x5e, 0x65, 0xbb, 0x65, 0xdb, 0x62, 0x85, 0x0d, 0xd2, 0x51, 0x56, + 0x86, 0x71, 0x10, 0x34, 0x22, 0xd2, 0xec, 0x4f, 0x73, 0x84, 0x9b, 0xc3, 0x24, 0x7f, 0x3c, 0x70, 0x5a, 0x5d, 0x9f, 0x6c, 0x26, 0x53, 0x55, 0xb0, 0xed, 0x45, 0x5f, 0xb6, 0xa3, 0x8c, 0x9d, 0xb3, + 0xfc, 0x94, 0xa6, 0x57, 0x50, 0x1e, 0x22, 0x31, 0xb5, 0xa4, 0x22, 0xa7, 0x25, 0x46, 0x84, 0x02, 0xd5, 0x76, 0xe0, 0x39, 0x4f, 0x41, 0xff, 0xd0, 0x7d, 0x33, 0x64, 0x5e, 0x66, 0xfd, 0x30, 0x31, + 0x6c, 0xfb, 0xfe, 0xd6, 0xf6, 0x48, 0x66, 0xf4, 0x57, 0xb2, 0x37, 0xd8, 0x9e, 0x1a, 0xd7, 0x59, 0x33, 0x22, 0x7e, 0x2a, 0x8e, 0xe5, 0x8a, 0xdf, 0xee, 0x8f, 0xcc, 0x51, 0x3a, 0x60, 0x58, 0x68, + 0x97, 0x47, 0x50, 0x44, 0xc9, 0x22, 0x4e, 0x03, 0x37, 0xa8, 0x19, 0x09, 0xd0, 0xbb, 0x32, 0x49, 0x74, 0x2b, 0xdb, 0x73, 0xc3, 0x96, 0x6b, 0x6b, 0xbd, 0xcf, 0x07, 0x05, 0x4a, 0x11, 0xd0, 0x64, + 0x40, 0x01, 0xab, 0xe9, 0xd9, 0x4c, 0x07, 0xbd, 0x0d, 0x6b, 0xeb, 0x47, 0x92, 0xe3, 0x4b, 0x23, 0xe3, 0x60, 0x40, 0xd5, 0x66, 0x63, 0x78, 0xfe, 0xac, 0xec, 0x8c, 0xd2, 0xbe, 0x75, 0xef, 0x13, + 0x8b, 0xfe, 0xb6, 0x20, 0xed, 0x53, 0xf5, 0xd9, 0xaf, 0x31, 0x7d, 0xe7, 0xcb, 0x7d, 0xcf, 0x12, 0xf1, 0xf7, 0x99, 0xbf, 0xdf, 0xd0, 0xbd, 0xa0, 0xfa, 0xda, 0x1a, 0x9b, 0xf3, 0x9b, 0x24, 0x19, + 0xbd, 0xeb, 0xe5, 0xa4, 0xe7, 0xd2, 0x06, 0x35, 0x76, 0x38, 0x86, 0x1c, 0x01, 0x95, 0x5a, 0x0c, 0xb9, 0x70, 0x36, 0xdd, 0x0d, 0x30, 0xc7, 0x55, 0x99, 0x89, 0xd0, 0xe6, 0x14, 0x9e, 0xfa, 0x94, + 0x80, 0x71, 0xd8, 0x58, 0xf3, 0xcb, 0xda, 0x3f, 0x69, 0x3b, 0xf5, 0x50, 0x1c, 0x60, 0x16, 0xcf, 0x36, 0xad, 0x07, 0xc4, 0xa1, 0x61, 0x20, 0xe2, 0x26, 0x00, 0x14, 0xb7, 0x9d, 0x8b, 0xf2, 0xa8, + 0x92, 0x19, 0x79, 0x93, 0xdc, 0xe3, 0x06, 0x1f, 0xf3, 0x8b, 0xbb, 0x10, 0xbc, 0x60, 0xd0, 0x24, 0xf9, 0x58, 0x1f, 0xb8, 0x6d, 0xa7, 0x0f, 0x40, 0x8e, 0xee, 0x17, 0x15, 0x2c, 0x0d, 0xb5, 0x0d, + 0x86, 0x9a, 0x55, 0x63, 0x5d, 0xde, 0x62, 0xd3, 0x55, 0xa0, 0xcd, 0x0b, 0x7b, 0xba, 0x8b, 0x2d, 0x5c, 0x57, 0xec, 0x08, 0x52, 0x00, 0x4a, 0x3b, 0xb7, 0x44, 0xb8, 0xc3, 0xe9, 0x38, 0x42, 0x0f, + 0xbb, 0x44, 0xda, 0xc2, 0x6e, 0x4d, 0x4c, 0x0f, 0xbd, 0x04, 0xad, 0x79, 0x7d, 0xb9, 0x01, 0x4e, 0xd2, 0xe2, 0x88, 0xd0, 0x0b, 0xbf, 0x7b, 0x6c, 0xf3, 0xbf, 0x30, 0xae, 0x99, 0x7b, 0x11, 0x1b, + 0x1d, 0x23, 0x79, 0x61, 0x00, 0xde, 0xcd, 0xb5, 0x77, 0x65, 0xca, 0xef, 0xcd, 0xb3, 0x26, 0x1d, 0xac, 0xec, 0x6e, 0x09, 0x92, 0xc7, 0xca, 0xfb, 0x3d, 0x13, 0xbd, 0xa2, 0x7b, 0x3b, 0x1c, 0x53, + 0xda, 0xef, 0x82, 0xb0, 0xba, 0xab, 0x76, 0xa1, 0xed, 0x02, 0x21, 0x9e, 0xc4, 0xc0, 0x00, 0x12, 0x4b, 0x6e, 0x25, 0xe9, 0x66, 0xb9, 0x00, 0xa9, 0x1c, 0xd1, 0x3c, 0x03, 0xda, 0x48, 0xb5, 0x5d, + 0x1c, 0xd6, 0x1a, 0xa2, 0x3a, 0x78, 0xe6, 0x6f, 0x24, 0x66, 0x5a, 0x19, 0xcc, 0x66, 0xb3, 0x95, 0xda, 0x7c, 0x0a, 0x08, 0x7b, 0x3a, 0x2f, 0x95, 0xd6, 0x69, 0x6d, 0x55, 0x1f, 0xcc, 0x34, 0x44, + 0xac, 0x96, 0x12, 0x59, 0x1b, 0xfa, 0xbc, 0xd6, 0x37, 0xb9, 0xf1, 0xcf, 0x6e, 0xff, 0x4d, 0x6e, 0x5c, 0x7b, 0x9b, 0x1b, 0x63, 0xb7, 0x77, 0x9f, 0xdd, 0xac, 0xa0, 0x8a, 0x92, 0xd4, 0xad, 0x06, + 0x5a, 0xb6, 0xea, 0x13, 0x44, 0x2d, 0xb0, 0xf2, 0x32, 0xb5, 0x99, 0x72, 0xcd, 0x09, 0x85, 0x30, 0xc7, 0xfb, 0xa4, 0x1c, 0x2a, 0x7d, 0x40, 0x03, 0x7c, 0x8e, 0x66, 0x6c, 0xb6, 0x4d, 0x0d, 0x52, + 0x9b, 0x89, 0x86, 0x0d, 0x90, 0x0d, 0x8c, 0xe0, 0xc0, 0x79, 0x05, 0xaf, 0x04, 0xf5, 0x98, 0x2c, 0xd9, 0xa8, 0xf4, 0x4d, 0xd4, 0x42, 0x94, 0x32, 0x78, 0x2c, 0x6e, 0xe5, 0x26, 0xe0, 0x4f, 0xbc, + 0xcc, 0xb8, 0xad, 0xf5, 0xc8, 0x7d, 0x15, 0x77, 0x71, 0x8f, 0x2b, 0x20, 0xfe, 0xc0, 0x8f, 0x24, 0x78, 0x2f, 0x2e, 0x0c, 0x41, 0x51, 0x4d, 0x6e, 0x3f, 0xff, 0x19, 0xb5, 0x64, 0xbf, 0xb6, 0xc3, + 0x73, 0x71, 0x4e, 0x4f, 0x9e, 0x6b, 0x63, 0x39, 0x1f, 0x04, 0x64, 0xb5, 0xaa, 0x0d, 0x6d, 0x41, 0x95, 0x3d, 0x45, 0x11, 0xb0, 0x4f, 0x8b, 0x14, 0xb4, 0x2f, 0x0d, 0x0d, 0x5f, 0x1e, 0x20, 0x55, + 0x0e, 0xcc, 0x93, 0x7e, 0xda, 0xec, 0x03, 0x1b, 0x32, 0xda, 0xf3, 0x6a, 0x19, 0x31, 0x6b, 0x7d, 0xbb, 0x4e, 0x9a, 0x1e, 0xd9, 0xe3, 0x89, 0x2a, 0x42, 0x2b, 0xd7, 0xaa, 0x11, 0x79, 0x3e, 0x62, + 0x2b, 0xfc, 0x9b, 0xa2, 0xe3, 0x45, 0xe3, 0x34, 0xce, 0xe4, 0x9a, 0x8f, 0xa0, 0x36, 0xaa, 0xe8, 0x1b, 0x99, 0xfe, 0xef, 0xd9, 0xa8, 0x0f, 0xb4, 0x2f, 0xe0, 0xbd, 0x3f, 0x73, 0x95, 0xee, 0x47, + 0x30, 0x55, 0x42, 0x63, 0x08, 0x7b, 0x83, 0x70, 0x63, 0xee, 0x80, 0x6f, 0x8c, 0xbd, 0x26, 0x9f, 0x37, 0x59, 0x04, 0x61, 0x9b, 0xf3, 0x61, 0x0b, 0xcf, 0x67, 0x84, 0xb1, 0xf4, 0x5b, 0xbc, 0x74, + 0xb7, 0x27, 0x54, 0xf2, 0x8a, 0x19, 0xc0, 0x23, 0x73, 0x3f, 0xd7, 0xe5, 0x74, 0x36, 0xa7, 0x7c, 0x2a, 0xc0, 0xf4, 0x45, 0x44, 0xef, 0x29, 0x15, 0xdf, 0x15, 0x11, 0x43, 0xaf, 0x66, 0x64, 0x89, + 0xf9, 0x4e, 0x88, 0x72, 0xd3, 0x4f, 0x1f, 0xda, 0x5d, 0x4d, 0xd2, 0x3d, 0x1d, 0xf1, 0xdf, 0xc7, 0xc5, 0x7e, 0xfd, 0x88, 0x2b, 0x30, 0x5f, 0x5d, 0x18, 0x9b, 0x1c, 0xa2, 0xd6, 0xe6, 0xb0, 0x0c, + 0xfb, 0xde, 0xb0, 0x6b, 0x56, 0x5e, 0x9c, 0x29, 0xa0, 0xa6, 0x56, 0x48, 0x07, 0xe3, 0x4d, 0x2a, 0x29, 0x3e, 0x55, 0xb8, 0x0d, 0x58, 0xcc, 0x0f, 0xae, 0x7f, 0xd0, 0x8c, 0xc4, 0xe8, 0x48, 0x77, + 0xf0, 0x9b, 0x84, 0x33, 0x90, 0x61, 0x99, 0xdb, 0xfb, 0x8c, 0x22, 0x5b, 0x0d, 0x45, 0xca, 0xb5, 0x15, 0x87, 0x00, 0xe6, 0x9e, 0x34, 0x59, 0x3d, 0xf2, 0xd5, 0x94, 0x5d, 0xb5, 0x9f, 0xe4, 0x92, + 0xd2, 0xfa, 0x66, 0x76, 0xfc, 0xfd, 0xee, 0x5e, 0x5a, 0xe0, 0x04, 0x2c, 0xad, 0xeb, 0x1c, 0x18, 0xb1, 0x97, 0x0f, 0xa8, 0xb9, 0xf4, 0x0a, 0x2e, 0x44, 0x65, 0xda, 0xee, 0xb7, 0xe6, 0x36, 0xca, + 0x92, 0x38, 0xf3, 0xa3, 0xb6, 0x9a, 0x51, 0x9e, 0x3d, 0x0b, 0x8e, 0x72, 0xbc, 0xa7, 0x37, 0x29, 0xed, 0xbb, 0x29, 0x40, 0x4b, 0xbd, 0x87, 0x99, 0x16, 0x81, 0xd8, 0xd4, 0xc1, 0xa2, 0x4f, 0x30, + 0xde, 0x19, 0x2d, 0xe3, 0x7a, 0x4e, 0x3f, 0xf7, 0x2c, 0xcb, 0x8a, 0x7c, 0x4b, 0x6f, 0x87, 0x6e, 0x90, 0x35, 0x49, 0x7c, 0x6c, 0x3b, 0xbb, 0xa5, 0x8a, 0x7c, 0x4d, 0x58, 0x06, 0x7d, 0x34, 0xa3, + 0x07, 0x69, 0x70, 0xb9, 0xf0, 0x6f, 0xf8, 0x83, 0x99, 0xfa, 0x6d, 0x80, 0xf0, 0xb3, 0x73, 0xc7, 0x9b, 0xab, 0x55, 0x5d, 0x06, 0xf9, 0xcd, 0xa7, 0xc0, 0xca, 0x92, 0xe7, 0x72, 0xf8, 0xbf, 0xff, + 0x8d, 0xdc, 0x4f, 0x88, 0x56, 0x3a, 0x86, 0x6d, 0x07, 0xe5, 0x7d, 0x66, 0xe3, 0x11, 0x67, 0x87, 0x67, 0xa2, 0x97, 0xf1, 0x79, 0x3a, 0x9c, 0xa0, 0xe3, 0x9c, 0x1c, 0x2c, 0xde, 0x6f, 0x48, 0x0b, + 0xa4, 0x4a, 0xdb, 0x8f, 0x56, 0xea, 0xa9, 0xd2, 0x80, 0xac, 0xa2, 0x7d, 0x77, 0x3f, 0x40, 0x9b, 0x20, 0xea, 0xf2, 0x15, 0x07, 0xe2, 0x40, 0x90, 0x64, 0xc0, 0x36, 0x77, 0x8c, 0xea, 0xb0, 0xa0, + 0xb2, 0x86, 0x2d, 0x57, 0x65, 0xac, 0x45, 0xdd, 0x01, 0x02, 0x80, 0x34, 0x0c, 0x86, 0x86, 0x69, 0x2d, 0x52, 0x5c, 0x68, 0xf8, 0x01, 0x6d, 0xa2, 0x56, 0xa7, 0x8a, 0x64, 0xf1, 0x98, 0x93, 0xc3, + 0xe7, 0x54, 0x24, 0x77, 0x31, 0xf4, 0x9c, 0x3e, 0xff, 0x93, 0x97, 0x59, 0x9d, 0xd5, 0x43, 0xee, 0xfc, 0x71, 0x63, 0xe3, 0xae, 0xc4, 0x0d, 0x3f, 0xa4, 0xf9, 0xfa, 0xfa, 0x11, 0x57, 0x7c, 0xbf, + 0xba, 0x70, 0x8d, 0xa0, 0x1d, 0x81, 0x36, 0x02, 0xc8, 0xd0, 0x1c, 0xf7, 0xa6, 0x38, 0x2c, 0xc6, 0x5a, 0xbc, 0x39, 0x13, 0x43, 0x83, 0x83, 0x3c, 0x8a, 0xae, 0xad, 0x8a, 0xdd, 0x6f, 0xe3, 0xad, + 0x5b, 0x0d, 0x6b, 0x63, 0xbb, 0x31, 0x96, 0xd8, 0x62, 0x86, 0x94, 0xd8, 0x20, 0x51, 0x7c, 0xab, 0xf0, 0x9b, 0xe3, 0x51, 0x02, 0x5d, 0x85, 0x8e, 0xf6, 0xb9, 0x69, 0x9a, 0x7a, 0xbc, 0xc7, 0xbd, + 0x21, 0x35, 0xd9, 0xd3, 0x36, 0xc8, 0x83, 0x40, 0x0d, 0x1e, 0x43, 0x7b, 0xa4, 0x47, 0xe9, 0x17, 0x0e, 0xce, 0xe4, 0x0f, 0x0e, 0xce, 0x37, 0x88, 0xee, 0xcf, 0xf0, 0x47, 0x7c, 0x9c, 0x9e, 0x68, + 0xbe, 0x0c, 0x40, 0x3e, 0x36, 0x47, 0x9b, 0x2e, 0xae, 0xcf, 0x36, 0x35, 0x28, 0x95, 0x2c, 0xcf, 0xc8, 0x90, 0x5a, 0xce, 0xf7, 0xb1, 0xb4, 0x54, 0x3b, 0x0f, 0x97, 0xdc, 0x64, 0x06, 0x27, 0x65, + 0x01, 0x6d, 0x24, 0x2c, 0x5d, 0xfa, 0x3e, 0x8e, 0x6d, 0x0d, 0x4e, 0x40, 0x7b, 0xdb, 0x08, 0xc0, 0x76, 0x75, 0x64, 0x1a, 0x12, 0xcb, 0xb9, 0x4e, 0xa1, 0xc4, 0xbe, 0x72, 0xf8, 0x3d, 0x81, 0x37, + 0x88, 0xb0, 0x4e, 0xb2, 0x4a, 0xb6, 0xf6, 0x0c, 0x34, 0xc6, 0x84, 0xfb, 0xb5, 0x67, 0xce, 0xd7, 0x3b, 0xd3, 0x23, 0xf6, 0x88, 0x2f, 0xe8, 0xdf, 0xd0, 0xf9, 0x78, 0x76, 0x82, 0x8d, 0xb3, 0x46, + 0x48, 0x40, 0x7c, 0x3a, 0x4b, 0x65, 0xe5, 0xb9, 0x02, 0x70, 0x64, 0x73, 0x66, 0x8f, 0x1e, 0xa9, 0x99, 0xcc, 0x79, 0xe0, 0x31, 0xd4, 0x55, 0x22, 0x91, 0xf7, 0x9b, 0xc6, 0xd1, 0x43, 0x94, 0xe5, + 0x80, 0x56, 0x60, 0xf7, 0x59, 0x41, 0xef, 0x73, 0xfa, 0xc8, 0xa0, 0x5e, 0xd2, 0x60, 0xd5, 0x62, 0x1a, 0x8b, 0x55, 0xa8, 0x9e, 0xc2, 0x05, 0x0c, 0xdb, 0x32, 0x77, 0x2c, 0x9c, 0xc4, 0x45, 0x5b, + 0xa7, 0x80, 0x1f, 0x5b, 0xaf, 0xaf, 0x1b, 0xd7, 0x6d, 0xbd, 0xa5, 0xee, 0xce, 0xb1, 0x5b, 0x3f, 0xef, 0x47, 0xed, 0x3c, 0x96, 0x7f, 0xfd, 0x2d, 0xe1, 0xb7, 0x78, 0x36, 0x65, 0x3c, 0x36, 0xf7, + 0x3a, 0x65, 0x58, 0x9a, 0xaa, 0x1e, 0xd6, 0xd0, 0x2c, 0x92, 0x5b, 0x62, 0x37, 0x13, 0x43, 0x16, 0x6d, 0x45, 0x63, 0xad, 0xea, 0xd1, 0x61, 0xda, 0x65, 0xd8, 0x56, 0x5c, 0x98, 0x34, 0xa7, 0xc9, + 0x2c, 0x9b, 0xa6, 0xbc, 0x40, 0xe7, 0x5c, 0x61, 0x1f, 0xcb, 0x35, 0xb1, 0xc7, 0x84, 0x03, 0xc4, 0x49, 0xeb, 0x0c, 0x3c, 0x29, 0xed, 0x06, 0xaf, 0x59, 0x50, 0xc5, 0xb7, 0x0b, 0xf0, 0x20, 0x1f, + 0x5d, 0xc8, 0x89, 0xfe, 0xf7, 0x80, 0xbc, 0x2a, 0xaa, 0xdb, 0xbb, 0xf5, 0x81, 0x1e, 0xf3, 0x49, 0x7c, 0x25, 0x7b, 0x05, 0xf1, 0xb9, 0x31, 0xc6, 0x1f, 0x11, 0x9e, 0xf0, 0xc8, 0xaa, 0x02, 0xc2, + 0x21, 0xe9, 0x34, 0x8e, 0x11, 0x67, 0xa8, 0xdc, 0xe0, 0xca, 0x92, 0xc2, 0x19, 0x98, 0x14, 0x3f, 0x66, 0x71, 0xfb, 0x3a, 0x63, 0xf3, 0x3d, 0xc9, 0xeb, 0xef, 0x05, 0x88, 0x2f, 0xe8, 0x5f, 0xfb, + 0xf3, 0xe9, 0xec, 0xd8, 0x0a, 0xc3, 0xaa, 0x0b, 0xa5, 0x27, 0x87, 0xd8, 0x55, 0xce, 0x39, 0x58, 0xf0, 0x0d, 0x30, 0xcb, 0xa7, 0x66, 0x10, 0x1c, 0xcd, 0x24, 0x8f, 0x0b, 0x62, 0x3f, 0x05, 0x73, + 0x80, 0xec, 0x48, 0x4d, 0x95, 0xc0, 0x0d, 0xbd, 0xf2, 0xcb, 0x23, 0xc3, 0x1c, 0xfd, 0xce, 0x00, 0xda, 0x99, 0x30, 0x34, 0x66, 0x53, 0xb8, 0xfa, 0xe9, 0xd0, 0x3a, 0x47, 0x10, 0x64, 0x34, 0x65, + 0x59, 0x31, 0x4b, 0x72, 0xc7, 0x6d, 0xc1, 0x96, 0xfd, 0xe4, 0x7d, 0xf5, 0xd4, 0xbb, 0xfb, 0x23, 0xfa, 0x48, 0xbc, 0xd3, 0xd3, 0x6d, 0xd7, 0xfe, 0x5f, 0x8f, 0x26, 0x37, 0x42, 0x3f, 0x77, 0x3a, + 0xb0, 0x00, 0x72, 0xa3, 0x05, 0x0a, 0xa5, 0x04, 0xc8, 0x70, 0x96, 0x97, 0x8b, 0x93, 0x18, 0x05, 0x3a, 0x83, 0xeb, 0xd3, 0x33, 0x29, 0x22, 0xba, 0x9f, 0x4c, 0x55, 0xde, 0x38, 0xf4, 0xf6, 0x86, + 0xed, 0x39, 0xa3, 0x0a, 0x9c, 0xc5, 0xbc, 0x04, 0x06, 0x55, 0x07, 0x4f, 0x89, 0x5a, 0x59, 0xd1, 0x2a, 0xe0, 0x62, 0x18, 0x31, 0x4a, 0x68, 0x20, 0xd4, 0x40, 0x65, 0x7a, 0x34, 0xc1, 0x76, 0xab, + 0xf4, 0xc1, 0x95, 0xe5, 0x9d, 0x63, 0xcd, 0x4d, 0xce, 0x22, 0xee, 0x7d, 0x18, 0xb7, 0x4e, 0x5e, 0x06, 0xf9, 0x1b, 0x91, 0xe2, 0x61, 0x1c, 0xaf, 0x84, 0xdf, 0x80, 0x79, 0x9d, 0x4c, 0x23, 0x9d, + 0x4f, 0x72, 0x13, 0xe4, 0xb5, 0x44, 0xad, 0xea, 0x59, 0x34, 0x54, 0xbb, 0x45, 0x4f, 0xe5, 0x81, 0xb0, 0x86, 0xeb, 0xe5, 0x42, 0x90, 0xd7, 0x8b, 0x19, 0xda, 0x46, 0x2c, 0xba, 0x2c, 0x30, 0xb6, + 0x99, 0xc1, 0xf6, 0x82, 0xf0, 0x56, 0x39, 0x08, 0xb4, 0x9e, 0x5e, 0x54, 0xf3, 0xe5, 0xc6, 0xc8, 0xdb, 0x81, 0x12, 0x50, 0x19, 0xc0, 0x32, 0x72, 0xd1, 0xb5, 0x45, 0x23, 0x6d, 0xac, 0x54, 0x27, + 0x77, 0xda, 0x80, 0x8d, 0x51, 0xde, 0x3f, 0x67, 0x49, 0x8a, 0x83, 0xe8, 0x3b, 0xcf, 0xa4, 0x47, 0x3e, 0xb4, 0x57, 0xc2, 0x37, 0x50, 0x5e, 0x9a, 0x63, 0xca, 0xb1, 0xc1, 0x93, 0x48, 0xb3, 0x3c, + 0xf2, 0x5c, 0x87, 0xab, 0x85, 0x3e, 0x6f, 0x3d, 0x43, 0x5a, 0x18, 0x68, 0x9c, 0x2f, 0xa7, 0xdb, 0xcc, 0xf9, 0xda, 0x78, 0xfa, 0xc3, 0x3c, 0xf9, 0x94, 0xb7, 0xf8, 0xdb, 0xca, 0x7b, 0xa5, 0x53, + 0x35, 0xc9, 0x5d, 0xdb, 0x2b, 0xf4, 0xe8, 0x34, 0xb9, 0xd0, 0xbc, 0x81, 0x71, 0x39, 0x9a, 0x40, 0x3f, 0x4f, 0x0e, 0x78, 0x42, 0x39, 0x21, 0xa4, 0x39, 0xf2, 0x72, 0x4f, 0x88, 0x8e, 0x57, 0x50, + 0x14, 0x3a, 0x2f, 0xf8, 0xe0, 0x00, 0xad, 0x74, 0x38, 0x7a, 0x04, 0x87, 0xda, 0x2f, 0xb3, 0xc6, 0xbb, 0x72, 0xe4, 0xff, 0xbe, 0x48, 0xfe, 0x77, 0x94, 0x12, 0xa5, 0x73, 0xcf, 0xac, 0x01, 0x3d, + 0xe4, 0x8e, 0x54, 0x3a, 0xf5, 0xb5, 0xe3, 0xf5, 0x04, 0x1a, 0xe7, 0x82, 0xc4, 0x43, 0x26, 0xaa, 0x9d, 0xe4, 0x8a, 0xdc, 0xa1, 0xfa, 0x14, 0x26, 0x4f, 0x3b, 0x79, 0x80, 0x57, 0xab, 0x19, 0x49, + 0x1b, 0x24, 0x43, 0xf9, 0xad, 0xee, 0x11, 0x47, 0x16, 0x4f, 0xb6, 0x43, 0xb4, 0xe9, 0x65, 0x85, 0x45, 0xc2, 0x06, 0x5a, 0xab, 0xe6, 0x32, 0x36, 0x56, 0x92, 0x14, 0x47, 0x1a, 0x70, 0x12, 0xc8, + 0x6e, 0x21, 0x01, 0xdd, 0x91, 0x57, 0x13, 0x7a, 0x31, 0x83, 0x0c, 0x85, 0x68, 0xb5, 0x6b, 0x74, 0xff, 0xc7, 0x6e, 0x06, 0xf7, 0xc7, 0xf9, 0x31, 0xb7, 0x81, 0x27, 0x9a, 0xb7, 0xee, 0x5e, 0x8e, + 0xc6, 0x38, 0x0b, 0x5c, 0xba, 0xcc, 0x6d, 0x55, 0x8d, 0xc2, 0x4f, 0x11, 0x5b, 0x20, 0x0a, 0x62, 0x72, 0x4e, 0x0f, 0x6e, 0x45, 0x11, 0x56, 0x02, 0x55, 0x49, 0x11, 0x6e, 0xa9, 0x39, 0x98, 0xa4, + 0x0d, 0xd5, 0xcc, 0xd6, 0xec, 0x30, 0x29, 0x0d, 0x6d, 0x7d, 0xac, 0x94, 0x48, 0x6d, 0x28, 0x11, 0x33, 0x12, 0x80, 0x02, 0xf0, 0xa3, 0x69, 0x18, 0xcb, 0x18, 0x2e, 0xfc, 0x0c, 0x33, 0x8a, 0xd9, + 0x4c, 0x5a, 0x09, 0x32, 0xb6, 0xdc, 0x7f, 0xce, 0xc6, 0x53, 0x3a, 0x4d, 0xf5, 0x7d, 0x9d, 0xa4, 0xbf, 0x57, 0xaa, 0x3c, 0xd1, 0xbc, 0x76, 0xf9, 0x7a, 0x74, 0xfd, 0xc4, 0x47, 0xa8, 0x4d, 0x8e, + 0xd3, 0x74, 0x45, 0x51, 0x06, 0xea, 0x5a, 0xa0, 0x13, 0xcd, 0x17, 0x70, 0x0c, 0x81, 0x47, 0x09, 0x5e, 0x67, 0x55, 0xd0, 0xac, 0xc3, 0xe1, 0xe0, 0x93, 0x3e, 0xdd, 0xaa, 0x0a, 0xbf, 0xd2, 0x3c, + 0xc5, 0x72, 0x97, 0x6d, 0x4d, 0x4d, 0x49, 0xd5, 0x6b, 0x42, 0xe4, 0x28, 0x6e, 0x19, 0x67, 0x8d, 0xd3, 0x4b, 0x24, 0x21, 0xc1, 0xa6, 0x1b, 0x8c, 0xad, 0x72, 0x20, 0x5c, 0xb3, 0x9e, 0x77, 0x87, + 0xe1, 0xfc, 0x79, 0xf7, 0x74, 0xed, 0xfb, 0x8a, 0x93, 0x87, 0x84, 0x49, 0xd7, 0xbe, 0xaa, 0x4e, 0x5c, 0xdb, 0x1a, 0x2b, 0x28, 0x2a, 0x88, 0x9f, 0xb5, 0xf6, 0x79, 0x61, 0x8a, 0x01, 0x49, 0x82, + 0x27, 0x23, 0x34, 0xf6, 0xbc, 0x1a, 0x21, 0xe2, 0x36, 0x01, 0x7a, 0x61, 0xed, 0xc8, 0x36, 0xcf, 0x37, 0x34, 0x19, 0x58, 0x21, 0x69, 0x46, 0xc4, 0x39, 0x40, 0x16, 0xd4, 0x72, 0x39, 0xeb, 0x03, + 0xcf, 0x4a, 0x99, 0x45, 0xbe, 0x59, 0x99, 0xc2, 0x20, 0x58, 0xde, 0xb0, 0x61, 0x02, 0x09, 0xa0, 0x52, 0xb1, 0xd4, 0x70, 0x4b, 0x5f, 0x96, 0x9f, 0x14, 0x68, 0x65, 0x90, 0x94, 0xc6, 0xbd, 0x9a, + 0x9a, 0x8f, 0x15, 0x08, 0xbf, 0x91, 0xbc, 0xf4, 0xf6, 0x7a, 0x30, 0xb6, 0x20, 0xf8, 0x46, 0x8f, 0x36, 0xbc, 0x1e, 0xcd, 0x96, 0x8b, 0x85, 0x24, 0x21, 0x5a, 0xa1, 0xea, 0xaa, 0x64, 0xf2, 0x31, + 0x4f, 0x7b, 0x55, 0x7f, 0x66, 0xa9, 0xf5, 0xb6, 0xc2, 0x62, 0x7e, 0xad, 0x82, 0x48, 0x06, 0x6d, 0xa7, 0x47, 0xba, 0x9b, 0x8a, 0xa0, 0x86, 0x66, 0x44, 0xb7, 0xe8, 0xc0, 0x60, 0xaa, 0x6d, 0x8d, + 0xdc, 0x3a, 0x6e, 0x4e, 0x5d, 0x61, 0x06, 0x68, 0x64, 0xf7, 0x6b, 0xc9, 0x9e, 0x13, 0xc8, 0x61, 0xfd, 0x98, 0xbe, 0xda, 0x8b, 0xb3, 0x6b, 0x7e, 0xc2, 0x7f, 0x91, 0x57, 0x59, 0xf8, 0xeb, 0xf5, + 0xae, 0x49, 0x2f, 0x5c, 0x84, 0x11, 0xc7, 0xce, 0x7d, 0xbe, 0xf9, 0x21, 0xa9, 0xee, 0x0d, 0xe1, 0x0b, 0x88, 0x6f, 0x9a, 0x63, 0x32, 0xfa, 0x5f, 0xa0, 0xc4, 0x63, 0x4c, 0x19, 0xf4, 0x1d, 0x45, + 0x6c, 0x75, 0x30, 0x66, 0x7a, 0xfd, 0xb0, 0x23, 0xc2, 0x62, 0x4b, 0xcd, 0x16, 0x2c, 0xb2, 0x87, 0xd6, 0x8b, 0x2d, 0x2f, 0x21, 0xc4, 0xcc, 0x0c, 0xab, 0xad, 0x32, 0x63, 0xfa, 0x95, 0xed, 0xd3, + 0xa0, 0x05, 0x2d, 0x8f, 0xd5, 0x0a, 0x18, 0xd0, 0xe9, 0xd1, 0x9d, 0x07, 0xa8, 0x7d, 0x3e, 0x53, 0x62, 0x2c, 0x37, 0x52, 0x92, 0x1a, 0x1b, 0x91, 0xcf, 0x98, 0x95, 0x4c, 0x3f, 0x06, 0xe5, 0x67, + 0x5d, 0xf5, 0x4d, 0x16, 0xb9, 0xe3, 0x49, 0x72, 0x75, 0x55, 0xfc, 0xb6, 0x3e, 0x1f, 0xfe, 0x90, 0xab, 0xda, 0x1b, 0xba, 0xe0, 0xe4, 0x6d, 0x6b, 0x82, 0x8f, 0x73, 0x56, 0x2b, 0x73, 0x74, 0x9f, + 0x41, 0x24, 0x67, 0xd9, 0x49, 0xc2, 0x99, 0xcb, 0xd6, 0x33, 0x84, 0x5e, 0xde, 0x6f, 0x4a, 0xd2, 0x5c, 0x2a, 0x7b, 0x25, 0xc2, 0xf7, 0x53, 0xb6, 0x80, 0x17, 0x40, 0x9e, 0x9b, 0xbb, 0x8c, 0x84, + 0x00, 0xcd, 0x31, 0x98, 0x3e, 0xea, 0x70, 0xc6, 0xa6, 0x04, 0x49, 0x00, 0x96, 0x0c, 0x61, 0x86, 0xa9, 0x96, 0x20, 0x4a, 0x23, 0x35, 0x73, 0x35, 0xc9, 0x1b, 0xad, 0x4d, 0xe6, 0xea, 0xa7, 0xdd, + 0xe5, 0xfa, 0x62, 0x57, 0xf5, 0xc6, 0xbd, 0xbc, 0xd4, 0x8f, 0xed, 0x30, 0x6f, 0xe8, 0x3e, 0x77, 0xff, 0xd6, 0x1a, 0xbb, 0xd3, 0x48, 0xc6, 0x71, 0xbf, 0xa8, 0x8e, 0x86, 0x20, 0x34, 0x5c, 0x17, + 0xd1, 0x41, 0x98, 0xcd, 0xa4, 0xd5, 0x8c, 0x23, 0x40, 0x87, 0x27, 0x94, 0xa0, 0x6c, 0x07, 0xe9, 0x14, 0xeb, 0x24, 0x3d, 0x93, 0x07, 0x8c, 0x01, 0xfc, 0x79, 0xeb, 0x63, 0x34, 0x11, 0xaf, 0x97, + 0x40, 0x2a, 0xd9, 0xbe, 0xb9, 0x70, 0xd7, 0xa6, 0x04, 0x78, 0x87, 0x25, 0x6d, 0x95, 0x76, 0x25, 0x1a, 0xc7, 0x0a, 0x5a, 0x00, 0x3a, 0x2d, 0x8e, 0x88, 0x89, 0xbe, 0x71, 0x15, 0xbf, 0xff, 0x0d, + 0xdd, 0x0f, 0xaa, 0xab, 0x1c, 0xab, 0x29, 0x9f, 0xc2, 0xba, 0xbe, 0xf3, 0x97, 0x47, 0x1e, 0x0a, 0xd6, 0xfd, 0x44, 0xfd, 0x1a, 0x86, 0xf4, 0xe1, 0xdc, 0x04, 0xf9, 0x39, 0x8c, 0xf7, 0x82, 0xa2, + 0x8c, 0xeb, 0xe0, 0x94, 0x4c, 0x4d, 0x51, 0xc0, 0x6b, 0x70, 0x0b, 0x56, 0x2b, 0x22, 0xd1, 0x10, 0xd6, 0xb0, 0xdc, 0x50, 0x59, 0x76, 0xe5, 0xdc, 0xda, 0x07, 0x38, 0x83, 0x9a, 0xf5, 0x4e, 0x44, + 0x96, 0x3a, 0x95, 0xbb, 0x30, 0x07, 0x1f, 0x05, 0x52, 0x9f, 0xae, 0xf0, 0x0d, 0x4e, 0xfa, 0xa1, 0x72, 0x44, 0xe4, 0x73, 0x5f, 0xc2, 0xbd, 0x08, 0x2c, 0x12, 0xda, 0x17, 0x5b, 0x36, 0x3a, 0xcf, + 0xf9, 0xe4, 0xd3, 0x7e, 0xfd, 0x29, 0x12, 0xeb, 0x2d, 0x0a, 0xe4, 0x43, 0xb9, 0x03, 0x3f, 0x46, 0x60, 0x91, 0xe3, 0xb2, 0x05, 0x4a, 0x99, 0xb3, 0xdc, 0x68, 0x3e, 0xb5, 0xe2, 0x30, 0xfa, 0x20, + 0x82, 0xc6, 0xf4, 0xe0, 0x12, 0xfa, 0x12, 0x6d, 0x9d, 0x0c, 0x9c, 0x91, 0xba, 0x52, 0x69, 0xe5, 0x7e, 0x46, 0x6c, 0xa8, 0x74, 0x98, 0xa6, 0x26, 0x4a, 0xc3, 0x4a, 0x99, 0x47, 0x8d, 0x00, 0x9c, + 0xa7, 0x22, 0x8b, 0x77, 0x2e, 0x8b, 0xe7, 0xc4, 0x0a, 0xdb, 0x5a, 0xbe, 0xa6, 0x57, 0x8e, 0x17, 0xc8, 0x9e, 0xb9, 0x61, 0xa6, 0x98, 0xbe, 0x18, 0x31, 0x6b, 0xde, 0xd6, 0xd5, 0xf8, 0x58, 0x0d, + 0xe1, 0x0b, 0xa8, 0x9e, 0x7d, 0xdc, 0xee, 0xe9, 0x2a, 0x1f, 0x58, 0x6e, 0x5e, 0xe9, 0xbe, 0x82, 0x76, 0x69, 0x8d, 0x0d, 0x3b, 0x59, 0xaa, 0xd0, 0xba, 0x07, 0xe7, 0x1b, 0x6b, 0x35, 0xd0, 0x94, + 0x85, 0x0d, 0x51, 0xbe, 0x5a, 0xae, 0x67, 0xed, 0x76, 0x10, 0x3b, 0x31, 0x33, 0x6b, 0x1e, 0xa4, 0x6c, 0xe0, 0x20, 0x47, 0x33, 0x9b, 0x82, 0x41, 0x93, 0x0d, 0x3d, 0x69, 0x55, 0xba, 0xa6, 0x81, + 0xc1, 0x4a, 0xee, 0x54, 0x25, 0x19, 0xaa, 0x60, 0x4d, 0x1d, 0x7d, 0x60, 0x87, 0xb2, 0xea, 0xd4, 0x99, 0xed, 0x71, 0xd3, 0x01, 0x42, 0x59, 0x7b, 0x2c, 0x3a, 0xe9, 0x5d, 0x50, 0x20, 0xfa, 0xdf, + 0xa0, 0xc0, 0x7f, 0x3c, 0x28, 0xf0, 0xa9, 0x03, 0x55, 0x9d, 0xdd, 0xcd, 0x67, 0xfa, 0x58, 0x85, 0xee, 0xb7, 0x84, 0x5f, 0x81, 0xba, 0x36, 0xc7, 0x56, 0xe7, 0x3e, 0x58, 0x7a, 0xbb, 0xe4, 0xf9, + 0x61, 0xda, 0x66, 0x36, 0xbb, 0xd8, 0x57, 0x0e, 0x0a, 0xc5, 0xa7, 0x20, 0x8d, 0x42, 0x60, 0xe3, 0x89, 0x74, 0x2b, 0xa5, 0x54, 0xb7, 0x5b, 0xd7, 0xb9, 0xbc, 0xdb, 0x1b, 0x83, 0x6f, 0x01, 0x58, + 0x55, 0x31, 0x15, 0x8a, 0xe2, 0x4d, 0x14, 0x47, 0x6e, 0x2b, 0xcb, 0x1b, 0x6f, 0x0b, 0x9e, 0xda, 0x64, 0xb5, 0x55, 0x42, 0x4c, 0xb3, 0x5a, 0xa4, 0x22, 0xe5, 0xb9, 0xcc, 0x7f, 0xb1, 0x62, 0x7d, + 0x2e, 0x90, 0x77, 0x6f, 0x09, 0xff, 0x7b, 0xa3, 0xe5, 0x27, 0xea, 0x57, 0x2c, 0x3e, 0x9c, 0xbb, 0x2e, 0xe1, 0x23, 0x4c, 0x9a, 0x8e, 0xbd, 0x5b, 0x51, 0x09, 0xcd, 0xb1, 0x27, 0x41, 0x59, 0x2b, + 0x3c, 0xe7, 0x84, 0x42, 0xda, 0x6c, 0xfa, 0xd8, 0x29, 0x34, 0x16, 0xd4, 0xf7, 0xb6, 0x75, 0xa0, 0x40, 0xc1, 0x49, 0xa6, 0x60, 0x92, 0x64, 0x55, 0x0f, 0x23, 0xb9, 0x55, 0xdb, 0x14, 0x54, 0x21, + 0xe2, 0x00, 0x41, 0x9c, 0xa0, 0x9f, 0xcb, 0xcc, 0xe3, 0xf5, 0x3d, 0x9e, 0x18, 0x0d, 0x87, 0x80, 0x43, 0xb2, 0x85, 0xcd, 0x36, 0xfe, 0x6c, 0xb6, 0xad, 0x7c, 0xc7, 0x34, 0x52, 0xef, 0x6a, 0x52, + 0x34, 0xd2, 0x7b, 0xf6, 0xec, 0x07, 0x79, 0x81, 0xf7, 0xb4, 0x2f, 0x60, 0xbc, 0x3f, 0x33, 0x96, 0x27, 0x88, 0x56, 0x7d, 0x89, 0x9c, 0xf5, 0x5c, 0xab, 0xed, 0xa4, 0x14, 0xe0, 0x82, 0x09, 0xcb, + 0x52, 0x05, 0x75, 0xb8, 0xdc, 0xc1, 0xd1, 0x92, 0x62, 0x7a, 0xc0, 0x8b, 0x72, 0x0e, 0x5e, 0x62, 0x8e, 0x9a, 0xb4, 0x6a, 0xd5, 0x25, 0x16, 0x0b, 0xfb, 0x87, 0x13, 0x7d, 0xd2, 0x8e, 0xe7, 0xb8, + 0x34, 0xb4, 0x0e, 0x06, 0x07, 0x3d, 0x27, 0xb4, 0x86, 0xd1, 0x48, 0x52, 0xab, 0x5b, 0x53, 0x80, 0xec, 0x84, 0x79, 0x8c, 0xcb, 0x7c, 0xee, 0xc1, 0x95, 0xa9, 0xf9, 0xfd, 0x43, 0x14, 0xe5, 0xc7, + 0x9b, 0xef, 0x49, 0x3e, 0x8f, 0x43, 0x7b, 0xa5, 0xfc, 0x06, 0xd8, 0x6b, 0x7b, 0xac, 0x0f, 0x18, 0x09, 0x00, 0xf6, 0xc2, 0xaf, 0xad, 0x1e, 0x45, 0x71, 0xb4, 0xa1, 0x8d, 0x82, 0x62, 0x98, 0x1d, + 0x26, 0x34, 0x3d, 0xed, 0xd4, 0xf4, 0x79, 0x4e, 0xea, 0xb2, 0xe8, 0x27, 0x07, 0x79, 0x9d, 0xae, 0x58, 0x9b, 0x30, 0xf7, 0xa5, 0x6a, 0x07, 0xec, 0x70, 0x9e, 0xb7, 0x4b, 0x88, 0xd4, 0x31, 0xec, + 0xa8, 0xd9, 0xdb, 0xbd, 0x7f, 0x3a, 0x0e, 0x6a, 0x8d, 0xf3, 0xe0, 0xe0, 0x9f, 0x29, 0x27, 0xb2, 0x4c, 0x78, 0x4c, 0xbe, 0xaf, 0x0f, 0x2e, 0x28, 0xff, 0x9c, 0xb0, 0xff, 0x96, 0xf0, 0x05, 0x95, + 0x37, 0xcd, 0xb1, 0x62, 0x7f, 0x81, 0xab, 0xd2, 0x50, 0x17, 0x0b, 0x76, 0xcd, 0xad, 0xa2, 0xa5, 0x1d, 0xf0, 0xeb, 0x52, 0x83, 0xa1, 0xa4, 0xdd, 0xee, 0xda, 0x54, 0xf6, 0x31, 0x04, 0x04, 0x96, + 0x19, 0x1d, 0x2f, 0x4e, 0xa8, 0x89, 0x6c, 0xd5, 0x2d, 0x8b, 0xf4, 0xfd, 0x26, 0xd7, 0x17, 0x76, 0x32, 0xc5, 0x3a, 0x07, 0xa2, 0x8d, 0x4c, 0x41, 0x77, 0xdd, 0x66, 0x58, 0x16, 0x1e, 0xde, 0xed, + 0x49, 0x27, 0xef, 0x0f, 0x2d, 0xa4, 0xb7, 0x23, 0xdc, 0x72, 0x7e, 0xc8, 0xc9, 0xe3, 0x39, 0xf5, 0x24, 0x48, 0xeb, 0x32, 0x48, 0xab, 0xc0, 0xfa, 0xfd, 0x1a, 0x9f, 0xf4, 0xe6, 0x96, 0x4f, 0xe9, + 0xc7, 0x2e, 0xf7, 0x4c, 0xff, 0x6e, 0x1b, 0xbd, 0x9b, 0xc2, 0xec, 0xd7, 0xa7, 0xf1, 0x81, 0x3f, 0x96, 0xc0, 0x1c, 0x3b, 0x48, 0x3f, 0xe7, 0x32, 0x83, 0x3f, 0x72, 0x2e, 0xbf, 0xee, 0x8d, 0xd6, + 0xda, 0x25, 0xe9, 0x70, 0x11, 0xe7, 0xd1, 0xf9, 0x4c, 0x3b, 0x0a, 0x6c, 0x15, 0xde, 0x01, 0x15, 0xf7, 0xa7, 0x03, 0x6a, 0x9c, 0x87, 0xac, 0x67, 0x96, 0x46, 0xb8, 0x03, 0x82, 0x65, 0xba, 0xa0, + 0x5d, 0x45, 0x41, 0xd8, 0xd3, 0xc0, 0x0c, 0x27, 0x43, 0xd7, 0x4f, 0x08, 0xbb, 0x63, 0xc2, 0xa3, 0xa1, 0x21, 0x32, 0x4f, 0x05, 0x78, 0xb8, 0x46, 0xf7, 0x21, 0x99, 0xf8, 0x15, 0x8f, 0x31, 0xcc, + 0xac, 0x38, 0xcd, 0x7e, 0x2e, 0x13, 0x59, 0x05, 0x5e, 0x6a, 0xc4, 0x13, 0xa7, 0x0f, 0xee, 0xe9, 0x22, 0xd1, 0x87, 0x7c, 0xcb, 0xdf, 0xd0, 0xbd, 0xce, 0xdf, 0x97, 0xd6, 0xf5, 0x9b, 0x1e, 0xe1, + 0x0c, 0xa5, 0x1c, 0x37, 0xd8, 0x74, 0x31, 0xa7, 0x8e, 0xb0, 0xd8, 0x77, 0xfa, 0xb6, 0x5f, 0x9b, 0x87, 0x43, 0xc9, 0xb4, 0xdb, 0xd4, 0x05, 0x89, 0x03, 0xe3, 0xf5, 0xba, 0xc5, 0x51, 0x5d, 0xbf, + 0xa3, 0xce, 0x15, 0x8c, 0xf6, 0x79, 0x4f, 0xf6, 0xe6, 0x92, 0x80, 0x52, 0x9b, 0x8e, 0x7d, 0xa1, 0x5c, 0x04, 0x08, 0xcb, 0x37, 0x8b, 0x5d, 0xe6, 0x30, 0xd9, 0x46, 0x24, 0xbb, 0xda, 0xdf, 0x6f, + 0x0b, 0x0c, 0x61, 0xc3, 0x51, 0xdf, 0x74, 0x7c, 0xbf, 0x6e, 0xe6, 0x83, 0x6b, 0x5c, 0x7c, 0x2b, 0x9a, 0x79, 0xfd, 0x3f, 0x76, 0x4d, 0xf3, 0xa6, 0x32, 0xec, 0x1b, 0x8e, 0x39, 0xa0, 0x84, 0xb8, + 0xdf, 0xd7, 0x9d, 0x89, 0xa5, 0xf5, 0x7c, 0xb9, 0x5c, 0x1a, 0x5c, 0x65, 0x28, 0xfb, 0x50, 0x26, 0x28, 0x97, 0xee, 0x33, 0xd9, 0x6a, 0xea, 0x18, 0x77, 0xf7, 0x70, 0xdb, 0x68, 0x30, 0xb5, 0x42, + 0xbb, 0x7d, 0x8d, 0x86, 0x8b, 0x61, 0x51, 0x97, 0x51, 0x0f, 0x70, 0x67, 0x48, 0x81, 0x97, 0x14, 0x3e, 0xc3, 0xf8, 0x61, 0x66, 0x33, 0x7c, 0x80, 0x8c, 0x31, 0xc1, 0x57, 0x71, 0x60, 0x39, 0x13, + 0x23, 0xad, 0x82, 0x3b, 0x20, 0x3c, 0x66, 0xc0, 0x79, 0x25, 0x7b, 0x45, 0xe2, 0xb9, 0x31, 0xd6, 0x78, 0x53, 0xf0, 0x73, 0xde, 0xf5, 0x35, 0x08, 0x83, 0x2c, 0x65, 0x75, 0xc0, 0x50, 0x6e, 0x4a, + 0x2f, 0x06, 0xaf, 0xd0, 0xcc, 0xa3, 0xb4, 0xd0, 0xb9, 0x95, 0xe8, 0x91, 0x1c, 0x89, 0x26, 0xf5, 0xe1, 0xb4, 0xd9, 0x99, 0x54, 0x3e, 0x48, 0xa8, 0x7b, 0x76, 0xb1, 0x75, 0x6f, 0xe3, 0xfb, 0xb3, + 0xcd, 0x6e, 0x64, 0x82, 0xdf, 0x1d, 0x3d, 0xf0, 0x44, 0xa7, 0xe2, 0xb6, 0xf7, 0x7c, 0xbd, 0xe6, 0xb8, 0xa6, 0x64, 0x85, 0xc7, 0x7c, 0x40, 0xae, 0xaf, 0x5d, 0xd5, 0x43, 0xfc, 0xe4, 0xfd, 0xf1, + 0x29, 0x6b, 0x88, 0x51, 0xd5, 0xa5, 0x11, 0xbf, 0xd9, 0x59, 0x91, 0x8f, 0x77, 0x04, 0xd5, 0xc4, 0x6d, 0xe2, 0xb8, 0x0b, 0xec, 0xda, 0x9f, 0x5c, 0x7d, 0x71, 0xf3, 0x2c, 0x48, 0xeb, 0x2f, 0xb6, + 0xe1, 0x11, 0x4b, 0xdd, 0x7d, 0x62, 0xf7, 0xd6, 0xbc, 0xc7, 0x53, 0x47, 0xdf, 0x79, 0x16, 0x38, 0xb9, 0x77, 0x65, 0x6c, 0x62, 0xe9, 0xcb, 0x18, 0x9f, 0x87, 0x24, 0xc1, 0x81, 0x06, 0xa8, 0xe6, + 0xd5, 0xfe, 0x34, 0x30, 0xd3, 0x42, 0x30, 0x9c, 0x50, 0x41, 0x99, 0x45, 0xeb, 0xcf, 0x39, 0x2b, 0xe6, 0xec, 0xe0, 0xac, 0x19, 0x9b, 0x63, 0xb3, 0x9a, 0x51, 0xe8, 0x6e, 0x1b, 0x9a, 0x64, 0xba, + 0x6f, 0x96, 0xa9, 0x6d, 0xcf, 0x57, 0xcb, 0x16, 0xf2, 0x23, 0x80, 0xd3, 0x48, 0x9a, 0x9f, 0xc5, 0xd5, 0xc9, 0xe1, 0xb0, 0xa3, 0xe3, 0x11, 0xac, 0x42, 0xa8, 0xf2, 0xe3, 0x75, 0x87, 0xde, 0x85, + 0xd1, 0x7e, 0xbd, 0xb5, 0x3f, 0x52, 0xf0, 0xec, 0x95, 0xec, 0xe5, 0x43, 0x78, 0x69, 0x8c, 0x2d, 0x7c, 0xb6, 0xdd, 0xad, 0x7c, 0x70, 0x46, 0xd5, 0xf9, 0x89, 0x2c, 0x1b, 0x6a, 0x1a, 0x97, 0x71, + 0x74, 0xc4, 0x66, 0xd5, 0x59, 0xad, 0x61, 0xdb, 0xec, 0xf6, 0xa1, 0x72, 0xf2, 0x9a, 0x65, 0x99, 0xc4, 0x3d, 0x4b, 0xd6, 0x46, 0xa7, 0x24, 0x0c, 0x1d, 0xaf, 0x61, 0x69, 0xbd, 0xe5, 0x23, 0x75, + 0xd6, 0x6f, 0x0e, 0x5d, 0xe1, 0x7b, 0x15, 0xeb, 0x1c, 0x56, 0xe7, 0x10, 0x25, 0x18, 0x7c, 0x9e, 0xac, 0x3c, 0x39, 0x11, 0x46, 0xc4, 0x50, 0x18, 0x75, 0x96, 0x04, 0xd6, 0xa4, 0x8a, 0x6f, 0x45, + 0x74, 0xbf, 0xd8, 0xd9, 0xbf, 0x08, 0x75, 0xbe, 0x83, 0x6b, 0x53, 0x5a, 0xce, 0x24, 0x31, 0xee, 0x39, 0x3b, 0x41, 0x7f, 0x88, 0x87, 0x70, 0x7d, 0x26, 0x7b, 0xc5, 0xf5, 0xb9, 0x31, 0xb9, 0x52, + 0xfb, 0x19, 0xd7, 0x63, 0xe8, 0x19, 0x79, 0x93, 0x9c, 0x62, 0x93, 0xf7, 0x23, 0xda, 0x3b, 0x1f, 0x48, 0x2d, 0xb2, 0x70, 0x4d, 0x3d, 0x1e, 0x30, 0x62, 0x01, 0x05, 0x5c, 0x43, 0xed, 0x97, 0x6a, + 0x01, 0x99, 0x56, 0x27, 0xe1, 0xf6, 0x19, 0xf4, 0x21, 0x29, 0x0e, 0x09, 0x27, 0xdd, 0x14, 0xe1, 0x19, 0xd6, 0xcd, 0x02, 0x89, 0xf1, 0x93, 0x51, 0x68, 0x69, 0xa9, 0x98, 0xdd, 0x49, 0x3c, 0xf1, + 0xc3, 0x02, 0x5d, 0x60, 0xe4, 0x18, 0xeb, 0xf0, 0x9b, 0x57, 0x7d, 0x4a, 0x3a, 0x7d, 0x17, 0x16, 0xfc, 0x0f, 0x3c, 0xfd, 0x0f, 0x70, 0x79, 0xa6, 0xff, 0x1e, 0x9f, 0xa7, 0x93, 0x93, 0x1b, 0xf9, + 0x9f, 0x81, 0x3a, 0x65, 0x69, 0x42, 0x9e, 0xc5, 0xf9, 0x7a, 0x73, 0xa6, 0x97, 0xb2, 0x4d, 0x03, 0xb5, 0x5f, 0x49, 0x46, 0x09, 0x45, 0x5a, 0x33, 0x5f, 0x9f, 0xb5, 0xb6, 0xd7, 0xbb, 0x98, 0x36, + 0x28, 0x72, 0x08, 0x40, 0xde, 0x0e, 0x5b, 0xf2, 0x10, 0xe4, 0x88, 0x35, 0x28, 0xe6, 0x36, 0xc4, 0x33, 0xc8, 0x5a, 0x48, 0x02, 0xc6, 0x2a, 0x51, 0x73, 0xe8, 0x4c, 0x74, 0xc9, 0x30, 0xc3, 0xb1, + 0x47, 0x98, 0x65, 0xfa, 0x60, 0xfd, 0xce, 0x27, 0x7d, 0xf4, 0x93, 0xb3, 0xc1, 0x17, 0x53, 0xf2, 0xdd, 0x54, 0x7b, 0xf6, 0x60, 0xfd, 0x7a, 0x52, 0xe6, 0x65, 0x90, 0xd6, 0xee, 0xad, 0x38, 0xf9, + 0x3d, 0x3e, 0xfe, 0x01, 0x36, 0xe8, 0x85, 0xec, 0x05, 0xf4, 0x97, 0xc6, 0x95, 0x87, 0xff, 0x81, 0x09, 0x82, 0x27, 0xb4, 0x68, 0xec, 0x4d, 0x44, 0xcb, 0xe2, 0x83, 0x22, 0x49, 0xf6, 0x4c, 0x59, + 0x33, 0xda, 0xb9, 0x59, 0x58, 0xb9, 0x1b, 0x74, 0x23, 0xa6, 0xd5, 0xcd, 0xc3, 0xa6, 0x0a, 0x92, 0x20, 0x36, 0x9e, 0xc8, 0xde, 0xdb, 0xcd, 0x1f, 0x90, 0x4f, 0x3e, 0x52, 0xbf, 0x74, 0xef, 0xe3, + 0xb9, 0xb1, 0x7e, 0xdd, 0x60, 0x01, 0x52, 0x32, 0x46, 0xc7, 0x98, 0xce, 0xcd, 0xa4, 0x30, 0xa4, 0x4e, 0x4e, 0xb9, 0xa6, 0x37, 0xa7, 0xd9, 0x96, 0x8b, 0x0c, 0x69, 0xe7, 0x96, 0xad, 0xef, 0x2e, + 0xa8, 0x08, 0xa4, 0x11, 0x34, 0xc0, 0xd2, 0x73, 0x19, 0xef, 0x42, 0x04, 0xf4, 0x32, 0x38, 0x99, 0x42, 0xeb, 0x94, 0x4c, 0x97, 0x20, 0xaa, 0x32, 0x7b, 0x53, 0xcc, 0x20, 0x20, 0x6f, 0x88, 0x5d, + 0x3b, 0x3f, 0xf0, 0xd3, 0xdd, 0x92, 0xff, 0x6c, 0x28, 0xb8, 0xbd, 0xde, 0x75, 0x83, 0xba, 0xab, 0x1d, 0x78, 0x48, 0x73, 0xf9, 0x86, 0xf0, 0x2b, 0x0c, 0xb7, 0x8d, 0x70, 0x64, 0x88, 0x4d, 0x2a, + 0x16, 0x2b, 0x7c, 0x6a, 0x3b, 0xf3, 0x62, 0xba, 0xdf, 0xad, 0xe2, 0xbe, 0x80, 0x67, 0x1d, 0x85, 0x6f, 0xd2, 0x1a, 0xeb, 0x08, 0xae, 0xdd, 0x72, 0xc5, 0x49, 0x09, 0x22, 0x22, 0x9b, 0x4d, 0xf5, + 0x28, 0x56, 0xb7, 0xc2, 0x5a, 0x8c, 0x0b, 0x0f, 0x5b, 0x20, 0x43, 0x79, 0x80, 0x79, 0xc5, 0x38, 0x84, 0xb3, 0xa2, 0x55, 0x3a, 0xdb, 0x75, 0x74, 0xb2, 0x23, 0x8d, 0x79, 0xbb, 0x61, 0xc8, 0xc6, + 0x8b, 0x46, 0xc8, 0x6a, 0xdf, 0xf1, 0x21, 0x9f, 0x98, 0x96, 0x9b, 0xdf, 0xf6, 0x13, 0x63, 0xf8, 0x6d, 0xc9, 0xe1, 0x1b, 0x04, 0x6f, 0xdc, 0x7d, 0xeb, 0x32, 0xb8, 0xbf, 0x89, 0x3e, 0xe2, 0xea, + 0xf0, 0xe5, 0x13, 0x5e, 0xc0, 0xff, 0x70, 0xfe, 0x6a, 0x03, 0x1c, 0x61, 0x4e, 0x35, 0xf1, 0xa1, 0x34, 0x63, 0x94, 0x56, 0xd7, 0xe1, 0xca, 0x68, 0xa6, 0x52, 0x19, 0x91, 0x47, 0x68, 0xb7, 0xd3, + 0xac, 0xa3, 0x66, 0x0b, 0x58, 0xb7, 0xdc, 0x2b, 0x46, 0x91, 0xd1, 0xf2, 0x1e, 0x87, 0xe6, 0x73, 0x16, 0xe5, 0xe8, 0x46, 0x3b, 0x42, 0x07, 0x6d, 0x27, 0x48, 0x8b, 0xb9, 0x44, 0x1a, 0x4a, 0x26, + 0xf0, 0x2a, 0x45, 0xae, 0xb8, 0x83, 0x6f, 0xf3, 0x3b, 0x65, 0x2d, 0xa1, 0x5e, 0x60, 0xc5, 0xdc, 0x63, 0x1a, 0xe4, 0xc7, 0xfd, 0x8c, 0x5f, 0x12, 0x29, 0xff, 0xcd, 0xd8, 0x38, 0x77, 0x15, 0x66, + 0x0f, 0xaa, 0x2f, 0xee, 0x3c, 0xe4, 0xde, 0x08, 0x39, 0xa9, 0x3d, 0x56, 0xad, 0x31, 0x4c, 0xfb, 0x79, 0xd8, 0xc1, 0x12, 0x82, 0xce, 0xba, 0x88, 0x62, 0xdb, 0x43, 0x6e, 0x0d, 0x5b, 0x44, 0x58, + 0x97, 0x70, 0x48, 0x76, 0x1b, 0x74, 0xea, 0x02, 0x11, 0x11, 0xb7, 0xbb, 0x74, 0xcf, 0x9f, 0x81, 0xe4, 0x3c, 0x9d, 0x2f, 0xcf, 0x53, 0x41, 0x93, 0x9c, 0x98, 0x89, 0x30, 0x24, 0x12, 0xcf, 0x04, + 0x50, 0xc4, 0x54, 0x1f, 0xba, 0x1c, 0x95, 0x69, 0xe7, 0x01, 0x0d, 0x67, 0x12, 0x2e, 0x1f, 0xf1, 0x11, 0x19, 0x2d, 0x3f, 0xab, 0x35, 0x3e, 0x54, 0x12, 0xba, 0x3f, 0x60, 0xe3, 0xc7, 0xa1, 0xaa, + 0x8d, 0xbb, 0xdb, 0xff, 0x3f, 0x38, 0x12, 0xd7, 0xc7, 0xdc, 0x1b, 0x8b, 0xeb, 0xc5, 0xb1, 0xa3, 0x11, 0xfa, 0x84, 0x33, 0xa5, 0x30, 0x91, 0x76, 0xdb, 0x7e, 0x8f, 0x43, 0xb5, 0xad, 0x21, 0xe9, + 0x4e, 0x4f, 0xb3, 0x39, 0x0e, 0x26, 0xdb, 0x05, 0x27, 0xee, 0x58, 0xd9, 0xed, 0xa8, 0x1a, 0x1f, 0x86, 0x3a, 0xca, 0x8e, 0xd5, 0x66, 0x27, 0xf4, 0xed, 0x1a, 0x64, 0xd1, 0x69, 0xd1, 0xc0, 0x15, + 0x03, 0x89, 0xf5, 0x69, 0x8d, 0x8a, 0x73, 0x48, 0xf5, 0xb8, 0x7d, 0x62, 0x9d, 0xba, 0x73, 0xd0, 0x69, 0x8d, 0x3e, 0x62, 0xe1, 0xfa, 0xdf, 0x18, 0x8d, 0xfc, 0x7f, 0x41, 0xe8, 0x7d, 0x21, 0xfb, + 0x84, 0x76, 0x3e, 0x5a, 0xe8, 0x85, 0x27, 0x05, 0xeb, 0xc8, 0xeb, 0xa6, 0x32, 0x3a, 0x24, 0xc8, 0xac, 0x43, 0x60, 0x6a, 0xf0, 0x26, 0xe8, 0x65, 0xb5, 0x11, 0x32, 0xea, 0x47, 0x7c, 0xae, 0x4f, + 0x19, 0xa7, 0xda, 0xfd, 0x32, 0x1a, 0xe7, 0x9e, 0xee, 0xfc, 0xb1, 0xdd, 0xf1, 0x03, 0xfd, 0x17, 0x2c, 0xde, 0x9d, 0x1d, 0x13, 0xa4, 0x09, 0x4f, 0xa4, 0x05, 0xaf, 0xcb, 0x4d, 0xb4, 0xee, 0x92, + 0x98, 0x62, 0x2a, 0x81, 0xf5, 0xb5, 0x2e, 0x33, 0x57, 0x83, 0x97, 0x7b, 0xd9, 0x08, 0x9e, 0xa8, 0xc9, 0x9d, 0xd2, 0xf0, 0xee, 0xa7, 0x13, 0x40, 0xff, 0x50, 0x8f, 0x30, 0x79, 0x2f, 0x64, 0x6f, + 0x85, 0x63, 0x9e, 0x1a, 0x93, 0x2b, 0xb5, 0x9f, 0xbf, 0xa1, 0xe5, 0x56, 0xae, 0xb7, 0xfc, 0x3c, 0x63, 0xd7, 0x1c, 0xe6, 0x30, 0x2d, 0x21, 0x2e, 0xeb, 0x48, 0xcc, 0xf6, 0x7c, 0x8d, 0x32, 0x40, + 0x56, 0x40, 0x03, 0x6a, 0x57, 0x3d, 0xdf, 0x68, 0x0d, 0xd3, 0x1a, 0xc2, 0xb1, 0x6d, 0x0e, 0x94, 0xb3, 0xa0, 0x9b, 0x6d, 0xe2, 0xee, 0xa0, 0x40, 0xd3, 0xce, 0xab, 0x39, 0xec, 0x50, 0x7e, 0x7e, + 0x9e, 0x13, 0x7a, 0xd5, 0x9b, 0x8d, 0x44, 0x30, 0x6b, 0x23, 0xe6, 0x17, 0x8f, 0x19, 0x05, 0xac, 0x2c, 0xc9, 0xb3, 0xf4, 0xf2, 0xee, 0x4e, 0x12, 0xd4, 0xb5, 0xf3, 0x2c, 0xcc, 0x7d, 0x88, 0xe0, + 0xba, 0x99, 0x81, 0xc2, 0xa7, 0xaa, 0x6a, 0xc8, 0xc7, 0x20, 0xe7, 0xb7, 0x55, 0xd5, 0x3e, 0x5c, 0x7a, 0x13, 0x4e, 0xf6, 0x39, 0xf1, 0x56, 0x56, 0x26, 0x13, 0xdb, 0xa8, 0x8d, 0x27, 0xaa, 0xe8, + 0xfb, 0x94, 0xc1, 0x97, 0xcb, 0x81, 0xfd, 0x94, 0x07, 0xf8, 0x8b, 0x97, 0x7a, 0x2d, 0xcc, 0xfd, 0x9c, 0xa0, 0xfd, 0xed, 0xc5, 0x5b, 0x0d, 0xe1, 0xcb, 0x95, 0x0f, 0x99, 0x88, 0x8b, 0xdb, 0x2f, + 0x88, 0x77, 0xd5, 0x4a, 0xae, 0x00, 0x19, 0xd7, 0x87, 0xbd, 0x0d, 0xe7, 0x46, 0xae, 0x9e, 0x00, 0xcf, 0x9f, 0xd1, 0x1b, 0x78, 0xef, 0xa9, 0x66, 0x3e, 0x13, 0xb9, 0xa7, 0x92, 0xb9, 0x90, 0x7e, + 0x5b, 0x18, 0x6e, 0xfc, 0xec, 0xfb, 0xf0, 0x8c, 0xa7, 0x68, 0xb6, 0x37, 0x67, 0xae, 0xc9, 0x87, 0xc8, 0x71, 0x2a, 0x18, 0xd6, 0xf4, 0x33, 0x8a, 0xc3, 0xc2, 0xb5, 0xb9, 0x9a, 0xf5, 0x69, 0xd3, + 0x07, 0x64, 0x86, 0x21, 0x62, 0xa9, 0x7b, 0x0b, 0x50, 0x3f, 0x08, 0x56, 0xa5, 0x87, 0x44, 0xba, 0xe3, 0x86, 0x63, 0x12, 0xf9, 0xdb, 0x45, 0x41, 0xcd, 0x57, 0xeb, 0x3a, 0x07, 0xdd, 0x81, 0xf0, + 0x65, 0xbd, 0xd1, 0x13, 0x09, 0x4c, 0xd1, 0x41, 0x9f, 0x2a, 0xf4, 0xd1, 0xcc, 0xb1, 0xf3, 0x19, 0x4c, 0x54, 0xca, 0x4f, 0x34, 0xe9, 0x3f, 0x2f, 0x5e, 0x64, 0x65, 0xa5, 0x73, 0xad, 0xba, 0xf8, + 0x94, 0x42, 0xfc, 0xdf, 0x1f, 0x25, 0xbd, 0xa7, 0x0e, 0xf9, 0x4e, 0x19, 0xbc, 0x89, 0x26, 0x44, 0x3f, 0xdd, 0x51, 0x19, 0x65, 0x69, 0x0c, 0xf7, 0x49, 0xdc, 0x49, 0x4a, 0x73, 0x23, 0xf7, 0xe9, + 0xee, 0xf7, 0xae, 0x57, 0xbf, 0xff, 0x8d, 0xff, 0xf9, 0x68, 0x4a, 0x78, 0xd9, 0xe8, 0xff, 0x3f, 0xdb, 0xb9, 0xf0, 0xd7, 0xe5, 0xd3, 0xa3, 0xbf, 0xb8, 0xef, 0xda, 0x3d, 0xdb, 0xc9, 0x4b, 0xc7, + 0x32, 0xae, 0x79, 0x4a, 0x6f, 0xaf, 0x38, 0xa2, 0x58, 0xdc, 0xd7, 0x1e, 0x60, 0xbf, 0x7e, 0x7d, 0xf4, 0x02, 0x7b, 0xb4, 0xa4, 0xda, 0x77, 0x9e, 0x60, 0xa3, 0x8b, 0xac, 0x2d, 0x6d, 0xe4, 0xa8, + 0xd3, 0x1b, 0x26, 0x52, 0x63, 0x8d, 0x5c, 0x9a, 0x9b, 0xde, 0xad, 0x58, 0x0a, 0x4c, 0x5b, 0x2e, 0x3a, 0xb2, 0x47, 0x78, 0x89, 0x52, 0x16, 0x5c, 0x05, 0x02, 0x21, 0x4b, 0x84, 0x31, 0x95, 0x0e, + 0x53, 0x3e, 0x59, 0xd1, 0xd4, 0x32, 0xcd, 0x2b, 0x6b, 0x9f, 0xf0, 0x9b, 0x7d, 0xb6, 0xa0, 0xb6, 0xe2, 0xba, 0xac, 0xa9, 0xc6, 0x06, 0x3b, 0xa9, 0xce, 0xc2, 0xa1, 0xc2, 0x96, 0x04, 0x30, 0x4a, + 0xb9, 0xf7, 0x16, 0xa9, 0x8f, 0x63, 0xf1, 0x8d, 0x55, 0xe8, 0x41, 0xa3, 0xd0, 0xfb, 0x47, 0xbc, 0x30, 0x59, 0xcf, 0x27, 0xbe, 0x28, 0x2b, 0xf2, 0xeb, 0x1e, 0x64, 0x29, 0xb8, 0xf7, 0xd3, 0x96, + 0x09, 0x88, 0xc5, 0xca, 0x34, 0x15, 0xb7, 0x0d, 0xca, 0x0c, 0x38, 0x65, 0x61, 0xb0, 0x38, 0xb7, 0x40, 0x45, 0xf1, 0x12, 0xbf, 0xa2, 0xad, 0xb3, 0xe2, 0x48, 0xee, 0x31, 0x67, 0x36, 0xdb, 0x2e, + 0xdb, 0x1e, 0x20, 0xbf, 0x86, 0x63, 0x4c, 0xeb, 0xe8, 0xb9, 0x19, 0x50, 0xf9, 0x66, 0xd6, 0x3a, 0x2c, 0x6b, 0xa7, 0xd1, 0x6a, 0x90, 0x86, 0x83, 0x04, 0x26, 0xe7, 0x9d, 0xdb, 0x7d, 0x03, 0xd9, + 0xc8, 0x8f, 0xf1, 0xab, 0x59, 0xff, 0x57, 0xc5, 0xc4, 0xae, 0x5b, 0x64, 0xed, 0xdc, 0x2d, 0x20, 0x8c, 0x3d, 0xe4, 0x43, 0xfb, 0x42, 0xf5, 0x79, 0x13, 0xbe, 0x1c, 0x5f, 0x39, 0xad, 0x11, 0xa2, + 0x1f, 0x4c, 0xcf, 0xcc, 0xb6, 0x14, 0xf5, 0x6a, 0x39, 0x43, 0xb5, 0xc3, 0xfc, 0x54, 0x98, 0x89, 0x0f, 0x63, 0x5b, 0x48, 0x63, 0x0b, 0x88, 0x5d, 0xae, 0xe7, 0x2a, 0x98, 0xd2, 0xa9, 0x1b, 0xb9, + 0xca, 0x26, 0x25, 0xf7, 0x65, 0x2f, 0x2b, 0xf0, 0x1a, 0xcd, 0x79, 0x2d, 0xdc, 0x9f, 0x97, 0xd3, 0x01, 0x24, 0xf5, 0x23, 0xa2, 0x4c, 0xed, 0x53, 0x31, 0x14, 0x11, 0x22, 0x89, 0x5d, 0x1f, 0x9b, + 0xd0, 0xd4, 0x6e, 0x1e, 0x33, 0x2f, 0x7c, 0xdc, 0xc7, 0xde, 0x31, 0xb6, 0xef, 0x38, 0x98, 0xcb, 0x1e, 0x4a, 0xdd, 0xe5, 0x68, 0xef, 0x15, 0xcd, 0x7b, 0xef, 0xda, 0xf6, 0x88, 0xbb, 0xed, 0x4f, + 0xc5, 0xf2, 0xc8, 0x71, 0x2e, 0xb7, 0x45, 0x3e, 0x9f, 0xb5, 0xbb, 0x78, 0x5a, 0xd5, 0x8d, 0xb8, 0x6a, 0x1d, 0xae, 0x4a, 0xc9, 0x55, 0x6a, 0x6d, 0x76, 0x6d, 0x8b, 0x43, 0x70, 0xb1, 0x36, 0x2c, + 0xee, 0x2c, 0xc7, 0x22, 0x08, 0x6c, 0xbb, 0xde, 0x9a, 0x02, 0x50, 0x81, 0x74, 0xdb, 0xa1, 0xc5, 0x18, 0xb7, 0xad, 0x29, 0x08, 0x64, 0xa4, 0x14, 0xc9, 0x0b, 0x91, 0xae, 0x36, 0x36, 0x13, 0x64, + 0x9e, 0xba, 0xdc, 0x4d, 0x01, 0xb1, 0xed, 0x76, 0x23, 0x64, 0x87, 0x77, 0x95, 0xf0, 0xbe, 0xd1, 0x62, 0xd4, 0xdf, 0xd4, 0x1c, 0x20, 0xde, 0x15, 0x63, 0x1c, 0x0b, 0x5c, 0xfd, 0x54, 0x6c, 0xe0, + 0xfa, 0x7f, 0x42, 0x7c, 0x2a, 0xc3, 0xf8, 0x25, 0x4c, 0xfa, 0xb2, 0x49, 0x30, 0x52, 0x0b, 0x08, 0x4e, 0x14, 0x17, 0x0c, 0x4b, 0x25, 0x08, 0x82, 0xd6, 0x36, 0x8e, 0x1a, 0xb5, 0x8f, 0x38, 0xe9, + 0xca, 0xd2, 0xb6, 0x9e, 0x38, 0x0f, 0x97, 0x25, 0x9e, 0x7a, 0x0d, 0x65, 0xda, 0xeb, 0xd9, 0x4e, 0x8e, 0x88, 0x44, 0x00, 0xbb, 0x1d, 0xdf, 0x62, 0x03, 0xbf, 0xb3, 0x56, 0xe9, 0x7c, 0x9f, 0xae, + 0xcc, 0x39, 0xeb, 0x1b, 0x58, 0x95, 0x99, 0x72, 0x8f, 0x0f, 0xf7, 0xf2, 0xc4, 0xfe, 0x80, 0x9c, 0x11, 0xb6, 0x57, 0xd0, 0xa8, 0x8f, 0x05, 0x72, 0xe2, 0xcc, 0x36, 0x2a, 0xff, 0x8f, 0x15, 0x67, + 0xa9, 0x63, 0x3f, 0x1b, 0x08, 0xb0, 0x8f, 0xb5, 0x6a, 0x9f, 0xee, 0xaa, 0xcb, 0x26, 0x7d, 0xde, 0xe2, 0xae, 0x95, 0x21, 0xde, 0xcf, 0xf0, 0xb7, 0xe6, 0xc7, 0x2f, 0x8c, 0x6b, 0x1f, 0xd4, 0x78, + 0x97, 0x3b, 0xbe, 0xcc, 0x2f, 0xf0, 0x42, 0x81, 0xf8, 0x5b, 0x7b, 0xda, 0xad, 0x97, 0xf7, 0x76, 0x06, 0xea, 0x43, 0xf1, 0x90, 0xf1, 0xa3, 0x6f, 0x84, 0x2d, 0x38, 0xb9, 0xfc, 0x9d, 0x50, 0x9f, + 0x7c, 0x5f, 0x7f, 0xdd, 0x1b, 0x7d, 0x52, 0x66, 0x90, 0x98, 0x00, 0x38, 0x7a, 0xbf, 0xed, 0x5c, 0x80, 0xe4, 0x1b, 0x2d, 0xb3, 0xcc, 0x53, 0xbb, 0x93, 0x6c, 0xb1, 0x21, 0x50, 0xb0, 0x2e, 0x77, + 0xce, 0x61, 0xdb, 0x20, 0xdc, 0xa2, 0x8b, 0x3c, 0xab, 0x4e, 0x1b, 0x13, 0x36, 0x9a, 0x6c, 0x01, 0x68, 0xf0, 0x49, 0xb3, 0x12, 0x68, 0x3a, 0x3f, 0xf0, 0x64, 0xd1, 0x34, 0x95, 0x55, 0x9e, 0x8b, + 0x64, 0xb6, 0x37, 0xb6, 0xab, 0x39, 0xc8, 0x61, 0xff, 0x79, 0x35, 0xdb, 0x5b, 0x9e, 0xc3, 0x6b, 0x82, 0x88, 0xa2, 0x31, 0xe2, 0xdf, 0xcf, 0xcc, 0xfe, 0x27, 0xae, 0xe6, 0x2a, 0xe2, 0x55, 0x96, + 0xef, 0x24, 0xc6, 0xa4, 0x2e, 0x8d, 0x0b, 0x90, 0xaf, 0x41, 0x84, 0x9f, 0x18, 0xaa, 0xaf, 0x23, 0x53, 0x6f, 0xba, 0x48, 0xe4, 0x13, 0xc3, 0x54, 0x06, 0x37, 0x75, 0xfd, 0x6d, 0x0e, 0x20, 0x3f, + 0x33, 0x4a, 0xef, 0xa4, 0xe2, 0xfb, 0x7c, 0xd2, 0xa3, 0xc6, 0xd1, 0x57, 0xf2, 0x97, 0x71, 0x7e, 0x69, 0x4c, 0xf0, 0xf1, 0x26, 0x50, 0x53, 0x23, 0xdc, 0x10, 0x27, 0xc4, 0xa3, 0x0c, 0xf9, 0x47, + 0x98, 0x0b, 0x17, 0x02, 0x23, 0x37, 0x9b, 0x85, 0x73, 0x2e, 0x38, 0xbb, 0x9c, 0x0d, 0x0b, 0x7b, 0xed, 0xb4, 0x33, 0x26, 0x28, 0xca, 0xd3, 0xaa, 0xdb, 0xc7, 0x66, 0x42, 0x0b, 0xfc, 0x2a, 0xc7, + 0x8d, 0x08, 0x71, 0x31, 0x48, 0x4a, 0xa8, 0xcd, 0x61, 0x31, 0xf0, 0x48, 0x52, 0xf4, 0xd1, 0x92, 0x48, 0xbd, 0x68, 0x25, 0xc2, 0xb0, 0x0b, 0xc6, 0x7f, 0xcb, 0x25, 0x39, 0x49, 0x16, 0xfe, 0x8c, + 0x13, 0xf5, 0x30, 0x4e, 0x6f, 0xe8, 0x83, 0x93, 0xb7, 0xad, 0x09, 0x35, 0x1e, 0x29, 0x7e, 0x1f, 0x6a, 0x67, 0xeb, 0x24, 0x88, 0x33, 0xc8, 0xe9, 0x66, 0xab, 0xfc, 0x0c, 0xf1, 0x7d, 0xae, 0x2d, + 0xda, 0xce, 0x23, 0x86, 0x70, 0x80, 0x85, 0x25, 0xda, 0xd7, 0x4e, 0x56, 0x9c, 0x09, 0x0c, 0x53, 0xe6, 0x19, 0xb8, 0x93, 0xbc, 0xb4, 0x84, 0xc1, 0xe5, 0xb2, 0x06, 0x02, 0x0b, 0x0d, 0x36, 0x87, + 0xb3, 0x4c, 0xb1, 0x0d, 0x7a, 0xb0, 0x79, 0x18, 0xdb, 0x1b, 0x5d, 0xaa, 0x1c, 0x93, 0x25, 0x4b, 0xcc, 0xfe, 0x12, 0xa9, 0xff, 0x9a, 0xde, 0xff, 0x63, 0xd3, 0xfb, 0x1b, 0x34, 0xef, 0xac, 0x15, + 0xf7, 0x79, 0xf4, 0x47, 0xa1, 0xfc, 0xea, 0x41, 0xe0, 0xe4, 0xcb, 0xd3, 0x5f, 0xe4, 0xa0, 0xfd, 0x75, 0x0f, 0x44, 0x81, 0xa7, 0x40, 0x69, 0x9a, 0xa2, 0x6a, 0xa8, 0xfa, 0x6b, 0x3d, 0x85, 0xe3, + 0xad, 0x1f, 0x2d, 0x8c, 0xd9, 0xfc, 0x20, 0x1e, 0x77, 0xb2, 0x1a, 0x9e, 0x7c, 0x05, 0xa3, 0x67, 0xe0, 0x2e, 0x15, 0x5b, 0xaa, 0x6f, 0xbd, 0xa2, 0x2e, 0xf2, 0x99, 0x3a, 0x5d, 0x8b, 0x58, 0xb2, + 0x93, 0xfb, 0x7d, 0x0f, 0xef, 0xe2, 0x0c, 0xab, 0x8b, 0xb3, 0x53, 0x98, 0x50, 0x25, 0xc6, 0x65, 0x63, 0x88, 0x03, 0x6a, 0x37, 0x7f, 0x0b, 0xe2, 0x1d, 0x33, 0xd7, 0xaf, 0x5f, 0x1f, 0x79, 0x6c, + 0xe4, 0x51, 0x69, 0xf0, 0x1b, 0x73, 0x17, 0xf6, 0xc9, 0xd0, 0xf2, 0xeb, 0x1e, 0x58, 0x2a, 0xbd, 0x31, 0x0f, 0xa8, 0x80, 0x6d, 0x7c, 0xa5, 0x49, 0x54, 0x16, 0x72, 0xb2, 0xed, 0x71, 0xca, 0xcc, + 0x43, 0xcb, 0x58, 0x4c, 0x11, 0x6e, 0x2b, 0x14, 0x87, 0x64, 0x31, 0x4f, 0x97, 0x70, 0xee, 0x52, 0x76, 0x73, 0xec, 0x17, 0xcb, 0xae, 0x96, 0x88, 0x19, 0x43, 0xa4, 0x51, 0xd8, 0x4d, 0x0d, 0x74, + 0x6d, 0x07, 0xbb, 0x7a, 0x8b, 0xb2, 0x48, 0x87, 0x6e, 0x98, 0x80, 0x05, 0xfb, 0x00, 0x6d, 0x45, 0xe7, 0x9b, 0xef, 0x77, 0xe4, 0xc6, 0xf6, 0x7e, 0xed, 0xbb, 0xb1, 0x3a, 0x9f, 0x15, 0x0d, 0x3f, + 0xba, 0xef, 0x7c, 0xf8, 0xc1, 0x77, 0x2c, 0xc9, 0xaf, 0xfb, 0x72, 0xfd, 0x57, 0x4a, 0xe9, 0x5f, 0xbf, 0x3e, 0x72, 0xa2, 0x8f, 0x7e, 0x05, 0xf7, 0x94, 0xd3, 0xc4, 0xf8, 0x19, 0x3f, 0x6b, 0x5a, + 0xee, 0x50, 0x1e, 0x5c, 0x59, 0xd0, 0x84, 0xb5, 0x55, 0x9b, 0x3b, 0x98, 0x03, 0xb5, 0xe5, 0x61, 0x07, 0x93, 0x38, 0xb1, 0x1c, 0x2c, 0xa9, 0xf2, 0x48, 0x73, 0x6a, 0xda, 0xca, 0x94, 0x69, 0x8a, + 0xa6, 0xc4, 0xbc, 0x96, 0x30, 0xb8, 0x62, 0xa5, 0x1a, 0x3e, 0x41, 0xea, 0xd4, 0x3a, 0xd9, 0x93, 0x27, 0xf6, 0x8c, 0xcb, 0x8a, 0x25, 0xd6, 0xb1, 0x7b, 0x42, 0x4a, 0x9d, 0x6d, 0xbc, 0x9a, 0xf8, + 0xcf, 0xd5, 0x45, 0x1f, 0xb4, 0xdf, 0xf8, 0x37, 0x70, 0xff, 0x9f, 0xb7, 0xff, 0x5f, 0x39, 0xff, 0x6f, 0x8a, 0x66, 0x3c, 0x54, 0x21, 0xe1, 0x42, 0xf1, 0xca, 0xf8, 0x5f, 0x6b, 0x65, 0x8c, 0xab, + 0x90, 0x00, 0x81, 0x1a, 0x02, 0x49, 0xdd, 0x6e, 0x7d, 0x8c, 0x64, 0xeb, 0x30, 0xdf, 0x07, 0xd8, 0x6c, 0xb6, 0xaf, 0x00, 0x71, 0x26, 0xe8, 0x7a, 0x57, 0x48, 0x9c, 0x11, 0xe4, 0xcb, 0x39, 0xdb, + 0xe5, 0x30, 0x64, 0xcb, 0x7c, 0x90, 0x2b, 0xed, 0x5e, 0xef, 0x8e, 0xc7, 0x79, 0x00, 0xc1, 0x1a, 0x28, 0x46, 0xf1, 0x7a, 0x39, 0xac, 0xb8, 0x85, 0xbf, 0xb6, 0xc2, 0xcc, 0x8a, 0x00, 0x86, 0x4b, + 0x69, 0x77, 0x3b, 0xfb, 0x4f, 0xaa, 0xf7, 0xbd, 0x70, 0x7a, 0x9f, 0xf4, 0x57, 0x4f, 0xf6, 0x16, 0xfb, 0xf7, 0x57, 0x7a, 0xb5, 0xdf, 0x76, 0x56, 0x07, 0x5e, 0x7a, 0x8b, 0xd4, 0xf8, 0xfd, 0x6f, + 0xe8, 0xa3, 0x48, 0xeb, 0x66, 0xe5, 0xc4, 0x31, 0x6e, 0xf9, 0xab, 0xfe, 0x0d, 0xfd, 0x41, 0x3f, 0x94, 0x06, 0x6c, 0xd2, 0x5b, 0xc1, 0xbb, 0x67, 0x63, 0xcf, 0xe7, 0x87, 0x3f, 0x87, 0x9e, 0xfe, + 0xfb, 0x22, 0x4e, 0xbd, 0xab, 0x18, 0xe8, 0x1b, 0xaf, 0xda, 0xc2, 0x77, 0x54, 0x3f, 0x69, 0x0a, 0xb1, 0xdf, 0xef, 0x77, 0xf5, 0x97, 0xc9, 0x73, 0xfd, 0x2d, 0xfe, 0xf6, 0xea, 0xdb, 0xe4, 0x66, + 0xff, 0x86, 0xff, 0x20, 0xef, 0xaf, 0x7e, 0xf6, 0x5d, 0xfe, 0xf7, 0xfb, 0x42, 0xc9, 0xaf, 0x73, 0xe6, 0xb9, 0x37, 0x9f, 0xaf, 0x3e, 0xa5, 0x45, 0xb8, 0xc0, 0xf1, 0xa5, 0xf4, 0xf3, 0xd9, 0xb2, + 0x7e, 0x7b, 0x93, 0xf7, 0x45, 0x0f, 0x3f, 0x24, 0x21, 0xb8, 0x93, 0xca, 0xe6, 0x35, 0xa1, 0xf0, 0x57, 0xd3, 0x1d, 0x7a, 0xc8, 0x23, 0xe2, 0x89, 0xe6, 0x65, 0xc2, 0xdf, 0x8e, 0x26, 0xd0, 0xcf, + 0x7e, 0x10, 0xf0, 0x64, 0x1b, 0x0e, 0x43, 0x87, 0x13, 0xd1, 0xde, 0x51, 0xec, 0x55, 0x72, 0xd6, 0xd9, 0x9d, 0x53, 0x9d, 0xb9, 0x9d, 0xe6, 0xcd, 0xd9, 0x1f, 0x85, 0x7a, 0x33, 0x48, 0xeb, 0xd2, + 0xb9, 0x19, 0xfa, 0xe0, 0xfb, 0x89, 0xe4, 0x6a, 0xa7, 0x4c, 0x26, 0x55, 0x70, 0xbe, 0x1f, 0xf1, 0xf8, 0x88, 0x42, 0xe4, 0x85, 0xea, 0xa5, 0xc7, 0xcf, 0xc7, 0xd7, 0x3a, 0x30, 0x23, 0xd4, 0x20, + 0x06, 0x51, 0x35, 0x09, 0x13, 0x9f, 0x87, 0x95, 0xb2, 0x39, 0x99, 0x14, 0xa0, 0x65, 0xae, 0x86, 0x1d, 0x4e, 0x30, 0x8c, 0x2c, 0x89, 0x1c, 0x59, 0xcc, 0x25, 0x76, 0xb6, 0x88, 0x00, 0x7c, 0xea, + 0xad, 0xb5, 0x55, 0x8b, 0xaa, 0xab, 0x9d, 0x9f, 0x4c, 0xe3, 0x5a, 0x91, 0xa7, 0x51, 0x1c, 0x60, 0xbe, 0x70, 0x72, 0x64, 0xba, 0xdb, 0xe7, 0x0e, 0x65, 0xed, 0x04, 0x04, 0xef, 0xa1, 0x9d, 0xd8, + 0xa4, 0xfc, 0xbd, 0x8c, 0x7f, 0x1f, 0xb0, 0xe8, 0xeb, 0xc9, 0x77, 0x4a, 0x0e, 0xe8, 0x41, 0x30, 0x9e, 0xc9, 0x5e, 0xd1, 0x78, 0x6e, 0x5c, 0x73, 0x52, 0xfc, 0x68, 0xf3, 0x74, 0x61, 0x32, 0x5b, + 0x13, 0xc4, 0xec, 0xe8, 0xb9, 0xb3, 0x79, 0xbb, 0x75, 0xf7, 0xd9, 0xa1, 0x92, 0x28, 0x20, 0xb6, 0xb6, 0xf2, 0x88, 0x0e, 0xbd, 0xcc, 0xf8, 0xaf, 0x87, 0x16, 0x7d, 0x20, 0x12, 0xea, 0x89, 0xe6, + 0xa5, 0x2b, 0xb7, 0xa3, 0xab, 0x35, 0xe5, 0x87, 0xa8, 0x27, 0x78, 0xc2, 0xd8, 0x87, 0x0d, 0x48, 0x14, 0x94, 0xa0, 0xc6, 0x5e, 0x65, 0x5a, 0x11, 0xab, 0xc0, 0x00, 0x93, 0x19, 0x01, 0xe6, 0x1e, + 0x47, 0xf4, 0x23, 0x48, 0x9c, 0xea, 0xbb, 0xb4, 0x4c, 0xc4, 0x43, 0xc6, 0xe8, 0x57, 0xb2, 0x97, 0xde, 0xbc, 0x34, 0xbe, 0xd8, 0xef, 0xbf, 0x9c, 0xa7, 0x1d, 0x6f, 0xd5, 0xe5, 0x89, 0x41, 0x56, + 0xba, 0xbe, 0x6d, 0xd6, 0xb1, 0xe5, 0xc7, 0x11, 0x8b, 0xd8, 0xae, 0xba, 0xf1, 0xc9, 0x0d, 0xc2, 0x31, 0xeb, 0x29, 0xd3, 0xc5, 0x00, 0x62, 0x98, 0x92, 0xe6, 0x41, 0x49, 0xd5, 0xc9, 0x2b, 0x57, + 0x9c, 0x0d, 0xf2, 0x09, 0x0d, 0x37, 0x1e, 0x9c, 0x6b, 0xb8, 0xe2, 0xd6, 0xf5, 0x7e, 0x2d, 0xe8, 0x0d, 0x67, 0xa9, 0x19, 0x8d, 0x2e, 0x96, 0x43, 0xae, 0x44, 0xf1, 0xa7, 0xe4, 0x0a, 0x75, 0x90, + 0x0e, 0x93, 0xb8, 0x6c, 0xee, 0x2a, 0x2c, 0x1f, 0xa9, 0xe0, 0xf5, 0x4c, 0xf4, 0xda, 0xef, 0xdb, 0xe1, 0x84, 0x1c, 0x57, 0xbd, 0xeb, 0x2c, 0x68, 0x22, 0xc4, 0xb5, 0x5e, 0x8a, 0x97, 0xea, 0xf9, + 0x94, 0x6f, 0xa1, 0x01, 0xdd, 0xed, 0xa1, 0x69, 0xc5, 0x73, 0x04, 0xe9, 0x2c, 0x0d, 0x39, 0x9c, 0x52, 0x10, 0x1e, 0xc6, 0xdc, 0x74, 0x49, 0xe4, 0x7b, 0xc3, 0x76, 0xcb, 0xe0, 0x60, 0x9d, 0xcf, + 0xdb, 0xd5, 0x42, 0x35, 0xc0, 0xde, 0x3a, 0x61, 0xc9, 0x7a, 0xe7, 0x26, 0x31, 0x3d, 0x5d, 0x0d, 0x32, 0x08, 0xec, 0xbd, 0x2d, 0xa4, 0xc0, 0x4d, 0xf6, 0x29, 0x79, 0x46, 0x9d, 0x4d, 0xee, 0x9b, + 0x0a, 0xef, 0xcb, 0x3c, 0xa3, 0xfb, 0xff, 0x89, 0xfc, 0x05, 0x89, 0x4f, 0x27, 0xc7, 0xd6, 0xdb, 0x58, 0x17, 0x08, 0xae, 0xd2, 0x35, 0x71, 0x66, 0xf0, 0x34, 0x97, 0xfc, 0x78, 0xab, 0xa8, 0xcb, + 0x85, 0x80, 0x82, 0xde, 0xb0, 0x43, 0xc0, 0x42, 0x64, 0x2c, 0x4e, 0x10, 0x86, 0x03, 0x6f, 0x63, 0xad, 0x99, 0xa0, 0xd3, 0xd5, 0xd1, 0x10, 0x83, 0x19, 0x8f, 0x49, 0x7c, 0x01, 0x39, 0xbc, 0x32, + 0x07, 0x0f, 0x51, 0x7f, 0x06, 0xf4, 0xd0, 0xae, 0x2c, 0x1c, 0xf7, 0xa6, 0xc3, 0x70, 0x06, 0xb4, 0x02, 0x1a, 0x95, 0x1d, 0xf0, 0xfa, 0xca, 0x9e, 0xd3, 0x4f, 0x4a, 0x23, 0xf5, 0xee, 0xad, 0x5a, + 0xf8, 0x43, 0x6e, 0x0a, 0xef, 0x49, 0x3f, 0xc3, 0xf3, 0x72, 0xe2, 0xaa, 0xc3, 0x19, 0xa1, 0xac, 0x25, 0x70, 0x89, 0x0c, 0xce, 0x84, 0x8a, 0x0f, 0x6c, 0x09, 0x5b, 0x9d, 0xe5, 0xb5, 0x72, 0x6f, + 0x9a, 0xeb, 0x8e, 0x3c, 0x46, 0xa8, 0x27, 0x0e, 0xb8, 0xbd, 0xb6, 0x6b, 0x1d, 0x2b, 0x99, 0xd6, 0xd9, 0x16, 0x7e, 0x69, 0x6f, 0x24, 0x60, 0x1b, 0x80, 0xab, 0x9e, 0xa8, 0x07, 0x0e, 0x12, 0x58, + 0x13, 0x40, 0x96, 0xf3, 0x21, 0x75, 0xe6, 0xfc, 0x26, 0x58, 0x16, 0xe5, 0x8c, 0x99, 0xef, 0x85, 0x88, 0xaa, 0x1e, 0xb3, 0x23, 0x04, 0xd5, 0x24, 0x6d, 0x12, 0xf3, 0xc9, 0x86, 0x4f, 0x7e, 0xa3, + 0xe7, 0xce, 0x9a, 0xbb, 0x75, 0xd1, 0x1e, 0xcb, 0x3b, 0x79, 0xa5, 0x78, 0xc5, 0xb0, 0xb1, 0xfc, 0xb1, 0x39, 0x27, 0x4f, 0x74, 0x4f, 0x1d, 0x07, 0xfc, 0xb0, 0xad, 0xc5, 0xfd, 0xae, 0x5e, 0x17, + 0x00, 0x0f, 0xa1, 0x60, 0xc5, 0x31, 0xa5, 0x3a, 0xdf, 0xae, 0xfa, 0x8e, 0xb1, 0x8a, 0x66, 0x2f, 0x21, 0x16, 0x86, 0x6e, 0x1d, 0x08, 0x05, 0xa7, 0x95, 0x53, 0x86, 0x32, 0xbd, 0x3e, 0xd7, 0xe1, + 0xee, 0x4c, 0x2c, 0xa2, 0x8d, 0x73, 0x9e, 0x32, 0xa0, 0x1f, 0x3b, 0xc3, 0x4c, 0x3d, 0xd0, 0xcb, 0x6d, 0xd7, 0xe9, 0xc7, 0x6e, 0x1a, 0x3f, 0xe6, 0x06, 0x91, 0x66, 0xf9, 0x33, 0xeb, 0x06, 0xfd, + 0x81, 0xef, 0xc1, 0x56, 0x4d, 0xd2, 0xfb, 0x59, 0xda, 0xa7, 0x8f, 0x31, 0x4e, 0x37, 0x9a, 0x17, 0xe8, 0x6e, 0x47, 0x93, 0xe9, 0xcf, 0x8c, 0xd3, 0x05, 0x3c, 0x5f, 0x8a, 0x6b, 0x52, 0x9f, 0xcd, + 0xd9, 0x9d, 0xbc, 0x74, 0x21, 0x94, 0x47, 0x70, 0x74, 0xa8, 0xb7, 0x1a, 0x6a, 0xaf, 0xcc, 0xa5, 0xb0, 0x2c, 0x67, 0xc5, 0xb4, 0x58, 0xaf, 0x4e, 0x47, 0x6d, 0xaa, 0xae, 0xb4, 0x18, 0x3e, 0x93, + 0x9d, 0x96, 0x7a, 0xfb, 0x12, 0x15, 0x65, 0xbc, 0x4f, 0x9a, 0x80, 0xca, 0x90, 0x99, 0xd1, 0x57, 0xa2, 0xd0, 0xaf, 0xcf, 0xa1, 0xe1, 0x6e, 0x8f, 0xc1, 0x89, 0xce, 0xe0, 0xc5, 0x83, 0x46, 0x82, + 0xf2, 0xd9, 0xb2, 0xf2, 0xc1, 0xf7, 0xc3, 0x2a, 0x1d, 0xa3, 0x76, 0x26, 0x4f, 0xbf, 0xfa, 0xfd, 0x3f, 0x5f, 0xe5, 0xc7, 0x7f, 0x29, 0x9d, 0x83, 0x7d, 0x34, 0x31, 0x24, 0x46, 0xe4, 0x4c, 0x9c, + 0xb2, 0xcc, 0xca, 0xdf, 0x5f, 0x7a, 0x78, 0x7c, 0xe9, 0x46, 0xff, 0xfb, 0x5f, 0x57, 0xaf, 0xf6, 0xb7, 0x8e, 0x15, 0xbf, 0x87, 0x97, 0x89, 0x7d, 0x8f, 0x47, 0xac, 0xe2, 0xc0, 0xbc, 0xbb, 0xfe, + 0xc2, 0x8f, 0xc4, 0x7c, 0x5c, 0x49, 0x5e, 0x47, 0x35, 0x0e, 0xcc, 0xc9, 0x8d, 0xc8, 0xcf, 0x83, 0xaa, 0xa6, 0x01, 0x8a, 0x0b, 0xdc, 0x39, 0xf4, 0xf8, 0xb2, 0x73, 0xda, 0xa1, 0x5a, 0x1d, 0xe6, + 0xb3, 0xb2, 0xde, 0x32, 0xb9, 0xd4, 0x0e, 0x0e, 0x75, 0x56, 0x40, 0x88, 0xc5, 0xd8, 0x41, 0x4b, 0x31, 0x54, 0x22, 0x41, 0xb2, 0x68, 0xe5, 0x4e, 0xf2, 0xa7, 0xf4, 0x32, 0x5a, 0x39, 0x9d, 0xc9, + 0x37, 0xb1, 0x92, 0xd6, 0x66, 0xe0, 0x25, 0xd6, 0x81, 0x2c, 0x6d, 0x15, 0xa5, 0x85, 0x6c, 0xda, 0xed, 0x36, 0x63, 0x42, 0x12, 0x2e, 0xaf, 0x99, 0xd6, 0x13, 0x2b, 0x4b, 0xdd, 0xc0, 0x9b, 0xfc, + 0x50, 0x24, 0xeb, 0xe6, 0x73, 0xfa, 0x10, 0x24, 0x9f, 0x9f, 0xf1, 0x84, 0xd1, 0xe7, 0x0b, 0x93, 0xdb, 0x63, 0x7e, 0x06, 0xad, 0x97, 0xba, 0xa9, 0xe4, 0x09, 0xd2, 0x76, 0x89, 0x06, 0xdc, 0xae, + 0x4f, 0x38, 0x92, 0x39, 0x95, 0x00, 0x6b, 0x80, 0xfb, 0x73, 0xd9, 0xba, 0xab, 0x3a, 0x5c, 0xd4, 0xf8, 0x96, 0x8e, 0x09, 0xd8, 0x8b, 0x90, 0x23, 0xbd, 0x04, 0x19, 0x7a, 0x1a, 0xcd, 0xd5, 0x5d, + 0xd8, 0x02, 0xfd, 0xb0, 0x3e, 0xc2, 0xe5, 0xb1, 0x4e, 0x8d, 0x61, 0xeb, 0xf0, 0x47, 0x65, 0x43, 0x5b, 0xbc, 0x4a, 0xe9, 0x30, 0x99, 0x32, 0xe3, 0x40, 0x6b, 0xea, 0xe0, 0x6e, 0xb9, 0x38, 0xf4, + 0x0f, 0xf2, 0xd0, 0x4a, 0x7a, 0x23, 0x7a, 0x85, 0xe5, 0x7a, 0x34, 0xb9, 0x11, 0xfa, 0x19, 0x87, 0x64, 0xc5, 0x71, 0x68, 0x70, 0x54, 0xb7, 0x00, 0x7a, 0x5c, 0x10, 0xfd, 0x16, 0x8f, 0x20, 0x89, + 0xf5, 0xb9, 0xdd, 0x91, 0xe6, 0x24, 0x7a, 0xde, 0x82, 0xc0, 0x2e, 0x62, 0xc5, 0x3c, 0xdc, 0x9d, 0xfa, 0xbe, 0x47, 0x48, 0x8e, 0xdb, 0xd1, 0x49, 0x32, 0x23, 0xa0, 0xd9, 0x34, 0xf7, 0xc4, 0x63, + 0xcb, 0x07, 0xd4, 0x92, 0xf3, 0x77, 0xbc, 0xc4, 0x26, 0x21, 0xbd, 0x93, 0xce, 0x15, 0x72, 0x22, 0x45, 0x58, 0x7c, 0x6c, 0x39, 0x7d, 0xfe, 0xa0, 0x2e, 0x5f, 0x2d, 0x75, 0xf7, 0xab, 0x7b, 0x5b, + 0xa3, 0xff, 0x6b, 0x69, 0xe4, 0x91, 0x64, 0x34, 0xaf, 0x64, 0x2f, 0x18, 0xbe, 0x34, 0x26, 0xd0, 0xb8, 0xf4, 0x33, 0x6a, 0xec, 0x1c, 0x33, 0x6b, 0xda, 0x74, 0x4b, 0xb5, 0x08, 0x4f, 0x9d, 0x6a, + 0x1c, 0x0f, 0xfa, 0x2c, 0x39, 0xf3, 0xd6, 0x42, 0xc7, 0x29, 0x9c, 0x92, 0x67, 0x48, 0xdb, 0xf6, 0xf0, 0xb1, 0xc4, 0xfb, 0xb5, 0x15, 0xf4, 0xea, 0x5a, 0x02, 0xa8, 0x6d, 0xba, 0x60, 0xbc, 0x5d, + 0x1e, 0x1f, 0x51, 0xa8, 0xa9, 0x88, 0xda, 0x29, 0xec, 0xb8, 0x8a, 0x16, 0x6e, 0x03, 0x18, 0x0e, 0xc6, 0x91, 0x53, 0x31, 0x73, 0x1e, 0xd3, 0xc1, 0xbc, 0xab, 0x48, 0x78, 0xf3, 0x7f, 0xfb, 0x0e, + 0x4a, 0xf7, 0x3b, 0xa1, 0x9e, 0x7a, 0x64, 0x0d, 0x7b, 0xa6, 0xfa, 0x0c, 0xa4, 0x7b, 0x13, 0xec, 0xa9, 0x31, 0x4b, 0x19, 0x66, 0x9b, 0xe7, 0xf5, 0xb9, 0x68, 0xc3, 0xda, 0x0b, 0x78, 0xbc, 0xec, + 0xe0, 0x08, 0x2f, 0xd9, 0x55, 0x4d, 0xcf, 0x04, 0x2e, 0xb1, 0x1b, 0xdb, 0x5f, 0x0e, 0x34, 0x6b, 0x84, 0x02, 0x04, 0xbb, 0xec, 0xe0, 0x1b, 0xb3, 0xb5, 0x5f, 0x65, 0x9c, 0x30, 0x10, 0x03, 0x09, + 0xac, 0x85, 0x29, 0xba, 0x76, 0xf3, 0x45, 0xdd, 0x69, 0xd3, 0xa0, 0x08, 0xc8, 0x88, 0x01, 0xfa, 0x8e, 0xf3, 0xe5, 0x4a, 0xd8, 0x8c, 0x89, 0xe6, 0xbd, 0xbc, 0xa9, 0x7d, 0x75, 0xfa, 0x9a, 0xd4, + 0xd9, 0xf7, 0x69, 0xb2, 0x2e, 0x5b, 0xc2, 0xdf, 0xe7, 0xf9, 0xf9, 0xea, 0x01, 0x4f, 0x08, 0x7d, 0x3c, 0x7d, 0xe5, 0x84, 0x46, 0xe4, 0x00, 0x3a, 0xdb, 0x0d, 0xa5, 0xf2, 0x02, 0xcb, 0x38, 0x39, + 0xc7, 0xed, 0x00, 0x55, 0x13, 0xd5, 0x99, 0x22, 0xd5, 0xa7, 0x26, 0x80, 0xe2, 0x01, 0x12, 0xea, 0xcc, 0x3f, 0x56, 0x56, 0x07, 0x1c, 0x13, 0x63, 0x15, 0xcc, 0x4e, 0x07, 0xca, 0x2f, 0x15, 0xb8, + 0x2c, 0x41, 0x70, 0x45, 0x28, 0x00, 0xc4, 0xb4, 0x1b, 0x54, 0x94, 0xe1, 0xe9, 0x7e, 0x4a, 0x4e, 0x79, 0x28, 0x36, 0xb6, 0xae, 0x4a, 0x95, 0x09, 0x75, 0x2f, 0xf4, 0xf7, 0x87, 0x49, 0x17, 0x54, + 0x93, 0xd7, 0x9e, 0xfc, 0xfe, 0x9f, 0xef, 0x13, 0x7a, 0x5e, 0xee, 0xac, 0xac, 0x32, 0xc8, 0xef, 0x3b, 0xf6, 0x20, 0x0f, 0xb8, 0xb0, 0xbf, 0x92, 0x7d, 0xc2, 0xf5, 0xd6, 0xb8, 0x1a, 0x1b, 0x46, + 0xb8, 0xa8, 0x2b, 0x80, 0xd3, 0xc6, 0xda, 0x4a, 0x4f, 0xe5, 0xc8, 0x38, 0x53, 0x87, 0x1d, 0xdd, 0xf4, 0x87, 0xd9, 0x14, 0x19, 0x74, 0x5a, 0xca, 0xea, 0x12, 0x5f, 0x01, 0x27, 0x5f, 0x26, 0x4d, + 0x06, 0xf5, 0xf5, 0x63, 0x6a, 0xf7, 0x78, 0xbd, 0x14, 0x0d, 0xd8, 0x6d, 0xe6, 0x9e, 0xb3, 0x0f, 0xfb, 0xd9, 0x99, 0x87, 0x77, 0x81, 0x80, 0xaf, 0xcf, 0xad, 0x61, 0xaf, 0xd5, 0x83, 0xe2, 0xb8, + 0x4d, 0xd3, 0xe9, 0xf3, 0xdd, 0x98, 0x0d, 0xa1, 0x49, 0xcd, 0xac, 0x9f, 0xe4, 0x65, 0x90, 0x04, 0x75, 0xf0, 0x4d, 0x5e, 0xe1, 0x47, 0x9c, 0x9d, 0x3e, 0xd0, 0x06, 0x27, 0x1f, 0xcf, 0x8c, 0xc9, + 0xff, 0x7a, 0x15, 0x58, 0xe0, 0x5c, 0x8a, 0xe7, 0xcc, 0xd4, 0xc7, 0x61, 0x25, 0x2b, 0x9d, 0x61, 0x03, 0xd1, 0x3b, 0x27, 0xb0, 0x1d, 0x1e, 0xe5, 0x19, 0x8e, 0xe7, 0x52, 0x9f, 0x00, 0x94, 0xe9, + 0x16, 0xa2, 0x50, 0x14, 0x0e, 0xf2, 0x82, 0x90, 0x29, 0x71, 0xa1, 0xea, 0x5a, 0x50, 0x48, 0x44, 0x0a, 0xd6, 0xe6, 0xaa, 0xc7, 0x2a, 0x7c, 0x3d, 0x6d, 0x76, 0xbe, 0x35, 0x38, 0x04, 0x5d, 0x9a, + 0x51, 0x70, 0x8e, 0x68, 0x66, 0x84, 0x13, 0xce, 0x0f, 0x0e, 0xfc, 0xbe, 0x51, 0x4d, 0xcc, 0xc0, 0x0b, 0x9e, 0x6a, 0x43, 0x7c, 0x7d, 0x43, 0x35, 0x24, 0x66, 0x16, 0xbf, 0xde, 0xf0, 0x4e, 0xc5, + 0xdb, 0xf9, 0x81, 0xe5, 0x4f, 0xcc, 0xac, 0x77, 0xec, 0x77, 0x63, 0xf0, 0xfb, 0xbb, 0x7a, 0xb8, 0x4d, 0x6a, 0x3b, 0x6e, 0x65, 0xb8, 0xf7, 0xd5, 0x83, 0x8f, 0x04, 0x01, 0xbe, 0x50, 0xbd, 0x0e, + 0xd3, 0xd3, 0xf1, 0xd8, 0x4a, 0x7b, 0x69, 0xa9, 0xea, 0x5d, 0xa7, 0x96, 0x0c, 0x78, 0x00, 0x37, 0xaa, 0x33, 0x78, 0x9b, 0xc2, 0x9e, 0x8b, 0x84, 0xa0, 0xeb, 0xf0, 0x96, 0x20, 0x56, 0x65, 0xcf, + 0x83, 0x3a, 0x99, 0xac, 0x0b, 0x24, 0x93, 0x8c, 0x34, 0x13, 0xa0, 0x05, 0x9c, 0x6e, 0x7b, 0x34, 0xee, 0x36, 0x7c, 0x43, 0xcc, 0xba, 0x8d, 0x46, 0x4c, 0x7d, 0x3b, 0xe8, 0x8d, 0x85, 0x2c, 0x36, + 0x99, 0x56, 0xf1, 0x21, 0x8b, 0x83, 0x73, 0xe4, 0xb1, 0x7d, 0xfc, 0xd5, 0xaf, 0x1b, 0x79, 0x97, 0x5b, 0xee, 0x0d, 0xa5, 0x7b, 0x3e, 0x35, 0xcf, 0x3f, 0x7d, 0x6b, 0xa8, 0x79, 0x0f, 0x2c, 0xf1, + 0x67, 0xfa, 0x66, 0xf8, 0xc6, 0x83, 0x7b, 0xa5, 0x0c, 0x4e, 0x6e, 0xff, 0x27, 0x57, 0x3a, 0xe3, 0x6c, 0x57, 0xe6, 0x9c, 0x64, 0xe3, 0xd2, 0xde, 0x18, 0x9b, 0x54, 0x32, 0x67, 0x12, 0x00, 0xb3, + 0x59, 0xad, 0xb5, 0x85, 0x5e, 0x99, 0xa8, 0x63, 0xc5, 0x78, 0x17, 0x10, 0xb4, 0x1b, 0x10, 0xf4, 0xe6, 0x70, 0xb4, 0x84, 0xac, 0xcb, 0x09, 0xab, 0xad, 0x72, 0x0f, 0x0a, 0xd5, 0x73, 0xba, 0x3b, + 0x70, 0x4c, 0x98, 0x80, 0x2c, 0x39, 0xb3, 0xbd, 0x05, 0xad, 0x38, 0x33, 0x49, 0xe1, 0x05, 0x8b, 0x5b, 0x56, 0x2b, 0xfe, 0x3f, 0x37, 0x40, 0x26, 0xd5, 0xef, 0x97, 0x3c, 0x45, 0x6f, 0xae, 0xfc, + 0x64, 0xb2, 0x6a, 0xd2, 0xa0, 0x68, 0x9c, 0x9f, 0xb3, 0xb9, 0xff, 0x3d, 0x07, 0xf5, 0x8e, 0xf2, 0x75, 0x06, 0xbf, 0x69, 0x8f, 0x4d, 0x7c, 0xd4, 0x08, 0x86, 0x13, 0x94, 0xac, 0xd4, 0xe6, 0xfa, + 0x69, 0xef, 0x9d, 0xbb, 0x4a, 0x5a, 0xd6, 0x47, 0xe4, 0xac, 0xec, 0x0f, 0x65, 0x0a, 0x52, 0x5b, 0xbc, 0x00, 0xd7, 0x4e, 0xaf, 0x27, 0x2b, 0xc8, 0x59, 0x11, 0xfb, 0x19, 0x89, 0xce, 0x93, 0xd9, + 0x0c, 0x3f, 0x62, 0xcb, 0x4e, 0xdc, 0x1d, 0x7a, 0x79, 0xa6, 0x57, 0x53, 0xfc, 0x30, 0x53, 0xb7, 0x42, 0xe1, 0x6c, 0x33, 0x49, 0x12, 0x44, 0xdc, 0xd3, 0xdd, 0x07, 0x9d, 0xd8, 0xac, 0x72, 0xc8, + 0xeb, 0x6c, 0x52, 0x1a, 0xa9, 0xfd, 0xd9, 0xc9, 0xe8, 0xce, 0xce, 0xd6, 0xe4, 0xf6, 0x45, 0x74, 0x4d, 0xb3, 0x3a, 0x70, 0xef, 0x4b, 0x42, 0xd8, 0xbb, 0xf0, 0xbc, 0xd1, 0xf8, 0xbe, 0xa7, 0x7d, + 0x41, 0xf8, 0xfd, 0x99, 0xc9, 0x95, 0xee, 0xcf, 0x18, 0x6b, 0xb1, 0x4d, 0xe8, 0xd0, 0x6e, 0x98, 0x6b, 0x4b, 0x9a, 0xb0, 0xa2, 0x75, 0xe8, 0xba, 0x4b, 0x71, 0x2f, 0x26, 0x2b, 0x35, 0x84, 0x3d, + 0xde, 0x61, 0x49, 0x63, 0x27, 0x9e, 0x31, 0x7e, 0x09, 0xa8, 0x7c, 0x94, 0x04, 0x3d, 0xad, 0x62, 0xe1, 0x31, 0xf5, 0xca, 0xa5, 0x2a, 0x68, 0x67, 0xb2, 0x93, 0x38, 0x3a, 0xa9, 0x33, 0x06, 0xe3, + 0x53, 0xda, 0x40, 0x66, 0x69, 0x43, 0xee, 0xf6, 0x9c, 0x5f, 0x83, 0x8f, 0xad, 0x14, 0x97, 0x65, 0xf7, 0x0a, 0xc9, 0x67, 0xef, 0x3c, 0xcb, 0x37, 0xe2, 0x5b, 0x4e, 0xd3, 0x4f, 0x01, 0x20, 0x37, + 0x91, 0xef, 0x39, 0xa9, 0xdb, 0xcd, 0x6e, 0x0b, 0x7f, 0x5c, 0xf4, 0x07, 0xa3, 0x4c, 0x9f, 0x86, 0xeb, 0x83, 0xee, 0x20, 0x48, 0xae, 0x71, 0xec, 0xb1, 0x71, 0x1e, 0xee, 0xdc, 0x50, 0x4d, 0xac, + 0xe0, 0xcd, 0x50, 0xbf, 0xbf, 0x14, 0xa4, 0x55, 0x6d, 0xc4, 0xb1, 0x63, 0x4f, 0xbc, 0x38, 0x33, 0x8d, 0x38, 0xbe, 0x51, 0x81, 0x3e, 0xc6, 0xa1, 0x04, 0xd5, 0x24, 0xcd, 0x93, 0xdf, 0xff, 0xf3, + 0x95, 0x73, 0x62, 0x70, 0x7b, 0xbf, 0x27, 0x0a, 0x2f, 0xbf, 0x7f, 0x77, 0x4f, 0x6c, 0x5c, 0x1d, 0x93, 0xdf, 0xcc, 0x9b, 0x7f, 0x7d, 0x74, 0x39, 0x7b, 0x2e, 0x86, 0x77, 0x7b, 0xd1, 0xf7, 0x6a, + 0x8e, 0x77, 0xe9, 0x17, 0x3f, 0x3b, 0xdd, 0xfd, 0xee, 0x6d, 0x6f, 0x62, 0x1a, 0x95, 0x63, 0x07, 0xe5, 0x9b, 0x77, 0x7c, 0x9e, 0xd5, 0x23, 0x96, 0xea, 0xe7, 0x01, 0xba, 0xb7, 0x54, 0x3f, 0xee, + 0xc1, 0x74, 0xa5, 0x0c, 0x4e, 0x6e, 0xff, 0xff, 0xc6, 0x3b, 0x09, 0x63, 0x50, 0x9a, 0x38, 0xb9, 0x18, 0xcc, 0x89, 0xda, 0x6e, 0x61, 0x57, 0xe7, 0x84, 0x29, 0xf8, 0xf9, 0xb2, 0xc0, 0x15, 0x05, + 0x6c, 0xf8, 0x19, 0x8d, 0x90, 0xe8, 0x66, 0xbd, 0x4d, 0x44, 0x00, 0x0d, 0x67, 0xb1, 0x4f, 0xa9, 0x58, 0xc1, 0xd4, 0x76, 0xed, 0xcd, 0x77, 0xa8, 0xdb, 0xd7, 0xe6, 0x96, 0xe5, 0xcf, 0xfb, 0x1e, + 0x41, 0x64, 0xdb, 0x4f, 0x19, 0x6b, 0xd3, 0x36, 0x48, 0x03, 0xbb, 0xca, 0x3f, 0xe0, 0x08, 0xff, 0x39, 0x11, 0x0c, 0xfc, 0x85, 0xeb, 0xc7, 0x47, 0x3f, 0xec, 0x5b, 0x8a, 0xe4, 0xbf, 0x5b, 0xdc, + 0x9f, 0x3d, 0x1d, 0xbf, 0x5e, 0x75, 0x1e, 0x91, 0x8b, 0x6f, 0x24, 0x2f, 0x8b, 0xcd, 0xf5, 0x60, 0x82, 0x8d, 0x93, 0x87, 0x69, 0x68, 0xd8, 0x1d, 0xce, 0x9a, 0x7d, 0x9c, 0xcf, 0xd3, 0x69, 0x0a, + 0x2c, 0x30, 0x60, 0xe9, 0x63, 0xc3, 0x9a, 0xa9, 0x79, 0xd9, 0x32, 0x36, 0x55, 0xa2, 0xd1, 0x4c, 0x75, 0xd8, 0x2f, 0x29, 0x0f, 0x14, 0x9d, 0x90, 0xa3, 0x33, 0x7b, 0x2b, 0x23, 0xeb, 0x95, 0x2b, + 0xa0, 0x26, 0x4f, 0x86, 0xc7, 0x6a, 0xa7, 0xa6, 0x76, 0x96, 0x1f, 0x48, 0x71, 0xad, 0x9e, 0x6c, 0xad, 0xb0, 0x60, 0x37, 0x4c, 0x14, 0x62, 0x44, 0xf6, 0x91, 0x37, 0x35, 0x31, 0x9f, 0x3f, 0xec, + 0x3b, 0x48, 0xc5, 0x4f, 0xf9, 0x65, 0x63, 0xe3, 0x9f, 0x4d, 0x54, 0xf7, 0x8e, 0xf2, 0x15, 0xb7, 0x37, 0xed, 0x31, 0x49, 0x9d, 0xe0, 0xc9, 0xa2, 0x54, 0x39, 0x70, 0xe6, 0x9a, 0x18, 0x62, 0x57, + 0xcb, 0x3e, 0xd1, 0x17, 0xa8, 0x17, 0xc2, 0xf1, 0x8c, 0x18, 0xba, 0xaf, 0xf3, 0x39, 0xfc, 0x84, 0xc9, 0xfb, 0x9a, 0xfc, 0xdf, 0x6f, 0x60, 0x75, 0x70, 0x2f, 0x41, 0x1d, 0xf4, 0x07, 0x7e, 0x44, + 0x2a, 0xbb, 0x50, 0xbc, 0xc0, 0x50, 0x07, 0xf1, 0xe4, 0x46, 0xe2, 0xe7, 0xd9, 0x63, 0xf6, 0xfa, 0xb4, 0xa8, 0xf7, 0xf1, 0xf2, 0x78, 0xda, 0x8b, 0xc3, 0x54, 0x36, 0xa6, 0xaa, 0x17, 0xc1, 0x70, + 0xb4, 0xaf, 0xe2, 0xbc, 0xd1, 0x3b, 0xa3, 0x9f, 0x7b, 0x58, 0x25, 0xac, 0x99, 0x90, 0x58, 0x6c, 0x1b, 0x8b, 0x31, 0x4c, 0x64, 0xd3, 0xa7, 0xab, 0x6e, 0x10, 0x0e, 0xf3, 0x7c, 0xc5, 0xd7, 0x1c, + 0xcc, 0x87, 0x99, 0x1c, 0x9c, 0x64, 0x82, 0x09, 0x8e, 0xbc, 0xae, 0x99, 0xfb, 0x52, 0x04, 0xf6, 0x23, 0x84, 0x8d, 0xb7, 0xee, 0x1e, 0xff, 0xfa, 0x18, 0x18, 0x76, 0x59, 0xb4, 0x8d, 0xd2, 0x6b, + 0x5e, 0x0a, 0xd1, 0xfd, 0x0b, 0xfe, 0xc2, 0x21, 0xc4, 0x73, 0x52, 0xa7, 0x34, 0xea, 0xac, 0x9c, 0x3c, 0x7b, 0xa4, 0xbc, 0xdc, 0x4a, 0x7e, 0xb8, 0xf5, 0x2a, 0x30, 0x4f, 0xde, 0x4a, 0xcc, 0x1f, + 0xa2, 0xf6, 0x3f, 0x04, 0xd0, 0xfc, 0xeb, 0x63, 0x64, 0xd6, 0x93, 0xec, 0xf2, 0x15, 0x9d, 0x7b, 0x72, 0xcb, 0xc7, 0xd8, 0xb1, 0x7f, 0x50, 0xd2, 0x7c, 0x47, 0xfa, 0x79, 0xc4, 0x5f, 0x4e, 0x8c, + 0x91, 0x33, 0xe1, 0xc9, 0x4e, 0x86, 0x85, 0xc1, 0xcd, 0x3b, 0x34, 0xe5, 0x53, 0xad, 0x6d, 0xf7, 0x30, 0xc7, 0x6d, 0xbc, 0xe3, 0xd2, 0x60, 0x78, 0x6a, 0x84, 0x1c, 0xdd, 0x04, 0xf6, 0x9d, 0x2e, + 0x51, 0xef, 0x36, 0xe7, 0xd1, 0x5d, 0x6a, 0x02, 0xfb, 0xd2, 0x91, 0x26, 0xb0, 0x27, 0x57, 0x0a, 0x3f, 0xcf, 0xdc, 0x85, 0x98, 0xec, 0x4a, 0x60, 0x91, 0x9c, 0xd8, 0xf5, 0x92, 0x6a, 0x7c, 0xbd, + 0x25, 0xe6, 0x88, 0x79, 0xf0, 0x58, 0x45, 0xad, 0x56, 0x11, 0x44, 0x45, 0x2c, 0x99, 0x48, 0x71, 0x49, 0x9b, 0xac, 0x03, 0x58, 0x68, 0x39, 0xcd, 0x43, 0xcb, 0x51, 0x24, 0xaf, 0xc9, 0xd7, 0xae, + 0xb0, 0xf6, 0x2d, 0x6c, 0xe8, 0x71, 0x7c, 0x45, 0x4c, 0x45, 0x75, 0x26, 0x94, 0x47, 0x63, 0xdf, 0x34, 0x53, 0x67, 0x9d, 0x72, 0x9f, 0x72, 0x98, 0x5e, 0xdf, 0xe8, 0xbb, 0x84, 0xdc, 0x8f, 0x95, + 0x95, 0x7a, 0x25, 0xfb, 0xdc, 0xeb, 0xdb, 0xc2, 0x35, 0xa2, 0xac, 0xd4, 0xa5, 0xef, 0xa2, 0x9d, 0xa8, 0xfd, 0x8c, 0x2a, 0x99, 0x4a, 0x26, 0xb5, 0x5c, 0x50, 0x4c, 0x6e, 0xbf, 0x89, 0x84, 0xf3, + 0xa1, 0x43, 0xd6, 0xc0, 0x1e, 0x3f, 0x55, 0x26, 0xcf, 0xa4, 0xf3, 0x7a, 0x7d, 0xda, 0xcb, 0x46, 0x56, 0x09, 0x33, 0xeb, 0x54, 0x2f, 0x9a, 0x35, 0xa8, 0x71, 0xf0, 0x21, 0x3c, 0x1f, 0xd7, 0x44, + 0x6a, 0x46, 0x5e, 0x50, 0xb0, 0x83, 0x4f, 0x79, 0xa7, 0xd4, 0x73, 0xad, 0x96, 0x9a, 0x55, 0xf6, 0xe7, 0xb2, 0xa4, 0x2d, 0x35, 0xb1, 0xb2, 0x24, 0x0f, 0x62, 0xe7, 0x25, 0x0f, 0xf5, 0xd7, 0x32, + 0xcc, 0x23, 0x69, 0x7d, 0x3f, 0x12, 0x07, 0x27, 0x9f, 0x4e, 0x5d, 0xfd, 0x3a, 0x46, 0xa0, 0x11, 0x53, 0xf1, 0x9c, 0x4d, 0xb6, 0xd6, 0x56, 0xd3, 0x7d, 0x2c, 0x35, 0x9b, 0x54, 0xd0, 0x5b, 0x79, + 0xbe, 0xb1, 0xf0, 0xbc, 0x25, 0x81, 0xdd, 0xbc, 0x33, 0xa8, 0x02, 0xdc, 0xda, 0xc7, 0x9e, 0x6a, 0xc8, 0xb8, 0x3a, 0xb5, 0x12, 0xc3, 0x25, 0x79, 0x66, 0x6f, 0x66, 0x1b, 0xa1, 0x8b, 0x66, 0xfe, + 0x66, 0x0e, 0x82, 0xf6, 0x42, 0xc3, 0x28, 0xae, 0x59, 0xb3, 0x49, 0x58, 0xdb, 0xd8, 0x4e, 0x09, 0x98, 0x72, 0x8c, 0x26, 0xf3, 0xba, 0x28, 0x7c, 0x23, 0xd9, 0xfd, 0xfd, 0xa7, 0x7d, 0xa5, 0x08, + 0x4e, 0x6e, 0xff, 0xc7, 0xd6, 0xe2, 0xa2, 0xb7, 0x6b, 0xf4, 0x10, 0xc3, 0x87, 0x13, 0x2a, 0xb5, 0x31, 0x09, 0xc5, 0xe8, 0x50, 0xa0, 0x1a, 0x81, 0x05, 0x80, 0xd1, 0xe5, 0x9d, 0x5a, 0x54, 0x4b, + 0x5a, 0x3b, 0x45, 0x51, 0xc1, 0xd7, 0xa9, 0xa9, 0x7a, 0x25, 0xcf, 0x00, 0x43, 0x48, 0x96, 0xfe, 0x09, 0x8a, 0x1a, 0x96, 0xe9, 0xcf, 0x1b, 0x43, 0x53, 0x97, 0x21, 0x7b, 0xc2, 0x33, 0xcf, 0xc8, + 0x39, 0x81, 0x67, 0x39, 0x81, 0x0f, 0x03, 0xf3, 0x31, 0x29, 0x23, 0xa8, 0x9c, 0xde, 0xf9, 0x69, 0xe7, 0xbb, 0xa7, 0x07, 0xfa, 0xe7, 0x56, 0xc8, 0x2f, 0x9f, 0xf0, 0x02, 0xeb, 0x87, 0xf3, 0x63, + 0xd6, 0xcb, 0xeb, 0x56, 0xd9, 0xe9, 0x76, 0x0b, 0xcd, 0xb8, 0x6d, 0x9e, 0xc7, 0x0b, 0x0d, 0xe1, 0xf4, 0x9d, 0x4a, 0x1c, 0xda, 0xa1, 0x11, 0xc8, 0x2c, 0x0c, 0x4b, 0x32, 0xee, 0x22, 0x8f, 0x48, + 0x62, 0xa8, 0xcc, 0xd6, 0xc3, 0x54, 0x73, 0x9a, 0x7d, 0x49, 0x6e, 0xf6, 0x28, 0x89, 0x14, 0xb1, 0x70, 0x82, 0xa9, 0xa3, 0xac, 0x9d, 0x3d, 0x8d, 0x9b, 0x9e, 0x83, 0xa5, 0xe5, 0x94, 0xa7, 0x42, + 0x17, 0x13, 0x36, 0x9d, 0x2a, 0x63, 0xd2, 0xbc, 0x05, 0xcf, 0x7a, 0xb7, 0x97, 0xed, 0xed, 0xa3, 0xf0, 0x63, 0x66, 0x59, 0xec, 0x18, 0xe9, 0xe4, 0xe6, 0xe9, 0xf8, 0xb2, 0x33, 0x7d, 0x94, 0x83, + 0x6e, 0xbe, 0x07, 0xef, 0xef, 0xfa, 0xbc, 0xad, 0xbe, 0x11, 0xbf, 0x3f, 0x39, 0x5a, 0x06, 0xcf, 0x1a, 0xbe, 0xdf, 0xaf, 0x0a, 0xbe, 0x6f, 0x86, 0xf8, 0xfd, 0x76, 0x79, 0x6f, 0xf5, 0x24, 0x1f, + 0x1c, 0xde, 0x37, 0xd4, 0x5f, 0x86, 0xf6, 0xcd, 0xb9, 0xeb, 0x5a, 0x4a, 0xfe, 0x3c, 0xac, 0x6d, 0xd8, 0x1b, 0x34, 0x96, 0xba, 0x4c, 0xd1, 0x71, 0x6b, 0xa8, 0xab, 0xc8, 0x4e, 0xcf, 0xfb, 0x75, + 0x6c, 0x3b, 0xb0, 0x5a, 0x6e, 0x55, 0xbc, 0xa1, 0x21, 0x3d, 0xcc, 0xdd, 0xca, 0xf7, 0x12, 0x23, 0xdf, 0xf0, 0x0c, 0x19, 0x6e, 0x4e, 0xbe, 0xbe, 0x06, 0x86, 0x43, 0xb6, 0x39, 0x14, 0xc6, 0x82, + 0x1e, 0x16, 0x90, 0x23, 0xd0, 0x96, 0xd6, 0x9b, 0x61, 0x32, 0x3f, 0x67, 0x3b, 0x89, 0x9c, 0xbb, 0xec, 0x08, 0x0e, 0xc8, 0x68, 0x8d, 0x20, 0xbe, 0xba, 0xfa, 0xbc, 0x79, 0xe9, 0xea, 0x6b, 0xdc, + 0x7f, 0x50, 0xcd, 0x7e, 0x99, 0x73, 0xe8, 0x1d, 0x01, 0x37, 0x2b, 0x9f, 0x1d, 0x7a, 0xaf, 0x5f, 0xe6, 0xbb, 0x8b, 0x17, 0x19, 0xbe, 0xce, 0x6e, 0xe3, 0x5e, 0x1b, 0xaf, 0x43, 0xff, 0x71, 0xfe, + 0x7c, 0xc5, 0xfd, 0x90, 0x77, 0xc6, 0x3f, 0xb0, 0x2f, 0x12, 0x75, 0x1c, 0xa4, 0xf7, 0x3e, 0xec, 0xc7, 0xdc, 0x58, 0xde, 0xd0, 0xbd, 0x8c, 0xf9, 0x6b, 0x6b, 0xac, 0x4b, 0x8b, 0x50, 0x25, 0x99, + 0x6a, 0xc4, 0xd5, 0x49, 0x61, 0xf8, 0x65, 0x93, 0xf7, 0x3a, 0xbe, 0x83, 0xa8, 0xc8, 0x98, 0xba, 0xb1, 0x1e, 0x86, 0xc1, 0xb6, 0x5d, 0x29, 0xb3, 0x93, 0x26, 0x72, 0x75, 0xc0, 0xf1, 0x54, 0x13, + 0xd6, 0xfa, 0xa9, 0x9c, 0x5a, 0x3b, 0xd7, 0x35, 0x22, 0xa0, 0xd9, 0xb3, 0x18, 0x05, 0x88, 0x26, 0x25, 0x9a, 0x46, 0xac, 0xe6, 0xdd, 0xe0, 0x1c, 0x83, 0x81, 0x61, 0x08, 0x79, 0xe1, 0x3d, 0xa6, + 0xf5, 0xfa, 0x22, 0x6c, 0xf2, 0x2f, 0xf5, 0x02, 0xff, 0x0d, 0x9e, 0xbb, 0x3d, 0xf9, 0xbf, 0xc1, 0x73, 0xff, 0x0d, 0x9e, 0xfb, 0x60, 0xaf, 0xfd, 0x7f, 0x21, 0x78, 0xee, 0x2f, 0xe2, 0xbe, 0x1e, + 0x83, 0xf0, 0xa7, 0xb8, 0xaf, 0xb1, 0x60, 0x1d, 0xcf, 0xf8, 0x86, 0x01, 0x6a, 0xaf, 0xa8, 0x1b, 0x26, 0xe4, 0xfd, 0x6e, 0xed, 0xe1, 0xcd, 0x42, 0x51, 0x50, 0xbb, 0x2e, 0xf4, 0xe9, 0x20, 0x6f, + 0x62, 0x5d, 0x71, 0x0b, 0x6c, 0x0d, 0xc1, 0x20, 0x87, 0x4b, 0x46, 0x88, 0x1f, 0x57, 0x21, 0xa9, 0x0c, 0xa5, 0x2c, 0x6e, 0xda, 0xb3, 0xd1, 0xed, 0x95, 0x98, 0xcb, 0x45, 0x73, 0x96, 0x9b, 0x2e, + 0x03, 0xb1, 0x36, 0x31, 0x6c, 0x2c, 0x00, 0x76, 0xfe, 0x73, 0x5d, 0xde, 0x7f, 0xe3, 0xbe, 0xfe, 0x1b, 0xf7, 0xf5, 0xbb, 0xcb, 0x4a, 0x7b, 0xd2, 0x95, 0x77, 0x13, 0x13, 0xc3, 0x7f, 0x90, 0x07, + 0x0c, 0x3c, 0x2f, 0x54, 0x2f, 0x4c, 0xc4, 0xf3, 0xf1, 0x35, 0x27, 0xe5, 0x08, 0xa3, 0xce, 0xea, 0x0c, 0x26, 0xa5, 0xd0, 0x05, 0xb5, 0xb0, 0xf3, 0xc1, 0xd5, 0x71, 0x56, 0xf3, 0xa0, 0x72, 0x00, + 0x71, 0x65, 0x05, 0x0c, 0x1e, 0x43, 0x30, 0x0a, 0x99, 0x68, 0x9c, 0x3e, 0xab, 0x57, 0x62, 0x69, 0x56, 0xd4, 0x91, 0x8c, 0x5b, 0x69, 0x4f, 0xf4, 0x2e, 0xc9, 0x6e, 0x38, 0x7e, 0x01, 0x35, 0x27, + 0x98, 0xdb, 0xcc, 0x63, 0x68, 0x45, 0x42, 0xb0, 0x87, 0xea, 0xcb, 0xa6, 0x02, 0x92, 0x86, 0xc5, 0xdb, 0x31, 0xbe, 0xd6, 0x97, 0x97, 0xcc, 0xef, 0x73, 0xd2, 0x0f, 0x09, 0x4a, 0x57, 0x92, 0x17, + 0x14, 0xae, 0x07, 0x63, 0x44, 0x21, 0x78, 0x52, 0xef, 0xe5, 0x69, 0x78, 0x26, 0xe9, 0x22, 0x54, 0x7b, 0x21, 0xd2, 0x16, 0xed, 0x0c, 0x92, 0x85, 0x86, 0xe7, 0xea, 0x7c, 0x84, 0xea, 0xa8, 0x2b, + 0x83, 0xda, 0x99, 0xb8, 0x17, 0x21, 0xff, 0x96, 0xbf, 0xfa, 0x1b, 0x95, 0xf0, 0x03, 0x03, 0xfb, 0x91, 0xfa, 0xb5, 0x6b, 0x1f, 0xce, 0x8d, 0xad, 0x77, 0x30, 0x6b, 0x57, 0xd6, 0xa0, 0xe3, 0x9b, + 0x74, 0xef, 0x16, 0x68, 0x90, 0xed, 0xff, 0x7f, 0xce, 0xae, 0xa7, 0x47, 0x55, 0x18, 0x88, 0xdf, 0xf7, 0x63, 0xbc, 0xab, 0xd9, 0x57, 0xfe, 0x2e, 0x72, 0xac, 0x02, 0xae, 0x52, 0x54, 0x44, 0x84, + 0x72, 0x78, 0x89, 0xf2, 0x47, 0x40, 0x8a, 0x0a, 0x56, 0xec, 0x26, 0xef, 0xbb, 0xbf, 0xb8, 0xbe, 0x4d, 0x34, 0xea, 0x46, 0xf7, 0x40, 0x68, 0x2f, 0x93, 0x74, 0xa6, 0x33, 0xe9, 0xcc, 0xfc, 0xf2, + 0x1b, 0x96, 0x57, 0x9d, 0xd5, 0xbb, 0xca, 0x3c, 0x89, 0x28, 0x90, 0xad, 0xda, 0x40, 0xb5, 0x18, 0xd0, 0x34, 0x75, 0x5d, 0x9a, 0x31, 0x05, 0xaa, 0x94, 0x34, 0x95, 0xb5, 0x0e, 0x63, 0x32, 0x12, + 0x6c, 0x38, 0x30, 0x60, 0x51, 0x96, 0xda, 0xb0, 0x15, 0x68, 0x4e, 0x2b, 0xc8, 0xe1, 0x44, 0xa6, 0x73, 0x1e, 0x8c, 0x67, 0xe0, 0x87, 0xa0, 0x1f, 0x42, 0x2b, 0x42, 0xab, 0xf4, 0x34, 0x07, 0xe1, + 0xd7, 0x1f, 0xee, 0x37, 0x7f, 0x95, 0xb8, 0xdd, 0x44, 0x05, 0x9d, 0xc7, 0xb0, 0x8b, 0xb9, 0x12, 0xa7, 0xf0, 0x78, 0x91, 0x46, 0xdc, 0x01, 0x66, 0x9d, 0x3a, 0x5a, 0xf2, 0xed, 0x87, 0xfe, 0x65, + 0x6f, 0xeb, 0x76, 0x33, 0xe4, 0x27, 0xb5, 0xfd, 0x33, 0xb9, 0xe0, 0xf5, 0x7c, 0xf7, 0x08, 0x51, 0xe3, 0xd1, 0x78, 0x63, 0x67, 0x98, 0xea, 0x03, 0x2d, 0xce, 0x03, 0x3c, 0x53, 0x52, 0x99, 0xeb, + 0xac, 0x53, 0xc4, 0xa9, 0x7a, 0xa5, 0xce, 0xe6, 0xfd, 0x38, 0xa9, 0x04, 0x64, 0xc1, 0x44, 0x1c, 0xe9, 0x64, 0xd3, 0x5d, 0xe5, 0xa3, 0x4c, 0x94, 0x62, 0xcc, 0x6c, 0x0c, 0x7d, 0x77, 0x9a, 0xeb, + 0xf6, 0x2e, 0x18, 0x4c, 0xcd, 0xd0, 0xe0, 0x74, 0xc1, 0x35, 0xa7, 0x69, 0x6b, 0x5d, 0x6b, 0xa8, 0x5e, 0x0e, 0x33, 0xa2, 0x3e, 0xe2, 0xa5, 0x5f, 0x74, 0x7a, 0xf7, 0x74, 0xf1, 0xbc, 0x93, 0x7e, + 0x4a, 0x3c, 0x6a, 0xe1, 0xf8, 0x7f, 0x94, 0x3e, 0x09, 0x99, 0xd8, 0xe5, 0x33, 0xe8, 0x0f, 0x7c, 0x77, 0x09, 0xfd, 0x52, 0x75, 0x27, 0x79, 0x46, 0x5b, 0x96, 0x97, 0x32, 0xd7, 0x7f, 0xaf, 0xf7, + 0xc9, 0x46, 0x21, 0x21, 0xc5, 0x44, 0x8d, 0x1c, 0xd7, 0x34, 0x39, 0xd0, 0xcd, 0x77, 0x95, 0xdb, 0x18, 0xf0, 0xa0, 0xb5, 0x05, 0x40, 0xba, 0xde, 0x62, 0x87, 0xea, 0x5e, 0x6e, 0xf4, 0xe7, 0x11, + 0xd7, 0xf4, 0xeb, 0x75, 0x24, 0x7d, 0x54, 0x53, 0xa8, 0x5f, 0x31, 0x38, 0xb3, 0x79, 0x51, 0x64, 0xdf, 0xb2, 0x46, 0x3d, 0x6f, 0xfa, 0xff, 0x32, 0xc1, 0xeb, 0xd7, 0xea, 0x51, 0x93, 0x8b, 0x4d, + 0xd4, 0xcb, 0xa2, 0x80, 0x6d, 0xe5, 0x71, 0x87, 0x6b, 0x4b, 0x3e, 0xd2, 0x1d, 0x79, 0xba, 0x19, 0x39, 0x13, 0x28, 0x36, 0xb9, 0x0f, 0x8b, 0xbe, 0x67, 0xa5, 0x94, 0x08, 0xab, 0x49, 0xb8, 0x07, + 0x12, 0xef, 0x94, 0x42, 0x4c, 0x6c, 0x2e, 0x62, 0xa1, 0xed, 0x49, 0x34, 0xf0, 0x51, 0x9c, 0x37, 0xe6, 0x7e, 0xf9, 0xa6, 0xd7, 0xfb, 0x45, 0x54, 0xcc, 0x50, 0xcb, 0xc0, 0x7a, 0xb8, 0x53, 0xae, + 0xaa, 0xa2, 0x9f, 0x60, 0xf5, 0x7b, 0x19, 0xed, 0xf3, 0x95, 0x6f, 0x56, 0x1e, 0x0f, 0x5a, 0x3e, 0x3a, 0x52, 0xcf, 0x3d, 0x48, 0x6c, 0xd9, 0xf3, 0x6a, 0x2a, 0x84, 0x4a, 0x56, 0x1b, 0x5e, 0xdc, + 0xc6, 0x94, 0xc7, 0x05, 0x1d, 0x90, 0xed, 0x2c, 0x3d, 0x6c, 0x4d, 0x21, 0x44, 0xfe, 0xd0, 0x86, 0x32, 0x0c, 0xbb, 0xa2, 0x9d, 0x2c, 0x7a, 0xc3, 0x8d, 0xa5, 0x24, 0x94, 0xc3, 0xed, 0x05, 0xf8, + 0xe0, 0xdf, 0x36, 0x3e, 0x2a, 0x8d, 0x43, 0x80, 0xf7, 0x5e, 0x1a, 0x89, 0x49, 0xda, 0xc1, 0xaa, 0x86, 0x48, 0xf7, 0xed, 0xdb, 0x6b, 0xfd, 0x72, 0xfc, 0xfe, 0xbe, 0xfc, 0x0b, 0x00, 0x00, 0xff, + 0xff, 0x50, 0x4b, 0x07, 0x08, 0x7d, 0x55, 0x8d, 0xf2, 0x2c, 0x4b, 0x01, 0x00, 0x95, 0xc9, 0x04, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xcb, 0x6e, 0x1a, 0x41, 0x10, 0xbc, 0xf3, 0x15, 0xad, 0x3d, 0xf8, 0x60, 0x79, 0x7a, 0x1f, 0x10, 0xc7, 0xe6, 0x94, + 0x48, 0x39, 0xf8, 0x18, 0x29, 0x1c, 0x91, 0xa3, 0x65, 0xa7, 0x8d, 0x07, 0x2d, 0xb3, 0x93, 0x79, 0x20, 0x90, 0xc5, 0xbf, 0x47, 0xd3, 0xfb, 0x60, 0x79, 0xc4, 0x8a, 0x84, 0x80, 0x9d, 0xaa, 0xae, + 0xee, 0xae, 0x29, 0xed, 0xc7, 0x04, 0x20, 0xd1, 0xe5, 0x96, 0x92, 0x39, 0x24, 0xb4, 0x23, 0xed, 0xc5, 0x7b, 0xa9, 0x65, 0x4d, 0x36, 0x79, 0x88, 0xd0, 0x8e, 0xac, 0x53, 0x8d, 0x8e, 0x68, 0x86, + 0x39, 0x66, 0xed, 0xa9, 0x24, 0x57, 0x59, 0x65, 0x7c, 0x87, 0x2c, 0x0e, 0x86, 0x7e, 0xf1, 0x01, 0xbc, 0x2c, 0x16, 0x3f, 0xe1, 0x65, 0xac, 0x50, 0xab, 0x8a, 0xb4, 0x63, 0xfd, 0xef, 0xa6, 0xac, + 0xde, 0x49, 0x14, 0xbd, 0x8c, 0x25, 0xd3, 0x38, 0xe5, 0x1b, 0x7b, 0x48, 0xe6, 0x10, 0x27, 0x01, 0x48, 0xfc, 0xc1, 0x30, 0x77, 0xad, 0x3c, 0x93, 0x00, 0x92, 0x60, 0xeb, 0x78, 0x92, 0x4c, 0x00, + 0x8e, 0x5c, 0xd7, 0x36, 0x77, 0xa7, 0xa2, 0x55, 0x50, 0xb5, 0x8c, 0x1c, 0x6d, 0xf6, 0x20, 0x0c, 0x44, 0x91, 0x96, 0x04, 0xde, 0x55, 0xbd, 0x8e, 0xb1, 0xe4, 0xc9, 0xf9, 0x96, 0xb7, 0x05, 0x1b, + 0x34, 0xd4, 0x4a, 0x7b, 0xb8, 0xbb, 0x83, 0xfe, 0xb9, 0x15, 0xea, 0xf8, 0x91, 0x3c, 0x0f, 0x5a, 0x71, 0x85, 0x77, 0x42, 0x37, 0x92, 0x20, 0x7e, 0xfd, 0xde, 0x36, 0x32, 0xd4, 0xe4, 0x52, 0x5f, + 0x1a, 0x4a, 0x57, 0x4a, 0xf3, 0x1f, 0x88, 0xfc, 0x34, 0xf2, 0xd1, 0xbb, 0x33, 0x0d, 0xa5, 0x3d, 0xad, 0x6d, 0xd9, 0xdb, 0xf5, 0xbf, 0x52, 0xa3, 0xb2, 0x0b, 0xc5, 0xf1, 0x0a, 0xc3, 0x94, 0xe3, + 0x3d, 0xae, 0xda, 0x76, 0xc5, 0xce, 0x97, 0x96, 0xab, 0xdf, 0xca, 0xd2, 0x89, 0x8d, 0x13, 0x36, 0x68, 0xaf, 0xb6, 0x04, 0x98, 0xf2, 0xea, 0xa9, 0xd2, 0x92, 0xf6, 0xb8, 0x19, 0xba, 0x45, 0x83, + 0x38, 0x1a, 0x8e, 0xad, 0x5a, 0x26, 0xce, 0x56, 0xe9, 0xfd, 0x7d, 0x7a, 0x8f, 0x1f, 0x1b, 0xf7, 0xe0, 0xe3, 0x67, 0x7f, 0x5c, 0x26, 0xb0, 0xe4, 0xb9, 0x6e, 0x21, 0x42, 0xfc, 0x09, 0x8a, 0x86, + 0xcb, 0x94, 0xb4, 0x0a, 0x6b, 0x9e, 0xbf, 0x91, 0xb4, 0x6d, 0x34, 0x08, 0xa1, 0xb4, 0x33, 0x54, 0x79, 0xc0, 0xf4, 0xcc, 0x91, 0x8b, 0x11, 0xd9, 0x9c, 0xaa, 0x56, 0xb8, 0x71, 0xd7, 0xd3, 0x0e, + 0xd1, 0x90, 0xb4, 0xfb, 0x41, 0x86, 0xb4, 0x24, 0x5d, 0x29, 0x1a, 0x45, 0xe4, 0x1b, 0x67, 0x82, 0xdd, 0x8d, 0xdd, 0x5f, 0x67, 0x98, 0x4f, 0xbb, 0x1c, 0x0e, 0x28, 0x27, 0x46, 0xb4, 0xab, 0xa6, + 0xed, 0x8f, 0x30, 0x75, 0x58, 0x2b, 0xdd, 0x95, 0x14, 0xb3, 0x4f, 0x4b, 0x4c, 0x69, 0x1d, 0xd9, 0x1b, 0xdc, 0x16, 0x67, 0xe0, 0x2b, 0x16, 0x8f, 0x97, 0x80, 0xa8, 0x1a, 0xfd, 0xa6, 0xd6, 0x22, + 0x06, 0xd4, 0xab, 0x4e, 0xe1, 0x09, 0xa7, 0x57, 0xbc, 0x76, 0x98, 0x73, 0xde, 0x14, 0x47, 0x8d, 0x3a, 0x53, 0x19, 0x28, 0x30, 0xc3, 0xd9, 0x38, 0xfb, 0x43, 0x49, 0x31, 0x96, 0x76, 0xc1, 0x90, + 0xed, 0x43, 0xf5, 0x3a, 0xc3, 0x0c, 0x8b, 0x21, 0x6a, 0xb7, 0xcd, 0xea, 0xf2, 0xcb, 0xc8, 0x33, 0xe6, 0x98, 0x9f, 0x80, 0x7f, 0x6e, 0x93, 0x63, 0xfe, 0x34, 0x52, 0x18, 0xac, 0xeb, 0xcd, 0xc2, + 0xd9, 0xf8, 0x0e, 0x3f, 0xb9, 0xc0, 0xa1, 0x73, 0xfe, 0x88, 0x79, 0x8e, 0xf9, 0x30, 0x6c, 0x55, 0x37, 0x41, 0xf2, 0x1b, 0xcc, 0x31, 0xfe, 0x05, 0x8b, 0x53, 0xc3, 0x8b, 0x2c, 0x31, 0x21, 0xc3, + 0x67, 0xcc, 0xb8, 0xeb, 0xe4, 0x38, 0xf9, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc1, 0x4a, 0xe5, 0xd6, 0x01, 0x02, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0xb4, 0x53, 0xc1, 0x6e, 0xdb, 0x38, 0x10, 0xbd, 0xf3, 0x2b, 0x1e, 0xb0, 0x0b, 0x38, 0x36, 0x2c, 0xeb, 0x6e, 0x6f, 0x82, 0xc5, 0x66, 0x03, 0x64, + 0xf7, 0xb0, 0xc9, 0x26, 0x69, 0x81, 0xdc, 0x4c, 0x89, 0x63, 0x8b, 0x89, 0x34, 0xa3, 0x90, 0x54, 0x62, 0xd7, 0xf0, 0xbf, 0x17, 0x14, 0xe5, 0x34, 0x69, 0x01, 0xa3, 0x68, 0x51, 0x5d, 0x44, 0x0c, + 0xdf, 0x1b, 0xbe, 0x99, 0x79, 0x63, 0x9b, 0x56, 0x5c, 0xc0, 0x0e, 0xe7, 0xc2, 0x81, 0x36, 0x01, 0x7b, 0xac, 0x9c, 0x34, 0x18, 0xad, 0xb4, 0xf6, 0xd9, 0x83, 0xcf, 0x5c, 0xc7, 0xc1, 0x36, 0x34, + 0x5a, 0x28, 0x95, 0x4f, 0x26, 0x0a, 0x13, 0xdc, 0x4b, 0xe7, 0x70, 0x79, 0x77, 0x77, 0x8d, 0x4a, 0xb3, 0xa9, 0x2d, 0xaf, 0xb1, 0xea, 0xb8, 0x0c, 0x56, 0x78, 0x0a, 0xcb, 0xcf, 0xf2, 0x48, 0x06, + 0x2f, 0x36, 0x54, 0x20, 0x5d, 0x56, 0x70, 0xf4, 0xd4, 0x91, 0x0f, 0x33, 0xdc, 0x55, 0xd6, 0xc3, 0x7a, 0x68, 0x06, 0x6d, 0x74, 0xd3, 0xd6, 0x14, 0xb3, 0x1d, 0xa8, 0x08, 0x95, 0x0e, 0xa8, 0x65, + 0xed, 0x11, 0x2a, 0x82, 0xe5, 0x52, 0x9a, 0x98, 0x7a, 0xa0, 0x43, 0xb3, 0x01, 0x95, 0x95, 0x90, 0x87, 0x0d, 0x1e, 0x96, 0xdb, 0x2e, 0x20, 0x48, 0x0f, 0x2e, 0x75, 0x5d, 0x93, 0x9b, 0x29, 0xf4, + 0xfa, 0xfe, 0x09, 0x28, 0x35, 0xa3, 0xa0, 0xf7, 0x62, 0x96, 0xf1, 0xa5, 0x21, 0xb4, 0x7c, 0x8f, 0x0b, 0xe4, 0xc3, 0x2b, 0x8c, 0xdb, 0xa6, 0x0f, 0x2c, 0x7f, 0x4d, 0xba, 0x3f, 0x5b, 0xed, 0x74, + 0x83, 0xdd, 0xd0, 0xef, 0x3d, 0xca, 0xa1, 0xf1, 0xfa, 0xf5, 0x24, 0xc5, 0x03, 0x95, 0x61, 0xf6, 0x16, 0x9d, 0x42, 0xaf, 0xe0, 0x59, 0x21, 0x66, 0xdb, 0x97, 0x7e, 0x68, 0x4f, 0x1f, 0xb0, 0x2b, + 0x68, 0xde, 0x1e, 0xe3, 0x3d, 0x75, 0xe4, 0x12, 0x31, 0x9d, 0x7c, 0x70, 0xb1, 0xc9, 0x86, 0x3c, 0x39, 0xab, 0x6b, 0xfb, 0x89, 0x0c, 0x74, 0x3f, 0xa2, 0xc4, 0x9c, 0x7e, 0x47, 0xce, 0x5a, 0xd6, + 0x71, 0x6e, 0xeb, 0x98, 0x28, 0xdd, 0xa5, 0xd2, 0x1b, 0x0a, 0x95, 0x18, 0x8f, 0x95, 0x38, 0x8c, 0x2c, 0xaf, 0x64, 0x34, 0xc5, 0xe8, 0x45, 0x3b, 0x8e, 0x7f, 0x72, 0x4e, 0xdc, 0x68, 0x0a, 0x0a, + 0xe5, 0xd1, 0x42, 0x2b, 0xd2, 0x86, 0x5c, 0xf2, 0x44, 0xef, 0xb9, 0x43, 0xc1, 0xc3, 0xc5, 0x5b, 0x6e, 0x2a, 0xe6, 0x0b, 0x37, 0x09, 0xf8, 0x96, 0x9a, 0xe2, 0xc7, 0x98, 0x55, 0x08, 0xed, 0x47, + 0x72, 0x3e, 0xf9, 0x72, 0xa0, 0xb7, 0x4e, 0x82, 0x94, 0x52, 0xe3, 0x39, 0xdd, 0xc4, 0x04, 0xb7, 0x44, 0x73, 0x44, 0xb4, 0x9f, 0xe7, 0xf9, 0xda, 0x86, 0xaa, 0x2b, 0x66, 0xa5, 0x34, 0xf9, 0x23, + 0xeb, 0x60, 0x9f, 0x29, 0xf3, 0x9a, 0x4d, 0x21, 0x9b, 0xfc, 0x91, 0xb3, 0xb6, 0xee, 0xd6, 0x96, 0xb3, 0x68, 0x9b, 0xbc, 0xa8, 0xa5, 0xc8, 0x1b, 0x6d, 0x39, 0x37, 0x52, 0xfa, 0x7c, 0xdd, 0x59, + 0x43, 0x3e, 0x67, 0x31, 0xf4, 0xe0, 0x67, 0x8d, 0xf9, 0x2d, 0x54, 0x94, 0x0d, 0x5a, 0xb2, 0xd4, 0x11, 0x85, 0x49, 0xae, 0x68, 0xd3, 0x2f, 0x6b, 0x29, 0x1c, 0x1b, 0x10, 0x97, 0x8f, 0x70, 0x0a, + 0xed, 0xb7, 0x5c, 0xe2, 0x64, 0xc0, 0xcf, 0x0f, 0x9b, 0x3c, 0x9e, 0xe3, 0xda, 0x49, 0x63, 0x3d, 0xfd, 0x91, 0xca, 0x3b, 0xc3, 0xe9, 0x19, 0x76, 0x0a, 0xc8, 0x73, 0xdc, 0x5f, 0x7d, 0xb8, 0xc1, + 0xf9, 0xd5, 0xdf, 0x17, 0xb8, 0xbc, 0xb8, 0xb9, 0x48, 0x31, 0xf2, 0xb5, 0xe5, 0x90, 0x19, 0xeb, 0x75, 0x51, 0x53, 0xc6, 0xf1, 0xf1, 0xda, 0x32, 0x81, 0x25, 0x8a, 0xf1, 0x12, 0x17, 0x16, 0xc3, + 0x29, 0x4e, 0xfd, 0x64, 0xa9, 0xb2, 0x1f, 0xff, 0xd4, 0x65, 0x9a, 0xe0, 0x5c, 0xfd, 0xbe, 0xfb, 0xf7, 0xf6, 0xea, 0xbf, 0x59, 0x52, 0x69, 0x57, 0xdb, 0x93, 0xaf, 0x86, 0x3f, 0xde, 0x2b, 0xf5, + 0x7f, 0xb4, 0xeb, 0x11, 0x68, 0x6f, 0xe7, 0x08, 0xfc, 0x4b, 0xcc, 0x31, 0x5c, 0xdc, 0x93, 0xf1, 0xfe, 0xa7, 0x74, 0x2f, 0xc7, 0x0b, 0x05, 0x38, 0x0a, 0x9d, 0x63, 0x1c, 0x7b, 0x66, 0xa1, 0xf6, + 0x0b, 0xf5, 0x39, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xc0, 0x92, 0x2b, 0xe5, 0x3f, 0x02, 0x00, 0x00, 0x61, 0x05, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x5c, 0x52, 0xcb, 0x6e, 0xdb, 0x30, 0x10, 0xbc, 0xfb, 0x2b, 0xe6, 0x46, 0xba, 0xa0, 0x65, 0x37, 0xe9, 0xc9, 0x86, 0x7b, 0x29, + 0x0a, 0xd4, 0x3d, 0x24, 0x87, 0xe6, 0x07, 0x18, 0x69, 0xed, 0x28, 0x91, 0x48, 0x65, 0xb9, 0x32, 0x6a, 0x18, 0xfa, 0xf7, 0x80, 0xd4, 0xcb, 0xc9, 0x4d, 0x3b, 0x3b, 0x3b, 0x3b, 0x1a, 0xae, 0x6a, + 0x03, 0x21, 0x08, 0x97, 0xb9, 0xa8, 0xdd, 0xa2, 0xac, 0x1b, 0xcf, 0x82, 0x2b, 0x82, 0x58, 0x16, 0x83, 0x83, 0x3b, 0xfb, 0x37, 0xe2, 0xc7, 0x46, 0x4a, 0xef, 0x02, 0x3a, 0x1c, 0xd9, 0xd7, 0x50, + 0x47, 0x6b, 0xc3, 0xea, 0x35, 0xac, 0xb8, 0x75, 0x52, 0xd6, 0x34, 0x0f, 0x32, 0xbd, 0xb7, 0x14, 0x64, 0xa0, 0x85, 0xb6, 0x21, 0x16, 0x0a, 0x51, 0x79, 0x64, 0x7c, 0x83, 0x0d, 0x38, 0xb6, 0x2e, + 0x1f, 0x38, 0x59, 0xb6, 0x7e, 0x6e, 0xcb, 0xaa, 0x98, 0x35, 0xe2, 0x80, 0xc1, 0x15, 0x4f, 0x51, 0x68, 0xdc, 0x28, 0xb6, 0x89, 0x6b, 0x16, 0xb9, 0x77, 0x41, 0x50, 0x58, 0xb1, 0xd8, 0xe3, 0xba, + 0x00, 0x9c, 0xad, 0x69, 0x0b, 0x25, 0xe5, 0x89, 0x58, 0x99, 0x05, 0x90, 0xb7, 0x41, 0x7c, 0x4d, 0x7c, 0x28, 0xb6, 0x50, 0x9b, 0xef, 0x77, 0xf7, 0x3f, 0xd4, 0xa2, 0x9b, 0x26, 0x89, 0xf9, 0x8f, + 0x75, 0x45, 0x45, 0x8c, 0x3d, 0xb4, 0x6c, 0xd3, 0x96, 0x25, 0xf6, 0x3f, 0xa1, 0x89, 0x79, 0x8b, 0xdf, 0xcc, 0x9e, 0x53, 0x1d, 0xc5, 0x25, 0xa3, 0x58, 0xc7, 0xd6, 0x72, 0xd7, 0xd7, 0xae, 0xd0, + 0xcb, 0x5d, 0x12, 0x8c, 0x3e, 0xb5, 0x3a, 0x38, 0xa1, 0x13, 0xdb, 0x98, 0xcf, 0x16, 0x2f, 0x49, 0x3a, 0xc0, 0xe2, 0x6c, 0xab, 0xb2, 0x18, 0xe3, 0x50, 0x06, 0x5a, 0x26, 0xd1, 0x14, 0xad, 0x8e, + 0x11, 0x64, 0x3d, 0xdf, 0xe0, 0xda, 0xc5, 0x54, 0x3e, 0x87, 0xbd, 0xcc, 0xe4, 0x85, 0x9c, 0xd6, 0x81, 0xf8, 0x4c, 0xb3, 0xa5, 0x68, 0xa2, 0xa9, 0xac, 0xd3, 0xf7, 0xc9, 0x11, 0xc6, 0x1d, 0x23, + 0x2f, 0x61, 0x40, 0xd6, 0xf8, 0xe8, 0x6e, 0xad, 0x26, 0x20, 0x44, 0xeb, 0x31, 0xb8, 0x09, 0xa1, 0xff, 0x0d, 0xe5, 0xa2, 0xef, 0x36, 0x9b, 0xaf, 0x90, 0xfa, 0xe5, 0x9d, 0x90, 0x93, 0xd5, 0xd3, + 0xa5, 0x21, 0x65, 0xb0, 0x7e, 0x0d, 0xde, 0xad, 0x67, 0x96, 0x2b, 0x74, 0xcc, 0xc4, 0x80, 0x29, 0xb4, 0x95, 0xdc, 0x98, 0xeb, 0x0d, 0x4e, 0xa9, 0x19, 0xa8, 0x07, 0x8f, 0x54, 0xaa, 0xc1, 0x6f, + 0xcf, 0xf0, 0x6f, 0x7a, 0x98, 0xbd, 0x45, 0xe9, 0xbd, 0xb5, 0x95, 0xfe, 0xfb, 0xef, 0xf1, 0x21, 0x8b, 0x27, 0xe9, 0x4e, 0xe5, 0xf1, 0x32, 0xf0, 0xb2, 0x67, 0x5f, 0x5c, 0x96, 0x06, 0x5f, 0x9a, + 0xe9, 0x87, 0x3e, 0x6b, 0xf4, 0x2f, 0x34, 0x02, 0x7d, 0x2c, 0x59, 0x5e, 0xf9, 0x40, 0x33, 0xde, 0xa5, 0xaf, 0xce, 0xdc, 0xdc, 0x83, 0x96, 0xa8, 0x13, 0x1b, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0x04, 0x6d, 0x41, 0x6c, 0x95, 0x01, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, + 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, 0x73, 0x54, 0x90, 0xcd, 0x6e, 0xdb, 0x30, 0x10, 0x84, 0xef, 0x7a, 0x8a, 0xb9, 0x51, 0x2a, 0x1c, 0xa9, 0x4d, 0x7b, 0xb2, 0xea, 0x5c, 0x8a, + 0x1e, 0xd2, 0x43, 0x0b, 0xb4, 0xe8, 0x03, 0x30, 0xe4, 0x3a, 0x62, 0x4c, 0x2d, 0x15, 0x72, 0x69, 0xc7, 0x30, 0xfc, 0xee, 0x85, 0x7e, 0xec, 0x3a, 0x27, 0x62, 0x77, 0x67, 0x77, 0x86, 0x9f, 0xca, + 0x89, 0x90, 0x24, 0x3a, 0x23, 0xaa, 0x2d, 0x0a, 0xd7, 0x0f, 0x21, 0x0a, 0x84, 0x92, 0x60, 0x1b, 0x43, 0x0f, 0x25, 0x7a, 0x20, 0xd5, 0x5e, 0x06, 0x27, 0x7c, 0x0b, 0x2c, 0xf4, 0x26, 0x38, 0x2f, + 0xf3, 0xad, 0xd6, 0xe9, 0xee, 0x25, 0xdd, 0xc5, 0xcc, 0xe2, 0xfa, 0x1b, 0xe9, 0x07, 0xe8, 0x84, 0x6d, 0x66, 0xb3, 0x08, 0xeb, 0xba, 0x79, 0xca, 0xce, 0xdb, 0xc6, 0xb1, 0xa5, 0xb7, 0xfa, 0x25, + 0x8d, 0x7e, 0x4d, 0x83, 0xef, 0x9c, 0x72, 0x24, 0x48, 0xa7, 0x05, 0xd2, 0xd1, 0xb4, 0x22, 0x2e, 0x30, 0x4c, 0xe8, 0x07, 0x4f, 0x42, 0x09, 0xc6, 0x93, 0x66, 0x7f, 0xc4, 0xa1, 0x23, 0xc6, 0xa0, + 0x53, 0x22, 0x0b, 0x8d, 0xbd, 0xf6, 0xce, 0x82, 0xf6, 0xc4, 0x52, 0x17, 0x63, 0xe2, 0x52, 0xfd, 0x65, 0x27, 0x6b, 0x74, 0x9a, 0xad, 0xa7, 0x74, 0x95, 0x44, 0x7a, 0xcd, 0x94, 0x44, 0xad, 0xa0, + 0xd3, 0x91, 0x0d, 0x4a, 0xa9, 0xb0, 0x79, 0xc0, 0xa9, 0x00, 0xa4, 0x1e, 0xbc, 0xe6, 0xf2, 0xbe, 0x6a, 0x0b, 0xc0, 0x04, 0x4e, 0x82, 0xa7, 0x60, 0x8f, 0x6b, 0xfc, 0x26, 0x13, 0xa2, 0xfd, 0x3a, + 0x92, 0xe1, 0xe7, 0x15, 0xe6, 0xf7, 0x01, 0x9b, 0x69, 0x0b, 0x60, 0xdd, 0xd3, 0x1a, 0x4a, 0xdc, 0x33, 0x45, 0xb5, 0x9a, 0x5a, 0x26, 0x27, 0x09, 0x3d, 0xc5, 0x47, 0xbb, 0x86, 0xfa, 0xf8, 0xe9, + 0xfe, 0xf3, 0x17, 0x55, 0x00, 0xe7, 0xb6, 0xb8, 0x5e, 0x9e, 0x73, 0x61, 0x33, 0x7d, 0xb1, 0x9e, 0xab, 0xff, 0xbe, 0x7d, 0x30, 0xbb, 0x0b, 0xdc, 0x0d, 0x4e, 0x53, 0x0e, 0x9c, 0x47, 0x88, 0x4b, + 0x77, 0xba, 0xd4, 0x34, 0x78, 0xe4, 0x7d, 0xd8, 0xd1, 0x7b, 0x56, 0x87, 0xce, 0x99, 0x0e, 0xa9, 0x0b, 0xd9, 0xdb, 0x2b, 0x38, 0x1c, 0x9c, 0x74, 0x21, 0x0b, 0x28, 0xc6, 0x10, 0xa1, 0xd9, 0x82, + 0x4c, 0x17, 0xa6, 0x4d, 0xab, 0x45, 0x5f, 0xad, 0x23, 0xa5, 0xec, 0x47, 0x57, 0x7d, 0xd0, 0xee, 0x92, 0xb3, 0xbc, 0x09, 0x34, 0xe1, 0x91, 0x3a, 0xec, 0xca, 0x59, 0xba, 0xd4, 0xf4, 0x9a, 0xb5, + 0x5f, 0x5a, 0x2b, 0xfc, 0xf8, 0xf3, 0xeb, 0x67, 0x3d, 0x83, 0x72, 0xdb, 0x63, 0x39, 0xe6, 0xaf, 0x2e, 0x42, 0xb6, 0x65, 0xd5, 0x16, 0xe7, 0xaa, 0x2d, 0xfe, 0x05, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x4b, 0x07, 0x08, 0xea, 0xe3, 0xfc, 0x9c, 0x75, 0x01, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x73, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x8c, 0x54, 0xdd, 0x6e, 0x23, 0x37, 0x0f, 0xbd, 0xf7, 0x53, 0x10, 0x73, 0x33, 0x89, 0x91, 0xd8, 0xd9, 0x7c, 0xf8, 0xb6, 0xad, 0xef, + 0x16, 0x8e, 0x17, 0x48, 0xd1, 0x4d, 0x8b, 0x38, 0x05, 0x0a, 0x14, 0x45, 0x21, 0x6b, 0x38, 0x36, 0x53, 0x0d, 0x35, 0x10, 0xa9, 0x24, 0x83, 0xc5, 0xbe, 0x7b, 0x21, 0xc9, 0x3f, 0x69, 0x7e, 0x8c, + 0xf5, 0xcd, 0xd0, 0x33, 0xe2, 0xe1, 0xe1, 0x21, 0x75, 0xbe, 0x8e, 0x00, 0x2a, 0x62, 0xeb, 0x62, 0x83, 0xd5, 0x0c, 0xfe, 0x1c, 0x01, 0x00, 0x54, 0x12, 0xec, 0x74, 0x3c, 0x9e, 0x8e, 0xab, 0x11, + 0xc0, 0x5f, 0x67, 0xe9, 0x08, 0x3e, 0xed, 0x8f, 0x54, 0xec, 0x1b, 0xfc, 0xbb, 0xf3, 0x4d, 0x74, 0x28, 0x55, 0xf9, 0x6c, 0x7d, 0xd7, 0x93, 0xc3, 0xf0, 0x6b, 0xaf, 0xe4, 0x59, 0xaa, 0x19, 0x7c, + 0x2d, 0x48, 0x6a, 0xc2, 0x1a, 0xb5, 0x9a, 0x41, 0xb5, 0x58, 0x5e, 0x5e, 0x5c, 0x5e, 0x54, 0x67, 0xf0, 0xee, 0x6f, 0x3a, 0x86, 0x65, 0x8f, 0x96, 0xda, 0x01, 0x16, 0xf3, 0x2f, 0x9f, 0x96, 0x36, + 0x50, 0xaf, 0x50, 0x10, 0xe0, 0x01, 0x83, 0x90, 0xe7, 0x19, 0xd4, 0x8b, 0xe5, 0xff, 0x6a, 0x38, 0x69, 0xb0, 0x35, 0xd1, 0xe9, 0xe9, 0x59, 0x7a, 0xf1, 0xff, 0x3a, 0x3f, 0x2e, 0x2f, 0x3e, 0x1c, + 0xa2, 0x8f, 0xfb, 0xe8, 0x87, 0x7d, 0xf4, 0xe3, 0x3e, 0xfa, 0x69, 0x17, 0x5d, 0x5e, 0xd4, 0x67, 0xe0, 0x43, 0xfa, 0x73, 0xb3, 0xf8, 0xe3, 0xae, 0x9e, 0xc0, 0x78, 0x5a, 0xa8, 0x97, 0x0e, 0x13, + 0x75, 0xeb, 0xbb, 0xce, 0xf3, 0xbd, 0xbc, 0x4f, 0xfe, 0x19, 0xf5, 0x92, 0x06, 0xd6, 0x37, 0x08, 0x6b, 0x64, 0x0c, 0x46, 0x0b, 0x6f, 0xf6, 0x8c, 0xa9, 0xea, 0x0e, 0x2d, 0xc5, 0xa6, 0x6b, 0xd2, + 0x43, 0x06, 0x51, 0xec, 0x52, 0x14, 0xcb, 0x0b, 0x94, 0x5d, 0x2f, 0x29, 0x7a, 0xce, 0x11, 0x9f, 0xf4, 0x19, 0x47, 0x1f, 0xf5, 0x8a, 0x42, 0xe2, 0x38, 0x99, 0xae, 0x22, 0xb9, 0xe6, 0x88, 0xbe, + 0xd3, 0x31, 0xdc, 0x62, 0x43, 0x01, 0xad, 0x82, 0x8f, 0xda, 0x47, 0x05, 0xd1, 0x10, 0xad, 0xc6, 0x80, 0xa0, 0x1e, 0x74, 0x83, 0x50, 0x3e, 0xfb, 0x30, 0x1c, 0x4a, 0x88, 0x06, 0xb2, 0x69, 0x82, + 0x1a, 0x22, 0x1e, 0x99, 0xde, 0xb6, 0xc4, 0x82, 0xcd, 0xca, 0x21, 0x18, 0xe7, 0xa0, 0x64, 0x82, 0x0e, 0x3d, 0x9e, 0xdb, 0x0d, 0xda, 0x7f, 0x88, 0xd7, 0xe0, 0xcb, 0x86, 0x1c, 0xf0, 0xd9, 0x5f, + 0x77, 0xbd, 0x23, 0x4b, 0xfa, 0x89, 0x87, 0x6a, 0x06, 0xad, 0x71, 0xf2, 0x6e, 0x9d, 0xd4, 0x83, 0x21, 0x41, 0xc0, 0x10, 0x7c, 0x00, 0xcf, 0x80, 0x4f, 0x7d, 0x40, 0x49, 0xab, 0x21, 0x60, 0xb8, + 0x81, 0x06, 0xad, 0x33, 0x45, 0x73, 0x81, 0x47, 0xd2, 0x0d, 0x18, 0x06, 0x4a, 0x15, 0xb0, 0x81, 0xda, 0xf0, 0x50, 0x67, 0x42, 0x2f, 0xfb, 0xbb, 0x89, 0xce, 0xcd, 0x13, 0x47, 0x39, 0xd6, 0xe9, + 0xa1, 0xbf, 0x6d, 0x6f, 0x1c, 0x9d, 0x83, 0xdc, 0x9b, 0xbc, 0x44, 0xfc, 0x1c, 0xd9, 0x26, 0x16, 0x77, 0x43, 0x8f, 0xef, 0x83, 0xbe, 0x42, 0x3c, 0x08, 0xd5, 0x42, 0xbb, 0x85, 0xc8, 0x8c, 0xdf, + 0x94, 0xec, 0x6e, 0x43, 0x47, 0x09, 0xbf, 0xa5, 0x58, 0xad, 0x1b, 0x92, 0xfa, 0x3f, 0xc2, 0x7d, 0x8f, 0x4e, 0xec, 0x7f, 0xe7, 0x28, 0xd8, 0xfc, 0xe2, 0xad, 0x71, 0xdf, 0x51, 0x14, 0x7b, 0x1f, + 0xb4, 0x54, 0x95, 0x54, 0x36, 0xe6, 0x6c, 0x70, 0x39, 0xfd, 0x35, 0xec, 0x6f, 0x26, 0x98, 0x0e, 0x15, 0xc3, 0x11, 0xe8, 0x23, 0xb0, 0xfd, 0x3e, 0xfd, 0x2d, 0x99, 0x6e, 0x51, 0x63, 0xe0, 0x63, + 0xa4, 0x5f, 0x40, 0xc3, 0xe3, 0x06, 0x19, 0xd8, 0x6b, 0x5e, 0xe4, 0x7c, 0x97, 0x7b, 0xa3, 0x1b, 0x01, 0xe2, 0xc3, 0x54, 0x42, 0x46, 0x05, 0x03, 0x0f, 0xc6, 0x45, 0x7c, 0x69, 0x1c, 0xb7, 0x28, + 0xde, 0xc5, 0x74, 0x30, 0x5d, 0xcf, 0xe4, 0x99, 0x6f, 0xdd, 0xcd, 0xd7, 0xc6, 0x11, 0xf6, 0x79, 0x69, 0x25, 0x8c, 0xe2, 0x7a, 0xc8, 0xe6, 0xd1, 0x60, 0x0d, 0x27, 0x37, 0xbe, 0xc1, 0xc9, 0xbd, + 0x9c, 0x66, 0x37, 0xb0, 0xce, 0x88, 0x90, 0xad, 0xe1, 0x24, 0xed, 0xd8, 0xd6, 0x2e, 0xfb, 0x80, 0xe7, 0x1f, 0x26, 0x1f, 0x4f, 0x0f, 0x74, 0x50, 0xbe, 0x64, 0xe4, 0x6b, 0x56, 0x0c, 0xbe, 0x3f, + 0x3a, 0xb9, 0xfd, 0x3a, 0x0a, 0x60, 0x47, 0x0a, 0x54, 0x72, 0x30, 0x98, 0x15, 0x39, 0xd2, 0x01, 0x56, 0xa8, 0x8f, 0x88, 0x0c, 0xf3, 0x6c, 0x62, 0x3f, 0x2f, 0xf3, 0x9d, 0x5b, 0x2c, 0xa1, 0x94, + 0x10, 0x78, 0x20, 0x03, 0x36, 0x60, 0xbe, 0x7f, 0x69, 0x85, 0xd9, 0x74, 0x28, 0xbd, 0xb1, 0x08, 0x7e, 0x75, 0x8f, 0x56, 0x05, 0x5a, 0x1f, 0xb2, 0xa8, 0xd4, 0x25, 0xb9, 0x65, 0x02, 0x79, 0x48, + 0x28, 0x50, 0x1b, 0xe7, 0xfc, 0xe3, 0x72, 0x60, 0xdd, 0xa0, 0x92, 0xbd, 0x2a, 0x06, 0x7f, 0x5d, 0x8e, 0x3d, 0xf3, 0xbc, 0xd6, 0x07, 0x8b, 0x73, 0xcf, 0x42, 0xa2, 0xc8, 0x3a, 0x37, 0x42, 0xbc, + 0xbe, 0xe6, 0xcf, 0xe4, 0xf0, 0x26, 0x55, 0xdb, 0x36, 0xb8, 0xeb, 0xe7, 0x8a, 0x24, 0x03, 0x03, 0xb1, 0xdd, 0x27, 0xb9, 0xe1, 0xdc, 0x9a, 0xb4, 0x37, 0x01, 0x5b, 0x0c, 0xc8, 0x16, 0x65, 0x67, + 0x81, 0x62, 0x3a, 0x84, 0x96, 0xdc, 0x6e, 0xa0, 0xdf, 0x46, 0xdf, 0x46, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0x4b, 0x07, 0x08, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, + 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x52, 0x56, 0x08, 0x2d, 0x4e, 0x4d, 0x51, 0x48, + 0xaa, 0x54, 0x48, 0x2a, 0xcd, 0xcc, 0x49, 0x49, 0x4a, 0x4c, 0xce, 0x86, 0xb0, 0x52, 0x8b, 0x8a, 0x75, 0x20, 0x2c, 0xd7, 0xbc, 0xb2, 0x62, 0x85, 0xc4, 0xa2, 0x54, 0x85, 0x82, 0xc4, 0x62, 0x90, + 0xda, 0x92, 0x7c, 0x85, 0x92, 0x8c, 0x54, 0x88, 0x9c, 0x42, 0x66, 0x6e, 0x62, 0x7a, 0x2a, 0x17, 0x5c, 0x9d, 0x15, 0x97, 0xae, 0x42, 0x5e, 0x62, 0x6e, 0xaa, 0x95, 0x82, 0x53, 0x40, 0xbc, 0x9f, + 0xbf, 0x8b, 0x6b, 0x7c, 0x50, 0xa8, 0x5f, 0x7c, 0xb0, 0x73, 0x90, 0x67, 0x40, 0x48, 0x30, 0x97, 0x82, 0x42, 0x59, 0x62, 0x4e, 0x69, 0xaa, 0x15, 0x44, 0x2f, 0x17, 0x20, 0x00, 0x00, 0xff, 0xff, + 0x50, 0x4b, 0x07, 0x08, 0xdd, 0x81, 0x1f, 0xc3, 0x68, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xe4, 0x80, 0x4d, 0x46, 0x02, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00, 0x00, 0x00, 0x00, 0x52, 0x45, + 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x7d, 0x02, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xed, 0x81, 0x9e, 0x02, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x2b, 0x64, 0x7b, 0x4a, 0x02, 0x00, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xcb, + 0x02, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xe7, 0x37, 0x3e, 0x49, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x5b, 0x05, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xa7, 0xe7, 0x98, 0x5d, 0x01, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe7, 0x05, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x4a, 0xc6, 0x4e, 0x75, 0x01, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8a, 0x07, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, + 0x17, 0x55, 0x3f, 0xf5, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4a, 0x09, 0x00, 0x00, 0x67, 0x6f, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xed, 0x81, 0x89, 0x0a, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, + 0xec, 0x7c, 0x05, 0x80, 0x01, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xaf, 0x0a, 0x00, 0x00, 0x67, 0x6f, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xe0, + 0x7c, 0xeb, 0x1f, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6e, 0x0c, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, + 0x74, 0x74, 0x70, 0x2f, 0x67, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xb8, 0x89, 0xe0, 0xc1, 0x01, + 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc9, 0x0c, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xcc, 0x0b, 0x00, 0x53, 0x01, 0x00, + 0x00, 0x1b, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc9, 0x0e, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x67, 0x6f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x21, 0x93, + 0xab, 0x16, 0x01, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x60, 0x10, 0x00, 0x00, 0x67, 0x6f, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x10, 0x6b, 0x5e, 0xee, 0x00, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb9, 0x11, 0x00, 0x00, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xe2, 0x12, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x05, 0x13, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x73, 0x18, 0x7f, 0xf2, 0x02, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x34, 0x13, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, + 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x89, 0xbf, 0x4c, 0x56, 0x02, 0x00, 0x00, 0x1b, 0x05, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6e, 0x16, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x17, 0x55, 0x3f, + 0xf5, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x0b, 0x19, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x80, 0x79, 0xb2, 0x67, 0xe6, 0x00, 0x00, 0x13, 0x33, 0x03, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x81, 0x4c, 0x1a, 0x00, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4c, 0x45, 0xda, 0x2c, 0x01, 0x00, 0x00, + 0x44, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x03, 0x01, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x7a, 0x02, 0x01, + 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0xc7, 0xa4, 0xab, 0xdf, 0x01, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0xae, 0x02, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x92, 0xcd, 0x83, 0x23, 0x02, 0x00, + 0x00, 0xb9, 0x04, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xdf, 0x04, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4d, 0x07, + 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x26, 0x8e, 0x5d, + 0xb9, 0x03, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x75, 0x07, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, + 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x09, 0x1b, + 0x6e, 0x9c, 0x02, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6f, 0x0b, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xff, 0xda, + 0x05, 0x0a, 0xe7, 0x00, 0x00, 0xca, 0x39, 0x03, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4b, 0x0e, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x98, 0x26, 0x31, 0x01, 0x00, 0x00, 0x35, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x9e, 0xf5, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x81, 0x13, 0xf7, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xa7, 0x29, 0xe2, 0xc2, 0x01, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0x40, 0xf7, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0x91, 0x02, 0x5f, 0x01, 0x00, 0x00, 0x8c, 0x03, 0x00, 0x00, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4d, 0xf9, 0x01, 0x00, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, + 0x6e, 0x69, 0x74, 0x2e, 0x6a, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf0, 0xfa, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xed, 0x81, 0x15, 0xfb, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x46, 0xfb, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x72, 0x6f, + 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x13, 0x6b, 0x58, 0xac, 0x01, 0x00, 0x00, 0x69, 0x03, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb1, 0xfb, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, + 0x81, 0xa6, 0x27, 0xf6, 0x00, 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa7, 0xfd, 0x01, 0x00, 0x70, 0x79, 0x74, + 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xf7, 0x4e, 0x8b, 0x29, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0xe5, 0xfe, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x5c, 0xff, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xc1, 0x82, 0x54, 0x76, 0x01, 0x00, 0x00, 0x9f, 0x02, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0xcf, 0xff, 0x01, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, + 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x92, 0x01, 0x02, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x4d, 0xa5, 0x54, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xbc, 0x01, 0x02, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x8d, 0x58, 0xbb, 0xa6, 0x01, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x20, 0x02, 0x02, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, + 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x2b, 0x3e, 0x0d, 0xc8, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x13, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x09, 0x04, 0x02, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x66, 0x75, 0x6e, 0x63, + 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x8d, 0xf6, 0x14, 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x12, 0x05, 0x02, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x2c, 0x4c, + 0x78, 0xb2, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x7e, 0x05, 0x02, 0x00, 0x70, 0x79, 0x74, 0x68, 0x6f, + 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x2e, 0x70, 0x79, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x76, 0x06, 0x02, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x9c, 0x06, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, + 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xce, 0x06, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, + 0x81, 0xf0, 0x07, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x27, 0x08, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x25, 0xd9, + 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x66, 0x08, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, + 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, + 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0x4a, 0x0f, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdb, 0x53, 0x2f, 0x30, 0x04, 0x00, 0x00, 0x6a, 0x09, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x27, 0x10, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xf7, 0x4e, 0x8b, 0x29, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa2, 0x14, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x6d, 0x0b, 0x80, 0xb4, 0x0c, 0x00, 0x00, 0x55, 0x27, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xed, 0x81, 0x1a, 0x15, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x2c, 0x84, 0x18, 0xd1, 0x09, 0x00, 0x00, 0xcf, 0x19, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x14, 0x22, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xdb, 0x3b, 0xda, 0x18, 0x04, 0x00, 0x00, + 0xd3, 0x10, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2f, 0x2c, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x90, 0x30, 0x02, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, + 0x81, 0xc6, 0x30, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, + 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x01, 0x31, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x41, 0x31, 0x02, 0x00, + 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, + 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x16, 0x23, 0x9b, + 0x51, 0x01, 0x00, 0x00, 0xb2, 0x02, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8b, 0x31, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, + 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa6, 0x1f, 0xc2, 0x5d, 0xbc, 0x00, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x43, 0x33, 0x02, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc2, 0xc1, 0xc3, 0xba, 0x00, 0x00, 0x00, 0xd2, 0x01, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0x63, 0x34, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, + 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x82, 0x35, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, + 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x16, 0x61, 0x9b, 0xcf, 0x6a, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xc7, 0x35, 0x02, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x9c, 0x36, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, + 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xd7, 0x36, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, + 0x81, 0x17, 0x37, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, + 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfb, 0x20, 0x9b, 0xb4, 0xde, 0x01, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x61, 0x37, 0x02, 0x00, 0x71, + 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, + 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x12, 0xb7, 0x75, 0x8f, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xaa, 0x39, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, + 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xa8, 0x3a, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0xc2, 0x92, 0xc9, 0xd6, 0x00, 0x00, 0x00, 0x34, 0x01, + 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd3, 0x3a, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xee, 0x3b, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x1e, 0x3c, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x9c, 0x25, 0xd9, 0x5c, 0x7a, 0x06, 0x00, 0x00, 0x4d, 0x13, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x56, 0x3c, 0x02, + 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, + 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x33, 0x43, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, + 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x0a, 0x24, 0xd8, 0x04, 0x04, 0x00, 0x00, 0xd9, 0x08, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x09, 0x44, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x6d, 0x0b, 0x80, 0xb4, 0x0c, 0x00, 0x00, 0x55, 0x27, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x81, 0x51, 0x48, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x2c, 0x84, 0x18, 0xd1, 0x09, 0x00, 0x00, 0xcf, 0x19, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xed, 0x81, 0x44, 0x55, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xdb, 0x3b, 0xda, 0x18, 0x04, 0x00, 0x00, 0xd3, 0x10, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x58, 0x5f, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb2, 0x63, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xe1, 0x63, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x15, 0x64, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4e, 0x64, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0a, 0xe7, 0x07, 0xf9, 0x00, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x91, 0x64, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x4f, 0x11, 0xc3, 0x8a, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xea, 0x65, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x49, 0xd9, 0x7c, 0x8a, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0xd1, 0x66, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xed, 0x81, 0xb9, 0x67, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x61, 0x9b, 0xcf, 0x6a, 0x00, 0x00, 0x00, 0xc8, 0x00, + 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf7, 0x67, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xc5, 0x68, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xf9, 0x68, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, + 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, + 0x81, 0x32, 0x69, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x2d, 0xc8, 0x7b, 0x92, 0x01, + 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x75, 0x69, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x12, + 0xb7, 0x75, 0x8f, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6b, 0x6b, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, + 0x6b, 0x75, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x54, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd9, 0x28, 0xa8, 0x76, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0x62, 0x6c, 0x02, 0x00, 0x71, 0x75, 0x61, 0x72, 0x6b, 0x75, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xed, 0x81, 0x1b, 0x6d, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x3e, 0x6d, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x8b, 0xf7, 0xcc, 0x9f, + 0x2c, 0x00, 0x00, 0xba, 0xbc, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6d, 0x6d, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xcd, 0xea, 0x09, 0xd0, 0xa2, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x55, 0x9a, + 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xcc, 0x2d, 0x40, 0x23, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x40, 0x9b, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x63, + 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc5, 0x70, 0x1e, 0xeb, 0x03, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xaa, 0x9b, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x17, 0x55, 0x3f, + 0xf5, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xdd, 0x9f, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xed, 0x81, 0x1e, 0xa1, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x68, 0x6c, 0x5f, 0xb5, 0x01, 0x00, 0x00, 0xce, 0x03, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x51, 0xa1, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x7a, 0x13, 0x17, 0x03, 0x00, 0x00, 0x1d, + 0x08, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x52, 0xa3, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x73, 0x95, 0x77, 0xd3, 0x01, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb6, 0xa6, + 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xd3, 0xa8, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x39, 0x21, 0xec, 0xef, 0x28, 0x00, 0x00, 0x5c, 0xac, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, + 0xfb, 0xa8, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xe8, 0xd8, 0xdd, 0x76, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x81, 0x2c, 0xd2, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x43, 0x61, 0x72, 0x67, 0x6f, 0x2e, 0x74, 0x6f, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xcc, 0x2d, 0x40, 0x23, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0xe4, 0xd2, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x86, 0xa7, 0x33, 0xae, 0x03, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0x47, 0xd3, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xed, 0x81, 0x36, 0xd7, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xb7, 0x30, 0xd8, 0xc1, 0x01, 0x00, 0x00, 0xd4, 0x03, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0x62, 0xd7, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xef, 0xae, 0xee, 0x06, 0x02, 0x00, 0x00, 0x3e, 0x05, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x68, 0xd9, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2e, + 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xa7, 0xfe, 0xff, 0xbf, 0x01, 0x00, 0x00, 0x5c, 0x03, 0x00, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb4, 0xdb, 0x02, 0x00, 0x72, 0x75, 0x73, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2e, 0x72, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb6, 0xdd, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xdf, 0xdd, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x14, 0xde, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd0, + 0xde, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x0d, 0xe0, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x47, 0xe0, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, + 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x89, 0xe0, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbc, 0x87, + 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x6d, 0xe7, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, + 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, + 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x07, 0xfa, 0xc4, 0xb6, 0x05, 0x00, 0x00, 0x1a, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0x4d, 0xe8, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, + 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x17, 0x55, 0x3f, 0xf5, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x51, 0xee, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, 0x00, 0x56, 0x27, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, + 0x81, 0x98, 0xef, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x41, 0x77, 0xf2, 0xcf, 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x93, 0xfc, 0x02, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x71, 0x30, + 0x6c, 0xe6, 0x04, 0x00, 0x00, 0xbd, 0x14, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xaf, 0x06, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, + 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xed, 0x81, 0xe1, 0x0b, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, + 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x1a, 0x0c, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x58, 0x0c, 0x03, 0x00, 0x73, 0x70, + 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, + 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x9b, 0x0c, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x1e, 0xc2, 0x1b, 0x96, 0x02, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe3, 0x0c, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x45, 0x63, 0x68, 0x6f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x4c, 0x84, 0x0a, 0xaa, 0x00, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, + 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe2, 0x0f, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, 0x69, + 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x05, 0x11, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x80, 0x5f, 0x6d, 0x54, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4d, + 0x11, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, + 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x0f, 0x12, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4d, 0x12, 0x03, 0x00, 0x73, + 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, + 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x90, 0x12, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x65, 0xb0, 0x9a, 0x11, 0x03, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd8, 0x12, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x65, 0x63, 0x68, 0x6f, 0x2f, 0x53, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x81, 0x67, 0x16, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x8c, 0x4a, 0xca, 0x6a, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x81, 0x95, 0x16, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x89, 0xf3, 0xc3, 0xee, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4a, 0x17, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, + 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x80, 0x18, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, + 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xb3, 0x18, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, + 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xac, 0xb9, 0x3d, 0x77, 0x06, 0x00, 0x00, 0x4e, 0x13, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x81, 0xee, 0x18, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, + 0x70, 0x65, 0x72, 0x2f, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbc, 0x87, 0xa7, 0x76, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xcb, 0x1f, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x6d, 0x76, + 0x6e, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xf1, 0x0d, 0x9f, 0xa4, 0x04, 0x00, 0x00, 0x5c, 0x0b, 0x00, 0x00, 0x19, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xa4, 0x20, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x2c, 0xd6, 0x95, 0xb2, 0x0c, 0x00, + 0x00, 0x56, 0x27, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x8f, 0x25, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, + 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x41, 0x77, 0xf2, 0xcf, + 0x09, 0x00, 0x00, 0xd0, 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x83, 0x32, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, + 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6d, 0x76, 0x6e, 0x77, 0x2e, 0x63, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc9, 0x30, 0x68, 0xac, 0xe2, 0x04, 0x00, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x98, 0x3c, 0x03, 0x00, 0x73, + 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x6f, 0x6d, 0x2e, 0x78, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, + 0xbf, 0x41, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xed, 0x81, 0xf1, 0x41, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x28, 0x42, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x64, 0x42, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, + 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xdf, 0x4e, 0x84, 0xee, 0x00, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xaa, 0x42, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, + 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x0b, 0x44, + 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x6e, 0x70, 0x95, 0x24, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x4c, 0x44, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xd7, 0x44, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, + 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x0e, 0x45, 0x03, + 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4a, 0x45, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, + 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x6b, 0x01, 0x26, 0xe0, 0x01, 0x00, 0x00, 0x3a, 0x04, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x90, + 0x45, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, + 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x36, 0x8a, 0x9d, 0x6c, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe0, 0x47, 0x03, 0x00, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x6f, 0x74, 0x2f, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x92, 0x48, 0x03, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xbb, 0x48, 0x03, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x54, 0xc9, 0x2d, 0xd5, 0x00, 0x00, + 0x00, 0xc9, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xf0, 0x48, 0x03, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x97, 0xda, 0x64, 0x50, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0x13, 0x4a, 0x03, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2e, 0x70, 0x72, 0x65, + 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x85, 0x04, 0x59, 0x2f, 0x03, 0x00, 0x00, 0x78, + 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb3, 0x4a, 0x03, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xf7, 0x4e, 0x8b, 0x29, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x30, + 0x4e, 0x03, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, + 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x55, 0x8d, 0xf2, 0x2c, 0x4b, 0x01, 0x00, 0x95, + 0xc9, 0x04, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xab, 0x4e, 0x03, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xff, 0x5a, 0x4f, 0x03, 0x02, 0x00, 0x00, 0x0e, 0x05, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2d, 0x9a, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x81, 0x9c, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x40, 0xbe, 0x47, 0x32, 0x03, 0x00, 0x00, 0x7e, 0x07, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, + 0x81, 0xba, 0x9c, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x3d, 0xa0, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb5, 0xfa, 0xb1, 0x83, 0x18, 0x02, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x77, 0xa0, 0x04, 0x00, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x99, 0x86, 0x22, 0xdc, 0x01, + 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xe7, 0xa2, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x14, 0xa5, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x4e, 0xa8, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x7e, 0x8c, 0x5d, 0xd6, + 0x00, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x7c, 0xa8, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x65, 0x73, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xbe, 0x97, 0xda, 0x64, 0x50, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x99, 0xa9, 0x04, 0x00, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x74, 0x74, 0x69, 0x65, 0x72, 0x72, 0x63, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0xf3, 0xdd, 0x10, 0x5d, 0x03, 0x00, 0x00, 0x61, 0x07, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x32, 0xaa, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x2e, + 0x6d, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x55, 0x8d, 0xf2, 0x2c, 0x4b, 0x01, 0x00, 0x95, 0xc9, 0x04, 0x00, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xd6, 0xad, 0x04, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc1, 0x4a, 0xe5, 0xd6, 0x01, 0x02, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x51, 0xf9, 0x05, 0x00, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xed, 0x81, 0x9c, 0xfb, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x50, 0x4b, 0x01, + 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x92, 0x2b, 0xe5, 0x3f, 0x02, 0x00, 0x00, 0x61, 0x05, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0xce, 0xfb, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0x57, 0xfe, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6d, 0x41, 0x6c, 0x95, 0x01, + 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x8a, 0xfe, 0x05, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, + 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0xe3, 0xfc, 0x9c, 0x75, 0x01, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0x70, 0x00, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x75, 0x6e, + 0x69, 0x74, 0x2e, 0x74, 0x73, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x83, 0xa5, 0x1f, 0xe8, 0x02, 0x00, 0x00, 0x26, 0x07, 0x00, + 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x2f, 0x02, 0x06, 0x00, 0x74, 0x79, 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x81, 0x1f, 0xc3, 0x68, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x62, 0x05, 0x06, 0x00, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x79, 0x61, 0x6d, 0x6c, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, + 0xc1, 0x00, 0x86, 0x39, 0x00, 0x00, 0x10, 0x06, 0x06, 0x00, 0x00, 0x00, +} diff --git a/vendor/modules.txt b/vendor/modules.txt index f027a8574c..13e5581a3b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# cloud.google.com/go/compute v1.3.0 +# cloud.google.com/go/compute v1.5.0 cloud.google.com/go/compute/metadata # contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d contrib.go.opencensus.io/exporter/ocagent @@ -17,13 +17,35 @@ github.com/Azure/go-autorest/autorest/date github.com/Azure/go-autorest/logger # github.com/Azure/go-autorest/tracing v0.6.0 github.com/Azure/go-autorest/tracing +# github.com/Microsoft/go-winio v0.5.2 +github.com/Microsoft/go-winio +github.com/Microsoft/go-winio/pkg/guid +# github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3 +github.com/ProtonMail/go-crypto/bitcurves +github.com/ProtonMail/go-crypto/brainpool +github.com/ProtonMail/go-crypto/eax +github.com/ProtonMail/go-crypto/internal/byteutil +github.com/ProtonMail/go-crypto/ocb +github.com/ProtonMail/go-crypto/openpgp +github.com/ProtonMail/go-crypto/openpgp/aes/keywrap +github.com/ProtonMail/go-crypto/openpgp/armor +github.com/ProtonMail/go-crypto/openpgp/ecdh +github.com/ProtonMail/go-crypto/openpgp/elgamal +github.com/ProtonMail/go-crypto/openpgp/errors +github.com/ProtonMail/go-crypto/openpgp/internal/algorithm +github.com/ProtonMail/go-crypto/openpgp/internal/ecc +github.com/ProtonMail/go-crypto/openpgp/internal/encoding +github.com/ProtonMail/go-crypto/openpgp/packet +github.com/ProtonMail/go-crypto/openpgp/s2k # github.com/PuerkitoBio/purell v1.1.1 github.com/PuerkitoBio/purell # github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 github.com/PuerkitoBio/urlesc # github.com/Shopify/sarama v1.30.1 github.com/Shopify/sarama -# github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211221011931-643d94fcab96 +# github.com/acomagu/bufpipe v1.0.3 +github.com/acomagu/bufpipe +# github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220209173558-ad29539cd2e9 github.com/antlr/antlr4/runtime/Go/antlr # github.com/beorn7/perks v1.0.1 github.com/beorn7/perks/quantile @@ -61,6 +83,8 @@ github.com/cloudevents/sdk-go/v2/event/datacodec/xml github.com/cloudevents/sdk-go/v2/protocol github.com/cloudevents/sdk-go/v2/protocol/http github.com/cloudevents/sdk-go/v2/types +# github.com/coreos/go-semver v0.3.0 +github.com/coreos/go-semver/semver # github.com/cpuguy83/go-md2man/v2 v2.0.1 github.com/cpuguy83/go-md2man/v2/md2man # github.com/davecgh/go-spew v1.1.1 @@ -74,6 +98,13 @@ github.com/eapache/queue # github.com/emicklei/go-restful v2.15.0+incompatible github.com/emicklei/go-restful github.com/emicklei/go-restful/log +# github.com/emirpasic/gods v1.12.0 +github.com/emirpasic/gods/containers +github.com/emirpasic/gods/lists +github.com/emirpasic/gods/lists/arraylist +github.com/emirpasic/gods/trees +github.com/emirpasic/gods/trees/binaryheap +github.com/emirpasic/gods/utils # github.com/evanphx/json-patch v4.12.0+incompatible github.com/evanphx/json-patch # github.com/evanphx/json-patch/v5 v5.6.0 @@ -84,6 +115,61 @@ github.com/fsnotify/fsnotify github.com/ghodss/yaml # github.com/go-errors/errors v1.0.1 github.com/go-errors/errors +# github.com/go-git/gcfg v1.5.0 +github.com/go-git/gcfg +github.com/go-git/gcfg/scanner +github.com/go-git/gcfg/token +github.com/go-git/gcfg/types +# github.com/go-git/go-billy/v5 v5.3.1 +github.com/go-git/go-billy/v5 +github.com/go-git/go-billy/v5/helper/chroot +github.com/go-git/go-billy/v5/helper/polyfill +github.com/go-git/go-billy/v5/memfs +github.com/go-git/go-billy/v5/osfs +github.com/go-git/go-billy/v5/util +# github.com/go-git/go-git/v5 v5.4.2 +github.com/go-git/go-git/v5 +github.com/go-git/go-git/v5/config +github.com/go-git/go-git/v5/internal/revision +github.com/go-git/go-git/v5/internal/url +github.com/go-git/go-git/v5/plumbing +github.com/go-git/go-git/v5/plumbing/cache +github.com/go-git/go-git/v5/plumbing/color +github.com/go-git/go-git/v5/plumbing/filemode +github.com/go-git/go-git/v5/plumbing/format/config +github.com/go-git/go-git/v5/plumbing/format/diff +github.com/go-git/go-git/v5/plumbing/format/gitignore +github.com/go-git/go-git/v5/plumbing/format/idxfile +github.com/go-git/go-git/v5/plumbing/format/index +github.com/go-git/go-git/v5/plumbing/format/objfile +github.com/go-git/go-git/v5/plumbing/format/packfile +github.com/go-git/go-git/v5/plumbing/format/pktline +github.com/go-git/go-git/v5/plumbing/object +github.com/go-git/go-git/v5/plumbing/protocol/packp +github.com/go-git/go-git/v5/plumbing/protocol/packp/capability +github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband +github.com/go-git/go-git/v5/plumbing/revlist +github.com/go-git/go-git/v5/plumbing/storer +github.com/go-git/go-git/v5/plumbing/transport +github.com/go-git/go-git/v5/plumbing/transport/client +github.com/go-git/go-git/v5/plumbing/transport/file +github.com/go-git/go-git/v5/plumbing/transport/git +github.com/go-git/go-git/v5/plumbing/transport/http +github.com/go-git/go-git/v5/plumbing/transport/internal/common +github.com/go-git/go-git/v5/plumbing/transport/server +github.com/go-git/go-git/v5/plumbing/transport/ssh +github.com/go-git/go-git/v5/storage +github.com/go-git/go-git/v5/storage/filesystem +github.com/go-git/go-git/v5/storage/filesystem/dotgit +github.com/go-git/go-git/v5/storage/memory +github.com/go-git/go-git/v5/utils/binary +github.com/go-git/go-git/v5/utils/diff +github.com/go-git/go-git/v5/utils/ioutil +github.com/go-git/go-git/v5/utils/merkletrie +github.com/go-git/go-git/v5/utils/merkletrie/filesystem +github.com/go-git/go-git/v5/utils/merkletrie/index +github.com/go-git/go-git/v5/utils/merkletrie/internal/frame +github.com/go-git/go-git/v5/utils/merkletrie/noder # github.com/go-kit/log v0.1.0 github.com/go-kit/log github.com/go-kit/log/level @@ -93,14 +179,14 @@ github.com/go-logfmt/logfmt github.com/go-logr/logr # github.com/go-openapi/jsonpointer v0.19.5 github.com/go-openapi/jsonpointer -# github.com/go-openapi/jsonreference v0.19.5 +# github.com/go-openapi/jsonreference v0.19.6 github.com/go-openapi/jsonreference # github.com/go-openapi/swag v0.19.15 github.com/go-openapi/swag # github.com/gogo/protobuf v1.3.2 github.com/gogo/protobuf/proto github.com/gogo/protobuf/sortkeys -# github.com/golang-jwt/jwt/v4 v4.2.0 +# github.com/golang-jwt/jwt/v4 v4.3.0 github.com/golang-jwt/jwt/v4 # github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da github.com/golang/groupcache/lru @@ -126,7 +212,7 @@ github.com/google/go-cmp/cmp/internal/diff github.com/google/go-cmp/cmp/internal/flags github.com/google/go-cmp/cmp/internal/function github.com/google/go-cmp/cmp/internal/value -# github.com/google/go-containerregistry v0.8.1-0.20220219142810-1571d7fdc46e +# github.com/google/go-containerregistry v0.8.1-0.20220414143355-892d7a808387 github.com/google/go-containerregistry/pkg/name # github.com/google/gofuzz v1.2.0 github.com/google/gofuzz @@ -167,6 +253,8 @@ github.com/hashicorp/hcl/json/token github.com/imdario/mergo # github.com/inconshreveable/mousetrap v1.0.0 github.com/inconshreveable/mousetrap +# github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 +github.com/jbenet/go-context/io # github.com/jcmturner/aescts/v2 v2.0.0 github.com/jcmturner/aescts/v2 # github.com/jcmturner/dnsutils/v2 v2.0.0 @@ -214,7 +302,9 @@ github.com/josharian/intern github.com/json-iterator/go # github.com/kelseyhightower/envconfig v1.4.0 github.com/kelseyhightower/envconfig -# github.com/klauspost/compress v1.14.2 +# github.com/kevinburke/ssh_config v1.1.0 +github.com/kevinburke/ssh_config +# github.com/klauspost/compress v1.14.4 github.com/klauspost/compress github.com/klauspost/compress/fse github.com/klauspost/compress/huff0 @@ -274,7 +364,7 @@ github.com/prometheus/client_model/go github.com/prometheus/common/expfmt github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg github.com/prometheus/common/model -# github.com/prometheus/procfs v0.6.0 +# github.com/prometheus/procfs v0.7.3 github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util @@ -291,6 +381,8 @@ github.com/rickb777/plural github.com/robfig/cron/v3 # github.com/russross/blackfriday/v2 v2.1.0 github.com/russross/blackfriday/v2 +# github.com/sergi/go-diff v1.2.0 +github.com/sergi/go-diff/diffmatchpatch # github.com/spf13/afero v1.8.0 github.com/spf13/afero github.com/spf13/afero/mem @@ -321,6 +413,10 @@ github.com/subosito/gotenv github.com/thediveo/enumflag # github.com/wavesoftware/go-ensure v1.0.0 github.com/wavesoftware/go-ensure +# github.com/whilp/git-urls v1.0.0 +github.com/whilp/git-urls +# github.com/xanzy/ssh-agent v0.3.1 +github.com/xanzy/ssh-agent # github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca github.com/xlab/treeprint # go.opencensus.io v0.23.0 @@ -352,25 +448,37 @@ go.starlark.net/starlarkstruct go.starlark.net/syntax # go.uber.org/atomic v1.9.0 go.uber.org/atomic -# go.uber.org/multierr v1.6.0 +# go.uber.org/multierr v1.7.0 go.uber.org/multierr -# go.uber.org/zap v1.19.1 +# go.uber.org/zap v1.20.0 go.uber.org/zap go.uber.org/zap/buffer go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit go.uber.org/zap/zapcore -# golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce +# golang.org/x/crypto v0.0.0-20220214200702-86341886e292 +golang.org/x/crypto/blowfish +golang.org/x/crypto/cast5 +golang.org/x/crypto/chacha20 +golang.org/x/crypto/curve25519 +golang.org/x/crypto/curve25519/internal/field +golang.org/x/crypto/ed25519 +golang.org/x/crypto/internal/poly1305 +golang.org/x/crypto/internal/subtle golang.org/x/crypto/md4 golang.org/x/crypto/pbkdf2 golang.org/x/crypto/pkcs12 golang.org/x/crypto/pkcs12/internal/rc2 +golang.org/x/crypto/ssh +golang.org/x/crypto/ssh/agent +golang.org/x/crypto/ssh/internal/bcrypt_pbkdf +golang.org/x/crypto/ssh/knownhosts # golang.org/x/mod v0.5.1 golang.org/x/mod/internal/lazyregexp golang.org/x/mod/module golang.org/x/mod/semver -# golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd +# golang.org/x/net v0.0.0-20220225172249-27dd8689420f golang.org/x/net/context golang.org/x/net/context/ctxhttp golang.org/x/net/http/httpguts @@ -382,7 +490,7 @@ golang.org/x/net/internal/socks golang.org/x/net/internal/timeseries golang.org/x/net/proxy golang.org/x/net/trace -# golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 +# golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b golang.org/x/oauth2 golang.org/x/oauth2/authhandler golang.org/x/oauth2/google @@ -393,7 +501,8 @@ golang.org/x/oauth2/jwt # golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sync/errgroup golang.org/x/sync/semaphore -# golang.org/x/sys v0.0.0-20220209214540-3681064d5158 +# golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 +golang.org/x/sys/cpu golang.org/x/sys/execabs golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9 @@ -414,7 +523,7 @@ golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm golang.org/x/text/width -# golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 +# golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 golang.org/x/time/rate # golang.org/x/tools v0.1.9 golang.org/x/tools/go/ast/astutil @@ -446,7 +555,7 @@ google.golang.org/appengine/internal/modules google.golang.org/appengine/internal/remote_api google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/urlfetch -# google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf +# google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6 google.golang.org/genproto/googleapis/api/httpbody google.golang.org/genproto/googleapis/rpc/status google.golang.org/genproto/protobuf/field_mask @@ -535,11 +644,13 @@ google.golang.org/protobuf/types/known/wrapperspb gopkg.in/inf.v0 # gopkg.in/ini.v1 v1.66.2 gopkg.in/ini.v1 +# gopkg.in/warnings.v0 v0.1.2 +gopkg.in/warnings.v0 # gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 # gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gopkg.in/yaml.v3 -# gotest.tools/v3 v3.0.3 +# gotest.tools/v3 v3.1.0 ## explicit gotest.tools/v3/assert gotest.tools/v3/assert/cmp @@ -547,7 +658,7 @@ gotest.tools/v3/internal/assert gotest.tools/v3/internal/difflib gotest.tools/v3/internal/format gotest.tools/v3/internal/source -# k8s.io/api v0.22.5 +# k8s.io/api v0.23.5 => k8s.io/api v0.22.5 ## explicit k8s.io/api/admissionregistration/v1 k8s.io/api/admissionregistration/v1beta1 @@ -599,7 +710,7 @@ k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1 k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1 -# k8s.io/apimachinery v0.22.5 +# k8s.io/apimachinery v0.23.5 => k8s.io/apimachinery v0.22.5 ## explicit k8s.io/apimachinery/pkg/api/apitesting/fuzzer k8s.io/apimachinery/pkg/api/equality @@ -657,7 +768,7 @@ k8s.io/apimachinery/third_party/forked/golang/reflect k8s.io/cli-runtime/pkg/genericclioptions k8s.io/cli-runtime/pkg/printers k8s.io/cli-runtime/pkg/resource -# k8s.io/client-go v0.22.5 +# k8s.io/client-go v1.5.2 => k8s.io/client-go v0.22.5 ## explicit k8s.io/client-go/applyconfigurations/admissionregistration/v1 k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1 @@ -836,7 +947,7 @@ k8s.io/gengo/parser k8s.io/gengo/types # k8s.io/klog/v2 v2.40.1 k8s.io/klog/v2 -# k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 +# k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf k8s.io/kube-openapi/cmd/openapi-gen/args k8s.io/kube-openapi/pkg/common k8s.io/kube-openapi/pkg/generators @@ -844,12 +955,12 @@ k8s.io/kube-openapi/pkg/generators/rules k8s.io/kube-openapi/pkg/util/proto k8s.io/kube-openapi/pkg/util/sets k8s.io/kube-openapi/pkg/validation/spec -# k8s.io/utils v0.0.0-20211208161948-7d6a63dca704 +# k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 k8s.io/utils/buffer k8s.io/utils/integer k8s.io/utils/pointer k8s.io/utils/trace -# knative.dev/eventing v0.29.1 +# knative.dev/eventing v0.29.2-0.20220420140829-ce4fe0990d23 ## explicit knative.dev/eventing/pkg/apis/config knative.dev/eventing/pkg/apis/duck @@ -889,7 +1000,7 @@ knative.dev/eventing-kafka/pkg/client/clientset/versioned/scheme knative.dev/eventing-kafka/pkg/client/clientset/versioned/typed/sources/v1beta1 knative.dev/eventing-kafka/pkg/client/clientset/versioned/typed/sources/v1beta1/fake knative.dev/eventing-kafka/pkg/common/constants -# knative.dev/hack v0.0.0-20220118141833-9b2ed8471e30 +# knative.dev/hack v0.0.0-20220128200847-51a42b2eb63e ## explicit knative.dev/hack # knative.dev/kn-plugin-event v1.2.0 => github.com/openshift-knative/kn-plugin-event v0.29.1-0.20220412122141-1868b0441a3a @@ -904,6 +1015,10 @@ knative.dev/kn-plugin-event/pkg/k8s knative.dev/kn-plugin-event/pkg/metadata knative.dev/kn-plugin-event/pkg/plugin knative.dev/kn-plugin-event/pkg/sender +# knative.dev/kn-plugin-func v0.24.0 => github.com/openshift-knative/kn-plugin-func v1.1.3-0.20220601222936-a3f704bc3c50 +## explicit +knative.dev/kn-plugin-func +knative.dev/kn-plugin-func/utils # knative.dev/kn-plugin-source-kafka v0.29.0 ## explicit knative.dev/kn-plugin-source-kafka/pkg/client @@ -911,7 +1026,7 @@ knative.dev/kn-plugin-source-kafka/pkg/factories knative.dev/kn-plugin-source-kafka/pkg/root knative.dev/kn-plugin-source-kafka/pkg/types knative.dev/kn-plugin-source-kafka/plugin -# knative.dev/networking v0.0.0-20220120043934-ec785540a732 +# knative.dev/networking v0.0.0-20220120045035-ec849677a316 ## explicit knative.dev/networking/pkg knative.dev/networking/pkg/apis/networking @@ -972,7 +1087,7 @@ knative.dev/pkg/tracing/propagation knative.dev/pkg/tracing/propagation/tracecontextb3 knative.dev/pkg/tracker knative.dev/pkg/webhook/resourcesemantics -# knative.dev/serving v0.29.3 +# knative.dev/serving v0.29.5 ## explicit knative.dev/serving/pkg/apis/autoscaling knative.dev/serving/pkg/apis/autoscaling/v1alpha1 @@ -1082,7 +1197,7 @@ sigs.k8s.io/kustomize/kyaml/yaml/merge2 sigs.k8s.io/kustomize/kyaml/yaml/merge3 sigs.k8s.io/kustomize/kyaml/yaml/schema sigs.k8s.io/kustomize/kyaml/yaml/walk -# sigs.k8s.io/structured-merge-diff/v4 v4.1.2 +# sigs.k8s.io/structured-merge-diff/v4 v4.2.1 sigs.k8s.io/structured-merge-diff/v4/fieldpath sigs.k8s.io/structured-merge-diff/v4/schema sigs.k8s.io/structured-merge-diff/v4/typed @@ -1090,4 +1205,10 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.3.0 ## explicit sigs.k8s.io/yaml +# github.com/google/cel-go => github.com/google/cel-go v0.11.2 +# github.com/openshift/source-to-image => github.com/boson-project/source-to-image v1.3.2 +# k8s.io/api => k8s.io/api v0.22.5 +# k8s.io/apimachinery => k8s.io/apimachinery v0.22.5 +# k8s.io/client-go => k8s.io/client-go v0.22.5 # knative.dev/kn-plugin-event => github.com/openshift-knative/kn-plugin-event v0.29.1-0.20220412122141-1868b0441a3a +# knative.dev/kn-plugin-func => github.com/openshift-knative/kn-plugin-func v1.1.3-0.20220601222936-a3f704bc3c50 diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/merge.go b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/merge.go index 7e20f4083a..75244ef646 100644 --- a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/merge.go +++ b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/merge.go @@ -17,8 +17,6 @@ limitations under the License. package typed import ( - "math" - "sigs.k8s.io/structured-merge-diff/v4/fieldpath" "sigs.k8s.io/structured-merge-diff/v4/schema" "sigs.k8s.io/structured-merge-diff/v4/value" @@ -170,80 +168,96 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err if lhs != nil { lLen = lhs.Length() } - out := make([]interface{}, 0, int(math.Max(float64(rLen), float64(lLen)))) - - // TODO: ordering is totally wrong. - // TODO: might as well make the map order work the same way. + outLen := lLen + if outLen < rLen { + outLen = rLen + } + out := make([]interface{}, 0, outLen) + + rhsOrder, observedRHS, rhsErrs := w.indexListPathElements(t, rhs) + errs = append(errs, rhsErrs...) + lhsOrder, observedLHS, lhsErrs := w.indexListPathElements(t, lhs) + errs = append(errs, lhsErrs...) + + sharedOrder := make([]*fieldpath.PathElement, 0, rLen) + for i := range rhsOrder { + pe := &rhsOrder[i] + if _, ok := observedLHS.Get(*pe); ok { + sharedOrder = append(sharedOrder, pe) + } + } - // This is a cheap hack to at least make the output order stable. - rhsOrder := make([]fieldpath.PathElement, 0, rLen) + var nextShared *fieldpath.PathElement + if len(sharedOrder) > 0 { + nextShared = sharedOrder[0] + sharedOrder = sharedOrder[1:] + } - // First, collect all RHS children. - observedRHS := fieldpath.MakePathElementValueMap(rLen) - if rhs != nil { - for i := 0; i < rhs.Length(); i++ { - child := rhs.At(i) - pe, err := listItemToPathElement(w.allocator, w.schema, t, i, child) - if err != nil { - errs = append(errs, errorf("rhs: element %v: %v", i, err.Error())...) - // If we can't construct the path element, we can't - // even report errors deeper in the schema, so bail on - // this element. + lLen, rLen = len(lhsOrder), len(rhsOrder) + for lI, rI := 0, 0; lI < lLen || rI < rLen; { + if lI < lLen && rI < rLen { + pe := lhsOrder[lI] + if pe.Equals(rhsOrder[rI]) { + // merge LHS & RHS items + lChild, _ := observedLHS.Get(pe) + rChild, _ := observedRHS.Get(pe) + mergeOut, errs := w.mergeListItem(t, pe, lChild, rChild) + errs = append(errs, errs...) + if mergeOut != nil { + out = append(out, *mergeOut) + } + lI++ + rI++ + + nextShared = nil + if len(sharedOrder) > 0 { + nextShared = sharedOrder[0] + sharedOrder = sharedOrder[1:] + } continue } - if _, ok := observedRHS.Get(pe); ok { - errs = append(errs, errorf("rhs: duplicate entries for key %v", pe.String())...) - } - observedRHS.Insert(pe, child) - rhsOrder = append(rhsOrder, pe) - } - } - - // Then merge with LHS children. - observedLHS := fieldpath.MakePathElementSet(lLen) - if lhs != nil { - for i := 0; i < lhs.Length(); i++ { - child := lhs.At(i) - pe, err := listItemToPathElement(w.allocator, w.schema, t, i, child) - if err != nil { - errs = append(errs, errorf("lhs: element %v: %v", i, err.Error())...) - // If we can't construct the path element, we can't - // even report errors deeper in the schema, so bail on - // this element. + if _, ok := observedRHS.Get(pe); ok && nextShared != nil && !nextShared.Equals(lhsOrder[lI]) { + // shared item, but not the one we want in this round + lI++ continue } - if observedLHS.Has(pe) { - errs = append(errs, errorf("lhs: duplicate entries for key %v", pe.String())...) + } + if lI < lLen { + pe := lhsOrder[lI] + if _, ok := observedRHS.Get(pe); !ok { + // take LHS item + lChild, _ := observedLHS.Get(pe) + mergeOut, errs := w.mergeListItem(t, pe, lChild, nil) + errs = append(errs, errs...) + if mergeOut != nil { + out = append(out, *mergeOut) + } + lI++ continue } - observedLHS.Insert(pe) - w2 := w.prepareDescent(pe, t.ElementType) - w2.lhs = value.Value(child) - if rchild, ok := observedRHS.Get(pe); ok { - w2.rhs = rchild + } + if rI < rLen { + // Take the RHS item, merge with matching LHS item if possible + pe := rhsOrder[rI] + lChild, _ := observedLHS.Get(pe) // may be nil + rChild, _ := observedRHS.Get(pe) + mergeOut, errs := w.mergeListItem(t, pe, lChild, rChild) + errs = append(errs, errs...) + if mergeOut != nil { + out = append(out, *mergeOut) } - errs = append(errs, w2.merge(pe.String)...) - if w2.out != nil { - out = append(out, *w2.out) + rI++ + // Advance nextShared, if we are merging nextShared. + if nextShared != nil && nextShared.Equals(pe) { + nextShared = nil + if len(sharedOrder) > 0 { + nextShared = sharedOrder[0] + sharedOrder = sharedOrder[1:] + } } - w.finishDescent(w2) } } - for _, pe := range rhsOrder { - if observedLHS.Has(pe) { - continue - } - value, _ := observedRHS.Get(pe) - w2 := w.prepareDescent(pe, t.ElementType) - w2.rhs = value - errs = append(errs, w2.merge(pe.String)...) - if w2.out != nil { - out = append(out, *w2.out) - } - w.finishDescent(w2) - } - if len(out) > 0 { i := interface{}(out) w.out = &i @@ -252,6 +266,46 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err return errs } +func (w *mergingWalker) indexListPathElements(t *schema.List, list value.List) ([]fieldpath.PathElement, fieldpath.PathElementValueMap, ValidationErrors) { + var errs ValidationErrors + length := 0 + if list != nil { + length = list.Length() + } + observed := fieldpath.MakePathElementValueMap(length) + pes := make([]fieldpath.PathElement, 0, length) + for i := 0; i < length; i++ { + child := list.At(i) + pe, err := listItemToPathElement(w.allocator, w.schema, t, i, child) + if err != nil { + errs = append(errs, errorf("element %v: %v", i, err.Error())...) + // If we can't construct the path element, we can't + // even report errors deeper in the schema, so bail on + // this element. + continue + } + if _, found := observed.Get(pe); found { + errs = append(errs, errorf("duplicate entries for key %v", pe.String())...) + continue + } + observed.Insert(pe, child) + pes = append(pes, pe) + } + return pes, observed, errs +} + +func (w *mergingWalker) mergeListItem(t *schema.List, pe fieldpath.PathElement, lChild, rChild value.Value) (out *interface{}, errs ValidationErrors) { + w2 := w.prepareDescent(pe, t.ElementType) + w2.lhs = lChild + w2.rhs = rChild + errs = append(errs, w2.merge(pe.String)...) + if w2.out != nil { + out = w2.out + } + w.finishDescent(w2) + return +} + func (w *mergingWalker) derefList(prefix string, v value.Value) (value.List, ValidationErrors) { if v == nil { return nil, nil